import { Head, Link, useForm } from '@inertiajs/react'; import { PageTitle, Panel } from '@/components/procurement'; import { Button } from '@/components/ui/button'; import { Input } from '@/components/ui/input'; import { Label } from '@/components/ui/label'; type Policy = { id: number; revision: number; status: string; created_by: number; enabled: boolean; valid_from: string; valid_until: string; }; type Cancellation = { id: number; purchase_award_id: number; created_by: number; status: string; reason: string; review_reason: string | null; }; type Props = { role: string; actorId: number; policies: Policy[]; reviews: { purchase_control_policy_id: number; reviewed_by: number; decision: string; }[]; awards: { id: number; requisition_id: number; status: string }[]; cancellations: Cancellation[]; sources: { id: number; number: string; revision_id: number | null }[]; }; const states: Record = { pending: 'Pendente', approved: 'Aprovado', rejected: 'Rejeitado', cancelled: 'Cancelado', }; function ReasonForm({ url, decisions = false, }: { url: string; decisions?: boolean; }) { const form = useForm({ reason: '', decision: 'approved' }); return (
{ event.preventDefault(); form.post(url, { preserveScroll: true }); }} className="mt-3 space-y-3" > {decisions && ( )} {Object.entries(form.errors).map(([key, message]) => (

{message}

))}
); } function PolicyForm({ previousId }: { previousId: number }) { const form = useForm({ previous_id: previousId, mode: 'unissued_award', enabled: false, valid_from: '', valid_until: '', reason: '', }); return (
{ event.preventDefault(); form.post('/revisao-compras/politicas', { preserveScroll: true, }); }} className="grid gap-4 sm:grid-cols-2" > {Object.entries(form.errors).map(([key, message]) => (

{message}

))}
); } function RevisionForm({ id }: { id: number }) { const form = useForm({ needed_by: '', justification: '' }); return (
{ event.preventDefault(); form.post(`/cancelamentos/${id}/revisao`); }} className="mt-3 grid gap-3" > {Object.entries(form.errors).map(([key, message]) => (

{message}

))}
); } export default function PurchaseControls({ role, actorId, policies, reviews, awards, cancellations, sources, }: Props) { return ( <>

Este circuito abrange apenas adjudicações sem ordem emitida. Um pedido pendente suspende decisões e emissão. Ordens, recepções, facturas e pagamentos exigem um circuito próprio.

{role === 'admin' && ( )} {policies.map((policy) => (

Assinaturas:{' '} { reviews.filter( (review) => review.purchase_control_policy_id === policy.id && review.decision === 'approved', ).length } /2

{role === 'admin' && policy.status === 'pending' && policy.id === policies[0]?.id && policy.created_by !== actorId && !reviews.some( (review) => review.purchase_control_policy_id === policy.id && review.reviewed_by === actorId, ) && ( )}
))} {awards.map((award) => { const cancellation = cancellations.find( (entry) => entry.purchase_award_id === award.id, ); return ( Consultar processo {cancellation ? ( <>

Cancelamento{' '} {states[cancellation.status]}:{' '} {cancellation.reason}

{cancellation.review_reason && (

Decisão:{' '} {cancellation.review_reason}

)} {role === 'finance' && cancellation.status === 'pending' && cancellation.created_by !== actorId && ( )} ) : ( role === 'procurement' && ( ) )}
); })} {sources.length === 0 && (

Sem cancelamentos aprovados para revisão.

)} {sources.map((source) => (

{source.number}

{source.revision_id ? ( Abrir nova requisição ) : ( )}
))}
); }