*/ public function envelope(PeopleProcess $process): array { abort_if($process->isDirty(), 409, 'A ligação a RH exige uma versão persistida do contrato formalizado.'); // Selection approval and today's contract draft must never cross this boundary. abort_unless($process->exists && $process->getAttribute('work_context_key') === 'people.internal' && $process->status === 'contract_formalized' && ($process->contract['status'] ?? null) === 'formalized' && ! empty($process->contract['formalized_at']) && ! empty($process->contract['reference']) && $process->selected_application_id !== null, 409, 'A ligação a RH exige contrato interno formalizado.'); return ['schema' => 'sgc.people.contract_formalized.v1', 'idempotency_key' => 'sgc:'.$process->tenant_id.':people:'.$process->id.':contract:'.$process->version, 'tenant_id' => $process->tenant_id, 'process_id' => $process->id, 'process_version' => $process->version, 'application_id' => $process->selected_application_id, 'kind' => $process->kind, 'work_context_key' => $process->getAttribute('work_context_key'), 'contract' => $process->contract]; } }