import React,{useEffect,useState} from 'react'; import {milliQuantity} from './StockReadWorkspace.jsx'; import {requestStockPeriod} from './stock-period-request.js'; export function StockPeriodTable({rows}) { return
{rows.map(row=> {['opening_milli','incoming_milli','outgoing_milli','closing_milli'].map(key=>)})}
Artigo / unidadeArmazémAberturaEntradasSaídasFechoMovimentos no período
{row.code} · {row.name} · {row.unit}{row.warehouse_code} · {row.warehouse_name}{milliQuantity(row[key])}{row.period_movements}
; } export default function StockPeriodReportWorkspace({api,context}) { const [query,setQuery]=useState(null),[data,setData]=useState(null),[error,setError]=useState(''),[loading,setLoading]=useState(false); useEffect(()=>{if(!query)return;return requestStockPeriod({query,api,data:setData,error:setError,loading:setLoading});},[query,context.token]); const submit=e=>{e.preventDefault();const values=Object.fromEntries(new FormData(e.currentTarget));setData(null);setQuery({view:'period',from:values.from,to:values.to,search:values.search,warehouse_id:values.warehouse_id||undefined,per_page:Number(values.per_page),page:1});}; return

Resumo físico por artigo e armazém

Escolha as datas do registo em UTC. Abertura antes do primeiro dia; fecho até ao fim do último dia. As designações são as actuais.

{!query&&

Seleccione o período; não foi consultada nem escolhida uma data automaticamente.

} {loading&&

A consultar o período autorizado…

} {error&&

{error}

} {data&&<>

{data.notice}

{data.period.from} a {data.period.to} · {data.period.timezone} · referência {data.observed_at}. Página {data.pagination.page} de {data.pagination.last_page}; {data.pagination.total} pares artigo/armazém.

{data.rows.length===0&&

Sem pares com história elegível até ao fecho para estes filtros. Não se inventam existências zero.

} }

Fecho = abertura + entradas − saídas, por linha e unidade. Sem valorização, reservas, bloqueios ou disponibilidade calculada.

; }