Files
SGF/public/invoice-matching.mjs
2026-11-04 09:37:20 +02:00

9 lines
2.0 KiB
JavaScript

export function quantity(value){if(!Number.isSafeInteger(value))throw Error('Quantidade fora do intervalo de apresentação segura.');const sign=value<0?'-':'';const absolute=Math.abs(value);return sign+Math.floor(absolute/1000)+'.'+String(absolute%1000).padStart(3,'0');}
export function appendInvoiceMatching(container,rows){
const node=(tag,text)=>{const element=document.createElement(tag);if(text!==undefined)element.textContent=text;return element;};const panel=node('section');panel.append(node('h2','Quantidades para conferência da factura'),node('p','Só facturas validadas descontam a quantidade disponível. Documentos pendentes não reservam quantidade. A confirmação volta a aplicar a conferência nativa.'));
for(const row of rows){const line=node('article');line.append(node('h3',row.description));for(const [field,label]of [['ordered_milli','Encomendado'],['accepted_milli','Aceite na recepção'],['returned_milli','Devolvido'],['reversed_milli','Estornado na recepção'],['accepted_net_milli','Aceite após correcções'],['validated_milli','Facturado e validado'],['pending_milli','Em documentos pendentes'],['remaining_milli','Restante para conferir']])line.append(node('p',label+': '+quantity(row[field])+' '+row.unit));if(row.deficit_milli>0)line.append(node('p','Divergência a conferir: '+quantity(row.deficit_milli)+' '+row.unit+' já validadas acima da origem actualmente aceite.'));panel.append(line);}container.append(panel);
}
export function pendingQuantityWarnings(invoice,rows){
if(invoice.status!=='pending')return [];const lines=new Map(rows.map(row=>[row.line_id,row]));const warnings=[];for(const item of invoice.items){const row=lines.get(item.purchase_order_item_id);if(row&&item.quantity_milli>row.remaining_milli)warnings.push('Quantidade pendente de '+quantity(item.quantity_milli)+' '+row.unit+' excede o restante actual de '+quantity(row.remaining_milli)+' '+row.unit+'. Exige nova conferência; não altera nem elimina o documento.');}return warnings;
}