import { Head, Link, useForm } from '@inertiajs/react'; import { Download } from 'lucide-react'; import { PageTitle, Panel, Status, controlClass, } from '@/components/procurement'; import { Button } from '@/components/ui/button'; import { date, statusLabels } from '@/types/procurement'; import { ProcurementOperationalInsights } from '@/components/procurement-operational-insights'; import type { ProcurementInsights } from '@/components/procurement-operational-insights'; type Row = { id: number; number: string; status: string; created_at: string; department: string | null; requester: string | null; total_minor: string; quotations_count: number; order_number: string | null; }; type Filters = { search?: string; status?: string; from?: string; to?: string; department_id?: string | number; }; const estimate = (minor: string) => { const digits = minor.padStart(3, '0'); return `${digits.slice(0, -2)},${digits.slice(-2)} MZN`; }; export default function ProcurementReports({ records, counts, filters, departments, generatedAt, insights, }: { records: { data: Row[]; total: number; current_page: number; last_page: number; prev_page_url: string | null; next_page_url: string | null; }; counts: Record; filters: Filters; departments: { id: number; name: string }[]; generatedAt: string; insights?: ProcurementInsights; }) { const form = useForm({ search: filters.search ?? '', status: filters.status ?? '', from: filters.from ?? '', to: filters.to ?? '', department_id: String(filters.department_id ?? ''), }); const params = new URLSearchParams(); for (const [key, value] of Object.entries(filters)) if (value !== null && value !== undefined && value !== '') params.set(key, String(value)); return ( <>
Exportar CSV } /> {insights && }
{ event.preventDefault(); form.get('/relatorios', { preserveState: true }); }} >
Limpar
{Object.entries(form.errors).map(([key, message]) => (

{message}

))}

{records.total} requisições

{Object.entries(counts).map(([status, count]) => (

{statusLabels[status] ?? status}: {count}

))}

O CSV inclui todos os resultados dos filtros aplicados, não apenas esta página. Consulta gerada em{' '} {new Date(generatedAt).toLocaleString('pt-MZ')}.

{records.data.map((row) => ( ))}
Requisição Departamento / solicitante Estado Estimativa total Propostas / ordem Continuar
{row.number} {date(row.created_at)} {row.department ?? 'Departamento indisponível'} {row.requester ?? 'Solicitante indisponível'} {estimate(row.total_minor)} {row.quotations_count} propostas {row.order_number ?? 'Sem ordem de compra'} Acompanhar processo Gerar relatório de conferência
{records.data.length === 0 && (

Nenhuma requisição encontrada nos filtros e no âmbito autorizado.

)}
); }