{
  "id": "migration-12b-granting-party-registration-requests",
  "title": "Migration 12B — granting_party_registration_requests",
  "description": "Solicitações tipadas de cadastro de parte concedente feitas durante a abertura.",
  "type": "migration-reference",
  "status": "implemented",
  "visibility": "public",
  "tags": [
    "sge/migrations",
    "sge/cadastro"
  ],
  "related": [
    "migration-12-granting-parties",
    "enum-partydocumenttype",
    "enum-registrationrequeststatus",
    "cadastros-pendentes-de-supervisor-e-concedente"
  ],
  "sourceRefs": [
    "https://github.com/sge-suite/sge/blob/master/database/migrations/2026_09_23_190320_create_granting_party_registration_requests_table.php",
    "https://github.com/sge-suite/sge/blob/master/app/Models/GrantingPartyRegistrationRequest.php",
    "https://github.com/sge-suite/sge/blob/master/tests/Feature/GrantingPartyRegistrationRequestTest.php"
  ],
  "authors": [],
  "updated": null,
  "diagram": null,
  "body": "> [!info] Estado\n> O pedido conserva o campus de origem com FK obrigatória para `campuses`, e a validação exige que a concedente resultante pertença ao mesmo campus. Migration, Model, factory, casts, validação e testes PostgreSQL estão implementados; o fluxo transacional de análise continua planejado.\n\n| Campo | Regra |\n| --- | --- |\n| `id` | bigint, chave primária Laravel. |\n| `campus_id` | bigint obrigatório, FK para `campuses.id` com `RESTRICT` e índice; escopo imutável após criação. |\n| `document_type` / `document_number` | tipo CPF/CNPJ e número validado pelo cast correspondente, normalizado sem pontuação; nulos em `Draft`, obrigatórios nos demais estados. |\n| `name` | nome ou razão social, obrigatório fora de `Draft`. |\n| `street`, `number`, `neighborhood`, `city`, `uf`, `zip_code` | endereço proposto em colunas próprias; obrigatórios fora de `Draft`. UF usa `BrazilianState`; CEP guarda oito dígitos. |\n| `representative_name` / `representative_role` | representante e cargo, obrigatórios fora de `Draft`. |\n| `phone` / `email` | opcionais; telefone validado e normalizado por `PhoneCast`, e-mail validado. |\n| `field_of_activity` | obrigatório fora de `Draft`. |\n| `professional_council`, `council_registration_number`, `credentialing_process_number` | opcionais. |\n| `status` | `RegistrationRequestStatus`, obrigatório. |\n| `granting_party_id` | FK nullable com exclusão restrita para `granting_parties`; obrigatória em `Approved`. |\n| `reviewed_at` | instante opcional da análise. |\n| `decision_reason` | motivo obrigatório em `Rejected` e `Cancelled`; opcional nos demais estados. |\n| timestamps | `created_at` e `updated_at` nativos. |\n\nA tabela registra a proposta enviada e sua decisão; `granting_parties` e `addresses` guardam o cadastro atual. Não há `submitted_by_affiliation_id`, `reviewed_by_affiliation_id` nem `submission_snapshot`. O Model participa do Activity Log Eloquent e registra atores e alterações; as Actions e Policies da análise ainda estão pendentes. A exclusão física pelo Model é bloqueada; não há `deleted_at`. Há índice secundário em `campus_id`, sem unicidade de documento ou constraints `CHECK`. O Model valida o campus e impede sua alteração após a criação.\n\nA aprovação selecionará ou criará `granting_parties` em transação, sempre no campus preservado pelo pedido, e associará a concedente resultante ao pedido; o Model já rejeita concedente resultante de outro campus. CPF/CNPJ repetidos em outros campi não tornam o cadastro compartilhável. Ao criar uma concedente, criará também uma nova linha de `addresses` exclusiva dela; não reutilizará o endereço de outro cadastro, mesmo que seja idêntico. O pedido mantém o endereço proposto em colunas próprias para aceitar rascunhos incompletos e preservar o que foi enviado. CNPJ repetido não impede unidades distintas. A solicitação de estágio só poderá ser aceita após substituir a referência pendente pela concedente aprovada.",
  "sections": [],
  "sourcePath": "content/migration-12b-granting-party-registration-requests.md",
  "visuals": [],
  "apiVersion": 1
}
