18 lines
4.3 KiB
JavaScript
18 lines
4.3 KiB
JavaScript
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';}
|