diff --git a/.github/workflows/nt009-evidence.yml b/.github/workflows/nt009-evidence.yml index 8b06052..68cb46c 100644 --- a/.github/workflows/nt009-evidence.yml +++ b/.github/workflows/nt009-evidence.yml @@ -35,9 +35,23 @@ jobs: run: | php tools/bin/domains.php audit \ --download-dir="${{ runner.temp }}/nt009" \ - --report="${{ runner.temp }}/nt009-comparison.json" + --report="${{ runner.temp }}/nt009-comparison.json" \ + --print-layout=yes - name: Verify versioned Annex VII against all published XLSX rows run: php tools/bin/domains.php verify-indicators --annex-vii="${{ runner.temp }}/nt009/annex-vii-nt009.xlsx" + - name: Reproduce official DPS matrix from checksum-pinned XLSX + run: | + php tools/bin/domains.php download \ + --ids=annex-i-production \ + --output="${{ runner.temp }}/nt009" + php tools/bin/domains.php contract-matrix \ + --legacy-annex="${{ runner.temp }}/nt009/annex-i-production.xlsx" \ + --annex-vi="${{ runner.temp }}/nt009/annex-vi-nt009.xlsx" \ + --output="${{ runner.temp }}/nt009-dps-matrix.tsv" + diff -u resources/contracts/nt009-dps-v1.04.01-matrix.tsv \ + "${{ runner.temp }}/nt009-dps-matrix.tsv" + - name: Compare checksum-pinned official XSD packages by file content + run: php tools/bin/domains.php schema-packages --report="${{ runner.temp }}/nt009-xsd-packages.json" - name: Retain full evidence for manual review if: always() uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4.6.2 @@ -45,6 +59,8 @@ jobs: name: nt009-official-source-evidence path: | ${{ runner.temp }}/nt009-comparison.json + ${{ runner.temp }}/nt009-dps-matrix.tsv + ${{ runner.temp }}/nt009-xsd-packages.json ${{ runner.temp }}/nt009/*.xlsx if-no-files-found: warn retention-days: 30 diff --git a/REUSE.toml b/REUSE.toml index ff00ea9..699e971 100644 --- a/REUSE.toml +++ b/REUSE.toml @@ -32,7 +32,8 @@ SPDX-License-Identifier = "CC-BY-ND-3.0" [[annotations]] path = [ - "resources/domains/*.tsv" + "resources/domains/*.tsv", + "resources/contracts/*.tsv" ] precedence = "override" SPDX-FileCopyrightText = "Sistema Nacional NFS-e / Governo Federal" diff --git a/composer.json b/composer.json index 96440ef..8c1369c 100644 --- a/composer.json +++ b/composer.json @@ -70,7 +70,8 @@ "domains:test": "@composer --working-dir=vendor-bin/domains run test", "ci:php": "@php tools/bin/ci-php.php validate", "domains:download": "@php tools/bin/domains.php download", - "domains:verify-indicators": "@php tools/bin/domains.php verify-indicators" + "domains:verify-indicators": "@php tools/bin/domains.php verify-indicators", + "domains:contract-matrix": "@php tools/bin/domains.php contract-matrix" }, "minimum-stability": "stable", "prefer-stable": true, diff --git a/docs/NT009-CONTRACT-IMPLEMENTATION.md b/docs/NT009-CONTRACT-IMPLEMENTATION.md new file mode 100644 index 0000000..120a701 --- /dev/null +++ b/docs/NT009-CONTRACT-IMPLEMENTATION.md @@ -0,0 +1,219 @@ + + +# NT009 v1.01 — DPS contract matrix and activation boundary + +## Original normative sources + +The authoritative field matrix is committed at +`resources/contracts/nt009-dps-v1.04.01-matrix.tsv`. The **450 data rows** +come from two **checksum-pinned** official XLSX sources and record, for every +path, type, size, cardinality, original field description, conditional guidance +and source row in both contracts. An element moved to a different parent appears +as one added and one removed XML path; it is not necessarily eliminated. + +| XLSX | Source and environment | Observed SHA-256 | +| --- | --- | --- | +| Anexo I v1.01, 2026-02-09 | Production | `de5bc492959eadc8bfa7540e16939995924f2188f743648eaf84d3b31e9eeb7c` | +| Anexo VI v1.04.01 | RTC published; deployment not proven | `103a150dd6f56ec8edcaa3a453b59a1b0e096d7cd5025d7bd06a387f141ddf39` | +| Anexo VII v1.03.00 | RTC published; deployment not proven | `95f30a44ee94adeea57fb92f3a0337b1e62fdc106f393e73894087889be9e5aa` | + +Hashes are local observations, **not** government-issued signatures. The +comparison found **168 unchanged, 38 changed in place, 135 added, and 109 +removed or moved** XML paths, not 282 distinct new fiscal requirements. + +## Representative directly verified changes + +| XML path (under `DPS/infDPS/`) | Production Anexo I | NT009 Anexo VI | +| --- | --- | --- | +| `finNFSe` | `IBSCBS/finNFSe`, 1-1 | Direct child, 1-1, 0/1/2 | +| `tpNFSeDebito`, `tpNFSeCredito` | Absent | Direct children, 0-1; conditionally required for `finNFSe` 2 and 1 | +| `indDest` / `dest` | Children of IBSCBS | Direct `infDPS` children | +| `IBSCBS/cIndOp` | 1-1 | 0-1; classification-dependent | +| `IBSCBS/valores/trib/CST` | Under `gIBSCBS` | Direct `trib` child, 1-1 when `trib` exists | +| `IBSCBS/valores/trib/cClassTrib` | Under `gIBSCBS` | Direct `trib` child, 1-1 when `trib` exists | +| `IBSCBS/valores/trib/gIBSCBS` | 1-1 | 0-1, `ind_gIBSCBS`-dependent | +| `IBSCBS/valores/trib/gIBSCBS/gIBSCBSAjuste` | Absent | 0-1, allowed only for specified credit/debit adjustment types | + +The table compares published **technical contracts**, not a fiscal rules +engine. For example, `cIndOp` and `gIBSCBS` depend on external official +tax-classification attributes. Anexo VIII correlations remain advisory-only. + +## Activation and schema verification gate + +The production documentation lists `NFSe-ESQUEMAS_XSD-v1.01-20260209` +(vendored unchanged at `references/schemas/nfse/1.01`). +Restricted production instead lists +`esquemas-nfse-rtc-v1-01-20260727.zip`. They share a numeric schema +version but not necessarily the same content or deployment semantics. + +At review time (2026-10-08), the RTC portal published NT009 v1.01 but no +NT009-specific XSD package or confirmed SEFIN deployment/effective date. +The NT009 text points to a separately published rollout schedule. **Do not +enable or claim production/homologation conformity for the draft NT009 +serialization until the relevant XSD and environment activation are verified.** + +The current `DpsSchemaValidator` continues to accept the vendored production +February package only. The default `XmlBuilder::buildDps` and existing +Akaunting consumer continue using that contract. + +## Reproduce the matrix + +```sh +composer domains:install +composer domains:download -- --ids=annex-i-production,annex-vi-nt009 --output=/tmp/nfse-nt009 +composer domains:contract-matrix -- --legacy-annex=/tmp/nfse-nt009/annex-i-production.xlsx --annex-vi=/tmp/nfse-nt009/annex-vi-nt009.xlsx --output=/tmp/nt009-matrix.tsv +diff -u resources/contracts/nt009-dps-v1.04.01-matrix.tsv /tmp/nt009-matrix.tsv +``` + +CI compares the complete matrix byte-for-byte with fresh downloads of the +checksum-pinned official workbooks. Network failures are reported by an +advisory job and cannot establish that the matrix passed; offline PHPUnit +covers the extraction algorithm independently. + +## Explicit opt-in preview (not an emitter) + +The `XmlBuilder::buildDps(DpsData)` API and `DpsData` constructor remain +unchanged. Legacy callers continue to serialize using the production v1.01 +contract, including their existing IBSCBS behavior. The new entry point +`XmlBuilder::previewNt009Dps(DpsData, Nt009DpsPreviewData)` returns a +`Nt009DpsPreview` object, **not** a string suitable for +`NfseClient::emit()`. + +```php +use LibreCodeCoop\NfsePHP\Dto\Nt009DpsPreviewData; +use LibreCodeCoop\NfsePHP\Xml\XmlBuilder; + +// $existingDps has no legacy ibsCbs* values set. +$draft = (new XmlBuilder())->previewNt009Dps( + $existingDps, + new Nt009DpsPreviewData( + finalidade: 0, + indicadorDestinatario: 0, + codigoIndicadorOperacao: '010101', + cst: '000', + classificacaoTributaria: '000001', + exigeGrupoIbsCbs: true, // from the official ind_gIBSCBS attribute + ), +); +// $draft->xml is for comparison and review ONLY; do not transmit for issuance. +``` + +The preview currently covers the structural placement of `finNFSe`, +`tpNFSeDebito`, `tpNFSeCredito`, `indDest`, `regApIBSCBSSN`, +`IBSCBS/indFinal`, `cIndOp`, `IBSCBS/valores/trib/CST`, +`cClassTrib` and conditional `gIBSCBS`. It also models the +`gIBSCBSAjuste` paths and values for the adjustment types documented by +Annex VI. Both `CST` and `cClassTrib` are required whenever `IBSCBS/valores/trib` +is configured; `cIndOp` and `gIBSCBS` are forbidden if the externally +verified `ind_gIBSCBS` flag is false, and required in the appropriate +conditional form if it is true. + +**The preview deliberately cannot model the complete 450-row new contract.** +In particular the new `vAjusteBC` structure, detailed `dest` group, +`gPgtoVinc`, `imovel`, `bensMoveis`, `condominios` and other conditional +groups are not implemented for production serialization. The builder rejects +mixing legacy IBS fields and the new preview options. It removes the obsolete +`xsi:schemaLocation` reference, without claiming that it matches a new +schema. The existing `DpsSchemaValidator` remains bound to the February +production XSD and rejects this review-only structure. The current +`NfseClient` and its emission path are **not wired to the preview**. + +The SDK intentionally does not calculate IBS/CBS or infer tax classification +from `cClassTrib`. Callers must supply `ind_gIBSCBS` from the authoritative +classification attributes, not consultative Annex VIII. The preview accepts +an externally verified boolean, but that is **not proof of actual fiscal +acceptance** by the SEFIN API. + +## Downstream handoff: LibreCodeCoop/akaunting-nfse + +The consumer's `3rdparty/composer.json` currently pins +`librecodeoop/nfse-php` to +`dev-main#f179d7f723bec80f5b19a25dfbc385a612c2447f`. It uses +`Application/RuntimeDpsFactory.php` to reflect the existing `DpsData` +constructor, maps all present legacy IBS/CBS fields in +`Application/InvoiceDpsBuilder.php`, and calls `NfseClient::emit(DpsData)` +from `Application/IssueInvoiceNfse.php`. + +No constructor parameter, default legacy serializer or emission interface +changed here. Consequently the consumer **requires no immediate update** +to remain on its existing fiscal contract. Adopting NT009 for fiscal emission +requires a separate downstream RTC integration that first verifies official +schema deployment, updates the scoped Composer pin to a reviewed **merged +commit or tagged release**, adds a compatible version-selector or emitter, +and retests the module's emission and recovery flows with the applicable +staging environment. Do not pin this unmerged PR's SHA in the consumer. + +## Outstanding normative gates + +1. Obtain authoritative NT009-compatible XSD packages for each intended + environment, record byte-level hashes and compare against the existing + February production and July restricted-production packages. +2. Verify public activation dates and SEFIN acceptance behavior. Annex VI + publication alone is not activation. +3. Resolve implementation of the complete revised DPS contract, including + its new or moved optional and conditional groups, and verify those cases + against the actual new XSD. +4. Confirm CST/cClassTrib and `ind_gIBSCBS` attributes from authoritative + tax classifications, not Annex VIII consultation. Validate code + applicability to NFS-e before restricting domains. +5. Only after those verifications, implement an approved version-specific + **emitter**, fixtures and end-to-end acceptance tests for the downstream + consumer. Keep the current production emitter as its default until + official applicability is established. + +**Issue #95 must remain open.** Offline tests and a structural preview prove +the library can express part of NT009; they do not establish fiscal conformity. + +## Official XSD ZIP provenance + +Two distinct v1.01 packages have now been independently downloaded and +their archive bytes recorded: + +| Environment | Published archive | Observed SHA-256 | +| --- | --- | --- | +| Production | `nfse-esquemas_xsd-v1-01-20260209.zip` | `e7935cbd9470527c6cc32984c1b2263e614183bf0139ce2733eaaed2de9a8072` | +| Restricted production | `esquemas-nfse-rtc-v1-01-20260727.zip` | `6c7e0510d3ecff4454f291f4e10b742d27a4818f23aab181494f96d0ea79f3dc` | + +The `schema-packages` PHP command downloads only these pinned official +manifest URLs, validates both ZIP hashes and compares the hash of each XSD +by its full relative ZIP path and by basename (allowing repeated basenames +in separate folders). Raw ZIP metadata differences do not establish +semantic differences between equivalent XSD files; the per-file hashes +are the evidence for actual schema-byte differences. Run: + +```sh +composer domains:install +php tools/bin/domains.php schema-packages --report=/tmp/nfse-xsd-comparison.json +``` + +These packages cannot independently prove an NT009 v1.04.01 rollout, which +is a separate contractual/effective-date gate. + +## Cross-publication discrepancies requiring official confirmation + +The live, checksum-pinned XSD ZIP comparison on 2026-10-08 (Brazil local +date) reports **10 like-named XSDs with different contents** and **7 XSD +basenames found only in the production archive**. This compares extracted XSD +file bytes, not just ZIP metadata or folder prefixes, so a shared `v1.01` +label is insufficient to select a compatible schema. The exact report is +retained as `nt009-xsd-packages.json` in the NT009 Source Evidence job. +**Neither compared archive establishes the October NT009 v1.04.01 contract +as deployed.** + +There is also a documentary discrepancy concerning `gIBSCBSAjuste`. +The NT009 v1.01 **PDF**, section 2.2 (page 4), shows the adjustment group +directly below `IBSCBS/valores/trib`, while the subsequently published +**Anexo VI v1.04.01** workbook identifies its parent as +`IBSCBS/valores/trib/gIBSCBS` (original layout row 428). The review-only +preview currently follows the later spreadsheet; **it must not be used for +fiscal submission** until an applicable XSD and official validation contract +resolve that disagreement. Do not silently infer a definitive parent path. + +Source PDF: https://www.gov.br/nfse/pt-br/biblioteca/documentacao-tecnica/rtc/nota-tecnica-009-se-cgnfs-e-v-1-01.pdf + +Review status: code and document extraction are verifiable, but the live +production schema/effective-date evidence is **not yet available**. This +blocks a conformant final implementation and closure of issue #95. diff --git a/resources/contracts/nt009-dps-v1.04.01-matrix.tsv b/resources/contracts/nt009-dps-v1.04.01-matrix.tsv new file mode 100644 index 0000000..e57255b --- /dev/null +++ b/resources/contracts/nt009-dps-v1.04.01-matrix.tsv @@ -0,0 +1,453 @@ +# NT009 DPS layout comparison — source: official Anexo I (production) and Anexo VI v1.04.01 +# All conditions are textual evidence; production applicability and fiscal validation are separately gated. +status path old_row new_row old_kind new_kind old_type new_type old_occurrence new_occurrence old_size new_size old_description new_description old_condition new_condition +unchanged NFSe/infNFSe/DPS/infDPS/id 102 110 ID ID C C 1-1 1-1 45 45 O identificador da DPS é composto pela concatenação de campos que constam no leiaute da DPS. A formação deste identificador considera o literal "DPS" associado a outras 42 posições numéricas, conforme descrito abaixo: "DPS" + Cód.Mun. (7) + Tipo de Inscrição Federal (1) + Inscrição Federal (14 - CPF completar com 000 à esquerda) + Série DPS (5) + Núm. DPS (15) O identificador da DPS é composto pela concatenação de campos que constam no leiaute da DPS. A formação deste identificador considera o literal "DPS" associado a outras 42 posições numéricas, conforme descrito abaixo: "DPS" + Cód.Mun. (7) + Tipo de Inscrição Federal (1) + Inscrição Federal (14 - CPF completar com 000 à esquerda) + Série DPS (5) + Núm. DPS (15) Tipo de inscrição Federal = 1 / Inscrição Federal = CPF emitente da DPS; Tipo de inscrição Federal = 2 / Inscrição Federal = CNPJ emitente da DPS; Tipo de inscrição Federal = 1 / Inscrição Federal = CPF emitente da DPS; Tipo de inscrição Federal = 2 / Inscrição Federal = CNPJ emitente da DPS; +unchanged NFSe/infNFSe/DPS/infDPS/tpAmb 103 111 E E N N 1-1 1-1 1 1 Identificação do tipo de ambiente no Sistema Nacional NFS-e: 1 - Produção; 2 - Homologação; Identificação do tipo de ambiente no Sistema Nacional NFS-e: 1 - Produção; 2 - Homologação; - - +unchanged NFSe/infNFSe/DPS/infDPS/dhEmi 104 112 E E D D 1-1 1-1 - - Data e hora da emissão da DPS. Data e hora no formato UTC (Universal Coordinated Time): AAAA-MM-DDThh:mm:ssTZD Data e hora da emissão da DPS. Data e hora no formato UTC (Universal Coordinated Time): AAAA-MM-DDThh:mm:ssTZD - - +unchanged NFSe/infNFSe/DPS/infDPS/verAplic 105 113 E E C C 1-1 1-1 1-20 1-20 Versão do aplicativo que gerou a DPS. Versão do aplicativo que gerou a DPS. - - +changed NFSe/infNFSe/DPS/infDPS/serie 106 114 E E N N 1-1 1-1 1-5 1-5 Série da DPS. Série da DPS. Faixas de utilização da série da DPS: 00001 a 49999 - Emissão com aplicativo pŕoprio; 50000 a 69999 - Emissor Móvel; 70000 a 79999 - Emissor Web; 80000 a 89999 - Emissão com *transcrição manual (Web); *O emitente deve informar o número de série (transcrever o número de série) que foi repassado ao não emitente da NFS-e. Faixas de utilização da série da DPS: 00001 a 49999 - Emissão com aplicativo próprio; 50000 a 69999 - Emissor Móvel; 70000 a 79999 - Emissor Web; 80000 a 89999 - Emissão com *transcrição manual (Web); *O emitente deve informar o número de série (transcrever o número de série) que foi repassado ao não emitente da NFS-e. +unchanged NFSe/infNFSe/DPS/infDPS/nDPS 107 115 E E N N 1-1 1-1 1-15 1-15 Número da DPS. Número da DPS. 1 até 999999999999999 1 até 999999999999999 +unchanged NFSe/infNFSe/DPS/infDPS/dCompet 108 116 E E D D 1-1 1-1 - - Data de competência da prestação do serviço. Ano, Mês e Dia (AAAA-MM-DD) Data de competência da prestação do serviço. Ano, Mês e Dia (AAAA-MM-DD) A data de competência deve ser única e ser a mesma que a data do fato gerador do tributo, ou seja, a data da prestação do serviço. A data de competência deve ser única e ser a mesma que a data do fato gerador do tributo, ou seja, a data da prestação do serviço. +unchanged NFSe/infNFSe/DPS/infDPS/tpEmit 109 117 E E N N 1-1 1-1 1 1 Emitente da DPS: 1 - Prestador; 2 - Tomador; 3 - Intermediário; Emitente da DPS: 1 - Prestador; 2 - Tomador; 3 - Intermediário; - - +unchanged NFSe/infNFSe/DPS/infDPS/cMotivoEmisTI 110 118 E E N N 0-1 0-1 1 1 Motivo da Emissão da DPS pelo Tomador/Intermediário: 1 - Importação de Serviço; 2 - Tomador/Intermediário obrigado a emitir NFS-e por legislação municipal; 3 - Tomador/Intermediário emitindo NFS-e por recusa de emissão pelo prestador; 4 - Tomador/Intermediário emitindo por rejeitar a NFS-e emitida pelo prestador; Motivo da Emissão da DPS pelo Tomador/Intermediário: 1 - Importação de Serviço; 2 - Tomador/Intermediário obrigado a emitir NFS-e por legislação municipal; 3 - Tomador/Intermediário emitindo NFS-e por recusa de emissão pelo prestador; 4 - Tomador/Intermediário emitindo por rejeitar a NFS-e emitida pelo prestador; Se o município de incidência não for o do tomador, o sistema deve rejeitar eventuais retenções. Se o município de incidência não for o do tomador, o sistema deve rejeitar eventuais retenções. +added NFSe/infNFSe/DPS/infDPS/finNFSe 119 E N 1-1 1 Indicador da finalidade da emissão de NFS-e 0 - NFS-e regular 1 - NFS-e de crédito 2 - NFS-e de débito - +added NFSe/infNFSe/DPS/infDPS/tpNFSeDebito 120 E N 0-1 2 Indicador do tipo de NFS-e de Ajuste de Débito (indicado apenas quando finNFSe = 2) 01 - Transferência de créditos para Cooperativas 02 - Anulação de Crédito por Saídas Imunes/Isentas 03 - Débitos de notas fiscais não processadas na apuração 04 - Multa e juros 05 - Transferência de crédito na sucessão 06 - Pagamento Antecipado Campo deve ser informado quando finNFSe = 2 (NFS-e de débito). +added NFSe/infNFSe/DPS/infDPS/tpNFSeCredito 121 E N 0-1 2 Indicador do tipo de NFS-e de Ajuste de Crédito (indicado apenas quando finNFSe = 1) 01 - Multa e juros 05 - Transferência de crédito na sucessão Campo deve ser informado quando finNFSe = 1 (NFS-e de crédito). +unchanged NFSe/infNFSe/DPS/infDPS/chNFSeRej 111 122 E E N N 0-1 0-1 50 50 Chave de Acesso da NFS-e rejeitada pelo Tomador/Intermediário. Chave de Acesso da NFS-e rejeitada pelo Tomador/Intermediário. O tomador deve referenciar neste campo a nota do prestador, utilizando-se da chave da NFS-e emitida pelo prestador e previamente rejeitada pelo tomador, ou seja, o Tomador/Intermediário antes de emitir sua NFS-e pelo motivo 4 do campo cMotivoEmisTI deverá emitir um Evento de Manifestação de NFS-e de rejeição para a NFS-e emitida pelo prestador, cuja chave de acesso será informada neste campo chNFSeRej. O tomador deve referenciar neste campo a nota do prestador, utilizando-se da chave da NFS-e emitida pelo prestador e previamente rejeitada pelo tomador, ou seja, o Tomador/Intermediário antes de emitir sua NFS-e pelo motivo 4 do campo cMotivoEmisTI deverá emitir um Evento de Manifestação de NFS-e de rejeição para a NFS-e emitida pelo prestador, cuja chave de acesso será informada neste campo chNFSeRej. +changed NFSe/infNFSe/DPS/infDPS/cLocEmi 112 123 E E N N 1-1 1-1 7 7 Código de 7 dígitos da localidade emissora da NFS-e. Código de 7 dígitos da localidade emissora da NFS-e. O campo cLocEmi (Código da Localidade de Emissão da DPS) sempre corresponderá a um município brasileiro e identificado pela tabela de códigos de municípios do IBGE ou um trecho de concessão de exploração de rodovia para a qual a NFS-e foi emiitida. O município emissor da NFS-e é aquele município em que o emitente da DPS está cadastrado e autorizado a "emitir uma NFS-e", ou seja, emitir uma DPS para que o sistema nacional valide as informações nela prestadas e gere a NFS-e correspondente para o emitente. Para que o sistema nacional emita a NFS-e o município emissor deve ser conveniado e estar ativo no sistema nacional. Além disso o convênio do município deve permitir que os contribuintes do município utilize os emissores públicos do Sistema Nacional NFS-e. O campo cLocEmi (Código da Localidade de Emissão da DPS) sempre corresponderá a um município brasileiro e identificado pela tabela de códigos de municípios do IBGE ou um trecho de concessão de exploração de rodovia para a qual a NFS-e foi emitida. O município emissor da NFS-e é aquele município em que o emitente da DPS está cadastrado e autorizado a "emitir uma NFS-e", ou seja, emitir uma DPS para que o sistema nacional valide as informações nela prestadas e gere a NFS-e correspondente para o emitente. Para que o sistema nacional emita a NFS-e o município emissor deve ser conveniado e estar ativo no sistema nacional. Além disso o convênio do município deve permitir que os contribuintes do município utilize os emissores públicos do Sistema Nacional NFS-e. +unchanged NFSe/infNFSe/DPS/infDPS/subst 113 124 G G - - 0-1 0-1 - - Grupo de informações relativas à NFS-e a ser substituída Grupo de informações relativas à NFS-e a ser substituída - - +changed NFSe/infNFSe/DPS/infDPS/subst/chSubstda 114 125 E E C C 1-1 1-1 50 50 Chave de Acesso da NFS-e a ser substituída. Chave de Acesso da NFS-e a ser substituída. O município conveniado ao Sistema Nacional NFS-e deverá parametrizar o prazo máximo permitido para que o emitente da NFS-e possa substituir uma NFS-e que o município tenha gerado. Prazo máximo parametrizável é 2 anos. O município conveniado ao Sistema Nacional NFS-e deverá parametrizar se impede ou não a substituição de nota caso a nota Substuída não tenha as informações do NI do tomador Um evento de bloqueio de ofício para qualquer outro tipo de evento é considerado vigente se não há um correspondente evento de desbloqueio de ofício que contemple o tipo de evento bloqueado. O município conveniado ao Sistema Nacional NFS-e deverá parametrizar o prazo máximo permitido para que o emitente da NFS-e possa substituir uma NFS-e que o município tenha gerado. Prazo máximo parametrizável é 2 anos. O município conveniado ao Sistema Nacional NFS-e deverá parametrizar se impede ou não a substituição de nota caso a nota Substituída não tenha as informações do NI do tomador Um evento de bloqueio de ofício para qualquer outro tipo de evento é considerado vigente se não há um correspondente evento de desbloqueio de ofício que contemple o tipo de evento bloqueado. +changed NFSe/infNFSe/DPS/infDPS/subst/cMotivo 115 126 E E N N 1-1 1-1 1 2 Código de justificativa para substituição de NFS-e: 1 - Desenquadramento de NFS-e do Simples Nacional; 2 - Enquadramento de NFS-e no Simples Nacional; 3 - Inclusão Retroativa de Imunidade/Isenção para NFS-e; 4 - Exclusão Retroativa de Imunidade/Isenção para NFS-e; 5 - Rejeição de NFS-e pelo tomador ou pelo intermediário se responsável pelo recolhimento do tributo; 99 - Outros; Código de justificativa para substituição de NFS-e: 01 - Desenquadramento de NFS-e do Simples Nacional; 02 - Enquadramento de NFS-e no Simples Nacional; 03 - Inclusão Retroativa de Imunidade/Isenção para NFS-e; 04 - Exclusão Retroativa de Imunidade/Isenção para NFS-e; 05 - Rejeição de NFS-e pelo tomador ou pelo intermediário se responsável pelo recolhimento do tributo; 99 - Outros; Rejeição de NFS-e pelo tomador ou pelo intermediário se responsável pelo recolhimento do tributo. Rejeição de NFS-e pelo tomador ou pelo intermediário se responsável pelo recolhimento do tributo. +unchanged NFSe/infNFSe/DPS/infDPS/subst/xMotivo 116 127 E E C C 0-1 0-1 15-255 15-255 Descrição do motivo da substituição da NFS-e quando o emitente deve descrever o motivo da substituição para outros motivos (cMotivo = 99). Descrição do motivo da substituição da NFS-e quando o emitente deve descrever o motivo da substituição para outros motivos (cMotivo = 99). - - +unchanged NFSe/infNFSe/DPS/infDPS/prest 117 128 G G - - 1-1 1-1 - - Grupo de informações relativas ao prestador do serviço Grupo de informações relativas ao prestador do serviço - - +changed NFSe/infNFSe/DPS/infDPS/prest/CNPJ 118 129 CE CE N C 1-1 1-1 14 14 Número da inscrição federal (CNPJ) do prestador do serviço. Número da inscrição federal (CNPJ) do prestador do serviço. - - +unchanged NFSe/infNFSe/DPS/infDPS/prest/CPF 119 130 CE CE N N 1-1 1-1 11 11 Número da inscrição federal (CPF) do prestador do serviço. Número da inscrição federal (CPF) do prestador do serviço. - - +unchanged NFSe/infNFSe/DPS/infDPS/prest/NIF 120 131 CE CE C C 1-1 1-1 40 40 Número de identificação fiscal fornecido por órgão de administração tributária no exterior. Número de identificação fiscal fornecido por órgão de administração tributária no exterior. - - +changed NFSe/infNFSe/DPS/infDPS/prest/cNaoNIF 121 132 CE CE N N 1-1 1-1 1 1 Motivo para não informação do NIF: 0 - Não informado na nota de origem; 1 - Dispensado do NIF; 2 - Não exigência do NIF; Motivo para não informação do NIF: 0 - Não informado na nota de origem; 1 - Dispensado do NIF; 2 - Não exigência do NIF; O valor 0 deve ser utilizado como opção de preenchimento do campo somente no compartilhamento de NFS-e pelo municipio com o ADN NFS-e. O valor 0 deve ser utilizado como opção de preenchimento do campo somente no compartilhamento de NFS-e pelo município com o ADN NFS-e. +unchanged NFSe/infNFSe/DPS/infDPS/prest/CAEPF 122 133 E E N N 0-1 0-1 14 14 Número do Cadastro de Atividade Econômica da Pessoa Física (CAEPF). Número do Cadastro de Atividade Econômica da Pessoa Física (CAEPF). +unchanged NFSe/infNFSe/DPS/infDPS/prest/IM 123 134 E E C C 0-1 0-1 15 15 Número do indicador municipal do prestador do serviço. Número do indicador municipal do prestador do serviço. - - +unchanged NFSe/infNFSe/DPS/infDPS/prest/xNome 124 135 E E C C 0-1 0-1 150 150 Nome / Nome Empresarial do prestador. Nome / Nome Empresarial do prestador. - - +unchanged NFSe/infNFSe/DPS/infDPS/prest/end 125 136 G G - - 0-1 0-1 - - Grupo de informações do endereço do prestador de serviço. Grupo de informações do endereço do prestador de serviço. - - +unchanged NFSe/infNFSe/DPS/infDPS/prest/end/endNac 126 137 CG CG - - 1-1 1-1 - - Grupo de informações do endereço nacional. Grupo de informações do endereço nacional. - - +unchanged NFSe/infNFSe/DPS/infDPS/prest/end/endNac/cMun 127 138 E E N N 1-1 1-1 7 7 Código do município do endereço do prestador do serviço. (Tabela do IBGE) Código do município do endereço do prestador do serviço. (Tabela do IBGE) - - +unchanged NFSe/infNFSe/DPS/infDPS/prest/end/endNac/CEP 128 139 E E C C 1-1 1-1 8 8 Código numérico do Endereçamento Postal nacional (CEP) do endereço do prestador do serviço. Código numérico do Endereçamento Postal nacional (CEP) do endereço do prestador do serviço. - - +unchanged NFSe/infNFSe/DPS/infDPS/prest/end/endExt 129 140 CG CG - - 1-1 1-1 - - Grupo de informações do endereço no exterior. Grupo de informações do endereço no exterior. - - +unchanged NFSe/infNFSe/DPS/infDPS/prest/end/endExt/cPais 130 141 E E C C 1-1 1-1 2 2 Código do país do endereço do prestador do prestador do serviço. (Tabela de Países ISO) Código do país do endereço do prestador do prestador do serviço. (Tabela de Países ISO) - - +unchanged NFSe/infNFSe/DPS/infDPS/prest/end/endExt/cEndPost 131 142 E E C C 1-1 1-1 1-11 1-11 Código alfanumérico do Endereçamento Postal no exterior do prestador do serviço. Código alfanumérico do Endereçamento Postal no exterior do prestador do serviço. - - +unchanged NFSe/infNFSe/DPS/infDPS/prest/end/endExt/xCidade 132 143 E E C C 1-1 1-1 1-60 1-60 Nome da cidade no exterior do prestador do serviço. Nome da cidade no exterior do prestador do serviço. - - +unchanged NFSe/infNFSe/DPS/infDPS/prest/end/endExt/xEstProvReg 133 144 E E C C 1-1 1-1 1-60 1-60 Estado, província ou região da cidade no exterior do prestador do serviço. Estado, província ou região da cidade no exterior do prestador do serviço. - - +unchanged NFSe/infNFSe/DPS/infDPS/prest/end/xLgr 134 145 E E C C 1-1 1-1 1-255 1-255 Tipo e nome do logradouro do endereço do prestador do serviço. Tipo e nome do logradouro do endereço do prestador do serviço. - - +unchanged NFSe/infNFSe/DPS/infDPS/prest/end/nro 135 146 E E C C 1-1 1-1 1-60 1-60 Número no logradouro do endereço do prestador do serviço. Número no logradouro do endereço do prestador do serviço. - - +unchanged NFSe/infNFSe/DPS/infDPS/prest/end/xCpl 136 147 E E C C 0-1 0-1 1-156 1-156 Complemento do endereço do prestador do serviço. Complemento do endereço do prestador do serviço. - - +unchanged NFSe/infNFSe/DPS/infDPS/prest/end/xBairro 137 148 E E C C 1-1 1-1 1-60 1-60 Bairro do endereço do prestador do serviço. Bairro do endereço do prestador do serviço. - - +unchanged NFSe/infNFSe/DPS/infDPS/prest/fone 138 149 E E N N 0-1 0-1 6-20 6-20 Número do telefone do prestador. (Preencher com o Código DDD + número do telefone. Nas operações com exterior é permitido informar o código do país + código da localidade + número do telefone) Número do telefone do prestador. (Preencher com o Código DDD + número do telefone. Nas operações com exterior é permitido informar o código do país + código da localidade + número do telefone) - - +unchanged NFSe/infNFSe/DPS/infDPS/prest/email 139 150 E E C C 0-1 0-1 1-80 1-80 E-mail do prestador. E-mail do prestador. - - +unchanged NFSe/infNFSe/DPS/infDPS/prest/regTrib 140 151 G G - - 1-1 1-1 - - Grupo de informações relativas aos regimes de tributação do prestador de serviços Grupo de informações relativas aos regimes de tributação do prestador de serviços - - +changed NFSe/infNFSe/DPS/infDPS/prest/regTrib/opSimpNac 141 152 E E N N 1-1 1-1 1 1 Situação perante Simples Nacional: 1 - Não Optante; 2 - Optante - Microempreendedor Individual (MEI); 3 - Optante - Microempresa ou Empresa de Pequeno Porte (ME/EPP); Situação perante Simples Nacional: 1 - Não Optante; 2 - Optante - Microempreendedor Individual (MEI); 3 - Optante - Microempresa ou Empresa de Pequeno Porte (ME/EPP); 4 - Optante Pendente; - - +changed NFSe/infNFSe/DPS/infDPS/prest/regTrib/regApTribSN 142 153 E E N N 0-1 0-1 1 1 Regime de Apuração Tributária pelo Simples Nacional. Opção para que o contribuinte optante pelo Simples Nacional ME/EPP (opSimpNac = 3) possa indicar, ao emitir o documento fiscal, em qual regime de apuração os tributos federais e municipal estão inseridos, caso tenha ultrapassado algum sublimite ou limite definido para o Simples Nacional. 1 – Regime de apuração dos tributos federais e municipal pelo SN; 2 – Regime de apuração dos tributos federais pelo SN e o ISSQN pela NFS-e conforme respectiva legislação municipal do tributo; 3 – Regime de apuração dos tributos federais e municipal pela NFS-e conforme respectivas legislações federal e municipal de cada tributo; Regime de Apuração Tributária pelo Simples Nacional. Opção para que o contribuinte optante pelo Simples Nacional ME/EPP (opSimpNac = 3) possa indicar, ao emitir o documento fiscal, em qual regime de apuração os tributos federais e municipal estão inseridos, caso tenha ultrapassado algum sublimite ou limite definido para o Simples Nacional. Esta informação não leva em consideração o regime de apuração do IBS e da CBS que devem ser informados no campo regApIBSCBSSN. 1 – Regime de apuração dos tributos federais e municipal pelo SN; 2 – Regime de apuração dos tributos federais pelo SN e o ISSQN pela NFS-e conforme respectiva legislação municipal do tributo; 3 – Regime de apuração dos tributos federais e municipal pela NFS-e conforme respectivas legislações federal e municipal de cada tributo; 1 - Um MEI, identificado como tal na data de competência informada na DPS após a verificação na base de dados do Simples Nacional, será tratado sempre como MEI no Sistema Nacional NFS-e, independentemente de quaisquer circustâncias que o próprio MEI tenha detectado que o descaracterize como MEI. A informação da situação do MEI sempre será aquela que for verificada no Simples Nacional na data de competência informada na DPS. 2 - Uma ME/EPP deixará de apurar o ISSQN pelo Simples Nacional quando atribuir ao campo regAPTribSN os valores 2 ou 3, conforme leiaute DPS. 1 - Um MEI, identificado como tal na data de competência informada na DPS após a verificação na base de dados do Simples Nacional, será tratado sempre como MEI no Sistema Nacional NFS-e, independentemente de quaisquer circunstâncias que o próprio MEI tenha detectado que o descaracterize como MEI. A informação da situação do MEI sempre será aquela que for verificada no Simples Nacional na data de competência informada na DPS. 2 - Uma ME/EPP deixará de apurar o ISSQN pelo Simples Nacional quando atribuir ao campo regAPTribSN os valores 2 ou 3, conforme leiaute DPS. +added NFSe/infNFSe/DPS/infDPS/prest/regTrib/regApIBSCBSSN 154 E N 0-1 1 Regime de Apuração Tributária pelo Simples Nacional para IBS e CBS. 1 - IBS e CBS apurados pelo SN; 2 - CBS apurada pelo SN e IBS apurado pelo regime regular; 3 - IBS e CBS apurados pelo regime regular Quando opSimpNac = 4 (Pendente), a NFS-e gerada só vai possuir as informações duplicadas de vIBSTot e vCBS (como contribuinte regular) e vIBSSN e vCBSSN quando regApIBSCBSSN = 1. A opção "2 - CBS apurada pelo SN e IBS apurado pelo regime regular" deverá ser utilizada pelos contribuintes que ultrapassarem os sublimites estabelecidos na Lei Complementar nº 123/2006. Nesta situação, apenas a CBS permanece sendo recolhida na forma do Simples Nacional, enquanto que para o IBS será aplicado o regime regular de tributação. +changed NFSe/infNFSe/DPS/infDPS/prest/regTrib/regEspTrib 143 155 E E N N 1-1 0-1 1 1 Tipos de Regimes Especiais de Tributação Municipal: 0 - Nenhum; 1 - Ato Cooperado (Cooperativa); 2 - Estimativa; 3 - Microempresa Municipal; 4 - Notário ou Registrador; 5 - Profissional Autônomo; 6 - Sociedade de Profissionais; 9 - Outros; Tipos de Regimes Especiais de Tributação Municipal: 0 - Nenhum; 1 - Ato Cooperado (Cooperativa); 2 - Estimativa; 3 - Microempresa Municipal; 4 - Notário ou Registrador; 5 - Profissional Autônomo; 6 - Sociedade de Profissionais; 9 - Outros; - - +unchanged NFSe/infNFSe/DPS/infDPS/toma 144 156 G G - - 0-1 0-1 - - Grupo de informações relativas ao tomador do serviço Grupo de informações relativas ao tomador do serviço - - +changed NFSe/infNFSe/DPS/infDPS/toma/CNPJ 145 157 CE CE N C 1-1 1-1 14 14 Número da inscrição federal (CNPJ) do tomador de serviço. Número da inscrição federal (CNPJ) do tomador de serviço. - - +unchanged NFSe/infNFSe/DPS/infDPS/toma/CPF 146 158 CE CE N N 1-1 1-1 11 11 Número da inscrição federal (CPF) do tomador do serviço. Número da inscrição federal (CPF) do tomador do serviço. - - +unchanged NFSe/infNFSe/DPS/infDPS/toma/NIF 147 159 CE CE C C 1-1 1-1 40 40 Número de identificação fiscal fornecido por órgão de administração tributária no exterior. Número de identificação fiscal fornecido por órgão de administração tributária no exterior. - - +changed NFSe/infNFSe/DPS/infDPS/toma/cNaoNIF 148 160 CE CE N N 1-1 1-1 1 1 Motivo para não informação do NIF: 0 - Não informado na nota de origem; 1 - Dispensado do NIF; 2 - Não exigência do NIF; Motivo para não informação do NIF: 0 - Não informado na nota de origem; 1 - Dispensado do NIF; 2 - Não exigência do NIF; O valor 0 deve ser utilizado como opção de preenchimento do campo somente no compartilhamento de NFS-e pelo municipio com o ADN NFS-e. O valor 0 deve ser utilizado como opção de preenchimento do campo somente no compartilhamento de NFS-e pelo município com o ADN NFS-e. +unchanged NFSe/infNFSe/DPS/infDPS/toma/CAEPF 149 161 E E N N 0-1 0-1 14 14 Número do Cadastro de Atividade Econômica da Pessoa Física (CAEPF). Número do Cadastro de Atividade Econômica da Pessoa Física (CAEPF). - - +unchanged NFSe/infNFSe/DPS/infDPS/toma/IM 150 162 E E C C 0-1 0-1 15 15 Número do indicador municipal do tomador do serviço. Número do indicador municipal do tomador do serviço. - - +unchanged NFSe/infNFSe/DPS/infDPS/toma/xNome 151 163 E E C C 1-1 1-1 150 150 Nome / Nome Empresarial do tomador. Nome / Nome Empresarial do tomador. - - +unchanged NFSe/infNFSe/DPS/infDPS/toma/end 152 164 G G - - 0-1 0-1 - - Grupo de informações do endereço do tomador do serviço. Grupo de informações do endereço do tomador do serviço. - - +unchanged NFSe/infNFSe/DPS/infDPS/toma/end/endNac 153 165 CG CG - - 1-1 1-1 - - Grupo de informações do endereço nacional. Grupo de informações do endereço nacional. - - +unchanged NFSe/infNFSe/DPS/infDPS/toma/end/endNac/cMun 154 166 E E N N 1-1 1-1 7 7 Código do município do endereço do tomador do serviço. (Tabela do IBGE) Código do município do endereço do tomador do serviço. (Tabela do IBGE) - - +unchanged NFSe/infNFSe/DPS/infDPS/toma/end/endNac/CEP 155 167 E E C C 1-1 1-1 8 8 Código numérico do Endereçamento Postal nacional (CEP) do endereço do tomador do serviço. Código numérico do Endereçamento Postal nacional (CEP) do endereço do tomador do serviço. - - +unchanged NFSe/infNFSe/DPS/infDPS/toma/end/endExt 156 168 CG CG - - 1-1 1-1 - - Grupo de informações do endereço no exterior. Grupo de informações do endereço no exterior. - - +unchanged NFSe/infNFSe/DPS/infDPS/toma/end/endExt/cPais 157 169 E E C C 1-1 1-1 2 2 Código do país do endereço do prestador do tomador do serviço. (Tabela de Países ISO) Código do país do endereço do prestador do tomador do serviço. (Tabela de Países ISO) - - +unchanged NFSe/infNFSe/DPS/infDPS/toma/end/endExt/cEndPost 158 170 E E C C 1-1 1-1 1-11 1-11 Código alfanumérico do Endereçamento Postal no exterior do tomador do serviço. Código alfanumérico do Endereçamento Postal no exterior do tomador do serviço. - - +unchanged NFSe/infNFSe/DPS/infDPS/toma/end/endExt/xCidade 159 171 E E C C 1-1 1-1 1-60 1-60 Nome da cidade no exterior do tomador do serviço. Nome da cidade no exterior do tomador do serviço. - - +unchanged NFSe/infNFSe/DPS/infDPS/toma/end/endExt/xEstProvReg 160 172 E E C C 1-1 1-1 1-60 1-60 Estado, província ou região da cidade no exterior do tomador do serviço. Estado, província ou região da cidade no exterior do tomador do serviço. - - +unchanged NFSe/infNFSe/DPS/infDPS/toma/end/xLgr 161 173 E E C C 1-1 1-1 1-255 1-255 Tipo e nome do logradouro do endereço do tomador do serviço. Tipo e nome do logradouro do endereço do tomador do serviço. - - +unchanged NFSe/infNFSe/DPS/infDPS/toma/end/nro 162 174 E E C C 1-1 1-1 1-60 1-60 Número no logradouro do endereço do tomador do serviço. Número no logradouro do endereço do tomador do serviço. - - +unchanged NFSe/infNFSe/DPS/infDPS/toma/end/xCpl 163 175 E E C C 0-1 0-1 1-156 1-156 Complemento do endereço do tomador do serviço. Complemento do endereço do tomador do serviço. - - +unchanged NFSe/infNFSe/DPS/infDPS/toma/end/xBairro 164 176 E E C C 1-1 1-1 1-60 1-60 Bairro do endereço do tomador do serviço. Bairro do endereço do tomador do serviço. - - +unchanged NFSe/infNFSe/DPS/infDPS/toma/fone 165 177 E E N N 0-1 0-1 6-20 6-20 Número do telefone do tomador. (Preencher com o Código DDD + número do telefone. Nas operações com exterior é permitido informar o código do país + código da localidade + número do telefone) Número do telefone do tomador. (Preencher com o Código DDD + número do telefone. Nas operações com exterior é permitido informar o código do país + código da localidade + número do telefone) - - +unchanged NFSe/infNFSe/DPS/infDPS/toma/email 166 178 E E C C 0-1 0-1 1-80 1-80 E-mail do tomador. E-mail do tomador. +added NFSe/infNFSe/DPS/infDPS/indDest 179 E N 1-1 1 A respeito do Destinatário dos serviços: 0 – o destinatário é o próprio tomador/adquirente identificado na NFS-e (tomador=adquirente=destinatário); 1 – o destinatário não é o próprio adquirente, podendo ser outra pessoa, física ou jurídica (ou equiparada), ou um estabelecimento diferente do indicado como tomador (tomador=adquirente≠destinatário); - +added NFSe/infNFSe/DPS/infDPS/dest 180 G - 0-1 - Grupo de informações relativas ao Destinatário - +added NFSe/infNFSe/DPS/infDPS/dest/CNPJ 181 CE C 1-1 14 Número da inscrição no Cadastro Nacional de Pessoa Jurídica (CNPJ) do destinatário de serviço - +added NFSe/infNFSe/DPS/infDPS/dest/CPF 182 CE N 1-1 11 Número da inscrição no Cadastro Nacional de Pessoa Física (CPF) do destinatário do serviço - +added NFSe/infNFSe/DPS/infDPS/dest/NIF 183 CE C 1-1 40 Número de identificação fiscal fornecido por órgão de administração tributária no exterior - +added NFSe/infNFSe/DPS/infDPS/dest/cNaoNIF 184 CE N 1-1 1 Motivo para não informação do NIF: 0 - Não informado na nota de origem; 1 - Dispensado do NIF; 2 - Não exigência do NIF; - +added NFSe/infNFSe/DPS/infDPS/dest/xNome 185 E C 1-1 1-150 Nome / Nome Empresarial do destinatário - +added NFSe/infNFSe/DPS/infDPS/dest/end 186 G - 0-1 - Grupo de informações do endereço do destinatário do serviço. - +added NFSe/infNFSe/DPS/infDPS/dest/end/endNac 187 CG - 1-1 - Grupo de informações do endereço nacional. - +added NFSe/infNFSe/DPS/infDPS/dest/end/endNac/cMun 188 E N 1-1 7 Código do município do endereço do destinatário do serviço. (Tabela do IBGE) - +added NFSe/infNFSe/DPS/infDPS/dest/end/endNac/CEP 189 E N 1-1 8 Código numérico do Endereçamento Postal nacional (CEP) do endereço do destinatário do serviço. (Informar os zeros não significativos) - +added NFSe/infNFSe/DPS/infDPS/dest/end/endExt 190 CG - 1-1 - Grupo de informações do endereço no exterior. - +added NFSe/infNFSe/DPS/infDPS/dest/end/endExt/cPais 191 E C 1-1 2 Código do país do endereço do destinatário do serviço. (Tabela de Países ISO) - +added NFSe/infNFSe/DPS/infDPS/dest/end/endExt/cEndPost 192 E C 1-1 1-11 Código alfanumérico do Endereçamento Postal no exterior do destinatário do serviço. - +added NFSe/infNFSe/DPS/infDPS/dest/end/endExt/xCidade 193 E C 1-1 1-60 Nome da cidade no exterior do destinatário do serviço. - +added NFSe/infNFSe/DPS/infDPS/dest/end/endExt/xEstProvReg 194 E C 1-1 1-60 Estado, província ou região da cidade no exterior do destinatário do serviço. - +added NFSe/infNFSe/DPS/infDPS/dest/end/xLgr 195 E C 1-1 1-255 Tipo e nome do logradouro do endereço do destinatário do serviço. - +added NFSe/infNFSe/DPS/infDPS/dest/end/nro 196 E C 1-1 1-60 Número no logradouro do endereço do destinatário do serviço. - +added NFSe/infNFSe/DPS/infDPS/dest/end/xCpl 197 E C 0-1 1-156 Complemento do endereço do destinatário do serviço. - +added NFSe/infNFSe/DPS/infDPS/dest/end/xBairro 198 E C 1-1 1-60 Bairro do endereço do destinatário do serviço. - +added NFSe/infNFSe/DPS/infDPS/dest/fone 199 E N 0-1 6-20 Número do telefone do destinatário. (Preencher com o Código DDD + número do telefone. Nas operações com exterior é permitido informar o código do país + código da localidade + número do telefone) - +added NFSe/infNFSe/DPS/infDPS/dest/email 200 E C 0-1 1-80 E-mail do destinatário. - +unchanged NFSe/infNFSe/DPS/infDPS/interm 167 201 G G - - 0-1 0-1 - - Grupo de informações relativas ao intermediário do serviço Grupo de informações relativas ao intermediário do serviço - - +changed NFSe/infNFSe/DPS/infDPS/interm/CNPJ 168 202 CE CE N C 1-1 1-1 14 14 Número da inscrição federal (CNPJ) do intermediário de serviço Número da inscrição federal (CNPJ) do intermediário de serviço - - +unchanged NFSe/infNFSe/DPS/infDPS/interm/CPF 169 203 CE CE N N 1-1 1-1 11 11 Número da inscrição federal (CPF) do intermediário do serviço Número da inscrição federal (CPF) do intermediário do serviço - - +unchanged NFSe/infNFSe/DPS/infDPS/interm/NIF 170 204 CE CE C C 1-1 1-1 40 40 Número de identificação fiscal fornecido por órgão de administração tributária no exterior Número de identificação fiscal fornecido por órgão de administração tributária no exterior - - +changed NFSe/infNFSe/DPS/infDPS/interm/cNaoNIF 171 205 CE CE N N 1-1 1-1 1 1 Motivo para não informação do NIF: 0 - Não informado na nota de origem; 1 - Dispensado do NIF; 2 - Não exigência do NIF; Motivo para não informação do NIF: 0 - Não informado na nota de origem; 1 - Dispensado do NIF; 2 - Não exigência do NIF; O valor 0 deve ser utilizado como opção de preenchimento do campo somente no compartilhamento de NFS-e pelo municipio com o ADN NFS-e. O valor 0 deve ser utilizado como opção de preenchimento do campo somente no compartilhamento de NFS-e pelo município com o ADN NFS-e. +unchanged NFSe/infNFSe/DPS/infDPS/interm/CAEPF 172 206 E E N N 0-1 0-1 14 14 Número do Cadastro de Atividade Econômica da Pessoa Física (CAEPF). Número do Cadastro de Atividade Econômica da Pessoa Física (CAEPF). - - +unchanged NFSe/infNFSe/DPS/infDPS/interm/IM 173 207 E E C C 0-1 0-1 15 15 Número do indicador municipal do intermediário do serviço Número do indicador municipal do intermediário do serviço - - +changed NFSe/infNFSe/DPS/infDPS/interm/xNome 174 208 E E C C 1-1 1-1 150 150 Nome / Nomer Empresarial do intermediário Nome / Nome Empresarial do intermediário - - +unchanged NFSe/infNFSe/DPS/infDPS/interm/end 175 209 G G - - 0-1 0-1 - - Grupo de informações do endereço do intermediário do serviço. Grupo de informações do endereço do intermediário do serviço. - - +unchanged NFSe/infNFSe/DPS/infDPS/interm/end/endNac 176 210 CG CG - - 1-1 1-1 - - Grupo de informações do endereço nacional. Grupo de informações do endereço nacional. - - +unchanged NFSe/infNFSe/DPS/infDPS/interm/end/endNac/cMun 177 211 E E N N 1-1 1-1 7 7 Código do município do endereço do intermediário do serviço. (Tabela do IBGE) Código do município do endereço do intermediário do serviço. (Tabela do IBGE) - - +unchanged NFSe/infNFSe/DPS/infDPS/interm/end/endNac/CEP 178 212 E E C C 1-1 1-1 8 8 Código numérico do Endereçamento Postal nacional (CEP) do endereço do intermediário do serviço. Código numérico do Endereçamento Postal nacional (CEP) do endereço do intermediário do serviço. - - +unchanged NFSe/infNFSe/DPS/infDPS/interm/end/endExt 179 213 CG CG - - 1-1 1-1 - - Grupo de informações do endereço no exterior. Grupo de informações do endereço no exterior. - - +unchanged NFSe/infNFSe/DPS/infDPS/interm/end/endExt/cPais 180 214 E E C C 1-1 1-1 2 2 Código do país do endereço do prestador do intermediário do serviço. (Tabela de Países ISO) Código do país do endereço do prestador do intermediário do serviço. (Tabela de Países ISO) - - +unchanged NFSe/infNFSe/DPS/infDPS/interm/end/endExt/cEndPost 181 215 E E C C 1-1 1-1 1-11 1-11 Código alfanumérico do Endereçamento Postal no exterior do intermediário do serviço. Código alfanumérico do Endereçamento Postal no exterior do intermediário do serviço. - - +unchanged NFSe/infNFSe/DPS/infDPS/interm/end/endExt/xCidade 182 216 E E C C 1-1 1-1 1-60 1-60 Nome da cidade no exterior do intermediário do serviço. Nome da cidade no exterior do intermediário do serviço. - - +unchanged NFSe/infNFSe/DPS/infDPS/interm/end/endExt/xEstProvReg 183 217 E E C C 1-1 1-1 1-60 1-60 Estado, província ou região da cidade no exterior do intermediário do serviço. Estado, província ou região da cidade no exterior do intermediário do serviço. - - +unchanged NFSe/infNFSe/DPS/infDPS/interm/end/xLgr 184 218 E E C C 1-1 1-1 1-255 1-255 Tipo e nome do logradouro do endereço do intermediário do serviço. Tipo e nome do logradouro do endereço do intermediário do serviço. - - +unchanged NFSe/infNFSe/DPS/infDPS/interm/end/nro 185 219 E E C C 1-1 1-1 1-60 1-60 Número no logradouro do endereço do intermediário do serviço. Número no logradouro do endereço do intermediário do serviço. - - +unchanged NFSe/infNFSe/DPS/infDPS/interm/end/xCpl 186 220 E E C C 0-1 0-1 1-156 1-156 Complemento do endereço do intermediário do serviço. Complemento do endereço do intermediário do serviço. - - +unchanged NFSe/infNFSe/DPS/infDPS/interm/end/xBairro 187 221 E E C C 1-1 1-1 1-60 1-60 Bairro do endereço do intermediário do serviço. Bairro do endereço do intermediário do serviço. - - +unchanged NFSe/infNFSe/DPS/infDPS/interm/fone 188 222 E E N N 0-1 0-1 6-20 6-20 Número do telefone do intermediário. (Preencher com o Código DDD + número do telefone. Nas operações com exterior é permitido informar o código do país + código da localidade + número do telefone) Número do telefone do intermediário. (Preencher com o Código DDD + número do telefone. Nas operações com exterior é permitido informar o código do país + código da localidade + número do telefone) - - +unchanged NFSe/infNFSe/DPS/infDPS/interm/email 189 223 E E C C 0-1 0-1 1-80 1-80 E-mail do intermediário. E-mail do intermediário. +changed NFSe/infNFSe/DPS/infDPS/serv 190 224 G G - - 1-1 0-1 - - Grupo de informações relativas ao serviço prestado Grupo de informações relativas ao serviço prestado - - +unchanged NFSe/infNFSe/DPS/infDPS/serv/locPrest 191 225 G G - - 1-1 1-1 - - Grupo de informações relativas ao local da prestação do serviço Grupo de informações relativas ao local da prestação do serviço OBS: As operações de exploração de vias (ou rodovias) no campo de incidência do ISSQN (subitem 22.01 da lista de serviço do Sistema Nacional NFS-e) serão formalizadas pela "NFS-e Via", Nota Fiscal de Serviço eletrônica de Exploração de Via, que terá um layout específico a ser publicado em breve. Para atender o dispositivo do Art 3º, § 3º, (Considera-se ocorrido o fato gerador do imposto no local do estabelecimento prestador nos serviços executados em águas marítimas, excetuados os serviços descritos no subitem 20.01) o Sistema Nacional NFS-e "Águas Marítimas" como uma localidade de prestação de serviço, assim como qualquer município brasileiro. cLocPrestacao poderá assumir: qualquer código que represente um município da tabela de códigos de municípios do IBGE, qualquer código quer represente um trecho de concessão de exploração de rodovias do cadastro próprio do Sistema Nacional NFS-e ou 0000000, que representa "Águas Marítimas". OBS: As operações de exploração de vias (ou rodovias) no campo de incidência do ISSQN (subitem 22.01 da lista de serviço do Sistema Nacional NFS-e) serão formalizadas pela "NFS-e Via", Nota Fiscal de Serviço eletrônica de Exploração de Via, que terá um layout específico a ser publicado em breve. Para atender o dispositivo do Art 3º, § 3º, (Considera-se ocorrido o fato gerador do imposto no local do estabelecimento prestador nos serviços executados em águas marítimas, excetuados os serviços descritos no subitem 20.01) o Sistema Nacional NFS-e "Águas Marítimas" como uma localidade de prestação de serviço, assim como qualquer município brasileiro. cLocPrestacao poderá assumir: qualquer código que represente um município da tabela de códigos de municípios do IBGE, qualquer código quer represente um trecho de concessão de exploração de rodovias do cadastro próprio do Sistema Nacional NFS-e ou 0000000, que representa "Águas Marítimas". +unchanged NFSe/infNFSe/DPS/infDPS/serv/locPrest/cLocPrestacao 192 226 CE CE N N 1-1 1-1 7 7 Código da localidade da prestação do serviço. Código da localidade da prestação do serviço. OBS: As operações de exploração de vias (ou rodovias) no campo de incidência do ISSQN (subitem 22.01 da lista de serviço do Sistema Nacional NFS-e) serão formalizadas pela "NFS-e Via", Nota Fiscal de Serviço eletrônica de Exploração de Via, que terá um layout específico a ser publicado em breve. Para atender o dispositivo do Art 3º, § 3º, (Considera-se ocorrido o fato gerador do imposto no local do estabelecimento prestador nos serviços executados em águas marítimas, excetuados os serviços descritos no subitem 20.01) o Sistema Nacional NFS-e "Águas Marítimas" como uma localidade de prestação de serviço, assim como qualquer município brasileiro. cLocPrestacao poderá assumir: qualquer código que represente um município da tabela de códigos de municípios do IBGE, qualquer código quer represente um trecho de concessão de exploração de rodovias do cadastro próprio do Sistema Nacional NFS-e ou 0000000, que representa "Águas Marítimas". OBS: As operações de exploração de vias (ou rodovias) no campo de incidência do ISSQN (subitem 22.01 da lista de serviço do Sistema Nacional NFS-e) serão formalizadas pela "NFS-e Via", Nota Fiscal de Serviço eletrônica de Exploração de Via, que terá um layout específico a ser publicado em breve. Para atender o dispositivo do Art 3º, § 3º, (Considera-se ocorrido o fato gerador do imposto no local do estabelecimento prestador nos serviços executados em águas marítimas, excetuados os serviços descritos no subitem 20.01) o Sistema Nacional NFS-e "Águas Marítimas" como uma localidade de prestação de serviço, assim como qualquer município brasileiro. cLocPrestacao poderá assumir: qualquer código que represente um município da tabela de códigos de municípios do IBGE, qualquer código quer represente um trecho de concessão de exploração de rodovias do cadastro próprio do Sistema Nacional NFS-e ou 0000000, que representa "Águas Marítimas". +unchanged NFSe/infNFSe/DPS/infDPS/serv/locPrest/cPaisPrestacao 193 227 CE CE C C 1-1 1-1 2 2 Código do país onde ocorreu a prestação do serviço. (Tabela de Países ISO) Código do país onde ocorreu a prestação do serviço. (Tabela de Países ISO) OBS: As operações de exploração de vias (ou rodovias) no campo de incidência do ISSQN (subitem 22.01 da lista de serviço do Sistema Nacional NFS-e) serão formalizadas pela "NFS-e Via", Nota Fiscal de Serviço eletrônica de Exploração de Via, que terá um layout específico a ser publicado em breve. Para atender o dispositivo do Art 3º, § 3º, (Considera-se ocorrido o fato gerador do imposto no local do estabelecimento prestador nos serviços executados em águas marítimas, excetuados os serviços descritos no subitem 20.01) o Sistema Nacional NFS-e "Águas Marítimas" como uma localidade de prestação de serviço, assim como qualquer município brasileiro. cLocPrestacao poderá assumir: qualquer código que represente um município da tabela de códigos de municípios do IBGE, qualquer código quer represente um trecho de concessão de exploração de rodovias do cadastro próprio do Sistema Nacional NFS-e ou 0000000, que representa "Águas Marítimas". OBS: As operações de exploração de vias (ou rodovias) no campo de incidência do ISSQN (subitem 22.01 da lista de serviço do Sistema Nacional NFS-e) serão formalizadas pela "NFS-e Via", Nota Fiscal de Serviço eletrônica de Exploração de Via, que terá um layout específico a ser publicado em breve. Para atender o dispositivo do Art 3º, § 3º, (Considera-se ocorrido o fato gerador do imposto no local do estabelecimento prestador nos serviços executados em águas marítimas, excetuados os serviços descritos no subitem 20.01) o Sistema Nacional NFS-e "Águas Marítimas" como uma localidade de prestação de serviço, assim como qualquer município brasileiro. cLocPrestacao poderá assumir: qualquer código que represente um município da tabela de códigos de municípios do IBGE, qualquer código quer represente um trecho de concessão de exploração de rodovias do cadastro próprio do Sistema Nacional NFS-e ou 0000000, que representa "Águas Marítimas". +unchanged NFSe/infNFSe/DPS/infDPS/serv/cServ 194 228 G G - - 1-1 1-1 - - Grupo de informações relativas ao código do serviço prestado Grupo de informações relativas ao código do serviço prestado - - +changed NFSe/infNFSe/DPS/infDPS/serv/cServ/cTribNac 195 229 E E N N 1-1 1-1 6 6 Código de tributação nacional do ISSQN, nos termos da LC 116/2003, Conforme aba MUN.INCID_INFO.SERV. do ANEXO I Código de tributação nacional do ISSQN, nos termos da LC 116/2003, Conforme aba MUN.INCID_INFO.SERV. do ANEXO I Para o caso de serviço prestado em "Águas Marítimas" o seviço informado nunca poderá ser 20.01 Para o caso de serviço prestado em "Águas Marítimas" o serviço informado nunca poderá ser 20.01 +unchanged NFSe/infNFSe/DPS/infDPS/serv/cServ/cTribMun 196 230 E E N N 0-1 0-1 3 3 Código de tributação municipal do ISSQN. Código de tributação municipal do ISSQN. - - +unchanged NFSe/infNFSe/DPS/infDPS/serv/cServ/cNBS 198 231 E E N N 0-1 0-1 9 9 Código NBS correspondente ao serviço prestado, seguindo a versão 2.0, conforme Anexo B. Código NBS correspondente ao serviço prestado, seguindo a versão 2.0, conforme Anexo B. NBS - Nomenclatura Brasileira de Serviços, Intangíveis e outras Operações que produzam Variações no Patrimônio NBS - Nomenclatura Brasileira de Serviços, Intangíveis e outras Operações que produzam Variações no Patrimônio +added NFSe/infNFSe/DPS/infDPS/serv/cServ/cAtvSN 232 E N 0-1 2 Código da atividade do Simples Nacional, conforme a Lei Complementar nº 123/2006: 07 - Prestação de serviços, cessão de direitos, de uso ou de espaço com incidência do ISS, tributados exclusivamente pelo Anexo III. 08 - Prestação de serviços contábeis autorizados a pagar o ISS em valor fixo em guia do Município - Anexo III. 09 - Prestação de serviços - Sujeitos ao Fator “R” – Anexo III ou V. 10 - Prestação de serviços de transporte municipal rodoviário, metroviário, ferroviário e aquaviário de passageiros relacionados no subitem 16.01 da lista anexa à LC 116/2003 - Anexo III. 11 - Locação de bens móveis e operações com serviços, bens imateriais e direitos, inclusive com bens imóveis, sem incidência de ISS - Anexo III. 12 - Prestação de serviços da área da construção civil relacionados nos subitens 7.02 e 7.05 da lista anexa à LC 116/2003 - Anexo III. 13 - Prestação de serviços da área da construção civil relacionados nos subitens 7.02 e 7.05 da lista anexa à LC 116/2003 - Anexo IV. 14 - Prestação de serviços - Anexo IV. 90 - Operações não tributadas. Em observância à padronização das informações constantes nos documentos fiscais de padrão nacional, manteve-se a numeração ordinal da relação de códigos da atividade do Simples Nacional, conforme a Lei Complementar nº 123/2006, adotando-se apenas aqueles aplicáveis às operações abrangidas pela NFS-e. Campo deve ser informado apenas quando opSimpNac = 2 - Optante - Microempreendedor Individual (MEI); ou 3 - Optante - Microempresa ou Empresa de Pequeno Porte (ME/EPP); ou 4 - Optante Pendente; +unchanged NFSe/infNFSe/DPS/infDPS/serv/cServ/cIntContrib 199 233 E E C C 0-1 0-1 20 20 Código interno do contribuinte Código interno do contribuinte Utilizado para identificação da DPS no Sistema interno do Contribuinte Utilizado para identificação da DPS no Sistema interno do Contribuinte +changed NFSe/infNFSe/DPS/infDPS/serv/cServ/xDescServ 197 234 E E C C 1-1 1-1 1000 2000 Descrição completa do serviço prestado Descrição completa do serviço prestado - - +unchanged NFSe/infNFSe/DPS/infDPS/serv/comExt 200 235 G G - - 0-1 0-1 - - Grupo de informações sobre transações entre residentes ou domiciliados no Brasil com residentes ou domiciliados no exterior Grupo de informações sobre transações entre residentes ou domiciliados no Brasil com residentes ou domiciliados no exterior - - +changed NFSe/infNFSe/DPS/infDPS/serv/comExt/mdPrestacao 201 236 E E N N 1-1 1-1 1 1 Modo de Prestação: 0 - Desconhecido (tipo não informado na nota de origem); 1 - Transfronteiriço; 2 - Consumo no Brasil; 3 - Movimento Temporário de Pessoas Físicas; 4 - Consumo no Exterior; Modo de Prestação: 0 - Desconhecido (tipo não informado na nota de origem); 1 - Transfronteiriço; 2 - Consumo no Brasil; 3 - Movimento Temporário de Pessoas Físicas; 4 - Consumo no Exterior; 5 - Consumo concomitante no território nacional e exterior; O valor 0 deve ser utilizado como opção de preenchimento do campo somente no compartilhamento de NFS-e pelo municipio com o ADN NFS-e. O tipo "0 - Desconhecido" deve ser utilizado como opção de preenchimento do campo somente no compartilhamento de NFS-e pelo município com o ADN NFS-e. No caso do tipo "5 - Consumo concomitante no território nacional e exterior": Na Importação: informar no campo vServ da DPS apenas a parcela consumida no país; Na Exportação: informar no campo vServ da DPS apenas a parcela exportada. Nesse caso, uma NFS-e regular deve ser emitida para a parcela consumida no país (não se enquadrando como exportação). +changed NFSe/infNFSe/DPS/infDPS/serv/comExt/vincPrest 202 237 E E N N 1-1 1-1 1 1 Vínculo entre as partes no negócio: 0 - Sem vínculo com o Tomador/Prestador 1 - Controlada; 2 - Controladora; 3 - Coligada; 4 - Matriz; 5 - Filial ou sucursal; 6 - Outro vínculo; 9 - Desconhecido (tipo não informado na nota de origem); Vínculo entre as partes no negócio: 0 - Sem vínculo com o Tomador/Prestador 1 - Controlada; 2 - Controladora; 3 - Coligada; 4 - Matriz; 5 - Filial ou sucursal; 6 - Outro vínculo; 9 - Desconhecido (tipo não informado na nota de origem); Adicionar ao Hint do campo: O adquirente/ Prestador do serviço é pessoa considerada vinculada ao prestador/ adquirente, nos termos do art. 23 da Lei nº 9.430, de 1996 +changed NFSe/infNFSe/DPS/infDPS/serv/comExt/tpMoeda 203 238 E E N N 1-1 1-1 3 3 Identifica a moeda da transação comercial. O usuário deve informar o código da moeda. Identifica a moeda da transação comercial. O usuário deve informar o código da moeda. inclusão, no Emissor Público, da tabela de moedas do Banco Central do Brasil para seleção pelo emitente da NFS-e. No Painel Nacional deverá haver função para atualização da tabela de Moedas. O código da moeda informado deve ser válido e estar vigente na data de competência da emissão da NFS-e, conforme tabela de moedas do Banco Central do Brasil. +added NFSe/infNFSe/DPS/infDPS/serv/comExt/nFatura 239 E N 0-1 1-20 Número da identificação da fatura de serviços ou do documento que comprove a transação (DECRETO Nº 12.955, DE 29 DE ABRIL DE 2026, Art. 74 § 1º ) Preencher apenas quando exigido documento fiscal para acobertar a importação do serviço, nos termos do Art. 74, §1º, do Decreto nº 12.955/2026 (aguarda ato conjunto RFB/CGIBS que definirá o escopo exato da exigência). +added NFSe/infNFSe/DPS/infDPS/serv/comExt/vFatura 240 E N 0-1 1-15V2 Valor total da fatura de serviços ou do documento que comprove a transação, expresso na moeda identificada em tpMoeda (DECRETO Nº 12.955, DE 29 DE ABRIL DE 2026, Art. 74, §1º). +changed NFSe/infNFSe/DPS/infDPS/serv/comExt/vServMoeda 204 241 E E N N 1-1 0-1 1-15V2 1-15V2 Valor do serviço prestado expresso em moeda estrangeira especificada em tpmoeda. Valor do serviço prestado expresso em moeda estrangeira especificada em tpmoeda. - - +changed NFSe/infNFSe/DPS/infDPS/serv/comExt/mecAFComexP 205 242 E E N N 1-1 1-1 2 2 Mecanismo de apoio/fomento ao Comércio Exterior utilizado pelo prestador do serviço: 00 - Desconhecido (tipo não informado na nota de origem); 01 - Nenhum; 02 - ACC - Adiantamento sobre Contrato de Câmbio – Redução a Zero do IR e do IOF; 03 - ACE – Adiantamento sobre Cambiais Entregues - Redução a Zero do IR e do IOF; 04 - BNDES-Exim Pós-Embarque – Serviços; 05 - BNDES-Exim Pré-Embarque - Serviços; 06 - FGE - Fundo de Garantia à Exportação; 07 - PROEX - EQUALIZAÇÃO 08 - PROEX - Financiamento; Mecanismo de apoio/fomento ao Comércio Exterior utilizado pelo prestador do serviço: 00 - Desconhecido (tipo não informado na nota de origem); 01 - Nenhum; 02 - ACC - Adiantamento sobre Contrato de Câmbio – Redução a Zero do IR e do IOF; 03 - ACE – Adiantamento sobre Cambiais Entregues - Redução a Zero do IR e do IOF; 04 - BNDES-Exim Pós-Embarque – Serviços; 05 - BNDES-Exim Pré-Embarque - Serviços; 06 - FGE - Fundo de Garantia à Exportação; 07 - PROEX - EQUALIZAÇÃO 08 - PROEX - Financiamento; Campo disponível na nota do prestador. O valor 0 deve ser utilizado como opção de preenchimento do campo somente no compartilhamento de NFS-e pelo municipio com o ADN NFS-e. Campo disponível na nota do prestador. O tipo "0 - Desconhecido" deve ser utilizado como opção de preenchimento do campo somente no compartilhamento de NFS-e pelo município com o ADN NFS-e. +changed NFSe/infNFSe/DPS/infDPS/serv/comExt/mecAFComexT 206 243 E E N N 1-1 1-1 2 2 Mecanismo de apoio/fomento ao Comércio Exterior utilizado pelo tomador do serviço: 00 - Desconhecido (tipo não informado na nota de origem); 01 - Nenhum; 02 - Adm. Pública e Repr. Internacional; 03 - Alugueis e Arrend. Mercantil de maquinas, equip., embarc. e aeronaves; 04 - Arrendamento Mercantil de aeronave para empresa de transporte aéreo público; 05 - Comissão a agentes externos na exportação; 06 - Despesas de armazenagem, mov. e transporte de carga no exterior; 07 - Eventos FIFA (subsidiária); 08 - Eventos FIFA; 09 - Fretes, arrendamentos de embarcações ou aeronaves e outros; 10 - Material Aeronáutico; 11 - Promoção de Bens no Exterior; 12 - Promoção de Dest. Turísticos Brasileiros; 13 - Promoção do Brasil no Exterior; 14 - Promoção Serviços no Exterior; 15 - RECINE; 16 - RECOPA; 17 - Registro e Manutenção de marcas, patentes e cultivares; 18 - REICOMP; 19 - REIDI; 20 - REPENEC; 21 - REPES; 22 - RETAERO; 23 - RETID; 24 - Royalties, Assistência Técnica, Científica e Assemelhados; 25 - Serviços de avaliação da conformidade vinculados aos Acordos da OMC; 26 - ZPE; Mecanismo de apoio/fomento ao Comércio Exterior utilizado pelo tomador do serviço: 00 - Desconhecido (tipo não informado na nota de origem); 01 - Nenhum; 02 - Adm. Pública e Repr. Internacional; 03 - Aluguéis e Arrend. Mercantil de maquinas, equip., embarc. e aeronaves; 04 - Arrendamento Mercantil de aeronave para empresa de transporte aéreo público; 05 - Comissão a agentes externos na exportação; 06 - Despesas de armazenagem, mov. e transporte de carga no exterior; 07 - Eventos FIFA (subsidiária); 08 - Eventos FIFA; 09 - Fretes, arrendamentos de embarcações ou aeronaves e outros; 10 - Material Aeronáutico; 11 - Promoção de Bens no Exterior; 12 - Promoção de Dest. Turísticos Brasileiros; 13 - Promoção do Brasil no Exterior; 14 - Promoção Serviços no Exterior; 15 - RECINE; 16 - RECOPA; 17 - Registro e Manutenção de marcas, patentes e cultivares; 18 - REICOMP; 19 - REIDI; 20 - REPENEC; 21 - REPES; 22 - RETAERO; 23 - RETID; 24 - Royalties, Assistência Técnica, Científica e Assemelhados; 25 - Serviços de avaliação da conformidade vinculados aos Acordos da OMC; 26 - ZPE; Campo disponível na nota do tomador. O valor 0 deve ser utilizado como opção de preenchimento do campo somente no compartilhamento de NFS-e pelo municipio com o ADN NFS-e. Campo disponível na nota do tomador. O tipo "0 - Desconhecido" deve ser utilizado como opção de preenchimento do campo somente no compartilhamento de NFS-e pelo município com o ADN NFS-e. +changed NFSe/infNFSe/DPS/infDPS/serv/comExt/movTempBens 207 244 E E N N 1-1 1-1 1 1 Vínculo da Operação à Movimentação Temporária de Bens: 0 - Desconhecido (tipo não informado na nota de origem); 1 - Não; 2 - Vinculada - Declaração de Importação; 3 - Vinculada - Declaração de Exportação; Vínculo da Operação à Movimentação Temporária de Bens: 0 - Desconhecido (tipo não informado na nota de origem); 1 - Não; 2 - Vinculada - Declaração Única de Importação; 3 - Vinculada - Declaração Única de Exportação; O valor 0 deve ser utilizado como opção de preenchimento do campo somente no compartilhamento de NFS-e pelo municipio com o ADN NFS-e. O tipo "0 - Desconhecido" deve ser utilizado como opção de preenchimento do campo somente no compartilhamento de NFS-e pelo município com o ADN NFS-e. +added NFSe/infNFSe/DPS/infDPS/serv/comExt/nDUIMP 245 E C 0-1 15 Número da Declaração Única de Importação (DUIMP) Este campo deve ser preenchido se for a prestação de serviço relacionado à cobrança do serviço de importação de um bem material. +added NFSe/infNFSe/DPS/infDPS/serv/comExt/nDUE 246 E C 0-1 14 Número da Declaração Única de Exportação (DU-E) Este campo deve ser preenchido se for a prestação de serviço relacionado à cobrança do serviço de exportação de um bem material. +unchanged NFSe/infNFSe/DPS/infDPS/serv/comExt/mdic 210 247 E E N N 1-1 1-1 1 1 Indicador se a NFS-e deverá ser disponibilizada ao MDIC. 0 - Não enviar para o MDIC; 1 - Enviar para o MDIC; Indicador se a NFS-e deverá ser disponibilizada ao MDIC. 0 - Não enviar para o MDIC; 1 - Enviar para o MDIC; - - +added NFSe/infNFSe/DPS/infDPS/serv/comExt/nContCambio 248 E N 0-1 1-20 Número da identificação do contrato de câmbio ou do documento que comprove o pagamento (Art. 74, § 1º, do DECRETO Nº 12.955, DE 29 DE ABRIL DE 2026, que Regulamenta a Contribuição Social sobre Bens e Serviços – CBS e dá outras providências.) +unchanged NFSe/infNFSe/DPS/infDPS/serv/obra 211 249 G G - - 0-1 0-1 - - Grupo de informações relativas à obras de construção civil e congêneres Grupo de informações relativas à obras de construção civil e congêneres - - +unchanged NFSe/infNFSe/DPS/infDPS/serv/obra/inscImobFisc 212 250 E E C C 0-1 0-1 1-30 1-30 Inscrição imobiliária fiscal (código fornecido pela prefeitura para a identificação da obra ou para fins de recolhimento do IPTU) Inscrição imobiliária fiscal (código fornecido pela prefeitura para a identificação da obra ou para fins de recolhimento do IPTU) - - +unchanged NFSe/infNFSe/DPS/infDPS/serv/obra/cObra 213 251 CE CE C C 1-1 1-1 1-30 1-30 Número de identificação da obra. Cadastro Nacional de Obras (CNO) ou Cadastro Específico do INSS (CEI). Número de identificação da obra. Cadastro Nacional de Obras (CNO) ou Cadastro Específico do INSS (CEI). - - +unchanged NFSe/infNFSe/DPS/infDPS/serv/obra/cCIB 214 252 CE CE C C 1-1 1-1 8 8 Código do Cadastro Imobiliário Brasileiro - CIB Código do Cadastro Imobiliário Brasileiro - CIB +unchanged NFSe/infNFSe/DPS/infDPS/serv/obra/end 215 253 CG CG - - 1-1 1-1 - - Grupo de informações do endereço da obra. Grupo de informações do endereço da obra. - - +unchanged NFSe/infNFSe/DPS/infDPS/serv/obra/end/CEP 216 254 CE CE C C 1-1 1-1 8 8 Código de Endereçamento Postal numérico do endereço nacional da obra. Código de Endereçamento Postal numérico do endereço nacional da obra. - - +unchanged NFSe/infNFSe/DPS/infDPS/serv/obra/end/endExt 217 255 CG CG - - 1-1 1-1 - - Grupo de informações descritivas do endereço no exterior da obra. Grupo de informações descritivas do endereço no exterior da obra. - - +unchanged NFSe/infNFSe/DPS/infDPS/serv/obra/end/endExt/cEndPost 218 256 E E C C 1-1 1-1 1-11 1-11 Código de Endereçamento Postal alfanumérico do endereço no exterior da obra. Código de Endereçamento Postal alfanumérico do endereço no exterior da obra. - - +unchanged NFSe/infNFSe/DPS/infDPS/serv/obra/end/endExt/xCidade 219 257 E E C C 1-1 1-1 1-60 1-60 Nome da cidade no exterior, local da obra. Nome da cidade no exterior, local da obra. - - +unchanged NFSe/infNFSe/DPS/infDPS/serv/obra/end/endExt/xEstProvReg 220 258 E E C C 1-1 1-1 1-60 1-60 Estado, província ou região da cidade no exterior, local da obra. Estado, província ou região da cidade no exterior, local da obra. - - +unchanged NFSe/infNFSe/DPS/infDPS/serv/obra/end/xLgr 221 259 E E C C 1-1 1-1 1-255 1-255 Tipo e nome do logradouro do endereço da obra. Tipo e nome do logradouro do endereço da obra. - - +unchanged NFSe/infNFSe/DPS/infDPS/serv/obra/end/nro 222 260 E E C C 1-1 1-1 1-60 1-60 Número no logradouro do endereço da obra. Número no logradouro do endereço da obra. - - +unchanged NFSe/infNFSe/DPS/infDPS/serv/obra/end/xCpl 223 261 E E C C 0-1 0-1 1-156 1-156 Complemento do endereço da obra. Complemento do endereço da obra. - - +unchanged NFSe/infNFSe/DPS/infDPS/serv/obra/end/xBairro 224 262 E E C C 1-1 1-1 1-60 1-60 Bairro do endereço da obra. Bairro do endereço da obra. - - +changed NFSe/infNFSe/DPS/infDPS/serv/atvEvento 225 263 G G - - 0-1 0-1 - - Grupo de informações relativas à atividades de eventos Grupo de informações relativas às atividades de eventos - - +unchanged NFSe/infNFSe/DPS/infDPS/serv/atvEvento/xNome 226 264 E E C C 1-1 1-1 255 255 Nome do evento Artístico, Cultural, Esportivo, ... Nome do evento Artístico, Cultural, Esportivo, ... - - +unchanged NFSe/infNFSe/DPS/infDPS/serv/atvEvento/dtIni 227 265 E E D D 1-1 1-1 - - Data de início da atividade de evento. Ano, Mês e Dia (AAAA-MM-DD) Data de início da atividade de evento. Ano, Mês e Dia (AAAA-MM-DD) - - +unchanged NFSe/infNFSe/DPS/infDPS/serv/atvEvento/dtFim 228 266 E E D D 1-1 1-1 - - Data de fim da atividade de evento. Ano, Mês e Dia (AAAA-MM-DD) Data de fim da atividade de evento. Ano, Mês e Dia (AAAA-MM-DD) - - +added NFSe/infNFSe/DPS/infDPS/serv/atvEvento/cMun 267 E N 0-1 7 Código do município da localidade do evento. (Tabela do IBGE) Essa informação só deve ser fornecida pelo emitente quando: 1) Forem serviços dos subitens 12.13 e 17.10; e 2) O local do evento for diverso do local da prestação do serviço. Para os demais casos, o local do evento será o próprio local da prestação do serviço e, portanto, esse campo não deverá ser informado. +unchanged NFSe/infNFSe/DPS/infDPS/serv/atvEvento/idAtvEvt 229 268 CE CE C C 1-1 1-1 1-30 1-30 Identificação da Atividade de Evento (código identificador de evento determinado pela Administração Tributária Municipal) Identificação da Atividade de Evento (código identificador de evento determinado pela Administração Tributária Municipal) Choice com o grupo de endereço da atividade de evento Choice com o grupo de endereço da atividade de evento +unchanged NFSe/infNFSe/DPS/infDPS/serv/atvEvento/end 230 269 CG CG - - 1-1 1-1 - - Grupo de informações do endereço da atividade de evento. Grupo de informações do endereço da atividade de evento. Choice com o grupo de endereço da atividade de evento Choice com o grupo de endereço da atividade de evento +unchanged NFSe/infNFSe/DPS/infDPS/serv/atvEvento/end/CEP 231 270 CE CE C C 1-1 1-1 8 8 Código de Endereçamento Postal numérico do endereço nacional da atividade de evento. Código de Endereçamento Postal numérico do endereço nacional da atividade de evento. Choice com o grupo de endereço da atividade de evento Choice com o grupo de endereço da atividade de evento +unchanged NFSe/infNFSe/DPS/infDPS/serv/atvEvento/end/endExt 232 271 CG CG - - 1-1 1-1 - - Grupo de informações descritivas do endereço no exterior da atividade de evento. Grupo de informações descritivas do endereço no exterior da atividade de evento. Choice com o grupo de endereço da atividade de evento Choice com o grupo de endereço da atividade de evento +unchanged NFSe/infNFSe/DPS/infDPS/serv/atvEvento/end/endExt/cEndPost 233 272 E E C C 1-1 1-1 11 11 Código de Endereçamento Postal alfanumérico do endereço no exterior da atividade de evento. Código de Endereçamento Postal alfanumérico do endereço no exterior da atividade de evento. Choice com o grupo de endereço da atividade de evento Choice com o grupo de endereço da atividade de evento +unchanged NFSe/infNFSe/DPS/infDPS/serv/atvEvento/end/endExt/xCidade 234 273 E E C C 1-1 1-1 1-60 1-60 Nome da cidade no exterior, local da atividade de evento. Nome da cidade no exterior, local da atividade de evento. Choice com o grupo de endereço da atividade de evento Choice com o grupo de endereço da atividade de evento +unchanged NFSe/infNFSe/DPS/infDPS/serv/atvEvento/end/endExt/xEstProvReg 235 274 E E C C 1-1 1-1 1-60 1-60 Estado, província ou região da cidade no exterior, local da atividade de evento. Estado, província ou região da cidade no exterior, local da atividade de evento. Choice com o grupo de endereço da atividade de evento Choice com o grupo de endereço da atividade de evento +unchanged NFSe/infNFSe/DPS/infDPS/serv/atvEvento/end/xLgr 236 275 E E C C 1-1 1-1 1-255 1-255 Tipo e nome do logradouro do endereço da atividade de evento. Tipo e nome do logradouro do endereço da atividade de evento. Choice com o grupo de endereço da atividade de evento Choice com o grupo de endereço da atividade de evento +unchanged NFSe/infNFSe/DPS/infDPS/serv/atvEvento/end/nro 237 276 E E C C 1-1 1-1 1-60 1-60 Número no logradouro do endereço da atividade de evento. Número no logradouro do endereço da atividade de evento. Choice com o grupo de endereço da atividade de evento Choice com o grupo de endereço da atividade de evento +unchanged NFSe/infNFSe/DPS/infDPS/serv/atvEvento/end/xCpl 238 277 E E C C 0-1 0-1 1-156 1-156 Complemento do endereço da atividade de evento. Complemento do endereço da atividade de evento. Choice com o grupo de endereço da atividade de evento Choice com o grupo de endereço da atividade de evento +unchanged NFSe/infNFSe/DPS/infDPS/serv/atvEvento/end/xBairro 239 278 E E C C 1-1 1-1 1-60 1-60 Bairro do endereço da atividade de evento. Bairro do endereço da atividade de evento. Choice com o grupo de endereço da atividade de evento Choice com o grupo de endereço da atividade de evento +unchanged NFSe/infNFSe/DPS/infDPS/serv/infoCompl 240 279 G G - - 0-1 0-1 - - Grupo de informações complementares disponível para todos os serviços prestados Grupo de informações complementares disponível para todos os serviços prestados Campos possíveis de preenchimento na DPS para todos os subitens da lista de serviços que forem prestados Campos possíveis de preenchimento na DPS para todos os subitens da lista de serviços que forem prestados +unchanged NFSe/infNFSe/DPS/infDPS/serv/infoCompl/idDocTec 241 280 E E C C 0-1 0-1 1-40 1-40 Identificador de Documento de Responsabilidade Técnica: ART, RRT, DRT, Outros. Identificador de Documento de Responsabilidade Técnica: ART, RRT, DRT, Outros. +unchanged NFSe/infNFSe/DPS/infDPS/serv/infoCompl/docRef 242 281 E E C C 0-1 0-1 1-255 1-255 Chave da nota, número identificador da nota, número do contrato ou outro identificador de documento emitido pelo prestador de serviços, que subsidia a emissão dessa nota pelo tomador do serviço ou intermediário (preenchimento obrigatório caso a nota esteja sendo emitida pelo Tomador ou intermediário do serviço). Chave da nota, número identificador da nota, número do contrato ou outro identificador de documento emitido pelo prestador de serviços, que subsidia a emissão dessa nota pelo tomador do serviço ou intermediário (preenchimento obrigatório caso a nota esteja sendo emitida pelo Tomador ou intermediário do serviço). +unchanged NFSe/infNFSe/DPS/infDPS/serv/infoCompl/xPed 243 282 E E C C 0-1 0-1 1-60 1-60 Número do pedido/ordem de compra/ordem de serviço/projeto que autorize a prestação do serviço em operações B2B - Informação de interesse do tomador do serviço para controle e gestão da Negociação Número do pedido/ordem de compra/ordem de serviço/projeto que autorize a prestação do serviço em operações B2B - Informação de interesse do tomador do serviço para controle e gestão da Negociação +unchanged NFSe/infNFSe/DPS/infDPS/serv/infoCompl/gItemPed 244 283 G G - - 0-1 0-1 - - Grupo de itens do pedido/ordem de compra/ordem de serviço/projeto. Grupo de itens do pedido/ordem de compra/ordem de serviço/projeto. +unchanged NFSe/infNFSe/DPS/infDPS/serv/infoCompl/gItemPed/xItemPed 245 284 E E C C 1-99 1-99 1-60 1-60 Número do item do pedido/ordem de compra/ordem de serviço/projeto - Identificação do número do item do pedido ou ordem de compra destacado e xPed Número do item do pedido/ordem de compra/ordem de serviço/projeto - Identificação do número do item do pedido ou ordem de compra destacado e xPed +unchanged NFSe/infNFSe/DPS/infDPS/serv/infoCompl/xInfComp 246 285 E E C C 0-1 0-1 2000 2000 Campo livre para preenchimento pelo contribuinte. Campo livre para preenchimento pelo contribuinte. +changed NFSe/infNFSe/DPS/infDPS/valores 247 286 G G - - 1-1 0-1 - - Grupo de informações relativas à valores do serviço prestado Grupo de informações relativas à valores do serviço prestado - - +unchanged NFSe/infNFSe/DPS/infDPS/valores/vServPrest 248 287 G G - - 1-1 1-1 - - Grupo de informações relativas aos valores do serviço prestado Grupo de informações relativas aos valores do serviço prestado - - +unchanged NFSe/infNFSe/DPS/infDPS/valores/vServPrest/vReceb 249 288 E E N N 0-1 0-1 1-15V2 1-15V2 Valor monetário recebido pelo intermediário do serviço (R$). Valor monetário recebido pelo intermediário do serviço (R$). - - +changed NFSe/infNFSe/DPS/infDPS/valores/vServPrest/vServ 250 289 E E N N 1-1 1-1 1-15V2 1-15V2 Valor monetário do serviço (R$). Valor monetário do serviço (R$). OBS1: Para os códigos de tributação nacional do subitem 99.03 (locações e equiparados), vServ = pCopropriedade x vTotOper OBS2: Para os códigos de tributação nacional do subitem 99.05 (condomínios), vServ = ∑ vCobranca. - half even com tolerância de R$0,01 +unchanged NFSe/infNFSe/DPS/infDPS/valores/vDescCondIncond 251 290 G G - - 0-1 0-1 - - Grupo de informações relativas aos descontos condicionados e incondicionados Grupo de informações relativas aos descontos condicionados e incondicionados - - +changed NFSe/infNFSe/DPS/infDPS/valores/vDescCondIncond/vDescIncond 252 291 E E N N 0-1 0-1 1-15V2 1-15V2 Valor monetário do desconto incondicionado (R$). Valor monetário do desconto incondicionado (R$). OBS1: Para os códigos de tributação nacional do subitem 99.03, vDescIncond = pCopropriedade x vDescIncondTot OBS2: Para os códigos de tributação nacional do subitem 99.05 (condomínios), vDescIncond = ∑ vDesconto do tipo (tpDesconto) 1 - Desconto Incondicionado. - half even com tolerância de R$0,01 +changed NFSe/infNFSe/DPS/infDPS/valores/vDescCondIncond/vDescCond 253 292 E E N N 0-1 0-1 1-15V2 1-15V2 Valor monetário do desconto condicionado (R$). Valor monetário do desconto condicionado (R$). OBS1: Para os códigos de tributação nacional do subitem 99.03, vDescCond = pCopropriedade x vDescCondTot) OBS2: Para os códigos de tributação nacional do subitem 99.05 (condomínios), vDescIncond = ∑ vDesconto do tipo (tpDesconto) 2 - Desconto Condicionado. - half even com tolerância de R$0,01 +added NFSe/infNFSe/DPS/infDPS/valores/vAjusteBC 293 G - 0-1 - Grupo de informações relativas ao valores para ajuste dos valores de base de cálculo. Aqui são referenciados os ajustes (deduções/reduções) que serão considerados apenas para a Base de Cálculo do ISSQN. +added NFSe/infNFSe/DPS/infDPS/valores/vAjusteBC/pAjusteBCISSQN 294 E N 0-1 1-3V2 Valor percentual padrão para ajuste dos valores de base de cálculo do ISSQN. As três opções para informação de Ajuste (Dedução/Redução), caso exista, são: Valor, Percentual ou Documento; +added NFSe/infNFSe/DPS/infDPS/valores/vAjusteBC/vAjusteBCISSQN 295 E N 0-1 1-15V2 Valor monetário padrão para ajuste dos valores de base de cálculo do ISSQN As três opções para informação de Ajuste (Dedução/Redução), caso exista, são: Valor, Percentual ou Documento; +added NFSe/infNFSe/DPS/infDPS/valores/vAjusteBC/documentos 296 G - 0-1 - Grupo de informações de documento utilizado para ajuste dos valores de base de cálculo (ISSQN e/ou IBS/CBS). As três opções para informação de Ajuste (Dedução/Redução), caso exista, são: Valor, Percentual ou Documento; +added NFSe/infNFSe/DPS/infDPS/valores/vAjusteBC/documentos/docAjusteBC 297 G - 1-1000 - Grupo de informações de documento utilizado para ajuste dos valores de base de cálculo (ISSQN e/ou IBS/CBS). As três opções para informação de Ajuste (Dedução/Redução), caso exista, são: Valor, Percentual ou Documento; +added NFSe/infNFSe/DPS/infDPS/valores/vAjusteBC/documentos/docAjusteBC/tpAjusteBC 298 E N 1-1 1-3 Tipo de Ajuste: 1 – Alimentação e bebidas/frigobar; 2 – Materiais; 3 - Produção Externa; 4 - Reembolso de despesas; 5 – Repasse consorciado; 6 – Repasse plano de saúde; 7 – Serviços; 8 – Subempreitada de mão de obra; 9 - Profissional parceiro; 99 – Outras deduções exclusivas do ISSQN; 101 – Repasse de remuneração por intermediação de imóveis a demais corretores envolvidos na operação 102 – Repasse de valores a fornecedor relativo a fornecimento intermediado por agência de turismo 103 – Reembolso ou ressarcimento recebido por agência de propaganda e publicidade por valores pagos relativos a serviços de produção externa por conta e ordem de terceiro 104 – Reembolso ou ressarcimento recebido por agência de propaganda e publicidade por valores pagos relativos a serviços de mídia por conta e ordem de terceiro 105 – Glosa de Serviços de Saúde 199 – Outros reembolsos ou ressarcimentos recebidos por valores pagos relativos a operações por conta e ordem de terceiro Verificar a planilha AJUSTE.BC.REPERCUSSÃO com os tipos de ajuste e as respectivas repercussões nas bases de cálculo do ISSQN, do IBS/CBS e da Receita Bruta do Simples Nacional. +added NFSe/infNFSe/DPS/infDPS/valores/vAjusteBC/documentos/docAjusteBC/xTpAjusteBC 299 E C 0-1 0-150 Descrição do ajuste quando o tipo informado (tpAjusteBC) é "99 – Outras deduções exclusivas do ISSQN" ou "199 – Outros reembolsos ou ressarcimentos recebidos por valores pagos relativos a operações por conta e ordem de terceiro". - +added NFSe/infNFSe/DPS/infDPS/valores/vAjusteBC/documentos/docAjusteBC/vTotDoc 300 E N 1-1 1-15V2 Valor monetário total do documento informado (R$). Este é o valor total no documento informado que é passível de ajuste de base(s) de cálculo. - +added NFSe/infNFSe/DPS/infDPS/valores/vAjusteBC/documentos/docAjusteBC/vAjusteAplic 301 E N 1-1 1-15V2 Valor monetário efetivamente utilizado para ajuste de base(s) de cálculo do valor do serviço da NFS-e que está sendo emitida (R$). Deve ser menor ou igual ao valor total do documento (vTotDoc). - +added NFSe/infNFSe/DPS/infDPS/valores/vAjusteBC/documentos/docAjusteBC/dtEmiDoc 302 E D 0-1 - Data da emissão do documento dedutível. Ano, mês e dia (AAAA-MM-DD) - +added NFSe/infNFSe/DPS/infDPS/valores/vAjusteBC/documentos/docAjusteBC/dtCompDoc 303 E D 0-1 - Data da competência do documento dedutível. Ano, mês e dia (AAAA-MM-DD) - +added NFSe/infNFSe/DPS/infDPS/valores/vAjusteBC/documentos/docAjusteBC/dFeNacional 304 CG CG 1-1 - Grupo de informações de documentos fiscais eletrônicos que se encontram no repositório nacional. - +added NFSe/infNFSe/DPS/infDPS/valores/vAjusteBC/documentos/docAjusteBC/dFeNacional/tipoChaveDFe 305 E N 1-1 1 Documento fiscal a que se refere a chaveDfe que seja um dos documentos do Repositório Nacional: 1 = NFS-e; 2 = NF-e; 3 = CT-e; 9 = Outro; - +added NFSe/infNFSe/DPS/infDPS/valores/vAjusteBC/documentos/docAjusteBC/dFeNacional/xTipoChaveDFe 306 E C 0-1 1-255 Descrição da DF-e a que se refere a chaveDfe que seja um dos documentos do Repositório Nacional. Deve ser preenchido apenas quando tipoChaveDFe = 9 (Outro). - +added NFSe/infNFSe/DPS/infDPS/valores/vAjusteBC/documentos/docAjusteBC/dFeNacional/chaveDFe 307 E C 1-1 1-50 Chave do Documento Fiscal eletrônico do repositório nacional referenciado para os casos de operações já tributadas. - +added NFSe/infNFSe/DPS/infDPS/valores/vAjusteBC/documentos/docAjusteBC/docFiscalOutro 308 CG CG 1-1 - Grupo de informações de documento fiscais, eletrônicos ou não, que não se encontram no repositório nacional. - +added NFSe/infNFSe/DPS/infDPS/valores/vAjusteBC/documentos/docAjusteBC/docFiscalOutro/cMunDocFiscal 309 E N 1-1 7 Código do município emissor do documento fiscal que não se encontra no repositório nacional - +added NFSe/infNFSe/DPS/infDPS/valores/vAjusteBC/documentos/docAjusteBC/docFiscalOutro/nDocFiscal 310 E C 1-1 1-255 Número do documento fiscal que não se encontra no repositório nacional - +added NFSe/infNFSe/DPS/infDPS/valores/vAjusteBC/documentos/docAjusteBC/docFiscalOutro/xDocFiscal 311 E C 1-1 1-255 Descrição do documento fiscal - +added NFSe/infNFSe/DPS/infDPS/valores/vAjusteBC/documentos/docAjusteBC/docOutro 312 CG CG 1-1 - Grupo de informações de documento não fiscal. O grupo de informações de documentos para ajuste (dedução/redução) pode não ter correspondência para Municípios que não utilizem o padrão ABRASF na versão 2.04. Nesse caso, sugere-se que o Município que vai utilizar a transcrição da NFS-e do padrão de seu emissor para o padrão nacional, para encaminhamento ao ADN, apenas para essa fase inicial de implantação do padrão, utilize nessa operação o valor obtido como ajuste (dedução/redução) e o informe como “valor monetário”, e não “documentos”. Nesse sentido, também o Painel Administrativo Municipal deve ser parametrizado como ajuste por “valor monetário” para o código de serviço correspondente, até que seu emissor próprio passe a refletir na origem o padrão nacional. Importante esclarecer que quando o tipo de ajuste for "Profissional Parceiro" (tpAjusteBC = 9), pode-se vinculá-lo a um documento não fiscal (nDoc). +added NFSe/infNFSe/DPS/infDPS/valores/vAjusteBC/documentos/docAjusteBC/docOutro/nDoc 313 E C 1-1 1-255 Número do documento não fiscal. - +added NFSe/infNFSe/DPS/infDPS/valores/vAjusteBC/documentos/docAjusteBC/docOutro/xDoc 314 E C 1-1 1-255 Descrição do documento não fiscal. - +added NFSe/infNFSe/DPS/infDPS/valores/vAjusteBC/documentos/docAjusteBC/fornec 315 G - 0-1 - Grupo de informações do fornecedor do serviço prestado - +added NFSe/infNFSe/DPS/infDPS/valores/vAjusteBC/documentos/docAjusteBC/fornec/CNPJ 316 CE C 1-1 14 Número da inscrição federal (CNPJ) do fornecedor de serviço. - +added NFSe/infNFSe/DPS/infDPS/valores/vAjusteBC/documentos/docAjusteBC/fornec/CPF 317 CE N 1-1 11 Número da inscrição federal (CPF) do fornecedor do serviço. - +added NFSe/infNFSe/DPS/infDPS/valores/vAjusteBC/documentos/docAjusteBC/fornec/NIF 318 CE C 1-1 40 Este elemento só deverá ser preenchido para fornecedores não residentes no Brasil. - +added NFSe/infNFSe/DPS/infDPS/valores/vAjusteBC/documentos/docAjusteBC/fornec/cNaoNIF 319 CE N 1-1 1 Motivo para não informação do NIF: 0 - Não informado na nota de origem; 1 - Dispensado do NIF; 2 - Não exigência do NIF; O valor 0 deve ser utilizado como opção de preenchimento do campo somente no compartilhamento de NFS-e pelo município com o ADN NFS-e. +added NFSe/infNFSe/DPS/infDPS/valores/vAjusteBC/documentos/docAjusteBC/fornec/xNome 320 E C 1-1 150 Nome / Razão Social do fornecedor. - +added NFSe/infNFSe/DPS/infDPS/valores/vAjusteBC/documentos/docAjusteBC/fornec/end 321 G - 0-1 - Grupo de informações do endereço do fornecedor. - +added NFSe/infNFSe/DPS/infDPS/valores/vAjusteBC/documentos/docAjusteBC/fornec/end/endNac 322 CG - 1-1 - Grupo de informações do endereço nacional. - +added NFSe/infNFSe/DPS/infDPS/valores/vAjusteBC/documentos/docAjusteBC/fornec/end/endNac/cMun 323 E N 1-1 7 Código do município do endereço do fornecedor. (Tabela do IBGE) - +added NFSe/infNFSe/DPS/infDPS/valores/vAjusteBC/documentos/docAjusteBC/fornec/end/endNac/CEP 324 E C 1-1 8 Código numérico do Endereçamento Postal nacional (CEP) do endereço do fornecedor. - +added NFSe/infNFSe/DPS/infDPS/valores/vAjusteBC/documentos/docAjusteBC/fornec/end/endExt 325 CG - 1-1 - Grupo de informações do endereço no exterior. - +added NFSe/infNFSe/DPS/infDPS/valores/vAjusteBC/documentos/docAjusteBC/fornec/end/endExt/cPais 326 E C 1-1 2 Código do país do endereço do prestador do fornecedor. (Tabela de Países ISO) - +added NFSe/infNFSe/DPS/infDPS/valores/vAjusteBC/documentos/docAjusteBC/fornec/end/endExt/cEndPost 327 E C 1-1 1-11 Código alfanumérico do Endereçamento Postal no exterior do fornecedor. - +added NFSe/infNFSe/DPS/infDPS/valores/vAjusteBC/documentos/docAjusteBC/fornec/end/endExt/xCidade 328 E C 1-1 1-60 Nome da cidade no exterior do fornecedor. - +added NFSe/infNFSe/DPS/infDPS/valores/vAjusteBC/documentos/docAjusteBC/fornec/end/endExt/xEstProvReg 329 E C 1-1 1-60 Estado, província ou região da cidade no exterior do fornecedor. - +added NFSe/infNFSe/DPS/infDPS/valores/vAjusteBC/documentos/docAjusteBC/fornec/xLgr 330 E C 1-1 1-255 Tipo e nome do logradouro do endereço do fornecedor. - +added NFSe/infNFSe/DPS/infDPS/valores/vAjusteBC/documentos/docAjusteBC/fornec/nro 331 E C 1-1 1-60 Número no logradouro do endereço do fornecedor. - +added NFSe/infNFSe/DPS/infDPS/valores/vAjusteBC/documentos/docAjusteBC/fornec/xCpl 332 E C 0-1 1-156 Complemento do endereço do fornecedor. - +added NFSe/infNFSe/DPS/infDPS/valores/vAjusteBC/documentos/docAjusteBC/fornec/xBairro 333 E C 1-1 1-60 Bairro do endereço do fornecedor. - +added NFSe/infNFSe/DPS/infDPS/valores/vAjusteBC/documentos/docAjusteBC/fornec/fone 334 E N 0-1 6-20 Número do telefone do fornecedor. (Preencher com o Código DDD + número do telefone. Nas operações com exterior é permitido informar o código do país + código da localidade + número do telefone) - +added NFSe/infNFSe/DPS/infDPS/valores/vAjusteBC/documentos/docAjusteBC/fornec/email 335 E C 0-1 1-80 E-mail do fornecedor. - +added NFSe/infNFSe/DPS/infDPS/valores/vAjusteBC/vAjusteBCIBSCBSComExt 336 E N 0-1 1-15V2 Valor monetário padrão para ajuste dos valores de base de cálculo do IBS/CBS nos casos de Comércio Exterior. +changed NFSe/infNFSe/DPS/infDPS/valores/trib 299 337 G G - - 1-1 0-1 - - Grupo de informações relacionados aos tributos relacionados ao serviço prestado Grupo de informações relacionados aos tributos relacionados ao serviço prestado - - +unchanged NFSe/infNFSe/DPS/infDPS/valores/trib/tribMun 300 338 G G - - 1-1 1-1 - - Grupo de informações relacionados ao Imposto Sobre Serviços de Qualquer Natureza - ISSQN Grupo de informações relacionados ao Imposto Sobre Serviços de Qualquer Natureza - ISSQN - - +unchanged NFSe/infNFSe/DPS/infDPS/valores/trib/tribMun/tribISSQN 301 339 E E N N 1-1 1-1 1 1 Tributação do ISSQN sobre o serviço prestado: 1 - Operação tributável; 2 - Imunidade; 3 - Exportação de serviço; 4 - Não Incidência; Tributação do ISSQN sobre o serviço prestado: 1 - Operação tributável; 2 - Imunidade; 3 - Exportação de serviço; 4 - Não Incidência; - - +unchanged NFSe/infNFSe/DPS/infDPS/valores/trib/tribMun/cPaisResult 302 340 E E C C 0-1 0-1 2 2 Código do país onde ocorreu o resultado do serviço prestado. (Tabela de Países ISO) Código do país onde ocorreu o resultado do serviço prestado. (Tabela de Países ISO) Se houver indicação pelo emitente de exportação de serviço, mesmo não havendo nenhum elemento para a ocorrência de exportação, então o emitente deve indicar em qual país ocorreu o resultado do serviço prestado. Se houver indicação pelo emitente de exportação de serviço, mesmo não havendo nenhum elemento para a ocorrência de exportação, então o emitente deve indicar em qual país ocorreu o resultado do serviço prestado. +changed NFSe/infNFSe/DPS/infDPS/valores/trib/tribMun/tpImunidade 303 341 E E N N 0-1 0-1 1 1 Identificação da Imunidade do ISSQN – somente para o caso de Imunidade. Tipos de Imunidades: 0 - Imunidade (tipo não informado na nota de origem); 1 - Patrimônio, renda ou serviços, uns dos outros (CF88, Art 150, VI, a); 2 - Entidades religiosas e templos de qualquer culto, inclusive suas organizações assistenciais e beneficentes (CF88, Art 150, VI, b); 3 - Patrimônio, renda ou serviços dos partidos políticos, inclusive suas fundações, das entidades sindicais dos trabalhadores, das instituições de educação e de assistência social, sem fins lucrativos, atendidos os requisitos da lei (CF88, Art 150, VI, c); 4 - Livros, jornais, periódicos e o papel destinado a sua impressão (CF88, Art 150, VI, d); 5 - Fonogramas e videofonogramas musicais produzidos no Brasil contendo obras musicais ou literomusicais de autores brasileiros e/ou obras em geral interpretadas por artistas brasileiros bem como os suportes materiais ou arquivos digitais que os contenham, salvo na etapa de replicação industrial de mídias ópticas de leitura a laser. (CF88, Art 150, VI, e); Identificação da Imunidade do ISSQN – somente para o caso de Imunidade. Tipos de Imunidades: 0 - Imunidade (tipo não informado na nota de origem); 1 - Patrimônio, renda ou serviços, uns dos outros (CF88, Art 150, VI, a); 2 - Entidades religiosas e templos de qualquer culto, inclusive suas organizações assistenciais e beneficentes (CF88, Art 150, VI, b); 3 - Patrimônio, renda ou serviços dos partidos políticos, inclusive suas fundações, das entidades sindicais dos trabalhadores, das instituições de educação e de assistência social, sem fins lucrativos, atendidos os requisitos da lei (CF88, Art 150, VI, c); 4 - Livros, jornais, periódicos e o papel destinado a sua impressão (CF88, Art 150, VI, d); 5 - Fonogramas e videofonogramas musicais produzidos no Brasil contendo obras musicais ou literomusicais de autores brasileiros e/ou obras em geral interpretadas por artistas brasileiros bem como os suportes materiais ou arquivos digitais que os contenham, salvo na etapa de replicação industrial de mídias ópticas de leitura a laser. (CF88, Art 150, VI, e); O valor 0 deve ser utilizado como opção de preenchimento do campo somente no compartilhamento de NFS-e pelo municipio com o ADN NFS-e. O valor 0 deve ser utilizado como opção de preenchimento do campo somente no compartilhamento de NFS-e pelo município com o ADN NFS-e. +unchanged NFSe/infNFSe/DPS/infDPS/valores/trib/tribMun/exigSusp 304 342 G G - - 0-1 0-1 - - Informações para a suspensão da Exigibilidade do ISSQN Informações para a suspensão da Exigibilidade do ISSQN - - +unchanged NFSe/infNFSe/DPS/infDPS/valores/trib/tribMun/exigSusp/tpSusp 305 343 E E N N 1-1 1-1 1 1 Opção para Exigibilidade Suspensa: 1 - Exigibilidade do ISSQN Suspensa por Decisão Judicial; 2 - Exigibilidade do ISSQN Suspensa por Processo Administrativo; Opção para Exigibilidade Suspensa: 1 - Exigibilidade do ISSQN Suspensa por Decisão Judicial; 2 - Exigibilidade do ISSQN Suspensa por Processo Administrativo; - - +unchanged NFSe/infNFSe/DPS/infDPS/valores/trib/tribMun/exigSusp/nProcesso 306 344 E E C C 1-1 1-1 30 30 Número do processo judicial ou administrativo de suspensão da exigibilidade. Número do processo judicial ou administrativo de suspensão da exigibilidade. - - +unchanged NFSe/infNFSe/DPS/infDPS/valores/trib/tribMun/BM 307 345 G G - - 0-1 0-1 - - Grupo de informações sobre o tipo do Benefício Municipal Grupo de informações sobre o tipo do Benefício Municipal - - +unchanged NFSe/infNFSe/DPS/infDPS/valores/trib/tribMun/BM/nBM 308 346 E E N N 1-1 1-1 14 14 Identificador do benefício parametrizado pelo município. Trata-se de um identificador único que foi gerado pelo Sistema Nacional no momento em que o município de incidência do ISSQN incluiu o benefício no sistema. Critério de formação do número de identificação de parâmetros municipais: 7 dígitos - posição 1 a 7: número identificador do Município, conforme código IBGE; 2 dígitos - posições 8 e 9 : número identificador do tipo de parametrização (01-legislação, 02-regimes especiais, 03-retenções, 04-outros benefícios); 5 dígitos - posição 10 a 14 : número sequencial definido pelo sistema quando do registro específico do parâmetro dentro do tipo de parametrização no sistema; Identificador do benefício parametrizado pelo município. Trata-se de um identificador único que foi gerado pelo Sistema Nacional no momento em que o município de incidência do ISSQN incluiu o benefício no sistema. Critério de formação do número de identificação de parâmetros municipais: 7 dígitos - posição 1 a 7: número identificador do Município, conforme código IBGE; 2 dígitos - posições 8 e 9 : número identificador do tipo de parametrização (01-legislação, 02-regimes especiais, 03-retenções, 04-outros benefícios); 5 dígitos - posição 10 a 14 : número sequencial definido pelo sistema quando do registro específico do parâmetro dentro do tipo de parametrização no sistema; Trata-se de um identificador único que foi gerado pelo Sistema Nacional no momento em que o município de incidência do ISSQN incluiu o benefício no sistema. Critério de formação do número de identificação de parâmetros municipais: 7 dígitos - posição 1 a 7: número identificador do Município, conforme código IBGE; 2 dígitos - posições 8 e 9 : número identificador do tipo de parametrização (01-legislação, 02-regimes especiais, 03-retenções, 04-outros benefícios); 5 dígitos - posição 10 a 14 : número sequencial definido pelo sistema quando do registro específico do parâmetro dentro do tipo de parametrização no sistema; O emitente poderá obter essa informação de parametrização do município através de API própria que dará publicidade às parametrizações dos municípios. Trata-se de um identificador único que foi gerado pelo Sistema Nacional no momento em que o município de incidência do ISSQN incluiu o benefício no sistema. Critério de formação do número de identificação de parâmetros municipais: 7 dígitos - posição 1 a 7: número identificador do Município, conforme código IBGE; 2 dígitos - posições 8 e 9 : número identificador do tipo de parametrização (01-legislação, 02-regimes especiais, 03-retenções, 04-outros benefícios); 5 dígitos - posição 10 a 14 : número sequencial definido pelo sistema quando do registro específico do parâmetro dentro do tipo de parametrização no sistema; O emitente poderá obter essa informação de parametrização do município através de API própria que dará publicidade às parametrizações dos municípios. +unchanged NFSe/infNFSe/DPS/infDPS/valores/trib/tribMun/BM/vRedBCBM 309 347 E E N N 0-1 0-1 1-15V2 1-15V2 Valor monetário (R$) informado pelo emitente para redução da base de cálculo (BC) do ISSQN devido a um Benefício Municipal (BM). Valor monetário (R$) informado pelo emitente para redução da base de cálculo (BC) do ISSQN devido a um Benefício Municipal (BM). - - +unchanged NFSe/infNFSe/DPS/infDPS/valores/trib/tribMun/BM/pRedBCBM 310 348 E E N N 0-1 0-1 1-3V2 1-3V2 Valor percentual (%) informado pelo emitente para redução da base de cálculo (BC) do ISSQN devido a um Benefício Municipal (BM). Valor percentual (%) informado pelo emitente para redução da base de cálculo (BC) do ISSQN devido a um Benefício Municipal (BM). O limite para este valor percentual informado pelo emitente está previamente parametrizado pelo município de incidência no cadastro do benefício municipal. O limite para este valor percentual informado pelo emitente está previamente parametrizado pelo município de incidência no cadastro do benefício municipal. +changed NFSe/infNFSe/DPS/infDPS/valores/trib/tribMun/tpRetISSQN 311 349 E E N N 1-1 1-1 1 1 Tipo de retencao do ISSQN: 1 - Não Retido; 2 - Retido pelo Tomador; 3 - Retido pelo Intermediario; Tipo de retenção do ISSQN: 1 - Não Retido; 2 - Retido pelo Tomador; 3 - Retido pelo Intermediário; - - +unchanged NFSe/infNFSe/DPS/infDPS/valores/trib/tribMun/pAliq 312 350 E E N N 0-1 0-1 1V2 1V2 Valor da alíquota (%) do serviço prestado relativo ao município sujeito ativo (município de incidência) do ISSQN. Valor da alíquota (%) do serviço prestado relativo ao município sujeito ativo (município de incidência) do ISSQN. Se o município de incidência pertence ao Sistema Nacional NFS-e a alíquota estará parametrizada e, portanto, será fornecida pelo sistema. Se o município de incidência não pertence ao Sistema Nacional NFS-e a alíquota não estará parametrizada e, por isso, deverá ser fornecida pelo emitente. Se o município de incidência pertence ao Sistema Nacional NFS-e a alíquota estará parametrizada e, portanto, será fornecida pelo sistema. Se o município de incidência não pertence ao Sistema Nacional NFS-e a alíquota não estará parametrizada e, por isso, deverá ser fornecida pelo emitente. +unchanged NFSe/infNFSe/DPS/infDPS/valores/trib/tribFed 313 351 G G - - 0-1 0-1 - - Grupo de informações de outros tributos relacionados ao serviço prestado Grupo de informações de outros tributos relacionados ao serviço prestado - - +unchanged NFSe/infNFSe/DPS/infDPS/valores/trib/tribFed/piscofins 314 352 G G - - 0-1 0-1 - - Grupo de informações dos tributos PIS/COFINS Grupo de informações dos tributos PIS/COFINS - - +changed NFSe/infNFSe/DPS/infDPS/valores/trib/tribFed/piscofins/CST 315 353 E E N N 1-1 1-1 2 2 Código de Situação Tributária do PIS/COFINS (CST): 00 - Nenhum; 01 - Operação Tributável com Alíquota Básica; 02 - Operação Tributável com Alíquota Diferenciada; 03 - Operação Tributável com Alíquota por Unidade de Medida de Produto; 04 - Operação Tributável monofásica - Revenda a Alíquota Zero; 05 - Operação Tributável por Substituição Tributária; 06 - Operação Tributável a Alíquota Zero; 07 - Operação Isenta da Contribuição; 08 - Operação sem Incidência da Contribuição; 09 - Operação com Suspensão da Contribuição; 49 - Outras Operações de Saída; 50 - Operação com Direito a Crédito – Vinculada Exclusivamente a Receita Tributada no Mercado Interno; 51 - Operação com Direito a Crédito – Vinculada Exclusivamente a Receita Não-Tributada no Mercado Interno; 52 - Operação com Direito a Crédito – Vinculada Exclusivamente a Receita de Exportação; 53 - Operação com Direito a Crédito – Vinculada a Receitas Tributadas e Não-Tributadas no Mercado Interno; 54 - Operação com Direito a Crédito – Vinculada a Receitas Tributadas no Mercado Interno e de Exportação; 55 - Operação com Direito a Crédito – Vinculada a Receitas Não Tributadas no Mercado Interno e de Exportação; 56 - Operação com Direito a Crédito – Vinculada a Receitas Tributadas e Não-Tributadas no Mercado Interno e de Exportação; 60 - Crédito Presumido – Operação de Aquisição Vinculada Exclusivamente a Receita Tributada no Mercado Interno; 61 - Crédito Presumido – Operação de Aquisição Vinculada Exclusivamente a Receita Não-Tributada no Mercado Interno; 62 - Crédito Presumido – Operação de Aquisição Vinculada Exclusivamente a Receita de Exportação; 63 - Crédito Presumido – Operação de Aquisição Vinculada a Receitas Tributadas e Não-Tributadas no Mercado Interno; 64 - Crédito Presumido – Operação de Aquisição Vinculada a Receitas Tributadas no Mercado Interno e de Exportação; 65 - Crédito Presumido – Operação de Aquisição Vinculada a Receitas Não-Tributadas no Mercado Interno e de Exportação; 66 - Crédito Presumido – Operação de Aquisição Vinculada a Receitas Tributadas e Não-Tributadas no Mercado Interno e de Exportação; 67 - Crédito Presumido – Outras Operações; 70 - Operação de Aquisição sem Direito a Crédito; 71 - Operação de Aquisição com Isenção; 72 - Operação de Aquisição com Suspensão; 73 - Operação de Aquisição a Alíquota Zero; 74 - Operação de Aquisição sem Incidência da Contribuição; 75 - Operação de Aquisição por Substituição Tributária; 98 - Outras Operações de Entrada; 99 - Outras Operações; Código de Situação Tributária do PIS/COFINS (CST): 00 - Nenhum; 01 - Operação Tributável com Alíquota Básica; 02 - Operação Tributável com Alíquota Diferenciada; 03 - Operação Tributável com Alíquota por Unidade de Medida de Produto; 04 - Operação Tributável monofásica - Revenda a Alíquota Zero; 05 - Operação Tributável por Substituição Tributária; 06 - Operação Tributável a Alíquota Zero; 07 - Operação Isenta da Contribuição; 08 - Operação sem Incidência da Contribuição; 09 - Operação com Suspensão da Contribuição; 49 - Outras Operações de Saída; 50 - Operação com Direito a Crédito – Vinculada Exclusivamente a Receita Tributada no Mercado Interno; 51 - Operação com Direito a Crédito – Vinculada Exclusivamente a Receita Não-Tributada no Mercado Interno; 52 - Operação com Direito a Crédito – Vinculada Exclusivamente a Receita de Exportação; 53 - Operação com Direito a Crédito – Vinculada a Receitas Tributadas e Não-Tributadas no Mercado Interno; 54 - Operação com Direito a Crédito – Vinculada a Receitas Tributadas no Mercado Interno e de Exportação; 55 - Operação com Direito a Crédito – Vinculada a Receitas Não Tributadas no Mercado Interno e de Exportação; 56 - Operação com Direito a Crédito – Vinculada a Receitas Tributadas e Não-Tributadas no Mercado Interno e de Exportação; 60 - Crédito Presumido – Operação de Aquisição Vinculada Exclusivamente a Receita Tributada no Mercado Interno; 61 - Crédito Presumido – Operação de Aquisição Vinculada Exclusivamente a Receita Não-Tributada no Mercado Interno; 62 - Crédito Presumido – Operação de Aquisição Vinculada Exclusivamente a Receita de Exportação; 63 - Crédito Presumido – Operação de Aquisição Vinculada a Receitas Tributadas e Não-Tributadas no Mercado Interno; 64 - Crédito Presumido – Operação de Aquisição Vinculada a Receitas Tributadas no Mercado Interno e de Exportação; 65 - Crédito Presumido – Operação de Aquisição Vinculada a Receitas Não-Tributadas no Mercado Interno e de Exportação; 66 - Crédito Presumido – Operação de Aquisição Vinculada a Receitas Tributadas e Não-Tributadas no Mercado Interno e de Exportação; 67 - Crédito Presumido – Outras Operações; 70 - Operação de Aquisição sem Direito a Crédito; 71 - Operação de Aquisição com Isenção; 72 - Operação de Aquisição com Suspensão; 73 - Operação de Aquisição a Alíquota Zero; 74 - Operação de Aquisição sem Incidência da Contribuição; 75 - Operação de Aquisição por Substituição Tributária; 98 - Outras Operações de Entrada; 99 - Outras Operações; Informar a CST relativa ao tipo de incidência tributária da apuração própria, Cumulativa ou Não Cumulativa, de acordo com o o regime de opção. Estes códigos não correspondem ao da último GUIA da EFD Contribuições, ver com Orlando e Guilherme se entendem ser necessário adequar - +unchanged NFSe/infNFSe/DPS/infDPS/valores/trib/tribFed/piscofins/vBCPisCofins 316 354 E E N N 0-1 0-1 1-15V2 1-15V2 Valor da Base de Cálculo do PIS/COFINS, relativo à apuração própria (R$). Valor da Base de Cálculo do PIS/COFINS, relativo à apuração própria (R$). - - +unchanged NFSe/infNFSe/DPS/infDPS/valores/trib/tribFed/piscofins/pAliqPis 317 355 E E N N 0-1 0-1 1-2V2 1-2V2 Alíquota do PIS, relativa à apuração própria (%). Alíquota do PIS, relativa à apuração própria (%). - - +unchanged NFSe/infNFSe/DPS/infDPS/valores/trib/tribFed/piscofins/pAliqCofins 318 356 E E N N 0-1 0-1 1-2V2 1-2V2 Alíquota da COFINS, relativa à apuração própria (%). Alíquota da COFINS, relativa à apuração própria (%). - - +unchanged NFSe/infNFSe/DPS/infDPS/valores/trib/tribFed/piscofins/vPis 319 357 E E N N 0-1 0-1 1-15V2 1-15V2 Valor do débito de PIS apuração própria (R$). Valor do débito de PIS apuração própria (R$). - - +unchanged NFSe/infNFSe/DPS/infDPS/valores/trib/tribFed/piscofins/vCofins 320 358 E E N N 0-1 0-1 1-15V2 1-15V2 Valor do débito de COFINS apuração própria (R$). Valor do débito de COFINS apuração própria (R$). - - +changed NFSe/infNFSe/DPS/infDPS/valores/trib/tribFed/piscofins/tpRetPisCofins 321 359 E E N N 0-1 0-1 1 1 Tipo de retenção PIS/COFINS e CSLL: 0 - PIS/COFINS/CSLL Não Retidos; 1 - PIS/COFINS Retido; 2 - PIS/COFINS Não Retido; 3 - PIS/COFINS/CSLL Retidos; 4 - PIS/COFINS Retidos, CSLL Não Retido; 5 - PIS Retido, COFINS/CSLL Não Retido; 6 - COFINS Retido, PIS/CSLL Não Retido; 7 - PIS Não Retido, COFINS/CSLL Retidos; 8 - PIS/COFINS Não Retidos, CSLL Retido; 9 - COFINS Não Retido, PIS/CSLL Retidos; Tipo de retenção PIS/COFINS e CSLL: 0 - PIS/COFINS/CSLL Não Retidos; 1 - PIS/COFINS Retido; 2 - PIS/COFINS Não Retido; 3 - PIS/COFINS/CSLL Retidos; 4 - PIS/COFINS Retidos, CSLL Não Retido; 5 - PIS Retido, COFINS/CSLL Não Retido; 6 - COFINS Retido, PIS/CSLL Não Retido; 7 - PIS Não Retido, COFINS/CSLL Retidos; 8 - PIS/COFINS Não Retidos, CSLL Retido; 9 - COFINS Não Retido, PIS/CSLL Retidos; Indica quais contribuições retidas na fonte compoem o campo vRetCSLL. Os valores 1 e 2 só serão aceitos até os grupos "IBSCBS" se tornarem obrigatórios (01/10/2026) para a autorização/recepção da NFS-e. Mais esclarecimentos podem ser encontrados na Nota Técnica SE/CGNFS-e nº 007, de 07 de fevereiro de 2026, disponível no portal da NFS-e. +unchanged NFSe/infNFSe/DPS/infDPS/valores/trib/tribFed/vRetCP 322 360 E E N N 0-1 0-1 1-15V2 1-15V2 Valor monetário do CP(R$). Valor monetário do CP(R$). - - +unchanged NFSe/infNFSe/DPS/infDPS/valores/trib/tribFed/vRetIRRF 323 361 E E N N 0-1 0-1 1-15V2 1-15V2 Valor monetário do IRRF (R$). Valor monetário do IRRF (R$). - - +changed NFSe/infNFSe/DPS/infDPS/valores/trib/tribFed/vRetCSLL 324 362 E E N N 0-1 0-1 1-15V2 1-15V2 Valor monetário do CSLL (R$). Valor relativo às retenções das Contribuições Sociais (R$), de acordo com a indicação no campo tpRetPisCofins. - - +unchanged NFSe/infNFSe/DPS/infDPS/valores/trib/totTrib 325 363 G G - - 1-1 1-1 - - Grupo de informações para totais aproximados dos tributos relacionados ao serviço prestado Grupo de informações para totais aproximados dos tributos relacionados ao serviço prestado Os campos totalizadores deste grupo serão reavaliados em novas versões do layout proposto. Os campos totalizadores deste grupo serão reavaliados em novas versões do layout proposto. +unchanged NFSe/infNFSe/DPS/infDPS/valores/trib/totTrib/vTotTrib 326 364 CG CG - - 1-1 1-1 - - Valor monetário total aproximado dos tributos, em conformidade com o artigo 1o da Lei no 12.741/2012 Valor monetário total aproximado dos tributos, em conformidade com o artigo 1o da Lei no 12.741/2012 +unchanged NFSe/infNFSe/DPS/infDPS/valores/trib/totTrib/vTotTrib/vTotTribFed 327 365 E E N N 1-1 1-1 1-15V2 1-15V2 Valor monetário total aproximado dos tributos federais (R$). Valor monetário total aproximado dos tributos federais (R$). +unchanged NFSe/infNFSe/DPS/infDPS/valores/trib/totTrib/vTotTrib/vTotTribEst 328 366 E E N N 1-1 1-1 1-15V2 1-15V2 Valor monetário total aproximado dos tributos estaduais (R$). Valor monetário total aproximado dos tributos estaduais (R$). +unchanged NFSe/infNFSe/DPS/infDPS/valores/trib/totTrib/vTotTrib/vTotTribMun 329 367 E E N N 1-1 1-1 1-15V2 1-15V2 Valor monetário total aproximado dos tributos municipais (R$). Valor monetário total aproximado dos tributos municipais (R$). +added NFSe/infNFSe/DPS/infDPS/valores/trib/totTrib/pTotTrib 368 CG - 1-1 - Valor percentual total aproximado dos tributos, em conformidade com o artigo 1o da Lei no 12.741/2012 +unchanged NFSe/infNFSe/DPS/infDPS/valores/trib/totTrib/pTotTrib/pTotTribFed 331 369 E E N N 1-1 1-1 1-2V2 1-2V2 Valor percentual total aproximado dos tributos federais (%). Valor percentual total aproximado dos tributos federais (%). +unchanged NFSe/infNFSe/DPS/infDPS/valores/trib/totTrib/pTotTrib/pTotTribEst 332 370 E E N N 1-1 1-1 1-2V2 1-2V2 Valor percentual total aproximado dos tributos estaduais (%). Valor percentual total aproximado dos tributos estaduais (%). +unchanged NFSe/infNFSe/DPS/infDPS/valores/trib/totTrib/pTotTrib/pTotTribMun 333 371 E E N N 1-1 1-1 1-2V2 1-2V2 Valor percentual total aproximado dos tributos municipais (%). Valor percentual total aproximado dos tributos municipais (%). +unchanged NFSe/infNFSe/DPS/infDPS/valores/trib/totTrib/indTotTrib 334 372 CE CE N N 1-1 1-1 1 1 Indicador de informação de valor total de tributos. Se informado indica que o emitente opta por não informar nenhum valor estimado para os Tributos (Decreto 8.264/2014). 0 - Não; Indicador de informação de valor total de tributos. Se informado indica que o emitente opta por não informar nenhum valor estimado para os Tributos (Decreto 8.264/2014). 0 - Não; +unchanged NFSe/infNFSe/DPS/infDPS/valores/trib/totTrib/pTotTribSN 335 373 CE CE N N 1-1 1-1 1-2V2 1-2V2 Valor percentual aproximado do total dos tributos da alíquota do Simples Nacional (%). Valor percentual aproximado do total dos tributos da alíquota do Simples Nacional (%). +unchanged NFSe/infNFSe/DPS/infDPS/IBSCBS 336 374 G G - - 0-1 0-1 - - Grupo de informações declaradas pelo emitente referentes ao IBS e à CBS Grupo de informações declaradas pelo emitente referentes ao IBS e à CBS Para optantes dos Simples Nacional, os grupos IBSCBS só serão obrigatórios a partir de 2027. Para optantes dos Simples Nacional, os grupos IBSCBS só serão obrigatórios a partir de 2027. +changed NFSe/infNFSe/DPS/infDPS/IBSCBS/indFinal 338 375 E E N N 0-1 0-1 1 1 Indica operação de uso ou consumo pessoal. (art. 57) 0=Não; 1=Sim; Indica operação de uso ou consumo pessoal. (art. 57) 0=Não 1=Sim Esse campo será descontinuado a partir da implantação do layout da NT 005 que ocorrerá ao longo de 2026, em data a ser divulgada no portal da NFS-e.I327 +changed NFSe/infNFSe/DPS/infDPS/IBSCBS/cIndOp 339 376 E E N N 1-1 0-1 6 6 Código indicador da operação de fornecimento, conforme tabela “código indicador de operação” Código indicador da operação de fornecimento, conforme tabela “código indicador de operação” - - +added NFSe/infNFSe/DPS/infDPS/IBSCBS/indZFMALC 377 E N 0-1 1 Indicador da operação de fornecimento favorecido com alíquota zero de CBS (conforme art. 451 e art. 466 da Lei Complementar nº 214/2025) 0 - Não; 1 - Sim. Se indZFMALC=1, o valor da alíquota da CBS será 0 (zero). O campo indZFMALC só deve ser informado se observadas as seguintes regras: 1) cIndOp deve ser 010101, 010102, 010103, 010106, 020101, 020201, 020301, 030101, 030102, 050101, 050102, 050201, 060101, 070101, 070102, 100301, 100302, 100401, 100501, 100502 ou 100601; 2) Fornecedor e destinatário dentro da Zona Franca de Manaus (ZFM); ou fornecedor e destinatário dentro da mesma Área de Livre Comércio (ALC). +unchanged NFSe/infNFSe/DPS/infDPS/IBSCBS/tpOper 340 378 E E N N 0-1 0-1 1 1 Tipo de Operação com Entes Governamentais ou outros serviços sobre bens imóveis: 1 – Fornecimento com pagamento posterior; 2 - Recebimento do pagamento com fornecimento já realizado; 3 – Fornecimento com pagamento já realizado; 4 – Recebimento do pagamento com fornecimento posterior; 5 – Fornecimento e recebimento do pagamento concomitantes; Tipo de Operação com Entes Governamentais ou outros serviços sobre bens imóveis: 1 – Fornecimento com pagamento posterior; 2 - Recebimento do pagamento com fornecimento já realizado; 3 – Fornecimento com pagamento já realizado; 4 – Recebimento do pagamento com fornecimento posterior; 5 – Fornecimento e recebimento do pagamento concomitantes; Campo deve ser informado para as seguintes situações previstas na LC 214/2025: Aquisição de serviços pela administração pública direta, por autarquias e por fundações públicas: Art. 10 §2º (Qualquer serviço); Cessão onerosa de bem imóvel: Art. 254 III (Serviço 25.05 da LC 116/2003); Arrendamento de bem imóvel: Art. 254 III (Serviço 15.09 da LC 116/2003); Administração de bem imóvel: Art. 254 IV (Serviço 17.12 da LC 116/2003); Intermediação de bem imóvel: Art. 254 IV (Serviço 10.05 da LC 116/2003). Campo deve ser informado para as seguintes situações previstas na LC 214/2025: Aquisição de serviços pela administração pública direta, por autarquias e por fundações públicas: Art. 10 §2º (Qualquer serviço); Cessão onerosa de bem imóvel: Art. 254 III (Serviço 25.05 da LC 116/2003); Arrendamento de bem imóvel: Art. 254 III (Serviço 15.09 da LC 116/2003); Administração de bem imóvel: Art. 254 IV (Serviço 17.12 da LC 116/2003); Intermediação de bem imóvel: Art. 254 IV (Serviço 10.05 da LC 116/2003). +unchanged NFSe/infNFSe/DPS/infDPS/IBSCBS/gRefNFSe 341 379 G G - - 0-1 0-1 - - Grupo de NFS-e referenciadas. Grupo de NFS-e referenciadas. Obrigatório para tpOper = 2 ou 3 Obrigatório para tpOper = 2 ou 3 +unchanged NFSe/infNFSe/DPS/infDPS/IBSCBS/gRefNFSe/refNFSe 342 380 E E C C 1-99 1-99 50 50 Chave da NFS-e referenciada. Chave da NFS-e referenciada. - - +unchanged NFSe/infNFSe/DPS/infDPS/IBSCBS/tpEnteGov 343 381 E E N N 0-1 0-1 1 1 Tipo de ente governamental Para administração pública direta e suas autarquias e fundações: 1 = União; 2 = Estado; 3 = Distrito Federal; 4 = Município; Tipo de ente governamental Para administração pública direta e suas autarquias e fundações: 1 = União; 2 = Estado; 3 = Distrito Federal; 4 = Município; Campo só deve ser informado no caso de compras governamentais. Campo só deve ser informado no caso de compras governamentais. +added NFSe/infNFSe/DPS/infDPS/IBSCBS/indDoacao 382 E N 0-1 1 Indica uma Operação de Doação Em relação às doações: 1)Doação com contraprestação; - NFS-e deve ser emitida a valor de mercado. indDoacao: Não deve ser informado; gEstornoCred: Não deve ser informado; cClassTrib: Tributação Regular. 2) Doação sem contraprestação; 2.1) Quando não houve apropriação de créditos anteriores: - Deve-se emitir NFS-e a valor de mercado. Como não houve créditos na entrada, deve-se realizar a doação sem qualquer estorno. indDoacao: Deve ser informado; gEstornoCred: Não deve ser informado; cClassTrib: "410003 - Doações sem contraprestação em benefício do doador"; 2.2) Quando houve apropriação de créditos anteriores: 2.2.a) Pode-se estornar os créditos de entrada ao informar valores de IBS e de CBS no grupo gEstornoCred. Nesse caso, deve-se realizar um cálculo dos créditos obtidos na entrada para serem informados no grupo de estorno; indDoacao: Deve ser informado; gEstornoCred: Deve ser informado; cClassTrib: "410026 - Doação com anulação de crédito"; 2.2.b) Pode-se tributar a operação de doação de forma equivalente a uma operação com incidência regular. Nesse caso, não há estorno e a NFS-e deve ser emitida a valor de mercado; indDoacao: Deve ser informado; gEstornoCred: Não deve ser informado; cClassTrib: Tributação regular. +unchanged NFSe/infNFSe/DPS/infDPS/IBSCBS/imovel 366 383 G G - - 0-1 0-1 - - Grupo de informações de operações relacionadas a bens imóveis, exceto obras. Grupo de informações de operações relacionadas a bens imóveis, exceto obras. - - +added NFSe/infNFSe/DPS/infDPS/IBSCBS/imovel/cMun 384 E N 1-1 7 Código do município do endereço do imóvel (Tabela do IBGE) - +added NFSe/infNFSe/DPS/infDPS/IBSCBS/imovel/gLocacao 385 G - 0-1 - Grupo de informações relativas às operações de locação, cessão onerosa ou arrendamento de bens imóveis Grupo só é admitido quando se tratar de locação, cessão onerosa ou arrendamento de bens imóveis Código de tributação nacional (cTribNac) for de 99.03.01 a 99.03.05 (subitem 99.03) +added NFSe/infNFSe/DPS/infDPS/IBSCBS/imovel/gLocacao/pCopropriedade 386 E N 1-1 1-2V2 Percentual de Copropriedade (Caso só haja um locador, cedente ou arrendador, informar o Percentual de Copropriedade de 100%) - +added NFSe/infNFSe/DPS/infDPS/IBSCBS/imovel/gLocacao/vTotOper 387 E N 1-1 1-15V2 Valor total da operação com bem imóvel (Informar o valor total da operação de locação, cessão onerosa ou arrendamento de bens imóveis, associado ao aluguel, renda ou equivalente, conforme art. 255 da LC 214/2025). Não deverá ser inserido neste campo o valor proporcional do coproprietário. Lei Complementar n° 214, de 16 de janeiro de 2025 Art. 255. A base de cálculo do IBS e da CBS é o valor: (...) II - da locação, cessão onerosa ou arrendamento do bem imóvel; (...) § 1º O valor da operação de que trata o caput deste artigo inclui: I - o valor dos juros e das variações monetárias, em função da taxa de câmbio ou de índice ou coeficiente aplicáveis por disposição legal ou contratual; II - a atualização monetária, nas vendas contratadas com cláusula de atualização monetária do saldo credor do preço, que venham a integrar os valores efetivamente recebidos pela alienação de bem imóvel; III - os valores a que se referem os incisos I a III e VI do § 1º do art. 12 desta Lei Complementar. Art. 12. (...) § 1º O valor da operação compreende o valor integral cobrado pelo fornecedor a qualquer título, inclusive os valores correspondentes a: I - acréscimos decorrentes de ajuste do valor da operação; II - juros, multas, acréscimos e encargos; III - descontos concedidos sob condição; (...) VI - demais importâncias cobradas ou recebidas como parte do valor da operação, inclusive seguros e taxas. +added NFSe/infNFSe/DPS/infDPS/IBSCBS/imovel/gLocacao/vDescIncondTot 388 E N 0-1 1-15V2 Valor total do Desconto Incondicionado (Informar o valor total do desconto incondicionado na operação de locação, cessão onerosa ou arrendamento de bens imóveis) - +added NFSe/infNFSe/DPS/infDPS/IBSCBS/imovel/gLocacao/vDescCondTot 389 E N 0-1 1-15V2 Valor total do Desconto Condicionado (Informar o valor total do desconto condicionado na operação de locação, cessão onerosa ou arrendamento de bens imóveis) - +added NFSe/infNFSe/DPS/infDPS/IBSCBS/imovel/gLocacao/dVencOrig 390 E D 0-1 - Data de vencimento original Ano, Mês e Dia (AAAA-MM-DD) (Informar data de vencimento original do aluguel, renda ou equivalente na operação de locação, cessão onerosa ou arrendamento de bens imóveis) A data de vencimento original refere-se ao esgotamento do prazo inicialmente fixado para pagamento do aluguel, renda ou equivalente. Essa informação não possui efeitos no cálculo e na apuração do IBS e da CBS, servindo apenas como informativo para orientar o mês ou período de referência do aluguel, renda ou equivalente. Em que pese o campo ser facultativo, recomenda-se o seu preenchimento. +added NFSe/infNFSe/DPS/infDPS/IBSCBS/imovel/gUnidImob 391 G - 0-99 - Grupo de informações relativas às unidades imobiliárias objeto da operação Todas as unidades imobiliárias aqui informadas e que compõem a mesma operação devem, obrigatoriamente, estar localizadas no mesmo município (cMun). +added NFSe/infNFSe/DPS/infDPS/IBSCBS/imovel/gUnidImob/inscImobFisc 392 E C 0-1 1-30 Inscrição imobiliária fiscal (código fornecido pela prefeitura para a identificação da obra ou para fins de recolhimento do IPTU) - +added NFSe/infNFSe/DPS/infDPS/IBSCBS/imovel/gUnidImob/cCIB 393 CE C 1-1 8 Código do Cadastro Imobiliário Brasileiro - CIB +added NFSe/infNFSe/DPS/infDPS/IBSCBS/imovel/gUnidImob/end 394 CG - 1-1 - Grupo de informações do endereço do imóvel. - +added NFSe/infNFSe/DPS/infDPS/IBSCBS/imovel/gUnidImob/end/CEP 395 E N 1-1 8 Código numérico do Endereçamento Postal nacional (CEP) do endereço do imóvel. (Informar os zeros não significativos) - +added NFSe/infNFSe/DPS/infDPS/IBSCBS/imovel/gUnidImob/end/xLgr 396 E C 1-1 1-255 Tipo e nome do logradouro do endereço do imóvel. - +added NFSe/infNFSe/DPS/infDPS/IBSCBS/imovel/gUnidImob/end/nro 397 E C 1-1 1-60 Número no logradouro do endereço do imóvel. - +added NFSe/infNFSe/DPS/infDPS/IBSCBS/imovel/gUnidImob/end/xCpl 398 E C 0-1 1-156 Complemento do endereço do imóvel. - +added NFSe/infNFSe/DPS/infDPS/IBSCBS/imovel/gUnidImob/end/xBairro 399 E C 0-1 1-60 Bairro do endereço do imóvel. - +added NFSe/infNFSe/DPS/infDPS/IBSCBS/imovel/gUnidImob/gAjusteBCLocImoveis 400 G - 0-10 - Grupo de informações relativas a valores de ajuste (dedução/redução) da Base de Cálculo do IBS e da CBS referentes às operações de locação, cessão onerosa ou arrendamento de bens imóveis - +added NFSe/infNFSe/DPS/infDPS/IBSCBS/imovel/gUnidImob/gAjusteBCLocImoveis/tpAjusteBCLocImoveis 401 E N 1-1 2 Tipo de parcela não integrante da base de cálculo do IBS e da CBS 01 = Tributos inclusos no aluguel ou equivalente (Ex.: IPTU, Contribuição de melhoria) - apenas para NBS 1.1002.10.00 ou 1.1002.20.00 02 = Emolumento incluso no aluguel ou equivalente - apenas para NBS 1.1002.10.00 ou 1.1002.20.00 03 = Condomínio incluso no aluguel ou equivalente - apenas para NBS 1.1002.10.00 ou 1.1002.20.00 04 = Redutor Social - apenas para a NBS 1.1002.10.00 99 = Outras parcelas inclusas no aluguel ou equivalente - +added NFSe/infNFSe/DPS/infDPS/IBSCBS/imovel/gUnidImob/gAjusteBCLocImoveis/xTpAjusteBCLocImoveis 402 E C 0-1 0-150 Descrição do tipo de parcela não integrante da base de cálculo do IBS e da CBS quando a opção for "99 = Outras parcelas inclusas no aluguel ou equivalente". - +added NFSe/infNFSe/DPS/infDPS/IBSCBS/imovel/gUnidImob/gAjusteBCLocImoveis/vAjusteBCLocImoveis 403 E N 1-1 1-15V2 Valor monetário utilizado para não inclusão na base de cálculo do IBS e da CBS da NFS-e que está sendo emitida (R$). (Informar o valor total da parcela não integrante da base de cálculo - IPTU, Condomínio, Redutor social, etc. -, não devendo ser inserido o valor proporcional do coproprietário) - +added NFSe/infNFSe/DPS/infDPS/IBSCBS/bensMoveis 404 G - 0-1000 - Grupo de informações relativas aos bens móveis objetos de locação. Grupo só é admitido quando se tratar de locação de bens móveis. cTribNac = 99.04.01. +added NFSe/infNFSe/DPS/infDPS/IBSCBS/bensMoveis/cNCMBemMovel 405 E N 1-1 8 Código da Nomenclatura Comum do Mercosul (NCM) do bem móvel objeto da locação. - +added NFSe/infNFSe/DPS/infDPS/IBSCBS/bensMoveis/xNCMBemMovel 406 E C 1-1 1-150 Descrição do Bem Móvel objeto da locação. - +added NFSe/infNFSe/DPS/infDPS/IBSCBS/bensMoveis/qtdNCMBemMovel 407 E N 1-1 3 Quantidade do Bem Móvel objeto da locação. - +added NFSe/infNFSe/DPS/infDPS/IBSCBS/condominios 408 G - 0-1 - Grupo de informações relativas às operações de condomínios. Grupo só é admitido quando se tratar de atividades de condomínio - subitem 99.05 do cTribNac. +added NFSe/infNFSe/DPS/infDPS/IBSCBS/condominios/dVencOrig 409 E D 1-1 - Data de vencimento original Ano, Mês e Dia (AAAA-MM-DD) (Informar a data de vencimento original das taxas e demais valores condominiais cobrados do condômino) - +added NFSe/infNFSe/DPS/infDPS/IBSCBS/condominios/gCobranca 410 G - 1-20 - Grupo de informações das cobranças das taxas e demais valores condominiais cobrados do condômino. +added NFSe/infNFSe/DPS/infDPS/IBSCBS/condominios/gCobranca/tpCobranca 411 E N 1-1 2 01 - Condomínio Ordinário 02 - Condomínio Privativo 03 - Fundo De Promoção E Propaganda (FPP) 04 - Impostos e Taxas 05 - Fundo de Reserva 99 - Outra Cobrança +added NFSe/infNFSe/DPS/infDPS/IBSCBS/condominios/gCobranca/xTpCobranca 412 E C 0-1 1-150 Descrição do tipo da cobrança. Somente deve ser informado quando tpCobranca = 99 (Outra Cobrança) +added NFSe/infNFSe/DPS/infDPS/IBSCBS/condominios/gCobranca/vCobranca 413 E N 1-1 1-15V2 Valor da cobrança em R$. O somatório dos valores informado em vCobrança resultará no valor da operação (vServ). vCobranca = ∑ vDetCobranca (quando informado) +added NFSe/infNFSe/DPS/infDPS/IBSCBS/condominios/gCobranca/gDetCobranca 414 G - 0-20 - Grupo de informações relativas ao detalhamento das cobranças. +added NFSe/infNFSe/DPS/infDPS/IBSCBS/condominios/gCobranca/gDetCobranca/tpDetCobranca 415 E N 1-1 3 001 - Cond. Comum CRD 002 - Cond. Comum M2 003 - Cond. Comum Fixo 004 - Cond. Comum Fração 005 - Cond. Comum Percentual 006 - Condomínio CMM 007 - Energia Elétrica 008 - Água 009 - Ar Condicionado 010 - Telefone 011 - Internet 012 - Controle de Pragas 013 - Exaustão 014 - Gás 015 - IPTU 016 - Taxa Área 017 - Manutenção 018 - Multa 019 - Seguro 020 - Taxa Bombeiro 021 - Taxa Administração 022 - Taxa Foro 023 - Limpeza 024 - Taxa de Lixo 025 - Tapume 026 - Instalação Alarme 027 - Segurança 028 - Fundo de Promoção e Propaganda 029 - Análise de Projeto 030 - Fundo de Reserva 031 - Laudos e Vistorias 032 - Detecção de Fumaça 033 - Reanálise de Projeto 034 - Taxa Extra 035 - Área Vaga 036 - Condomínio Irrecuperável 999 - Outro A informação do grupo de informações de detalhamento das cobranças (gDetCobranca) é facultativo. Contudo, caso seja informado, o valor de tpDetCobranca deve ter correlação com o valor informado em tpCobranca: - Se tpCobranca = 01 então tpDetCobranca = (001, 002, 003, 004, 005, 006, 018, 0035, 036 ou 999); - Se tpCobranca = 02 então tpDetCobranca = (007, 008, 009, 010, 011, 012, 013, 014, 017, 018, 019, 023, 025, 026, 027, 029, 031, 032, 033, 034 ou 999); - Se tpCobranca = 03 então tpDetCobranca = (018, 028 ou 999); - Se tpCobranca = 04, então tpDetCobranca = (015, 016, 020, 021, 022, 024 ou 999); - Se tpCobranca = 05, então tpDetCobranca = (018, 030 ou 999); - Se tpCobranca = 99, então tpDetCobranca pode ter qualquer valor; +added NFSe/infNFSe/DPS/infDPS/IBSCBS/condominios/gCobranca/gDetCobranca/xTpDetCobranca 416 E C 0-1 1-150 Descrição do tipo de detalhamento da cobrança. Somente deve ser informado quando tpDetCobranca = 999. +added NFSe/infNFSe/DPS/infDPS/IBSCBS/condominios/gCobranca/gDetCobranca/vDetCobranca 417 E N 1-1 1-15V2 Valor detalhado da cobrança em R$ que irá compor vCobranca - +added NFSe/infNFSe/DPS/infDPS/IBSCBS/condominios/gDesconto 418 G - 0-10 - Grupo de informações dos descontos concedidos nas taxas e demais valores condominiais cobrados do condômino. +added NFSe/infNFSe/DPS/infDPS/IBSCBS/condominios/gDesconto/tpDesconto 419 E N 1-1 1 1 - Desconto Incondicionado 2 - Desconto Condicionado +added NFSe/infNFSe/DPS/infDPS/IBSCBS/condominios/gDesconto/vDesconto 420 E N 1-1 1-15V2 Valor do desconto em R$. Os valores informados em vDesconto devem corresponder aos valores de vDescIncond e vDescCond, conforme o tipo de desconto (tpDesconto) informado. +added NFSe/infNFSe/DPS/infDPS/IBSCBS/condominios/gDesconto/xTpDesconto 421 E C 1-1 1-150 Descrição do tipo do desconto aplicado pelo Condomínio. +unchanged NFSe/infNFSe/DPS/infDPS/IBSCBS/valores 379 422 G G - - 1-1 1-1 - - Grupo de informações relativas aos valores do serviço prestado para IBS e CBS Grupo de informações relativas aos valores do serviço prestado para IBS e CBS - - +unchanged NFSe/infNFSe/DPS/infDPS/IBSCBS/valores/trib 404 423 G G - - 1-1 1-1 - - Grupo de informações relacionados aos tributos IBS e CBS Grupo de informações relacionados aos tributos IBS e CBS - - +added NFSe/infNFSe/DPS/infDPS/IBSCBS/valores/trib/CST 424 E N 1-1 3 Código de Situação Tributária do IBS e da CBS - +added NFSe/infNFSe/DPS/infDPS/IBSCBS/valores/trib/cClassTrib 425 E N 1-1 6 Código de Classificação Tributária do IBS e da CBS - +changed NFSe/infNFSe/DPS/infDPS/IBSCBS/valores/trib/gIBSCBS 405 426 G G - - 1-1 0-1 - - Grupo de informações relacionadas ao IBS e à CBS Grupo de informações relacionadas ao IBS e à CBS - - +unchanged NFSe/infNFSe/DPS/infDPS/IBSCBS/valores/trib/gIBSCBS/cCredPres 408 427 E E N N 0-1 0-1 2 2 Código e classificação do crédito presumido: IBS e CBS. Código e classificação do crédito presumido: IBS e CBS. - - +added NFSe/infNFSe/DPS/infDPS/IBSCBS/valores/trib/gIBSCBS/gIBSCBSAjuste 428 G - 0-1 - Grupo de informações para as Notas de Ajuste Grupo deve (e só pode) ser informando quando: tpNFSeDebito = 01, 02, 03 ou 05 ou tpNFSeCredito = 05 +added NFSe/infNFSe/DPS/infDPS/IBSCBS/valores/trib/gIBSCBS/gIBSCBSAjuste/vIBS 429 E N 1-1 1-15V2 Valor do IBS a ser ajustado. +added NFSe/infNFSe/DPS/infDPS/IBSCBS/valores/trib/gIBSCBS/gIBSCBSAjuste/vCBS 430 E N 1-1 1-15V2 Valor da CBS a ser ajustado. +unchanged NFSe/infNFSe/DPS/infDPS/IBSCBS/valores/trib/gIBSCBS/gTribRegular 409 431 G G - - 0-1 0-1 - - Grupo de informações da Tributação Regular Grupo de informações da Tributação Regular - - +unchanged NFSe/infNFSe/DPS/infDPS/IBSCBS/valores/trib/gIBSCBS/gTribRegular/CSTReg 410 432 E E N N 1-1 1-1 3 3 Código de Situação Tributária do IBS e da CBS de tributação regular Código de Situação Tributária do IBS e da CBS de tributação regular - - +unchanged NFSe/infNFSe/DPS/infDPS/IBSCBS/valores/trib/gIBSCBS/gTribRegular/cClassTribReg 411 433 E E N N 1-1 1-1 6 6 Código da Classificação Tributária do IBS e da CBS de tributação regular Código da Classificação Tributária do IBS e da CBS de tributação regular - - +unchanged NFSe/infNFSe/DPS/infDPS/IBSCBS/valores/trib/gIBSCBS/gDif 412 434 G G - - 0-1 0-1 - - Grupo de informações relacionadas ao diferimento para IBS e CBS Grupo de informações relacionadas ao diferimento para IBS e CBS - - +unchanged NFSe/infNFSe/DPS/infDPS/IBSCBS/valores/trib/gIBSCBS/gDif/pDifUF 413 435 E E N N 1-1 1-1 1-3V2 1-3V2 Percentual de diferimento para o IBS estadual. Percentual de diferimento para o IBS estadual. - - +unchanged NFSe/infNFSe/DPS/infDPS/IBSCBS/valores/trib/gIBSCBS/gDif/pDifMun 414 436 E E N N 1-1 1-1 1-3V2 1-3V2 Percentual de diferimento para o IBS municipal. Percentual de diferimento para o IBS municipal. - - +unchanged NFSe/infNFSe/DPS/infDPS/IBSCBS/valores/trib/gIBSCBS/gDif/pDifCBS 415 437 E E N N 1-1 1-1 1-3V2 1-3V2 Percentual de diferimento para a CBS. Percentual de diferimento para a CBS. - - +added NFSe/infNFSe/DPS/infDPS/IBSCBS/valores/trib/gIBSCBS/gEstornoCred 438 G - 0-1 - Grupo de informações relacionadas aos estornos de créditos do IBS e da CBS. A obrigatoriedade ou a vedação do preenchimento deste grupo está condicionada ao indicador “ind_gEstornoCred” da tabela de cClassTrib do IBS e da CBS. +added NFSe/infNFSe/DPS/infDPS/IBSCBS/valores/trib/gIBSCBS/gEstornoCred/vIBSEstCred 439 E N 1-1 1-15V2 Valor do IBS a ser estornado. +added NFSe/infNFSe/DPS/infDPS/IBSCBS/valores/trib/gIBSCBS/gEstornoCred/vCBSEstCred 440 E N 1-1 1-15V2 Valor da CBS a ser estornado. +added NFSe/infNFSe/DPS/infDPS/IBSCBS/valores/trib/gIBSCBS/gPagAntecipado 441 G - 0-1 - Grupo de referenciamento das NFS-e de pagamento antecipado para abatimento. +added NFSe/infNFSe/DPS/infDPS/IBSCBS/valores/trib/gIBSCBS/gPagAntecipado/refNFSe 442 E C 1-99 50 Chave da NFS-e de pagamento antecipado referenciada. Referência uma NFS-e de pagamento antecipado emitida anteriormente. +added NFSe/infNFSe/DPS/infDPS/IBSCBS/gPgtoVinc 443 G - 0-1 - Grupo de informações da vinculação com a transação de pagamento +added NFSe/infNFSe/DPS/infDPS/IBSCBS/gPgtoVinc/pgto 444 G - 1-99 - Dados dos pagamentos vinculados à NFS-e +added NFSe/infNFSe/DPS/infDPS/IBSCBS/gPgtoVinc/pgto/nPag 445 E N 1-1 3 Numerador único de cada pagamento +added NFSe/infNFSe/DPS/infDPS/IBSCBS/gPgtoVinc/pgto/idTransacao 446 E C 1-1 2-35 Identificador específico da transação financeira, de acordo com o pagamento. Schema deve impedir que se repita dentro do grupo +added NFSe/infNFSe/DPS/infDPS/IBSCBS/gPgtoVinc/pgto/tpMeioPgto 447 E N 1-1 2 Código do meio de pagamento utilizado: 15 = Boleto 17 = Pix QRCode dinâmico 18 = TED 20 = PIX chave ou QRCode estático 23 = Pix automático 24 = TEF / booktransfer +added NFSe/infNFSe/DPS/infDPS/IBSCBS/gPgtoVinc/pgto/CNPJReceb 448 E C 1-1 14 CNPJ completo do recebedor do pagamento (fornecedor, plataforma, ou outra entidade que receba o pagamento do adquirente). Indicar o CNPJ responsável por receber dinheiro do adquirente na transação de pagamento. É possível que o CNPJ do recebedor seja diferente do CNPJ do fornecedor constante no documento fiscal. +added NFSe/infNFSe/DPS/infDPS/IBSCBS/gPgtoVinc/pgto/CNPJBasePSP 449 E C 1-1 8 CNPJ base da instituição financeira ou de pagamento utilizada pelo recebedor do pagamento (fornecedor, plataforma, ou outra entidade que receba o pagamento do adquirente). Indicar o CNPJ responsável por receber dinheiro do adquirente na transação de pagamento. É possível que o CNPJ do recebedor seja diferente do CNPJ do fornecedor constante no documento fiscal. +unchanged NFSe/infNFSe/DPS/infDPS/Signature 416 450 G G - - 0-1 0-1 - - Assinatura XML da NFS-e Segundo o Padrão XML Digital Signature Obrigatório quando for enviado para API. Demais casos poderão ser opcionais a serem definidos em regra de validação. Assinatura XML da NFS-e Segundo o Padrão XML Digital Signature Obrigatório quando for enviado para API. Demais casos poderão ser opcionais a serem definidos em regra de validação. - - +removed NFSe/infNFSe/DPS/infDPS/serv/comExt/nDI 208 E C 0-1 1-12 Número da Declaração de Importação (DI/DSI/DA/DRI-E) averbado. - +removed NFSe/infNFSe/DPS/infDPS/serv/comExt/nRE 209 E C 0-1 12 Número do Registro de Exportação (RE) averbado. - +removed NFSe/infNFSe/DPS/infDPS/valores/vDedRed 254 G - 0-1 - Grupo de informações relativas ao valores para dedução/redução do valor da base de cálculo (valor do serviço) Aqui referenciadas as deduções/reduções que serão consideradas apenas para a Base de Cálculo do ISSQN. +removed NFSe/infNFSe/DPS/infDPS/valores/vDedRed/pDR 255 CE N 1-1 1-3V2 Valor percentual padrão para dedução/redução do valor do serviço. As três opções para informação de Dedução/Redução, caso exista, são: Valor, Percentual ou Documento; +removed NFSe/infNFSe/DPS/infDPS/valores/vDedRed/vDR 256 CE N 1-1 1-15V2 Valor monetário padrão para dedução/redução do valor do serviço. As três opções para informação de Dedução/Redução, caso exista, são: Valor, Percentual ou Documento; +removed NFSe/infNFSe/DPS/infDPS/valores/vDedRed/documentos 257 CG - 1-1 - Grupo de informações de documento utilizado para dedução/redução do valor da base de cálculo (valor do serviço) As três opções para informação de Dedução/Redução, caso exista, são: Valor, Percentual ou Documento; +removed NFSe/infNFSe/DPS/infDPS/valores/vDedRed/documentos/docDedRed 258 G - 1-1000 - Grupo de informações de documento utilizado para dedução/redução do valor da base de cálculo (valor do serviço) As três opções para informação de Dedução/Redução, caso exista, são: Valor, Percentual ou Documento; +removed NFSe/infNFSe/DPS/infDPS/valores/vDedRed/documentos/docDedRed/chNFSe 259 CE N 1-1 50 Chave de acesso da NFS-e (padrão nacional). Para o caso de informação de documento para Dedução/Redução existem seis opções possíveis: NFS-e, NF-e, Outras NFS-e, NFS/NFS (Modelo não eletrônico), Outros documentos fiscais e Outros documentos; +removed NFSe/infNFSe/DPS/infDPS/valores/vDedRed/documentos/docDedRed/chNFe 260 CE N 1-1 44 Chave de acesso da NF-e. Para o caso de informação de documento para Dedução/Redução existem seis opções possíveis: NFS-e, NF-e, Outras NFS-e, NFS/NFS (Modelo não eletrônico), Outros documentos fiscais e Outros documentos; +removed NFSe/infNFSe/DPS/infDPS/valores/vDedRed/documentos/docDedRed/NFSeMun 261 CG - 1-1 - Grupo de informações para outras notas eletrônicas municipais (Nota eletrônica municipal emitida fora do padrão nacional) Para o caso de informação de documento para Dedução/Redução existem seis opções possíveis: NFS-e, NF-e, Outras NFS-e, NFS/NFS (Modelo não eletrônico), Outros documentos fiscais e Outros documentos; +removed NFSe/infNFSe/DPS/infDPS/valores/vDedRed/documentos/docDedRed/NFSeMun/cMunNFSeMun 262 E N 1-1 7 Código Município emissor da nota eletrônica municipal. (Tabela do IBGE) Para o caso de informação de documento para Dedução/Redução existem seis opções possíveis: NFS-e, NF-e, Outras NFS-e, NFS/NFS (Modelo não eletrônico), Outros documentos fiscais e Outros documentos; +removed NFSe/infNFSe/DPS/infDPS/valores/vDedRed/documentos/docDedRed/NFSeMun/nNFSeMun 263 E N 1-1 15 Número da nota eletrônica municipal. Para o caso de informação de documento para Dedução/Redução existem seis opções possíveis: NFS-e, NF-e, Outras NFS-e, NFS/NFS (Modelo não eletrônico), Outros documentos fiscais e Outros documentos; +removed NFSe/infNFSe/DPS/infDPS/valores/vDedRed/documentos/docDedRed/NFSeMun/cVerifNFSeMun 264 E C 1-1 9 Código de Verificação da nota eletrônica municipal. Para o caso de informação de documento para Dedução/Redução existem seis opções possíveis: NFS-e, NF-e, Outras NFS-e, NFS/NFS (Modelo não eletrônico), Outros documentos fiscais e Outros documentos; +removed NFSe/infNFSe/DPS/infDPS/valores/vDedRed/documentos/docDedRed/NFNFS 265 CG - 1-1 - Grupo de informações de NF ou NFS (Modelo não eletrônico) Para o caso de informação de documento para Dedução/Redução existem seis opções possíveis: NFS-e, NF-e, Outras NFS-e, NFS/NFS (Modelo não eletrônico), Outros documentos fiscais e Outros documentos; +removed NFSe/infNFSe/DPS/infDPS/valores/vDedRed/documentos/docDedRed/NFNFS/nNFS 266 E N 1-1 7 Número da Nota Fiscal NF ou NFS. Para o caso de informação de documento para Dedução/Redução existem seis opções possíveis: NFS-e, NF-e, Outras NFS-e, NFS/NFS (Modelo não eletrônico), Outros documentos fiscais e Outros documentos; +removed NFSe/infNFSe/DPS/infDPS/valores/vDedRed/documentos/docDedRed/NFNFS/modNFS 267 E N 1-1 15 Modelo da Nota Fiscal NF ou NFS. Para o caso de informação de documento para Dedução/Redução existem seis opções possíveis: NFS-e, NF-e, Outras NFS-e, NFS/NFS (Modelo não eletrônico), Outros documentos fiscais e Outros documentos; +removed NFSe/infNFSe/DPS/infDPS/valores/vDedRed/documentos/docDedRed/NFNFS/serieNFS 268 E C 1-1 9 Série Nota Fiscal NF ou NFS. Para o caso de informação de documento para Dedução/Redução existem seis opções possíveis: NFS-e, NF-e, Outras NFS-e, NFS/NFS (Modelo não eletrônico), Outros documentos fiscais e Outros documentos; +removed NFSe/infNFSe/DPS/infDPS/valores/vDedRed/documentos/docDedRed/nDocFisc 269 CE C 1-1 255 Identificador de documento fiscal diferente dos demais do grupo. Para o caso de informação de documento para Dedução/Redução existem seis opções possíveis: NFS-e, NF-e, Outras NFS-e, NFS/NFS (Modelo não eletrônico), Outros documentos fiscais e Outros documentos; +removed NFSe/infNFSe/DPS/infDPS/valores/vDedRed/documentos/docDedRed/nDoc 270 CE C 1-1 255 Identificador de documento não fiscal diferente dos demais do grupo. Para o caso de informação de documento para Dedução/Redução existem seis opções possíveis: NFS-e, NF-e, Outras NFS-e, NFS/NFS (Modelo não eletrônico), Outros documentos fiscais e Outros documentos; +removed NFSe/infNFSe/DPS/infDPS/valores/vDedRed/documentos/docDedRed/tpDedRed 271 E N 1-1 2 Tipo da Dedução/Redução: 01 – Alimentação e bebidas/frigobar; 02 – Materiais; 03 - Produção Externa; 04 - Reembolso de despesas; 05 – Repasse consorciado; 06 – Repasse plano de saúde; 07 – Serviços; 08 – Subempreitada de mão de obra; 99 – Outras deduções; O grupo de informações de documentos para dedução/redução pode não ter correspondência para Municípios que não utilizem o padrão ABRASF na versão 2.04. Nesse caso, sugere-se que o Município que vá utilizar a transcrição da NFS-e do padrão de seu emissor para o padrão nacional, para encaminhamento ao ADN, apenas para essa fase inicial de implantação do padrão, utilize nessa operação o valor obtido como dedução/redução e o informe como “valor monetário”, e não “documentos”. Nesse sentido, também o Painel Administrativo Municipal deve ser parametrizado como dedução por “valor monetário” para o código de serviço correspondente, até que seu emissor próprio passe a refletir na origem o padrão nacional. A partir de janeiro de 2026, o tipo de dedução/redução " 01 – Alimentação e bebidas/frigobar" não será mais permitido. +removed NFSe/infNFSe/DPS/infDPS/valores/vDedRed/documentos/docDedRed/xDescOutDed 272 E C 0-1 150 Descrição da Dedução/Redução quando a opção é "99 – Outras Deduções". - +removed NFSe/infNFSe/DPS/infDPS/valores/vDedRed/documentos/docDedRed/dtEmiDoc 273 E D 1-1 - Data da emissão do documento dedutível. Ano, mês e dia (AAAA-MM-DD) - +removed NFSe/infNFSe/DPS/infDPS/valores/vDedRed/documentos/docDedRed/vDedutivelRedutivel 274 E N 1-1 1-15V2 Valor monetário total dedutível/redutível no documento informado (R$). Este é o valor total no documento informado que é passível de dedução/redução. - +removed NFSe/infNFSe/DPS/infDPS/valores/vDedRed/documentos/docDedRed/vDeducaoReducao 275 E N 1-1 1-15V2 Valor monetário utilizado para dedução/redução do valor do serviço da NFS-e que está sendo emitida (R$). Deve ser menor ou igual ao valor deduzível/redutível (vDedutivelRedutivel). - +removed NFSe/infNFSe/DPS/infDPS/valores/vDedRed/documentos/docDedRed/fornec 276 G - 0-1 - Grupo de informações do fornecedor do serviço prestado - +removed NFSe/infNFSe/DPS/infDPS/valores/vDedRed/documentos/docDedRed/fornec/CNPJ 277 CE N 1-1 14 Número da inscrição federal (CNPJ) do fornecedor de serviço. - +removed NFSe/infNFSe/DPS/infDPS/valores/vDedRed/documentos/docDedRed/fornec/CPF 278 CE N 1-1 11 Número da inscrição federal (CPF) do fornecedor do serviço. - +removed NFSe/infNFSe/DPS/infDPS/valores/vDedRed/documentos/docDedRed/fornec/NIF 279 CE C 1-1 40 Este elemento só deverá ser preenchido para fornecedores não residentes no Brasil. - +removed NFSe/infNFSe/DPS/infDPS/valores/vDedRed/documentos/docDedRed/fornec/cNaoNIF 280 CE N 1-1 1 Motivo para não informação do NIF: 0 - Não informado na nota de origem; 1 - Dispensado do NIF; 2 - Não exigência do NIF; O valor 0 deve ser utilizado como opção de preenchimento do campo somente no compartilhamento de NFS-e pelo municipio com o ADN NFS-e. +removed NFSe/infNFSe/DPS/infDPS/valores/vDedRed/documentos/docDedRed/fornec/CAEPF 281 E N 0-1 14 Número do Cadastro de Atividade Econômica da Pessoa Física (CAEPF). - +removed NFSe/infNFSe/DPS/infDPS/valores/vDedRed/documentos/docDedRed/fornec/IM 282 E C 0-1 15 Número do indicador municipal do fornecedor. - +removed NFSe/infNFSe/DPS/infDPS/valores/vDedRed/documentos/docDedRed/fornec/xNome 283 E C 1-1 150 Nome / Razão Social do fornecedor. - +removed NFSe/infNFSe/DPS/infDPS/valores/vDedRed/documentos/docDedRed/fornec/end 284 G - 0-1 - Grupo de informações do endereço do fornecedor. - +removed NFSe/infNFSe/DPS/infDPS/valores/vDedRed/documentos/docDedRed/fornec/end/endNac 285 CG - 1-1 - Grupo de informações do endereço nacional. - +removed NFSe/infNFSe/DPS/infDPS/valores/vDedRed/documentos/docDedRed/fornec/end/endNac/cMun 286 E N 1-1 7 Código do município do endereço do fornecedor. (Tabela do IBGE) - +removed NFSe/infNFSe/DPS/infDPS/valores/vDedRed/documentos/docDedRed/fornec/end/endNac/CEP 287 E C 1-1 8 Código numérico do Endereçamento Postal nacional (CEP) do endereço do fornecedor. - +removed NFSe/infNFSe/DPS/infDPS/valores/vDedRed/documentos/docDedRed/fornec/end/endExt 288 CG - 1-1 - Grupo de informações do endereço no exterior. - +removed NFSe/infNFSe/DPS/infDPS/valores/vDedRed/documentos/docDedRed/fornec/end/endExt/cPais 289 E C 1-1 2 Código do país do endereço do prestador do fornecedor. (Tabela de Países ISO) - +removed NFSe/infNFSe/DPS/infDPS/valores/vDedRed/documentos/docDedRed/fornec/end/endExt/cEndPost 290 E C 1-1 1-11 Código alfanumérico do Endereçamento Postal no exterior do fornecedor. - +removed NFSe/infNFSe/DPS/infDPS/valores/vDedRed/documentos/docDedRed/fornec/end/endExt/xCidade 291 E C 1-1 1-60 Nome da cidade no exterior do fornecedor. - +removed NFSe/infNFSe/DPS/infDPS/valores/vDedRed/documentos/docDedRed/fornec/end/endExt/xEstProvReg 292 E C 1-1 1-60 Estado, província ou região da cidade no exterior do fornecedor. - +removed NFSe/infNFSe/DPS/infDPS/valores/vDedRed/documentos/docDedRed/fornec/xLgr 293 E C 1-1 1-255 Tipo e nome do logradouro do endereço do fornecedor. - +removed NFSe/infNFSe/DPS/infDPS/valores/vDedRed/documentos/docDedRed/fornec/nro 294 E C 1-1 1-60 Número no logradouro do endereço do fornecedor. - +removed NFSe/infNFSe/DPS/infDPS/valores/vDedRed/documentos/docDedRed/fornec/xCpl 295 E C 0-1 1-156 Complemento do endereço do fornecedor. - +removed NFSe/infNFSe/DPS/infDPS/valores/vDedRed/documentos/docDedRed/fornec/xBairro 296 E C 1-1 1-60 Bairro do endereço do fornecedor. - +removed NFSe/infNFSe/DPS/infDPS/valores/vDedRed/documentos/docDedRed/fornec/fone 297 E N 0-1 6-20 Número do telefone do fornecedor. (Preencher com o Código DDD + número do telefone. Nas operações com exterior é permitido informar o código do país + código da localidade + número do telefone) - +removed NFSe/infNFSe/DPS/infDPS/valores/vDedRed/documentos/docDedRed/fornec/email 298 E C 0-1 1-80 E-mail do fornecedor. - +removed NFSe/infNFSe/DPS/infDPS/valorestrib/totTrib/pTotTrib 330 CG - 1-1 - Valor percentual total aproximado dos tributos, em conformidade com o artigo 1o da Lei no 12.741/2012 +removed NFSe/infNFSe/DPS/infDPS/IBSCBS/finNFSe 337 E N 1-1 1 Indicador da finalidade da emissão de NFS-e 0 = NFS-e regular; - +removed NFSe/infNFSe/DPS/infDPS/IBSCBS/indDest 344 E N 1-1 1 A respeito do Destinatário dos serviços: 0 – o destinatário é o próprio tomador/adquirente identificado na NFS-e (tomador=adquirente=destinatário); 1 – o destinatário não é o próprio adquirente, podendo ser outra pessoa, física ou jurídica (ou equiparada), ou um estabelecimento diferente do indicado como tomador (tomador=adquirente≠destinatário); - +removed NFSe/infNFSe/DPS/infDPS/IBSCBS/dest 345 G - 0-1 - Grupo de informações relativas ao Destinatário - +removed NFSe/infNFSe/DPS/infDPS/IBSCBS/dest/CNPJ 346 CE N 1-1 14 Número da inscrição no Cadastro Nacional de Pessoa Jurídica (CNPJ) do destinatário de serviço - +removed NFSe/infNFSe/DPS/infDPS/IBSCBS/dest/CPF 347 CE N 1-1 11 Número da inscrição no Cadastro Nacional de Pessoa Física (CPF) do destinatário do serviço - +removed NFSe/infNFSe/DPS/infDPS/IBSCBS/dest/NIF 348 CE C 1-1 40 Número de identificação fiscal fornecido por órgão de administração tributária no exterior - +removed NFSe/infNFSe/DPS/infDPS/IBSCBS/dest/cNaoNIF 349 CE N 1-1 1 Motivo para não informação do NIF: 0 - Não informado na nota de origem; 1 - Dispensado do NIF; 2 - Não exigência do NIF; - +removed NFSe/infNFSe/DPS/infDPS/IBSCBS/dest/xNome 350 E C 1-1 1-150 Nome / Nome Empresarial do destinatário - +removed NFSe/infNFSe/DPS/infDPS/IBSCBS/dest/end 351 G - 0-1 - Grupo de informações do endereço do destinatário do serviço. - +removed NFSe/infNFSe/DPS/infDPS/IBSCBS/dest/end/endNac 352 CG - 1-1 - Grupo de informações do endereço nacional. - +removed NFSe/infNFSe/DPS/infDPS/IBSCBS/dest/end/endNac/cMun 353 E N 1-1 7 Código do município do endereço do destinatário do serviço. (Tabela do IBGE) - +removed NFSe/infNFSe/DPS/infDPS/IBSCBS/dest/end/endNac/CEP 354 E N 1-1 8 Código numérico do Endereçamento Postal nacional (CEP) do endereço do destinatário do serviço. (Informar os zeros não significativos) - +removed NFSe/infNFSe/DPS/infDPS/IBSCBS/dest/end/endExt 355 CG - 1-1 - Grupo de informações do endereço no exterior. - +removed NFSe/infNFSe/DPS/infDPS/IBSCBS/dest/end/endExt/cPais 356 E C 1-1 2 Código do país do endereço do destinatário do serviço. (Tabela de Países ISO) - +removed NFSe/infNFSe/DPS/infDPS/IBSCBS/dest/end/endExt/cEndPost 357 E C 1-1 1-11 Código alfanumérico do Endereçamento Postal no exterior do destinatário do serviço. - +removed NFSe/infNFSe/DPS/infDPS/IBSCBS/dest/end/endExt/xCidade 358 E C 1-1 1-60 Nome da cidade no exterior do destinatário do serviço. - +removed NFSe/infNFSe/DPS/infDPS/IBSCBS/dest/end/endExt/xEstProvReg 359 E C 1-1 1-60 Estado, província ou região da cidade no exterior do destinatário do serviço. - +removed NFSe/infNFSe/DPS/infDPS/IBSCBS/dest/end/xLgr 360 E C 1-1 1-255 Tipo e nome do logradouro do endereço do destinatário do serviço. - +removed NFSe/infNFSe/DPS/infDPS/IBSCBS/dest/end/nro 361 E C 1-1 1-60 Número no logradouro do endereço do destinatário do serviço. - +removed NFSe/infNFSe/DPS/infDPS/IBSCBS/dest/end/xCpl 362 E C 0-1 1-156 Complemento do endereço do destinatário do serviço. - +removed NFSe/infNFSe/DPS/infDPS/IBSCBS/dest/end/xBairro 363 E C 1-1 1-60 Bairro do endereço do destinatário do serviço. - +removed NFSe/infNFSe/DPS/infDPS/IBSCBS/dest/fone 364 E N 0-1 6-20 Número do telefone do destinatário. (Preencher com o Código DDD + número do telefone. Nas operações com exterior é permitido informar o código do país + código da localidade + número do telefone) - +removed NFSe/infNFSe/DPS/infDPS/IBSCBS/dest/email 365 E C 0-1 1-80 E-mail do destinatário. - +removed NFSe/infNFSe/DPS/infDPS/IBSCBS/imovel/inscImobFisc 367 E C 0-1 1-30 Inscrição imobiliária fiscal (código fornecido pela prefeitura para a identificação da obra ou para fins de recolhimento do IPTU) - +removed NFSe/infNFSe/DPS/infDPS/IBSCBS/imovel/cCIB 368 CE C 1-1 8 Código do Cadastro Imobiliário Brasileiro - CIB +removed NFSe/infNFSe/DPS/infDPS/IBSCBS/imovel/end 369 CG - 1-1 - Grupo de informações do endereço do imóvel. - +removed NFSe/infNFSe/DPS/infDPS/IBSCBS/imovel/end/CEP 370 CE N 1-1 8 Código numérico do Endereçamento Postal nacional (CEP) do endereço do imóvel. (Informar os zeros não significativos) - +removed NFSe/infNFSe/DPS/infDPS/IBSCBS/imovel/end/endExt 371 CG - 1-1 - Grupo de informações descritivas do endereço do imóvel no exterior. - +removed NFSe/infNFSe/DPS/infDPS/IBSCBS/imovel/end/endExt/cEndPost 372 E C 1-1 1-11 Código de Endereçamento Postal alfanumérico do endereço do imóvel no exterior. - +removed NFSe/infNFSe/DPS/infDPS/IBSCBS/imovel/end/endExt/xCidade 373 E C 1-1 1-60 Nome da cidade no exterior, local do imóvel. - +removed NFSe/infNFSe/DPS/infDPS/IBSCBS/imovel/end/endExt/xEstProvReg 374 E C 1-1 1-60 Estado, província ou região da cidade no exterior, local do imóvel. - +removed NFSe/infNFSe/DPS/infDPS/IBSCBS/imovel/end/xLgr 375 E C 1-1 1-255 Tipo e nome do logradouro do endereço do imóvel. - +removed NFSe/infNFSe/DPS/infDPS/IBSCBS/imovel/end/nro 376 E C 1-1 1-60 Número no logradouro do endereço do imóvel. - +removed NFSe/infNFSe/DPS/infDPS/IBSCBS/imovel/end/xCpl 377 E C 0-1 1-156 Complemento do endereço do imóvel. - +removed NFSe/infNFSe/DPS/infDPS/IBSCBS/imovel/end/xBairro 378 E C 1-1 1-60 Bairro do endereço do imóvel. - +removed NFSe/infNFSe/DPS/infDPS/IBSCBS/valores/gReeRepRes 380 G - 0-1 - Grupo de informações relativas a valores incluídos neste documento e recebidos por motivo de estarem relacionadas a operações de terceiros, objeto de reembolso, repasse ou ressarcimento pelo recebedor, já tributados e aqui referenciados - +removed NFSe/infNFSe/DPS/infDPS/IBSCBS/valores/gReeRepRes/documentos 381 G - 1-1000 - Grupo relativo aos documentos referenciados nos casos de reembolso, repasse e ressarcimento que serão considerados na base de cálculo do ISSQN, do IBS e da CBS. - +removed NFSe/infNFSe/DPS/infDPS/IBSCBS/valores/gReeRepRes/documentos/dFeNacional 382 CG - 1-1 - Grupo de informações de documentos fiscais eletrônicos que se encontram no repositório nacional. - +removed NFSe/infNFSe/DPS/infDPS/IBSCBS/valores/gReeRepRes/documentos/dFeNacional/tipoChaveDFe 383 E N 1-1 1 Documento fiscal a que se refere a chaveDfe que seja um dos documentos do Repositório Nacional: 1 = NFS-e; 2 = NF-e; 3 = CT-e; 9 = Outro; - +removed NFSe/infNFSe/DPS/infDPS/IBSCBS/valores/gReeRepRes/documentos/dFeNacional/xTipoChaveDFe 384 E C 0-1 1-255 Descrição da DF-e a que se refere a chaveDfe que seja um dos documentos do Repositório Nacional. Deve ser preenchido apenas quando tipoChaveDFe = 9 (Outro). - +removed NFSe/infNFSe/DPS/infDPS/IBSCBS/valores/gReeRepRes/documentos/dFeNacional/chaveDFe 385 E C 1-1 1-50 Chave do Documento Fiscal eletrônico do repositório nacional referenciado para os casos de operações já tributadas. - +removed NFSe/infNFSe/DPS/infDPS/IBSCBS/valores/gReeRepRes/documentos/docFiscalOutro 386 CG - 1-1 - Grupo de informações de documento fiscais, eletrônicos ou não, que não se encontram no repositório nacional. - +removed NFSe/infNFSe/DPS/infDPS/IBSCBS/valores/gReeRepRes/documentos/docFiscalOutro/cMunDocFiscal 387 E N 1-1 7 Código do município emissor do documento fiscal que não se encontra no repositório nacional - +removed NFSe/infNFSe/DPS/infDPS/IBSCBS/valores/gReeRepRes/documentos/docFiscalOutro/nDocFiscal 388 E C 1-1 1-255 Número do documento fiscal que não se encontra no repositório nacional - +removed NFSe/infNFSe/DPS/infDPS/IBSCBS/valores/gReeRepRes/documentos/docFiscalOutro/xDocFiscal 389 E C 1-1 1-255 Descrição do documento fiscal - +removed NFSe/infNFSe/DPS/infDPS/IBSCBS/valores/gReeRepRes/documentos/docOutro 390 CG - 1-1 - Grupo de informações de documento não fiscal. - +removed NFSe/infNFSe/DPS/infDPS/IBSCBS/valores/gReeRepRes/documentos/docOutro/nDoc 391 E C 1-1 1-255 Número do documento não fiscal. - +removed NFSe/infNFSe/DPS/infDPS/IBSCBS/valores/gReeRepRes/documentos/docOutro/xDoc 392 E C 1-1 1-255 Descrição do documento não fiscal. - +removed NFSe/infNFSe/DPS/infDPS/IBSCBS/valores/gReeRepRes/documentos/fornec 393 G - 0-1 - Grupo de informações do fornecedor do documento referenciado - +removed NFSe/infNFSe/DPS/infDPS/IBSCBS/valores/gReeRepRes/documentos/fornec/CNPJ 394 CE N 1-1 14 Número da inscrição federal (CNPJ) do fornecedor. - +removed NFSe/infNFSe/DPS/infDPS/IBSCBS/valores/gReeRepRes/documentos/fornec/CPF 395 CE N 1-1 11 Número da inscrição federal (CPF) do fornecedor. - +removed NFSe/infNFSe/DPS/infDPS/IBSCBS/valores/gReeRepRes/documentos/fornec/NIF 396 CE C 1-1 40 Este elemento só deverá ser preenchido para fornecedores não residentes no Brasil. - +removed NFSe/infNFSe/DPS/infDPS/IBSCBS/valores/gReeRepRes/documentos/fornec/cNaoNIF 397 CE N 1-1 1 Motivo para não informação do NIF: 0 - Não informado na nota de origem; 1 - Dispensado do NIF; 2 - Não exigência do NIF; O valor 0 deve ser utilizado como opção de preenchimento do campo somente no compartilhamento de NFS-e pelo municipio com o ADN NFS-e. +removed NFSe/infNFSe/DPS/infDPS/IBSCBS/valores/gReeRepRes/documentos/fornec/xNome 398 E C 1-1 1-150 Nome / Razão Social do fornecedor. +removed NFSe/infNFSe/DPS/infDPS/IBSCBS/valores/gReeRepRes/documentos/dtEmiDoc 399 E D 1-1 - Data da emissão do documento dedutível. Ano, mês e dia (AAAA-MM-DD) - +removed NFSe/infNFSe/DPS/infDPS/IBSCBS/valores/gReeRepRes/documentos/dtCompDoc 400 E D 1-1 - Data da competência do documento dedutível. Ano, mês e dia (AAAA-MM-DD) - +removed NFSe/infNFSe/DPS/infDPS/IBSCBS/valores/gReeRepRes/documentos/tpReeRepRes 401 E N 1-1 2 Tipo de valor incluído neste documento, recebido por motivo de estarem relacionadas a operações de terceiros, objeto de reembolso, repasse ou ressarcimento pelo recebedor, já tributados e aqui referenciados 01 = Repasse de remuneração por intermediação de imóveis a demais corretores envolvidos na operação 02 = Repasse de valores a fornecedor relativo a fornecimento intermediado por agência de turismo 03 = Reembolso ou ressarcimento recebido por agência de propaganda e publicidade por valores pagos relativos a serviços de produção externa por conta e ordem de terceiro 04 = Reembolso ou ressarcimento recebido por agência de propaganda e publicidade por valores pagos relativos a serviços de mídia por conta e ordem de terceiro 99 = Outros reembolsos ou ressarcimentos recebidos por valores pagos relativos a operações por conta e ordem de terceiro - +removed NFSe/infNFSe/DPS/infDPS/IBSCBS/valores/gReeRepRes/documentos/xTpReeRepRes 402 E C 0-1 0-150 Descrição do reembolso ou ressarcimento quando a opção é "99 – Outros reembolsos ou ressarcimentos recebidos por valores pagos relativos a operações por conta e ordem de terceiro". - +removed NFSe/infNFSe/DPS/infDPS/IBSCBS/valores/gReeRepRes/documentos/vlrReeRepRes 403 E N 1-1 1-15V2 Valor monetário (total ou parcial, conforme documento informado) utilizado para não inclusão na base de cálculo do ISS e do IBS e da CBS da NFS-e que está sendo emitida (R$). - +removed NFSe/infNFSe/DPS/infDPS/IBSCBS/valores/trib/gIBSCBS/CST 406 E N 1-1 3 Código de Situação Tributária do IBS e da CBS - +removed NFSe/infNFSe/DPS/infDPS/IBSCBS/valores/trib/gIBSCBS/cClassTrib 407 E N 1-1 6 Código de Classificação Tributária do IBS e da CBS - diff --git a/resources/domains/sources.json b/resources/domains/sources.json index a09dd2e..dcc0e06 100644 --- a/resources/domains/sources.json +++ b/resources/domains/sources.json @@ -32,6 +32,16 @@ "index_url": "https://www.gov.br/nfse/pt-br/biblioteca/documentacao-tecnica/documentacao-atual", "file_pattern": "anexo[-_]c[-_].*indop" }, + { + "id": "annex-i-production", + "version": "ANEXO_I-SEFIN_ADN-DPS_NFSe-SNNFSe v1.01 (20260209)", + "environment": "production", + "type": "xlsx", + "url": "https://www.gov.br/nfse/pt-br/biblioteca/documentacao-tecnica/documentacao-atual/anexo_i-sefin_adn-dps_nfse-snnfse-v1-01-20260209.xlsx", + "observed_sha256": "de5bc492959eadc8bfa7540e16939995924f2188f743648eaf84d3b31e9eeb7c", + "index_url": "https://www.gov.br/nfse/pt-br/biblioteca/documentacao-tecnica/documentacao-atual", + "file_pattern": "anexo[_-]i[-_].*dps" + }, { "id": "annex-vi-nt009", "version": "ANEXO_VI v1.04.01", @@ -51,7 +61,27 @@ "observed_sha256": "95f30a44ee94adeea57fb92f3a0337b1e62fdc106f393e73894087889be9e5aa", "index_url": "https://www.gov.br/nfse/pt-br/biblioteca/documentacao-tecnica/rtc", "file_pattern": "anexovii[-_]indop" + }, + { + "id": "xsd-production-20260209", + "version": "NFSe-ESQUEMAS_XSD-v1.01-20260209", + "environment": "production", + "type": "zip", + "url": "https://www.gov.br/nfse/pt-br/biblioteca/documentacao-tecnica/documentacao-atual/nfse-esquemas_xsd-v1-01-20260209.zip", + "observed_sha256": "e7935cbd9470527c6cc32984c1b2263e614183bf0139ce2733eaaed2de9a8072", + "index_url": "https://www.gov.br/nfse/pt-br/biblioteca/documentacao-tecnica/documentacao-atual", + "file_pattern": "nfse[-_]esquemas[_-]xsd" + }, + { + "id": "xsd-restricted-20260727", + "version": "NFSe-ESQUEMAS_XSD-PRODREST-v1.01-20260727", + "environment": "restricted-production", + "type": "zip", + "url": "https://www.gov.br/nfse/pt-br/biblioteca/documentacao-tecnica/producao-restrita/esquemas-nfse-rtc-v1-01-20260727.zip", + "observed_sha256": "6c7e0510d3ecff4454f291f4e10b742d27a4818f23aab181494f96d0ea79f3dc", + "index_url": "https://www.gov.br/nfse/pt-br/biblioteca/documentacao-tecnica/producao-restrita", + "file_pattern": "esquemas[-_]nfse[-_]rtc" } ], - "checksum_provenance": "Anexo A, B and C SHA-256 verified by direct downloads from the official NFS-e portal in GitHub Actions on 2026-10-08; Anexo VI and VII observed on 2026-10-05 independently and verified against direct official downloads on 2026-10-08. These are not government-issued digital signatures." + "checksum_provenance": "Anexo A, B and C SHA-256 verified by direct downloads from the official NFS-e portal in GitHub Actions on 2026-10-08; Anexo VI and VII observed on 2026-10-05 independently and verified against direct official downloads on 2026-10-08. These are not government-issued digital signatures. Original production Annex I v1.01 directly downloaded from www.gov.br/nfse in a GitHub Actions job on 2026-10-08 (Brazil local date) and recorded by observed SHA-256; not a government signature. Production and restricted-production v1.01 XSD ZIP SHA-256 were observed by direct official portal downloads in a GitHub Actions job on 2026-10-08 (Brazil local date); these are not government signatures." } diff --git a/src/Domain/OfficialDomainCatalog.php b/src/Domain/OfficialDomainCatalog.php index 1e4229a..5e17a2d 100644 --- a/src/Domain/OfficialDomainCatalog.php +++ b/src/Domain/OfficialDomainCatalog.php @@ -19,6 +19,7 @@ final class OfficialDomainCatalog public const MUNICIPALITY_COUNTRY_VERSION = 'ANEXO_A v1.00 (20251210)'; public const SERVICE_NBS_VERSION = 'ANEXO_B v1.01 (20260122)'; public const OPERATION_INDICATOR_VERSION = 'ANEXO_C v1.01 (20260122)'; + public const OPERATION_INDICATOR_NT009_VERSION = 'ANEXO_VII v1.03.00 (NT009 v1.01)'; /** @var array>> */ private array $cache = []; @@ -85,9 +86,16 @@ public function nbs(string $code): ?array /** * @return array{code:string,characteristic:string,location:string}|null */ - public function operationIndicator(string $code): ?array - { - $row = $this->table('indicadores-operacao-ibscbs-v1.01.tsv', 3)[$code] ?? null; + public function operationIndicator( + string $code, + string $version = self::OPERATION_INDICATOR_VERSION, + ): ?array { + $file = match ($version) { + self::OPERATION_INDICATOR_VERSION => 'indicadores-operacao-ibscbs-v1.01.tsv', + self::OPERATION_INDICATOR_NT009_VERSION => 'indicadores-operacao-ibscbs-v1.03.00.tsv', + default => throw new \InvalidArgumentException('Unsupported NFS-e operation-indicator version: ' . $version), + }; + $row = $this->table($file, 3)[$code] ?? null; return $row === null ? null : [ 'code' => $row[0], @@ -150,9 +158,22 @@ public function hasNbs(string $code): bool return $this->nbs($code) !== null; } - public function hasOperationIndicator(string $code): bool + public function hasOperationIndicator( + string $code, + string $version = self::OPERATION_INDICATOR_VERSION, + ): bool { + return $this->operationIndicator($code, $version) !== null; + } + + /** + * @return list + */ + public static function operationIndicatorVersions(): array { - return $this->operationIndicator($code) !== null; + return [ + self::OPERATION_INDICATOR_VERSION, + self::OPERATION_INDICATOR_NT009_VERSION, + ]; } /** diff --git a/src/Dto/Nt009DpsPreview.php b/src/Dto/Nt009DpsPreview.php new file mode 100644 index 0000000..b5dbac8 --- /dev/null +++ b/src/Dto/Nt009DpsPreview.php @@ -0,0 +1,22 @@ +rejectLegacyIbsCbs($dps); + $this->validatePreview($preview); + + // Reuse the exact existing DPS implementation, including identifiers + // and other older taxpayer fields, without replacing its public API. + $xml = $this->legacyBuilder->buildDps($dps); + $document = new \DOMDocument(); + $document->preserveWhiteSpace = false; + $document->formatOutput = true; + if (!$document->loadXML($xml, LIBXML_NONET)) { + throw new \LogicException('Legacy builder produced invalid XML'); + } + $infDps = $document->getElementsByTagName('infDPS')->item(0); + if (!$infDps instanceof \DOMElement) { + throw new \LogicException('Missing infDPS in legacy DPS'); + } + + $beforeMunicipality = $this->child($infDps, 'cLocEmi'); + if ($beforeMunicipality === null) { + throw new \LogicException('Missing legacy cLocEmi anchor'); + } + $infDps->insertBefore($document->createElement('finNFSe', (string) $preview->finalidade), $beforeMunicipality); + if ($preview->tipoNotaDebito !== null) { + $infDps->insertBefore($document->createElement('tpNFSeDebito', $preview->tipoNotaDebito), $beforeMunicipality); + } + if ($preview->tipoNotaCredito !== null) { + $infDps->insertBefore($document->createElement('tpNFSeCredito', $preview->tipoNotaCredito), $beforeMunicipality); + } + + // Official row order: prest/regTrib/opSimpNac, regApTribSN, + // regApIBSCBSSN, regEspTrib. + if ($preview->regimeApuracaoSimples !== null) { + $prest = $this->child($infDps, 'prest'); + $regTrib = $prest instanceof \DOMElement ? $this->child($prest, 'regTrib') : null; + if (!$regTrib instanceof \DOMElement) { + throw new \LogicException('Missing legacy provider tax regime group'); + } + $reference = $this->child($regTrib, 'regEspTrib'); + $element = $document->createElement('regApIBSCBSSN', (string) $preview->regimeApuracaoSimples); + if ($reference === null) { + $regTrib->appendChild($element); + } else { + $regTrib->insertBefore($element, $reference); + } + } + + // In Annex VI, indDest and dest are outside IBSCBS, after toma and + // before interm/serv. No speculative recipient identity is inferred. + $beforeService = $this->child($infDps, 'serv'); + if ($beforeService === null) { + throw new \LogicException('Missing legacy service group'); + } + $infDps->insertBefore($document->createElement('indDest', (string) $preview->indicadorDestinatario), $beforeService); + + if ($preview->cst !== null) { + $ibs = $document->createElement('IBSCBS'); + if ($preview->indicadorUsoPessoal !== null) { + $ibs->appendChild($document->createElement('indFinal', (string) $preview->indicadorUsoPessoal)); + } + if ($preview->codigoIndicadorOperacao !== null) { + $ibs->appendChild($document->createElement('cIndOp', $preview->codigoIndicadorOperacao)); + } + $valores = $document->createElement('valores'); + $trib = $document->createElement('trib'); + // NT009: CST and cClassTrib moved directly beneath trib. + $trib->appendChild($document->createElement('CST', $preview->cst)); + $trib->appendChild($document->createElement('cClassTrib', (string) $preview->classificacaoTributaria)); + if ($preview->exigeGrupoIbsCbs) { + $group = $document->createElement('gIBSCBS'); + if ($preview->codigoCreditoPresumido !== null) { + $group->appendChild($document->createElement('cCredPres', $preview->codigoCreditoPresumido)); + } + if ($preview->valorAjusteIbs !== null) { + $adjustment = $document->createElement('gIBSCBSAjuste'); + $adjustment->appendChild($document->createElement('vIBS', $preview->valorAjusteIbs)); + $adjustment->appendChild($document->createElement('vCBS', (string) $preview->valorAjusteCbs)); + $group->appendChild($adjustment); + } + $trib->appendChild($group); + } + $valores->appendChild($trib); + $ibs->appendChild($valores); + $infDps->appendChild($ibs); + } + + // A preview must not pretend to reference the older official XSD. + $document->documentElement?->removeAttributeNS( + 'http://www.w3.org/2001/XMLSchema-instance', + 'schemaLocation' + ); + + return new Nt009DpsPreview($document->saveXML() ?: ''); + } + + private function validatePreview(Nt009DpsPreviewData $preview): void + { + if (!in_array($preview->finalidade, [0, 1, 2], true) + || !in_array($preview->indicadorDestinatario, [0, 1], true)) { + throw new \InvalidArgumentException('NT009 finNFSe must be 0-2 and indDest must be 0-1'); + } + if ($preview->finalidade === 0 + && ($preview->tipoNotaDebito !== null || $preview->tipoNotaCredito !== null)) { + throw new \InvalidArgumentException('Regular NT009 NFS-e cannot carry credit/debit adjustment type'); + } + if ($preview->finalidade === 1 + && (!in_array($preview->tipoNotaCredito, ['01', '05'], true) + || $preview->tipoNotaDebito !== null)) { + throw new \InvalidArgumentException('NT009 credit note requires tpNFSeCredito 01 or 05 only'); + } + if ($preview->finalidade === 2 + && (!in_array($preview->tipoNotaDebito, ['01', '02', '03', '04', '05', '06'], true) + || $preview->tipoNotaCredito !== null)) { + throw new \InvalidArgumentException('NT009 debit note requires tpNFSeDebito 01-06 only'); + } + if ($preview->regimeApuracaoSimples !== null + && !in_array($preview->regimeApuracaoSimples, [1, 2, 3], true)) { + throw new \InvalidArgumentException('NT009 regApIBSCBSSN must be 1-3'); + } + if ($preview->indicadorUsoPessoal !== null && !in_array($preview->indicadorUsoPessoal, [0, 1], true)) { + throw new \InvalidArgumentException('NT009 indFinal must be 0 or 1'); + } + + $hasIbs = $preview->cst !== null + || $preview->classificacaoTributaria !== null + || $preview->codigoIndicadorOperacao !== null + || $preview->indicadorUsoPessoal !== null + || $preview->codigoCreditoPresumido !== null + || $preview->valorAjusteIbs !== null + || $preview->valorAjusteCbs !== null + || $preview->exigeGrupoIbsCbs !== null; + + if (!$hasIbs) { + return; + } + if ($preview->cst === null || preg_match('/^[0-9]{3}$/D', $preview->cst) !== 1 + || $preview->classificacaoTributaria === null + || preg_match('/^[0-9]{6}$/D', $preview->classificacaoTributaria) !== 1) { + throw new \InvalidArgumentException('NT009 IBSCBS/valores/trib requires a 3-digit CST and 6-digit cClassTrib'); + } + if ($preview->exigeGrupoIbsCbs === null) { + throw new \InvalidArgumentException('NT009 requires caller-verified ind_gIBSCBS for the chosen classification'); + } + if ($preview->codigoIndicadorOperacao !== null + && !(new OfficialDomainCatalog())->hasOperationIndicator( + $preview->codigoIndicadorOperacao, + OfficialDomainCatalog::OPERATION_INDICATOR_NT009_VERSION + )) { + throw new \InvalidArgumentException('NT009 cIndOp is absent from official Annex VII v1.03.00'); + } + if ($preview->exigeGrupoIbsCbs && $preview->codigoIndicadorOperacao === null) { + throw new \InvalidArgumentException('NT009 cIndOp is required when caller-verified ind_gIBSCBS is true'); + } + if (!$preview->exigeGrupoIbsCbs && $preview->codigoIndicadorOperacao !== null) { + throw new \InvalidArgumentException('NT009 cIndOp is forbidden when caller-verified ind_gIBSCBS is false'); + } + if (!$preview->exigeGrupoIbsCbs + && ($preview->codigoCreditoPresumido !== null + || $preview->valorAjusteIbs !== null || $preview->valorAjusteCbs !== null)) { + throw new \InvalidArgumentException('NT009 forbids gIBSCBS children when ind_gIBSCBS is false'); + } + if ($preview->codigoCreditoPresumido !== null + && preg_match('/^[0-9]{2}$/D', $preview->codigoCreditoPresumido) !== 1) { + throw new \InvalidArgumentException('NT009 cCredPres must contain two digits'); + } + if (($preview->valorAjusteIbs === null) !== ($preview->valorAjusteCbs === null)) { + throw new \InvalidArgumentException('NT009 gIBSCBSAjuste requires both vIBS and vCBS'); + } + if ($preview->valorAjusteIbs !== null) { + $allowed = ($preview->finalidade === 2 && in_array($preview->tipoNotaDebito, ['01', '02', '03', '05'], true)) + || ($preview->finalidade === 1 && $preview->tipoNotaCredito === '05'); + if (!$allowed) { + throw new \InvalidArgumentException('NT009 gIBSCBSAjuste is forbidden for this adjustment-note type'); + } + if (preg_match('/^[0-9]{1,15}\.[0-9]{2}$/D', $preview->valorAjusteIbs) !== 1 + || preg_match('/^[0-9]{1,15}\.[0-9]{2}$/D', (string) $preview->valorAjusteCbs) !== 1) { + throw new \InvalidArgumentException('NT009 gIBSCBSAjuste requires decimal vIBS and vCBS strings'); + } + } + } + + private function rejectLegacyIbsCbs(DpsData $dps): void + { + if ($dps->ibsCbsFinalidade !== null + || $dps->ibsCbsIndFinal !== null + || $dps->ibsCbsCodigoIndicadorOperacao !== '' + || $dps->ibsCbsIndDest !== null + || $dps->ibsCbsCst !== '' + || $dps->ibsCbsClassificacaoTributaria !== '') { + throw new \InvalidArgumentException( + 'NT009 preview cannot mix legacy DpsData IBS/CBS fields; provide Nt009DpsPreviewData instead' + ); + } + } + + private function child(\DOMElement $element, string $name): ?\DOMElement + { + foreach ($element->childNodes as $child) { + if ($child instanceof \DOMElement && $child->localName === $name) { + return $child; + } + } + + return null; + } +} diff --git a/src/Xml/XmlBuilder.php b/src/Xml/XmlBuilder.php index 9b53e7b..cf73a12 100644 --- a/src/Xml/XmlBuilder.php +++ b/src/Xml/XmlBuilder.php @@ -20,6 +20,18 @@ class XmlBuilder private const XSD_SCHEMA = 'http://www.sped.fazenda.gov.br/nfse DPS_v1.01.xsd'; private const DPS_VERSION = '1.01'; + /** + * Return a review-only NT009 XML preview; never substitute for buildDps(). + * + * The effective SEFIN XSD and deployment schedule are not established. + */ + public function previewNt009Dps( + DpsData $dps, + \LibreCodeCoop\NfsePHP\Dto\Nt009DpsPreviewData $preview, + ): \LibreCodeCoop\NfsePHP\Dto\Nt009DpsPreview { + return (new Nt009DpsPreviewBuilder($this))->build($dps, $preview); + } + public function buildDps(DpsData $dps): string { $doc = new \DOMDocument('1.0', 'UTF-8'); diff --git a/tests/Unit/Domain/OfficialDomainCatalogTest.php b/tests/Unit/Domain/OfficialDomainCatalogTest.php index 50d71b4..5bf809a 100644 --- a/tests/Unit/Domain/OfficialDomainCatalogTest.php +++ b/tests/Unit/Domain/OfficialDomainCatalogTest.php @@ -74,6 +74,48 @@ public function testKnownIbsCbsOperationIndicatorIsAvailableOffline(): void self::assertFalse($this->catalog->hasOperationIndicator('999999')); } + public function testAnnexViiCanBeSelectedWithoutChangingTheDefaultProductionDomain(): void + { + $nt009 = OfficialDomainCatalog::OPERATION_INDICATOR_NT009_VERSION; + self::assertNull($this->catalog->operationIndicator('010101')); + self::assertSame('010101', $this->catalog->operationIndicator('010101', $nt009)['code'] ?? null); + self::assertTrue($this->catalog->hasOperationIndicator('010101', $nt009)); + self::assertFalse($this->catalog->hasOperationIndicator('010101')); + self::assertTrue($this->catalog->hasOperationIndicator('030103')); + self::assertFalse($this->catalog->hasOperationIndicator('030103', $nt009)); + self::assertSame([ + OfficialDomainCatalog::OPERATION_INDICATOR_VERSION, + OfficialDomainCatalog::OPERATION_INDICATOR_NT009_VERSION, + ], OfficialDomainCatalog::operationIndicatorVersions()); + } + + public function testUnknownIndicatorVersionsFailClosed(): void + { + $this->expectException(\InvalidArgumentException::class); + $this->expectExceptionMessage('Unsupported NFS-e operation-indicator version'); + $this->catalog->operationIndicator('010101', 'future-unverified'); + } + + public function testAllFortyOfficialNt009IndicatorsAreAvailableOffline(): void + { + $table = dirname(__DIR__, 3) . '/resources/domains/indicadores-operacao-ibscbs-v1.03.00.tsv'; + $lines = file($table, FILE_IGNORE_NEW_LINES); + self::assertIsArray($lines); + $found = []; + foreach ($lines as $line) { + if ($line === '' || str_starts_with($line, '#')) { + continue; + } + [$code, $characteristic, $location] = explode("\t", $line); + self::assertSame( + ['code' => $code, 'characteristic' => $characteristic, 'location' => $location], + $this->catalog->operationIndicator($code, OfficialDomainCatalog::OPERATION_INDICATOR_NT009_VERSION), + ); + $found[$code] = true; + } + self::assertCount(40, $found); + } + public function testCatalogVersionsNameTheOfficialAnnexes(): void { self::assertSame([ diff --git a/tests/Unit/Xml/Nt009DpsPreviewBuilderTest.php b/tests/Unit/Xml/Nt009DpsPreviewBuilderTest.php new file mode 100644 index 0000000..12e100a --- /dev/null +++ b/tests/Unit/Xml/Nt009DpsPreviewBuilderTest.php @@ -0,0 +1,291 @@ +builder = new XmlBuilder(); + } + + public function testLegacyEmissionOutputIsNotModifiedByPreview(): void + { + $dps = $this->makeDps(); + $legacy = $this->builder->buildDps($dps); + + $draft = $this->builder->previewNt009Dps( + $dps, + new Nt009DpsPreviewData(finalidade: 0, indicadorDestinatario: 0) + ); + + self::assertInstanceOf(Nt009DpsPreview::class, $draft); + self::assertSame( + $this->withoutEmissionTimestamp($legacy), + $this->withoutEmissionTimestamp($this->builder->buildDps($dps)) + ); + self::assertStringNotContainsString('', $legacy); + self::assertStringNotContainsString('', $draft->xml); + self::assertSame('0', $this->first($draft->xml, '/n:DPS/n:infDPS/n:finNFSe')->textContent); + self::assertSame('0', $this->first($draft->xml, '/n:DPS/n:infDPS/n:indDest')->textContent); + } + + public function testPreviewRelocatesMandatoryFieldsAndSkipsConditionalGIbsCbs(): void + { + $draft = $this->builder->previewNt009Dps( + $this->makeDps(), + new Nt009DpsPreviewData( + finalidade: 0, + indicadorDestinatario: 1, + indicadorUsoPessoal: 0, + cst: '000', + classificacaoTributaria: '000001', + exigeGrupoIbsCbs: false, + regimeApuracaoSimples: 1, + ) + ); + self::assertSame('1', $this->first( + $draft->xml, + '/n:DPS/n:infDPS/n:prest/n:regTrib/n:regApIBSCBSSN' + )->textContent); + self::assertSame('000', $this->first( + $draft->xml, + '/n:DPS/n:infDPS/n:IBSCBS/n:valores/n:trib/n:CST' + )->textContent); + self::assertSame('000001', $this->first( + $draft->xml, + '/n:DPS/n:infDPS/n:IBSCBS/n:valores/n:trib/n:cClassTrib' + )->textContent); + self::assertSame(0, $this->xpath($draft->xml)->query( + '/n:DPS/n:infDPS/n:IBSCBS/n:cIndOp' + )?->length); + $xpath = $this->xpath($draft->xml); + self::assertSame(0, $xpath->query( + '/n:DPS/n:infDPS/n:IBSCBS/n:valores/n:trib/n:gIBSCBS' + )?->length); + self::assertSame(0, $xpath->query('/n:DPS/n:infDPS/n:IBSCBS/n:indDest')?->length); + self::assertSame(0, $xpath->query('/n:DPS/n:infDPS/n:IBSCBS/n:finNFSe')?->length); + } + + public function testValidDebitoAdjustmentEmitsConditionalNestedValues(): void + { + $draft = $this->builder->previewNt009Dps( + $this->makeDps(), + new Nt009DpsPreviewData( + finalidade: 2, + indicadorDestinatario: 0, + tipoNotaDebito: '01', + codigoIndicadorOperacao: '010101', + cst: '000', + classificacaoTributaria: '000001', + exigeGrupoIbsCbs: true, + valorAjusteIbs: '15.25', + valorAjusteCbs: '6.80', + ) + ); + self::assertSame('01', $this->first( + $draft->xml, + '/n:DPS/n:infDPS/n:tpNFSeDebito' + )->textContent); + self::assertSame('15.25', $this->first( + $draft->xml, + '/n:DPS/n:infDPS/n:IBSCBS/n:valores/n:trib/n:gIBSCBS/n:gIBSCBSAjuste/n:vIBS' + )->textContent); + self::assertSame('6.80', $this->first( + $draft->xml, + '/n:DPS/n:infDPS/n:IBSCBS/n:valores/n:trib/n:gIBSCBS/n:gIBSCBSAjuste/n:vCBS' + )->textContent); + self::assertStringNotContainsString('schemaLocation', $draft->xml); + // Production XSD still implements the old field hierarchy. + self::assertNotSame([], (new DpsSchemaValidator())->validate($draft->xml)); + } + + public function testCreditNoteRequiresOfficialSpecificSubtype(): void + { + $valid = $this->builder->previewNt009Dps( + $this->makeDps(), + new Nt009DpsPreviewData(finalidade: 1, indicadorDestinatario: 0, tipoNotaCredito: '05') + ); + self::assertSame('05', $this->first( + $valid->xml, + '/n:DPS/n:infDPS/n:tpNFSeCredito' + )->textContent); + + $this->expectException(\InvalidArgumentException::class); + $this->expectExceptionMessage('credit note requires tpNFSeCredito'); + $this->builder->previewNt009Dps( + $this->makeDps(), + new Nt009DpsPreviewData(finalidade: 1, indicadorDestinatario: 0, tipoNotaCredito: '02') + ); + } + + public function testRequiresExternallyVerifiedClassificationFlag(): void + { + $this->expectException(\InvalidArgumentException::class); + $this->expectExceptionMessage('caller-verified ind_gIBSCBS'); + $this->builder->previewNt009Dps( + $this->makeDps(), + new Nt009DpsPreviewData( + finalidade: 0, + indicadorDestinatario: 0, + cst: '000', + classificacaoTributaria: '000001', + ) + ); + } + + public function testRejectsAbsentAndInventedCIndOpCodes(): void + { + $this->expectException(\InvalidArgumentException::class); + $this->expectExceptionMessage('absent from official Annex VII'); + $this->builder->previewNt009Dps( + $this->makeDps(), + new Nt009DpsPreviewData( + finalidade: 0, + indicadorDestinatario: 0, + codigoIndicadorOperacao: '030103', + cst: '000', + classificacaoTributaria: '000001', + exigeGrupoIbsCbs: true, + ) + ); + } + + public function testCIndOpIsAbsentWhenOfficialClassificationForbidsDetails(): void + { + $this->expectException(\InvalidArgumentException::class); + $this->expectExceptionMessage('cIndOp is forbidden when caller-verified ind_gIBSCBS is false'); + $this->builder->previewNt009Dps( + $this->makeDps(), + new Nt009DpsPreviewData( + finalidade: 0, + indicadorDestinatario: 0, + codigoIndicadorOperacao: '010101', + cst: '400', + classificacaoTributaria: '400001', + exigeGrupoIbsCbs: false, + ) + ); + } + + public function testForbiddenAdjustmentSubtypeCannotGenerateTaxAdjustmentValues(): void + { + $this->expectException(\InvalidArgumentException::class); + $this->expectExceptionMessage('forbidden for this adjustment-note type'); + $this->builder->previewNt009Dps( + $this->makeDps(), + new Nt009DpsPreviewData( + finalidade: 2, + indicadorDestinatario: 0, + tipoNotaDebito: '04', + codigoIndicadorOperacao: '010101', + cst: '000', + classificacaoTributaria: '000001', + exigeGrupoIbsCbs: true, + valorAjusteIbs: '1.00', + valorAjusteCbs: '2.00', + ) + ); + } + + public function testRejectsIncompleteConditionalAdjustmentPair(): void + { + $this->expectException(\InvalidArgumentException::class); + $this->expectExceptionMessage('requires both vIBS and vCBS'); + $this->builder->previewNt009Dps( + $this->makeDps(), + new Nt009DpsPreviewData( + finalidade: 2, + indicadorDestinatario: 0, + tipoNotaDebito: '01', + codigoIndicadorOperacao: '010101', + cst: '000', + classificacaoTributaria: '000001', + exigeGrupoIbsCbs: true, + valorAjusteIbs: '1.00', + ) + ); + } + + public function testRejectsMixingLegacyAndNewIbsCbsSemantics(): void + { + $this->expectException(\InvalidArgumentException::class); + $this->expectExceptionMessage('cannot mix legacy DpsData'); + $this->builder->previewNt009Dps( + $this->makeDps(ibsCbsFinalidade: 0), + new Nt009DpsPreviewData(finalidade: 0, indicadorDestinatario: 0) + ); + } + + public function testAllPublishedVersionSensitiveFieldsAreOrdered(): void + { + $draft = $this->builder->previewNt009Dps( + $this->makeDps(), + new Nt009DpsPreviewData(finalidade: 2, indicadorDestinatario: 0, tipoNotaDebito: '06') + ); + $xml = $draft->xml; + self::assertLessThan(strpos($xml, ''), strpos($xml, '')); + self::assertLessThan(strpos($xml, ''), strpos($xml, '')); + self::assertLessThan(strpos($xml, ''), strpos($xml, '')); + self::assertLessThan(strpos($xml, ''), strpos($xml, '')); + } + + private function makeDps(?int $ibsCbsFinalidade = null): DpsData + { + return new DpsData( + cnpjPrestador: '11222333000181', + municipioIbge: '3303302', + itemListaServico: '0107', + valorServico: '150.00', + aliquota: '5.00', + discriminacao: 'Servico de tecnologia', + serie: '00001', + numeroDps: '17', + codigoTributacaoNacional: '010701', + ibsCbsFinalidade: $ibsCbsFinalidade, + ); + } + + private function withoutEmissionTimestamp(string $xml): string + { + return (string) preg_replace('/[^<]+<\/dhEmi>/', 'normalized', $xml); + } + + private function xpath(string $xml): \DOMXPath + { + $dom = new \DOMDocument(); + self::assertTrue($dom->loadXML($xml, LIBXML_NONET)); + $xpath = new \DOMXPath($dom); + $xpath->registerNamespace('n', 'http://www.sped.fazenda.gov.br/nfse'); + + return $xpath; + } + + private function first(string $xml, string $path): \DOMNode + { + $result = $this->xpath($xml)->query($path); + self::assertNotFalse($result); + self::assertSame(1, $result->length, 'Missing or duplicated NT009 path: ' . $path); + + return $result->item(0); + } +} diff --git a/tools/bin/domains.php b/tools/bin/domains.php index 0271bee..45f744d 100644 --- a/tools/bin/domains.php +++ b/tools/bin/domains.php @@ -8,8 +8,10 @@ use LibreCodeCoop\NfsePHP\Tools\AnnexReader; use LibreCodeCoop\NfsePHP\Tools\DomainTableGenerator; +use LibreCodeCoop\NfsePHP\Tools\Nt009ContractMatrix; use LibreCodeCoop\NfsePHP\Tools\Nt009Inspector; use LibreCodeCoop\NfsePHP\Tools\OfficialAnnexDownloader; +use LibreCodeCoop\NfsePHP\Tools\OfficialXsdPackageInspector; use LibreCodeCoop\NfsePHP\Tools\PortalIndexDiscovery; use LibreCodeCoop\NfsePHP\Tools\SourceVerifier; @@ -70,6 +72,52 @@ } } echo "Verified " . count($outputs) . " deterministic snapshots\n"; + } elseif ($command === 'observe-source') { + if (!isset($options['url'], $options['output']) + || ($options['acknowledge-unpinned'] ?? '') !== 'yes') { + throw new InvalidArgumentException( + 'Observation requires --url= --output= --acknowledge-unpinned=yes' + ); + } + $sha = (new OfficialAnnexDownloader())->observe( + $options['url'], + $options['output'], + SourceVerifier::fetchOfficial(...) + ); + echo "UNPINNED source: {$sha}; review provenance before adding to trusted manifest\n"; + } elseif ($command === 'schema-packages') { + if (!isset($options['report'])) { + throw new InvalidArgumentException('Missing --report=PATH'); + } + $comparison = (new OfficialXsdPackageInspector())->comparePinned( + $options['manifest'] ?? $root . '/resources/domains/sources.json', + SourceVerifier::fetchOfficial(...) + ); + $json = json_encode($comparison, JSON_PRETTY_PRINT | JSON_UNESCAPED_SLASHES + | JSON_THROW_ON_ERROR) . "\n"; + if (file_put_contents($options['report'], $json) !== strlen($json)) { + throw new RuntimeException('Unable to save official schema comparison'); + } + echo 'Production XSD package: ' . $comparison['production']['sha256'] + . '; Restricted XSD package: ' . $comparison['restricted']['sha256'] . "\n"; + echo 'XSD byte comparison by filename: ' . json_encode(array_count_values( + $comparison['basename_comparison'] + ), JSON_THROW_ON_ERROR) . "\n"; + } elseif ($command === 'contract-matrix') { + foreach (['legacy-annex', 'annex-vi', 'output'] as $name) { + if (!isset($options[$name])) { + throw new InvalidArgumentException("Missing --{$name}=PATH"); + } + } + $matrix = new Nt009ContractMatrix(); + $rows = $matrix->compare($options['legacy-annex'], $options['annex-vi']); + $data = $matrix->toTsv($rows); + if (file_put_contents($options['output'], $data) !== strlen($data)) { + throw new RuntimeException('Cannot write official NT009 contract comparison'); + } + $counts = array_count_values(array_column($rows, 'status')); + echo 'Official DPS field matrix: ' + . json_encode($counts, JSON_THROW_ON_ERROR) . "\n"; } elseif ($command === 'download') { if (!isset($options['ids'], $options['output'])) { throw new InvalidArgumentException('Download requires --ids=ID,... and --output=DIR'); @@ -121,6 +169,12 @@ ); $json = json_encode($comparison, JSON_PRETTY_PRINT | JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES | JSON_THROW_ON_ERROR) . "\n"; + if (($options['print-layout'] ?? '') === 'yes') { + foreach ($comparison['layout_rows'] as $row) { + echo 'NT009_LAYOUT_ROW ' + . json_encode($row, JSON_UNESCAPED_UNICODE | JSON_THROW_ON_ERROR) . "\n"; + } + } if (isset($options['report'])) { if (file_put_contents($options['report'], $json) === false) { throw new RuntimeException('Unable to save NT009 comparison'); @@ -200,8 +254,9 @@ } } else { throw new InvalidArgumentException( - "Usage: php tools/bin/domains.php {generate|check|download|audit|verify-indicators|watch} --name=PATH\n" + "Usage: php tools/bin/domains.php {generate|check|observe-source|schema-packages|contract-matrix|download|audit|verify-indicators|watch} --name=PATH\n" . "generate/check: --annex-a= --annex-b= --annex-c= --output= [--annex-vii= --expected-vii=N]\n" + . "contract-matrix: --legacy-annex=PATH --annex-vi=PATH --output=PATH\n" . "download: --ids=annex-a,annex-b,... --output=DIR [--manifest=PATH]\n" . "audit: --annex-vi= --annex-vii= [--report=] OR --download-dir= [--report=]\n" . "verify-indicators: --annex-vii=PATH [--snapshot=PATH]\n" diff --git a/tools/src/Nt009ContractMatrix.php b/tools/src/Nt009ContractMatrix.php new file mode 100644 index 0000000..b7e9d9e --- /dev/null +++ b/tools/src/Nt009ContractMatrix.php @@ -0,0 +1,176 @@ +> + */ + public function compare(string $legacyWorkbook, string $nt009Workbook): array + { + $previous = $this->readDpsFields($legacyWorkbook); + $latest = $this->readDpsFields($nt009Workbook); + + $result = []; + foreach ($latest as $path => $row) { + $old = $previous[$path] ?? null; + $changed = $old !== null && $this->comparisonValues($old) !== $this->comparisonValues($row); + $result[] = [ + 'status' => $old === null ? 'added' : ($changed ? 'changed' : 'unchanged'), + 'path' => $path, + 'old_row' => $old['source_row'] ?? '', + 'new_row' => $row['source_row'], + 'old_kind' => $old['kind'] ?? '', + 'new_kind' => $row['kind'], + 'old_type' => $old['type'] ?? '', + 'new_type' => $row['type'], + 'old_occurrence' => $old['occurrence'] ?? '', + 'new_occurrence' => $row['occurrence'], + 'old_size' => $old['size'] ?? '', + 'new_size' => $row['size'], + 'old_description' => $old['description'] ?? '', + 'new_description' => $row['description'], + 'old_condition' => $old['condition'] ?? '', + 'new_condition' => $row['condition'], + ]; + } + foreach ($previous as $path => $old) { + if (isset($latest[$path])) { + continue; + } + $result[] = [ + 'status' => 'removed', + 'path' => $path, + 'old_row' => $old['source_row'], + 'new_row' => '', + 'old_kind' => $old['kind'], + 'new_kind' => '', + 'old_type' => $old['type'], + 'new_type' => '', + 'old_occurrence' => $old['occurrence'], + 'new_occurrence' => '', + 'old_size' => $old['size'], + 'new_size' => '', + 'old_description' => $old['description'], + 'new_description' => '', + 'old_condition' => $old['condition'], + 'new_condition' => '', + ]; + } + + if ($result === []) { + throw new \UnexpectedValueException('No official DPS layout fields identified'); + } + + return $result; + } + + /** + * @param list> $rows + */ + public function toTsv(array $rows): string + { + if ($rows === []) { + throw new \InvalidArgumentException('Empty NT009 contract matrix'); + } + $keys = array_keys($rows[0]); + $lines = [ + '# NT009 DPS layout comparison — source: official Anexo I (production) and Anexo VI v1.04.01', + '# All conditions are textual evidence; production applicability and fiscal validation are separately gated.', + implode("\t", $keys), + ]; + foreach ($rows as $row) { + if (array_keys($row) !== $keys) { + throw new \UnexpectedValueException('Inconsistent contract-matrix columns'); + } + $lines[] = implode("\t", array_values($row)); + } + + return implode("\n", $lines) . "\n"; + } + + /** + * @return array + */ + private function readDpsFields(string $path): array + { + $workbook = new AnnexReader($path); + try { + $sheetName = null; + foreach ($workbook->sheetNames() as $candidate) { + if (str_contains(mb_strtoupper($candidate, 'UTF-8'), 'LEIAUTE DPS')) { + $sheetName = $candidate; + break; + } + } + if ($sheetName === null) { + throw new \UnexpectedValueException( + 'DPS layout worksheet not found in ' . $path . ': ' . implode(', ', $workbook->sheetNames()), + ); + } + $result = []; + foreach ($workbook->rows($sheetName, true) as $offset => $columns) { + $parent = rtrim($columns['B'] ?? '', '/'); + $tag = $columns['C'] ?? ''; + if (!str_starts_with($parent . '/', 'NFSe/infNFSe/DPS/infDPS/') + || preg_match('/^[A-Za-z_][A-Za-z0-9_]*$/D', $tag) !== 1) { + continue; + } + $fullPath = $parent . '/' . $tag; + $entry = [ + 'source_row' => (string) ($offset + 1), + 'kind' => $columns['D'] ?? '', + 'type' => $columns['E'] ?? '', + 'occurrence' => $columns['F'] ?? '', + 'size' => $columns['G'] ?? '', + 'description' => $columns['H'] ?? '', + 'condition' => $columns['I'] ?? '', + ]; + if (isset($result[$fullPath])) { + if ($this->comparisonValues($result[$fullPath]) !== $this->comparisonValues($entry)) { + throw new \UnexpectedValueException('Conflicting official DPS layout definitions: ' . $fullPath); + } + continue; + } + $result[$fullPath] = $entry; + } + if ($result === []) { + throw new \UnexpectedValueException('No official DPS layout fields in ' . $sheetName); + } + + return $result; + } finally { + $workbook->close(); + } + } + + /** + * @param array{source_row:string,kind:string,type:string,occurrence:string,size:string,description:string,condition:string} $entry + * @return list + */ + private function comparisonValues(array $entry): array + { + return [ + $entry['kind'], + $entry['type'], + $entry['occurrence'], + $entry['size'], + $entry['description'], + $entry['condition'], + ]; + } +} diff --git a/tools/src/OfficialAnnexDownloader.php b/tools/src/OfficialAnnexDownloader.php index 532e4a8..b4a9f8f 100644 --- a/tools/src/OfficialAnnexDownloader.php +++ b/tools/src/OfficialAnnexDownloader.php @@ -15,6 +15,34 @@ */ final class OfficialAnnexDownloader { + /** + * One-time provenance observation for a newly published government XLSX. + * It is never a trusted production source until its hash is reviewed and + * pinned in the versioned manifest. Unlike download(), it has no baseline. + * + * @param callable(string): string $fetch + */ + public function observe(string $url, string $outputFile, callable $fetch): string + { + $parts = parse_url($url); + if (!is_array($parts) || ($parts['scheme'] ?? '') !== 'https' + || ($parts['host'] ?? '') !== 'www.gov.br' + || !str_starts_with($parts['path'] ?? '', '/nfse/') + || isset($parts['user']) || isset($parts['pass']) || isset($parts['port'])) { + throw new \InvalidArgumentException('Provenance observation requires an official NFS-e URL'); + } + $bytes = $fetch($url); + if ($bytes === '' || strlen($bytes) >= SourceVerifier::MAX_SOURCE_BYTES + || !str_starts_with($bytes, "PK\x03\x04")) { + throw new \UnexpectedValueException('Invalid unpinned official XLSX'); + } + if (is_link($outputFile) || file_put_contents($outputFile, $bytes) !== strlen($bytes)) { + throw new \RuntimeException('Cannot write unpinned official XLSX observation'); + } + + return hash('sha256', $bytes); + } + /** * @param list $ids * @return array diff --git a/tools/src/OfficialXsdPackageInspector.php b/tools/src/OfficialXsdPackageInspector.php new file mode 100644 index 0000000..bd139de --- /dev/null +++ b/tools/src/OfficialXsdPackageInspector.php @@ -0,0 +1,219 @@ + + */ + public function compareOfficial(string $productionUrl, string $restrictedUrl, callable $fetch): array + { + foreach ([$productionUrl, $restrictedUrl] as $url) { + $urlParts = parse_url($url); + if (!is_array($urlParts) || ($urlParts['scheme'] ?? '') !== 'https' + || ($urlParts['host'] ?? '') !== 'www.gov.br' + || !str_starts_with($urlParts['path'] ?? '', '/nfse/') + || !str_ends_with($urlParts['path'] ?? '', '.zip') + || isset($urlParts['user']) || isset($urlParts['pass']) || isset($urlParts['port'])) { + throw new \InvalidArgumentException('Only official NFS-e XSD ZIP URLs are permitted'); + } + } + + $production = $this->inspect($fetch($productionUrl)); + $restricted = $this->inspect($fetch($restrictedUrl)); + + $changed = []; + $allNames = array_values(array_unique(array_merge( + array_keys($production['files']), + array_keys($restricted['files']) + ))); + sort($allNames); + foreach ($allNames as $filename) { + $a = $production['files'][$filename] ?? null; + $b = $restricted['files'][$filename] ?? null; + $changed[$filename] = $a === null ? 'restricted-only' + : ($b === null ? 'production-only' : ($a === $b ? 'identical' : 'different')); + } + + // Compare the multiset of SHA-256 values for each XSD basename as + // well as full archive paths. Different ZIP folder names must not + // falsely report that every logical schema is unique to one bundle. + $aByName = $this->byBasename($production['files']); + $bByName = $this->byBasename($restricted['files']); + $basenameComparison = []; + $basenameNames = array_values(array_unique(array_merge( + array_keys($aByName), + array_keys($bByName) + ))); + sort($basenameNames); + foreach ($basenameNames as $name) { + $a = $aByName[$name] ?? null; + $b = $bByName[$name] ?? null; + $basenameComparison[$name] = $a === null ? 'restricted-only' + : ($b === null ? 'production-only' : ($a === $b ? 'identical' : 'different')); + } + + return [ + 'notice' => 'Schema packages are compared by XSD bytes, not solely ZIP metadata; this does not establish NT009 activation.', + 'production_url' => $productionUrl, + 'restricted_url' => $restrictedUrl, + 'production' => $production, + 'restricted' => $restricted, + 'file_comparison' => $changed, + 'basename_comparison' => $basenameComparison, + ]; + } + + /** + * Compare only the explicitly pinned official production and restricted + * packages. The manifest is the single source of URLs and observed hashes. + * + * @param callable(string): string $fetch + * @return array + */ + public function comparePinned(string $manifestPath, callable $fetch): array + { + $json = @file_get_contents($manifestPath); + if ($json === false) { + throw new \RuntimeException('Missing official schema provenance manifest'); + } + $manifest = json_decode($json, true, 512, JSON_THROW_ON_ERROR); + if (!is_array($manifest) || !is_array($manifest['sources'] ?? null)) { + throw new \UnexpectedValueException('Malformed official source manifest'); + } + + $ids = ['xsd-production-20260209', 'xsd-restricted-20260727']; + $found = []; + foreach ($manifest['sources'] as $entry) { + if (!is_array($entry) || !in_array($entry['id'] ?? null, $ids, true)) { + continue; + } + $id = $entry['id']; + if (isset($found[$id]) || ($entry['type'] ?? null) !== 'zip' + || !is_string($entry['url'] ?? null) + || !is_string($entry['observed_sha256'] ?? null) + || preg_match('/^[a-f0-9]{64}$/D', $entry['observed_sha256']) !== 1) { + throw new \UnexpectedValueException('Invalid or duplicate pinned XSD source: ' . $id); + } + $found[$id] = $entry; + } + foreach ($ids as $id) { + if (!isset($found[$id])) { + throw new \UnexpectedValueException('Missing pinned official XSD source: ' . $id); + } + } + $result = $this->compareOfficial( + $found[$ids[0]]['url'], + $found[$ids[1]]['url'], + $fetch + ); + foreach (['production', 'restricted'] as $index => $environment) { + $expected = $found[$ids[$index]]['observed_sha256']; + if (!hash_equals($expected, $result[$environment]['sha256'])) { + throw new \UnexpectedValueException( + 'Published ' . $environment . ' XSD bytes changed from the reviewed manifest' + ); + } + } + + return $result; + } + + /** + * @param array $files + * @return array> + */ + private function byBasename(array $files): array + { + $groups = []; + foreach ($files as $path => $sha) { + $groups[basename($path)][] = $sha; + } + foreach ($groups as &$shas) { + sort($shas); + } + unset($shas); + ksort($groups); + + return $groups; + } + + /** + * @return array{sha256:string,files:array,xsd_count:int} + */ + public function inspect(string $archive): array + { + if ($archive === '' || strlen($archive) >= self::MAX_PACKAGE_BYTES + || !str_starts_with($archive, "PK\x03\x04")) { + throw new \UnexpectedValueException('Invalid or oversized official schema ZIP'); + } + $temp = tempnam(sys_get_temp_dir(), 'nfse-xsd-'); + if ($temp === false || file_put_contents($temp, $archive) !== strlen($archive)) { + throw new \RuntimeException('Cannot stage XSD for bounded inspection'); + } + $zip = new \ZipArchive(); + try { + if ($zip->open($temp) !== true) { + throw new \UnexpectedValueException('Official schema archive is not valid ZIP'); + } + $files = []; + $total = 0; + for ($i = 0; $i < $zip->numFiles; ++$i) { + $entry = $zip->statIndex($i); + $path = $entry['name'] ?? ''; + if (!is_string($path) || $path === '' || !str_ends_with(strtolower($path), '.xsd')) { + continue; + } + if (str_contains($path, '..') || str_starts_with($path, '/') + || str_contains($path, '\\') || ($entry['size'] ?? 0) > self::MAX_XSD_BYTES) { + throw new \UnexpectedValueException('Unsafe XSD archive entry'); + } + // Official ZIPs may contain distinct directory trees with + // identically named XSDs. Compare full archive paths rather + // than silently overwriting or rejecting valid entries. + if (isset($files[$path])) { + throw new \UnexpectedValueException('Duplicate XSD archive path'); + } + if (count($files) >= self::MAX_XSD_FILES) { + throw new \UnexpectedValueException('Too many XSD files in archive'); + } + $size = (int) ($entry['size'] ?? 0); + $total += $size; + if ($total > self::MAX_PACKAGE_BYTES) { + throw new \UnexpectedValueException('Excessive cumulative XSD size'); + } + $data = $zip->getFromIndex($i); + if ($data === false || strlen($data) !== $size) { + throw new \UnexpectedValueException('Cannot read an official XSD entry'); + } + $files[$path] = hash('sha256', $data); + } + if ($files === []) { + throw new \UnexpectedValueException('No XSD files present in the schema ZIP'); + } + ksort($files); + + return ['sha256' => hash('sha256', $archive), 'files' => $files, 'xsd_count' => count($files)]; + } finally { + $zip->close(); + unlink($temp); + } + } +} diff --git a/tools/tests/Nt009ContractMatrixTest.php b/tools/tests/Nt009ContractMatrixTest.php new file mode 100644 index 0000000..0721b6c --- /dev/null +++ b/tools/tests/Nt009ContractMatrixTest.php @@ -0,0 +1,91 @@ +dir = sys_get_temp_dir() . '/nfse-matrix-' . bin2hex(random_bytes(8)); + mkdir($this->dir, 0o700); + } + + protected function tearDown(): void + { + foreach (glob($this->dir . '/*') ?: [] as $file) { + unlink($file); + } + rmdir($this->dir); + } + + public function testChangedOccurrencesMovedFieldsAndRemovedFieldsAreExplicit(): void + { + $old = $this->makeXlsx('old.xlsx', [ + ['NFSe/infNFSe/DPS/infDPS/IBSCBS/', 'finNFSe', 'E', 'N', '1-1', '1', 'Finalidade', ''], + ['NFSe/infNFSe/DPS/infDPS/IBSCBS/valores/trib/gIBSCBS/', 'CST', 'E', 'N', '1-1', '3', 'CST', ''], + ['NFSe/infNFSe/DPS/infDPS/IBSCBS/', 'cIndOp', 'E', 'N', '1-1', '6', 'Indicador', ''], + ]); + $new = $this->makeXlsx('new.xlsx', [ + ['NFSe/infNFSe/DPS/infDPS/', 'finNFSe', 'E', 'N', '1-1', '1', 'Finalidade', ''], + ['NFSe/infNFSe/DPS/infDPS/IBSCBS/valores/trib/', 'CST', 'E', 'N', '1-1', '3', 'CST', ''], + ['NFSe/infNFSe/DPS/infDPS/IBSCBS/', 'cIndOp', 'E', 'N', '0-1', '6', 'Indicador', 'Condicional'], + ]); + $matrix = new Nt009ContractMatrix(); + $rows = $matrix->compare($old, $new); + self::assertCount(5, $rows); + self::assertSame( + ['added', 'added', 'changed', 'removed', 'removed'], + array_column($rows, 'status') + ); + self::assertSame('1-1', $rows[2]['old_occurrence']); + self::assertSame('0-1', $rows[2]['new_occurrence']); + self::assertSame('Condicional', $rows[2]['new_condition']); + self::assertStringContainsString('NFSe/infNFSe/DPS/infDPS/finNFSe', $matrix->toTsv($rows)); + self::assertStringContainsString('old_occurrence', $matrix->toTsv($rows)); + } + + public function testRejectsMissingLayoutWorksheet(): void + { + $filename = $this->makeXlsx('bad.xlsx', [ + ['NFSe/infNFSe/DPS/infDPS/', 'finNFSe', 'E', 'N', '1-1', '1', '', ''], + ], 'Unrelated'); + $matrix = new Nt009ContractMatrix(); + $this->expectException(\UnexpectedValueException::class); + $this->expectExceptionMessage('DPS layout worksheet not found'); + $matrix->compare($filename, $filename); + } + + /** + * @param list> $fields + */ + private function makeXlsx(string $file, array $fields, string $sheetName = 'LEIAUTE DPS_NFS-e - RT'): string + { + $book = new Spreadsheet(); + $sheet = $book->getActiveSheet(); + $sheet->setTitle($sheetName); + foreach ($fields as $index => $row) { + foreach ($row as $col => $value) { + if ($value !== '') { + $sheet->setCellValue([$col + 2, $index + 1], $value); + } + } + } + $path = $this->dir . '/' . $file; + (new Xlsx($book))->save($path); + $book->disconnectWorksheets(); + + return $path; + } +} diff --git a/tools/tests/OfficialAnnexDownloaderTest.php b/tools/tests/OfficialAnnexDownloaderTest.php index 432d498..9e75fb5 100644 --- a/tools/tests/OfficialAnnexDownloaderTest.php +++ b/tools/tests/OfficialAnnexDownloaderTest.php @@ -113,6 +113,32 @@ public function testRefusesUnlistedOrDuplicatedIdentifiers(): void $downloader->sources($manifest, ['annex-x']); } + public function testUnpinnedObservationOnlyAcceptsAnOfficialXlsxAndReportsItsHash(): void + { + $payload = "PK\x03\x04" . 'official workbook fixture'; + $file = $this->directory . '/observed.xlsx'; + $url = 'https://www.gov.br/nfse/pt-br/biblioteca/documentacao-tecnica/documentacao-atual/annex.xlsx'; + $sha = (new OfficialAnnexDownloader())->observe( + $url, + $file, + static fn (string $source): string => $payload + ); + self::assertSame(hash('sha256', $payload), $sha); + self::assertSame($payload, file_get_contents($file)); + unlink($file); + } + + public function testUnpinnedObservationRejectsExternalSourcesBeforeNetwork(): void + { + $this->expectException(\InvalidArgumentException::class); + $this->expectExceptionMessage('official NFS-e URL'); + (new OfficialAnnexDownloader())->observe( + 'https://example.com/annex.xlsx', + $this->directory . '/untrusted.xlsx', + static fn (string $source): string => 'must not be fetched' + ); + } + public function testRejectsDuplicateRequestedIdsBeforeFetching(): void { $manifest = $this->manifest([$this->entry('annex-a', "PK\x03\x04official")]); diff --git a/tools/tests/OfficialXsdPackageInspectorTest.php b/tools/tests/OfficialXsdPackageInspectorTest.php new file mode 100644 index 0000000..b5fdcce --- /dev/null +++ b/tools/tests/OfficialXsdPackageInspectorTest.php @@ -0,0 +1,136 @@ +zip(['DPS_v1.01.xsd' => 'old']); + $restricted = $this->zip([ + 'DPS_v1.01.xsd' => 'new', + 'new_types_v1.01.xsd' => '', + ]); + $inspector = new OfficialXsdPackageInspector(); + $comparison = $inspector->compareOfficial( + 'https://www.gov.br/nfse/producao/esquemas-v1.01.zip', + 'https://www.gov.br/nfse/homologacao/esquemas-v1.01.zip', + static fn (string $url): string => str_contains($url, '/producao/') ? $production : $restricted + ); + + self::assertSame('different', $comparison['file_comparison']['DPS_v1.01.xsd']); + self::assertSame('restricted-only', $comparison['file_comparison']['new_types_v1.01.xsd']); + self::assertSame('different', $comparison['basename_comparison']['DPS_v1.01.xsd']); + self::assertSame('restricted-only', $comparison['basename_comparison']['new_types_v1.01.xsd']); + self::assertSame(1, $comparison['production']['xsd_count']); + self::assertSame(2, $comparison['restricted']['xsd_count']); + self::assertSame(hash('sha256', $production), $comparison['production']['sha256']); + } + + public function testSameBasenameInDifferentFoldersIsPreserved(): void + { + $zip = $this->zip([ + 'Schemas/DPS_v1.01.xsd' => 'one', + 'Archive/DPS_v1.01.xsd' => 'two', + ]); + $files = (new OfficialXsdPackageInspector())->inspect($zip); + self::assertSame(2, $files['xsd_count']); + self::assertNotSame( + $files['files']['Schemas/DPS_v1.01.xsd'], + $files['files']['Archive/DPS_v1.01.xsd'] + ); + } + + public function testSameSchemaBytesAreRecognizedAcrossDifferentArchiveDirectories(): void + { + $production = $this->zip(['A/DPS_v1.01.xsd' => 'identical']); + $restricted = $this->zip(['B/DPS_v1.01.xsd' => 'identical']); + $comparison = (new OfficialXsdPackageInspector())->compareOfficial( + 'https://www.gov.br/nfse/production.zip', + 'https://www.gov.br/nfse/restricted.zip', + static fn (string $url): string => str_contains($url, 'production') ? $production : $restricted + ); + self::assertSame('identical', $comparison['basename_comparison']['DPS_v1.01.xsd']); + self::assertSame('production-only', $comparison['file_comparison']['A/DPS_v1.01.xsd']); + self::assertSame('restricted-only', $comparison['file_comparison']['B/DPS_v1.01.xsd']); + } + + public function testPinnedManifestRejectsChangedOfficialArchiveBytes(): void + { + $production = $this->zip(['DPS_v1.01.xsd' => 'prod']); + $restricted = $this->zip(['DPS_v1.01.xsd' => 'test']); + $file = tempnam(sys_get_temp_dir(), 'nfse-schema-source'); + self::assertIsString($file); + try { + file_put_contents($file, json_encode([ + 'sources' => [ + ['id' => 'xsd-production-20260209', 'type' => 'zip', + 'url' => 'https://www.gov.br/nfse/p.zip', + 'observed_sha256' => hash('sha256', $production)], + ['id' => 'xsd-restricted-20260727', 'type' => 'zip', + 'url' => 'https://www.gov.br/nfse/r.zip', + 'observed_sha256' => hash('sha256', $restricted)], + ], + ], JSON_THROW_ON_ERROR)); + $inspector = new OfficialXsdPackageInspector(); + $fetch = static fn (string $url): string => str_ends_with($url, '/p.zip') ? $production : $restricted; + self::assertSame('different', $inspector->comparePinned($file, $fetch)[ + 'basename_comparison' + ]['DPS_v1.01.xsd']); + $this->expectException(\UnexpectedValueException::class); + $this->expectExceptionMessage('XSD bytes changed'); + $inspector->comparePinned( + $file, + static fn (string $url): string => $restricted + ); + } finally { + unlink($file); + } + } + + public function testForbidsUntrustedSchemaSource(): void + { + $this->expectException(\InvalidArgumentException::class); + $this->expectExceptionMessage('Only official NFS-e'); + (new OfficialXsdPackageInspector())->compareOfficial( + 'https://example.com/schema.zip', + 'https://www.gov.br/nfse/schema.zip', + static fn (string $url): string => 'must-not-fetch' + ); + } + + public function testRejectsHtmlAndArchivesWithoutXsd(): void + { + $this->expectException(\UnexpectedValueException::class); + $this->expectExceptionMessage('No XSD files'); + (new OfficialXsdPackageInspector())->inspect($this->zip(['readme.txt' => 'not a schema'])); + } + + /** + * @param array $entries + */ + private function zip(array $entries): string + { + $file = tempnam(sys_get_temp_dir(), 'nfse-xsd-test'); + self::assertIsString($file); + $zip = new \ZipArchive(); + self::assertTrue($zip->open($file, \ZipArchive::OVERWRITE) === true); + foreach ($entries as $path => $content) { + self::assertTrue($zip->addFromString($path, $content)); + } + $zip->close(); + $result = file_get_contents($file); + unlink($file); + self::assertIsString($result); + + return $result; + } +}