export const accountingSections=[ {id:'accounting_panel',label:'Painel contabilístico'}, {id:'accounting_daily',label:'Trabalho diário'}, {id:'accounting_review',label:'Conferência'}, {id:'accounting_analysis',label:'Análise'}, {id:'accounting_closing',label:'Fecho'}, {id:'accounting_configuration',label:'Configuração'}, ]; export function visibleAccountingSections(can) { return can('company.view')||can('catalogue_accounting.view')||can('service_fiscal.view')?accountingSections:[]; } export const accountingFunctions=[ {id:'accounts',section:'accounting_configuration',label:'Plano de contas',description:'Códigos, natureza, hierarquia e estado das contas; versões e aprovação das alterações estruturais.',status:'Existe classificação contabilística com propostas de plano/contas e validação por versão. Não equivale a um razão ou a um plano integral com todos os controlos operacionais.',target:'catalogue_accounting',permission:'catalogue_accounting.view',action:'Abrir plano e classificação existentes'}, {id:'journals',section:'accounting_configuration',label:'Diários',description:'Vendas, compras, bancos, caixa e operações diversas; configuração separada da utilização.',status:'Diários contabilísticos, numeração e contas predefinidas ainda não estão implementados. Séries de facturas não são diários contabilísticos.'}, {id:'entries',section:'accounting_daily',label:'Lançamentos',description:'Data, diário, referência, conta, descrição, débito, crédito, moeda, entidade e dimensão analítica.',status:'Criação, importação, conferência, validação e estorno de lançamentos ainda não estão implementados. Capturar um documento ou uma classificação não gera um lançamento.'}, {id:'recurrences',section:'accounting_daily',label:'Modelos e recorrências',description:'Despesas periódicas, acréscimos e diferimentos com frequência, vigência e responsável.',status:'Não existem modelos nem geração recorrente de lançamentos. A evolução prevista gera rascunhos para revisão, sem publicação automática.'}, {id:'reconciliation',section:'accounting_review',label:'Conferência e reconciliação',description:'Conferir clientes, fornecedores, bancos e impostos, mantendo correspondências parciais, diferenças e justificações.',status:'A reconciliação contabilística ainda não está implementada. O percurso de recebimentos simulados existente é separado do razão e de uma ligação bancária real.',target:'service_receivables',permission:'service_receivables.view',unit:true,action:'Abrir recebimentos e reconciliação de teste'}, {id:'balances',section:'accounting_analysis',label:'Balancetes e extractos',description:'Saldos iniciais, débitos, créditos, saldo final e ligação ao lançamento e ao comprovativo.',status:'Não existe razão contabilístico para produzir balancetes ou extractos. Ausência de fonte não significa saldo zero.'}, {id:'analytics',section:'accounting_analysis',label:'Contabilidade analítica',description:'Centros de custo, projectos, departamentos e repartições, com movimentos por classificar visíveis.',status:'A contabilidade analítica por lançamentos ainda não existe. Custos e orçamento industrial de teste mantêm o seu âmbito próprio e não são um razão analítico.',target:'industrial_budgets',permission:'industrial_budgets.view',unit:true,action:'Consultar orçamento industrial de teste — âmbito distinto'}, {id:'closing',section:'accounting_closing',label:'Operações de fecho',description:'Acréscimos, diferimentos, depreciações, câmbio e resultados, com responsável, evidência e aprovação.',status:'Não existe fecho contabilístico executável. Este menu não gera ajustamentos, depreciações ou apuramentos.'}, {id:'periods',section:'accounting_closing',label:'Períodos e bloqueios',description:'Abertura, fecho mensal/anual, datas de bloqueio e reabertura autorizada, com motivo e histórico.',status:'Os bloqueios e a reabertura de períodos contabilísticos ainda não estão implementados. Os bloqueios actuais de emissão fiscal são um controlo diferente.'}, {id:'statements',section:'accounting_analysis',label:'Demonstrações financeiras',description:'Balanço, resultados e fluxos de caixa com comparativos e ligação às contas de origem.',status:'Não há demonstrações financeiras geradas. São necessários lançamentos validados e modelos adequados ao referencial aplicável; não se apresentam estimativas como saldos reais.'}, {id:'audit',section:'accounting_review',label:'Auditoria e arquivo',description:'Histórico de criação, alteração, validação, estorno e reabertura; consulta de evidência dentro do âmbito autorizado.',status:'Os percursos existentes conservam o seu histórico próprio. Ainda não há um arquivo contabilístico ou uma consulta de auditoria integral agregada.',target:'catalogue_accounting',permission:'catalogue_accounting.view',action:'Consultar classificação e histórico existentes'}, ]; export const accountingReports=[ ['trial_balance','Balancete geral','Contabilidade','Saldos iniciais, débitos, créditos e saldos finais por conta e período.'], ['ledger','Razão e extractos de contas','Contabilidade','Movimentos, contrapartidas, comprovativos e saldo progressivo.'], ['journal','Diário de lançamentos','Contabilidade','Data, diário, referência e estado, separando rascunhos de lançamentos validados.'], ['balance_sheet','Balanço','Demonstrações','Activo, passivo e capital próprio à data de referência.'], ['income','Demonstração de resultados','Demonstrações','Rendimentos, gastos e resultados do período. Lucro não equivale a dinheiro disponível.'], ['cash_flow','Demonstração de fluxos de caixa','Demonstrações','Fluxos operacionais, de investimento e de financiamento, conferidos com caixa e equivalentes.'], ['equity','Alterações no capital próprio','Demonstrações','Movimentos nas rubricas e reconciliação dos saldos, quando aplicável.'], ['notes','Anexo às demonstrações financeiras','Demonstrações','Notas, políticas contabilísticas e suporte das rubricas relevantes.'], ['customers','Clientes e antiguidade de saldos','Tesouraria','Documento, saldo e vencimento sustentado. Vencimento desconhecido não é atraso zero.'], ['suppliers','Fornecedores e antiguidade de saldos','Tesouraria','Obrigações, vencimentos, moeda e aprovação, sem confundir dívida com pagamento.'], ['cash_bank','Posição de caixa e bancos','Tesouraria','Saldos contabilísticos e de extracto separados, por conta e moeda.'], ['bank_reconciliation','Reconciliação bancária','Tesouraria','Correspondências, pendentes e diferenças, com revisão independente.'], ['forecast','Previsão de tesouraria','Tesouraria','Recebimentos e pagamentos esperados, separados de estimativas e execução efectiva.'], ['payments','Pagamentos e aprovações','Tesouraria','Proposto, aprovado, executado, rejeitado e devolvido são estados distintos.'], ['vat','Apuramento de IVA','Fiscalidade','Operações e imposto reconciliados com contas e declarações aplicáveis. Não é activado por este menu.'], ['withholding','Retenções e obrigações fiscais','Fiscalidade','Bases, retenções e obrigações aplicáveis, sem presumir taxas ou incidências.'], ['payroll','Salários e contribuições','Pessoal','Resumo autorizado e obrigações aplicáveis; dados individuais permanecem restritos.'], ['assets','Activos e depreciações','Património','Cadastro, aquisições, alienações, depreciações e valor líquido.'], ['cost_centres','Centros de custo e projectos','Análise','Rendimentos e gastos por dimensão; movimentos sem classificação identificados.'], ['budget','Orçamento versus realizado','Análise','Desvios por período e dimensão, com base em valores validados.'], ['inventory','Inventário e valorização','Análise','Reconciliação do inventário com a contabilidade, quando aplicável.'], ['fx','Operações em moeda estrangeira','Contabilidade','Moeda, taxa, data de referência e diferenças cambiais.'], ['closing','Fecho e pendências','Fecho','Conferências, ajustamentos, documentos, bloqueios e aprovações do período.'], ['audit','Auditoria de alterações','Fecho','Actor, data, motivo e evidência, com consulta e exportação restritas.'], ].map(([id,label,family,description])=>({id,label,family,description})); export function filterAccountingReports(search='',family='') { const normalise=s=>String(s).normalize('NFD').replace(/[\u0300-\u036f]/g,'').toLocaleLowerCase('pt'); const query=normalise(search).trim(); return accountingReports.filter(r=>(!family||r.family===family)&&(!query||normalise(r.label+' '+r.description).includes(query))); }