import React,{useEffect,useState} from 'react'; import PayableDueWorkspace from './PayableDueWorkspace.jsx'; import {minorAmount} from './ledger-report-view.js'; import {documentStates,payableStates,payablePageSummary,payableAgeSummary,ageLabels,checkedPayablePage,payablePageCsv} from './payable-position-view.js'; const amount=v=>v===null?'Indeterminado':minorAmount(v); export function PayablePositionRows({data,onDue}){return
{data.positions.map(r=>)}
Documento e fornecedorConferência / reconhecimentoPrincipalHistórico confirmado / afectaçõesSaldo actualVencimento / pendênciasConsultar
{r.reference}{r.supplier}{r.currency}{documentStates[r.document_state]??r.document_state}{payableStates[r.payment_state]??r.payment_state}{amount(r.principal_minor)}{amount(r.confirmed_payments_minor)} / {amount(r.allocated_payments_minor)}{amount(r.balance_minor)}Original: {r.due_on??'Vencimento desconhecido'}{r.reviewed_terms&&Condição administrativa revista v{r.reviewed_terms.version}: {r.reviewed_terms.due_on??'Desconhecida'}. Consulte a referência de atraso e o histórico.}{r.days_overdue===null?'Atraso indeterminado pelo livro':r.days_overdue+' dia(s) segundo o livro'}{r.reviewed_age_bucket&&{ageLabels[r.reviewed_age_bucket]}{r.reviewed_age_days===null?'':' · '+r.reviewed_age_days+' dia(s) à referência '+data.aging_reference_on}}{r.source_conflict&&Origem/histórico divergente: saldo não presumido.}
    {r.pending.map((p,i)=>
  • {p}
  • )}
{r.obligation_id?<>Abrir esta obrigação e comprovativos{onDue&&}:Reconhecimento ainda pendente}
{!data.positions.length&&

Nenhum documento corresponde aos filtros autorizados nesta página.

}
;} export default function PayablePositionsWorkspace({context,api,aging=false}){ const[selected,setSelected]=useState(null); const initial={search:'',document_state:'',per_page:'25',reference_on:''};const [form,setForm]=useState(initial),[query,setQuery]=useState({...initial,page:1}),[data,setData]=useState(null),[loading,setLoading]=useState(false),[error,setError]=useState(''); useEffect(()=>{let current=true;setData(null);setError('');if(aging&&!query.reference_on){setLoading(false);return()=>{current=false;};}setLoading(true);api('/api/finance/payable-positions?'+new URLSearchParams(Object.entries(query).filter(([,v])=>v!==''))).then(v=>{const result=checkedPayablePage(v,query);if(current)setData(result);}).catch(e=>{if(current)setError(e.message);}).finally(()=>{if(current)setLoading(false);});return()=>{current=false;};},[context.token,query,aging]); const summary=data?payablePageSummary(data):null;const exportPage=()=>{const url=URL.createObjectURL(new Blob(['\uFEFF'+payablePageCsv(data,query)],{type:'text/csv;charset=utf-8'}));const a=document.createElement('a');a.href=url;a.download='sgf-fornecedores-pagina-'+data.pagination.page+'.csv';a.click();setTimeout(()=>URL.revokeObjectURL(url),1000);}; if(selected)return setSelected(null)}/>; return

FINANCEIRO

{aging?'Mapa de antiguidade de fornecedores':'Posições de fornecedores'}

{aging&&

Classificação do saldo actual segundo a condição administrativa revista e uma referência escolhida. Totais apenas da página, por moeda; não é saldo histórico, prazo legal ou recomendação de pagamento.

}

Saldo, pagamentos históricos e afectações provêm do mesmo livro de obrigações. Uma factura pendente ou sem reconhecimento não é dívida zero. Não são criados pagamentos ou lançamentos por esta consulta.

{e.preventDefault();setQuery({...form,page:1});}}>
{loading&&

A consultar a origem e o livro financeiro…

}{error&&

{error}. A indisponibilidade não significa saldo zero.

}{data&&<>

{data.pagination.total} documento(s) · página {data.pagination.page} de {data.pagination.last_page} · leitura {data.observed_at}.

{summary.totals.map(t=>
Saldo conhecido apenas desta página
{t.value} {t.currency}
)}
Sem reconhecimento nesta página
{summary.unrecognized}
Saldo indeterminado nesta página
{summary.unknown}
<>{query.reference_on&&

Faixas apenas desta página · referência{data.aging_reference_on}

{payableAgeSummary(data).map(t=>
{ageLabels[t.bucket]}
{t.value} {t.currency}
)}

Saldos indeterminados e documentos sem reconhecimento ficam fora das faixas monetárias; saldos liquidados não representam comprovativo bancário.

}
}

O número de documentos refere-se ao filtro completo; os saldos resumidos e o CSV referem-se apenas à página. Não se somam moedas diferentes. Cada página é uma leitura actual, sem fotografia global entre páginas ou corte histórico. O vencimento e o atraso permanecem indeterminados quando o livro não os sustenta. Um pagamento preparado não comprova execução bancária.

; }