42 lines
4.6 KiB
Markdown
42 lines
4.6 KiB
Markdown
|
|
# Min kø · Arbejdsbord
|
|||
|
|
|
|||
|
|
`/planning?view=queue` shows the personal desk selected in the design review. Other planning views and existing API responses are retained. No background operation starts a timer or turns planned work into actual time.
|
|||
|
|
|
|||
|
|
## Behavior
|
|||
|
|
|
|||
|
|
- Two-thirds of the page: today's assigned, unfinished work, including older outstanding work. Future-start work appears only if it has a booking/deadline on or before the displayed day. Closed cases remain excluded by the existing queue rules.
|
|||
|
|
- One-third: FullCalendar day view with separate Allokeret and Aftaler/registreret columns on one time axis. The default window follows the employee's configured weekday work schedule (07–17 when absent). Early/late entries extend the scrollable range, while the initial scroll stays at the workday start. Day navigation includes weekends. Bookings can move/resize in 15-minute increments; shared bookings retain their participants.
|
|||
|
|
- Recommended order: work that is not blocked first, then overdue deadlines, today's reservations, today's deadlines, and start/backlog. Exact deadline, next slot, priority, start and missing individual work break ties. Each task has a visible reason.
|
|||
|
|
- Personal estimates can be edited. A case-wide estimate is never silently assigned to one employee. Remaining work, future reserved time and missing planning remain separate.
|
|||
|
|
- Drag “Planlæg” onto a calendar time to reserve it immediately. Duration uses the unreserved remaining estimate, rounded up to 15 minutes; absent an estimate it uses the configured default. Conflict confirmation and Undo still apply. Clicking the button retains the detailed time dialog.
|
|||
|
|
- Manual ordering uses the existing queue positions and optimistic queue version. Recommended mode can be restored. Undo restores positions as well as the desk mode; stale versions never overwrite another change.
|
|||
|
|
- Primary case contact is displayed, with phone/mail actions. Existing visibility restrictions are retained.
|
|||
|
|
- Assignments added after migration appear in the inbox until acknowledged. Existing assignments are marked known on the first migration only.
|
|||
|
|
- Register time with an optional case, quickly register an already held internal meeting, or continue the most recent paused/stopped work. The internal-meeting shortcut offers 15/30/45/60 minute buttons, one or more employees and optional customer/contact pickers. It reuses registered quick-time, ends at the current time and creates no calendar booking. Without a customer, time is nonbillable internal work. Starting a new desk timer rejects an already active timer rather than silently replacing it.
|
|||
|
|
- Internal meeting attendance can be recorded after the meeting, with separate start/end for each actual participant. Existing time permissions are enforced. A unique event/employee link prevents duplicates; replay of identical data returns the existing entry, while changed data requires editing that entry.
|
|||
|
|
- Quick standalone time and case time are replay-safe via existing `quick_time_batches`. Planned meetings do not create actual time.
|
|||
|
|
- Undo is for the latest estimate/order/calendar mutation in the current page session. Time entries remain canonical and are edited through the existing time module.
|
|||
|
|
|
|||
|
|
## Local activation and validation
|
|||
|
|
|
|||
|
|
1. Back up the development schema.
|
|||
|
|
2. Apply `migrations/1073_work_desk.sql` in one transaction after migration 1070. It adds three columns and one unique index; no existing case/time records are removed. The inbox column is backfilled only on first creation.
|
|||
|
|
3. Restart the API and open `/planning?view=queue`.
|
|||
|
|
|
|||
|
|
The feature has been installed on the local development instance, not production. The local schema backup is in the ignored `data/backups/work-desk-20261021/schema-before.sql`.
|
|||
|
|
|
|||
|
|
Tests:
|
|||
|
|
|
|||
|
|
```sh
|
|||
|
|
BMC_PLANNING_DB_TESTS=1 BMC_PLANNING_TEST_DATABASE=bmc_planning_test_20261017 PYTHONPYCACHEPREFIX=/tmp/bmc_desk_pycache ./.venv/bin/python -m pytest tests/test_work_desk.py tests/test_unified_planning.py -q
|
|||
|
|
node --test tests/js/work-desk.test.cjs
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
Only use a disposable database whose name starts with `bmc_planning_test_` for the opt-in integration tests. The fixture never substitutes the live development database.
|
|||
|
|
|
|||
|
|
## Reversible rollout
|
|||
|
|
|
|||
|
|
Set `WORK_DESK_ENABLED=false` and restart the API to restore the original Min kø view. Leave migration 1073 in place: dropping the columns would discard inbox acknowledgements, the desk sort-mode preference and meeting-time links. Existing queue positions, events and time entries remain available to the original components.
|
|||
|
|
|
|||
|
|
“Find next available time” remains a later phase. It is not presented as an implemented scheduling feature.
|