import React,{useEffect,useRef,useState} from 'react'; const labels={items:'Artigos',warehouses:'Armazéns',balances:'Existências físicas',movements:'Movimentos'}; export function milliQuantity(value) { if(value===null||value===undefined)return 'Indeterminado'; const n=BigInt(value),negative=n<0n,absolute=negative?-n:n; return `${negative?'-':''}${absolute/1000n},${String(absolute%1000n).padStart(3,'0')}`; } export default function StockReadWorkspace({api,context}) { const initial={view:'balances',page:1,per_page:25,search:''}; const [query,setQuery]=useState(initial),[data,setData]=useState(null),[error,setError]=useState(''),[loading,setLoading]=useState(false); const generation=useRef(0); useEffect(()=>{ const current=++generation.current;setData(null);setError('');setLoading(true); const params=new URLSearchParams(Object.entries(query).filter(([,v])=>v!==undefined&&v!=='')); api(`/api/stock-read?${params}`).then(r=>{if(current===generation.current)setData(r);}) .catch(e=>{if(current===generation.current)setError(e.message);}).finally(()=>{if(current===generation.current)setLoading(false);}); return ()=>{generation.current++;}; },[context.token,query]); function filter(e){e.preventDefault();const f=Object.fromEntries(new FormData(e.currentTarget));setQuery({view:query.view,page:1,per_page:Number(f.per_page),search:f.search,warehouse_id:f.warehouse_id||undefined});} function page(n){setQuery({...query,page:n,snapshot:data.snapshot});} return

Consulta de Stock

Somente leitura. As restantes operações de Stock continuam indisponíveis neste percurso.

{['balances','movements'].includes(query.view)&&}
{loading&&

A consultar a fonte autorizada…

} {error&&

{error}

} {data&&<>

{data.notice}

Referência de leitura: {data.observed_at}. {data.pagination.total} registos; página {data.pagination.page} de {data.pagination.last_page}.

{query.view!=='warehouses'&&}{['balances','movements'].includes(query.view)&&<>}{data.rows.map(row=>{query.view!=='warehouses'&&}{['balances','movements'].includes(query.view)&&<>})}
Código / origemDesignaçãoUnidadeArmazém{query.view==='balances'?'Físico':'Quantidade'}{query.view==='balances'?'Disponível':'Tipo / data'}
#{row.id??row.stock_item_id} · {row.code}{row.source_reference&& · {row.source_reference}}{row.name}{row.unit}#{row.warehouse_id} · {row.warehouse_code} · {row.warehouse_name}{milliQuantity(query.view==='balances'?row.physical_milli:row.quantity_milli)}{query.view==='balances'?'Indeterminado':`${row.movement_type === 'workshop_return_in' ? 'Devolução de excedente' : row.movement_type} · ${row.moved_at}`}
{data.rows.length===0&&

Sem registos elegíveis para estes filtros nesta fonte autorizada.

} }
; }