Commit graph

9 commits

Author SHA1 Message Date
Adam Moussa
61074dc7cc
Fix shift pickup showing error despite succeeding (#31) (#32)
Two root causes:
- claim_open_shift ConditionExpression failed when no OVERRIDE record
  existed (shift available via weekly fallback). Added attribute_not_exists
  check so claims succeed for both missing and OPEN overrides.
- Slack ack timeout: chat_postMessage took too long before respond() was
  called, causing Slack to show an error. Moved respond() first and made
  channel notifications best-effort with try/except.
2026-05-01 15:16:11 -04:00
Adam Moussa
7b2275a430
Post shift change notifications to the schedule channel (#21) (#22)
Slash command handlers (drop, pick, swap) were posting notifications to
command["channel_id"] — wherever the command was run. If someone ran
/oncall drop from a DM, the notification went there instead of the
schedule channel. Pickup buttons didn't have this problem because
body["channel"]["id"] is always the channel where the button lives.

Added SHIFT_CHANNEL_PARAM to the SlackBotFunction env vars, read it on
cold start, and route all slash command shift-change notifications to
the configured schedule channel.

Closes #21
2026-05-01 14:15:56 -04:00
Adam Moussa
1e90e0eaa2
Fix race condition allowing multiple people to pick up the same shift (#19) (#20)
The pickup button handler used an unconditional put_item, so concurrent
clicks would both succeed with last-write-wins. Added claim_open_shift()
which uses a DynamoDB ConditionExpression to only write if the shift is
still OPEN. The button handler now returns an ephemeral "already taken"
message when the condition fails.

Closes #19
2026-05-01 14:09:39 -04:00
Adam Moussa
7eb0443866 Add weekend day shifts and exclude fallback ext from pay
Saturdays and Sundays now have two shift slots: a day shift (8am–5pm)
and the existing after-hours shift. Extension 100 (fallback) is
excluded from pay calculations. Pickup buttons and schedule display
updated to handle both shift types.
2026-04-07 18:22:56 -04:00
Adam Moussa
e28f591816 Add /oncall rate command to manage shift pay rates from Slack
- /oncall rate — view current default and per-person rates
- /oncall rate default <amount> — set the global fallback rate
- /oncall rate <extension> <amount> — set a person-specific rate
2026-04-07 18:15:41 -04:00
Adam Moussa
1399be7e74 Support per-person shift pay rates
Each roster entry can now have its own shift_rate, falling back to the
global CONFIG rate when not set. Pay breakdowns show individual rates
per shift and per-person totals.
2026-04-07 18:12:32 -04:00
Adam Moussa
d569621c72 Add weekly pay calculation with configurable flat rate
Calculates after-hours pay per shift using a configurable rate stored
in DynamoDB CONFIG. Pay summaries are computed on Monday mornings for
the previous week, stored in DynamoDB (PK=PAY), and posted to Slack.
Adds /oncall pay command for on-demand viewing.

Closes #2
2026-04-07 18:09:19 -04:00
Adam Moussa
3a51b52ffc Extend schedule display to show 2 full weeks
Anchors to the current week's Monday and shows 14 consecutive days.
Updates /oncall next to jump forward by 2 weeks accordingly.

Closes #1
2026-04-07 18:01:10 -04:00
Adam Moussa
4d0cdb5cfb Initial commit: after-hours shift manager Slack bot
Slack Bolt app on Lambda for managing on-call shifts. Employees can
pick up, drop, and swap shifts via /oncall commands. Changes update
3CX ring group 800 routing in real time for same-day shifts.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-04-03 18:32:32 -04:00