From 775ed07506084ba6fe8cb271779a677553c73e7c Mon Sep 17 00:00:00 2001 From: Adam Moussa <166072409+amoussa1229@users.noreply.github.com> Date: Fri, 3 Apr 2026 17:41:57 -0400 Subject: [PATCH] Add README Co-Authored-By: Claude Opus 4.6 --- README.md | 66 +++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 66 insertions(+) create mode 100644 README.md diff --git a/README.md b/README.md new file mode 100644 index 0000000..d3e930c --- /dev/null +++ b/README.md @@ -0,0 +1,66 @@ +# 3CX Ring Group Scheduler + +AWS Lambda that automatically updates the after-hours and holiday forwarding destinations on a 3CX ring group daily at 8am ET. + +## How it works + +- Two EventBridge rules fire daily (one for EST, one for EDT) to handle DST +- Lambda checks if it's actually 8am Eastern — skips if not +- Reads the weekly schedule from `config/schedule.yaml` +- Authenticates to 3CX V20 XAPI via OAuth2 +- Updates the ring group's "office closed" and "holiday" routing + +## Schedule config + +Edit `config/schedule.yaml` to change the weekly schedule or add exception dates: + +```yaml +ring_group_number: "800" + +weekly_schedule: + Monday: "114" + Tuesday: "115" + Wednesday: "114" + Thursday: "115" + Friday: "116" + Saturday: "100" + Sunday: "100" + +exceptions: + "2026-12-25": "100" +``` + +## Setup + +### 1. Create 3CX API client + +In 3CX Admin Console > Integrations > API, create a new client with XAPI access enabled. + +### 2. Store credentials in SSM + +```bash +aws ssm put-parameter --name /3cx-scheduler/domain --value "yourcompany.3cx.us" --type SecureString +aws ssm put-parameter --name /3cx-scheduler/client_id --value "your-client-id" --type SecureString +aws ssm put-parameter --name /3cx-scheduler/client_secret --value "your-secret" --type SecureString +``` + +### 3. Deploy + +```bash +sam build +sam deploy --stack-name ring-scheduler-3cx --resolve-s3 --capabilities CAPABILITY_IAM --parameter-overrides Timezone=America/New_York +``` + +## Manual invocation + +```bash +# Run using today's schedule +aws lambda invoke --function-name 3cx-ring-group-scheduler \ + --payload '{"force": true}' \ + --cli-binary-format raw-in-base64-out output.json + +# Override to a specific extension +aws lambda invoke --function-name 3cx-ring-group-scheduler \ + --payload '{"force": true, "override_extension": "100"}' \ + --cli-binary-format raw-in-base64-out output.json +```