Files
SGF/resources/js/stock-receipt-trace.js
2026-11-04 09:37:20 +02:00

19 lines
1.3 KiB
JavaScript

export function receiptMovementHref(id) {
if(!Number.isSafeInteger(id)||id<1)throw Error('Movimento inválido. Actualize a consulta.');
return `/purchasing/receipts?movement=${id}`;
}
/** Called only inside the host's existing dirty-form/context transition guard. */
export async function openStockReceipt({movement,context,active,select,commit,go}) {
const href=receiptMovementHref(movement),unit=context?.unit?.id;
const allowed=p=>context?.grants?.some(g=>g.permission===p&&g.unit_id===unit);
if(context?.module_id!=='stock'||!unit||!context?.purchasing?.receipts
||!context?.modules?.some(m=>m.id==='purchasing')||!allowed('stock.view')||!allowed('purchasing_receipts.view'))throw Error('Origem sem acesso autorizado neste contexto.');
if(!active())throw Error('O contexto mudou. Actualize a consulta.');
const next=await select({tenant_id:context.company.tenant_id,company_id:context.company.id,unit_id:unit,module_id:'purchasing'});
if(!active())throw Error('Resposta de um contexto anterior ignorada.');
if(next?.context?.module_id!=='purchasing'||next.context.company?.id!==context.company.id
||next.context.company?.tenant_id!==context.company.tenant_id||next.context.unit?.id!==unit||!next.context.token)throw Error('O destino não confirmou o contexto pedido.');
commit(next);go(href);
}