import { Head, Link, useForm } from '@inertiajs/react'; import { InventoryNotice, ReceiptProgressTable } from '@/components/inventory'; import { FormErrors, PageTitle, Panel, controlClass, } from '@/components/procurement'; import { Button } from '@/components/ui/button'; import { Input } from '@/components/ui/input'; import { Label } from '@/components/ui/label'; import { quantity, qualityStates, receiptStates } from '@/types/inventory'; import type { Receipt, ReceiptProgress, StockItem, Warehouse, } from '@/types/inventory'; type Line = { include: boolean; purchase_order_item_id: number; received_quantity: string; accepted_quantity: string; quality_status: string; notes: string; stock_item_id: string; }; type Props = { order: { id: number; number: string }; supplier_name: string; progress: ReceiptProgress; receipts: Receipt[]; warehouses: Warehouse[]; stockItems: StockItem[]; canConfirm: boolean; }; export default function ReceiveOrder({ order, supplier_name, progress, receipts, warehouses, stockItems, canConfirm, }: Props) { const form = useForm({ idempotency_key: crypto.randomUUID(), delivery_note: '', received_on: '', warehouse_id: '', items: progress.lines.map((line) => ({ include: false, purchase_order_item_id: line.id, received_quantity: '', accepted_quantity: '', quality_status: 'compliant', notes: '', stock_item_id: '', })), }); const change = (index: number, updates: Partial) => form.setData( 'items', form.data.items.map((line, i) => i === index ? { ...line, ...updates } : line, ), ); const outstanding = progress.lines.some( (line) => line.delivery_pending_milli > 0, ); return ( <>

As quantidades rejeitadas contam como conferidas, mas não entram em stock. Substituições ou reposições após rejeição não são autorizadas automaticamente.

{canConfirm && outstanding ? (
{ e.preventDefault(); form.transform((data) => ({ ...data, warehouse_id: data.warehouse_id || null, items: data.items .filter((line) => line.include) .map( ({ include: _include, ...line }) => ({ ...line, stock_item_id: line.stock_item_id || null, }), ), })); form.post(`/ordens/${order.id}/recepcoes`); }} >
form.setData( 'delivery_note', e.target.value, ) } />
form.setData( 'received_on', e.target.value, ) } />
{progress.lines.map( (source, index) => source.delivery_pending_milli > 0 && (
{source.description} · Por entregar{' '} {quantity( source.delivery_pending_milli, )}{' '} {source.unit} {form.data.items[index] .include && (
change( index, { received_quantity: e .target .value, ...(form .data .items[ index ] .quality_status === 'compliant' ? { accepted_quantity: e .target .value, } : {}), }, ) } />
change( index, { accepted_quantity: e .target .value, }, ) } />
{source.purchase_type !== 'service' ? (
) : (

Serviço: a aceitação não cria existências físicas.

)}