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

11 lines
5.0 KiB
JavaScript

import {beginWorkspace,focusHref,appendProcessLinks} from './purchasing-focus.mjs';
const root=document.querySelector('#purchasing-dossier'),status=document.querySelector('#status'),list=document.querySelector('#requests'),detail=document.querySelector('#detail');let page=1,last=1,serial=0,filter='';
const n=(tag,text)=>{const e=document.createElement(tag);if(text!==undefined)e.textContent=text;return e;};
async function api(path){const r=await fetch('/api/purchasing-dossiers'+path,{headers:{Accept:'application/json','X-SGF-Context':root.dataset.context}});const d=await r.json();if(!r.ok)throw Error(Object.values(d.errors||{}).flat().join(' ')||d.message||'Não foi possível consultar.');return d;}
async function load(){const turn=++serial;detail.replaceChildren();try{const d=await api('?page='+page+filter);if(turn!==serial)return;status.textContent='';list.replaceChildren();for(const req of d.data){const b=n('button',req.number+' · '+req.status+' · versão '+req.process_version);b.onclick=()=>open(req.id);list.append(b);}if(!d.data.length)list.append(n('p','Sem requisições autorizadas nesta página e filtro.'));last=d.last_page;document.querySelector('#page').textContent=`Página ${page} de ${last}`;document.querySelector('#previous').disabled=page<=1;document.querySelector('#next').disabled=page>=last;}catch(e){if(turn===serial)status.textContent=e.message;}}
async function open(id,pages={}){const turn=++serial;detail.replaceChildren();status.textContent='A consultar evidência actual…';try{const query=new URLSearchParams(pages),d=await api('/'+id+(query.size?'?'+query:''));if(turn!==serial)return;status.textContent='';const summary=n('section');summary.append(n('h2',d.request.number),n('p','Estado: '+d.request.status+' · versão '+d.request.process_version),n('p','Impressão desta vista: '+d.view_revision.slice(0,16)),n('p','A impressão cobre apenas as páginas visíveis; não substitui a conferência exigida por cada operação.'));const refresh=n('button','Actualizar evidência');refresh.onclick=()=>open(id,pages);summary.append(refresh);appendProcessLinks(summary,d._links);detail.append(summary);
const stages={quotes:['Propostas','sourcing'],awards:['Adjudicação','sourcing'],orders:['Ordens','orders'],receipts:['Recepções','receipts'],invoices:['Facturas','invoices'],obligations:['Obrigações','obligations'],events:['Histórico autorizado','requests']};
for(const [key,[label,path]]of Object.entries(stages)){const stage=key==='events'?d.events:d.stages[key],box=n('section');box.append(n('h2',label));detail.append(box);if(!stage.accessible){box.append(n('p','Etapa restrita. A ausência de acesso não significa ausência de registos.'));continue;}const link=n('a','Abrir etapa e conferências próprias');link.href='/purchasing/'+path;box.append(link);for(const row of stage.data){const card=n('article'),labels={id:'Registo',number:'Documento',reference:'Referência',status:'Estado',supplier_id:'Fornecedor',quotation_id:'Proposta de origem',purchase_order_id:'Ordem de origem',total_minor:'Total',principal_minor:'Principal',balance_minor:'Saldo',due_on:'Vencimento',created_by:'Preparado por',issued_by:'Emitido por',received_by:'Recebido por',validated_by:'Validado por',recognised_by:'Reconhecido por',user_id:'Autor',action:'Acontecimento',created_at:'Data',issued_at:'Emissão',received_on:'Recepção',validated_at:'Validação',confirmed_at:'Confirmação',documentary_pending:'Pendências documentais'};for(const [field,label]of Object.entries(labels))if(Object.hasOwn(row,field)){let value=row[field];if(value===null)value=field==='balance_minor'?'Indeterminado':'Por definir';else if(field.endsWith('_minor'))value=(Number(value)/100).toFixed(2)+' MZN';else if(Array.isArray(value))value=value.join(' ');card.append(n('p',label+': '+value));}if(row.source_conflict)card.append(n('p','A origem mudou; o saldo exige nova conferência.'));appendProcessLinks(card,row._links);box.append(card);}if(!stage.data.length)box.append(n('p',stage.source_window?'Sem obrigação reconhecida nas facturas desta página.':'Sem registos nesta página.'));const p=stage.pagination;box.append(n('p',`Página ${p.page} de ${p.last_page}`));if(stage.source_window)box.append(n('p','Paginação por facturas de origem; não é uma contagem global de obrigações.'));for(const [enabled,target,text]of [[p.page>1,p.page-1,'Anterior'],[p.page<p.last_page,p.page+1,'Seguinte']])if(enabled){const b=n('button',text);b.onclick=()=>open(id,{...pages,[key+'_page']:target});box.append(b);}}
}catch(e){if(turn===serial)status.textContent=e.message;}}
document.querySelector('#filters').onsubmit=e=>{e.preventDefault();const f=e.currentTarget;filter=(f.search.value?'&search='+encodeURIComponent(f.search.value):'')+(f.state.value?'&status='+f.state.value:'');page=1;load();};document.querySelector('#previous').onclick=()=>{if(page>1){page--;load();}};document.querySelector('#next').onclick=()=>{if(page<last){page++;load();}};beginWorkspace({stage:'dossiers',root,load:load,open:f=>open(f.request),current:()=>serial,error:text=>{status.textContent=text;}});