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
{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')}.
| 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 |
Nenhuma requisição encontrada nos filtros e no âmbito autorizado.
)}