Skip to content

REF-501-04: Contract Lifecycle

ADR: ADR-501 — Service DeliveryEscopo: Auto-ativação via POLICY, renovação automatizada, fidelidade, reajuste, pipeline de renovação, cancelamento


1. Auto-Ativação (POLICY)

Contract é OPTIONAL e ativa automaticamente conforme POLICY configurável:

ConfiguraçãoComportamento
contract_auto_activate: serviceContract criado quando Service provisionado
contract_auto_activate: environmentContract criado quando Environment provisionado
contract_auto_activate: bothContract criado para Service E Environment
contract_auto_activate: noneSem auto-ativação — somente criação manual

Default: both (para MIDDAG). Adotantes podem mudar conforme modelo.


2. Dados do Contract

CampoTipoDescrição
entitlement_idFKEntitlement SVC (ou ENV) pai
start_datedateInício do contrato
end_datedateTérmino do contrato
renewal_datedateData para iniciar processo de renovação
monthly_valuedecimalValor mensal (se aplicável)
annual_valuedecimalValor anual (se aplicável)
sla_termsjsonTermos de SLA vinculados (classe de serviço)
loyalty_monthsintPeríodo de fidelidade (default: 12)
adjustment_pctdecimalPercentual de reajuste anual (configurável)
signed_documentFKDocumento PDF assinado (domínio Document)
statusenumactive / expiring / expired / cancelled

3. Pipeline de Renovação

90 dias antes da expiração:
    → Contract status: active → expiring
    → Notificação ao admin
    → Hook: middag_contract_expiring

60 dias antes:
    → Notificação ao cliente via portal/email

45 dias antes:
    → Quote de renovação gerado automaticamente
    → Valor: annual_value × (1 + adjustment_pct) se reajuste aplicável
    → Quote enviado ao cliente

Cliente aceita:
    → Pipeline padrão: Quote → Order → Payment → Entitlement estendido
    → Contract: end_date atualizado, status: active
    → Histórico de renovação registrado

Cliente não aceita:
    → Lembretes adicionais (30, 15, 7 dias)
    → Expiração → CancellationPolicy governa expired→cancelled

4. Fidelidade

AspectoDetalhe
PeríodoConfigurável (default: 12 meses)
Multa rescisóriaConfigurável por contrato (% do valor restante)
Cancelamento antecipadoPermitido com aviso prévio (30 dias) + multa
Renovação após fidelidadeSem fidelidade no próximo período (mensal, cancelável)
Dispensa de fidelidadeAdmin pode dispensar manualmente

5. Reajuste Anual

AspectoDetalhe
PercentualConfigurável por contrato (adjustment_pct)
AplicaçãoNa renovação — novo valor = anterior × (1 + pct)
TetoConfigurável (default: sem teto)
NotificaçãoCliente informado do novo valor no quote de renovação
OverrideAdmin pode definir valor fixo no quote (ignora percentual)

6. Cancelamento

AspectoDetalhe
Aviso prévio30 dias (termos de uso)
Dentro da fidelidadeMulta rescisória aplicável
Após fidelidadeSem multa, cancelamento com 30 dias de aviso
Entitlement associadoEntitlement → expired → CancellationPolicy governa
DadosPreservados conforme CancellationPolicy.data_retention_days
ExportaçãoOferecida no processo de cancelamento

7. Hooks

HookParâmetrosQuando
middag_contract_expiring$contract, $days_left90/60/45 dias antes da expiração
middag_contract_renewed$contract, $new_datesRenovação confirmada
middag_contract_cancelled$contract, $reasonCancelamento processado

8. Contract Identification Fields

Além dos campos financeiros e de SLA (seção 2), o Contract possui campos de identificação e partes para rastreamento operacional:

CampoTipoDescrição
contract_numberstringNúmero único do contrato (gerado ou manual)
contract_titlestringTítulo descritivo
contract_typeenumTipo (ex: sla, hosting, development, consulting)
client_namestringNome do cliente (desnormalizado para exibição rápida)
client_cnpjstring (nullable)CNPJ da Organization (desnormalizado para documentos)
currencystringMoeda (default: BRL)
payment_termsstring (nullable)Termos de pagamento (ex: "30 dias", "a vista")
contract_pdf_urlstring (nullable)URL do PDF do contrato no R2 (versão original)
signed_pdf_urlstring (nullable)URL do PDF assinado no R2 (versão com assinaturas)

9. Extended Lifecycle States

Além dos 4 estados operacionais (seção 2: active/expiring/expired/cancelled), o Contract suporta estados de elaboração:

EstadoSignificadoTransições permitidas
draftContrato em elaboração, nao visivel para o cliente-> pending_signature
pending_signatureEnviado para assinatura do cliente-> active, cancelled
activeAssinado e vigente-> expiring (automático via cron)
expiringProximo da data de vencimento (pipeline de renovação)-> expired, active (renovado)
expiredVencido, aguardando renovação ou encerramento-> cancelled, active (renovado)
renewedRenovado — vinculado ao novo contrato via renewed_toEstado terminal (histórico)
cancelledCanceladoEstado terminal

Estados draft e pending_signature sao visíveis apenas no admin. O portal do cliente ve apenas contratos active, expiring e expired. Transições de estado disparam notificações e registram log de auditoria.


10. R2 File Storage (Signed Documents)

Documentos PDF de contratos sao armazenados no Cloudflare R2:

AspectoDetalhe
UploadVia admin WordPress — arquivo enviado ao R2, URL persistida no Contract
DownloadSigned URLs com token temporario (expiração configurável, default 1h)
MetadataNome, tipo MIME, tamanho, hash SHA-256 armazenados no registro
Limite50MB por arquivo
Tipos aceitosPDF (primario), DOCX (configurável)
Links expiradosPortal trata gracefully — solicita novo signed URL ao backend
Dois slotscontract_pdf_url (original) e signed_pdf_url (assinado) sao independentes

REST API endpoints para download de PDFs usam signed URLs com validação de contexto de Organization via header X-Middag-Organization:

  • GET /middag-account/v1/contracts/{id}/pdf — download do PDF original (signed URL)
  • GET /middag-account/v1/contracts/{id}/signed-pdf — download do PDF assinado (signed URL)