'Departamento e reporte', 'location' => 'Local e modalidade de trabalho', 'responsibilities' => 'Responsabilidades e tarefas essenciais', 'methods' => 'Métodos de selecção e perguntas nucleares', 'accessibility' => 'Contacto e medidas de acessibilidade', 'integration' => 'Integração e formação previstas', 'financial' => 'Condições de emprego, remuneração e benefícios']; public const SERVICE = ['scope' => 'Âmbito do serviço e exclusões', 'relationship' => 'Enquadramento da relação e validação prevista', 'methodology' => 'Proposta técnica e metodologia esperada', 'availability' => 'Disponibilidade e condições de execução', 'deliverables' => 'Entregáveis, marcos e prazos', 'acceptance' => 'Critérios de aceitação e responsável', 'financial' => 'Orçamento, honorários, despesas e condições de pagamento']; /** @param array $input * @return array|null */ public function validate(array $input, string $kind): ?array { if (! array_key_exists('annex', $input)) { return null; // Earlier clients and processes retain their initial form. } $fields = $kind === 'staff' ? self::STAFF : self::SERVICE; $rules = ['annex' => 'required|array:fields,requirements', 'annex.fields' => 'present|array:'.implode(',', array_keys($fields)), 'annex.requirements' => 'present|array|max:50', 'annex.requirements.*.description' => 'required|string|max:1000', 'annex.requirements.*.classification' => 'required|in:mandatory,desirable', 'annex.requirements.*.verification' => 'required|string|max:2000', 'annex.requirements.*.equivalences' => 'nullable|string|max:2000']; foreach (array_keys($fields) as $key) { $rules['annex.fields.'.$key] = 'nullable|string|max:5000'; } $valid = Validator::make($input, $rules)->validate()['annex']; return ['version' => 1, 'template' => $kind === 'staff' ? 'A' : 'C', 'fields' => $valid['fields'], 'requirements' => $valid['requirements']]; } }