import { Link, useForm } from '@inertiajs/react'; import { useState } from 'react'; import { Management, Field, control, button } from '../management/shared'; import { TerritoryFields, type TerritoryOption, } from '@/components/investment-territory'; export default function Analysis({ demand, candidates, eligible, gap, proposal, sectors, territoryPath, }: { demand: { id: string; version_no: number; quantity: number; qualification: string; geo_location_id: string; }; candidates: { id: string; quantity: number; period_start: string; period_end: string; source: string; }[]; eligible: boolean; gap: { state: string; people: number | null }; proposal: { opportunity_id: number; demand_version: number; intervention: string; equipment_needs: string | null; trainer_needs: string | null; funding_plan: string | null; risks: string; source: string; } | null; sectors: { id: number; name: string }[]; territoryPath: TerritoryOption[]; }) { const [selectedTerritory, setSelectedTerritory] = useState(territoryPath); const form = useForm({ demand_version: demand.version_no, sector_id: '', title: '', intervention: '', equipment_needs: '', trainer_needs: '', funding_plan: '', risks: '', source: '', currency: 'MZN', province_id: territoryPath[0]?.id ?? '', district_id: territoryPath[1]?.id ?? '', admin_post_id: territoryPath[2]?.id ?? '', locality_id: territoryPath[3]?.id ?? '', }); return (

Procura: {demand.quantity} trabalhadores ·{' '} {demand.qualification}

Localização da procura:{' '} {territoryPath.map((territory) => territory.name).join(' · ') || 'Não indicada'}

{gap.state === 'expired' ? 'Fonte expirada. Actualize a declaração antes de analisar.' : !eligible ? 'A procura exige revisão independente antes da análise.' : 'Lacuna quantitativa não determinada: falta evidência de trabalhadores qualificados e disponíveis. Vagas em cursos não são trabalhadores disponíveis.'}

Oferta potencialmente compatível

Critérios: mesma ocupação, competência principal, território e texto de qualificação; fonte vigente e revisão interna; conclusão até ao início da necessidade. Esta correspondência não comprova equivalência curricular, acreditação, conclusão ou contratação.

{candidates.map((c) => (

{c.quantity} vagas · {c.period_start} a {c.period_end}

Fonte: {c.source}

))} {!candidates.length && (

Não há oferta que satisfaça estes critérios. Isto não prova ausência de instituições no território.

)}

As capacidades não são somadas nem alocadas: podem partilhar formadores, instalações ou equipamentos.

Preparação do investimento educativo

A ficha permanece em rascunho até à validação institucional da lacuna e da resposta formativa. Não garante emprego ou financiamento.

{proposal ? ( <> {proposal.demand_version !== demand.version_no && (

A procura foi alterada desde a criação da ficha. É necessária reconciliação.

)}

{proposal.intervention}

Equipamentos:{' '} {proposal.equipment_needs || 'Pendente de levantamento'}

Formadores:{' '} {proposal.trainer_needs || 'Pendente de levantamento'}

Financiamento:{' '} {proposal.funding_plan || 'Pendente de levantamento'}

Riscos: {proposal.risks}

Fonte: {proposal.source}

Consultar rascunho no catálogo de oportunidades ) : eligible ? (
{ e.preventDefault(); form.transform((data) => ({ ...data, demand_version: demand.version_no, })); form.post( `/management/education/demands/${demand.id}/investment`, ); }} >

Localização da oportunidade educativa

Inicialmente preenchida com a localização da procura. Confirme ou ajuste cada nível territorial.

{ setSelectedTerritory(path); form.setData((data) => ({ ...data, province_id: path[0]?.id ?? '', district_id: path[1]?.id ?? '', admin_post_id: path[2]?.id ?? '', locality_id: path[3]?.id ?? '', })); }} /> {Object.entries(form.errors) .filter(([key]) => key.endsWith('_id')) .map(([key, error]) => (

{error}

))}
form.setData('title', e.target.value) } /> {( [ 'intervention', 'equipment_needs', 'trainer_needs', 'funding_plan', 'risks', 'source', ] as const ).map((key) => (