mirror of
https://github.com/Sea-Haven-Industries/shoc-backend.git
synced 2026-09-30 08:23:12 +00:00
2.1 KiB
2.1 KiB
ADR — Vendor Source of Truth
Status: Accepted (Fase 0 spike)
Decisores: Backend + Arquiteto
Contexto
O board SHOC exibe colunas VENDOR e APPT na listagem semanal. Hoje vendor existe apenas no agregado Dispatch; a entidade WorkOrder não possui referência ao dispatch primário.
Decisão
- WorkOrder.PrimaryDispatchId (nullable FK → Dispatches) identifica o dispatch canônico para projeção board.
- Colunas VENDOR/APPT = projeção read-only via join no dispatch primário (Vendor.Name, Dispatch.ScheduledDate).
- Edição inline vendor (Fase 2) muta Dispatch, não WorkOrder. Bump
Dispatch.RowVersion. - WO sem dispatch: primeira edição vendor cria dispatch primário e seta
PrimaryDispatchId. - Proibido adicionar VendorId, TechName, TechPhone na tabela workOrders.
Query de projeção (spike)
SELECT wo.Id,
wo.InternalWONumber,
d.Id AS DispatchId,
v.Name AS VendorName,
d.ScheduledDate AS ApptDate,
d.Status AS DispatchStatus
FROM workOrders wo
LEFT JOIN Dispatches d ON d.Id = wo.PrimaryDispatchId
LEFT JOIN Vendors v ON v.Id = d.VendorId
WHERE wo.IsDeleted IS NULL OR wo.IsDeleted = 0;
Implementação C# em DispatchDataService.GetPrimaryDispatchProjectionAsync(workOrderId) (Fase 1).
Seleção do dispatch primário
| Cenário | Regra |
|---|---|
| PrimaryDispatchId setado | Usar esse dispatch |
| Null + exatamente 1 dispatch | Auto-set PrimaryDispatchId na migration backfill |
| Null + N dispatches | Usar dispatch mais recente por DispatchedAt; log para revisão manual |
| Zero dispatches | Vendor columns vazias no board |
Consequências
- Positivo: Zero drift vendor WO vs Dispatch; Portal regression isolada.
- Negativo: Join extra na listagem board — mitigado por índice em PrimaryDispatchId.
- Fase 0: Coluna + FK + backfill script no dry-run; endpoint board na Fase 1.
Critérios de aceite spike
- ADR documentado
- Query prototipada
- PrimaryDispatchId na migration Phase0
- Backfill documentado no dry-run report