commit melhorias sgf

This commit is contained in:
2026-11-11 09:00:17 +02:00
parent 0b05a1192c
commit 1d11a5e57b
736 changed files with 40746 additions and 210 deletions
+5 -1
View File
@@ -2,6 +2,7 @@ import React,{useEffect,useState} from 'react';
import {billingSections,visibleBillingSections,filterBillingRows,loadBillingRows} from './billing-menu.js';
const emptyFilters={search:'',type:'',currency:'',series:'',state:'',author:'',from:'',to:''};
const BillingRegisterWorkspace=React.lazy(()=>import('./BillingRegisterWorkspace.jsx'));
const value=v=>v===null||v===undefined||v===''?'Por determinar':String(v);
export function BillingDocumentList({rows,filters,onFilter,onClear,onOpen}) {
@@ -25,13 +26,16 @@ export default function BillingMenuWorkspace({section,context,can,api,navigate})
useEffect(()=>{setSelected(null);},[section]);
useEffect(()=>{
let current=true;setResult(null);setSelected(null);
if(unit===null||active?.pending)return ()=>{current=false;};
if(unit===null||active?.pending||(context.service_documents_enabled&&['billing_all','service_invoices'].includes(section)))return ()=>{current=false;};
setLoading(true);
loadBillingRows(api,can,unit).then(r=>{if(current){setResult(r);setLoading(false);}});
return ()=>{current=false;};
},[context.token,section,reload]);
if(!active)return null;
if(context.service_documents_enabled&&['billing_all','service_invoices'].includes(section))return <React.Suspense fallback={<p role="status">A abrir documentos…</p>}><BillingRegisterWorkspace api={api} context={context} navigate={navigate} section={section}/></React.Suspense>;
const newDraft=()=>navigate('billing_drafts',null,true);
const additional={billing_receipts:'receipt',billing_credit_notes:'credit_note',billing_invoice_receipts:'invoice_receipt'}[section];
if(additional&&context.service_documents_enabled&&unit&&can('service_documents.view',unit))return <section className="panel"><p className="eyebrow">COMERCIAL</p><h1>{active.label}</h1><p>Preparação, revisão distinta, prévia e emissão individual de teste. Os recibos usam afectações efectivas; o crédito exige decisão financeira própria.</p><a href={'/commercial/documents?kind='+additional}>Abrir {active.label.toLowerCase()}</a><p>Sem validade fiscal e sem movimento de dinheiro real.</p></section>;
return <div className="billing-menu-workspace"><div className="page-title"><p className="eyebrow">FACTURAÇÃO</p><h1>{active.label}</h1><p>Documentos comerciais no contexto de {context.company.name}{context.unit?` / ${context.unit.name}`:''}.</p></div>
<nav className="billing-section-tabs" aria-label="Submenus de facturação">{visibleBillingSections(can,unit).map(s=><button key={s.id} aria-current={s.id===section?'page':undefined} onClick={()=>navigate(s.id)}>{s.label}</button>)}</nav>
<p className="fiscal-notice"><strong>Demonstração — sem validade fiscal.</strong> A entrada e a consulta não habilitam emissão real. Documento, dívida e recebimento são factos distintos.</p>