shoc-backend/docs/work-orders/phase-0/data-ownership-model.md

75 lines
2.7 KiB
Markdown

# Data Ownership Model — Work Orders
**Fase:** 0
**Status:** Draft para sign-off CTO
---
## 1. Princípios
1. **SHOC (React)** é o único destino de novas features do board.
2. **SQL Server** é fonte operacional para board, Blazor e Portal.
3. **DynamoDB/Sync** é ponte temporária de ingestão externa.
4. Conflito entre atores resolve-se pela Field Ownership Matrix, não por last-write-wins global.
---
## 2. Ownership por ator
| Ator | Conexão | Pode alterar | Não pode alterar |
|------|---------|--------------|------------------|
| **SHOC** | REST JWT (`api/WorkOrder`) | Lifecycle, Schedule, Assignment, Completion, vendor via Dispatch, POC, WO# | Checklist/signoff vendor |
| **Vendor Portal** | REST `X-Vendor-Token` | Dispatch status, checklist, signoff, comments vendor | Schedule, lifecycle, assignment, DueDate |
| **Sync/Lambda** | `POST api/Sync/WorkOrders` | Campos ingest (Description, ExternalId, SiteCode na criação, etc.) | Campos SHOC-owned após ManualEditFlag |
| **Blazor** | EF direto (`WorkorderService`) | Campos legados existentes até sunset | Campos novos board; **congelado** |
| **Jobs** | Domain events (Fase 5+) | Incremento CarriedOver; audit System | Lifecycle, Schedule, Dispatch |
---
## 3. Política Blazor (sunset)
- Manutenção mínima: bugfix crítico only.
- Não recebe: board, inline edit, jobs, advanced search, completion doc WO-level.
- Schema: colunas novas Fase 0 são **nullable** — Blazor continua funcionando sem conhecer novos campos.
- Conflito Blazor vs SHOC: **SHOC vence**; Blazor não deve escrever campos board após go-live Fase 1.
- Smoke test EF obrigatório pós-migration (ver checklist smoke).
---
## 4. Política Vendor Portal
- Dispatch intacto; zero regressão checklist/signoff/verify.
- Vendor não muta WorkOrder core — apenas Dispatch e comments associados.
- Audit EventType = `Vendor` para mutações portal.
---
## 5. Política Sync/Lambda
- Upsert por `ExternalWorkOrderId` (idempotente).
- Field-level merge conforme Field Ownership Matrix.
- Campo com ManualEditFlag → skip + audit `SyncRejected`.
- Cutover Lambda → API direta: Fase 7.
---
## 6. Regras de conflito (resumo)
| Cenário | Vencedor |
|---------|----------|
| SHOC vs SHOC (mesmo campo) | 409 RowVersion; último commit válido |
| SHOC vs Sync (mesmo campo) | SHOC se ManualEditFlag |
| SHOC vs Sync (campos distintos) | Merge |
| Vendor vs Sync | Domínios separados |
| SHOC vs Vendor (mesmo conceito) | Impossível por design (vendor = Dispatch) |
| Blazor vs SHOC | SHOC vence; Blazor congelado |
---
## 7. Critérios de aceite
- [ ] Matriz por ator revisada por CTO
- [ ] PO confirma política Blazor sunset
- [ ] Sync merge referencia Field Ownership Matrix
**Assinatura CTO:** _________________ Data: _______