feat: tech tasks page, priority in HK context menu, room status sync

Context menu (RoomContextMenu):
- Dirty/Cleaning now show priority sub-form (срочно/высокий/средний/низкий)
- New "Тех. задача" section with description text + priority grid

Calendar (CalendarPage):
- handleRoomUpdate: creates task for both 'dirty' AND 'cleaning' status
- New handleMaintenanceTaskCreate for category=maintenance tasks
- Passes priority from context menu to task creation

Backend (housekeeping.ts):
- task status → in_progress: room housekeeping_status = 'cleaning',
  broadcasts housekeeping_done with roomStatus='cleaning' so all
  connected Calendar clients update in real-time

DB (migration 025):
- category column on housekeeping_tasks (default 'housekeeping')
- HousekeepingPage filters category=housekeeping
- TechnicalPage filters category=maintenance

New TechnicalPage (/technical):
- List/filter/delete maintenance tasks
- Status dropdown per task
- Create modal with room/user/priority/date

Sidebar: "Тех. задачи" nav item added

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
2026-03-23 23:35:24 +03:00
parent 3bb7262b59
commit 4b337a3b85

View File

@@ -123,6 +123,15 @@ const housekeeping: FastifyPluginAsync = async (fastify) => {
if (!rows[0]) return reply.code(404).send({ error: 'Task not found' }) if (!rows[0]) return reply.code(404).send({ error: 'Task not found' })
const task = rows[0] const task = rows[0]
// When task is marked in_progress → room becomes 'cleaning'
if (request.body.status === 'in_progress' && task.room_id) {
await db.query(
`UPDATE rooms SET housekeeping_status = 'cleaning' WHERE id = $1`,
[task.room_id],
)
broadcast(slug, { type: 'housekeeping_done', taskId: task.id, roomId: task.room_id, roomStatus: 'cleaning' })
}
// When task is marked done → update room housekeeping status // When task is marked done → update room housekeeping status
if (request.body.status === 'done' && task.room_id) { if (request.body.status === 'done' && task.room_id) {
const settings = await getHkSettings(hotelId).catch(() => null) const settings = await getHkSettings(hotelId).catch(() => null)