# After-Hours Shift Manager Slack bot for managing after-hours on-call shifts at Sea Haven Industries. Employees can pick up, drop, and swap shifts directly from Slack. Changes automatically update 3CX ring group 800 routing. ## How It Works A recurring weekly schedule assigns employees to after-hours phone duty (5pm-8am). Any unassigned day shows as **Available** in Slack with a pickup button. When someone picks up or drops a shift for today, the 3CX phone system is updated immediately. Future changes take effect when the 3CX scheduler runs at 8am. ## Slack Commands | Command | Description | |---|---| | `/oncall` | Show this week's schedule | | `/oncall next` | Show next week's schedule | | `/oncall pick ` | Pick up an available shift | | `/oncall drop ` | Drop your shift (marks it available) | | `/oncall swap @person` | Hand your shift to someone else | | `/oncall register ` | Link your Slack account to your phone extension | | `/oncall roster` | Show all employees and their link status | | `/oncall help` | Show help | Dates accept: `today`, `tomorrow`, `monday`-`sunday`, `4/5`, `2026-04-05` ## Architecture - **Runtime**: Python 3.12 on AWS Lambda (via API Gateway) - **Data**: DynamoDB single-table (`afterhours-shifts`) - **IaC**: AWS SAM (`template.yaml`) - **Slack**: Slack Bolt framework with `/oncall` slash command - **3CX Integration**: Invokes the `3cx-ring-group-scheduler` Lambda for same-day changes; the scheduler reads DynamoDB for future dates ### DynamoDB Schema Single table with `PK` / `SK` keys: | PK | SK | Description | |---|---|---| | `ROSTER` | `` | Employee: name, extension, slack_user_id | | `WEEKLY` | `` | Default weekly schedule: extension, name | | `OVERRIDE` | `` | Date override from pickup/drop (or `OPEN`) | | `CONFIG` | `CONFIG` | Settings: ring_group, fallback_extension | ## Deployment See [SETUP.md](SETUP.md) for full deployment and Slack app creation instructions. Quick reference: ```bash # Build and deploy sam build sam deploy --guided --stack-name afterhours-shift-manager --region us-east-1 # Seed initial schedule data python scripts/seed_schedule.py ``` ### SSM Parameters | Parameter | Description | |---|---| | `/afterhours-shift-manager/slack-bot-token` | Slack bot OAuth token (`xoxb-...`) | | `/afterhours-shift-manager/slack-signing-secret` | Slack app signing secret | | `/afterhours-shift-manager/channel-id` | Slack channel ID for notifications | ## Weekly Auto-Post Every Monday at 7am ET, the bot posts the week's schedule to the configured channel with pickup buttons for any available shifts. ## Related - [3cx-ring-scheduler](https://github.com/Sea-Haven-Industries/3cx-ring-scheduler) — the Lambda that updates 3CX ring group routing daily