Files
SGF/public/sgf-composed-ledger.mjs
2026-11-11 09:00:17 +02:00

16 lines
2.8 KiB
JavaScript

const root=document.querySelector('#composed-ledger'),message=document.querySelector('#ledger-result');let pending=false,uncertain=false,current=null,dirty=false;
for(const form of document.querySelectorAll('[data-ledger-action]')){
form.addEventListener('input',()=>{dirty=true;});
form.onsubmit=async event=>{event.preventDefault();if(pending)return;if(uncertain&&current!==form){message.textContent='Recupere primeiro a operação pendente.';return;}let action=form.dataset.ledgerAction,body=uncertain?JSON.parse(form.dataset.signature):Object.fromEntries(new FormData(form));
if(action==='capture'){if(uncertain)action=form.dataset.sentAction;else{const [kind,id]=body.source.split('|');delete body.source;body.rule_key=kind;if(kind==='supplier_payable.recognised'){action='prepare';body.obligation_id=Number(id);}else{action='effect-prepare';body.effect_type=kind;body.source_id=Number(id);}}}
for(const key of ['obligation_id','source_id','proposal_id','journal_id','correction_id','check_id','book_id','rate_id','version'])if(key in body)body[key]=Number(body[key]);
if(body.unit_amount!==undefined){if(!/^\d{1,6}(\.\d{1,2})?$/.test(body.unit_amount)){message.textContent='Indique um custo unitário positivo com até duas casas decimais.';return;}const [whole,fraction='']=body.unit_amount.split('.');body.unit_minor=Number(whole)*100+Number(fraction.padEnd(2,'0'));delete body.unit_amount;}
const signature=JSON.stringify(body);if(!uncertain&&form.dataset.signature!==signature){form.dataset.key=crypto.randomUUID();form.dataset.signature=signature;form.dataset.sentAction=action;}
current=form;pending=true;for(const field of document.querySelectorAll('input,textarea,select,button'))field.disabled=true;message.textContent='A revalidar a fotografia, as permissões e as dependências…';
try{const response=await fetch('/api/general-ledger/'+(form.hasAttribute('data-stock-rate')?'stock/':'')+action,{method:'POST',headers:{Accept:'application/json','Content-Type':'application/json','X-CSRF-TOKEN':root.dataset.csrf,'X-SGF-Context':root.dataset.context,'Idempotency-Key':form.dataset.key},body:signature});const value=await response.json();if(!response.ok){if(response.status>=500)throw Error('Resposta incerta');uncertain=false;message.textContent=value.message||'Conferência recusada. Actualize o documento.';return;}uncertain=false;dirty=false;location.reload();}
catch{uncertain=true;message.textContent='Resultado ainda incerto. Recupere pelo mesmo botão com a mesma chave; os campos ficam protegidos.';}
finally{pending=false;for(const field of document.querySelectorAll('input,textarea,select,button'))field.disabled=uncertain&&!(field.tagName==='BUTTON'&&form.contains(field));}
};
}
window.addEventListener('beforeunload',event=>{if(pending||uncertain||dirty){event.preventDefault();event.returnValue='';}});