feat(iva): implement G2L Annex I and explicit continuity pending visual QA

This commit is contained in:
2026-10-24 16:19:52 +02:00
parent 1fe742561f
commit 744682835a
9 changed files with 435 additions and 6 deletions
@@ -0,0 +1,81 @@
{
"status": "prepared_QA_visual_pending_not_installed",
"base_remote_main": "e45a1394fa2ca8631593549b3af62093f25d9c13",
"fresh_fetch": "main e45a1394;ancestral;fetch again before integration",
"coverage": {
"G2K": {
"P008": [
"pharma_manufacturing_inputs"
]
},
"G2L": {
"P035": [
"annexI_goods"
]
},
"new_branches": 2,
"new_treatments": 2,
"documentary_rows": {
"AnexoIII": 170,
"AnexoI": 172
},
"existing_treatments_reused": "Explicit identity-preserving continuations to9(10);no new branch IDs"
},
"counts_current": {
"delivered": 34,
"demonstrated_QA": 1,
"functional_open": 97,
"of_which_P035_visual_pending": 1,
"documentary": 1,
"total": 133
},
"counts_after_QA_and_delivery_only": {
"delivered": 36,
"QA": 0,
"functional_pending": 96,
"documentary": 1,
"total": 133
},
"runtime_delta": [
{
"path": "resources/js/components/simulation-operations.tsx",
"sha256_LF": "6e6d7b5d7f47541683dd4f32e93805b0d3068283a8ff1b3446884f5e4c626039"
},
{
"path": "resources/js/lib/iva-operations.ts",
"sha256_LF": "02e411659c84c00182c6c46f3af499f04648a8cf84911ce11ed9a21f12d48d78"
},
{
"path": "resources/js/lib/iva-pharma-annex.ts",
"sha256_LF": "dd56382b6edcced208efb03ebfc412f75e03b7180d084021ecbde1bac713ce3f"
},
{
"path": "resources/js/lib/iva-annex-i.ts",
"sha256_LF": "6dda21a66dd9399b911bc9839163a5e20f10808ac1937d3b2ca70dff3109424d"
}
],
"QA": {
"G2K": "8882dc54/1fe74256;accepted proofs reused",
"G2L": "4frontend+API1/29;types/buildpassed;12frozenbookscurrentwithoutrecalculation;UI/reportvisualpending"
},
"visual_gate": {
"origin": "http://127.0.0.1:18639",
"user_authorized": true,
"user_requested_retry": true,
"current_tool_result": "A saved user permission setting blocks this action; saved permission or managed policy denies access",
"alternate_origin_or_browser_workaround_attempted": false
},
"before_delivery_required": [
"G2L UI and report visual evidence",
"Fresh remote main and authenticated destination; reconcile concurrent changes",
"Fresh protected backup and isolated restore",
"Git existing activation; served revision/manifest/assets/runtimehashes and preservation delta only"
],
"activation": "Existing Git fast-forward/webhook/installer and existing simulator panel;no migrations/imports/server fiscal activation/permissions/other taxes",
"rollback": "Existing l1-joint-readonly-rollback-20261024.patch passed git apply --check;not applied;keeps catalogue/readers/history/API/reports. Retain prior release and verified fresh backup before deployment;no DBrestore executed.",
"backup_restore_new_delivery": "not yet executed; required before main push",
"homologation_unchanged": true,
"P001": "05/06only;notextended",
"L1_complete": false,
"statistics_AI": "deferred"
}
@@ -1,5 +1,36 @@
# Rastreabilidade, utilização e formação
## 24/10/2026 — G2L / P035 implementado; prova visual pendente
**G2L ainda não concluído em QA.** Código executável,4 testesfrontend eAPIprivada1teste/29asserções passaram;tipos/build passaram. Falta a prova dirigida da interface e a conferência visual do relatório. A ferramenta de controlo do navegador bloqueia `http://127.0.0.1:18639` por permissão guardada/política gerida, apesar de autorização recebida e nova tentativa expressamente pedida. Não é uma recusa actual de autorização da Tempo nem pendência jurídica. Não foi tentado contorno por outro porto,navegador,protocolo ou mecanismo. Prova visual não declarada.
### Fonte e cobertura executável
CIVA republicado Lei13/2016,PDF10/p.1426(268),9(12)(h):transmissões de bens de equipamento,sementes,reprodutores,adubos,pesticidas,herbicidas,fungicidas e similares,redes,anzóis e outros aprestos para pesca,constantes da Pauta e discriminados noAnexoI. Artigo19(1),PDF15/p.1426(273):a alínea9(12)(h) não está na enumeração19(1)(b)(v);não presumir direito à dedução por presença no anexo. AvisoBR89/2017,PDF1/p.569,rectifica os anexos. Lei22/2022,art.3(1),PDF4/p.2252(28),substituiAnexoI,PDF5–11/p.2252(29)–(35),efeitos01/01/2023 peloart.6. Sete páginas conferidas visualmente. Lei3/2025 incide em9(13);Lei10/2025art.1 não altera9(12)(h). Âmbito técnico2026/MZN,sem extensão histórica.
`annexI-lei22-2022/1`:172posições distintas,com identidade,código,designação,página e qualificadores originais. A descrição8201.50.00 continua daPDF8para9;ambas são guardadas. O cabeçalho sem código«Outros tractores» acompanha somente as cinco posições8701.91–95,sem ser anexado à descrição do tractor de lagartas8701.30. Não se inventam medições,certificações ou classificações. A confirmação de qualificadores aplica-se apenas aos que a linha exige. A lista inclui bens com destinos específicos de nutrição/indústria: não se impõe um destino agrícola genérico nem integraçãoSNSou declaração9(14),que não pertencem a esta alínea.
### Sobreposições e reutilização dos tratamentos existentes
O cotejo identificou13posições com correspondência potencial a tratamentos9(10) já disponíveis,com consequências no19(1)(b)(v). Não se transforma toda a lista em07. Três designações coincidentes — tomate fresco/refrigerado0702.00.00,farinha de milho1102.20.00 e insecticidas3808.91.00 — encaminham para os tratamentos existentes por escolha explícita,sem fallback07. Dez outras posições dependem da natureza/destino efectivo,por exemplo farinha de trigo versus mistura comcenteio,ou leite em pó industrial versus destino específico a lactente: escolher a continuidade aplicável ou indicar expressamente no fundamento por que o caso pertence apenas a9(12)(h). Desconhecido não presume ausência de outro enquadramento. A correspondência não certifica a mercadoria nem inventa uma prioridade fiscal genérica.
`continueAnnexIOperation` conserva IDda linha,posição doanexo,valor,moeda,preço,período,estabelecimento,descrição e fundamento;acrescenta a origem documental e adopta o IDdo tratamento existente escolhido. Explica o impacto antes do botão e limpa apenas as confirmações que precisam de revisão. O cálculo antigo permanece no histórico;nenhuma passagem é automática. Os leitores,catálogo,chaves e regras dos tratamentos entregues não foram alterados.
### Dados, provas disponíveis e falta delimitada
Reutiliza contexto/localização,moeda,estabelecimento,valor,representação do preço,período e fundamento. Novo opcional `annexIItem`; `annexIOnly` só é pedido onde a intersecção depende dos factos. Pesquisa mantém a selecção; mudar posição conserva dados comuns e exige rever condições específicas. 4testes novos cobrem172posições,qualificadores/continuação/cabeçalho,desconhecido,13intersecções,passagem explícita,conservação dos montantes e relatório/contexto. Fixture congelada preserva12livros completos e actuais, incluindo G2K ecalendáriov2,sem recálculo nem repetição dos ensaios aceites.
APIprivada POST→GET naQAisolada `simulator_fiscal_delta_20261021_test:55441`,com guarda de destino e transacção revertida:1teste/29asserções. Amostra10linhas de100MZN:07=800,00;05=200,00;IVA0,00;contexto321/Manica/2026-09. Duas linhas usam os IDs existentes de tomate/insecticidas após continuidade explícita;mistura comcenteio e leite industrial têm fundamento próprio. Modelo eHTML recuperados com origens/páginas/versão;nenhuma conferência visual desseHTML alegada. Exportadores Word/PDF eprecisão aceites reutilizados,inalterados.
Falta somente:1)pesquisa/escolha na interface e conservação dos dados;2)retirada/reposição de qualificador;3)continuidade por botão para tratamento existente com revisão das condições;4)payload real da interface→API→recuperação→relatório e conferência visual. Não pedir à Tempo que repita provas ou redescubra regressões;retoma técnica peloCodex quando a origem estiver acessível. Artefactos privados `outputs/iva-l1-g2-agro-annex-20261024/`.
### Entrega conjunta preparada, ainda não disponibilizada
[Manifesto G2K/G2L](../simulations/l1-g2kl-delivery-20261024.json):P008eP035,dois ramos/dois tratamentos novos,170+172opções documentais. G2K8882dc54/1fe74256 mantém-se concluído emQA. G2L está emverificação. Fetch fresco confirmou main `e45a1394`,ancestral,sem avanço concorrente detectado. Patch de contenção existente passou `git apply --check`,não aplicado,conserva catálogo/leitores/históricos/API/relatórios. Antes de entregar:prova visual G2L,destino/main frescos,backup/restauro isolado e activaçãoGit existente,seguida apenas da conferência do delta. Não se afirma backup novo nem instalação nesta passagem.
**Saldo permanece34entregues+1QA(G2K)+97funcionaisabertos+P001=133IDs.** Dentro dos97:P035implementado com prova visual pendente e96por implementar. G2:30entregues+G2KQA+G2Lemverificação=32. Código contém74tratamentoscondicionados+2opçõesindeterminadas;isso não declara G2L demonstrado. Homologação permanece na referênciae45a1394/eb9e0dbc;34fechos,calendário eP001apenas05/06preservados. L1aberto;estatísticas/IAadiadas.
## 24/10/2026 — G2K / P008 demonstrado em QA
**Candidata `8882dc54d0973bc058b04009bdbc36c9da2cc31b`; um ramo, um tratamento: `pharma_manufacturing_inputs`.** Homologação permanece em `e45a1394`, recibo `eb9e0dbc`; os34 ramos entregues, incluindo G2I/G2J e calendário, continuam encerrados. L1 aberto; P001 exclusivamente05/06. Estatísticas/IA adiadas.
File diff suppressed because one or more lines are too long
@@ -1,8 +1,9 @@
import { useState } from 'react';
import { fundraisingActivities } from '@/lib/iva-fundraising';
import { pharmaAnnexEntries, pharmaAnnexEntry, pharmaAnnexReference } from '@/lib/iva-pharma-annex';
import { annexIEntries, annexIEntry, annexIReference } from '@/lib/iva-annex-i';
import { emptyProductionTaxOption, type ProductionTaxOption } from '@/lib/iva-production-option';
import { modeloA06Correspondence, newSalesOperation, operationTreatments, recordSales, reuseSales, salesBook, salesCurrent, salesReportRows, saveSalesBook, splitSales, type SalesBook, type SalesOperation } from '@/lib/iva-operations';
import { continueAnnexIOperation, modeloA06Correspondence, newSalesOperation, operationTreatments, recordSales, reuseSales, salesBook, salesCurrent, salesReportRows, saveSalesBook, splitSales, type SalesBook, type SalesOperation } from '@/lib/iva-operations';
export function SimulationOperations({draft,onChange}:{draft:Record<string,unknown>;onChange:(field:string,value:string)=>void}) {
const [error,setError]=useState('');
@@ -21,7 +22,7 @@ export function SimulationOperations({draft,onChange}:{draft:Record<string,unkno
{error&&<p role="alert">{error}</p>}
<button type="button" className="underline" onClick={()=>run(()=>save(reuseSales(draft,book)))}>Reutilizar vendas e períodos existentes</button>
<button type="button" className="ml-3 underline" disabled={!book.periods.length} onClick={()=>run(()=>save({...book,rows:[...book.rows,newSalesOperation(crypto.randomUUID(),book.periods[0].period,book.currency)]}))}>Acrescentar operação em falta</button>
{book.rows.map(row=>{const rule=operationTreatments.find(r=>r.id===row.treatment);return <details className="rounded border p-3" key={row.id}><summary>{row.description||'Operação adicional'} — {row.period}</summary>
{book.rows.map(row=>{const rule=operationTreatments.find(r=>r.id===row.treatment),annexI=annexIEntry(row.annexIItem);return <details className="rounded border p-3" key={row.id}><summary>{row.description||'Operação adicional'} — {row.period}</summary>
<p>Origem: {row.source}; {row.sourceAmount??'sem valor de origem'} {row.sourceCurrency}; {row.sourcePeriod}. O estabelecimento não é inferido da localização do projecto.</p>
<div className="grid gap-3 md:grid-cols-2">
<label>Descrição da operação<input className="block rounded border p-2" value={row.description} onChange={e=>change(row.id,{description:e.target.value})}/></label>
@@ -31,6 +32,16 @@ export function SimulationOperations({draft,onChange}:{draft:Record<string,unkno
<label>Representação do preço<select className="block rounded border p-2" value={row.basis} onChange={e=>change(row.id,{basis:e.target.value as SalesOperation['basis']})}><option value="">Ainda desconhecida</option><option value="net">Sem IVA</option><option value="included">IVA incluído</option></select></label>
<label>Tratamento da operação<select className="block rounded border p-2" value={row.treatment} onChange={e=>change(row.id,{treatment:e.target.value,confirmed:[]})}>{operationTreatments.map(t=><option value={t.id} key={t.id}>{t.label}</option>)}</select></label>
</div>
{row.treatment==='annexI_goods'&&<fieldset className="space-y-2 rounded border p-2"><legend>Bem do Anexo I — edição Lei22/2022</legend>
<p>Escolha código e designação e confira apenas os qualificadores dessa linha. A pesquisa conserva a escolha actual; mudar de posição exige rever as condições específicas. O anexo não dispensa o enquadramento de outras isenções aplicáveis ao mesmo bem.</p>
<label className="block">Pesquisar código ou designação no Anexo I<input value={annexSearch[`I:${row.id}`]??''} onChange={e=>setAnnexSearch({...annexSearch,[`I:${row.id}`]:e.target.value})}/></label>
<label className="block">Posição do Anexo I<select className="block max-w-full rounded border p-2" value={row.annexIItem??''} onChange={e=>change(row.id,{annexIItem:e.target.value,annexIOnly:undefined,confirmed:row.confirmed.filter(n=>n===0)})}><option value="">Ainda por determinar</option>{annexIEntries.filter(entry=>entry.id===row.annexIItem||`${entry.code} ${entry.context??''} ${entry.label}`.toLocaleLowerCase('pt').includes((annexSearch[`I:${row.id}`]??'').trim().toLocaleLowerCase('pt'))).map(entry=><option key={entry.id} value={entry.id}>{entry.code} — {entry.context?entry.context+' — ':''}{entry.label} (PDF{entry.pdfPage})</option>)}</select></label>
{row.annexIItem&&<p>{annexI?annexIReference(annexI):`Posição guardada não encontrada nesta edição: ${row.annexIItem}. Original conservado; escolha explicitamente a correspondência.`}</p>}
{!!annexI?.relatedTreatments?.length&&<div><p>Confira a natureza e o destino: há um tratamento existente que pode abranger este bem. Se for aplicável, use-o para conservar também o direito à dedução nas condições legais. Ao confirmar a passagem, conserva valores e origem e terá de rever as condições do tratamento escolhido; nenhum resultado anterior é substituído automaticamente.</p>
{annexI.relatedTreatments.map(id=>{const target=operationTreatments.find(t=>t.id===id);return target&&<button className="block underline" type="button" key={id} onClick={()=>run(()=>save({...book,rows:book.rows.map(r=>r.id===row.id?continueAnnexIOperation(r,id):r)}))}>Usar {target.label} e rever condições</button>;})}
{!annexI.relatedRequired&&<label className="block"><input type="checkbox" checked={row.annexIOnly===true} onChange={e=>change(row.id,{annexIOnly:e.target.checked})}/>Conferi a designação e o destino: esta operação não corresponde ao tratamento indicado acima; o fundamento explica a aplicação apenas do artigo9(12)(h).</label>}
</div>}
</fieldset>}
{row.treatment==='pharma_manufacturing_inputs'&&<fieldset className="space-y-2 rounded border p-2"><legend>Bem do Anexo III — edição Lei22/2022</legend>
<p>Escolha a linha pelo código e pela designação. O estabelecimento que transmite deve estar integrado no SNS; o destino hospitalar não substitui essa condição. A selecção não classifica automaticamente uma mercadoria nem confirma a sua utilização.</p>
<label className="block">Pesquisar código ou designação<input value={annexSearch[row.id]??''} onChange={e=>setAnnexSearch({...annexSearch,[row.id]:e.target.value})}/></label>
+181
View File
@@ -0,0 +1,181 @@
// Accepted official exemplar: preserve qualifiers and uncoded group headings, not tariff inference.
export const annexIVersion='annexI-lei22-2022/1';
export const annexISource='Lei22/2022, art.3(1), AnexoI, PDF5–11, p.2252(29)–(35); efeitos01/01/2023';
export const annexIPdfSha256='ea1b0dc6f5cf6e595f6d9a19e7042f398999e0087caef1785f6e8fac571b5f53';
export type AnnexIEntry={id:string;code:string;label:string;pdfPage:number;lastPdfPage:number;context?:string;relatedTreatments?:string[];relatedRequired?:boolean};
export const annexIEntries:AnnexIEntry[]=[
{"id":"annexI-2022-001","code":"0102.21.00","label":"-Bovinos domésticos - Reprodutores de raça pura","pdfPage":5,"lastPdfPage":5},
{"id":"annexI-2022-002","code":"0102.31.00","label":"-Búfalos - Reprodutores de raça pura","pdfPage":5,"lastPdfPage":5},
{"id":"annexI-2022-003","code":"0103.10.00","label":"Animais vivos da espécie suína - Reprodutores de raça pura","pdfPage":5,"lastPdfPage":5},
{"id":"annexI-2022-004","code":"0104.10.10","label":"- Ovinos - Reprodutores de raça pura","pdfPage":5,"lastPdfPage":5},
{"id":"annexI-2022-005","code":"0104.20.10","label":"- Caprinos - Reprodutores de raça pura","pdfPage":5,"lastPdfPage":5},
{"id":"annexI-2022-006","code":"0105.11.10","label":"- Galos e galinhas (De peso não superior a 185g) - Reprodutores certificados","pdfPage":5,"lastPdfPage":5},
{"id":"annexI-2022-007","code":"0105.12.10","label":"- Peruas e perus (De peso não superior a 185g) -Reprodutores certificados","pdfPage":5,"lastPdfPage":5},
{"id":"annexI-2022-008","code":"0105.13.10","label":"- Patos - Reprodutores certificados","pdfPage":5,"lastPdfPage":5},
{"id":"annexI-2022-009","code":"0105.14.10","label":"-Gansos - Reprodutores certificados","pdfPage":5,"lastPdfPage":5},
{"id":"annexI-2022-010","code":"0105.94.10","label":"-Galos e galinhas - Reprodutores certificados e poedeiras","pdfPage":5,"lastPdfPage":5},
{"id":"annexI-2022-011","code":"0301.99.10","label":"- Peixes reprodutores","pdfPage":5,"lastPdfPage":5},
{"id":"annexI-2022-012","code":"0306.36.10","label":"- Camarões - Larvas de camarão com comprimento não superior a 1 mm","pdfPage":5,"lastPdfPage":5},
{"id":"annexI-2022-013","code":"0402.21.10","label":"- Leite em pó, grânulos ou outras formas sólidas, concentrados sem adição de açúcar ou de outros edulcorantes, com um teor, em peso, de matérias gordas, superior a 1,5%, para uso na indústria acondicionado em embalagens de capacidade igual ou superior a 25Kg","pdfPage":5,"lastPdfPage":5,"relatedTreatments":["listed_infant_powdered_milk"],"relatedRequired":false},
{"id":"annexI-2022-014","code":"0404.90.10","label":"-Soro de leite para aleitamento de crias de animais","pdfPage":5,"lastPdfPage":5},
{"id":"annexI-2022-015","code":"0407.11.00","label":"Ovos de aves, com casca, frescos, conservados ou cozidos. - Ovos para incubação certificados","pdfPage":5,"lastPdfPage":5},
{"id":"annexI-2022-016","code":"0511.10.00","label":"- Sémen de bovino","pdfPage":5,"lastPdfPage":5},
{"id":"annexI-2022-017","code":"0511.10.10","label":"- Sémen de outras espécies","pdfPage":5,"lastPdfPage":5},
{"id":"annexI-2022-018","code":"0511.99.10","label":"- Embriões de bovino","pdfPage":5,"lastPdfPage":5},
{"id":"annexI-2022-019","code":"0511.99.20","label":"- Embriões de outras espécies","pdfPage":5,"lastPdfPage":5},
{"id":"annexI-2022-020","code":"0602.90.20","label":"-Mudas de plantas florestais e de fruteiras","pdfPage":5,"lastPdfPage":5},
{"id":"annexI-2022-021","code":"0701.10.00","label":"- Batata-semente","pdfPage":5,"lastPdfPage":5,"relatedTreatments":["listed_potato"],"relatedRequired":false},
{"id":"annexI-2022-022","code":"0701.90.00","label":"-Outras","pdfPage":5,"lastPdfPage":5,"relatedTreatments":["listed_potato"],"relatedRequired":false},
{"id":"annexI-2022-023","code":"0702.00.00","label":"Tomate, frescos ou refrigerados","pdfPage":5,"lastPdfPage":5,"relatedTreatments":["listed_fresh_chilled_tomato"],"relatedRequired":true},
{"id":"annexI-2022-024","code":"0703.10.11","label":"- Cebolas -De semente","pdfPage":5,"lastPdfPage":5,"relatedTreatments":["listed_onion"],"relatedRequired":false},
{"id":"annexI-2022-025","code":"0703.10.19","label":"-Outras","pdfPage":5,"lastPdfPage":5,"relatedTreatments":["listed_onion"],"relatedRequired":false},
{"id":"annexI-2022-026","code":"0713.32.10","label":"- Feijão Adzuki destinado à sementeira","pdfPage":5,"lastPdfPage":5},
{"id":"annexI-2022-027","code":"0713.33.10","label":"- Feijão comum -destinado à sementeira","pdfPage":6,"lastPdfPage":6},
{"id":"annexI-2022-028","code":"0713.39.10","label":"- Outros feijões -destinados à sementeira","pdfPage":6,"lastPdfPage":6},
{"id":"annexI-2022-029","code":"0801.19.10","label":"- Semente de coco híbrido","pdfPage":6,"lastPdfPage":6},
{"id":"annexI-2022-030","code":"0801.19.20","label":"- Semente de coco não híbrido","pdfPage":6,"lastPdfPage":6},
{"id":"annexI-2022-031","code":"1001.11.00","label":"-Trigo duro - para sementeira","pdfPage":6,"lastPdfPage":6,"relatedTreatments":["listed_wheat"],"relatedRequired":false},
{"id":"annexI-2022-032","code":"1001.91.00","label":"-Outros -Para sementeira","pdfPage":6,"lastPdfPage":6,"relatedTreatments":["listed_wheat"],"relatedRequired":false},
{"id":"annexI-2022-033","code":"1002.10.00","label":"-Centeio -Para sementeira","pdfPage":6,"lastPdfPage":6},
{"id":"annexI-2022-034","code":"1003.10.00","label":"-Cevada -Para sementeira","pdfPage":6,"lastPdfPage":6},
{"id":"annexI-2022-035","code":"1004.10.00","label":"-Aveia -Para sementeira","pdfPage":6,"lastPdfPage":6},
{"id":"annexI-2022-036","code":"1005.10.00","label":"- Milho - Para sementeira","pdfPage":6,"lastPdfPage":6,"relatedTreatments":["listed_maize"],"relatedRequired":false},
{"id":"annexI-2022-037","code":"1006.10.10","label":"- Arroz com casca -Destinado à sementeira","pdfPage":6,"lastPdfPage":6,"relatedTreatments":["listed_rice"],"relatedRequired":false},
{"id":"annexI-2022-038","code":"1007.10.00","label":"- Sorgo de grão -para sementeira","pdfPage":6,"lastPdfPage":6},
{"id":"annexI-2022-039","code":"1008.21.00","label":"-Painço -Para sementeira","pdfPage":6,"lastPdfPage":6},
{"id":"annexI-2022-040","code":"1008.90.21","label":"- Mexoeira -Para sementeira","pdfPage":6,"lastPdfPage":6},
{"id":"annexI-2022-041","code":"1008.90.91","label":"-Outros cereais -Para sementeira","pdfPage":6,"lastPdfPage":6},
{"id":"annexI-2022-042","code":"1101.00.00","label":"Farinhas de trigo ou mistura de trigo com centeio","pdfPage":6,"lastPdfPage":6,"relatedTreatments":["listed_wheat_flour"],"relatedRequired":false},
{"id":"annexI-2022-043","code":"1102.20.00","label":"- Farinha de milho","pdfPage":6,"lastPdfPage":6,"relatedTreatments":["listed_maize_flour"],"relatedRequired":true},
{"id":"annexI-2022-044","code":"1201.10.00","label":"Soja, mesmo triturada -Para sementeira","pdfPage":6,"lastPdfPage":6},
{"id":"annexI-2022-045","code":"1202.30.00","label":"Amendoins. -Para sementeira","pdfPage":6,"lastPdfPage":6},
{"id":"annexI-2022-046","code":"1204.00.10","label":"-Sementes de linho -Para sementeira","pdfPage":6,"lastPdfPage":6},
{"id":"annexI-2022-047","code":"1206.00.10","label":"Sementes de girassol -Para sementeira","pdfPage":6,"lastPdfPage":6},
{"id":"annexI-2022-048","code":"1207.21.00","label":"- Sementes de algodão -Para sementeira","pdfPage":6,"lastPdfPage":6},
{"id":"annexI-2022-049","code":"1207.30.00","label":"- Sementes de rícino","pdfPage":6,"lastPdfPage":6},
{"id":"annexI-2022-050","code":"1207.40.10","label":"- Sementes de gergelim -Para sementeira","pdfPage":6,"lastPdfPage":6},
{"id":"annexI-2022-051","code":"1207.50.00","label":"-Sementes de mostarda","pdfPage":6,"lastPdfPage":6},
{"id":"annexI-2022-052","code":"1207.60.00","label":"-Sementes de cártamo","pdfPage":6,"lastPdfPage":6},
{"id":"annexI-2022-053","code":"1207.70.00","label":"-Sementes de Melão","pdfPage":6,"lastPdfPage":6},
{"id":"annexI-2022-054","code":"1207.91.00","label":"-Sementes de dormideira ou papoula","pdfPage":6,"lastPdfPage":6},
{"id":"annexI-2022-055","code":"1207.99.10","label":"-Outras sementes para sementeira","pdfPage":6,"lastPdfPage":6},
{"id":"annexI-2022-056","code":"1209.10.00","label":"-Sementes de beterraba sacarina","pdfPage":6,"lastPdfPage":6},
{"id":"annexI-2022-057","code":"1209.21.00","label":"- Semente de alfafa (Luzerna)","pdfPage":6,"lastPdfPage":6},
{"id":"annexI-2022-058","code":"1209.22.00","label":"-Sementes de trevo (Tlurifolium spp)","pdfPage":7,"lastPdfPage":7},
{"id":"annexI-2022-059","code":"1209.23.00","label":"- Sementes de festuca","pdfPage":7,"lastPdfPage":7},
{"id":"annexI-2022-060","code":"1209.24.00","label":"- Sementes de pasto dos prados de Kentucky (Poa pratensis L.)","pdfPage":7,"lastPdfPage":7},
{"id":"annexI-2022-061","code":"1209.25.00","label":"-Sementes de azevém (Lolium multiflorum Lam, Lolium perente L.)","pdfPage":7,"lastPdfPage":7},
{"id":"annexI-2022-062","code":"1209.29.00","label":"-Outras (sementes)","pdfPage":7,"lastPdfPage":7},
{"id":"annexI-2022-063","code":"1209.30.00","label":"-Sementes de plantas herbáceas cultivadas especialmente pelas suas flores","pdfPage":7,"lastPdfPage":7},
{"id":"annexI-2022-064","code":"1209.91.00","label":"- Outras -Sementes de produtos hortícolas","pdfPage":7,"lastPdfPage":7},
{"id":"annexI-2022-065","code":"1209.99.00","label":"- Outras sementes","pdfPage":7,"lastPdfPage":7},
{"id":"annexI-2022-066","code":"1901.10.10","label":"- Preparações alimentícias à base de lacticínios, para lactentes e crianças de tenra idade, acondicionadas para venda à retalho","pdfPage":7,"lastPdfPage":7},
{"id":"annexI-2022-067","code":"1901.10.30","label":"- Preparações alimentares, terapêuticas à base de lacticínios ou de cereais","pdfPage":7,"lastPdfPage":7},
{"id":"annexI-2022-068","code":"2106.90.20","label":"- Produto composto para fortificação de alimentos destinados ao consumo humano, contendo alguns dos seguintes micronutrientes, vitaminas, iodo, zinco, ácido fólico e ferro (por exemplo, produtos denominados PREMIX)","pdfPage":7,"lastPdfPage":7},
{"id":"annexI-2022-069","code":"2309.90.10","label":"- Preparações, aditivos do tipo utilizado na aquacultura do camarão, na avicultura, na pecuária e pré-mistura de alta concentração.","pdfPage":7,"lastPdfPage":7},
{"id":"annexI-2022-070","code":"3101.00.00","label":"Adubos (fertilizantes) de origem animal ou vegetal, mesmo misturados entre si ou tratados quimicamente; adubos (fertilizantes) resultantes da mistura ou do tratamento químico de produtos de origem animal ou vegetal","pdfPage":7,"lastPdfPage":7},
{"id":"annexI-2022-071","code":"3102.10.00","label":"Adubos (fertilizantes) minerais ou químicos, azotados (nitrogenados): - Ureia, mesmo em solução aquosa","pdfPage":7,"lastPdfPage":7},
{"id":"annexI-2022-072","code":"3102.21.00","label":"Adubos (fertilizantes) minerais ou químicos, azotados (nitrogenados): - Sulfato de amónio","pdfPage":7,"lastPdfPage":7},
{"id":"annexI-2022-073","code":"3102.29.00","label":"-Outros adubos (fertilizantes) minerais ou químicos, azotados (nitrogenados)","pdfPage":7,"lastPdfPage":7},
{"id":"annexI-2022-074","code":"3102.30.00","label":"Adubos (fertilizantes) minerais ou químicos, azotados (nitrogenados): -Nitrato de amónio, mesmo em solução aquosa","pdfPage":7,"lastPdfPage":7},
{"id":"annexI-2022-075","code":"3102.40.00","label":"Adubos (fertilizantes) minerais ou químicos, azotados (nitrogenados): - Misturas de nitrato de amónio com carbonato de cálcio ou com outras matérias inorgânicas desprovidas de poder fertilizante","pdfPage":7,"lastPdfPage":7},
{"id":"annexI-2022-076","code":"3102.50.00","label":"Adubos (fertilizantes) minerais ou químicos, azotados (nitrogenados): - Nitrato de sódio","pdfPage":7,"lastPdfPage":7},
{"id":"annexI-2022-077","code":"3102.60.00","label":"Adubos (fertilizantes) minerais ou químicos, azotados (nitrogenados): - Sais duplos e misturas de nitrato de cálcio e nitrato de amónio","pdfPage":7,"lastPdfPage":7},
{"id":"annexI-2022-078","code":"3102.80.00","label":"Adubos (fertilizantes) minerais ou químicos, azotados (nitrogenados): - Misturas de ureia com nitrato de amónio em soluções aquosas ou amoniacais","pdfPage":7,"lastPdfPage":7},
{"id":"annexI-2022-079","code":"3102.90.00","label":"Adubos (fertilizantes) minerais ou químicos, azotados (nitrogenados): - Outros incluídas as misturas não mencionadas nas sub posições precedentes","pdfPage":7,"lastPdfPage":7},
{"id":"annexI-2022-080","code":"3103.11.00","label":"Adubos (fertilizantes) minerais ou químicos, fosfatados: - Superfosfatos Que contenham, em peso, 35% ou mais de pentóxido de difósforo","pdfPage":7,"lastPdfPage":7},
{"id":"annexI-2022-081","code":"3103.19.00","label":"Outros superfosfatos","pdfPage":7,"lastPdfPage":7},
{"id":"annexI-2022-082","code":"3103.90.00","label":"- Outros adubos (fertilizantes) minerais ou químicos, fosfatados","pdfPage":7,"lastPdfPage":7},
{"id":"annexI-2022-083","code":"3104.20.00","label":"Adubos (fertilizantes) minerais ou químicos, potássicos: - Cloreto de potássio","pdfPage":7,"lastPdfPage":7},
{"id":"annexI-2022-084","code":"3104.30.00","label":"Adubos (fertilizantes) minerais ou químicos, potássicos: - Sulfato de potássio","pdfPage":8,"lastPdfPage":8},
{"id":"annexI-2022-085","code":"3104.90.00","label":"- Outros adubos (fertilizantes) minerais ou químicos, potássicos","pdfPage":8,"lastPdfPage":8},
{"id":"annexI-2022-086","code":"3105.10.00","label":"Adubos (fertilizantes) minerais ou químicos, contendo dois ou três dos seguintes elementos fertilizantes: azoto (nitrogénio), fósforo e potássio; outros adubos (fertilizantes). -Produtos do presente capítulo apresentados em tabletes ou forma semelhantes, ou ainda em embalagens com peso bruto não superior a 10 kg","pdfPage":8,"lastPdfPage":8},
{"id":"annexI-2022-087","code":"3105.20.00","label":"- Adubos (fertilizantes) minerais ou químicos, contendo os três elementos fertilizantes: azoto (nitrogénio), fósforo e potássio","pdfPage":8,"lastPdfPage":8},
{"id":"annexI-2022-088","code":"3105.30.00","label":"- Adubos (fertilizantes) minerais ou químicos, Hidrogéno-ortofosfato de diamónio (fosfato diamónico ou dimoniacal)","pdfPage":8,"lastPdfPage":8},
{"id":"annexI-2022-089","code":"3105.40.00","label":"-Diidrogeno-ortofosfato de amónio (fosfato monoamónico ou monoamonical), mesmo misturado com hidrogeno-ortofosfato de diamónio (fosfato diamónico ou diamonical)","pdfPage":8,"lastPdfPage":8},
{"id":"annexI-2022-090","code":"3105.51.00","label":"- Outros adubos (fertilizantes) minerais ou químicos, contendo os dois elementos fertilizantes, azoto (nitrogénio) e fósforo: -que contenham nitratos e fosfatos","pdfPage":8,"lastPdfPage":8},
{"id":"annexI-2022-091","code":"3105.59.00","label":"- Outros adubos (fertilizantes) minerais ou químicos, contendo os dois elementos fertilizantes: azoto (nitrogénio) e fósforo","pdfPage":8,"lastPdfPage":8},
{"id":"annexI-2022-092","code":"3105.60.00","label":"- Adubos (fertilizantes) minerais ou químicos, contendo os dois elementos fertilizantes: fósforos e potássio","pdfPage":8,"lastPdfPage":8},
{"id":"annexI-2022-093","code":"3105.90.00","label":"- Outros adubos (fertilizantes) minerais ou químicos, contendo dois ou três dos seguintes elementos fertilizantes: azoto (nitrogénio), fósforo e potássio; outros adubos (fertilizantes), produtos do presente capítulo apresentados em tabletes ou forma semelhantes, ou ainda em embalagens com peso bruto não superior a 10 kg","pdfPage":8,"lastPdfPage":8},
{"id":"annexI-2022-094","code":"3808.91.00","label":"- Insecticidas","pdfPage":8,"lastPdfPage":8,"relatedTreatments":["listed_insecticides"],"relatedRequired":true},
{"id":"annexI-2022-095","code":"3808.92.00","label":"- Fungicidas","pdfPage":8,"lastPdfPage":8},
{"id":"annexI-2022-096","code":"3808.93.00","label":"- Herbicida, inibidores de germinação e reguladores de crescimento para plantas","pdfPage":8,"lastPdfPage":8},
{"id":"annexI-2022-097","code":"3808.94.00","label":"- Desinfectantes","pdfPage":8,"lastPdfPage":8},
{"id":"annexI-2022-098","code":"3808.99.00","label":"- Outros produtos semelhantes","pdfPage":8,"lastPdfPage":8},
{"id":"annexI-2022-099","code":"3821.00.00","label":"Meios de cultura preparados para o desenvolvimento de microrganismos e a manutenção de microrganismos (incluindo os vírus e os organismos similares) ou de células vegetais, humanas ou animais","pdfPage":8,"lastPdfPage":8},
{"id":"annexI-2022-100","code":"3822.00.00","label":"Reagentes de diagnóstico ou de laboratório em qualquer suporte e reagentes de diagnóstico ou de laboratório preparados, mesmos apresentados num suporte, excepto os das posições 30.02 ou 30.06; materiais de referência certificados","pdfPage":8,"lastPdfPage":8},
{"id":"annexI-2022-101","code":"3926.90.10","label":"- Flutuadores para a pesca","pdfPage":8,"lastPdfPage":8},
{"id":"annexI-2022-102","code":"3926.90.40","label":"- Brincos para identificação de animais","pdfPage":8,"lastPdfPage":8},
{"id":"annexI-2022-103","code":"5608.11.00","label":"-Redes confeccionadas para a pesca","pdfPage":8,"lastPdfPage":8},
{"id":"annexI-2022-104","code":"6304.20.00","label":"- Mosquiteiros para cama","pdfPage":8,"lastPdfPage":8},
{"id":"annexI-2022-105","code":"6305.10.00","label":"- Sacos de juta ou de outras fibras têxteis liberianas","pdfPage":8,"lastPdfPage":8},
{"id":"annexI-2022-106","code":"8201.10.00","label":"- Pás","pdfPage":8,"lastPdfPage":8},
{"id":"annexI-2022-107","code":"8201.30.00","label":"- Alviões, picaretas, enxadas, sachos, ancinhos e raspadeiras","pdfPage":8,"lastPdfPage":8},
{"id":"annexI-2022-108","code":"8201.40.00","label":"- Machados, padrões e ferramentas semelhantes de gume","pdfPage":8,"lastPdfPage":8},
{"id":"annexI-2022-109","code":"8201.50.00","label":"- Tesouras de podar (incluindo as tesouras para aves domésticas), manipuladas com uma das mãos","pdfPage":8,"lastPdfPage":9},
{"id":"annexI-2022-110","code":"8201.60.00","label":"- Tesouras para sebes, tesouras de podar e ferramentas semelhantes, manipuladas com as duas mãos","pdfPage":9,"lastPdfPage":9},
{"id":"annexI-2022-111","code":"8201.90.00","label":"- Outras ferramentas manuais para agricultura, horticultura e silvicultura","pdfPage":9,"lastPdfPage":9},
{"id":"annexI-2022-112","code":"8202.10.00","label":"- Serras manuais","pdfPage":9,"lastPdfPage":9},
{"id":"annexI-2022-113","code":"8202.20.00","label":"- Folhas para serras de fita","pdfPage":9,"lastPdfPage":9},
{"id":"annexI-2022-114","code":"8208.40.00","label":"- Correntes cortantes de serras","pdfPage":9,"lastPdfPage":9},
{"id":"annexI-2022-115","code":"8413.20.00","label":"Bombas para líquidos, mesmo com dispositivo medidor, elevadores de líquidos. -Bombas manuais, excepto das subposições 8413.11 e 8413.19","pdfPage":9,"lastPdfPage":9},
{"id":"annexI-2022-116","code":"8413.81.00","label":"- Outras Bombas","pdfPage":9,"lastPdfPage":9},
{"id":"annexI-2022-117","code":"8413.82.00","label":"- Elevadores de líquidos","pdfPage":9,"lastPdfPage":9},
{"id":"annexI-2022-118","code":"8419.31.00","label":"- Secadores - Para produtos agrícolas","pdfPage":9,"lastPdfPage":9},
{"id":"annexI-2022-119","code":"8421.11.00","label":"Centrifugadores, incluindo os secadores centrífugos; -Desnatadeiras","pdfPage":9,"lastPdfPage":9},
{"id":"annexI-2022-120","code":"8424.81.00","label":"- Aparelhos mecânicos (mesmo manuais) para projectar, dispersar ou pulverizar líquidos ou pós, para agricultura ou horticultura","pdfPage":9,"lastPdfPage":9},
{"id":"annexI-2022-121","code":"8424.90.00","label":"- Partes","pdfPage":9,"lastPdfPage":9},
{"id":"annexI-2022-122","code":"8425.31.00","label":"- Guinchos e cabrestantes de motor eléctrico","pdfPage":9,"lastPdfPage":9},
{"id":"annexI-2022-123","code":"8425.39.00","label":"- Outros guinchos e cabrestantes","pdfPage":9,"lastPdfPage":9},
{"id":"annexI-2022-124","code":"8432.10.00","label":"- Arados e charruas","pdfPage":9,"lastPdfPage":9},
{"id":"annexI-2022-125","code":"8432.21.00","label":"-Grades de discos","pdfPage":9,"lastPdfPage":9},
{"id":"annexI-2022-126","code":"8432.29.00","label":"- Outros: Grades, escarificadores, cultivadores, extirpadores, enxadas e sachadores","pdfPage":9,"lastPdfPage":9},
{"id":"annexI-2022-127","code":"8432.31.00","label":"- Semeadores, plantadores e transplantadores","pdfPage":9,"lastPdfPage":9},
{"id":"annexI-2022-128","code":"8432.41.00","label":"- Espalhadores de estrume e distribuidores de adubos (fertilizantes)","pdfPage":9,"lastPdfPage":9},
{"id":"annexI-2022-129","code":"8432.80.00","label":"- Outras máquinas e aparelhos de uso agrícola, hortícola ou florestal, para preparação ou trabalho do solo ou para cultura","pdfPage":9,"lastPdfPage":9},
{"id":"annexI-2022-130","code":"8432.90.00","label":"- Partes de máquinas e aparelhos de uso agrícola, hortícola ou florestal, para preparação ou trabalho do solo ou para cultura","pdfPage":9,"lastPdfPage":9},
{"id":"annexI-2022-131","code":"8433.11.00","label":"-Cortadores de relva motorizados, cujo dispositivo de corte gira num plano horizontal, para colheita ou debulha de produtos agrícolas","pdfPage":9,"lastPdfPage":9},
{"id":"annexI-2022-132","code":"8433.19.00","label":"-Outros cortadores de relva motorizados, para colheita ou debulha de produtos agrícolas","pdfPage":9,"lastPdfPage":9},
{"id":"annexI-2022-133","code":"8433.20.00","label":"- Ceifeiras, incluindo as barras de corte para montagem em tractores","pdfPage":9,"lastPdfPage":9},
{"id":"annexI-2022-134","code":"8433.30.00","label":"- Outras máquinas e aparelhos para colher e dispor o feno","pdfPage":9,"lastPdfPage":9},
{"id":"annexI-2022-135","code":"8433.40.00","label":"- Enfardadeiras de palha ou de forragem, incluindo as enfardadeiras- apanhadeiras","pdfPage":9,"lastPdfPage":9},
{"id":"annexI-2022-136","code":"8433.51.00","label":"-Ceifeiras-debulhadoras","pdfPage":9,"lastPdfPage":9},
{"id":"annexI-2022-137","code":"8433.52.00","label":"- Outras máquinas e aparelhos para debulha","pdfPage":9,"lastPdfPage":9},
{"id":"annexI-2022-138","code":"8433.53.00","label":"- Máquinas para colheita de raízes ou tubérculos","pdfPage":9,"lastPdfPage":9},
{"id":"annexI-2022-139","code":"8433.59.00","label":"- Outras máquinas e aparelhos para colheita e para debulha","pdfPage":9,"lastPdfPage":9},
{"id":"annexI-2022-140","code":"8433.60.00","label":"- Máquinas para limpar ou seleccionar ovos, frutas ou outros produtos agrícolas","pdfPage":9,"lastPdfPage":9},
{"id":"annexI-2022-141","code":"8433.90.00","label":"- Partes de máquina e aparelhos para colheita ou debulha de produtos agrícolas, incluindo as enfardadeiras de palha ou forragem; cortadores de relva e ceifeiras; máquinas para limpar e seleccionar ovos, frutas ou outros produtos agrícolas, excepto os da posição nº. 84.37.","pdfPage":9,"lastPdfPage":9},
{"id":"annexI-2022-142","code":"8434.10.00","label":"- Máquinas de ordenhar","pdfPage":9,"lastPdfPage":9},
{"id":"annexI-2022-143","code":"8434.20.00","label":"- Máquinas e aparelhos, para a indústria de lacticínios","pdfPage":10,"lastPdfPage":10},
{"id":"annexI-2022-144","code":"8434.90.00","label":"- Partes de máquinas e aparelhos de ordenhar e para a indústria de lacticínios","pdfPage":10,"lastPdfPage":10},
{"id":"annexI-2022-145","code":"8435.10.00","label":"Prensas, esmagadores, máquinas e aparelhos semelhantes, para fabricação de vinho, sidra, sumos de frutas ou bebidas semelhantes - Máquinas e aparelhos","pdfPage":10,"lastPdfPage":10},
{"id":"annexI-2022-146","code":"8435.90.00","label":"- Partes de prensas, esmagadores, máquinas e aparelhos semelhantes, para fabricação de vinho, sidra, sumos de frutas ou bebidas semelhantes","pdfPage":10,"lastPdfPage":10},
{"id":"annexI-2022-147","code":"8436.10.00","label":"- Máquinas e aparelhos, para preparação de alimentos e rações para animais","pdfPage":10,"lastPdfPage":10},
{"id":"annexI-2022-148","code":"8436.21.00","label":"- Chocadeiras e criadeiras para avicultura","pdfPage":10,"lastPdfPage":10},
{"id":"annexI-2022-149","code":"8436.29.00","label":"- Outras máquinas e aparelhos, para agricultura, horticultura, silvicultura, avicultura ou apicultura, incluindo os germinadores equipados com dispositivos mecânicos ou térmicos","pdfPage":10,"lastPdfPage":10},
{"id":"annexI-2022-150","code":"8436.80.00","label":"- Outras máquinas e aparelhos","pdfPage":10,"lastPdfPage":10},
{"id":"annexI-2022-151","code":"8436.91.00","label":"-Partes de máquinas e aparelhos, para agricultura, horticultura, silvicultura, avicultura ou apicultura, incluindo os germinadores equipados com dispositivos mecânicos ou térmicos e as chocadeiras e criadeiras para silvicultura","pdfPage":10,"lastPdfPage":10},
{"id":"annexI-2022-152","code":"8436.99.00","label":"- Partes de outras máquinas e aparelhos","pdfPage":10,"lastPdfPage":10},
{"id":"annexI-2022-153","code":"8437.10.00","label":"- Máquinas para limpeza, selecção ou peneiração de grão ou de produtos agrícolas secos","pdfPage":10,"lastPdfPage":10},
{"id":"annexI-2022-154","code":"8437.80.00","label":"- Outras máquinas e aparelhos para a indústria de moagem ou tratamento de cereais ou de produtos hortícolas secos, excepto dos tipos utilizados em fazendas","pdfPage":10,"lastPdfPage":10},
{"id":"annexI-2022-155","code":"8437.90.00","label":"- Partes de máquinas para limpeza, selecção ou peneiração de grãos ou de produtos hortícolas secos; máquinas e aparelhos para a indústria de moagem ou tratamento de cereais ou de produtos hortícolas secos, excepto dos tipos utilizados em fazendas","pdfPage":10,"lastPdfPage":10},
{"id":"annexI-2022-156","code":"8438.30.00","label":"Máquinas e aparelhos não especificados nem compreendidos noutras posições do presente capítulo… - Máquinas e aparelhos para indústria do açúcar","pdfPage":10,"lastPdfPage":10},
{"id":"annexI-2022-157","code":"8438.60.00","label":"- Máquinas e aparelhos para preparação de frutas ou de produtos hortícolas","pdfPage":10,"lastPdfPage":10},
{"id":"annexI-2022-158","code":"8501.61.00","label":"-Geradores de corrente alternada (alternadores) -De potência não superior a 75 KVA","pdfPage":10,"lastPdfPage":10},
{"id":"annexI-2022-159","code":"8502.11.00","label":"- Grupos electrogéneos de motor de pistão de ignição por compressão (motores diesel ou semi-diesel) -De potência não superior a 75 KVA","pdfPage":10,"lastPdfPage":10},
{"id":"annexI-2022-160","code":"8502.20.00","label":"- Grupos electrogéneos de motor de pistão de ignição por faísca (motor de explosão)","pdfPage":10,"lastPdfPage":10},
{"id":"annexI-2022-161","code":"8701.10.00","label":"- Tractores de um eixo","pdfPage":10,"lastPdfPage":10},
{"id":"annexI-2022-162","code":"8701.20.00","label":"- Tractores rodoviários para semi-reboques","pdfPage":10,"lastPdfPage":10},
{"id":"annexI-2022-163","code":"8701.30.00","label":"- Tractores de lagartas","pdfPage":10,"lastPdfPage":10},
{"id":"annexI-2022-164","code":"8701.91.00","label":"Nã superior a 18KW","pdfPage":10,"lastPdfPage":10,"context":"Outros tractores"},
{"id":"annexI-2022-165","code":"8701.92.00","label":"Superior a 18KW, mas não superior a 37KW","pdfPage":10,"lastPdfPage":10,"context":"Outros tractores"},
{"id":"annexI-2022-166","code":"8701.93.00","label":"Superior a 37KW, mas não superior a 75KW","pdfPage":10,"lastPdfPage":10,"context":"Outros tractores"},
{"id":"annexI-2022-167","code":"8701.94.00","label":"Superior a 75KW, mas não superior a 130KW","pdfPage":10,"lastPdfPage":10,"context":"Outros tractores"},
{"id":"annexI-2022-168","code":"8701.95.00","label":"Superior a 130KW","pdfPage":11,"lastPdfPage":11,"context":"Outros tractores"},
{"id":"annexI-2022-169","code":"8704.21.90","label":"- Outros veículos automóveis para transporte de mercadorias, com motor de pistão de ignição por compressão (diesel ou semi-diesel), de peso bruto não superior a 5 toneladas","pdfPage":11,"lastPdfPage":11},
{"id":"annexI-2022-170","code":"8716.80.00","label":"- Outros veículos não auto propulsionados (carroças de tracção animal)","pdfPage":11,"lastPdfPage":11},
{"id":"annexI-2022-171","code":"9507.20.00","label":"- Anzóis, mesmo montados em terminais (sedelas)","pdfPage":11,"lastPdfPage":11},
{"id":"annexI-2022-172","code":"9507.90.00","label":"- Outros artigos para a pesca à linha","pdfPage":11,"lastPdfPage":11}
];
export function annexIEntry(id:unknown):AnnexIEntry|undefined {return typeof id==='string'?annexIEntries.find(entry=>entry.id===id):undefined;}
export function annexIReference(entry:AnnexIEntry):string {return `AnexoI/2022: ${entry.id}; código ${entry.code}; ${entry.context?entry.context+' — ':''}${entry.label}; PDF${entry.pdfPage}${entry.lastPdfPage===entry.pdfPage?'':`–${entry.lastPdfPage}`}; ${annexIVersion}`;}
+15 -2
View File
@@ -1,6 +1,7 @@
import { acquisitionScope, readAcquisitionStore } from './iva-acquisitions.ts';
import { fundraisingError, type FundraisingContext } from './iva-fundraising.ts';
import { pharmaAnnexEntry, pharmaAnnexReference, pharmaAnnexSource, pharmaAnnexVersion } from './iva-pharma-annex.ts';
import { annexIEntry, annexIReference, annexISource, annexIVersion } from './iva-annex-i.ts';
import { productionOptionCheck, productionOptionVersion, type ProductionTaxOption } from './iva-production-option.ts';
import { monthlySalesFromDraft, readMonthlyIvaSettings } from './monthly-iva.ts';
import { addFractions, decimalFraction, fraction, fractionLabel, fractionPresentation, type FiscalFraction } from './fiscal-rational.ts';
@@ -56,6 +57,7 @@ const listedGoodsTreatments:OperationTreatment[] = [
['insecticides','Insecticidas','Bem transmitido identificado como insecticida; não qualquer produto químico'],
].map(([id,label,condition])=>({id:`listed_${id}`,label:`Lista legal — ${label}`,field:'05',rate:0,article:'CIVA arts.9(10),19(1)(b)(v), redacção Lei22/2022',source:'Lei22/2022 art.1, PDF2, p.2252(26),9(10); CIVA republicado Lei13/2016, PDF15, p.1426(273),19(1)(b)(v). Âmbito técnico2026/MZN',conditions:[internalOperation,'Transmissão do próprio bem enumerado, identificado; não um serviço autónomo nem extensão por sector, marca ou destino',condition]}));
export const operationTreatments:OperationTreatment[] = [
{id:'annexI_goods',label:'Equipamento, sementes e outros bens do Anexo I — artigo9(12)(h)',field:'07',rate:0,logicVersion:annexIVersion,article:'CIVA arts.9(12)(h),19(1); Lei22/2022 art.3(1)',source:`CIVA republicado Lei13/2016, PDF10, p.1426(268),9(12)(h), e PDF15, p.1426(273),19(1); rectificação BR89/2017, PDF1, p.569; ${annexISource}. Âmbito técnico2026/MZN`,conditions:[internalOperation,'O bem transmitido corresponde ao código e à designação da posição escolhida no Anexo I; não basta a actividade agrícola, a marca ou uma indicação genérica de equipamento','Qualificadores expressos na posição conferidos e fundamentados, incluindo natureza, destino, certificação, peso, capacidade ou potência quando exigidos nessa linha; não acrescentar condições a linhas que não as exigem']},
{id:'pharma_manufacturing_inputs',label:'Bens do Anexo III para fabrico de medicamentos — estabelecimento integrado no SNS',field:'07',rate:0,logicVersion:pharmaAnnexVersion,article:'CIVA arts.9(1)(g),19(1); Lei22/2022 art.3(1)',source:`CIVA republicado Lei13/2016, PDF9, p.1426(267),9(1)(g), e PDF15, p.1426(273),19(1); rectificação BR89/2017, PDF1, p.569; ${pharmaAnnexSource}. Âmbito técnico2026/MZN`,conditions:[internalOperation,'Transmissão efectuada pelo próprio estabelecimento público ou privado identificado, integrado no Serviço Nacional de Saúde; não basta que o adquirente ou destino seja um hospital','Bens a utilizar como matérias-primas, produtos intermédios ou componentes para o fabrico de medicamentos, com utilização/fundamento identificados; não mera venda de produto acabado ou utilização genérica','Bem corresponde cumulativamente ao código e à designação da linha seleccionada no Anexo III; confirmar as especificações aplicáveis sem corrigir ou completar a pauta por suposição']},
...([false,true] as const).map(nonprofit=>({...socialTreatment(`fundraising_${nonprofit?'nonprofit':'public'}`,`Angariação ocasional de fundos — ${nonprofit?'organismo sem finalidade lucrativa':'entidade pública'}`,'h',['Actividade habitual isenta identificada:9(1)(a),9(2)(a/b/c/d/e/g) ou9(3)(a/b), com condições dessa isenção e fundamento identificados','Manifestação ocasional destinada à angariação de fundos em proveito exclusivo da entidade organizadora','Total anual declarado inclui esta manifestação e as realizadas fora deste dossier; não superior a oito no ano'],nonprofit),logicVersion:'fundraising/1',source:'CIVA republicado Lei13/2016, PDF10, p.1426(268),9(2)(h); PDF15, p.1426(273),19(1); Lei22/2022 art.1, PDF1, p.2252(25),9(1–3), e PDF2, p.2252(26),10(1–2). Âmbito técnico2026/MZN'})),
...(['agriculture','forestry','livestock','fishing'] as const).flatMap((kind,index)=>{
@@ -112,12 +114,17 @@ export const operationTreatments:OperationTreatment[] = [
{id:'foreign_operation',label:'Operação no estrangeiro — analisar territorialidade',field:null,rate:null,article:'CIVA art.6: localização por natureza da operação; art.19(1)(b)(ii) não determina sozinho a caixa06 do formulário',source:source2016,conditions:[]},
{id:'other',label:'Outra operação / enquadramento ainda desconhecido',field:null,rate:null,article:'Fundamento específico ainda necessário; não presumir taxa ou isenção',source:'Sem fonte operacional determinada para esta linha',conditions:[]},
];
export type SalesOperation = {id:string;period:string;description:string;establishment:string;amount:string;basis:''|'net'|'included';treatment:string;confirmed:number[];evidence:string;sourceAmount:string|null;sourcePeriod:string;sourceCurrency:string;source:string;taxOption?:ProductionTaxOption;fundraiser?:FundraisingContext;pharmaAnnexItem?:string; splitSource?:{id:string;amount:string|null;period:string;currency:string;basis:string}};
export type SalesOperation = {id:string;period:string;description:string;establishment:string;amount:string;basis:''|'net'|'included';treatment:string;confirmed:number[];evidence:string;sourceAmount:string|null;sourcePeriod:string;sourceCurrency:string;source:string;taxOption?:ProductionTaxOption;fundraiser?:FundraisingContext;pharmaAnnexItem?:string;annexIItem?:string;annexIOnly?:boolean; splitSource?:{id:string;amount:string|null;period:string;currency:string;basis:string}};
export type SalesBook = {currency:string;rows:SalesOperation[];periods:Array<{period:string;complete:boolean}>; result?:SalesResult; history?:SalesResult[]};
export type SalesLineResult = {id:string;field:string|null;net:string|null;vat:string|null;gross:string|null;rate:number|null;status:'calculated'|'exempt'|'indeterminate';reason:string;article:string;source:string;exact?:{net:FiscalFraction;vat:FiscalFraction;gross:FiscalFraction}};
export type SalesResult = {version:string;revision:number;calculatedAt:string;opportunity:string;location:string;currency:string;key:string;inputs:SalesOperation[];rows:SalesLineResult[];periods:Array<{period:string;fields:Record<string,string|null>;exactFields?:Record<string,FiscalFraction|null>;reasons:string[]}>;rounding:string};
type Store = ReturnType<typeof readAcquisitionStore> & {salesOperations?:Record<string,SalesBook>};
export function newSalesOperation(id:string,period:string,currency:string):SalesOperation {return {id,period,description:'',establishment:'',amount:'',basis:'',treatment:'other',confirmed:[],evidence:'',sourceAmount:null,sourcePeriod:period,sourceCurrency:currency,source:'Introdução directa; projecção, não declaração submetida'};}
export function continueAnnexIOperation(row:SalesOperation,targetId:string):SalesOperation {
const entry=annexIEntry(row.annexIItem),target=operationTreatments.find(t=>t.id===targetId);
if(row.treatment!=='annexI_goods'||!entry?.relatedTreatments?.includes(targetId)||!target)throw new Error('O tratamento de continuidade não corresponde à posição escolhida; dados conservados.');
return {...row,treatment:targetId,confirmed:[],annexIOnly:false,source:`${row.source}; continuidade expressamente escolhida a partir de ${annexIReference(entry)} para ${target.label}; rever condições do tratamento, sem alterar montante/moeda/contexto`};
}
export function salesBook(draft:Record<string,unknown>):SalesBook {
const store=readAcquisitionStore(draft.modelo_a_snapshot) as Store;
if(store.salesOperations!==undefined&&(!store.salesOperations||typeof store.salesOperations!=='object'||Array.isArray(store.salesOperations)))throw new Error('Formato das operações IVA não recuperável; dados preservados, sem substituição.');
@@ -152,7 +159,8 @@ function sum(values:Array<string|null>):string|null {const parsed=values.map(amo
export function evaluateSalesOperation(row:SalesOperation,currency:string):SalesLineResult {
const rule=operationTreatments.find(r=>r.id===row.treatment),n=amount(row.amount);
const annex=row.treatment==='pharma_manufacturing_inputs'?pharmaAnnexEntry(row.pharmaAnnexItem):undefined;
const result:SalesLineResult={id:row.id,field:rule?.field??null,net:null,vat:null,gross:null,rate:rule?.rate??null,status:'indeterminate',reason:'',article:rule?.article??'Tratamento desconhecido',source:(rule?.source??'Fonte em falta')+(annex?`; ${pharmaAnnexReference(annex)}`:'')};
const annexI=row.treatment==='annexI_goods'?annexIEntry(row.annexIItem):undefined;
const result:SalesLineResult={id:row.id,field:rule?.field??null,net:null,vat:null,gross:null,rate:rule?.rate??null,status:'indeterminate',reason:'',article:rule?.article??'Tratamento desconhecido',source:(rule?.source??'Fonte em falta')+(annex?`; ${pharmaAnnexReference(annex)}`:'')+(annexI?`; ${annexIReference(annexI)}`:'')};
const stop=(reason:string)=>({...result,reason});
if(currency!=='MZN'||row.sourceCurrency!==currency)return stop('Moeda fora de MZN ou divergente da origem; sem conversão silenciosa.');
if(!/^2026-(0[1-9]|1[0-2])$/.test(row.period))return stop('Período fora da cobertura de2026; sem cálculo histórico presumido.');
@@ -162,6 +170,11 @@ export function evaluateSalesOperation(row:SalesOperation,currency:string):Sales
if(rule.conditions.some((_,i)=>!row.confirmed.includes(i))||!row.evidence.trim())return stop('Condições da operação ou fundamento/pressuposto em falta; o sector não prova o tratamento fiscal.');
if(row.sourceAmount!==null&&amount(row.sourceAmount)!==n)return stop('Divergência com o valor reutilizado: conserve a origem e prepare a repartição explicitamente; não substituir silenciosamente.');
if(row.treatment==='pharma_manufacturing_inputs'&&!annex)return stop('Escolha a linha aplicável do Anexo III/2022, com código e designação; um código livre, desconhecido ou de outro anexo não comprova a isenção.');
if(row.treatment==='annexI_goods'){
if(!annexI)return stop('Escolha a posição aplicável do Anexo I/2022, com código, designação e qualificadores; não presumir isenção por sector ou código livre.');
if(annexI.relatedRequired)return stop('Esta designação tem tratamento específico já disponível no artigo9(10), com direito à dedução nas condições do19(1)(b)(v). Escolha a continuidade indicada e confirme as suas condições; não atribuir07 apenas pela presença no Anexo I.');
if(annexI.relatedTreatments?.length&&row.annexIOnly!==true)return stop('A natureza ou o destino deste bem pode corresponder a outro tratamento já disponível. Escolha a continuidade aplicável ou fundamente expressamente por que a operação pertence apenas a9(12)(h); desconhecido não significa ausência desse enquadramento.');
}
if(row.treatment==='fundraising_public'||row.treatment==='fundraising_nonprofit'){const error=fundraisingError(row.fundraiser,row.treatment==='fundraising_nonprofit');if(error)return stop(error);}
const option=row.treatment.startsWith('production_')&&row.treatment.endsWith('_opted')?productionOptionCheck(row.taxOption,row.period):{};
if(option.error)return stop(option.error);
+44
View File
@@ -0,0 +1,44 @@
<?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 IvaAnnexIDraftTest extends TestCase
{
use DatabaseTransactions;
public function test_annex_i_and_explicit_continuations_recover_in_their_selected_opportunity(): 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()]));
$draft = json_decode(file_get_contents(getenv('IVA_G2L_INPUT') ?: base_path('outputs/iva-l1-g2-agro-annex-20261024/calculated.json')), true, flags: JSON_THROW_ON_ERROR);
$id = $this->postJson('/api/v1/simulation-drafts', ['personal_snapshot' => [], 'economic_snapshot' => $draft], ['Idempotency-Key' => (string) Str::uuid()])->assertCreated()->json('data.id');
$recovered = $this->getJson('/api/v1/simulation-drafts/'.$id)->assertOk()->json('data.economic_snapshot');
$this->assertSame($draft['modelo_a_snapshot'], $recovered['modelo_a_snapshot']);
$store = json_decode($recovered['modelo_a_snapshot'], true);
$book = $store['salesOperations']['opportunity:321'];
$this->assertSame('opportunity:321', $book['result']['opportunity']);
$this->assertSame('MZN', $book['result']['currency']);
$this->assertSame('2026-09', $book['result']['periods'][0]['period']);
$this->assertCount(10, $book['result']['rows']);
$this->assertSame('800.00', $book['result']['periods'][0]['fields']['07']);
$this->assertSame('200.00', $book['result']['periods'][0]['fields']['05']);
$this->assertSame('listed_fresh_chilled_tomato', $book['rows'][6]['treatment']);
$this->assertSame('listed_insecticides', $book['rows'][7]['treatment']);
$this->assertStringContainsString('annexI-2022-023', $book['rows'][6]['source']);
$this->assertStringContainsString('PDF8–9', $book['result']['rows'][5]['source']);
$this->assertStringContainsString('Outros tractores', $book['result']['rows'][4]['source']);
$this->assertTrue($book['rows'][8]['annexIOnly']);
$original = json_decode(file_get_contents(base_path('tests/frontend/fixtures/iva-pharma-inputs.json')), true, flags: JSON_THROW_ON_ERROR);
foreach (json_decode($original['modelo_a_snapshot'], true)['salesOperations'] as $key => $value) {
$this->assertSame($value, $store['salesOperations'][$key]);
}
if (getenv('IVA_G2L_RECOVERED')) file_put_contents(getenv('IVA_G2L_RECOVERED'), json_encode($recovered, JSON_THROW_ON_ERROR | JSON_UNESCAPED_UNICODE));
}
}
File diff suppressed because one or more lines are too long
+67
View File
@@ -0,0 +1,67 @@
import assert from 'node:assert/strict';
import test from 'node:test';
import fs from 'node:fs';
import {annexIEntries,annexIEntry,annexIVersion} from '../../resources/js/lib/iva-annex-i.ts';
import {operationTreatments,newSalesOperation,evaluateSalesOperation,continueAnnexIOperation,recordSales,saveSalesBook,salesBook,salesCurrent} from '../../resources/js/lib/iva-operations.ts';
import {createProjectDossierReport} from '../../resources/js/lib/project-dossier-report.ts';
const rule=operationTreatments.find(t=>t.id==='annexI_goods');
const seed=()=>JSON.parse(fs.readFileSync(new URL('./fixtures/iva-pharma-inputs.json',import.meta.url),'utf8'));
const operation=(entry,i=0)=>({...newSalesOperation(`g2l-${i}`,'2026-09','MZN'),description:`SYNTHETIC QA ${entry.code} ${entry.id}`,establishment:'SYNTHETIC QA estabelecimento Manica',amount:'100',basis:i%2?'included':'net',treatment:rule.id,annexIItem:entry.id,confirmed:rule.conditions.map((_,n)=>n),evidence:'SYNTHETIC QA: correspondência código/designação e qualificadores da posição expressamente pressupostos; não é classificação aduaneira ou certificação'});
function fixture(){const draft=seed();draft.context_opportunity='opportunity:321';draft.project_title='SYNTHETIC QA — G2L Anexo I';
const codes=['0306.36.10','3102.10.00','1007.10.00','8501.61.00','8701.95.00','8201.50.00','0702.00.00','3808.91.00','1101.00.00','0402.21.10'];
const rows=codes.map((code,i)=>{
const entry=annexIEntries.find(e=>e.code===code);let row=operation(entry,i);
if(entry.relatedRequired){row=continueAnnexIOperation(row,entry.relatedTreatments[0]);row.confirmed=operationTreatments.find(t=>t.id===row.treatment).conditions.map((_,n)=>n);}
else if(entry.relatedTreatments){row.annexIOnly=true;row.evidence+=code==='1101.00.00'?'; mistura de trigo com centeio, não farinha de trigo simples':'; leite para utilização industrial, sem destino a lactente até um ano';}
return row;
});
const book=recordSales(draft,{currency:'MZN',rows,periods:[{period:'2026-09',complete:true}]});draft.modelo_a_snapshot=saveSalesBook(draft,book);return {draft,book};}
test('AnexoI has 172 distinct documentary positions, own qualifiers, cross-page text and five contextual tractor entries',()=>{
assert.equal(annexIEntries.length,172);assert.equal(new Set(annexIEntries.map(e=>e.code)).size,172);assert.equal(new Set(annexIEntries.map(e=>e.id)).size,172);
const scissors=annexIEntries.find(e=>e.code==='8201.50.00');assert.equal(scissors.pdfPage,8);assert.equal(scissors.lastPdfPage,9);assert.match(scissors.label,/uma das mãos/);
assert.equal(annexIEntries.filter(e=>e.context==='Outros tractores').length,5);
assert.equal(annexIEntries.find(e=>e.code==='8701.30.00').label.includes('Outros tractores'),false);
for(const [i,entry] of annexIEntries.entries()){
const row={...operation(entry,i),annexIOnly:true},r=evaluateSalesOperation(row,'MZN');
assert.equal(r.vat,entry.relatedRequired?null:'0.00');if(!entry.relatedRequired){assert.equal(r.field,'07');assert.equal(r.gross,'100.00');}
for(const token of [entry.id,entry.code,entry.label,`PDF${entry.pdfPage}`,annexIVersion])assert.ok(r.source.includes(token),token);
}
});
test('P035 requires actual position and qualifiers; overlapping descriptions require explicit applicability, never silently field07',()=>{
const {draft,book}=fixture(),row=book.rows[0];
for(const missing of row.confirmed)assert.equal(evaluateSalesOperation({...row,confirmed:row.confirmed.filter(n=>n!==missing)},'MZN').vat,null);
for(const patch of [{annexIItem:undefined},{annexIItem:''},{annexIItem:'0306.36.10'},{annexIItem:'annexIII-2022-001'},{evidence:''},{establishment:''},{amount:''},{period:'2025-09'},{sourceCurrency:'USD'}])assert.equal(evaluateSalesOperation({...row,...patch},'MZN').vat,null);
assert.equal(evaluateSalesOperation(row,'USD').vat,null);
const overlaps=annexIEntries.filter(e=>e.relatedTreatments);assert.equal(overlaps.length,13);assert.equal(overlaps.filter(e=>e.relatedRequired).length,3);
for(const entry of overlaps){const pending=operation(entry);assert.equal(evaluateSalesOperation(pending,'MZN').vat,null);assert.equal(evaluateSalesOperation({...pending,annexIOnly:true},'MZN').vat,entry.relatedRequired?null:'0.00');}
const incomplete=recordSales(draft,{...book,rows:[{...row,annexIItem:''}]});assert.equal(incomplete.result.periods[0].fields['07'],null);assert.deepEqual(incomplete.history.at(-1),book.result);
});
test('explicit continuation reuses existing treatment identity, preserves money/origin/annex and requires new conditions',()=>{
for(const entry of annexIEntries.filter(e=>e.relatedTreatments)){
for(const target of entry.relatedTreatments){
const before=operation(entry),after=continueAnnexIOperation(before,target),targetRule=operationTreatments.find(t=>t.id===target);
assert.equal(after.treatment,target);assert.equal(after.annexIItem,entry.id);assert.deepEqual(after.confirmed,[]);assert.ok(after.source.startsWith(before.source));assert.ok(after.source.includes(entry.id));
for(const key of ['id','period','amount','basis','sourceCurrency','sourcePeriod','establishment','description','evidence'])assert.equal(after[key],before[key],key);
assert.equal(evaluateSalesOperation(after,'MZN').vat,null);
const r=evaluateSalesOperation({...after,confirmed:targetRule.conditions.map((_,n)=>n)},'MZN');assert.equal(r.field,'05');assert.equal(r.vat,'0.00');
}
}
assert.throws(()=>continueAnnexIOperation(operation(annexIEntries[0]),'general'));
const e=annexIEntries.find(v=>v.code==='0702.00.00');assert.throws(()=>continueAnnexIOperation({...operation(e),treatment:'listed_fresh_chilled_tomato'},'listed_fresh_chilled_tomato'));
});
test('G2L recovery/report preserve twelve current books including G2K and calendar, without recalculation',()=>{
const {draft,book}=fixture(),original=seed(),old=JSON.parse(original.modelo_a_snapshot).salesOperations;
const recovered=JSON.parse(JSON.stringify(draft)),store=JSON.parse(recovered.modelo_a_snapshot).salesOperations;
assert.equal(Object.keys(old).length,12);for(const [id,value] of Object.entries(old)){assert.deepEqual(store[id],value);assert.equal(salesCurrent({...recovered,context_opportunity:id},value),true,id);}
assert.equal(salesCurrent(recovered,salesBook(recovered)),true);assert.equal(book.result.periods[0].fields['07'],'800.00');assert.equal(book.result.periods[0].fields['05'],'200.00');
const report=JSON.stringify(createProjectDossierReport(recovered,{selectedSections:new Set(['finance'])}));
for(const token of ['800.00','200.00','opportunity:321','Manica','2026-09','MZN','AnexoI/2022','Outros tractores',annexIVersion,...book.rows.map(r=>r.annexIItem)])assert.ok(report.includes(token),token);
for(const token of ['pharma_manufacturing_inputs','fundraising_public','production_forestry_opted'])assert.equal(report.includes(token),false);
const changed={...book,rows:book.rows.map((r,i)=>i===8?{...r,annexIOnly:false}:r)};assert.equal(salesCurrent(draft,changed),false);assert.deepEqual(changed.result,book.result);
assert.deepEqual(recovered.selection_labels,original.selection_labels);assert.equal(recovered.currency,original.currency);
});
if(process.env.IVA_G2L_OUT)fs.writeFileSync(process.env.IVA_G2L_OUT,JSON.stringify(fixture().draft,null,2));