Files
SGF/resources/js/payable-position-view.js
2026-11-11 09:00:17 +02:00

18 lines
4.3 KiB
JavaScript
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
import {minorAmount} from './ledger-report-view.js';
export const documentStates={pending:'Factura pendente de conferência',validated:'Factura conferida'};
export const payableStates={not_recognised:'Obrigação ainda não reconhecida',unpaid:'Por liquidar',partial:'Parcialmente liquidada',settled:'Liquidada no livro',indeterminate:'Saldo indeterminado'};
export function payablePageSummary(data){
const totals=new Map();let unrecognized=0,unknown=0;
for(const r of data.positions){if(!r.obligation_id){unrecognized++;continue;}if(r.balance_minor===null){unknown++;continue;}minorAmount(r.balance_minor);totals.set(r.currency,(totals.get(r.currency)??0n)+BigInt(r.balance_minor));}
return{totals:[...totals].map(([currency,value])=>({currency,value:minorAmount(String(value))})),unrecognized,unknown};
}
export const ageLabels={not_due:'Data revista ainda não ultrapassada',days_1_30:'1–30 dias',days_31_60:'31–60 dias',days_61_90:'61–90 dias',days_over_90:'Mais de90 dias',unknown:'Vencimento desconhecido',settled:'Saldo liquidado no livro',unrecognised:'Sem obrigação reconhecida',indeterminate:'Saldo indeterminado'};
export function payableAgeSummary(data){const groups=new Map();for(const r of data.positions){if(!r.obligation_id||r.balance_minor===null||r.source_conflict||r.balance_minor==='0')continue;const bucket=r.reviewed_age_bucket;if(!bucket||!Object.hasOwn(ageLabels,bucket))throw Error('Faixa de atraso indisponível.');const key=r.currency+'|'+bucket;groups.set(key,(groups.get(key)??0n)+BigInt(r.balance_minor));}return[...groups].map(([key,total])=>{const[currency,bucket]=key.split('|');return{currency,bucket,value:minorAmount(String(total))};});}
export function checkedPayablePage(data,query){
if(data.balance_basis!=='original_current_payable_engine'||data.totals_basis!=='visible_page_only'||!data.synthetic_only||!Array.isArray(data.positions)||data.positions.length>Number(query.per_page)||data.pagination.page!==query.page)throw Error('A fonte não corresponde à página pedida.');
if(query.reference_on&&(data.aging_reference_on!==query.reference_on||data.aging_basis!=='reviewed_administrative_terms_current_balance'))throw Error('Referência de atraso alterada; consulte novamente.');
for(const r of data.positions){if(!Number.isSafeInteger(r.document_id)||r.document_id<1)throw Error('Documento sem identidade segura.');for(const field of ['principal_minor','balance_minor','confirmed_payments_minor','allocated_payments_minor'])if(r[field]!==null)minorAmount(r[field]);if((!r.obligation_id||r.source_conflict)&&r.balance_minor!==null)throw Error('Saldo sem reconhecimento/origem actual não pode ser presumido.');if(query.reference_on){if(!Object.hasOwn(ageLabels,r.reviewed_age_bucket))throw Error('Faixa administrativa ausente.');const known=r.reviewed_age_bucket==='not_due'||r.reviewed_age_bucket.startsWith('days_');if(known?(!Number.isSafeInteger(r.reviewed_age_days)||r.reviewed_age_days<0):r.reviewed_age_days!==null)throw Error('Dias administrativos incompatíveis.');}}
return data;
}
export function payablePageCsv(data,query){const cell=v=>'"'+String(v??'').replaceAll('"','""')+'"',amount=v=>v===null?'Indeterminado':minorAmount(v);return [['POSICOES ACTUAIS DE FORNECEDORES QA'],['Apenas esta pagina',data.pagination.page,'de',data.pagination.last_page],['Leitura',data.observed_at],['Referencia para faixas administrativas',data.aging_reference_on??'Sem classificacao'],['Base','Saldo actual e prazo administrativo revisto; NAO E SALDO HISTORICO'],['Filtros',JSON.stringify(query)],['Documento','Fornecedor actual da origem','Moeda','Estado documental','Estado financeiro','Principal','Historico confirmado','Afectacoes liquidas','Saldo','Vencimento original','Condição administrativa revista','Evidência da condição revista','Faixa administrativa','Dias administrativos','Pendencias'],...data.positions.map(r=>["'"+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),r.due_on??'Desconhecido',r.reviewed_terms?.due_on??'Desconhecido',"'"+(r.reviewed_terms?.evidence??''),ageLabels[r.reviewed_age_bucket]??'Sem classificacao',r.reviewed_age_days??'Indeterminado',"'"+(r.pending??[]).join(' | ')])].map(row=>row.map(cell).join(';')).join('\r\n')+'\r\n';}