4.8 KiB
DAR — Domain Architecture Review (Work Orders)
Fase: 0
Status: Draft para sign-off CTO
Referência: roadmap-work-orders-board.md §4–5
1. Objetivo
Formalizar o modelo de domínio operacional do Schedule Board antes de qualquer migration de schema board ou contrato de listagem semanal.
2. Agregados e limites (anti God Entity)
flowchart TB
subgraph root [AggregateRoot_WorkOrder]
CORE[Core_Lifecycle_Assignment]
SCH[Scheduling_slice]
TRK[Tracking_slice]
COMP[Completion_slice]
ANA[Analytics_slice]
end
subgraph separate [Agregado_separado]
DISP[Dispatch_fonte_vendor]
end
AUD[WorkOrderAuditLog_append_only]
CORE --> SCH
CORE --> TRK
CORE --> ANA
CORE --> COMP
CORE --> DISP
CORE --> AUD
| Agregado / Slice | Responsabilidade | Persistência Fase 0 |
|---|---|---|
| Core | Id, WoNumber, Type, LifecycleStatus, SiteCode, LocationId, DueDate, AssignTo, Title, RowVersion, PrimaryDispatchId | Colunas em workOrders |
| Scheduling | ScheduledDate, ScheduledStart/End, TargetWeek, ScheduleWeekOnly | Colunas em workOrders |
| Tracking | OriginalWeek, OriginalDate (set-once) | Colunas em workOrders |
| Analytics | RescheduleCount, CarriedOver | Colunas em workOrders |
| Completion | DocStatus, refs attachments | Coluna DocStatus + attachments existentes |
| Dispatch | Vendor, tech, status portal | Tabela Dispatches + RowVersion |
| Audit | Rastreabilidade imutável | WorkOrderAuditLogs |
Proibido: VendorId, TechName, TechPhone canônicos na entidade WorkOrder. Vendor sempre via Dispatch primário.
3. Fonte da verdade por conceito
| Conceito | Fonte da verdade | Proibido |
|---|---|---|
| Status operacional | LifecycleStatus (10 valores FE) |
String livre Status como canônico |
| Past Due | Derivado on-read (ScheduledDate < hoje AND NOT terminal) |
Misturar no enum lifecycle |
| Vendor / Tech | Dispatch primário (PrimaryDispatchId) |
Duplicar na WO |
| Schedule | Scheduling slice | Duplicar no core sem slice lógico |
| Completion | DocStatus |
Inferir só de dispatch signoff |
| Reschedule / CarriedOver | Analytics + domain events | Job blind overwrite |
| WO# | InternalWONumber / WorkerOrderNumber com regra 11 dígitos (Fase 2+) |
Dois números sem regra |
| POC | WorkOrderContacts + Notes |
Só no detalhe sem contato |
4. Lifecycle Status vs Operational Flags
LifecycleStatus → enum único (10 valores alinhados ao frontend)
OperationalFlags → PastDue (derivado on-read; cache opcional Fase 5)
LegacyStatus → string original read-only (migration Fase 0)
Filtro de status no board = LifecycleStatus. Overlay Past Due = flag derivada. Bloqueio de edição = validação sobre flag (Fase 2).
Mapeamento legado → LifecycleStatus
Legado (Status) |
LifecycleStatus |
|---|---|
| Open | Incomplete |
| InProgress / In Progress | InProgress |
| Completed / Complete | Complete |
| Cancelled / Canceled | Canceled |
| OnHold / On Hold | OnHold |
| Desconhecido | Incomplete + NeedsReview |
5. CarriedOver — justificativa
| isPastDue | carriedOver | |
|---|---|---|
| Natureza | Estado pontual | Métrica histórica acumulada |
| Persistir | Não (derivado) | Sim (contador) |
| Incremento | N/A | Somente via domain event WeekRolled (Fase 5) |
6. Scheduling Aggregate Growth Watchlist
Campos que não entram em Scheduling sem ARB review:
MoveReason,MoveUser,MoveCategory,MoveSource
Metadados de movimentação → Audit Event Contract.
Gate: slice Scheduling > 8 campos operacionais → ARB obrigatório.
Contagem Fase 0: ScheduledDate, ScheduledStart, ScheduledEnd, TargetWeek, ScheduleWeekOnly, OriginalWeek, OriginalDate (tracking separado) — dentro do limite.
7. Jobs — domínio primeiro
| Job | Papel |
|---|---|
| Past Due diário | Cache refresh opcional; on-read sempre correto |
| Carried Over semanal | Dispara WeekRolled → incrementa contador + audit system |
| Promoção Overdue type | Derivado on-read |
| Audit | Síncrono em toda mutação desde Fase 0 |
Regra de ouro: Jobs nunca são a única fonte da verdade.
8. Critérios de aceite (sign-off CTO)
- Zero campos vendor canônicos na WO
- Agregados documentados e refletidos no schema Fase 0
- Persistido vs derivado validado com PO (ver
dar-persisted-vs-derived-matrix.md) - Watchlist Scheduling registrada
- Blazor congelado — sem novos campos board via EF direto
Assinaturas
| Papel | Nome | Data |
|---|---|---|
| CTO / Arquiteto | ||
| Product Owner |