3.4 KiB
Contratos internos v1
Não existe entrega externa configurada. Os endpoints públicos são GET /api/v1/partnerships e GET /api/v1/partnerships/source/{type}/{id}. O primeiro aceita q, sector_id, kind, partnership_type, territory_id, origin_type, origin_id e page; devolve paginação Laravel de 12 elementos. O segundo devolve apenas propostas publicadas e origens que o visitante pode consultar. Uma origem privada não é divulgada pelo catálogo.
As escritas usam a sessão existente, CSRF e autorização por recurso. Os contratos das rotas estão em routes/partnerships.php. Alterações enviam version; uma versão desatualizada resulta em 409. Criação de rascunho e mensagens usam client_key UUID: repetir a mesma operação devolve o resultado existente; reutilizar a chave com outro conteúdo resulta em 409.
| Agregado | Estados persistidos | Separação |
|---|---|---|
| Publicação | draft, submitted, returned, rejected, published, suspended, archived; pending legado | Renovar recupera o rascunho e exige nova submissão. Editar uma proposta publicada não publica a alteração automaticamente. |
| Candidatura | submitted, clarification, shortlisted, rejected, withdrawn, negotiation | Negociação de um candidato não encerra outros. A retirada pertence ao candidato; avaliação e decisão ao titular da proposta. |
| Sala/acordo | negotiation, agreement_recorded, agreed, execution, closed, cancelled | Registo de termos não confirma as partes. Só a confirmação de ambas permite acompanhar a execução. Encerramento exige os marcos concluídos. Renovação devolve a negociação sem apagar o histórico dos termos. |
Os eventos persistidos em partnership_events e audit_events têm envelope v1: event_id, event_type, event_version, source, subject_id, occurred_at, producer_version, correlation_id, causation_id, data_classification, aggregate_id, aggregate_version, publication_version, payload, external_delivery. A sequência do agregado é atribuída com bloqueio transacional; não confunde a versão de publicação com a de cada candidatura ou sala. O autor fica no registo do evento e da auditoria. external_delivery=not_configured não afirma transmissão ao CRM. Estes envelopes são internos e não constituem um endpoint público para informação privada.
As salas usam documentos do cadastro existente, armazenamento privado, consentimento explícito de partilha e scanner existente. Download exige acesso atual à sala, autorização de partilha, resultado antimalware limpo e integridade do ficheiro. O autor pode revogar a partilha. Gestores de publicação não recebem acesso automático às mensagens ou aos documentos de negociação.