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

12 lines
2.5 KiB
JavaScript

export const positionStates={proposed:'Proposta por confirmar',refused:'Proposta recusada',open:'Em aberto',partial:'Parcialmente afectada',settled:'Liquidada por afectação/redução'};
export const dueStates={not_open:'Ainda não reconhecida',unknown:'Vencimento desconhecido',overdue:'Saldo vencido',not_due:'Não vencido na referência',settled:'Sem saldo reconhecido por receber'};
export function selectedReceivable(rows=[],id=''){return rows.find(r=>String(r.id)===String(id))??(!id?rows[0]??null:null);}
export function exactMoney(value){if(value===null)return 'Indeterminado';if(typeof value!=='string'||!/^[-]?\d+\.\d{2}$/.test(value))throw Error('Montante sem representação decimal exacta.');return value.replace('.',',');}
export function checkedPositions(data,query,previousBasis=null){
if(!data.read_only||data.currency!=='MZN'||data.balance_basis!=='current_confirmed_effects_not_historical_cut'||data.reference_on!==query.reference_on||data.positions?.current_page!==query.page||data.positions.data.length>Number(query.per_page)||!data.basis?.scope)throw Error('A fonte não corresponde à página e à referência pedidas.');
if(previousBasis!==null&&JSON.stringify(data.basis)!==previousBasis)throw Error('O livro de recebíveis mudou entre páginas. Actualize a primeira página.');
exactMoney(data.totals.recognized_balance);for(const row of data.positions.data){for(const field of ['original','reduced','allocated','balance'])exactMoney(row[field]);if(!positionStates[row.state]||!dueStates[row.due_state])throw Error('Estado desconhecido na fonte.');if(!row.opened&&row.balance!==null)throw Error('Proposta sem reconhecimento não é saldo confirmado.');}
return data;
}
export function positionsCsv(data,query){const cell=v=>'"'+String(v??'').replaceAll('"','""')+'"';const rows=[['POSICOES ACTUAIS QA — NAO E SALDO HISTORICO'],['Referencia apenas para vencimento',data.reference_on],['Pagina',data.positions.current_page,'de',data.positions.last_page,'Moeda','MZN'],['Filtros',JSON.stringify(query)],['Livro',JSON.stringify(data.basis)],['Documento','Cliente na emissao','Estado','Valor de origem','Reducao liquida','Afectacao liquida','Saldo reconhecido','Vencimento','Situacao','Dias de atraso','Revisao'],...data.positions.data.map(r=>["'"+r.reference,"'"+(r.client??'Por conferir'),positionStates[r.state],exactMoney(r.original),exactMoney(r.reduced),exactMoney(r.allocated),exactMoney(r.balance),r.due_date??'Desconhecido',dueStates[r.due_state],r.overdue_days??'Indeterminado',r.revision])];return rows.map(r=>r.map(cell).join(';')).join('\r\n')+'\r\n';}