import React,{useEffect,useRef,useState} from 'react'; import {minorAmount,ledgerReportQuery,checkedReport,reportBasis,reportPageCsv} from './ledger-report-view.js'; export function LedgerReportTable({data,onAccount}){ const trial=data.kind==='trial_balance';return
{(trial?['Conta','Designação','Moeda','Abertura líquida','Débito','Crédito','Fecho líquido','Consultar']:['Data / lançamento','Origem e fundamento','Débito','Crédito','Saldo progressivo']).map(t=>)}{data.rows.map(r=>trial?:)}
{t}
{r.code}{r.label}{r.currency}{minorAmount(r.opening_net_minor)}{minorAmount(r.debit_minor)}{minorAmount(r.credit_minor)}{minorAmount(r.closing_net_minor)}
{r.journal_on}Lançamento #{r.journal_id} · linha #{r.line_id}{r.reason}Proposta #{r.proposal_id} · revisão #{r.review_id} · {r.effect_type??'Origem no diário'}{minorAmount(r.debit_minor)}{minorAmount(r.credit_minor)}{minorAmount(r.balance_minor)}
{!data.rows.length&&

Nenhum movimento elegível para a consulta autorizada e as datas escolhidas.

}
; } export default function LedgerReportsWorkspace({context,api}){ const initial={kind:'trial-balance',from_on:'',to_on:'',account_id:'',per_page:'25'}; const [form,setForm]=useState(initial),[query,setQuery]=useState(null),[data,setData]=useState(null),[error,setError]=useState(''),[loading,setLoading]=useState(false);const basis=useRef(null); useEffect(()=>{let current=true;setData(null);setError('');if(!query)return()=>{current=false;};setLoading(true);const expected=query.params.page>1?basis.current:null;api('/api/general-ledger/'+query.kind+'?'+new URLSearchParams(query.params)).then(value=>{const result=checkedReport(value,query,expected);if(current){basis.current=reportBasis(result);setData(result);}}).catch(e=>{if(current)setError(e.message);}).finally(()=>{if(current)setLoading(false);});return()=>{current=false;};},[context.token,query]); const load=(value,page=1)=>{try{const q=ledgerReportQuery(value,page);if(page===1)basis.current=null;setQuery(q);setError('');}catch(e){setError(e.message);}}; const account=(id,label)=>{const value={...form,...data.query,kind:'account-ledger',account_id:String(id),account_label:label};setForm(value);load(value);}; const download=()=>{const url=URL.createObjectURL(new Blob(['\uFEFF'+reportPageCsv(data)],{type:'text/csv;charset=utf-8'}));const a=document.createElement('a');a.href=url;a.download='sgf-'+data.kind+'-pagina-'+data.pagination.page+'.csv';a.click();setTimeout(()=>URL.revokeObjectURL(url),1000);}; return

Balancete e razão por período

Escolha datas explícitas. Abertura considera lançamentos anteriores ao início; movimentos abrangem o intervalo e o fecho inclui o último dia. Só entram lançamentos aplicados.

{e.preventDefault();load(form);}}>
{loading&&

A consultar o livro autorizado…

}{error&&

{error}

A falha não significa saldo zero.

{query&&}
}{data&&<>

{data.kind==='trial_balance'?'Balancete':`Razão · ${data.account.code} · ${data.account.label}`}

{data.query.from_on} a {data.query.to_on} · {data.currency} · página {data.pagination.page} de {data.pagination.last_page} · {data.pagination.total} registo(s).

{[['Débitos do intervalo',data.totals.debit_minor],['Créditos do intervalo',data.totals.credit_minor],...(data.kind==='account_ledger'?[['Abertura líquida da conta',data.opening_net_minor],['Fecho líquido da conta',data.closing_net_minor]]:[])].map(([label,v])=>
{label}
{minorAmount(v)} {data.currency}
)}

Totais do filtro completo devolvidos pelo servidor; não são a soma apenas das linhas visíveis. No balancete, saldo líquido positivo é devedor; negativo é credor.

Abrir nova leitura para impressão

Referência do livro: {data.basis.journals} lançamento(s), último #{data.basis.last_journal_id}, até {data.basis.through_on}. O saldo progressivo do razão inclui as páginas anteriores. Se o livro mudar entre páginas, exige-se nova consulta. Exportar não arquiva nem certifica um relatório.

}

Contas artificiais do exercício local. Sem balanço, demonstração de resultados ou classificação legal inferida. Consultar e exportar esta página não gera lançamentos, ajustamentos ou fecho.

; }