Compare commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
d37fffb2d2 | ||
|
|
45fd591c7f | ||
|
|
5aaf1a56f9 | ||
|
|
2116f66b2b | ||
|
|
56475acb2f | ||
|
|
0effdc9fcb | ||
|
|
e9fe102259 | ||
|
|
44d0858cee | ||
|
|
043dd35d8e | ||
|
|
f400e56a5b |
@@ -558,3 +558,270 @@ Actualização de **AUD-SIM-INT02**, na matriz existente. O percurso instalado e
|
||||
**Provas apenas do delta:** 14 testes frontend; API privada1 teste/78 asserções com transacção revertida na base QA127.0.0.1:55441; geração de routes/actions pelo procedimento existente, TypeScript e build; interface real com edição, taxa/categoria incompatível, falta de juros, gravação/recuperação, download e perda corrente; relatórios/dossier construídos a partir dos dados recuperados. Recibo `docs/investmoz/simulations/irpc-l6-compatible-sets-qa-20261025.json`; pacote/bundle em `outputs/irpc-l6-sets`. Sem alteração de schema, API, configuração, permissões ou dependências.
|
||||
|
||||
**Âmbitos próprios preservados:** L7 conserva benefícios, isenções, taxas reduzidas, tributações autónomas e operações especiais; L8 conserva retenções, pagamentos, créditos e saldo final. M22 campo302 não é preenchido só com a parcela normal300, nem os campos309–316 são preenchidos com zeros presumidos. As dez dúvidas deL5 continuam na mesma matriz, sem nova pesquisa e bloqueando apenas dependências efectivas. L6 continua parcial exclusivamente pelas pendências concretas da tabela; nenhum desses pontos reabre o percurso instalado.
|
||||
|
||||
## 25/10/2026 — conjunto L6 a2de7259 entregue pelo Git
|
||||
|
||||
Instalado `a2de725901c308fb2ac2bc3d72181ab50ef46b7a` sobre `2f684e59`, pelo procedimento Git existente, sem força, migrações ou importações. Backup fresco `2026-10-25T20:34:03Z` e restauro isolado sem rede/porta55441: **174tabelas** conferidas por contagem/checksum; **369ficheiros/configuração** preservados. Conferidos **8ficheiros do delta,38protegidos e31originais**; schema,roles/grants e permissões iguais. Tabelas de negócio preservadas; cache/sessões reconciliadas com os eventos operacionais da entrega. `2f684e59` permanece como versão anterior. Dependências de5versões antigas arquivadas e verificadas para espaço, sem modificar as versões actual/anterior, fontes, dados ou backups.
|
||||
|
||||
Revisão/manifest público,10marcadores compilados e simuladorHTTP200 conferidos. Pipeline normal concluído; as provas QA aceites foram reutilizadas, sem nova ronda manual. **Disponível no âmbito demonstrado: lucro6980 → base4680 → colecta1497,60MZN. O saldo final a pagar/recuperar continua indeterminado emL8.** Também preservados o caso de perda corrente e as distinções conhecido/ausência/falta de informação, os períodos/EP demonstrados e a preparação parcialM20/M22. Recibo:`docs/investmoz/simulations/irpc-l6-sets-delivery-20261025.json`.
|
||||
|
||||
O estado «QA sem instalação» da nota anterior é histórico para este conjunto. **L6 continua parcial pelos seis grupos concretos da secção seguinte**, cada um com condição de resolução e bloqueio delimitado. L7 eL8 mantêm os seus âmbitos.
|
||||
|
||||
|
||||
## 25/10/2026 — saldo curto de L6 após o conjunto a2de7259
|
||||
|
||||
Actualização de **AUD-SIM-INT02 na mesma matriz**, sem novo lote ou backlog. O percurso financeiro → ajustamentos documentados → lucro tributável → matéria colectável → colecta está demonstrado; no caso novo,6980 →4680 →1497,60MZN. A colecta não é saldo final a pagar. As pendências abaixo substituem a enumeração genérica anterior para o saldo actual deL6; não revogam as provas aceites.
|
||||
|
||||
| Caso ou correspondência pendente | Condição concreta de resolução | Limite do bloqueio |
|
||||
|---|---|---|
|
||||
| Custos com limites36(1)e/f/h/i/n, provisões28/29, obras plurianuais19 e componentes de exercícios anteriores18(2). | Implementar a regra de cada categoria a partir do diploma aplicável: parcela contabilizada, limite/base próprios, documentação e exercício de imputação; demonstrar o efeito com sinal nos totais. Nos exercícios anteriores, distinguir o que era imprevisível/manifestamente desconhecido no encerramento. | Só a categoria ou parcela ainda sem regra; os acréscimos36a/b/c/g, juros ordinários e periodização corrente/seguinte demonstrados permanecem utilizáveis. Eventual tributação autónoma pertence aL7. |
|
||||
| Amortizações além dos itensII/3/9 e9.1: restantes tabelas, quotas inferiores, duodécimos, quotas decrescentes, bens usados/reavaliados/intangíveis e recuperação de quotas anteriormente tributadas. | Corresponder categoria/tabela prevalecente, método, entrada em uso, vida útil, base depreciável e quotas contabilizadas/fiscais acumuladas; implementar o cálculo e a reconciliação que impeçam dupla dedução. | Só os activos/métodos afectados. Computadores25% e servidores20% no recorte anual constante e a perda corrente já demonstrada não são reabertos. |
|
||||
| Períodos curtos, transição/liquidação e reconciliação fiscal anual de plano noutra moeda. | Ligar os meses e factos de início/cessação/transição ao período fiscal; implementar os efeitos sobre quotas e contagem das perdas. Para outra moeda, identificar os eventos/datas e a regra de conversão anual aplicável, reutilizando o motor cambial aceite. | Só o período ou origem cambial sem reconciliação. Os períodos anuais emMZN e oEP com imputação documentada conservam o cálculo demonstrado. |
|
||||
| Representação fiscal de fracções de unidade/cêntimo. | Identificar a instrução de representação/arredondamento da edição/campo aplicável ou obter esclarecimento específico daAT; então implementar essa regra conservando o valor racional original. O exemplarM20A.1 pede meticais sem centavos, mas isso não determina sozinho como arredondar uma fracção. | Só a transcrição do valor não exactamente representável. Os cálculos racionais e os valores exactamente representáveis permanecem disponíveis; não é necessária nova validação genérica das fontes. |
|
||||
| M20A.1: discriminação de vendas/serviços, fornecimentos/outros gastos, imposto sobre o rendimento e resultado líquido; M22: campo200 e detalhe dos restantes ajustamentos. | Reutilizar a origem financeira, recolhendo apenas a classificação em falta e o imposto contabilizado; reconciliar resultado antes/depois de imposto e cada ajustamento com a edição aplicável. Não usar a colecta simulada como imposto contabilizado. Completar as correspondências por campo e demonstrar a recuperação/exportação. | Só os campos sem correspondência. M20A.1/Q4 contas6.1.1/6.2/6.5/6.9 e M22 campos259/260,269/270,276/277/278 e300 conservam a preparação parcial demonstrada. |
|
||||
| Transporte de resultado entre ediçõesM20/M22: XLSXM20A.1 remete para201/quadro8; PDFM22 inventariado usa200/quadro10. | Identificar a edição do formulário de destino e corresponder explicitamente o resultado líquido a essa edição; registar a remissão corrigida sem substituir os exemplares ou reutilizar fórmulas antigas por aproximação. | Só esse transporte entre edições; não bloqueia os cálculos independentes nem os outros campos já correspondidos. |
|
||||
|
||||
**L6 continua parcial por estes casos concretos.** Documento ou parâmetro em falta dentro de regra implementada é uma pendência do caso, não outra tarefa genérica deL6. Juros capitalizáveis, relações especiais e tratamentos especiais conservam o enquadramento próprio, sem presumir que satisfazem o recorte de juros ordinários.
|
||||
|
||||
**L7** mantém benefícios, isenções, taxas reduzidas, tributações autónomas e operações especiais. **L8** mantém retenções, pagamentos, créditos e saldo final a pagar/recuperar. A ausência desses tratamentos não reabre o percurso normal entregue nem justifica, por si, «L6 parcial». A divergência documental não autoriza preencher M22 campo302 ou309–316 com zeros presumidos. As dez dúvidas deL5 permanecem válidas e bloqueiam apenas os casos efectivamente dependentes; sem nova pesquisa ou repetição das provas aceites.
|
||||
|
||||
## 26/10/2026 — L6: custos com limites, provisões e periodização em QA
|
||||
|
||||
Actualização de **AUD-SIM-INT02 na mesma matriz**, sobre o conjunto instalado `a2de7259`. **Novo incremento em QA, sem instalação.** O percurso e as provas já aceites deL6/L3/ISPC/câmbio/L5 foram reutilizados; não foram novamente executados os testes funcionais anteriores. A fotografia5 continua actual sem activar os novos campos; a fotografia6 guarda estes mapas e conserva o resultado anterior no histórico.
|
||||
|
||||
**Reutilização e resultado demonstrado:** resultado financeiro6240MZN, acréscimos anteriores220 e mapas anteriores520 conservados; novos ajustamentos de custos/provisões/periodização+350 e obra−600 → **lucro tributável6730MZN**. Dedução expressa das perdas anteriores2300 → **matéria colectável4430MZN**; taxa normal32% → **colecta1417,60MZN**. Não é saldo final a pagar. Nenhum saldo oficial de provisões/perdas é consumido, nem é alterada declaração ou história anterior.
|
||||
|
||||
| Categoria e condição no exercício anual com termo em2026 | Parcela aceite, limite e ajustamento demonstrados | Informação insuficiente ou caso separado |
|
||||
|---|---|---|
|
||||
| Ajudas de custo/deslocação em viatura própria36(1)e: parcelas facturadas e tributadas emIRPS identificadas sem sobreposição. Representação36(1)f/36(3) ordinária documentada. | Ajudas100:facturadas20,tributadas e não facturadas20;remanescente60 →30 acrescido/70 aceite. Representação50 →40 acrescido/10 aceite. Zero conhecido nos parâmetros é distinto de campo vazio. | Parcela facturada/tributada em falta impede a aceitação dependente; não presumir ausência deIRPS. Eventual tributação autónoma continuaL7. |
|
||||
| Publicidade ordinária36(1)n,Lei20/2009: receita declarada reconciliada com vendas normais e completude anual das parcelas. | Um limite anual partilhado de1% de12000=120. Caso com duas parcelas100+100:aceites60+60,acréscimo80. A repartição proporcional é apenas aritmética de simulação, não uma ordem fiscal obrigatória. | Campanha de lançamento com horizonte superior a um ano não recebe este tratamento por aproximação: periodização36-A e articulação do limite permanecem por implementar. |
|
||||
| Encargos com viaturas36(4), combustível36i e aluguer sem condutor36h, distinguindo categoria/serviço público/locação na actividade normal. | Outros encargos100 de passageiros sem excepção:aceite50/acréscimo50. Combustível50 não sujeito a36(4),com40 comprovados no activo/locação e consumo normal:aceite40/acréscimo10. Renda100 no caso documentado de excepção36(4),quota não aceite36h de20:aceite80/acréscimo20; a quota é reutilizada do suporte e não apurada automaticamente. | Se há simultaneamente parcela excluída porh/i e aplicação dos50% de36(4), a combinação fica pendente. Exemplo:fuel100,comprovado80,passageiro sem excepção; não somar nem repartir correcções por presunção. Resolver a regra de articulação dos trechos aplicáveis ou esclarecer esse exemplo especificamente comAT. Apuramento automático da quota36h permanece no saldo de amortizações; só bloqueia esse caso. |
|
||||
| Provisão/perda por imparidade de créditos28a/29: regime ordinário identificado, créditos normais finais e provisão fiscal anterior conhecidos. | Base10000:limite anual1,5%=150,acumulado6%=600. Saldo anterior550 deixa50;provisão contabilística200 →50 aceite/150 acrescido. Duas parcelas100+100 partilham25+25; não repetem os limites nem consomem o saldo oficial. | Saldo anterior vazio não é zero; anterior superior ao tecto pede reconciliação/reversão28(2). Provisões sujeitas a supervisão financeira/seguradora28d ou reforços financeiros28(3) exigem correspondência própria, sem aplicar29 por aproximação. |
|
||||
| Existências28b:perda efectivamente observada. Processo judicial28c:em curso e obrigação subjacente fiscalmente dedutível. | Existências:parcela60,perda total40,provisão anterior10 →30 aceite/30 acrescido. Judicial:parcela90,obrigação100,anterior20 →80 aceite/10 acrescido. Perda não observada ou processo que não esteja em curso são condições negativas conhecidas:acréscimo integral, sem zero presumido como dedução. | Falta de prova do evento,obrigação,perda ou saldo anterior fica indeterminada. Objecto/saldo repetido entre documentos impede reutilizar a cobertura; agregar/reconciliar as parcelas do mesmo objecto. |
|
||||
| Reversões28(2) e provisões anteriormente tributadas:mesmo objecto e tratamento fiscal anterior comprovados. | Provisão antes deduzida:reversão50 já incluída no resultado não acrescenta novamente;omitida dos proveitos acrescenta50. Reversão contabilística50 de provisão antes tributada comprovada é excluída por50. | Não inferir o tratamento anterior do saldo contabilístico. Quantia superior à parcela fiscal demonstrada,evento que continua a subsistir ou objecto duplicado ficam pendentes. Sem alteração retrospectiva ou consumo do saldo oficial. |
|
||||
| Componentes de exercícios anteriores18(2):conhecimento/imprevisibilidade no encerramento anterior documentados. | Custo80 conhecido no fecho2025,incluído no resultado actual →acréscimo80. Se imprevisível/manifestamente desconhecido à data daquele fecho →sem acréscimo por periodização. Proveito50 conhecido no fecho anterior →excluído do actual por50;se imprevisível/desconhecido →considerado no actual. | Conhecimento no fecho em falta impede apenas a imputação da parcela. Nenhuma rectificação de declaração anterior é executada. Periodizações específicas18(6–10) não passam a estar cobertas por este recorte18(2). |
|
||||
| Obras plurianuais19 e perdas meramente estimadas36m:critério uniforme,preço,custo incorporado/custo total e acumulados fiscais anteriores documentados. | Percentagem:preço2000,custo total1000,incorrido500;proveito fiscal acumulado1000 menos anterior600=400 corrente;custo500 menos anterior300=200 corrente. Proveito contabilizado1000/custo200 →ajustamento−600. Encerramento tem caso separado;facturação parcial com acabamento correspondente/entregas fraccionadas impõem percentagem;95% com preço conhecido ou recepção provisória pública determina conclusão. Perda meramente estimada50 de obra em curso →acréscimo50. | Acumulados incoerentes ou método incompatível bloqueiam essa obra. Receita antecipada19(5) positiva e mudança de critério com autorização19(6) ficam por corresponder; o caso demonstrado declara expressamente zero de receita antecipada e método mantido, sem presumir essas condições. |
|
||||
|
||||
**Percurso demonstrado:** cálculo → gravação → recuperação pela API privada → relatório/dossier/exportação em cinco casos:conjunto calculado,informação insuficiente,categorias adicionais,limites partilhados e encerramento de obra. Só os novos casos foram testados: **22 testes frontend,1 testeAPI/83asserções**, transacção revertida na base QA127.0.0.1:55441; routes/actions gerados pelo procedimento existente,TypeScript/build e interface real passaram. Interface permite reutilizar a parcela livre da origem e o saldo financeiro de créditos quando conhecido; alterações às somas dos temas são revistas antes de aplicar e não apagam escolhas ou históricos. Fonte ausente ou saldo não acompanhado nunca cria zero. Valores racionais são conservados, apresentações decimais aproximadas são identificadas e uma perda inferior a um cêntimo não é truncada para zero.
|
||||
|
||||
**Preservação:**6ficheiros de runtime no delta,42protegidos e31originais conferidos; sem schema/API/configuração/permissões/dependências alterados, sem escrita no activo. Recibo:`docs/investmoz/simulations/irpc-l6-costs-provisions-timing-qa-20261026.json`;bundle/pacote em `outputs/irpc-l6-costs`. DivergênciaM20/M22 permanece limitada ao transporte201/quadro8 versus200/quadro10; não é uma condição destes cálculos. Não foram criadas correspondências oficiais de campos para estes novos ajustamentos por presunção.
|
||||
|
||||
**Saldo deL6 após estes casos QA:**combinação36h/i+36(4);quota36h automática e restantes amortizações;campanhas36-A e sua articulação com1%;provisões reguladas/reforços financeiros e periodizações específicas não cobertas;receita antecipada positiva/mudança autorizada do método de obra;períodos curtos/conversão fiscal anual;representação fiscal de fracções e restantes correspondênciasM20/M22. Cada pendência afecta o caso/campo dependente, não o conjunto independente demonstrado. Benefícios,isenções,taxas reduzidas e operações especiais mantêm âmbitoL7;retenções,pagamentos,créditos e saldo anual mantêm âmbitoL8. **L6 continua parcial.** As dez dúvidas deL5 não foram reabertas.
|
||||
|
||||
## 26/10/2026 — conjunto L6 043dd35d entregue pelo Git
|
||||
|
||||
Instalado `043dd35d8ee247123b3a32f1fc10fd2ede81e9f4` sobre `a2de7259`, pelo procedimento Git existente, sem força, migrações ou importações. Backup fresco `2026-10-26T06:35:29Z` e restauro isolado sem rede/porta55441: **174tabelas** conferidas por contagem/checksum; **369ficheiros/configuração** preservados. Conferidos **6ficheiros do delta,42protegidos e31originais**; schema,roles/grants e permissões iguais. Tabelas de negócio preservadas; cache/sessões reconciliadas com os eventos operacionais da entrega. `a2de7259` permanece como versão anterior. Dependências de4versões antigas arquivadas e verificadas para espaço, sem modificar as versões actual/anterior, fontes, dados ou backups.
|
||||
|
||||
Revisão/manifest público,11marcadores compilados e simuladorHTTP200 conferidos. Pipeline normal concluído; as provas QA aceites foram reutilizadas, sem nova ronda manual. **Disponível no âmbito demonstrado: lucro6730 → base4430 → colecta1417,60MZN. O saldo final a pagar/recuperar continua indeterminado emL8.** Também preservados o caso de perda corrente e as distinções conhecido/ausência/falta de informação, os períodos/EP demonstrados e a preparação parcialM20/M22. Recibo:`docs/investmoz/simulations/irpc-l6-costs-delivery-20261026.json`.
|
||||
|
||||
O estado «QA sem instalação» da nota anterior é histórico para este conjunto. **L6 continua parcial pelos seis grupos concretos da secção seguinte**, cada um com condição de resolução e bloqueio delimitado. L7 eL8 mantêm os seus âmbitos.
|
||||
|
||||
|
||||
## 26/10/2026 — saldo de L6 após a entrega043dd35d
|
||||
|
||||
Mesma matriz AUD-SIM-INT02. Custos/provisões/periodização demonstrados entregues; trabalho seguinte:amortizações. Provas aceites reutilizadas.
|
||||
|
||||
| Caso ou correspondência pendente | Condição concreta de resolução | Limite do bloqueio |
|
||||
|---|---|---|
|
||||
| Combinação36h/i com36(4) | Corresponder a regra de articulação dos trechos aplicáveis ou esclarecer comAT o exemplo combustível100/comprovado80/passageiro sem excepção;sem somar ou repartir correcções por presunção. | Apenas o caso/campo dependente; cálculos independentes preservados. |
|
||||
| Quota36h automática e amortizações restantes | Reconciliar tabela/método/entrada emuso/quotas contabilísticas e fiscais anteriores;prioridade seguinte deL6. A parcela36h documentada continua reutilizável nos casos independentes. | Apenas o caso/campo dependente; cálculos independentes preservados. |
|
||||
| Campanhas plurianuais36-A e limite1% | Implementar a periodização por três exercícios e a sua articulação com36n; não tratar a campanha como publicidade ordinária. | Apenas o caso/campo dependente; cálculos independentes preservados. |
|
||||
| Provisões reguladas28d e reforços financeiros28(3) | Corresponder a regra sectorial/supervisão ou o reforço financeiro e os saldos documentados; não usar os limites ordinários29 por aproximação. | Apenas o caso/campo dependente; cálculos independentes preservados. |
|
||||
| Receita antecipada19(5) positiva e mudança autorizada19(6) | Corresponder os custos futuros/receita antecipada e o transporte entre exercícios ou a autorização da mudança de método;os casos zero conhecido/método mantido permanecem executáveis. | Apenas o caso/campo dependente; cálculos independentes preservados. |
|
||||
| Outras periodizações,âmbitos eM20/M22 | Tratar apenas os casos específicos18(6–10),períodos curtos/conversão anual,representação fiscal e campos ainda sem correspondência,com os parâmetros da edição/caso;divergência201/Q8 versus200/Q10 só afecta o transporte indicado. | Apenas o caso/campo dependente; cálculos independentes preservados. |
|
||||
|
||||
L6 continua parcial. L7 mantém benefícios/casos especiais;L8 mantém retenções/pagamentos/créditos/saldo final. As dez dúvidasL5 não foram reabertas.
|
||||
|
||||
## 26/10/2026 — L6: amortizações em QA, sem instalação
|
||||
|
||||
O portal mantém `043dd35d` instalado: colecta demonstrada1417,60MZN, sem saldo finalL8. O novo conjunto optativo `IRPC-normal-adjustments/7` reutiliza os activos e o resultado financeiro já declarados. Versões1–6 e históricos permanecem intactos; activar o novo mapa substitui o efeito fiscal anterior das amortizações, sem o somar novamente. Ausência declarada de quotas anteriores é distinta de informação em falta e exige referência.
|
||||
|
||||
Cobertura delimitada ao exercício anual2026/MZN e bens novos ao custo histórico: tabelaII/3/9 computadores25%,3/9.1 servidores20%,3/23 segurança20%,3/22 máquinas não especificadas10%,5/7 mobiliário10%,1/2.2 edifícios comerciais/administrativos2%,4/9.2 veículos ligeiros/mistos25%,5/8 software25%; tabelaI/84.2/B decoração hoteleira20% e84.3/A máquinas de lavandaria12,5%. A tabelaI prevalece quando aplicável; não se presume que esta lista cobre todo o catálogo. Fonte: Decreto72/2013, artigos3–10/17 e tabelas, exemplar original anteriormente aceite e hash preservado; CIRPC27e para limite800000MZN de viaturas e exclusão de terrenos.
|
||||
|
||||
Método constante com taxa expressamente escolhida no recorte metade–máximo; degressivo apenas para bens elegíveis novos, factores máximos1,5/2/2,5 segundo vida útil. Opção8(2) demonstrada apenas em ano civil/início1Janeiro, com quotas anteriores completas documentadas. Duodécimos incluem mês de entrada e excluem mês de saída, respeitando vida máxima. Software exige direitos onerosos/exclusivos e duração limitada; art17 exige bem individual até20000 e opção documentada. Quotas anteriores recuperáveis têm prova contabilística/fiscal e são limitadas à parte elegível: quotas nunca contabilizadas ou permanentemente excluídas não se tornam dedutíveis. Nenhum saldo oficial é consumido.
|
||||
|
||||
| Novo caso | Efeito demonstrado em MZN: lucro → matéria colectável → colecta |
|
||||
|---|---|
|
||||
| Computador em uso desdeJulho: quota fiscal50, ajustamento70, substituindo anterior20 | 6780 →4480 →1433,60 |
|
||||
| Mesmo activo, saída15Outubro:3meses/quota25 | Colecta1441,60; entrada/saída identificadas no relatório |
|
||||
| Degressivo elegível: quota200, ajustamento40 | 6630 →4330 →1385,60 |
|
||||
| Quota anterior documentada:20 recuperados,20 restantes; ajustamento−20 | 6730 →4430 →1417,60 |
|
||||
| Máquina de lavandariaI/84.3/A: quota62,50, ajustamento57,50 | 6767,50 →4467,50 →1429,60 |
|
||||
| Quota contabilística anterior em falta | Lucro/base/colecta indeterminados; ajustamentos independentes conhecidos continuam discriminados |
|
||||
|
||||
Cálculo → gravação → recuperação pela API privada → relatório/dossier demonstrado em cinco casos. **18novos testes frontend;1testeAPI/84asserções**, rollback na baseQA127.0.0.1:55441; routes/actions gerados, TypeScript/build e interface real passaram, incluindo edição, reutilização, ausência declarada, falta de informação, recuperação e exportação. Provas aceites reutilizadas. **7ficheiros de runtime no delta,43protegidos e31originais conferidos**; sem migração/API/configuração/permissões/dependências ou escrita no activo.
|
||||
|
||||
| Saldo concreto das amortizações | Condição de retoma |
|
||||
|---|---|
|
||||
| Outros códigos/taxas, por exemploII/3/3 ar condicionado12,5% | Acrescentar correspondência verificada, elegibilidade e prova apenas desse delta; sem aprovação genérica adicional |
|
||||
| Bens usados, abertura de escrita, grandes reparações/benfeitorias7(2)/(4), reavaliações15 e transição anterior2014 | Documentar vida esperada, bases/quotas anteriores e implementar a regra específica aplicável |
|
||||
| Uso intensivo11, concessões12, peças14, intangíveis específicos16 e eventos de transferência/relocação | Corresponder condições legais e histórico do evento; desenvolvimento/goodwill não herdam taxa do software |
|
||||
| Mudança de método10, excepções, taxas fora do recorte, vida máxima anual terminada a meio do período e opção8(2) fora do caso demonstrado | Histórico concreto e regra/excepção correspondente; autorização apenas quando a norma a exigir |
|
||||
| Restantes custos/provisões/periodizações da entrega043dd35d; períodos curtos, conversão anual, representação fiscal e correspondênciasM20/M22 | Mantêm os critérios concretos já registados na matriz; este incremento não os encerra |
|
||||
|
||||
A divergência201/quadro8 versus200/quadro10 bloqueia apenas o transporte afectado. Não foram presumidas correspondências oficiais para estes novos campos. **L6 continua parcial;L7 eL8 mantêm os seus âmbitos.** As dez dúvidasL5 não foram reabertas. Recibo: `docs/investmoz/simulations/irpc-l6-depreciation-qa-20261026.json`.
|
||||
|
||||
## 26/10/2026 — amortizações e9fe1022 entregues pelo Git
|
||||
|
||||
Instalado `e9fe102259c183a9d9bf7e39f246a8c3860839c6` sobre `043dd35d`, preservado como versão anterior. Backup fresco `2026-10-26T07:31:29Z` e restauro isolado sem rede/porta55441: **174tabelas** por contagem/checksum e **369ficheiros/configuração** conferidos. **7ficheiros do delta,43protegidos e31originais** verificados; schema,roles/grants e permissões iguais. As172tabelas de negócio mantêm os valores do backup. Cache:reinício da fila,contadores/timers e renovação da validade do mesmo valor de cache da página inicial. Sessões:expiração individual comprovada pelo prazo configurado120minutos,novas consultas da entrega e acessos anónimos correlacionados por agente/data no nginx;sem perda de dados de negócio. Dependências de5versões antigas arquivadas/verificadas para a margem do pipeline,preservando versões actual/anterior,fontes,dados e backups.
|
||||
|
||||
Revisão/manifest público,5marcadores compilados,4assets e simuladorHTTP200 conferidos. Pipeline normal concluído; provas QA18frontend/API1-84/UI/tipos/build reutilizadas,sem nova ronda manual. **Exemplo disponível: lucro6780 → matéria colectável4480 → colecta1433,60MZN. Saldo final a pagar/recuperar indeterminado emL8.** Históricos1–6 preservados; versão7 apenas por activação do novo mapa,substituindo o efeito anterior sem duplicação. Recibo:`docs/investmoz/simulations/irpc-l6-depreciation-delivery-20261026.json`.
|
||||
|
||||
O estado anterior «QA sem instalação» de e9fe1022 é histórico. Mantêm-se explícitos os outros códigos de tabela;usados/abertura de escrita/reparações/reavaliação/transição;uso intensivo/concessões/peças/intangíveis específicos/eventos;mudanças/excepções de método e opções fora do recorte. Retoma por correspondência da regra específica,base/vida/quotas e prova do delta,sem autorização genérica adicional. Períodos curtos e planos noutra moeda são o próximo incrementoQA,reutilizando o mecanismo cambial. Restantes custos/períodos/representação/camposM20-M22 conservam critérios próprios;divergência201/Q8 versus200/Q10 restringe apenas o transporte afectado. **L6 parcial;L7/L8 próprios;dez dúvidasL5 não reabertas.**
|
||||
|
||||
## 26/10/2026 — L6: períodos curtos e planos noutra moeda em QA
|
||||
|
||||
`e9fe1022` está instalado, com o âmbito de amortizações já demonstrado e os restantes casos de tabela/método explícitos acima. Este novo conjunto optativo `IRPC-normal-adjustments/8` está **emQA,sem instalação**. Reutiliza os meses e montantes do plano,os mapas fiscais emMZN e o mecanismo cambial entregue. Os históricos1–7 e o plano original não são reescritos.
|
||||
|
||||
Períodos de meses completos com termo em2026: início7(4)a,cessação7(4)b,início/fim de sujeição7(4)c e transição7(4)d,mediante identificação do evento/datas/suporte; plano com6meses ou selecção explícita de6dos12meses,sem anualizar receita,resultado,base ou taxa. Primeiro mês civil do plano é declarado,não inferido do mês orçamental. Anual diferente do ano civil conserva a correspondência do período autorizado/comunicado existente. Duodécimos ordinários do art9(3) do Decreto72/2013 aplicam o número de meses de utilização;art17 integral em período curto e restantes excepções não se tornam suportados por aproximação. Elemento conhecido como não amortizável mantém acréscimo integral,sem exigir método irrelevante.
|
||||
|
||||
Planos em outra moeda: cada mês seleccionado reutiliza ou confirma selecção cambial pelo procedimento existente,coluna/data/boletim/sentido e vínculo à origem. Moeda e valores originais permanecem no relatório. Não se adopta taxa actual,única ou de outro mês por defeito. **A conversão mensal para simulação exige pressuposto documentado;não confirma automaticamente uma regra fiscal de conversão anual.** Os mapas/activos/quotas/perdas existentes continuam emMZN e são reconciliados expressamente;nenhuma segunda conversão automática. Saldos patrimoniais de créditos em moeda estrangeira não são apresentados comoMZN pela conversão dos fluxos do plano;correspondência de saldo/data/taxa continua separada.
|
||||
|
||||
| Caso novo | Efeito demonstrado emMZN |
|
||||
|---|---|
|
||||
| Início1Julho–31Dezembro,meses7–12: resultado3120;quota fiscal50 e ajustamento10 | Lucro3130 → matéria colectável3130 → colecta1001,60,à taxa32%;ausência de perdas/benefícios declarada |
|
||||
| Mesmo recorte emUSD,pressuposto sintético64MZN/USD identificado em cada mês;mapasMZN reconciliados | Resultado199680;ajustamento640;lucro/base200320 → colecta64102,40. Taxa64 é pressupostoQA,não boletimBM real ou parâmetro fiscal confirmado |
|
||||
| Anual emUSD;plano de6meses iniciado emJulho;cessação e sujeição no mesmo ano | Novos testes próprios;respectivamente colecta128204,80 e1001,60nos casos correspondidos,sem anualização do semestre |
|
||||
| Falta de selecção de um mês,moeda incompatível ou taxa editada sem confirmação | Valores originais e conversões independentes visíveis;resultado/lucro/base/colecta dependentes indeterminados |
|
||||
| Perdas reportadas propostas num período curto | Lucro3130conhecido;dedução/base/colecta pendentes da sequência de períodos. Art41(5) exclui da contagem o período de transição7(4)d inferior a6meses;não autoriza agregar todos os períodos curtos |
|
||||
|
||||
Cálculo → gravação → recuperaçãoAPI → relatório/dossier demonstrado em4casos. **13testes novos frontend,API1teste/58asserções**, rollback na baseQA127.0.0.1:55441;routes/actions pelo procedimento existente,TypeScript/build e interface real passaram. Interface demonstrou alteração de datas e taxa,confirmação cambial,recuperação e exportação. Mudança na origem cambial invalida a actualidade do novo resultado,conservando o histórico. Provas aceites reutilizadas,sem repetição manual. Delta:**9ficheiros de runtime,43protegidos e31originais**;sem API/schema/configuração/permissões/dependências ou escrita no activo.
|
||||
|
||||
| Pendência concreta | Condição de retoma e bloqueio |
|
||||
|---|---|
|
||||
| Datas parciais,períodos superiores a12meses/liquidação e curtos fora do recorte2026 | Corresponder datas/evento,parcelas de dias e regra aplicável;apenas esse período depende da implementação |
|
||||
| Dedução de perdas em sequência com períodos curtos/transição | Declarar sequência efectiva de períodos posteriores e aplicar41(5) ao caso7(4)d inferior a6meses;sem prazo presumido só por ano civil. Lucro independente continua calculável |
|
||||
| Limites anuais de publicidade e provisão de créditos em período curto | Corresponder expressamente a base/limite do período e regra de proporcionalização,se aplicável;sem anualização ou rateio presumidos. Outros custos e períodos anuais não bloqueados |
|
||||
| Quota integral art17 em período curto,opções/métodos/tabelas e casos de amortização ainda não suportados | Implementar combinação específica e provar só o novo efeito;condições restantes do conjuntoe9fe1022 continuam válidas |
|
||||
| Conversão fiscal anual confirmada,saldos em moeda estrangeira e fracções de cêntimo da conversão | Identificar regra fiscal/data/base,taxa e âmbito;para saldos,conversão própria em vez de somar fluxos;para fracções,regra de representação. Até lá,pressupostos de simulação explícitos e total indeterminado quando não representável neste recorte |
|
||||
| Restantes custos/periodizações e correspondênciasM20/M22 | Mantêm os critérios já registados. Divergência201/Q8 versus200/Q10 limita só o transporte afectado |
|
||||
|
||||
Fontes primárias reutilizadas: CIRPC Lei34/2007 PDF4/p768(58),art7(4)/(7),ePDF12/p768(66),art41(5);Decreto72/2013 PDF3/p1074(7),art9(3). Exemplar e originais/hash preservados;sem importação/publicação documental. **L6 continua parcial. Colecta não é saldo final a pagar;L7 eL8 mantêm âmbitos próprios.** As dez dúvidasL5 não foram reabertas. Recibo:`docs/investmoz/simulations/irpc-l6-periods-fx-qa-20261026.json`.
|
||||
|
||||
## 26/10/2026 — períodos curtos e planos noutra moeda56475acb entregues pelo Git
|
||||
|
||||
Instalado `56475acb2f39e58cb51664913f7fb499f58eb7ab` sobre `e9fe1022`,preservado como versão anterior. Backup fresco `2026-10-26T08:17:39Z` e restauro isolado sem rede/porta55441: **174tabelas** por contagem/checksum e **369ficheiros/configuração** conferidos. **9ficheiros do delta,43protegidos e31originais** verificados;schema,roles/grants e permissões iguais. As172tabelas de negócio mantêm os valores do backup. Cache/sessões reconciliadas com os eventos operacionais e acessos anónimos registados;expiração,quando aplicável,comprovada individualmente pelo prazo configurado. Dependências de5versões antigas arquivadas/verificadas,preservando versões actual/anterior,fontes,dados e backups.
|
||||
|
||||
Revisão/manifest público,6marcadores compilados,4assets e simuladorHTTP200 conferidos. Pipeline normal concluído;provasQA13frontend/API1-58/UI/tipos/build reutilizadas,sem nova ronda manual. **Semestre demonstrado: lucro3130 → matéria colectável3130 → colecta1001,60MZN.** PlanoUSD:pressuposto sintético64MZN/USD por mês identificado,originais conservados e mapasMZN reconciliados;lucro/base200320 → colecta64102,40MZN. **Não confirma regra fiscal de conversão anual nem boletimBM real. Saldo final a pagar/recuperar continua indeterminado emL8.** Históricos1–7 preservados;versão8 optativa,sem anualizar resultados ou usar taxa actual por defeito. Recibo:`docs/investmoz/simulations/irpc-l6-periods-fx-delivery-20261026.json`.
|
||||
|
||||
O estado anterior «QA sem instalação» de56475acb é histórico. Permanecem explícitos os casos de datas parciais/liquidação,sequência de perdas41(5),limites anuais em período curto,art17 curto/restantes amortizações,conversão fiscal anual/saldos em outra moeda/fracções e demais custos/periodizações. Condições de retoma continuam na mesma matriz. Próximo incrementoQA:representação de valores e camposM20/M22 por corresponder;divergência201/Q8 versus200/Q10 limitada ao transporte do resultado afectado,sem reabrir cálculos demonstrados. **L6 parcial;L7/L8 próprios;dez dúvidasL5 não reabertas.**
|
||||
|
||||
## 26/10/2026 — L6: representação dos valores e campos M20/M22 em QA
|
||||
|
||||
`56475acb` está instalado. Este novo conjunto optativo `IRPC-normal-adjustments/9` está **em QA, sem instalação** e acrescenta preparação dos valores/campos, sem alterar fórmulas de lucro tributável, matéria colectável ou colecta. Históricos1–8, plano original, pressupostos cambiais e demais livros preservados. A falta de uma correspondência documental afecta o campo e a sua reconciliação, mantendo os totais fiscais existentes.
|
||||
|
||||
**Representação:** valor racional exacto conservado, apresentação aproximada identificada por«≈» e fracção original; zero conhecido, informação em falta e campo sem aplicação distintos. M20A.1/quadro4/M12 pede meticais sem centavos: valores inteiros são representáveis, fracções ficam por corresponder, sem arredondamento/truncagem. Preparação M22 já aceite com valores exactos ao cêntimo preservada; fracções de cêntimo continuam explícitas e pendentes da regra fiscal aplicável. Resultado líquido negativo M20 é apresentado entre parêntesis; M22 separa campo de lucro do de prejuízo, sem colocar perda no lucro ou criar matéria colectável negativa.
|
||||
|
||||
**M20:** reutiliza as quatro correspondências directas de custos das vendas,pessoal,depreciação e juros. Discrimina as receitas e despesas operacionais por conta com suporte e reconciliação exacta ao plano do período/moeda. Demonstra prestação de serviços7.2,fornecimentos/serviços6.3,outros gastos6.8 e imposto contabilizado8.5, além das contas directas6.1.1/6.2/6.5/6.9. Rótulos das demais contas são estrutura disponível; não constituem novas regras fiscais nem provam a qualificação de uma parcela. Uma origem incompleta não apaga as contas directas independentes.
|
||||
|
||||
O imposto contabilizado tem valor/ausência e suporte próprios, e localização já incluída ou exterior ao plano. Colecta não é despesa contabilística presumida. Valor já incluído não é subtraído novamente; contradição com o mapa de imposto próprio ou coexistência das duas localizações fica identificada. O resultado líquido é apurado para preparação; o transporte automático entre edições continua impedido só no resultado afectado.
|
||||
|
||||
**M22 PDF:** correspondências de variações patrimoniais201/202,resultado203,amortizações não aceites206,provisões/imparidade209,impostos de outrem213,multas/juros compensatórios215,ajudas219,representação220,publicidade221,despesas não documentadas223,aluguer224,combustíveis225,viaturas226 e reposição de provisões tributadas239. Reutiliza os ajustamentos demonstrados; não reaplica as percentagens impressas. A representação já calculada usa80%,compatível com220. Campo213 é apenas de outrem: imposto próprio36(1)a continua **sem campo presumido**. Efeitos positivos de amortização vão a206; recuperações negativas de quotas anteriores ficam separadas até correspondência própria, sem compensação no mesmo campo.
|
||||
|
||||
Somas238/258 e lucro reconstruído apenas quando todas as parcelas têm correspondência e reconciliam; campos259/260/269/270/276/277/278/300 reutilizam o cálculo existente, mesmo havendo uma parcela sem campo. Colecta total302 só é preparada com ausência de parcela de taxa reduzida declarada com suporte;caso conhecido mantém âmbitoL7 e não apaga300. Campos309–316/saldo final permanecem emL8.
|
||||
|
||||
| Caso novo | Resultado e limite de aplicação |
|
||||
|---|---|
|
||||
| Correspondência no semestre demonstrado, ausência de imposto contabilizado e taxa reduzida declaradas | Resultado líquido3120;203=3120;206=10;238=3130;258=0;lucro/base3130;colecta normal300 e total302=1001,60MZN. Reconciliação aritmética exacta, sem transporte automático entre edições |
|
||||
| Fornecimentos300,50 e outros gastos299,50, origem600 | Parcela300,50 conserva601/2;M20 em meticais inteiros pendente só nas parcelas fraccionárias;resultado e colecta1001,60inalterados |
|
||||
| Imposto contabilizado em falta | Resultado líquido/campo200 e somas dependentes indeterminados;lucro/base3130 e colecta1001,60mantidos |
|
||||
| Recuperação de quota anterior:ajustamento−26 | Efeito fiscal e colecta1001,60preservados;sem código de dedução inventado,somas238/258 pendentes;260/278/300 conhecidos |
|
||||
| Imposto próprio320 contabilizado exterior ao plano | Resultado líquido2800 conhecido;campo de acréscimo próprio por corresponder,sem usar213 de outrem;lucro/base3130 e colecta1001,60preservados |
|
||||
|
||||
Percurso cálculo → gravação → recuperação privada → relatório/dossier demonstrado em **5casos**. **15testes novos frontend;API1teste/97asserções**, transacção revertida na baseQA127.0.0.1:55441;routes/actions gerados pelo procedimento existente,TypeScript/build e interface real passaram. Interface demonstrou edição de parcelas,imposto em falta sem apagar valor anterior,recuperação/exportação e pendências apenas dependentes. Provas aceites reutilizadas;sem repetir suites anteriores. **4ficheiros de runtime no delta,50protegidos e31originais** conferidos;sem API/schema/configuração/permissões/dependências ou escrita no activo.
|
||||
|
||||
Fontes: PDF M22 SHA2564b61bd83d1fbcfd3b7b5c5523cea5923f7d0f65dc4c004eff58e5db38f763c88,3páginas já aceites reutilizadas;M20A.1 SHA2561ceca6f4c6d77853c1b2b445876599b42093175fa89eecf40590180956d83a9e,M12/D13–D35. Inventariados os20ficheiros acessíveis deModelos/Notas,incluindo temporários;originais/hash preservados. Só rótulos genéricos necessários extraídos do XLSX;sem valores privados,fórmulas/cache do exemplar,importação ou publicação documental.
|
||||
|
||||
| Saldo concreto da preparação M20/M22 | Condição de retoma e alcance |
|
||||
|---|---|
|
||||
| Transporte do resultado M20A.1/D35→M22 | Exemplar compatível ou instrução que resolva201/quadro8 versus200/quadro10. Só esse transporte fica impedido;valor líquido próprio e demais campos continuam visíveis |
|
||||
| Imposto próprio36(1)a,quota anterior recuperada e restantes efeitos de periodização/obras/reversões sem campo | Corresponder rótulo,edição/período e regra específica do campo. Efeito/valor conservados sem código provisório;apenas somas/campos dependentes aguardam |
|
||||
| Fracções M20 e subcentavos M22 | Identificar regra de representação do caso;preservar fracção e apresentar aproximação identificada até então. InteirosM20 e cêntimos exactosM22 não bloqueados |
|
||||
| Imposto contabilizado simultaneamente incluído e exterior ao plano | Discriminar ambas as componentes/referências e conciliar8.5/acréscimo próprio sem repetir gasto;sem inferir o valor da colecta |
|
||||
| Contas/quadros e anexos restantes fora das seis linhas financeiras demonstradas | Reutilizar dados existentes,classificar componentes com suporte e acrescentar correspondência específica;sem tomar campos preenchidos do exemplar como dados do investidor |
|
||||
|
||||
L7 mantém benefícios/casos especiais/taxas reduzidas eL8 mantém retenções,pagamentos,créditos e saldo final. Restantes regras deL6 e as dez dúvidasL5 conservam o saldo e as condições já documentadas. **L6 continua parcial;colecta não é saldo final a pagar.** Recibo:`docs/investmoz/simulations/irpc-l6-values-forms-qa-20261026.json`.
|
||||
|
||||
## 26/10/2026 — representação dos valores e campos M20/M22 5aaf1a56 entregues pelo Git
|
||||
|
||||
Instalado `5aaf1a56f9d928331364fcc8b0d1528e51dba327` sobre `56475acb`,preservado como versão anterior. Backup fresco `2026-10-26T08:57:09Z` e restauro isolado sem rede/porta55441: **174tabelas** por contagem/checksum e **369ficheiros/configuração** conferidos. **4ficheiros do delta,50protegidos e31originais** verificados;schema,roles/grants e permissões iguais. As172tabelas de negócio mantêm os valores do backup;cache/sessões reconciliadas com eventos operacionais/acessos anónimos,sem alteração de dados de negócio. Revisão/manifest público,7marcadores compilados,4assets e simuladorHTTP200 conferidos. Sem migrações,importações ou escrita privada sintética no activo.
|
||||
|
||||
Pipeline normal concluído;provasQA15frontend/API1-97/UI/tipos/build reutilizadas,sem nova ronda manual. **Disponível no âmbito demonstrado: resultado líquido3120 + ajustamento10 → lucro/base3130 → colecta1001,60MZN.** Representação exacta,ausência/informação em falta/campo sem aplicação e valores ainda sem correspondência conservados. M20 mantém fracções sem arredondamento presumido;M22 mantém preparação exacta ao cêntimo já aceite. Imposto próprio320 exterior produz resultado líquido2800,mas campo de acréscimo próprio continua pendente,sem usar213 de outrem. Divergência201/Q8 versus200/Q10 só limita o transporte afectado. Históricos e cálculos anteriores,pressupostos cambiais e âmbitosL3/ISPC/câmbio/L5 preservados. **Colecta não é saldo finalL8.** Recibo:`docs/investmoz/simulations/irpc-l6-values-forms-delivery-20261026.json`.
|
||||
|
||||
O estado anterior «QA sem instalação» de5aaf1a56 é histórico. O saldo seguinte separa desenvolvimento de esclarecimento documental,com exemplo e condição de retoma,para decidir o fecho operacional delimitado. **L6 não está integralmente concluído;L7 eL8 mantêm os seus âmbitos.** Não foi executada pesquisa nova nem repetição dos testes aceites para esta consolidação.
|
||||
|
||||
## 26/10/2026 — saldo consolidado de L6 para decisão de fecho operacional delimitado
|
||||
|
||||
Referência actual após a entrega `5aaf1a56`: percurso normal demonstrado até à **colecta**, com períodos/moedas/ajustamentos e preparação parcialM20/M22 documentados. Colecta não é saldo final a pagar ou recuperar;L8 conserva esse fecho. Esta lista consolida o saldo das notas anteriores,sem reabrir o que já foi demonstrado. Os pormenores e exemplares continuam nas mesmas secções/recibos;nenhuma nova matriz ou backlog é criado.
|
||||
|
||||
**Código ainda por implementar.** São extensões não demonstradas;as fontes já aceites permitem iniciar os casos correspondidos. Dados de um investidor em falta dentro de regra já implementada são uma pendência desse caso, não outra tarefa genérica deL6.
|
||||
|
||||
| Trabalho | Exemplo | Condição de retoma / alcance |
|
||||
|---|---|---|
|
||||
| Amortizações e quota de aluguer36h restantes | Ar condicionadoII/3/3,12,5%,fora dos10códigos implementados;bem usado com vida esperada e quotas anteriores documentadas. | Acrescentar catálogo e variantes previstas nas fontes aceites:usados/abertura/reparações/reavaliação,uso intensivo/concessões/peças/intangíveis,transição e excepções de método/vida útil,art17 em período curto e quota36h automática. Implementar só o caso escolhido e provar o delta;sem aguardar validação genérica daAT. Só activo,método ou quota ainda não suportados;amortizações demonstradas preservadas. |
|
||||
| Custos e periodizações específicos | Campanha de lançamento300 com imputação por3exercícios;obra com receita antecipada positiva em vez do zero demonstrado. | Implementar36-A e articulação com36n,reforços financeiros28(3),19(5)/19(6) e18(6–10),com saldos/condições do caso. Autorização de mudança de método apenas quando a disposição aplicável a exigir. Provisões sectoriais dependem primeiro da norma específica indicada abaixo. Só campanha,obra ou periodização específica;limites/provisões ordinários e casos já demonstrados mantidos. |
|
||||
| Períodos e sequência de perdas | Transição de4meses seguida dos períodos posteriores:aplicar a exclusão de contagem de41(5) ao período7(4)d,sem contar apenas anos civis. | Representar a sequência efectiva de períodos/perdas e acrescentar datas parciais,liquidação/períodos superiores a12meses e outros exercícios com regra/taxa aplicável. Não há nova pesquisa necessária para repetir o recorte de meses completos2026 já entregue. Só período ou utilização de perda dependente;lucro independente e semestres demonstrados preservados. |
|
||||
| Desdobramentos contabilísticos e quadros/anexos M20/M22 restantes | Imposto próprio200 já incluído no plano e320 exterior:discriminar as duas componentes sem duplicar gasto;contas fora das6linhas financeiras ainda não transportadas. | Acrescentar o desdobramento e as correspondências dos quadros/anexos escolhidos,reutilizando dados existentes. Campos sem correspondência aguardam a referência concreta abaixo;os outros componentes podem ser implementados/provados separadamente. Só componente/conta/campo ainda não suportado;valores e campos correspondidos preservados. |
|
||||
| Saldos em moeda estrangeira | Crédito final100USD não é soma das receitas convertidas por mês. | Implementar reconciliação de saldo e conversão pela data/regra que vier identificada,usando o motor cambial já entregue. A selecção mensal para simulação continua disponível;esta tarefa não cria outro mecanismo cambial. Só saldo/conversão fiscal dependente da regra;plano e pressupostos mensais permanecem disponíveis. |
|
||||
|
||||
**Esclarecimentos documentais aguardados.** Cada ponto abaixo exige apenas a referência/resposta específica indicada. A ausência dessa informação não significa revogação das fontes aceites,nem autoriza transformar a dúvida numa validação genérica deL6. Não se presume que um pedido já tenha sido enviado àAT;estes são pontos delimitados para o esclarecimento aplicável.
|
||||
|
||||
| Informação em falta | Exemplo da dúvida | Condição de retoma / alcance |
|
||||
|---|---|---|
|
||||
| Edição e campos M20/M22 | M20A.1/D35 remete201/quadro8;PDF M22 usa200/quadro10. Imposto próprio320 não pertence ao213 de outrem;quota recuperada−26 não tem campo de dedução confirmado. | Obter exemplar compatível ou instrução que identifique edição/período,campo e sentido do transporte. Para periodização/obras/reversões ainda sem campo,identificar a correspondência específica. Até informação nova,manter valores/efeitos sem código presumido e não repetir pesquisa. Só transporte,campo e somas dependentes;resultado líquido próprio,260/278/300 e demais campos conhecidos mantidos. |
|
||||
| Representação fiscal de fracções | M20:300,50=601/2MZN,num exemplar que pede meticais sem centavos;M22:1/300MZN não é um número exacto de cêntimos. | Identificar instrução de representação/arredondamento da edição/campo ou esclarecimento específico. Conservar a fracção até lá;não deduzir regra de arredondamento apenas do rótulo «sem centavos». Só transcrição não exactamente representável;inteirosM20,cêntimos exactosM22 e cálculo racional preservados. |
|
||||
| Articulação de limites em combinações não demonstradas | Combustível100,comprovado80,viatura de passageiros sem excepção:36h/i com36(4). Provisão de créditos200 num período curto de3meses:limite anual por corresponder. | Esclarecer especificamente a articulação h/i/36(4) e a base/limite dos períodos curtos de publicidade/créditos,se houver proporcionalização aplicável. Não somar exclusões,anualizar ou repartir por presunção. Retomar só perante referência/resposta concreta para o exemplo. Só combinação ou limite do período;casos independentes com regra já aplicada mantidos. |
|
||||
| Regra fiscal de conversão anual | PlanoUSD com64MZN/USD por mês é pressuposto sintético de simulação,não confirmação da data/taxa fiscal anual ou da cotação do saldo final. | Identificar disposição/âmbito,data,base e taxa/boletim aplicáveis ao resultado e,quando necessário,ao saldo. Reutilizar o motor existente e demonstrar só a correspondência nova;sem taxa actual por defeito ou nova ronda da pesquisa anterior. Só confirmação fiscal anual e saldo dependente;conversões mensais documentadas de simulação mantidas com os avisos. |
|
||||
| Norma sectorial de provisões reguladas | Provisão200 de uma entidade financeira sujeita ao28d não herda os1,5%/6% do regime ordinário29. | Identificar sector,regulador,norma de supervisão aplicável e saldos/condições necessários,antes da implementação específica. A fonte oficial fornecida é aceite;falta a regra concreta do caso,não certificação genérica da fonte. Só provisão regulada respectiva;provisões ordinárias demonstradas preservadas. |
|
||||
|
||||
**Base da decisão operacional:** o âmbito demonstrado e as suas limitações permanecem disponíveis na interface e nas exportações;as provas aceites mantêm validade. Um fecho operacional delimitado pode referir esse âmbito,com estas extensões/documentos fora da cobertura e retoma por caso. Esta consolidação **não declara L6 integralmente concluído nem regista uma decisão de fecho ainda não tomada**. Permite preparar o avanço paraL7 sem condicionar os casos independentes à resolução de todo este saldo. Benefícios/isenções/taxas reduzidas/tributações autónomas e operações especiais mantêm âmbitoL7;retenções,pagamentos,créditos e saldo anual mantêm âmbitoL8. As dez dúvidasL5 só afectam dependências efectivas e não foram pesquisadas novamente.
|
||||
|
||||
## 26/10/2026 — L6 operacional no âmbito demonstrado e delimitação de L7
|
||||
|
||||
**Decisão expressa da Tempo:** L6 fica operacional no âmbito demonstrado disponível em `5aaf1a56`, com limitações explícitas. Não é conclusão integral de L6 ou do IRPC. Os cinco grupos de código e cinco grupos documentais da secção «saldo consolidado de L6» permanecem separados, com exemplos e condições de retoma. As notas anteriores que deixavam a decisão operacional por tomar conservam o seu valor histórico; esta decisão é posterior. As provas aceites são reutilizadas. As pendências de L5/L6 só impedem tratamentos que dependam delas.
|
||||
|
||||
**Estado deste incremento:** delimitação documental de L7, sem novo cálculo, instalação, migração, importação ou alteração de dados activos. A colecta normal entregue mantém-se distinta do saldo a pagar/recuperar. Retenções, pagamentos, aplicação anual de créditos e liquidação final permanecem em L8. Recibo: `simulations/irpc-l7-scope-20261026.json` (relativo a `docs/investmoz/`).
|
||||
|
||||
### Dados existentes e fronteiras de integração
|
||||
|
||||
| Reutilização | Contrato para L7 e limite |
|
||||
| --- | --- |
|
||||
| Oportunidade/dossier: `context_opportunity`, `context_opportunity_snapshot`, `context_applicability_snapshot`, `context_reuse` | Conservar origem e data, selecção de campos compatíveis e edições deliberadas; `context-inheritance.ts` e `dossier-prefill.tsx` já sustentam esta reutilização. Associação documental a oportunidade/âncora não confirma implantação ou incentivo. |
|
||||
| `sector_id`, `province_id`, `district_id`, `admin_post_id`, `locality_id` e respectivas designações | Servem para identificar candidatos e pedir apenas elementos em falta. Confirmar actividade efectivamente exercida, estabelecimento/projecto e parcela abrangida por documentos do caso. Localização, polígono, DUAT ou código sectorial isolados não concedem benefício. |
|
||||
| Sujeito, NUIT, residência/EP, período, início de actividade/exploração e dados do plano | Reutilizar valores declarados e respectivas provas. Data prevista no dossier não substitui início efectivo quando esse for o termo inicial da norma. Distinguir conhecido, ausência declarada e desconhecido. |
|
||||
| `business_plan_snapshot`, livro `modelo_a_snapshot.irpcNormal` e versões L6 | Receber lucro/base/colecta e parcelas identificadas, com chave e versão de origem. Só alterar o ponto previsto pela norma: ajustamento ao lucro, dedução à base, taxa por parcela ou tributação autónoma separada. Não alterar nem recalcular silenciosamente históricos. |
|
||||
| Activos, quotas anteriores e despesas já registadas | Reutilizar os mesmos identificadores e montantes; calcular apenas o efeito adicional permitido. Não repetir o acréscimo de uma despesa nem deduzir duas vezes a amortização do mesmo activo. Um caso dependente de regra L6 não implementada conserva essa dependência específica. |
|
||||
| Preparação M20/M22 e aritmética racional existentes | Conservar montante exacto, unidade/moeda e parcela. Transporte só com correspondência demonstrada para a edição; campo desconhecido, fracção não representável ou divergência editorial não invalida o cálculo independente. Não arredondar por conveniência. |
|
||||
|
||||
O motor actual de matéria colectável não subtrai benefícios positivos livres: exige regra, condições, limite e ordem. A colecta normal cobre a taxa geral no recorte demonstrado; escolher «outro tratamento» não implementa uma taxa especial. A presença de campos ou de fontes no portal não equivale a execução de L7.
|
||||
|
||||
### Famílias de tratamentos a implementar por casos compatíveis
|
||||
|
||||
As referências seguintes delimitam a regra e o ponto de integração; **não constituem benefícios concedidos nem cobertura executável nova**. O exercício do caso, alterações aplicáveis e duração individual ficam associados à versão da regra. Não se transportam taxas temporárias para outro período.
|
||||
|
||||
| Família / fonte identificada | Condições e período a guardar | Efeito e exemplo de dúvida delimitada / condição de retoma |
|
||||
| --- | --- | --- |
|
||||
| **Despesas com tributação autónoma** — CIRPC, Lei34/2007, art.61(4), com art.36(1)g; PDF17/p768(71) | Natureza legal documentada da despesa não devidamente documentada, confidencial ou ilícita; valor e exercício; taxa de 35% da disposição e versão aplicável ao período. Não classificar pela simples falta de ficheiro anexado. | Parcela autónoma separada da colecta normal; reutilizar o acréscimo36g já feito, sem duplicação. Ex.: despesa100 já acrescida em L6 → parcela autónoma35 no caso qualificado; não é saldo final. Se só falta anexo, pedir a caracterização/prova da despesa e manter indeterminado apenas este tratamento. |
|
||||
| **Mais-valias autónomas** — Lei12/2025, art.2, CIRPC61-A; art.3 revoga39/47; art.6 vigora em01/01/2026; PDF20/p2180(20) | Alienação, activo, datas, realização/valor fiscal, origem contabilística, período e parcela identificados; taxa32% do61-A. Separar eventos anteriores a2026. | Apurar parcela autónoma, reconciliando o que já integra o resultado L6, sem dupla incidência ordinária/autónoma nem compensação presumida de perdas. Ex.: ganho100 incluído no resultado exige identificar a sua parcela antes de integrar a colecta autónoma32. Retoma: implementar essa reconciliação e a regra de apuramento aplicável ao activo; não bloqueia despesas autónomas ou benefícios independentes. |
|
||||
| **Isenções e redução por natureza da entidade** — CIRPC9–14; cooperativas no art.12, PDF5/p768(59), e taxa geral61(1) | Tipo efectivo da entidade, rendimentos elegíveis/excluídos, destino dos rendimentos, constituição e reconhecimento apenas onde exigido pela disposição; exercício e norma aplicável. Art.12 refere cooperativas agrárias, de artesanato e culturais e redução de50% da taxa geral; não todas as cooperativas. Arts.12(2)/14 separam rendimentos sujeitos a retenção. | Isenção ou taxa reduzida apenas na parcela coberta; actividade comercial acessória não se torna isenta por designação da entidade. Ex.: cooperativa com actividade elegível e outra não abrangida exige separar rendimentos e custos. Retoma: classificação documental e segregação da parcela, sem transportar a dispensa para retenções L5 ou liquidar créditos L8. |
|
||||
| **Amortização acelerada** — CBF, Lei4/2009, art.16; compilaçãoAPIEX p72 | Imóveis novos usados no projecto; imóveis reabilitados e máquinas/equipamentos industriais/agro-industriais nas condições da disposição; enquadramento CBF3/9/10 quando aplicável, entrada em uso, taxa normal, base, quota contabilizada e quotas anteriores. Incremento de50% sobre a taxa normal, não cinquenta pontos percentuais. | Efeito no ajustamento ao lucro e, através da cadeia L6, na base/colecta. Ex.: taxa normal10% → taxa acelerada15%, antes das restantes condições/limites; não autoriza uma segunda dedução integral. Retoma por activo com classificação/documentos e conciliação de quotas/custo disponíveis; tabelas L6 em falta bloqueiam só o activo dependente. |
|
||||
| **Deduções e majorações de despesas/investimentos** — CBF17–19; compilaçãoAPIEX pp73–74 | Tecnologia de ponta, formação de trabalhadores moçambicanos e despesas elegíveis de utilidade pública: natureza, base, exercício inicial, janela dos primeiros cinco anos/exercícios conforme artigo, limites, exclusões, ordem e não cumulaçãoCBF4. Distinguir dedução à matéria colectável de majoração de custo. | Efeito no ponto exacto previsto pela disposição. Ex.: formação sem prova do tipo não permite escolher entre o limite5% e o ramo10% para novas tecnologias do art.18. Retoma: identificar tipo/base de limite e conciliar a despesa já contabilizada; não converter percentagem em dedução livre. |
|
||||
| **Crédito fiscal por investimento** — CBF15; compilaçãoAPIEX pp71–72 | Investimento novo elegível, exclusões, início, Maputo/outras províncias como uma das condições, parcela da colecta atribuível ao projecto e prazo de utilização/transporte de cinco exercícios. Taxas5%/10% distinguem os ramos da disposição, sem direito automático por localização. | **L7 identifica origem, elegibilidade e crédito potencial; L8 aplica o crédito anual, limites/saldos e liquidação.** Ex.: projecto situado fora de Maputo, sem discriminação do investimento elegível, não gera automaticamente10% de crédito. Retoma: base elegível e calendário documentados; utilização anual aguarda o mecanismo L8. |
|
||||
| **Tratamentos sectoriais/territoriais CBF** — infra-estruturas20–22; agricultura/pescas27–29; turismo30–33; parques de ciência34–35; grandes projectos36–38; zonas de rápido desenvolvimento39–44; ZFI45–46; ZEE47–48 | Seleccionar a disposição de IRPC efectivamente pertinente, actividade/projecto, delimitação/estabelecimento e estatuto comprovados, data de autorização/início quando exigidos, escalões, duração, cumulação e cessaçãoCBF49–52. ZFI46 e ZEE48 são os artigos de impostos sobre rendimento. Não tratar benefícios exclusivamente aduaneiros como benefícios IRPC. | Isenção, redução ou dedução por parcela e intervalo próprio, em vez de taxa comum ao sector/localização. Ex.: endereço numa ZEE sem estatuto documentado deixa o ramo ZEE pendente; o cálculo normal independente continua. CIRPC61(2) na Lei20/2022 tem termo31/12/2025: não presumir prorrogação para2026. Retoma de cada ramo: condições e cronologia da disposição específica preenchidas, com regra versionada; não exigir pesquisa repetida de todos os sectores. |
|
||||
| **Operações e regimes especiais** — CIRPC54–56 (entradas de activos, fusões/cisões e sócios), transferência de perdas41-A; regimes sectoriais específicos do acervo | Tipo de operação, intervenientes, residência, datas, activos/passivos/valores fiscais e continuidade; identificar diploma sectorial/artigo e regra aplicável antes de escolher tratamento. Não inferir neutralidade por chamar «fusão» à operação nem aplicar regime mineiro/petrolífero por rótulo sectorial. | Continuidade/ajustamento/tributação diferida ou parcela própria conforme norma, mantendo bases históricas. Ex.: perda recebida de outra sociedade não é perda própria ordinária41 de L6. Retoma: correspondência específica41-A e operação documentada; regras sectoriais sem artigo correspondido ficam candidatas, sem taxa provisória. Não há bloqueio transversal de L7. |
|
||||
|
||||
### Registo por tratamento e demonstração a exigir ao código novo
|
||||
|
||||
Cada tratamento terá: identificador estável; sujeito/NUIT; oportunidade/projecto/estabelecimento e parcela; contexto herdado e divergências; fonte/exemplar/hash/artigo/versão; intervalo de vigência e período do caso; facto que inicia/termina a duração; condições individualizadas em «sim/não/desconhecido» com prova ou ausência declarada; título/reconhecimento somente quando a regra o exige; base elegível, taxa, limite, ordem e compatibilidade com outros tratamentos; resultado normal de origem; efeito adicional e ponto da cadeia; moeda/conversão e pressupostos; montante exacto; motivos de exclusão/informação em falta; versão/histórico e dependência concreta.
|
||||
|
||||
Os estados «candidato», «não aplicável», «informação em falta» e «calculado por regra implementada» não se confundem. Ausência declarada pode produzir efeito zero justificado; desconhecido não produz benefício zero nem benefício presumido. Uma condição negativa exclui o tratamento e conserva o percurso normal quando os seus dados são suficientes. Com potencial benefício ainda indeterminado, apresentar o cenário normal de referência e a parcela pendente sem declarar total fiscal definitivo. Mudança de sector/localização/documento invalida apenas a correspondência dependente e pede confirmação de reutilização; conserva o original e as edições deliberadas.
|
||||
|
||||
**Primeiro incremento delimitado para implementação:** qualificação comum e segregação de efeitos, acompanhadas do caso35% do61(4), com despesa já ajustada36g e caso de informação insuficiente. É independente de transporte M20/M22 não correspondido e de amortizações L6 em falta. **Incremento compatível seguinte:** cooperativa abrangida pelo12 com parcela elegível separada e amortização acelerada16 para activo já suportado em L6; cada caso só acompanha a entrega se demonstrado. Mais-valias61-A, deduções17–19, ramos sectoriais e operações especiais seguem separadamente quando as respectivas parcelas/regras estiverem correspondidas. Crédito15 prepara direito potencial em L7 e contrato de passagem para L8, sem antecipar liquidação anual.
|
||||
|
||||
Para cada nova regra: condição satisfeita, negativa, informação em falta, período incompatível/benefício expirado, sobreposição com ajustamento existente e alteração de contexto. Demonstrar apenas o delta: cálculo → gravação → recuperação → relatório, incluindo fonte, período, condições, efeito no lucro/base/colecta ou parcela autónoma e saldo final L8 por determinar. Recuperar históricos anteriores sem os alterar; não duplicar ajustamentos ao voltar a guardar. Reutilizar as provas aceites; não reabrir L3, ISPC, câmbio ou percursos L5/L6 independentes.
|
||||
|
||||
### Fontes consultadas e pendências delimitadas
|
||||
|
||||
Reutilizado o inventário autorizado de **8143ficheiros**, sem nova varredura de pastas. Para delimitação foram consultados os originais CIRPC/alterações já arquivados, a Lei4/2009 local e a compilação oficial [APIEX — Legislação de Investimentos em Moçambique](https://pt.apiex.gov.mz/wp-content/uploads/2025/02/LEGISLACAO-DE-INVESTIMENTOS-EM-MOCAMBIQUE.pdf), que reúne Lei8/2023, Decreto8/2024 e CBF4/2009. Disponibilidade, situação documental/jurídica e uso no cálculo continuam estados independentes. O acesso actual à cópia CBF supera a indisponibilidade assinalada em notas antigas; não activa regra nem apaga a nota histórica. Artigos, páginas, hashes e limites no recibo. A compilação não dispensa o período/alterações de cada tratamento, nem cria validação jurídica genérica adicional.
|
||||
|
||||
**Código por implementar em L7:** qualificação e persistência específicas; efeitos segregados; regras das famílias acima, por parcelas; conciliação sem duplicação; relatório/exportação correspondente. **Documentação por caso:** estatuto/reconhecimento ou enquadramento individual quando a fonte o exige; identificação de parcela/limite/cronologia; norma sectorial ainda sem correspondência; edição/campo de transporte afectado. Cada uma conserva exemplo e condição de retoma na linha correspondente. Não é necessário resolver todos os documentos para começar o primeiro incremento independente. L6 operacional não elimina este desenvolvimento; L7 delimitado não é L7 implementado; L8 conserva a liquidação final.
|
||||
|
||||
@@ -0,0 +1,695 @@
|
||||
{
|
||||
"status": "installed_L6_cost_limits_provisions_timing",
|
||||
"installed": {
|
||||
"status": "installed",
|
||||
"commit": "043dd35d8ee247123b3a32f1fc10fd2ede81e9f4",
|
||||
"release": "/var/www/investmoz-homologacao/releases/043dd35d8ee247123b3a32f1fc10fd2ede81e9f4-917b3c47",
|
||||
"previous_release": "/var/www/investmoz-homologacao/releases/a2de725901c308fb2ac2bc3d72181ab50ef46b7a-145e8f25",
|
||||
"database_migrations": 0,
|
||||
"content_imports": 0
|
||||
},
|
||||
"previous_baseline": "a2de725901c308fb2ac2bc3d72181ab50ef46b7a",
|
||||
"backup": {
|
||||
"stage": "/var/backups/investmoz-irpc-l6-costs-delivery-20261026/backup",
|
||||
"created_at": "2026-10-26T06:35:29Z",
|
||||
"target": {
|
||||
"database": "teste_investidor",
|
||||
"port": 5432
|
||||
},
|
||||
"tables": 174,
|
||||
"files_verified": 369,
|
||||
"dump_sha256": "bf7f4e6ad9e18ef479ae46a08ec9c072047240655331e437da14ae8c39e8bd0b",
|
||||
"files_sha256": "4046d8eff093201371a9e5fbdd14a6d5fe805d7f72cf30e9d6132e5804da1788",
|
||||
"restore_verified": false
|
||||
},
|
||||
"restore": {
|
||||
"restore_verified": true,
|
||||
"tables_verified": 174,
|
||||
"container_network": "none",
|
||||
"database": "irpc_l5_restore_20261025",
|
||||
"port": 55441,
|
||||
"source_dump_sha256": "bf7f4e6ad9e18ef479ae46a08ec9c072047240655331e437da14ae8c39e8bd0b",
|
||||
"active_database_writes": 0
|
||||
},
|
||||
"preservation": {
|
||||
"previous_release_preserved": "/var/www/investmoz-homologacao/releases/a2de725901c308fb2ac2bc3d72181ab50ef46b7a-145e8f25",
|
||||
"installed": {
|
||||
"status": "installed",
|
||||
"commit": "043dd35d8ee247123b3a32f1fc10fd2ede81e9f4",
|
||||
"release": "/var/www/investmoz-homologacao/releases/043dd35d8ee247123b3a32f1fc10fd2ede81e9f4-917b3c47",
|
||||
"previous_release": "/var/www/investmoz-homologacao/releases/a2de725901c308fb2ac2bc3d72181ab50ef46b7a-145e8f25",
|
||||
"database_migrations": 0,
|
||||
"content_imports": 0
|
||||
},
|
||||
"runtime_files_verified": 6,
|
||||
"preserved_L3_ISPC_FX_runtime_files_verified": 42,
|
||||
"documentary_files_verified": 31,
|
||||
"persistent_files_and_env_verified": 369,
|
||||
"tables_compared": 174,
|
||||
"changed_tables": {
|
||||
"cache": {
|
||||
"before": {
|
||||
"rows": 106,
|
||||
"checksum": "5226f818ead8e964983de752574a1647"
|
||||
},
|
||||
"after": {
|
||||
"rows": 106,
|
||||
"checksum": "82f4ca900546cfbd7c046c9e2a681522"
|
||||
}
|
||||
},
|
||||
"sessions": {
|
||||
"before": {
|
||||
"rows": 35,
|
||||
"checksum": "077762df7046fb9e6ce60a7470f3b61f"
|
||||
},
|
||||
"after": {
|
||||
"rows": 38,
|
||||
"checksum": "b90979f4d72922226d368ab21ffe162a"
|
||||
}
|
||||
}
|
||||
},
|
||||
"preserved_counts": {
|
||||
"published_fiches": 29,
|
||||
"relations": 28,
|
||||
"geometries": 408
|
||||
},
|
||||
"migration_count": 0,
|
||||
"content_imports": 0,
|
||||
"comparison_role": "postgres_before_and_after;sameexportedsnapshotbaseline;noapplicationRLSvisibilityinference",
|
||||
"writes_by_verification": 0
|
||||
},
|
||||
"schema_permissions": {
|
||||
"schema_sha256": "5045b3e51d2185377aa3d9ac7fa07a44fad3ec620cdfa83ffe31c8884ee1601d",
|
||||
"roles_grants_sha256": "1530c33cb016e67bfdc64891ddfce7f185b13b56b2cd87c012871a685e118109",
|
||||
"filesystem_permissions": {
|
||||
".env": {
|
||||
"mode": 416,
|
||||
"uid": 1001,
|
||||
"gid": 33
|
||||
},
|
||||
"storage": {
|
||||
"mode": 1533,
|
||||
"uid": 1001,
|
||||
"gid": 33
|
||||
},
|
||||
"storage/app": {
|
||||
"mode": 1533,
|
||||
"uid": 1001,
|
||||
"gid": 33
|
||||
},
|
||||
"bootstrap/cache": {
|
||||
"mode": 1528,
|
||||
"uid": 1001,
|
||||
"gid": 33
|
||||
}
|
||||
},
|
||||
"comparison_identity": "postgres;catalogue read only;no passwords collected",
|
||||
"unchanged": true
|
||||
},
|
||||
"operational_delta": {
|
||||
"status": "operational_delta_reconciled",
|
||||
"comparison_identity": "postgres before/after;isolated restored baseline;no RLS visibility inference",
|
||||
"cache": "queue:restart value/expiry and request-throttle counter/timer pair;no deleted cache rows",
|
||||
"sessions": "anonymous sessions created by exact delivery verification user-agent",
|
||||
"delta": {
|
||||
"cache": {
|
||||
"before_rows": 106,
|
||||
"after_rows": 106,
|
||||
"changes": [
|
||||
{
|
||||
"key_sha256": "dbb99b7e17f5b4b9bb7a8bdf9350d9b2ae368aaa4bc44593a2522d87617d8461",
|
||||
"kind": "updated",
|
||||
"fields": [
|
||||
"expiration"
|
||||
],
|
||||
"key_pattern": "investemoz-cache-{hash}",
|
||||
"is_queue_restart_key": false,
|
||||
"expiration_unchanged": false,
|
||||
"throttle_timer_pair": true
|
||||
},
|
||||
{
|
||||
"key_sha256": "c1c7bc86ef3255c103a0be6aeb651b824eb07259e993cc5daf3665c1a6afff2d",
|
||||
"kind": "updated",
|
||||
"fields": [
|
||||
"value",
|
||||
"expiration"
|
||||
],
|
||||
"key_pattern": "investemoz-cache-{hash}:timer",
|
||||
"is_queue_restart_key": false,
|
||||
"expiration_unchanged": false,
|
||||
"throttle_timer_pair": true
|
||||
},
|
||||
{
|
||||
"key_sha256": "7f7dd83f47f5bf404d55e6e9f1367948721579970b195680645e356031a070ff",
|
||||
"kind": "updated",
|
||||
"fields": [
|
||||
"value",
|
||||
"expiration"
|
||||
],
|
||||
"key_pattern": "investemoz-cache-illuminate:queue:restart",
|
||||
"is_queue_restart_key": true,
|
||||
"expiration_unchanged": false,
|
||||
"throttle_timer_pair": false
|
||||
}
|
||||
]
|
||||
},
|
||||
"sessions": {
|
||||
"before_rows": 35,
|
||||
"after_rows": 38,
|
||||
"changes": [
|
||||
{
|
||||
"key_sha256": "29cd831ee5192663271b023bde8978c87f54e6779a76887fbdbb7d8b52898085",
|
||||
"kind": "added",
|
||||
"fields": [
|
||||
"id",
|
||||
"ip_address",
|
||||
"user_agent",
|
||||
"payload",
|
||||
"last_activity"
|
||||
],
|
||||
"anonymous_user": true,
|
||||
"delivery_user_agent": true
|
||||
},
|
||||
{
|
||||
"key_sha256": "5818b9263233545023da019e37aa9c88c4f02128d540df592d1eb4cb075b406d",
|
||||
"kind": "added",
|
||||
"fields": [
|
||||
"id",
|
||||
"ip_address",
|
||||
"user_agent",
|
||||
"payload",
|
||||
"last_activity"
|
||||
],
|
||||
"anonymous_user": true,
|
||||
"delivery_user_agent": true
|
||||
},
|
||||
{
|
||||
"key_sha256": "e30d5aad1397f2c086ee5dcd82a279b9a307415336c02059ff9513ef5251f262",
|
||||
"kind": "added",
|
||||
"fields": [
|
||||
"id",
|
||||
"ip_address",
|
||||
"user_agent",
|
||||
"payload",
|
||||
"last_activity"
|
||||
],
|
||||
"anonymous_user": true,
|
||||
"delivery_user_agent": true
|
||||
}
|
||||
]
|
||||
}
|
||||
},
|
||||
"business_tables_to_confirm_separately": 172,
|
||||
"active_data_writes_by_comparison": 0,
|
||||
"restore_network": "none"
|
||||
},
|
||||
"public_verification": {
|
||||
"status": "installed_delta_verified",
|
||||
"served_revision": {
|
||||
"commit": "043dd35d8ee247123b3a32f1fc10fd2ede81e9f4",
|
||||
"branch": "main",
|
||||
"built_at": "2026-10-26T06:40:10.666340+00:00",
|
||||
"manifest_sha256": "d91dd39d49e9e0251c76c811ca6a0798b7cf544e3e807735574ba51691afac9e"
|
||||
},
|
||||
"manifest_hash_matches": true,
|
||||
"compiled_delta_markers": {
|
||||
"Iniciar custos com limites, provisões e periodização": [
|
||||
"assets/services-DkQ7aTGY.js"
|
||||
],
|
||||
"Acrescentar custo, provisão ou periodização": [
|
||||
"assets/services-DkQ7aTGY.js"
|
||||
],
|
||||
"Publicidade — limite único anual": [
|
||||
"assets/services-DkQ7aTGY.js"
|
||||
],
|
||||
"Créditos — limites anual e acumulado": [
|
||||
"assets/services-DkQ7aTGY.js",
|
||||
"assets/project-dossier-EB1GFWid.js"
|
||||
],
|
||||
"Conferir correspondência dos temas com os mapas": [
|
||||
"assets/services-DkQ7aTGY.js"
|
||||
],
|
||||
"Aplicar correspondências conferidas dos mapas": [
|
||||
"assets/services-DkQ7aTGY.js"
|
||||
],
|
||||
"Iniciar mapas complementares L6": [
|
||||
"assets/services-DkQ7aTGY.js"
|
||||
],
|
||||
"Saldo final — âmbito L8": [
|
||||
"assets/project-dossier-EB1GFWid.js"
|
||||
],
|
||||
"Calcular e guardar apuramento trimestral ISPC": [
|
||||
"assets/services-DkQ7aTGY.js"
|
||||
],
|
||||
"Calcular e guardar restituição E": [
|
||||
"assets/services-DkQ7aTGY.js"
|
||||
],
|
||||
"Reutilizar selecção cambial": [
|
||||
"assets/services-DkQ7aTGY.js"
|
||||
]
|
||||
},
|
||||
"assets": [
|
||||
{
|
||||
"file": "assets/project-dossier-document-DDnA8FXy.js",
|
||||
"status": 200,
|
||||
"sha256": "47280845a07c33b1d2dd3c8f770a9f0f213476e99ad8f927f812c75a66a855df"
|
||||
},
|
||||
{
|
||||
"file": "assets/simulation-form-BqVD91Ek.js",
|
||||
"status": 200,
|
||||
"sha256": "85cbd533c5bc92af5a448db71da006d4346d2d0adb09dde825db0aa19ad5048c"
|
||||
},
|
||||
{
|
||||
"file": "assets/services-DkQ7aTGY.js",
|
||||
"status": 200,
|
||||
"sha256": "8782f7a7758e8f25803737ec5e072ba4888ad946d54611ce501364608c24a633"
|
||||
},
|
||||
{
|
||||
"file": "assets/project-dossier-EB1GFWid.js",
|
||||
"status": 200,
|
||||
"sha256": "8328b2676e8da123e8126ed718895a0ddaaabed30a80a7cef902be911ef8bffd"
|
||||
}
|
||||
],
|
||||
"simulator_status": 200,
|
||||
"simulator_entry": "assets/app-Dz8nCVw7.js",
|
||||
"existing_fiscal_availability": {
|
||||
"data": {
|
||||
"enabled": true,
|
||||
"coverage_start": "2026-01-01",
|
||||
"coverage_end": "2026-12-31",
|
||||
"message": "IVA geral sobre base líquida disponível; enquadramento declarado."
|
||||
}
|
||||
},
|
||||
"synthetic_private_writes": 0,
|
||||
"method": "Read-only installedrevision/manifest/newcompiledcatalogueandreaders/simulatorentry;acceptedQAproofsreused"
|
||||
},
|
||||
"runtime_delta": [
|
||||
{
|
||||
"path": "resources/js/components/simulation-irpc-costs.tsx",
|
||||
"sha256_LF": "c4156916835daf0f33addf89dfedd40c31b8dc3297112cd98beac33422af274d"
|
||||
},
|
||||
{
|
||||
"path": "resources/js/components/simulation-irpc-normal.tsx",
|
||||
"sha256_LF": "8001d2e71b58fa07c77f74da2c2b51566659a5d784d9e044133192c66518cb15"
|
||||
},
|
||||
{
|
||||
"path": "resources/js/lib/irpc-normal-base.ts",
|
||||
"sha256_LF": "fef34966db603633eb03c9830ad3c09e7cd0ffaed49720dbab60f9dc0fd8a8fb"
|
||||
},
|
||||
{
|
||||
"path": "resources/js/lib/irpc-normal-costs.ts",
|
||||
"sha256_LF": "29aeb16bf8fe60bb322b5449fb3efd84b5108b06112b91be5fc76d8e897d8860"
|
||||
},
|
||||
{
|
||||
"path": "resources/js/lib/irpc-normal-profit.ts",
|
||||
"sha256_LF": "26810caea4e7d177b385e36452147d84602a7b23cb5f8f23a88488d1bfaf619f"
|
||||
},
|
||||
{
|
||||
"path": "resources/js/lib/irpc-normal.ts",
|
||||
"sha256_LF": "98adf3e1c84938d27535f65afa24edc0650bfb12a1f9b32352b0d4d71c2c2035"
|
||||
}
|
||||
],
|
||||
"protected_runtime": [
|
||||
{
|
||||
"path": "resources/js/components/simulation-irpc-schedules.tsx",
|
||||
"sha256": "eebd6d9e4100920a5ebf91b800537ffe301fd6a994b86a3b080d673f4a9c9a42"
|
||||
},
|
||||
{
|
||||
"path": "resources/js/lib/irpc-normal-assessment.ts",
|
||||
"sha256": "1dc6adc0835af033ef296d12cdc1e9ef354b2f54cd36e2349b2df66e369c1ee3"
|
||||
},
|
||||
{
|
||||
"path": "resources/js/lib/irpc-normal-forms.ts",
|
||||
"sha256": "4e986addb9f2d74e7a80345f8f1e4d8e0b2f562c867fa6eee84880d9f72a3649"
|
||||
},
|
||||
{
|
||||
"path": "resources/js/lib/irpc-normal-schedules.ts",
|
||||
"sha256": "b0045fd2c072998ebb290c2a8332c26d05a1f5f746b3beb1805508147497cac8"
|
||||
},
|
||||
{
|
||||
"path": "resources/js/components/simulation-irpc-taxable-base.tsx",
|
||||
"sha256": "e4fe9f66d35d24aa68fd87de6a5a6a0e901706b270c18962fd0c7ab00f9abd93"
|
||||
},
|
||||
{
|
||||
"path": "resources/js/components/simulation-irpc-assessment.tsx",
|
||||
"sha256": "7174cc0160005a0c332ea40f02ba8a6d57985081b5ab45177ccd6e721bceea54"
|
||||
},
|
||||
{
|
||||
"path": "resources/js/components/acquisition-beverage-restitution.tsx",
|
||||
"sha256": "6f44897b8b12569314551df0022c26da57a165634087942a724293e66837558d"
|
||||
},
|
||||
{
|
||||
"path": "resources/js/components/fiscal-calculation-gaps.tsx",
|
||||
"sha256": "1dab6ceb73756d4e023096b3b2ba767aaa843ff6cc69046ea630ab449a00b0dd"
|
||||
},
|
||||
{
|
||||
"path": "resources/js/components/fiscal-l3-preparation.tsx",
|
||||
"sha256": "e84a7b1ccadaa1b5bd78d778a3287f96ccaf530855eef404786cd7aa3d321b73"
|
||||
},
|
||||
{
|
||||
"path": "resources/js/components/simulation-acquisitions.tsx",
|
||||
"sha256": "c206d4cfe575d6ba007aa2b425b5f898efa97e4162b8710e358b6ecfd9458542"
|
||||
},
|
||||
{
|
||||
"path": "resources/js/components/simulation-operations.tsx",
|
||||
"sha256": "a7e55972fa790063dcf11945055de2af46a77db9e509900af22ede7ec47bb4cf"
|
||||
},
|
||||
{
|
||||
"path": "resources/js/lib/iva-acquisition-bc.ts",
|
||||
"sha256": "b0ef55e0917bdb79f14b53ba9e95d73c08153befeb7d4ce73f81e6fb13992225"
|
||||
},
|
||||
{
|
||||
"path": "resources/js/lib/iva-beverage-allocation.ts",
|
||||
"sha256": "32968d198c7fe0c53ca89641c22d5749be6636be2c79127b867e4e3afd0dd40d"
|
||||
},
|
||||
{
|
||||
"path": "resources/js/lib/iva-beverage-restitution.ts",
|
||||
"sha256": "5c650cbd9469d5f99001f56fc4ff99ac973eb368036d4e96c6d171f1b220bd9e"
|
||||
},
|
||||
{
|
||||
"path": "resources/js/lib/iva-calculation-gaps.ts",
|
||||
"sha256": "2e7d84a0c196bd5b56fd67cc1a389d43d5041894184e675680a4de3cd10b31a2"
|
||||
},
|
||||
{
|
||||
"path": "resources/js/lib/iva-operations.ts",
|
||||
"sha256": "ec37b949f1233c5f5c14a87450c421ed29fabf1ed5b73fb32564564a2bc31f54"
|
||||
},
|
||||
{
|
||||
"path": "resources/js/lib/l3-form-preparation.ts",
|
||||
"sha256": "fc47f5fa5ec1420fbd847d0d081f00d99ebbb524164eef785b20877e0562f704"
|
||||
},
|
||||
{
|
||||
"path": "resources/js/lib/ispc-residuals.ts",
|
||||
"sha256": "40d5751c06c7c155ab4b7a17ee2d1653da2fbbf075807fbb8561cdbe19820955"
|
||||
},
|
||||
{
|
||||
"path": "resources/js/components/simulation-ispc-residuals.tsx",
|
||||
"sha256": "a9219d6f41ccbd0ce45659d4f6aa0fa1c169a685840f5cb1e18daeca377d5e18"
|
||||
},
|
||||
{
|
||||
"path": "resources/js/lib/ispc-eligibility.ts",
|
||||
"sha256": "44675c5efacdc1ae19505667611ba3b522d3043cebacc8754597c3a68ca89d25"
|
||||
},
|
||||
{
|
||||
"path": "resources/js/components/simulation-ispc-quarter.tsx",
|
||||
"sha256": "2c2555309b32d4261f14e7164f39314c9188129c2990357fc54090a2468dd2b4"
|
||||
},
|
||||
{
|
||||
"path": "resources/js/components/simulation-ispc-withholding.tsx",
|
||||
"sha256": "e0445d015b72859e48726959aa52686f79b1cf5c2ade29751efa83257068b878"
|
||||
},
|
||||
{
|
||||
"path": "resources/js/lib/ispc-quarter.ts",
|
||||
"sha256": "f66bd52e9cdfe1ddaa6b00a931465862b3d890b9be216b7a056740f027f24129"
|
||||
},
|
||||
{
|
||||
"path": "resources/js/lib/ispc-withholding.ts",
|
||||
"sha256": "6c31b240299edd3262efa28f7f3d5aee21123f94e30ef4ab90e26c35777cb6e4"
|
||||
},
|
||||
{
|
||||
"path": "resources/js/components/simulation-ispc-eligibility.tsx",
|
||||
"sha256": "f48dd4a8f87a994eda0447f81a463589905e5873b2e1044debac9d10825a880c"
|
||||
},
|
||||
{
|
||||
"path": "resources/js/lib/iva-acquisitions.ts",
|
||||
"sha256": "cce283b1d0a07fb383fcb527225f4dd5bec829010a662cbaae1d60e595221977"
|
||||
},
|
||||
{
|
||||
"path": "resources/js/lib/iva-modelo-a.ts",
|
||||
"sha256": "c641619a05613c1620385baad0e9ffbf810dd970aafb30e12b3a7f9a3bf11846"
|
||||
},
|
||||
{
|
||||
"path": "resources/js/lib/iva-fx-selection.ts",
|
||||
"sha256": "9aa07ad443bc777b80510a3b5bd6aff9ddb9814d2450f3c690e531e74d71d998"
|
||||
},
|
||||
{
|
||||
"path": "resources/js/components/simulation-fx-selection.tsx",
|
||||
"sha256": "39bb6d87d404745b0b66349bc11626545a3672ae27321ce9b4658416592059bf"
|
||||
},
|
||||
{
|
||||
"path": "resources/js/lib/business-financial-plan.ts",
|
||||
"sha256": "c20274722d1ffcd0360f041a6cacb5d868fe0621cb27a1aca6e06826612c3ebb"
|
||||
},
|
||||
{
|
||||
"path": "resources/js/lib/iva-currency-events.ts",
|
||||
"sha256": "cc9f2045d302d7987310da4006cc250fc5c99a27397918d166d649bfc32fab08"
|
||||
},
|
||||
{
|
||||
"path": "resources/js/lib/irpc-fx.ts",
|
||||
"sha256": "5c4a7a477429f8d775acf6db3e117008468f5554e5731dec81f60fbb75e948fb"
|
||||
},
|
||||
{
|
||||
"path": "resources/js/lib/irpc-withholdings.ts",
|
||||
"sha256": "8e5f3c035ce5e4d6c3fc82f933439ab580fa5519492f9c4d32cfb71b77b54803"
|
||||
},
|
||||
{
|
||||
"path": "resources/js/components/simulation-irpc-withholdings.tsx",
|
||||
"sha256": "751af4fab346659bc5ccb08b8a2169769af7521ea0035050af32b41ea7f5aa76"
|
||||
},
|
||||
{
|
||||
"path": "resources/js/lib/irpc-interest.ts",
|
||||
"sha256": "f8e6390b3b2c58c296f7e3fd14576e06ae248bc0cabce1a666b7094611f2a7dd"
|
||||
},
|
||||
{
|
||||
"path": "resources/js/lib/irpc-mrfta.ts",
|
||||
"sha256": "76dcce8954f68b081d500be61de9c5b146a452a3eb578a0b78776ba9e1f8051c"
|
||||
},
|
||||
{
|
||||
"path": "resources/js/lib/irpc-mrfta-cases.ts",
|
||||
"sha256": "4266746076ab3f70312fd042351e24dd2f136c4f3e8a277b57dd97849a9f1862"
|
||||
},
|
||||
{
|
||||
"path": "resources/js/components/simulation-irpc-mrfta.tsx",
|
||||
"sha256": "913d1bb4ac0fc59763cf5d27bc637f6a713b2050c4463748db554af4be451538"
|
||||
},
|
||||
{
|
||||
"path": "resources/js/lib/financial-fiscal-bridge.ts",
|
||||
"sha256": "5a30c501653b16b5fedcb12631ce81fcce4fe473aa542e94374986b3c50f2d33"
|
||||
},
|
||||
{
|
||||
"path": "resources/js/components/simulation-form.tsx",
|
||||
"sha256": "85b024a7f45ceb52efd6ff1f21d0eab1fd8fcf1ab59e4b5302c08685235c472a"
|
||||
},
|
||||
{
|
||||
"path": "resources/js/lib/project-dossier.ts",
|
||||
"sha256": "a0909bbfcdf7e8542b010faa104fcb918e86ae38ddf096082d4d5be98d31b2b9"
|
||||
},
|
||||
{
|
||||
"path": "resources/js/lib/project-dossier-report.ts",
|
||||
"sha256": "5207a2ffeb208cd5ace6713038cee85208020ee618194dca7114e94fc3200b6c"
|
||||
}
|
||||
],
|
||||
"originals": [
|
||||
{
|
||||
"path": "docs/investmoz/simulations/source-archive/AT-Comunicado-9-2026-ISPC.pdf",
|
||||
"sha256": "106f8a9ce9255c03549c70bf07fe999d32e6e55302d009b509862aa74ccb4973"
|
||||
},
|
||||
{
|
||||
"path": "docs/investmoz/simulations/source-archive/AT-Modelo-30-ISPC.pdf",
|
||||
"sha256": "6802edd06b6ff638a0b851a3ec7ecf69af8f07840faa47446becad67d35d445c"
|
||||
},
|
||||
{
|
||||
"path": "docs/investmoz/simulations/source-archive/AT-Modelo-B-Geral.pdf",
|
||||
"sha256": "bd977c7c59d4d98befd92e2c566b1bf168cb1343bb519f51b41a3807f431fc57"
|
||||
},
|
||||
{
|
||||
"path": "docs/investmoz/simulations/source-archive/AT-MRFTA-19-39.pdf",
|
||||
"sha256": "8ea62c53066b482f87078a7a7b1ecf15ca98a12a122e8d7abca63acfc993186b"
|
||||
},
|
||||
{
|
||||
"path": "docs/investmoz/simulations/source-archive/BM-Mercado-Monetario-MAIBOR-20261025.html",
|
||||
"sha256": "00e8a7e0d3a1db4ca3beb56d5361b2084a0f1684f3d40fc1c203702a2190e063"
|
||||
},
|
||||
{
|
||||
"path": "docs/investmoz/simulations/source-archive/BR-16-I-Serie-2008-04-16.pdf",
|
||||
"sha256": "fc373ff5637edf75ec6a9595dec8763a8503d4ee786e3b7d8f1c742eae9d80ee"
|
||||
},
|
||||
{
|
||||
"path": "docs/investmoz/simulations/source-archive/BR-248-I-Suplemento-1-2025.pdf",
|
||||
"sha256": "ccf2a8deeca820f2dd076b4b2141b1efe3f6a806568c3a587ca59a8e92f4c251"
|
||||
},
|
||||
{
|
||||
"path": "docs/investmoz/simulations/source-archive/BR-89-I-Serie-2017-06-08.pdf",
|
||||
"sha256": "11f0cab15eb6e51010952203ffa24fdc533a24fd642e19525fe4f46b17a1f5e5"
|
||||
},
|
||||
{
|
||||
"path": "docs/investmoz/simulations/source-archive/BR-95-I-Suplemento-2025-05-21.pdf",
|
||||
"sha256": "e0e682e2c027c3cd9c1d46a73a3f48bc5f6bdbf05667fd97314d7a3f6a456358"
|
||||
},
|
||||
{
|
||||
"path": "docs/investmoz/simulations/source-archive/BR252-I-Serie-2022-Lei20-PESOE.pdf",
|
||||
"sha256": "1159fd3ce1ba5581671796d083534da48bd3c5578298819e896f1c2a8026318d"
|
||||
},
|
||||
{
|
||||
"path": "docs/investmoz/simulations/source-archive/Decreto-22-2021-BR70.pdf",
|
||||
"sha256": "a8fac38dcfe08f9c7a8e46254cff10e1ec82fc4f7a8d88ad6e4fe7d91ffc21a5"
|
||||
},
|
||||
{
|
||||
"path": "docs/investmoz/simulations/source-archive/Decreto-27-2026-BR123.pdf",
|
||||
"sha256": "26249c3fa58f149c81de36e99d1aac2819a4771379d9e8833159660dabf539bb"
|
||||
},
|
||||
{
|
||||
"path": "docs/investmoz/simulations/source-archive/Decreto-29-1998-BR22-5-suplemento.pdf",
|
||||
"sha256": "6242cbe675faadf085f43f95ec8c7e8868aafe67c3b2ab2bb010992288f954f8"
|
||||
},
|
||||
{
|
||||
"path": "docs/investmoz/simulations/source-archive/Decreto-3-2011-BR-11-I-mineiros.pdf",
|
||||
"sha256": "5bca1133666ba9c69870b89823420175b7b5b8d0eccb667ecdf5c29716f3b6be"
|
||||
},
|
||||
{
|
||||
"path": "docs/investmoz/simulations/source-archive/Decreto-37-2023-BR124.pdf",
|
||||
"sha256": "7e680b191481faa0e2e9057fa5053587eb2a29d1d8c819e0eb9f02814255a04c"
|
||||
},
|
||||
{
|
||||
"path": "docs/investmoz/simulations/source-archive/Decreto-9-2008-BR16.pdf",
|
||||
"sha256": "96fccdecbfdc11c9eafb90fbc6c7bc259f88bbd4c7507d1ac3af1fa03f960697"
|
||||
},
|
||||
{
|
||||
"path": "docs/investmoz/simulations/source-archive/Lei-13-2016-CIVA-BR-156-10-suplemento.pdf",
|
||||
"sha256": "b90dc7c14ecea2e378c4a62e8e5a47d54a5644c457baeb8b8053b92fd2a5710b"
|
||||
},
|
||||
{
|
||||
"path": "docs/investmoz/simulations/source-archive/Lei-14-1992-BR42.pdf",
|
||||
"sha256": "089fff7423e99a70a230a73ca379e4ea3a91d124703f91016e57ff82794b9e56"
|
||||
},
|
||||
{
|
||||
"path": "docs/investmoz/simulations/source-archive/Lei-17-2022-BR251-exemplar-MCNet5.pdf",
|
||||
"sha256": "14eb34f0af91a8f5cb1770c7b52d6ff839c6818302d1ed96d79afbfb9fe999d4"
|
||||
},
|
||||
{
|
||||
"path": "docs/investmoz/simulations/source-archive/Lei-17-2022-IPP-BR250-Parlamento.pdf",
|
||||
"sha256": "978cd22403ffd336a631704ecd7a5bbd814a427c815b9acdaca5515591dd9e2a"
|
||||
},
|
||||
{
|
||||
"path": "docs/investmoz/simulations/source-archive/Lei-19-2013-BR76.pdf",
|
||||
"sha256": "bba96d645cc935ffc3d1a79b9f0f73ac1c693d6459c2ad41f56cd2841accae76"
|
||||
},
|
||||
{
|
||||
"path": "docs/investmoz/simulations/source-archive/Lei-19-2017-IRPS-BR-OCAM.pdf",
|
||||
"sha256": "c3a0186cb9ad090d7a9533006295dc9bb6a62ad0d6150173cbd49dba4ee4b52d"
|
||||
},
|
||||
{
|
||||
"path": "docs/investmoz/simulations/source-archive/Lei-2-2011-BR-1-4-suplemento-MCNet.pdf",
|
||||
"sha256": "a7543a68cc3287a46a83c39a04821b40f649dd06c4e9b5dc51ff0b47fba08899"
|
||||
},
|
||||
{
|
||||
"path": "docs/investmoz/simulations/source-archive/Lei-20-2009-BR36-AT-exemplar19.pdf",
|
||||
"sha256": "fc1c8144db42960cbf73e717e095896f511ece0f907f58f78819b27d6917a7ee"
|
||||
},
|
||||
{
|
||||
"path": "docs/investmoz/simulations/source-archive/Lei-22-2022-IVA-republicada-BR-250-2-suplemento.pdf",
|
||||
"sha256": "ea1b0dc6f5cf6e595f6d9a19e7042f398999e0087caef1785f6e8fac571b5f53"
|
||||
},
|
||||
{
|
||||
"path": "docs/investmoz/simulations/source-archive/Lei-34-2007-BR52.pdf",
|
||||
"sha256": "cdbef875ad7ccc1517b12faf5de0e893a70ed2ed81e33913cd6dc4a674474e6e"
|
||||
},
|
||||
{
|
||||
"path": "docs/investmoz/simulations/source-archive/Lei-4-1994-BR37-3-suplemento.pdf",
|
||||
"sha256": "210df9db8980d0a5690cd187a6eeec7e37a900d743e39062c16f4e0d12215c7e"
|
||||
},
|
||||
{
|
||||
"path": "docs/investmoz/simulations/source-archive/Lei-4-2012-BR3.pdf",
|
||||
"sha256": "b8845cef41dcbd9ba50c43dbfa743a56030dd3d348242a107e1ae30279eec121"
|
||||
},
|
||||
{
|
||||
"path": "docs/investmoz/simulations/source-archive/Lei-7-1991-Partidos-IFES.pdf",
|
||||
"sha256": "6b783a0bb3330688ef10660a58060d9724aa2da6a873d234fe902f0eaaeda42d"
|
||||
},
|
||||
{
|
||||
"path": "docs/investmoz/simulations/source-archive/PT-MZ-CDT-1992.pdf",
|
||||
"sha256": "d504e1024b28aee5c6acf4592acb96ec9c915a8414f67a61ab6984d6acf9df9d"
|
||||
},
|
||||
{
|
||||
"path": "docs/investmoz/simulations/source-archive/PT-MZ-Protocolo-2009.pdf",
|
||||
"sha256": "f353773dcf41f09f4daa6cf5ba5a5f7994f3e02615867c2dcffc61c3d901bf9b"
|
||||
}
|
||||
],
|
||||
"pipeline_checks": [
|
||||
"OK (1 test, 3106 assertions)",
|
||||
"built in 31.63s",
|
||||
"OK (59 tests, 317 assertions)",
|
||||
"# tests 942",
|
||||
"# pass 942",
|
||||
"# fail 0"
|
||||
],
|
||||
"accepted_QA_proofs": {
|
||||
"new_frontend_tests": 22,
|
||||
"private_API_tests": 1,
|
||||
"private_API_assertions": 83,
|
||||
"database": "127.0.0.1:55441/simulator_fiscal_delta_20261021_test;DatabaseTransactions rollback",
|
||||
"routes_actions": "generated by existing guarded procedure",
|
||||
"typescript": "passed",
|
||||
"build": "passed",
|
||||
"UI": "actual component;fieldediting;missingconditions;reviewed topic reconciliation;sharedcaps;local roundtrip;download;mandatory work method",
|
||||
"dossier": "generated from5 API recovered cases",
|
||||
"accepted_functional_suites": "reused,not manually repeated"
|
||||
},
|
||||
"accepted_proofs_reused": true,
|
||||
"manually_repeated_accepted_suites": false,
|
||||
"sequence": {
|
||||
"taxable_profit": "6730MZN simulated",
|
||||
"taxable_base": "4430MZN simulated",
|
||||
"normal_colecta": "1417.60MZN simulated,32%",
|
||||
"final_payable": null,
|
||||
"final_recoverable": null,
|
||||
"final_balance_scope": "L8"
|
||||
},
|
||||
"remaining_L6": [
|
||||
{
|
||||
"pending_case_or_mapping": "Combinação36h/i com36(4)",
|
||||
"resolution_condition": "Corresponder a regra de articulação dos trechos aplicáveis ou esclarecer comAT o exemplo combustível100/comprovado80/passageiro sem excepção;sem somar ou repartir correcções por presunção.",
|
||||
"blocking_scope": "Apenas o caso/campo dependente."
|
||||
},
|
||||
{
|
||||
"pending_case_or_mapping": "Quota36h automática e amortizações restantes",
|
||||
"resolution_condition": "Reconciliar tabela/método/entrada emuso/quotas contabilísticas e fiscais anteriores;prioridade seguinte deL6. A parcela36h documentada continua reutilizável nos casos independentes.",
|
||||
"blocking_scope": "Apenas o caso/campo dependente."
|
||||
},
|
||||
{
|
||||
"pending_case_or_mapping": "Campanhas plurianuais36-A e limite1%",
|
||||
"resolution_condition": "Implementar a periodização por três exercícios e a sua articulação com36n; não tratar a campanha como publicidade ordinária.",
|
||||
"blocking_scope": "Apenas o caso/campo dependente."
|
||||
},
|
||||
{
|
||||
"pending_case_or_mapping": "Provisões reguladas28d e reforços financeiros28(3)",
|
||||
"resolution_condition": "Corresponder a regra sectorial/supervisão ou o reforço financeiro e os saldos documentados; não usar os limites ordinários29 por aproximação.",
|
||||
"blocking_scope": "Apenas o caso/campo dependente."
|
||||
},
|
||||
{
|
||||
"pending_case_or_mapping": "Receita antecipada19(5) positiva e mudança autorizada19(6)",
|
||||
"resolution_condition": "Corresponder os custos futuros/receita antecipada e o transporte entre exercícios ou a autorização da mudança de método;os casos zero conhecido/método mantido permanecem executáveis.",
|
||||
"blocking_scope": "Apenas o caso/campo dependente."
|
||||
},
|
||||
{
|
||||
"pending_case_or_mapping": "Outras periodizações,âmbitos eM20/M22",
|
||||
"resolution_condition": "Tratar apenas os casos específicos18(6–10),períodos curtos/conversão anual,representação fiscal e campos ainda sem correspondência,com os parâmetros da edição/caso;divergência201/Q8 versus200/Q10 só afecta o transporte indicado.",
|
||||
"blocking_scope": "Apenas o caso/campo dependente."
|
||||
}
|
||||
],
|
||||
"matrix_row": "AUD-SIM-INT02",
|
||||
"L6_complete": false,
|
||||
"L7_L8_own_scopes": true,
|
||||
"documentary_divergence": "Only result transfer M20A.1 field201/Q8 versus PDFM22 field200/Q10;independent calculations and mapped fields remain available",
|
||||
"L5_ten_questions": "unchanged;only dependent cases blocked;no new research",
|
||||
"documentation_runtime_changed": false,
|
||||
"proof_files": {
|
||||
"backup.txt": "a40060e515e6f9a23962654ceca1384a8c4f3a9c0b5cb84a2510a892172023f5",
|
||||
"compact-dependencies.txt": "52b6b2b5abe937c37c975efa4c595eb0c38b5f23ea9d342786d859c63eb30ebf",
|
||||
"installed-protected.txt": "d10547839935cf162a2f335aafc6d0e274b1623338fbb3c51031c27ac7fde19c",
|
||||
"installed-public-delta.json": "00db424cb414c133adb85ae8bd1b3bfa7dc01b89b3bc055db71ab7b921651981",
|
||||
"installed-public.txt": "ab32725cb73e82888851b46ffc2111e23a839567ccfafca945e6ee2d72f967f0",
|
||||
"integration.txt": "cb09cb7139c730d7e178de518c4158347725009d4ccee9fc0252e8da7cd6bbc3",
|
||||
"manifest-served.json": "d91dd39d49e9e0251c76c811ca6a0798b7cf544e3e807735574ba51691afac9e",
|
||||
"operational-delta.txt": "8739d8f2cc58dd500e8fa393eb65ed15d24ba840e30f429e135d0ed8b49cd60f",
|
||||
"preflight.txt": "289577c3c3a959ec01405e5bc3d929a0b7be1654579b4bfd32f82ab20c3f22c2",
|
||||
"preparation.json": "603d3e4f9a40b91a717945160a11723ca3ddeb0e329af69179dba8276f0d4331",
|
||||
"remaining-section.md": "253d4d1de16bbfe6253971507c3a2e3976ea9ce017930d9ba80eef8c1191955e",
|
||||
"restore.txt": "bbdee061e3947b1e606c04ad17f83d5951cca0be0d33027a9e20be76121f38b7",
|
||||
"schema-permissions-after.txt": "76b5a4d8af11e4898a205062766cfb7ab6ec0783200e77e60a1927aa1ca18597",
|
||||
"schema-permissions-before.txt": "0ab7c964792acdd8917bce256c472e55e034b103500a58b49f020b5084823ed7",
|
||||
"status-final.txt": "04413dcbffc95e88abd7f5201b5709ee7a3b9856ccf0c5824d9a4d036ea6d3b4",
|
||||
"status1.txt": "177d1c66d844074ffb3db7b1392804f4de92ab804076671750362b9987a748e5",
|
||||
"status2.txt": "04413dcbffc95e88abd7f5201b5709ee7a3b9856ccf0c5824d9a4d036ea6d3b4"
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,869 @@
|
||||
{
|
||||
"status": "compatible_cost_limits_provisions_timing_QA_prepared_not_installed",
|
||||
"installed_baseline": "a2de725901c308fb2ac2bc3d72181ab50ef46b7a",
|
||||
"branch": "codex/irpc-l6-costs-provisions-timing-qa-20261026",
|
||||
"QA_workspace": "C:\\laragon\\www\\portal-investidor-irpc-l6-costs-qa-20261026",
|
||||
"version": "IRPC-normal-adjustments/6",
|
||||
"scope": "AnnualMZN periods ending2026,ordinary documented cost/provision categories and prior-year/work timing;normal profit/base/colecta only;L7/L8 remain own scopes.",
|
||||
"demonstrated_sequence": {
|
||||
"accounting_profit": "6240MZN unchanged",
|
||||
"previous_addbacks": "220MZN",
|
||||
"previous_schedule_effect": "520MZN",
|
||||
"new_cost_provision_prior_timing_adjustments": "350MZN",
|
||||
"new_work_adjustment": "-600MZN",
|
||||
"taxable_profit": "6730MZN",
|
||||
"previous_loss_deduction": "2300MZN explicit,unchanged",
|
||||
"taxable_base": "4430MZN",
|
||||
"rate": "32%",
|
||||
"colecta": "1417.60MZN",
|
||||
"final_payable": null,
|
||||
"final_recoverable": null,
|
||||
"final_balance_scope": "L8"
|
||||
},
|
||||
"cases_recovered_by_private_API": {
|
||||
"calculated": {
|
||||
"profit": {
|
||||
"numerator": "6730",
|
||||
"denominator": "1"
|
||||
},
|
||||
"base": {
|
||||
"numerator": "4430",
|
||||
"denominator": "1"
|
||||
},
|
||||
"colecta": {
|
||||
"numerator": "7088",
|
||||
"denominator": "5"
|
||||
},
|
||||
"cost_effect": {
|
||||
"numerator": "-250",
|
||||
"denominator": "1"
|
||||
},
|
||||
"pending": [],
|
||||
"payable": null,
|
||||
"recoverable": null
|
||||
},
|
||||
"missing": {
|
||||
"profit": null,
|
||||
"base": null,
|
||||
"colecta": null,
|
||||
"cost_effect": {
|
||||
"numerator": "-400",
|
||||
"denominator": "1"
|
||||
},
|
||||
"pending": [
|
||||
"QA-credit: Provisão fiscal anterior dos créditos em falta; não presumir zero."
|
||||
],
|
||||
"payable": null,
|
||||
"recoverable": null
|
||||
},
|
||||
"additional": {
|
||||
"profit": {
|
||||
"numerator": "7050",
|
||||
"denominator": "1"
|
||||
},
|
||||
"base": {
|
||||
"numerator": "4750",
|
||||
"denominator": "1"
|
||||
},
|
||||
"colecta": {
|
||||
"numerator": "1520",
|
||||
"denominator": "1"
|
||||
},
|
||||
"cost_effect": {
|
||||
"numerator": "70",
|
||||
"denominator": "1"
|
||||
},
|
||||
"pending": [],
|
||||
"payable": null,
|
||||
"recoverable": null
|
||||
},
|
||||
"limits": {
|
||||
"profit": {
|
||||
"numerator": "7210",
|
||||
"denominator": "1"
|
||||
},
|
||||
"base": {
|
||||
"numerator": "4910",
|
||||
"denominator": "1"
|
||||
},
|
||||
"colecta": {
|
||||
"numerator": "7856",
|
||||
"denominator": "5"
|
||||
},
|
||||
"cost_effect": {
|
||||
"numerator": "230",
|
||||
"denominator": "1"
|
||||
},
|
||||
"pending": [],
|
||||
"payable": null,
|
||||
"recoverable": null
|
||||
},
|
||||
"closing": {
|
||||
"profit": {
|
||||
"numerator": "6530",
|
||||
"denominator": "1"
|
||||
},
|
||||
"base": {
|
||||
"numerator": "4230",
|
||||
"denominator": "1"
|
||||
},
|
||||
"colecta": {
|
||||
"numerator": "6768",
|
||||
"denominator": "5"
|
||||
},
|
||||
"cost_effect": {
|
||||
"numerator": "-450",
|
||||
"denominator": "1"
|
||||
},
|
||||
"pending": [],
|
||||
"payable": null,
|
||||
"recoverable": null
|
||||
}
|
||||
},
|
||||
"categories_demonstrated": {
|
||||
"allowance": {
|
||||
"case": "calculated",
|
||||
"source_amount": {
|
||||
"numerator": "100",
|
||||
"denominator": "1"
|
||||
},
|
||||
"accepted": {
|
||||
"numerator": "70",
|
||||
"denominator": "1"
|
||||
},
|
||||
"adjustment": {
|
||||
"numerator": "30",
|
||||
"denominator": "1"
|
||||
},
|
||||
"limit": {
|
||||
"numerator": "30",
|
||||
"denominator": "1"
|
||||
},
|
||||
"rule_source": "CIRPC36(1)e",
|
||||
"reason": "50% só da parcela não facturada a clientes nem tributada emIRPS; parcelas mutuamente exclusivas."
|
||||
},
|
||||
"representation": {
|
||||
"case": "calculated",
|
||||
"source_amount": {
|
||||
"numerator": "50",
|
||||
"denominator": "1"
|
||||
},
|
||||
"accepted": {
|
||||
"numerator": "10",
|
||||
"denominator": "1"
|
||||
},
|
||||
"adjustment": {
|
||||
"numerator": "40",
|
||||
"denominator": "1"
|
||||
},
|
||||
"limit": null,
|
||||
"rule_source": "CIRPC36(1)f/36(3)",
|
||||
"reason": "20% aceite;80% acrescido. Eventual tributação autónoma não calculada, âmbitoL7."
|
||||
},
|
||||
"advertising": {
|
||||
"case": "calculated",
|
||||
"source_amount": {
|
||||
"numerator": "80",
|
||||
"denominator": "1"
|
||||
},
|
||||
"accepted": {
|
||||
"numerator": "80",
|
||||
"denominator": "1"
|
||||
},
|
||||
"adjustment": {
|
||||
"numerator": "0",
|
||||
"denominator": "1"
|
||||
},
|
||||
"limit": {
|
||||
"numerator": "120",
|
||||
"denominator": "1"
|
||||
},
|
||||
"rule_source": "CIRPC36(1)n,Lei20/2009",
|
||||
"reason": "Limite único anual1% das vendas normais; repartição aritmética proporcional entre parcelas para a simulação, sem ordem fiscal obrigatória."
|
||||
},
|
||||
"credit": {
|
||||
"case": "calculated",
|
||||
"source_amount": {
|
||||
"numerator": "200",
|
||||
"denominator": "1"
|
||||
},
|
||||
"accepted": {
|
||||
"numerator": "50",
|
||||
"denominator": "1"
|
||||
},
|
||||
"adjustment": {
|
||||
"numerator": "150",
|
||||
"denominator": "1"
|
||||
},
|
||||
"limit": {
|
||||
"numerator": "50",
|
||||
"denominator": "1"
|
||||
},
|
||||
"rule_source": "CIRPC28(1)a/29",
|
||||
"reason": "29:1,5% anual,6% acumulado sobre créditos da actividade normal existentes no fim; saldo fiscal anterior conhecido. Repartição proporcional do limite único, sem consumir saldo oficial."
|
||||
},
|
||||
"stock": {
|
||||
"case": "calculated",
|
||||
"source_amount": {
|
||||
"numerator": "60",
|
||||
"denominator": "1"
|
||||
},
|
||||
"accepted": {
|
||||
"numerator": "30",
|
||||
"denominator": "1"
|
||||
},
|
||||
"adjustment": {
|
||||
"numerator": "30",
|
||||
"denominator": "1"
|
||||
},
|
||||
"limit": {
|
||||
"numerator": "40",
|
||||
"denominator": "1"
|
||||
},
|
||||
"rule_source": "CIRPC28(1)b",
|
||||
"reason": "28b:limite das perdas efectivamente observadas, incluindo saldo anterior."
|
||||
},
|
||||
"litigation": {
|
||||
"case": "calculated",
|
||||
"source_amount": {
|
||||
"numerator": "90",
|
||||
"denominator": "1"
|
||||
},
|
||||
"accepted": {
|
||||
"numerator": "80",
|
||||
"denominator": "1"
|
||||
},
|
||||
"adjustment": {
|
||||
"numerator": "10",
|
||||
"denominator": "1"
|
||||
},
|
||||
"limit": {
|
||||
"numerator": "100",
|
||||
"denominator": "1"
|
||||
},
|
||||
"rule_source": "CIRPC28(1)c",
|
||||
"reason": "28c:obrigações de processo judicial em curso que seriam custos dedutíveis, com saldo anterior reconciliado."
|
||||
},
|
||||
"fuel": {
|
||||
"case": "calculated",
|
||||
"source_amount": {
|
||||
"numerator": "50",
|
||||
"denominator": "1"
|
||||
},
|
||||
"accepted": {
|
||||
"numerator": "40",
|
||||
"denominator": "1"
|
||||
},
|
||||
"adjustment": {
|
||||
"numerator": "10",
|
||||
"denominator": "1"
|
||||
},
|
||||
"limit": null,
|
||||
"rule_source": "CIRPC36(1)i/36(4)",
|
||||
"reason": "36i: parcela ligada a activo próprio/locado e consumo normal comprovados."
|
||||
},
|
||||
"prior_cost": {
|
||||
"case": "calculated",
|
||||
"source_amount": {
|
||||
"numerator": "80",
|
||||
"denominator": "1"
|
||||
},
|
||||
"accepted": {
|
||||
"numerator": "0",
|
||||
"denominator": "1"
|
||||
},
|
||||
"adjustment": {
|
||||
"numerator": "80",
|
||||
"denominator": "1"
|
||||
},
|
||||
"limit": null,
|
||||
"rule_source": "CIRPC18(2)",
|
||||
"reason": "18(2):conhecido/previsível no encerramento anterior; excluído do actual, sem alterar declarações/históricos anteriores."
|
||||
},
|
||||
"work": {
|
||||
"case": "calculated",
|
||||
"source_amount": {
|
||||
"numerator": "1000",
|
||||
"denominator": "1"
|
||||
},
|
||||
"accepted": {
|
||||
"numerator": "200",
|
||||
"denominator": "1"
|
||||
},
|
||||
"adjustment": {
|
||||
"numerator": "-600",
|
||||
"denominator": "1"
|
||||
},
|
||||
"limit": {
|
||||
"numerator": "400",
|
||||
"denominator": "1"
|
||||
},
|
||||
"rule_source": "CIRPC19(1–6)",
|
||||
"reason": "19:grau=incorrido/custo total;valores fiscais do exercício obtidos dos acumulados menos o já reconhecido. Proveito fiscal corrente:400.00 MZN;custo fiscal corrente:200.00 MZN;sem imposto/pagamento ou perda estimada presumidos."
|
||||
},
|
||||
"vehicle": {
|
||||
"case": "additional",
|
||||
"source_amount": {
|
||||
"numerator": "100",
|
||||
"denominator": "1"
|
||||
},
|
||||
"accepted": {
|
||||
"numerator": "50",
|
||||
"denominator": "1"
|
||||
},
|
||||
"adjustment": {
|
||||
"numerator": "50",
|
||||
"denominator": "1"
|
||||
},
|
||||
"limit": null,
|
||||
"rule_source": "CIRPC36(4)",
|
||||
"reason": "50% dos outros encargos de passageiros, excepto serviço público de transportes/locação na actividade normal; não inclui quotas, aluguer sem condutor ou combustível já discriminados."
|
||||
},
|
||||
"rental": {
|
||||
"case": "additional",
|
||||
"source_amount": {
|
||||
"numerator": "100",
|
||||
"denominator": "1"
|
||||
},
|
||||
"accepted": {
|
||||
"numerator": "80",
|
||||
"denominator": "1"
|
||||
},
|
||||
"adjustment": {
|
||||
"numerator": "20",
|
||||
"denominator": "1"
|
||||
},
|
||||
"limit": null,
|
||||
"rule_source": "CIRPC36(1)h/36(4)",
|
||||
"reason": "36h: reutiliza parcela de quota não aceite documentada; o portal não apura automaticamente essa quota de viatura."
|
||||
},
|
||||
"estimated_work_loss": {
|
||||
"case": "additional",
|
||||
"source_amount": {
|
||||
"numerator": "50",
|
||||
"denominator": "1"
|
||||
},
|
||||
"accepted": {
|
||||
"numerator": "0",
|
||||
"denominator": "1"
|
||||
},
|
||||
"adjustment": {
|
||||
"numerator": "50",
|
||||
"denominator": "1"
|
||||
},
|
||||
"limit": null,
|
||||
"rule_source": "CIRPC36(1)m,Lei20/2009",
|
||||
"reason": "36m:perda meramente estimada em obra em curso não dedutível; custo efectivo não confundido com estimativa."
|
||||
},
|
||||
"provision_reversal": {
|
||||
"case": "additional",
|
||||
"source_amount": {
|
||||
"numerator": "50",
|
||||
"denominator": "1"
|
||||
},
|
||||
"accepted": {
|
||||
"numerator": "50",
|
||||
"denominator": "1"
|
||||
},
|
||||
"adjustment": {
|
||||
"numerator": "50",
|
||||
"denominator": "1"
|
||||
},
|
||||
"limit": null,
|
||||
"rule_source": "CIRPC28(2)",
|
||||
"reason": "28(2):proveito da provisão antes deduzida; só acresce quando ainda não incluído no resultado."
|
||||
},
|
||||
"taxed_reversal": {
|
||||
"case": "additional",
|
||||
"source_amount": {
|
||||
"numerator": "50",
|
||||
"denominator": "1"
|
||||
},
|
||||
"accepted": {
|
||||
"numerator": "50",
|
||||
"denominator": "1"
|
||||
},
|
||||
"adjustment": {
|
||||
"numerator": "-50",
|
||||
"denominator": "1"
|
||||
},
|
||||
"limit": null,
|
||||
"rule_source": "CIRPC17/28;sem dupla tributação da parcela comprovada",
|
||||
"reason": "Parcela antes tributada comprovada; exclui a reversão contabilística sem duplicar dedução."
|
||||
},
|
||||
"prior_income": {
|
||||
"case": "additional",
|
||||
"source_amount": {
|
||||
"numerator": "50",
|
||||
"denominator": "1"
|
||||
},
|
||||
"accepted": {
|
||||
"numerator": "0",
|
||||
"denominator": "1"
|
||||
},
|
||||
"adjustment": {
|
||||
"numerator": "-50",
|
||||
"denominator": "1"
|
||||
},
|
||||
"limit": null,
|
||||
"rule_source": "CIRPC18(2)",
|
||||
"reason": "18(2):conhecido/previsível no encerramento anterior; excluído do actual, sem alterar declarações/históricos anteriores."
|
||||
}
|
||||
},
|
||||
"verification": {
|
||||
"new_frontend_tests": 22,
|
||||
"private_API_tests": 1,
|
||||
"private_API_assertions": 83,
|
||||
"database": "127.0.0.1:55441/simulator_fiscal_delta_20261021_test;DatabaseTransactions rollback",
|
||||
"routes_actions": "generated by existing guarded procedure",
|
||||
"typescript": "passed",
|
||||
"build": "passed",
|
||||
"UI": "actual component;fieldediting;missingconditions;reviewed topic reconciliation;sharedcaps;local roundtrip;download;mandatory work method",
|
||||
"dossier": "generated from5 API recovered cases",
|
||||
"accepted_functional_suites": "reused,not manually repeated"
|
||||
},
|
||||
"preservation": {
|
||||
"installed5_fixture_sha256": "109426b86ae7c14463699b1d197064617f124ecec0c55085d9e81aeddc505a5a",
|
||||
"matches_accepted5_fixture": true,
|
||||
"versions1_to5_current_keys": "unchanged without optional costs input",
|
||||
"history": "old record preserved unchanged on new calculation;no rewriting prior returns",
|
||||
"other_books": "preserved in snapshot roundtrip",
|
||||
"source_plan": "reused,no re-entry of financial result/base/colecta",
|
||||
"schema_API_config_permissions_dependencies_changed": false,
|
||||
"active_data_changed": false,
|
||||
"official_fiscal_balances_consumed": false,
|
||||
"fractional_precision_delta": "Exact numerator comparison for current loss and loss-deduction cap;negative subcent result cannot be truncated to zero"
|
||||
},
|
||||
"runtime_delta_joint_from_a2de7259": [
|
||||
{
|
||||
"path": "resources/js/components/simulation-irpc-costs.tsx",
|
||||
"sha256_LF": "c4156916835daf0f33addf89dfedd40c31b8dc3297112cd98beac33422af274d"
|
||||
},
|
||||
{
|
||||
"path": "resources/js/components/simulation-irpc-normal.tsx",
|
||||
"sha256_LF": "8001d2e71b58fa07c77f74da2c2b51566659a5d784d9e044133192c66518cb15"
|
||||
},
|
||||
{
|
||||
"path": "resources/js/lib/irpc-normal-base.ts",
|
||||
"sha256_LF": "fef34966db603633eb03c9830ad3c09e7cd0ffaed49720dbab60f9dc0fd8a8fb"
|
||||
},
|
||||
{
|
||||
"path": "resources/js/lib/irpc-normal-costs.ts",
|
||||
"sha256_LF": "29aeb16bf8fe60bb322b5449fb3efd84b5108b06112b91be5fc76d8e897d8860"
|
||||
},
|
||||
{
|
||||
"path": "resources/js/lib/irpc-normal-profit.ts",
|
||||
"sha256_LF": "26810caea4e7d177b385e36452147d84602a7b23cb5f8f23a88488d1bfaf619f"
|
||||
},
|
||||
{
|
||||
"path": "resources/js/lib/irpc-normal.ts",
|
||||
"sha256_LF": "98adf3e1c84938d27535f65afa24edc0650bfb12a1f9b32352b0d4d71c2c2035"
|
||||
}
|
||||
],
|
||||
"protected_runtime": [
|
||||
{
|
||||
"path": "resources/js/components/simulation-irpc-schedules.tsx",
|
||||
"sha256_LF": "eebd6d9e4100920a5ebf91b800537ffe301fd6a994b86a3b080d673f4a9c9a42"
|
||||
},
|
||||
{
|
||||
"path": "resources/js/lib/irpc-normal-assessment.ts",
|
||||
"sha256_LF": "1dc6adc0835af033ef296d12cdc1e9ef354b2f54cd36e2349b2df66e369c1ee3"
|
||||
},
|
||||
{
|
||||
"path": "resources/js/lib/irpc-normal-forms.ts",
|
||||
"sha256_LF": "4e986addb9f2d74e7a80345f8f1e4d8e0b2f562c867fa6eee84880d9f72a3649"
|
||||
},
|
||||
{
|
||||
"path": "resources/js/lib/irpc-normal-schedules.ts",
|
||||
"sha256_LF": "b0045fd2c072998ebb290c2a8332c26d05a1f5f746b3beb1805508147497cac8"
|
||||
},
|
||||
{
|
||||
"path": "resources/js/components/simulation-irpc-taxable-base.tsx",
|
||||
"sha256_LF": "e4fe9f66d35d24aa68fd87de6a5a6a0e901706b270c18962fd0c7ab00f9abd93"
|
||||
},
|
||||
{
|
||||
"path": "resources/js/components/simulation-irpc-assessment.tsx",
|
||||
"sha256_LF": "7174cc0160005a0c332ea40f02ba8a6d57985081b5ab45177ccd6e721bceea54"
|
||||
},
|
||||
{
|
||||
"path": "resources/js/components/acquisition-beverage-restitution.tsx",
|
||||
"sha256_LF": "6f44897b8b12569314551df0022c26da57a165634087942a724293e66837558d"
|
||||
},
|
||||
{
|
||||
"path": "resources/js/components/fiscal-calculation-gaps.tsx",
|
||||
"sha256_LF": "1dab6ceb73756d4e023096b3b2ba767aaa843ff6cc69046ea630ab449a00b0dd"
|
||||
},
|
||||
{
|
||||
"path": "resources/js/components/fiscal-l3-preparation.tsx",
|
||||
"sha256_LF": "e84a7b1ccadaa1b5bd78d778a3287f96ccaf530855eef404786cd7aa3d321b73"
|
||||
},
|
||||
{
|
||||
"path": "resources/js/components/simulation-acquisitions.tsx",
|
||||
"sha256_LF": "c206d4cfe575d6ba007aa2b425b5f898efa97e4162b8710e358b6ecfd9458542"
|
||||
},
|
||||
{
|
||||
"path": "resources/js/components/simulation-operations.tsx",
|
||||
"sha256_LF": "a7e55972fa790063dcf11945055de2af46a77db9e509900af22ede7ec47bb4cf"
|
||||
},
|
||||
{
|
||||
"path": "resources/js/lib/iva-acquisition-bc.ts",
|
||||
"sha256_LF": "b0ef55e0917bdb79f14b53ba9e95d73c08153befeb7d4ce73f81e6fb13992225"
|
||||
},
|
||||
{
|
||||
"path": "resources/js/lib/iva-beverage-allocation.ts",
|
||||
"sha256_LF": "32968d198c7fe0c53ca89641c22d5749be6636be2c79127b867e4e3afd0dd40d"
|
||||
},
|
||||
{
|
||||
"path": "resources/js/lib/iva-beverage-restitution.ts",
|
||||
"sha256_LF": "5c650cbd9469d5f99001f56fc4ff99ac973eb368036d4e96c6d171f1b220bd9e"
|
||||
},
|
||||
{
|
||||
"path": "resources/js/lib/iva-calculation-gaps.ts",
|
||||
"sha256_LF": "2e7d84a0c196bd5b56fd67cc1a389d43d5041894184e675680a4de3cd10b31a2"
|
||||
},
|
||||
{
|
||||
"path": "resources/js/lib/iva-operations.ts",
|
||||
"sha256_LF": "ec37b949f1233c5f5c14a87450c421ed29fabf1ed5b73fb32564564a2bc31f54"
|
||||
},
|
||||
{
|
||||
"path": "resources/js/lib/l3-form-preparation.ts",
|
||||
"sha256_LF": "fc47f5fa5ec1420fbd847d0d081f00d99ebbb524164eef785b20877e0562f704"
|
||||
},
|
||||
{
|
||||
"path": "resources/js/lib/ispc-residuals.ts",
|
||||
"sha256_LF": "40d5751c06c7c155ab4b7a17ee2d1653da2fbbf075807fbb8561cdbe19820955"
|
||||
},
|
||||
{
|
||||
"path": "resources/js/components/simulation-ispc-residuals.tsx",
|
||||
"sha256_LF": "a9219d6f41ccbd0ce45659d4f6aa0fa1c169a685840f5cb1e18daeca377d5e18"
|
||||
},
|
||||
{
|
||||
"path": "resources/js/lib/ispc-eligibility.ts",
|
||||
"sha256_LF": "44675c5efacdc1ae19505667611ba3b522d3043cebacc8754597c3a68ca89d25"
|
||||
},
|
||||
{
|
||||
"path": "resources/js/components/simulation-ispc-quarter.tsx",
|
||||
"sha256_LF": "2c2555309b32d4261f14e7164f39314c9188129c2990357fc54090a2468dd2b4"
|
||||
},
|
||||
{
|
||||
"path": "resources/js/components/simulation-ispc-withholding.tsx",
|
||||
"sha256_LF": "e0445d015b72859e48726959aa52686f79b1cf5c2ade29751efa83257068b878"
|
||||
},
|
||||
{
|
||||
"path": "resources/js/lib/ispc-quarter.ts",
|
||||
"sha256_LF": "f66bd52e9cdfe1ddaa6b00a931465862b3d890b9be216b7a056740f027f24129"
|
||||
},
|
||||
{
|
||||
"path": "resources/js/lib/ispc-withholding.ts",
|
||||
"sha256_LF": "6c31b240299edd3262efa28f7f3d5aee21123f94e30ef4ab90e26c35777cb6e4"
|
||||
},
|
||||
{
|
||||
"path": "resources/js/components/simulation-ispc-eligibility.tsx",
|
||||
"sha256_LF": "f48dd4a8f87a994eda0447f81a463589905e5873b2e1044debac9d10825a880c"
|
||||
},
|
||||
{
|
||||
"path": "resources/js/lib/iva-acquisitions.ts",
|
||||
"sha256_LF": "cce283b1d0a07fb383fcb527225f4dd5bec829010a662cbaae1d60e595221977"
|
||||
},
|
||||
{
|
||||
"path": "resources/js/lib/iva-modelo-a.ts",
|
||||
"sha256_LF": "c641619a05613c1620385baad0e9ffbf810dd970aafb30e12b3a7f9a3bf11846"
|
||||
},
|
||||
{
|
||||
"path": "resources/js/lib/iva-fx-selection.ts",
|
||||
"sha256_LF": "9aa07ad443bc777b80510a3b5bd6aff9ddb9814d2450f3c690e531e74d71d998"
|
||||
},
|
||||
{
|
||||
"path": "resources/js/components/simulation-fx-selection.tsx",
|
||||
"sha256_LF": "39bb6d87d404745b0b66349bc11626545a3672ae27321ce9b4658416592059bf"
|
||||
},
|
||||
{
|
||||
"path": "resources/js/lib/business-financial-plan.ts",
|
||||
"sha256_LF": "c20274722d1ffcd0360f041a6cacb5d868fe0621cb27a1aca6e06826612c3ebb"
|
||||
},
|
||||
{
|
||||
"path": "resources/js/lib/iva-currency-events.ts",
|
||||
"sha256_LF": "cc9f2045d302d7987310da4006cc250fc5c99a27397918d166d649bfc32fab08"
|
||||
},
|
||||
{
|
||||
"path": "resources/js/lib/irpc-fx.ts",
|
||||
"sha256_LF": "5c4a7a477429f8d775acf6db3e117008468f5554e5731dec81f60fbb75e948fb"
|
||||
},
|
||||
{
|
||||
"path": "resources/js/lib/irpc-withholdings.ts",
|
||||
"sha256_LF": "8e5f3c035ce5e4d6c3fc82f933439ab580fa5519492f9c4d32cfb71b77b54803"
|
||||
},
|
||||
{
|
||||
"path": "resources/js/components/simulation-irpc-withholdings.tsx",
|
||||
"sha256_LF": "751af4fab346659bc5ccb08b8a2169769af7521ea0035050af32b41ea7f5aa76"
|
||||
},
|
||||
{
|
||||
"path": "resources/js/lib/irpc-interest.ts",
|
||||
"sha256_LF": "f8e6390b3b2c58c296f7e3fd14576e06ae248bc0cabce1a666b7094611f2a7dd"
|
||||
},
|
||||
{
|
||||
"path": "resources/js/lib/irpc-mrfta.ts",
|
||||
"sha256_LF": "76dcce8954f68b081d500be61de9c5b146a452a3eb578a0b78776ba9e1f8051c"
|
||||
},
|
||||
{
|
||||
"path": "resources/js/lib/irpc-mrfta-cases.ts",
|
||||
"sha256_LF": "4266746076ab3f70312fd042351e24dd2f136c4f3e8a277b57dd97849a9f1862"
|
||||
},
|
||||
{
|
||||
"path": "resources/js/components/simulation-irpc-mrfta.tsx",
|
||||
"sha256_LF": "913d1bb4ac0fc59763cf5d27bc637f6a713b2050c4463748db554af4be451538"
|
||||
},
|
||||
{
|
||||
"path": "resources/js/lib/financial-fiscal-bridge.ts",
|
||||
"sha256_LF": "5a30c501653b16b5fedcb12631ce81fcce4fe473aa542e94374986b3c50f2d33"
|
||||
},
|
||||
{
|
||||
"path": "resources/js/components/simulation-form.tsx",
|
||||
"sha256_LF": "85b024a7f45ceb52efd6ff1f21d0eab1fd8fcf1ab59e4b5302c08685235c472a"
|
||||
},
|
||||
{
|
||||
"path": "resources/js/lib/project-dossier.ts",
|
||||
"sha256_LF": "a0909bbfcdf7e8542b010faa104fcb918e86ae38ddf096082d4d5be98d31b2b9"
|
||||
},
|
||||
{
|
||||
"path": "resources/js/lib/project-dossier-report.ts",
|
||||
"sha256_LF": "5207a2ffeb208cd5ace6713038cee85208020ee618194dca7114e94fc3200b6c"
|
||||
}
|
||||
],
|
||||
"originals_preserved": [
|
||||
{
|
||||
"path": "docs/investmoz/simulations/source-archive/AT-Comunicado-9-2026-ISPC.pdf",
|
||||
"sha256": "106f8a9ce9255c03549c70bf07fe999d32e6e55302d009b509862aa74ccb4973"
|
||||
},
|
||||
{
|
||||
"path": "docs/investmoz/simulations/source-archive/AT-Modelo-30-ISPC.pdf",
|
||||
"sha256": "6802edd06b6ff638a0b851a3ec7ecf69af8f07840faa47446becad67d35d445c"
|
||||
},
|
||||
{
|
||||
"path": "docs/investmoz/simulations/source-archive/AT-Modelo-B-Geral.pdf",
|
||||
"sha256": "bd977c7c59d4d98befd92e2c566b1bf168cb1343bb519f51b41a3807f431fc57"
|
||||
},
|
||||
{
|
||||
"path": "docs/investmoz/simulations/source-archive/AT-MRFTA-19-39.pdf",
|
||||
"sha256": "8ea62c53066b482f87078a7a7b1ecf15ca98a12a122e8d7abca63acfc993186b"
|
||||
},
|
||||
{
|
||||
"path": "docs/investmoz/simulations/source-archive/BM-Mercado-Monetario-MAIBOR-20261025.html",
|
||||
"sha256": "00e8a7e0d3a1db4ca3beb56d5361b2084a0f1684f3d40fc1c203702a2190e063"
|
||||
},
|
||||
{
|
||||
"path": "docs/investmoz/simulations/source-archive/BR-16-I-Serie-2008-04-16.pdf",
|
||||
"sha256": "fc373ff5637edf75ec6a9595dec8763a8503d4ee786e3b7d8f1c742eae9d80ee"
|
||||
},
|
||||
{
|
||||
"path": "docs/investmoz/simulations/source-archive/BR-248-I-Suplemento-1-2025.pdf",
|
||||
"sha256": "ccf2a8deeca820f2dd076b4b2141b1efe3f6a806568c3a587ca59a8e92f4c251"
|
||||
},
|
||||
{
|
||||
"path": "docs/investmoz/simulations/source-archive/BR-89-I-Serie-2017-06-08.pdf",
|
||||
"sha256": "11f0cab15eb6e51010952203ffa24fdc533a24fd642e19525fe4f46b17a1f5e5"
|
||||
},
|
||||
{
|
||||
"path": "docs/investmoz/simulations/source-archive/BR-95-I-Suplemento-2025-05-21.pdf",
|
||||
"sha256": "e0e682e2c027c3cd9c1d46a73a3f48bc5f6bdbf05667fd97314d7a3f6a456358"
|
||||
},
|
||||
{
|
||||
"path": "docs/investmoz/simulations/source-archive/BR252-I-Serie-2022-Lei20-PESOE.pdf",
|
||||
"sha256": "1159fd3ce1ba5581671796d083534da48bd3c5578298819e896f1c2a8026318d"
|
||||
},
|
||||
{
|
||||
"path": "docs/investmoz/simulations/source-archive/Decreto-22-2021-BR70.pdf",
|
||||
"sha256": "a8fac38dcfe08f9c7a8e46254cff10e1ec82fc4f7a8d88ad6e4fe7d91ffc21a5"
|
||||
},
|
||||
{
|
||||
"path": "docs/investmoz/simulations/source-archive/Decreto-27-2026-BR123.pdf",
|
||||
"sha256": "26249c3fa58f149c81de36e99d1aac2819a4771379d9e8833159660dabf539bb"
|
||||
},
|
||||
{
|
||||
"path": "docs/investmoz/simulations/source-archive/Decreto-29-1998-BR22-5-suplemento.pdf",
|
||||
"sha256": "6242cbe675faadf085f43f95ec8c7e8868aafe67c3b2ab2bb010992288f954f8"
|
||||
},
|
||||
{
|
||||
"path": "docs/investmoz/simulations/source-archive/Decreto-3-2011-BR-11-I-mineiros.pdf",
|
||||
"sha256": "5bca1133666ba9c69870b89823420175b7b5b8d0eccb667ecdf5c29716f3b6be"
|
||||
},
|
||||
{
|
||||
"path": "docs/investmoz/simulations/source-archive/Decreto-37-2023-BR124.pdf",
|
||||
"sha256": "7e680b191481faa0e2e9057fa5053587eb2a29d1d8c819e0eb9f02814255a04c"
|
||||
},
|
||||
{
|
||||
"path": "docs/investmoz/simulations/source-archive/Decreto-9-2008-BR16.pdf",
|
||||
"sha256": "96fccdecbfdc11c9eafb90fbc6c7bc259f88bbd4c7507d1ac3af1fa03f960697"
|
||||
},
|
||||
{
|
||||
"path": "docs/investmoz/simulations/source-archive/Lei-13-2016-CIVA-BR-156-10-suplemento.pdf",
|
||||
"sha256": "b90dc7c14ecea2e378c4a62e8e5a47d54a5644c457baeb8b8053b92fd2a5710b"
|
||||
},
|
||||
{
|
||||
"path": "docs/investmoz/simulations/source-archive/Lei-14-1992-BR42.pdf",
|
||||
"sha256": "089fff7423e99a70a230a73ca379e4ea3a91d124703f91016e57ff82794b9e56"
|
||||
},
|
||||
{
|
||||
"path": "docs/investmoz/simulations/source-archive/Lei-17-2022-BR251-exemplar-MCNet5.pdf",
|
||||
"sha256": "14eb34f0af91a8f5cb1770c7b52d6ff839c6818302d1ed96d79afbfb9fe999d4"
|
||||
},
|
||||
{
|
||||
"path": "docs/investmoz/simulations/source-archive/Lei-17-2022-IPP-BR250-Parlamento.pdf",
|
||||
"sha256": "978cd22403ffd336a631704ecd7a5bbd814a427c815b9acdaca5515591dd9e2a"
|
||||
},
|
||||
{
|
||||
"path": "docs/investmoz/simulations/source-archive/Lei-19-2013-BR76.pdf",
|
||||
"sha256": "bba96d645cc935ffc3d1a79b9f0f73ac1c693d6459c2ad41f56cd2841accae76"
|
||||
},
|
||||
{
|
||||
"path": "docs/investmoz/simulations/source-archive/Lei-19-2017-IRPS-BR-OCAM.pdf",
|
||||
"sha256": "c3a0186cb9ad090d7a9533006295dc9bb6a62ad0d6150173cbd49dba4ee4b52d"
|
||||
},
|
||||
{
|
||||
"path": "docs/investmoz/simulations/source-archive/Lei-2-2011-BR-1-4-suplemento-MCNet.pdf",
|
||||
"sha256": "a7543a68cc3287a46a83c39a04821b40f649dd06c4e9b5dc51ff0b47fba08899"
|
||||
},
|
||||
{
|
||||
"path": "docs/investmoz/simulations/source-archive/Lei-20-2009-BR36-AT-exemplar19.pdf",
|
||||
"sha256": "fc1c8144db42960cbf73e717e095896f511ece0f907f58f78819b27d6917a7ee"
|
||||
},
|
||||
{
|
||||
"path": "docs/investmoz/simulations/source-archive/Lei-22-2022-IVA-republicada-BR-250-2-suplemento.pdf",
|
||||
"sha256": "ea1b0dc6f5cf6e595f6d9a19e7042f398999e0087caef1785f6e8fac571b5f53"
|
||||
},
|
||||
{
|
||||
"path": "docs/investmoz/simulations/source-archive/Lei-34-2007-BR52.pdf",
|
||||
"sha256": "cdbef875ad7ccc1517b12faf5de0e893a70ed2ed81e33913cd6dc4a674474e6e"
|
||||
},
|
||||
{
|
||||
"path": "docs/investmoz/simulations/source-archive/Lei-4-1994-BR37-3-suplemento.pdf",
|
||||
"sha256": "210df9db8980d0a5690cd187a6eeec7e37a900d743e39062c16f4e0d12215c7e"
|
||||
},
|
||||
{
|
||||
"path": "docs/investmoz/simulations/source-archive/Lei-4-2012-BR3.pdf",
|
||||
"sha256": "b8845cef41dcbd9ba50c43dbfa743a56030dd3d348242a107e1ae30279eec121"
|
||||
},
|
||||
{
|
||||
"path": "docs/investmoz/simulations/source-archive/Lei-7-1991-Partidos-IFES.pdf",
|
||||
"sha256": "6b783a0bb3330688ef10660a58060d9724aa2da6a873d234fe902f0eaaeda42d"
|
||||
},
|
||||
{
|
||||
"path": "docs/investmoz/simulations/source-archive/PT-MZ-CDT-1992.pdf",
|
||||
"sha256": "d504e1024b28aee5c6acf4592acb96ec9c915a8414f67a61ab6984d6acf9df9d"
|
||||
},
|
||||
{
|
||||
"path": "docs/investmoz/simulations/source-archive/PT-MZ-Protocolo-2009.pdf",
|
||||
"sha256": "f353773dcf41f09f4daa6cf5ba5a5f7994f3e02615867c2dcffc61c3d901bf9b"
|
||||
}
|
||||
],
|
||||
"source_evidence": [
|
||||
{
|
||||
"path": "docs/investmoz/simulations/source-archive/Lei-34-2007-BR52.pdf",
|
||||
"new_clauses": "18(2)/19 PDF6–7;28/29 PDF8–9;36e/f/h/i/4 PDF10–11",
|
||||
"use": "ordinaryconditions/rates/caps/timing,visual excerpts retained inQA"
|
||||
},
|
||||
{
|
||||
"path": "docs/investmoz/simulations/source-archive/Lei-20-2009-BR36-AT-exemplar19.pdf",
|
||||
"new_clauses": "PDF2 retains18(1–6),adds7–10;PDF3 updates28 wording;PDF4 adds36m/n and36-A",
|
||||
"use": "provisions/estimatedworkloss/ordinary advertising1percent;campaign36-A explicitlypending"
|
||||
},
|
||||
{
|
||||
"path": "docs/investmoz/simulations/source-archive/Lei-4-2012-BR3.pdf",
|
||||
"new_clauses": "PDF2 retains36a–n;adds36o",
|
||||
"use": "scope cross-check of supplied amended source"
|
||||
},
|
||||
{
|
||||
"path": "docs/investmoz/simulations/source-archive/Lei-19-2013-BR76.pdf",
|
||||
"new_clauses": "PDF2 retains36a–o;adds p/q",
|
||||
"use": "scope cross-check;no new related-party interest rule introduced"
|
||||
},
|
||||
{
|
||||
"path": "docs/investmoz/simulations/source-archive/BR-248-I-Suplemento-1-2025.pdf",
|
||||
"use": "Existing supplied scope ofLei12/2025,source acceptance and rateproof reused;no unrelated revalidation or L5 research"
|
||||
}
|
||||
],
|
||||
"case_specific_remaining": [
|
||||
{
|
||||
"case": "Overlapping36h/i exclusion and36(4)50percent",
|
||||
"example": "Fuel100,supported80,ordinary passenger vehicle",
|
||||
"condition": "Correspond explicit combination rule for the cited clauses or obtain a targeted AT clarification;no additive/proportional tax rule presumed"
|
||||
},
|
||||
{
|
||||
"case": "Rental36h quota",
|
||||
"condition": "Supply documented nonaccepted quota for supported matching;automatic vehicle-quota determination remains in asset scope"
|
||||
},
|
||||
{
|
||||
"case": "Multi-year launch campaign36-A and1percent limit",
|
||||
"condition": "Implement3exercise timing and its interaction with36n;do not treat as ordinary advertising"
|
||||
},
|
||||
{
|
||||
"case": "Regulated provisions28d,financial unwind28(3),other sector provisions",
|
||||
"condition": "Map applicable supervision/sector rule and documented balances;do not reuse ordinary29 caps"
|
||||
},
|
||||
{
|
||||
"case": "Positive deferred receipts19(5),authorised method change19(6)",
|
||||
"condition": "Map remainingcost/deferredreceipt rollforward and applicable authorisation;only knownzero deferral/unchanged method demonstrated"
|
||||
},
|
||||
{
|
||||
"case": "Specific timing18(6–10),other asset/method/shortperiod/annualFX/fiscalrepresentation/form mappings",
|
||||
"condition": "Remaining concrete L6 cases preserved in existing matrix,not closed by this ordinary increment"
|
||||
}
|
||||
],
|
||||
"m20_m22_divergence": "Unchanged and limited to result transfer201/Q8 versus200/Q10;no dependency gate in cost calculation;no new official field correspondence presumed",
|
||||
"L5_ten_questions": "unchanged,not researched;only actual dependent cases blocked",
|
||||
"L6_complete": false,
|
||||
"L7_L8_own_scopes": true,
|
||||
"installation_performed": false,
|
||||
"proof_sha256": {
|
||||
"additional.json": "b76790cb34736281fd181cbf0c871135cb42e75e1acc34ab3c42ed7e696ad5b1",
|
||||
"api.txt": "dff9be0d1338e833adf5c7f10dc4c4e5d5cefde97f284db927608f3c3c334be2",
|
||||
"build-exit.txt": "13bf7b3039c63bf5a50491fa3cfd8eb4e699d1ba1436315aef9cbe5711530354",
|
||||
"build.txt": "21ce0d3af4edc5c74d5cbeebd817b4716b233b0eb54ad03b1f22ebe80edd844a",
|
||||
"calculated.json": "23119339a0337c755f2a045078903858b7da6b95196a91de51170ca115d468a7",
|
||||
"closing.json": "9f87eec9710aeec4819a7b10b64986ad9e4afbb458cd95a49a8f6f035c235ad8",
|
||||
"Decreto-9-2008-BR16.txt": "c680dfb73eeb638cf85d06fb0fe19550487de2994ce76f60077ef4baa88e3238",
|
||||
"dossier-additional.json": "19ad04483c38306982cd182e08445952ec1e5ad5ce821cc345df5ccf75ac4a7a",
|
||||
"dossier-calculated.json": "99c4bff798b7338138216a405aa5de228e88429af3c12290bf1b7071bd40e01a",
|
||||
"dossier-closing.json": "d054eb3da44363d3861037c7bb59074572f630078f6d3aa3d2e4de89983928b0",
|
||||
"dossier-limits.json": "52aaea2415159cacdbc44d56a98918a8438e3bacde06199e0545a265b7d6982d",
|
||||
"dossier-missing.json": "50eff5af4b909ef08f4619ac768d5e8f8d4de01d003c81ef3748bd74a9bccfe2",
|
||||
"dossier.mjs": "0824a3b05fa4bf758bbb165c0fce74fe9cd6ab817ceda5437ef7c73b28794a46",
|
||||
"download.html": "ebf40a955530b10753da0cfd7769c0ad879b079bdade64f4e06ec901912456df",
|
||||
"frontend.txt": "c6aa5222a8b5c867e50a2aca4ab5edd6ab9812f9fb2f6bce8482092951e022bd",
|
||||
"index.html": "09941968500d2910121bdcb0029e326fc6d44bb025b01766654289a28caa62fa",
|
||||
"Lei-19-2013-BR76-page2.png": "952cb5d68fa162043964c282b1ac32faf8bcbb92f2bb83fef2084ae691afae12",
|
||||
"Lei-19-2013-BR76.txt": "7060584c3e59f0b2f12f34aa0b40faadf4aa5790a0459f3319852bcd63262cbb",
|
||||
"Lei-20-2009-BR36-AT-exemplar19-page2.png": "e39eadef731b6c3ae8cb4820238c4db3184111557d982a20dadee139ea2952a2",
|
||||
"Lei-20-2009-BR36-AT-exemplar19-page3.png": "a4a39a81849f32e4c596ef7c0726d2054e74bf45531dd8e920d3927cafdb70bd",
|
||||
"Lei-20-2009-BR36-AT-exemplar19-page4.png": "cafa0e22b0f29296bd28772609fa87708811704c25ae7bf676dba53783e25168",
|
||||
"Lei-20-2009-BR36-AT-exemplar19.txt": "2e04eb1c5be52619e21eb1c376f71603d998672f4c220e0bfc1648df80d5e6fe",
|
||||
"Lei-34-2007-BR52-page10.png": "74937b18d2863c1199e88380e25d39c7ada80c37621196e5402bffa61f6b49be",
|
||||
"Lei-34-2007-BR52-page6.png": "de2c1cc9c8bf5b0cefa9671cc8ad776e21a8492b791648be492d1540d78f748f",
|
||||
"Lei-34-2007-BR52-page8.png": "f69bbe8484e315a5bf5818277c1bb3d67e4e86724544b34565731d5c3f4408df",
|
||||
"Lei-34-2007-BR52-page9.png": "e449f13d39c9f23e408c185e00bafd621706d9cccd037d399e602eece33b6ba5",
|
||||
"Lei-4-2012-BR3-page2.png": "99c5a820ad1e1201af25f60b51c86b3c7bced25acc12343366eadb3133185128",
|
||||
"Lei-4-2012-BR3.txt": "9478ac3ef61ae9df286d951edbfce4c24049f65e860f053ed9eb2c3fbd78d051",
|
||||
"limits.json": "c73905029246c1bbdf91b24869582b6057d62d01dd853e76d2e603786d8810ea",
|
||||
"missing.json": "159c4d3f21d87ff3ea43ad5cfa8a42faea05105feab0a4b5529d37e72d9aea73",
|
||||
"originals-inventory.json": "f91baf686619187dac23bce2c3bde71cc7ddf201fef10a24479548c44abc7d94",
|
||||
"preparation.html": "e9951a85471c44fd9ff5211e59a8eb740e5b8823a4bb6b63c12237feb3d997fd",
|
||||
"qa.tsx": "58e66698e44d68d169117a70d0d15aa07ce77b88bed1234d922d0844a9aac9b0",
|
||||
"recovered-additional.html": "3f562a91fcc2ba6f47c1661f13a39a6c7d939c4730bd4ba9178b60fb05d5b6a6",
|
||||
"recovered-additional.json": "a7adf543887479edf259d2501fe061a14c8aa03e206848726fae0f567b594419",
|
||||
"recovered-calculated.html": "e9951a85471c44fd9ff5211e59a8eb740e5b8823a4bb6b63c12237feb3d997fd",
|
||||
"recovered-calculated.json": "e000b426aefbfad520fe2a03707ca756a87fe04ab39536d509008e03c6288c2b",
|
||||
"recovered-closing.html": "d17bd5944b2f37d752883b22955bcd3c57695f72b464580087403dfa448d785e",
|
||||
"recovered-closing.json": "5f1b2cbe830154e35e60512882aa023fdc443125cf37253e10b85af7f47dddb2",
|
||||
"recovered-limits.html": "4b24bebe5b4d93bc6b06233d795197bb28ca4116eb29832981bafb33804d1a2d",
|
||||
"recovered-limits.json": "28611229e027a0d51593ecf71bae32b6f35f7f2767c26680fa2dceb0e7d9ad11",
|
||||
"recovered-missing.html": "6fa22cb9757a5812d23a1615a43337f20ba1812097d8b4d79c1a3db1a356d8dd",
|
||||
"recovered-missing.json": "b5aa2c3045d79193518621b4764540775470db97bdbc84ac19804c70baa05324",
|
||||
"types.txt": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855",
|
||||
"ui-calculated.png": "3c1070fbb0b9ca66d1b128935ab23e737a11ee2918fc566259a5d70bbae4aa26",
|
||||
"ui-missing.png": "d0c1c138e9b2404ae8a17c0732d8ab1b7bfbcf89ff431aa4d80e3dfaf7f8d5db",
|
||||
"ui-proof.json": "108af6bd1557c6a920842102b1a9b54711fc3ab96e32296e1c2c3f77abda177a",
|
||||
"ui.cjs": "2de9dd0e333edca1a3fd23a6e409cd41271f619cfb2186bbfdf6444855dd35d0",
|
||||
"ui.txt": "8799b836baa3cf8efefce8a5b0b6951c7963e50fb3e08b0be3d2de3434ff4795",
|
||||
"vite.config.ts": "2ad3c19a485d8175b33550b017f2a67934f9fbebda5f6f16e69b9fb89809c398"
|
||||
}
|
||||
}
|
||||
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,682 @@
|
||||
{
|
||||
"status": "installed_L6_short_periods_and_foreign_currency_plans",
|
||||
"installed": {
|
||||
"status": "installed",
|
||||
"commit": "56475acb2f39e58cb51664913f7fb499f58eb7ab",
|
||||
"release": "/var/www/investmoz-homologacao/releases/56475acb2f39e58cb51664913f7fb499f58eb7ab-694b3932",
|
||||
"previous_release": "/var/www/investmoz-homologacao/releases/e9fe102259c183a9d9bf7e39f246a8c3860839c6-0e29d858",
|
||||
"database_migrations": 0,
|
||||
"content_imports": 0
|
||||
},
|
||||
"previous_baseline": "e9fe102259c183a9d9bf7e39f246a8c3860839c6",
|
||||
"backup": {
|
||||
"stage": "/var/backups/investmoz-irpc-l6-periods-fx-delivery-20261026/backup",
|
||||
"created_at": "2026-10-26T08:17:39Z",
|
||||
"target": {
|
||||
"database": "teste_investidor",
|
||||
"port": 5432
|
||||
},
|
||||
"tables": 174,
|
||||
"files_verified": 369,
|
||||
"dump_sha256": "9ecd9f379351437f88009aa6da072e09ec8616fd782b929919ade05be1493bdc",
|
||||
"files_sha256": "6da03ab176387b105da1345764f3b292794d8867d0ed4add47197e0a1e5854fa",
|
||||
"restore_verified": false
|
||||
},
|
||||
"restore": {
|
||||
"restore_verified": true,
|
||||
"tables_verified": 174,
|
||||
"container_network": "none",
|
||||
"database": "irpc_l5_restore_20261025",
|
||||
"port": 55441,
|
||||
"source_dump_sha256": "9ecd9f379351437f88009aa6da072e09ec8616fd782b929919ade05be1493bdc",
|
||||
"active_database_writes": 0
|
||||
},
|
||||
"preservation": {
|
||||
"previous_release_preserved": "/var/www/investmoz-homologacao/releases/e9fe102259c183a9d9bf7e39f246a8c3860839c6-0e29d858",
|
||||
"installed": {
|
||||
"status": "installed",
|
||||
"commit": "56475acb2f39e58cb51664913f7fb499f58eb7ab",
|
||||
"release": "/var/www/investmoz-homologacao/releases/56475acb2f39e58cb51664913f7fb499f58eb7ab-694b3932",
|
||||
"previous_release": "/var/www/investmoz-homologacao/releases/e9fe102259c183a9d9bf7e39f246a8c3860839c6-0e29d858",
|
||||
"database_migrations": 0,
|
||||
"content_imports": 0
|
||||
},
|
||||
"runtime_files_verified": 9,
|
||||
"preserved_L3_ISPC_FX_runtime_files_verified": 43,
|
||||
"documentary_files_verified": 31,
|
||||
"persistent_files_and_env_verified": 369,
|
||||
"tables_compared": 174,
|
||||
"changed_tables": {
|
||||
"cache": {
|
||||
"before": {
|
||||
"rows": 106,
|
||||
"checksum": "1b8bf615a2fdea986761abc88bfb4419"
|
||||
},
|
||||
"after": {
|
||||
"rows": 106,
|
||||
"checksum": "a845f75cfcf49b86ebb8a3816f886a63"
|
||||
}
|
||||
},
|
||||
"sessions": {
|
||||
"before": {
|
||||
"rows": 9,
|
||||
"checksum": "635e8bece48c8f7780635c0c79cd6010"
|
||||
},
|
||||
"after": {
|
||||
"rows": 12,
|
||||
"checksum": "703dbf39af0534461019da7c73354454"
|
||||
}
|
||||
}
|
||||
},
|
||||
"preserved_counts": {
|
||||
"published_fiches": 29,
|
||||
"relations": 28,
|
||||
"geometries": 408
|
||||
},
|
||||
"migration_count": 0,
|
||||
"content_imports": 0,
|
||||
"comparison_role": "postgres_before_and_after;sameexportedsnapshotbaseline;noapplicationRLSvisibilityinference",
|
||||
"writes_by_verification": 0
|
||||
},
|
||||
"schema_permissions": {
|
||||
"schema_sha256": "5045b3e51d2185377aa3d9ac7fa07a44fad3ec620cdfa83ffe31c8884ee1601d",
|
||||
"roles_grants_sha256": "1530c33cb016e67bfdc64891ddfce7f185b13b56b2cd87c012871a685e118109",
|
||||
"filesystem_permissions": {
|
||||
".env": {
|
||||
"mode": 416,
|
||||
"uid": 1001,
|
||||
"gid": 33
|
||||
},
|
||||
"storage": {
|
||||
"mode": 1533,
|
||||
"uid": 1001,
|
||||
"gid": 33
|
||||
},
|
||||
"storage/app": {
|
||||
"mode": 1533,
|
||||
"uid": 1001,
|
||||
"gid": 33
|
||||
},
|
||||
"bootstrap/cache": {
|
||||
"mode": 1528,
|
||||
"uid": 1001,
|
||||
"gid": 33
|
||||
}
|
||||
},
|
||||
"comparison_identity": "postgres;catalogue read only;no passwords collected",
|
||||
"unchanged": true
|
||||
},
|
||||
"operational_delta": {
|
||||
"status": "operational_delta_reconciled",
|
||||
"comparison_identity": "postgres before/after;isolated restored baseline;no RLS visibility inference",
|
||||
"cache": "queue:restart;requestthrottle;identical home-sector cached value with refreshed expiry(HomeController remember10min);no deletedcache",
|
||||
"sessions": "anonymous sessions from delivery user-agent or exactUA/time correlated with nginx public request;deleted sessions individually expired beyond configured lifetime,normal database session garbage collection(config/session lottery2/100)",
|
||||
"delta": {
|
||||
"cache": {
|
||||
"before_rows": 106,
|
||||
"after_rows": 106,
|
||||
"changes": [
|
||||
{
|
||||
"key_sha256": "dbb99b7e17f5b4b9bb7a8bdf9350d9b2ae368aaa4bc44593a2522d87617d8461",
|
||||
"kind": "updated",
|
||||
"fields": [
|
||||
"value",
|
||||
"expiration"
|
||||
],
|
||||
"key_pattern": "investemoz-cache-{hash}",
|
||||
"is_queue_restart_key": false,
|
||||
"expiration_unchanged": false,
|
||||
"throttle_timer_pair": true,
|
||||
"same_value_home_cache_expiry_refresh": false
|
||||
},
|
||||
{
|
||||
"key_sha256": "c1c7bc86ef3255c103a0be6aeb651b824eb07259e993cc5daf3665c1a6afff2d",
|
||||
"kind": "updated",
|
||||
"fields": [
|
||||
"value",
|
||||
"expiration"
|
||||
],
|
||||
"key_pattern": "investemoz-cache-{hash}:timer",
|
||||
"is_queue_restart_key": false,
|
||||
"expiration_unchanged": false,
|
||||
"throttle_timer_pair": true,
|
||||
"same_value_home_cache_expiry_refresh": false
|
||||
},
|
||||
{
|
||||
"key_sha256": "7f7dd83f47f5bf404d55e6e9f1367948721579970b195680645e356031a070ff",
|
||||
"kind": "updated",
|
||||
"fields": [
|
||||
"value",
|
||||
"expiration"
|
||||
],
|
||||
"key_pattern": "investemoz-cache-illuminate:queue:restart",
|
||||
"is_queue_restart_key": true,
|
||||
"expiration_unchanged": false,
|
||||
"throttle_timer_pair": false,
|
||||
"same_value_home_cache_expiry_refresh": false
|
||||
}
|
||||
]
|
||||
},
|
||||
"sessions": {
|
||||
"before_rows": 9,
|
||||
"after_rows": 12,
|
||||
"changes": [
|
||||
{
|
||||
"key_sha256": "6e12944bc8f670195d0c6d2638337e2bf922261a158d130ba09f640a5722f0df",
|
||||
"kind": "added",
|
||||
"fields": [
|
||||
"id",
|
||||
"ip_address",
|
||||
"user_agent",
|
||||
"payload",
|
||||
"last_activity"
|
||||
],
|
||||
"anonymous_user": true,
|
||||
"delivery_user_agent": true,
|
||||
"expired_before_comparison": false,
|
||||
"session_lifetime_minutes": 120,
|
||||
"anonymous_public_request_logged": true
|
||||
},
|
||||
{
|
||||
"key_sha256": "11bbe5f81c536cf605ed71f402fbaa6e9ef551d97c0a76e098078521d9f37f71",
|
||||
"kind": "added",
|
||||
"fields": [
|
||||
"id",
|
||||
"ip_address",
|
||||
"user_agent",
|
||||
"payload",
|
||||
"last_activity"
|
||||
],
|
||||
"anonymous_user": true,
|
||||
"delivery_user_agent": true,
|
||||
"expired_before_comparison": false,
|
||||
"session_lifetime_minutes": 120,
|
||||
"anonymous_public_request_logged": true
|
||||
},
|
||||
{
|
||||
"key_sha256": "d0a4dbafaf19e2eee3af4ea41ce9aabf52cb42d5a61a598c54b37d8863b533d7",
|
||||
"kind": "added",
|
||||
"fields": [
|
||||
"id",
|
||||
"ip_address",
|
||||
"user_agent",
|
||||
"payload",
|
||||
"last_activity"
|
||||
],
|
||||
"anonymous_user": true,
|
||||
"delivery_user_agent": true,
|
||||
"expired_before_comparison": false,
|
||||
"session_lifetime_minutes": 120,
|
||||
"anonymous_public_request_logged": true
|
||||
}
|
||||
]
|
||||
}
|
||||
},
|
||||
"business_tables_to_confirm_separately": 172,
|
||||
"active_data_writes_by_comparison": 0,
|
||||
"restore_network": "none"
|
||||
},
|
||||
"dependency_archiving": {
|
||||
"status": "dependencies_archived_and_verified",
|
||||
"versions": 5,
|
||||
"free_before": 5329760256,
|
||||
"free_after": 6645653504,
|
||||
"receipt": "/var/backups/investmoz-build-dependencies-irpc-l6-periods-fx-20261026/receipt.json",
|
||||
"protected": [
|
||||
"/var/www/investmoz-homologacao/releases/043dd35d8ee247123b3a32f1fc10fd2ede81e9f4-917b3c47",
|
||||
"/var/www/investmoz-homologacao/releases/e9fe102259c183a9d9bf7e39f246a8c3860839c6-0e29d858"
|
||||
],
|
||||
"active_or_previous_release_modified": false,
|
||||
"source_data_backups_deleted": 0
|
||||
},
|
||||
"public_verification": {
|
||||
"status": "installed_delta_verified",
|
||||
"served_revision": {
|
||||
"commit": "56475acb2f39e58cb51664913f7fb499f58eb7ab",
|
||||
"branch": "main",
|
||||
"built_at": "2026-10-26T08:23:47.654431+00:00",
|
||||
"manifest_sha256": "f6121cade74d12c6de25630b23a1bd73f244a089c2649bf2c3aa76c68491431c"
|
||||
},
|
||||
"manifest_hash_matches": true,
|
||||
"compiled_delta_markers": {
|
||||
"IRPC-normal-adjustments/8": [
|
||||
"assets/project-dossier-BGxws1O_.js"
|
||||
],
|
||||
"Preparar período curto ou plano noutra moeda": [
|
||||
"assets/services-08vnaMl1.js"
|
||||
],
|
||||
"Primeiro mês civil do plano": [
|
||||
"assets/services-08vnaMl1.js"
|
||||
],
|
||||
"Pressuposto documentado da conversão mensal para simulação": [
|
||||
"assets/services-08vnaMl1.js"
|
||||
],
|
||||
"Saldo final — âmbito L8": [
|
||||
"assets/project-dossier-BGxws1O_.js"
|
||||
],
|
||||
"Reutilizar selecção cambial": [
|
||||
"assets/services-08vnaMl1.js"
|
||||
]
|
||||
},
|
||||
"assets": [
|
||||
{
|
||||
"file": "assets/services-08vnaMl1.js",
|
||||
"status": 200,
|
||||
"sha256": "6cc2b1bfb11744376ae71d1f0429ee776ef6f004edca72a4f22c5a9ef4937688"
|
||||
},
|
||||
{
|
||||
"file": "assets/project-dossier-BGxws1O_.js",
|
||||
"status": 200,
|
||||
"sha256": "f2dc461eca8219602099ac2cf17f52f5adedc4553f4b0e48bbeba273041d9bca"
|
||||
},
|
||||
{
|
||||
"file": "assets/project-dossier-document-BYlep2jg.js",
|
||||
"status": 200,
|
||||
"sha256": "0ece3300111d8e5c0e094c2c1688604349de11cde057583bd83d8ae3742c8a99"
|
||||
},
|
||||
{
|
||||
"file": "assets/simulation-form-BqVD91Ek.js",
|
||||
"status": 200,
|
||||
"sha256": "85cbd533c5bc92af5a448db71da006d4346d2d0adb09dde825db0aa19ad5048c"
|
||||
}
|
||||
],
|
||||
"simulator_status": 200,
|
||||
"simulator_entry": "assets/app-DoIk7pr3.js",
|
||||
"existing_fiscal_availability": {
|
||||
"data": {
|
||||
"enabled": true,
|
||||
"coverage_start": "2026-01-01",
|
||||
"coverage_end": "2026-12-31",
|
||||
"message": "IVA geral sobre base líquida disponível; enquadramento declarado."
|
||||
}
|
||||
},
|
||||
"synthetic_private_writes": 0,
|
||||
"method": "Read-only installedrevision/manifest/newcompiledcatalogueandreaders/simulatorentry;acceptedQAproofsreused"
|
||||
},
|
||||
"runtime_delta": [
|
||||
{
|
||||
"path": "resources/js/components/simulation-irpc-normal.tsx",
|
||||
"sha256_LF": "557714bb3af75080e443ae67b11a66d9feb49d9a4b269065769b128a6d712837"
|
||||
},
|
||||
{
|
||||
"path": "resources/js/components/simulation-irpc-period-fx.tsx",
|
||||
"sha256_LF": "4b5f718b5ef415ecf5f96dabb0e3806254558c20905de6478e10dacf67569c49"
|
||||
},
|
||||
{
|
||||
"path": "resources/js/components/simulation-irpc-schedules.tsx",
|
||||
"sha256_LF": "3768c316d5887d337eb3647671863c9464f961d1df4703403e7d57e5641273ed"
|
||||
},
|
||||
{
|
||||
"path": "resources/js/lib/irpc-normal-assessment.ts",
|
||||
"sha256_LF": "a9b3ced852e37e3e087ce5dab1add4ec0737145ce19f61857a54d5d3d24a6f8c"
|
||||
},
|
||||
{
|
||||
"path": "resources/js/lib/irpc-normal-base.ts",
|
||||
"sha256_LF": "22019d678f6eb16fead2207dc3d3fa9fd63413c6254633c1ffd4f1c0320344ac"
|
||||
},
|
||||
{
|
||||
"path": "resources/js/lib/irpc-normal-costs.ts",
|
||||
"sha256_LF": "471457692a2a2f70a1bd1c7abb38d3ce42f07b62a63e5a4ab985ad1bbd068b46"
|
||||
},
|
||||
{
|
||||
"path": "resources/js/lib/irpc-normal-depreciation.ts",
|
||||
"sha256_LF": "1dad3053157aeac44f6d3bd58885cfc47a73c19d2808284c16931679dfe4291b"
|
||||
},
|
||||
{
|
||||
"path": "resources/js/lib/irpc-normal-period-fx.ts",
|
||||
"sha256_LF": "a2e7b066623eae17f0d8185d065d0adf5d3a485f780f8b09118a664dc4ba0531"
|
||||
},
|
||||
{
|
||||
"path": "resources/js/lib/irpc-normal.ts",
|
||||
"sha256_LF": "e4de2fe0421e489bf555885b9cbb459c00ee77803ea9b6e5af45179bd6bb4f21"
|
||||
}
|
||||
],
|
||||
"protected_runtime": [
|
||||
{
|
||||
"path": "resources/js/components/simulation-irpc-depreciation.tsx",
|
||||
"sha256": "1f9918bfb435bb5b7c0ddd2fafd7bace2a02514c6ece04b93f15975e494a5f53"
|
||||
},
|
||||
{
|
||||
"path": "resources/js/lib/irpc-normal-profit.ts",
|
||||
"sha256": "909e129a0245e6bf098317485b886a2d19e02c64bbfd9c6f718e98ec6b935b8d"
|
||||
},
|
||||
{
|
||||
"path": "resources/js/lib/irpc-normal-schedules.ts",
|
||||
"sha256": "edfb6fd338411fa8f87a6bdf9a9d4fd5c6dc2fad9d2eb3d32f2640e2951cbbe9"
|
||||
},
|
||||
{
|
||||
"path": "resources/js/components/simulation-irpc-costs.tsx",
|
||||
"sha256": "c4156916835daf0f33addf89dfedd40c31b8dc3297112cd98beac33422af274d"
|
||||
},
|
||||
{
|
||||
"path": "resources/js/lib/irpc-normal-forms.ts",
|
||||
"sha256": "4e986addb9f2d74e7a80345f8f1e4d8e0b2f562c867fa6eee84880d9f72a3649"
|
||||
},
|
||||
{
|
||||
"path": "resources/js/components/simulation-irpc-taxable-base.tsx",
|
||||
"sha256": "e4fe9f66d35d24aa68fd87de6a5a6a0e901706b270c18962fd0c7ab00f9abd93"
|
||||
},
|
||||
{
|
||||
"path": "resources/js/components/simulation-irpc-assessment.tsx",
|
||||
"sha256": "7174cc0160005a0c332ea40f02ba8a6d57985081b5ab45177ccd6e721bceea54"
|
||||
},
|
||||
{
|
||||
"path": "resources/js/components/acquisition-beverage-restitution.tsx",
|
||||
"sha256": "6f44897b8b12569314551df0022c26da57a165634087942a724293e66837558d"
|
||||
},
|
||||
{
|
||||
"path": "resources/js/components/fiscal-calculation-gaps.tsx",
|
||||
"sha256": "1dab6ceb73756d4e023096b3b2ba767aaa843ff6cc69046ea630ab449a00b0dd"
|
||||
},
|
||||
{
|
||||
"path": "resources/js/components/fiscal-l3-preparation.tsx",
|
||||
"sha256": "e84a7b1ccadaa1b5bd78d778a3287f96ccaf530855eef404786cd7aa3d321b73"
|
||||
},
|
||||
{
|
||||
"path": "resources/js/components/simulation-acquisitions.tsx",
|
||||
"sha256": "c206d4cfe575d6ba007aa2b425b5f898efa97e4162b8710e358b6ecfd9458542"
|
||||
},
|
||||
{
|
||||
"path": "resources/js/components/simulation-operations.tsx",
|
||||
"sha256": "a7e55972fa790063dcf11945055de2af46a77db9e509900af22ede7ec47bb4cf"
|
||||
},
|
||||
{
|
||||
"path": "resources/js/lib/iva-acquisition-bc.ts",
|
||||
"sha256": "b0ef55e0917bdb79f14b53ba9e95d73c08153befeb7d4ce73f81e6fb13992225"
|
||||
},
|
||||
{
|
||||
"path": "resources/js/lib/iva-beverage-allocation.ts",
|
||||
"sha256": "32968d198c7fe0c53ca89641c22d5749be6636be2c79127b867e4e3afd0dd40d"
|
||||
},
|
||||
{
|
||||
"path": "resources/js/lib/iva-beverage-restitution.ts",
|
||||
"sha256": "5c650cbd9469d5f99001f56fc4ff99ac973eb368036d4e96c6d171f1b220bd9e"
|
||||
},
|
||||
{
|
||||
"path": "resources/js/lib/iva-calculation-gaps.ts",
|
||||
"sha256": "2e7d84a0c196bd5b56fd67cc1a389d43d5041894184e675680a4de3cd10b31a2"
|
||||
},
|
||||
{
|
||||
"path": "resources/js/lib/iva-operations.ts",
|
||||
"sha256": "ec37b949f1233c5f5c14a87450c421ed29fabf1ed5b73fb32564564a2bc31f54"
|
||||
},
|
||||
{
|
||||
"path": "resources/js/lib/l3-form-preparation.ts",
|
||||
"sha256": "fc47f5fa5ec1420fbd847d0d081f00d99ebbb524164eef785b20877e0562f704"
|
||||
},
|
||||
{
|
||||
"path": "resources/js/lib/ispc-residuals.ts",
|
||||
"sha256": "40d5751c06c7c155ab4b7a17ee2d1653da2fbbf075807fbb8561cdbe19820955"
|
||||
},
|
||||
{
|
||||
"path": "resources/js/components/simulation-ispc-residuals.tsx",
|
||||
"sha256": "a9219d6f41ccbd0ce45659d4f6aa0fa1c169a685840f5cb1e18daeca377d5e18"
|
||||
},
|
||||
{
|
||||
"path": "resources/js/lib/ispc-eligibility.ts",
|
||||
"sha256": "44675c5efacdc1ae19505667611ba3b522d3043cebacc8754597c3a68ca89d25"
|
||||
},
|
||||
{
|
||||
"path": "resources/js/components/simulation-ispc-quarter.tsx",
|
||||
"sha256": "2c2555309b32d4261f14e7164f39314c9188129c2990357fc54090a2468dd2b4"
|
||||
},
|
||||
{
|
||||
"path": "resources/js/components/simulation-ispc-withholding.tsx",
|
||||
"sha256": "e0445d015b72859e48726959aa52686f79b1cf5c2ade29751efa83257068b878"
|
||||
},
|
||||
{
|
||||
"path": "resources/js/lib/ispc-quarter.ts",
|
||||
"sha256": "f66bd52e9cdfe1ddaa6b00a931465862b3d890b9be216b7a056740f027f24129"
|
||||
},
|
||||
{
|
||||
"path": "resources/js/lib/ispc-withholding.ts",
|
||||
"sha256": "6c31b240299edd3262efa28f7f3d5aee21123f94e30ef4ab90e26c35777cb6e4"
|
||||
},
|
||||
{
|
||||
"path": "resources/js/components/simulation-ispc-eligibility.tsx",
|
||||
"sha256": "f48dd4a8f87a994eda0447f81a463589905e5873b2e1044debac9d10825a880c"
|
||||
},
|
||||
{
|
||||
"path": "resources/js/lib/iva-acquisitions.ts",
|
||||
"sha256": "cce283b1d0a07fb383fcb527225f4dd5bec829010a662cbaae1d60e595221977"
|
||||
},
|
||||
{
|
||||
"path": "resources/js/lib/iva-modelo-a.ts",
|
||||
"sha256": "c641619a05613c1620385baad0e9ffbf810dd970aafb30e12b3a7f9a3bf11846"
|
||||
},
|
||||
{
|
||||
"path": "resources/js/lib/iva-fx-selection.ts",
|
||||
"sha256": "9aa07ad443bc777b80510a3b5bd6aff9ddb9814d2450f3c690e531e74d71d998"
|
||||
},
|
||||
{
|
||||
"path": "resources/js/components/simulation-fx-selection.tsx",
|
||||
"sha256": "39bb6d87d404745b0b66349bc11626545a3672ae27321ce9b4658416592059bf"
|
||||
},
|
||||
{
|
||||
"path": "resources/js/lib/business-financial-plan.ts",
|
||||
"sha256": "c20274722d1ffcd0360f041a6cacb5d868fe0621cb27a1aca6e06826612c3ebb"
|
||||
},
|
||||
{
|
||||
"path": "resources/js/lib/iva-currency-events.ts",
|
||||
"sha256": "cc9f2045d302d7987310da4006cc250fc5c99a27397918d166d649bfc32fab08"
|
||||
},
|
||||
{
|
||||
"path": "resources/js/lib/irpc-fx.ts",
|
||||
"sha256": "5c4a7a477429f8d775acf6db3e117008468f5554e5731dec81f60fbb75e948fb"
|
||||
},
|
||||
{
|
||||
"path": "resources/js/lib/irpc-withholdings.ts",
|
||||
"sha256": "8e5f3c035ce5e4d6c3fc82f933439ab580fa5519492f9c4d32cfb71b77b54803"
|
||||
},
|
||||
{
|
||||
"path": "resources/js/components/simulation-irpc-withholdings.tsx",
|
||||
"sha256": "751af4fab346659bc5ccb08b8a2169769af7521ea0035050af32b41ea7f5aa76"
|
||||
},
|
||||
{
|
||||
"path": "resources/js/lib/irpc-interest.ts",
|
||||
"sha256": "f8e6390b3b2c58c296f7e3fd14576e06ae248bc0cabce1a666b7094611f2a7dd"
|
||||
},
|
||||
{
|
||||
"path": "resources/js/lib/irpc-mrfta.ts",
|
||||
"sha256": "76dcce8954f68b081d500be61de9c5b146a452a3eb578a0b78776ba9e1f8051c"
|
||||
},
|
||||
{
|
||||
"path": "resources/js/lib/irpc-mrfta-cases.ts",
|
||||
"sha256": "4266746076ab3f70312fd042351e24dd2f136c4f3e8a277b57dd97849a9f1862"
|
||||
},
|
||||
{
|
||||
"path": "resources/js/components/simulation-irpc-mrfta.tsx",
|
||||
"sha256": "913d1bb4ac0fc59763cf5d27bc637f6a713b2050c4463748db554af4be451538"
|
||||
},
|
||||
{
|
||||
"path": "resources/js/lib/financial-fiscal-bridge.ts",
|
||||
"sha256": "5a30c501653b16b5fedcb12631ce81fcce4fe473aa542e94374986b3c50f2d33"
|
||||
},
|
||||
{
|
||||
"path": "resources/js/components/simulation-form.tsx",
|
||||
"sha256": "85b024a7f45ceb52efd6ff1f21d0eab1fd8fcf1ab59e4b5302c08685235c472a"
|
||||
},
|
||||
{
|
||||
"path": "resources/js/lib/project-dossier.ts",
|
||||
"sha256": "a0909bbfcdf7e8542b010faa104fcb918e86ae38ddf096082d4d5be98d31b2b9"
|
||||
},
|
||||
{
|
||||
"path": "resources/js/lib/project-dossier-report.ts",
|
||||
"sha256": "5207a2ffeb208cd5ace6713038cee85208020ee618194dca7114e94fc3200b6c"
|
||||
}
|
||||
],
|
||||
"originals": [
|
||||
{
|
||||
"path": "docs/investmoz/simulations/source-archive/AT-Comunicado-9-2026-ISPC.pdf",
|
||||
"sha256": "106f8a9ce9255c03549c70bf07fe999d32e6e55302d009b509862aa74ccb4973"
|
||||
},
|
||||
{
|
||||
"path": "docs/investmoz/simulations/source-archive/AT-Modelo-30-ISPC.pdf",
|
||||
"sha256": "6802edd06b6ff638a0b851a3ec7ecf69af8f07840faa47446becad67d35d445c"
|
||||
},
|
||||
{
|
||||
"path": "docs/investmoz/simulations/source-archive/AT-Modelo-B-Geral.pdf",
|
||||
"sha256": "bd977c7c59d4d98befd92e2c566b1bf168cb1343bb519f51b41a3807f431fc57"
|
||||
},
|
||||
{
|
||||
"path": "docs/investmoz/simulations/source-archive/AT-MRFTA-19-39.pdf",
|
||||
"sha256": "8ea62c53066b482f87078a7a7b1ecf15ca98a12a122e8d7abca63acfc993186b"
|
||||
},
|
||||
{
|
||||
"path": "docs/investmoz/simulations/source-archive/BM-Mercado-Monetario-MAIBOR-20261025.html",
|
||||
"sha256": "00e8a7e0d3a1db4ca3beb56d5361b2084a0f1684f3d40fc1c203702a2190e063"
|
||||
},
|
||||
{
|
||||
"path": "docs/investmoz/simulations/source-archive/BR-16-I-Serie-2008-04-16.pdf",
|
||||
"sha256": "fc373ff5637edf75ec6a9595dec8763a8503d4ee786e3b7d8f1c742eae9d80ee"
|
||||
},
|
||||
{
|
||||
"path": "docs/investmoz/simulations/source-archive/BR-248-I-Suplemento-1-2025.pdf",
|
||||
"sha256": "ccf2a8deeca820f2dd076b4b2141b1efe3f6a806568c3a587ca59a8e92f4c251"
|
||||
},
|
||||
{
|
||||
"path": "docs/investmoz/simulations/source-archive/BR-89-I-Serie-2017-06-08.pdf",
|
||||
"sha256": "11f0cab15eb6e51010952203ffa24fdc533a24fd642e19525fe4f46b17a1f5e5"
|
||||
},
|
||||
{
|
||||
"path": "docs/investmoz/simulations/source-archive/BR-95-I-Suplemento-2025-05-21.pdf",
|
||||
"sha256": "e0e682e2c027c3cd9c1d46a73a3f48bc5f6bdbf05667fd97314d7a3f6a456358"
|
||||
},
|
||||
{
|
||||
"path": "docs/investmoz/simulations/source-archive/BR252-I-Serie-2022-Lei20-PESOE.pdf",
|
||||
"sha256": "1159fd3ce1ba5581671796d083534da48bd3c5578298819e896f1c2a8026318d"
|
||||
},
|
||||
{
|
||||
"path": "docs/investmoz/simulations/source-archive/Decreto-22-2021-BR70.pdf",
|
||||
"sha256": "a8fac38dcfe08f9c7a8e46254cff10e1ec82fc4f7a8d88ad6e4fe7d91ffc21a5"
|
||||
},
|
||||
{
|
||||
"path": "docs/investmoz/simulations/source-archive/Decreto-27-2026-BR123.pdf",
|
||||
"sha256": "26249c3fa58f149c81de36e99d1aac2819a4771379d9e8833159660dabf539bb"
|
||||
},
|
||||
{
|
||||
"path": "docs/investmoz/simulations/source-archive/Decreto-29-1998-BR22-5-suplemento.pdf",
|
||||
"sha256": "6242cbe675faadf085f43f95ec8c7e8868aafe67c3b2ab2bb010992288f954f8"
|
||||
},
|
||||
{
|
||||
"path": "docs/investmoz/simulations/source-archive/Decreto-3-2011-BR-11-I-mineiros.pdf",
|
||||
"sha256": "5bca1133666ba9c69870b89823420175b7b5b8d0eccb667ecdf5c29716f3b6be"
|
||||
},
|
||||
{
|
||||
"path": "docs/investmoz/simulations/source-archive/Decreto-37-2023-BR124.pdf",
|
||||
"sha256": "7e680b191481faa0e2e9057fa5053587eb2a29d1d8c819e0eb9f02814255a04c"
|
||||
},
|
||||
{
|
||||
"path": "docs/investmoz/simulations/source-archive/Decreto-9-2008-BR16.pdf",
|
||||
"sha256": "96fccdecbfdc11c9eafb90fbc6c7bc259f88bbd4c7507d1ac3af1fa03f960697"
|
||||
},
|
||||
{
|
||||
"path": "docs/investmoz/simulations/source-archive/Lei-13-2016-CIVA-BR-156-10-suplemento.pdf",
|
||||
"sha256": "b90dc7c14ecea2e378c4a62e8e5a47d54a5644c457baeb8b8053b92fd2a5710b"
|
||||
},
|
||||
{
|
||||
"path": "docs/investmoz/simulations/source-archive/Lei-14-1992-BR42.pdf",
|
||||
"sha256": "089fff7423e99a70a230a73ca379e4ea3a91d124703f91016e57ff82794b9e56"
|
||||
},
|
||||
{
|
||||
"path": "docs/investmoz/simulations/source-archive/Lei-17-2022-BR251-exemplar-MCNet5.pdf",
|
||||
"sha256": "14eb34f0af91a8f5cb1770c7b52d6ff839c6818302d1ed96d79afbfb9fe999d4"
|
||||
},
|
||||
{
|
||||
"path": "docs/investmoz/simulations/source-archive/Lei-17-2022-IPP-BR250-Parlamento.pdf",
|
||||
"sha256": "978cd22403ffd336a631704ecd7a5bbd814a427c815b9acdaca5515591dd9e2a"
|
||||
},
|
||||
{
|
||||
"path": "docs/investmoz/simulations/source-archive/Lei-19-2013-BR76.pdf",
|
||||
"sha256": "bba96d645cc935ffc3d1a79b9f0f73ac1c693d6459c2ad41f56cd2841accae76"
|
||||
},
|
||||
{
|
||||
"path": "docs/investmoz/simulations/source-archive/Lei-19-2017-IRPS-BR-OCAM.pdf",
|
||||
"sha256": "c3a0186cb9ad090d7a9533006295dc9bb6a62ad0d6150173cbd49dba4ee4b52d"
|
||||
},
|
||||
{
|
||||
"path": "docs/investmoz/simulations/source-archive/Lei-2-2011-BR-1-4-suplemento-MCNet.pdf",
|
||||
"sha256": "a7543a68cc3287a46a83c39a04821b40f649dd06c4e9b5dc51ff0b47fba08899"
|
||||
},
|
||||
{
|
||||
"path": "docs/investmoz/simulations/source-archive/Lei-20-2009-BR36-AT-exemplar19.pdf",
|
||||
"sha256": "fc1c8144db42960cbf73e717e095896f511ece0f907f58f78819b27d6917a7ee"
|
||||
},
|
||||
{
|
||||
"path": "docs/investmoz/simulations/source-archive/Lei-22-2022-IVA-republicada-BR-250-2-suplemento.pdf",
|
||||
"sha256": "ea1b0dc6f5cf6e595f6d9a19e7042f398999e0087caef1785f6e8fac571b5f53"
|
||||
},
|
||||
{
|
||||
"path": "docs/investmoz/simulations/source-archive/Lei-34-2007-BR52.pdf",
|
||||
"sha256": "cdbef875ad7ccc1517b12faf5de0e893a70ed2ed81e33913cd6dc4a674474e6e"
|
||||
},
|
||||
{
|
||||
"path": "docs/investmoz/simulations/source-archive/Lei-4-1994-BR37-3-suplemento.pdf",
|
||||
"sha256": "210df9db8980d0a5690cd187a6eeec7e37a900d743e39062c16f4e0d12215c7e"
|
||||
},
|
||||
{
|
||||
"path": "docs/investmoz/simulations/source-archive/Lei-4-2012-BR3.pdf",
|
||||
"sha256": "b8845cef41dcbd9ba50c43dbfa743a56030dd3d348242a107e1ae30279eec121"
|
||||
},
|
||||
{
|
||||
"path": "docs/investmoz/simulations/source-archive/Lei-7-1991-Partidos-IFES.pdf",
|
||||
"sha256": "6b783a0bb3330688ef10660a58060d9724aa2da6a873d234fe902f0eaaeda42d"
|
||||
},
|
||||
{
|
||||
"path": "docs/investmoz/simulations/source-archive/PT-MZ-CDT-1992.pdf",
|
||||
"sha256": "d504e1024b28aee5c6acf4592acb96ec9c915a8414f67a61ab6984d6acf9df9d"
|
||||
},
|
||||
{
|
||||
"path": "docs/investmoz/simulations/source-archive/PT-MZ-Protocolo-2009.pdf",
|
||||
"sha256": "f353773dcf41f09f4daa6cf5ba5a5f7994f3e02615867c2dcffc61c3d901bf9b"
|
||||
}
|
||||
],
|
||||
"pipeline_checks": [
|
||||
"OK (1 test, 3106 assertions)",
|
||||
"built in 31.08s",
|
||||
"OK (59 tests, 317 assertions)",
|
||||
"# tests 973",
|
||||
"# pass 973",
|
||||
"# fail 0"
|
||||
],
|
||||
"accepted_QA_proofs": {
|
||||
"frontend_tests": 13,
|
||||
"API_tests": 1,
|
||||
"API_assertions": 58,
|
||||
"database": "127.0.0.1:55441/simulator_fiscal_delta_20261021_test;DatabaseTransactions rollback",
|
||||
"routes_actions": "generated by guarded existing procedure",
|
||||
"typescript": "passed",
|
||||
"build": "passed",
|
||||
"UI": "actual component;dates/FX edit+confirmation;originals/assumptions;save/recovery/export;missingdata",
|
||||
"accepted_proofs": "reused"
|
||||
},
|
||||
"accepted_proofs_reused": true,
|
||||
"manually_repeated_accepted_suites": false,
|
||||
"sequence": {
|
||||
"short_period": "3130→3130→colecta1001.60MZN",
|
||||
"USD_simulation64": "200320→200320→colecta64102.40MZN;synthetic QA assumption,not real bulletin or fiscal annual confirmation",
|
||||
"final_payable": null,
|
||||
"final_recoverable": null,
|
||||
"final_balance_scope": "L8"
|
||||
},
|
||||
"remaining_L6": "Representation/fiscal precision and remaining M20/M22 fields nextQA;partial dates/loss period sequence/short annualcaps/remaining depreciation and costs/annualFX and foreignbalances;conditions preserved in same matrix.",
|
||||
"L6_complete": false,
|
||||
"L7_L8_own_scopes": true,
|
||||
"proof_files": {
|
||||
"backup.txt": "b1b580ee73bdf6f2a2d3daaecf1b983e2084fea0a5e69e7fa3486d938cf7a87f",
|
||||
"compact-dependencies.txt": "18375c30afc5fac24e8111779d455808fa363e02c5e38c8a92af6268dcbae7b4",
|
||||
"installed-protected.txt": "39cd2444e61f5aca2ce41f2eba245defa246aacb908e066d43019e44c2e07e4e",
|
||||
"installed-public-delta.json": "f35d40c06ff3a428c37e88b63dfa09ab745376c4c15747176382e9b364f80d5b",
|
||||
"installed-public.txt": "7cd1a559a1c7d327a2d71846abdbe33cda63fdb99c0fdcf1584a75a5ff7c138a",
|
||||
"integration.txt": "2526b168e5c6ef2515a9351dcdd56f1bbe9a119c073522376715cc815f7e673b",
|
||||
"manifest-served.json": "f6121cade74d12c6de25630b23a1bd73f244a089c2649bf2c3aa76c68491431c",
|
||||
"operational-delta.txt": "cadac629ef03871c14e3dd7186ce95379c526927bfefcae4466d6cb88897c1a4",
|
||||
"preflight.txt": "dbdc76e4c45a45c127ce733def4260601074cee2bcf4cd6182dae06b3e7652a8",
|
||||
"preparation.json": "dd755c3cad122e3730f57f8a94ee82dda74bfe49925cea95a518199437706e1a",
|
||||
"progress.txt": "8ea7368149372f43ee10075198a3cc840394f866158a242353bdd7a3fd8e27a2",
|
||||
"restore.txt": "5a7358ce267845262582c50261f85ab5d035bc16dc9573dd0554083f4457b324",
|
||||
"schema-permissions-after.txt": "76b5a4d8af11e4898a205062766cfb7ab6ec0783200e77e60a1927aa1ca18597",
|
||||
"schema-permissions-before.txt": "0ab7c964792acdd8917bce256c472e55e034b103500a58b49f020b5084823ed7",
|
||||
"status-final.txt": "3b882f9da83f52e66876e3a2456d50e0454d44668e168e9967c290411af9b0e1"
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,869 @@
|
||||
{
|
||||
"status": "short_period_and_foreign_currency_plan_QA_prepared_not_installed",
|
||||
"installed_baseline": "e9fe102259c183a9d9bf7e39f246a8c3860839c6",
|
||||
"branch": "codex/irpc-l6-periods-fx-qa-20261026",
|
||||
"version": "IRPC-normal-adjustments/8",
|
||||
"cases_recovered": {
|
||||
"short": {
|
||||
"accountingProfit": {
|
||||
"numerator": "3120",
|
||||
"denominator": "1"
|
||||
},
|
||||
"taxableProfit": {
|
||||
"numerator": "3130",
|
||||
"denominator": "1"
|
||||
},
|
||||
"taxableBase": {
|
||||
"numerator": "3130",
|
||||
"denominator": "1"
|
||||
},
|
||||
"colecta": {
|
||||
"numerator": "5008",
|
||||
"denominator": "5"
|
||||
},
|
||||
"period": {
|
||||
"version": 1,
|
||||
"kind": "start",
|
||||
"from": "2026-07-01",
|
||||
"to": "2026-12-31",
|
||||
"planStart": "2026-01-01",
|
||||
"reference": "QA início documentado1Julho;correspondência completa dos meses7–12 ao período do sujeito",
|
||||
"conversionReference": "",
|
||||
"mznMapsReference": "QA activo/quotas/juros e demais mapas reconciliados explicitamente emMZN no período",
|
||||
"months": []
|
||||
},
|
||||
"pending": []
|
||||
},
|
||||
"fx": {
|
||||
"accountingProfit": {
|
||||
"numerator": "199680",
|
||||
"denominator": "1"
|
||||
},
|
||||
"taxableProfit": {
|
||||
"numerator": "200320",
|
||||
"denominator": "1"
|
||||
},
|
||||
"taxableBase": {
|
||||
"numerator": "200320",
|
||||
"denominator": "1"
|
||||
},
|
||||
"colecta": {
|
||||
"numerator": "320512",
|
||||
"denominator": "5"
|
||||
},
|
||||
"period": {
|
||||
"version": 1,
|
||||
"kind": "start",
|
||||
"from": "2026-07-01",
|
||||
"to": "2026-12-31",
|
||||
"planStart": "2026-01-01",
|
||||
"reference": "QA início documentado1Julho;correspondência completa dos meses7–12 ao período do sujeito",
|
||||
"conversionReference": "QA pressuposto de simulação64MZN/USD aplicado aos meses seleccionados;sem regra fiscal anual confirmada",
|
||||
"mznMapsReference": "QA activo/quotas/juros e demais mapas reconciliados explicitamente emMZN no período",
|
||||
"months": [
|
||||
{
|
||||
"period": 7,
|
||||
"currency": "USD",
|
||||
"fxSelection": {
|
||||
"nature": "commercial",
|
||||
"submissionDate": "2026-10-26",
|
||||
"bulletinDate": "2026-10-26",
|
||||
"bulletinRef": "QA pressuposto sintético64; não boletim real",
|
||||
"source": "https://www.bancomoc.mz/",
|
||||
"sourceCurrency": "USD",
|
||||
"direction": "mzn_per_unit",
|
||||
"bulletinPerspective": "",
|
||||
"relation": "",
|
||||
"buy": "",
|
||||
"sell": "",
|
||||
"mean": "64",
|
||||
"mode": "general",
|
||||
"exceptionRef": "",
|
||||
"exceptionScope": "",
|
||||
"exceptionDate": "",
|
||||
"exceptionRate": "",
|
||||
"applied": {
|
||||
"column": "mean",
|
||||
"rate": "64",
|
||||
"date": "2026-10-26",
|
||||
"source": "QA pressuposto sintético64; não boletim real;https://www.bancomoc.mz/;perspectiva:média de referênciaBM;natureza:commercial;relação:não aplicável à média;Orientação operacional expressa da Tempo,25/10/2026:compra de moeda→taxa de compra;venda→taxa de venda;operações comerciais→taxa média de referência do Banco de Moçambique na data de submissão indicada. Interpretar compra/venda pela perspectiva do boletim. Excepções fiscais específicas conservam disposição,data,taxa e âmbito;sem recálculo automático dos históricos.",
|
||||
"selectedAt": "2026-10-26T07:51:24.920Z",
|
||||
"selectionKey": "{\"nature\":\"commercial\",\"submissionDate\":\"2026-10-26\",\"bulletinDate\":\"2026-10-26\",\"bulletinRef\":\"QA pressuposto sintético64; não boletim real\",\"source\":\"https://www.bancomoc.mz/\",\"sourceCurrency\":\"USD\",\"direction\":\"mzn_per_unit\",\"bulletinPerspective\":\"\",\"relation\":\"\",\"buy\":\"\",\"sell\":\"\",\"mean\":\"64\",\"mode\":\"general\",\"exceptionRef\":\"\",\"exceptionScope\":\"\",\"exceptionDate\":\"\",\"exceptionRate\":\"\"}"
|
||||
}
|
||||
}
|
||||
},
|
||||
{
|
||||
"period": 8,
|
||||
"currency": "USD",
|
||||
"fxSelection": {
|
||||
"nature": "commercial",
|
||||
"submissionDate": "2026-10-26",
|
||||
"bulletinDate": "2026-10-26",
|
||||
"bulletinRef": "QA pressuposto sintético64; não boletim real",
|
||||
"source": "https://www.bancomoc.mz/",
|
||||
"sourceCurrency": "USD",
|
||||
"direction": "mzn_per_unit",
|
||||
"bulletinPerspective": "",
|
||||
"relation": "",
|
||||
"buy": "",
|
||||
"sell": "",
|
||||
"mean": "64",
|
||||
"mode": "general",
|
||||
"exceptionRef": "",
|
||||
"exceptionScope": "",
|
||||
"exceptionDate": "",
|
||||
"exceptionRate": "",
|
||||
"applied": {
|
||||
"column": "mean",
|
||||
"rate": "64",
|
||||
"date": "2026-10-26",
|
||||
"source": "QA pressuposto sintético64; não boletim real;https://www.bancomoc.mz/;perspectiva:média de referênciaBM;natureza:commercial;relação:não aplicável à média;Orientação operacional expressa da Tempo,25/10/2026:compra de moeda→taxa de compra;venda→taxa de venda;operações comerciais→taxa média de referência do Banco de Moçambique na data de submissão indicada. Interpretar compra/venda pela perspectiva do boletim. Excepções fiscais específicas conservam disposição,data,taxa e âmbito;sem recálculo automático dos históricos.",
|
||||
"selectedAt": "2026-10-26T07:51:24.920Z",
|
||||
"selectionKey": "{\"nature\":\"commercial\",\"submissionDate\":\"2026-10-26\",\"bulletinDate\":\"2026-10-26\",\"bulletinRef\":\"QA pressuposto sintético64; não boletim real\",\"source\":\"https://www.bancomoc.mz/\",\"sourceCurrency\":\"USD\",\"direction\":\"mzn_per_unit\",\"bulletinPerspective\":\"\",\"relation\":\"\",\"buy\":\"\",\"sell\":\"\",\"mean\":\"64\",\"mode\":\"general\",\"exceptionRef\":\"\",\"exceptionScope\":\"\",\"exceptionDate\":\"\",\"exceptionRate\":\"\"}"
|
||||
}
|
||||
}
|
||||
},
|
||||
{
|
||||
"period": 9,
|
||||
"currency": "USD",
|
||||
"fxSelection": {
|
||||
"nature": "commercial",
|
||||
"submissionDate": "2026-10-26",
|
||||
"bulletinDate": "2026-10-26",
|
||||
"bulletinRef": "QA pressuposto sintético64; não boletim real",
|
||||
"source": "https://www.bancomoc.mz/",
|
||||
"sourceCurrency": "USD",
|
||||
"direction": "mzn_per_unit",
|
||||
"bulletinPerspective": "",
|
||||
"relation": "",
|
||||
"buy": "",
|
||||
"sell": "",
|
||||
"mean": "64",
|
||||
"mode": "general",
|
||||
"exceptionRef": "",
|
||||
"exceptionScope": "",
|
||||
"exceptionDate": "",
|
||||
"exceptionRate": "",
|
||||
"applied": {
|
||||
"column": "mean",
|
||||
"rate": "64",
|
||||
"date": "2026-10-26",
|
||||
"source": "QA pressuposto sintético64; não boletim real;https://www.bancomoc.mz/;perspectiva:média de referênciaBM;natureza:commercial;relação:não aplicável à média;Orientação operacional expressa da Tempo,25/10/2026:compra de moeda→taxa de compra;venda→taxa de venda;operações comerciais→taxa média de referência do Banco de Moçambique na data de submissão indicada. Interpretar compra/venda pela perspectiva do boletim. Excepções fiscais específicas conservam disposição,data,taxa e âmbito;sem recálculo automático dos históricos.",
|
||||
"selectedAt": "2026-10-26T07:51:24.920Z",
|
||||
"selectionKey": "{\"nature\":\"commercial\",\"submissionDate\":\"2026-10-26\",\"bulletinDate\":\"2026-10-26\",\"bulletinRef\":\"QA pressuposto sintético64; não boletim real\",\"source\":\"https://www.bancomoc.mz/\",\"sourceCurrency\":\"USD\",\"direction\":\"mzn_per_unit\",\"bulletinPerspective\":\"\",\"relation\":\"\",\"buy\":\"\",\"sell\":\"\",\"mean\":\"64\",\"mode\":\"general\",\"exceptionRef\":\"\",\"exceptionScope\":\"\",\"exceptionDate\":\"\",\"exceptionRate\":\"\"}"
|
||||
}
|
||||
}
|
||||
},
|
||||
{
|
||||
"period": 10,
|
||||
"currency": "USD",
|
||||
"fxSelection": {
|
||||
"nature": "commercial",
|
||||
"submissionDate": "2026-10-26",
|
||||
"bulletinDate": "2026-10-26",
|
||||
"bulletinRef": "QA pressuposto sintético64; não boletim real",
|
||||
"source": "https://www.bancomoc.mz/",
|
||||
"sourceCurrency": "USD",
|
||||
"direction": "mzn_per_unit",
|
||||
"bulletinPerspective": "",
|
||||
"relation": "",
|
||||
"buy": "",
|
||||
"sell": "",
|
||||
"mean": "64",
|
||||
"mode": "general",
|
||||
"exceptionRef": "",
|
||||
"exceptionScope": "",
|
||||
"exceptionDate": "",
|
||||
"exceptionRate": "",
|
||||
"applied": {
|
||||
"column": "mean",
|
||||
"rate": "64",
|
||||
"date": "2026-10-26",
|
||||
"source": "QA pressuposto sintético64; não boletim real;https://www.bancomoc.mz/;perspectiva:média de referênciaBM;natureza:commercial;relação:não aplicável à média;Orientação operacional expressa da Tempo,25/10/2026:compra de moeda→taxa de compra;venda→taxa de venda;operações comerciais→taxa média de referência do Banco de Moçambique na data de submissão indicada. Interpretar compra/venda pela perspectiva do boletim. Excepções fiscais específicas conservam disposição,data,taxa e âmbito;sem recálculo automático dos históricos.",
|
||||
"selectedAt": "2026-10-26T07:51:24.920Z",
|
||||
"selectionKey": "{\"nature\":\"commercial\",\"submissionDate\":\"2026-10-26\",\"bulletinDate\":\"2026-10-26\",\"bulletinRef\":\"QA pressuposto sintético64; não boletim real\",\"source\":\"https://www.bancomoc.mz/\",\"sourceCurrency\":\"USD\",\"direction\":\"mzn_per_unit\",\"bulletinPerspective\":\"\",\"relation\":\"\",\"buy\":\"\",\"sell\":\"\",\"mean\":\"64\",\"mode\":\"general\",\"exceptionRef\":\"\",\"exceptionScope\":\"\",\"exceptionDate\":\"\",\"exceptionRate\":\"\"}"
|
||||
}
|
||||
}
|
||||
},
|
||||
{
|
||||
"period": 11,
|
||||
"currency": "USD",
|
||||
"fxSelection": {
|
||||
"nature": "commercial",
|
||||
"submissionDate": "2026-10-26",
|
||||
"bulletinDate": "2026-10-26",
|
||||
"bulletinRef": "QA pressuposto sintético64; não boletim real",
|
||||
"source": "https://www.bancomoc.mz/",
|
||||
"sourceCurrency": "USD",
|
||||
"direction": "mzn_per_unit",
|
||||
"bulletinPerspective": "",
|
||||
"relation": "",
|
||||
"buy": "",
|
||||
"sell": "",
|
||||
"mean": "64",
|
||||
"mode": "general",
|
||||
"exceptionRef": "",
|
||||
"exceptionScope": "",
|
||||
"exceptionDate": "",
|
||||
"exceptionRate": "",
|
||||
"applied": {
|
||||
"column": "mean",
|
||||
"rate": "64",
|
||||
"date": "2026-10-26",
|
||||
"source": "QA pressuposto sintético64; não boletim real;https://www.bancomoc.mz/;perspectiva:média de referênciaBM;natureza:commercial;relação:não aplicável à média;Orientação operacional expressa da Tempo,25/10/2026:compra de moeda→taxa de compra;venda→taxa de venda;operações comerciais→taxa média de referência do Banco de Moçambique na data de submissão indicada. Interpretar compra/venda pela perspectiva do boletim. Excepções fiscais específicas conservam disposição,data,taxa e âmbito;sem recálculo automático dos históricos.",
|
||||
"selectedAt": "2026-10-26T07:51:24.920Z",
|
||||
"selectionKey": "{\"nature\":\"commercial\",\"submissionDate\":\"2026-10-26\",\"bulletinDate\":\"2026-10-26\",\"bulletinRef\":\"QA pressuposto sintético64; não boletim real\",\"source\":\"https://www.bancomoc.mz/\",\"sourceCurrency\":\"USD\",\"direction\":\"mzn_per_unit\",\"bulletinPerspective\":\"\",\"relation\":\"\",\"buy\":\"\",\"sell\":\"\",\"mean\":\"64\",\"mode\":\"general\",\"exceptionRef\":\"\",\"exceptionScope\":\"\",\"exceptionDate\":\"\",\"exceptionRate\":\"\"}"
|
||||
}
|
||||
}
|
||||
},
|
||||
{
|
||||
"period": 12,
|
||||
"currency": "USD",
|
||||
"fxSelection": {
|
||||
"nature": "commercial",
|
||||
"submissionDate": "2026-10-26",
|
||||
"bulletinDate": "2026-10-26",
|
||||
"bulletinRef": "QA pressuposto sintético64; não boletim real",
|
||||
"source": "https://www.bancomoc.mz/",
|
||||
"sourceCurrency": "USD",
|
||||
"direction": "mzn_per_unit",
|
||||
"bulletinPerspective": "",
|
||||
"relation": "",
|
||||
"buy": "",
|
||||
"sell": "",
|
||||
"mean": "64",
|
||||
"mode": "general",
|
||||
"exceptionRef": "",
|
||||
"exceptionScope": "",
|
||||
"exceptionDate": "",
|
||||
"exceptionRate": "",
|
||||
"applied": {
|
||||
"column": "mean",
|
||||
"rate": "64",
|
||||
"date": "2026-10-26",
|
||||
"source": "QA pressuposto sintético64; não boletim real;https://www.bancomoc.mz/;perspectiva:média de referênciaBM;natureza:commercial;relação:não aplicável à média;Orientação operacional expressa da Tempo,25/10/2026:compra de moeda→taxa de compra;venda→taxa de venda;operações comerciais→taxa média de referência do Banco de Moçambique na data de submissão indicada. Interpretar compra/venda pela perspectiva do boletim. Excepções fiscais específicas conservam disposição,data,taxa e âmbito;sem recálculo automático dos históricos.",
|
||||
"selectedAt": "2026-10-26T07:51:24.920Z",
|
||||
"selectionKey": "{\"nature\":\"commercial\",\"submissionDate\":\"2026-10-26\",\"bulletinDate\":\"2026-10-26\",\"bulletinRef\":\"QA pressuposto sintético64; não boletim real\",\"source\":\"https://www.bancomoc.mz/\",\"sourceCurrency\":\"USD\",\"direction\":\"mzn_per_unit\",\"bulletinPerspective\":\"\",\"relation\":\"\",\"buy\":\"\",\"sell\":\"\",\"mean\":\"64\",\"mode\":\"general\",\"exceptionRef\":\"\",\"exceptionScope\":\"\",\"exceptionDate\":\"\",\"exceptionRate\":\"\"}"
|
||||
}
|
||||
}
|
||||
}
|
||||
]
|
||||
},
|
||||
"pending": []
|
||||
},
|
||||
"missing": {
|
||||
"accountingProfit": null,
|
||||
"taxableProfit": null,
|
||||
"taxableBase": null,
|
||||
"colecta": null,
|
||||
"period": {
|
||||
"version": 1,
|
||||
"kind": "start",
|
||||
"from": "2026-07-01",
|
||||
"to": "2026-12-31",
|
||||
"planStart": "2026-01-01",
|
||||
"reference": "QA início documentado1Julho;correspondência completa dos meses7–12 ao período do sujeito",
|
||||
"conversionReference": "QA pressuposto de simulação64MZN/USD aplicado aos meses seleccionados;sem regra fiscal anual confirmada",
|
||||
"mznMapsReference": "QA activo/quotas/juros e demais mapas reconciliados explicitamente emMZN no período",
|
||||
"months": [
|
||||
{
|
||||
"period": 7,
|
||||
"currency": "USD",
|
||||
"fxSelection": {
|
||||
"nature": "commercial",
|
||||
"submissionDate": "2026-10-26",
|
||||
"bulletinDate": "2026-10-26",
|
||||
"bulletinRef": "QA pressuposto sintético64; não boletim real",
|
||||
"source": "https://www.bancomoc.mz/",
|
||||
"sourceCurrency": "USD",
|
||||
"direction": "mzn_per_unit",
|
||||
"bulletinPerspective": "",
|
||||
"relation": "",
|
||||
"buy": "",
|
||||
"sell": "",
|
||||
"mean": "64",
|
||||
"mode": "general",
|
||||
"exceptionRef": "",
|
||||
"exceptionScope": "",
|
||||
"exceptionDate": "",
|
||||
"exceptionRate": "",
|
||||
"applied": {
|
||||
"column": "mean",
|
||||
"rate": "64",
|
||||
"date": "2026-10-26",
|
||||
"source": "QA pressuposto sintético64; não boletim real;https://www.bancomoc.mz/;perspectiva:média de referênciaBM;natureza:commercial;relação:não aplicável à média;Orientação operacional expressa da Tempo,25/10/2026:compra de moeda→taxa de compra;venda→taxa de venda;operações comerciais→taxa média de referência do Banco de Moçambique na data de submissão indicada. Interpretar compra/venda pela perspectiva do boletim. Excepções fiscais específicas conservam disposição,data,taxa e âmbito;sem recálculo automático dos históricos.",
|
||||
"selectedAt": "2026-10-26T07:51:24.924Z",
|
||||
"selectionKey": "{\"nature\":\"commercial\",\"submissionDate\":\"2026-10-26\",\"bulletinDate\":\"2026-10-26\",\"bulletinRef\":\"QA pressuposto sintético64; não boletim real\",\"source\":\"https://www.bancomoc.mz/\",\"sourceCurrency\":\"USD\",\"direction\":\"mzn_per_unit\",\"bulletinPerspective\":\"\",\"relation\":\"\",\"buy\":\"\",\"sell\":\"\",\"mean\":\"64\",\"mode\":\"general\",\"exceptionRef\":\"\",\"exceptionScope\":\"\",\"exceptionDate\":\"\",\"exceptionRate\":\"\"}"
|
||||
}
|
||||
}
|
||||
},
|
||||
{
|
||||
"period": 8,
|
||||
"currency": "USD",
|
||||
"fxSelection": {
|
||||
"nature": "commercial",
|
||||
"submissionDate": "2026-10-26",
|
||||
"bulletinDate": "2026-10-26",
|
||||
"bulletinRef": "QA pressuposto sintético64; não boletim real",
|
||||
"source": "https://www.bancomoc.mz/",
|
||||
"sourceCurrency": "USD",
|
||||
"direction": "mzn_per_unit",
|
||||
"bulletinPerspective": "",
|
||||
"relation": "",
|
||||
"buy": "",
|
||||
"sell": "",
|
||||
"mean": "64",
|
||||
"mode": "general",
|
||||
"exceptionRef": "",
|
||||
"exceptionScope": "",
|
||||
"exceptionDate": "",
|
||||
"exceptionRate": "",
|
||||
"applied": {
|
||||
"column": "mean",
|
||||
"rate": "64",
|
||||
"date": "2026-10-26",
|
||||
"source": "QA pressuposto sintético64; não boletim real;https://www.bancomoc.mz/;perspectiva:média de referênciaBM;natureza:commercial;relação:não aplicável à média;Orientação operacional expressa da Tempo,25/10/2026:compra de moeda→taxa de compra;venda→taxa de venda;operações comerciais→taxa média de referência do Banco de Moçambique na data de submissão indicada. Interpretar compra/venda pela perspectiva do boletim. Excepções fiscais específicas conservam disposição,data,taxa e âmbito;sem recálculo automático dos históricos.",
|
||||
"selectedAt": "2026-10-26T07:51:24.924Z",
|
||||
"selectionKey": "{\"nature\":\"commercial\",\"submissionDate\":\"2026-10-26\",\"bulletinDate\":\"2026-10-26\",\"bulletinRef\":\"QA pressuposto sintético64; não boletim real\",\"source\":\"https://www.bancomoc.mz/\",\"sourceCurrency\":\"USD\",\"direction\":\"mzn_per_unit\",\"bulletinPerspective\":\"\",\"relation\":\"\",\"buy\":\"\",\"sell\":\"\",\"mean\":\"64\",\"mode\":\"general\",\"exceptionRef\":\"\",\"exceptionScope\":\"\",\"exceptionDate\":\"\",\"exceptionRate\":\"\"}"
|
||||
}
|
||||
}
|
||||
},
|
||||
{
|
||||
"period": 9,
|
||||
"currency": "USD",
|
||||
"fxSelection": {
|
||||
"nature": "commercial",
|
||||
"submissionDate": "2026-10-26",
|
||||
"bulletinDate": "2026-10-26",
|
||||
"bulletinRef": "QA pressuposto sintético64; não boletim real",
|
||||
"source": "https://www.bancomoc.mz/",
|
||||
"sourceCurrency": "USD",
|
||||
"direction": "mzn_per_unit",
|
||||
"bulletinPerspective": "",
|
||||
"relation": "",
|
||||
"buy": "",
|
||||
"sell": "",
|
||||
"mean": "64",
|
||||
"mode": "general",
|
||||
"exceptionRef": "",
|
||||
"exceptionScope": "",
|
||||
"exceptionDate": "",
|
||||
"exceptionRate": "",
|
||||
"applied": {
|
||||
"column": "mean",
|
||||
"rate": "64",
|
||||
"date": "2026-10-26",
|
||||
"source": "QA pressuposto sintético64; não boletim real;https://www.bancomoc.mz/;perspectiva:média de referênciaBM;natureza:commercial;relação:não aplicável à média;Orientação operacional expressa da Tempo,25/10/2026:compra de moeda→taxa de compra;venda→taxa de venda;operações comerciais→taxa média de referência do Banco de Moçambique na data de submissão indicada. Interpretar compra/venda pela perspectiva do boletim. Excepções fiscais específicas conservam disposição,data,taxa e âmbito;sem recálculo automático dos históricos.",
|
||||
"selectedAt": "2026-10-26T07:51:24.924Z",
|
||||
"selectionKey": "{\"nature\":\"commercial\",\"submissionDate\":\"2026-10-26\",\"bulletinDate\":\"2026-10-26\",\"bulletinRef\":\"QA pressuposto sintético64; não boletim real\",\"source\":\"https://www.bancomoc.mz/\",\"sourceCurrency\":\"USD\",\"direction\":\"mzn_per_unit\",\"bulletinPerspective\":\"\",\"relation\":\"\",\"buy\":\"\",\"sell\":\"\",\"mean\":\"64\",\"mode\":\"general\",\"exceptionRef\":\"\",\"exceptionScope\":\"\",\"exceptionDate\":\"\",\"exceptionRate\":\"\"}"
|
||||
}
|
||||
}
|
||||
},
|
||||
{
|
||||
"period": 10,
|
||||
"currency": "USD",
|
||||
"fxSelection": {
|
||||
"nature": "commercial",
|
||||
"submissionDate": "2026-10-26",
|
||||
"bulletinDate": "2026-10-26",
|
||||
"bulletinRef": "QA pressuposto sintético64; não boletim real",
|
||||
"source": "https://www.bancomoc.mz/",
|
||||
"sourceCurrency": "USD",
|
||||
"direction": "mzn_per_unit",
|
||||
"bulletinPerspective": "",
|
||||
"relation": "",
|
||||
"buy": "",
|
||||
"sell": "",
|
||||
"mean": "64",
|
||||
"mode": "general",
|
||||
"exceptionRef": "",
|
||||
"exceptionScope": "",
|
||||
"exceptionDate": "",
|
||||
"exceptionRate": "",
|
||||
"applied": {
|
||||
"column": "mean",
|
||||
"rate": "64",
|
||||
"date": "2026-10-26",
|
||||
"source": "QA pressuposto sintético64; não boletim real;https://www.bancomoc.mz/;perspectiva:média de referênciaBM;natureza:commercial;relação:não aplicável à média;Orientação operacional expressa da Tempo,25/10/2026:compra de moeda→taxa de compra;venda→taxa de venda;operações comerciais→taxa média de referência do Banco de Moçambique na data de submissão indicada. Interpretar compra/venda pela perspectiva do boletim. Excepções fiscais específicas conservam disposição,data,taxa e âmbito;sem recálculo automático dos históricos.",
|
||||
"selectedAt": "2026-10-26T07:51:24.924Z",
|
||||
"selectionKey": "{\"nature\":\"commercial\",\"submissionDate\":\"2026-10-26\",\"bulletinDate\":\"2026-10-26\",\"bulletinRef\":\"QA pressuposto sintético64; não boletim real\",\"source\":\"https://www.bancomoc.mz/\",\"sourceCurrency\":\"USD\",\"direction\":\"mzn_per_unit\",\"bulletinPerspective\":\"\",\"relation\":\"\",\"buy\":\"\",\"sell\":\"\",\"mean\":\"64\",\"mode\":\"general\",\"exceptionRef\":\"\",\"exceptionScope\":\"\",\"exceptionDate\":\"\",\"exceptionRate\":\"\"}"
|
||||
}
|
||||
}
|
||||
},
|
||||
{
|
||||
"period": 11,
|
||||
"currency": "USD",
|
||||
"fxSelection": {
|
||||
"nature": "commercial",
|
||||
"submissionDate": "2026-10-26",
|
||||
"bulletinDate": "2026-10-26",
|
||||
"bulletinRef": "QA pressuposto sintético64; não boletim real",
|
||||
"source": "https://www.bancomoc.mz/",
|
||||
"sourceCurrency": "USD",
|
||||
"direction": "mzn_per_unit",
|
||||
"bulletinPerspective": "",
|
||||
"relation": "",
|
||||
"buy": "",
|
||||
"sell": "",
|
||||
"mean": "64",
|
||||
"mode": "general",
|
||||
"exceptionRef": "",
|
||||
"exceptionScope": "",
|
||||
"exceptionDate": "",
|
||||
"exceptionRate": "",
|
||||
"applied": {
|
||||
"column": "mean",
|
||||
"rate": "64",
|
||||
"date": "2026-10-26",
|
||||
"source": "QA pressuposto sintético64; não boletim real;https://www.bancomoc.mz/;perspectiva:média de referênciaBM;natureza:commercial;relação:não aplicável à média;Orientação operacional expressa da Tempo,25/10/2026:compra de moeda→taxa de compra;venda→taxa de venda;operações comerciais→taxa média de referência do Banco de Moçambique na data de submissão indicada. Interpretar compra/venda pela perspectiva do boletim. Excepções fiscais específicas conservam disposição,data,taxa e âmbito;sem recálculo automático dos históricos.",
|
||||
"selectedAt": "2026-10-26T07:51:24.924Z",
|
||||
"selectionKey": "{\"nature\":\"commercial\",\"submissionDate\":\"2026-10-26\",\"bulletinDate\":\"2026-10-26\",\"bulletinRef\":\"QA pressuposto sintético64; não boletim real\",\"source\":\"https://www.bancomoc.mz/\",\"sourceCurrency\":\"USD\",\"direction\":\"mzn_per_unit\",\"bulletinPerspective\":\"\",\"relation\":\"\",\"buy\":\"\",\"sell\":\"\",\"mean\":\"64\",\"mode\":\"general\",\"exceptionRef\":\"\",\"exceptionScope\":\"\",\"exceptionDate\":\"\",\"exceptionRate\":\"\"}"
|
||||
}
|
||||
}
|
||||
}
|
||||
]
|
||||
},
|
||||
"pending": [
|
||||
"revenue/mês12: Error: Selecção cambial deste mês/moeda em falta;sem usar taxa de outro mês por defeito.",
|
||||
"cost_of_sales/mês12: Error: Selecção cambial deste mês/moeda em falta;sem usar taxa de outro mês por defeito.",
|
||||
"operating_expenses/mês12: Error: Selecção cambial deste mês/moeda em falta;sem usar taxa de outro mês por defeito.",
|
||||
"personnel/mês12: Error: Selecção cambial deste mês/moeda em falta;sem usar taxa de outro mês por defeito.",
|
||||
"depreciation/mês12: Error: Selecção cambial deste mês/moeda em falta;sem usar taxa de outro mês por defeito.",
|
||||
"interest_expense/mês12: Error: Selecção cambial deste mês/moeda em falta;sem usar taxa de outro mês por defeito."
|
||||
]
|
||||
},
|
||||
"loss": {
|
||||
"accountingProfit": {
|
||||
"numerator": "3120",
|
||||
"denominator": "1"
|
||||
},
|
||||
"taxableProfit": {
|
||||
"numerator": "3130",
|
||||
"denominator": "1"
|
||||
},
|
||||
"taxableBase": null,
|
||||
"colecta": null,
|
||||
"period": {
|
||||
"version": 1,
|
||||
"kind": "start",
|
||||
"from": "2026-07-01",
|
||||
"to": "2026-12-31",
|
||||
"planStart": "2026-01-01",
|
||||
"reference": "QA início documentado1Julho;correspondência completa dos meses7–12 ao período do sujeito",
|
||||
"conversionReference": "",
|
||||
"mznMapsReference": "QA activo/quotas/juros e demais mapas reconciliados explicitamente emMZN no período",
|
||||
"months": []
|
||||
},
|
||||
"pending": []
|
||||
}
|
||||
},
|
||||
"verification": {
|
||||
"frontend_tests": 13,
|
||||
"API_tests": 1,
|
||||
"API_assertions": 58,
|
||||
"database": "127.0.0.1:55441/simulator_fiscal_delta_20261021_test;DatabaseTransactions rollback",
|
||||
"routes_actions": "generated by guarded existing procedure",
|
||||
"typescript": "passed",
|
||||
"build": "passed",
|
||||
"UI": "actual component;dates/FX edit+confirmation;originals/assumptions;save/recovery/export;missingdata",
|
||||
"accepted_proofs": "reused"
|
||||
},
|
||||
"runtime_delta": [
|
||||
{
|
||||
"path": "resources/js/components/simulation-irpc-normal.tsx",
|
||||
"sha256_LF": "557714bb3af75080e443ae67b11a66d9feb49d9a4b269065769b128a6d712837"
|
||||
},
|
||||
{
|
||||
"path": "resources/js/components/simulation-irpc-period-fx.tsx",
|
||||
"sha256_LF": "4b5f718b5ef415ecf5f96dabb0e3806254558c20905de6478e10dacf67569c49"
|
||||
},
|
||||
{
|
||||
"path": "resources/js/components/simulation-irpc-schedules.tsx",
|
||||
"sha256_LF": "3768c316d5887d337eb3647671863c9464f961d1df4703403e7d57e5641273ed"
|
||||
},
|
||||
{
|
||||
"path": "resources/js/lib/irpc-normal-assessment.ts",
|
||||
"sha256_LF": "a9b3ced852e37e3e087ce5dab1add4ec0737145ce19f61857a54d5d3d24a6f8c"
|
||||
},
|
||||
{
|
||||
"path": "resources/js/lib/irpc-normal-base.ts",
|
||||
"sha256_LF": "22019d678f6eb16fead2207dc3d3fa9fd63413c6254633c1ffd4f1c0320344ac"
|
||||
},
|
||||
{
|
||||
"path": "resources/js/lib/irpc-normal-costs.ts",
|
||||
"sha256_LF": "471457692a2a2f70a1bd1c7abb38d3ce42f07b62a63e5a4ab985ad1bbd068b46"
|
||||
},
|
||||
{
|
||||
"path": "resources/js/lib/irpc-normal-depreciation.ts",
|
||||
"sha256_LF": "1dad3053157aeac44f6d3bd58885cfc47a73c19d2808284c16931679dfe4291b"
|
||||
},
|
||||
{
|
||||
"path": "resources/js/lib/irpc-normal-period-fx.ts",
|
||||
"sha256_LF": "a2e7b066623eae17f0d8185d065d0adf5d3a485f780f8b09118a664dc4ba0531"
|
||||
},
|
||||
{
|
||||
"path": "resources/js/lib/irpc-normal.ts",
|
||||
"sha256_LF": "e4de2fe0421e489bf555885b9cbb459c00ee77803ea9b6e5af45179bd6bb4f21"
|
||||
}
|
||||
],
|
||||
"protected_runtime": [
|
||||
{
|
||||
"path": "resources/js/components/simulation-irpc-depreciation.tsx",
|
||||
"sha256_LF": "1f9918bfb435bb5b7c0ddd2fafd7bace2a02514c6ece04b93f15975e494a5f53"
|
||||
},
|
||||
{
|
||||
"path": "resources/js/lib/irpc-normal-profit.ts",
|
||||
"sha256_LF": "909e129a0245e6bf098317485b886a2d19e02c64bbfd9c6f718e98ec6b935b8d"
|
||||
},
|
||||
{
|
||||
"path": "resources/js/lib/irpc-normal-schedules.ts",
|
||||
"sha256_LF": "edfb6fd338411fa8f87a6bdf9a9d4fd5c6dc2fad9d2eb3d32f2640e2951cbbe9"
|
||||
},
|
||||
{
|
||||
"path": "resources/js/components/simulation-irpc-costs.tsx",
|
||||
"sha256_LF": "c4156916835daf0f33addf89dfedd40c31b8dc3297112cd98beac33422af274d"
|
||||
},
|
||||
{
|
||||
"path": "resources/js/lib/irpc-normal-forms.ts",
|
||||
"sha256_LF": "4e986addb9f2d74e7a80345f8f1e4d8e0b2f562c867fa6eee84880d9f72a3649"
|
||||
},
|
||||
{
|
||||
"path": "resources/js/components/simulation-irpc-taxable-base.tsx",
|
||||
"sha256_LF": "e4fe9f66d35d24aa68fd87de6a5a6a0e901706b270c18962fd0c7ab00f9abd93"
|
||||
},
|
||||
{
|
||||
"path": "resources/js/components/simulation-irpc-assessment.tsx",
|
||||
"sha256_LF": "7174cc0160005a0c332ea40f02ba8a6d57985081b5ab45177ccd6e721bceea54"
|
||||
},
|
||||
{
|
||||
"path": "resources/js/components/acquisition-beverage-restitution.tsx",
|
||||
"sha256_LF": "6f44897b8b12569314551df0022c26da57a165634087942a724293e66837558d"
|
||||
},
|
||||
{
|
||||
"path": "resources/js/components/fiscal-calculation-gaps.tsx",
|
||||
"sha256_LF": "1dab6ceb73756d4e023096b3b2ba767aaa843ff6cc69046ea630ab449a00b0dd"
|
||||
},
|
||||
{
|
||||
"path": "resources/js/components/fiscal-l3-preparation.tsx",
|
||||
"sha256_LF": "e84a7b1ccadaa1b5bd78d778a3287f96ccaf530855eef404786cd7aa3d321b73"
|
||||
},
|
||||
{
|
||||
"path": "resources/js/components/simulation-acquisitions.tsx",
|
||||
"sha256_LF": "c206d4cfe575d6ba007aa2b425b5f898efa97e4162b8710e358b6ecfd9458542"
|
||||
},
|
||||
{
|
||||
"path": "resources/js/components/simulation-operations.tsx",
|
||||
"sha256_LF": "a7e55972fa790063dcf11945055de2af46a77db9e509900af22ede7ec47bb4cf"
|
||||
},
|
||||
{
|
||||
"path": "resources/js/lib/iva-acquisition-bc.ts",
|
||||
"sha256_LF": "b0ef55e0917bdb79f14b53ba9e95d73c08153befeb7d4ce73f81e6fb13992225"
|
||||
},
|
||||
{
|
||||
"path": "resources/js/lib/iva-beverage-allocation.ts",
|
||||
"sha256_LF": "32968d198c7fe0c53ca89641c22d5749be6636be2c79127b867e4e3afd0dd40d"
|
||||
},
|
||||
{
|
||||
"path": "resources/js/lib/iva-beverage-restitution.ts",
|
||||
"sha256_LF": "5c650cbd9469d5f99001f56fc4ff99ac973eb368036d4e96c6d171f1b220bd9e"
|
||||
},
|
||||
{
|
||||
"path": "resources/js/lib/iva-calculation-gaps.ts",
|
||||
"sha256_LF": "2e7d84a0c196bd5b56fd67cc1a389d43d5041894184e675680a4de3cd10b31a2"
|
||||
},
|
||||
{
|
||||
"path": "resources/js/lib/iva-operations.ts",
|
||||
"sha256_LF": "ec37b949f1233c5f5c14a87450c421ed29fabf1ed5b73fb32564564a2bc31f54"
|
||||
},
|
||||
{
|
||||
"path": "resources/js/lib/l3-form-preparation.ts",
|
||||
"sha256_LF": "fc47f5fa5ec1420fbd847d0d081f00d99ebbb524164eef785b20877e0562f704"
|
||||
},
|
||||
{
|
||||
"path": "resources/js/lib/ispc-residuals.ts",
|
||||
"sha256_LF": "40d5751c06c7c155ab4b7a17ee2d1653da2fbbf075807fbb8561cdbe19820955"
|
||||
},
|
||||
{
|
||||
"path": "resources/js/components/simulation-ispc-residuals.tsx",
|
||||
"sha256_LF": "a9219d6f41ccbd0ce45659d4f6aa0fa1c169a685840f5cb1e18daeca377d5e18"
|
||||
},
|
||||
{
|
||||
"path": "resources/js/lib/ispc-eligibility.ts",
|
||||
"sha256_LF": "44675c5efacdc1ae19505667611ba3b522d3043cebacc8754597c3a68ca89d25"
|
||||
},
|
||||
{
|
||||
"path": "resources/js/components/simulation-ispc-quarter.tsx",
|
||||
"sha256_LF": "2c2555309b32d4261f14e7164f39314c9188129c2990357fc54090a2468dd2b4"
|
||||
},
|
||||
{
|
||||
"path": "resources/js/components/simulation-ispc-withholding.tsx",
|
||||
"sha256_LF": "e0445d015b72859e48726959aa52686f79b1cf5c2ade29751efa83257068b878"
|
||||
},
|
||||
{
|
||||
"path": "resources/js/lib/ispc-quarter.ts",
|
||||
"sha256_LF": "f66bd52e9cdfe1ddaa6b00a931465862b3d890b9be216b7a056740f027f24129"
|
||||
},
|
||||
{
|
||||
"path": "resources/js/lib/ispc-withholding.ts",
|
||||
"sha256_LF": "6c31b240299edd3262efa28f7f3d5aee21123f94e30ef4ab90e26c35777cb6e4"
|
||||
},
|
||||
{
|
||||
"path": "resources/js/components/simulation-ispc-eligibility.tsx",
|
||||
"sha256_LF": "f48dd4a8f87a994eda0447f81a463589905e5873b2e1044debac9d10825a880c"
|
||||
},
|
||||
{
|
||||
"path": "resources/js/lib/iva-acquisitions.ts",
|
||||
"sha256_LF": "cce283b1d0a07fb383fcb527225f4dd5bec829010a662cbaae1d60e595221977"
|
||||
},
|
||||
{
|
||||
"path": "resources/js/lib/iva-modelo-a.ts",
|
||||
"sha256_LF": "c641619a05613c1620385baad0e9ffbf810dd970aafb30e12b3a7f9a3bf11846"
|
||||
},
|
||||
{
|
||||
"path": "resources/js/lib/iva-fx-selection.ts",
|
||||
"sha256_LF": "9aa07ad443bc777b80510a3b5bd6aff9ddb9814d2450f3c690e531e74d71d998"
|
||||
},
|
||||
{
|
||||
"path": "resources/js/components/simulation-fx-selection.tsx",
|
||||
"sha256_LF": "39bb6d87d404745b0b66349bc11626545a3672ae27321ce9b4658416592059bf"
|
||||
},
|
||||
{
|
||||
"path": "resources/js/lib/business-financial-plan.ts",
|
||||
"sha256_LF": "c20274722d1ffcd0360f041a6cacb5d868fe0621cb27a1aca6e06826612c3ebb"
|
||||
},
|
||||
{
|
||||
"path": "resources/js/lib/iva-currency-events.ts",
|
||||
"sha256_LF": "cc9f2045d302d7987310da4006cc250fc5c99a27397918d166d649bfc32fab08"
|
||||
},
|
||||
{
|
||||
"path": "resources/js/lib/irpc-fx.ts",
|
||||
"sha256_LF": "5c4a7a477429f8d775acf6db3e117008468f5554e5731dec81f60fbb75e948fb"
|
||||
},
|
||||
{
|
||||
"path": "resources/js/lib/irpc-withholdings.ts",
|
||||
"sha256_LF": "8e5f3c035ce5e4d6c3fc82f933439ab580fa5519492f9c4d32cfb71b77b54803"
|
||||
},
|
||||
{
|
||||
"path": "resources/js/components/simulation-irpc-withholdings.tsx",
|
||||
"sha256_LF": "751af4fab346659bc5ccb08b8a2169769af7521ea0035050af32b41ea7f5aa76"
|
||||
},
|
||||
{
|
||||
"path": "resources/js/lib/irpc-interest.ts",
|
||||
"sha256_LF": "f8e6390b3b2c58c296f7e3fd14576e06ae248bc0cabce1a666b7094611f2a7dd"
|
||||
},
|
||||
{
|
||||
"path": "resources/js/lib/irpc-mrfta.ts",
|
||||
"sha256_LF": "76dcce8954f68b081d500be61de9c5b146a452a3eb578a0b78776ba9e1f8051c"
|
||||
},
|
||||
{
|
||||
"path": "resources/js/lib/irpc-mrfta-cases.ts",
|
||||
"sha256_LF": "4266746076ab3f70312fd042351e24dd2f136c4f3e8a277b57dd97849a9f1862"
|
||||
},
|
||||
{
|
||||
"path": "resources/js/components/simulation-irpc-mrfta.tsx",
|
||||
"sha256_LF": "913d1bb4ac0fc59763cf5d27bc637f6a713b2050c4463748db554af4be451538"
|
||||
},
|
||||
{
|
||||
"path": "resources/js/lib/financial-fiscal-bridge.ts",
|
||||
"sha256_LF": "5a30c501653b16b5fedcb12631ce81fcce4fe473aa542e94374986b3c50f2d33"
|
||||
},
|
||||
{
|
||||
"path": "resources/js/components/simulation-form.tsx",
|
||||
"sha256_LF": "85b024a7f45ceb52efd6ff1f21d0eab1fd8fcf1ab59e4b5302c08685235c472a"
|
||||
},
|
||||
{
|
||||
"path": "resources/js/lib/project-dossier.ts",
|
||||
"sha256_LF": "a0909bbfcdf7e8542b010faa104fcb918e86ae38ddf096082d4d5be98d31b2b9"
|
||||
},
|
||||
{
|
||||
"path": "resources/js/lib/project-dossier-report.ts",
|
||||
"sha256_LF": "5207a2ffeb208cd5ace6713038cee85208020ee618194dca7114e94fc3200b6c"
|
||||
}
|
||||
],
|
||||
"originals_preserved": [
|
||||
{
|
||||
"path": "docs/investmoz/simulations/source-archive/AT-Comunicado-9-2026-ISPC.pdf",
|
||||
"sha256": "106f8a9ce9255c03549c70bf07fe999d32e6e55302d009b509862aa74ccb4973"
|
||||
},
|
||||
{
|
||||
"path": "docs/investmoz/simulations/source-archive/AT-Modelo-30-ISPC.pdf",
|
||||
"sha256": "6802edd06b6ff638a0b851a3ec7ecf69af8f07840faa47446becad67d35d445c"
|
||||
},
|
||||
{
|
||||
"path": "docs/investmoz/simulations/source-archive/AT-Modelo-B-Geral.pdf",
|
||||
"sha256": "bd977c7c59d4d98befd92e2c566b1bf168cb1343bb519f51b41a3807f431fc57"
|
||||
},
|
||||
{
|
||||
"path": "docs/investmoz/simulations/source-archive/AT-MRFTA-19-39.pdf",
|
||||
"sha256": "8ea62c53066b482f87078a7a7b1ecf15ca98a12a122e8d7abca63acfc993186b"
|
||||
},
|
||||
{
|
||||
"path": "docs/investmoz/simulations/source-archive/BM-Mercado-Monetario-MAIBOR-20261025.html",
|
||||
"sha256": "00e8a7e0d3a1db4ca3beb56d5361b2084a0f1684f3d40fc1c203702a2190e063"
|
||||
},
|
||||
{
|
||||
"path": "docs/investmoz/simulations/source-archive/BR-16-I-Serie-2008-04-16.pdf",
|
||||
"sha256": "fc373ff5637edf75ec6a9595dec8763a8503d4ee786e3b7d8f1c742eae9d80ee"
|
||||
},
|
||||
{
|
||||
"path": "docs/investmoz/simulations/source-archive/BR-248-I-Suplemento-1-2025.pdf",
|
||||
"sha256": "ccf2a8deeca820f2dd076b4b2141b1efe3f6a806568c3a587ca59a8e92f4c251"
|
||||
},
|
||||
{
|
||||
"path": "docs/investmoz/simulations/source-archive/BR-89-I-Serie-2017-06-08.pdf",
|
||||
"sha256": "11f0cab15eb6e51010952203ffa24fdc533a24fd642e19525fe4f46b17a1f5e5"
|
||||
},
|
||||
{
|
||||
"path": "docs/investmoz/simulations/source-archive/BR-95-I-Suplemento-2025-05-21.pdf",
|
||||
"sha256": "e0e682e2c027c3cd9c1d46a73a3f48bc5f6bdbf05667fd97314d7a3f6a456358"
|
||||
},
|
||||
{
|
||||
"path": "docs/investmoz/simulations/source-archive/BR252-I-Serie-2022-Lei20-PESOE.pdf",
|
||||
"sha256": "1159fd3ce1ba5581671796d083534da48bd3c5578298819e896f1c2a8026318d"
|
||||
},
|
||||
{
|
||||
"path": "docs/investmoz/simulations/source-archive/Decreto-22-2021-BR70.pdf",
|
||||
"sha256": "a8fac38dcfe08f9c7a8e46254cff10e1ec82fc4f7a8d88ad6e4fe7d91ffc21a5"
|
||||
},
|
||||
{
|
||||
"path": "docs/investmoz/simulations/source-archive/Decreto-27-2026-BR123.pdf",
|
||||
"sha256": "26249c3fa58f149c81de36e99d1aac2819a4771379d9e8833159660dabf539bb"
|
||||
},
|
||||
{
|
||||
"path": "docs/investmoz/simulations/source-archive/Decreto-29-1998-BR22-5-suplemento.pdf",
|
||||
"sha256": "6242cbe675faadf085f43f95ec8c7e8868aafe67c3b2ab2bb010992288f954f8"
|
||||
},
|
||||
{
|
||||
"path": "docs/investmoz/simulations/source-archive/Decreto-3-2011-BR-11-I-mineiros.pdf",
|
||||
"sha256": "5bca1133666ba9c69870b89823420175b7b5b8d0eccb667ecdf5c29716f3b6be"
|
||||
},
|
||||
{
|
||||
"path": "docs/investmoz/simulations/source-archive/Decreto-37-2023-BR124.pdf",
|
||||
"sha256": "7e680b191481faa0e2e9057fa5053587eb2a29d1d8c819e0eb9f02814255a04c"
|
||||
},
|
||||
{
|
||||
"path": "docs/investmoz/simulations/source-archive/Decreto-9-2008-BR16.pdf",
|
||||
"sha256": "96fccdecbfdc11c9eafb90fbc6c7bc259f88bbd4c7507d1ac3af1fa03f960697"
|
||||
},
|
||||
{
|
||||
"path": "docs/investmoz/simulations/source-archive/Lei-13-2016-CIVA-BR-156-10-suplemento.pdf",
|
||||
"sha256": "b90dc7c14ecea2e378c4a62e8e5a47d54a5644c457baeb8b8053b92fd2a5710b"
|
||||
},
|
||||
{
|
||||
"path": "docs/investmoz/simulations/source-archive/Lei-14-1992-BR42.pdf",
|
||||
"sha256": "089fff7423e99a70a230a73ca379e4ea3a91d124703f91016e57ff82794b9e56"
|
||||
},
|
||||
{
|
||||
"path": "docs/investmoz/simulations/source-archive/Lei-17-2022-BR251-exemplar-MCNet5.pdf",
|
||||
"sha256": "14eb34f0af91a8f5cb1770c7b52d6ff839c6818302d1ed96d79afbfb9fe999d4"
|
||||
},
|
||||
{
|
||||
"path": "docs/investmoz/simulations/source-archive/Lei-17-2022-IPP-BR250-Parlamento.pdf",
|
||||
"sha256": "978cd22403ffd336a631704ecd7a5bbd814a427c815b9acdaca5515591dd9e2a"
|
||||
},
|
||||
{
|
||||
"path": "docs/investmoz/simulations/source-archive/Lei-19-2013-BR76.pdf",
|
||||
"sha256": "bba96d645cc935ffc3d1a79b9f0f73ac1c693d6459c2ad41f56cd2841accae76"
|
||||
},
|
||||
{
|
||||
"path": "docs/investmoz/simulations/source-archive/Lei-19-2017-IRPS-BR-OCAM.pdf",
|
||||
"sha256": "c3a0186cb9ad090d7a9533006295dc9bb6a62ad0d6150173cbd49dba4ee4b52d"
|
||||
},
|
||||
{
|
||||
"path": "docs/investmoz/simulations/source-archive/Lei-2-2011-BR-1-4-suplemento-MCNet.pdf",
|
||||
"sha256": "a7543a68cc3287a46a83c39a04821b40f649dd06c4e9b5dc51ff0b47fba08899"
|
||||
},
|
||||
{
|
||||
"path": "docs/investmoz/simulations/source-archive/Lei-20-2009-BR36-AT-exemplar19.pdf",
|
||||
"sha256": "fc1c8144db42960cbf73e717e095896f511ece0f907f58f78819b27d6917a7ee"
|
||||
},
|
||||
{
|
||||
"path": "docs/investmoz/simulations/source-archive/Lei-22-2022-IVA-republicada-BR-250-2-suplemento.pdf",
|
||||
"sha256": "ea1b0dc6f5cf6e595f6d9a19e7042f398999e0087caef1785f6e8fac571b5f53"
|
||||
},
|
||||
{
|
||||
"path": "docs/investmoz/simulations/source-archive/Lei-34-2007-BR52.pdf",
|
||||
"sha256": "cdbef875ad7ccc1517b12faf5de0e893a70ed2ed81e33913cd6dc4a674474e6e"
|
||||
},
|
||||
{
|
||||
"path": "docs/investmoz/simulations/source-archive/Lei-4-1994-BR37-3-suplemento.pdf",
|
||||
"sha256": "210df9db8980d0a5690cd187a6eeec7e37a900d743e39062c16f4e0d12215c7e"
|
||||
},
|
||||
{
|
||||
"path": "docs/investmoz/simulations/source-archive/Lei-4-2012-BR3.pdf",
|
||||
"sha256": "b8845cef41dcbd9ba50c43dbfa743a56030dd3d348242a107e1ae30279eec121"
|
||||
},
|
||||
{
|
||||
"path": "docs/investmoz/simulations/source-archive/Lei-7-1991-Partidos-IFES.pdf",
|
||||
"sha256": "6b783a0bb3330688ef10660a58060d9724aa2da6a873d234fe902f0eaaeda42d"
|
||||
},
|
||||
{
|
||||
"path": "docs/investmoz/simulations/source-archive/PT-MZ-CDT-1992.pdf",
|
||||
"sha256": "d504e1024b28aee5c6acf4592acb96ec9c915a8414f67a61ab6984d6acf9df9d"
|
||||
},
|
||||
{
|
||||
"path": "docs/investmoz/simulations/source-archive/PT-MZ-Protocolo-2009.pdf",
|
||||
"sha256": "f353773dcf41f09f4daa6cf5ba5a5f7994f3e02615867c2dcffc61c3d901bf9b"
|
||||
}
|
||||
],
|
||||
"source_evidence": {
|
||||
"CIRPC": "Lei34/2007 PDF4 art7(4)/(7),PDF12 art41(5);original preserved",
|
||||
"decree72_reused_sha256": "922ef67cb0c1111405c3c0a092d8c302a74fba8a34d627b6e9e13223612e0659",
|
||||
"visual_pages": [
|
||||
"cirpc-page4.png",
|
||||
"cirpc-page12.png",
|
||||
"decreto72-page3.png"
|
||||
]
|
||||
},
|
||||
"installed7_fixture_sha256": "d58beac3cf7db665a632f516a736f754a5874f82585291dfbc5fa6bcda654d0d",
|
||||
"history_versions1_to7": "unchanged;optional8;source plan not rewritten",
|
||||
"FX_engine": "Existing selectFx/convertIrpcAmount/convertCents/direction/evidence/link unchanged;monthly assumptions explicit;no fiscal annual rule asserted",
|
||||
"FX_rate64": "synthetic QA assumption,not real BM bulletin",
|
||||
"schema_API_config_permissions_dependencies_changed": false,
|
||||
"active_data_changed": false,
|
||||
"L6_complete": false,
|
||||
"L7_L8_own_scopes": true,
|
||||
"remaining_reference": "Same matrix section26/10 períodos curtos e planos noutra moeda;concrete conditions per case",
|
||||
"proof_sha256": {
|
||||
"api.txt": "e2c50de5a45a76cdd596d4093974b88c449d23ba8011edf5f8a6325d2cf01d07",
|
||||
"build-exit.txt": "13bf7b3039c63bf5a50491fa3cfd8eb4e699d1ba1436315aef9cbe5711530354",
|
||||
"build.txt": "9b167ca7bcd724a65f6a4030a46ce9e81accaad5a2e80160b623ca3807400bc7",
|
||||
"cirpc-page12.png": "12bb97ef4964b69816c30894bca201cedf2dcbadb29b3be9e867f2325e575abd",
|
||||
"cirpc-page4.png": "3f6fdfd75d4fef4d07f461969675118f5f000c33ab593fcb6e0ee0fc93f56737",
|
||||
"cirpc.txt": "c3ba3b845fcb12c25bc28b08485f3e5d70034895ece4ff60cf640fd0be796f9a",
|
||||
"decreto-72-2013.pdf": "922ef67cb0c1111405c3c0a092d8c302a74fba8a34d627b6e9e13223612e0659",
|
||||
"decreto72-page3.png": "4a150dd00dc7c7d4602c231bb42ebea5d7505917f1e21781c2d967cf5da8e327",
|
||||
"dossier-fx.json": "5d1e429a48e8fd6c53a9116b3176641146e2aa6b68c888558ac6c4ff0950138c",
|
||||
"dossier-loss.json": "862ee41f5b38546255335ab569039e52388d64f7bf30f38c3033f6f583e04d7c",
|
||||
"dossier-missing.json": "514c2386e8e1cd687545c880fd5e66a0099c851433c0c8f337439a69e56db5b1",
|
||||
"dossier-short.json": "cdab2ed8019f46f132f600c6b301d99ad44e8027926117abf3e57eb6c6000071",
|
||||
"dossier.mjs": "cd967cfdba196bf0b7c691fe418f38dd39232030c6e601c22f8e25bd27e93d46",
|
||||
"download.html": "95f59ff469af21bc2a41225358769bf99f25cf056479ff9a9c3d1dad4cb5f521",
|
||||
"frontend.txt": "d9c7e51b63e020bf35d2a4a3aa22f29ca71d003e4bcf22b111e90173e442745b",
|
||||
"fx.html": "5bae85164ca7cec78d76fc4c72c3c33cdaca70c63c42929c8e037ab7e91ba93f",
|
||||
"fx.json": "e92ed4b718eef390aef573728a459679fdd3130bdf923db4cfd8f7a560958fbf",
|
||||
"index.html": "09941968500d2910121bdcb0029e326fc6d44bb025b01766654289a28caa62fa",
|
||||
"loss.html": "b672fd43361efcc81c4da4f83b7eba12dd9bd7799de0b463f248928065a4de97",
|
||||
"loss.json": "07e56fb88034d377ca9bc2b098b9a4a266058a46aeb7b127a99b3c539bceec1b",
|
||||
"missing.html": "ed41bf1b5ffab532a59b8e07d8a3700bd62576bc15c9256750c84a371a2cbc8a",
|
||||
"missing.json": "5022f8eddd7f09b9a10a837f0e407e7db3619e27302e19f367923a956ebe47a6",
|
||||
"qa.tsx": "c7c06f793e4a5aa3df70f36ec6681a6399b6016f27168d18917be2f22dffdbaf",
|
||||
"recovered-fx.html": "5bae85164ca7cec78d76fc4c72c3c33cdaca70c63c42929c8e037ab7e91ba93f",
|
||||
"recovered-fx.json": "2c7d1e8858af254930bff8a420f3369475ebd335ca4251b4ddc691558ed1c9aa",
|
||||
"recovered-loss.html": "b672fd43361efcc81c4da4f83b7eba12dd9bd7799de0b463f248928065a4de97",
|
||||
"recovered-loss.json": "2618a36d92005ebf791c938687662789086d351606f95f62f4eb1133f4b029e2",
|
||||
"recovered-missing.html": "ed41bf1b5ffab532a59b8e07d8a3700bd62576bc15c9256750c84a371a2cbc8a",
|
||||
"recovered-missing.json": "094b1ee4822bdcee6ac8ce5dc9ea5cfc178bf555b15f31a6cd2a1c6becd759ae",
|
||||
"recovered-short.html": "955f182b29c160774bacc8997477c2da44cd1fcc401d1ed1955fa62f9f94d743",
|
||||
"recovered-short.json": "e4399308561d5f412c9bb803c83fd6e045d89d24986a4d6a8279c2977044bb96",
|
||||
"short.html": "955f182b29c160774bacc8997477c2da44cd1fcc401d1ed1955fa62f9f94d743",
|
||||
"short.json": "a6b0e4ea322353f84c0ba6ff09d6cf89ee270dbefb850f225c4f8fe4485f68fb",
|
||||
"types.txt": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855",
|
||||
"ui-fx.png": "deaede13c0c4eb6cc74ce0a55fc9b7bc2948f52fe7863ffc53ab83ca42456587",
|
||||
"ui-proof.json": "56b6005ea84dfd370ac55167a5f47d19bffcee8408982c2046cb1ad27ecc9f20",
|
||||
"ui-short.png": "b716d583fc3ca286c2e19cbeefca018ec08e8b75e0e95499ff7d27ab06a843d6",
|
||||
"ui.cjs": "1f5506f7865cdbfcfa8aea853be241bab849807e6d641f3c5596534727cb5938",
|
||||
"ui.txt": "85e77d9f361edf72d68990272040cc9b6edab3cc0873f921b1d5e561dc0553af",
|
||||
"vite.config.ts": "0351ec239d5a6ba429ee17b9aa68757e31f59902f8f88a522afdd56bd3b44879"
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,687 @@
|
||||
{
|
||||
"status": "installed_L6_compatible_sets",
|
||||
"installed": {
|
||||
"status": "installed",
|
||||
"commit": "a2de725901c308fb2ac2bc3d72181ab50ef46b7a",
|
||||
"release": "/var/www/investmoz-homologacao/releases/a2de725901c308fb2ac2bc3d72181ab50ef46b7a-145e8f25",
|
||||
"previous_release": "/var/www/investmoz-homologacao/releases/2f684e59846187f3fb8a338d9d6f6a08cadb4d0d-b46cd351",
|
||||
"database_migrations": 0,
|
||||
"content_imports": 0
|
||||
},
|
||||
"previous_baseline": "2f684e59846187f3fb8a338d9d6f6a08cadb4d0d",
|
||||
"backup": {
|
||||
"stage": "/var/backups/investmoz-irpc-l6-sets-delivery-20261025/backup",
|
||||
"created_at": "2026-10-25T20:34:03Z",
|
||||
"target": {
|
||||
"database": "teste_investidor",
|
||||
"port": 5432
|
||||
},
|
||||
"tables": 174,
|
||||
"files_verified": 369,
|
||||
"dump_sha256": "c30f1bb3558988a3e761d04465d0ed594280f10e36b866101b790cdeae60eacd",
|
||||
"files_sha256": "e2a26a462dc115233aa8d1dd12aacc1511db0035de475f703074f28dc7da948a",
|
||||
"restore_verified": false
|
||||
},
|
||||
"restore": {
|
||||
"restore_verified": true,
|
||||
"tables_verified": 174,
|
||||
"container_network": "none",
|
||||
"database": "irpc_l5_restore_20261025",
|
||||
"port": 55441,
|
||||
"source_dump_sha256": "c30f1bb3558988a3e761d04465d0ed594280f10e36b866101b790cdeae60eacd",
|
||||
"active_database_writes": 0
|
||||
},
|
||||
"preservation": {
|
||||
"previous_release_preserved": "/var/www/investmoz-homologacao/releases/2f684e59846187f3fb8a338d9d6f6a08cadb4d0d-b46cd351",
|
||||
"installed": {
|
||||
"status": "installed",
|
||||
"commit": "a2de725901c308fb2ac2bc3d72181ab50ef46b7a",
|
||||
"release": "/var/www/investmoz-homologacao/releases/a2de725901c308fb2ac2bc3d72181ab50ef46b7a-145e8f25",
|
||||
"previous_release": "/var/www/investmoz-homologacao/releases/2f684e59846187f3fb8a338d9d6f6a08cadb4d0d-b46cd351",
|
||||
"database_migrations": 0,
|
||||
"content_imports": 0
|
||||
},
|
||||
"runtime_files_verified": 8,
|
||||
"preserved_L3_ISPC_FX_runtime_files_verified": 38,
|
||||
"documentary_files_verified": 31,
|
||||
"persistent_files_and_env_verified": 369,
|
||||
"tables_compared": 174,
|
||||
"changed_tables": {
|
||||
"cache": {
|
||||
"before": {
|
||||
"rows": 106,
|
||||
"checksum": "edf84d90ae30f0a6a080a6c4929a4601"
|
||||
},
|
||||
"after": {
|
||||
"rows": 106,
|
||||
"checksum": "5226f818ead8e964983de752574a1647"
|
||||
}
|
||||
},
|
||||
"sessions": {
|
||||
"before": {
|
||||
"rows": 31,
|
||||
"checksum": "4bf9b80b2351e8896afacca734410295"
|
||||
},
|
||||
"after": {
|
||||
"rows": 34,
|
||||
"checksum": "79156a787aed15907ef066919ae90801"
|
||||
}
|
||||
}
|
||||
},
|
||||
"preserved_counts": {
|
||||
"published_fiches": 29,
|
||||
"relations": 28,
|
||||
"geometries": 408
|
||||
},
|
||||
"migration_count": 0,
|
||||
"content_imports": 0,
|
||||
"comparison_role": "postgres_before_and_after;sameexportedsnapshotbaseline;noapplicationRLSvisibilityinference",
|
||||
"writes_by_verification": 0
|
||||
},
|
||||
"schema_permissions": {
|
||||
"schema_sha256": "5045b3e51d2185377aa3d9ac7fa07a44fad3ec620cdfa83ffe31c8884ee1601d",
|
||||
"roles_grants_sha256": "1530c33cb016e67bfdc64891ddfce7f185b13b56b2cd87c012871a685e118109",
|
||||
"filesystem_permissions": {
|
||||
".env": {
|
||||
"mode": 416,
|
||||
"uid": 1001,
|
||||
"gid": 33
|
||||
},
|
||||
"storage": {
|
||||
"mode": 1533,
|
||||
"uid": 1001,
|
||||
"gid": 33
|
||||
},
|
||||
"storage/app": {
|
||||
"mode": 1533,
|
||||
"uid": 1001,
|
||||
"gid": 33
|
||||
},
|
||||
"bootstrap/cache": {
|
||||
"mode": 1528,
|
||||
"uid": 1001,
|
||||
"gid": 33
|
||||
}
|
||||
},
|
||||
"comparison_identity": "postgres;catalogue read only;no passwords collected",
|
||||
"unchanged": true
|
||||
},
|
||||
"operational_delta": {
|
||||
"status": "operational_delta_reconciled",
|
||||
"comparison_identity": "postgres before/after;isolated restored baseline;no RLS visibility inference",
|
||||
"cache": "queue:restart value/expiry and request-throttle counter/timer pair;no deleted cache rows",
|
||||
"sessions": "anonymous sessions created by exact delivery verification user-agent",
|
||||
"delta": {
|
||||
"cache": {
|
||||
"before_rows": 106,
|
||||
"after_rows": 106,
|
||||
"changes": [
|
||||
{
|
||||
"key_sha256": "dbb99b7e17f5b4b9bb7a8bdf9350d9b2ae368aaa4bc44593a2522d87617d8461",
|
||||
"kind": "updated",
|
||||
"fields": [
|
||||
"expiration"
|
||||
],
|
||||
"key_pattern": "investemoz-cache-{hash}",
|
||||
"is_queue_restart_key": false,
|
||||
"expiration_unchanged": false,
|
||||
"throttle_timer_pair": true
|
||||
},
|
||||
{
|
||||
"key_sha256": "c1c7bc86ef3255c103a0be6aeb651b824eb07259e993cc5daf3665c1a6afff2d",
|
||||
"kind": "updated",
|
||||
"fields": [
|
||||
"value",
|
||||
"expiration"
|
||||
],
|
||||
"key_pattern": "investemoz-cache-{hash}:timer",
|
||||
"is_queue_restart_key": false,
|
||||
"expiration_unchanged": false,
|
||||
"throttle_timer_pair": true
|
||||
},
|
||||
{
|
||||
"key_sha256": "7f7dd83f47f5bf404d55e6e9f1367948721579970b195680645e356031a070ff",
|
||||
"kind": "updated",
|
||||
"fields": [
|
||||
"value",
|
||||
"expiration"
|
||||
],
|
||||
"key_pattern": "investemoz-cache-illuminate:queue:restart",
|
||||
"is_queue_restart_key": true,
|
||||
"expiration_unchanged": false,
|
||||
"throttle_timer_pair": false
|
||||
}
|
||||
]
|
||||
},
|
||||
"sessions": {
|
||||
"before_rows": 31,
|
||||
"after_rows": 34,
|
||||
"changes": [
|
||||
{
|
||||
"key_sha256": "8692330c25efe0f42e8cb66da1379be3235a7e91d340a89d49ace9679b19050d",
|
||||
"kind": "added",
|
||||
"fields": [
|
||||
"id",
|
||||
"ip_address",
|
||||
"user_agent",
|
||||
"payload",
|
||||
"last_activity"
|
||||
],
|
||||
"anonymous_user": true,
|
||||
"delivery_user_agent": true
|
||||
},
|
||||
{
|
||||
"key_sha256": "5b2c1cf1904c5f25c8058da6406ffb0fcc80f0976903d312f0a1c76206073c73",
|
||||
"kind": "added",
|
||||
"fields": [
|
||||
"id",
|
||||
"ip_address",
|
||||
"user_agent",
|
||||
"payload",
|
||||
"last_activity"
|
||||
],
|
||||
"anonymous_user": true,
|
||||
"delivery_user_agent": true
|
||||
},
|
||||
{
|
||||
"key_sha256": "cb0d56ccd4c384f2996530ddd041efda5890973ea90b6946fc383e2a72fcc4cd",
|
||||
"kind": "added",
|
||||
"fields": [
|
||||
"id",
|
||||
"ip_address",
|
||||
"user_agent",
|
||||
"payload",
|
||||
"last_activity"
|
||||
],
|
||||
"anonymous_user": true,
|
||||
"delivery_user_agent": true
|
||||
}
|
||||
]
|
||||
}
|
||||
},
|
||||
"business_tables_to_confirm_separately": 172,
|
||||
"active_data_writes_by_comparison": 0,
|
||||
"restore_network": "none"
|
||||
},
|
||||
"public_verification": {
|
||||
"status": "installed_delta_verified",
|
||||
"served_revision": {
|
||||
"commit": "a2de725901c308fb2ac2bc3d72181ab50ef46b7a",
|
||||
"branch": "main",
|
||||
"built_at": "2026-10-25T20:38:12.482895+00:00",
|
||||
"manifest_sha256": "a450ea3ad0d3d13aa3942c90475c6a97eb081079e4de91d1a46cfee8cf28fa32"
|
||||
},
|
||||
"manifest_hash_matches": true,
|
||||
"compiled_delta_markers": {
|
||||
"Iniciar mapas complementares L6": [
|
||||
"assets/services-Bav6HNRP.js"
|
||||
],
|
||||
"Acrescentar regra complementar": [
|
||||
"assets/services-Bav6HNRP.js"
|
||||
],
|
||||
"Juros financeiros ordinários — artigo22c": [
|
||||
"assets/services-Bav6HNRP.js"
|
||||
],
|
||||
"Amortizações fiscais — quotas constantes anuais": [
|
||||
"assets/services-Bav6HNRP.js"
|
||||
],
|
||||
"Período anual e correspondência dos meses": [
|
||||
"assets/services-Bav6HNRP.js"
|
||||
],
|
||||
"M20 — correspondência": [
|
||||
"assets/project-dossier-CDrS2OdS.js"
|
||||
],
|
||||
"Saldo final — âmbito L8": [
|
||||
"assets/project-dossier-CDrS2OdS.js"
|
||||
],
|
||||
"Calcular e guardar apuramento trimestral ISPC": [
|
||||
"assets/services-Bav6HNRP.js"
|
||||
],
|
||||
"Calcular e guardar restituição E": [
|
||||
"assets/services-Bav6HNRP.js"
|
||||
],
|
||||
"Reutilizar selecção cambial": [
|
||||
"assets/services-Bav6HNRP.js"
|
||||
]
|
||||
},
|
||||
"assets": [
|
||||
{
|
||||
"file": "assets/project-dossier-CDrS2OdS.js",
|
||||
"status": 200,
|
||||
"sha256": "995b6b17abf7a068faaf05f2eccb3a7ef882dff5758520b029251070165e167f"
|
||||
},
|
||||
{
|
||||
"file": "assets/services-Bav6HNRP.js",
|
||||
"status": 200,
|
||||
"sha256": "9371a96868c7b2ef0af2332a3774dadb5ff45ad55ca2feb6833f9552605c2f01"
|
||||
},
|
||||
{
|
||||
"file": "assets/project-dossier-document-B3HEGNVE.js",
|
||||
"status": 200,
|
||||
"sha256": "3331347876436578071dbb87033c060c0c8fe7eeeac9a0661240c6e6d2f87e71"
|
||||
},
|
||||
{
|
||||
"file": "assets/simulation-form-BqVD91Ek.js",
|
||||
"status": 200,
|
||||
"sha256": "85cbd533c5bc92af5a448db71da006d4346d2d0adb09dde825db0aa19ad5048c"
|
||||
}
|
||||
],
|
||||
"simulator_status": 200,
|
||||
"simulator_entry": "assets/app-BNz3HFDA.js",
|
||||
"existing_fiscal_availability": {
|
||||
"data": {
|
||||
"enabled": true,
|
||||
"coverage_start": "2026-01-01",
|
||||
"coverage_end": "2026-12-31",
|
||||
"message": "IVA geral sobre base líquida disponível; enquadramento declarado."
|
||||
}
|
||||
},
|
||||
"synthetic_private_writes": 0,
|
||||
"method": "Read-only installedrevision/manifest/newcompiledcatalogueandreaders/simulatorentry;acceptedQAproofsreused"
|
||||
},
|
||||
"runtime_delta": [
|
||||
{
|
||||
"path": "resources/js/components/simulation-irpc-normal.tsx",
|
||||
"sha256_LF": "e33b3839aac53a1b7ca2a76eda0ec4c54015a6d1c75e386aaeb5d342943f5965"
|
||||
},
|
||||
{
|
||||
"path": "resources/js/components/simulation-irpc-schedules.tsx",
|
||||
"sha256_LF": "eebd6d9e4100920a5ebf91b800537ffe301fd6a994b86a3b080d673f4a9c9a42"
|
||||
},
|
||||
{
|
||||
"path": "resources/js/lib/irpc-normal-assessment.ts",
|
||||
"sha256_LF": "1dc6adc0835af033ef296d12cdc1e9ef354b2f54cd36e2349b2df66e369c1ee3"
|
||||
},
|
||||
{
|
||||
"path": "resources/js/lib/irpc-normal-base.ts",
|
||||
"sha256_LF": "85fa1eb78ce2b8a144a9f0dcda93b542083a7ff119cbc43f4334c87284bfd312"
|
||||
},
|
||||
{
|
||||
"path": "resources/js/lib/irpc-normal-forms.ts",
|
||||
"sha256_LF": "4e986addb9f2d74e7a80345f8f1e4d8e0b2f562c867fa6eee84880d9f72a3649"
|
||||
},
|
||||
{
|
||||
"path": "resources/js/lib/irpc-normal-profit.ts",
|
||||
"sha256_LF": "d5a2b52f7deb4cf35651188e04f103fcba950a007e3aa4de5ba7017e686614df"
|
||||
},
|
||||
{
|
||||
"path": "resources/js/lib/irpc-normal-schedules.ts",
|
||||
"sha256_LF": "b0045fd2c072998ebb290c2a8332c26d05a1f5f746b3beb1805508147497cac8"
|
||||
},
|
||||
{
|
||||
"path": "resources/js/lib/irpc-normal.ts",
|
||||
"sha256_LF": "62d20bbcebb523f77fde950f623933a13f03283238665cf22fec9390f7ba9333"
|
||||
}
|
||||
],
|
||||
"protected_runtime": [
|
||||
{
|
||||
"path": "resources/js/components/simulation-irpc-taxable-base.tsx",
|
||||
"sha256": "e4fe9f66d35d24aa68fd87de6a5a6a0e901706b270c18962fd0c7ab00f9abd93"
|
||||
},
|
||||
{
|
||||
"path": "resources/js/components/simulation-irpc-assessment.tsx",
|
||||
"sha256": "7174cc0160005a0c332ea40f02ba8a6d57985081b5ab45177ccd6e721bceea54"
|
||||
},
|
||||
{
|
||||
"path": "resources/js/components/acquisition-beverage-restitution.tsx",
|
||||
"sha256": "6f44897b8b12569314551df0022c26da57a165634087942a724293e66837558d"
|
||||
},
|
||||
{
|
||||
"path": "resources/js/components/fiscal-calculation-gaps.tsx",
|
||||
"sha256": "1dab6ceb73756d4e023096b3b2ba767aaa843ff6cc69046ea630ab449a00b0dd"
|
||||
},
|
||||
{
|
||||
"path": "resources/js/components/fiscal-l3-preparation.tsx",
|
||||
"sha256": "e84a7b1ccadaa1b5bd78d778a3287f96ccaf530855eef404786cd7aa3d321b73"
|
||||
},
|
||||
{
|
||||
"path": "resources/js/components/simulation-acquisitions.tsx",
|
||||
"sha256": "c206d4cfe575d6ba007aa2b425b5f898efa97e4162b8710e358b6ecfd9458542"
|
||||
},
|
||||
{
|
||||
"path": "resources/js/components/simulation-operations.tsx",
|
||||
"sha256": "a7e55972fa790063dcf11945055de2af46a77db9e509900af22ede7ec47bb4cf"
|
||||
},
|
||||
{
|
||||
"path": "resources/js/lib/iva-acquisition-bc.ts",
|
||||
"sha256": "b0ef55e0917bdb79f14b53ba9e95d73c08153befeb7d4ce73f81e6fb13992225"
|
||||
},
|
||||
{
|
||||
"path": "resources/js/lib/iva-beverage-allocation.ts",
|
||||
"sha256": "32968d198c7fe0c53ca89641c22d5749be6636be2c79127b867e4e3afd0dd40d"
|
||||
},
|
||||
{
|
||||
"path": "resources/js/lib/iva-beverage-restitution.ts",
|
||||
"sha256": "5c650cbd9469d5f99001f56fc4ff99ac973eb368036d4e96c6d171f1b220bd9e"
|
||||
},
|
||||
{
|
||||
"path": "resources/js/lib/iva-calculation-gaps.ts",
|
||||
"sha256": "2e7d84a0c196bd5b56fd67cc1a389d43d5041894184e675680a4de3cd10b31a2"
|
||||
},
|
||||
{
|
||||
"path": "resources/js/lib/iva-operations.ts",
|
||||
"sha256": "ec37b949f1233c5f5c14a87450c421ed29fabf1ed5b73fb32564564a2bc31f54"
|
||||
},
|
||||
{
|
||||
"path": "resources/js/lib/l3-form-preparation.ts",
|
||||
"sha256": "fc47f5fa5ec1420fbd847d0d081f00d99ebbb524164eef785b20877e0562f704"
|
||||
},
|
||||
{
|
||||
"path": "resources/js/lib/ispc-residuals.ts",
|
||||
"sha256": "40d5751c06c7c155ab4b7a17ee2d1653da2fbbf075807fbb8561cdbe19820955"
|
||||
},
|
||||
{
|
||||
"path": "resources/js/components/simulation-ispc-residuals.tsx",
|
||||
"sha256": "a9219d6f41ccbd0ce45659d4f6aa0fa1c169a685840f5cb1e18daeca377d5e18"
|
||||
},
|
||||
{
|
||||
"path": "resources/js/lib/ispc-eligibility.ts",
|
||||
"sha256": "44675c5efacdc1ae19505667611ba3b522d3043cebacc8754597c3a68ca89d25"
|
||||
},
|
||||
{
|
||||
"path": "resources/js/components/simulation-ispc-quarter.tsx",
|
||||
"sha256": "2c2555309b32d4261f14e7164f39314c9188129c2990357fc54090a2468dd2b4"
|
||||
},
|
||||
{
|
||||
"path": "resources/js/components/simulation-ispc-withholding.tsx",
|
||||
"sha256": "e0445d015b72859e48726959aa52686f79b1cf5c2ade29751efa83257068b878"
|
||||
},
|
||||
{
|
||||
"path": "resources/js/lib/ispc-quarter.ts",
|
||||
"sha256": "f66bd52e9cdfe1ddaa6b00a931465862b3d890b9be216b7a056740f027f24129"
|
||||
},
|
||||
{
|
||||
"path": "resources/js/lib/ispc-withholding.ts",
|
||||
"sha256": "6c31b240299edd3262efa28f7f3d5aee21123f94e30ef4ab90e26c35777cb6e4"
|
||||
},
|
||||
{
|
||||
"path": "resources/js/components/simulation-ispc-eligibility.tsx",
|
||||
"sha256": "f48dd4a8f87a994eda0447f81a463589905e5873b2e1044debac9d10825a880c"
|
||||
},
|
||||
{
|
||||
"path": "resources/js/lib/iva-acquisitions.ts",
|
||||
"sha256": "cce283b1d0a07fb383fcb527225f4dd5bec829010a662cbaae1d60e595221977"
|
||||
},
|
||||
{
|
||||
"path": "resources/js/lib/iva-modelo-a.ts",
|
||||
"sha256": "c641619a05613c1620385baad0e9ffbf810dd970aafb30e12b3a7f9a3bf11846"
|
||||
},
|
||||
{
|
||||
"path": "resources/js/lib/iva-fx-selection.ts",
|
||||
"sha256": "9aa07ad443bc777b80510a3b5bd6aff9ddb9814d2450f3c690e531e74d71d998"
|
||||
},
|
||||
{
|
||||
"path": "resources/js/components/simulation-fx-selection.tsx",
|
||||
"sha256": "39bb6d87d404745b0b66349bc11626545a3672ae27321ce9b4658416592059bf"
|
||||
},
|
||||
{
|
||||
"path": "resources/js/lib/business-financial-plan.ts",
|
||||
"sha256": "c20274722d1ffcd0360f041a6cacb5d868fe0621cb27a1aca6e06826612c3ebb"
|
||||
},
|
||||
{
|
||||
"path": "resources/js/lib/iva-currency-events.ts",
|
||||
"sha256": "cc9f2045d302d7987310da4006cc250fc5c99a27397918d166d649bfc32fab08"
|
||||
},
|
||||
{
|
||||
"path": "resources/js/lib/irpc-fx.ts",
|
||||
"sha256": "5c4a7a477429f8d775acf6db3e117008468f5554e5731dec81f60fbb75e948fb"
|
||||
},
|
||||
{
|
||||
"path": "resources/js/lib/irpc-withholdings.ts",
|
||||
"sha256": "8e5f3c035ce5e4d6c3fc82f933439ab580fa5519492f9c4d32cfb71b77b54803"
|
||||
},
|
||||
{
|
||||
"path": "resources/js/components/simulation-irpc-withholdings.tsx",
|
||||
"sha256": "751af4fab346659bc5ccb08b8a2169769af7521ea0035050af32b41ea7f5aa76"
|
||||
},
|
||||
{
|
||||
"path": "resources/js/lib/irpc-interest.ts",
|
||||
"sha256": "f8e6390b3b2c58c296f7e3fd14576e06ae248bc0cabce1a666b7094611f2a7dd"
|
||||
},
|
||||
{
|
||||
"path": "resources/js/lib/irpc-mrfta.ts",
|
||||
"sha256": "76dcce8954f68b081d500be61de9c5b146a452a3eb578a0b78776ba9e1f8051c"
|
||||
},
|
||||
{
|
||||
"path": "resources/js/lib/irpc-mrfta-cases.ts",
|
||||
"sha256": "4266746076ab3f70312fd042351e24dd2f136c4f3e8a277b57dd97849a9f1862"
|
||||
},
|
||||
{
|
||||
"path": "resources/js/components/simulation-irpc-mrfta.tsx",
|
||||
"sha256": "913d1bb4ac0fc59763cf5d27bc637f6a713b2050c4463748db554af4be451538"
|
||||
},
|
||||
{
|
||||
"path": "resources/js/lib/financial-fiscal-bridge.ts",
|
||||
"sha256": "5a30c501653b16b5fedcb12631ce81fcce4fe473aa542e94374986b3c50f2d33"
|
||||
},
|
||||
{
|
||||
"path": "resources/js/components/simulation-form.tsx",
|
||||
"sha256": "85b024a7f45ceb52efd6ff1f21d0eab1fd8fcf1ab59e4b5302c08685235c472a"
|
||||
},
|
||||
{
|
||||
"path": "resources/js/lib/project-dossier.ts",
|
||||
"sha256": "a0909bbfcdf7e8542b010faa104fcb918e86ae38ddf096082d4d5be98d31b2b9"
|
||||
},
|
||||
{
|
||||
"path": "resources/js/lib/project-dossier-report.ts",
|
||||
"sha256": "5207a2ffeb208cd5ace6713038cee85208020ee618194dca7114e94fc3200b6c"
|
||||
}
|
||||
],
|
||||
"originals": [
|
||||
{
|
||||
"path": "docs/investmoz/simulations/source-archive/AT-Comunicado-9-2026-ISPC.pdf",
|
||||
"sha256": "106f8a9ce9255c03549c70bf07fe999d32e6e55302d009b509862aa74ccb4973"
|
||||
},
|
||||
{
|
||||
"path": "docs/investmoz/simulations/source-archive/AT-Modelo-30-ISPC.pdf",
|
||||
"sha256": "6802edd06b6ff638a0b851a3ec7ecf69af8f07840faa47446becad67d35d445c"
|
||||
},
|
||||
{
|
||||
"path": "docs/investmoz/simulations/source-archive/AT-Modelo-B-Geral.pdf",
|
||||
"sha256": "bd977c7c59d4d98befd92e2c566b1bf168cb1343bb519f51b41a3807f431fc57"
|
||||
},
|
||||
{
|
||||
"path": "docs/investmoz/simulations/source-archive/AT-MRFTA-19-39.pdf",
|
||||
"sha256": "8ea62c53066b482f87078a7a7b1ecf15ca98a12a122e8d7abca63acfc993186b"
|
||||
},
|
||||
{
|
||||
"path": "docs/investmoz/simulations/source-archive/BM-Mercado-Monetario-MAIBOR-20261025.html",
|
||||
"sha256": "00e8a7e0d3a1db4ca3beb56d5361b2084a0f1684f3d40fc1c203702a2190e063"
|
||||
},
|
||||
{
|
||||
"path": "docs/investmoz/simulations/source-archive/BR-16-I-Serie-2008-04-16.pdf",
|
||||
"sha256": "fc373ff5637edf75ec6a9595dec8763a8503d4ee786e3b7d8f1c742eae9d80ee"
|
||||
},
|
||||
{
|
||||
"path": "docs/investmoz/simulations/source-archive/BR-248-I-Suplemento-1-2025.pdf",
|
||||
"sha256": "ccf2a8deeca820f2dd076b4b2141b1efe3f6a806568c3a587ca59a8e92f4c251"
|
||||
},
|
||||
{
|
||||
"path": "docs/investmoz/simulations/source-archive/BR-89-I-Serie-2017-06-08.pdf",
|
||||
"sha256": "11f0cab15eb6e51010952203ffa24fdc533a24fd642e19525fe4f46b17a1f5e5"
|
||||
},
|
||||
{
|
||||
"path": "docs/investmoz/simulations/source-archive/BR-95-I-Suplemento-2025-05-21.pdf",
|
||||
"sha256": "e0e682e2c027c3cd9c1d46a73a3f48bc5f6bdbf05667fd97314d7a3f6a456358"
|
||||
},
|
||||
{
|
||||
"path": "docs/investmoz/simulations/source-archive/BR252-I-Serie-2022-Lei20-PESOE.pdf",
|
||||
"sha256": "1159fd3ce1ba5581671796d083534da48bd3c5578298819e896f1c2a8026318d"
|
||||
},
|
||||
{
|
||||
"path": "docs/investmoz/simulations/source-archive/Decreto-22-2021-BR70.pdf",
|
||||
"sha256": "a8fac38dcfe08f9c7a8e46254cff10e1ec82fc4f7a8d88ad6e4fe7d91ffc21a5"
|
||||
},
|
||||
{
|
||||
"path": "docs/investmoz/simulations/source-archive/Decreto-27-2026-BR123.pdf",
|
||||
"sha256": "26249c3fa58f149c81de36e99d1aac2819a4771379d9e8833159660dabf539bb"
|
||||
},
|
||||
{
|
||||
"path": "docs/investmoz/simulations/source-archive/Decreto-29-1998-BR22-5-suplemento.pdf",
|
||||
"sha256": "6242cbe675faadf085f43f95ec8c7e8868aafe67c3b2ab2bb010992288f954f8"
|
||||
},
|
||||
{
|
||||
"path": "docs/investmoz/simulations/source-archive/Decreto-3-2011-BR-11-I-mineiros.pdf",
|
||||
"sha256": "5bca1133666ba9c69870b89823420175b7b5b8d0eccb667ecdf5c29716f3b6be"
|
||||
},
|
||||
{
|
||||
"path": "docs/investmoz/simulations/source-archive/Decreto-37-2023-BR124.pdf",
|
||||
"sha256": "7e680b191481faa0e2e9057fa5053587eb2a29d1d8c819e0eb9f02814255a04c"
|
||||
},
|
||||
{
|
||||
"path": "docs/investmoz/simulations/source-archive/Decreto-9-2008-BR16.pdf",
|
||||
"sha256": "96fccdecbfdc11c9eafb90fbc6c7bc259f88bbd4c7507d1ac3af1fa03f960697"
|
||||
},
|
||||
{
|
||||
"path": "docs/investmoz/simulations/source-archive/Lei-13-2016-CIVA-BR-156-10-suplemento.pdf",
|
||||
"sha256": "b90dc7c14ecea2e378c4a62e8e5a47d54a5644c457baeb8b8053b92fd2a5710b"
|
||||
},
|
||||
{
|
||||
"path": "docs/investmoz/simulations/source-archive/Lei-14-1992-BR42.pdf",
|
||||
"sha256": "089fff7423e99a70a230a73ca379e4ea3a91d124703f91016e57ff82794b9e56"
|
||||
},
|
||||
{
|
||||
"path": "docs/investmoz/simulations/source-archive/Lei-17-2022-BR251-exemplar-MCNet5.pdf",
|
||||
"sha256": "14eb34f0af91a8f5cb1770c7b52d6ff839c6818302d1ed96d79afbfb9fe999d4"
|
||||
},
|
||||
{
|
||||
"path": "docs/investmoz/simulations/source-archive/Lei-17-2022-IPP-BR250-Parlamento.pdf",
|
||||
"sha256": "978cd22403ffd336a631704ecd7a5bbd814a427c815b9acdaca5515591dd9e2a"
|
||||
},
|
||||
{
|
||||
"path": "docs/investmoz/simulations/source-archive/Lei-19-2013-BR76.pdf",
|
||||
"sha256": "bba96d645cc935ffc3d1a79b9f0f73ac1c693d6459c2ad41f56cd2841accae76"
|
||||
},
|
||||
{
|
||||
"path": "docs/investmoz/simulations/source-archive/Lei-19-2017-IRPS-BR-OCAM.pdf",
|
||||
"sha256": "c3a0186cb9ad090d7a9533006295dc9bb6a62ad0d6150173cbd49dba4ee4b52d"
|
||||
},
|
||||
{
|
||||
"path": "docs/investmoz/simulations/source-archive/Lei-2-2011-BR-1-4-suplemento-MCNet.pdf",
|
||||
"sha256": "a7543a68cc3287a46a83c39a04821b40f649dd06c4e9b5dc51ff0b47fba08899"
|
||||
},
|
||||
{
|
||||
"path": "docs/investmoz/simulations/source-archive/Lei-20-2009-BR36-AT-exemplar19.pdf",
|
||||
"sha256": "fc1c8144db42960cbf73e717e095896f511ece0f907f58f78819b27d6917a7ee"
|
||||
},
|
||||
{
|
||||
"path": "docs/investmoz/simulations/source-archive/Lei-22-2022-IVA-republicada-BR-250-2-suplemento.pdf",
|
||||
"sha256": "ea1b0dc6f5cf6e595f6d9a19e7042f398999e0087caef1785f6e8fac571b5f53"
|
||||
},
|
||||
{
|
||||
"path": "docs/investmoz/simulations/source-archive/Lei-34-2007-BR52.pdf",
|
||||
"sha256": "cdbef875ad7ccc1517b12faf5de0e893a70ed2ed81e33913cd6dc4a674474e6e"
|
||||
},
|
||||
{
|
||||
"path": "docs/investmoz/simulations/source-archive/Lei-4-1994-BR37-3-suplemento.pdf",
|
||||
"sha256": "210df9db8980d0a5690cd187a6eeec7e37a900d743e39062c16f4e0d12215c7e"
|
||||
},
|
||||
{
|
||||
"path": "docs/investmoz/simulations/source-archive/Lei-4-2012-BR3.pdf",
|
||||
"sha256": "b8845cef41dcbd9ba50c43dbfa743a56030dd3d348242a107e1ae30279eec121"
|
||||
},
|
||||
{
|
||||
"path": "docs/investmoz/simulations/source-archive/Lei-7-1991-Partidos-IFES.pdf",
|
||||
"sha256": "6b783a0bb3330688ef10660a58060d9724aa2da6a873d234fe902f0eaaeda42d"
|
||||
},
|
||||
{
|
||||
"path": "docs/investmoz/simulations/source-archive/PT-MZ-CDT-1992.pdf",
|
||||
"sha256": "d504e1024b28aee5c6acf4592acb96ec9c915a8414f67a61ab6984d6acf9df9d"
|
||||
},
|
||||
{
|
||||
"path": "docs/investmoz/simulations/source-archive/PT-MZ-Protocolo-2009.pdf",
|
||||
"sha256": "f353773dcf41f09f4daa6cf5ba5a5f7994f3e02615867c2dcffc61c3d901bf9b"
|
||||
}
|
||||
],
|
||||
"pipeline_checks": [
|
||||
"OK (1 test, 3106 assertions)",
|
||||
"built in 31.41s",
|
||||
"OK (59 tests, 317 assertions)",
|
||||
"# tests 920",
|
||||
"# pass 920",
|
||||
"# fail 0"
|
||||
],
|
||||
"accepted_QA_proofs": {
|
||||
"frontend_tests": 14,
|
||||
"private_API_tests": 1,
|
||||
"private_API_assertions": 78,
|
||||
"database": "127.0.0.1:55441/simulator_fiscal_delta_20261021_test;DatabaseTransactions rollback",
|
||||
"routes_actions_generated": true,
|
||||
"typescript": "passed",
|
||||
"build": "passed",
|
||||
"actual_UI": "field editing;unsupported asset rate;missing interest;save/recovery;download;current loss",
|
||||
"dossier": "from API-recovered calculated/missing/loss/EP JSON"
|
||||
},
|
||||
"accepted_proofs_reused": true,
|
||||
"manually_repeated_accepted_suites": false,
|
||||
"sequence": {
|
||||
"taxable_profit": "6980MZN simulated",
|
||||
"taxable_base": "4680MZN simulated",
|
||||
"normal_colecta": "1497.60MZN simulated,32%",
|
||||
"final_payable": null,
|
||||
"final_recoverable": null,
|
||||
"final_balance_scope": "L8"
|
||||
},
|
||||
"remaining_L6": [
|
||||
{
|
||||
"pending_case_or_mapping": "Custos com limites36(1)e/f/h/i/n, provisões28/29, obras plurianuais19 e componentes de exercícios anteriores18(2).",
|
||||
"resolution_condition": "Implementar a regra de cada categoria a partir do diploma aplicável: parcela contabilizada, limite/base próprios, documentação e exercício de imputação; demonstrar o efeito com sinal nos totais. Nos exercícios anteriores, distinguir o que era imprevisível/manifestamente desconhecido no encerramento.",
|
||||
"blocking_scope": "Só a categoria ou parcela ainda sem regra; os acréscimos36a/b/c/g, juros ordinários e periodização corrente/seguinte demonstrados permanecem utilizáveis. Eventual tributação autónoma pertence aL7."
|
||||
},
|
||||
{
|
||||
"pending_case_or_mapping": "Amortizações além dos itensII/3/9 e9.1: restantes tabelas, quotas inferiores, duodécimos, quotas decrescentes, bens usados/reavaliados/intangíveis e recuperação de quotas anteriormente tributadas.",
|
||||
"resolution_condition": "Corresponder categoria/tabela prevalecente, método, entrada em uso, vida útil, base depreciável e quotas contabilizadas/fiscais acumuladas; implementar o cálculo e a reconciliação que impeçam dupla dedução.",
|
||||
"blocking_scope": "Só os activos/métodos afectados. Computadores25% e servidores20% no recorte anual constante e a perda corrente já demonstrada não são reabertos."
|
||||
},
|
||||
{
|
||||
"pending_case_or_mapping": "Períodos curtos, transição/liquidação e reconciliação fiscal anual de plano noutra moeda.",
|
||||
"resolution_condition": "Ligar os meses e factos de início/cessação/transição ao período fiscal; implementar os efeitos sobre quotas e contagem das perdas. Para outra moeda, identificar os eventos/datas e a regra de conversão anual aplicável, reutilizando o motor cambial aceite.",
|
||||
"blocking_scope": "Só o período ou origem cambial sem reconciliação. Os períodos anuais emMZN e oEP com imputação documentada conservam o cálculo demonstrado."
|
||||
},
|
||||
{
|
||||
"pending_case_or_mapping": "Representação fiscal de fracções de unidade/cêntimo.",
|
||||
"resolution_condition": "Identificar a instrução de representação/arredondamento da edição/campo aplicável ou obter esclarecimento específico daAT; então implementar essa regra conservando o valor racional original. O exemplarM20A.1 pede meticais sem centavos, mas isso não determina sozinho como arredondar uma fracção.",
|
||||
"blocking_scope": "Só a transcrição do valor não exactamente representável. Os cálculos racionais e os valores exactamente representáveis permanecem disponíveis; não é necessária nova validação genérica das fontes."
|
||||
},
|
||||
{
|
||||
"pending_case_or_mapping": "M20A.1: discriminação de vendas/serviços, fornecimentos/outros gastos, imposto sobre o rendimento e resultado líquido; M22: campo200 e detalhe dos restantes ajustamentos.",
|
||||
"resolution_condition": "Reutilizar a origem financeira, recolhendo apenas a classificação em falta e o imposto contabilizado; reconciliar resultado antes/depois de imposto e cada ajustamento com a edição aplicável. Não usar a colecta simulada como imposto contabilizado. Completar as correspondências por campo e demonstrar a recuperação/exportação.",
|
||||
"blocking_scope": "Só os campos sem correspondência. M20A.1/Q4 contas6.1.1/6.2/6.5/6.9 e M22 campos259/260,269/270,276/277/278 e300 conservam a preparação parcial demonstrada."
|
||||
},
|
||||
{
|
||||
"pending_case_or_mapping": "Transporte de resultado entre ediçõesM20/M22: XLSXM20A.1 remete para201/quadro8; PDFM22 inventariado usa200/quadro10.",
|
||||
"resolution_condition": "Identificar a edição do formulário de destino e corresponder explicitamente o resultado líquido a essa edição; registar a remissão corrigida sem substituir os exemplares ou reutilizar fórmulas antigas por aproximação.",
|
||||
"blocking_scope": "Só esse transporte entre edições; não bloqueia os cálculos independentes nem os outros campos já correspondidos."
|
||||
}
|
||||
],
|
||||
"matrix_row": "AUD-SIM-INT02",
|
||||
"L6_complete": false,
|
||||
"L7_L8_own_scopes": true,
|
||||
"documentary_divergence": "Only result transfer M20A.1 field201/Q8 versus PDFM22 field200/Q10;independent calculations and mapped fields remain available",
|
||||
"L5_ten_questions": "unchanged;only dependent cases blocked;no new research",
|
||||
"documentation_runtime_changed": false,
|
||||
"proof_files": {
|
||||
"backup.txt": "a591b64eafc2bfbf4c2581cbf7e622645434cd329ef76350cb93db7cab9a4924",
|
||||
"compact-dependencies.txt": "d1c1681ce26172f3d54d4f800f928b0bca4fee69b436ed230208f03334194283",
|
||||
"installed-protected.txt": "9fda494d5f02097704a534a9fad88246d3c2b9d1b195984b622a09fa0b18015c",
|
||||
"installed-public-delta.json": "060517951fa315913d5848da634b5dd9c9cf4ea41e02c46f6d79cb5226c5e834",
|
||||
"installed-public.txt": "b165c03e6f5745be112de5ed6e3f09de9bbdd66eee1b110ee6e0271e5a250a8d",
|
||||
"integration.txt": "1f3bb46c6b39cc527fea30b81a80d815b81e73a776a512516add1c19be01276a",
|
||||
"manifest-served.json": "a450ea3ad0d3d13aa3942c90475c6a97eb081079e4de91d1a46cfee8cf28fa32",
|
||||
"operational-delta.txt": "02c8a942e58e243cfc131e08e8237c6e0495c0151330977f6aa738f903b60cc3",
|
||||
"preflight.txt": "ffb60ef455b33ca6a2167b2c5f792fea591a6d22b37f46b7964c3fe0e20c371b",
|
||||
"preparation.json": "61facd82de423031b21808a507fb1904fb8dc5f512314a02ea3563f864285d6d",
|
||||
"progress.txt": "9347cbbd7a9373c97f6f1a53b8228ba4b7fdd6d270de35745ff7faf0861e5c7e",
|
||||
"progress2.txt": "c3360e6f080fcf40778d997b7382e29f8b5f24013e89ba34c7b5a55fa821e315",
|
||||
"remaining-section.md": "aceaf87dc9f82c0dbf6792d6d6918c188129369d29e8e9a52c729ce75534c74a",
|
||||
"restore.txt": "e5cc45d4d6fd35d0424f3febe8c74ef089e88256fa6eb49de224a8e6a167b2fe",
|
||||
"schema-permissions-after.txt": "76b5a4d8af11e4898a205062766cfb7ab6ec0783200e77e60a1927aa1ca18597",
|
||||
"schema-permissions-before.txt": "0ab7c964792acdd8917bce256c472e55e034b103500a58b49f020b5084823ed7",
|
||||
"status-final.txt": "7af3227a73d3d8eac0a8a5f116c48ca91c90d986f21ec96ecd192c7430667f9f",
|
||||
"status1.txt": "4bd015e1aacfc764253af72a1cfa8e3f3f31614a92daac2c3d94779eb51dddf8",
|
||||
"status2.txt": "52f274c01858b8570237f434ff86727720cfc7db0baf3a7d0c792abc19f853bd",
|
||||
"status3.txt": "0c71c139c20da160dd49929a237e38887481a6ce6c24ea921df78023566cc85e",
|
||||
"status4.txt": "0c71c139c20da160dd49929a237e38887481a6ce6c24ea921df78023566cc85e",
|
||||
"status5.txt": "7af3227a73d3d8eac0a8a5f116c48ca91c90d986f21ec96ecd192c7430667f9f"
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,774 @@
|
||||
{
|
||||
"status": "installed_L6_exact_values_and_M20_M22_fields",
|
||||
"installed": {
|
||||
"status": "installed",
|
||||
"commit": "5aaf1a56f9d928331364fcc8b0d1528e51dba327",
|
||||
"release": "/var/www/investmoz-homologacao/releases/5aaf1a56f9d928331364fcc8b0d1528e51dba327-c1543f3e",
|
||||
"previous_release": "/var/www/investmoz-homologacao/releases/56475acb2f39e58cb51664913f7fb499f58eb7ab-694b3932",
|
||||
"database_migrations": 0,
|
||||
"content_imports": 0
|
||||
},
|
||||
"previous_baseline": "56475acb2f39e58cb51664913f7fb499f58eb7ab",
|
||||
"backup": {
|
||||
"stage": "/var/backups/investmoz-irpc-l6-values-forms-delivery-20261026/backup",
|
||||
"created_at": "2026-10-26T08:57:09Z",
|
||||
"target": {
|
||||
"database": "teste_investidor",
|
||||
"port": 5432
|
||||
},
|
||||
"tables": 174,
|
||||
"files_verified": 369,
|
||||
"dump_sha256": "97c1594250800531776ee204043a947b2522b3b63f6eb99d0ce8a74fd5af9213",
|
||||
"files_sha256": "12fd138ae415dbf2361d94987848db49a49580ef8c75cd6f8e4f5cb19d911e6a",
|
||||
"restore_verified": false
|
||||
},
|
||||
"restore": {
|
||||
"restore_verified": true,
|
||||
"tables_verified": 174,
|
||||
"container_network": "none",
|
||||
"database": "irpc_l5_restore_20261025",
|
||||
"port": 55441,
|
||||
"source_dump_sha256": "97c1594250800531776ee204043a947b2522b3b63f6eb99d0ce8a74fd5af9213",
|
||||
"active_database_writes": 0
|
||||
},
|
||||
"preservation": {
|
||||
"previous_release_preserved": "/var/www/investmoz-homologacao/releases/56475acb2f39e58cb51664913f7fb499f58eb7ab-694b3932",
|
||||
"installed": {
|
||||
"status": "installed",
|
||||
"commit": "5aaf1a56f9d928331364fcc8b0d1528e51dba327",
|
||||
"release": "/var/www/investmoz-homologacao/releases/5aaf1a56f9d928331364fcc8b0d1528e51dba327-c1543f3e",
|
||||
"previous_release": "/var/www/investmoz-homologacao/releases/56475acb2f39e58cb51664913f7fb499f58eb7ab-694b3932",
|
||||
"database_migrations": 0,
|
||||
"content_imports": 0
|
||||
},
|
||||
"runtime_files_verified": 4,
|
||||
"preserved_L3_ISPC_FX_runtime_files_verified": 50,
|
||||
"documentary_files_verified": 31,
|
||||
"persistent_files_and_env_verified": 369,
|
||||
"tables_compared": 174,
|
||||
"changed_tables": {
|
||||
"cache": {
|
||||
"before": {
|
||||
"rows": 106,
|
||||
"checksum": "a845f75cfcf49b86ebb8a3816f886a63"
|
||||
},
|
||||
"after": {
|
||||
"rows": 106,
|
||||
"checksum": "feb9a49bc8109928e6bfd6a7e1964d46"
|
||||
}
|
||||
},
|
||||
"sessions": {
|
||||
"before": {
|
||||
"rows": 13,
|
||||
"checksum": "5e210898e0b9fdf0049492cba9fe097b"
|
||||
},
|
||||
"after": {
|
||||
"rows": 14,
|
||||
"checksum": "19b40c4ac924c81749e7170841401696"
|
||||
}
|
||||
}
|
||||
},
|
||||
"preserved_counts": {
|
||||
"published_fiches": 29,
|
||||
"relations": 28,
|
||||
"geometries": 408
|
||||
},
|
||||
"migration_count": 0,
|
||||
"content_imports": 0,
|
||||
"comparison_role": "postgres_before_and_after;sameexportedsnapshotbaseline;noapplicationRLSvisibilityinference",
|
||||
"writes_by_verification": 0
|
||||
},
|
||||
"schema_permissions": {
|
||||
"schema_sha256": "5045b3e51d2185377aa3d9ac7fa07a44fad3ec620cdfa83ffe31c8884ee1601d",
|
||||
"roles_grants_sha256": "1530c33cb016e67bfdc64891ddfce7f185b13b56b2cd87c012871a685e118109",
|
||||
"filesystem_permissions": {
|
||||
".env": {
|
||||
"mode": 416,
|
||||
"uid": 1001,
|
||||
"gid": 33
|
||||
},
|
||||
"storage": {
|
||||
"mode": 1533,
|
||||
"uid": 1001,
|
||||
"gid": 33
|
||||
},
|
||||
"storage/app": {
|
||||
"mode": 1533,
|
||||
"uid": 1001,
|
||||
"gid": 33
|
||||
},
|
||||
"bootstrap/cache": {
|
||||
"mode": 1528,
|
||||
"uid": 1001,
|
||||
"gid": 33
|
||||
}
|
||||
},
|
||||
"comparison_identity": "postgres;catalogue read only;no passwords collected",
|
||||
"unchanged": true
|
||||
},
|
||||
"operational_delta": {
|
||||
"status": "operational_delta_reconciled",
|
||||
"comparison_identity": "postgres before/after;isolated restored baseline;no RLS visibility inference",
|
||||
"cache": "queue:restart;requestthrottle;identical home-sector cached value with refreshed expiry(HomeController remember10min);no deletedcache",
|
||||
"sessions": "anonymous sessions from delivery user-agent or exactUA/time correlated with nginx public request;deleted sessions individually expired beyond configured lifetime,normal database session garbage collection(config/session lottery2/100)",
|
||||
"delta": {
|
||||
"cache": {
|
||||
"before_rows": 106,
|
||||
"after_rows": 106,
|
||||
"changes": [
|
||||
{
|
||||
"key_sha256": "8d6ea77eb4b34d86d207362d583cfa8bf2880b907becd9b00398964482c6b4bd",
|
||||
"kind": "updated",
|
||||
"fields": [
|
||||
"value",
|
||||
"expiration"
|
||||
],
|
||||
"key_pattern": "investemoz-cache-{hash}",
|
||||
"is_queue_restart_key": false,
|
||||
"expiration_unchanged": false,
|
||||
"throttle_timer_pair": true,
|
||||
"same_value_home_cache_expiry_refresh": false
|
||||
},
|
||||
{
|
||||
"key_sha256": "2f251473865d14b953236ab95b1521764754d76abd79b58ca7d38c96dfe2fab1",
|
||||
"kind": "updated",
|
||||
"fields": [
|
||||
"value",
|
||||
"expiration"
|
||||
],
|
||||
"key_pattern": "investemoz-cache-{hash}:timer",
|
||||
"is_queue_restart_key": false,
|
||||
"expiration_unchanged": false,
|
||||
"throttle_timer_pair": true,
|
||||
"same_value_home_cache_expiry_refresh": false
|
||||
},
|
||||
{
|
||||
"key_sha256": "7f7dd83f47f5bf404d55e6e9f1367948721579970b195680645e356031a070ff",
|
||||
"kind": "updated",
|
||||
"fields": [
|
||||
"value",
|
||||
"expiration"
|
||||
],
|
||||
"key_pattern": "investemoz-cache-illuminate:queue:restart",
|
||||
"is_queue_restart_key": true,
|
||||
"expiration_unchanged": false,
|
||||
"throttle_timer_pair": false,
|
||||
"same_value_home_cache_expiry_refresh": false
|
||||
}
|
||||
]
|
||||
},
|
||||
"sessions": {
|
||||
"before_rows": 13,
|
||||
"after_rows": 16,
|
||||
"changes": [
|
||||
{
|
||||
"key_sha256": "dd5c5235e9b48e28573884145b201d1f92cdabfea21a1602307c2569efe5d56c",
|
||||
"kind": "added",
|
||||
"fields": [
|
||||
"id",
|
||||
"ip_address",
|
||||
"user_agent",
|
||||
"payload",
|
||||
"last_activity"
|
||||
],
|
||||
"anonymous_user": true,
|
||||
"delivery_user_agent": true,
|
||||
"expired_before_comparison": false,
|
||||
"session_lifetime_minutes": 120,
|
||||
"anonymous_public_request_logged": true
|
||||
},
|
||||
{
|
||||
"key_sha256": "3da37b843afdc870f2c0b1336344e97218a264ab5a7b44825a194c89a48fab32",
|
||||
"kind": "added",
|
||||
"fields": [
|
||||
"id",
|
||||
"ip_address",
|
||||
"user_agent",
|
||||
"payload",
|
||||
"last_activity"
|
||||
],
|
||||
"anonymous_user": true,
|
||||
"delivery_user_agent": true,
|
||||
"expired_before_comparison": false,
|
||||
"session_lifetime_minutes": 120,
|
||||
"anonymous_public_request_logged": true
|
||||
},
|
||||
{
|
||||
"key_sha256": "f8e1fa11cf234c2c9f498402557b4c4aed3b89c83dace57af783ae840e4dc821",
|
||||
"kind": "added",
|
||||
"fields": [
|
||||
"id",
|
||||
"ip_address",
|
||||
"user_agent",
|
||||
"payload",
|
||||
"last_activity"
|
||||
],
|
||||
"anonymous_user": true,
|
||||
"delivery_user_agent": true,
|
||||
"expired_before_comparison": false,
|
||||
"session_lifetime_minutes": 120,
|
||||
"anonymous_public_request_logged": true
|
||||
}
|
||||
]
|
||||
}
|
||||
},
|
||||
"business_tables_to_confirm_separately": 172,
|
||||
"active_data_writes_by_comparison": 0,
|
||||
"restore_network": "none"
|
||||
},
|
||||
"public_verification": {
|
||||
"status": "installed_delta_verified",
|
||||
"served_revision": {
|
||||
"commit": "5aaf1a56f9d928331364fcc8b0d1528e51dba327",
|
||||
"branch": "main",
|
||||
"built_at": "2026-10-26T09:02:46.728717+00:00",
|
||||
"manifest_sha256": "e145286fdcb31ffe687568637861f7a630f9b943586d765f8d2e09957780ba14"
|
||||
},
|
||||
"manifest_hash_matches": true,
|
||||
"compiled_delta_markers": {
|
||||
"IRPC-normal-adjustments/9": [
|
||||
"assets/project-dossier-BwFhiBwz.js"
|
||||
],
|
||||
"Preparar representação dos valores e campos M20/M22": [
|
||||
"assets/services-DF985_Sf.js"
|
||||
],
|
||||
"Imposto contabilizado e resultado líquido": [
|
||||
"assets/services-DF985_Sf.js"
|
||||
],
|
||||
"Parcela de taxa reduzida para a colecta total302": [
|
||||
"assets/services-DF985_Sf.js"
|
||||
],
|
||||
"Saldo final — âmbito L8": [
|
||||
"assets/project-dossier-BwFhiBwz.js"
|
||||
],
|
||||
"Pressuposto documentado da conversão mensal para simulação": [
|
||||
"assets/services-DF985_Sf.js"
|
||||
],
|
||||
"Reutilizar selecção cambial": [
|
||||
"assets/services-DF985_Sf.js"
|
||||
]
|
||||
},
|
||||
"assets": [
|
||||
{
|
||||
"file": "assets/services-DF985_Sf.js",
|
||||
"status": 200,
|
||||
"sha256": "0b96484962fa553514d85d8a13319a46b0aa6ca7e53135100cc2955ec559a713"
|
||||
},
|
||||
{
|
||||
"file": "assets/project-dossier-BwFhiBwz.js",
|
||||
"status": 200,
|
||||
"sha256": "0aa305851e99b8825bca18b21d69cf58d335f7499f09c1e4508084653325e88b"
|
||||
},
|
||||
{
|
||||
"file": "assets/project-dossier-document-HOU8u9Tk.js",
|
||||
"status": 200,
|
||||
"sha256": "03219fd42f932e0f8cc39e2be721a3a2b7cbb519d7d5378e8fb18567951b686d"
|
||||
},
|
||||
{
|
||||
"file": "assets/simulation-form-BqVD91Ek.js",
|
||||
"status": 200,
|
||||
"sha256": "85cbd533c5bc92af5a448db71da006d4346d2d0adb09dde825db0aa19ad5048c"
|
||||
}
|
||||
],
|
||||
"simulator_status": 200,
|
||||
"simulator_entry": "assets/app-C9PCQDSl.js",
|
||||
"existing_fiscal_availability": {
|
||||
"data": {
|
||||
"enabled": true,
|
||||
"coverage_start": "2026-01-01",
|
||||
"coverage_end": "2026-12-31",
|
||||
"message": "IVA geral sobre base líquida disponível; enquadramento declarado."
|
||||
}
|
||||
},
|
||||
"synthetic_private_writes": 0,
|
||||
"method": "Read-only installedrevision/manifest/newcompiledcatalogueandreaders/simulatorentry;acceptedQAproofsreused"
|
||||
},
|
||||
"runtime_delta": [
|
||||
{
|
||||
"path": "resources/js/components/simulation-irpc-form-preparation.tsx",
|
||||
"sha256_LF": "9080304461bc55e3add4cfc68d756ab969b0648e6419cfb5f7175eea6861a4ff"
|
||||
},
|
||||
{
|
||||
"path": "resources/js/components/simulation-irpc-normal.tsx",
|
||||
"sha256_LF": "87178faabee3a6092ff14f74fb120841ca6d88ccc611006e549f49115596ca1f"
|
||||
},
|
||||
{
|
||||
"path": "resources/js/lib/irpc-normal-form-preparation.ts",
|
||||
"sha256_LF": "61db2e8f6303f82194ff45782e8baf405bded489645cf1b90eae4945a454d649"
|
||||
},
|
||||
{
|
||||
"path": "resources/js/lib/irpc-normal.ts",
|
||||
"sha256_LF": "aa3e7305edd0957f52163ecd0f67f3d513c65d3f3c5d64fc1af1ff843bc9d729"
|
||||
}
|
||||
],
|
||||
"protected_runtime": [
|
||||
{
|
||||
"path": "resources/js/components/simulation-irpc-period-fx.tsx",
|
||||
"sha256": "4b5f718b5ef415ecf5f96dabb0e3806254558c20905de6478e10dacf67569c49"
|
||||
},
|
||||
{
|
||||
"path": "resources/js/components/simulation-irpc-schedules.tsx",
|
||||
"sha256": "3768c316d5887d337eb3647671863c9464f961d1df4703403e7d57e5641273ed"
|
||||
},
|
||||
{
|
||||
"path": "resources/js/lib/irpc-normal-assessment.ts",
|
||||
"sha256": "a9b3ced852e37e3e087ce5dab1add4ec0737145ce19f61857a54d5d3d24a6f8c"
|
||||
},
|
||||
{
|
||||
"path": "resources/js/lib/irpc-normal-base.ts",
|
||||
"sha256": "22019d678f6eb16fead2207dc3d3fa9fd63413c6254633c1ffd4f1c0320344ac"
|
||||
},
|
||||
{
|
||||
"path": "resources/js/lib/irpc-normal-costs.ts",
|
||||
"sha256": "471457692a2a2f70a1bd1c7abb38d3ce42f07b62a63e5a4ab985ad1bbd068b46"
|
||||
},
|
||||
{
|
||||
"path": "resources/js/lib/irpc-normal-depreciation.ts",
|
||||
"sha256": "1dad3053157aeac44f6d3bd58885cfc47a73c19d2808284c16931679dfe4291b"
|
||||
},
|
||||
{
|
||||
"path": "resources/js/lib/irpc-normal-period-fx.ts",
|
||||
"sha256": "a2e7b066623eae17f0d8185d065d0adf5d3a485f780f8b09118a664dc4ba0531"
|
||||
},
|
||||
{
|
||||
"path": "resources/js/components/simulation-irpc-depreciation.tsx",
|
||||
"sha256": "1f9918bfb435bb5b7c0ddd2fafd7bace2a02514c6ece04b93f15975e494a5f53"
|
||||
},
|
||||
{
|
||||
"path": "resources/js/lib/irpc-normal-profit.ts",
|
||||
"sha256": "909e129a0245e6bf098317485b886a2d19e02c64bbfd9c6f718e98ec6b935b8d"
|
||||
},
|
||||
{
|
||||
"path": "resources/js/lib/irpc-normal-schedules.ts",
|
||||
"sha256": "edfb6fd338411fa8f87a6bdf9a9d4fd5c6dc2fad9d2eb3d32f2640e2951cbbe9"
|
||||
},
|
||||
{
|
||||
"path": "resources/js/components/simulation-irpc-costs.tsx",
|
||||
"sha256": "c4156916835daf0f33addf89dfedd40c31b8dc3297112cd98beac33422af274d"
|
||||
},
|
||||
{
|
||||
"path": "resources/js/lib/irpc-normal-forms.ts",
|
||||
"sha256": "4e986addb9f2d74e7a80345f8f1e4d8e0b2f562c867fa6eee84880d9f72a3649"
|
||||
},
|
||||
{
|
||||
"path": "resources/js/components/simulation-irpc-taxable-base.tsx",
|
||||
"sha256": "e4fe9f66d35d24aa68fd87de6a5a6a0e901706b270c18962fd0c7ab00f9abd93"
|
||||
},
|
||||
{
|
||||
"path": "resources/js/components/simulation-irpc-assessment.tsx",
|
||||
"sha256": "7174cc0160005a0c332ea40f02ba8a6d57985081b5ab45177ccd6e721bceea54"
|
||||
},
|
||||
{
|
||||
"path": "resources/js/components/acquisition-beverage-restitution.tsx",
|
||||
"sha256": "6f44897b8b12569314551df0022c26da57a165634087942a724293e66837558d"
|
||||
},
|
||||
{
|
||||
"path": "resources/js/components/fiscal-calculation-gaps.tsx",
|
||||
"sha256": "1dab6ceb73756d4e023096b3b2ba767aaa843ff6cc69046ea630ab449a00b0dd"
|
||||
},
|
||||
{
|
||||
"path": "resources/js/components/fiscal-l3-preparation.tsx",
|
||||
"sha256": "e84a7b1ccadaa1b5bd78d778a3287f96ccaf530855eef404786cd7aa3d321b73"
|
||||
},
|
||||
{
|
||||
"path": "resources/js/components/simulation-acquisitions.tsx",
|
||||
"sha256": "c206d4cfe575d6ba007aa2b425b5f898efa97e4162b8710e358b6ecfd9458542"
|
||||
},
|
||||
{
|
||||
"path": "resources/js/components/simulation-operations.tsx",
|
||||
"sha256": "a7e55972fa790063dcf11945055de2af46a77db9e509900af22ede7ec47bb4cf"
|
||||
},
|
||||
{
|
||||
"path": "resources/js/lib/iva-acquisition-bc.ts",
|
||||
"sha256": "b0ef55e0917bdb79f14b53ba9e95d73c08153befeb7d4ce73f81e6fb13992225"
|
||||
},
|
||||
{
|
||||
"path": "resources/js/lib/iva-beverage-allocation.ts",
|
||||
"sha256": "32968d198c7fe0c53ca89641c22d5749be6636be2c79127b867e4e3afd0dd40d"
|
||||
},
|
||||
{
|
||||
"path": "resources/js/lib/iva-beverage-restitution.ts",
|
||||
"sha256": "5c650cbd9469d5f99001f56fc4ff99ac973eb368036d4e96c6d171f1b220bd9e"
|
||||
},
|
||||
{
|
||||
"path": "resources/js/lib/iva-calculation-gaps.ts",
|
||||
"sha256": "2e7d84a0c196bd5b56fd67cc1a389d43d5041894184e675680a4de3cd10b31a2"
|
||||
},
|
||||
{
|
||||
"path": "resources/js/lib/iva-operations.ts",
|
||||
"sha256": "ec37b949f1233c5f5c14a87450c421ed29fabf1ed5b73fb32564564a2bc31f54"
|
||||
},
|
||||
{
|
||||
"path": "resources/js/lib/l3-form-preparation.ts",
|
||||
"sha256": "fc47f5fa5ec1420fbd847d0d081f00d99ebbb524164eef785b20877e0562f704"
|
||||
},
|
||||
{
|
||||
"path": "resources/js/lib/ispc-residuals.ts",
|
||||
"sha256": "40d5751c06c7c155ab4b7a17ee2d1653da2fbbf075807fbb8561cdbe19820955"
|
||||
},
|
||||
{
|
||||
"path": "resources/js/components/simulation-ispc-residuals.tsx",
|
||||
"sha256": "a9219d6f41ccbd0ce45659d4f6aa0fa1c169a685840f5cb1e18daeca377d5e18"
|
||||
},
|
||||
{
|
||||
"path": "resources/js/lib/ispc-eligibility.ts",
|
||||
"sha256": "44675c5efacdc1ae19505667611ba3b522d3043cebacc8754597c3a68ca89d25"
|
||||
},
|
||||
{
|
||||
"path": "resources/js/components/simulation-ispc-quarter.tsx",
|
||||
"sha256": "2c2555309b32d4261f14e7164f39314c9188129c2990357fc54090a2468dd2b4"
|
||||
},
|
||||
{
|
||||
"path": "resources/js/components/simulation-ispc-withholding.tsx",
|
||||
"sha256": "e0445d015b72859e48726959aa52686f79b1cf5c2ade29751efa83257068b878"
|
||||
},
|
||||
{
|
||||
"path": "resources/js/lib/ispc-quarter.ts",
|
||||
"sha256": "f66bd52e9cdfe1ddaa6b00a931465862b3d890b9be216b7a056740f027f24129"
|
||||
},
|
||||
{
|
||||
"path": "resources/js/lib/ispc-withholding.ts",
|
||||
"sha256": "6c31b240299edd3262efa28f7f3d5aee21123f94e30ef4ab90e26c35777cb6e4"
|
||||
},
|
||||
{
|
||||
"path": "resources/js/components/simulation-ispc-eligibility.tsx",
|
||||
"sha256": "f48dd4a8f87a994eda0447f81a463589905e5873b2e1044debac9d10825a880c"
|
||||
},
|
||||
{
|
||||
"path": "resources/js/lib/iva-acquisitions.ts",
|
||||
"sha256": "cce283b1d0a07fb383fcb527225f4dd5bec829010a662cbaae1d60e595221977"
|
||||
},
|
||||
{
|
||||
"path": "resources/js/lib/iva-modelo-a.ts",
|
||||
"sha256": "c641619a05613c1620385baad0e9ffbf810dd970aafb30e12b3a7f9a3bf11846"
|
||||
},
|
||||
{
|
||||
"path": "resources/js/lib/iva-fx-selection.ts",
|
||||
"sha256": "9aa07ad443bc777b80510a3b5bd6aff9ddb9814d2450f3c690e531e74d71d998"
|
||||
},
|
||||
{
|
||||
"path": "resources/js/components/simulation-fx-selection.tsx",
|
||||
"sha256": "39bb6d87d404745b0b66349bc11626545a3672ae27321ce9b4658416592059bf"
|
||||
},
|
||||
{
|
||||
"path": "resources/js/lib/business-financial-plan.ts",
|
||||
"sha256": "c20274722d1ffcd0360f041a6cacb5d868fe0621cb27a1aca6e06826612c3ebb"
|
||||
},
|
||||
{
|
||||
"path": "resources/js/lib/iva-currency-events.ts",
|
||||
"sha256": "cc9f2045d302d7987310da4006cc250fc5c99a27397918d166d649bfc32fab08"
|
||||
},
|
||||
{
|
||||
"path": "resources/js/lib/irpc-fx.ts",
|
||||
"sha256": "5c4a7a477429f8d775acf6db3e117008468f5554e5731dec81f60fbb75e948fb"
|
||||
},
|
||||
{
|
||||
"path": "resources/js/lib/irpc-withholdings.ts",
|
||||
"sha256": "8e5f3c035ce5e4d6c3fc82f933439ab580fa5519492f9c4d32cfb71b77b54803"
|
||||
},
|
||||
{
|
||||
"path": "resources/js/components/simulation-irpc-withholdings.tsx",
|
||||
"sha256": "751af4fab346659bc5ccb08b8a2169769af7521ea0035050af32b41ea7f5aa76"
|
||||
},
|
||||
{
|
||||
"path": "resources/js/lib/irpc-interest.ts",
|
||||
"sha256": "f8e6390b3b2c58c296f7e3fd14576e06ae248bc0cabce1a666b7094611f2a7dd"
|
||||
},
|
||||
{
|
||||
"path": "resources/js/lib/irpc-mrfta.ts",
|
||||
"sha256": "76dcce8954f68b081d500be61de9c5b146a452a3eb578a0b78776ba9e1f8051c"
|
||||
},
|
||||
{
|
||||
"path": "resources/js/lib/irpc-mrfta-cases.ts",
|
||||
"sha256": "4266746076ab3f70312fd042351e24dd2f136c4f3e8a277b57dd97849a9f1862"
|
||||
},
|
||||
{
|
||||
"path": "resources/js/components/simulation-irpc-mrfta.tsx",
|
||||
"sha256": "913d1bb4ac0fc59763cf5d27bc637f6a713b2050c4463748db554af4be451538"
|
||||
},
|
||||
{
|
||||
"path": "resources/js/lib/financial-fiscal-bridge.ts",
|
||||
"sha256": "5a30c501653b16b5fedcb12631ce81fcce4fe473aa542e94374986b3c50f2d33"
|
||||
},
|
||||
{
|
||||
"path": "resources/js/components/simulation-form.tsx",
|
||||
"sha256": "85b024a7f45ceb52efd6ff1f21d0eab1fd8fcf1ab59e4b5302c08685235c472a"
|
||||
},
|
||||
{
|
||||
"path": "resources/js/lib/project-dossier.ts",
|
||||
"sha256": "a0909bbfcdf7e8542b010faa104fcb918e86ae38ddf096082d4d5be98d31b2b9"
|
||||
},
|
||||
{
|
||||
"path": "resources/js/lib/project-dossier-report.ts",
|
||||
"sha256": "5207a2ffeb208cd5ace6713038cee85208020ee618194dca7114e94fc3200b6c"
|
||||
}
|
||||
],
|
||||
"originals": [
|
||||
{
|
||||
"path": "docs/investmoz/simulations/source-archive/AT-Comunicado-9-2026-ISPC.pdf",
|
||||
"sha256": "106f8a9ce9255c03549c70bf07fe999d32e6e55302d009b509862aa74ccb4973"
|
||||
},
|
||||
{
|
||||
"path": "docs/investmoz/simulations/source-archive/AT-Modelo-30-ISPC.pdf",
|
||||
"sha256": "6802edd06b6ff638a0b851a3ec7ecf69af8f07840faa47446becad67d35d445c"
|
||||
},
|
||||
{
|
||||
"path": "docs/investmoz/simulations/source-archive/AT-Modelo-B-Geral.pdf",
|
||||
"sha256": "bd977c7c59d4d98befd92e2c566b1bf168cb1343bb519f51b41a3807f431fc57"
|
||||
},
|
||||
{
|
||||
"path": "docs/investmoz/simulations/source-archive/AT-MRFTA-19-39.pdf",
|
||||
"sha256": "8ea62c53066b482f87078a7a7b1ecf15ca98a12a122e8d7abca63acfc993186b"
|
||||
},
|
||||
{
|
||||
"path": "docs/investmoz/simulations/source-archive/BM-Mercado-Monetario-MAIBOR-20261025.html",
|
||||
"sha256": "00e8a7e0d3a1db4ca3beb56d5361b2084a0f1684f3d40fc1c203702a2190e063"
|
||||
},
|
||||
{
|
||||
"path": "docs/investmoz/simulations/source-archive/BR-16-I-Serie-2008-04-16.pdf",
|
||||
"sha256": "fc373ff5637edf75ec6a9595dec8763a8503d4ee786e3b7d8f1c742eae9d80ee"
|
||||
},
|
||||
{
|
||||
"path": "docs/investmoz/simulations/source-archive/BR-248-I-Suplemento-1-2025.pdf",
|
||||
"sha256": "ccf2a8deeca820f2dd076b4b2141b1efe3f6a806568c3a587ca59a8e92f4c251"
|
||||
},
|
||||
{
|
||||
"path": "docs/investmoz/simulations/source-archive/BR-89-I-Serie-2017-06-08.pdf",
|
||||
"sha256": "11f0cab15eb6e51010952203ffa24fdc533a24fd642e19525fe4f46b17a1f5e5"
|
||||
},
|
||||
{
|
||||
"path": "docs/investmoz/simulations/source-archive/BR-95-I-Suplemento-2025-05-21.pdf",
|
||||
"sha256": "e0e682e2c027c3cd9c1d46a73a3f48bc5f6bdbf05667fd97314d7a3f6a456358"
|
||||
},
|
||||
{
|
||||
"path": "docs/investmoz/simulations/source-archive/BR252-I-Serie-2022-Lei20-PESOE.pdf",
|
||||
"sha256": "1159fd3ce1ba5581671796d083534da48bd3c5578298819e896f1c2a8026318d"
|
||||
},
|
||||
{
|
||||
"path": "docs/investmoz/simulations/source-archive/Decreto-22-2021-BR70.pdf",
|
||||
"sha256": "a8fac38dcfe08f9c7a8e46254cff10e1ec82fc4f7a8d88ad6e4fe7d91ffc21a5"
|
||||
},
|
||||
{
|
||||
"path": "docs/investmoz/simulations/source-archive/Decreto-27-2026-BR123.pdf",
|
||||
"sha256": "26249c3fa58f149c81de36e99d1aac2819a4771379d9e8833159660dabf539bb"
|
||||
},
|
||||
{
|
||||
"path": "docs/investmoz/simulations/source-archive/Decreto-29-1998-BR22-5-suplemento.pdf",
|
||||
"sha256": "6242cbe675faadf085f43f95ec8c7e8868aafe67c3b2ab2bb010992288f954f8"
|
||||
},
|
||||
{
|
||||
"path": "docs/investmoz/simulations/source-archive/Decreto-3-2011-BR-11-I-mineiros.pdf",
|
||||
"sha256": "5bca1133666ba9c69870b89823420175b7b5b8d0eccb667ecdf5c29716f3b6be"
|
||||
},
|
||||
{
|
||||
"path": "docs/investmoz/simulations/source-archive/Decreto-37-2023-BR124.pdf",
|
||||
"sha256": "7e680b191481faa0e2e9057fa5053587eb2a29d1d8c819e0eb9f02814255a04c"
|
||||
},
|
||||
{
|
||||
"path": "docs/investmoz/simulations/source-archive/Decreto-9-2008-BR16.pdf",
|
||||
"sha256": "96fccdecbfdc11c9eafb90fbc6c7bc259f88bbd4c7507d1ac3af1fa03f960697"
|
||||
},
|
||||
{
|
||||
"path": "docs/investmoz/simulations/source-archive/Lei-13-2016-CIVA-BR-156-10-suplemento.pdf",
|
||||
"sha256": "b90dc7c14ecea2e378c4a62e8e5a47d54a5644c457baeb8b8053b92fd2a5710b"
|
||||
},
|
||||
{
|
||||
"path": "docs/investmoz/simulations/source-archive/Lei-14-1992-BR42.pdf",
|
||||
"sha256": "089fff7423e99a70a230a73ca379e4ea3a91d124703f91016e57ff82794b9e56"
|
||||
},
|
||||
{
|
||||
"path": "docs/investmoz/simulations/source-archive/Lei-17-2022-BR251-exemplar-MCNet5.pdf",
|
||||
"sha256": "14eb34f0af91a8f5cb1770c7b52d6ff839c6818302d1ed96d79afbfb9fe999d4"
|
||||
},
|
||||
{
|
||||
"path": "docs/investmoz/simulations/source-archive/Lei-17-2022-IPP-BR250-Parlamento.pdf",
|
||||
"sha256": "978cd22403ffd336a631704ecd7a5bbd814a427c815b9acdaca5515591dd9e2a"
|
||||
},
|
||||
{
|
||||
"path": "docs/investmoz/simulations/source-archive/Lei-19-2013-BR76.pdf",
|
||||
"sha256": "bba96d645cc935ffc3d1a79b9f0f73ac1c693d6459c2ad41f56cd2841accae76"
|
||||
},
|
||||
{
|
||||
"path": "docs/investmoz/simulations/source-archive/Lei-19-2017-IRPS-BR-OCAM.pdf",
|
||||
"sha256": "c3a0186cb9ad090d7a9533006295dc9bb6a62ad0d6150173cbd49dba4ee4b52d"
|
||||
},
|
||||
{
|
||||
"path": "docs/investmoz/simulations/source-archive/Lei-2-2011-BR-1-4-suplemento-MCNet.pdf",
|
||||
"sha256": "a7543a68cc3287a46a83c39a04821b40f649dd06c4e9b5dc51ff0b47fba08899"
|
||||
},
|
||||
{
|
||||
"path": "docs/investmoz/simulations/source-archive/Lei-20-2009-BR36-AT-exemplar19.pdf",
|
||||
"sha256": "fc1c8144db42960cbf73e717e095896f511ece0f907f58f78819b27d6917a7ee"
|
||||
},
|
||||
{
|
||||
"path": "docs/investmoz/simulations/source-archive/Lei-22-2022-IVA-republicada-BR-250-2-suplemento.pdf",
|
||||
"sha256": "ea1b0dc6f5cf6e595f6d9a19e7042f398999e0087caef1785f6e8fac571b5f53"
|
||||
},
|
||||
{
|
||||
"path": "docs/investmoz/simulations/source-archive/Lei-34-2007-BR52.pdf",
|
||||
"sha256": "cdbef875ad7ccc1517b12faf5de0e893a70ed2ed81e33913cd6dc4a674474e6e"
|
||||
},
|
||||
{
|
||||
"path": "docs/investmoz/simulations/source-archive/Lei-4-1994-BR37-3-suplemento.pdf",
|
||||
"sha256": "210df9db8980d0a5690cd187a6eeec7e37a900d743e39062c16f4e0d12215c7e"
|
||||
},
|
||||
{
|
||||
"path": "docs/investmoz/simulations/source-archive/Lei-4-2012-BR3.pdf",
|
||||
"sha256": "b8845cef41dcbd9ba50c43dbfa743a56030dd3d348242a107e1ae30279eec121"
|
||||
},
|
||||
{
|
||||
"path": "docs/investmoz/simulations/source-archive/Lei-7-1991-Partidos-IFES.pdf",
|
||||
"sha256": "6b783a0bb3330688ef10660a58060d9724aa2da6a873d234fe902f0eaaeda42d"
|
||||
},
|
||||
{
|
||||
"path": "docs/investmoz/simulations/source-archive/PT-MZ-CDT-1992.pdf",
|
||||
"sha256": "d504e1024b28aee5c6acf4592acb96ec9c915a8414f67a61ab6984d6acf9df9d"
|
||||
},
|
||||
{
|
||||
"path": "docs/investmoz/simulations/source-archive/PT-MZ-Protocolo-2009.pdf",
|
||||
"sha256": "f353773dcf41f09f4daa6cf5ba5a5f7994f3e02615867c2dcffc61c3d901bf9b"
|
||||
}
|
||||
],
|
||||
"pipeline_checks": [
|
||||
"OK (1 test, 3106 assertions)",
|
||||
"built in 31.73s",
|
||||
"OK (59 tests, 317 assertions)",
|
||||
"# tests 988",
|
||||
"# pass 988",
|
||||
"# fail 0"
|
||||
],
|
||||
"accepted_QA_proofs": {
|
||||
"frontend_tests": 15,
|
||||
"API_tests": 1,
|
||||
"API_assertions": 97,
|
||||
"database": "127.0.0.1:55441/simulator_fiscal_delta_20261021_test;DatabaseTransactions rollback",
|
||||
"routes_actions": "existing guarded procedure",
|
||||
"typescript": "passed",
|
||||
"build": "passed",
|
||||
"UI": "actual component/classification/taxstate/fractions/recover/export/independentcolecta",
|
||||
"accepted_proofs": "reused"
|
||||
},
|
||||
"accepted_proofs_reused": true,
|
||||
"manually_repeated_accepted_suites": false,
|
||||
"sequence": {
|
||||
"mapped": "net3120+depreciation10→profit/base3130→colecta1001.60MZN unchanged",
|
||||
"fraction": "M20 amount300.50=601/2 kept exact;no fiscal rounding presumed",
|
||||
"own_booktax": "net2800 known with booktax320;ownM22code pending,not213 ofothers",
|
||||
"FX_assumptions": "preserved and explicit;no fiscal annual conversion confirmation",
|
||||
"final_payable": null,
|
||||
"final_recoverable": null,
|
||||
"final_balance_scope": "L8"
|
||||
},
|
||||
"remaining_L6": {
|
||||
"installed_scope_reference": "5aaf1a56",
|
||||
"implementation_remaining": [
|
||||
{
|
||||
"case": "Amortizações e quota de aluguer36h restantes",
|
||||
"example": "Ar condicionadoII/3/3,12,5%,fora dos10códigos implementados;bem usado com vida esperada e quotas anteriores documentadas.",
|
||||
"resume": "Acrescentar catálogo e variantes previstas nas fontes aceites:usados/abertura/reparações/reavaliação,uso intensivo/concessões/peças/intangíveis,transição e excepções de método/vida útil,art17 em período curto e quota36h automática. Implementar só o caso escolhido e provar o delta;sem aguardar validação genérica daAT.",
|
||||
"affected": "Só activo,método ou quota ainda não suportados;amortizações demonstradas preservadas."
|
||||
},
|
||||
{
|
||||
"case": "Custos e periodizações específicos",
|
||||
"example": "Campanha de lançamento300 com imputação por3exercícios;obra com receita antecipada positiva em vez do zero demonstrado.",
|
||||
"resume": "Implementar36-A e articulação com36n,reforços financeiros28(3),19(5)/19(6) e18(6–10),com saldos/condições do caso. Autorização de mudança de método apenas quando a disposição aplicável a exigir. Provisões sectoriais dependem primeiro da norma específica indicada abaixo.",
|
||||
"affected": "Só campanha,obra ou periodização específica;limites/provisões ordinários e casos já demonstrados mantidos."
|
||||
},
|
||||
{
|
||||
"case": "Períodos e sequência de perdas",
|
||||
"example": "Transição de4meses seguida dos períodos posteriores:aplicar a exclusão de contagem de41(5) ao período7(4)d,sem contar apenas anos civis.",
|
||||
"resume": "Representar a sequência efectiva de períodos/perdas e acrescentar datas parciais,liquidação/períodos superiores a12meses e outros exercícios com regra/taxa aplicável. Não há nova pesquisa necessária para repetir o recorte de meses completos2026 já entregue.",
|
||||
"affected": "Só período ou utilização de perda dependente;lucro independente e semestres demonstrados preservados."
|
||||
},
|
||||
{
|
||||
"case": "Desdobramentos contabilísticos e quadros/anexos M20/M22 restantes",
|
||||
"example": "Imposto próprio200 já incluído no plano e320 exterior:discriminar as duas componentes sem duplicar gasto;contas fora das6linhas financeiras ainda não transportadas.",
|
||||
"resume": "Acrescentar o desdobramento e as correspondências dos quadros/anexos escolhidos,reutilizando dados existentes. Campos sem correspondência aguardam a referência concreta abaixo;os outros componentes podem ser implementados/provados separadamente.",
|
||||
"affected": "Só componente/conta/campo ainda não suportado;valores e campos correspondidos preservados."
|
||||
},
|
||||
{
|
||||
"case": "Saldos em moeda estrangeira",
|
||||
"example": "Crédito final100USD não é soma das receitas convertidas por mês.",
|
||||
"resume": "Implementar reconciliação de saldo e conversão pela data/regra que vier identificada,usando o motor cambial já entregue. A selecção mensal para simulação continua disponível;esta tarefa não cria outro mecanismo cambial.",
|
||||
"affected": "Só saldo/conversão fiscal dependente da regra;plano e pressupostos mensais permanecem disponíveis."
|
||||
}
|
||||
],
|
||||
"documentary_clarifications": [
|
||||
{
|
||||
"case": "Edição e campos M20/M22",
|
||||
"example": "M20A.1/D35 remete201/quadro8;PDF M22 usa200/quadro10. Imposto próprio320 não pertence ao213 de outrem;quota recuperada−26 não tem campo de dedução confirmado.",
|
||||
"resume": "Obter exemplar compatível ou instrução que identifique edição/período,campo e sentido do transporte. Para periodização/obras/reversões ainda sem campo,identificar a correspondência específica. Até informação nova,manter valores/efeitos sem código presumido e não repetir pesquisa.",
|
||||
"affected": "Só transporte,campo e somas dependentes;resultado líquido próprio,260/278/300 e demais campos conhecidos mantidos."
|
||||
},
|
||||
{
|
||||
"case": "Representação fiscal de fracções",
|
||||
"example": "M20:300,50=601/2MZN,num exemplar que pede meticais sem centavos;M22:1/300MZN não é um número exacto de cêntimos.",
|
||||
"resume": "Identificar instrução de representação/arredondamento da edição/campo ou esclarecimento específico. Conservar a fracção até lá;não deduzir regra de arredondamento apenas do rótulo «sem centavos».",
|
||||
"affected": "Só transcrição não exactamente representável;inteirosM20,cêntimos exactosM22 e cálculo racional preservados."
|
||||
},
|
||||
{
|
||||
"case": "Articulação de limites em combinações não demonstradas",
|
||||
"example": "Combustível100,comprovado80,viatura de passageiros sem excepção:36h/i com36(4). Provisão de créditos200 num período curto de3meses:limite anual por corresponder.",
|
||||
"resume": "Esclarecer especificamente a articulação h/i/36(4) e a base/limite dos períodos curtos de publicidade/créditos,se houver proporcionalização aplicável. Não somar exclusões,anualizar ou repartir por presunção. Retomar só perante referência/resposta concreta para o exemplo.",
|
||||
"affected": "Só combinação ou limite do período;casos independentes com regra já aplicada mantidos."
|
||||
},
|
||||
{
|
||||
"case": "Regra fiscal de conversão anual",
|
||||
"example": "PlanoUSD com64MZN/USD por mês é pressuposto sintético de simulação,não confirmação da data/taxa fiscal anual ou da cotação do saldo final.",
|
||||
"resume": "Identificar disposição/âmbito,data,base e taxa/boletim aplicáveis ao resultado e,quando necessário,ao saldo. Reutilizar o motor existente e demonstrar só a correspondência nova;sem taxa actual por defeito ou nova ronda da pesquisa anterior.",
|
||||
"affected": "Só confirmação fiscal anual e saldo dependente;conversões mensais documentadas de simulação mantidas com os avisos."
|
||||
},
|
||||
{
|
||||
"case": "Norma sectorial de provisões reguladas",
|
||||
"example": "Provisão200 de uma entidade financeira sujeita ao28d não herda os1,5%/6% do regime ordinário29.",
|
||||
"resume": "Identificar sector,regulador,norma de supervisão aplicável e saldos/condições necessários,antes da implementação específica. A fonte oficial fornecida é aceite;falta a regra concreta do caso,não certificação genérica da fonte.",
|
||||
"affected": "Só provisão regulada respectiva;provisões ordinárias demonstradas preservadas."
|
||||
}
|
||||
],
|
||||
"sources_reused": [
|
||||
{
|
||||
"path": "docs/investmoz/simulations/irpc-l6-costs-provisions-timing-qa-20261026.json",
|
||||
"sha256": "b12df09899cbbf53fdb066f24dbe4852400b2d4bff01627e16e64c56f9860780"
|
||||
},
|
||||
{
|
||||
"path": "docs/investmoz/simulations/irpc-l6-depreciation-qa-20261026.json",
|
||||
"sha256": "167267f23a59cebfa874e46bf0238675fd7f92b4ee4e4c12cd0fda6ff3a99df5"
|
||||
},
|
||||
{
|
||||
"path": "docs/investmoz/simulations/irpc-l6-periods-fx-qa-20261026.json",
|
||||
"sha256": "a893c0608977a4b2b2a40379b2d54534f3ae96b082c0c64e43b4e2392b9152d9"
|
||||
},
|
||||
{
|
||||
"path": "docs/investmoz/simulations/irpc-l6-values-forms-qa-20261026.json",
|
||||
"sha256": "2fcf80b2493ab8472f247091ba59a9e6f84d00bab210ab667cefcba241c29a0d"
|
||||
}
|
||||
],
|
||||
"existing_matrix_row": "AUD-SIM-INT02",
|
||||
"new_research": false,
|
||||
"new_functional_tests": false,
|
||||
"L6_integrally_complete": false,
|
||||
"operational_closure_decision_recorded": false,
|
||||
"L7_L8_own_scopes": true
|
||||
},
|
||||
"L6_complete": false,
|
||||
"operational_closure_decision_recorded": false,
|
||||
"L7_L8_own_scopes": true,
|
||||
"proof_files": {
|
||||
"backup.txt": "cf1f754f54ef98184562357b55acd12b479beea5e92b2212c75d1d03560b2274",
|
||||
"balance-section.md": "26907b1ecd068819e8fb6fd9635b103750c7459d614dce28d653d6a96018fcbb",
|
||||
"balance.json": "ea400110264925daa84380c370c4b5129de4ef7923b3d1af5433a7a7879d8e00",
|
||||
"installed-protected.txt": "e5d8530e3a6be9ed5f88a326d45b0748eca4faa1b5c64f39591930be329e41ec",
|
||||
"installed-public-delta.json": "90d2a9a7d9fffb076e2773b4174fc20ce9c577d73c8154140e2b504e683638cf",
|
||||
"installed-public.txt": "074fc7a1bc4055cd357764670c17a29f678bd1d3351da918813555d53b50a5e5",
|
||||
"integration.txt": "828ca004ab574a3a687b7dc3a3176b0b4da81797af770a5e81694f5f7cee543f",
|
||||
"manifest-served.json": "e145286fdcb31ffe687568637861f7a630f9b943586d765f8d2e09957780ba14",
|
||||
"operational-delta.txt": "15c876ffa750c6b26d7cef368d78df21c101bf82dbb08e1dc7beb533bac2022c",
|
||||
"preflight.txt": "8e90d1a978640df1dd161c54ab80c0e2b4c8046d3bd484bcc866ca40046081a5",
|
||||
"preparation.json": "7df19578178f3ad55deb2c6fe8a48cb44233e64859be2e47b51b6f8e56da55e4",
|
||||
"progress.txt": "dcc4abfd0fded4529ecf58b4a24392d3e3ae5071cad1474421ff3768da8e786d",
|
||||
"restore.txt": "48c8f2a3b060ce86164273f072978eeffb57d01aa365e4c71a34cab2c1925b44",
|
||||
"schema-permissions-after.txt": "76b5a4d8af11e4898a205062766cfb7ab6ec0783200e77e60a1927aa1ca18597",
|
||||
"schema-permissions-before.txt": "0ab7c964792acdd8917bce256c472e55e034b103500a58b49f020b5084823ed7",
|
||||
"status-final.txt": "7dedabc439b43d2938fa524a275a48b350cb948d6e4bfb1d551eac66d877fff1"
|
||||
}
|
||||
}
|
||||
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,225 @@
|
||||
{
|
||||
"status": "L6_operational_demonstrated_scope_accepted_L7_delimited_not_implemented",
|
||||
"recorded_date": "2026-10-26",
|
||||
"authority": {
|
||||
"origin": "express_user_instruction",
|
||||
"decision": "L6 operacional no âmbito demonstrado, com limitações explícitas; delimitar L7; L8 conserva liquidação final",
|
||||
"new_generic_approval_required": false
|
||||
},
|
||||
"baseline": {
|
||||
"installed_commit": "5aaf1a56f9d928331364fcc8b0d1528e51dba327",
|
||||
"reused_delivery_receipt": "irpc-l6-values-forms-delivery-20261026.json",
|
||||
"documentation_parent": "45fd591c7faa765f33de0a0b9000c3ceb4057abe",
|
||||
"root_documentation_parent": "31651a76b11ed50576c52cd274e3c59cda0f8924"
|
||||
},
|
||||
"L6": {
|
||||
"operational_scope_accepted": true,
|
||||
"integrally_complete": false,
|
||||
"existing_code_pending_groups": 5,
|
||||
"existing_documentary_pending_groups": 5,
|
||||
"pending_list": "same matrix/manual: saldo consolidado de L6",
|
||||
"old_pending_decision_records_preserved_as_history": true,
|
||||
"dependent_cases_only_blocked": true,
|
||||
"accepted_proofs_reused": true
|
||||
},
|
||||
"L7": {
|
||||
"state": "delimited; no new executable treatment",
|
||||
"context_reused": [
|
||||
"opportunity/dossier snapshots",
|
||||
"sector and territorial IDs/labels/provenance",
|
||||
"subject/NUIT/residence/EP/period",
|
||||
"business_plan_snapshot",
|
||||
"modelo_a_snapshot.irpcNormal versions",
|
||||
"asset and expense IDs/previous quotas",
|
||||
"exact rational values and demonstrated form mappings"
|
||||
],
|
||||
"location_grants_benefit": false,
|
||||
"effect_types": [
|
||||
"profit_adjustment",
|
||||
"taxable_base_deduction",
|
||||
"rate_by_eligible_parcel",
|
||||
"separate_autonomous_tax",
|
||||
"potential_credit_entitlement_for_L8"
|
||||
],
|
||||
"families": [
|
||||
"61(4) expenses autonomous tax",
|
||||
"61-A capital gains autonomous tax from2026",
|
||||
"CIRPC9–14 entity exemptions/cooperative12",
|
||||
"CBF16 accelerated depreciation",
|
||||
"CBF17–19 deductions/magnifications",
|
||||
"CBF15 potential investment credit; annual use L8",
|
||||
"CBF sector/territory specific provisions",
|
||||
"special operations54–56/41-A and specifically mapped sector regimes"
|
||||
],
|
||||
"first_increment": [
|
||||
"common qualification, provenance, period and separate effects",
|
||||
"61(4) expense35% with existing36g addback, no duplicate",
|
||||
"missing-information and negative-condition cases"
|
||||
],
|
||||
"next_compatible_cases": [
|
||||
"cooperative12 eligible parcel",
|
||||
"CBF16 supported asset and reconciled prior quotas"
|
||||
],
|
||||
"not_implemented_yet": [
|
||||
"specific qualification/persistence",
|
||||
"new treatment calculations and per-parcel reconciliation",
|
||||
"treatment-specific reporting/exports"
|
||||
],
|
||||
"documentary_pending_scope": "Only individual status/title where required, parcel/limit/chronology, unmapped specific sector norm or affected form edition/field; examples and resume conditions in same matrix/manual",
|
||||
"historical_mutation_permitted": false
|
||||
},
|
||||
"L8": {
|
||||
"retentions_payments_annual_credit_application_final_settlement": true,
|
||||
"final_balance_calculated": false
|
||||
},
|
||||
"source_inventory": {
|
||||
"reused_inventory": "C:\\laragon\\www\\portal-investidor\\outputs\\ispc-l4a-20261025\\preservation-before-tests.json",
|
||||
"files": 8143,
|
||||
"fresh_broad_scan": false,
|
||||
"sources": [
|
||||
{
|
||||
"id": "CIRPC",
|
||||
"title": "Lei34/2007",
|
||||
"exemplar": "C:\\laragon\\www\\portal-investidor-irpc-l7-scope-20261026\\docs\\investmoz\\simulations\\source-archive\\Lei-34-2007-BR52.pdf",
|
||||
"bytes": 1676884,
|
||||
"sha256": "cdbef875ad7ccc1517b12faf5de0e893a70ed2ed81e33913cd6dc4a674474e6e",
|
||||
"references": "PDF5/p768(59):12,14,15; PDF15–16:54–56; PDF17/p768(71):61",
|
||||
"official_url": null,
|
||||
"available_for_consultation": true,
|
||||
"documentary_status": "official_source_accepted; applicability/version/period_per_treatment",
|
||||
"new_calculation_activation": false
|
||||
},
|
||||
{
|
||||
"id": "IRPC-2026",
|
||||
"title": "Lei12/2025",
|
||||
"exemplar": "C:\\laragon\\www\\portal-investidor-irpc-l7-scope-20261026\\docs\\investmoz\\simulations\\source-archive\\BR-248-I-Suplemento-1-2025.pdf",
|
||||
"bytes": 440018,
|
||||
"sha256": "ccf2a8deeca820f2dd076b4b2141b1efe3f6a806568c3a587ca59a8e92f4c251",
|
||||
"references": "PDF18–20; PDF20:art2/61-A,art3,art6; vigência01/01/2026",
|
||||
"official_url": null,
|
||||
"available_for_consultation": true,
|
||||
"documentary_status": "official_source_accepted; applicability/version/period_per_treatment",
|
||||
"new_calculation_activation": false
|
||||
},
|
||||
{
|
||||
"id": "IRPC-2022",
|
||||
"title": "Lei20/2022",
|
||||
"exemplar": "C:\\laragon\\www\\portal-investidor-irpc-l7-scope-20261026\\docs\\investmoz\\simulations\\source-archive\\BR252-I-Serie-2022-Lei20-PESOE.pdf",
|
||||
"bytes": 17966640,
|
||||
"sha256": "1159fd3ce1ba5581671796d083534da48bd3c5578298819e896f1c2a8026318d",
|
||||
"references": "PDF1/p2731:61(2), termo31/12/2025",
|
||||
"official_url": null,
|
||||
"available_for_consultation": true,
|
||||
"documentary_status": "official_source_accepted; applicability/version/period_per_treatment",
|
||||
"new_calculation_activation": false
|
||||
},
|
||||
{
|
||||
"id": "CBF-local",
|
||||
"title": "Lei4/2009",
|
||||
"exemplar": "C:\\laragon\\www\\portal-investidor-irpc-l7-scope-20261026\\outputs\\irpc-l7-scope\\CBF-Lei4-2009-APIEX.pdf",
|
||||
"bytes": 10998765,
|
||||
"sha256": "4231a5b6783e603cedb98992f3e93ecaf1c1d5be341b093560cf2fdd0845b0dc",
|
||||
"references": "Original local disponível; scan sem extracção textual útil; cotejo textual pela compilação oficial",
|
||||
"official_url": null,
|
||||
"available_for_consultation": true,
|
||||
"documentary_status": "official_source_accepted; applicability/version/period_per_treatment",
|
||||
"new_calculation_activation": false,
|
||||
"authorised_original": "\\\\Mac\\Home\\Documents\\TEMPO\\Portal Tempo\\Legislacao\\Apiex\\3.-Lei-no4-2009-de-12-de-Janeiro-Codigo-dos-Beneficios-Fiscais.pdf"
|
||||
},
|
||||
{
|
||||
"id": "APIEX",
|
||||
"title": "Compilação oficial APIEX",
|
||||
"exemplar": "C:\\laragon\\www\\portal-investidor-irpc-l7-scope-20261026\\outputs\\irpc-l7-scope\\APIEX-legislacao-investimentos-2025.pdf",
|
||||
"bytes": 6467655,
|
||||
"sha256": "ba1e9eaabfec5d0c4cb2d9f2444a6860f7a90f222034764197829be402d408ed",
|
||||
"references": "pp8–32:Lei8/2023; pp36–59:Decreto8/2024; pp64–92:CBF4/2009; p68:9/10;p71–74:15–19",
|
||||
"official_url": "https://pt.apiex.gov.mz/wp-content/uploads/2025/02/LEGISLACAO-DE-INVESTIMENTOS-EM-MOCAMBIQUE.pdf",
|
||||
"available_for_consultation": true,
|
||||
"documentary_status": "official_source_accepted; applicability/version/period_per_treatment",
|
||||
"new_calculation_activation": false
|
||||
},
|
||||
{
|
||||
"id": "RCBF",
|
||||
"title": "Decreto56/2009",
|
||||
"exemplar": "C:\\laragon\\www\\portal-investidor-irpc-l7-scope-20261026\\outputs\\irpc-l7-scope\\Decreto56-2009-BR40.pdf",
|
||||
"bytes": 422005,
|
||||
"sha256": "6ea1b8d93daed48c6d590481d874010fa1708211d8f27c319dc9a31328456017",
|
||||
"references": "Procedimento já cotejado em iva-l1-p084-p085-model-i1-cotejo-20261024.json; não estende isenções IVA a IRPC",
|
||||
"official_url": null,
|
||||
"available_for_consultation": true,
|
||||
"documentary_status": "official_source_accepted; applicability/version/period_per_treatment",
|
||||
"new_calculation_activation": false
|
||||
}
|
||||
],
|
||||
"rendered_pages_reviewed": [
|
||||
"CIRPC PDF5",
|
||||
"CIRPC PDF17",
|
||||
"APIEX PDF68",
|
||||
"APIEX PDF72",
|
||||
"Lei12/2025 PDF20"
|
||||
],
|
||||
"no_period_extension_presumed": "61(2) Law20/2022 ends31/12/2025; no automatic2026 rate",
|
||||
"availability_is_not_rule_activation": true
|
||||
},
|
||||
"preservation": {
|
||||
"source_archive_files": {
|
||||
"docs/investmoz/simulations/source-archive/AT-Comunicado-9-2026-ISPC.pdf": "106f8a9ce9255c03549c70bf07fe999d32e6e55302d009b509862aa74ccb4973",
|
||||
"docs/investmoz/simulations/source-archive/AT-Modelo-30-ISPC.pdf": "6802edd06b6ff638a0b851a3ec7ecf69af8f07840faa47446becad67d35d445c",
|
||||
"docs/investmoz/simulations/source-archive/AT-Modelo-B-Geral.pdf": "bd977c7c59d4d98befd92e2c566b1bf168cb1343bb519f51b41a3807f431fc57",
|
||||
"docs/investmoz/simulations/source-archive/AT-MRFTA-19-39.pdf": "8ea62c53066b482f87078a7a7b1ecf15ca98a12a122e8d7abca63acfc993186b",
|
||||
"docs/investmoz/simulations/source-archive/BM-Mercado-Monetario-MAIBOR-20261025.html": "00e8a7e0d3a1db4ca3beb56d5361b2084a0f1684f3d40fc1c203702a2190e063",
|
||||
"docs/investmoz/simulations/source-archive/BR-16-I-Serie-2008-04-16.pdf": "fc373ff5637edf75ec6a9595dec8763a8503d4ee786e3b7d8f1c742eae9d80ee",
|
||||
"docs/investmoz/simulations/source-archive/BR-248-I-Suplemento-1-2025.pdf": "ccf2a8deeca820f2dd076b4b2141b1efe3f6a806568c3a587ca59a8e92f4c251",
|
||||
"docs/investmoz/simulations/source-archive/BR-89-I-Serie-2017-06-08.pdf": "11f0cab15eb6e51010952203ffa24fdc533a24fd642e19525fe4f46b17a1f5e5",
|
||||
"docs/investmoz/simulations/source-archive/BR-95-I-Suplemento-2025-05-21.pdf": "e0e682e2c027c3cd9c1d46a73a3f48bc5f6bdbf05667fd97314d7a3f6a456358",
|
||||
"docs/investmoz/simulations/source-archive/BR252-I-Serie-2022-Lei20-PESOE.pdf": "1159fd3ce1ba5581671796d083534da48bd3c5578298819e896f1c2a8026318d",
|
||||
"docs/investmoz/simulations/source-archive/Decreto-22-2021-BR70.pdf": "a8fac38dcfe08f9c7a8e46254cff10e1ec82fc4f7a8d88ad6e4fe7d91ffc21a5",
|
||||
"docs/investmoz/simulations/source-archive/Decreto-27-2026-BR123.pdf": "26249c3fa58f149c81de36e99d1aac2819a4771379d9e8833159660dabf539bb",
|
||||
"docs/investmoz/simulations/source-archive/Decreto-29-1998-BR22-5-suplemento.pdf": "6242cbe675faadf085f43f95ec8c7e8868aafe67c3b2ab2bb010992288f954f8",
|
||||
"docs/investmoz/simulations/source-archive/Decreto-3-2011-BR-11-I-mineiros.pdf": "5bca1133666ba9c69870b89823420175b7b5b8d0eccb667ecdf5c29716f3b6be",
|
||||
"docs/investmoz/simulations/source-archive/Decreto-37-2023-BR124.pdf": "7e680b191481faa0e2e9057fa5053587eb2a29d1d8c819e0eb9f02814255a04c",
|
||||
"docs/investmoz/simulations/source-archive/Decreto-9-2008-BR16.pdf": "96fccdecbfdc11c9eafb90fbc6c7bc259f88bbd4c7507d1ac3af1fa03f960697",
|
||||
"docs/investmoz/simulations/source-archive/Lei-13-2016-CIVA-BR-156-10-suplemento.pdf": "b90dc7c14ecea2e378c4a62e8e5a47d54a5644c457baeb8b8053b92fd2a5710b",
|
||||
"docs/investmoz/simulations/source-archive/Lei-14-1992-BR42.pdf": "089fff7423e99a70a230a73ca379e4ea3a91d124703f91016e57ff82794b9e56",
|
||||
"docs/investmoz/simulations/source-archive/Lei-17-2022-BR251-exemplar-MCNet5.pdf": "14eb34f0af91a8f5cb1770c7b52d6ff839c6818302d1ed96d79afbfb9fe999d4",
|
||||
"docs/investmoz/simulations/source-archive/Lei-17-2022-IPP-BR250-Parlamento.pdf": "978cd22403ffd336a631704ecd7a5bbd814a427c815b9acdaca5515591dd9e2a",
|
||||
"docs/investmoz/simulations/source-archive/Lei-19-2013-BR76.pdf": "bba96d645cc935ffc3d1a79b9f0f73ac1c693d6459c2ad41f56cd2841accae76",
|
||||
"docs/investmoz/simulations/source-archive/Lei-19-2017-IRPS-BR-OCAM.pdf": "c3a0186cb9ad090d7a9533006295dc9bb6a62ad0d6150173cbd49dba4ee4b52d",
|
||||
"docs/investmoz/simulations/source-archive/Lei-2-2011-BR-1-4-suplemento-MCNet.pdf": "a7543a68cc3287a46a83c39a04821b40f649dd06c4e9b5dc51ff0b47fba08899",
|
||||
"docs/investmoz/simulations/source-archive/Lei-20-2009-BR36-AT-exemplar19.pdf": "fc1c8144db42960cbf73e717e095896f511ece0f907f58f78819b27d6917a7ee",
|
||||
"docs/investmoz/simulations/source-archive/Lei-22-2022-IVA-republicada-BR-250-2-suplemento.pdf": "ea1b0dc6f5cf6e595f6d9a19e7042f398999e0087caef1785f6e8fac571b5f53",
|
||||
"docs/investmoz/simulations/source-archive/Lei-34-2007-BR52.pdf": "cdbef875ad7ccc1517b12faf5de0e893a70ed2ed81e33913cd6dc4a674474e6e",
|
||||
"docs/investmoz/simulations/source-archive/Lei-4-1994-BR37-3-suplemento.pdf": "210df9db8980d0a5690cd187a6eeec7e37a900d743e39062c16f4e0d12215c7e",
|
||||
"docs/investmoz/simulations/source-archive/Lei-4-2012-BR3.pdf": "b8845cef41dcbd9ba50c43dbfa743a56030dd3d348242a107e1ae30279eec121",
|
||||
"docs/investmoz/simulations/source-archive/Lei-7-1991-Partidos-IFES.pdf": "6b783a0bb3330688ef10660a58060d9724aa2da6a873d234fe902f0eaaeda42d",
|
||||
"docs/investmoz/simulations/source-archive/PT-MZ-CDT-1992.pdf": "d504e1024b28aee5c6acf4592acb96ec9c915a8414f67a61ab6984d6acf9df9d",
|
||||
"docs/investmoz/simulations/source-archive/PT-MZ-Protocolo-2009.pdf": "f353773dcf41f09f4daa6cf5ba5a5f7994f3e02615867c2dcffc61c3d901bf9b"
|
||||
},
|
||||
"source_archive_count": 31,
|
||||
"root_existing_source_files": 28,
|
||||
"root_preexisting_branch_absences": [
|
||||
"docs/investmoz/simulations/source-archive/BM-Mercado-Monetario-MAIBOR-20261025.html",
|
||||
"docs/investmoz/simulations/source-archive/PT-MZ-CDT-1992.pdf",
|
||||
"docs/investmoz/simulations/source-archive/PT-MZ-Protocolo-2009.pdf"
|
||||
],
|
||||
"root_absences_introduced_by_this_change": false,
|
||||
"runtime_schema_config_permissions_changed": false,
|
||||
"active_writes": 0,
|
||||
"migrations": 0,
|
||||
"imports": 0,
|
||||
"deployment": false,
|
||||
"functional_tests_repeated": false,
|
||||
"existing_accepted_proofs_reused": true
|
||||
},
|
||||
"validation": {
|
||||
"expected_tracked_delta": [
|
||||
"docs/investmoz/consolidated-review-matrix-2026-10-03.md",
|
||||
"docs/investmoz/unification/traceability-and-manual.md",
|
||||
"docs/investmoz/v2/auditoria-portal/matriz-requisitos.csv",
|
||||
"docs/investmoz/simulations/irpc-l7-scope-20261026.json"
|
||||
],
|
||||
"csv_only_changed_id": "AUD-SIM-INT02",
|
||||
"scope_present_in_existing_matrix_and_manual": true,
|
||||
"new_backlog_created": false
|
||||
}
|
||||
}
|
||||
@@ -2522,8 +2522,8 @@ As estimativas são **horas de trabalho técnico**, não calendário nem mediç
|
||||
| L3 — IVA: saldo e fecho do Modelo A | Totais14–18 quando todas as parcelas estão determinadas | Campos19–27 aplicáveis, transporte de crédito, rectificações/substituição, imposto a entregar e pedido de reembolso; estados documentados e relação com tesouraria; via de restituição de bebidas13(2), identificada porG4D e ainda não apurada, conforme procedimento próprio | Execuções mensais, parcelas L1/L2, documentos e histórico | L1/L2 para apuramento integral; saldo anterior identificado e procedimento de reembolso aplicável. Pedido não significa deferimento/recebimento | 48–80 h |
|
||||
| L4 — ISPC: elegibilidade e apuramento | Campos de enquadramento e motor genérico | Regime/actividade/volume elegível, opções/exclusões, escalões/taxas aplicáveis, mínimo, trimestre e retenções específicas; comparação só entre regimes admissíveis | Vendas por actividade, custos, NUIT, natureza jurídica e residência confirmada | Lei9/2025 e regulamentação/período; distinguir receita anual, trimestre e excesso | 40–64 h |
|
||||
| L5 — retenções IRPC e guias | Documentos de compras/vendas e guia M/39 como exemplar | Rendimento pago/recebido, entidade que retém, residente/não residente/EP, evento temporal, excepções e casos digitais/e-money; guia e comprovativo ligados à operação | Contrapartes, facturas, pagamentos, período, moeda, oportunidade | Artigos aplicáveis por rendimento, taxa/convenção se invocada; corrigir remissões do exemplar. Sem submissão electrónica AT presumida | 32–56 h |
|
||||
| L6 — IRPC anual: regime normal | Disponível2f684e59:resultado financeiro→ajustamentos demonstrados→lucro6700→base4400→colecta1408,com provas/persistência/histórico | Saldo concreto:outros ajustamentos ordinários,juros financeiros,amortizações,variações/periodização,perda actual,âmbitos normais adicionais,representação fiscal e correspondênciaM20/M22;ver secção «saldo concreto deL6» | Plano financeiro,dados comuns,activos/livros e histórico;retenções/pagamentos/créditos anuais reservadosL8 | CódigoIRPC/período/caso;benefícios e tratamentos especiais anuaisL7;sem dependência genérica do fechoL8 | Estimativa inicial48–80h;saldo não reestimado |
|
||||
| L7 — IRPC: tratamentos específicos | Contexto sectorial/territorial e fontes cadastradas | Casos identificados: tributação autónoma de despesas e mais-valias, taxas reduzidas/cooperativas, isenções/benefícios e operações especiais com condições rastreadas | Base L6, despesas, activos, relação territorial documentada | Disposição e período por tratamento; localização por si só não concede benefício. Lista de tratamentos aplicáveis explicitada no lote | 48–80 h |
|
||||
| L6 — IRPC anual: regime normal | Disponível5aaf1a56:percurso normal demonstrado atécolecta,períodos/moedas e preparação parcialM20/M22 | Operacional no âmbito demonstrado por decisãoTempo26/10;limitações explícitas;5grupos código+5documentais preservados;sem conclusão integral | Plano financeiro,dados comuns,activos/livros e histórico;retenções/pagamentos/créditos anuaisL8 | Pendências bloqueiam só os casos dependentes;L7/L8 próprios | Estimativa inicial48–80h;saldo não reestimado |
|
||||
| L7 — IRPC: tratamentos específicos | Delimitação26/10 e fontes/contexto existentes;sem novo tratamento implementado | Qualificação e efeitos por parcela:autónomas61(4)/61-A,entidades/cooperativas12,CBF15–19,sector/território e operações especiais;ver secção L7 | L6/contexto herdado,despesas,activos e relações documentadas;sem benefício por localização isolada | Condições,fonte/versão,período,limite/cumulação e efeito por caso;crédito potencialL7/aplicação anualL8 | Estimativa inicial48–80h;sem reestimativa |
|
||||
| L8 — IRPC: liquidação e pagamentos | Parcelas L5–L7 e formulários originais | PPC/PEC, deduções/créditos, dupla tributação quando aplicável, saldo anual a pagar/recuperar; calendário e reconciliação com pagamentos | Retenções, colecta, saldos anteriores, pagamentos/comprovativos | Base anterior para PPC/PEC, regras de limitação/transporte; não usar cinco anos ou compensação automática sem cotejo específico | 32–56 h |
|
||||
| L9 — INSS: contribuição social | Massa salarial agregada e referência TCO3%+4% | Trabalhadores, remuneração/base contributiva, exclusões, empregador/trabalhador, TCO/TCP, declaração e encargos por período | Equipa/custos, entidade e calendário; cadastro de pessoa partilhado com L10 | Regulamento e alterações aplicáveis, natureza do vínculo; confirmar base antes da taxa. Contribuição social, distinta dos impostos | 24–40 h |
|
||||
| L10 — IRPS: retenção mensal e líquido | Entrada IRPS, custos salariais e escalões anuais documentais | Tabela mensal própria, remunerações/benefícios, situação pessoal relevante, retenção, salário líquido e contribuição ligada a L9 | Mesmo trabalhador/folha salarial, pagamentos e retenções | Tabela mensal do período, residência e condições familiares necessárias; não dividir escalões anuais por12 | 40–64 h |
|
||||
@@ -6075,3 +6075,270 @@ Actualização de **AUD-SIM-INT02**, na matriz existente. O percurso instalado e
|
||||
**Provas apenas do delta:** 14 testes frontend; API privada1 teste/78 asserções com transacção revertida na base QA127.0.0.1:55441; geração de routes/actions pelo procedimento existente, TypeScript e build; interface real com edição, taxa/categoria incompatível, falta de juros, gravação/recuperação, download e perda corrente; relatórios/dossier construídos a partir dos dados recuperados. Recibo `docs/investmoz/simulations/irpc-l6-compatible-sets-qa-20261025.json`; pacote/bundle em `outputs/irpc-l6-sets`. Sem alteração de schema, API, configuração, permissões ou dependências.
|
||||
|
||||
**Âmbitos próprios preservados:** L7 conserva benefícios, isenções, taxas reduzidas, tributações autónomas e operações especiais; L8 conserva retenções, pagamentos, créditos e saldo final. M22 campo302 não é preenchido só com a parcela normal300, nem os campos309–316 são preenchidos com zeros presumidos. As dez dúvidas deL5 continuam na mesma matriz, sem nova pesquisa e bloqueando apenas dependências efectivas. L6 continua parcial exclusivamente pelas pendências concretas da tabela; nenhum desses pontos reabre o percurso instalado.
|
||||
|
||||
## 25/10/2026 — conjunto L6 a2de7259 entregue pelo Git
|
||||
|
||||
Instalado `a2de725901c308fb2ac2bc3d72181ab50ef46b7a` sobre `2f684e59`, pelo procedimento Git existente, sem força, migrações ou importações. Backup fresco `2026-10-25T20:34:03Z` e restauro isolado sem rede/porta55441: **174tabelas** conferidas por contagem/checksum; **369ficheiros/configuração** preservados. Conferidos **8ficheiros do delta,38protegidos e31originais**; schema,roles/grants e permissões iguais. Tabelas de negócio preservadas; cache/sessões reconciliadas com os eventos operacionais da entrega. `2f684e59` permanece como versão anterior. Dependências de5versões antigas arquivadas e verificadas para espaço, sem modificar as versões actual/anterior, fontes, dados ou backups.
|
||||
|
||||
Revisão/manifest público,10marcadores compilados e simuladorHTTP200 conferidos. Pipeline normal concluído; as provas QA aceites foram reutilizadas, sem nova ronda manual. **Disponível no âmbito demonstrado: lucro6980 → base4680 → colecta1497,60MZN. O saldo final a pagar/recuperar continua indeterminado emL8.** Também preservados o caso de perda corrente e as distinções conhecido/ausência/falta de informação, os períodos/EP demonstrados e a preparação parcialM20/M22. Recibo:`docs/investmoz/simulations/irpc-l6-sets-delivery-20261025.json`.
|
||||
|
||||
O estado «QA sem instalação» da nota anterior é histórico para este conjunto. **L6 continua parcial pelos seis grupos concretos da secção seguinte**, cada um com condição de resolução e bloqueio delimitado. L7 eL8 mantêm os seus âmbitos.
|
||||
|
||||
|
||||
## 25/10/2026 — saldo curto de L6 após o conjunto a2de7259
|
||||
|
||||
Actualização de **AUD-SIM-INT02 na mesma matriz**, sem novo lote ou backlog. O percurso financeiro → ajustamentos documentados → lucro tributável → matéria colectável → colecta está demonstrado; no caso novo,6980 →4680 →1497,60MZN. A colecta não é saldo final a pagar. As pendências abaixo substituem a enumeração genérica anterior para o saldo actual deL6; não revogam as provas aceites.
|
||||
|
||||
| Caso ou correspondência pendente | Condição concreta de resolução | Limite do bloqueio |
|
||||
|---|---|---|
|
||||
| Custos com limites36(1)e/f/h/i/n, provisões28/29, obras plurianuais19 e componentes de exercícios anteriores18(2). | Implementar a regra de cada categoria a partir do diploma aplicável: parcela contabilizada, limite/base próprios, documentação e exercício de imputação; demonstrar o efeito com sinal nos totais. Nos exercícios anteriores, distinguir o que era imprevisível/manifestamente desconhecido no encerramento. | Só a categoria ou parcela ainda sem regra; os acréscimos36a/b/c/g, juros ordinários e periodização corrente/seguinte demonstrados permanecem utilizáveis. Eventual tributação autónoma pertence aL7. |
|
||||
| Amortizações além dos itensII/3/9 e9.1: restantes tabelas, quotas inferiores, duodécimos, quotas decrescentes, bens usados/reavaliados/intangíveis e recuperação de quotas anteriormente tributadas. | Corresponder categoria/tabela prevalecente, método, entrada em uso, vida útil, base depreciável e quotas contabilizadas/fiscais acumuladas; implementar o cálculo e a reconciliação que impeçam dupla dedução. | Só os activos/métodos afectados. Computadores25% e servidores20% no recorte anual constante e a perda corrente já demonstrada não são reabertos. |
|
||||
| Períodos curtos, transição/liquidação e reconciliação fiscal anual de plano noutra moeda. | Ligar os meses e factos de início/cessação/transição ao período fiscal; implementar os efeitos sobre quotas e contagem das perdas. Para outra moeda, identificar os eventos/datas e a regra de conversão anual aplicável, reutilizando o motor cambial aceite. | Só o período ou origem cambial sem reconciliação. Os períodos anuais emMZN e oEP com imputação documentada conservam o cálculo demonstrado. |
|
||||
| Representação fiscal de fracções de unidade/cêntimo. | Identificar a instrução de representação/arredondamento da edição/campo aplicável ou obter esclarecimento específico daAT; então implementar essa regra conservando o valor racional original. O exemplarM20A.1 pede meticais sem centavos, mas isso não determina sozinho como arredondar uma fracção. | Só a transcrição do valor não exactamente representável. Os cálculos racionais e os valores exactamente representáveis permanecem disponíveis; não é necessária nova validação genérica das fontes. |
|
||||
| M20A.1: discriminação de vendas/serviços, fornecimentos/outros gastos, imposto sobre o rendimento e resultado líquido; M22: campo200 e detalhe dos restantes ajustamentos. | Reutilizar a origem financeira, recolhendo apenas a classificação em falta e o imposto contabilizado; reconciliar resultado antes/depois de imposto e cada ajustamento com a edição aplicável. Não usar a colecta simulada como imposto contabilizado. Completar as correspondências por campo e demonstrar a recuperação/exportação. | Só os campos sem correspondência. M20A.1/Q4 contas6.1.1/6.2/6.5/6.9 e M22 campos259/260,269/270,276/277/278 e300 conservam a preparação parcial demonstrada. |
|
||||
| Transporte de resultado entre ediçõesM20/M22: XLSXM20A.1 remete para201/quadro8; PDFM22 inventariado usa200/quadro10. | Identificar a edição do formulário de destino e corresponder explicitamente o resultado líquido a essa edição; registar a remissão corrigida sem substituir os exemplares ou reutilizar fórmulas antigas por aproximação. | Só esse transporte entre edições; não bloqueia os cálculos independentes nem os outros campos já correspondidos. |
|
||||
|
||||
**L6 continua parcial por estes casos concretos.** Documento ou parâmetro em falta dentro de regra implementada é uma pendência do caso, não outra tarefa genérica deL6. Juros capitalizáveis, relações especiais e tratamentos especiais conservam o enquadramento próprio, sem presumir que satisfazem o recorte de juros ordinários.
|
||||
|
||||
**L7** mantém benefícios, isenções, taxas reduzidas, tributações autónomas e operações especiais. **L8** mantém retenções, pagamentos, créditos e saldo final a pagar/recuperar. A ausência desses tratamentos não reabre o percurso normal entregue nem justifica, por si, «L6 parcial». A divergência documental não autoriza preencher M22 campo302 ou309–316 com zeros presumidos. As dez dúvidas deL5 permanecem válidas e bloqueiam apenas os casos efectivamente dependentes; sem nova pesquisa ou repetição das provas aceites.
|
||||
|
||||
## 26/10/2026 — L6: custos com limites, provisões e periodização em QA
|
||||
|
||||
Actualização de **AUD-SIM-INT02 na mesma matriz**, sobre o conjunto instalado `a2de7259`. **Novo incremento em QA, sem instalação.** O percurso e as provas já aceites deL6/L3/ISPC/câmbio/L5 foram reutilizados; não foram novamente executados os testes funcionais anteriores. A fotografia5 continua actual sem activar os novos campos; a fotografia6 guarda estes mapas e conserva o resultado anterior no histórico.
|
||||
|
||||
**Reutilização e resultado demonstrado:** resultado financeiro6240MZN, acréscimos anteriores220 e mapas anteriores520 conservados; novos ajustamentos de custos/provisões/periodização+350 e obra−600 → **lucro tributável6730MZN**. Dedução expressa das perdas anteriores2300 → **matéria colectável4430MZN**; taxa normal32% → **colecta1417,60MZN**. Não é saldo final a pagar. Nenhum saldo oficial de provisões/perdas é consumido, nem é alterada declaração ou história anterior.
|
||||
|
||||
| Categoria e condição no exercício anual com termo em2026 | Parcela aceite, limite e ajustamento demonstrados | Informação insuficiente ou caso separado |
|
||||
|---|---|---|
|
||||
| Ajudas de custo/deslocação em viatura própria36(1)e: parcelas facturadas e tributadas emIRPS identificadas sem sobreposição. Representação36(1)f/36(3) ordinária documentada. | Ajudas100:facturadas20,tributadas e não facturadas20;remanescente60 →30 acrescido/70 aceite. Representação50 →40 acrescido/10 aceite. Zero conhecido nos parâmetros é distinto de campo vazio. | Parcela facturada/tributada em falta impede a aceitação dependente; não presumir ausência deIRPS. Eventual tributação autónoma continuaL7. |
|
||||
| Publicidade ordinária36(1)n,Lei20/2009: receita declarada reconciliada com vendas normais e completude anual das parcelas. | Um limite anual partilhado de1% de12000=120. Caso com duas parcelas100+100:aceites60+60,acréscimo80. A repartição proporcional é apenas aritmética de simulação, não uma ordem fiscal obrigatória. | Campanha de lançamento com horizonte superior a um ano não recebe este tratamento por aproximação: periodização36-A e articulação do limite permanecem por implementar. |
|
||||
| Encargos com viaturas36(4), combustível36i e aluguer sem condutor36h, distinguindo categoria/serviço público/locação na actividade normal. | Outros encargos100 de passageiros sem excepção:aceite50/acréscimo50. Combustível50 não sujeito a36(4),com40 comprovados no activo/locação e consumo normal:aceite40/acréscimo10. Renda100 no caso documentado de excepção36(4),quota não aceite36h de20:aceite80/acréscimo20; a quota é reutilizada do suporte e não apurada automaticamente. | Se há simultaneamente parcela excluída porh/i e aplicação dos50% de36(4), a combinação fica pendente. Exemplo:fuel100,comprovado80,passageiro sem excepção; não somar nem repartir correcções por presunção. Resolver a regra de articulação dos trechos aplicáveis ou esclarecer esse exemplo especificamente comAT. Apuramento automático da quota36h permanece no saldo de amortizações; só bloqueia esse caso. |
|
||||
| Provisão/perda por imparidade de créditos28a/29: regime ordinário identificado, créditos normais finais e provisão fiscal anterior conhecidos. | Base10000:limite anual1,5%=150,acumulado6%=600. Saldo anterior550 deixa50;provisão contabilística200 →50 aceite/150 acrescido. Duas parcelas100+100 partilham25+25; não repetem os limites nem consomem o saldo oficial. | Saldo anterior vazio não é zero; anterior superior ao tecto pede reconciliação/reversão28(2). Provisões sujeitas a supervisão financeira/seguradora28d ou reforços financeiros28(3) exigem correspondência própria, sem aplicar29 por aproximação. |
|
||||
| Existências28b:perda efectivamente observada. Processo judicial28c:em curso e obrigação subjacente fiscalmente dedutível. | Existências:parcela60,perda total40,provisão anterior10 →30 aceite/30 acrescido. Judicial:parcela90,obrigação100,anterior20 →80 aceite/10 acrescido. Perda não observada ou processo que não esteja em curso são condições negativas conhecidas:acréscimo integral, sem zero presumido como dedução. | Falta de prova do evento,obrigação,perda ou saldo anterior fica indeterminada. Objecto/saldo repetido entre documentos impede reutilizar a cobertura; agregar/reconciliar as parcelas do mesmo objecto. |
|
||||
| Reversões28(2) e provisões anteriormente tributadas:mesmo objecto e tratamento fiscal anterior comprovados. | Provisão antes deduzida:reversão50 já incluída no resultado não acrescenta novamente;omitida dos proveitos acrescenta50. Reversão contabilística50 de provisão antes tributada comprovada é excluída por50. | Não inferir o tratamento anterior do saldo contabilístico. Quantia superior à parcela fiscal demonstrada,evento que continua a subsistir ou objecto duplicado ficam pendentes. Sem alteração retrospectiva ou consumo do saldo oficial. |
|
||||
| Componentes de exercícios anteriores18(2):conhecimento/imprevisibilidade no encerramento anterior documentados. | Custo80 conhecido no fecho2025,incluído no resultado actual →acréscimo80. Se imprevisível/manifestamente desconhecido à data daquele fecho →sem acréscimo por periodização. Proveito50 conhecido no fecho anterior →excluído do actual por50;se imprevisível/desconhecido →considerado no actual. | Conhecimento no fecho em falta impede apenas a imputação da parcela. Nenhuma rectificação de declaração anterior é executada. Periodizações específicas18(6–10) não passam a estar cobertas por este recorte18(2). |
|
||||
| Obras plurianuais19 e perdas meramente estimadas36m:critério uniforme,preço,custo incorporado/custo total e acumulados fiscais anteriores documentados. | Percentagem:preço2000,custo total1000,incorrido500;proveito fiscal acumulado1000 menos anterior600=400 corrente;custo500 menos anterior300=200 corrente. Proveito contabilizado1000/custo200 →ajustamento−600. Encerramento tem caso separado;facturação parcial com acabamento correspondente/entregas fraccionadas impõem percentagem;95% com preço conhecido ou recepção provisória pública determina conclusão. Perda meramente estimada50 de obra em curso →acréscimo50. | Acumulados incoerentes ou método incompatível bloqueiam essa obra. Receita antecipada19(5) positiva e mudança de critério com autorização19(6) ficam por corresponder; o caso demonstrado declara expressamente zero de receita antecipada e método mantido, sem presumir essas condições. |
|
||||
|
||||
**Percurso demonstrado:** cálculo → gravação → recuperação pela API privada → relatório/dossier/exportação em cinco casos:conjunto calculado,informação insuficiente,categorias adicionais,limites partilhados e encerramento de obra. Só os novos casos foram testados: **22 testes frontend,1 testeAPI/83asserções**, transacção revertida na base QA127.0.0.1:55441; routes/actions gerados pelo procedimento existente,TypeScript/build e interface real passaram. Interface permite reutilizar a parcela livre da origem e o saldo financeiro de créditos quando conhecido; alterações às somas dos temas são revistas antes de aplicar e não apagam escolhas ou históricos. Fonte ausente ou saldo não acompanhado nunca cria zero. Valores racionais são conservados, apresentações decimais aproximadas são identificadas e uma perda inferior a um cêntimo não é truncada para zero.
|
||||
|
||||
**Preservação:**6ficheiros de runtime no delta,42protegidos e31originais conferidos; sem schema/API/configuração/permissões/dependências alterados, sem escrita no activo. Recibo:`docs/investmoz/simulations/irpc-l6-costs-provisions-timing-qa-20261026.json`;bundle/pacote em `outputs/irpc-l6-costs`. DivergênciaM20/M22 permanece limitada ao transporte201/quadro8 versus200/quadro10; não é uma condição destes cálculos. Não foram criadas correspondências oficiais de campos para estes novos ajustamentos por presunção.
|
||||
|
||||
**Saldo deL6 após estes casos QA:**combinação36h/i+36(4);quota36h automática e restantes amortizações;campanhas36-A e sua articulação com1%;provisões reguladas/reforços financeiros e periodizações específicas não cobertas;receita antecipada positiva/mudança autorizada do método de obra;períodos curtos/conversão fiscal anual;representação fiscal de fracções e restantes correspondênciasM20/M22. Cada pendência afecta o caso/campo dependente, não o conjunto independente demonstrado. Benefícios,isenções,taxas reduzidas e operações especiais mantêm âmbitoL7;retenções,pagamentos,créditos e saldo anual mantêm âmbitoL8. **L6 continua parcial.** As dez dúvidas deL5 não foram reabertas.
|
||||
|
||||
## 26/10/2026 — conjunto L6 043dd35d entregue pelo Git
|
||||
|
||||
Instalado `043dd35d8ee247123b3a32f1fc10fd2ede81e9f4` sobre `a2de7259`, pelo procedimento Git existente, sem força, migrações ou importações. Backup fresco `2026-10-26T06:35:29Z` e restauro isolado sem rede/porta55441: **174tabelas** conferidas por contagem/checksum; **369ficheiros/configuração** preservados. Conferidos **6ficheiros do delta,42protegidos e31originais**; schema,roles/grants e permissões iguais. Tabelas de negócio preservadas; cache/sessões reconciliadas com os eventos operacionais da entrega. `a2de7259` permanece como versão anterior. Dependências de4versões antigas arquivadas e verificadas para espaço, sem modificar as versões actual/anterior, fontes, dados ou backups.
|
||||
|
||||
Revisão/manifest público,11marcadores compilados e simuladorHTTP200 conferidos. Pipeline normal concluído; as provas QA aceites foram reutilizadas, sem nova ronda manual. **Disponível no âmbito demonstrado: lucro6730 → base4430 → colecta1417,60MZN. O saldo final a pagar/recuperar continua indeterminado emL8.** Também preservados o caso de perda corrente e as distinções conhecido/ausência/falta de informação, os períodos/EP demonstrados e a preparação parcialM20/M22. Recibo:`docs/investmoz/simulations/irpc-l6-costs-delivery-20261026.json`.
|
||||
|
||||
O estado «QA sem instalação» da nota anterior é histórico para este conjunto. **L6 continua parcial pelos seis grupos concretos da secção seguinte**, cada um com condição de resolução e bloqueio delimitado. L7 eL8 mantêm os seus âmbitos.
|
||||
|
||||
|
||||
## 26/10/2026 — saldo de L6 após a entrega043dd35d
|
||||
|
||||
Mesma matriz AUD-SIM-INT02. Custos/provisões/periodização demonstrados entregues; trabalho seguinte:amortizações. Provas aceites reutilizadas.
|
||||
|
||||
| Caso ou correspondência pendente | Condição concreta de resolução | Limite do bloqueio |
|
||||
|---|---|---|
|
||||
| Combinação36h/i com36(4) | Corresponder a regra de articulação dos trechos aplicáveis ou esclarecer comAT o exemplo combustível100/comprovado80/passageiro sem excepção;sem somar ou repartir correcções por presunção. | Apenas o caso/campo dependente; cálculos independentes preservados. |
|
||||
| Quota36h automática e amortizações restantes | Reconciliar tabela/método/entrada emuso/quotas contabilísticas e fiscais anteriores;prioridade seguinte deL6. A parcela36h documentada continua reutilizável nos casos independentes. | Apenas o caso/campo dependente; cálculos independentes preservados. |
|
||||
| Campanhas plurianuais36-A e limite1% | Implementar a periodização por três exercícios e a sua articulação com36n; não tratar a campanha como publicidade ordinária. | Apenas o caso/campo dependente; cálculos independentes preservados. |
|
||||
| Provisões reguladas28d e reforços financeiros28(3) | Corresponder a regra sectorial/supervisão ou o reforço financeiro e os saldos documentados; não usar os limites ordinários29 por aproximação. | Apenas o caso/campo dependente; cálculos independentes preservados. |
|
||||
| Receita antecipada19(5) positiva e mudança autorizada19(6) | Corresponder os custos futuros/receita antecipada e o transporte entre exercícios ou a autorização da mudança de método;os casos zero conhecido/método mantido permanecem executáveis. | Apenas o caso/campo dependente; cálculos independentes preservados. |
|
||||
| Outras periodizações,âmbitos eM20/M22 | Tratar apenas os casos específicos18(6–10),períodos curtos/conversão anual,representação fiscal e campos ainda sem correspondência,com os parâmetros da edição/caso;divergência201/Q8 versus200/Q10 só afecta o transporte indicado. | Apenas o caso/campo dependente; cálculos independentes preservados. |
|
||||
|
||||
L6 continua parcial. L7 mantém benefícios/casos especiais;L8 mantém retenções/pagamentos/créditos/saldo final. As dez dúvidasL5 não foram reabertas.
|
||||
|
||||
## 26/10/2026 — L6: amortizações em QA, sem instalação
|
||||
|
||||
O portal mantém `043dd35d` instalado: colecta demonstrada1417,60MZN, sem saldo finalL8. O novo conjunto optativo `IRPC-normal-adjustments/7` reutiliza os activos e o resultado financeiro já declarados. Versões1–6 e históricos permanecem intactos; activar o novo mapa substitui o efeito fiscal anterior das amortizações, sem o somar novamente. Ausência declarada de quotas anteriores é distinta de informação em falta e exige referência.
|
||||
|
||||
Cobertura delimitada ao exercício anual2026/MZN e bens novos ao custo histórico: tabelaII/3/9 computadores25%,3/9.1 servidores20%,3/23 segurança20%,3/22 máquinas não especificadas10%,5/7 mobiliário10%,1/2.2 edifícios comerciais/administrativos2%,4/9.2 veículos ligeiros/mistos25%,5/8 software25%; tabelaI/84.2/B decoração hoteleira20% e84.3/A máquinas de lavandaria12,5%. A tabelaI prevalece quando aplicável; não se presume que esta lista cobre todo o catálogo. Fonte: Decreto72/2013, artigos3–10/17 e tabelas, exemplar original anteriormente aceite e hash preservado; CIRPC27e para limite800000MZN de viaturas e exclusão de terrenos.
|
||||
|
||||
Método constante com taxa expressamente escolhida no recorte metade–máximo; degressivo apenas para bens elegíveis novos, factores máximos1,5/2/2,5 segundo vida útil. Opção8(2) demonstrada apenas em ano civil/início1Janeiro, com quotas anteriores completas documentadas. Duodécimos incluem mês de entrada e excluem mês de saída, respeitando vida máxima. Software exige direitos onerosos/exclusivos e duração limitada; art17 exige bem individual até20000 e opção documentada. Quotas anteriores recuperáveis têm prova contabilística/fiscal e são limitadas à parte elegível: quotas nunca contabilizadas ou permanentemente excluídas não se tornam dedutíveis. Nenhum saldo oficial é consumido.
|
||||
|
||||
| Novo caso | Efeito demonstrado em MZN: lucro → matéria colectável → colecta |
|
||||
|---|---|
|
||||
| Computador em uso desdeJulho: quota fiscal50, ajustamento70, substituindo anterior20 | 6780 →4480 →1433,60 |
|
||||
| Mesmo activo, saída15Outubro:3meses/quota25 | Colecta1441,60; entrada/saída identificadas no relatório |
|
||||
| Degressivo elegível: quota200, ajustamento40 | 6630 →4330 →1385,60 |
|
||||
| Quota anterior documentada:20 recuperados,20 restantes; ajustamento−20 | 6730 →4430 →1417,60 |
|
||||
| Máquina de lavandariaI/84.3/A: quota62,50, ajustamento57,50 | 6767,50 →4467,50 →1429,60 |
|
||||
| Quota contabilística anterior em falta | Lucro/base/colecta indeterminados; ajustamentos independentes conhecidos continuam discriminados |
|
||||
|
||||
Cálculo → gravação → recuperação pela API privada → relatório/dossier demonstrado em cinco casos. **18novos testes frontend;1testeAPI/84asserções**, rollback na baseQA127.0.0.1:55441; routes/actions gerados, TypeScript/build e interface real passaram, incluindo edição, reutilização, ausência declarada, falta de informação, recuperação e exportação. Provas aceites reutilizadas. **7ficheiros de runtime no delta,43protegidos e31originais conferidos**; sem migração/API/configuração/permissões/dependências ou escrita no activo.
|
||||
|
||||
| Saldo concreto das amortizações | Condição de retoma |
|
||||
|---|---|
|
||||
| Outros códigos/taxas, por exemploII/3/3 ar condicionado12,5% | Acrescentar correspondência verificada, elegibilidade e prova apenas desse delta; sem aprovação genérica adicional |
|
||||
| Bens usados, abertura de escrita, grandes reparações/benfeitorias7(2)/(4), reavaliações15 e transição anterior2014 | Documentar vida esperada, bases/quotas anteriores e implementar a regra específica aplicável |
|
||||
| Uso intensivo11, concessões12, peças14, intangíveis específicos16 e eventos de transferência/relocação | Corresponder condições legais e histórico do evento; desenvolvimento/goodwill não herdam taxa do software |
|
||||
| Mudança de método10, excepções, taxas fora do recorte, vida máxima anual terminada a meio do período e opção8(2) fora do caso demonstrado | Histórico concreto e regra/excepção correspondente; autorização apenas quando a norma a exigir |
|
||||
| Restantes custos/provisões/periodizações da entrega043dd35d; períodos curtos, conversão anual, representação fiscal e correspondênciasM20/M22 | Mantêm os critérios concretos já registados na matriz; este incremento não os encerra |
|
||||
|
||||
A divergência201/quadro8 versus200/quadro10 bloqueia apenas o transporte afectado. Não foram presumidas correspondências oficiais para estes novos campos. **L6 continua parcial;L7 eL8 mantêm os seus âmbitos.** As dez dúvidasL5 não foram reabertas. Recibo: `docs/investmoz/simulations/irpc-l6-depreciation-qa-20261026.json`.
|
||||
|
||||
## 26/10/2026 — amortizações e9fe1022 entregues pelo Git
|
||||
|
||||
Instalado `e9fe102259c183a9d9bf7e39f246a8c3860839c6` sobre `043dd35d`, preservado como versão anterior. Backup fresco `2026-10-26T07:31:29Z` e restauro isolado sem rede/porta55441: **174tabelas** por contagem/checksum e **369ficheiros/configuração** conferidos. **7ficheiros do delta,43protegidos e31originais** verificados; schema,roles/grants e permissões iguais. As172tabelas de negócio mantêm os valores do backup. Cache:reinício da fila,contadores/timers e renovação da validade do mesmo valor de cache da página inicial. Sessões:expiração individual comprovada pelo prazo configurado120minutos,novas consultas da entrega e acessos anónimos correlacionados por agente/data no nginx;sem perda de dados de negócio. Dependências de5versões antigas arquivadas/verificadas para a margem do pipeline,preservando versões actual/anterior,fontes,dados e backups.
|
||||
|
||||
Revisão/manifest público,5marcadores compilados,4assets e simuladorHTTP200 conferidos. Pipeline normal concluído; provas QA18frontend/API1-84/UI/tipos/build reutilizadas,sem nova ronda manual. **Exemplo disponível: lucro6780 → matéria colectável4480 → colecta1433,60MZN. Saldo final a pagar/recuperar indeterminado emL8.** Históricos1–6 preservados; versão7 apenas por activação do novo mapa,substituindo o efeito anterior sem duplicação. Recibo:`docs/investmoz/simulations/irpc-l6-depreciation-delivery-20261026.json`.
|
||||
|
||||
O estado anterior «QA sem instalação» de e9fe1022 é histórico. Mantêm-se explícitos os outros códigos de tabela;usados/abertura de escrita/reparações/reavaliação/transição;uso intensivo/concessões/peças/intangíveis específicos/eventos;mudanças/excepções de método e opções fora do recorte. Retoma por correspondência da regra específica,base/vida/quotas e prova do delta,sem autorização genérica adicional. Períodos curtos e planos noutra moeda são o próximo incrementoQA,reutilizando o mecanismo cambial. Restantes custos/períodos/representação/camposM20-M22 conservam critérios próprios;divergência201/Q8 versus200/Q10 restringe apenas o transporte afectado. **L6 parcial;L7/L8 próprios;dez dúvidasL5 não reabertas.**
|
||||
|
||||
## 26/10/2026 — L6: períodos curtos e planos noutra moeda em QA
|
||||
|
||||
`e9fe1022` está instalado, com o âmbito de amortizações já demonstrado e os restantes casos de tabela/método explícitos acima. Este novo conjunto optativo `IRPC-normal-adjustments/8` está **emQA,sem instalação**. Reutiliza os meses e montantes do plano,os mapas fiscais emMZN e o mecanismo cambial entregue. Os históricos1–7 e o plano original não são reescritos.
|
||||
|
||||
Períodos de meses completos com termo em2026: início7(4)a,cessação7(4)b,início/fim de sujeição7(4)c e transição7(4)d,mediante identificação do evento/datas/suporte; plano com6meses ou selecção explícita de6dos12meses,sem anualizar receita,resultado,base ou taxa. Primeiro mês civil do plano é declarado,não inferido do mês orçamental. Anual diferente do ano civil conserva a correspondência do período autorizado/comunicado existente. Duodécimos ordinários do art9(3) do Decreto72/2013 aplicam o número de meses de utilização;art17 integral em período curto e restantes excepções não se tornam suportados por aproximação. Elemento conhecido como não amortizável mantém acréscimo integral,sem exigir método irrelevante.
|
||||
|
||||
Planos em outra moeda: cada mês seleccionado reutiliza ou confirma selecção cambial pelo procedimento existente,coluna/data/boletim/sentido e vínculo à origem. Moeda e valores originais permanecem no relatório. Não se adopta taxa actual,única ou de outro mês por defeito. **A conversão mensal para simulação exige pressuposto documentado;não confirma automaticamente uma regra fiscal de conversão anual.** Os mapas/activos/quotas/perdas existentes continuam emMZN e são reconciliados expressamente;nenhuma segunda conversão automática. Saldos patrimoniais de créditos em moeda estrangeira não são apresentados comoMZN pela conversão dos fluxos do plano;correspondência de saldo/data/taxa continua separada.
|
||||
|
||||
| Caso novo | Efeito demonstrado emMZN |
|
||||
|---|---|
|
||||
| Início1Julho–31Dezembro,meses7–12: resultado3120;quota fiscal50 e ajustamento10 | Lucro3130 → matéria colectável3130 → colecta1001,60,à taxa32%;ausência de perdas/benefícios declarada |
|
||||
| Mesmo recorte emUSD,pressuposto sintético64MZN/USD identificado em cada mês;mapasMZN reconciliados | Resultado199680;ajustamento640;lucro/base200320 → colecta64102,40. Taxa64 é pressupostoQA,não boletimBM real ou parâmetro fiscal confirmado |
|
||||
| Anual emUSD;plano de6meses iniciado emJulho;cessação e sujeição no mesmo ano | Novos testes próprios;respectivamente colecta128204,80 e1001,60nos casos correspondidos,sem anualização do semestre |
|
||||
| Falta de selecção de um mês,moeda incompatível ou taxa editada sem confirmação | Valores originais e conversões independentes visíveis;resultado/lucro/base/colecta dependentes indeterminados |
|
||||
| Perdas reportadas propostas num período curto | Lucro3130conhecido;dedução/base/colecta pendentes da sequência de períodos. Art41(5) exclui da contagem o período de transição7(4)d inferior a6meses;não autoriza agregar todos os períodos curtos |
|
||||
|
||||
Cálculo → gravação → recuperaçãoAPI → relatório/dossier demonstrado em4casos. **13testes novos frontend,API1teste/58asserções**, rollback na baseQA127.0.0.1:55441;routes/actions pelo procedimento existente,TypeScript/build e interface real passaram. Interface demonstrou alteração de datas e taxa,confirmação cambial,recuperação e exportação. Mudança na origem cambial invalida a actualidade do novo resultado,conservando o histórico. Provas aceites reutilizadas,sem repetição manual. Delta:**9ficheiros de runtime,43protegidos e31originais**;sem API/schema/configuração/permissões/dependências ou escrita no activo.
|
||||
|
||||
| Pendência concreta | Condição de retoma e bloqueio |
|
||||
|---|---|
|
||||
| Datas parciais,períodos superiores a12meses/liquidação e curtos fora do recorte2026 | Corresponder datas/evento,parcelas de dias e regra aplicável;apenas esse período depende da implementação |
|
||||
| Dedução de perdas em sequência com períodos curtos/transição | Declarar sequência efectiva de períodos posteriores e aplicar41(5) ao caso7(4)d inferior a6meses;sem prazo presumido só por ano civil. Lucro independente continua calculável |
|
||||
| Limites anuais de publicidade e provisão de créditos em período curto | Corresponder expressamente a base/limite do período e regra de proporcionalização,se aplicável;sem anualização ou rateio presumidos. Outros custos e períodos anuais não bloqueados |
|
||||
| Quota integral art17 em período curto,opções/métodos/tabelas e casos de amortização ainda não suportados | Implementar combinação específica e provar só o novo efeito;condições restantes do conjuntoe9fe1022 continuam válidas |
|
||||
| Conversão fiscal anual confirmada,saldos em moeda estrangeira e fracções de cêntimo da conversão | Identificar regra fiscal/data/base,taxa e âmbito;para saldos,conversão própria em vez de somar fluxos;para fracções,regra de representação. Até lá,pressupostos de simulação explícitos e total indeterminado quando não representável neste recorte |
|
||||
| Restantes custos/periodizações e correspondênciasM20/M22 | Mantêm os critérios já registados. Divergência201/Q8 versus200/Q10 limita só o transporte afectado |
|
||||
|
||||
Fontes primárias reutilizadas: CIRPC Lei34/2007 PDF4/p768(58),art7(4)/(7),ePDF12/p768(66),art41(5);Decreto72/2013 PDF3/p1074(7),art9(3). Exemplar e originais/hash preservados;sem importação/publicação documental. **L6 continua parcial. Colecta não é saldo final a pagar;L7 eL8 mantêm âmbitos próprios.** As dez dúvidasL5 não foram reabertas. Recibo:`docs/investmoz/simulations/irpc-l6-periods-fx-qa-20261026.json`.
|
||||
|
||||
## 26/10/2026 — períodos curtos e planos noutra moeda56475acb entregues pelo Git
|
||||
|
||||
Instalado `56475acb2f39e58cb51664913f7fb499f58eb7ab` sobre `e9fe1022`,preservado como versão anterior. Backup fresco `2026-10-26T08:17:39Z` e restauro isolado sem rede/porta55441: **174tabelas** por contagem/checksum e **369ficheiros/configuração** conferidos. **9ficheiros do delta,43protegidos e31originais** verificados;schema,roles/grants e permissões iguais. As172tabelas de negócio mantêm os valores do backup. Cache/sessões reconciliadas com os eventos operacionais e acessos anónimos registados;expiração,quando aplicável,comprovada individualmente pelo prazo configurado. Dependências de5versões antigas arquivadas/verificadas,preservando versões actual/anterior,fontes,dados e backups.
|
||||
|
||||
Revisão/manifest público,6marcadores compilados,4assets e simuladorHTTP200 conferidos. Pipeline normal concluído;provasQA13frontend/API1-58/UI/tipos/build reutilizadas,sem nova ronda manual. **Semestre demonstrado: lucro3130 → matéria colectável3130 → colecta1001,60MZN.** PlanoUSD:pressuposto sintético64MZN/USD por mês identificado,originais conservados e mapasMZN reconciliados;lucro/base200320 → colecta64102,40MZN. **Não confirma regra fiscal de conversão anual nem boletimBM real. Saldo final a pagar/recuperar continua indeterminado emL8.** Históricos1–7 preservados;versão8 optativa,sem anualizar resultados ou usar taxa actual por defeito. Recibo:`docs/investmoz/simulations/irpc-l6-periods-fx-delivery-20261026.json`.
|
||||
|
||||
O estado anterior «QA sem instalação» de56475acb é histórico. Permanecem explícitos os casos de datas parciais/liquidação,sequência de perdas41(5),limites anuais em período curto,art17 curto/restantes amortizações,conversão fiscal anual/saldos em outra moeda/fracções e demais custos/periodizações. Condições de retoma continuam na mesma matriz. Próximo incrementoQA:representação de valores e camposM20/M22 por corresponder;divergência201/Q8 versus200/Q10 limitada ao transporte do resultado afectado,sem reabrir cálculos demonstrados. **L6 parcial;L7/L8 próprios;dez dúvidasL5 não reabertas.**
|
||||
|
||||
## 26/10/2026 — L6: representação dos valores e campos M20/M22 em QA
|
||||
|
||||
`56475acb` está instalado. Este novo conjunto optativo `IRPC-normal-adjustments/9` está **em QA, sem instalação** e acrescenta preparação dos valores/campos, sem alterar fórmulas de lucro tributável, matéria colectável ou colecta. Históricos1–8, plano original, pressupostos cambiais e demais livros preservados. A falta de uma correspondência documental afecta o campo e a sua reconciliação, mantendo os totais fiscais existentes.
|
||||
|
||||
**Representação:** valor racional exacto conservado, apresentação aproximada identificada por«≈» e fracção original; zero conhecido, informação em falta e campo sem aplicação distintos. M20A.1/quadro4/M12 pede meticais sem centavos: valores inteiros são representáveis, fracções ficam por corresponder, sem arredondamento/truncagem. Preparação M22 já aceite com valores exactos ao cêntimo preservada; fracções de cêntimo continuam explícitas e pendentes da regra fiscal aplicável. Resultado líquido negativo M20 é apresentado entre parêntesis; M22 separa campo de lucro do de prejuízo, sem colocar perda no lucro ou criar matéria colectável negativa.
|
||||
|
||||
**M20:** reutiliza as quatro correspondências directas de custos das vendas,pessoal,depreciação e juros. Discrimina as receitas e despesas operacionais por conta com suporte e reconciliação exacta ao plano do período/moeda. Demonstra prestação de serviços7.2,fornecimentos/serviços6.3,outros gastos6.8 e imposto contabilizado8.5, além das contas directas6.1.1/6.2/6.5/6.9. Rótulos das demais contas são estrutura disponível; não constituem novas regras fiscais nem provam a qualificação de uma parcela. Uma origem incompleta não apaga as contas directas independentes.
|
||||
|
||||
O imposto contabilizado tem valor/ausência e suporte próprios, e localização já incluída ou exterior ao plano. Colecta não é despesa contabilística presumida. Valor já incluído não é subtraído novamente; contradição com o mapa de imposto próprio ou coexistência das duas localizações fica identificada. O resultado líquido é apurado para preparação; o transporte automático entre edições continua impedido só no resultado afectado.
|
||||
|
||||
**M22 PDF:** correspondências de variações patrimoniais201/202,resultado203,amortizações não aceites206,provisões/imparidade209,impostos de outrem213,multas/juros compensatórios215,ajudas219,representação220,publicidade221,despesas não documentadas223,aluguer224,combustíveis225,viaturas226 e reposição de provisões tributadas239. Reutiliza os ajustamentos demonstrados; não reaplica as percentagens impressas. A representação já calculada usa80%,compatível com220. Campo213 é apenas de outrem: imposto próprio36(1)a continua **sem campo presumido**. Efeitos positivos de amortização vão a206; recuperações negativas de quotas anteriores ficam separadas até correspondência própria, sem compensação no mesmo campo.
|
||||
|
||||
Somas238/258 e lucro reconstruído apenas quando todas as parcelas têm correspondência e reconciliam; campos259/260/269/270/276/277/278/300 reutilizam o cálculo existente, mesmo havendo uma parcela sem campo. Colecta total302 só é preparada com ausência de parcela de taxa reduzida declarada com suporte;caso conhecido mantém âmbitoL7 e não apaga300. Campos309–316/saldo final permanecem emL8.
|
||||
|
||||
| Caso novo | Resultado e limite de aplicação |
|
||||
|---|---|
|
||||
| Correspondência no semestre demonstrado, ausência de imposto contabilizado e taxa reduzida declaradas | Resultado líquido3120;203=3120;206=10;238=3130;258=0;lucro/base3130;colecta normal300 e total302=1001,60MZN. Reconciliação aritmética exacta, sem transporte automático entre edições |
|
||||
| Fornecimentos300,50 e outros gastos299,50, origem600 | Parcela300,50 conserva601/2;M20 em meticais inteiros pendente só nas parcelas fraccionárias;resultado e colecta1001,60inalterados |
|
||||
| Imposto contabilizado em falta | Resultado líquido/campo200 e somas dependentes indeterminados;lucro/base3130 e colecta1001,60mantidos |
|
||||
| Recuperação de quota anterior:ajustamento−26 | Efeito fiscal e colecta1001,60preservados;sem código de dedução inventado,somas238/258 pendentes;260/278/300 conhecidos |
|
||||
| Imposto próprio320 contabilizado exterior ao plano | Resultado líquido2800 conhecido;campo de acréscimo próprio por corresponder,sem usar213 de outrem;lucro/base3130 e colecta1001,60preservados |
|
||||
|
||||
Percurso cálculo → gravação → recuperação privada → relatório/dossier demonstrado em **5casos**. **15testes novos frontend;API1teste/97asserções**, transacção revertida na baseQA127.0.0.1:55441;routes/actions gerados pelo procedimento existente,TypeScript/build e interface real passaram. Interface demonstrou edição de parcelas,imposto em falta sem apagar valor anterior,recuperação/exportação e pendências apenas dependentes. Provas aceites reutilizadas;sem repetir suites anteriores. **4ficheiros de runtime no delta,50protegidos e31originais** conferidos;sem API/schema/configuração/permissões/dependências ou escrita no activo.
|
||||
|
||||
Fontes: PDF M22 SHA2564b61bd83d1fbcfd3b7b5c5523cea5923f7d0f65dc4c004eff58e5db38f763c88,3páginas já aceites reutilizadas;M20A.1 SHA2561ceca6f4c6d77853c1b2b445876599b42093175fa89eecf40590180956d83a9e,M12/D13–D35. Inventariados os20ficheiros acessíveis deModelos/Notas,incluindo temporários;originais/hash preservados. Só rótulos genéricos necessários extraídos do XLSX;sem valores privados,fórmulas/cache do exemplar,importação ou publicação documental.
|
||||
|
||||
| Saldo concreto da preparação M20/M22 | Condição de retoma e alcance |
|
||||
|---|---|
|
||||
| Transporte do resultado M20A.1/D35→M22 | Exemplar compatível ou instrução que resolva201/quadro8 versus200/quadro10. Só esse transporte fica impedido;valor líquido próprio e demais campos continuam visíveis |
|
||||
| Imposto próprio36(1)a,quota anterior recuperada e restantes efeitos de periodização/obras/reversões sem campo | Corresponder rótulo,edição/período e regra específica do campo. Efeito/valor conservados sem código provisório;apenas somas/campos dependentes aguardam |
|
||||
| Fracções M20 e subcentavos M22 | Identificar regra de representação do caso;preservar fracção e apresentar aproximação identificada até então. InteirosM20 e cêntimos exactosM22 não bloqueados |
|
||||
| Imposto contabilizado simultaneamente incluído e exterior ao plano | Discriminar ambas as componentes/referências e conciliar8.5/acréscimo próprio sem repetir gasto;sem inferir o valor da colecta |
|
||||
| Contas/quadros e anexos restantes fora das seis linhas financeiras demonstradas | Reutilizar dados existentes,classificar componentes com suporte e acrescentar correspondência específica;sem tomar campos preenchidos do exemplar como dados do investidor |
|
||||
|
||||
L7 mantém benefícios/casos especiais/taxas reduzidas eL8 mantém retenções,pagamentos,créditos e saldo final. Restantes regras deL6 e as dez dúvidasL5 conservam o saldo e as condições já documentadas. **L6 continua parcial;colecta não é saldo final a pagar.** Recibo:`docs/investmoz/simulations/irpc-l6-values-forms-qa-20261026.json`.
|
||||
|
||||
## 26/10/2026 — representação dos valores e campos M20/M22 5aaf1a56 entregues pelo Git
|
||||
|
||||
Instalado `5aaf1a56f9d928331364fcc8b0d1528e51dba327` sobre `56475acb`,preservado como versão anterior. Backup fresco `2026-10-26T08:57:09Z` e restauro isolado sem rede/porta55441: **174tabelas** por contagem/checksum e **369ficheiros/configuração** conferidos. **4ficheiros do delta,50protegidos e31originais** verificados;schema,roles/grants e permissões iguais. As172tabelas de negócio mantêm os valores do backup;cache/sessões reconciliadas com eventos operacionais/acessos anónimos,sem alteração de dados de negócio. Revisão/manifest público,7marcadores compilados,4assets e simuladorHTTP200 conferidos. Sem migrações,importações ou escrita privada sintética no activo.
|
||||
|
||||
Pipeline normal concluído;provasQA15frontend/API1-97/UI/tipos/build reutilizadas,sem nova ronda manual. **Disponível no âmbito demonstrado: resultado líquido3120 + ajustamento10 → lucro/base3130 → colecta1001,60MZN.** Representação exacta,ausência/informação em falta/campo sem aplicação e valores ainda sem correspondência conservados. M20 mantém fracções sem arredondamento presumido;M22 mantém preparação exacta ao cêntimo já aceite. Imposto próprio320 exterior produz resultado líquido2800,mas campo de acréscimo próprio continua pendente,sem usar213 de outrem. Divergência201/Q8 versus200/Q10 só limita o transporte afectado. Históricos e cálculos anteriores,pressupostos cambiais e âmbitosL3/ISPC/câmbio/L5 preservados. **Colecta não é saldo finalL8.** Recibo:`docs/investmoz/simulations/irpc-l6-values-forms-delivery-20261026.json`.
|
||||
|
||||
O estado anterior «QA sem instalação» de5aaf1a56 é histórico. O saldo seguinte separa desenvolvimento de esclarecimento documental,com exemplo e condição de retoma,para decidir o fecho operacional delimitado. **L6 não está integralmente concluído;L7 eL8 mantêm os seus âmbitos.** Não foi executada pesquisa nova nem repetição dos testes aceites para esta consolidação.
|
||||
|
||||
## 26/10/2026 — saldo consolidado de L6 para decisão de fecho operacional delimitado
|
||||
|
||||
Referência actual após a entrega `5aaf1a56`: percurso normal demonstrado até à **colecta**, com períodos/moedas/ajustamentos e preparação parcialM20/M22 documentados. Colecta não é saldo final a pagar ou recuperar;L8 conserva esse fecho. Esta lista consolida o saldo das notas anteriores,sem reabrir o que já foi demonstrado. Os pormenores e exemplares continuam nas mesmas secções/recibos;nenhuma nova matriz ou backlog é criado.
|
||||
|
||||
**Código ainda por implementar.** São extensões não demonstradas;as fontes já aceites permitem iniciar os casos correspondidos. Dados de um investidor em falta dentro de regra já implementada são uma pendência desse caso, não outra tarefa genérica deL6.
|
||||
|
||||
| Trabalho | Exemplo | Condição de retoma / alcance |
|
||||
|---|---|---|
|
||||
| Amortizações e quota de aluguer36h restantes | Ar condicionadoII/3/3,12,5%,fora dos10códigos implementados;bem usado com vida esperada e quotas anteriores documentadas. | Acrescentar catálogo e variantes previstas nas fontes aceites:usados/abertura/reparações/reavaliação,uso intensivo/concessões/peças/intangíveis,transição e excepções de método/vida útil,art17 em período curto e quota36h automática. Implementar só o caso escolhido e provar o delta;sem aguardar validação genérica daAT. Só activo,método ou quota ainda não suportados;amortizações demonstradas preservadas. |
|
||||
| Custos e periodizações específicos | Campanha de lançamento300 com imputação por3exercícios;obra com receita antecipada positiva em vez do zero demonstrado. | Implementar36-A e articulação com36n,reforços financeiros28(3),19(5)/19(6) e18(6–10),com saldos/condições do caso. Autorização de mudança de método apenas quando a disposição aplicável a exigir. Provisões sectoriais dependem primeiro da norma específica indicada abaixo. Só campanha,obra ou periodização específica;limites/provisões ordinários e casos já demonstrados mantidos. |
|
||||
| Períodos e sequência de perdas | Transição de4meses seguida dos períodos posteriores:aplicar a exclusão de contagem de41(5) ao período7(4)d,sem contar apenas anos civis. | Representar a sequência efectiva de períodos/perdas e acrescentar datas parciais,liquidação/períodos superiores a12meses e outros exercícios com regra/taxa aplicável. Não há nova pesquisa necessária para repetir o recorte de meses completos2026 já entregue. Só período ou utilização de perda dependente;lucro independente e semestres demonstrados preservados. |
|
||||
| Desdobramentos contabilísticos e quadros/anexos M20/M22 restantes | Imposto próprio200 já incluído no plano e320 exterior:discriminar as duas componentes sem duplicar gasto;contas fora das6linhas financeiras ainda não transportadas. | Acrescentar o desdobramento e as correspondências dos quadros/anexos escolhidos,reutilizando dados existentes. Campos sem correspondência aguardam a referência concreta abaixo;os outros componentes podem ser implementados/provados separadamente. Só componente/conta/campo ainda não suportado;valores e campos correspondidos preservados. |
|
||||
| Saldos em moeda estrangeira | Crédito final100USD não é soma das receitas convertidas por mês. | Implementar reconciliação de saldo e conversão pela data/regra que vier identificada,usando o motor cambial já entregue. A selecção mensal para simulação continua disponível;esta tarefa não cria outro mecanismo cambial. Só saldo/conversão fiscal dependente da regra;plano e pressupostos mensais permanecem disponíveis. |
|
||||
|
||||
**Esclarecimentos documentais aguardados.** Cada ponto abaixo exige apenas a referência/resposta específica indicada. A ausência dessa informação não significa revogação das fontes aceites,nem autoriza transformar a dúvida numa validação genérica deL6. Não se presume que um pedido já tenha sido enviado àAT;estes são pontos delimitados para o esclarecimento aplicável.
|
||||
|
||||
| Informação em falta | Exemplo da dúvida | Condição de retoma / alcance |
|
||||
|---|---|---|
|
||||
| Edição e campos M20/M22 | M20A.1/D35 remete201/quadro8;PDF M22 usa200/quadro10. Imposto próprio320 não pertence ao213 de outrem;quota recuperada−26 não tem campo de dedução confirmado. | Obter exemplar compatível ou instrução que identifique edição/período,campo e sentido do transporte. Para periodização/obras/reversões ainda sem campo,identificar a correspondência específica. Até informação nova,manter valores/efeitos sem código presumido e não repetir pesquisa. Só transporte,campo e somas dependentes;resultado líquido próprio,260/278/300 e demais campos conhecidos mantidos. |
|
||||
| Representação fiscal de fracções | M20:300,50=601/2MZN,num exemplar que pede meticais sem centavos;M22:1/300MZN não é um número exacto de cêntimos. | Identificar instrução de representação/arredondamento da edição/campo ou esclarecimento específico. Conservar a fracção até lá;não deduzir regra de arredondamento apenas do rótulo «sem centavos». Só transcrição não exactamente representável;inteirosM20,cêntimos exactosM22 e cálculo racional preservados. |
|
||||
| Articulação de limites em combinações não demonstradas | Combustível100,comprovado80,viatura de passageiros sem excepção:36h/i com36(4). Provisão de créditos200 num período curto de3meses:limite anual por corresponder. | Esclarecer especificamente a articulação h/i/36(4) e a base/limite dos períodos curtos de publicidade/créditos,se houver proporcionalização aplicável. Não somar exclusões,anualizar ou repartir por presunção. Retomar só perante referência/resposta concreta para o exemplo. Só combinação ou limite do período;casos independentes com regra já aplicada mantidos. |
|
||||
| Regra fiscal de conversão anual | PlanoUSD com64MZN/USD por mês é pressuposto sintético de simulação,não confirmação da data/taxa fiscal anual ou da cotação do saldo final. | Identificar disposição/âmbito,data,base e taxa/boletim aplicáveis ao resultado e,quando necessário,ao saldo. Reutilizar o motor existente e demonstrar só a correspondência nova;sem taxa actual por defeito ou nova ronda da pesquisa anterior. Só confirmação fiscal anual e saldo dependente;conversões mensais documentadas de simulação mantidas com os avisos. |
|
||||
| Norma sectorial de provisões reguladas | Provisão200 de uma entidade financeira sujeita ao28d não herda os1,5%/6% do regime ordinário29. | Identificar sector,regulador,norma de supervisão aplicável e saldos/condições necessários,antes da implementação específica. A fonte oficial fornecida é aceite;falta a regra concreta do caso,não certificação genérica da fonte. Só provisão regulada respectiva;provisões ordinárias demonstradas preservadas. |
|
||||
|
||||
**Base da decisão operacional:** o âmbito demonstrado e as suas limitações permanecem disponíveis na interface e nas exportações;as provas aceites mantêm validade. Um fecho operacional delimitado pode referir esse âmbito,com estas extensões/documentos fora da cobertura e retoma por caso. Esta consolidação **não declara L6 integralmente concluído nem regista uma decisão de fecho ainda não tomada**. Permite preparar o avanço paraL7 sem condicionar os casos independentes à resolução de todo este saldo. Benefícios/isenções/taxas reduzidas/tributações autónomas e operações especiais mantêm âmbitoL7;retenções,pagamentos,créditos e saldo anual mantêm âmbitoL8. As dez dúvidasL5 só afectam dependências efectivas e não foram pesquisadas novamente.
|
||||
|
||||
## 26/10/2026 — L6 operacional no âmbito demonstrado e delimitação de L7
|
||||
|
||||
**Decisão expressa da Tempo:** L6 fica operacional no âmbito demonstrado disponível em `5aaf1a56`, com limitações explícitas. Não é conclusão integral de L6 ou do IRPC. Os cinco grupos de código e cinco grupos documentais da secção «saldo consolidado de L6» permanecem separados, com exemplos e condições de retoma. As notas anteriores que deixavam a decisão operacional por tomar conservam o seu valor histórico; esta decisão é posterior. As provas aceites são reutilizadas. As pendências de L5/L6 só impedem tratamentos que dependam delas.
|
||||
|
||||
**Estado deste incremento:** delimitação documental de L7, sem novo cálculo, instalação, migração, importação ou alteração de dados activos. A colecta normal entregue mantém-se distinta do saldo a pagar/recuperar. Retenções, pagamentos, aplicação anual de créditos e liquidação final permanecem em L8. Recibo: `simulations/irpc-l7-scope-20261026.json` (relativo a `docs/investmoz/`).
|
||||
|
||||
### Dados existentes e fronteiras de integração
|
||||
|
||||
| Reutilização | Contrato para L7 e limite |
|
||||
| --- | --- |
|
||||
| Oportunidade/dossier: `context_opportunity`, `context_opportunity_snapshot`, `context_applicability_snapshot`, `context_reuse` | Conservar origem e data, selecção de campos compatíveis e edições deliberadas; `context-inheritance.ts` e `dossier-prefill.tsx` já sustentam esta reutilização. Associação documental a oportunidade/âncora não confirma implantação ou incentivo. |
|
||||
| `sector_id`, `province_id`, `district_id`, `admin_post_id`, `locality_id` e respectivas designações | Servem para identificar candidatos e pedir apenas elementos em falta. Confirmar actividade efectivamente exercida, estabelecimento/projecto e parcela abrangida por documentos do caso. Localização, polígono, DUAT ou código sectorial isolados não concedem benefício. |
|
||||
| Sujeito, NUIT, residência/EP, período, início de actividade/exploração e dados do plano | Reutilizar valores declarados e respectivas provas. Data prevista no dossier não substitui início efectivo quando esse for o termo inicial da norma. Distinguir conhecido, ausência declarada e desconhecido. |
|
||||
| `business_plan_snapshot`, livro `modelo_a_snapshot.irpcNormal` e versões L6 | Receber lucro/base/colecta e parcelas identificadas, com chave e versão de origem. Só alterar o ponto previsto pela norma: ajustamento ao lucro, dedução à base, taxa por parcela ou tributação autónoma separada. Não alterar nem recalcular silenciosamente históricos. |
|
||||
| Activos, quotas anteriores e despesas já registadas | Reutilizar os mesmos identificadores e montantes; calcular apenas o efeito adicional permitido. Não repetir o acréscimo de uma despesa nem deduzir duas vezes a amortização do mesmo activo. Um caso dependente de regra L6 não implementada conserva essa dependência específica. |
|
||||
| Preparação M20/M22 e aritmética racional existentes | Conservar montante exacto, unidade/moeda e parcela. Transporte só com correspondência demonstrada para a edição; campo desconhecido, fracção não representável ou divergência editorial não invalida o cálculo independente. Não arredondar por conveniência. |
|
||||
|
||||
O motor actual de matéria colectável não subtrai benefícios positivos livres: exige regra, condições, limite e ordem. A colecta normal cobre a taxa geral no recorte demonstrado; escolher «outro tratamento» não implementa uma taxa especial. A presença de campos ou de fontes no portal não equivale a execução de L7.
|
||||
|
||||
### Famílias de tratamentos a implementar por casos compatíveis
|
||||
|
||||
As referências seguintes delimitam a regra e o ponto de integração; **não constituem benefícios concedidos nem cobertura executável nova**. O exercício do caso, alterações aplicáveis e duração individual ficam associados à versão da regra. Não se transportam taxas temporárias para outro período.
|
||||
|
||||
| Família / fonte identificada | Condições e período a guardar | Efeito e exemplo de dúvida delimitada / condição de retoma |
|
||||
| --- | --- | --- |
|
||||
| **Despesas com tributação autónoma** — CIRPC, Lei34/2007, art.61(4), com art.36(1)g; PDF17/p768(71) | Natureza legal documentada da despesa não devidamente documentada, confidencial ou ilícita; valor e exercício; taxa de 35% da disposição e versão aplicável ao período. Não classificar pela simples falta de ficheiro anexado. | Parcela autónoma separada da colecta normal; reutilizar o acréscimo36g já feito, sem duplicação. Ex.: despesa100 já acrescida em L6 → parcela autónoma35 no caso qualificado; não é saldo final. Se só falta anexo, pedir a caracterização/prova da despesa e manter indeterminado apenas este tratamento. |
|
||||
| **Mais-valias autónomas** — Lei12/2025, art.2, CIRPC61-A; art.3 revoga39/47; art.6 vigora em01/01/2026; PDF20/p2180(20) | Alienação, activo, datas, realização/valor fiscal, origem contabilística, período e parcela identificados; taxa32% do61-A. Separar eventos anteriores a2026. | Apurar parcela autónoma, reconciliando o que já integra o resultado L6, sem dupla incidência ordinária/autónoma nem compensação presumida de perdas. Ex.: ganho100 incluído no resultado exige identificar a sua parcela antes de integrar a colecta autónoma32. Retoma: implementar essa reconciliação e a regra de apuramento aplicável ao activo; não bloqueia despesas autónomas ou benefícios independentes. |
|
||||
| **Isenções e redução por natureza da entidade** — CIRPC9–14; cooperativas no art.12, PDF5/p768(59), e taxa geral61(1) | Tipo efectivo da entidade, rendimentos elegíveis/excluídos, destino dos rendimentos, constituição e reconhecimento apenas onde exigido pela disposição; exercício e norma aplicável. Art.12 refere cooperativas agrárias, de artesanato e culturais e redução de50% da taxa geral; não todas as cooperativas. Arts.12(2)/14 separam rendimentos sujeitos a retenção. | Isenção ou taxa reduzida apenas na parcela coberta; actividade comercial acessória não se torna isenta por designação da entidade. Ex.: cooperativa com actividade elegível e outra não abrangida exige separar rendimentos e custos. Retoma: classificação documental e segregação da parcela, sem transportar a dispensa para retenções L5 ou liquidar créditos L8. |
|
||||
| **Amortização acelerada** — CBF, Lei4/2009, art.16; compilaçãoAPIEX p72 | Imóveis novos usados no projecto; imóveis reabilitados e máquinas/equipamentos industriais/agro-industriais nas condições da disposição; enquadramento CBF3/9/10 quando aplicável, entrada em uso, taxa normal, base, quota contabilizada e quotas anteriores. Incremento de50% sobre a taxa normal, não cinquenta pontos percentuais. | Efeito no ajustamento ao lucro e, através da cadeia L6, na base/colecta. Ex.: taxa normal10% → taxa acelerada15%, antes das restantes condições/limites; não autoriza uma segunda dedução integral. Retoma por activo com classificação/documentos e conciliação de quotas/custo disponíveis; tabelas L6 em falta bloqueiam só o activo dependente. |
|
||||
| **Deduções e majorações de despesas/investimentos** — CBF17–19; compilaçãoAPIEX pp73–74 | Tecnologia de ponta, formação de trabalhadores moçambicanos e despesas elegíveis de utilidade pública: natureza, base, exercício inicial, janela dos primeiros cinco anos/exercícios conforme artigo, limites, exclusões, ordem e não cumulaçãoCBF4. Distinguir dedução à matéria colectável de majoração de custo. | Efeito no ponto exacto previsto pela disposição. Ex.: formação sem prova do tipo não permite escolher entre o limite5% e o ramo10% para novas tecnologias do art.18. Retoma: identificar tipo/base de limite e conciliar a despesa já contabilizada; não converter percentagem em dedução livre. |
|
||||
| **Crédito fiscal por investimento** — CBF15; compilaçãoAPIEX pp71–72 | Investimento novo elegível, exclusões, início, Maputo/outras províncias como uma das condições, parcela da colecta atribuível ao projecto e prazo de utilização/transporte de cinco exercícios. Taxas5%/10% distinguem os ramos da disposição, sem direito automático por localização. | **L7 identifica origem, elegibilidade e crédito potencial; L8 aplica o crédito anual, limites/saldos e liquidação.** Ex.: projecto situado fora de Maputo, sem discriminação do investimento elegível, não gera automaticamente10% de crédito. Retoma: base elegível e calendário documentados; utilização anual aguarda o mecanismo L8. |
|
||||
| **Tratamentos sectoriais/territoriais CBF** — infra-estruturas20–22; agricultura/pescas27–29; turismo30–33; parques de ciência34–35; grandes projectos36–38; zonas de rápido desenvolvimento39–44; ZFI45–46; ZEE47–48 | Seleccionar a disposição de IRPC efectivamente pertinente, actividade/projecto, delimitação/estabelecimento e estatuto comprovados, data de autorização/início quando exigidos, escalões, duração, cumulação e cessaçãoCBF49–52. ZFI46 e ZEE48 são os artigos de impostos sobre rendimento. Não tratar benefícios exclusivamente aduaneiros como benefícios IRPC. | Isenção, redução ou dedução por parcela e intervalo próprio, em vez de taxa comum ao sector/localização. Ex.: endereço numa ZEE sem estatuto documentado deixa o ramo ZEE pendente; o cálculo normal independente continua. CIRPC61(2) na Lei20/2022 tem termo31/12/2025: não presumir prorrogação para2026. Retoma de cada ramo: condições e cronologia da disposição específica preenchidas, com regra versionada; não exigir pesquisa repetida de todos os sectores. |
|
||||
| **Operações e regimes especiais** — CIRPC54–56 (entradas de activos, fusões/cisões e sócios), transferência de perdas41-A; regimes sectoriais específicos do acervo | Tipo de operação, intervenientes, residência, datas, activos/passivos/valores fiscais e continuidade; identificar diploma sectorial/artigo e regra aplicável antes de escolher tratamento. Não inferir neutralidade por chamar «fusão» à operação nem aplicar regime mineiro/petrolífero por rótulo sectorial. | Continuidade/ajustamento/tributação diferida ou parcela própria conforme norma, mantendo bases históricas. Ex.: perda recebida de outra sociedade não é perda própria ordinária41 de L6. Retoma: correspondência específica41-A e operação documentada; regras sectoriais sem artigo correspondido ficam candidatas, sem taxa provisória. Não há bloqueio transversal de L7. |
|
||||
|
||||
### Registo por tratamento e demonstração a exigir ao código novo
|
||||
|
||||
Cada tratamento terá: identificador estável; sujeito/NUIT; oportunidade/projecto/estabelecimento e parcela; contexto herdado e divergências; fonte/exemplar/hash/artigo/versão; intervalo de vigência e período do caso; facto que inicia/termina a duração; condições individualizadas em «sim/não/desconhecido» com prova ou ausência declarada; título/reconhecimento somente quando a regra o exige; base elegível, taxa, limite, ordem e compatibilidade com outros tratamentos; resultado normal de origem; efeito adicional e ponto da cadeia; moeda/conversão e pressupostos; montante exacto; motivos de exclusão/informação em falta; versão/histórico e dependência concreta.
|
||||
|
||||
Os estados «candidato», «não aplicável», «informação em falta» e «calculado por regra implementada» não se confundem. Ausência declarada pode produzir efeito zero justificado; desconhecido não produz benefício zero nem benefício presumido. Uma condição negativa exclui o tratamento e conserva o percurso normal quando os seus dados são suficientes. Com potencial benefício ainda indeterminado, apresentar o cenário normal de referência e a parcela pendente sem declarar total fiscal definitivo. Mudança de sector/localização/documento invalida apenas a correspondência dependente e pede confirmação de reutilização; conserva o original e as edições deliberadas.
|
||||
|
||||
**Primeiro incremento delimitado para implementação:** qualificação comum e segregação de efeitos, acompanhadas do caso35% do61(4), com despesa já ajustada36g e caso de informação insuficiente. É independente de transporte M20/M22 não correspondido e de amortizações L6 em falta. **Incremento compatível seguinte:** cooperativa abrangida pelo12 com parcela elegível separada e amortização acelerada16 para activo já suportado em L6; cada caso só acompanha a entrega se demonstrado. Mais-valias61-A, deduções17–19, ramos sectoriais e operações especiais seguem separadamente quando as respectivas parcelas/regras estiverem correspondidas. Crédito15 prepara direito potencial em L7 e contrato de passagem para L8, sem antecipar liquidação anual.
|
||||
|
||||
Para cada nova regra: condição satisfeita, negativa, informação em falta, período incompatível/benefício expirado, sobreposição com ajustamento existente e alteração de contexto. Demonstrar apenas o delta: cálculo → gravação → recuperação → relatório, incluindo fonte, período, condições, efeito no lucro/base/colecta ou parcela autónoma e saldo final L8 por determinar. Recuperar históricos anteriores sem os alterar; não duplicar ajustamentos ao voltar a guardar. Reutilizar as provas aceites; não reabrir L3, ISPC, câmbio ou percursos L5/L6 independentes.
|
||||
|
||||
### Fontes consultadas e pendências delimitadas
|
||||
|
||||
Reutilizado o inventário autorizado de **8143ficheiros**, sem nova varredura de pastas. Para delimitação foram consultados os originais CIRPC/alterações já arquivados, a Lei4/2009 local e a compilação oficial [APIEX — Legislação de Investimentos em Moçambique](https://pt.apiex.gov.mz/wp-content/uploads/2025/02/LEGISLACAO-DE-INVESTIMENTOS-EM-MOCAMBIQUE.pdf), que reúne Lei8/2023, Decreto8/2024 e CBF4/2009. Disponibilidade, situação documental/jurídica e uso no cálculo continuam estados independentes. O acesso actual à cópia CBF supera a indisponibilidade assinalada em notas antigas; não activa regra nem apaga a nota histórica. Artigos, páginas, hashes e limites no recibo. A compilação não dispensa o período/alterações de cada tratamento, nem cria validação jurídica genérica adicional.
|
||||
|
||||
**Código por implementar em L7:** qualificação e persistência específicas; efeitos segregados; regras das famílias acima, por parcelas; conciliação sem duplicação; relatório/exportação correspondente. **Documentação por caso:** estatuto/reconhecimento ou enquadramento individual quando a fonte o exige; identificação de parcela/limite/cronologia; norma sectorial ainda sem correspondência; edição/campo de transporte afectado. Cada uma conserva exemplo e condição de retoma na linha correspondente. Não é necessário resolver todos os documentos para começar o primeiro incremento independente. L6 operacional não elimina este desenvolvimento; L7 delimitado não é L7 implementado; L8 conserva a liquidação final.
|
||||
|
||||
File diff suppressed because one or more lines are too long
@@ -0,0 +1,43 @@
|
||||
import {useState} from 'react';
|
||||
import {costRules,newNormalCosts,newCostRow,reusableCreditBalance,type CostRow,type NormalCostsInput} from '@/lib/irpc-normal-costs';
|
||||
import {normalFinancialSource,type NormalBook} from '@/lib/irpc-normal';
|
||||
import {fiscalMoney} from '@/lib/irpc-normal-schedules';
|
||||
import {addFractions,subtractFractions,fractionPresentation} from '@/lib/fiscal-rational';
|
||||
import {type ProfitTopic} from '@/lib/irpc-normal-profit';
|
||||
type Field=[string,string,'money'|'text'|'choice'|'method'|'source'];
|
||||
const fields:Record<string,Field[]>={
|
||||
allowance:[['billed','Parcela facturada a clientes','money'],['taxedNotBilled','Parcela tributada emIRPS e não facturada a clientes','money']],
|
||||
advertising:[['campaign','Campanha de lançamento com horizonte superior a um ano','choice']],
|
||||
vehicle:[['passenger','Viatura ligeira de passageiros','choice'],['publicOrRental','Afecta a serviço público de transportes ou aluguer na actividade normal','choice']],
|
||||
fuel:[['supportedNormal','Parcela com activo/locação e consumo normal comprovados','money'],['passenger','Viatura ligeira de passageiros','choice'],['publicOrRental','Afecta a serviço público de transportes ou aluguer na actividade normal','choice']],
|
||||
rental:[['nonAcceptedQuota','Parcela documentada da quota não aceite (36h)','money'],['quotaReference','Documento e regra da quota não aceite','text'],['passenger','Aplicação36(4) — ligeira de passageiros','choice'],['publicOrRental','Afecta a serviço público de transportes ou aluguer na actividade normal','choice']],
|
||||
stock:[['balanceKey','Identificação única do inventário/objecto','text'],['lossObserved','Perda de valor efectivamente observada','choice'],['observedLoss','Perda total observada documentada','money'],['previous','Provisão fiscal anterior que subsiste','money']],
|
||||
litigation:[['balanceKey','Identificação única do processo/objecto','text'],['caseOngoing','Processo judicial em curso','choice'],['chargeDeductible','Obrigação daria lugar a custo fiscal dedutível','choice'],['obligation','Obrigação coberta documentada','money'],['previous','Provisão fiscal anterior que subsiste','money']],
|
||||
provision_reversal:[['balanceKey','Identificação única da provisão/objecto','text'],['previous','Parcela antes fiscalmente deduzida','money'],['eventEnded','Evento não subsiste ou utilização para fim diferente','choice'],['inResult','Reversão já incluída em proveitos do resultado actual','choice']],
|
||||
taxed_reversal:[['balanceKey','Identificação única da provisão/objecto','text'],['previous','Parcela antes tributada e não deduzida','money'],['eventEnded','Evento não subsiste ou utilização para fim diferente','choice'],['inResult','Reversão já incluída em proveitos do resultado actual','choice']],
|
||||
prior_cost:[['originalYear','Exercício de origem','text'],['unknownAtClose','Imprevisível ou manifestamente desconhecido no encerramento anterior','choice'],['closingEvidence','Suporte do conhecimento no encerramento anterior','text']],
|
||||
prior_income:[['originalYear','Exercício de origem','text'],['unknownAtClose','Imprevisível ou manifestamente desconhecido no encerramento anterior','choice'],['closingEvidence','Suporte do conhecimento no encerramento anterior','text']],
|
||||
work:[['projectKey','Identificação única da obra','text'],['method','Critério fiscal da obra','method'],['price','Preço contratual estabelecido','money'],['totalCost','Custo total estimado para concluir','money'],['incurred','Custos efectivamente incorporados acumulados','money'],['priorRevenue','Proveitos fiscais reconhecidos em exercícios anteriores','money'],['priorCost','Custos fiscais reconhecidos em exercícios anteriores','money'],['costSource','Linha de custos da obra no resultado actual','source'],['bookCost','Parcela de custos da obra já contabilizada no exercício','money'],['partialBilling','Facturação parcial com grau de acabamento correspondente','choice'],['ownFractionalDelivery','Obra por conta própria vendida e entregue fraccionadamente','choice'],['consistentMethod','Critério uniforme para obras idênticas e mantido até ao final','choice'],['publicReception','Recepção provisória de obra pública','choice'],['deferredReceipt','Receita antecipada19(5) proposta — zero conhecido se não aplicada','money']],
|
||||
};
|
||||
export function SimulationIrpcCosts({draft,book,save}:{draft:Record<string,unknown>;book:NormalBook;save:(b:NormalBook)=>void}){
|
||||
const[review,setReview]=useState(false),[error,setError]=useState(''),i=book.costs,source=normalFinancialSource(draft);
|
||||
if(!i)return<button type="button" onClick={()=>save({...book,costs:newNormalCosts()})}>Iniciar custos com limites, provisões e periodização</button>;
|
||||
const patch=(p:Partial<NormalCostsInput>)=>{setReview(false);save({...book,costs:{...i,...p}});};
|
||||
const row=(id:string,p:Partial<CostRow>)=>patch({rows:i.rows.map(r=>r.id===id?{...r,...p}:r)});
|
||||
const fact=(r:CostRow,k:string,v:string)=>row(r.id,{facts:{...r.facts,[k]:v}});
|
||||
const summaries=()=>{const groups=new Map<ProfitTopic,string[]>();for(const r of book.schedules?.rows??[]){if(!r.rule)continue;const k=({tax_own:'expenseCorrections',tax_other:'expenseCorrections',undocumented:'expenseCorrections',capital_in:'positivePatrimonial',patrimonial_gain:'positivePatrimonial',capital_out:'negativePatrimonial',patrimonial_cost:'negativePatrimonial',future_cost:'timing',future_income:'timing',current_cost:'timing',current_income:'timing'}as Record<string,ProfitTopic>)[r.rule];groups.set(k,[...(groups.get(k)??[]),r.amount]);}for(const r of i.rows)if(r.rule){const k=costRules[r.rule][1];groups.set(k,[...(groups.get(k)??[]),r.amount]);}return[...groups].map(([key,values])=>({key,amount:fractionPresentation(addFractions(values.map(fiscalMoney))).decimal}));};
|
||||
const reuse=(r:CostRow)=>{try{const code=r.sourceCode,l=source?.accountingLines.find(l=>l.code===code);if(!l)throw Error('Seleccione uma origem.');const claims=[...book.rows,...(book.schedules?.rows??[]),...i.rows.filter(q=>q.id!==r.id),...i.rows.filter(q=>q.rule==='work').map(q=>({sourceCode:q.facts.costSource,amount:q.facts.bookCost}))].filter(q=>q.sourceCode===code);const available=subtractFractions(fiscalMoney(l.total),addFractions(claims.map(q=>fiscalMoney(q.amount))));if(BigInt(available.numerator)<=0n)throw Error('Não há parcela livre conhecida nesta origem.');row(r.id,{amount:fractionPresentation(available).decimal});setError('');}catch(e){setError(String(e));}};
|
||||
return<fieldset aria-label="Custos com limites provisões periodização" className="space-y-3 rounded border p-3"><legend>Custos com limites, provisões e periodização — exercício2026</legend>
|
||||
<p>Reutiliza o resultado e as linhas já declaradas. Identifique só a parcela de cada categoria e os parâmetros em falta. Os limites anuais de publicidade e créditos são partilhados por todas as parcelas; os saldos de provisões não são consumidos. A divergência M20/M22 não bloqueia estes cálculos. Benefícios/casos especiaisL7 e saldo anualL8 mantêm os seus âmbitos.</p>{error&&<p role="alert">{error}</p>}
|
||||
<button type="button" onClick={()=>patch({rows:[...i.rows,newCostRow(crypto.randomUUID())]})}>Acrescentar custo, provisão ou periodização</button>
|
||||
{i.rows.some(r=>r.rule==='advertising')&&<fieldset><legend>Publicidade — limite único anual</legend><p>Volume de vendas da origem: {source?.accountingLines.find(l=>l.code==='revenue')?.total??'Em falta'} MZN. O limite não se repete por factura.</p><label>Correspondência às vendas normais do exercício<select aria-label="Vendas normais para publicidade" value={i.salesOrdinary} onChange={e=>patch({salesOrdinary:e.target.value as ''|'yes'})}><option value="">Informação em falta</option><option value="yes">Toda a receita da origem corresponde a vendas/serviços normais</option></select></label><label className="block">Suporte do volume de vendas e completude da publicidade<input value={i.advertisingReference} onChange={e=>patch({advertisingReference:e.target.value})}/></label><p>Campanhas de lançamento com efeito superior a um ano exigem36-A e articulação própria; permanecem discriminadas, sem dedução ordinária presumida.</p></fieldset>}
|
||||
{i.rows.some(r=>r.rule==='credit')&&<fieldset><legend>Créditos — limites anual e acumulado</legend><label>Regime da provisão de créditos<select aria-label="Regime da provisão de créditos" value={i.creditRegime} onChange={e=>patch({creditRegime:e.target.value as NormalCostsInput['creditRegime']})}><option value="">Por identificar</option><option value="ordinary">Ordinário — fora de supervisão financeira/seguradora</option><option value="regulated">Provisão sujeita a supervisão — correspondência própria</option></select></label><label className="block">Créditos da actividade normal existentes no fim do exercício<input value={i.creditBase} onChange={e=>patch({creditBase:e.target.value})}/></label>{reusableCreditBalance(source)&&<button type="button" onClick={()=>patch({creditBase:fractionPresentation(reusableCreditBalance(source)!).decimal})}>Reutilizar saldo financeiro de créditos: {fractionPresentation(reusableCreditBalance(source)!).decimal} MZN — conferir âmbito</button>}<label className="block">Provisão fiscal anterior que subsiste no termo do exercício<input value={i.creditPrevious} onChange={e=>patch({creditPrevious:e.target.value})}/></label><label className="block">Suporte do saldo de créditos e provisão anterior<input value={i.creditReference} onChange={e=>patch({creditReference:e.target.value})}/></label><p>1,5% anual e6% acumulado; saldo anterior em falta não significa zero. Não aplica regras bancárias/seguradoras nem percentagens de antiguidade presumidas.</p></fieldset>}
|
||||
{i.rows.map((r,n)=>{const income=['provision_reversal','taxed_reversal','prior_income','work'].includes(r.rule),omitted=r.rule==='provision_reversal'&&r.facts.inResult==='no';return<fieldset key={r.id} className="rounded border p-3"><legend>Parcela {n+1} — {r.document||'Por identificar'}</legend><label>Categoria<select aria-label={'Categoria custo '+(n+1)} value={r.rule} onChange={e=>row(r.id,{rule:e.target.value as CostRow['rule']})}><option value="">Por identificar</option>{Object.entries(costRules).map(([k,v])=><option key={k} value={k}>{v[0]} — {v[2]}</option>)}</select></label>
|
||||
{(['document','line','amount','reference']as const).map(k=><label key={k} className="block">{({document:'Documento ou mapa discriminado',line:'Linha distinta',amount:r.rule==='work'?'Proveitos da obra já contabilizados no exercício — zero se conhecido':'Parcela contabilística MZN',reference:'Suporte da classificação, condições e período'})[k]}<input aria-label={'Custo '+(n+1)+' '+k} value={r[k]} onChange={e=>row(r.id,{[k]:e.target.value})}/></label>)}
|
||||
{!omitted&&<><label>Origem contabilística<select aria-label={'Origem custo '+(n+1)} value={r.sourceCode} onChange={e=>row(r.id,{sourceCode:e.target.value})}><option value="">Por corresponder</option>{source?.accountingLines.filter(l=>l.accountingEffect===(income?'income':'expense')).map(l=><option key={l.code} value={l.code}>{l.origin}: {l.total} MZN</option>)}</select></label><button type="button" onClick={()=>reuse(r)}>Reutilizar parcela livre da origem {n+1}</button></>}
|
||||
{(fields[r.rule]??[]).filter(([k])=>!(k==='publicOrRental'&&r.facts.passenger!=='yes')&&!(k==='publicReception'&&r.facts.method!=='closing')&&!(r.rule==='stock'&&r.facts.lossObserved==='no'&&['observedLoss','previous'].includes(k))&&!(r.rule==='litigation'&&r.facts.caseOngoing==='no'&&['obligation','previous','chargeDeductible'].includes(k))).map(([k,label,type])=><label key={k} className="block">{label}{type==='choice'?<select aria-label={'Custo '+(n+1)+' '+k} value={r.facts[k]??''} onChange={e=>fact(r,k,e.target.value)}><option value="">Informação em falta</option><option value="yes">Sim — documentado</option><option value="no">Não — documentado</option></select>:type==='method'?<select aria-label={'Custo '+(n+1)+' '+k} value={r.facts[k]??''} onChange={e=>fact(r,k,e.target.value)}><option value="">Por identificar</option><option value="percentage">Percentagem de acabamento</option><option value="closing">Encerramento da obra</option></select>:type==='source'?<select aria-label={'Custo '+(n+1)+' '+k} value={r.facts[k]??''} onChange={e=>fact(r,k,e.target.value)}><option value="">Por corresponder/zero fora de linha</option>{source?.accountingLines.filter(l=>l.accountingEffect==='expense').map(l=><option key={l.code} value={l.code}>{l.origin}: {l.total} MZN</option>)}</select>:<input aria-label={'Custo '+(n+1)+' '+k} value={r.facts[k]??''} onChange={e=>fact(r,k,e.target.value)}/>}</label>)}
|
||||
<label>Condições ordinárias e inclusão na origem demonstradas<select aria-label={'Condições custo '+(n+1)} value={r.conditions} onChange={e=>row(r.id,{conditions:e.target.value as ''|'yes'})}><option value="">Informação em falta</option><option value="yes">Sim, nos documentos identificados</option></select></label><button type="button" onClick={()=>patch({rows:i.rows.filter(q=>q.id!==r.id)})}>Retirar parcela {n+1} das entradas actuais</button></fieldset>;})}
|
||||
{book.profit&&<><button type="button" onClick={()=>{try{summaries();setReview(true);setError('');}catch(e){setError(String(e));}}}>Conferir correspondência dos temas com os mapas</button>{review&&<div><p>Reveja as somas brutas antes de aplicar; não alteram os factos, o resultado financeiro ou os históricos.</p>{summaries().map(t=><p key={t.key}>{({expenseCorrections:'Correcções aos custos',incomeCorrections:'Correcções aos proveitos',positivePatrimonial:'Variações positivas',negativePatrimonial:'Variações negativas',timing:'Periodização',special:'Casos especiais'})[t.key]}: actual {book.profit!.topics[t.key].amount||book.profit!.topics[t.key].state||'Em falta'} → mapas {t.amount} MZN</p>)}<button type="button" onClick={()=>{const topics=structuredClone(book.profit!.topics);for(const t of summaries())topics[t.key]={state:'known',amount:t.amount,reference:'Correspondência aritmética aos documentos/linhas dos mapas de ajustamentos e custos do exercício.'};save({...book,profit:{...book.profit!,topics}});setReview(false);}}>Aplicar correspondências conferidas dos mapas</button></div>}</>}
|
||||
<p>Ao calcular e guardar, os novos resultados entram numa versão própria; o resultado anterior permanece no histórico. Informação em falta impede apenas os totais que dependem dessa parcela.</p>
|
||||
</fieldset>;
|
||||
}
|
||||
@@ -0,0 +1,36 @@
|
||||
import {useState}from'react';
|
||||
import{depreciationCatalog,newNormalDepreciation,newDepreciationAsset,reuseNormalAssets,type DepreciationAsset}from'@/lib/irpc-normal-depreciation';
|
||||
import{normalFinancialSource,type NormalBook}from'@/lib/irpc-normal';
|
||||
import{fiscalMoney}from'@/lib/irpc-normal-schedules';import{addFractions,subtractFractions,fractionPresentation}from'@/lib/fiscal-rational';
|
||||
export function SimulationIrpcDepreciation({draft,book,save}:{draft:Record<string,unknown>;book:NormalBook;save:(b:NormalBook)=>void}){
|
||||
const[error,setError]=useState(''),input=book.depreciation,source=normalFinancialSource(draft);
|
||||
if(!input)return<div><button type="button" onClick={()=>save({...book,depreciation:newNormalDepreciation()})}>Iniciar amortizações — tabelas, métodos e quotas anteriores</button>{!!book.schedules?.assets.length&&<button type="button" onClick={()=>save({...book,depreciation:{...reuseNormalAssets(book.schedules!.assets),completenessReference:book.schedules!.assetsReference}})}>Reutilizar activos e valores do mapa inicial</button>}</div>;
|
||||
const patch=(id:string,p:Partial<DepreciationAsset>)=>save({...book,depreciation:{...input,assets:input.assets.map(a=>a.id===id?{...a,...p}:a)}});
|
||||
const field=(a:DepreciationAsset,n:number,k:keyof DepreciationAsset,label:string)=><label key={k}className="block">{label}<input aria-label={'Activo '+n+' '+k}value={a[k]}onChange={e=>patch(a.id,{[k]:e.target.value})}/></label>;
|
||||
const choice=(a:DepreciationAsset,n:number,k:'specificRate'|'consistentMethod'|'newTangible'|'switchToStraight'|'priorFullQuotas'|'vehicleException'|'limitedRights'|'individual',label:string)=><label key={k}className="block">{label}<select aria-label={'Activo '+n+' '+k}value={a[k]}onChange={e=>patch(a.id,{[k]:e.target.value})}><option value="">Informação em falta</option><option value="yes">Sim — documentado</option><option value="no">Não — documentado</option></select></label>;
|
||||
return<fieldset aria-label="Amortizações ampliadas L6"className="space-y-3 rounded border p-3"><legend>Amortizações — tabelas, métodos, duodécimos e quotas anteriores</legend>
|
||||
<p>Decreto72/2013 eCIRPC26/27. Reutiliza a depreciação financeira e os activos do mapa inicial; os originais/históricos ficam conservados. O novo mapa substitui exclusivamente o cálculo de amortizações, sem somar novamente o mapa inicial. Custo histórico e condições ordinárias documentados; reavaliações, turnos intensivos, concessões e outros casos especiais permanecem separados.</p>
|
||||
<p>Depreciação contabilística a repartir: {source?.accountingLines.find(l=>l.code==='depreciation')?.total??'Em falta'} {source?.currency}. O catálogo apresenta apenas os códigos correspondidos; outra categoria permanece identificada, sem taxa livre.</p>{error&&<p role="alert">{error}</p>}
|
||||
<label className="block">Suporte da reconciliação integral dos activos e quotas anteriores<input value={input.completenessReference}onChange={e=>save({...book,depreciation:{...input,completenessReference:e.target.value}})}/></label>
|
||||
<button type="button"onClick={()=>save({...book,depreciation:{...input,assets:[...input.assets,newDepreciationAsset(crypto.randomUUID())]}})}>Acrescentar activo ao mapa fiscal</button>
|
||||
{input.assets.map((a,index)=>{const n=index+1,entry=Object.hasOwn(depreciationCatalog,a.category)?depreciationCatalog[a.category as keyof typeof depreciationCatalog]:null;return<fieldset key={a.id}className="rounded border p-3"><legend>Activo fiscal {n} — {a.description||'Por identificar'}</legend>
|
||||
{field(a,n,'assetKey','Identificação única do activo')}{field(a,n,'description','Descrição')}{field(a,n,'document','Documento, pressuposto ou mapa de origem')}{field(a,n,'line','Linha distinta do documento/mapa')}
|
||||
<label>Categoria/tabela<select aria-label={'Activo '+n+' category'}value={a.category}onChange={e=>{const category=e.target.value as DepreciationAsset['category'],c=Object.hasOwn(depreciationCatalog,category)?depreciationCatalog[category as keyof typeof depreciationCatalog]:null;patch(a.id,{category,rate:c?.rate??''});}}><option value="">Por identificar</option>{Object.entries(depreciationCatalog).map(([k,c])=><option key={k}value={k}>Tabela{c.table}/{c.code} — {c.label} — {c.rate}%</option>)}<option value="nondepreciable">Elemento comprovadamente não depreciável — exclusão</option><option value="other">Outra categoria — correspondência pendente</option></select></label>
|
||||
{entry&&<p>Taxa máxima: {entry.rate}%; taxas constantes cobertas: {Number(entry.rate)/2}% a{entry.rate}%; vida útil mínima: {100/Number(entry.rate)}anos, máxima: {200/Number(entry.rate)}anos. Coeficiente degressivo máximo: {100/Number(entry.rate)<5?'1,5':100/Number(entry.rate)<=6?'2':'2,5'}, apenas nos activos elegíveis. Fonte:tabela{entry.table}/{entry.code},PDF{entry.page}.</p>}{field(a,n,'cost','Custo histórico documentado MZN')}{field(a,n,'accounting','Depreciação contabilística do exercício MZN')}
|
||||
<button type="button"onClick={()=>{try{const total=fiscalMoney(source?.accountingLines.find(l=>l.code==='depreciation')?.total??''),used=addFractions(input.assets.filter(q=>q.id!==a.id).map(q=>fiscalMoney(q.accounting))),left=subtractFractions(total,used);if(BigInt(left.numerator)<0n)throw Error('Valores repartidos excedem a origem.');patch(a.id,{accounting:fractionPresentation(left).decimal});setError('');}catch(e){setError(String(e));}}}>Reutilizar depreciação financeira ainda não repartida — activo {n}</button>
|
||||
{a.category!=='nondepreciable'&&<>
|
||||
<label>Tipo de aquisição/base<select aria-label={'Activo '+n+' valuation'} value={a.valuation} onChange={e=>patch(a.id,{valuation:e.target.value as DepreciationAsset['valuation']})}><option value="">Por identificar</option><option value="historical_new">Bem adquirido novo/construído ou produzido — custo histórico</option><option value="used">Bem adquirido usado — regra própria7(2)</option><option value="revalued">Bem reavaliado — regra própria15</option><option value="other">Outra base — por corresponder</option></select></label>{entry&&choice(a,n,'specificRate','Existe taxa específica da tabelaI para o activo/actividade')}{field(a,n,'residual','Valor residual MZN')}{entry?.kind==='building'&&field(a,n,'land','Terreno/parte não depreciável incluídos no custo MZN')}
|
||||
<label>Método<select aria-label={'Activo '+n+' method'}value={a.method}onChange={e=>patch(a.id,{method:e.target.value as DepreciationAsset['method']})}><option value="">Por identificar</option><option value="constant">Quotas constantes — artigos5/7</option><option value="declining">Quotas degressivas — artigos6/8</option><option value="low_value">Valor reduzido, opção integral — artigo17</option></select></label>
|
||||
{a.method==='constant'&&field(a,n,'rate','Taxa constante escolhida %')}
|
||||
{a.method==='declining'&&<>{choice(a,n,'newTangible','Activo tangível novo adquirido a terceiros ou construído/produzido')}{field(a,n,'factor','Coeficiente degressivo escolhido (máximo1,5/2/2,5)')}{choice(a,n,'switchToStraight','Aplicar saldo/vida útil restante8(2) quando mais favorável')}{a.switchToStraight==='yes'&&choice(a,n,'priorFullQuotas','Condição de quotas anteriores do artigo8(2) integralmente documentada')}</>}
|
||||
{a.method==='low_value'?<>{choice(a,n,'individual','Activo individual, fora de conjunto depreciado como um todo')}<p>Art17:até20000MZN, sem amortização fiscal anterior e entrada emuso neste período; a dedução não excede o contabilizado e o saldo fiscal.</p></>:<label>Período da quota<select aria-label={'Activo '+n+' timing'}value={a.timing}onChange={e=>patch(a.id,{timing:e.target.value as DepreciationAsset['timing']})}><option value="">Por identificar</option><option value="annual">Quota anual</option><option value="months">Duodécimos em vigor desde o início — artigo9</option></select></label>}
|
||||
{field(a,n,'start','Entrada em funcionamento/utilização AAAA-MM-DD')}
|
||||
<label>Transmissão, inutilização ou termo da vida útil<select aria-label={'Activo '+n+' exitState'}value={a.exitState}onChange={e=>patch(a.id,{exitState:e.target.value as DepreciationAsset['exitState']})}><option value="">Informação em falta</option><option value="absent">Ausência declarada de evento</option><option value="known">Evento/data conhecidos</option></select></label>{(a.exitState==='known'||a.exitDate)&&field(a,n,'exitDate','Data do evento AAAA-MM-DD')}
|
||||
{choice(a,n,'consistentMethod','Método uniforme desde o início, sem mudança ou excepção por corresponder')}{entry?.kind==='vehicle'&&choice(a,n,'vehicleException','Afectação a serviço público de transportes/locação na actividade normal')}{entry?.kind==='software'&&choice(a,n,'limitedRights','Aquisição onerosa e utilização exclusiva por tempo limitado')}
|
||||
{field(a,n,'previousAccounting','Quotas contabilísticas anteriores desde a utilização MZN')}{field(a,n,'previousFiscal','Quotas fiscais anteriormente deduzidas MZN')}{field(a,n,'priorAvailable','Parcela anterior temporariamente tributada, recuperável MZN')}{field(a,n,'previousReference','Suporte das quotas anteriores e da recuperabilidade fiscal')}
|
||||
{['previousAccounting','previousFiscal','priorAvailable'].every(k=>!a[k as 'previousFiscal']||/^0(?:\.0+)?$/.test(a[k as 'previousFiscal']))&&<button type="button"onClick={()=>{if(!a.reference.trim()){setError('Identifique primeiro o suporte da ausência de quotas anteriores.');return;}patch(a.id,{previousAccounting:'0',previousFiscal:'0',priorAvailable:'0',previousReference:'Ausência de quotas anteriores expressamente declarada; '+a.reference});setError('');}}>Declarar ausência de quotas anteriores — activo {n}</button>}
|
||||
<p>Quota anterior recuperável exige contabilização e tributação temporária demonstradas. Não inclui encargos permanentemente excluídos ou quota nunca contabilizada. O cálculo apresenta o saldo posterior aritmético; não consome saldos oficiais.</p></>}
|
||||
{field(a,n,'reference','Suporte do activo, categoria, condições e período')}<label>Condições ordinárias e documentos conferidos<select aria-label={'Activo '+n+' conditions'}value={a.conditions}onChange={e=>patch(a.id,{conditions:e.target.value as ''|'yes'})}><option value="">Informação em falta</option><option value="yes">Sim, no recorte documentado</option></select></label>
|
||||
<button type="button"onClick={()=>save({...book,depreciation:{...input,assets:input.assets.filter(q=>q.id!==a.id)}})}>Retirar activo {n} das entradas actuais</button></fieldset>;})}
|
||||
</fieldset>;
|
||||
}
|
||||
@@ -0,0 +1,14 @@
|
||||
import {normalFinancialSource,type NormalBook} from '@/lib/irpc-normal';
|
||||
import {m20Accounts,newNormalFormPreparation,newFormAllocation,reuseDirectFormAllocations,normalFormAccountsFor,type NormalFormPreparationInput,type FormAllocation} from '@/lib/irpc-normal-form-preparation';
|
||||
export function SimulationIrpcFormPreparation({draft,book,save}:{draft:Record<string,unknown>;book:NormalBook;save:(b:NormalBook)=>void}){
|
||||
const i=book.forms,source=normalFinancialSource(draft);if(!i)return<button type="button" onClick={()=>save({...book,forms:newNormalFormPreparation()})}>Preparar representação dos valores e campos M20/M22</button>;
|
||||
const patch=(p:Partial<NormalFormPreparationInput>)=>save({...book,forms:{...i,...p}}),row=(id:string,p:Partial<FormAllocation>)=>patch({allocations:i.allocations.map(a=>a.id===id?{...a,...p}:a)});
|
||||
return<fieldset aria-label="Preparação de valores M20 M22" className="space-y-3 rounded border p-3"><legend>Representação dos valores e correspondência M20/M22</legend><p>Reutiliza os valores exactos do cálculo e do período/moeda já documentados. A preparação dos campos não altera lucro tributável,matéria colectável ou colecta. M20A.1 exige meticais sem centavos;fracções conservam o valor exacto e ficam pendentes de regra de representação. O transporte201/quadro8 versus200/quadro10 continua identificado,só no resultado afectado. Não gera declaração oficial nem saldo finalL8.</p>
|
||||
<label className="block">Exemplares de preparação<select value={i.edition} onChange={e=>patch({edition:e.target.value as NormalFormPreparationInput['edition']})}><option value="">Por identificar</option><option value="accepted_pdf_and_m20a1">PDF M22 quadros10–12 e M20A.1 inventariados — edições distintas</option></select></label>
|
||||
<label className="block">Suporte da edição e do período<input value={i.reference} onChange={e=>patch({reference:e.target.value})}/></label><label className="block">Completude das contas e discriminação das linhas do plano<input value={i.completenessReference} onChange={e=>patch({completenessReference:e.target.value})}/></label>
|
||||
<button type="button" onClick={()=>patch({allocations:[...i.allocations,...reuseDirectFormAllocations(source).filter(a=>!i.allocations.some(r=>r.sourceCode===a.sourceCode))]})}>Reutilizar contas directas ainda não discriminadas</button><button type="button" onClick={()=>patch({allocations:[...i.allocations,newFormAllocation(crypto.randomUUID())]})}>Acrescentar parcela contabilística M20</button>
|
||||
{i.allocations.map((a,n)=><fieldset key={a.id} className="rounded border p-2"><legend>Parcela M20 {n+1}</legend><label className="block">Linha de origem<select aria-label={'Origem M20 '+(n+1)} value={a.sourceCode} onChange={e=>row(a.id,{sourceCode:e.target.value})}><option value="">Seleccione</option>{source?.accountingLines.map(l=><option key={l.code} value={l.code}>{l.origin}: {l.total} MZN</option>)}</select></label><label className="block">Conta M20A.1<select aria-label={'Conta M20 '+(n+1)} value={a.account} onChange={e=>row(a.id,{account:e.target.value as FormAllocation['account']})}><option value="">Por corresponder</option>{Object.entries(m20Accounts).filter(([k])=>normalFormAccountsFor(a.sourceCode).includes(k)||k===a.account).map(([k,v])=><option key={k}value={k}>{k} — {v}</option>)}</select></label><label className="block">Montante MZN<input aria-label={'Montante M20 '+(n+1)}value={a.amount}onChange={e=>row(a.id,{amount:e.target.value})}/></label><label className="block">Suporte da classificação<input aria-label={'Suporte M20 '+(n+1)}value={a.reference}onChange={e=>row(a.id,{reference:e.target.value})}/></label></fieldset>)}
|
||||
<fieldset className="rounded border p-2"><legend>Imposto contabilizado e resultado líquido</legend><p>Colecta e saldo a pagar não são usados como gasto contabilístico presumido. Indique imposto reconhecido e se já está incluído numa linha do plano,para evitar subtracção duplicada.</p><label className="block">Estado do imposto contabilizado<select aria-label="Estado do imposto contabilizado" value={i.incomeTax.state} onChange={e=>patch({incomeTax:{...i.incomeTax,state:e.target.value as ''|'known'|'absent'}})}><option value="">Informação em falta</option><option value="known">Valor conhecido</option><option value="absent">Ausência declarada com suporte</option></select></label>{(i.incomeTax.state==='known'||i.incomeTax.amount!==''||i.incomeTax.placement!=='')&&<><label className="block">Imposto contabilizado em MZN<input value={i.incomeTax.amount} onChange={e=>patch({incomeTax:{...i.incomeTax,amount:e.target.value}})}/></label><label className="block">Localização do imposto contabilizado<select value={i.incomeTax.placement} onChange={e=>patch({incomeTax:{...i.incomeTax,placement:e.target.value as ''|'included'|'outside'}})}><option value="">Por identificar</option><option value="included">Já incluído no resultado do plano — discriminado na conta8.5</option><option value="outside">Exterior ao resultado antes de imposto do plano</option></select></label></>}<label className="block">Suporte do imposto contabilizado<input value={i.incomeTax.reference}onChange={e=>patch({incomeTax:{...i.incomeTax,reference:e.target.value}})}/></label></fieldset>
|
||||
<label className="block">Parcela de taxa reduzida para a colecta total302<select aria-label="Parcela de taxa reduzida para a colecta total302" value={i.reducedRate.state} onChange={e=>patch({reducedRate:{...i.reducedRate,state:e.target.value as ''|'known'|'absent'}})}><option value="">Informação em falta</option><option value="absent">Ausência declarada — sem parcela reduzida neste sujeito/período</option><option value="known">Situação conhecida — âmbitoL7 por tratar</option></select></label><label className="block">Suporte da situação da taxa reduzida<input value={i.reducedRate.reference}onChange={e=>patch({reducedRate:{...i.reducedRate,reference:e.target.value}})}/></label>
|
||||
</fieldset>;
|
||||
}
|
||||
@@ -1,3 +1,7 @@
|
||||
import {SimulationIrpcFormPreparation} from '@/components/simulation-irpc-form-preparation';
|
||||
import {SimulationIrpcPeriodFx} from '@/components/simulation-irpc-period-fx';
|
||||
import {SimulationIrpcDepreciation} from '@/components/simulation-irpc-depreciation';
|
||||
import {SimulationIrpcCosts} from '@/components/simulation-irpc-costs';
|
||||
import {SimulationIrpcSchedules} from '@/components/simulation-irpc-schedules';
|
||||
import {SimulationIrpcAssessment} from '@/components/simulation-irpc-assessment';
|
||||
import {useState} from 'react';
|
||||
@@ -14,9 +18,9 @@ export function SimulationIrpcNormal({draft,onChange}:{draft:Record<string,unkno
|
||||
const profit=(patch:Partial<NormalProfitInput>)=>save({...b,profit:{...(b.profit??newNormalProfitInput()),...patch}});
|
||||
const field=(r:NormalAdjustment,k:'document'|'line'|'amount'|'reference',label:string)=><label className="block">{label}<input value={r[k]} onChange={e=>patch(r.id,{[k]:e.target.value})}/></label>;
|
||||
return<section aria-label="IRPC normal — ajustamentos" className="space-y-3 rounded border p-4"><h4>L6 — IRPC normal: ajustamentos ao resultado financeiro</h4><p>Acréscimos de multas sem origem contratual e juros compensatórios incluídos nos custos do plano, artigo 36(1)c. A conferência anual pode determinar o lucro tributável simulado no recorte ordinário documentado. A matéria colectável exige conferência específica de deduções e perdas; a colecta tem cálculo próprio e o saldo final a pagar ou recuperar pertence aL8. Não reutiliza automaticamente juros simulados de L5.</p>{error&&<p role="alert">{error}</p>}
|
||||
{source?<p>Origem: plano financeiro desta oportunidade; {source.periods} meses; {source.currency}; resultado antes de imposto: {source.accountingProfitBeforeTax}. Cobranças, pagamentos e reembolso de capital ficam fora do resultado.</p>:<p>Prepare o plano financeiro para reutilizar o resultado e os custos reconciliados.</p>}
|
||||
{source?<p>Origem: plano financeiro desta oportunidade; {source.periods} meses; {source.currency}; resultado antes de imposto: {source.accountingProfitBeforeTax}. Cobranças, pagamentos e reembolso de capital ficam fora do resultado.</p>:<p>{b.periodsFx?'Complete a correspondência do período e moeda abaixo para reutilizar o plano existente emMZN.':'Prepare o plano financeiro para reutilizar o resultado e os custos reconciliados.'}</p>}
|
||||
<label className="block">Exercício fiscal<input value={b.year} onChange={e=>save({...b,year:e.target.value})}/></label>
|
||||
<label className="block">{b.schedules?'Correspondência dos12 meses do plano ao período anual documentado':'Correspondência dos 12 meses do plano a Janeiro–Dezembro de 2026'}<input value={b.mappingReference} onChange={e=>save({...b,mappingReference:e.target.value})}/></label>
|
||||
<label className="block">{b.periodsFx?'Correspondência do plano ao período documentado':b.schedules?'Correspondência dos12 meses do plano ao período anual documentado':'Correspondência dos 12 meses do plano a Janeiro–Dezembro de 2026'}<input value={b.mappingReference} onChange={e=>save({...b,mappingReference:e.target.value})}/></label>
|
||||
<label className="block">Âmbito<select value={b.scope} onChange={e=>save({...b,scope:e.target.value as NormalBook['scope']})}><option value="">Por identificar</option><option value="resident_general">Sujeito residente — regime geral, fora de transparência e regimes especiais</option><option value="ep_general">Não residente com estabelecimento estável — regime geral, só resultado imputável ao EP (mapas complementares)</option><option value="other">Outro âmbito — por corresponder</option></select></label>
|
||||
<label className="block">Suporte do âmbito e da imputação integral do resultado ao sujeito/EP<input value={b.scopeReference} onChange={e=>save({...b,scopeReference:e.target.value})}/></label>
|
||||
<button type="button" onClick={()=>save({...b,rows:[...b.rows,newNormalAdjustment(crypto.randomUUID())]})}>Acrescentar ajustamento ao resultado</button>
|
||||
@@ -29,9 +33,13 @@ export function SimulationIrpcNormal({draft,onChange}:{draft:Record<string,unkno
|
||||
<p>Depreciação positiva e juros financeiros não integralmente acrescidos exigem correspondência própria;uma declaração de ausência não apaga os valores do plano.</p>
|
||||
{profitTopics.map(([k,label])=>{const t=b.profit!.topics[k];const change=(p:Partial<ProfitEvidence>)=>profit({topics:{...b.profit!.topics,[k]:{...t,...p}}});return<fieldset key={k} className="rounded border p-2"><legend>{label}</legend><label className="block">Estado — {label}<select aria-label={'Estado — '+label} value={t.state} onChange={e=>change({state:e.target.value as ProfitEvidence['state']})}><option value="">Informação em falta</option><option value="known">Valor conhecido</option><option value="absent">Ausência declarada com suporte</option></select></label>{(t.state==='known'||t.amount!=='')&&<label className="block">Montante conhecido — {label}<input value={t.amount} onChange={e=>change({amount:e.target.value})}/></label>}<label className="block">Suporte — {label}<input value={t.reference} onChange={e=>change({reference:e.target.value})}/></label></fieldset>;})}
|
||||
</fieldset>}
|
||||
<SimulationIrpcPeriodFx draft={draft} book={b} save={save}/>
|
||||
<SimulationIrpcSchedules book={b} save={save}/>
|
||||
<SimulationIrpcDepreciation draft={draft} book={b} save={save}/>
|
||||
<SimulationIrpcCosts draft={draft} book={b} save={save}/>
|
||||
<SimulationIrpcTaxableBase draft={draft} book={b} save={save}/>
|
||||
<SimulationIrpcAssessment book={b} save={save}/>
|
||||
<SimulationIrpcFormPreparation draft={draft} book={b} save={save}/>
|
||||
<button type="button" onClick={()=>{try{save(recordNormal(draft,b));}catch(e){setError(String(e));}}}>Calcular e guardar ajustamentos L6</button>
|
||||
<button type="button" onClick={()=>{try{const html=normalHtml(draft),url=URL.createObjectURL(new Blob([html],{type:'text/html;charset=utf-8'})),a=document.createElement('a');a.href=url;a.download='IRPC-normal-ajustamentos.html';a.click();URL.revokeObjectURL(url);setError('');}catch(e){setError(String(e));}}}>Exportar mapa parcial L6</button>
|
||||
{normalReportRows(draft).map((r,n)=><p key={n}>{r[1]} — {r[2]} — {r[3]}</p>)}
|
||||
|
||||
@@ -0,0 +1,21 @@
|
||||
import {SimulationFxSelection} from '@/components/simulation-fx-selection';
|
||||
import {rawNormalFinancialSource,type NormalBook} from '@/lib/irpc-normal';
|
||||
import {newNormalPeriodFx,mapNormalPeriodFx,type NormalPeriodFxInput} from '@/lib/irpc-normal-period-fx';
|
||||
import {irpcFxSources,irpcFxRow,updateIrpcFx} from '@/lib/irpc-fx';
|
||||
export function SimulationIrpcPeriodFx({draft,book,save}:{draft:Record<string,unknown>;book:NormalBook;save:(b:NormalBook)=>void}){
|
||||
const raw=rawNormalFinancialSource(draft),i=book.periodsFx;
|
||||
if(!i)return<button type="button" onClick={()=>save({...book,periodsFx:newNormalPeriodFx()})}>Preparar período curto ou plano noutra moeda</button>;
|
||||
const patch=(p:Partial<NormalPeriodFxInput>)=>save({...book,periodsFx:{...i,...p}}),model=mapNormalPeriodFx(draft,i,raw),sources=irpcFxSources(draft);
|
||||
const text=(k:'from'|'to'|'planStart'|'reference'|'conversionReference'|'mznMapsReference',label:string)=><label className="block">{label}<input value={i[k]} onChange={e=>patch({[k]:e.target.value})}/></label>;
|
||||
return<fieldset aria-label="Período e moeda L6" className="space-y-3 rounded border p-3"><legend>Período fiscal e conversão do plano — simulação L6</legend><p>Reutiliza os meses e valores originais do plano. Seleccione apenas os meses do período documentado;sem anualizar o resultado. Os mapas,activos e saldos fiscais permanecem emMZN e exigem reconciliação explícita. A conversão cambial para simulação usa o mecanismo existente; não confirma automaticamente a regra fiscal de conversão anual.</p>
|
||||
<label className="block">Tipo de período<select value={i.kind} onChange={e=>patch({kind:e.target.value as NormalPeriodFxInput['kind']})}><option value="">Por identificar</option><option value="annual">Anual documentado — 12meses</option><option value="start">Início de actividade — 7(4)a</option><option value="cessation">Cessação de actividade — 7(4)b</option><option value="same_year">Início e fim de sujeição no mesmo exercício — 7(4)c</option><option value="transition">Transição para período autorizado/comunicado — 7(4)d</option></select></label>
|
||||
{text('from','Início do período fiscal (AAAA-MM-DD)')}{text('to','Fim do período fiscal (AAAA-MM-DD)')}{text('planStart','Primeiro mês civil do plano (AAAA-MM-01)')}{text('reference','Suporte do evento,período e correspondência dos meses')}
|
||||
{book.schedules&&<button type="button" onClick={()=>patch({from:i.from||book.schedules!.period.from,to:i.to||book.schedules!.period.to,reference:i.reference||book.schedules!.period.reference})}>Reutilizar datas e suporte já declarados nos campos vazios</button>}
|
||||
{text('mznMapsReference','Reconciliação dos mapas,parcelas,activos e saldos existentes em MZN para este período')}
|
||||
{raw?.currency!=='MZN'&&<>{text('conversionReference','Pressuposto documentado da conversão mensal para simulação')}
|
||||
{[...new Set(model.rows.map(r=>r.period))].map(period=>{const date=model.rows.find(r=>r.period===period)?.date,entry=i.months.find(m=>m.period===period)??{period,currency:raw?.currency??''};const change=(p:Partial<typeof entry>)=>patch({months:[...i.months.filter(m=>m.period!==period),{...entry,...p}]});return<fieldset key={period} aria-label={'Câmbio do mês '+period} className="rounded border p-2"><legend>Mês{period} — {date} — {raw?.currency}</legend><label>Reutilizar selecção cambial existente<select value={entry.fxLink?.id??''} onChange={e=>{const s=sources.find(s=>s.id===e.target.value);if(s)change({currency:raw?.currency??'',fxSelection:s.selection,fxLink:{id:s.id,fingerprint:s.fingerprint}});}}><option value="">Seleccione uma origem documentada</option>{sources.map(s=><option value={s.id} key={s.id}>{s.label}</option>)}</select></label><SimulationFxSelection row={irpcFxRow('normal-'+period,entry)} onChange={p=>{if(p.fxSelection)change({...updateIrpcFx(entry,p.fxSelection),currency:raw?.currency??''});}}/></fieldset>;})}
|
||||
</>}
|
||||
{i.months.filter(m=>!model.rows.some(r=>r.period===m.period)).map(m=><p key={m.period}>Selecção conservada do mês{m.period},fora do período actual. <button type="button" onClick={()=>patch({months:i.months.filter(x=>x.period!==m.period)})}>Retirar selecção do mês{m.period} deste mapa</button></p>)}
|
||||
<p>{model.months}meses;resultado convertido:{model.source?.accountingProfitBeforeTax??'Indeterminado'} MZN. {model.pending.join(' | ')}</p><p>Meses parciais,limites anuais por corresponder e contagem de perdas41(5) afectam apenas os respectivos casos. Colecta não equivale ao saldo final a pagar.</p>
|
||||
</fieldset>;
|
||||
}
|
||||
@@ -7,7 +7,7 @@ export function SimulationIrpcSchedules({book,save}:{book:NormalBook;save:(b:Nor
|
||||
const asset=(id:string,p:Partial<NormalAsset>)=>patch({assets:s.assets.map(a=>a.id===id?{...a,...p}:a)});
|
||||
return<fieldset aria-label="Mapas complementares L6" className="space-y-3 rounded border p-3"><legend>Mapas complementares — regras ordinárias documentadas</legend>
|
||||
<p>Reutiliza o resultado e as linhas do plano. As somas brutas de cada tema devem corresponder à conferência do lucro tributável. Os efeitos com sinal ficam discriminados; uma dúvida não apaga as parcelas independentes. L7 conserva benefícios e casos especiais; L8 conserva o fecho anual.</p>
|
||||
<fieldset><legend>Período anual e correspondência dos meses</legend><label>Tipo de período<select aria-label="Tipo de período L6" value={s.period.kind} onChange={e=>patch({period:{...s.period,kind:e.target.value as NormalSchedules['period']['kind']}})}><option value="">Por identificar</option><option value="calendar">Ano civil — artigo7(1)</option><option value="authorised_annual">Anual diferente — autorização artigo7(2)</option><option value="ep_annual">Anual diferente de EP — comunicação artigo7(3)</option></select></label>{(['from','to','reference']as const).map(k=><label key={k} className="block">{({from:'Início do período AAAA-MM-DD',to:'Termo do período AAAA-MM-DD',reference:'Suporte do período e da correspondência mensal'})[k]}<input aria-label={'Período L6 '+k} value={s.period[k]} onChange={e=>patch({period:{...s.period,[k]:e.target.value}})}/></label>)}<p>Período anual diferente: documente autorização do artigo7(2) ou comunicação do EP do artigo7(3), início de aplicação e manutenção por cinco exercícios. O plano representa o período completo com termo em2026, emMZN. Períodos curtos e conversão fiscal anual de outra moeda ficam por corresponder.</p></fieldset>
|
||||
{book.periodsFx&&book.periodsFx.kind!=='annual'?<p>Período actual no mapa «Período fiscal e conversão do plano». O período anual anterior permanece conservado no histórico.</p>:<fieldset><legend>Período anual e correspondência dos meses</legend><label>Tipo de período<select aria-label="Tipo de período L6" value={s.period.kind} onChange={e=>patch({period:{...s.period,kind:e.target.value as NormalSchedules['period']['kind']}})}><option value="">Por identificar</option><option value="calendar">Ano civil — artigo7(1)</option><option value="authorised_annual">Anual diferente — autorização artigo7(2)</option><option value="ep_annual">Anual diferente de EP — comunicação artigo7(3)</option></select></label>{(['from','to','reference']as const).map(k=><label key={k} className="block">{({from:'Início do período AAAA-MM-DD',to:'Termo do período AAAA-MM-DD',reference:'Suporte do período e da correspondência mensal'})[k]}<input aria-label={'Período L6 '+k} value={s.period[k]} onChange={e=>patch({period:{...s.period,[k]:e.target.value}})}/></label>)}<p>Período anual diferente: documente autorização do artigo7(2) ou comunicação do EP do artigo7(3), início de aplicação e manutenção por cinco exercícios. O plano representa o período completo com termo em2026, emMZN. Períodos curtos e conversão fiscal anual de outra moeda ficam por corresponder.</p></fieldset>}
|
||||
<button type="button" onClick={()=>patch({rows:[...s.rows,newScheduleRow(crypto.randomUUID())]})}>Acrescentar regra complementar</button>
|
||||
{s.rows.map((r,n)=><fieldset key={r.id} className="rounded border p-2"><legend>Regra complementar {n+1}</legend>
|
||||
<label>Tratamento<select aria-label={'Tratamento complementar '+(n+1)} value={r.rule} onChange={e=>row(r.id,{rule:e.target.value as ScheduleRow['rule']})}><option value="">Por identificar</option>{Object.entries(scheduleRules).map(([k,v])=><option key={k} value={k}>{v[0]} — {v[2]}</option>)}</select></label>
|
||||
@@ -19,11 +19,11 @@ export function SimulationIrpcSchedules({book,save}:{book:NormalBook;save:(b:Nor
|
||||
<label className="block">Juros ordinários remanescentes MZN<input value={s.interest.amount} onChange={e=>patch({interest:{...s.interest,amount:e.target.value}})}/></label>
|
||||
<label className="block">Suporte dos juros e condições<input value={s.interest.reference} onChange={e=>patch({interest:{...s.interest,reference:e.target.value}})}/></label>
|
||||
<label>Condições dos juros<select aria-label="Condições dos juros ordinários" value={s.interest.conditions} onChange={e=>patch({interest:{...s.interest,conditions:e.target.value as ''|'yes'}})}><option value="">Informação em falta</option><option value="yes">Demonstradas no recorte ordinário</option></select></label></fieldset>
|
||||
<fieldset><legend>Amortizações fiscais — quotas constantes anuais</legend><p>Decreto72/2013, artigos3–7. Activo próprio sujeito a deperecimento, custo histórico, uso no início de2026, método uniforme, vida útil fiscal não excedida. Documente que não há regra sectorial específica prevalecente ou limitação especial. A categoria exige qualificação documentada; os itens genéricos9/9.1 só se aplicam quando não há taxa específica da tabelaI. Duodécimos, reavaliação, bens usados e recuperação de quotas antes tributadas ficam separados.</p>
|
||||
{!book.depreciation?<fieldset><legend>Amortizações fiscais — quotas constantes anuais</legend><p>Decreto72/2013, artigos3–7. Activo próprio sujeito a deperecimento, custo histórico, uso no início de2026, método uniforme, vida útil fiscal não excedida. Documente que não há regra sectorial específica prevalecente ou limitação especial. A categoria exige qualificação documentada; os itens genéricos9/9.1 só se aplicam quando não há taxa específica da tabelaI. Duodécimos, reavaliação, bens usados e recuperação de quotas antes tributadas ficam separados.</p>
|
||||
<label className="block">Reconciliação de todos os activos com a depreciação do plano<input value={s.assetsReference} onChange={e=>patch({assetsReference:e.target.value})}/></label>
|
||||
<button type="button" onClick={()=>patch({assets:[...s.assets,newNormalAsset(crypto.randomUUID())]})}>Acrescentar activo fiscal</button>
|
||||
{s.assets.map((a,n)=><fieldset key={a.id} className="rounded border p-2"><legend>Activo {n+1}</legend><label>Categoria fiscal<select aria-label={'Categoria activo '+(n+1)} value={a.category} onChange={e=>asset(a.id,{category:e.target.value as NormalAsset['category'],rate:e.target.value==='computer'?'25':e.target.value==='server'?'20':'',tableReference:e.target.value==='computer'?'Decreto72/2013 tabelaII grupo3 item9':e.target.value==='server'?'Decreto72/2013 tabelaII grupo3 item9.1':''})}><option value="">Por identificar</option><option value="computer">Computador, impressora, UPS — II/3/9 — 25%</option><option value="server">Servidor — II/3/9.1 — 20%</option><option value="other">Outra categoria — correspondência pendente</option></select></label>{([['description','Descrição'],['cost','Custo fiscal documentado MZN'],['residual','Valor residual MZN'],['rate','Taxa anual documentada %'],['accounting','Depreciação contabilística de2026 MZN'],['previousFiscal','Amortização fiscal acumulada anterior MZN'],['inUseFrom','Data de entrada em uso AAAA-MM-DD'],['tableReference','Diploma, tabela, código e taxa aplicáveis'],['reference','Documentos e condições do activo']]as const).map(([k,label])=><label key={k} className="block">{label}<input aria-label={label+' activo '+(n+1)} value={a[k]} onChange={e=>asset(a.id,{[k]:e.target.value})}/></label>)}
|
||||
<label>Condições do activo<select aria-label={'Condições activo '+(n+1)} value={a.conditions} onChange={e=>asset(a.id,{conditions:e.target.value as ''|'yes'})}><option value="">Informação em falta</option><option value="yes">Demonstradas no recorte anual constante</option></select></label><button type="button" onClick={()=>patch({assets:s.assets.filter(q=>q.id!==a.id)})}>Retirar activo {n+1} das entradas actuais</button></fieldset>)}</fieldset>
|
||||
<label>Condições do activo<select aria-label={'Condições activo '+(n+1)} value={a.conditions} onChange={e=>asset(a.id,{conditions:e.target.value as ''|'yes'})}><option value="">Informação em falta</option><option value="yes">Demonstradas no recorte anual constante</option></select></label><button type="button" onClick={()=>patch({assets:s.assets.filter(q=>q.id!==a.id)})}>Retirar activo {n+1} das entradas actuais</button></fieldset>)}</fieldset>:<p>Activos do mapa inicial conservados; a depreciação é agora reconciliada exclusivamente pelo mapa de tabelas, métodos, duodécimos e quotas anteriores abaixo.</p>}
|
||||
<label className="block">Suporte da perda fiscal do próprio exercício, se apurada<input value={s.currentLossReference} onChange={e=>patch({currentLossReference:e.target.value})}/></label><p>Perda actual conhecida: matéria colectável e colecta zero apenas depois de conferidas as restantes condições. Não é dedução a si própria nem saldo oficial de reporte. Informação insuficiente mantém os totais dependentes indeterminados.</p>
|
||||
</fieldset>;
|
||||
}
|
||||
|
||||
@@ -5,7 +5,7 @@ export type NormalAssessmentInput={version:1;treatment:''|'general_61_1'|'other'
|
||||
export const newNormalAssessmentInput=():NormalAssessmentInput=>({version:1,treatment:'',reference:''});
|
||||
export function validateNormalAssessment(i:NormalAssessmentInput){if(!i||i.version!==1||!['','general_61_1','other'].includes(i.treatment)||typeof i.reference!=='string')throw Error('Enquadramento da colecta não recuperável;original conservado.');}
|
||||
export type NormalAssessmentModel={input:NormalAssessmentInput;period:{year:string;from:string;to:string};classification:string;rate:FiscalFraction|null;taxableBase:FiscalFraction|null;colecta:FiscalFraction|null;centExact:boolean|null;pending:string[];rule:string;source:string;finalBalance:{scope:'L8';status:'not_calculated';payable:null;recoverable:null;reason:string}};
|
||||
export function calculateNormalAssessment(input:NormalAssessmentInput,base:FiscalFraction|null,context:{year:string;scope:string;currency:string;extended?:boolean;period?:{from:string;to:string}}):NormalAssessmentModel{
|
||||
export function calculateNormalAssessment(input:NormalAssessmentInput,base:FiscalFraction|null,context:{year:string;scope:string;currency:string;extended?:boolean;short?:boolean;period?:{from:string;to:string}}):NormalAssessmentModel{
|
||||
validateNormalAssessment(input);const pending:string[]=[],period={year:context.year,from:/^20\d{2}$/.test(context.year)?context.year+'-01-01':'',to:/^20\d{2}$/.test(context.year)?context.year+'-12-31':''};
|
||||
if(context.year!=='2026')pending.push('Taxa geral correspondida neste incremento apenas ao exercício2026;sem taxa transportada para outro período.');
|
||||
if(!(context.scope==='resident_general'||context.extended&&context.scope==='ep_general')||context.currency!=='MZN')pending.push('Colecta delimitada ao sujeito residente no regime geral emMZN;outros âmbitos por corresponder.');
|
||||
@@ -13,8 +13,8 @@ export function calculateNormalAssessment(input:NormalAssessmentInput,base:Fisca
|
||||
if(!input.reference.trim())pending.push('Identifique suporte ou pressuposto da aplicação da taxa geral ao caso;uma actividade semelhante não prova o regime.');
|
||||
if(base===null)pending.push('Matéria colectável actual indeterminada;lucro tributável não é substituto da base.');
|
||||
else if(!/^-?\d{1,80}$/.test(base.numerator)||!/^\d{1,80}$/.test(base.denominator)||BigInt(base.denominator)===0n||BigInt(base.numerator)<0n)pending.push('Matéria colectável deve ser um valor conhecido não negativo e reconciliado.');
|
||||
if(context.period){period.from=context.period.from;period.to=context.period.to;const start=new Date(period.from+'T00:00:00Z'),end=new Date(period.to+'T00:00:00Z');if(!Number.isFinite(+start)||!Number.isFinite(+end)||start.toISOString().slice(0,10)!==period.from||end.toISOString().slice(0,10)!==period.to||!period.from.endsWith('-01')||!period.to.startsWith('2026-'))pending.push('Período fiscal anual não reconciliado.');else{start.setUTCFullYear(start.getUTCFullYear()+1);start.setUTCDate(start.getUTCDate()-1);if(start.toISOString().slice(0,10)!==period.to)pending.push('Colecta anual: período de12 meses por reconciliar.');}}
|
||||
if(context.period){period.from=context.period.from;period.to=context.period.to;const start=new Date(period.from+'T00:00:00Z'),end=new Date(period.to+'T00:00:00Z');if(!Number.isFinite(+start)||!Number.isFinite(+end)||start.toISOString().slice(0,10)!==period.from||end.toISOString().slice(0,10)!==period.to||!period.from.endsWith('-01')||!period.to.startsWith('2026-'))pending.push('Período fiscal anual não reconciliado.');else if(context.short){if(period.from>period.to||!period.from.startsWith('2026-')||period.from===context.year+'-01-01'&&period.to===context.year+'-12-31')pending.push('Período curto por reconciliar.');}else{start.setUTCFullYear(start.getUTCFullYear()+1);start.setUTCDate(start.getUTCDate()-1);if(start.toISOString().slice(0,10)!==period.to)pending.push('Colecta anual: período de12 meses por reconciliar.');}}
|
||||
const rate=input.treatment==='general_61_1'&&context.year==='2026'?fraction(32n):null;
|
||||
const colecta=pending.length===0&&base!==null&&rate?fraction(BigInt(base.numerator)*32n,BigInt(base.denominator)*100n):null;
|
||||
return{input:structuredClone(input),period,classification:input.treatment==='general_61_1'?'Regime normal — taxa geral do artigo61(1)':input.treatment==='other'?'Caso especial fora deste recorte':'Enquadramento por identificar',rate,taxableBase:base,colecta,centExact:colecta?(BigInt(colecta.numerator)*100n)%BigInt(colecta.denominator)===0n:null,pending,rule:'CIRPC61(1)-general-2026/1',source:context.extended?'CIRPC61(1), taxa geral32% mantida pelos diplomas inventariados até Lei12/2025; período anual documentado com termo em2026. CIRPC15(1)a/c,7(1–3): sujeito residente ou resultado imputável aEP no regime geral; ano civil, autorização ou comunicação expressamente identificadas. Sem arredondamento fiscal ou saldoL8 presumidos.':'CIRPC Lei34/2007 art61(1),PDF17/p768(71):taxa geral32%. Lei4/2012 altera61(2);Lei20/2022 PDF1/p2731 mantém61(1),altera61(2) com termo31/12/2025;Lei12/2025 PDF18/20 não altera61(1),adita61-A para mais-valias,fora deste recorte. Exercício anual2026/MZN/residente geral,matéria colectável actual×32/100 em aritmética racional exacta. Sem arredondamento fiscal ou transcriçãoM20/M22 presumidos.',finalBalance:{scope:'L8',status:'not_calculated',payable:null,recoverable:null,reason:'Saldo final a pagar ou recuperar por determinar emL8:retenções,pagamentos e créditos do fecho anual não apurados nem abatidos à colecta neste incremento. Colecta não equivale ao saldo final.'}};
|
||||
return{input:structuredClone(input),period,classification:input.treatment==='general_61_1'?'Regime normal — taxa geral do artigo61(1)':input.treatment==='other'?'Caso especial fora deste recorte':'Enquadramento por identificar',rate,taxableBase:base,colecta,centExact:colecta?(BigInt(colecta.numerator)*100n)%BigInt(colecta.denominator)===0n:null,pending,rule:'CIRPC61(1)-general-2026/1',source:context.short?'CIRPC7(4)/61(1):período curto documentado em2026,matéria colectável efectiva ×32%;sem anualizar lucro/base ou proporcionalizar a taxa;saldo finalL8 indeterminado.':context.extended?'CIRPC61(1), taxa geral32% mantida pelos diplomas inventariados até Lei12/2025; período anual documentado com termo em2026. CIRPC15(1)a/c,7(1–3): sujeito residente ou resultado imputável aEP no regime geral; ano civil, autorização ou comunicação expressamente identificadas. Sem arredondamento fiscal ou saldoL8 presumidos.':'CIRPC Lei34/2007 art61(1),PDF17/p768(71):taxa geral32%. Lei4/2012 altera61(2);Lei20/2022 PDF1/p2731 mantém61(1),altera61(2) com termo31/12/2025;Lei12/2025 PDF18/20 não altera61(1),adita61-A para mais-valias,fora deste recorte. Exercício anual2026/MZN/residente geral,matéria colectável actual×32/100 em aritmética racional exacta. Sem arredondamento fiscal ou transcriçãoM20/M22 presumidos.',finalBalance:{scope:'L8',status:'not_calculated',payable:null,recoverable:null,reason:'Saldo final a pagar ou recuperar por determinar emL8:retenções,pagamentos e créditos do fecho anual não apurados nem abatidos à colecta neste incremento. Colecta não equivale ao saldo final.'}};
|
||||
}
|
||||
|
||||
@@ -15,13 +15,13 @@ export type NormalBaseModel={input:NormalBaseInput;taxableProfit:FiscalFraction|
|
||||
const zero=()=>fraction(0n);
|
||||
function amount(s:string){if(!/^\d{1,18}(?:\.\d{1,2})?$/.test(s))throw Error();return decimalFraction(s);}
|
||||
const units=(f:FiscalFraction)=>BigInt(f.numerator)*100n/BigInt(f.denominator);
|
||||
export function calculateNormalBase(input:NormalBaseInput,profit:FiscalFraction|null,year:string,currentLossReference?:string):NormalBaseModel{
|
||||
export function calculateNormalBase(input:NormalBaseInput,profit:FiscalFraction|null,year:string,currentLossReference?:string,short=false):NormalBaseModel{
|
||||
validateNormalBase(input);const i=structuredClone(input),pending:string[]=[],losses:NormalBaseModel['losses']=[];
|
||||
if(year!=='2026')pending.push('Matéria colectável delimitada ao exercício2026.');
|
||||
if(!/^\d{9}$/.test(i.subjectNuit)||!i.identityReference.trim())pending.push('Identifique NUIT e suporte do sujeito passivo do lucro e das perdas.');
|
||||
if(i.method!=='direct'||!i.methodReference.trim())pending.push('Método declarativo/directo e suporte por identificar;apuramento indirecto fora deste recorte (15(2),41(2)).');
|
||||
if(!profit)pending.push('Lucro tributável actual indeterminado;nenhuma dedução transforma informação em falta em zero.');
|
||||
else if(units(profit)<0n&&!currentLossReference?.trim())pending.push('Resultado fiscal negativo conhecido;tratamento da perda do próprio exercício fora deste recorte,sem matéria colectável zero ou reporte automático.');
|
||||
else if(BigInt(profit.numerator)<0n&&!currentLossReference?.trim())pending.push('Resultado fiscal negativo conhecido;tratamento da perda do próprio exercício fora deste recorte,sem matéria colectável zero ou reporte automático.');
|
||||
if(!i.lossesState||!i.lossesReference.trim())pending.push('Situação e completude das perdas anteriores em falta;sem ausência presumida.');
|
||||
if(i.lossesState==='absent'&&i.losses.length)pending.push('Ausência declarada de perdas contradiz os registos existentes;reconcilie sem apagar histórico.');
|
||||
if(i.lossesState==='known'&&!i.losses.length)pending.push('Perdas declaradas conhecidas sem discriminação por exercício.');
|
||||
@@ -45,13 +45,14 @@ export function calculateNormalBase(input:NormalBaseInput,profit:FiscalFraction|
|
||||
if(issues.length){r.status='indeterminate';r.reason=issues.join(' ');pending.push(l.year+': '+r.reason);}
|
||||
losses.push(r);
|
||||
}
|
||||
if(short&&losses.some(l=>l.requestedAmount&&BigInt(l.requestedAmount.numerator)>0n))pending.push('Período curto:sequência dos períodos posteriores por reconciliar;41(5) exclui da contagem o período de transição7(4)d inferior a6meses,sem agregar todos os períodos curtos ou presumir prazo por ano civil.');
|
||||
const requestedLosses=addFractions(losses.filter(l=>l.status==='eligible').map(l=>l.requestedAmount!));
|
||||
if(profit&&units(requestedLosses)>(units(profit)>0n?units(profit):0n))pending.push('Utilizações propostas excedem o lucro tributável disponível;reparta explicitamente sem criar base negativa ou escolher uma ordem de perdas.');
|
||||
if(profit&&BigInt(requestedLosses.numerator)*BigInt(profit.denominator)>(BigInt(profit.numerator)>0n?BigInt(profit.numerator)*BigInt(requestedLosses.denominator):0n))pending.push('Utilizações propostas excedem o lucro tributável disponível;reparta explicitamente sem criar base negativa ou escolher uma ordem de perdas.');
|
||||
let benefitDeduction:FiscalFraction|null=null;const benefit=i.benefits;
|
||||
if(!benefit.state||!benefit.reference.trim())pending.push('Benefícios/deduções à matéria colectável por identificar (15(4));créditos à colecta e retenções não são esta dedução.');
|
||||
else if(benefit.state==='absent'){if(benefit.amount.trim())pending.push('Ausência de benefícios contradiz montante preenchido.');else benefitDeduction=zero();}
|
||||
else{try{const value=amount(benefit.amount);if(units(value)!==0n)pending.push('Benefício de montante conhecido:regra,condições,limite e ordem próprios por implementar;sem subtracção livre do valor.');else benefitDeduction=value;}catch{pending.push('Montante conhecido das deduções por preencher ou inválido.');}}
|
||||
const ready=pending.length===0&&profit!==null,deductedLosses=ready?requestedLosses:null,taxableBase=ready?subtractFractions(subtractFractions(units(profit!)<0n?zero():profit!,requestedLosses),benefitDeduction!):null;
|
||||
const ready=pending.length===0&&profit!==null,deductedLosses=ready?requestedLosses:null,taxableBase=ready?subtractFractions(subtractFractions(BigInt(profit!.numerator)<0n?zero():profit!,requestedLosses),benefitDeduction!):null;
|
||||
for(const l of losses){if(l.available){l.deducted=ready?(l.status==='eligible'?l.requestedAmount!:zero()):null;l.remaining=l.deducted?subtractFractions(l.available,l.deducted):null;}}
|
||||
return{input:i,taxableProfit:profit,requestedLosses,deductedLosses,benefitDeduction,taxableBase,losses,pending,source:'CIRPC15(1)a/15(2–4),41(1–7),Lei34/2007 PDF5/p768(59),PDF12/p768(66). Recorte2026,residente geral,método declarativo,perdas próprias em exercícios anuais ordinários;cinco exercícios posteriores,sem transferência41-A,regimes especiais ou benefícios positivos implementados. Pedido de utilização expresso e limitado ao saldo/lucro;semFIFO obrigatório ou limite percentual inventado. Matéria colectável simulada,não colecta/imposto a pagar,semM20/M22/submissão ou consumo persistente do saldo oficial.'};
|
||||
}
|
||||
|
||||
@@ -0,0 +1,82 @@
|
||||
import {addFractions,fraction,subtractFractions,fractionPresentation,type FiscalFraction} from './fiscal-rational.ts';
|
||||
import {fiscalMoney} from './irpc-normal-schedules.ts';
|
||||
export const normalCostsVersion='IRPC-normal-adjustments/6';
|
||||
export const costRules={
|
||||
allowance:['Ajudas de custo/deslocação em viatura própria','expenseCorrections','36(1)e'],
|
||||
representation:['Despesas de representação','expenseCorrections','36(1)f/36(3)'],
|
||||
advertising:['Publicidade ordinária — limite anual partilhado','expenseCorrections','36(1)n,Lei20/2009'],
|
||||
vehicle:['Outros encargos com viatura ligeira de passageiros','expenseCorrections','36(4)'],
|
||||
fuel:['Combustível — prova do activo/locação e consumo normal','expenseCorrections','36(1)i/36(4)'],
|
||||
rental:['Aluguer sem condutor — parcela de quota não aceite documentada','expenseCorrections','36(1)h/36(4)'],
|
||||
credit:['Provisão/perda por imparidade de créditos ordinários','expenseCorrections','28(1)a/29'],
|
||||
stock:['Provisão/perda por imparidade de existências','expenseCorrections','28(1)b'],
|
||||
litigation:['Provisão para processo judicial em curso','expenseCorrections','28(1)c'],
|
||||
provision_reversal:['Reversão de provisão antes deduzida','incomeCorrections','28(2)'],
|
||||
taxed_reversal:['Reversão contabilística de provisão antes tributada','incomeCorrections','17/28;sem dupla tributação da parcela comprovada'],
|
||||
prior_cost:['Custo de exercício anterior incluído no resultado actual','timing','18(2)'],
|
||||
prior_income:['Proveito de exercício anterior incluído no resultado actual','timing','18(2)'],
|
||||
estimated_work_loss:['Perda estimada em obra plurianual em curso','expenseCorrections','36(1)m,Lei20/2009'],
|
||||
work:['Resultado de obra plurianual — percentagem/encerramento','timing','19(1–6)'],
|
||||
}as const;
|
||||
export type CostRule=keyof typeof costRules;
|
||||
export type CostRow={id:string;rule:''|CostRule;document:string;line:string;amount:string;sourceCode:string;reference:string;conditions:''|'yes';facts:Record<string,string>};
|
||||
export type NormalCostsInput={version:1;rows:CostRow[];advertisingReference:string;salesOrdinary:''|'yes';creditBase:string;creditPrevious:string;creditReference:string;creditRegime:''|'ordinary'|'regulated'};
|
||||
export const newNormalCosts=():NormalCostsInput=>({version:1,rows:[],advertisingReference:'',salesOrdinary:'',creditBase:'',creditPrevious:'',creditReference:'',creditRegime:''});
|
||||
export const newCostRow=(id:string):CostRow=>({id,rule:'',document:'',line:'',amount:'',sourceCode:'',reference:'',conditions:'',facts:{}});
|
||||
export function validateNormalCosts(i:NormalCostsInput){
|
||||
if(!i||i.version!==1||!Array.isArray(i.rows)||['advertisingReference','creditBase','creditPrevious','creditReference'].some(k=>typeof i[k as 'creditBase']!=='string')||!['','yes'].includes(i.salesOrdinary)||!['','ordinary','regulated'].includes(i.creditRegime))throw Error('Mapa de custos/provisões/periodização não recuperável.');
|
||||
if(new Set(i.rows.map(r=>r.id)).size!==i.rows.length)throw Error('Identificador repetido no mapa de custos.');
|
||||
for(const r of i.rows)if(!r||['id','rule','document','line','amount','sourceCode','reference','conditions'].some(k=>typeof r[k as 'id']!=='string')||r.rule!==''&&!Object.hasOwn(costRules,r.rule)||!['','yes'].includes(r.conditions)||!r.facts||typeof r.facts!=='object'||Array.isArray(r.facts)||Object.values(r.facts).some(v=>typeof v!=='string'))throw Error('Linha de custos/provisões/periodização não recuperável.');
|
||||
}
|
||||
type Source={currency:string;accountingLines:Array<{code:string;total:string;accountingEffect:string}>;cashSchedule?:Array<{salesReceivablesBalance:string|null;openingReceivablesBalance:string}>};
|
||||
export type CostClaim={document:string;line:string;sourceCode:string;amount:string};
|
||||
const z=()=>fraction(0n),cmp=(a:FiscalFraction,b:FiscalFraction)=>BigInt(a.numerator)*BigInt(b.denominator)-BigInt(b.numerator)*BigInt(a.denominator);
|
||||
const mul=(a:FiscalFraction,n:bigint,d=1n)=>fraction(BigInt(a.numerator)*n,BigInt(a.denominator)*d);
|
||||
const min=(...v:FiscalFraction[])=>v.reduce((a,b)=>cmp(a,b)<0n?a:b),max0=(v:FiscalFraction)=>cmp(v,z())<0n?z():v;
|
||||
const costMoney=(v:FiscalFraction|null)=>{if(!v)return'Indeterminado';const p=fractionPresentation(v);return(p.approximate?'≈':'')+p.decimal+' MZN'+(p.approximate?' (exacto '+v.numerator+'/'+v.denominator+')':'');};
|
||||
const identity=(r:{document:string;line:string})=>r.document.trim()+'\u0000'+r.line.trim();
|
||||
export function reusableCreditBalance(source:Source|null){const l=source?.cashSchedule?.at(-1);if(!l||l.salesReceivablesBalance===null)return null;try{return addFractions([fiscalMoney(l.salesReceivablesBalance),fiscalMoney(l.openingReceivablesBalance)]);}catch{return null;}}
|
||||
export function calculateNormalCosts(input:NormalCostsInput,source:Source|null,existing:CostClaim[],period:{from:string;to:string},short=false){
|
||||
validateNormalCosts(input);const rows=input.rows,claims=rows.flatMap(r=>[{...r},...(r.rule==='work'?[{id:r.id,document:r.document,line:r.line+'/custos',sourceCode:r.facts.costSource??'',amount:r.facts.bookCost??''}]:[])]),pending:string[]=[];
|
||||
const sourceAmount=(code:string,effect:string)=>{const l=source?.accountingLines.find(l=>l.code===code);if(!l||l.accountingEffect!==effect)throw Error('Seleccione uma linha contabilística compatível.');return fiscalMoney(l.total);};
|
||||
const pool=(rule:CostRule)=>addFractions(rows.filter(r=>r.rule===rule).map(r=>fiscalMoney(r.amount)));
|
||||
const pools:Record<string,{label:string;base:FiscalFraction;previous:FiscalFraction|null;annualLimit:FiscalFraction;accumulatedLimit:FiscalFraction|null;reference:string}>={};
|
||||
const results=rows.map(r=>{const issues:string[]=[],rule=r.rule?costRules[r.rule]:null,topic=rule?.[1]??'',f=r.facts;let amount:FiscalFraction|null=null,accepted:FiscalFraction|null=null,adjustment:FiscalFraction|null=null,limit:FiscalFraction|null=null;const details:string[]=[];
|
||||
const a=(key:string)=>{if(!f[key]?.trim())throw Error('Falta parâmetro: '+(factLabels[key]??key));return fiscalMoney(f[key]);};
|
||||
const yesno=(key:string)=>{if(!['yes','no'].includes(f[key]))throw Error('Falta condição documentada: '+(factLabels[key]??key));return f[key]==='yes';};
|
||||
const ref=(key:string)=>{if(!f[key]?.trim())throw Error('Falta suporte: '+(factLabels[key]??key));};
|
||||
const balance=()=>{ref('balanceKey');if(rows.some(q=>q!==r&&q.facts.balanceKey===f.balanceKey))throw Error('Saldo/objecto fiscal repetido entre linhas; agregue as parcelas no mesmo mapa para não reutilizar o limite.');return a('previous');};
|
||||
const checkOrigin=(code:string,value:FiscalFraction,effect:string)=>{if(cmp(value,z())===0n&&!code)return;if(['depreciation','interest_expense'].includes(code))throw Error('Parcela de amortização/juros exige reconciliação própria com o mapa existente; sem dupla qualificação neste incremento.');const total=sourceAmount(code,effect);const allocated=addFractions([...existing,...claims].filter(c=>c.sourceCode===code).map(c=>fiscalMoney(c.amount)));if(cmp(allocated,total)>0n)throw Error('Parcelas dos mapas excedem a linha de origem; reconcilie sem duplicar ajustamentos.');};
|
||||
if(!rule||!r.document.trim()||!r.line.trim()||!r.reference.trim()||r.conditions!=='yes')issues.push('Regra, documento/linha, condições e suporte em falta.');
|
||||
if([...existing,...claims.filter(c=>c!==r&&c.id!==r.id)].some(c=>identity(c)===identity(r)))issues.push('Documento/linha repetidos entre mapas.');
|
||||
if(claims.filter(c=>identity(c)===identity(r)).length>1)issues.push('Documento/linha repetidos no mapa.');
|
||||
if(short&&['credit','advertising'].includes(r.rule))issues.push('Limite anual neste período curto por corresponder;sem proporcionalização ou anualização presumida.');
|
||||
if(source?.currency!=='MZN'||!period.to.startsWith('2026-'))issues.push('Recorte anual emMZN com termo em2026 por reconciliar.');
|
||||
try{amount=fiscalMoney(r.amount);if(cmp(amount,z())<=0n&&r.rule!=='work')throw Error('Identifique parcela positiva conhecida.');
|
||||
const isIncome=['provision_reversal','taxed_reversal','prior_income','work'].includes(r.rule);const omitted=r.rule==='provision_reversal'&&f.inResult==='no';if(!omitted)checkOrigin(r.sourceCode,amount,isIncome?'income':'expense');else if(r.sourceCode)throw Error('Reversão não incluída no resultado não deve repetir uma linha de proveitos.');
|
||||
switch(r.rule){
|
||||
case 'allowance':{const billed=a('billed'),taxed=a('taxedNotBilled');if(cmp(addFractions([billed,taxed]),amount)>0n)throw Error('Parcelas facturadas e tributadas emIRPS não podem sobrepor-se ou exceder o encargo.');const limited=subtractFractions(subtractFractions(amount,billed),taxed);adjustment=mul(limited,1n,2n);accepted=subtractFractions(amount,adjustment);limit=mul(limited,1n,2n);details.push('50% só da parcela não facturada a clientes nem tributada emIRPS; parcelas mutuamente exclusivas.');break;}
|
||||
case 'representation':accepted=mul(amount,1n,5n);adjustment=subtractFractions(amount,accepted);details.push('20% aceite;80% acrescido. Eventual tributação autónoma não calculada, âmbitoL7.');break;
|
||||
case 'advertising':{if(f.campaign!=='no')throw Error('Campanha de lançamento com horizonte superior a um ano: periodização36-A e articulação do limite não correspondidas; não tratar como publicidade ordinária.');if(input.salesOrdinary!=='yes'||!input.advertisingReference.trim())throw Error('Confirme completude da publicidade e correspondência do volume de vendas normal do exercício à receita declarada.');const total=pool('advertising');limit=mul(sourceAmount('revenue','income'),1n,100n);pools.advertising={label:'Publicidade — limite anual partilhado',base:sourceAmount('revenue','income'),previous:null,annualLimit:limit,accumulatedLimit:null,reference:input.advertisingReference};const eligible=min(total,limit);accepted=fraction(BigInt(amount.numerator)*BigInt(eligible.numerator)*BigInt(total.denominator),BigInt(amount.denominator)*BigInt(eligible.denominator)*BigInt(total.numerator));adjustment=subtractFractions(amount,accepted);details.push('Limite único anual1% das vendas normais; repartição aritmética proporcional entre parcelas para a simulação, sem ordem fiscal obrigatória.');break;}
|
||||
case 'vehicle':{if(!yesno('passenger')){accepted=amount;details.push('Viatura fora da categoria ligeira de passageiros;36(4)não aplicado, restantes condições ordinárias documentadas.');}else{accepted=yesno('publicOrRental')?amount:mul(amount,1n,2n);details.push('50% dos outros encargos de passageiros, excepto serviço público de transportes/locação na actividade normal; não inclui quotas, aluguer sem condutor ou combustível já discriminados.');}adjustment=subtractFractions(amount,accepted);break;}
|
||||
case 'fuel':case 'rental':{let eligible:FiscalFraction;if(r.rule==='fuel'){eligible=a('supportedNormal');if(cmp(eligible,amount)>0n)throw Error('Consumo normal comprovado excede o encargo.');details.push('36i: parcela ligada a activo próprio/locado e consumo normal comprovados.');}else{const excluded=a('nonAcceptedQuota');ref('quotaReference');if(cmp(excluded,amount)>0n)throw Error('Parcela de quota não aceite excede a renda.');eligible=subtractFractions(amount,excluded);details.push('36h: reutiliza parcela de quota não aceite documentada; o portal não apura automaticamente essa quota de viatura.');}if(yesno('passenger')&&!yesno('publicOrRental')){if(cmp(eligible,amount)!==0n)throw Error('Articulação da parcela excluída por36h/i com os50% de36(4) ainda não correspondida; este caso combinado fica pendente, sem somar nem repartir correcções por presunção.');eligible=mul(eligible,1n,2n);details.push('36(4):50% do encargo; sem parcela excluída concorrente porh/i.');}accepted=eligible;adjustment=subtractFractions(amount,accepted);break;}
|
||||
case 'credit':{if(input.creditRegime!=='ordinary')throw Error('Regime das provisões por identificar ou sujeito a supervisão financeira/seguradora28d; sem limites29 aplicados por aproximação.');if(!input.creditReference.trim())throw Error('Saldo de créditos ordinários e provisão fiscal anterior por documentar.');if(!input.creditBase.trim())throw Error('Créditos ordinários existentes no fim do exercício em falta.');if(!input.creditPrevious.trim())throw Error('Provisão fiscal anterior dos créditos em falta; não presumir zero.');const base=fiscalMoney(input.creditBase),previous=fiscalMoney(input.creditPrevious),total=pool('credit'),annual=mul(base,15n,1000n),accumulated=mul(base,6n,100n);pools.credit={label:'Créditos — limites anual e acumulado',base,previous,annualLimit:annual,accumulatedLimit:accumulated,reference:input.creditReference};if(cmp(previous,accumulated)>0n)throw Error('Provisão fiscal anterior excede6% dos créditos finais; reconcilie subsistência/reversão28(2), sem saldo presumido.');limit=min(annual,subtractFractions(accumulated,previous));const eligible=min(total,limit);accepted=fraction(BigInt(amount.numerator)*BigInt(eligible.numerator)*BigInt(total.denominator),BigInt(amount.denominator)*BigInt(eligible.denominator)*BigInt(total.numerator));adjustment=subtractFractions(amount,accepted);details.push('29:1,5% anual,6% acumulado sobre créditos da actividade normal existentes no fim; saldo fiscal anterior conhecido. Repartição proporcional do limite único, sem consumir saldo oficial.');break;}
|
||||
case 'stock':case 'litigation':{let previous:FiscalFraction;if(r.rule==='litigation'){if(!yesno('caseOngoing')){accepted=z();adjustment=amount;details.push('Não há processo judicial em curso; provisão não elegível por28c.');break;}if(!yesno('chargeDeductible')){accepted=z();adjustment=amount;details.push('Obrigação não daria lugar a custo dedutível; provisão não aceite por28c.');break;}}else if(!yesno('lossObserved')){accepted=z();adjustment=amount;details.push('Perda de valor não efectivamente observada; estimativa não aceite por28b.');break;}previous=balance();limit=a(r.rule==='stock'?'observedLoss':'obligation');if(cmp(previous,limit)>0n)throw Error('Saldo fiscal anterior excede a cobertura actual; reconcilie a reversão28(2).');accepted=min(amount,subtractFractions(limit,previous));adjustment=subtractFractions(amount,accepted);details.push(r.rule==='stock'?'28b:limite das perdas efectivamente observadas, incluindo saldo anterior.':'28c:obrigações de processo judicial em curso que seriam custos dedutíveis, com saldo anterior reconciliado.');break;}
|
||||
case 'provision_reversal':case 'taxed_reversal':{const previous=balance();if(cmp(amount,previous)>0n)throw Error('Reversão excede a parcela fiscal anterior demonstrada.');if(!yesno('eventEnded'))throw Error('Evento não cessou/não houve utilização diferente; fundamento da reversão por corresponder.');const inResult=yesno('inResult');if(r.rule==='taxed_reversal'&&!inResult)throw Error('Só excluir proveito de reversão já incluído na contabilidade e antes não deduzido.');accepted=amount;adjustment=r.rule==='taxed_reversal'?mul(amount,-1n):inResult?z():amount;details.push(r.rule==='taxed_reversal'?'Parcela antes tributada comprovada; exclui a reversão contabilística sem duplicar dedução.':'28(2):proveito da provisão antes deduzida; só acresce quando ainda não incluído no resultado.');break;}
|
||||
case 'prior_cost':case 'prior_income':{if(!/^20\d{2}$/.test(f.originalYear)||Number(f.originalYear)>=2026)throw Error('Exercício de origem deve ser anterior ao exercício actual.');ref('closingEvidence');const unknown=yesno('unknownAtClose');accepted=unknown?amount:z();adjustment=unknown?z():r.rule==='prior_cost'?amount:mul(amount,-1n);details.push(unknown?'18(2):imprevisível ou manifestamente desconhecido no encerramento anterior; imputável ao actual.':'18(2):conhecido/previsível no encerramento anterior; excluído do actual, sem alterar declarações/históricos anteriores.');break;}
|
||||
case 'estimated_work_loss':accepted=z();adjustment=amount;details.push('36m:perda meramente estimada em obra em curso não dedutível; custo efectivo não confundido com estimativa.');break;
|
||||
case 'work':{const price=a('price'),totalCost=a('totalCost'),incurred=a('incurred'),priorRevenue=a('priorRevenue'),priorCost=a('priorCost'),bookCost=a('bookCost');ref('projectKey');if(rows.some(q=>q!==r&&q.facts.projectKey===f.projectKey))throw Error('Obra repetida; agregue os valores acumulados sem duplicar resultados.');checkOrigin(f.costSource??'',bookCost,'expense');if(cmp(totalCost,z())<=0n||cmp(incurred,totalCost)>0n||cmp(priorCost,incurred)>0n||cmp(priorRevenue,price)>0n)throw Error('Preço, custo total, incorrido e valores fiscais anteriores incoerentes.');if(!yesno('consistentMethod'))throw Error('Mudança de critério exige correspondência à autorização19(6).');const mandatory=yesno('partialBilling')||yesno('ownFractionalDelivery');let revenue:FiscalFraction,cost:FiscalFraction;
|
||||
if(f.method==='percentage'){revenue=fraction(BigInt(price.numerator)*BigInt(incurred.numerator)*BigInt(totalCost.denominator),BigInt(price.denominator)*BigInt(incurred.denominator)*BigInt(totalCost.numerator));cost=incurred;}
|
||||
else if(f.method==='closing'){if(mandatory)throw Error('Facturação parcial com acabamento correspondente/entrega fraccionada: critério da percentagem obrigatório19(2).');const concluded=cmp(mul(incurred,100n),mul(totalCost,95n))>=0n||yesno('publicReception');revenue=concluded?price:z();cost=concluded?incurred:z();}
|
||||
else throw Error('Seleccione percentagem de acabamento ou encerramento.');if(cmp(priorRevenue,revenue)>0n||cmp(priorCost,cost)>0n)throw Error('Acumulados fiscais anteriores excedem o resultado reconhecível pelo critério; reconcilie sem correcção retrospectiva presumida.');const deferred=a('deferredReceipt');if(cmp(deferred,z())!==0n)throw Error('Receita antecipada19(5) de montante não zero exige correspondência própria.');const currentRevenue=subtractFractions(revenue,priorRevenue),currentCost=subtractFractions(cost,priorCost);accepted=currentCost;adjustment=addFractions([subtractFractions(currentRevenue,amount),subtractFractions(bookCost,currentCost)]);limit=currentRevenue;details.push('19:grau=incorrido/custo total;valores fiscais do exercício obtidos dos acumulados menos o já reconhecido. Proveito fiscal corrente:'+costMoney(currentRevenue)+';custo fiscal corrente:'+costMoney(currentCost)+';sem imposto/pagamento ou perda estimada presumidos.');break;}
|
||||
default:throw Error('Categoria por identificar.');
|
||||
}
|
||||
}catch(e){issues.push(e instanceof Error?e.message:String(e));accepted=null;adjustment=null;}
|
||||
if(issues.length){accepted=null;adjustment=null;pending.push((r.document||r.id)+': '+issues.join(' '));}return{...structuredClone(r),topic,amountValue:amount,accepted,adjustment,limit,status:issues.length?'indeterminate' as const:'calculated' as const,reason:issues.join(' ')||details.join(' '),ruleSource:rule?'CIRPC'+rule[2]:''};
|
||||
});
|
||||
return{input:structuredClone(input),rows:results,pools,pending,effects:results.map(r=>({id:r.id,topic:r.topic,amount:r.amountValue,effect:r.adjustment,reason:r.reason})),net:addFractions(results.flatMap(r=>r.adjustment?[r.adjustment]:[])),source:'CIRPC18(2)/19/28/29/36;Lei34/2007,Lei20/2009,alterações4/2012 e19/2013 e diplomas posteriores inventariados. Recorte2026/MZN,condições documentadas,sem efeitos retroactivos ou consumo de saldos oficiais;L7/L8 separados.'};
|
||||
}
|
||||
export type NormalCostsModel=ReturnType<typeof calculateNormalCosts>;
|
||||
const factLabels:Record<string,string>={billed:'Facturado a clientes',taxedNotBilled:'Tributado emIRPS e não facturado',campaign:'Campanha plurianual',passenger:'Ligeira de passageiros',publicOrRental:'Serviço público/locação na actividade normal',supportedNormal:'Consumo normal comprovado',nonAcceptedQuota:'Quota não aceite documentada',quotaReference:'Suporte da quota',balanceKey:'Identificação do saldo/objecto',previous:'Parcela fiscal anterior',lossObserved:'Perda efectivamente observada',observedLoss:'Perda total observada',caseOngoing:'Processo judicial em curso',chargeDeductible:'Obrigação fiscalmente dedutível',obligation:'Obrigação coberta',eventEnded:'Evento cessou/utilização diferente',inResult:'Incluído no resultado',originalYear:'Exercício de origem',unknownAtClose:'Imprevisível/desconhecido no encerramento',closingEvidence:'Suporte do encerramento',projectKey:'Obra',method:'Critério',price:'Preço',totalCost:'Custo total estimado',incurred:'Custos incorporados acumulados',priorRevenue:'Proveitos fiscais anteriores',priorCost:'Custos fiscais anteriores',costSource:'Origem dos custos',bookCost:'Custo contabilizado corrente',partialBilling:'Facturação parcial com acabamento correspondente',ownFractionalDelivery:'Venda/entrega fraccionada por conta própria',consistentMethod:'Critério uniforme e mantido',publicReception:'Recepção provisória pública',deferredReceipt:'Receita antecipada proposta'};
|
||||
const originLabels:Record<string,string>={revenue:'Receitas do plano',cost_of_sales:'Custo das vendas',operating_expenses:'Despesas operacionais',personnel:'Pessoal',depreciation:'Depreciação contabilística',interest_expense:'Juros financeiros'};
|
||||
export function normalCostReport(m:NormalCostsModel):Array<[string,string,string,string]>{const money=costMoney;return[['IRPC normal — L6','Custos com limites, provisões e periodização',`Efeito líquido das parcelas resolvidas:${money(m.net)};${m.pending.join(' | ')}`,m.source],...Object.values(m.pools).map(p=>['IRPC normal — L6',p.label,`Base documentada:${money(p.base)};limite anual:${money(p.annualLimit)};saldo fiscal anterior:${p.previous?money(p.previous):'Não aplicável'};limite acumulado:${p.accumulatedLimit?money(p.accumulatedLimit):'Não aplicável'};limite partilhado entre todas as parcelas, sem consumo do saldo oficial.`,p.reference]as[string,string,string,string]),...m.rows.map(r=>['IRPC normal — L6',(r.rule?costRules[r.rule][0]:'Categoria por identificar')+' — '+r.document+'/'+r.line,`Estado:${r.status==='calculated'?'Calculado no recorte':'Informação insuficiente'};montante identificado:${money(r.amountValue)};parcela aceite/custo fiscal ou reversão:${money(r.accepted)};limite/base ou proveito fiscal:${r.limit?money(r.limit):r.status==='calculated'?'Sem limite monetário próprio; ver regra':'Em falta/não aplicável à parcela'};ajustamento com sinal:${money(r.adjustment)};${r.reason}`,`${r.ruleSource};${r.reference};origem:${originLabels[r.sourceCode]??'Fora do resultado, documentado'};parâmetros:${Object.entries(r.facts).filter(([k])=>factLabels[k]).map(([k,v])=>factLabels[k]+': '+(v==='yes'?'Sim':v==='no'?'Não':v==='percentage'?'Percentagem de acabamento':v==='closing'?'Encerramento':originLabels[v]??(v||'Em falta'))).join('; ')};sem alteração do histórico ou saldo oficial.`]as[string,string,string,string])];}
|
||||
@@ -0,0 +1,84 @@
|
||||
import {addFractions,decimalFraction,fraction,subtractFractions,fractionPresentation,type FiscalFraction} from './fiscal-rational.ts';
|
||||
import {fiscalMoney,type NormalAsset} from './irpc-normal-schedules.ts';
|
||||
export const normalDepreciationVersion='IRPC-normal-adjustments/7';
|
||||
export const depreciationCatalog={
|
||||
computer:{label:'Computadores, impressoras, UPS e material informático',table:'II',code:'3/9',rate:'25',kind:'equipment',page:17},
|
||||
server:{label:'Servidores',table:'II',code:'3/9.1',rate:'20',kind:'equipment',page:17},
|
||||
security:{label:'Equipamento de vigilância e segurança',table:'II',code:'3/23',rate:'20',kind:'equipment',page:18},
|
||||
machine:{label:'Máquinas não especificadas',table:'II',code:'3/22',rate:'10',kind:'equipment',page:18},
|
||||
furniture:{label:'Mobiliário',table:'II',code:'5/7',rate:'10',kind:'furniture',page:18},
|
||||
commercial_building:{label:'Edifícios comerciais e administrativos',table:'II',code:'1/2.2',rate:'2',kind:'building',page:16},
|
||||
passenger_vehicle:{label:'Veículos automóveis ligeiros e mistos',table:'II',code:'4/9.2',rate:'25',kind:'vehicle',page:18},
|
||||
software:{label:'Programas de computadores',table:'II',code:'5/8',rate:'25',kind:'software',page:18},
|
||||
hotel_decoration:{label:'Decorações interiores — hotéis e actividades similares, classe84.2',table:'I',code:'84.2/B',rate:'20',kind:'furniture',page:16},
|
||||
laundry_machine:{label:'Maquinaria específica de lavandarias/tinturarias',table:'I',code:'84.3/A',rate:'12.5',kind:'equipment',page:16},
|
||||
}as const;
|
||||
export type DepreciationCategory=keyof typeof depreciationCatalog;
|
||||
export type DepreciationAsset={id:string;assetKey:string;description:string;document:string;line:string;category:''|DepreciationCategory|'other'|'nondepreciable';valuation:''|'historical_new'|'used'|'revalued'|'other';specificRate:''|'yes'|'no';method:''|'constant'|'declining'|'low_value';rate:string;factor:string;timing:''|'annual'|'months';start:string;exitState:''|'absent'|'known';exitDate:string;cost:string;land:string;residual:string;accounting:string;previousAccounting:string;previousFiscal:string;priorAvailable:string;previousReference:string;newTangible:''|'yes'|'no';consistentMethod:''|'yes'|'no';switchToStraight:''|'yes'|'no';priorFullQuotas:''|'yes'|'no';vehicleException:''|'yes'|'no';limitedRights:''|'yes'|'no';individual:''|'yes'|'no';conditions:''|'yes';reference:string};
|
||||
export type NormalDepreciationInput={version:1;completenessReference:string;assets:DepreciationAsset[]};
|
||||
export const newNormalDepreciation=():NormalDepreciationInput=>({version:1,completenessReference:'',assets:[]});
|
||||
export const newDepreciationAsset=(id:string):DepreciationAsset=>({id,assetKey:'',description:'',document:'',line:'',category:'',valuation:'',specificRate:'',method:'',rate:'',factor:'',timing:'',start:'',exitState:'',exitDate:'',cost:'',land:'',residual:'',accounting:'',previousAccounting:'',previousFiscal:'',priorAvailable:'',previousReference:'',newTangible:'',consistentMethod:'',switchToStraight:'',priorFullQuotas:'',vehicleException:'',limitedRights:'',individual:'',conditions:'',reference:''});
|
||||
export function reuseNormalAssets(assets:NormalAsset[]):NormalDepreciationInput{return{version:1,completenessReference:'',assets:assets.map(a=>({...newDepreciationAsset(a.id),assetKey:a.id,description:a.description,category:a.category,document:a.reference,line:a.id,method:'constant',timing:'annual',specificRate:'no',consistentMethod:'yes',conditions:a.conditions,rate:a.rate,cost:a.cost,residual:a.residual,accounting:a.accounting,previousFiscal:a.previousFiscal,start:a.inUseFrom,reference:a.reference}))};}
|
||||
export function validateNormalDepreciation(i:NormalDepreciationInput){
|
||||
if(!i||i.version!==1||typeof i.completenessReference!=='string'||!Array.isArray(i.assets)||new Set(i.assets.map(a=>a.id)).size!==i.assets.length)throw Error('Mapa de amortizações não recuperável.');
|
||||
for(const a of i.assets){if(!a||Object.keys(newDepreciationAsset('')).some(k=>typeof a[k as keyof DepreciationAsset]!=='string')||!['','other','nondepreciable',...Object.keys(depreciationCatalog)].includes(a.category)||!['','historical_new','used','revalued','other'].includes(a.valuation)||!['','constant','declining','low_value'].includes(a.method)||!['','annual','months'].includes(a.timing)||!['','absent','known'].includes(a.exitState)||!['','yes'].includes(a.conditions)||['specificRate','newTangible','consistentMethod','switchToStraight','priorFullQuotas','vehicleException','limitedRights','individual'].some(k=>!['','yes','no'].includes(a[k as 'specificRate'])))throw Error('Activo ou parâmetros de amortização não recuperáveis.');}
|
||||
}
|
||||
const zero=()=>fraction(0n),cmp=(a:FiscalFraction,b:FiscalFraction)=>BigInt(a.numerator)*BigInt(b.denominator)-BigInt(b.numerator)*BigInt(a.denominator);
|
||||
const min=(...a:FiscalFraction[])=>a.reduce((v,w)=>cmp(v,w)<0n?v:w),positive=(a:FiscalFraction)=>cmp(a,zero())<0n?zero():a;
|
||||
const multiply=(a:FiscalFraction,b:FiscalFraction)=>fraction(BigInt(a.numerator)*BigInt(b.numerator),BigInt(a.denominator)*BigInt(b.denominator));
|
||||
const ratio=(a:FiscalFraction,b:FiscalFraction)=>fraction(BigInt(a.numerator)*BigInt(b.denominator),BigInt(a.denominator)*BigInt(b.numerator));
|
||||
const date=(v:string)=>/^20\d{2}-\d{2}-\d{2}$/.test(v)&&Number.isFinite(Date.parse(v))&&new Date(v).toISOString().slice(0,10)===v;
|
||||
const month=(v:string)=>Number(v.slice(0,4))*12+Number(v.slice(5,7))-1;
|
||||
const show=(v:FiscalFraction|null)=>{if(!v)return'Indeterminado';const p=fractionPresentation(v);return(p.approximate?'≈':'')+p.decimal+' MZN'+(p.approximate?' (exacto '+v.numerator+'/'+v.denominator+')':'');};
|
||||
export function calculateNormalDepreciation(input:NormalDepreciationInput,source:{currency:string;accountingLines:Array<{code:string;total:string}>}|null,period:{from:string;to:string},claims:Array<{sourceCode:string;document:string;line:string;amount:string}>,short=false){
|
||||
validateNormalDepreciation(input);const pending:string[]=[];
|
||||
if(!input.completenessReference.trim())pending.push('Reconciliação integral dos activos e quotas anteriores com a depreciação da origem em falta.');
|
||||
if(source?.currency!=='MZN'||!date(period.from)||!date(period.to)||!period.to.startsWith('2026-')||(!short&&month(period.to)-month(period.from)!==11||short&&(month(period.to)<month(period.from)||month(period.to)-month(period.from)>=11)))pending.push('Período anual emMZN com termo em2026 por reconciliar; períodos curtos permanecem separados.');
|
||||
const assets=input.assets.map(a=>{const issues:string[]=[],notes:string[]=[];let accounting:FiscalFraction|null=null,basis:FiscalFraction|null=null,taxBasis:FiscalFraction|null=null,quota:FiscalFraction|null=null,deduction:FiscalFraction|null=null,adjustment:FiscalFraction|null=null,priorUsed:FiscalFraction|null=null,priorRemaining:FiscalFraction|null=null,remainingFiscal:FiscalFraction|null=null,eligibleCurrent:FiscalFraction|null=null,months:number|null=null;const entry=Object.hasOwn(depreciationCatalog,a.category)?depreciationCatalog[a.category as DepreciationCategory]:null;
|
||||
if(short&&a.category!=='nondepreciable'&&(a.timing!=='months'||a.method==='low_value'))issues.push('Período curto exige duodécimos;opção integral art17 neste período por corresponder.');
|
||||
const money=(s:string,label:string)=>{if(!s.trim())throw Error(label+' em falta; não presumir zero.');return fiscalMoney(s);};
|
||||
const yesno=(v:string,label:string)=>{if(!['yes','no'].includes(v))throw Error(label+' por documentar.');return v==='yes';};
|
||||
if(!a.assetKey.trim()||!a.description.trim()||!a.document.trim()||!a.line.trim()||!a.reference.trim()||a.conditions!=='yes')issues.push('Identificação do activo, documento/linha, condições ordinárias e suporte em falta.');
|
||||
if(input.assets.some(b=>b!==a&&(b.assetKey.trim()===a.assetKey.trim()||b.document.trim()===a.document.trim()&&b.line.trim()===a.line.trim()))||claims.some(c=>c.document.trim()===a.document.trim()&&c.line.trim()===a.line.trim()))issues.push('Activo ou documento/linha repetido entre mapas; reconcilie sem dedução duplicada.');
|
||||
try{accounting=money(a.accounting,'Depreciação contabilística corrente');const cost=money(a.cost,'Custo histórico');
|
||||
if(a.category==='nondepreciable'){basis=cost;taxBasis=zero();quota=zero();deduction=zero();adjustment=accounting;notes.push('CIRPC26/27:elemento expressamente qualificado como não sujeito a deperecimento; depreciação contabilística integralmente acrescida.');}
|
||||
else{
|
||||
if(a.valuation!=='historical_new')throw Error('Tipo de aquisição/base por identificar ou fora do recorte de bens novos a custo histórico; usados/abertura de escrita7(2) e reavaliados15 exigem regra própria.');
|
||||
if(!entry)throw Error('Categoria/tabela ainda não correspondida; sem taxa livre ou código provisório.');
|
||||
if(entry){const specific=yesno(a.specificRate,'Existência de taxa específica da tabelaI');if(entry.table==='II'&&specific)throw Error('Taxa específica da tabelaI prevalece; seleccione a categoria específica correspondente.');if(entry.table==='I'&&!specific)throw Error('Categoria específica da tabelaI sem enquadramento documentado.');}
|
||||
if(!date(a.start)||a.start<'2014-01-01')throw Error('Entrada em funcionamento/utilização desde2014 por identificar; activos anteriores exigem correspondência histórica própria.');
|
||||
if(!yesno(a.consistentMethod,'Método uniforme desde o início'))throw Error('Mudança de método/razão excepcional requer correspondência própria do artigo10.');
|
||||
if(a.exitState==='known'&&(!date(a.exitDate)||a.exitDate<a.start)||!a.exitState||a.exitState==='absent'&&a.exitDate.trim())throw Error('Estado/data de transmissão,inutilização ou termo de vida útil incoerente ou em falta.');
|
||||
if(!a.previousReference.trim())throw Error('Suporte das quotas contabilísticas/fiscais anteriores e da parcela temporariamente tributada em falta.');
|
||||
const priorBook=money(a.previousAccounting,'Quotas contabilísticas anteriores'),priorFiscal=money(a.previousFiscal,'Quotas fiscais anteriores'),available=money(a.priorAvailable,'Parcela anterior temporariamente tributada recuperável');
|
||||
if(cmp(priorFiscal,priorBook)>0n||cmp(available,subtractFractions(priorBook,priorFiscal))>0n)throw Error('Quotas anteriores incoerentes; parcela recuperável não pode exceder a diferença contabilizada e não deduzida, excluindo encargos permanentemente não aceites.');
|
||||
const residual=money(a.residual,'Residual'),land=entry?.kind==='building'?money(a.land,'Terreno/parte não depreciável'):zero();if(entry?.kind!=='building'&&a.land.trim()&&cmp(fiscalMoney(a.land),zero())!==0n)throw Error('Terreno não corresponde a esta categoria de activo.');basis=subtractFractions(subtractFractions(cost,residual),land);if(cmp(basis,zero())<=0n)throw Error('Base depreciável positiva por reconciliar.');if(entry?.kind!=='building'&&cmp(land,zero())!==0n)throw Error('Terreno só deve ser separado no imóvel correspondente.');taxBasis=basis;
|
||||
if(entry?.kind==='vehicle'&&!yesno(a.vehicleException,'Afectação a serviço público de transportes/locação na actividade normal')){taxBasis=min(basis,positive(subtractFractions(fraction(800000n),residual)));notes.push('CIRPC27e:limite de aquisição800000MZN,sem afectar a depreciação contabilística de origem.');}
|
||||
if(entry?.kind==='software'&&!yesno(a.limitedRights,'Aquisição onerosa e direitos de utilização exclusiva por tempo limitado'))throw Error('Direitos de software/intangível sem condições do artigo16 documentadas.');
|
||||
if(cmp(priorFiscal,taxBasis)>0n)throw Error('Quotas fiscais anteriores excedem a base fiscal; reconcilie o saldo anterior.');const remaining=subtractFractions(taxBasis,priorFiscal),priorEligibleBook=min(taxBasis,multiply(priorBook,ratio(taxBasis,basis)));if(cmp(available,positive(subtractFractions(priorEligibleBook,priorFiscal)))>0n)throw Error('Parcela anterior recuperável inclui quota permanentemente não aceite ou excede a contabilização fiscalmente elegível.');eligibleCurrent=min(multiply(accounting,ratio(taxBasis,basis)),positive(subtractFractions(taxBasis,priorEligibleBook)));
|
||||
let maxRate:FiscalFraction|null=entry?decimalFraction(entry.rate):null,maxLifeMonths:FiscalFraction|null=maxRate?ratio(fraction(2400n),maxRate):null;
|
||||
if(a.method==='low_value'){if(cmp(cost,fraction(20000n))>0n||!yesno(a.individual,'Activo individual fora de conjunto depreciado como um todo')||cmp(priorFiscal,zero())!==0n||a.start<period.from||a.start>period.to)throw Error('Art17:valor unitário até20000MZN,activo individual e início no período,sem amortização fiscal anterior; condições em falta/incompatíveis.');quota=remaining;months=month(period.to)-month(a.start)+1;notes.push('Art17:opção de depreciação integral em um período,limitada ao que está contabilizado e ao saldo fiscal.');}
|
||||
else{
|
||||
if(!entry||!maxRate||!maxLifeMonths)throw Error('Taxa aplicável não identificada.');
|
||||
if(a.method==='constant'){if(!/^\d+(?:\.\d{1,6})?$/.test(a.rate))throw Error('Taxa constante escolhida por identificar.');const selected=decimalFraction(a.rate);if(cmp(selected,multiply(maxRate,fraction(1n,2n)))<0n||cmp(selected,maxRate)>0n)throw Error('Taxa constante fora do recorte entre metade da máxima e a máxima;quotas inferiores exigem correspondência própria dos limites de vida útil, artigos5/7.');quota=multiply(taxBasis,multiply(selected,fraction(1n,100n)));notes.push('Quota constante pela taxa escolhida:'+a.rate+'%;tabela'+entry.table+'/'+entry.code+'.');}
|
||||
else if(a.method==='declining'){if(!yesno(a.newTangible,'Activo tangível novo adquirido a terceiros/construído')||['building','furniture','software'].includes(entry.kind)||entry.kind==='vehicle'&&a.vehicleException!=='yes')throw Error('Art6:quotas degressivas só nos activos tangíveis novos elegíveis;edifícios,mobiliário/equipamento social,intangíveis e veículos sem excepção ficam separados.');const life=ratio(fraction(100n),maxRate),maxFactor=cmp(life,fraction(5n))<0n?fraction(3n,2n):cmp(life,fraction(6n))<=0n?fraction(2n):fraction(5n,2n);if(!/^\d+(?:\.\d{1,6})?$/.test(a.factor))throw Error('Coeficiente degressivo escolhido em falta.');const factor=decimalFraction(a.factor);if(cmp(factor,zero())<=0n||cmp(factor,maxFactor)>0n)throw Error('Coeficiente degressivo excede o máximo do artigo8:1,5/2/2,5 conforme vida útil mínima.');quota=multiply(remaining,multiply(maxRate,multiply(factor,fraction(1n,100n))));notes.push('Art8:saldo fiscal por amortizar ×taxa máxima'+entry.rate+'% ×coeficiente'+a.factor+';máximo'+fractionPresentation(maxFactor).decimal+'.');
|
||||
if(yesno(a.switchToStraight,'Opção pela regra de saldo/vida útil restante8(2)')){if(!yesno(a.priorFullQuotas,'Condição das quotas anteriores8(2)')||!a.start.endsWith('-01-01')||period.from!=='2026-01-01'||a.timing!=='annual')throw Error('Art8(2):condição das quotas anteriores por documentar;este recorte da opção exige início emJaneiro e período anual civil.');const remainingYears=subtractFractions(life,fraction(BigInt(2026-Number(a.start.slice(0,4)))));if(cmp(remainingYears,zero())<=0n)throw Error('Art8(2):vida útil mínima esgotada;sem dividir por anos inexistentes.');const linear=ratio(remaining,remainingYears);if(cmp(quota,linear)<0n){quota=linear;notes.push('Art8(2):usado saldo/número de anos de vida útil mínima restantes,com condições anteriores documentadas.');}}
|
||||
}else throw Error('Método de amortização por identificar.');
|
||||
if(!a.timing)throw Error('Opção anual/duodécimos por identificar.');
|
||||
if(a.timing==='annual'){if(a.exitState==='known'&&a.exitDate<=period.to)throw Error('Evento de saída em período anual:seleccione duodécimos e reconcilie a regra aplicável;sem quota anual presumida.');const lifeEnd=month(a.start)+Number(BigInt(maxLifeMonths.numerator)/BigInt(maxLifeMonths.denominator));if(lifeEnd>month(period.from)&&lifeEnd<=month(period.to)&&cmp(remaining,zero())>0n)throw Error('Vida útil máxima termina dentro do período;opção anual e quotas anteriores exigem correspondência própria. Duodécimos em vigor são calculados até ao limite temporal.');months=a.start>period.to?0:12;}
|
||||
else{const start=Math.max(month(period.from),month(a.start)),end=Math.min(month(period.to)+1,a.exitState==='known'?month(a.exitDate):month(period.to)+1,month(a.start)+Number(BigInt(maxLifeMonths.numerator)/BigInt(maxLifeMonths.denominator)));months=Math.max(0,end-start);quota=multiply(quota,fraction(BigInt(months),12n));notes.push('Art9:entrada incluída desde o mês da utilização;saída exclui o mês do evento;'+months+'duodécimos.');}
|
||||
const elapsed=Math.max(0,month(period.from)-month(a.start));if(cmp(fraction(BigInt(elapsed)),maxLifeMonths)>=0n){quota=zero();notes.push('Art5:vida útil máxima esgotada,sem excepção aplicada;nenhuma recuperação de quota fora desse limite.');}else if(a.start>period.to){quota=zero();notes.push('Art3:activo ainda não entrou emuso no período;sem amortização fiscal.');}
|
||||
}
|
||||
deduction=min(quota!,remaining,addFractions([eligibleCurrent,available]));priorUsed=positive(subtractFractions(deduction,eligibleCurrent));priorRemaining=subtractFractions(available,priorUsed);remainingFiscal=subtractFractions(remaining,deduction);adjustment=subtractFractions(accounting,deduction);notes.push('Art3(3):dedução limitada ao contabilizado no período ou antes desde o uso;quotas anteriores recuperáveis usadas:'+show(priorUsed)+';saldo anterior aritmético:'+show(priorRemaining)+'. Sem consumo oficial nem recuperação de quota não contabilizada/permanentemente excluída.');
|
||||
}
|
||||
}catch(e){issues.push(e instanceof Error?e.message:String(e));}
|
||||
if(issues.length){deduction=null;adjustment=null;priorUsed=null;priorRemaining=null;remainingFiscal=null;pending.push((a.description||a.id)+': '+issues.join(' '));}
|
||||
return{...structuredClone(a),catalog:entry,accountingValue:accounting,basis,taxBasis,quota,deduction,adjustment,eligibleCurrent,priorUsed,priorRemaining,remainingFiscal,months,status:issues.length?'indeterminate' as const:'calculated' as const,reason:issues.join(' ')||notes.join(' ')};
|
||||
});
|
||||
let accountingTotal:FiscalFraction|null=null;try{accountingTotal=addFractions(assets.map(a=>{if(!a.accountingValue)throw Error();return a.accountingValue;}));const origin=fiscalMoney(source?.accountingLines.find(l=>l.code==='depreciation')?.total??'');if(cmp(accountingTotal,origin)!==0n)pending.push('Soma das quotas contabilísticas dos activos não corresponde à depreciação financeira declarada.');}catch{pending.push('Depreciação contabilística da origem por reconciliar.');}
|
||||
if(claims.some(c=>c.sourceCode==='depreciation'))pending.push('Depreciação partilhada com outros ajustamentos de origem;reconcilie as parcelas para não duplicar o mesmo encargo.');
|
||||
const knownAdjustment=addFractions(assets.flatMap(a=>a.adjustment?[a.adjustment]:[])),adjustment=pending.length===0?knownAdjustment:null;
|
||||
return{input:structuredClone(input),assets,accountingTotal,knownAdjustment,adjustment,pending,source:'Decreto72/2013,art3–10/16/17,tabelasI/II;CIRPC26/27. Recorte anualMZN com termo2026,custo histórico,sem reavaliação,turnos intensivos,concessões/fusões ou excepções presumidas. Fotografia7;mapa interno,não formulário oficial de amortizações.'};
|
||||
}
|
||||
export type NormalDepreciationModel=ReturnType<typeof calculateNormalDepreciation>;
|
||||
export function normalDepreciationReport(m:NormalDepreciationModel):Array<[string,string,string,string]>{return[['IRPC normal — L6','Amortizações — tabelas, métodos, duodécimos e quotas anteriores',`Quotas contabilísticas:${show(m.accountingTotal)};ajustamento das parcelas conhecidas:${show(m.knownAdjustment)};ajustamento reconciliado:${show(m.adjustment)};${m.pending.join(' | ')}`,m.source],...m.assets.map(a=>['IRPC normal — L6',a.description+' — '+a.document+'/'+a.line,`Estado:${a.status==='calculated'?'Calculado no recorte':'Informação insuficiente'};contabilístico:${show(a.accountingValue)};parcela contabilística elegível:${show(a.eligibleCurrent)};base fiscal:${show(a.taxBasis)};quota calculada:${show(a.quota)};dedução fiscal:${show(a.deduction)};ajustamento com sinal:${show(a.adjustment)};duodécimos:${a.months??'Não aplicável'};quota anterior utilizada:${show(a.priorUsed)};saldo anterior aritmético:${show(a.priorRemaining)};${a.reason}`,`${a.catalog?'Decreto72/2013,tabela'+a.catalog.table+',código'+a.catalog.code+',PDF'+a.catalog.page:'Categoria sem código de tabela aplicado'};${a.reference};quotas anteriores:${a.previousReference};método:${a.method==='constant'?'Constante':a.method==='declining'?'Degressivo':a.method==='low_value'?'Valor reduzido':'Por identificar'};sem alteração dos documentos/saldos oficiais ou históricos.`]as[string,string,string,string])];}
|
||||
@@ -0,0 +1,84 @@
|
||||
import {addFractions,decimalFraction,fraction,fractionPresentation,subtractFractions,type FiscalFraction} from './fiscal-rational.ts';
|
||||
import type {normalFinancialSource} from './irpc-normal.ts';
|
||||
import type {SchedulesModel} from './irpc-normal-schedules.ts';
|
||||
import type {NormalCostsModel} from './irpc-normal-costs.ts';
|
||||
import type {NormalDepreciationModel} from './irpc-normal-depreciation.ts';
|
||||
import type {NormalBaseModel} from './irpc-normal-base.ts';
|
||||
export const normalFormPreparationVersion='IRPC-normal-adjustments/9';
|
||||
export const m20Accounts={
|
||||
'7.1':'Venda de bens','7.2':'Prestação de serviços','7.3':'Investimentos realizados pela própria empresa','7.4':'Reversões do período','7.5':'Rendimentos suplementares','7.6':'Outros rendimentos e ganhos operacionais','7.8':'Rendimentos e ganhos financeiros','7.9':'Ganho por aumento do justo valor',
|
||||
'6.1.1':'Custos dos inventários vendidos ou consumidos','6.2':'Gastos com pessoal','6.3':'Fornecimentos e serviços de terceiros','6.4':'Perda por imparidade / ajustamento','6.5':'Amortizações do período','6.6':'Provisões do período','6.7':'Perda por redução do justo valor','6.8':'Outros gastos e perdas operacionais','6.9':'Gastos e perdas financeiras','8.5':'Imposto sobre o rendimento',
|
||||
}as const;
|
||||
export type FormAllocation={id:string;sourceCode:string;account:''|keyof typeof m20Accounts;amount:string;reference:string};
|
||||
export type NormalFormPreparationInput={version:1;edition:''|'accepted_pdf_and_m20a1';reference:string;completenessReference:string;allocations:FormAllocation[];incomeTax:{state:''|'known'|'absent';amount:string;placement:''|'included'|'outside';reference:string};reducedRate:{state:''|'known'|'absent';reference:string}};
|
||||
export const newNormalFormPreparation=():NormalFormPreparationInput=>({version:1,edition:'',reference:'',completenessReference:'',allocations:[],incomeTax:{state:'',amount:'',placement:'',reference:''},reducedRate:{state:'',reference:''}});
|
||||
export const newFormAllocation=(id:string):FormAllocation=>({id,sourceCode:'',account:'',amount:'',reference:''});
|
||||
const allowed:Record<string,string[]>={revenue:['7.1','7.2','7.3','7.4','7.5','7.6','7.8','7.9'],cost_of_sales:['6.1.1'],personnel:['6.2'],depreciation:['6.5'],interest_expense:['6.9'],operating_expenses:['6.3','6.4','6.6','6.7','6.8','8.5']};
|
||||
export const normalFormAccountsFor=(source:string)=>allowed[source]??[];
|
||||
export function validateNormalFormPreparation(i:NormalFormPreparationInput){
|
||||
if(!i||i.version!==1||!['','accepted_pdf_and_m20a1'].includes(i.edition)||typeof i.reference!=='string'||typeof i.completenessReference!=='string'||!Array.isArray(i.allocations)||new Set(i.allocations.map(a=>a.id)).size!==i.allocations.length||i.allocations.some(a=>!a||Object.keys(newFormAllocation('')).some(k=>typeof a[k as keyof FormAllocation]!=='string')||a.account!==''&&!Object.hasOwn(m20Accounts,a.account))||!i.incomeTax||!['','known','absent'].includes(i.incomeTax.state)||!['','included','outside'].includes(i.incomeTax.placement)||typeof i.incomeTax.amount!=='string'||typeof i.incomeTax.reference!=='string'||!i.reducedRate||!['','known','absent'].includes(i.reducedRate.state)||typeof i.reducedRate.reference!=='string')throw Error('Preparação M20/M22 não recuperável;originais conservados.');
|
||||
}
|
||||
const zero=()=>fraction(0n),neg=(v:FiscalFraction)=>fraction(-BigInt(v.numerator),BigInt(v.denominator)),positive=(v:FiscalFraction)=>BigInt(v.numerator)>=0n;
|
||||
const eq=(a:FiscalFraction,b:FiscalFraction)=>BigInt(a.numerator)*BigInt(b.denominator)===BigInt(b.numerator)*BigInt(a.denominator);
|
||||
function money(s:string){if(!/^\d{1,18}(?:\.\d{1,6})?$/.test(s))throw Error('Montante não negativo conhecido em falta;zero não é presumido.');return decimalFraction(s);}
|
||||
export function normalFormRepresentation(v:FiscalFraction|null,unit:'whole'|'cent'='cent',parentheses=false){
|
||||
if(!v)return{exact:null,display:'Indeterminado',represented:null,ready:false,reason:'Valor em falta;sem zero presumido.'};
|
||||
const n=BigInt(v.numerator),d=BigInt(v.denominator);if(d<=0n)throw Error('Representação racional inválida.');const p=fractionPresentation(v),whole=n%d===0n,cent=n*100n%d===0n;
|
||||
const abs=n<0n?-n:n,scaled=abs*100n/d;const exact=n+'/'+d+' MZN',value=whole?(parentheses&&n<0n?'('+String(-n/d)+')':String(n/d)):unit==='cent'&¢?(n<0n?'-':'')+scaled/100n+'.'+String(scaled%100n).padStart(2,'0'):null;
|
||||
return{exact,display:whole?(value+' MZN'):(p.approximate?'≈':'')+p.decimal+' MZN (exacto '+n+'/'+d+')',represented:value,ready:value!==null,reason:whole?'Valor exacto em meticais inteiros,sem arredondamento.':unit==='whole'?'Exemplar M20 exige meticais sem centavos;regra de representação da fracção por corresponder.':cent?'Valor exacto ao cêntimo na preparação M22 já demonstrada;sem arredondamento fiscal ou declaração oficial presumidos.':'Fracção de cêntimo conservada;regra de representação fiscal por corresponder.'};
|
||||
}
|
||||
type Financial=ReturnType<typeof normalFinancialSource>;
|
||||
export function reuseDirectFormAllocations(source:Financial){return(source?.accountingLines??[]).filter(l=>['cost_of_sales','personnel','depreciation','interest_expense'].includes(l.code)).map(l=>({id:'source-'+l.code,sourceCode:l.code,account:allowed[l.code][0]as keyof typeof m20Accounts,amount:l.total,reference:'Reutilizado da linha financeira '+l.origin+';conferir completude da conta no suporte da preparação.'}));}
|
||||
type Model={accountingProfit:FiscalFraction|null;taxableProfit:FiscalFraction|null;taxableBase:FiscalFraction|null;colecta?:FiscalFraction|null;rows:Array<{rule:string;document:string;line:string;adjustment:FiscalFraction|null}>;schedules?:SchedulesModel;depreciation?:NormalDepreciationModel;costs?:NormalCostsModel;base?:NormalBaseModel};
|
||||
export function prepareNormalForms(input:NormalFormPreparationInput,m:Model,source:Financial){
|
||||
validateNormalFormPreparation(input);const pending:string[]=[],edition=input.edition==='accepted_pdf_and_m20a1'&&!!input.reference.trim();
|
||||
if(!edition)pending.push('Identifique os exemplares M22 PDF e M20A.1 inventariados;sem equivalência automática com as outras edições.');
|
||||
if(!input.completenessReference.trim())pending.push('Suporte da completude contabilística e discriminação da origem em falta.');
|
||||
const allocations=input.allocations.map(a=>{let value:FiscalFraction|null=null;const issues:string[]=[];try{value=money(a.amount);}catch(e){issues.push(String(e));}if(!normalFormAccountsFor(a.sourceCode).includes(a.account)||!source?.accountingLines.some(l=>l.code===a.sourceCode)||!a.reference.trim())issues.push('Origem/conta e suporte compatíveis por identificar.');return{...structuredClone(a),value:issues.length?null:value,reason:issues.join(' ')};});
|
||||
const lines=(source?.accountingLines??[]).map(l=>{const rows=allocations.filter(a=>a.sourceCode===l.code),sum=addFractions(rows.flatMap(a=>a.value?[a.value]:[])),ready=rows.length>0&&rows.every(a=>a.value!==null)&&eq(sum,money(l.total));const reason=ready?'Parcelas reconciliadas exactamente com a linha de origem.':'Discriminação em falta,incompleta ou superior à origem;sem duplicar montantes.';if(!ready)pending.push(l.origin+': '+reason);return{code:l.code,total:l.total,allocated:sum,ready,reason};});
|
||||
for(const a of allocations)if(a.reason)pending.push(a.id+': '+a.reason);
|
||||
if(!source)pending.push('Resultado financeiro do período/moeda em falta;preparação não cria um resultado substituto.');
|
||||
const tax=input.incomeTax;let bookTax:FiscalFraction|null=null;
|
||||
if(!tax.reference.trim()||!tax.state)pending.push('Imposto sobre rendimento contabilizado:valor/ausência e suporte por identificar;colecta não substitui gasto contabilístico.');
|
||||
else if(tax.state==='absent'){if(tax.amount.trim()||tax.placement)pending.push('Ausência de imposto contabilizado contradiz montante/localização preenchidos.');else bookTax=zero();}
|
||||
else{try{bookTax=money(tax.amount);if(!tax.placement)throw Error();}catch{bookTax=null;pending.push('Imposto contabilizado conhecido exige montante e indicação se já incluído ou exterior ao resultado do plano.');}}
|
||||
const allocatedTax=addFractions(allocations.filter(a=>a.account==='8.5'&&a.value).map(a=>a.value!));
|
||||
if(bookTax&&(!eq(allocatedTax,tax.placement==='included'?bookTax:zero()))){pending.push('Conta8.5 não reconciliada com imposto já incluído/exterior ao plano;sem subtracção duplicada.');bookTax=null;}
|
||||
const includedTaxEvidence=(m.schedules?.effects??[]).filter(e=>m.schedules!.input.rows.find(r=>r.id===e.id)?.rule==='tax_own');
|
||||
if(bookTax&&tax.placement!=='included'&&includedTaxEvidence.some(e=>e.effect&&BigInt(e.effect.numerator)>0n)){pending.push(tax.state==='absent'?'Ausência de imposto contabilizado contradiz imposto próprio já identificado nos custos do plano.':'Imposto incluído e exterior coexistem:discriminação das duas componentes ainda por corresponder;sem misturar ou subtrair duas vezes.');bookTax=null;}
|
||||
const classificationReady=edition&&!!input.completenessReference.trim()&&source!==null&&lines.length>0&&lines.every(l=>l.ready)&&allocations.every(a=>a.value!==null),outsideTax=bookTax&&tax.placement==='outside'?bookTax:zero();
|
||||
const m20=Object.entries(m20Accounts).map(([account,label])=>{const related=allocations.filter(a=>a.account===account),categorySources=Object.keys(allowed).filter(k=>allowed[k].includes(account));const complete=edition&&!!input.completenessReference.trim()&&source!==null&&categorySources.every(k=>lines.some(l=>l.code===k&&l.ready));let value=complete?addFractions(related.flatMap(a=>a.value?[a.value]:[])):null;if(account==='8.5')value=complete&&bookTax?bookTax:null;return{account,label,value,representation:normalFormRepresentation(value,'whole'),reference:related.map(a=>a.reference).join(' | '),reason:complete?'Classificação documentada e reconciliada no M20A.1/quadro4.':'Campo dependente da discriminação contabilística;sem zero por falta de parcelas.'};});
|
||||
const netResult=classificationReady&&bookTax&&m.accountingProfit?subtractFractions(m.accountingProfit,outsideTax):null;
|
||||
const entries:Array<{code:string|null;origin:string;value:FiscalFraction|null;reason:string}>=[];
|
||||
const add=(code:string|null,origin:string,value:FiscalFraction|null,reason='')=>entries.push({code,origin,value,reason});
|
||||
for(const r of m.rows)add(r.rule==='noncontractual_fine'||r.rule==='compensatory_interest'?'215':null,r.document+'/'+r.line,r.adjustment,'CIRPC36(1)c;PDF M22/quadro10 campo215.');
|
||||
for(const e of m.schedules?.effects??[]){const r=m.schedules!.input.rows.find(r=>r.id===e.id)!;if(['capital_in','capital_out'].includes(r.rule)&&e.effect&&eq(e.effect,zero()))continue;const code=({patrimonial_gain:'201',patrimonial_cost:'202',tax_other:'213',undocumented:'223'}as Record<string,string>)[r.rule]??null;add(code,r.document+'/'+r.line,e.effect,code?'Correspondência do rótulo do PDF M22.':r.rule==='tax_own'?'Imposto próprio36(1)a:campo específico por corresponder;campo213 do PDF refere apenas responsabilidade de outrem.':'Periodização/variação sem campo correspondido neste recorte;efeito preservado no cálculo.');}
|
||||
if(m.depreciation)for(const asset of m.depreciation.assets){const a=asset.adjustment;add(a&&positive(a)?'206':null,'Mapa de amortizações — '+asset.description,a,a&&positive(a)?'Reintegrações/amortizações não aceites:PDF campo206.':'Recuperação de quota anterior/ajustamento negativo:campo de dedução específico ainda por corresponder.');}
|
||||
else if(m.schedules?.depreciation){const a=m.schedules.depreciation;add(positive(a)?'206':null,'Amortizações do mapa inicial',a);}
|
||||
for(const r of m.costs?.rows??[]){const code=({allowance:'219',representation:'220',advertising:'221',vehicle:'226',fuel:'225',rental:'224',credit:'209',stock:'209',litigation:'209',taxed_reversal:'239'}as Record<string,string>)[r.rule]??null;add(code,r.document+'/'+r.line,r.adjustment,code?'Correspondência do tratamento demonstrado ao rótulo do PDF M22.':'Tratamento demonstrado sem campo específico correspondido;não usar campo livre por presunção.');}
|
||||
if(bookTax&&tax.placement==='outside')add(null,'Imposto contabilístico exterior ao plano',bookTax,'Imposto próprio36(1)a:campo específico por corresponder;213 do exemplar é de outrem. Resultado líquido conhecido,sem código presumido ou alteração do motor fiscal.');
|
||||
const ownTaxEffects=(m.schedules?.effects??[]).filter(e=>m.schedules!.input.rows.find(r=>r.id===e.id)?.rule==='tax_own');
|
||||
const includedTaxCorresponds=!bookTax||tax.placement!=='included'||ownTaxEffects.every(e=>e.effect!==null)&&eq(addFractions(ownTaxEffects.flatMap(e=>e.effect?[e.effect]:[])),bookTax);
|
||||
if(!includedTaxCorresponds)pending.push('Imposto já incluído agora discriminado não corresponde ao ajustamento tax_own existente;conferir esse caso sem alterar cálculos ou históricos.');
|
||||
const unmapped=entries.filter(e=>!e.code&&(!e.value||!eq(e.value,zero())));for(const e of unmapped)pending.push(e.origin+': '+e.reason);
|
||||
const field=(code:string,label:string,value:FiscalFraction|null,reason:string,notApplicable=false)=>({code,label,value,application:notApplicable?'not_applicable':value?'known':'missing',representation:notApplicable?{...normalFormRepresentation(null),display:'Sem aplicação',reason:'Lucro/perda conhecido:não preencher o campo de sinal oposto.'}:normalFormRepresentation(value),reason,transcriptionReady:edition&&code!=='200'&&normalFormRepresentation(value).ready});
|
||||
const mappedValue=(code:string,negative=false)=>{if(code==='206'&&m.depreciation?.adjustment===null)return null;const es=entries.filter(e=>e.code===code);if(es.some(e=>e.value===null)||!es.length&&m.taxableProfit===null)return null;const value=addFractions(es.flatMap(e=>e.value?[negative?neg(e.value):e.value]:[]));return positive(value)?value:null;};
|
||||
const fields=[field('200','Resultado do exercício',netResult,'Valor contabilístico reconciliado próprio;transporte automático M20→M22 impedido só pela divergência201/Q8 versus200/Q10.')];
|
||||
const labels:Record<string,string>={'201':'Variações patrimoniais positivas','202':'Variações patrimoniais negativas','206':'Amortizações não aceites','209':'Provisões/imparidade além dos limites','213':'Impostos e encargos da responsabilidade de outrem','215':'Multas e juros compensatórios','219':'Parcela não aceite de ajudas de custo','220':'Parcela não aceite de representação','221':'Publicidade além do limite','223':'Despesas não documentadas','224':'Parcela não aceite de aluguer','225':'Combustíveis sem prova/consumo normal','226':'Encargos não aceites com viaturas','239':'Reposição/redução de provisões tributadas'};
|
||||
for(const[code,label]of Object.entries(labels))fields.push(field(code,label,mappedValue(code,['202','239'].includes(code)),'PDF M22/quadro10;valor do ajustamento demonstrado,sem reaplicar percentagens do rótulo.'));
|
||||
const v=(code:string)=>fields.find(f=>f.code===code)!.value,patrimonial=netResult&&v('201')&&v('202')?subtractFractions(addFractions([netResult,v('201')!]),v('202')!):null;
|
||||
fields.push(field('203','Resultado após variações patrimoniais',patrimonial,'200+201−202,sem transferência entre edições.'));
|
||||
const up=entries.filter(e=>!['201','202'].includes(e.code??'')&&e.value&&positive(e.value)&&!eq(e.value,zero())),down=entries.filter(e=>!['201','202'].includes(e.code??'')&&e.value&&!positive(e.value));
|
||||
const sumsReady=includedTaxCorresponds&&m.taxableProfit!==null&&entries.every(e=>e.value!==null)&&unmapped.length===0&&patrimonial!==null;
|
||||
const additions=sumsReady?addFractions([patrimonial!,...up.map(e=>e.value!)]):null,deductions=sumsReady?addFractions(down.map(e=>neg(e.value!))):null,reconstructed=additions&&deductions?subtractFractions(additions,deductions):null;
|
||||
const matches=reconstructed!==null&&m.taxableProfit!==null&&eq(reconstructed,m.taxableProfit);if(reconstructed&&!matches)pending.push('Percurso M22 não reconcilia com o lucro tributável existente;rever localização do imposto e campos,sem alterar os cálculos demonstrados.');
|
||||
fields.push(field('238','Soma após acréscimos',additions,'Campo203+campos204–237;indeterminado se há efeito sem correspondência.'),field('258','Soma das deduções',deductions,'Campos239–257;sem presumir campo para dedução não correspondida.'));
|
||||
const p=m.taxableProfit,loss=p&&!positive(p)?neg(p):null,profit=p&&positive(p)?p:null;
|
||||
for(const[code,label,value]of [['259','Prejuízo fiscal',loss],['260','Lucro tributável',profit],['269','Prejuízo fiscal — regime geral',loss],['270','Lucro tributável — regime geral',profit],['276','Prejuízos fiscais deduzidos',m.base?.deductedLosses??null],['277','Benefícios fiscais a deduzir',m.base?.benefitDeduction??null],['278','Matéria colectável — regime geral',m.taxableBase],['300','Imposto à taxa normal',m.colecta??null]]as const)fields.push(field(code,label,value,'Reutiliza o cálculo demonstrado;campos independentes da divergência de transporte.',p!==null&&value===null&&['259','260','269','270'].includes(code)));
|
||||
const reducedAbsent=input.reducedRate.state==='absent'&&!!input.reducedRate.reference.trim();fields.push(field('301','Imposto à taxa reduzida',reducedAbsent?zero():null,'Ausência declarada com suporte;caso conhecido pertence aL7.'),field('302','Colecta total',reducedAbsent?m.colecta??null:null,'300+301 apenas com ausência de taxa reduzida demonstrada;sem saldoL8.'));
|
||||
if(!reducedAbsent)pending.push('Parcela de taxa reduzida em falta ou conhecida:colecta total302 depende desse âmbitoL7;colecta normal300 preservada.');
|
||||
fields.push(field('309–316','Liquidação e saldo final',null,'L8:retenções,pagamentos,créditos e saldo final não apurados.'));
|
||||
return{input:structuredClone(input),allocations,lines,m20,netResult,netRepresentation:normalFormRepresentation(netResult,'whole',true),entries,unmapped,fields,reconciliation:{reconstructedProfit:reconstructed,existingProfit:m.taxableProfit,matches},pending,source:'PDF M22 SHA2564b61bd83d1fbcfd3b7b5c5523cea5923f7d0f65dc4c004eff58e5db38f763c88,Q10–12;M20A.1 SHA2561ceca6f4c6d77853c1b2b445876599b42093175fa89eecf40590180956d83a9e,Q4/M12/D13–D35. Rótulos e estrutura reutilizados;sem valores de terceiros,fórmulas do exemplar ou submissão.',transport:{ready:false,reason:'M20A.1 D35 remete paraM22 campo201/quadro8;PDF M22 usa200/quadro10. Impedimento restrito ao transporte deste resultado;campos independentes continuam preparados.'}};
|
||||
}
|
||||
export type NormalFormPreparationModel=ReturnType<typeof prepareNormalForms>;
|
||||
export function normalFormPreparationReport(m:NormalFormPreparationModel):Array<[string,string,string,string]>{return[['IRPC normal — L6','Representação e preparação M20/M22',m.pending.join(' | ')||'Preparação parcial dos campos correspondidos;sem declaração oficial ou submissão.',m.source],...m.m20.map(f=>['IRPC normal — L6','M20 A.1 conta'+f.account+' — '+f.label,`${f.representation.display};exacto:${f.representation.exact??'Indeterminado'};representável:${f.representation.ready?'Sim':'Pendente'};${f.representation.reason}`,`${f.reference};${f.reason}`]as[string,string,string,string]),['IRPC normal — L6','Resultado líquido M20',m.netRepresentation.display+';'+m.netRepresentation.reason,'Imposto contabilístico identificado;sem usar colecta como despesa presumida.'],...m.fields.map(f=>['IRPC normal — L6','M22 PDF campo'+f.code+' — '+f.label,`${f.representation.display};exacto:${f.representation.exact??'Indeterminado'};preparação de transcrição:${f.transcriptionReady?'Exacta neste recorte':'Pendente/sem aplicação'};${f.representation.reason}`,f.reason]as[string,string,string,string]),...m.unmapped.map(e=>['IRPC normal — L6','Ajustamento sem campo correspondido — '+e.origin,normalFormRepresentation(e.value).display,e.reason]as[string,string,string,string]),['IRPC normal — L6','Transporte entre edições',m.transport.reason,`Lucro reconstruído:${normalFormRepresentation(m.reconciliation.reconstructedProfit).display};lucro existente:${normalFormRepresentation(m.reconciliation.existingProfit).display};reconciliação:${m.reconciliation.matches?'Exacta':'Pendente'};sem alteração de cálculos.`]];}
|
||||
@@ -0,0 +1,39 @@
|
||||
import {addFractions,fraction,type FiscalFraction} from './fiscal-rational.ts';
|
||||
import {convertIrpcAmount,irpcFxDependency,type IrpcFxAmount,type IrpcFxEvidence,irpcFxEvidenceLabel} from './irpc-fx.ts';
|
||||
import type {rawNormalFinancialSource} from './irpc-normal.ts';
|
||||
export const normalPeriodFxVersion='IRPC-normal-adjustments/8';
|
||||
export type NormalPeriodFxInput={version:1;kind:''|'annual'|'start'|'cessation'|'same_year'|'transition';from:string;to:string;planStart:string;reference:string;conversionReference:string;mznMapsReference:string;months:Array<IrpcFxAmount&{period:number}>};
|
||||
export const newNormalPeriodFx=():NormalPeriodFxInput=>({version:1,kind:'',from:'',to:'',planStart:'',reference:'',conversionReference:'',mznMapsReference:'',months:[]});
|
||||
export function validateNormalPeriodFx(i:NormalPeriodFxInput){
|
||||
if(!i||i.version!==1||!['','annual','start','cessation','same_year','transition'].includes(i.kind)||['from','to','planStart','reference','conversionReference','mznMapsReference'].some(k=>typeof i[k as 'from']!=='string')||!Array.isArray(i.months)||new Set(i.months.map(m=>m.period)).size!==i.months.length||i.months.some(m=>!Number.isSafeInteger(m.period)||m.period<1||typeof m.currency!=='string'||m.fxSelection!==undefined&&(!m.fxSelection||typeof m.fxSelection!=='object')||m.fxLink!==undefined&&(!m.fxLink||typeof m.fxLink.id!=='string'||typeof m.fxLink.fingerprint!=='string')))throw Error('Correspondência do período/moeda não recuperável;originais preservados.');
|
||||
}
|
||||
const iso=(s:string)=>/^20\d{2}-\d{2}-\d{2}$/.test(s)&&Number.isFinite(Date.parse(s))&&new Date(s).toISOString().slice(0,10)===s;
|
||||
const month=(s:string)=>Number(s.slice(0,4))*12+Number(s.slice(5,7))-1;
|
||||
const monthEnd=(s:string)=>{const d=new Date(s+'T00:00:00Z');d.setUTCMonth(d.getUTCMonth()+1,0);return d.toISOString().slice(0,10);};
|
||||
const amount=(v:FiscalFraction)=>{const n=BigInt(v.numerator)*100n,d=BigInt(v.denominator);if(n%d!==0n)throw Error('Conversão com fracção de cêntimo: representação fiscal por corresponder,sem arredondamento novo.');const c=n/d,a=c<0n?-c:c;return(c<0n?'-':'')+a/100n+'.'+String(a%100n).padStart(2,'0');};
|
||||
type Source=NonNullable<ReturnType<typeof rawNormalFinancialSource>>;
|
||||
export function mapNormalPeriodFx(d:Record<string,unknown>,input:NormalPeriodFxInput,raw:Source|null){
|
||||
validateNormalPeriodFx(input);const pending:string[]=[],short=input.kind!==''&&input.kind!=='annual';let count=0;
|
||||
if(!input.kind||!input.reference.trim())pending.push('Tipo,evento e suporte da correspondência do período por identificar.');
|
||||
if(!iso(input.from)||!iso(input.to)||input.from>input.to||!input.from.endsWith('-01')||monthEnd(input.to.slice(0,7)+'-01')!==input.to||!input.to.startsWith('2026-'))pending.push('Recorte:meses completos,termo em2026;datas parciais ou inválidas permanecem por corresponder.');
|
||||
else{count=month(input.to)-month(input.from)+1;if(count<1||count>12||short&&count>=12||!short&&count!==12)pending.push('Número de meses incompatível com o tipo de período.');}
|
||||
if(short&&(!input.from.startsWith('2026-')||input.kind==='start'&&input.to!=='2026-12-31'||['cessation','transition'].includes(input.kind)&&input.from!=='2026-01-01'))pending.push('Datas incompatíveis com início,cessação ou transição no ano civil2026.');
|
||||
if(!iso(input.planStart)||!input.planStart.endsWith('-01'))pending.push('Identifique o primeiro mês civil do plano;meses orçamentais não têm data fiscal presumida.');
|
||||
if(!input.mznMapsReference.trim())pending.push('Confirme que parcelas,activos,quotas,saldos e mapas fiscais existentes estão reconciliados emMZN com este período;sem converter novamente esses dados.');
|
||||
if(!raw)pending.push('Plano financeiro reconciliado em falta.');
|
||||
const selected=raw?.accountingLines[0]?.monthlyAmounts.filter(m=>iso(input.planStart)&&month(input.planStart)+m.period-1>=month(input.from)&&month(input.planStart)+m.period-1<=month(input.to))??[];
|
||||
if(selected.length!==count||!count)pending.push('Meses do plano não cobrem integralmente o período indicado;sem anualização ou preenchimento de meses em falta.');
|
||||
if(raw?.currency!=='MZN'&&!input.conversionReference.trim())pending.push('Identifique pressuposto documentado da conversão mensal para a simulação;selecção cambial não confirma,por si,a regra fiscal de conversão anual.');
|
||||
for(const m of input.months)if(!selected.some(x=>x.period===m.period))pending.push('Selecção cambial sem mês seleccionado no período: '+m.period);
|
||||
const rows:Array<{code:string;period:number;date:string;originalAmount:string;originalCurrency:string;value:FiscalFraction|null;evidence:IrpcFxEvidence|null;reason:string}>=[];
|
||||
const lines=raw?.accountingLines.map(l=>{const monthlyAmounts=l.monthlyAmounts.filter(m=>selected.some(x=>x.period===m.period)).map(m=>{let value:FiscalFraction|null=null,evidence:IrpcFxEvidence|null=null,reason='';const day=iso(input.planStart)?new Date(Date.UTC(Number(input.planStart.slice(0,4)),Number(input.planStart.slice(5,7))-1+m.period-1,1)).toISOString().slice(0,10):'';
|
||||
try{const sign=m.amount.startsWith('-')?-1n:1n,original=sign<0n?m.amount.slice(1):m.amount;const selection=input.months.find(x=>x.period===m.period);if(raw.currency!=='MZN'&&(!selection||selection.currency!==raw.currency))throw Error('Selecção cambial deste mês/moeda em falta;sem usar taxa de outro mês por defeito.');const converted=convertIrpcAmount(d,original,selection??{currency:'MZN'});value=fraction(BigInt(converted.value.numerator)*sign,BigInt(converted.value.denominator));evidence=converted.evidence;amount(value);}catch(e){value=null;reason=String(e);pending.push(l.code+'/mês'+m.period+': '+reason);}
|
||||
rows.push({code:l.code,period:m.period,date:day,originalAmount:m.amount,originalCurrency:raw.currency,value,evidence,reason});return{period:m.period,amount:value?amount(value):'0.00'};});
|
||||
const total=addFractions(rows.filter(r=>r.code===l.code&&r.value).map(r=>r.value!));return{...l,monthlyAmounts,total:amount(total)};
|
||||
})??[];
|
||||
const ready=pending.length===0;const profit=addFractions(lines.map(l=>{const f=rows.filter(r=>r.code===l.code&&r.value).map(r=>r.value!);const sum=addFractions(f);return l.accountingEffect==='income'?sum:fraction(-BigInt(sum.numerator),BigInt(sum.denominator));}));
|
||||
return{input:structuredClone(input),short,months:count,originalCurrency:raw?.currency??'',rows,pending,source:ready&&raw?{...raw,currency:'MZN',cashSchedule:raw.currency==='MZN'?raw.cashSchedule.filter(r=>selected.some(m=>m.period===r.period)):[],periods:count,accountingLines:lines,accountingProfitBeforeTax:amount(profit)}:null,rule:'CIRPC7(4)a–d;Decreto72/2013 art9(3)a–c para os casos correspondidos. Meses completos do plano,sem anualização. Conversão para simulação reutiliza mecanismo cambial entregue e pressupostos explícitos;sem confirmação fiscal anual presumida.'};
|
||||
}
|
||||
export type NormalPeriodFxModel=ReturnType<typeof mapNormalPeriodFx>;
|
||||
export function normalPeriodFxDependency(d:Record<string,unknown>,i:NormalPeriodFxInput){return i.months.map(m=>irpcFxDependency(d,m)).filter(Boolean).join(' | ');}
|
||||
export function normalPeriodFxReport(m:NormalPeriodFxModel):Array<[string,string,string,string]>{return[['IRPC normal — L6','Período e moeda do plano',`${m.input.from}–${m.input.to};${m.months}meses;origem:${m.originalCurrency};resultado emMZN:${m.source?.accountingProfitBeforeTax??'Indeterminado'};${m.originalCurrency!=='MZN'?'Conversão para simulação com pressupostos documentados;regra fiscal anual não confirmada automaticamente.':''}${m.pending.join(' | ')}`,`${m.input.reference};${m.input.conversionReference};${m.input.mznMapsReference};${m.rule}`],...m.rows.map(r=>['IRPC normal — L6',`${({revenue:'Receitas',cost_of_sales:'Custo das vendas',operating_expenses:'Despesas operacionais',personnel:'Pessoal',depreciation:'Depreciação contabilística',interest_expense:'Juros reconhecidos'}as Record<string,string>)[r.code]??r.code}/mês${r.period} (${r.date})`,`Original:${r.originalAmount} ${r.originalCurrency};MZN:${r.value?amount(r.value):'Indeterminado'};${r.reason}`,r.evidence?irpcFxEvidenceLabel(r.evidence):'OrigemMZN;sem conversão']as[string,string,string,string])];}
|
||||
@@ -1,3 +1,5 @@
|
||||
import type {NormalDepreciationModel} from './irpc-normal-depreciation.ts';
|
||||
import type {NormalCostsModel} from './irpc-normal-costs.ts';
|
||||
import type {SchedulesModel} from './irpc-normal-schedules.ts';
|
||||
import {addFractions,decimalFraction,fraction,type FiscalFraction} from './fiscal-rational.ts';
|
||||
|
||||
@@ -24,7 +26,7 @@ const zero=()=>fraction(0n,1n);
|
||||
function money(s:string){if(!/^-?\d+(?:\.\d{1,2})?$/.test(s))throw Error('Montante inválido');const v=decimalFraction(s.startsWith('-')?s.slice(1):s);return s.startsWith('-')?fraction(-BigInt(v.numerator),BigInt(v.denominator)):v;}
|
||||
const units=(f:FiscalFraction)=>BigInt(f.numerator)*100n/BigInt(f.denominator);
|
||||
const difference=(a:FiscalFraction,b:FiscalFraction)=>fraction(BigInt(a.numerator)*BigInt(b.denominator)-BigInt(b.numerator)*BigInt(a.denominator),BigInt(a.denominator)*BigInt(b.denominator));
|
||||
export function closeNormalProfit(input:NormalProfitInput,source:Source|null,rows:Array<{sourceCode:string;adjustment:FiscalFraction|null;status:string}>,accounting:FiscalFraction|null,additions:FiscalFraction,contextReady:boolean,schedules?:SchedulesModel):NormalProfitModel{
|
||||
export function closeNormalProfit(input:NormalProfitInput,source:Source|null,rows:Array<{sourceCode:string;adjustment:FiscalFraction|null;status:string}>,accounting:FiscalFraction|null,additions:FiscalFraction,contextReady:boolean,schedules?:SchedulesModel,costs?:NormalCostsModel,depreciation?:NormalDepreciationModel):NormalProfitModel{
|
||||
validateNormalProfit(input);const pending:string[]=[],lines:NormalProfitModel['lines']=[],topics:NormalProfitModel['topics']=[];
|
||||
if(!contextReady)pending.push('Âmbito,exercício,moeda ou correspondência anual ainda insuficientes.');
|
||||
if(!input.completenessReference.trim())pending.push('Documente que o plano e os ajustamentos abrangem o sujeito passivo/exercício completo;uma oportunidade isolada não equivale automaticamente ao conjunto da empresa.');
|
||||
@@ -36,7 +38,7 @@ export function closeNormalProfit(input:NormalProfitInput,source:Source|null,row
|
||||
try{const amount=money(l.total);remainder=difference(amount,addedBack);if(units(amount)<0n||units(remainder)<0n)issues.push('Valor negativo ou acréscimos superiores à origem;reconcilie a linha sem compensação presumida.');
|
||||
if(!state||!reference.trim())issues.push('Conferência fiscal e suporte da linha em falta.');
|
||||
if(state==='absent'&&(units(amount)!==0n||units(addedBack)!==0n))issues.push('Ausência declarada contradiz o montante conhecido da origem.');
|
||||
if(state==='known'&&l.code==='depreciation'&&units(amount)!==0n&&schedules?.depreciation==null)issues.push('Depreciação contabilística conhecida;amortização fiscal por corresponder,não presumir igualdade.');
|
||||
if(state==='known'&&l.code==='depreciation'&&units(amount)!==0n&&(depreciation?depreciation.adjustment:schedules?.depreciation)==null)issues.push('Depreciação contabilística conhecida;amortização fiscal por corresponder,não presumir igualdade.');
|
||||
if(state==='known'&&l.code==='interest_expense'&&units(remainder)!==0n&&schedules?.interest==null)issues.push('Juros financeiros remanescentes conhecidos;dedutibilidade e eventuais limites por corresponder. Só os juros compensatórios já acrescidos estão cobertos.');
|
||||
if(!['revenue','cost_of_sales','operating_expenses','personnel','depreciation','interest_expense'].includes(l.code))issues.push('Linha financeira sem correspondência neste recorte.');
|
||||
}catch{issues.push('Montante da linha por reconciliar.');}
|
||||
@@ -49,12 +51,14 @@ export function closeNormalProfit(input:NormalProfitInput,source:Source|null,row
|
||||
if(!t.state||!t.reference.trim())reason='Informação em falta;sem zero presumido.';
|
||||
else if(t.state==='absent'){if(t.amount.trim())reason='Ausência declarada com montante preenchido;reconcilie os dois estados.';else{value=zero();reason='Ausência expressamente declarada com suporte;parcela zero apenas por esta declaração.';}}
|
||||
else{try{value=money(t.amount);if(units(value)!==0n)reason='Montante conhecido,mas tratamento específico ainda por corresponder;conservado sem aplicação presumida.';else reason='Valor conhecido zero com suporte;distinto de ausência declarada.';}catch{reason='Montante conhecido por preencher ou inválido.';}}
|
||||
const mapped=schedules?.effects.filter(e=>e.topic===key)??[];
|
||||
const covered=schedules&&mapped.length>0&&mapped.every(e=>e.effect!==null)&&value!==null&&t.state==='known'&&units(addFractions(mapped.flatMap(e=>e.amount?[e.amount]:[])))===units(value);
|
||||
const mapped=[...(schedules?.effects??[]),...(costs?.effects??[])].filter(e=>e.topic===key);
|
||||
const covered=(schedules||costs)&&mapped.length>0&&mapped.every(e=>e.effect!==null)&&value!==null&&t.state==='known'&&units(addFractions(mapped.flatMap(e=>e.amount?[e.amount]:[])))===units(value);
|
||||
if(covered)reason='Montante reconciliado com as regras do mapa complementar; efeito fiscal discriminado por linha.';
|
||||
if(value===null||units(value)!==0n&&!covered||t.state==='absent'&&!!t.amount.trim()||mapped.length>0&&!covered)pending.push(label+': '+(mapped.length&&!covered?'Mapa complementar não reconciliado com este estado/montante. ': '')+reason);
|
||||
topics.push({...structuredClone(t),key,label,value,reason});
|
||||
}
|
||||
if(schedules)pending.push(...schedules.pending);
|
||||
return{input:structuredClone(input),lines,topics,pending,taxableProfit:pending.length===0&&accounting?addFractions([accounting,additions,...(schedules?[schedules.net]:[])]):null,source:schedules?'CIRPC17/18/20/21/22/24/36; Decreto72/2013 art3–7. Mapa complementar de efeitos com sinal reconciliado por tema, juros financeiros ordinários e quotas anuais constantes documentadas. Simulação emMZN/2026; benefícios e casos especiais separados emL7, saldo anual emL8.':'CIRPC17(1)/18/20/22/36(1)c;recorte anual2026,residente geral,MZN. Resultado antes de imposto + acréscimos36(1)c;demais correcções/variações sem efeito apenas quando ausência ou zero conhecidos expressamente suportados. Receita/custos ordinários classificados pelo utilizador;depreciação fiscal e juros financeiros remanescentes fora deste percurso. Lucro tributável simulado,não matéria colectável,colecta ou declaraçãoM20/22.'};
|
||||
if(costs)pending.push(...costs.pending);
|
||||
if(depreciation&&!schedules)pending.push(...depreciation.pending);
|
||||
return{input:structuredClone(input),lines,topics,pending,taxableProfit:pending.length===0&&accounting?addFractions([accounting,additions,...(schedules?[schedules.net]:[]),...(costs?[costs.net]:[]),...(depreciation&&!schedules&&depreciation.adjustment?[depreciation.adjustment]:[])]):null,source:schedules?'CIRPC17/18/20/21/22/24/36; Decreto72/2013 art3–7. Mapa complementar de efeitos com sinal reconciliado por tema, juros financeiros ordinários e quotas anuais constantes documentadas. Simulação emMZN/2026; benefícios e casos especiais separados emL7, saldo anual emL8.':'CIRPC17(1)/18/20/22/36(1)c;recorte anual2026,residente geral,MZN. Resultado antes de imposto + acréscimos36(1)c;demais correcções/variações sem efeito apenas quando ausência ou zero conhecidos expressamente suportados. Receita/custos ordinários classificados pelo utilizador;depreciação fiscal e juros financeiros remanescentes fora deste percurso. Lucro tributável simulado,não matéria colectável,colecta ou declaraçãoM20/22.'};
|
||||
}
|
||||
|
||||
@@ -41,7 +41,7 @@ const z=()=>fraction(0n);
|
||||
export const fiscalMoney=(s:string)=>{if(!/^\d{1,18}(?:\.\d{1,2})?$/.test(s))throw Error('Montante não negativo com até dois decimais necessário.');return decimalFraction(s);};
|
||||
const cmp=(a:FiscalFraction,b:FiscalFraction)=>BigInt(a.numerator)*BigInt(b.denominator)-BigInt(b.numerator)*BigInt(a.denominator);
|
||||
export type SchedulesModel=ReturnType<typeof calculateSchedules>;
|
||||
export function calculateSchedules(s:NormalSchedules,source:{accountingLines:Array<{code:string;total:string;accountingEffect:string}>}|null,oldRows:Array<{sourceCode:string;document:string;line:string;amount:string;adjustment:FiscalFraction|null}>){
|
||||
export function calculateSchedules(s:NormalSchedules,source:{accountingLines:Array<{code:string;total:string;accountingEffect:string}>}|null,oldRows:Array<{sourceCode:string;document:string;line:string;amount:string;adjustment:FiscalFraction|null}>,depreciationOverride?:{value:FiscalFraction|null;pending:string[]}){
|
||||
validateSchedules(s);const pending:string[]=[],effects:Array<{id:string;topic:string;amount:FiscalFraction|null;effect:FiscalFraction|null;reason:string}>=[];
|
||||
for(const r of s.rows){const issues:string[]=[],rule=r.rule?scheduleRules[r.rule]:null;let amount:FiscalFraction|null=null,effect:FiscalFraction|null=null;
|
||||
if(!rule||!r.reference.trim()||!r.document.trim()||!r.line.trim()||r.conditions!=='yes')issues.push('Regra, documento/linha, suporte e condições por identificar.');
|
||||
@@ -56,7 +56,7 @@ export function calculateSchedules(s:NormalSchedules,source:{accountingLines:Arr
|
||||
}
|
||||
let interest:FiscalFraction|null=null;const interestOrigin=source?.accountingLines.find(l=>l.code==='interest_expense');
|
||||
try{const corrected=s.rows.filter(r=>r.sourceCode==='interest_expense'&&r.rule&&(scheduleRules[r.rule][1]==='expenseCorrections'||r.rule==='future_cost'));const corrections=corrected.map(r=>{const e=effects.find(e=>e.id===r.id);if(!e?.effect)throw Error();return e.effect;});const remaining=subtractFractions(fiscalMoney(interestOrigin?.total??''),addFractions([...oldRows.filter(r=>r.sourceCode==='interest_expense').flatMap(r=>r.adjustment?[r.adjustment]:[]),...corrections]));interest=fiscalMoney(s.interest.amount);if(cmp(interest,remaining)!==0n||!s.interest.reference.trim()||s.interest.conditions!=='yes')throw Error();}catch{interest=null;}
|
||||
const assets=s.assets.map(a=>{const issues:string[]=[];let accounting:FiscalFraction|null=null,fiscal:FiscalFraction|null=null,adjustment:FiscalFraction|null=null;
|
||||
const assets=(depreciationOverride?[]:s.assets).map(a=>{const issues:string[]=[];let accounting:FiscalFraction|null=null,fiscal:FiscalFraction|null=null,adjustment:FiscalFraction|null=null;
|
||||
try{const cost=fiscalMoney(a.cost),residual=fiscalMoney(a.residual),previous=fiscalMoney(a.previousFiscal),rate=fiscalMoney(a.rate);accounting=fiscalMoney(a.accounting);const depreciable=subtractFractions(cost,residual);if(cmp(depreciable,z())<0n||cmp(previous,depreciable)>0n||cmp(rate,z())<=0n||cmp(rate,fraction(100n))>0n)throw Error();const annual=fraction(BigInt(depreciable.numerator)*BigInt(rate.numerator),BigInt(depreciable.denominator)*BigInt(rate.denominator)*100n);const available=subtractFractions(depreciable,previous);fiscal=cmp(annual,available)>0n?available:annual;
|
||||
if(cmp(fiscal,accounting)>0n)issues.push('Quota fiscal superior à contabilizada neste exercício; dedução de quotas anteriormente tributadas exige mapa próprio, sem presunção.');
|
||||
}catch{issues.push('Custo, residual, taxa, acumulado fiscal e depreciação contabilizada por reconciliar.');}
|
||||
@@ -64,8 +64,9 @@ export function calculateSchedules(s:NormalSchedules,source:{accountingLines:Arr
|
||||
if(!/^20\d{2}-\d{2}-\d{2}$/.test(a.inUseFrom)||!Number.isFinite(Date.parse(a.inUseFrom))||new Date(a.inUseFrom).toISOString().slice(0,10)!==a.inUseFrom||a.inUseFrom>(s.period.from||'2026-01-01')||a.inUseFrom<'2014-01-01'||!a.description.trim()||!a.tableReference.trim()||!a.reference.trim()||a.conditions!=='yes')issues.push('Identifique activo próprio, em uso no início do período, tabela/taxa aplicável, vida útil e condições do método constante anual; casos especiais/duodécimos separados.');
|
||||
if(['computer','server'].includes(a.category)&&/^20\d{2}-\d{2}-\d{2}$/.test(a.inUseFrom)){const limit=new Date(a.inUseFrom+'T00:00:00Z');if(Number.isFinite(+limit)){limit.setUTCFullYear(limit.getUTCFullYear()+(a.category==='computer'?8:10));if((s.period.from||'2026-01-01')>=limit.toISOString().slice(0,10))issues.push('Período máximo de vida útil excedido, artigo5; excepção específica não implementada.');}}
|
||||
if(!issues.length&&accounting&&fiscal)adjustment=subtractFractions(accounting,fiscal);if(issues.length)pending.push(a.description+': '+issues.join(' '));return{...structuredClone(a),accountingValue:accounting,fiscal,adjustment,reason:issues.join(' ')||'Decreto72/2013 art3–7; quota constante anual documentada, limitada ao saldo fiscal depreciável; diferença para a depreciação contabilística.'};});
|
||||
let depreciation:FiscalFraction|null=null;try{const total=addFractions(assets.map(a=>a.accountingValue??z()));if(s.assetsReference.trim()&&assets.every(a=>a.adjustment!==null)&&cmp(total,fiscalMoney(source?.accountingLines.find(l=>l.code==='depreciation')?.total??''))===0n)depreciation=addFractions(assets.map(a=>a.adjustment!));}catch{/* linha de origem desconhecida */}
|
||||
let depreciation:FiscalFraction|null=depreciationOverride?.value??null;if(!depreciationOverride)try{const total=addFractions(assets.map(a=>a.accountingValue??z()));if(s.assetsReference.trim()&&assets.every(a=>a.adjustment!==null)&&cmp(total,fiscalMoney(source?.accountingLines.find(l=>l.code==='depreciation')?.total??''))===0n)depreciation=addFractions(assets.map(a=>a.adjustment!));}catch{/* linha de origem desconhecida */}
|
||||
if(assets.length&&(oldRows.some(r=>r.sourceCode==='depreciation')||s.rows.some(r=>r.sourceCode==='depreciation'))){depreciation=null;pending.push('Depreciação repartida entre mapas de ajustamentos e activos: reconcilie as parcelas sem sobreposição antes de aplicar a quota fiscal.');}
|
||||
if(assets.length&&depreciation===null)pending.push('Mapa de activos sem reconciliação integral com a depreciação da origem; efeito fiscal não aplicado.');
|
||||
if(depreciationOverride)pending.push(...depreciationOverride.pending);
|
||||
return{input:structuredClone(s),effects,interest,depreciation,assets,pending,net: addFractions([...effects.flatMap(r=>r.effect?[r.effect]:[]),...(depreciation?[depreciation]:[])]),source:'CIRPC18/21/22/24/36; Decreto72/2013 art3–7. Entradas documentadas, sem taxas de activos sugeridas nem casos especiais presumidos.'};
|
||||
}
|
||||
|
||||
@@ -1,3 +1,7 @@
|
||||
import {normalFormPreparationVersion,validateNormalFormPreparation,prepareNormalForms,normalFormPreparationReport,type NormalFormPreparationInput,type NormalFormPreparationModel} from './irpc-normal-form-preparation.ts';
|
||||
import {normalPeriodFxVersion,validateNormalPeriodFx,mapNormalPeriodFx,normalPeriodFxDependency,normalPeriodFxReport,type NormalPeriodFxInput,type NormalPeriodFxModel} from './irpc-normal-period-fx.ts';
|
||||
import {normalDepreciationVersion,validateNormalDepreciation,calculateNormalDepreciation,normalDepreciationReport,type NormalDepreciationInput,type NormalDepreciationModel} from './irpc-normal-depreciation.ts';
|
||||
import {normalCostsVersion,validateNormalCosts,calculateNormalCosts,normalCostReport,type NormalCostsInput,type NormalCostsModel} from './irpc-normal-costs.ts';
|
||||
import {normalFormFields} from './irpc-normal-forms.ts';
|
||||
import {normalSchedulesVersion,normalSchedulePeriod,validateSchedules,calculateSchedules,type NormalSchedules,type SchedulesModel} from './irpc-normal-schedules.ts';
|
||||
import {normalAssessmentVersion,validateNormalAssessment,calculateNormalAssessment,type NormalAssessmentInput,type NormalAssessmentModel} from './irpc-normal-assessment.ts';
|
||||
@@ -11,18 +15,23 @@ import {addFractions,decimalFraction,fraction,fractionPresentation,type FiscalFr
|
||||
export const irpcNormalVersion='IRPC-normal-adjustments/1';
|
||||
export const irpcNormalSource='CIRPC Lei34/2007 art17(1),PDF6/p768(60):resultado e correcções;art36(1)c,PDF10/p768(64):multas e encargos por infracções sem origem contratual,incluindo juros compensatórios. Lei4/2012 PDF2 altera17(6)/acrescenta36(1)o;Lei19/2013 PDF2 mantém36(1)a–o e acrescenta p/q. Lei12/2025 altera3/5/20/62/67/75,adita61-A e revoga39/47/75(2)/76;sem alteração deste recorte36(1)c. Não é apuramento integral nem Modelo20/22.';
|
||||
export type NormalAdjustment={id:string;sourceCode:string;document:string;line:string;amount:string;rule:''|'noncontractual_fine'|'compensatory_interest'|'other';included:''|'yes'|'no';reference:string};
|
||||
export type NormalBook={version:1;year:string;mappingReference:string;scope:''|'resident_general'|'ep_general'|'other';scopeReference:string;rows:NormalAdjustment[];profit?:NormalProfitInput;base?:NormalBaseInput;assessment?:NormalAssessmentInput;schedules?:NormalSchedules;result?:NormalRecord;history?:NormalRecord[]};
|
||||
type NormalModel={fiscalPeriod?:ReturnType<typeof normalSchedulePeriod>;schedules?:SchedulesModel;currentLoss?:FiscalFraction|null;assessment?:NormalAssessmentModel;colecta?:FiscalFraction|null;base?:NormalBaseModel;profit?:NormalProfitModel;version:string;year:string;currency:string;origin:'projected';accountingProfit:FiscalFraction|null;additions:FiscalFraction;partialAdjustedResult:FiscalFraction|null;taxableProfit:FiscalFraction|null;taxableBase:FiscalFraction|null;tax:null;rows:Array<NormalAdjustment&{status:'calculated'|'indeterminate'|'outside_scope';adjustment:FiscalFraction|null;reason:string}>;pending:string[];source:string};
|
||||
export type NormalBook={version:1;year:string;mappingReference:string;scope:''|'resident_general'|'ep_general'|'other';scopeReference:string;rows:NormalAdjustment[];profit?:NormalProfitInput;base?:NormalBaseInput;assessment?:NormalAssessmentInput;schedules?:NormalSchedules;costs?:NormalCostsInput;depreciation?:NormalDepreciationInput;forms?:NormalFormPreparationInput;periodsFx?:NormalPeriodFxInput;result?:NormalRecord;history?:NormalRecord[]};
|
||||
type NormalModel={formPreparation?:NormalFormPreparationModel;periodsFx?:NormalPeriodFxModel;depreciation?:NormalDepreciationModel;costs?:NormalCostsModel;fiscalPeriod?:{kind:string;from:string;to:string;reference:string;pending:string[]};schedules?:SchedulesModel;currentLoss?:FiscalFraction|null;assessment?:NormalAssessmentModel;colecta?:FiscalFraction|null;base?:NormalBaseModel;profit?:NormalProfitModel;version:string;year:string;currency:string;origin:'projected';accountingProfit:FiscalFraction|null;additions:FiscalFraction;partialAdjustedResult:FiscalFraction|null;taxableProfit:FiscalFraction|null;taxableBase:FiscalFraction|null;tax:null;rows:Array<NormalAdjustment&{status:'calculated'|'indeterminate'|'outside_scope';adjustment:FiscalFraction|null;reason:string}>;pending:string[];source:string};
|
||||
type NormalRecord={key:string;createdAt:string;model:NormalModel};
|
||||
export const newNormalBook=():NormalBook=>({version:1,year:'',mappingReference:'',scope:'',scopeReference:'',rows:[]});
|
||||
export const newNormalAdjustment=(id:string):NormalAdjustment=>({id,sourceCode:'',document:'',line:'',amount:'',rule:'',included:'',reference:''});
|
||||
export function normalFinancialSource(d:Record<string,unknown>){
|
||||
export function rawNormalFinancialSource(d:Record<string,unknown>){
|
||||
const p=restoreBusinessPlanSnapshot(String(d.business_plan_snapshot??''));if(!p)return null;
|
||||
const forecast=forecastBusinessPlan(p),bridge=buildFinancialFiscalBridge(forecast);
|
||||
return{...bridge,periods:forecast.rows.length,origin:'projected' as const,scope:acquisitionScope(d)};
|
||||
}
|
||||
export function normalFinancialSource(d:Record<string,unknown>){const raw=rawNormalFinancialSource(d),input=normalBook(d).periodsFx;return input?mapNormalPeriodFx(d,input,raw).source:raw;}
|
||||
function store(d:Record<string,unknown>){const s=JSON.parse(String(d.modelo_a_snapshot||'{"version":1,"books":{}}'));if(s.version!==1||!s.books||typeof s.books!=='object'||Array.isArray(s.books))throw Error('Livros fiscais não recuperáveis;originais preservados.');return s;}
|
||||
export function validateNormal(b:NormalBook){
|
||||
if(b?.forms!==undefined)validateNormalFormPreparation(b.forms);
|
||||
if(b?.periodsFx!==undefined)validateNormalPeriodFx(b.periodsFx);
|
||||
if(b?.depreciation!==undefined)validateNormalDepreciation(b.depreciation);
|
||||
if(b?.costs!==undefined)validateNormalCosts(b.costs);
|
||||
if(b?.schedules!==undefined)validateSchedules(b.schedules);
|
||||
if(b?.assessment!==undefined)validateNormalAssessment(b.assessment);
|
||||
if(b?.base!==undefined)validateNormalBase(b.base);
|
||||
@@ -30,23 +39,27 @@ export function validateNormal(b:NormalBook){
|
||||
if(!b||b.version!==1||['year','mappingReference','scopeReference'].some(k=>typeof b[k as 'year']!=='string')||!['','resident_general','ep_general','other'].includes(b.scope)||!Array.isArray(b.rows)||b.history!==undefined&&!Array.isArray(b.history))throw Error('Preparação IRPC normal não recuperável.');
|
||||
for(const r of b.rows)if(!r||Object.keys(newNormalAdjustment('')).some(k=>typeof r[k as keyof NormalAdjustment]!=='string')||!['','noncontractual_fine','compensatory_interest','other'].includes(r.rule)||!['','yes','no'].includes(r.included))throw Error('Ajustamento IRPC não recuperável;original conservado.');
|
||||
if(new Set(b.rows.map(r=>r.id)).size!==b.rows.length)throw Error('Identificador de ajustamento duplicado.');
|
||||
for(const r of [b.result,...(b.history??[])])if(r&&(!r.model||![irpcNormalVersion,normalProfitVersion,normalBaseVersion,normalAssessmentVersion,normalSchedulesVersion].includes(r.model.version)||typeof r.key!=='string'||typeof r.createdAt!=='string'||!Array.isArray(r.model.rows)||!Array.isArray(r.model.pending)))throw Error('Histórico IRPC normal não recuperável.');
|
||||
for(const r of [b.result,...(b.history??[])])if(r&&(!r.model||![irpcNormalVersion,normalProfitVersion,normalBaseVersion,normalAssessmentVersion,normalSchedulesVersion,normalCostsVersion,normalDepreciationVersion,normalPeriodFxVersion,normalFormPreparationVersion].includes(r.model.version)||typeof r.key!=='string'||typeof r.createdAt!=='string'||!Array.isArray(r.model.rows)||!Array.isArray(r.model.pending)))throw Error('Histórico IRPC normal não recuperável.');
|
||||
}
|
||||
export function normalBook(d:Record<string,unknown>):NormalBook{
|
||||
const m=store(d).irpcNormal;if(m===undefined)return newNormalBook();if(!m||typeof m!=='object'||Array.isArray(m))throw Error('Mapa IRPC normal não recuperável.');const b=m[acquisitionScope(d)]??newNormalBook();validateNormal(b);return b;
|
||||
}
|
||||
export function saveNormalBook(d:Record<string,unknown>,b:NormalBook){validateNormal(b);const s=store(d);if(s.irpcNormal!==undefined&&(!s.irpcNormal||typeof s.irpcNormal!=='object'||Array.isArray(s.irpcNormal)))throw Error('Mapa IRPC normal não recuperável.');return JSON.stringify({...s,irpcNormal:{...s.irpcNormal,[acquisitionScope(d)]:b}});}
|
||||
function key(d:Record<string,unknown>,b:NormalBook){return JSON.stringify([b.schedules?normalSchedulesVersion:b.assessment?normalAssessmentVersion:b.base?normalBaseVersion:b.profit?normalProfitVersion:irpcNormalVersion,acquisitionScope(d),d.business_plan_snapshot??'',b.year,b.mappingReference,b.scope,b.scopeReference,b.rows,...(b.profit?[b.profit]:[]),...(b.base?[b.base]:[]),...(b.assessment?[b.assessment]:[]),...(b.schedules?[b.schedules]:[])]);}
|
||||
function key(d:Record<string,unknown>,b:NormalBook){return JSON.stringify([b.forms?normalFormPreparationVersion:b.periodsFx?normalPeriodFxVersion:b.depreciation?normalDepreciationVersion:b.costs?normalCostsVersion:b.schedules?normalSchedulesVersion:b.assessment?normalAssessmentVersion:b.base?normalBaseVersion:b.profit?normalProfitVersion:irpcNormalVersion,acquisitionScope(d),d.business_plan_snapshot??'',b.year,b.mappingReference,b.scope,b.scopeReference,b.rows,...(b.profit?[b.profit]:[]),...(b.base?[b.base]:[]),...(b.assessment?[b.assessment]:[]),...(b.schedules?[b.schedules]:[]),...(b.costs?[b.costs]:[]),...(b.depreciation?[b.depreciation]:[]),...(b.periodsFx?[b.periodsFx,normalPeriodFxDependency(d,b.periodsFx)]:[]),...(b.forms?[b.forms]:[])]);}
|
||||
export function normalCurrent(d:Record<string,unknown>,b:NormalBook){return !!b.result&&b.result.key===key(d,b);}
|
||||
const zero=()=>fraction(0n,1n);
|
||||
const cents=(s:string)=>{if(!/^-?\d+(?:\.\d{1,2})?$/.test(s))throw Error('Montante MZN inválido;máximo dois decimais.');const v=decimalFraction(s.startsWith('-')?s.slice(1):s);return s.startsWith('-')?fraction(-BigInt(v.numerator),BigInt(v.denominator)):v;};
|
||||
const integerCents=(v:FiscalFraction)=>BigInt(v.numerator)*100n/BigInt(v.denominator);
|
||||
export function calculateNormal(d:Record<string,unknown>,b:NormalBook):NormalModel{
|
||||
validateNormal(b);const pending:string[]=[],source=normalFinancialSource(d),fiscalPeriod=b.schedules?normalSchedulePeriod(b.schedules,b.scope):undefined;
|
||||
validateNormal(b);const pending:string[]=[],raw=rawNormalFinancialSource(d),periodsFx=b.periodsFx?mapNormalPeriodFx(d,b.periodsFx,raw):undefined,source=periodsFx?periodsFx.source:raw,fiscalPeriod=periodsFx?{kind:b.periodsFx!.kind,from:b.periodsFx!.from,to:b.periodsFx!.to,reference:b.periodsFx!.reference,pending:periodsFx.pending}:b.schedules?normalSchedulePeriod(b.schedules,b.scope):undefined;
|
||||
if(periodsFx&&b.periodsFx!.kind==='annual'&&b.periodsFx!.from!=='2026-01-01'){
|
||||
const formal=b.schedules?normalSchedulePeriod(b.schedules,b.scope):null;
|
||||
if(!formal||formal.pending.length||formal.from!==b.periodsFx!.from||formal.to!==b.periodsFx!.to)fiscalPeriod!.pending.push('Ano diferente do civil exige o período autorizado/comunicado já documentado nos mapas,com as mesmas datas.');
|
||||
}
|
||||
if(fiscalPeriod)pending.push(...fiscalPeriod.pending);
|
||||
if(!source)pending.push('Falta plano financeiro reconciliado.');
|
||||
if(source?.currency!=='MZN')pending.push('Ponte em MZN necessária;sem conversão fiscal anual presumida.');
|
||||
if(!/^2026$/.test(b.year)||!b.mappingReference.trim()||source?.periods!==12)pending.push('Documente correspondência dos 12 meses do plano ao exercício2026;outros exercícios/horizontes permanecem separados.');
|
||||
if(!/^2026$/.test(b.year)||!b.mappingReference.trim()||source?.periods!==(periodsFx?.months??12))pending.push('Documente correspondência dos 12 meses do plano ao exercício2026;outros exercícios/horizontes permanecem separados.');
|
||||
if(!(b.scope==='resident_general'||b.schedules&&b.scope==='ep_general')||!b.scopeReference.trim())pending.push('Identifique sujeito residente no regime geral,fora de transparência/regimes especiais;EP e outros âmbitos não abrangidos.');
|
||||
const rows:NormalModel['rows']=b.rows.map(r=>({...structuredClone(r),status:'indeterminate',adjustment:null,reason:''}));
|
||||
const amounts=new Map<string,FiscalFraction>(),groups=new Map<string,NormalModel['rows']>();
|
||||
@@ -67,22 +80,27 @@ export function calculateNormal(d:Record<string,unknown>,b:NormalBook):NormalMod
|
||||
for(const r of rows){if(!r.reason){r.status='calculated';r.adjustment=amounts.get(r.id)!;r.reason='Acréscimo integral de custo incluído no resultado de partida,qualificado pelo utilizador como '+(r.rule==='noncontractual_fine'?'multa/encargo de infracção sem origem contratual':'juros compensatórios')+';CIRPC36(1)c. Projecção pelos pressupostos do plano.';}else pending.push(r.document+': '+r.reason);}
|
||||
const additions=addFractions(rows.flatMap(r=>r.adjustment?[r.adjustment]:[]));
|
||||
const accountingProfit=source?.currency==='MZN'?cents(source.accountingProfitBeforeTax):null;
|
||||
const contextReady=(!fiscalPeriod||fiscalPeriod.pending.length===0)&&!!source&&source.currency==='MZN'&&source.periods===12&&b.year==='2026'&&!!b.mappingReference.trim()&&(b.scope==='resident_general'||!!b.schedules&&b.scope==='ep_general')&&!!b.scopeReference.trim();
|
||||
const contextReady=(!fiscalPeriod||fiscalPeriod.pending.length===0)&&!!source&&source.currency==='MZN'&&source.periods===(periodsFx?.months??12)&&b.year==='2026'&&!!b.mappingReference.trim()&&(b.scope==='resident_general'||!!b.schedules&&b.scope==='ep_general')&&!!b.scopeReference.trim();
|
||||
if(rows.length===0&&!b.profit)pending.push('Sem ajustamentos documentados;ausência de registos não prova inexistência de correcções.');
|
||||
if(!b.profit)pending.push('L6 parcial:resultado ajustado apenas destes acréscimos;restantes custos/variações patrimoniais,amortizações,perdas,deduções e colecta por tratar. Lucro tributável,matéria colectável e imposto indeterminados.');
|
||||
const schedules=b.schedules?calculateSchedules(b.schedules,source,rows):undefined;
|
||||
const profit=b.profit?closeNormalProfit(b.profit,source,rows,accountingProfit,additions,contextReady,schedules):undefined;
|
||||
const depreciation=b.depreciation?calculateNormalDepreciation(b.depreciation,source,fiscalPeriod??{from:b.year+'-01-01',to:b.year+'-12-31'},[...b.rows,...(b.schedules?.rows??[]),...(b.costs?.rows??[])],!!periodsFx?.short):undefined;
|
||||
const schedules=b.schedules?calculateSchedules(b.schedules,source,rows,depreciation?{value:depreciation.adjustment,pending:depreciation.pending}:undefined):undefined;
|
||||
const costs=b.costs?calculateNormalCosts(b.costs,source,[...b.rows,...(b.schedules?.rows??[])],fiscalPeriod??{from:'2026-01-01',to:b.year+'-12-31'},!!periodsFx?.short):undefined;
|
||||
const profit=b.profit?closeNormalProfit(b.profit,source,rows,accountingProfit,additions,contextReady,schedules,costs,depreciation):undefined;
|
||||
if(profit&&periodsFx)profit.source='CIRPC17/18/20/21/22/24/36;'+periodsFx.rule+' L7 mantém benefícios/casos especiais;L8 mantém saldo final.';
|
||||
if(profit)pending.push(...profit.pending,...(!b.base?['Matéria colectável,perdas reportadas,deduções e imposto não apurados neste percurso.']:[]));
|
||||
const base=b.base?calculateNormalBase(b.base,profit?.taxableProfit??null,b.year,b.schedules?.currentLossReference):undefined;
|
||||
const base=b.base?calculateNormalBase(b.base,profit?.taxableProfit??null,b.year,b.schedules?.currentLossReference,!!periodsFx?.short):undefined;
|
||||
if(base)pending.push(...base.pending,...(!b.assessment?['Colecta/imposto a pagar,créditos anuais eM20/M22 não determinados;matéria colectável não é imposto.']:[]));
|
||||
const assessment=b.assessment?calculateNormalAssessment(b.assessment,base?.taxableBase??null,{year:b.year,scope:b.scope,extended:!!b.schedules,currency:source?.currency??'',...(fiscalPeriod?{period:{from:fiscalPeriod.from,to:fiscalPeriod.to}}:{})}):undefined;
|
||||
const assessment=b.assessment?calculateNormalAssessment(b.assessment,base?.taxableBase??null,{year:b.year,scope:b.scope,extended:!!b.schedules||!!periodsFx,short:!!periodsFx?.short,currency:source?.currency??'',...(fiscalPeriod?{period:{from:fiscalPeriod.from,to:fiscalPeriod.to}}:{})}):undefined;
|
||||
if(assessment)pending.push(...assessment.pending,assessment.finalBalance.reason);
|
||||
const currentLoss=b.schedules&&profit?.taxableProfit&&BigInt(profit.taxableProfit.numerator)<0n?fraction(-BigInt(profit.taxableProfit.numerator),BigInt(profit.taxableProfit.denominator)):null;
|
||||
return{...(schedules?{schedules,currentLoss,fiscalPeriod}:{}),...(assessment?{assessment,colecta:assessment.colecta}:{}),...(base?{base}:{}),...(profit?{profit}:{}),version:b.schedules?normalSchedulesVersion:b.assessment?normalAssessmentVersion:b.base?normalBaseVersion:b.profit?normalProfitVersion:irpcNormalVersion,year:b.year,currency:source?.currency??'',origin:'projected',accountingProfit,additions,partialAdjustedResult:contextReady&&rows.length>0&&rows.every(r=>r.status==='calculated')&&accountingProfit?addFractions([accountingProfit,additions]):null,taxableProfit:profit?.taxableProfit??null,taxableBase:base?.taxableBase??null,tax:null,rows,pending,source:irpcNormalSource+(b.schedules?' Mapas complementares: CIRPC18/21/22/24/36; Decreto72/2013 art3–7. EP: CIRPC15(1)c, apenas resultado imputável ao estabelecimento no regime geral, anual2026/MZN.':'')};
|
||||
const model:NormalModel={...(periodsFx?{periodsFx}:{}),...(depreciation?{depreciation}:{}),...(costs?{costs}:{}),...(schedules?{schedules,currentLoss,fiscalPeriod}:{}),...(assessment?{assessment,colecta:assessment.colecta}:{}),...(base?{base}:{}),...(profit?{profit}:{}),version:b.forms?normalFormPreparationVersion:b.periodsFx?normalPeriodFxVersion:b.depreciation?normalDepreciationVersion:b.costs?normalCostsVersion:b.schedules?normalSchedulesVersion:b.assessment?normalAssessmentVersion:b.base?normalBaseVersion:b.profit?normalProfitVersion:irpcNormalVersion,year:b.year,currency:source?.currency??'',origin:'projected',accountingProfit,additions,partialAdjustedResult:contextReady&&rows.length>0&&rows.every(r=>r.status==='calculated')&&accountingProfit?addFractions([accountingProfit,additions]):null,taxableProfit:profit?.taxableProfit??null,taxableBase:base?.taxableBase??null,tax:null,rows,pending,source:irpcNormalSource+(periodsFx?' '+periodsFx.rule:b.schedules?' Mapas complementares: CIRPC18/21/22/24/36; Decreto72/2013 art3–7. EP: CIRPC15(1)c, apenas resultado imputável ao estabelecimento no regime geral, anual2026/MZN.':'')};
|
||||
if(b.forms){model.formPreparation=prepareNormalForms(b.forms,model,source);model.pending.push(...model.formPreparation.pending.map(p=>'Preparação M20/M22: '+p));}
|
||||
return model;
|
||||
}
|
||||
export function recordNormal(d:Record<string,unknown>,b:NormalBook,now=new Date().toISOString()):NormalBook{return{...b,history:b.result?[...(b.history??[]),structuredClone(b.result)]:b.history??[],result:{key:key(d,b),createdAt:now,model:calculateNormal(d,b)}};}
|
||||
const money=(v:FiscalFraction|null)=>v?fractionPresentation(v).decimal+' MZN':'Indeterminado';
|
||||
function normalBaseReport(m:NormalBaseModel):Array<[string,string,string,string]>{return[['IRPC normal — L6','Matéria colectável — deduções/perdas',`Lucro tributável:${money(m.taxableProfit)};perdas propostas elegíveis:${money(m.requestedLosses)};perdas deduzidas nesta simulação:${money(m.deductedLosses)};benefícios deduzidos:${money(m.benefitDeduction)};matéria colectável simulada:${money(m.taxableBase)};imposto a pagar:Indeterminado. ${m.pending.join(' | ')}`,`NUIT:${m.input.subjectNuit};${m.input.identityReference};método:${m.input.method==='direct'?'Declarativo/directo':m.input.method==='indirect'?'Indirecto':'Por identificar'};${m.input.methodReference};perdas:${m.input.lossesState==='absent'?'Ausência declarada':m.input.lossesState==='known'?'Conhecidas':'Informação em falta'};${m.input.lossesReference};objecto:${m.input.unchangedObject==='yes'?'Sem alteração declarada':m.input.unchangedObject==='no'?'Alteração declarada':'Por esclarecer'};${m.input.objectReference};${m.source}`],['IRPC normal — L6','Benefícios à matéria colectável',`Estado:${m.input.benefits.state==='known'?'Valor conhecido':m.input.benefits.state==='absent'?'Ausência declarada':'Informação em falta'};montante original:${m.input.benefits.amount||'Não preenchido'};dedução:${money(m.benefitDeduction)};não inclui créditos à colecta ou retenções sofridas.`,m.input.benefits.reference],...m.losses.map(l=>['IRPC normal — L6','Perda fiscal de '+l.year,`Estado:${l.status==='eligible'?'Elegível neste recorte':l.status==='excluded'?'Excluída neste exercício':'Indeterminada'};apurada:${l.assessed};utilizada antes:${l.previouslyUsed};saldo:${money(l.available)};utilização proposta:${l.requested};dedução nesta simulação:${money(l.deducted)};saldo aritmético posterior:${money(l.remaining)};último exercício ordinário:${l.lastOrdinaryYear??'Por determinar'};${l.reason}`,`NUIT:${l.subjectNuit};${l.reference};sem consumo do saldo oficial nem reporte automático.`]as[string,string,string,string])];}
|
||||
function normalAssessmentReport(m:NormalAssessmentModel):Array<[string,string,string,string]>{return[['IRPC normal — L6','Colecta — regime normal',`Matéria colectável:${money(m.taxableBase)};taxa:${m.rate?m.rate.numerator+'%':'Por identificar'};colecta simulada:${money(m.colecta)};${m.classification};${m.centExact===false?'Valor racional exacto com fracção de cêntimo;sem arredondamento fiscal aplicado.':''}${m.pending.join(' | ')}`,`Exercício:${m.period.year};período:${m.period.from}–${m.period.to};${m.input.reference};${m.rule};${m.source}`],['IRPC normal — L6','Saldo final — âmbito L8','A pagar:Indeterminado;a recuperar:Indeterminado. '+m.finalBalance.reason,'Sequência:lucro tributável → matéria colectável → colecta → saldo final;retenções,pagamentos e créditos anuais reservados aL8.']];}
|
||||
export function normalReportRows(d:Record<string,unknown>):Array<[string,string,string,string]>{try{const b=normalBook(d),r=b.result;if(!r)return[];const m=r.model;return[['IRPC normal — L6','Ajustamentos ao resultado financeiro',`Exercício:${m.year};resultado contabilístico antes de imposto:${money(m.accountingProfit)};acréscimos demonstrados:${money(m.additions)};resultado parcial ajustado:${money(m.partialAdjustedResult)};${m.profit?'lucro tributável simulado:'+money(m.taxableProfit)+(m.base?';matéria colectável simulada:'+money(m.taxableBase)+(m.assessment?';colecta simulada:'+money(m.colecta??null)+';saldo final a pagar ou recuperar:Indeterminado (L8).':';imposto a pagar:Indeterminado.'):';matéria colectável/imposto:Indeterminados.'):'lucro tributável/matéria colectável/imposto:Indeterminados.'} Projecção com pressupostos;${m.pending.join(' | ')}`,`${normalCurrent(d,b)?'Entradas correspondentes':'Histórico;origem ou entradas alteradas'};${r.createdAt};${m.source}`],...(m.base?normalBaseReport(m.base):[]),...(m.assessment?normalAssessmentReport(m.assessment):[]),...(m.schedules?[['IRPC normal — L6','Mapas complementares',`Efeito líquido adicional:${money(m.schedules.net)};perda fiscal do próprio exercício:${money(m.currentLoss??null)};sem reporte ou consumo automático. ${m.schedules.pending.join(' | ')}`,m.schedules.source]as[string,string,string,string],...m.schedules.effects.map(e=>{const i=m.schedules!.input.rows.find(r=>r.id===e.id)!;return['IRPC normal — L6',i.document+'/'+i.line,`Montante:${money(e.amount)};efeito:${money(e.effect)};${e.reason}`,`${i.reference};exercício de imputação:${i.fiscalYear||'Não aplicável'}`]as[string,string,string,string];}),...m.schedules.assets.map(a=>['IRPC normal — L6',a.description,`Depreciação contabilística:${money(a.accountingValue)};quota fiscal:${money(a.fiscal)};acréscimo:${money(a.adjustment)};${a.reason}`,`${a.tableReference};${a.reference}`]as[string,string,string,string]),['IRPC normal — L6','Juros financeiros ordinários',`Remanescente aceite no recorte:${money(m.schedules.interest)};não corresponde a juros de mora/compensatórios L5.`,m.schedules.input.interest.reference]as[string,string,string,string]]:[]),...(m.schedules?[...normalFormFields(m).fields.map(f=>['IRPC normal — L6','M22 campo '+f.code+' — '+f.label,`${f.display};exacto:${f.value?f.value.numerator+'/'+f.value.denominator:'Indeterminado'};transcrição:${f.transcriptionReady?'Preparação parcial com valor exacto ao cêntimo':'Pendente ou sem aplicação'};${f.reason}`,normalFormFields(m).source]as[string,string,string,string]),...normalFormFields(m).m20.fields.map(f=>['IRPC normal — L6','M20 A.1 — conta '+f.account+' — '+f.label,`${f.display};representação em meticais inteiros:${f.transcriptionReady?'Exacta':'Pendente'};${f.reason}`,`${f.reference};${normalFormFields(m).m20.source}`]as[string,string,string,string]),['IRPC normal — L6','M20 — correspondência',normalFormFields(m).m20.reason,normalFormFields(m).m20.source]as[string,string,string,string]]:[]),...m.rows.map(r=>['IRPC normal — L6',r.document+'/'+r.line,`${({calculated:'Calculado neste recorte',indeterminate:'Indeterminado',outside_scope:'Fora deste recorte'})[r.status]};montante:${r.amount};acréscimo:${money(r.adjustment)};${r.reason}`,`Origem:${({revenue:'Receitas',cost_of_sales:'Custo das vendas',operating_expenses:'Despesas operacionais',personnel:'Pessoal',depreciation:'Depreciação contabilística',interest_expense:'Juros reconhecidos'}as Record<string,string>)[r.sourceCode]??'Por corresponder'};incluído:${r.included==='yes'?'Sim':r.included==='no'?'Não':'Por demonstrar'};suporte:${r.reference}`]as[string,string,string,string]),...(m.profit?[...m.profit.lines.map(l=>['IRPC normal — L6','Conferência: '+l.label,`Estado:${l.state==='known'?'Valor conhecido':l.state==='absent'?'Ausência declarada':'Informação em falta'};origem:${l.amount};acréscimos:${money(l.addedBack)};remanescente:${money(l.remainder)};${l.reason}`,l.reference]as[string,string,string,string]),...m.profit.topics.map(t=>['IRPC normal — L6',t.label,`Estado:${t.state==='known'?'Valor conhecido':t.state==='absent'?'Ausência declarada':'Informação em falta'};montante:${money(t.value)};${t.reason}`,t.reference]as[string,string,string,string]),['IRPC normal — L6','Âmbito da conferência',m.profit.input.completenessReference,m.profit.source]as[string,string,string,string]]:[])];}catch(e){return[['IRPC normal — L6','Não recuperável',String(e),'Originais conservados.']];}}
|
||||
export function normalReportRows(d:Record<string,unknown>):Array<[string,string,string,string]>{try{const b=normalBook(d),r=b.result;if(!r)return[];const m=r.model;return[['IRPC normal — L6','Ajustamentos ao resultado financeiro',`Exercício:${m.year};resultado contabilístico antes de imposto:${money(m.accountingProfit)};acréscimos demonstrados:${money(m.additions)};resultado parcial ajustado:${money(m.partialAdjustedResult)};${m.profit?'lucro tributável simulado:'+money(m.taxableProfit)+(m.base?';matéria colectável simulada:'+money(m.taxableBase)+(m.assessment?';colecta simulada:'+money(m.colecta??null)+';saldo final a pagar ou recuperar:Indeterminado (L8).':';imposto a pagar:Indeterminado.'):';matéria colectável/imposto:Indeterminados.'):'lucro tributável/matéria colectável/imposto:Indeterminados.'} Projecção com pressupostos;${m.pending.join(' | ')}`,`${normalCurrent(d,b)?'Entradas correspondentes':'Histórico;origem ou entradas alteradas'};${r.createdAt};${m.source}`],...(m.formPreparation?normalFormPreparationReport(m.formPreparation):[]),...(m.periodsFx?normalPeriodFxReport(m.periodsFx):[]),...(m.depreciation?normalDepreciationReport(m.depreciation):[]),...(m.costs?normalCostReport(m.costs):[]),...(m.base?normalBaseReport(m.base):[]),...(m.assessment?normalAssessmentReport(m.assessment):[]),...(m.schedules?[['IRPC normal — L6','Mapas complementares',`Efeito líquido adicional:${money(m.schedules.net)};perda fiscal do próprio exercício:${money(m.currentLoss??null)};sem reporte ou consumo automático. ${m.schedules.pending.join(' | ')}`,m.schedules.source]as[string,string,string,string],...m.schedules.effects.map(e=>{const i=m.schedules!.input.rows.find(r=>r.id===e.id)!;return['IRPC normal — L6',i.document+'/'+i.line,`Montante:${money(e.amount)};efeito:${money(e.effect)};${e.reason}`,`${i.reference};exercício de imputação:${i.fiscalYear||'Não aplicável'}`]as[string,string,string,string];}),...m.schedules.assets.map(a=>['IRPC normal — L6',a.description,`Depreciação contabilística:${money(a.accountingValue)};quota fiscal:${money(a.fiscal)};acréscimo:${money(a.adjustment)};${a.reason}`,`${a.tableReference};${a.reference}`]as[string,string,string,string]),['IRPC normal — L6','Juros financeiros ordinários',`Remanescente aceite no recorte:${money(m.schedules.interest)};não corresponde a juros de mora/compensatórios L5.`,m.schedules.input.interest.reference]as[string,string,string,string]]:[]),...(m.schedules&&!m.formPreparation?[...normalFormFields(m).fields.map(f=>['IRPC normal — L6','M22 campo '+f.code+' — '+f.label,`${f.display};exacto:${f.value?f.value.numerator+'/'+f.value.denominator:'Indeterminado'};transcrição:${f.transcriptionReady?'Preparação parcial com valor exacto ao cêntimo':'Pendente ou sem aplicação'};${f.reason}`,normalFormFields(m).source]as[string,string,string,string]),...normalFormFields(m).m20.fields.map(f=>['IRPC normal — L6','M20 A.1 — conta '+f.account+' — '+f.label,`${f.display};representação em meticais inteiros:${f.transcriptionReady?'Exacta':'Pendente'};${f.reason}`,`${f.reference};${normalFormFields(m).m20.source}`]as[string,string,string,string]),['IRPC normal — L6','M20 — correspondência',normalFormFields(m).m20.reason,normalFormFields(m).m20.source]as[string,string,string,string]]:[]),...m.rows.map(r=>['IRPC normal — L6',r.document+'/'+r.line,`${({calculated:'Calculado neste recorte',indeterminate:'Indeterminado',outside_scope:'Fora deste recorte'})[r.status]};montante:${r.amount};acréscimo:${money(r.adjustment)};${r.reason}`,`Origem:${({revenue:'Receitas',cost_of_sales:'Custo das vendas',operating_expenses:'Despesas operacionais',personnel:'Pessoal',depreciation:'Depreciação contabilística',interest_expense:'Juros reconhecidos'}as Record<string,string>)[r.sourceCode]??'Por corresponder'};incluído:${r.included==='yes'?'Sim':r.included==='no'?'Não':'Por demonstrar'};suporte:${r.reference}`]as[string,string,string,string]),...(m.profit?[...m.profit.lines.map(l=>['IRPC normal — L6','Conferência: '+l.label,`Estado:${l.state==='known'?'Valor conhecido':l.state==='absent'?'Ausência declarada':'Informação em falta'};origem:${l.amount};acréscimos:${money(l.addedBack)};remanescente:${money(l.remainder)};${l.reason}`,l.reference]as[string,string,string,string]),...m.profit.topics.map(t=>['IRPC normal — L6',t.label,`Estado:${t.state==='known'?'Valor conhecido':t.state==='absent'?'Ausência declarada':'Informação em falta'};montante:${money(t.value)};${t.reason}`,t.reference]as[string,string,string,string]),['IRPC normal — L6','Âmbito da conferência',m.profit.input.completenessReference,m.profit.source]as[string,string,string,string]]:[])];}catch(e){return[['IRPC normal — L6','Não recuperável',String(e),'Originais conservados.']];}}
|
||||
export function normalHtml(d:Record<string,unknown>){const b=normalBook(d);if(!normalCurrent(d,b))throw Error('Calcule e guarde as entradas actuais antes de exportar.');const esc=(s:string)=>s.replace(/[&<>"']/g,c=>({'&':'&','<':'<','>':'>','"':'"',"'":'''}[c]!));return'<!doctype html><html lang="pt"><meta charset="utf-8"><title>IRPC normal — ajustamentos</title><h1>L6 — mapa parcial de ajustamentos</h1><p>Projecção pelos pressupostos do plano. Não é demonstração contabilística,liquidação ou Modelo20/22.</p>'+normalReportRows(d).map(r=>'<section><h2>'+esc(r[1])+'</h2><p>'+esc(r[2])+'</p><small>'+esc(r[3])+'</small></section>').join('')+'</html>';}
|
||||
|
||||
@@ -0,0 +1,33 @@
|
||||
<?php
|
||||
namespace Tests\Feature;
|
||||
use App\Models\User;
|
||||
use Illuminate\Foundation\Testing\DatabaseTransactions;
|
||||
use Illuminate\Support\Facades\DB;
|
||||
use Illuminate\Support\Str;
|
||||
use Tests\TestCase;
|
||||
|
||||
final class IrpcNormalCostsDraftTest extends TestCase
|
||||
{
|
||||
use DatabaseTransactions;
|
||||
public function test_cost_limits_provisions_and_timing_recover_their_facts_results_and_original_histories(): void
|
||||
{
|
||||
$target=DB::selectOne('select current_database() as name,inet_server_port() as port');
|
||||
$this->assertSame('simulator_fiscal_delta_20261021_test',$target->name);$this->assertSame(55441,(int)$target->port);
|
||||
config(['investor-path.enabled'=>true,'suitecrm.enabled'=>false]);$this->actingAs(User::factory()->create(['email_verified_at'=>now()]));
|
||||
$expected=['calculated'=>['6730','4430','7088'],'additional'=>['7050','4750','1520'],'limits'=>['7210','4910','7856'],'closing'=>['6530','4230','6768']];$id=null;$etag=null;
|
||||
foreach(['calculated','missing','additional','limits','closing']as$case){
|
||||
$d=json_decode(file_get_contents(base_path('outputs/irpc-l6-costs/'.$case.'.json')),true,flags:JSON_THROW_ON_ERROR);$p=['person_type'=>$d['person_type']];unset($d['person_type']);
|
||||
if($id===null)$id=$this->postJson('/api/v1/simulation-drafts',['personal_snapshot'=>$p,'economic_snapshot'=>$d],['Idempotency-Key'=>(string)Str::uuid()])->assertCreated()->json('data.id');
|
||||
else $this->putJson('/api/v1/simulation-drafts/'.$id,['personal_snapshot'=>$p,'economic_snapshot'=>$d],['If-Match'=>$etag])->assertOk();
|
||||
$r=$this->getJson('/api/v1/simulation-drafts/'.$id)->assertOk();$etag=$r->headers->get('ETag');$back=$r->json('data.economic_snapshot');
|
||||
$this->assertSame($d['modelo_a_snapshot'],$back['modelo_a_snapshot']);$this->assertSame($d['business_plan_snapshot'],$back['business_plan_snapshot']);
|
||||
$s=json_decode($back['modelo_a_snapshot'],true,flags:JSON_THROW_ON_ERROR);$b=$s['irpcNormal'][$d['context_opportunity']];$m=$b['result']['model'];
|
||||
$this->assertSame('IRPC-normal-adjustments/6',$m['version']);$this->assertArrayHasKey('irpcWithholdings',$s);$this->assertArrayHasKey('books',$s);
|
||||
$this->assertContains('IRPC-normal-adjustments/5',array_column(array_column($b['history'],'model'),'version'));$this->assertSame($b['costs'],$m['costs']['input']);
|
||||
$this->assertNull($m['tax']);$this->assertNull($m['assessment']['finalBalance']['payable']);$this->assertNull($m['assessment']['finalBalance']['recoverable']);
|
||||
if($case==='missing'){$this->assertNull($m['taxableProfit']);$this->assertNull($m['taxableBase']);$this->assertNull($m['colecta']);$this->assertSame('520',$m['schedules']['net']['numerator']);$this->assertSame('40',$m['costs']['rows'][1]['adjustment']['numerator']);}
|
||||
else{[$profit,$base,$tax]=$expected[$case];$this->assertSame($profit,$m['taxableProfit']['numerator']);$this->assertSame($base,$m['taxableBase']['numerator']);$this->assertSame(['numerator'=>$tax,'denominator'=>$case==='additional'?'1':'5'],$m['colecta']);$this->assertSame([],$m['costs']['pending']);}
|
||||
file_put_contents(base_path('outputs/irpc-l6-costs/recovered-'.$case.'.json'),json_encode($back,JSON_THROW_ON_ERROR|JSON_UNESCAPED_UNICODE));
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,26 @@
|
||||
<?php
|
||||
namespace Tests\Feature;
|
||||
use App\Models\User;
|
||||
use Illuminate\Foundation\Testing\DatabaseTransactions;
|
||||
use Illuminate\Support\Facades\DB;
|
||||
use Illuminate\Support\Str;
|
||||
use Tests\TestCase;
|
||||
final class IrpcNormalDepreciationDraftTest extends TestCase
|
||||
{
|
||||
use DatabaseTransactions;
|
||||
public function test_depreciation_parameters_quotas_prior_balances_and_results_recover_without_rewriting_legacy_assets():void
|
||||
{
|
||||
$target=DB::selectOne('select current_database() as name,inet_server_port() as port');$this->assertSame('simulator_fiscal_delta_20261021_test',$target->name);$this->assertSame(55441,(int)$target->port);
|
||||
config(['investor-path.enabled'=>true,'suitecrm.enabled'=>false]);$this->actingAs(User::factory()->create(['email_verified_at'=>now()]));$id=null;$etag=null;
|
||||
$expected=['months'=>['6780','4480','7168'],'declining'=>['6630','4330','6928'],'prior'=>['6730','4430','7088'],'specific'=>['13535','8935','7148']];
|
||||
foreach(['months','declining','prior','specific','missing']as$case){
|
||||
$d=json_decode(file_get_contents(base_path('outputs/irpc-l6-depreciation/'.$case.'.json')),true,flags:JSON_THROW_ON_ERROR);$p=['person_type'=>$d['person_type']];unset($d['person_type']);
|
||||
if($id===null)$id=$this->postJson('/api/v1/simulation-drafts',['personal_snapshot'=>$p,'economic_snapshot'=>$d],['Idempotency-Key'=>(string)Str::uuid()])->assertCreated()->json('data.id');else$this->putJson('/api/v1/simulation-drafts/'.$id,['personal_snapshot'=>$p,'economic_snapshot'=>$d],['If-Match'=>$etag])->assertOk();
|
||||
$r=$this->getJson('/api/v1/simulation-drafts/'.$id)->assertOk();$etag=$r->headers->get('ETag');$back=$r->json('data.economic_snapshot');$this->assertSame($d['modelo_a_snapshot'],$back['modelo_a_snapshot']);$this->assertSame($d['business_plan_snapshot'],$back['business_plan_snapshot']);
|
||||
$s=json_decode($back['modelo_a_snapshot'],true,flags:JSON_THROW_ON_ERROR);$b=$s['irpcNormal'][$d['context_opportunity']];$m=$b['result']['model'];$this->assertSame('IRPC-normal-adjustments/7',$m['version']);$this->assertSame($b['depreciation'],$m['depreciation']['input']);$this->assertSame($b['schedules']['assets'],$m['schedules']['input']['assets']);$this->assertSame([],$m['schedules']['assets']);$this->assertContains('IRPC-normal-adjustments/6',array_column(array_column($b['history'],'model'),'version'));$this->assertArrayHasKey('irpcWithholdings',$s);$this->assertNull($m['tax']);$this->assertNull($m['assessment']['finalBalance']['payable']);
|
||||
if($case==='missing'){$this->assertNull($m['depreciation']['adjustment']);$this->assertNull($m['taxableProfit']);$this->assertNull($m['colecta']);$this->assertSame('40',$m['costs']['rows'][1]['adjustment']['numerator']);}
|
||||
else{[$profit,$base,$colecta]=$expected[$case];$this->assertSame($profit,$m['taxableProfit']['numerator']);$this->assertSame($base,$m['taxableBase']['numerator']);$this->assertSame(['numerator'=>$colecta,'denominator'=>'5'],$m['colecta']);$this->assertSame([],$m['depreciation']['pending']);if($case==='prior'){$this->assertSame('20',$m['depreciation']['assets'][0]['priorUsed']['numerator']);$this->assertSame('40',$b['depreciation']['assets'][0]['priorAvailable']);}}
|
||||
file_put_contents(base_path('outputs/irpc-l6-depreciation/recovered-'.$case.'.json'),json_encode($back,JSON_THROW_ON_ERROR|JSON_UNESCAPED_UNICODE));
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,28 @@
|
||||
<?php
|
||||
namespace Tests\Feature;
|
||||
use App\Models\User;
|
||||
use Illuminate\Foundation\Testing\DatabaseTransactions;
|
||||
use Illuminate\Support\Facades\DB;
|
||||
use Illuminate\Support\Str;
|
||||
use Tests\TestCase;
|
||||
final class IrpcNormalFormPreparationDraftTest extends TestCase
|
||||
{
|
||||
use DatabaseTransactions;
|
||||
public function test_form_classification_exact_values_and_unmapped_fields_recover_without_changing_calculation_or_history():void
|
||||
{
|
||||
$db=DB::selectOne('select current_database() as name,inet_server_port() as port');$this->assertSame('simulator_fiscal_delta_20261021_test',$db->name);$this->assertSame(55441,(int)$db->port);
|
||||
config(['investor-path.enabled'=>true,'suitecrm.enabled'=>false]);$this->actingAs(User::factory()->create(['email_verified_at'=>now()]));$id=null;$etag=null;
|
||||
foreach(['mapped','fractional','missing','unmapped','booktax']as$case){
|
||||
$d=json_decode(file_get_contents(base_path('outputs/irpc-l6-values-forms/'.$case.'.json')),true,flags:JSON_THROW_ON_ERROR);$personal=['person_type'=>$d['person_type']];unset($d['person_type']);
|
||||
if($id===null)$id=$this->postJson('/api/v1/simulation-drafts',['personal_snapshot'=>$personal,'economic_snapshot'=>$d],['Idempotency-Key'=>(string)Str::uuid()])->assertCreated()->json('data.id');else$this->putJson('/api/v1/simulation-drafts/'.$id,['personal_snapshot'=>$personal,'economic_snapshot'=>$d],['If-Match'=>$etag])->assertOk();
|
||||
$r=$this->getJson('/api/v1/simulation-drafts/'.$id)->assertOk();$etag=$r->headers->get('ETag');$back=$r->json('data.economic_snapshot');$this->assertSame($d['business_plan_snapshot'],$back['business_plan_snapshot']);$this->assertSame($d['modelo_a_snapshot'],$back['modelo_a_snapshot']);
|
||||
$s=json_decode($back['modelo_a_snapshot'],true,flags:JSON_THROW_ON_ERROR);$b=$s['irpcNormal'][$d['context_opportunity']];$m=$b['result']['model'];$f=$m['formPreparation'];$fields=array_column($f['fields'],null,'code');$this->assertSame('IRPC-normal-adjustments/9',$m['version']);$this->assertSame($b['forms'],$f['input']);$this->assertContains('IRPC-normal-adjustments/8',array_column(array_column($b['history'],'model'),'version'));$this->assertArrayHasKey('irpcWithholdings',$s);$this->assertSame('3130',$m['taxableProfit']['numerator']);$this->assertSame($m['taxableProfit'],$m['taxableBase']);$this->assertSame(['numerator'=>'5008','denominator'=>'5'],$m['colecta']);$this->assertNull($m['assessment']['finalBalance']['payable']);$this->assertNull($fields['309–316']['value']);$this->assertFalse($f['transport']['ready']);$this->assertSame($m['colecta'],$fields['300']['value']);
|
||||
if($case==='missing'){$this->assertNull($f['netResult']);$this->assertNull($fields['200']['value']);$this->assertSame($m['taxableProfit'],$fields['260']['value']);}
|
||||
elseif($case==='unmapped'||$case==='booktax'){$this->assertNull($fields['258']['value']);$this->assertNotEmpty($f['unmapped']);$this->assertFalse($f['reconciliation']['matches']);}
|
||||
else{$this->assertSame('3120',$f['netResult']['numerator']);$this->assertTrue($f['reconciliation']['matches']);$this->assertSame('0',$fields['213']['value']['numerator']);}
|
||||
if($case==='booktax'){$this->assertSame('2800',$f['netResult']['numerator']);$this->assertSame('0',$fields['213']['value']['numerator']);}
|
||||
if($case==='fractional'){$parts=array_column($f['m20'],null,'account');$this->assertSame(['numerator'=>'601','denominator'=>'2'],$parts['6.3']['value']);$this->assertFalse($parts['6.3']['representation']['ready']);$this->assertNull($parts['6.3']['representation']['represented']);}
|
||||
file_put_contents(base_path('outputs/irpc-l6-values-forms/recovered-'.$case.'.json'),json_encode($back,JSON_THROW_ON_ERROR|JSON_UNESCAPED_UNICODE));
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,25 @@
|
||||
<?php
|
||||
namespace Tests\Feature;
|
||||
use App\Models\User;
|
||||
use Illuminate\Foundation\Testing\DatabaseTransactions;
|
||||
use Illuminate\Support\Facades\DB;
|
||||
use Illuminate\Support\Str;
|
||||
use Tests\TestCase;
|
||||
final class IrpcNormalPeriodFxDraftTest extends TestCase
|
||||
{
|
||||
use DatabaseTransactions;
|
||||
public function test_period_and_currency_source_evidence_recover_with_original_plan_and_histories():void
|
||||
{
|
||||
$db=DB::selectOne('select current_database() as name,inet_server_port() as port');$this->assertSame('simulator_fiscal_delta_20261021_test',$db->name);$this->assertSame(55441,(int)$db->port);
|
||||
config(['investor-path.enabled'=>true,'suitecrm.enabled'=>false]);$this->actingAs(User::factory()->create(['email_verified_at'=>now()]));$id=null;$etag=null;
|
||||
foreach(['short','fx','missing','loss']as$case){
|
||||
$d=json_decode(file_get_contents(base_path('outputs/irpc-l6-periods-fx/'.$case.'.json')),true,flags:JSON_THROW_ON_ERROR);$personal=['person_type'=>$d['person_type']];unset($d['person_type']);
|
||||
if($id===null)$id=$this->postJson('/api/v1/simulation-drafts',['personal_snapshot'=>$personal,'economic_snapshot'=>$d],['Idempotency-Key'=>(string)Str::uuid()])->assertCreated()->json('data.id');else$this->putJson('/api/v1/simulation-drafts/'.$id,['personal_snapshot'=>$personal,'economic_snapshot'=>$d],['If-Match'=>$etag])->assertOk();
|
||||
$r=$this->getJson('/api/v1/simulation-drafts/'.$id)->assertOk();$etag=$r->headers->get('ETag');$back=$r->json('data.economic_snapshot');$this->assertSame($d['business_plan_snapshot'],$back['business_plan_snapshot']);$this->assertSame($d['modelo_a_snapshot'],$back['modelo_a_snapshot']);
|
||||
$s=json_decode($back['modelo_a_snapshot'],true,flags:JSON_THROW_ON_ERROR);$b=$s['irpcNormal'][$d['context_opportunity']];$m=$b['result']['model'];$this->assertSame('IRPC-normal-adjustments/8',$m['version']);$this->assertSame($b['periodsFx'],$m['periodsFx']['input']);$this->assertContains('IRPC-normal-adjustments/7',array_column(array_column($b['history'],'model'),'version'));$this->assertArrayHasKey('irpcWithholdings',$s);$this->assertNull($m['assessment']['finalBalance']['payable']);$this->assertNull($m['tax']);
|
||||
if($case==='short'||$case==='fx'){$this->assertSame($case==='short'?'3130':'200320',$m['taxableProfit']['numerator']);$this->assertSame($m['taxableProfit'],$m['taxableBase']);$this->assertSame(['numerator'=>$case==='short'?'5008':'320512','denominator'=>'5'],$m['colecta']);$this->assertSame(6,$m['periodsFx']['months']);$this->assertSame([],$m['periodsFx']['pending']);}
|
||||
else{$this->assertNull($m['colecta']);if($case==='loss'){$this->assertSame('3130',$m['taxableProfit']['numerator']);$this->assertNull($m['taxableBase']);}else{$this->assertNull($m['accountingProfit']);$this->assertNotEmpty($m['periodsFx']['pending']);}}
|
||||
file_put_contents(base_path('outputs/irpc-l6-periods-fx/recovered-'.$case.'.json'),json_encode($back,JSON_THROW_ON_ERROR|JSON_UNESCAPED_UNICODE));
|
||||
}
|
||||
}
|
||||
}
|
||||
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
@@ -0,0 +1,40 @@
|
||||
import{calculateNormalBase}from'../../resources/js/lib/irpc-normal-base.ts';import{fraction}from'../../resources/js/lib/fiscal-rational.ts';
|
||||
import test from 'node:test';import assert from 'node:assert/strict';import fs from 'node:fs';
|
||||
import{normalBook,normalCurrent,calculateNormal,recordNormal,saveNormalBook,normalHtml,normalReportRows,normalFinancialSource}from'../../resources/js/lib/irpc-normal.ts';
|
||||
import{newNormalCosts,newCostRow,calculateNormalCosts,reusableCreditBalance,costRules,normalCostReport}from'../../resources/js/lib/irpc-normal-costs.ts';
|
||||
import{createProjectDossierReport}from'../../resources/js/lib/project-dossier-report.ts';
|
||||
const seed=()=>JSON.parse(fs.readFileSync(new URL('./fixtures/irpc-schedules-preserved.json',import.meta.url),'utf8'));const val=f=>f?Number(f.numerator)/Number(f.denominator):null;
|
||||
function row(id,rule,amount,facts={},sourceCode='operating_expenses'){return{...newCostRow(id),rule,amount,sourceCode,document:'QA-'+id,line:'1',reference:'QA documento e factos qualificados para o período anual2026; valores sintéticos',conditions:'yes',facts};}
|
||||
function reconcile(b){const totals={};for(const r of b.schedules.rows){const k={tax_own:'expenseCorrections',tax_other:'expenseCorrections',undocumented:'expenseCorrections',capital_in:'positivePatrimonial',patrimonial_gain:'positivePatrimonial',capital_out:'negativePatrimonial',patrimonial_cost:'negativePatrimonial',future_cost:'timing',future_income:'timing',current_cost:'timing',current_income:'timing'}[r.rule];totals[k]=(totals[k]??0)+Number(r.amount);}for(const r of b.costs.rows){const k=costRules[r.rule][1];totals[k]=(totals[k]??0)+Number(r.amount);}for(const[k,a]of Object.entries(totals))b.profit.topics[k]={state:'known',amount:String(a),reference:'QA reconciliação aritmética por documento/linha dos mapas'};}
|
||||
function setup(rows){const d=seed(),b=normalBook(d);b.costs=newNormalCosts();b.costs.rows=rows;b.costs.advertisingReference='QA publicidade completa e vendas normais12000 integralmente reconciliadas';b.costs.salesOrdinary='yes';b.costs.creditRegime='ordinary';b.costs.creditBase='10000';b.costs.creditPrevious='550';b.costs.creditReference='QA créditos ordinários finais10000 e provisão fiscal anterior550 documentados, sem regime financeiro';reconcile(b);return{d,b};}
|
||||
function joint(){return setup([
|
||||
row('allowance','allowance','100',{billed:'20',taxedNotBilled:'20'}),row('representation','representation','50'),row('advertising','advertising','80',{campaign:'no'}),row('credit','credit','200'),
|
||||
row('stock','stock','60',{balanceKey:'inventory-A',lossObserved:'yes',observedLoss:'40',previous:'10'}),row('litigation','litigation','90',{balanceKey:'court-A',caseOngoing:'yes',chargeDeductible:'yes',obligation:'100',previous:'20'}),row('fuel','fuel','50',{supportedNormal:'40',passenger:'no'}),row('prior','prior_cost','80',{originalYear:'2025',unknownAtClose:'no',closingEvidence:'QA factura conhecida no fecho2025'}),
|
||||
row('work','work','1000',{projectKey:'project-A',method:'percentage',price:'2000',totalCost:'1000',incurred:'500',priorRevenue:'600',priorCost:'300',bookCost:'200',costSource:'cost_of_sales',partialBilling:'yes',ownFractionalDelivery:'no',consistentMethod:'yes',deferredReceipt:'0'},'revenue'),
|
||||
]);}
|
||||
function model(r){const{d,b}=setup([r]);return calculateNormal(d,b);}
|
||||
const item=m=>m.costs.rows[0];
|
||||
test('compatible costs/provisions/prior timing/work produce exact profit6730 base4430 colecta1417.60 from existing6240 result',()=>{const{d,b}=joint(),m=calculateNormal(d,b);assert.equal(val(m.accountingProfit),6240);assert.equal(val(m.schedules.net),520);assert.equal(val(m.costs.net),-250);assert.equal(val(m.taxableProfit),6730);assert.equal(val(m.taxableBase),4430);assert.equal(val(m.colecta),1417.6);assert.equal(m.version,'IRPC-normal-adjustments/6');assert.equal(m.tax,null);assert.equal(m.assessment.finalBalance.payable,null);assert.deepEqual(m.costs.rows.map(r=>val(r.adjustment)),[30,40,0,150,30,10,10,80,-600]);assert.equal(m.costs.pending.length,0);});
|
||||
test('allowance exceptions are disjoint amounts; accepted70 plus addback30; known zero differs from missing',()=>{let m=model(row('e','allowance','100',{billed:'20',taxedNotBilled:'20'}));assert.equal(val(item(m).accepted),70);assert.equal(val(item(m).adjustment),30);for(const facts of[{billed:'0',taxedNotBilled:'0'},{billed:'100',taxedNotBilled:'0'}])assert.notEqual(model(row('e','allowance','100',facts)).taxableProfit,null);for(const facts of[{billed:'',taxedNotBilled:'0'},{billed:'60',taxedNotBilled:'50'}])assert.equal(model(row('e','allowance','100',facts)).taxableProfit,null);});
|
||||
test('representation20percent accepted; fractional cents remain exact without fiscal rounding or autonomous tax',()=>{const m=model(row('f','representation','0.01'));assert.deepEqual(item(m).accepted,{numerator:'1',denominator:'500'});assert.deepEqual(item(m).adjustment,{numerator:'1',denominator:'125'});assert.equal(m.tax,null);assert.equal(m.assessment.finalBalance.scope,'L8');});
|
||||
test('advertising shares one annual1percent cap across documents and has no per-invoice duplicate allowance',()=>{const{d,b}=setup([row('n1','advertising','100',{campaign:'no'}),row('n2','advertising','100',{campaign:'no'})]);let m=calculateNormal(d,b);assert.deepEqual(m.costs.rows.map(r=>val(r.accepted)),[60,60]);assert.equal(val(m.costs.net),80);assert.deepEqual(m.costs.rows.map(r=>val(r.limit)),[120,120]);b.costs.rows.reverse();assert.equal(val(calculateNormal(d,b).costs.net),80);b.costs.salesOrdinary='';m=calculateNormal(d,b);assert.equal(m.taxableProfit,null);assert.equal(m.schedules.net.numerator,'520');const c=setup([row('ad-a','advertising','100',{campaign:'no'}),row('ad-b','advertising','250',{campaign:'no'})]);const f=calculateNormal(c.d,c.b);assert.match(JSON.stringify(normalCostReport(f.costs)),/exacto 240\/7/);});
|
||||
test('campaign36A never silently receives ordinary advertising treatment',()=>{const m=model(row('campaign','advertising','100',{campaign:'yes'}));assert.equal(m.taxableProfit,null);assert.equal(item(m).accepted,null);assert.match(item(m).reason,/36-A/);});
|
||||
test('vehicle costs distinguish ordinary passenger50percent, documented public/rental exception and nonpassenger',()=>{for(const[facts,accepted]of[[{passenger:'yes',publicOrRental:'no'},50],[{passenger:'yes',publicOrRental:'yes'},100],[{passenger:'no'},100]])assert.equal(val(item(model(row('v','vehicle','100',facts))).accepted),accepted);assert.equal(model(row('v','vehicle','100',{passenger:'yes'})).taxableProfit,null);});
|
||||
test('fuel and rent cover independent rules; overlapping36h-i and36-4 stays pending without an invented combination',()=>{let m=model(row('fuel','fuel','100',{supportedNormal:'80',passenger:'yes',publicOrRental:'no'}));assert.equal(m.taxableProfit,null);assert.match(item(m).reason,/Articulação/);m=model(row('fuel','fuel','100',{supportedNormal:'100',passenger:'yes',publicOrRental:'no'}));assert.equal(val(item(m).accepted),50);m=model(row('rent','rental','100',{nonAcceptedQuota:'20',quotaReference:'QA quota36h documentada; não calculada automaticamente',passenger:'yes',publicOrRental:'yes'}));assert.equal(val(item(m).accepted),80);assert.equal(val(item(m).adjustment),20);assert.match(item(m).reason,/não apura automaticamente/);assert.equal(model(row('fuel','fuel','100',{supportedNormal:'101',passenger:'no'})).taxableProfit,null);assert.equal(model(row('rent','rental','100',{nonAcceptedQuota:'',quotaReference:'QA',passenger:'yes',publicOrRental:'no'})).taxableProfit,null);});
|
||||
test('credit provision caps both annual1.5percent and cumulative6percent; multiple rows share headroom and do not consume source balance',()=>{const{d,b}=setup([row('c1','credit','100'),row('c2','credit','100')]);let m=calculateNormal(d,b);assert.deepEqual(m.costs.rows.map(r=>val(r.accepted)),[25,25]);assert.equal(val(m.costs.net),150);assert.equal(b.costs.creditPrevious,'550');b.costs.creditPrevious='0';m=calculateNormal(d,b);assert.equal(val(m.costs.net),50);b.costs.creditPrevious='600';assert.equal(val(calculateNormal(d,b).costs.net),200);b.costs.creditPrevious='601';assert.equal(calculateNormal(d,b).taxableProfit,null);b.costs.creditRegime='regulated';assert.equal(calculateNormal(d,b).taxableProfit,null);b.costs.creditRegime='ordinary';b.costs.creditPrevious='';assert.equal(calculateNormal(d,b).taxableProfit,null);});
|
||||
test('inventory allowance respects observed loss less existing fiscal provision; absent observation is known rejection, not unknown zero',()=>{let m=model(row('s','stock','60',{balanceKey:'stock',lossObserved:'yes',observedLoss:'40',previous:'10'}));assert.equal(val(item(m).accepted),30);assert.equal(val(item(m).adjustment),30);m=model(row('s','stock','60',{lossObserved:'no'}));assert.equal(val(item(m).accepted),0);assert.equal(val(item(m).adjustment),60);m=model(row('s','stock','60',{balanceKey:'stock',lossObserved:'yes',observedLoss:'40',previous:''}));assert.equal(m.taxableProfit,null);});
|
||||
test('litigation needs current court process and deductible underlying charge; known failure adds back full amount',()=>{for(const facts of[{caseOngoing:'no'},{caseOngoing:'yes',chargeDeductible:'no'}]){const m=model(row('l','litigation','90',facts));assert.equal(val(item(m).accepted),0);assert.equal(val(item(m).adjustment),90);}const m=model(row('l','litigation','90',{caseOngoing:'yes',chargeDeductible:'yes',balanceKey:'court',obligation:'100',previous:'20'}));assert.equal(val(item(m).accepted),80);assert.equal(model(row('l','litigation','90',{caseOngoing:'yes',chargeDeductible:''})).taxableProfit,null);});
|
||||
test('reversal before deducted is taxed once; taxed-provision reversal is excluded only with prior fiscal evidence',()=>{let m=model(row('r','provision_reversal','50',{balanceKey:'old',previous:'70',eventEnded:'yes',inResult:'yes'},'revenue'));assert.equal(val(item(m).adjustment),0);m=model(row('r','provision_reversal','50',{balanceKey:'old',previous:'70',eventEnded:'yes',inResult:'no'},''));assert.equal(val(item(m).adjustment),50);m=model(row('r','taxed_reversal','50',{balanceKey:'old',previous:'70',eventEnded:'yes',inResult:'yes'},'revenue'));assert.equal(val(item(m).adjustment),-50);assert.equal(model(row('r','taxed_reversal','80',{balanceKey:'old',previous:'70',eventEnded:'yes',inResult:'yes'},'revenue')).taxableProfit,null);});
|
||||
test('same fiscal object cannot reuse stock/litigation/reversal balance with another document',()=>{const{d,b}=setup([row('s1','stock','50',{balanceKey:'same',lossObserved:'yes',observedLoss:'100',previous:'0'}),row('s2','stock','50',{balanceKey:'same',lossObserved:'yes',observedLoss:'100',previous:'0'})]);const m=calculateNormal(d,b);assert.equal(m.taxableProfit,null);assert.ok(m.costs.rows.every(r=>r.adjustment===null));});
|
||||
test('prior-period cost and income distinguish knowledge at previous closing; never edit earlier returns or recorded histories',()=>{for(const[rule,src,unknown,expected]of[['prior_cost','operating_expenses','yes',0],['prior_cost','operating_expenses','no',100],['prior_income','revenue','yes',0],['prior_income','revenue','no',-100]]){const m=model(row('p',rule,'100',{originalYear:'2025',unknownAtClose:unknown,closingEvidence:'QA fecho anterior'},src));assert.equal(val(item(m).adjustment),expected);}assert.equal(model(row('p','prior_cost','100',{originalYear:'2025',unknownAtClose:'',closingEvidence:'QA'})).taxableProfit,null);});
|
||||
test('work percentage uses accumulated performance less prior recognized revenue and cost, no double recognition',()=>{const{d,b}=joint(),m=calculateNormal(d,b),w=m.costs.rows.at(-1);assert.equal(val(w.limit),400);assert.equal(val(w.accepted),200);assert.equal(val(w.adjustment),-600);assert.match(w.reason,/grau=incorrido/);assert.equal(b.costs.rows.at(-1).facts.priorRevenue,'600');});
|
||||
test('closing work respects mandatory percentage,95percent threshold and missing facts; estimated loss is separate full addback',()=>{const{d,b}=joint(),w=b.costs.rows.at(-1);w.facts.method='closing';assert.equal(calculateNormal(d,b).taxableProfit,null);w.facts.partialBilling='no';w.facts.priorRevenue='0';w.facts.priorCost='0';w.facts.publicReception='no';let m=calculateNormal(d,b);assert.equal(val(m.costs.rows.at(-1).limit),0);w.facts.incurred='950';m=calculateNormal(d,b);assert.equal(val(m.costs.rows.at(-1).limit),2000);w.facts.deferredReceipt='1';assert.equal(calculateNormal(d,b).taxableProfit,null);assert.equal(val(item(model(row('estimate','estimated_work_loss','100'))).adjustment),100);});
|
||||
test('cross-map duplicate identity and cumulative source over-allocation block only dependent totals',()=>{const{d,b}=joint();b.costs.rows[0].document=b.rows[0].document+' ';b.costs.rows[0].line=b.rows[0].line;let m=calculateNormal(d,b);assert.equal(m.taxableProfit,null);assert.match(m.costs.rows[0].reason,/repetidos/);assert.equal(m.costs.rows[0].adjustment,null);assert.equal(val(m.costs.rows[1].adjustment),40);const c=joint();c.b.costs.rows[0].amount='1000';reconcile(c.b);m=calculateNormal(c.d,c.b);assert.equal(m.taxableProfit,null);assert.match(m.costs.pending.join(' '),/excedem a linha/);});
|
||||
test('missing one credit parameter retains known independent corrections and makes downstream totals unknown; upstream records remain',()=>{const{d,b}=joint();b.costs.creditPrevious='';const m=calculateNormal(d,b);assert.equal(m.taxableProfit,null);assert.equal(m.taxableBase,null);assert.equal(m.colecta,null);assert.equal(val(m.accountingProfit),6240);assert.equal(val(m.costs.rows[1].adjustment),40);assert.equal(val(m.schedules.net),520);assert.equal(m.schedules.pending.length,0);});
|
||||
test('credit reuse requires known financial closing balances; absent schedule never creates zero',()=>{assert.equal(reusableCreditBalance(null),null);assert.equal(reusableCreditBalance({cashSchedule:[{salesReceivablesBalance:null,openingReceivablesBalance:'0'}]}),null);assert.equal(val(reusableCreditBalance({cashSchedule:[{salesReceivablesBalance:'100',openingReceivablesBalance:'20'}]})),120);});
|
||||
test('installed5 stays current without recalculation; version6 API-ready snapshots preserve books/history and export exact rules/amounts',()=>{const old=seed(),before=normalBook(old);assert.equal(normalCurrent(old,before),true);assert.equal(before.result.model.version,'IRPC-normal-adjustments/5');const{d,b}=joint(),store=JSON.parse(d.modelo_a_snapshot);d.modelo_a_snapshot=saveNormalBook(d,recordNormal(d,b,'2026-10-26T00:30:00+02:00'));const back=normalBook(JSON.parse(JSON.stringify(d)));assert.equal(normalCurrent(d,back),true);assert.deepEqual(back.history.at(-1),before.result);const saved=JSON.parse(d.modelo_a_snapshot);assert.deepEqual(saved.books,store.books);assert.deepEqual(saved.irpcWithholdings,store.irpcWithholdings);assert.match(normalHtml(d),/1417.60/);assert.match(normalHtml(d),/parcela aceite/);assert.match(JSON.stringify(createProjectDossierReport(d,{selectedSections:new Set(['finance'])})),/36\(1\)n/);assert.match(JSON.stringify(normalReportRows(d)),/M20 — correspondência/);fs.mkdirSync('outputs/irpc-l6-costs',{recursive:true});fs.writeFileSync('outputs/irpc-l6-costs/calculated.json',JSON.stringify(d));fs.writeFileSync('outputs/irpc-l6-costs/preparation.html',normalHtml(d));const missing=normalBook(d);missing.costs.creditPrevious='';d.modelo_a_snapshot=saveNormalBook(d,recordNormal(d,missing));fs.writeFileSync('outputs/irpc-l6-costs/missing.json',JSON.stringify(d));const changed=normalBook(d);changed.costs.rows[0].facts.billed='30';d.modelo_a_snapshot=saveNormalBook(d,changed);assert.equal(normalCurrent(d,normalBook(d)),false);assert.throws(()=>normalHtml(d));});
|
||||
test('malformed versions, unknown rules and non-string facts are refused with saved originals intact',()=>{const{d,b}=joint();for(const change of[x=>x.version=2,x=>x.rows[0].rule='__proto__',x=>x.rows[0].facts.billed=20]){const c=structuredClone(b);change(c.costs);assert.throws(()=>saveNormalBook(d,c));}assert.equal(normalCurrent(d,normalBook(d)),true);});
|
||||
|
||||
test('additional categories,shared limits and closing method generate separate recoverable compatible cases',()=>{const cases={additional:setup([row('vehicle','vehicle','100',{passenger:'yes',publicOrRental:'no'}),row('rental','rental','100',{nonAcceptedQuota:'20',quotaReference:'QA quota36h documentada',passenger:'yes',publicOrRental:'yes'}),row('estimate','estimated_work_loss','50'),row('reverse','provision_reversal','50',{balanceKey:'provision-old-deducted',previous:'50',eventEnded:'yes',inResult:'no'},''),row('taxed-reverse','taxed_reversal','50',{balanceKey:'provision-old-taxed',previous:'50',eventEnded:'yes',inResult:'yes'},'revenue'),row('prior-income','prior_income','50',{originalYear:'2025',unknownAtClose:'no',closingEvidence:'QA receita conhecida no encerramento anterior'},'revenue')]),limits:setup([row('ad1','advertising','100',{campaign:'no'}),row('ad2','advertising','100',{campaign:'no'}),row('cr1','credit','100'),row('cr2','credit','100')]),closing:joint()};const w=cases.closing.b.costs.rows.at(-1);Object.assign(w.facts,{method:'closing',partialBilling:'no',priorRevenue:'0',priorCost:'0',publicReception:'no'});const expected={additional:[7050,4750,1520],limits:[7210,4910,1571.2],closing:[6530,4230,1353.6]};for(const[name,{d,b}]of Object.entries(cases)){const m=calculateNormal(d,b);assert.deepEqual([val(m.taxableProfit),val(m.taxableBase),val(m.colecta)],expected[name]);d.modelo_a_snapshot=saveNormalBook(d,recordNormal(d,b));fs.writeFileSync('outputs/irpc-l6-costs/'+name+'.json',JSON.stringify(d));}});
|
||||
|
||||
test('percentage-generated loss below one cent remains a negative fiscal result, never a silently truncated zero',()=>{const{b}=joint();b.base.lossesState='absent';b.base.losses=[];assert.equal(calculateNormalBase(b.base,fraction(-1n,1000n),'2026').taxableBase,null);assert.equal(val(calculateNormalBase(b.base,fraction(-1n,1000n),'2026','QA perda corrente exacta').taxableBase),0);assert.equal(val(calculateNormalBase(b.base,fraction(1n,1000n),'2026').taxableBase),0.001);});
|
||||
@@ -0,0 +1,26 @@
|
||||
import test from'node:test';import assert from'node:assert/strict';import fs from'node:fs';
|
||||
import{normalBook,normalCurrent,calculateNormal,recordNormal,saveNormalBook,normalHtml,normalReportRows,normalFinancialSource}from'../../resources/js/lib/irpc-normal.ts';
|
||||
import{newNormalDepreciation,newDepreciationAsset,reuseNormalAssets,calculateNormalDepreciation,depreciationCatalog}from'../../resources/js/lib/irpc-normal-depreciation.ts';
|
||||
import{createProjectDossierReport}from'../../resources/js/lib/project-dossier-report.ts';
|
||||
const seed=()=>JSON.parse(fs.readFileSync(new URL('./fixtures/irpc-costs-preserved.json',import.meta.url),'utf8')),val=f=>f?Number(f.numerator)/Number(f.denominator):null;
|
||||
function asset(p={}){return{...newDepreciationAsset('server'),assetKey:'asset-server',description:'Servidor QA',document:'QA-activo-servidor',line:'1',category:'server',valuation:'historical_new',specificRate:'no',method:'constant',rate:'20',timing:'annual',start:'2026-01-01',exitState:'absent',cost:'500',residual:'0',accounting:'120',previousAccounting:'0',previousFiscal:'0',priorAvailable:'0',previousReference:'QA ausência de quotas anteriores demonstrada,ou saldos anteriores conforme documentos',consistentMethod:'yes',conditions:'yes',reference:'QA factura/classificação/base histórica/período documentados,sem reavaliações ou regimes especiais',...p};}
|
||||
function setup(a=asset(),bookExpense=a.accounting){const d=seed(),b=normalBook(d),p=JSON.parse(d.business_plan_snapshot);p.plan.assetDepreciation=bookExpense;d.business_plan_snapshot=JSON.stringify(p);b.depreciation={...newNormalDepreciation(),completenessReference:'QA todos activos/quotas e plano reconciliados no sujeito/exercício2026',assets:[a]};return{d,b};}
|
||||
const model=(a,expense)=>{const{d,b}=setup(a,expense);return calculateNormal(d,b);};
|
||||
test('version7 reuses existing server and replaces20 legacy adjustment exactly once without changing financial result or old maps',()=>{const{d,b}=setup(),m=calculateNormal(d,b);assert.equal(val(m.accountingProfit),6240);assert.equal(val(m.depreciation.adjustment),20);assert.equal(val(m.taxableProfit),6730);assert.equal(val(m.taxableBase),4430);assert.equal(val(m.colecta),1417.6);assert.equal(m.version,'IRPC-normal-adjustments/7');assert.equal(val(m.schedules.net),520);assert.deepEqual(m.schedules.assets,[]);assert.deepEqual(m.schedules.input.assets,b.schedules.assets);assert.equal(m.tax,null);});
|
||||
test('documented first-year duodecimos include July and exclude month of exit',()=>{let m=model(asset({start:'2026-07-15',timing:'months'}));assert.equal(m.depreciation.assets[0].months,6);assert.equal(val(m.depreciation.assets[0].deduction),50);assert.equal(val(m.taxableProfit),6780);assert.equal(val(m.taxableBase),4480);assert.equal(val(m.colecta),1433.6);m=model(asset({start:'2026-07-15',timing:'months',exitState:'known',exitDate:'2026-10-15'}));assert.equal(m.depreciation.assets[0].months,3);assert.equal(val(m.depreciation.assets[0].deduction),25);assert.equal(val(m.colecta),1441.6);});
|
||||
test('annual first-year option remains distinct from duodecimos; contradictory dates and unknown event are not defaulted',()=>{assert.equal(val(model(asset({start:'2026-07-15'})).depreciation.assets[0].deduction),100);for(const p of[{exitState:''},{exitState:'known',exitDate:''},{exitState:'absent',exitDate:'2026-10-15'},{start:'2026-02-31'},{exitState:'known',exitDate:'2025-12-31'}])assert.equal(model(asset(p)).colecta,null);});
|
||||
test('declining method uses fiscal remaining basis and coefficient capped by minimum life; result differs from accounting depreciation',()=>{const m=model(asset({method:'declining',factor:'2',newTangible:'yes',switchToStraight:'no',accounting:'240'}));assert.equal(val(m.depreciation.assets[0].quota),200);assert.equal(val(m.depreciation.assets[0].deduction),200);assert.equal(val(m.depreciation.adjustment),40);assert.equal(val(m.taxableProfit),6630);assert.equal(val(m.taxableBase),4330);assert.equal(val(m.colecta),1385.6);for(const p of[{factor:'2.1'},{newTangible:'no'},{category:'furniture',factor:'2'},{category:'commercial_building',factor:'2'}])assert.equal(model(asset({method:'declining',factor:'2',newTangible:'yes',switchToStraight:'no',...p})).colecta,null);});
|
||||
test('coefficient bands1.5/2/2.5 and half-to-maximum constant-rate recorte are applied by catalog life',()=>{const c=model(asset({category:'computer',method:'declining',factor:'1.5',newTangible:'yes',switchToStraight:'no',accounting:'200'}));assert.equal(val(c.depreciation.assets[0].quota),187.5);assert.equal(model(asset({category:'computer',method:'declining',factor:'2',newTangible:'yes',switchToStraight:'no'})).colecta,null);const m=model(asset({category:'laundry_machine',specificRate:'yes',method:'declining',factor:'2.5',newTangible:'yes',switchToStraight:'no',accounting:'200'}));assert.equal(val(m.depreciation.assets[0].quota),156.25);assert.equal(val(model(asset({rate:'10'})).depreciation.assets[0].deduction),50);assert.equal(model(asset({rate:'9.99'})).colecta,null);});
|
||||
test('previous taxable accounting quotas are only recovered within current quota and documented available balance',()=>{const m=model(asset({start:'2025-01-01',accounting:'80',previousAccounting:'120',previousFiscal:'80',priorAvailable:'40'}));assert.equal(val(m.depreciation.assets[0].deduction),100);assert.equal(val(m.depreciation.assets[0].priorUsed),20);assert.equal(val(m.depreciation.assets[0].priorRemaining),20);assert.equal(val(m.depreciation.adjustment),-20);assert.equal(val(m.taxableProfit),6730);assert.equal(m.depreciation.input.assets[0].priorAvailable,'40');for(const p of[{priorAvailable:''},{priorAvailable:'41'},{previousFiscal:'121'},{previousReference:''}])assert.equal(model(asset({start:'2025-01-01',accounting:'80',previousAccounting:'120',previousFiscal:'80',priorAvailable:'40',...p})).colecta,null);});
|
||||
test('unrecorded quotas are not invented as a deduction; zero previous balance remains explicit',()=>{const m=model(asset({accounting:'0'}));assert.equal(val(m.depreciation.assets[0].quota),100);assert.equal(val(m.depreciation.assets[0].deduction),0);assert.equal(val(m.depreciation.adjustment),0);assert.equal(model(asset({previousAccounting:''})).colecta,null);});
|
||||
test('article8-2 option requires documented past condition and remaining minimum life,not an automatic switch',()=>{const a=asset({start:'2022-01-01',method:'declining',factor:'2',newTangible:'yes',switchToStraight:'yes',priorFullQuotas:'yes',previousAccounting:'500',previousFiscal:'420',priorAvailable:'80',accounting:'0'}),m=model(a);assert.equal(val(m.depreciation.assets[0].quota),80);assert.equal(val(m.depreciation.assets[0].deduction),80);assert.equal(val(m.depreciation.assets[0].priorUsed),80);assert.equal(model({...a,priorFullQuotas:''}).colecta,null);assert.equal(model({...a,priorFullQuotas:'no'}).colecta,null);});
|
||||
test('specific tableI prevails over generic tableII and known codes are never replaced with a free rate',()=>{const m=model(asset({category:'hotel_decoration',specificRate:'yes',rate:'20'}));assert.equal(m.depreciation.assets[0].catalog.table,'I');assert.equal(m.depreciation.assets[0].catalog.code,'84.2/B');assert.equal(val(m.depreciation.assets[0].quota),100);assert.equal(model(asset({specificRate:'yes'})).colecta,null);assert.equal(model(asset({category:'other'})).colecta,null);assert.equal(model(asset({category:'hotel_decoration',specificRate:'no'})).colecta,null);assert.equal(model(asset({valuation:'used'})).colecta,null);assert.equal(model(asset({valuation:''})).colecta,null);});
|
||||
test('commercial building excludes separately known land; zero land is not presumed when missing',()=>{const m=model(asset({category:'commercial_building',rate:'2',cost:'1000',land:'200',accounting:'30'}));assert.equal(val(m.depreciation.assets[0].basis),800);assert.equal(val(m.depreciation.assets[0].deduction),16);assert.equal(val(m.depreciation.adjustment),14);assert.equal(model(asset({category:'commercial_building',rate:'2',land:''})).colecta,null);});
|
||||
test('vehicle ceiling800000 and non-eligible accounting share are separate from prior recoverable quotas',()=>{let m=model(asset({category:'passenger_vehicle',rate:'25',vehicleException:'no',cost:'900000',accounting:'225000'}));assert.equal(val(m.depreciation.assets[0].taxBasis),800000);assert.equal(val(m.depreciation.assets[0].deduction),200000);assert.equal(val(m.depreciation.adjustment),25000);m=model(asset({category:'passenger_vehicle',rate:'25',vehicleException:'no',cost:'900000',accounting:'9000'}));assert.equal(val(m.depreciation.assets[0].eligibleCurrent),8000);assert.equal(val(m.depreciation.assets[0].deduction),8000);assert.equal(model(asset({category:'passenger_vehicle',rate:'25',vehicleException:''})).colecta,null);assert.equal(model(asset({category:'passenger_vehicle',rate:'25',vehicleException:'no',cost:'900000',start:'2025-01-01',previousAccounting:'225000',previousFiscal:'200000',priorAvailable:'25000'})).colecta,null);});
|
||||
test('low value is an explicit individual-asset option,not automatic just because cost is below20000',()=>{const m=model(asset({method:'low_value',individual:'yes',accounting:'500'}));assert.equal(val(m.depreciation.assets[0].deduction),500);assert.equal(val(m.colecta),1289.6);assert.equal(model(asset({method:'low_value',individual:'no'})).colecta,null);assert.equal(model(asset({category:'other',method:'low_value',individual:'yes'})).colecta,null);assert.equal(model(asset({method:'low_value',individual:'yes',cost:'20000.01'})).colecta,null);});
|
||||
test('software conditions and explicit nondepreciable category have distinct outcomes',()=>{assert.equal(model(asset({category:'software',rate:'25',limitedRights:''})).colecta,null);assert.equal(val(model(asset({category:'software',rate:'25',limitedRights:'yes'})).depreciation.assets[0].deduction),120);const m=model(asset({category:'nondepreciable',start:'',method:'',previousAccounting:''}));assert.equal(val(m.depreciation.assets[0].deduction),0);assert.equal(val(m.depreciation.adjustment),120);});
|
||||
test('maximum life exhaustion excludes current quota; first-use future period is known nondeduction',()=>{const m=model(asset({start:'2014-01-01',previousAccounting:'400',previousFiscal:'400',priorAvailable:'0'}));assert.equal(val(m.depreciation.assets[0].deduction),0);assert.match(m.depreciation.assets[0].reason,/vida útil máxima esgotada/);assert.equal(val(model(asset({start:'2027-01-01'})).depreciation.assets[0].deduction),0);assert.equal(model(asset({category:'computer',rate:'25',start:'2018-07-01'})).colecta,null);const clipped=model(asset({category:'computer',rate:'25',start:'2018-07-01',timing:'months'}));assert.equal(clipped.depreciation.assets[0].months,6);});
|
||||
test('duplicate asset/document and unreconciled accounting cannot create a second depreciation adjustment',()=>{const{d,b}=setup();b.depreciation.assets.push({...asset({id:'second'}),accounting:'0'});assert.equal(calculateNormal(d,b).colecta,null);const c=setup();c.b.depreciation.assets[0].document=c.b.rows[0].document;c.b.depreciation.assets[0].line=c.b.rows[0].line;assert.equal(calculateNormal(c.d,c.b).colecta,null);assert.equal(model(asset(),'121').colecta,null);});
|
||||
test('one unknown asset keeps independent quotas visible but total profit/base/colecta dependent on reconciliation remains unknown',()=>{const{d,b}=setup(asset({accounting:'60'}),'120');b.depreciation.assets.push(asset({id:'second',assetKey:'second',document:'QA-second',category:'other',accounting:'60'}));const m=calculateNormal(d,b);assert.equal(val(m.depreciation.assets[0].deduction),60);assert.equal(m.depreciation.assets[1].deduction,null);assert.equal(m.taxableProfit,null);assert.equal(m.taxableBase,null);assert.equal(m.colecta,null);});
|
||||
test('reuse copies declared values without inventing previous accounting/carry data; installed6 stays current and histories survive7',()=>{const d=seed(),old=normalBook(d);assert.equal(normalCurrent(d,old),true);assert.equal(old.result.model.version,'IRPC-normal-adjustments/6');const reused=reuseNormalAssets(old.schedules.assets);assert.equal(reused.assets[0].cost,old.schedules.assets[0].cost);assert.equal(reused.assets[0].previousAccounting,'');assert.equal(reused.assets[0].priorAvailable,'');const{d:next,b}=setup(asset({start:'2026-07-15',timing:'months'})),before=JSON.parse(next.modelo_a_snapshot);const oldAssets=structuredClone(b.schedules.assets);next.modelo_a_snapshot=saveNormalBook(next,recordNormal(next,b,'2026-10-26T10:00:00+02:00'));const back=normalBook(JSON.parse(JSON.stringify(next)));assert.equal(normalCurrent(next,back),true);assert.deepEqual(back.history.at(-1),old.result);assert.deepEqual(back.schedules.assets,oldAssets);assert.deepEqual(JSON.parse(next.modelo_a_snapshot).books,before.books);assert.deepEqual(JSON.parse(next.modelo_a_snapshot).irpcWithholdings,before.irpcWithholdings);assert.match(normalHtml(next),/1433.60/);assert.match(JSON.stringify(createProjectDossierReport(next,{selectedSections:new Set(['finance'])})),/quota anterior/);const changed=structuredClone(back);changed.depreciation.assets[0].priorAvailable='1';next.modelo_a_snapshot=saveNormalBook(next,changed);assert.equal(normalCurrent(next,normalBook(next)),false);assert.throws(()=>normalHtml(next));});
|
||||
test('recoverable scenarios generate five API/report proofs without recalculating accepted predecessor suites',()=>{const cases={months:setup(asset({start:'2026-07-15',timing:'months'})),declining:setup(asset({method:'declining',factor:'2',newTangible:'yes',switchToStraight:'no',accounting:'240'})),prior:setup(asset({start:'2025-01-01',accounting:'80',previousAccounting:'120',previousFiscal:'80',priorAvailable:'40'})),specific:setup(asset({category:'laundry_machine',specificRate:'yes',rate:'12.5'})),missing:setup(asset({previousAccounting:''}))};fs.mkdirSync('outputs/irpc-l6-depreciation',{recursive:true});for(const[name,{d,b}]of Object.entries(cases)){d.modelo_a_snapshot=saveNormalBook(d,recordNormal(d,b,'2026-10-26T10:00:00+02:00'));fs.writeFileSync('outputs/irpc-l6-depreciation/'+name+'.json',JSON.stringify(d));fs.writeFileSync('outputs/irpc-l6-depreciation/'+name+'.html',normalHtml(d));}assert.equal(val(normalBook(cases.specific.d).result.model.colecta),1429.6);});
|
||||
@@ -0,0 +1,25 @@
|
||||
import test from'node:test';import assert from'node:assert/strict';import fs from'node:fs';
|
||||
import{normalBook,normalCurrent,calculateNormal,recordNormal,saveNormalBook,normalHtml,normalFinancialSource}from'../../resources/js/lib/irpc-normal.ts';
|
||||
import{newNormalFormPreparation,reuseDirectFormAllocations,normalFormRepresentation,prepareNormalForms}from'../../resources/js/lib/irpc-normal-form-preparation.ts';
|
||||
import{fraction}from'../../resources/js/lib/fiscal-rational.ts';
|
||||
import{createProjectDossierReport}from'../../resources/js/lib/project-dossier-report.ts';
|
||||
const seed=()=>JSON.parse(fs.readFileSync(new URL('./fixtures/irpc-periods-fx-preserved.json',import.meta.url),'utf8')),val=f=>f?Number(f.numerator)/Number(f.denominator):null;
|
||||
function setup(){const d=seed(),b=normalBook(d);b.forms={...newNormalFormPreparation(),edition:'accepted_pdf_and_m20a1',reference:'QA PDFM22/Q10–12 e M20A.1/Q4;edições inventariadas distintas',completenessReference:'QA contas completas da oportunidade/sujeito no período;sem outros custos ou proveitos omitidos',allocations:[...reuseDirectFormAllocations(normalFinancialSource(d)),{id:'revenue',sourceCode:'revenue',account:'7.2',amount:'6000',reference:'QA prestação de serviços documentada,sem vendas de bens'},{id:'opex',sourceCode:'operating_expenses',account:'6.3',amount:'600',reference:'QA fornecimentos e serviços de terceiros completos no período'}],incomeTax:{state:'absent',amount:'',placement:'',reference:'QA ausência documentada de imposto contabilizado;não inferir gasto da colecta'},reducedRate:{state:'absent',reference:'QA sujeito/período sem parcela de imposto a taxa reduzida'}};return{d,b};}
|
||||
const field=(m,code)=>m.formPreparation.fields.find(f=>f.code===code);
|
||||
test('exact representation keeps signedfraction,approximation,zero,missing and parentheses distinct without fiscal rounding',()=>{for(const f of[fraction(1n,3n),fraction(-1n,300n),fraction(123456789012345678901n,100n)]){const r=normalFormRepresentation(f,'whole');assert.equal(r.exact,f.numerator+'/'+f.denominator+' MZN');assert.equal(r.represented,null);assert.equal(r.ready,false);}assert.match(normalFormRepresentation(fraction(1n,3n)).display,/≈/);assert.equal(normalFormRepresentation(fraction(0n)).represented,'0');assert.equal(normalFormRepresentation(null).display,'Indeterminado');assert.equal(normalFormRepresentation(fraction(-20n),'whole',true).represented,'(20)');assert.match(normalFormRepresentation(fraction(1n,2n)).reason,/exacto ao cêntimo/);});
|
||||
test('optional9 prepares M20 classifications/netresult and M22 mappedadjustments while preserving all existing totals',()=>{const{d,b}=setup(),before=normalBook(d).result.model,m=calculateNormal(d,b);assert.equal(m.version,'IRPC-normal-adjustments/9');for(const k of['accountingProfit','taxableProfit','taxableBase','colecta'])assert.deepEqual(m[k],before[k]);assert.equal(val(m.formPreparation.netResult),3120);assert.equal(val(field(m,'200').value),3120);assert.equal(field(m,'200').transcriptionReady,false);assert.equal(val(field(m,'213').value),0);assert.equal(val(field(m,'206').value),10);assert.equal(val(field(m,'238').value),3130);assert.equal(val(field(m,'258').value),0);assert.equal(m.formPreparation.reconciliation.matches,true);assert.equal(field(m,'259').application,'not_applicable');assert.equal(field(m,'260').transcriptionReady,true);assert.equal(val(field(m,'302').value),1001.6);assert.equal(field(m,'302').representation.ready,true);assert.equal(field(m,'309–316').value,null);assert.equal(m.assessment.finalBalance.payable,null);});
|
||||
test('missingorcontradictory booktax blocks only netresult and its fieldreconciliation; knownnormalprofit/base/colecta preserved',()=>{for(const tax of[{state:'',amount:'',placement:'',reference:''},{state:'absent',amount:'320',placement:'outside',reference:'QA'},{state:'known',amount:'320',placement:'included',reference:'QA'}]){const{d,b}=setup();b.forms.incomeTax=tax;const m=calculateNormal(d,b);assert.equal(m.formPreparation.netResult,null);assert.equal(field(m,'200').value,null);assert.equal(val(field(m,'260').value),3130);assert.equal(val(field(m,'300').value),1001.6);assert.equal(val(m.colecta),1001.6);}});
|
||||
test('incomeTaxalreadyincluded reconciles account8.5 and mappedtax without subtracting it again',()=>{const{d,b}=setup();b.forms.incomeTax={state:'known',amount:'320',placement:'included',reference:'QA imposto reconhecido no plano'};b.forms.allocations.find(a=>a.id==='opex').amount='280';b.forms.allocations.push({id:'tax',sourceCode:'operating_expenses',account:'8.5',amount:'320',reference:'QA imposto já no custo de origem'});b.schedules.rows.push({id:'tax',rule:'tax_own',amount:'320',sourceCode:'operating_expenses',document:'QA-tax',line:'1',reference:'QA imposto sobre lucro já incluído',fiscalYear:'',conditions:'yes'});Object.assign(b.profit.topics.expenseCorrections,{state:'known',amount:'320',reference:'QA corresponde ao imposto contabilizado já no resultado'});const m=calculateNormal(d,b);assert.equal(val(m.formPreparation.netResult),3120);assert.equal(val(field(m,'213').value),0);assert.equal(val(m.taxableProfit),3450);assert.equal(field(m,'238').value,null);assert.equal(m.formPreparation.reconciliation.matches,false);assert.ok(m.formPreparation.unmapped.some(e=>e.reason.includes('213')));});
|
||||
test('incomplete revenueclassification does not erase directM20 fields or independentM22 calculations',()=>{const{d,b}=setup();b.forms.allocations.find(a=>a.id==='revenue').amount='5999';const m=calculateNormal(d,b);assert.equal(m.formPreparation.m20.find(f=>f.account==='7.2').value,null);assert.equal(val(m.formPreparation.m20.find(f=>f.account==='6.5').value),60);assert.equal(m.formPreparation.netResult,null);assert.equal(val(m.taxableProfit),3130);assert.equal(val(field(m,'300').value),1001.6);});
|
||||
test('fractional M20 allocations remain exact; no truncation or rounding changes source or net/taxable totals',()=>{const{d,b}=setup();b.forms.allocations.find(a=>a.id==='opex').amount='300.50';b.forms.allocations.push({id:'other',sourceCode:'operating_expenses',account:'6.8',amount:'299.50',reference:'QA gastos operacionais restantes documentados'});const m=calculateNormal(d,b),f=m.formPreparation.m20.find(f=>f.account==='6.3');assert.deepEqual(f.value,fraction(601n,2n));assert.equal(f.representation.ready,false);assert.equal(f.representation.represented,null);assert.equal(val(m.formPreparation.netResult),3120);assert.equal(val(m.colecta),1001.6);});
|
||||
test('lossuses positiveM22 lossfield and M20parentheses; no loss in profitfield and no negative taxablebase',()=>{const{d,b}=setup(),p=JSON.parse(d.business_plan_snapshot);p.plan.products[0].unitPrice='20';b.schedules.currentLossReference='QA perda fiscal corrente reconciliada no sujeito/período,sem reporte automático';d.business_plan_snapshot=JSON.stringify(p);b.forms.allocations.find(a=>a.id==='revenue').amount='1200';const m=calculateNormal(d,b);assert.equal(val(m.taxableProfit),-1670);assert.equal(val(field(m,'259').value),1670);assert.equal(field(m,'260').application,'not_applicable');assert.equal(m.formPreparation.netRepresentation.represented,'(1680)');assert.equal(val(m.taxableBase),0);assert.equal(val(m.colecta),0);});
|
||||
test('unmapped priorquota deduction keeps demonstrated effect and existing260/278/300; no guessedblankfield',()=>{const{d,b}=setup(),p=JSON.parse(d.business_plan_snapshot);p.plan.assetDepreciation='48';d.business_plan_snapshot=JSON.stringify(p);Object.assign(b.depreciation.assets[0],{accounting:'24',start:'2025-01-01',previousAccounting:'120',previousFiscal:'80',priorAvailable:'40'});b.forms.allocations.find(a=>a.sourceCode==='depreciation').amount='24';const m=calculateNormal(d,b);assert.equal(val(m.depreciation.adjustment),-26);assert.equal(val(m.colecta),1001.6);assert.ok(m.formPreparation.unmapped.some(e=>e.origin.startsWith('Mapa de amortizações')));assert.equal(field(m,'258').value,null);assert.equal(field(m,'238').value,null);assert.equal(val(field(m,'260').value),3130);assert.equal(m.formPreparation.entries.find(e=>e.origin.startsWith('Mapa de amortizações')).code,null);});
|
||||
test('reducedrate unknown or knowninL7 blocks only302,notnormal300 and not finalL8 assumptions',()=>{for(const state of['','known']){const{d,b}=setup();b.forms.reducedRate.state=state;const m=calculateNormal(d,b);assert.equal(field(m,'302').value,null);assert.equal(val(field(m,'300').value),1001.6);assert.equal(val(m.colecta),1001.6);assert.equal(m.assessment.finalBalance.recoverable,null);}});
|
||||
test('save/recover/report preserves8history and originalplan and never claims officialrounding or crosseditiontransfer',()=>{const{d,b}=setup(),original=d.business_plan_snapshot,old=structuredClone(b.result);assert.equal(normalCurrent(d,normalBook(d)),true);d.modelo_a_snapshot=saveNormalBook(d,recordNormal(d,b,'2026-10-26T10:00:00+02:00'));const back=normalBook(JSON.parse(JSON.stringify(d)));assert.equal(normalCurrent(d,back),true);assert.deepEqual(back.history.at(-1),old);assert.equal(d.business_plan_snapshot,original);assert.match(normalHtml(d),/campo213/);assert.match(normalHtml(d),/transporte automático M20/);assert.match(normalHtml(d),/exacto ao cêntimo/);assert.match(JSON.stringify(createProjectDossierReport(d,{selectedSections:new Set(['finance'])})),/campo302/);back.forms.allocations[0].reference+='changed';assert.equal(normalCurrent(d,back),false);});
|
||||
test('fivenewcases write privateAPI proof inputs and reports without rerunning accepted functionalsuites',()=>{const cases={mapped:setup(),fractional:setup(),missing:setup(),unmapped:setup(),booktax:setup()};cases.booktax.b.forms.incomeTax={state:'known',amount:'320',placement:'outside',reference:'QA gasto contabilístico exterior ao plano;campo próprio pendente'};cases.fractional.b.forms.allocations.find(a=>a.id==='opex').amount='300.50';cases.fractional.b.forms.allocations.push({id:'other',sourceCode:'operating_expenses',account:'6.8',amount:'299.50',reference:'QA parcela contabilística com centavos'});cases.missing.b.forms.incomeTax={state:'',amount:'',placement:'',reference:''};const u=cases.unmapped,p=JSON.parse(u.d.business_plan_snapshot);p.plan.assetDepreciation='48';u.d.business_plan_snapshot=JSON.stringify(p);Object.assign(u.b.depreciation.assets[0],{accounting:'24',start:'2025-01-01',previousAccounting:'120',previousFiscal:'80',priorAvailable:'40'});u.b.forms.allocations.find(a=>a.sourceCode==='depreciation').amount='24';fs.mkdirSync('outputs/irpc-l6-values-forms',{recursive:true});for(const[name,{d,b}]of Object.entries(cases)){d.modelo_a_snapshot=saveNormalBook(d,recordNormal(d,b,'2026-10-26T10:00:00+02:00'));fs.writeFileSync('outputs/irpc-l6-values-forms/'+name+'.json',JSON.stringify(d));fs.writeFileSync('outputs/irpc-l6-values-forms/'+name+'.html',normalHtml(d));}});
|
||||
|
||||
test('newlyidentified includedtax mismatch blocks only dependent213/reconciliation without revising demonstratedtax',()=>{const{d,b}=setup();b.forms.incomeTax={state:'known',amount:'320',placement:'included',reference:'QA imposto reconhecido no plano'};b.forms.allocations.find(a=>a.id==='opex').amount='280';b.forms.allocations.push({id:'tax',sourceCode:'operating_expenses',account:'8.5',amount:'320',reference:'QA imposto reconhecido no custo da origem'});const m=calculateNormal(d,b);assert.equal(val(m.colecta),1001.6);assert.equal(val(m.formPreparation.netResult),3120);assert.equal(val(field(m,'213').value),0);assert.equal(field(m,'238').value,null);assert.equal(val(field(m,'260').value),3130);assert.ok(m.formPreparation.pending.some(s=>s.includes('tax_own')));});
|
||||
test('positive and negative asseteffects remain separate; netdepreciation is never all assignedto206',()=>{const{d,b}=setup(),a=structuredClone(b.depreciation.assets[0]);Object.assign(b.depreciation.assets[0],{cost:'60',accounting:'36'});Object.assign(a,{id:'other',assetKey:'other',document:'QA-other-asset',accounting:'24',start:'2025-01-01',previousAccounting:'120',previousFiscal:'80',priorAvailable:'40'});b.depreciation.assets.push(a);const m=calculateNormal(d,b);assert.equal(val(m.depreciation.adjustment),4);assert.equal(val(field(m,'206').value),30);assert.equal(val(m.taxableProfit),3124);assert.equal(m.formPreparation.unmapped.length,1);assert.equal(val(m.formPreparation.unmapped[0].value),-26);assert.equal(field(m,'238').value,null);});
|
||||
test('acceptedcostproof feeds independentM22 labels without applying printedpercentages again',()=>{const d=JSON.parse(fs.readFileSync(new URL('./fixtures/irpc-costs-preserved.json',import.meta.url),'utf8')),b=normalBook(d),m=b.result.model,{b:input}=setup();const mapped=prepareNormalForms(input.forms,m,normalFinancialSource(d));for(const[rule,code]of [['allowance','219'],['representation','220'],['advertising','221'],['credit','209']]){const row=m.costs.rows.find(r=>r.rule===rule);assert.ok(row);const sum=m.costs.rows.filter(r=>r.rule===rule).reduce((s,r)=>s+val(r.adjustment),0);const value=mapped.fields.find(f=>f.code===code).value;if(code!=='209')assert.equal(val(value),sum);else assert.equal(val(value),m.costs.rows.filter(r=>['credit','stock','litigation'].includes(r.rule)).reduce((s,r)=>s+val(r.adjustment),0));}assert.deepEqual(b.result.model,m);});
|
||||
|
||||
test('absence of booktax cannot erase previouslyidentified ownincomeTax cost; independentknowncolecta remains',()=>{const{d,b}=setup();b.schedules.rows.push({id:'tax',rule:'tax_own',amount:'320',sourceCode:'operating_expenses',document:'QA-tax',line:'1',reference:'QA imposto já incluído',fiscalYear:'',conditions:'yes'});Object.assign(b.profit.topics.expenseCorrections,{state:'known',amount:'320',reference:'QA mapa do imposto próprio'});b.forms.incomeTax={state:'absent',amount:'',placement:'',reference:'QA ausência a conferir'};const m=calculateNormal(d,b);assert.equal(m.formPreparation.netResult,null);assert.ok(m.formPreparation.pending.some(s=>s.includes('contradiz imposto próprio')));assert.equal(val(field(m,'300').value),1104);});
|
||||
@@ -0,0 +1,33 @@
|
||||
import test from'node:test';import assert from'node:assert/strict';import fs from'node:fs';
|
||||
import{normalBook,normalCurrent,calculateNormal,recordNormal,saveNormalBook,normalHtml,normalFinancialSource}from'../../resources/js/lib/irpc-normal.ts';
|
||||
import{newNormalPeriodFx,mapNormalPeriodFx}from'../../resources/js/lib/irpc-normal-period-fx.ts';
|
||||
import{emptyFxSelection,selectFx}from'../../resources/js/lib/iva-fx-selection.ts';
|
||||
import{createProjectDossierReport}from'../../resources/js/lib/project-dossier-report.ts';
|
||||
import{newCurrencyEvent}from'../../resources/js/lib/iva-currency-events.ts';
|
||||
import{irpcFxSources}from'../../resources/js/lib/irpc-fx.ts';
|
||||
const seed=()=>JSON.parse(fs.readFileSync(new URL('./fixtures/irpc-depreciation-preserved.json',import.meta.url),'utf8')),val=f=>f?Number(f.numerator)/Number(f.denominator):null;
|
||||
function fx(direction='mzn_per_unit',rate='64'){const s={...emptyFxSelection(),nature:'commercial',submissionDate:'2026-10-26',bulletinDate:'2026-10-26',bulletinRef:'QA pressuposto sintético64; não boletim real',source:'https://www.bancomoc.mz/',sourceCurrency:'USD',direction,mean:rate};return{...s,applied:selectFx(s)};}
|
||||
function setup(currency='MZN',kind='start'){
|
||||
const d=seed(),b=normalBook(d),p=JSON.parse(d.business_plan_snapshot);p.plan.currency=currency;d.business_plan_snapshot=JSON.stringify(p);
|
||||
b.rows=[];b.costs=undefined;b.schedules.rows=[];b.schedules.interest.amount=currency==='USD'?'7680':'120';
|
||||
for(const t of Object.values(b.profit.topics)){t.state='absent';t.amount='';t.reference='QA ausência declarada no período seleccionado';}
|
||||
b.base.losses=[];b.base.lossesState='absent';b.base.lossesReference='QA ausência de perdas reportadas';
|
||||
b.depreciation.assets[0].accounting=currency==='USD'?'3840':'60';b.depreciation.assets[0].cost=currency==='USD'?'32000':'500';b.depreciation.assets[0].start='2026-07-01';b.depreciation.assets[0].timing='months';
|
||||
b.periodsFx={...newNormalPeriodFx(),kind,from:'2026-07-01',to:'2026-12-31',planStart:'2026-01-01',reference:'QA início documentado1Julho;correspondência completa dos meses7–12 ao período do sujeito',mznMapsReference:'QA activo/quotas/juros e demais mapas reconciliados explicitamente emMZN no período',conversionReference:currency==='USD'?'QA pressuposto de simulação64MZN/USD aplicado aos meses seleccionados;sem regra fiscal anual confirmada':''};
|
||||
if(currency==='USD')b.periodsFx.months=Array.from({length:6},(_,n)=>({period:n+7,currency:'USD',fxSelection:fx()}));
|
||||
return{d,b};
|
||||
}
|
||||
test('installed7 stays current without opt-in; optional8 preserves original result and plan while selecting6 months',()=>{const d=seed(),old=normalBook(d);assert.equal(normalCurrent(d,old),true);const {d:next,b}=setup(),m=calculateNormal(next,b);assert.equal(m.version,'IRPC-normal-adjustments/8');assert.equal(val(m.accountingProfit),3120);assert.equal(val(m.depreciation.assets[0].quota),50);assert.equal(val(m.taxableProfit),3130);assert.equal(val(m.taxableBase),3130);assert.equal(val(m.colecta),1001.6);assert.equal(m.assessment.period.from,'2026-07-01');assert.equal(m.assessment.finalBalance.payable,null);assert.equal(JSON.parse(next.business_plan_snapshot).plan.periods,12);});
|
||||
test('monthly conversion reuses delivered selection and direction; originalUSD and assumptions remain reportable',()=>{const{d,b}=setup('USD'),m=calculateNormal(d,b);assert.equal(val(m.accountingProfit),199680);assert.equal(val(m.depreciation.adjustment),640);assert.equal(val(m.taxableProfit),200320);assert.equal(val(m.colecta),64102.4);assert.equal(m.periodsFx.originalCurrency,'USD');assert.equal(m.periodsFx.rows[0].evidence.column,'mean');assert.match(m.periodsFx.rule,/simulação/);const inv=setup('USD');for(const e of inv.b.periodsFx.months)e.fxSelection=fx('units_per_mzn','0.015625');assert.equal(val(calculateNormal(inv.d,inv.b).colecta),64102.4);});
|
||||
test('annual plan in another currency and shorterplan aligned to July both reconcile without annualising',()=>{const a=setup('USD');a.b.periodsFx.kind='annual';a.b.periodsFx.from='2026-01-01';a.b.periodsFx.months=Array.from({length:12},(_,n)=>({period:n+1,currency:'USD',fxSelection:fx()}));a.b.schedules.interest.amount='15360';a.b.depreciation.assets[0].accounting='7680';a.b.depreciation.assets[0].start='2026-01-01';assert.equal(val(calculateNormal(a.d,a.b).colecta),128204.8);const{d,b}=setup();const p=JSON.parse(d.business_plan_snapshot);p.plan.periods=6;p.plan.assetDepreciation='60';p.plan.depreciationLifeMonths=6;d.business_plan_snapshot=JSON.stringify(p);b.periodsFx.planStart='2026-07-01';assert.equal(val(calculateNormal(d,b).colecta),1001.6);});
|
||||
test('cessation and same-year start/end use documented dates; unsupportedpartial months and contradictions remain pending',()=>{const{d,b}=setup();b.periodsFx.kind='cessation';b.periodsFx.from='2026-01-01';b.periodsFx.to='2026-06-30';b.depreciation.assets[0].start='2026-01-01';assert.equal(val(calculateNormal(d,b).colecta),1001.6);b.periodsFx.kind='same_year';b.periodsFx.from='2026-04-01';b.periodsFx.to='2026-09-30';assert.equal(val(calculateNormal(d,b).colecta),1001.6);for(const patch of[{from:'2026-07-15'},{to:'2026-12-30'},{planStart:''},{from:'2026-01-01',kind:'start'},{to:'2026-02-31'},{reference:''},{mznMapsReference:''}]){const x=setup();Object.assign(x.b.periodsFx,patch);assert.equal(calculateNormal(x.d,x.b).colecta,null);}});
|
||||
test('missingmonth selection,sourcecurrency mismatch and editedapplied rate never become defaultFX',()=>{for(const mutate of[i=>i.months.pop(),i=>i.months[0].currency='EUR',i=>i.months[0].fxSelection.mean='65',i=>i.conversionReference='',i=>i.months.push({...i.months[0],period:1})]){const{d,b}=setup('USD');mutate(b.periodsFx);const m=calculateNormal(d,b);assert.equal(m.accountingProfit,null);assert.equal(m.colecta,null);assert.ok(m.periodsFx.rows.some(r=>r.value));}});
|
||||
test('fractionalcent conversion blocks dependenttotals while retaining exact source and otherknownmonths',()=>{const{d,b}=setup('USD');b.periodsFx.months[0].fxSelection=fx('mzn_per_unit','0.33333333');const m=calculateNormal(d,b);assert.equal(m.colecta,null);assert.ok(m.periodsFx.pending.some(s=>s.includes('fracção de cêntimo')));assert.equal(m.periodsFx.rows[0].originalCurrency,'USD');});
|
||||
test('shortperiod priorloss expiry and annualcaps stay explicitlypending; no change to independent arithmetic',()=>{const x=setup();x.b.base=structuredClone(normalBook(seed()).base);const m=calculateNormal(x.d,x.b);assert.equal(val(m.taxableProfit),3130);assert.equal(m.taxableBase,null);assert.ok(m.base.pending.some(s=>s.includes('41(5)')));const y=setup();y.b.costs=structuredClone(normalBook(seed()).costs);assert.equal(calculateNormal(y.d,y.b).colecta,null);assert.ok(calculateNormal(y.d,y.b).costs.pending.some(s=>s.includes('Limite anual neste período curto')));y.b.costs=undefined;y.b.depreciation.assets[0].timing='annual';assert.equal(calculateNormal(y.d,y.b).colecta,null);});
|
||||
test('save/recovery/report preserves7 history and sourceplan; changed period makes8 historical',()=>{const{d,b}=setup('USD'),original=d.business_plan_snapshot,old=structuredClone(b.result);d.modelo_a_snapshot=saveNormalBook(d,recordNormal(d,b,'2026-10-26T10:00:00+02:00'));const back=normalBook(JSON.parse(JSON.stringify(d)));assert.equal(normalCurrent(d,back),true);assert.deepEqual(back.history.at(-1),old);assert.equal(d.business_plan_snapshot,original);assert.match(normalHtml(d),/64102.40/);assert.match(normalHtml(d),/regra fiscal anual não confirmada/);assert.match(JSON.stringify(createProjectDossierReport(d,{selectedSections:new Set(['finance'])})),/USD/);back.periodsFx.reference+='changed';assert.equal(normalCurrent(d,back),false);});
|
||||
test('newcases prepare privateAPI persistence and dossiers including insufficientinformation',()=>{const cases={short:setup(),fx:setup('USD'),missing:setup('USD'),loss:setup()};cases.missing.b.periodsFx.months.pop();cases.loss.b.base=structuredClone(normalBook(seed()).base);fs.mkdirSync('outputs/irpc-l6-periods-fx',{recursive:true});for(const[name,{d,b}]of Object.entries(cases)){d.modelo_a_snapshot=saveNormalBook(d,recordNormal(d,b,'2026-10-26T10:00:00+02:00'));fs.writeFileSync('outputs/irpc-l6-periods-fx/'+name+'.json',JSON.stringify(d));fs.writeFileSync('outputs/irpc-l6-periods-fx/'+name+'.html',normalHtml(d));}});
|
||||
test('different monthrates require MZN map reconciliation; UI source uses converted subset without relabellingUSD credit balances',()=>{const{d,b}=setup('USD');b.periodsFx.months[0].fxSelection=fx('mzn_per_unit','65');assert.equal(calculateNormal(d,b).colecta,null);b.depreciation.assets[0].accounting='3850';b.schedules.interest.amount='7700';assert.equal(val(calculateNormal(d,b).colecta),64272);d.modelo_a_snapshot=saveNormalBook(d,b);const source=normalFinancialSource(d);assert.equal(source.currency,'MZN');assert.equal(source.periods,6);assert.equal(source.accountingLines.find(l=>l.code==='depreciation').total,'3850.00');assert.deepEqual(source.cashSchedule,[]);});
|
||||
test('noncalendar annual mapping cannot bypass existing authorised period and unsupportedshortdates stay pending',()=>{const{d,b}=setup();b.periodsFx.kind='annual';b.periodsFx.from='2025-07-01';b.periodsFx.to='2026-06-30';b.periodsFx.planStart='2025-07-01';assert.equal(calculateNormal(d,b).colecta,null);assert.ok(calculateNormal(d,b).pending.some(s=>s.includes('autorizado/comunicado')));});
|
||||
test('reusedFX link invalidates current result when existing source changes and never changes historical result',()=>{const{d,b}=setup('USD'),snapshot=JSON.parse(d.modelo_a_snapshot);snapshot.currencyEvents??={};snapshot.currencyEvents[d.context_opportunity]={version:1,rows:[{...newCurrencyEvent('fx-shared','MZN'),sourceCurrency:'USD',fxSelection:fx()}]};d.modelo_a_snapshot=JSON.stringify(snapshot);const linked=irpcFxSources(d)[0];assert.ok(linked);b.periodsFx.months[0].fxLink={id:linked.id,fingerprint:linked.fingerprint};b.periodsFx.months[0].fxSelection=linked.selection;d.modelo_a_snapshot=saveNormalBook(d,recordNormal(d,b));const book=normalBook(d),old=structuredClone(book.result);assert.equal(normalCurrent(d,book),true);const changed=JSON.parse(d.modelo_a_snapshot);changed.currencyEvents[d.context_opportunity].rows[0].description='New source context';d.modelo_a_snapshot=JSON.stringify(changed);assert.equal(normalCurrent(d,normalBook(d)),false);assert.deepEqual(normalBook(d).result,old);assert.equal(calculateNormal(d,normalBook(d)).colecta,null);});
|
||||
|
||||
test('known nondepreciable asset in shortperiod keeps full addback without asking irrelevant timing',()=>{const{d,b}=setup();Object.assign(b.depreciation.assets[0],{category:'nondepreciable',timing:'',method:''});const m=calculateNormal(d,b);assert.equal(val(m.depreciation.adjustment),60);assert.equal(val(m.colecta),1017.6);});
|
||||
@@ -0,0 +1,21 @@
|
||||
<?php
|
||||
$root=dirname(__DIR__);
|
||||
$operation=$argv[1]??'';
|
||||
if(!in_array($operation,['routes','test'],true)||basename($root)!=='portal-investidor-irpc-l6-costs-qa-20261026')throw new RuntimeException('Explicit reliefs QA workspace and routes/test operation required.');
|
||||
foreach(['storage/framework/views','storage/framework/cache','storage/framework/sessions','bootstrap/cache','storage/logs','outputs/irpc-l6-costs']as$dir)if(!is_dir($root.'/'.$dir))mkdir($root.'/'.$dir,0700,true);
|
||||
foreach(['APP_BASE_PATH'=>$root,'APP_ENV'=>'testing','APP_KEY'=>'base64:'.base64_encode(str_repeat('Q',32)),'DB_CONNECTION'=>'pgsql','DB_HOST'=>'127.0.0.1','DB_PORT'=>'55441','DB_DATABASE'=>'simulator_fiscal_delta_20261021_test','DB_USERNAME'=>'postgres','DB_PASSWORD'=>'','DB_URL'=>'','CACHE_STORE'=>'array','SESSION_DRIVER'=>'array','QUEUE_CONNECTION'=>'sync','MAIL_MAILER'=>'array'] as $k=>$v){putenv($k.'='.$v);$_ENV[$k]=$_SERVER[$k]=$v;}
|
||||
$loader=require $root.'/vendor/autoload.php';
|
||||
spl_autoload_register(function($class)use($root){foreach(['App\\'=>'app/','Tests\\'=>'tests/','Database\\Factories\\'=>'database/factories/']as$prefix=>$dir){if(str_starts_with($class,$prefix)){$file=$root.'/'.$dir.str_replace('\\','/',substr($class,strlen($prefix))).'.php';if(is_file($file)){require $file;return;}}}},true,true);
|
||||
$app=require $root.'/bootstrap/app.php';
|
||||
(new Illuminate\Foundation\Bootstrap\LoadEnvironmentVariables)->bootstrap($app);
|
||||
(new Illuminate\Foundation\Bootstrap\LoadConfiguration)->bootstrap($app);
|
||||
$c=config('database.connections.pgsql');
|
||||
if($app->configurationIsCached()||$c['host']!=='127.0.0.1'||(int)$c['port']!==55441||$c['database']!=='simulator_fiscal_delta_20261021_test'||!empty($c['url']))throw new RuntimeException('QA guard');
|
||||
$pdo=new PDO('pgsql:host=127.0.0.1;port=55441;dbname='.$c['database'],$c['username'],$c['password']);
|
||||
if($pdo->query('select current_database()')->fetchColumn()!==$c['database'])throw new RuntimeException('QA identity');
|
||||
if($operation==='routes'){
|
||||
$app->make(Illuminate\Contracts\Console\Kernel::class)->bootstrap();
|
||||
$status=Illuminate\Support\Facades\Artisan::call('wayfinder:generate',['--with-form'=>true]);
|
||||
echo Illuminate\Support\Facades\Artisan::output();exit($status);
|
||||
}
|
||||
$argv=['phpunit','-c','phpunit.investmoz.xml','tests/Feature/IrpcNormalCostsDraftTest.php'];$argc=count($argv);$_SERVER['argv']=$argv;$_SERVER['argc']=$argc;require $root.'/vendor/phpunit/phpunit/phpunit';
|
||||
@@ -0,0 +1,21 @@
|
||||
<?php
|
||||
$root=dirname(__DIR__);
|
||||
$operation=$argv[1]??'';
|
||||
if(!in_array($operation,['routes','test'],true)||basename($root)!=='portal-investidor-irpc-l6-depreciation-qa-20261026')throw new RuntimeException('Explicit reliefs QA workspace and routes/test operation required.');
|
||||
foreach(['storage/framework/views','storage/framework/cache','storage/framework/sessions','bootstrap/cache','storage/logs','outputs/irpc-l6-depreciation']as$dir)if(!is_dir($root.'/'.$dir))mkdir($root.'/'.$dir,0700,true);
|
||||
foreach(['APP_BASE_PATH'=>$root,'APP_ENV'=>'testing','APP_KEY'=>'base64:'.base64_encode(str_repeat('Q',32)),'DB_CONNECTION'=>'pgsql','DB_HOST'=>'127.0.0.1','DB_PORT'=>'55441','DB_DATABASE'=>'simulator_fiscal_delta_20261021_test','DB_USERNAME'=>'postgres','DB_PASSWORD'=>'','DB_URL'=>'','CACHE_STORE'=>'array','SESSION_DRIVER'=>'array','QUEUE_CONNECTION'=>'sync','MAIL_MAILER'=>'array'] as $k=>$v){putenv($k.'='.$v);$_ENV[$k]=$_SERVER[$k]=$v;}
|
||||
$loader=require $root.'/vendor/autoload.php';
|
||||
spl_autoload_register(function($class)use($root){foreach(['App\\'=>'app/','Tests\\'=>'tests/','Database\\Factories\\'=>'database/factories/']as$prefix=>$dir){if(str_starts_with($class,$prefix)){$file=$root.'/'.$dir.str_replace('\\','/',substr($class,strlen($prefix))).'.php';if(is_file($file)){require $file;return;}}}},true,true);
|
||||
$app=require $root.'/bootstrap/app.php';
|
||||
(new Illuminate\Foundation\Bootstrap\LoadEnvironmentVariables)->bootstrap($app);
|
||||
(new Illuminate\Foundation\Bootstrap\LoadConfiguration)->bootstrap($app);
|
||||
$c=config('database.connections.pgsql');
|
||||
if($app->configurationIsCached()||$c['host']!=='127.0.0.1'||(int)$c['port']!==55441||$c['database']!=='simulator_fiscal_delta_20261021_test'||!empty($c['url']))throw new RuntimeException('QA guard');
|
||||
$pdo=new PDO('pgsql:host=127.0.0.1;port=55441;dbname='.$c['database'],$c['username'],$c['password']);
|
||||
if($pdo->query('select current_database()')->fetchColumn()!==$c['database'])throw new RuntimeException('QA identity');
|
||||
if($operation==='routes'){
|
||||
$app->make(Illuminate\Contracts\Console\Kernel::class)->bootstrap();
|
||||
$status=Illuminate\Support\Facades\Artisan::call('wayfinder:generate',['--with-form'=>true]);
|
||||
echo Illuminate\Support\Facades\Artisan::output();exit($status);
|
||||
}
|
||||
$argv=['phpunit','-c','phpunit.investmoz.xml','tests/Feature/IrpcNormalDepreciationDraftTest.php'];$argc=count($argv);$_SERVER['argv']=$argv;$_SERVER['argc']=$argc;require $root.'/vendor/phpunit/phpunit/phpunit';
|
||||
@@ -0,0 +1,21 @@
|
||||
<?php
|
||||
$root=dirname(__DIR__);
|
||||
$operation=$argv[1]??'';
|
||||
if(!in_array($operation,['routes','test'],true)||basename($root)!=='portal-investidor-irpc-l6-periods-fx-qa-20261026')throw new RuntimeException('Explicit reliefs QA workspace and routes/test operation required.');
|
||||
foreach(['storage/framework/views','storage/framework/cache','storage/framework/sessions','bootstrap/cache','storage/logs','outputs/irpc-l6-periods-fx']as$dir)if(!is_dir($root.'/'.$dir))mkdir($root.'/'.$dir,0700,true);
|
||||
foreach(['APP_BASE_PATH'=>$root,'APP_ENV'=>'testing','APP_KEY'=>'base64:'.base64_encode(str_repeat('Q',32)),'DB_CONNECTION'=>'pgsql','DB_HOST'=>'127.0.0.1','DB_PORT'=>'55441','DB_DATABASE'=>'simulator_fiscal_delta_20261021_test','DB_USERNAME'=>'postgres','DB_PASSWORD'=>'','DB_URL'=>'','CACHE_STORE'=>'array','SESSION_DRIVER'=>'array','QUEUE_CONNECTION'=>'sync','MAIL_MAILER'=>'array'] as $k=>$v){putenv($k.'='.$v);$_ENV[$k]=$_SERVER[$k]=$v;}
|
||||
$loader=require $root.'/vendor/autoload.php';
|
||||
spl_autoload_register(function($class)use($root){foreach(['App\\'=>'app/','Tests\\'=>'tests/','Database\\Factories\\'=>'database/factories/']as$prefix=>$dir){if(str_starts_with($class,$prefix)){$file=$root.'/'.$dir.str_replace('\\','/',substr($class,strlen($prefix))).'.php';if(is_file($file)){require $file;return;}}}},true,true);
|
||||
$app=require $root.'/bootstrap/app.php';
|
||||
(new Illuminate\Foundation\Bootstrap\LoadEnvironmentVariables)->bootstrap($app);
|
||||
(new Illuminate\Foundation\Bootstrap\LoadConfiguration)->bootstrap($app);
|
||||
$c=config('database.connections.pgsql');
|
||||
if($app->configurationIsCached()||$c['host']!=='127.0.0.1'||(int)$c['port']!==55441||$c['database']!=='simulator_fiscal_delta_20261021_test'||!empty($c['url']))throw new RuntimeException('QA guard');
|
||||
$pdo=new PDO('pgsql:host=127.0.0.1;port=55441;dbname='.$c['database'],$c['username'],$c['password']);
|
||||
if($pdo->query('select current_database()')->fetchColumn()!==$c['database'])throw new RuntimeException('QA identity');
|
||||
if($operation==='routes'){
|
||||
$app->make(Illuminate\Contracts\Console\Kernel::class)->bootstrap();
|
||||
$status=Illuminate\Support\Facades\Artisan::call('wayfinder:generate',['--with-form'=>true]);
|
||||
echo Illuminate\Support\Facades\Artisan::output();exit($status);
|
||||
}
|
||||
$argv=['phpunit','-c','phpunit.investmoz.xml','tests/Feature/IrpcNormalPeriodFxDraftTest.php'];$argc=count($argv);$_SERVER['argv']=$argv;$_SERVER['argc']=$argc;require $root.'/vendor/phpunit/phpunit/phpunit';
|
||||
@@ -0,0 +1,21 @@
|
||||
<?php
|
||||
$root=dirname(__DIR__);
|
||||
$operation=$argv[1]??'';
|
||||
if(!in_array($operation,['routes','test'],true)||basename($root)!=='portal-investidor-irpc-l6-values-forms-qa-20261026')throw new RuntimeException('Explicit reliefs QA workspace and routes/test operation required.');
|
||||
foreach(['storage/framework/views','storage/framework/cache','storage/framework/sessions','bootstrap/cache','storage/logs','outputs/irpc-l6-values-forms']as$dir)if(!is_dir($root.'/'.$dir))mkdir($root.'/'.$dir,0700,true);
|
||||
foreach(['APP_BASE_PATH'=>$root,'APP_ENV'=>'testing','APP_KEY'=>'base64:'.base64_encode(str_repeat('Q',32)),'DB_CONNECTION'=>'pgsql','DB_HOST'=>'127.0.0.1','DB_PORT'=>'55441','DB_DATABASE'=>'simulator_fiscal_delta_20261021_test','DB_USERNAME'=>'postgres','DB_PASSWORD'=>'','DB_URL'=>'','CACHE_STORE'=>'array','SESSION_DRIVER'=>'array','QUEUE_CONNECTION'=>'sync','MAIL_MAILER'=>'array'] as $k=>$v){putenv($k.'='.$v);$_ENV[$k]=$_SERVER[$k]=$v;}
|
||||
$loader=require $root.'/vendor/autoload.php';
|
||||
spl_autoload_register(function($class)use($root){foreach(['App\\'=>'app/','Tests\\'=>'tests/','Database\\Factories\\'=>'database/factories/']as$prefix=>$dir){if(str_starts_with($class,$prefix)){$file=$root.'/'.$dir.str_replace('\\','/',substr($class,strlen($prefix))).'.php';if(is_file($file)){require $file;return;}}}},true,true);
|
||||
$app=require $root.'/bootstrap/app.php';
|
||||
(new Illuminate\Foundation\Bootstrap\LoadEnvironmentVariables)->bootstrap($app);
|
||||
(new Illuminate\Foundation\Bootstrap\LoadConfiguration)->bootstrap($app);
|
||||
$c=config('database.connections.pgsql');
|
||||
if($app->configurationIsCached()||$c['host']!=='127.0.0.1'||(int)$c['port']!==55441||$c['database']!=='simulator_fiscal_delta_20261021_test'||!empty($c['url']))throw new RuntimeException('QA guard');
|
||||
$pdo=new PDO('pgsql:host=127.0.0.1;port=55441;dbname='.$c['database'],$c['username'],$c['password']);
|
||||
if($pdo->query('select current_database()')->fetchColumn()!==$c['database'])throw new RuntimeException('QA identity');
|
||||
if($operation==='routes'){
|
||||
$app->make(Illuminate\Contracts\Console\Kernel::class)->bootstrap();
|
||||
$status=Illuminate\Support\Facades\Artisan::call('wayfinder:generate',['--with-form'=>true]);
|
||||
echo Illuminate\Support\Facades\Artisan::output();exit($status);
|
||||
}
|
||||
$argv=['phpunit','-c','phpunit.investmoz.xml','tests/Feature/IrpcNormalFormPreparationDraftTest.php'];$argc=count($argv);$_SERVER['argv']=$argv;$_SERVER['argc']=$argc;require $root.'/vendor/phpunit/phpunit/phpunit';
|
||||
Reference in New Issue
Block a user