==================================== Ticket Management System (Issue #85) ==================================== Overview ======== KoproGo provides a complete maintenance ticket system for property managers (syndics) and co-owners. Tickets track maintenance requests from creation through resolution, with automatic due dates based on priority. Belgian Context =============== Belgian copropriété law (Article 577-8 §4 Code Civil) requires the syndic to ensure proper maintenance of common areas. This system provides: - **Traceability**: Full audit trail of maintenance requests - **SLA compliance**: Automatic due dates by priority level - **Contractor management**: Assignment and progress tracking Workflow ======== :: Open → Assigned → InProgress → Resolved → Closed ↓ ↓ Cancelled Reopened → Open States ------ - **Open**: Ticket created by owner or syndic - **Assigned**: Contractor designated - **InProgress**: Work started - **Resolved**: Work completed, pending validation - **Closed**: Validated and archived - **Cancelled**: Ticket no longer relevant Priorities & SLA ================= +----------+----------+-------------------------+ | Priority | Due Time | Use Case | +==========+==========+=========================+ | Critical | 1 hour | Gas leak, flooding | +----------+----------+-------------------------+ | Urgent | 4 hours | Elevator stuck, no heat | +----------+----------+-------------------------+ | High | 24 hours | Broken lock, water leak | +----------+----------+-------------------------+ | Medium | 3 days | Light replacement | +----------+----------+-------------------------+ | Low | 7 days | Cosmetic repair | +----------+----------+-------------------------+ Categories ========== - Plumbing, Electrical, Heating, Cleaning, Security, General, Emergency API Endpoints ============= - ``POST /tickets`` - Create ticket - ``GET /tickets/:id`` - Get ticket - ``GET /buildings/:id/tickets`` - List building tickets - ``GET /tickets/my`` - List requester's tickets - ``GET /tickets/assigned`` - List contractor's tickets - ``GET /tickets/status/:status`` - Filter by status - ``PUT /tickets/:id/assign`` - Assign to contractor - ``PUT /tickets/:id/start`` - Start work - ``PUT /tickets/:id/resolve`` - Mark resolved - ``PUT /tickets/:id/close`` - Close ticket - ``PUT /tickets/:id/cancel`` - Cancel - ``PUT /tickets/:id/reopen`` - Reopen - ``GET /tickets/statistics`` - Statistics - ``GET /tickets/overdue`` - Overdue tickets - ``DELETE /tickets/:id`` - Delete Architecture ============ - **Domain**: ``backend/src/domain/entities/ticket.rs`` (310 lines) - **Use Cases**: ``backend/src/application/use_cases/ticket_use_cases.rs`` (18 methods) - **Repository**: ``backend/src/infrastructure/database/repositories/ticket_repository_impl.rs`` - **Handlers**: ``backend/src/infrastructure/web/handlers/ticket_handlers.rs`` (17 endpoints) - **Migration**: ``backend/migrations/20251117000000_create_tickets.sql`` - **BDD Tests**: ``backend/tests/features/tickets.feature`` (17 scenarios) Audit Events ============ ``TicketCreated``, ``TicketAssigned``, ``TicketStatusChanged``, ``TicketResolved``, ``TicketClosed``, ``TicketCancelled``, ``TicketReopened``, ``TicketDeleted``