diff --git a/.bestpractices.json b/.bestpractices.json index c4a30c112..4fa3a9ea2 100644 --- a/.bestpractices.json +++ b/.bestpractices.json @@ -76,7 +76,7 @@ "osps_sa_01_01_status": "Met", "osps_sa_01_01_justification": "https://github.com/brazilian-utils/javascript/blob/main/CONTRIBUTING.md#architecture", "osps_sa_02_01_status": "Met", - "osps_sa_02_01_justification": "The public API is documented at https://brazilian-utils.com.br/utilities and tracked by an API Extractor report: https://github.com/brazilian-utils/javascript/blob/main/reports/api/brazilian-utils.api.md", + "osps_sa_02_01_justification": "The public API is documented at https://brazilian-utils.com.br/utilities and checked on every pull request against the last npm release, which fails on a breaking change and lists every added, removed and changed declaration: https://github.com/brazilian-utils/javascript/blob/main/CONTRIBUTING.md#public-api-validation", "osps_sa_03_01_status": "Met", "osps_sa_03_01_justification": "https://github.com/brazilian-utils/javascript/blob/main/SECURITY.md#threat-model", "osps_vm_01_01_status": "Met", @@ -144,7 +144,7 @@ "documentation_basics_status": "Met", "documentation_basics_justification": "https://brazilian-utils.com.br/getting-started", "documentation_interface_status": "Met", - "documentation_interface_justification": "https://brazilian-utils.com.br/utilities documents every exported function; the API report is https://github.com/brazilian-utils/javascript/blob/main/reports/api/brazilian-utils.api.md", + "documentation_interface_justification": "https://brazilian-utils.com.br/utilities documents every exported function; API Extractor fails CI on an undocumented export: https://github.com/brazilian-utils/javascript/blob/main/CONTRIBUTING.md#public-api-validation", "sites_https_status": "Met", "sites_https_justification": "The site, the repository and the npm package are HTTPS only.", "discussion_status": "Met", @@ -282,7 +282,7 @@ "documentation_quick_start_status": "Met", "documentation_quick_start_justification": "https://brazilian-utils.com.br/getting-started", "documentation_current_status": "Met", - "documentation_current_justification": "The docs are checked in CI: llms.txt, the site shells and the API report fail the Check workflow when stale, and a pull request that changes a utility must update both language versions.", + "documentation_current_justification": "The docs are checked in CI: llms.txt and the site shells fail the Check workflow when stale, an undocumented export fails the public API check, and a pull request that changes a utility must update both language versions.", "documentation_achievements_status": "Met", "documentation_achievements_justification": "The README links the OpenSSF Best Practices and Scorecard badges: https://github.com/brazilian-utils/javascript#readme", "accessibility_best_practices_status": "Unmet", diff --git a/.gitignore b/.gitignore index 29922d40c..760402ec3 100644 --- a/.gitignore +++ b/.gitignore @@ -12,13 +12,8 @@ coverage .env.* # The SBOM is generated by the release workflow right before publishing. *.cdx.json -# Every report is generated (stryker, coverage, jscpd) except the API Extractor baseline, which is -# committed so that `npm run check:api` compares the public API against the reviewed one instead of -# writing a new file on every run. -reports/* -!reports/api/ -reports/api/* -!reports/api/brazilian-utils.api.md +# Generated reports (Stryker writes its mutation reports there). +reports # Deno writes a lockfile next to jsr.json on every `deno test`/`deno publish`; the npm lockfile is # the one that pins this project's dependencies. deno.lock diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 0d178c695..4b221a0ca 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -53,8 +53,7 @@ and is invoked through the `npm` scripts below, so you don't need to install any | `npm run check:unused` | Runs [knip](https://knip.dev): unused files, exports, types and dependencies fail. | | `npm run test:mutation` | Runs [Stryker](https://stryker-mutator.io) mutation tests (`stryker run`); pass `-- --mutate src//.ts` for one file. | | `npm run bench` | Runs the `describe("… benchmarks")` blocks with vitest in benchmark mode (`vp test bench --run`); they register nothing in test mode. | -| `npm run check:api` | Builds the package and runs API Extractor over `dist/brazilian-utils.d.ts`: a public type without a doc comment, a type the API refers to without exporting, or a public signature that differs from the committed baseline `reports/api/brazilian-utils.api.md`, fails. | -| `npm run check:api:update` | Rewrites the committed API Extractor baseline `reports/api/brazilian-utils.api.md` from the current build; run it when a public signature changes on purpose and commit the new report. | +| `npm run check:api` | Builds the package and runs `scripts/api.ts`: API Extractor fails on an undocumented public declaration or an unexported type the API refers to, a breaking change against the last release on npm fails, and the API diff is shown ([details](#public-api-validation)). | | `npm run check:commits` | Checks the commit messages since `origin/main` with commitlint (Conventional Commits). | | `npm run check:lockfile` | Checks `package-lock.json` only resolves to the npm registry over HTTPS with integrity hashes (lockfile-lint). | | `npm run check:vex` | Checks that every advisory suppressed for `audit-ci` and OSV-Scanner has a `not_affected` statement in `openvex.json`, and nothing else does. | @@ -73,9 +72,14 @@ but the few rules below hold everywhere: they call. - `src/_internals/` holds the helpers shared between utilities (check-digit arithmetic, `mod10`/ `mod11`, TLV parsing for Pix, sanitizers). `src/_internals/constants/` holds the datasets - (banks, municipalities, CNAE, CBO, CFOP, NCM, legal natures), generated by the `scripts/` - from their official sources and refreshed by the `Update datasets` workflow through - a pull request, never edited by hand. + (banks, municipalities, CNAE, CBO, CEST, CFOP, NCM, NBS, CID-10, the LC 116/2003 service list, + legal natures, the IBS/CBS tables), generated by the `scripts/` from their official sources and + refreshed by the `Update datasets` workflow through a pull request, never edited by hand. Every + generator runs in the same job, so one of them failing opens no pull request at all: when + `scripts/cid10.ts` reports a SHA-256 other than the reviewed `CID10_ZIP_SHA256` (DATASUS serves + that archive over plain HTTP, so the digest is what makes the download safe), review the new + archive, put its digest in the generator and regenerate, otherwise the other datasets stay + frozen. - Utilities are synchronous, stateless and side-effect free: input in, value out, no globals, no environment access, no dynamic code. The two exceptions are `getAddressInfoByCep` and `getCepInfoByAddress`, the only utilities that do I/O: they query public CEP APIs (BrasilAPI, @@ -297,16 +301,56 @@ pull request so the CI result is not a surprise. ## Public API validation -[API Extractor](https://api-extractor.com) runs over the bundled `dist/brazilian-utils.d.ts` in CI -(`npm run check:api`). It fails when a type the public API refers to is not itself exported (a -consumer could not name it) and when an exported function, type or class has no doc comment. It -also compares the public API against the reviewed baseline committed at -`reports/api/brazilian-utils.api.md` (the only file of the ignored `reports/` folder that is -committed) and fails when the two differ, so a change to a public signature has to be reviewed in -the diff of that report: run `npm run check:api:update` to write the new baseline and commit it -along with the change. On top of that, the public signatures are pinned by the -`describe(" types")` blocks in the tests, and the `src/index.test.ts` export map catches an -export that goes missing. +`npm run check:api` builds the package and runs `scripts/api.ts`, which CI runs on every pull +request and push to `main`. Nothing it writes lands in the repository: every report goes to a +temporary directory that is deleted at the end, so there is no file to regenerate or commit. + +1. [API Extractor](https://api-extractor.com) runs over the bundled `dist/brazilian-utils.d.ts` + with the settings of `api-extractor.json`. It fails when a type the public API refers to is not + itself exported (`ae-forgotten-export`: a consumer could not name it), when an exported + function, type or class has no doc comment (`ae-undocumented`), and on any compiler error in the + bundled declarations. +2. The script downloads the last release (`npm pack @brazilian-utils/brazilian-utils@latest`) and + generates a TypeScript file that only compiles when this build can replace it, type-checked with + the repository's `tsc`. A breaking change fails the job: + - an export of the release (value or type, at the root or in a subpath entry point such as + `@brazilian-utils/brazilian-utils/is-valid-cpf`) that is no longer exported, or a subpath + whose `.js`, `.cjs`, `.d.ts` or `.d.cts` file is no longer built; + - a value that is not assignable to the released one (`const _: typeof Old.x = New.x`): a + parameter that became required or narrower, a new required parameter, a return type that + widened (`boolean` to `boolean | null`), an overload that went away; + - a function whose return type narrowed (`Bank | null` to `Bank`) or whose returned object gained + a required property: a consumer that stored the result in an inferred variable + (`let bank = getBankByCode(code)`) and later assigns the old type to it (`bank = null`) stops + compiling. The returns of all overloads (up to four) are compared as one union; + - an exported type that rejects a value the released one accepts (a removed union member, a + property that became required or narrower, a new required property); + - an exported type that consumers get back (it appears in a return type, a thrown class, or a + type reached from one) or that no function uses, and that now accepts a value the released one + rejects (a new union member, a removed or widened property): code that reads it, such as an + exhaustive `switch`, does not handle the new value. A type that only appears in parameters (an + `*Options` or `*Params` type) may widen freely, and a deprecated alias + (`type GetHolidaysOptions = GetHolidaysParams`) follows the type it renames. + + What stays allowed: new exports, new optional parameters, new optional properties, parameters + and input types that accept more values. When `package.json` is already on a higher major + version than the release, breaking changes are listed but do not fail. The check needs network + access and exits with code 2 when the registry cannot be reached; a package that was never + published skips it. + +3. The declarations added, removed and changed since the release, taken from the API Extractor + reports of both builds, are printed as a diff and, in CI, added to the job summary of the + `Check` workflow, which is where a reviewer reads the API changes of a pull request. This part + never fails. + +The limits of a type-level check: it proves that code which compiled against the release still +compiles, not that it behaves the same (a changed default, a different result for the same input or +a new exception are caught only by the tests), and it assumes consumers use `strict` TypeScript. +Roles are inferred from where a type is written in the signatures, so a type that only appears +inside a callback parameter is treated as an input although it flows out. Generic types (none +today) cannot be named without type arguments and only show up in the diff. On top of that, the +public signatures are pinned by the `describe(" types")` blocks in the tests, and the +`src/index.test.ts` export map catches an export that goes missing. ## Supply chain @@ -387,9 +431,11 @@ browser, with `_sidebar.md`, `_navbar.md` and `_coverpage.md` as its navigation. the files to compile in its query string and `run.js` compiles them in the browser. The demos take their look from `docs/snippets/styles.css`. - The examples of the document field page are generated: `npm run build:examples` - (`scripts/examples.ts`) fills the templates of `docs/snippets/document-field/_templates` from a + (`scripts/examples.ts`) fills the templates of `docs/snippets/document-field/templates` from a table of documents, so the shared mask is written once. Edit a template or the table: the files - under `generated/` are written by the build and are not in the repository. + under `generated/` are written by the build and are not in the repository. A template ends in + `.tmpl` (`schema/zod.ts.tmpl`) because its `@@placeholder@@` markers do not parse as the language + its name says: the suffix keeps it out of everything that walks the repository for source files. - `scripts/llms.ts` reads the title back out of the front matter, so `docs/llms.txt` and `docs/llms-full.txt` keep their headings. - Context7 indexes `docs/` as `/brazilian-utils/javascript`; `context7.json` says what it reads, @@ -436,7 +482,9 @@ This library is used in production by many projects, so please do not introduce (renamed/removed exports, changed function signatures, changed default behavior) without first opening an issue or discussion to align on the approach with maintainers. If a breaking change is unavoidable, call it out explicitly in the PR description (and use a `feat!`/`fix!` or -`BREAKING CHANGE:` footer in the commit, per Conventional Commits). +`BREAKING CHANGE:` footer in the commit, per Conventional Commits). `npm run check:api` fails on a +breaking change against the last release ([Public API validation](#public-api-validation)) until +`package.json` is on the next major version, so such a pull request is merged deliberately. ## Releasing @@ -497,7 +545,7 @@ to what no tool can judge. **What CI already decided.** A reviewer does not re-check these; a red check is a "not yet": formatting, lint and types (`vp check`), the tests on every runtime, 100% coverage and mutation -score, duplicated code (jscpd), unused files and exports (knip), the public API report, bundle size +score, duplicated code (jscpd), unused files and exports (knip), the public API check, bundle size per export (the tree-shaking report), the lockfile, known vulnerabilities (`audit-ci`, OSV-Scanner), CodeQL, the workflow linters, stale generated files (`llms.txt`, the site shells) and the commit messages. @@ -514,6 +562,9 @@ the commit messages. `false`, `format*`/`parse*` return `""`, getters return `null` or `[]`, and there is a property test that says so. No renamed or removed export, no changed default, no narrower accepted input ([Breaking changes](#breaking-changes)); a rename keeps the old name as a `@deprecated` alias. + The job summary of the `Check` workflow lists every public declaration the pull request adds, + removes or changes against the last release; read it to confirm the API change is the intended + one. 3. **Does it fit the project?** One utility per folder named after it, shared logic in `src/_internals/` instead of a copy, `XxxOptions`/`XxxParams` naming, datasets generated by a script and never edited by hand, and nothing in the change the pull request does not need. diff --git a/README.md b/README.md index 59853d24e..cdb2a30db 100644 --- a/README.md +++ b/README.md @@ -36,7 +36,7 @@ Brazilian Utils is a zero-dependency library of small utilities for the day-to-d - **Zero runtime dependencies.** Nothing else lands in your `node_modules` or in your bundle. - **Tree-shakeable, down to the function.** `import { isValidCpf }` costs about 1.4 KB minified (0.8 KB gzipped). Every util is also its own subpath entry, so the heavy ones can be lazy-loaded. - **Runs everywhere.** Node.js `^20.19.0 || >=22.12.0`, Bun, Deno and evergreen browsers, all tested in CI. -- **Written in TypeScript.** Types ship with the package, and an API report tracks the public API so nothing changes silently. +- **Written in TypeScript.** Types ship with the package, and every pull request is checked against the last release so the public API never changes silently. - **Validated against the official rules.** Every validator cites the specification, law or dataset it implements, and the test suite is mutation-tested, not just covered. - **Documented in English and Portuguese**, with an `llms.txt` for AI assistants. diff --git a/api-extractor.json b/api-extractor.json index 947a828bc..1911260b9 100644 --- a/api-extractor.json +++ b/api-extractor.json @@ -5,8 +5,8 @@ "newlineKind": "lf", "apiReport": { "enabled": true, - "reportFolder": "/reports/api/", - "reportTempFolder": "/reports/api/temp/", + "reportFolder": "/node_modules/.cache/api-extractor/", + "reportTempFolder": "/node_modules/.cache/api-extractor/temp/", "reportFileName": "brazilian-utils.api.md" }, "docModel": { diff --git a/context7.json b/context7.json index 252f42c76..2ed81b690 100644 --- a/context7.json +++ b/context7.json @@ -5,7 +5,7 @@ "projectTitle": "Brazilian Utils", "description": "Zero-dependency, tree-shakeable utilities for Brazilian data: validate, format, parse and generate CPF, CNPJ, CEP, boleto, Pix, holidays and more.", "folders": ["docs"], - "excludeFolders": ["docs/pt-br"], + "excludeFolders": ["docs/pt-br", "docs/snippets/document-field/templates"], "excludeFiles": [ "CHANGELOG.md", "CODE_OF_CONDUCT.md", @@ -30,7 +30,7 @@ "rules": [ "The package has zero runtime dependencies and ships as ESM plus a UMD build; nothing else needs to be installed to use it.", "Import from the root: import { isValidCpf } from '@brazilian-utils/brazilian-utils'. Every util is also a kebab-case subpath, e.g. '@brazilian-utils/brazilian-utils/is-valid-cpf'.", - "Use the subpaths to lazy-load the dataset-backed utils (getMunicipalities, getMunicipalityByCode, getCnae, getCbo, getCfop, isValidNcm, getBanks): each one embeds a large official table.", + "Use the subpaths to lazy-load the dataset-backed utils (getMunicipalities, getMunicipalityByCode, getCnae, getCbo, getCest, isValidCest, getCfop, getCid10, getClassTrib, isValidNcm, getBanks, getNbs, isValidNbs, getServiceItem, isValidServiceItem): each one embeds a large official table.", "Never import the same util from both the root and its subpath in one app: a bundler treats them as two unrelated modules and bundles the dataset twice.", "Public functions never throw on bad input (null, undefined, wrong type): isValid* return false, format* and parse* return '', single-item getters return null, list getters return [].", "The only utils that reject are the async getAddressInfoByCep (GetAddressInfoByCepError: NotFound, Validation, Service) and getCepInfoByAddress (GetCepInfoByAddressError: NotFound, Validation).", diff --git a/docs/getting-started.md b/docs/getting-started.md index 3dbe79b89..2ffecf098 100644 --- a/docs/getting-started.md +++ b/docs/getting-started.md @@ -11,7 +11,7 @@ Brazilian Utils is a zero-dependency library of small utilities for the day-to-d - **Zero runtime dependencies.** Nothing else lands in your `node_modules` or in your bundle. - **Tree-shakeable, down to the function.** `import { isValidCpf }` costs about 1.4 KB minified (0.8 KB gzipped). Every util is also its own subpath entry, so the heavy ones can be lazy-loaded. - **Runs everywhere.** Node.js `^20.19.0 || >=22.12.0`, Bun, Deno and evergreen browsers, all tested in CI. -- **Written in TypeScript.** Types ship with the package, and an API report tracks the public API so nothing changes silently. +- **Written in TypeScript.** Types ship with the package, and every pull request is checked against the last release so the public API never changes silently. - **Validated against the official rules.** Every validator cites the specification, law or dataset it implements, and the test suite is mutation-tested, not just covered. - **Documented in English and Portuguese**, with an `llms.txt` for AI assistants. @@ -68,13 +68,19 @@ A few utils embed an official dataset and weigh far more than everything else co | Util | Dataset | Minified | Gzipped | | --- | --- | --- | --- | +| `getCid10` | CID-10 V2008 categories and subcategories, with the DATASUS descriptions | 1030.4 KB | 146.9 KB | | `getMunicipalities` · `getMunicipalityByCode` · `getMunicipality` | 5571 IBGE municipalities, with names and codes | 154.9 - 156.5 KB | 50.3 - 50.4 KB | | `getCities` | 5571 IBGE municipality names | 154.2 KB | 49.8 KB | | `isValidNcm` | NCM (Nomenclatura Comum do Mercosul) codes | 114.2 KB | 24.6 KB | | `isValidCbo` · `getCbo` | CBO 2002 occupation titles | 119.1 KB | 30.6 KB | +| `isValidCest` · `getCest` | CEST descriptions and segments (Convênio ICMS 142/18) | 117.8 KB | 26.8 - 26.9 KB | | `isValidCnae` · `getCnae` | CNAE-Subclasses 2.3 | 93.9 KB | 21.2 KB | +| `isValidNbs` · `getNbs` | NBS 2.0 (Nomenclatura Brasileira de Serviços) descriptions | 81.8 KB | 13.8 KB | | `isValidCfop` · `getCfop` | CFOP operation descriptions | 68.9 KB | 6.9 KB | +| `getClassTrib` | cClassTrib (IBS/CBS) names and descriptions | 50.8 KB | 9.6 KB | | `getBanks` · `getBankByCode` · `getBankByIspb` | Banco Central STR participants (COMPE + ISPB) | 38.3 - 38.6 KB | 9.5 - 9.7 KB | +| `isValidServiceItem` · `getServiceItem` | Service list of the Lei Complementar 116/2003 | 27.2 KB | 8.9 KB | +| `isValidCid10` | CID-10 V2008 category and subcategory codes, without the descriptions | 27.0 KB | 7.4 KB | The root of the package is a single ESM module, so a bundler cannot split one of these datasets out of it: importing a heavy util from the root puts its whole dataset in your main bundle, and a dynamic `import()` of the root does not help. To lazy-load one, import it from its own subpath: diff --git a/docs/pt-br/getting-started.md b/docs/pt-br/getting-started.md index 86e5f018f..023e76165 100644 --- a/docs/pt-br/getting-started.md +++ b/docs/pt-br/getting-started.md @@ -11,7 +11,7 @@ Brazilian Utils é uma biblioteca de utilitários, sem dependências, para os pr - **Zero dependências de runtime.** Nada além da biblioteca entra no seu `node_modules` ou no seu bundle. - **Tree-shakeable até a função.** `import { isValidCpf }` custa cerca de 1,4 KB minificado (0,8 KB com gzip). Cada utilitário também é um subpath próprio, então os pesados podem ser carregados sob demanda. - **Roda em qualquer lugar.** Node.js `^20.19.0 || >=22.12.0`, Bun, Deno e navegadores modernos, todos testados no CI. -- **Escrita em TypeScript.** Os tipos vêm no pacote, e um relatório de API acompanha a API pública para que nada mude em silêncio. +- **Escrita em TypeScript.** Os tipos vêm no pacote, e todo pull request é comparado com a última versão publicada para que a API pública nunca mude em silêncio. - **Validada contra as regras oficiais.** Cada validador cita a especificação, lei ou base de dados que implementa, e a suíte de testes passa por mutation testing, não só por cobertura. - **Documentada em inglês e português**, com um `llms.txt` para assistentes de IA. @@ -68,13 +68,19 @@ Alguns utilitários embutem uma base de dados oficial e pesam muito mais que tod | Utilitário | Base de dados | Minificado | Gzip | | --- | --- | --- | --- | +| `getCid10` | categorias e subcategorias da CID-10 V2008, com as descrições do DATASUS | 1030,4 KB | 146,9 KB | | `getMunicipalities` · `getMunicipalityByCode` · `getMunicipality` | 5571 municípios do IBGE, com nomes e códigos | 154,9 - 156,5 KB | 50,3 - 50,4 KB | | `getCities` | nomes dos 5571 municípios do IBGE | 154,2 KB | 49,8 KB | | `isValidNcm` | códigos NCM (Nomenclatura Comum do Mercosul) | 114,2 KB | 24,6 KB | | `isValidCbo` · `getCbo` | títulos das ocupações da CBO 2002 | 119,1 KB | 30,6 KB | +| `isValidCest` · `getCest` | descrições e segmentos do CEST (Convênio ICMS 142/18) | 117,8 KB | 26,8 - 26,9 KB | | `isValidCnae` · `getCnae` | CNAE-Subclasses 2.3 | 93,9 KB | 21,2 KB | +| `isValidNbs` · `getNbs` | descrições da NBS 2.0 (Nomenclatura Brasileira de Serviços) | 81,8 KB | 13,8 KB | | `isValidCfop` · `getCfop` | descrições das operações do CFOP | 68,9 KB | 6,9 KB | +| `getClassTrib` | nomes e descrições do cClassTrib (IBS/CBS) | 50,8 KB | 9,6 KB | | `getBanks` · `getBankByCode` · `getBankByIspb` | participantes do STR do Banco Central (COMPE + ISPB) | 38,3 - 38,6 KB | 9,5 - 9,7 KB | +| `isValidServiceItem` · `getServiceItem` | lista de serviços da Lei Complementar 116/2003 | 27,2 KB | 8,9 KB | +| `isValidCid10` | códigos das categorias e subcategorias da CID-10 V2008, sem as descrições | 27,0 KB | 7,4 KB | A raiz do pacote é um único módulo ESM, então o bundler não consegue separar uma dessas bases de dados dele: importar um utilitário pesado da raiz coloca a base inteira no seu bundle principal, e um `import()` dinâmico da raiz não ajuda. Para carregar sob demanda, importe do subpath próprio: diff --git a/docs/pt-br/utilities.md b/docs/pt-br/utilities.md index a4adb4a72..b814b2ff1 100644 --- a/docs/pt-br/utilities.md +++ b/docs/pt-br/utilities.md @@ -73,6 +73,37 @@ generateCpf('SP'); // o 9º dígito é 8, o código da região fiscal de SP generateCpf('MG'); // o 9º dígito é 6, o código da região fiscal de MG ``` +### getCpfInfo + +Lê os campos que um CPF codifica, como um `CpfInfo`: a `base` de 8 dígitos, o dígito `fiscalRegion` (o 9º dígito, a Região Fiscal da Receita Federal em que o CPF foi inscrito, `"1"` a `"9"` e `"0"` para a 10ª), os `states` dessa região (`StateCode[]`, ordenados pelo nome do estado) e os 2 `checkDigits`. Aceita a mesma entrada com ou sem máscara que o `isValidCpf` e retorna `null` para tudo que não for um CPF válido. A região é a do endereço informado na primeira inscrição: ela não diz onde o titular nasceu, onde mora hoje nem onde pediu o número, e uma região com mais de um estado não diz qual deles foi. + +| `fiscalRegion` | `states` | +| --- | --- | +| `"1"` | DF, GO, MT, MS, TO | +| `"2"` | AC, AP, AM, PA, RO, RR | +| `"3"` | CE, MA, PI | +| `"4"` | AL, PB, PE, RN | +| `"5"` | BA, SE | +| `"6"` | MG | +| `"7"` | ES, RJ | +| `"8"` | SP | +| `"9"` | PR, SC | +| `"0"` | RS | + +```javascript +import { getCpfInfo } from '@brazilian-utils/brazilian-utils'; + +getCpfInfo('123.456.789-09'); +// { +// base: '12345678', +// fiscalRegion: '9', +// states: ['PR', 'SC'], +// checkDigits: '09', +// } + +getCpfInfo('12345678900'); // null (dígitos verificadores inválidos) +``` + Fonte: [Receita Federal, "Cadastros: CPF e CNPJ"](https://www.gov.br/receitafederal/pt-br/assuntos/educacao-fiscal/educacao_fiscal/folhetos-orientativos/cadastros-dig.pdf). ## CNPJ @@ -139,6 +170,40 @@ generateCnpj({ branch: 3 }); // bloco de ordem '0003', ex. '12345678000372' generateCnpj({ version: 2, branch: 1 }); // CNPJ alfanumérico cujo bloco de ordem é '0001' ``` +### getCnpjInfo + +Interpreta um CNPJ nos campos que o número codifica. Aceita as mesmas formas de entrada que `isValidCnpj` e retorna `null` sempre que ela retornaria `false` para os mesmos argumentos, então um CNPJ alfanumérico lido na versão `1` é `null`. + +- **Opções** (`GetCnpjInfoOptions`): `version` é lida como `isValidCnpj` a lê, `1` (padrão) apenas o formato numérico, `2` tanto o numérico quanto o alfanumérico. +- Retorna um `CnpjInfo`, as 14 posições como o Anexo XV as dispõe: 8 (`root`, a raiz que identifica a entidade) + 4 (`branch`, o número de ordem do estabelecimento) + 2 (`checkDigits`, os dígitos verificadores, sempre numéricos). O nome `branch` segue o parâmetro `branch` do `generateCnpj`, que preenche as mesmas quatro posições. +- `isInitialHeadquarters` diz se o número de ordem é `0001`, a que a Receita Federal atribui à matriz quando a raiz é inscrita. Uma filial pode depois se tornar a matriz mantendo o seu número de ordem, então só o cadastro da Receita Federal diz qual é a matriz atual. +- Os campos de um CNPJ alfanumérico são retornados em maiúsculas. + +```javascript +import { getCnpjInfo } from '@brazilian-utils/brazilian-utils'; + +getCnpjInfo('12.345.678/0001-95'); +// { +// root: '12345678', +// branch: '0001', +// checkDigits: '95', +// isInitialHeadquarters: true +// } + +getCnpjInfo('12.abc.345/01de-35', { version: 2 }); +// { +// root: '12ABC345', +// branch: '01DE', +// checkDigits: '35', +// isInitialHeadquarters: false +// } + +getCnpjInfo('12.ABC.345/01DE-35'); // null (alfanumérico, lido na versão 1) +getCnpjInfo('12.345.678/0001-90'); // null (dígitos verificadores incorretos) +``` + +Fonte: [Instrução Normativa RFB nº 2.229/2024](http://normas.receita.fazenda.gov.br/sijut2consulta/link.action?idAto=141102), cujo Anexo Único é o Anexo XV da IN RFB nº 2.119/2022 e dispõe as 14 posições, [Perguntas e Respostas da Receita Federal sobre o CNPJ alfanumérico](https://www.gov.br/receitafederal/pt-br/centrais-de-conteudo/publicacoes/perguntas-e-respostas/cnpj/cnpj-alfanumerico.pdf) (perguntas 21, 23 e 25). + ## CEP e endereço ### isValidCep @@ -389,7 +454,27 @@ getPixKeyInfo('51998259765'); // { type: 'cpf', value: '51998259765' } (também getPixKeyInfo('+5551998259765'); // { type: 'phone', value: '+5551998259765' } ``` -Fonte: [Manual de Padrões para Iniciação do Pix](https://www.bcb.gov.br/content/estabilidadefinanceira/pix/Regulamento_Pix/II_ManualdePadroesparaIniciacaodoPix.pdf), [API do DICT](https://www.bcb.gov.br/content/estabilidadefinanceira/pix/API-DICT.html). +### obfuscatePixKey + +Esconde a maior parte de uma chave Pix com `*`, para os lugares em que a chave é mostrada a alguém que só precisa reconhecê-la, como uma lista de chaves cadastradas. + +- A chave é identificada por `getPixKeyInfo`, pelas regras documentadas lá, e cada tipo é escondido pelo utilitário que já sabe fazer isso: o CPF por `formatCpf` com `obfuscate` (`***.456.789-**`, a forma que o Banco Central imprime para um "CPF mascarado"), o CNPJ por `formatCnpj` com `obfuscate`, o telefone por `formatPhone` com a máscara `"international"` e `obfuscate`, e o e-mail por `obfuscateEmail` sobre o endereço em minúsculas. +- A chave aleatória (EVP) é devolvida inteira, em minúsculas: o manual do DICT a define como uma sequência "que não possui qualquer significado, a não ser o de servir como uma chave Pix", então ela não carrega dado pessoal a esconder. +- O manual de experiência do usuário do Pix proíbe mascarar a chave na tela em que o pagador confere o recebedor, então este utilitário não serve para essa tela. +- Retorna `''` quando o valor não é uma chave Pix válida. + +```javascript +import { obfuscatePixKey } from '@brazilian-utils/brazilian-utils'; + +obfuscatePixKey('123.456.789-09'); // ***.456.789-** +obfuscatePixKey('12345678000195'); // **.345.678/0001-** +obfuscatePixKey('(11) 98765-4321'); // +55 11 *****-**21 +obfuscatePixKey('Fulano@Example.com'); // fu****@ex********* +obfuscatePixKey('71C7D9BE-4B85-4E43-9F1C-1F3B8B4E9A2D'); // 71c7d9be-4b85-4e43-9f1c-1f3b8b4e9a2d +obfuscatePixKey('não é chave'); // '' +``` + +Fonte: [Manual de Padrões para Iniciação do Pix](https://www.bcb.gov.br/content/estabilidadefinanceira/pix/Regulamento_Pix/II_ManualdePadroesparaIniciacaodoPix.pdf), [API do DICT](https://www.bcb.gov.br/content/estabilidadefinanceira/pix/API-DICT.html), [Manual Operacional do DICT](https://www.bcb.gov.br/content/estabilidadefinanceira/pix/Regulamento_Pix/X_ManualOperacionaldoDICT.pdf) e [Requisitos Mínimos para a Experiência do Usuário](https://www.bcb.gov.br/content/estabilidadefinanceira/pix/Regulamento_Pix/IV_RequisitosMinimosparaExperienciadoUsuario.pdf). ### isValidPixPayload @@ -569,6 +654,134 @@ getNfeKeyInfo('35170458716523000119620010000000121000123450'); getNfeKeyInfo('invalid'); // null ``` +## Chave de NFS-e + +### isValidNfseKey + +Verifica se a chave de acesso de uma NFS-e nacional, a Nota Fiscal de Serviço eletrônica do Sistema Nacional NFS-e, é válida. + +- A chave é um bloco único de 50 dígitos, `Cód.Mun.(7) Amb.Ger.(1) Tipo de Inscrição Federal(1) Inscrição Federal(14) nNFSe(13) AAMM(4) Cód.Num.(9) DV(1)`. +- O literal `NFS` que o atributo `Id` de `infNFSe` coloca antes da chave é retirado, junto com os espaços nas extremidades. +- A chave não tem máscara impressa, já que o DANFSe a imprime em um único bloco de 50 dígitos, então, diferente do `isValidNfeKey`, um separador em qualquer ponto dela é rejeitado em vez de removido. +- O código do município precisa começar com um código IBGE de UF; ele não é consultado na tabela do IBGE. +- O `ambGer` precisa ser `1` (o sistema do município) ou `2` (o Sistema Nacional NFS-e), e o tipo de inscrição `1` (um CPF, preenchido com `000` à esquerda) ou `2` (um CNPJ), com um CPF ou CNPJ cujos próprios dígitos verificadores sejam válidos. +- O `nNFSe` não pode ser todo de zeros e o mês precisa estar entre 01 e 12. +- O dígito verificador é um módulo 11 sobre os 49 primeiros dígitos, pesos de 2 a 9 ciclando a partir da direita, em que resto 0 ou 1 dá 0. +- Chaves com CNPJ alfanumérico ainda não são aceitas: nenhum documento oficial diz como uma letra entra no dígito verificador da chave. +- Os modelos municipais de NFS-e que não são o padrão nacional estão fora do escopo. + +```javascript +import { isValidNfseKey } from '@brazilian-utils/brazilian-utils'; + +isValidNfseKey('35503082258716523000119000000000001226011357924683'); // true (emitente com CNPJ, SP) +isValidNfseKey('NFS35503082258716523000119000000000001226011357924683'); // true (prefixo Id do XML) +isValidNfseKey('43149021100040364478829000000000105725120484407255'); // true (emitente com CPF, RS) +isValidNfseKey('35503082258716523000119000000000001226011357924684'); // false (dígito verificador) +isValidNfseKey('3550308 2 2 58716523000119 0000000000012 2601 135792468 3'); // false (a chave não tem máscara) +``` + +### parseNfseKey + +Remove tudo o que não é dígito da chave de acesso de uma NFS-e nacional, inclusive o prefixo `NFS` do atributo `Id` do XML, e limita o resultado a 50 dígitos. + +- Essa é a forma em que o leiaute guarda a chave e a que o DANFSe imprime, um bloco único, e por isso não existe `formatNfseKey`. + +```javascript +import { parseNfseKey } from '@brazilian-utils/brazilian-utils'; + +parseNfseKey('NFS35503082258716523000119000000000001226011357924683'); +// '35503082258716523000119000000000001226011357924683' + +parseNfseKey('3550308 2 2 58716523000119 0000000000012 2601 135792468 3'); +// '35503082258716523000119000000000001226011357924683' +``` + +### getNfseKeyInfo + +Interpreta a chave de acesso de uma NFS-e nacional e retorna seus campos, como um `NfseKeyInfo`. Aceita as mesmas formas de entrada do `isValidNfseKey`. + +- Retorna `municipalityCode`, `stateCode`, `generatorEnvironment`, `taxIdType`, `taxId`, `number`, `year`, `month`, `code` e `checkDigit`. +- O `generatorEnvironment` é um `NfseKeyGeneratorEnvironment`: `1` o sistema do município, `2` o Sistema Nacional NFS-e. +- O `taxIdType` é um `NfseKeyTaxIdType`, `'cpf'` ou `'cnpj'`, e o `taxId` é o CPF de 11 dígitos, sem o `000` que o preenche na chave, ou o CNPJ de 14 dígitos. +- Retorna `null` quando a chave não é válida. + +```javascript +import { getNfseKeyInfo } from '@brazilian-utils/brazilian-utils'; + +getNfseKeyInfo('35503082258716523000119000000000001226011357924683'); +// { municipalityCode: '3550308', stateCode: 'SP', generatorEnvironment: 2, taxIdType: 'cnpj', +// taxId: '58716523000119', number: 12, year: 2026, month: 1, code: '135792468', checkDigit: 3 } + +getNfseKeyInfo('43149021100040364478829000000000105725120484407255'); +// { municipalityCode: '4314902', stateCode: 'RS', generatorEnvironment: 1, taxIdType: 'cpf', +// taxId: '40364478829', number: 1057, year: 2025, month: 12, code: '048440725', checkDigit: 5 } + +getNfseKeyInfo('invalid'); // null +``` + +Fonte: a [documentação técnica do Sistema Nacional NFS-e](https://www.gov.br/nfse/pt-br/biblioteca/documentacao-tecnica/documentacao-atual), cujos tipos de esquema `TSIdNFSe` e `TSChaveNFSe` e o campo `NFSe/infNFSe/id` do ANEXO I definem o leiaute e as regras E1280 e E1284, o [manual da emissão por decisão administrativa ou judicial](https://www.gov.br/nfse/pt-br/biblioteca/documentacao-tecnica/documentacao-atual/manual-contribuintes-emissor-publico-api-emissao-decisao-administrativa-e-judicial.pdf), que nomeia o dígito verificador de módulo 11, e a [Nota Técnica SE/CGNFS-e 008](https://www.gov.br/nfse/pt-br/biblioteca/documentacao-tecnica/rtc/nt-008-se-cgnfse-danfse-20260714-v1-02.pdf) (item 2.1.1), que imprime a chave em bloco único. + +## SUFRAMA + +### isValidSuframa + +Valida uma Inscrição SUFRAMA. É o número de registro que a Superintendência da Zona Franca de Manaus dá às empresas com incentivo fiscal, informado no campo `ISUF` do destinatário da NF-e. + +- O número tem a forma `SS.NNNN.LLD`: setor de atividade, número sequencial, localidade da unidade da SUFRAMA e dígito verificador. +- Aceita 8 ou 9 dígitos: um valor de 8 dígitos é um número cujo código de setor perdeu o zero à esquerda. +- Retorna `false` para um código de setor `00` e para um dígito verificador módulo 11 errado. +- Os códigos de setor e de localidade não são conferidos com uma tabela, pois o manual os lista apenas como exemplos. +- Além dos caracteres de máscara usuais, `(`, `)`, `,` e `*` também são ignorados. + +```javascript +import { isValidSuframa } from '@brazilian-utils/brazilian-utils'; + +isValidSuframa('123456789'); // true +isValidSuframa('12.3456.789'); // true +isValidSuframa('10001018'); // true (o mesmo que '010001018') +isValidSuframa('123456780'); // false +isValidSuframa('001234560'); // false (setor 00) +``` + +### formatSuframa + +Formata uma Inscrição SUFRAMA. + +- **Opções** (`FormatSuframaOptions`): `pad` completa o valor com zeros à esquerda até os 9 dígitos antes de aplicar a máscara (padrão `false`), o que devolve o zero à esquerda de um valor de 8 dígitos. +- A máscara é progressiva, como nas outras funções `format`, então um valor de 8 dígitos sem `pad` é agrupado uma posição antes: use `pad: true` para um valor lido direto do campo `ISUF`, que pode vir com 8 dígitos. + +```javascript +import { formatSuframa } from '@brazilian-utils/brazilian-utils'; + +formatSuframa('123456789'); // 12.3456.789 +formatSuframa('10001018'); // 10.0010.18 (8 dígitos, a máscara agrupa uma posição antes) +formatSuframa('10001018', { pad: true }); // 01.0001.018 +``` + +### parseSuframa + +Remove a formatação da Inscrição SUFRAMA, mantém apenas os dígitos e limita o resultado a 9 dígitos. + +```javascript +import { parseSuframa } from '@brazilian-utils/brazilian-utils'; + +parseSuframa('12.3456.789'); // 123456789 +``` + +### generateSuframa + +Gera uma Inscrição SUFRAMA aleatória válida de 9 dígitos. + +- O dígito verificador é válido e o código de setor nunca é `00`. Os códigos de setor e de localidade são aleatórios. + +```javascript +import { generateSuframa } from '@brazilian-utils/brazilian-utils'; + +generateSuframa(); // '205678106' +``` + +Fonte: [Manual de Orientação do Contribuinte da NF-e 7.0, Visão Geral](https://www.confaz.fazenda.gov.br/legislacao/arquivo-manuais/moc7-visao-geral.pdf) (seção 8.4), [MOC 7.0, Anexo I](https://www.confaz.fazenda.gov.br/legislacao/arquivo-manuais/moc7-anexo-i-leiaute-e-rv.pdf) (campo 79, `E18` `ISUF`, e regra E18-20). + ## Telefone ### isValidPhone @@ -595,11 +808,14 @@ Fonte: [Resolução Anatel nº 749/2022](https://informacoes.anatel.gov.br/legis Formata um número de telefone de acordo com os padrões brasileiros. Se `value` incluir o DDD, informe `{ mask: 'auto' }` ou `'nanp'`: a máscara padrão `"sn"` assume que não há DDD e o trunca. -- **Opções** (`FormatPhoneOptions`): `mask` (`PhoneMask`, padrão `"sn"`) escolhe um dos padrões abaixo. Uma `mask` desconhecida recai para `"sn"`. +- **Opções** (`FormatPhoneOptions`): `mask` (`PhoneMask`, padrão `"sn"`) escolhe um dos padrões abaixo. Uma `mask` desconhecida recai para `"sn"`. `obfuscate` (padrão `false`) esconde o número do assinante em todas as máscaras. - `"sn"`: apenas o número assinante, 9 dígitos. `"nanp"`: DDD mais número assinante, 11 dígitos para celular e 10 para fixo; outros tamanhos mantêm o agrupamento de 11 dígitos. - `"e164"` e `"international"` removem antes o código de país, como `parsePhone`, e recaem para `"service"` para um número de serviço. - `"service"`: os Códigos Não Geográficos (`0800 123 4567`) e os números abreviados `300X`/`400X` (`4004-1234`). - `"auto"`: `"service"` para um número de serviço, `"international"` quando `value` traz código de país, senão `"nanp"` para mais de 9 dígitos, ou `"sn"`. +- O `obfuscate` mantém 2 dígitos, a contagem que a conta gov.br usa para o celular cadastrado, e mantém o prefixo que indica uma região ou um serviço, e não um assinante: o DDD, o código do tipo `0800` e a raiz `300X`/`400X`. +- Os 2 dígitos são os últimos que cabem na própria máscara, então na máscara padrão `"sn"` um valor com DDD é truncado antes, igual ao que acontece sem `obfuscate`, e o par visível é o 8º e o 9º dígito, e não os 2 últimos de `value`. +- Um código de utilidade pública de 3 dígitos (`190`) não identifica ninguém e é devolvido como está; num valor que a máscara `"service"` não reconhece cada dígito vira um `*`, o que esconde os dígitos, mas não quantos eram. Os padrões ofuscados têm um número fixo de posições, então em `"e164"` o que passa do 11º dígito nacional é descartado. ```javascript import { formatPhone } from '@brazilian-utils/brazilian-utils'; @@ -615,10 +831,19 @@ formatPhone('08001234567', { mask: 'service' }); // 0800 123 4567 formatPhone('40041234', { mask: 'service' }); // 4004-1234 formatPhone('+5511987654321', { mask: 'auto' }); // +55 11 98765-4321 ("auto" detecta o prefixo +55 e escolhe "international") formatPhone('5508001234567', { mask: 'auto' }); // 0800 123 4567 ("auto" lê o número 0800, não um +55 08) +formatPhone('987654321', { obfuscate: true }); // *****-**21 +formatPhone('11987654321', { mask: 'auto', obfuscate: true }); // (11) *****-**21 +formatPhone('1130000000', { mask: 'auto', obfuscate: true }); // (11) ****-**00 +formatPhone('+5511987654321', { mask: 'auto', obfuscate: true }); // +55 11 *****-**21 +formatPhone('11987654321', { mask: 'e164', obfuscate: true }); // +5511*******21 +formatPhone('08001234567', { mask: 'service', obfuscate: true }); // 0800 *** **67 +formatPhone('40041234', { mask: 'service', obfuscate: true }); // 4004-**34 +formatPhone('11988887766', { mask: 'service', obfuscate: true }); // *********** (não é número de serviço) +formatPhone('11987654321', { obfuscate: true }); // *****-**43 (CUIDADO: a "sn" trunca antes, então "43", e não "21") formatPhone('11900000000'); // 11900-0000 (CUIDADO: a máscara padrão "sn" trunca um número com DDD) ``` -Fonte: [ITU-T E.164](https://www.itu.int/rec/T-REC-E.164), [Resolução Anatel nº 749/2022](https://informacoes.anatel.gov.br/legislacao/resolucoes/2022/1641-resolucao-749). +Fonte: [ITU-T E.164](https://www.itu.int/rec/T-REC-E.164), [Resolução Anatel nº 749/2022](https://informacoes.anatel.gov.br/legislacao/resolucoes/2022/1641-resolucao-749), [conta gov.br](https://acesso.gov.br/faq/_perguntasdafaq/formarrecuperarconta.html) para quantos dígitos de um celular ficam visíveis. ### parsePhone @@ -883,13 +1108,16 @@ isValidPis('12056412547'); // false Formata um PIS. -- **Opções** (`FormatPisOptions`): `pad` completa o valor com zeros à esquerda até 11 dígitos antes de aplicar a máscara (padrão `false`). +- **Opções** (`FormatPisOptions`): `pad` completa o valor com zeros à esquerda até 11 dígitos antes de aplicar a máscara (padrão `false`); `obfuscate` esconde os 3 primeiros dígitos e o dígito verificador. +- O `obfuscate` é aplicado depois do `pad`. +- Nenhuma autoridade publica uma regra de mascaramento para o PIS, então o `obfuscate` usa a que a Lei nº 12.309/2010, art. 87, § 5º define para o CPF ("ocultar os três primeiros dígitos e os dois dígitos verificadores"), um número com a mesma estrutura. ```javascript import { formatPis } from '@brazilian-utils/brazilian-utils'; formatPis('12345678901'); // 123.45678.90-1 formatPis('123456789', { pad: true }); // 001.23456.78-9 +formatPis('12345678901', { obfuscate: true }); // ***.45678.90-* ``` ### parsePis @@ -912,6 +1140,8 @@ import { generatePis } from '@brazilian-utils/brazilian-utils'; generatePis(); // '91077906857' ``` +Fonte: [Lei nº 12.309/2010, art. 87, § 5º](https://www.planalto.gov.br/ccivil_03/_ato2007-2010/2010/lei/l12309.htm), a regra de mascaramento do CPF que o `obfuscate` toma emprestada. + ## Processo jurídico ### isValidProcessoJuridico @@ -1366,6 +1596,33 @@ getStates(); Fonte: [IBGE Localidades](https://servicodados.ibge.gov.br/api/docs/localidades) +### getStateByCep + +Retorna o estado brasileiro ao qual um CEP pertence, a partir das faixas de CEP que os Correios atribuem a cada UF (a "Faixa de CEP" de cada UF). + +- Funciona offline: nenhuma API de CEP é chamada, então a resposta diz qual estado é dono da faixa, não se o CEP está em uso. +- Aceita o que o `isValidCep` aceita: 8 dígitos, como string ou número, ignorando espaços, pontos e hifens. Um CEP que começa com `0` precisa ser uma string, e um número negativo ou fracionário é rejeitado. +- Amazonas, Distrito Federal e Goiás têm duas faixas cada, e nenhuma faixa estadual cobre `00000-000` a `00999-999` nem `78900-000` a `78999-999`. +- A faixa é o bloco que pertence ao estado, não uma garantia de que todo CEP dentro dela está em uso: `10000-000` está sem uso dentro da faixa de São Paulo e ainda assim responde São Paulo. +- Retorna `null` para um CEP inválido ou fora de todas as faixas. Exporta o tipo `State`. + +```javascript +import { getStateByCep } from '@brazilian-utils/brazilian-utils'; + +getStateByCep('01310-100'); +// { code: 'SP', name: 'São Paulo', regionCode: 'SE', regionName: 'Sudeste', ibgeCode: 35 } + +getStateByCep(20040020); +// { code: 'RJ', name: 'Rio de Janeiro', regionCode: 'SE', regionName: 'Sudeste', ibgeCode: 33 } + +getStateByCep('69300-000')?.code; // 'RR' +getStateByCep('72800-000')?.code; // 'GO' +getStateByCep('00999-999'); // null +getStateByCep('12345'); // null +``` + +Fonte: [Correios, Busca Faixa de CEP](https://buscacepinter.correios.com.br/app/faixa_cep_uf_localidade/index.php) + ### getStateByIbgeCode Retorna o estado brasileiro cujo código IBGE de 2 dígitos (`cUF`, o Código da Unidade da Federação) corresponde ao valor informado. @@ -1653,7 +1910,10 @@ isHoliday(); // false Verifica se uma data é dia útil no Brasil: não é sábado, domingo nem um feriado que `getHolidays` lista para o seu dia de calendário local. -- **Opções** (`BusinessDayOptions`, as mesmas de todos os utilitários de dias úteis): `includeOptional` (padrão `true`) também conta os feriados `"optional"`, Carnaval e Corpus Christi, como dias não úteis; `stateCode` também conta os feriados daquele estado. +- **Opções** (`BusinessDayOptions`, as mesmas de todos os utilitários de dias úteis): `includeOptional` (padrão `true`) também conta os feriados `"optional"`, Carnaval e Corpus Christi, como dias não úteis; `includeSaturday` (padrão `false`) conta o sábado como dia útil; `stateCode` também conta os feriados daquele estado. +- Com `includeSaturday` desligado, é a contagem de segunda a sexta usada por bancos e tribunais. Ligado, é a contagem trabalhista do prazo de pagamento do salário do art. 459, § 1º, da CLT, a que a fiscalização do trabalho lê pela Instrução Normativa MTP nº 2/2021, art. 14, I: "na contagem dos dias será incluído o sábado, excluindo-se o domingo e o feriado, inclusive o municipal". +- Com `includeSaturday` ligado, o domingo e os feriados continuam excluídos, então um feriado que cai em um sábado continua não sendo dia útil. +- O trecho "inclusive o municipal" dessa regra não é coberto: `getHolidays` tem apenas feriados nacionais e estaduais, então um feriado municipal é contado aqui como dia útil comum. Retire os feriados municipais por conta própria quando a contagem precisar ser exata para um município. - Retorna `false` quando `value` não é um `Date` válido ou o seu ano está fora de 1900 a 2099, ou quando `stateCode` está presente e não é string. ```javascript @@ -1662,6 +1922,9 @@ import { isBusinessDay } from '@brazilian-utils/brazilian-utils'; isBusinessDay(new Date(2024, 0, 2)); // true (terça-feira, não é feriado) isBusinessDay(new Date(2024, 0, 1)); // false (Ano novo) isBusinessDay(new Date(2024, 0, 6)); // false (sábado) +isBusinessDay(new Date(2024, 0, 6), { includeSaturday: true }); // true (contagem trabalhista) +isBusinessDay(new Date(2024, 8, 7), { includeSaturday: true }); // false (Independência, feriado em um sábado) +isBusinessDay(new Date(2024, 0, 7), { includeSaturday: true }); // false (o domingo nunca é incluído) isBusinessDay(new Date(2024, 1, 13)); // false (Carnaval, feriado facultativo, conta por padrão) isBusinessDay(new Date(2024, 1, 13), { includeOptional: false }); // true isBusinessDay(new Date(2024, 6, 9), { stateCode: 'SP' }); // false (Revolução Constitucionalista) @@ -1673,7 +1936,7 @@ isBusinessDay(new Date('not a date')); // false Soma dias úteis a uma data, pulando sábados, domingos e os feriados que `isBusinessDay` considera. Assinatura: `addBusinessDays(date, amount, options?)`, a mesma do date-fns. -- **Opções** (`BusinessDayOptions`, as mesmas de `isBusinessDay`): `includeOptional` (padrão `true`) também pula Carnaval e Corpus Christi; `stateCode` também pula os feriados daquele estado. +- **Opções** (`BusinessDayOptions`, as mesmas de `isBusinessDay`): `includeOptional` (padrão `true`) também pula Carnaval e Corpus Christi; `includeSaturday` (padrão `false`) conta o sábado como dia útil; `stateCode` também pula os feriados daquele estado. - Retorna um novo `Date`, com o horário preservado; `date` não é alterado. - `amount` igual a `0` retorna a mesma data, mesmo em fim de semana ou feriado. Um `amount` negativo anda para trás. - Retorna `null` quando `date` é inválido, `amount` não é um inteiro finito, `stateCode` não é string ou o resultado sai dos anos de 1900 a 2099. @@ -1685,6 +1948,8 @@ addBusinessDays(new Date(2024, 0, 2, 12), 1); // Date, 2024-01-03 12:00 (o dia s addBusinessDays(new Date(2024, 11, 31, 12), 1); // Date, 2025-01-02 12:00 (2025-01-01 é Ano novo, pulado) addBusinessDays(new Date(2024, 0, 5, 12), -1); // Date, 2024-01-04 12:00 (anda para trás) addBusinessDays(new Date(2024, 0, 6, 12), 0); // Date, 2024-01-06 12:00 (sem alteração, mesmo o sábado não sendo dia útil) +addBusinessDays(new Date(2024, 0, 5, 12), 1, { includeSaturday: true }); // Date, 2024-01-06 12:00 (contagem trabalhista, o sábado conta) +addBusinessDays(new Date(2024, 10, 1, 12), 1, { includeSaturday: true }); // Date, 2024-11-04 12:00 (2024-11-02 é Finados, feriado em um sábado) addBusinessDays(new Date(2024, 6, 8, 12), 1, { stateCode: 'SP' }); // Date, 2024-07-10 12:00 (2024-07-09 é a Revolução Constitucionalista em SP, pulado) addBusinessDays(new Date('not a date'), 1); // null addBusinessDays(new Date(2024, 0, 2), 1.5); // null (não é um número inteiro) @@ -1704,6 +1969,8 @@ subBusinessDays(new Date(2024, 0, 8, 12), 1); // Date, 2024-01-05 12:00 (anda pa subBusinessDays(new Date(2025, 0, 2, 12), 1); // Date, 2024-12-31 12:00 (2025-01-01 é Ano novo, pulado) subBusinessDays(new Date(2024, 0, 5, 12), -1); // Date, 2024-01-08 12:00 (anda para frente) subBusinessDays(new Date(2024, 0, 6, 12), 0); // Date, 2024-01-06 12:00 (sem alteração, mesmo o sábado não sendo dia útil) +subBusinessDays(new Date(2024, 0, 8, 12), 1, { includeSaturday: true }); // Date, 2024-01-06 12:00 (contagem trabalhista, o sábado conta) +subBusinessDays(new Date(2024, 10, 4, 12), 1, { includeSaturday: true }); // Date, 2024-11-01 12:00 (2024-11-02 é Finados, feriado em um sábado) subBusinessDays(new Date(2024, 6, 10, 12), 1, { stateCode: 'SP' }); // Date, 2024-07-08 12:00 (2024-07-09 é a Revolução Constitucionalista em SP, pulado) subBusinessDays(new Date('not a date'), 1); // null subBusinessDays(new Date(2024, 0, 2), 1.5); // null (não é um número inteiro) @@ -1713,7 +1980,7 @@ subBusinessDays(new Date(2024, 0, 2), 1.5); // null (não é um número inteiro) Conta os dias úteis entre duas datas. Assinatura: `differenceInBusinessDays(laterDate, earlierDate, options?)`, a mesma do date-fns. -- **Opções** (`BusinessDayOptions`, as mesmas de `isBusinessDay`): `includeOptional` (padrão `true`) também pula Carnaval e Corpus Christi; `stateCode` também pula os feriados daquele estado. +- **Opções** (`BusinessDayOptions`, as mesmas de `isBusinessDay`): `includeOptional` (padrão `true`) também pula Carnaval e Corpus Christi; `includeSaturday` (padrão `false`) conta o sábado como dia útil; `stateCode` também pula os feriados daquele estado. - Conta `earlierDate` quando é dia útil e cada dia útil estritamente entre as duas datas; `laterDate` nunca é contado. O horário é ignorado. - O resultado é negativo quando `laterDate` é anterior a `earlierDate`, e `0` no mesmo dia de calendário. - Retorna `null` quando uma das datas não é um `Date` válido ou está fora dos anos de 1900 a 2099, ou quando `stateCode` não é string. @@ -1725,10 +1992,90 @@ differenceInBusinessDays(new Date(2024, 0, 2), new Date(2024, 0, 1)); // 0 (01/0 differenceInBusinessDays(new Date(2024, 0, 3), new Date(2024, 0, 2)); // 1 (02/01 contado, uma terça-feira; 03/01 não) differenceInBusinessDays(new Date(2024, 0, 2), new Date(2024, 0, 3)); // -1 (a data posterior vem primeiro, então a contagem é negativa) differenceInBusinessDays(new Date(2024, 0, 2), new Date(2024, 0, 2)); // 0 (mesmo dia) +differenceInBusinessDays(new Date(2024, 0, 8), new Date(2024, 0, 1)); // 4 (contagem bancária, de 2024-01-02 a 2024-01-05) +differenceInBusinessDays(new Date(2024, 0, 8), new Date(2024, 0, 1), { includeSaturday: true }); // 5 (2024-01-06, um sábado, também conta) +differenceInBusinessDays(new Date(2024, 10, 4), new Date(2024, 10, 1), { includeSaturday: true }); // 1 (2024-11-02 é Finados, feriado em um sábado) differenceInBusinessDays(new Date(2024, 6, 10), new Date(2024, 6, 8), { stateCode: 'SP' }); // 1 (09/07/2024 é feriado estadual em SP) differenceInBusinessDays(new Date(), new Date('not a date')); // null ``` +### getNextBusinessDay + +Retorna o primeiro dia útil brasileiro estritamente depois de uma data. `getNextBusinessDay(date, options?)` é `addBusinessDays(date, 1, options)`. + +- **Opções** (`BusinessDayOptions`, as mesmas de `isBusinessDay`): `includeOptional` (padrão `true`) também pula Carnaval e Corpus Christi; `includeSaturday` (padrão `false`) conta o sábado como dia útil; `stateCode` também pula os feriados daquele estado. +- "Próximo" significa estritamente depois, o sentido que o date-fns dá em `nextDay`: um `date` que já é dia útil nunca é retornado. Para "no dia ou depois", consulte `isBusinessDay(date)` antes e fique com `date` quando a resposta for `true`. +- Retorna um novo `Date`, com o horário preservado; `date` nunca é modificado. +- Retorna `null` quando `date` é inválido, `stateCode` não é string, ou o resultado sai dos anos de 1900 a 2099. + +```javascript +import { getNextBusinessDay } from '@brazilian-utils/brazilian-utils'; + +getNextBusinessDay(new Date(2024, 0, 2, 12)); // Date, 2024-01-03 12:00 (estritamente depois, embora 02/01/2024 seja dia útil) +getNextBusinessDay(new Date(2024, 0, 5, 12)); // Date, 2024-01-08 12:00 (pula o fim de semana) +getNextBusinessDay(new Date(2024, 0, 6, 12)); // Date, 2024-01-08 12:00 (a partir de um sábado) +getNextBusinessDay(new Date(2024, 0, 5, 12), { includeSaturday: true }); // Date, 2024-01-06 12:00 (contagem trabalhista, o sábado conta) +getNextBusinessDay(new Date(2024, 10, 1, 12), { includeSaturday: true }); // Date, 2024-11-04 12:00 (2024-11-02 é Finados, feriado em um sábado) +getNextBusinessDay(new Date(2024, 11, 31, 12)); // Date, 2025-01-02 12:00 (01/01/2025 é Ano novo, pulado) +getNextBusinessDay(new Date(2024, 6, 8, 12), { stateCode: 'SP' }); // Date, 2024-07-10 12:00 (09/07/2024 é Revolução Constitucionalista em SP, pulado) +getNextBusinessDay(new Date('not a date')); // null +getNextBusinessDay(new Date(2099, 11, 31)); // null (o percurso sai dos anos suportados) +``` + +### getNthBusinessDay + +Retorna o n-ésimo dia útil brasileiro do mês em que uma data cai. Assinatura: `getNthBusinessDay(date, n, options?)`, a ordem de argumentos de `addBusinessDays`. + +- **Opções** (`BusinessDayOptions`, as mesmas de `isBusinessDay`): `includeOptional` (padrão `true`) também pula Carnaval e Corpus Christi; `includeSaturday` (padrão `false`) conta o sábado como dia útil; `stateCode` também pula os feriados daquele estado. +- `date` é qualquer data dentro do mês: o que importa são o ano e o mês locais, o dia do mês e o horário são ignorados. +- Um `n` positivo conta a partir do primeiro dia do mês (`1` é o primeiro dia útil) e um `n` negativo conta a partir do último (`-1` é o último dia útil, `-2` o anterior a ele), como `Array#at` lê um índice. +- Retorna um novo `Date` no início daquele dia local (00:00); `date` nunca é modificado. +- Retorna `null` quando `date` é inválido, `n` não é um inteiro finito, é `0` ou vai além dos dias úteis que o mês tem (a resposta nunca transborda para um mês vizinho), `stateCode` não é string, ou o mês sai dos anos de 1900 a 2099. Um `options` que não é um objeto é ignorado. +- O prazo de pagamento de salário do art. 459, § 1º, da CLT ("até o quinto dia útil do mês subsequente ao vencido") é a contagem trabalhista, não a bancária que esta função dá por padrão: passe `{ includeSaturday: true }`, como em `getNthBusinessDay(date, 5, { includeSaturday: true })`. Os feriados municipais continuam contando como dias úteis, e essa regra os exclui. +- A contagem percorre dias do calendário local, então vale em qualquer fuso horário. Quando o dia local resultante não tem 00:00 (o horário de verão brasileiro sempre começava à meia-noite, então 6 de outubro de 1997 começa à 01:00 em São Paulo), é retornado o instante mais próximo daquele dia, o mesmo `Date` que o `startOfDay` do date-fns dá ali. +- Um dia do calendário local que o fuso nunca teve, como 30 de dezembro de 2011 em `Pacific/Apia`, não é contado nem retornado. + +```javascript +import { getNthBusinessDay } from '@brazilian-utils/brazilian-utils'; + +getNthBusinessDay(new Date(2024, 0, 15), 1); // Date, 2024-01-02 00:00 (01/01/2024 é Ano novo) +getNthBusinessDay(new Date(2024, 0, 15), 5); // Date, 2024-01-08 00:00 +getNthBusinessDay(new Date(2024, 1, 1), 10); // Date, 2024-02-15 00:00 (Carnaval, 13/02/2024, pulado) +getNthBusinessDay(new Date(2024, 1, 1), 10, { includeOptional: false }); // Date, 2024-02-14 00:00 +getNthBusinessDay(new Date(2024, 2, 1), 5); // Date, 2024-03-07 00:00 (contagem bancária) +getNthBusinessDay(new Date(2024, 2, 1), 5, { includeSaturday: true }); // Date, 2024-03-06 00:00 (contagem trabalhista, 2024-03-02 é um sábado) +getNthBusinessDay(new Date(2024, 10, 1), 5, { includeSaturday: true }); // Date, 2024-11-07 00:00 (2024-11-02 é Finados, feriado em um sábado) +getNthBusinessDay(new Date(2024, 6, 1), 7, { stateCode: 'SP' }); // Date, 2024-07-10 00:00 (09/07/2024 é Revolução Constitucionalista em SP, pulado) +getNthBusinessDay(new Date(2024, 0, 15), -1); // Date, 2024-01-31 00:00 (o último dia útil) +getNthBusinessDay(new Date(2024, 0, 15), -2); // Date, 2024-01-30 00:00 +getNthBusinessDay(new Date(2024, 0, 15), 23); // null (janeiro de 2024 tem 22 dias úteis) +getNthBusinessDay(new Date(2024, 0, 15), 0); // null +getNthBusinessDay(new Date('not a date'), 1); // null +``` + +### getLastBusinessDayOfMonth + +Retorna o último dia útil brasileiro do mês em que uma data cai. `getLastBusinessDayOfMonth(date, options?)` é `getNthBusinessDay(date, -1, options)`. + +- Valem as mesmas regras de `getNthBusinessDay`, inclusive as `BusinessDayOptions`: qualquer data dentro do mês, o resultado no início do dia local, a entrada intocada, os anos de 1900 a 2099 e os casos de `null`. +- O nome segue o `lastDayOfMonth` do date-fns. + +```javascript +import { getLastBusinessDayOfMonth } from '@brazilian-utils/brazilian-utils'; + +getLastBusinessDayOfMonth(new Date(2024, 0, 15)); // Date, 2024-01-31 00:00 +getLastBusinessDayOfMonth(new Date(2024, 2, 1)); // Date, 2024-03-28 00:00 (29/03/2024 é Sexta-feira Santa, seguida de um fim de semana) +getLastBusinessDayOfMonth(new Date(2024, 7, 31, 18, 30)); // Date, 2024-08-30 00:00 (31/08/2024 é um sábado) +getLastBusinessDayOfMonth(new Date(2018, 4, 1)); // Date, 2018-05-30 00:00 (31/05/2018 é Corpus Christi, facultativo, conta por padrão) +getLastBusinessDayOfMonth(new Date(2018, 4, 1), { includeOptional: false }); // Date, 2018-05-31 00:00 +getLastBusinessDayOfMonth(new Date(2024, 7, 1), { includeSaturday: true }); // Date, 2024-08-31 00:00 (contagem trabalhista, o sábado conta) +getLastBusinessDayOfMonth(new Date(2024, 10, 1), { stateCode: 'DF', includeSaturday: true }); // Date, 2024-11-29 00:00 (o sábado 2024-11-30 é o Dia do Evangélico no DF) +getLastBusinessDayOfMonth(new Date(2023, 10, 1), { stateCode: 'DF' }); // Date, 2023-11-29 00:00 (30/11/2023 é Dia do Evangélico no DF) +getLastBusinessDayOfMonth(new Date('not a date')); // null +``` + +Fonte: [CLT, art. 459](https://www.planalto.gov.br/ccivil_03/decreto-lei/del5452.htm), [Instrução Normativa MTP nº 2/2021](https://www.gov.br/trabalho-e-emprego/pt-br/assuntos/inspecao-do-trabalho/areas-de-atuacao/in-2-de-8-denovembro-de-2021.pdf) (art. 14, I) e date-fns, cujos [`nextDay`](https://date-fns.org/docs/nextDay), [`lastDayOfMonth`](https://date-fns.org/docs/lastDayOfMonth) e [`startOfDay`](https://date-fns.org/docs/startOfDay) nomeiam e dão forma a estas funções. + ## Passaporte ### isValidPassport @@ -1803,13 +2150,16 @@ Fonte: [Resolução CONTRAN nº 886/2021, art. 4º](https://www.gov.br/transport Formata uma CNH. -- **Opções** (`FormatCnhOptions`): `pad` completa o valor com zeros à esquerda até os 11 dígitos antes de aplicar a máscara (padrão `false`). +- **Opções** (`FormatCnhOptions`): `pad` completa o valor com zeros à esquerda até os 11 dígitos antes de aplicar a máscara (padrão `false`); `obfuscate` esconde os 3 primeiros dígitos e os 2 dígitos verificadores. +- O `obfuscate` é aplicado depois do `pad`. +- Nenhuma autoridade publica uma regra de mascaramento para a CNH, então o `obfuscate` usa a que a Lei nº 12.309/2010, art. 87, § 5º define para o CPF ("ocultar os três primeiros dígitos e os dois dígitos verificadores"), um número com a mesma estrutura. ```javascript import { formatCnh } from '@brazilian-utils/brazilian-utils'; formatCnh('02650306461'); // 026503064-61 formatCnh('2650306461', { pad: true }); // 026503064-61 +formatCnh('02650306461', { obfuscate: true }); // ***503064-** ``` ### parseCnh @@ -1832,6 +2182,8 @@ import { generateCnh } from '@brazilian-utils/brazilian-utils'; generateCnh(); // '02650306461' ``` +Fonte: [Lei nº 12.309/2010, art. 87, § 5º](https://www.planalto.gov.br/ccivil_03/_ato2007-2010/2010/lei/l12309.htm), a regra de mascaramento do CPF que o `obfuscate` toma emprestada. + ## Natureza jurídica ### isValidLegalNature @@ -1996,13 +2348,16 @@ Fonte: [Resolução TSE nº 23.659/2021, art. 36](https://www.tse.jus.br/legisla Formata um título de eleitor com o agrupamento de 12 dígitos `0000 0000 00 00`. +- **Opções** (`FormatVoterIdOptions`): `obfuscate` esconde os 3 primeiros dígitos e os 2 dígitos verificadores, deixando visível o código da unidade federativa. - O agrupamento de 13 dígitos `0000 0000 0 00 00` só é usado quando o valor tem mais de 12 dígitos e o código da UF (o 10º e o 11º dígitos) é `01` ou `02`. - Os dígitos além da última posição do padrão são descartados. +- Nenhuma autoridade publica uma regra de mascaramento para o título de eleitor, então o `obfuscate` usa a que a Lei nº 12.309/2010, art. 87, § 5º define para o CPF ("ocultar os três primeiros dígitos e os dois dígitos verificadores"), um número com a mesma estrutura. ```javascript import { formatVoterId } from '@brazilian-utils/brazilian-utils'; formatVoterId('123456780175'); // '1234 5678 01 75' +formatVoterId('123456780175', { obfuscate: true }); // '***4 5678 01 **' formatVoterId('1234567880191'); // '1234 5678 8 01 91' (título de 13 dígitos SP/MG) ``` @@ -2032,6 +2387,8 @@ generateVoterId('SP'); // título de eleitor aleatório válido de São Paulo generateVoterId('XX'); // usa "ZZ" em vez de lançar erro ``` +Fonte: [Lei nº 12.309/2010, art. 87, § 5º](https://www.planalto.gov.br/ccivil_03/_ato2007-2010/2010/lei/l12309.htm), a regra de mascaramento do CPF que o `obfuscate` toma emprestada. + ## CNS ### isValidCns @@ -2498,6 +2855,100 @@ parseNcm('8471.30.12'); // '84713012' parseNcm('8471'); // '8471' (um código parcial é mantido como está) ``` +### isValidNbs + +Valida um código NBS (Nomenclatura Brasileira de Serviços, Intangíveis e Outras Operações que Produzam Variações no Patrimônio) contra a tabela oficial da NBS 2.0, o código que a NFS-e nacional leva em `cNBS`. + +- O código tem 9 dígitos, impressos como `N.NNNN.NN.NN`: o algarismo 1, o capítulo, a posição, os dois níveis de subposição, o item e o subitem. +- Aceita uma string com os 9 dígitos ou com a máscara, com um único separador entre os grupos e espaços opcionais nas extremidades, ou um inteiro seguro não negativo. Qualquer outra string é rejeitada em vez de ter os dígitos pinçados. +- Só códigos completos são válidos: os títulos de capítulo (`1.01`), posição (`1.0101`) e subposição (`1.0101.1`) não classificam nada por si sós. +- O ANEXO B do Sistema Nacional NFS-e lista os mesmos 920 códigos menos três (`1.0402.29.00`, `1.0403.29.00` e `1.0904.40.00`), então um código válido aqui ainda pode ser recusado pela NFS-e. + +```javascript +import { isValidNbs } from '@brazilian-utils/brazilian-utils'; + +isValidNbs('1.0101.11.00'); // true +isValidNbs('101011100'); // true +isValidNbs(101011100); // true +isValidNbs('1.0101'); // false (título de posição, não um código completo) +isValidNbs('1.9999.99.99'); // false +isValidNbs('1.0101abc11.00'); // false (não é uma forma documentada) +``` + +### formatNbs + +Formata um código NBS (Nomenclatura Brasileira de Serviços) na máscara `N.NNNN.NN.NN` em que a nomenclatura o imprime. Só a estrutura muda; use `isValidNbs` para conferir um código com a tabela. + +- Todo código NBS começa com 1, então, diferente do `formatNcm`, não há opção `pad`. +- No resto, mesmas regras de `formatCnae`: a máscara é aplicada até onde o valor vai, os caracteres fora dela são descartados e um número é lido como a string dos seus dígitos. + +```javascript +import { formatNbs } from '@brazilian-utils/brazilian-utils'; + +formatNbs('101011100'); // 1.0101.11.00 +formatNbs(101011100); // 1.0101.11.00 +formatNbs('10101'); // 1.0101 (mascarado até onde vai) +formatNbs('abc101011100'); // 1.0101.11.00 (só os dígitos são lidos) +``` + +### getNbs + +Consulta um código NBS (Nomenclatura Brasileira de Serviços) e retorna a sua descrição oficial. O resultado é um registro `Nbs`: `{ code, description }`. + +- Mesmas regras de `isValidNbs`. `code` são os 9 dígitos, sem a máscara. Retorna `null` quando o código é desconhecido ou o valor não está em uma forma documentada. + +```javascript +import { getNbs } from '@brazilian-utils/brazilian-utils'; + +getNbs('1.0101.11.00'); +// { code: '101011100', description: 'Serviços de construção de edificações residenciais de um e dois pavimentos' } + +getNbs(126050000); // { code: '126050000', description: 'Serviços domésticos' } +getNbs('1.0101'); // null (título de posição, não um código completo) +getNbs('1.9999.99.99'); // null +``` + +Fonte: [tabela da NBS 2.0 publicada pelo MDIC](https://www.gov.br/mdic/pt-br/assuntos/sdic/comercio-e-servicos/nbs-nomenclatura-brasileira-de-servicos), aprovada pela Portaria Conjunta RFB/SCS 1.429/2018 e alterada pela Portaria Conjunta RFB/SCS 2.000/2018. + +### isValidServiceItem + +Verifica se um valor é um subitem em vigor da lista de serviços anexa à Lei Complementar 116/2003, a lista dos serviços sobre os quais incide o ISS. + +- A lei numera o subitem como o item, um ponto e dois dígitos, de `1.01` a `40.01`. +- Aceita essa forma, o item preenchido com zero (`'01.01'`) ou os dígitos puros (`'0101'`, `'101'` ou o inteiro `101`), que são os quatro primeiros dígitos do código `cTribNac` da NFS-e nacional, com espaços opcionais nas extremidades. +- O ponto é o único separador que a lei imprime entre o item e o subitem, então, ao contrário dos códigos com máscara de agrupamento impressa (`isValidCfop`, `isValidNbs`), nada mais é aceito no lugar dele e `'1-01'` é rejeitado. +- Um número só é lido quando é um inteiro seguro não negativo, então o decimal `1.01` é rejeitado: escreva a forma com ponto como string. +- Os subitens vetados (`3.01`, `7.14`, `7.15`, `13.01` e `17.07`), os títulos de item, os códigos nacionais de 6 dígitos em que um subitem se desdobra e o item 99 da lista nacional, que não faz parte da lei, não são válidos. Códigos municipais de serviço estão fora do escopo. + +```javascript +import { isValidServiceItem } from '@brazilian-utils/brazilian-utils'; + +isValidServiceItem('1.01'); // true +isValidServiceItem('01.01'); // true +isValidServiceItem('0101'); // true +isValidServiceItem(101); // true +isValidServiceItem('3.01'); // false (vetado) +isValidServiceItem('99.01'); // false (só da lista nacional, não da lei) +isValidServiceItem(1.01); // false (não é um inteiro seguro não negativo) +``` + +### getServiceItem + +Consulta um subitem da lista de serviços anexa à Lei Complementar 116/2003 e retorna a sua descrição oficial. O resultado é um registro `ServiceItem`: `{ code, description }`. + +- Mesmas regras de `isValidServiceItem`. `code` é a forma em que a lei o imprime (`'1.01'`). Retorna `null` quando o subitem é desconhecido ou o valor não está em uma forma documentada. + +```javascript +import { getServiceItem } from '@brazilian-utils/brazilian-utils'; + +getServiceItem('1.01'); // { code: '1.01', description: 'Análise e desenvolvimento de sistemas.' } +getServiceItem('0101'); // { code: '1.01', description: 'Análise e desenvolvimento de sistemas.' } +getServiceItem('40.01'); // { code: '40.01', description: 'Obras de arte sob encomenda.' } +getServiceItem('3.01'); // null (vetado) +``` + +Fonte: [Lei Complementar 116/2003](https://www.planalto.gov.br/ccivil_03/leis/lcp/lcp116.htm) e a planilha `LISTA.SERV.NAC.` do [ANEXO B do Sistema Nacional NFS-e](https://www.gov.br/nfse/pt-br/biblioteca/documentacao-tecnica/documentacao-atual), a lista em vigor em formato legível por máquina. + ### isValidCfop Valida um código CFOP (Código Fiscal de Operações e Prestações) contra a tabela oficial, o Anexo II consolidado do Convênio SINIEF s/nº 1970 em vigor. @@ -2550,6 +3001,77 @@ getCfop('abc5102'); // null (não é uma forma documentada) Fonte: [Anexo II consolidado do Convênio SINIEF s/nº 1970](https://www.confaz.fazenda.gov.br/legislacao/ajustes/sinief/cfop_cvsn_1-6.24), última alteração pelo [Ajuste SINIEF 39/25](https://www.confaz.fazenda.gov.br/legislacao/ajustes/2025/AJ039_25). +### isValidCest + +Valida um CEST (Código Especificador da Substituição Tributária) contra os anexos do Convênio ICMS 142/18, no texto consolidado vigente. + +- Só os itens em vigor contam: um item que os anexos marcam como revogado é rejeitado. +- A verificação é só do código: ela não diz se o código combina com um dado NCM, nem se um estado aplica o regime de substituição tributária a ele. +- Um CEST tem 7 dígitos: os dois primeiros são o segmento, do terceiro ao quinto o item do segmento e os dois últimos a especificação do item (cláusula sexta, IV). +- Aceita uma string com os 7 dígitos ou com a forma `NN.NNN.NN` que os anexos imprimem, com um único separador entre os grupos e espaços opcionais nas extremidades, ou um inteiro seguro não negativo. Qualquer outra string é rejeitada em vez de ter os dígitos pinçados. +- O zero à esquerda dos segmentos 01 a 09 faz parte do código, então um valor escrito apenas com dígitos é completado com zeros à esquerda até 7, como string ou como número: `100100`, `'100100'` e `'0100100'` são o mesmo código. Um valor mascarado é lido como foi escrito. + +```javascript +import { isValidCest } from '@brazilian-utils/brazilian-utils'; + +isValidCest('01.001.00'); // true +isValidCest('0100100'); // true +isValidCest(100100); // true (completado para 7 dígitos, ou seja, '0100100') +isValidCest('03.001.00'); // false (um item revogado) +isValidCest('0000000'); // false +isValidCest('abc0100100'); // false (não é uma forma documentada) +isValidCest(-100100); // false (não é um inteiro seguro não negativo) +``` + +### formatCest + +Formata um CEST (Código Especificador da Substituição Tributária) na forma `NN.NNN.NN` que os anexos do Convênio ICMS 142/18 imprimem. Só a estrutura muda; use `isValidCest` para conferir um código com os anexos. + +- **Opções** (`FormatCestOptions`): `pad` (padrão `false`) completa antes o valor com zeros à esquerda até os 7 dígitos de um código completo. +- Mesmas regras de `formatNcm`: sem `pad` a máscara é aplicada até onde o valor vai, que é o que um campo sendo digitado precisa, os caracteres fora dela são descartados e um número é lido como a string dos seus dígitos, ou seja, só é completado com `pad: true`. + +```javascript +import { formatCest } from '@brazilian-utils/brazilian-utils'; + +formatCest('0100100'); // 01.001.00 +formatCest(2899900); // 28.999.00 +formatCest('01001'); // 01.001 (máscara aplicada até onde o valor vai) +formatCest(100100, { pad: true }); // 01.001.00 (completado até 7 dígitos antes) +formatCest('abc0100100'); // 01.001.00 (só os dígitos são lidos) +``` + +### parseCest + +Remove a formatação do CEST (Código Especificador da Substituição Tributária), mantém apenas os dígitos e limita o resultado aos 7 dígitos de um código completo. + +- Mesmas regras de `parseCbo`: nada é completado com zeros à esquerda aqui, então o zero à esquerda dos segmentos 01 a 09 precisa estar escrito. Use `isValidCest` ou `getCest`, que completam um código numérico sem máscara, para consultar um código. + +```javascript +import { parseCest } from '@brazilian-utils/brazilian-utils'; + +parseCest('01.001.00'); // '0100100' +parseCest('28.999'); // '28999' (um código parcial é mantido como foi escrito) +``` + +### getCest + +Consulta um CEST (Código Especificador da Substituição Tributária) e retorna a descrição do bem ou mercadoria e o nome do seu segmento, como os Anexos I a XXVI do Convênio ICMS 142/18 os redigem. O resultado é um registro `Cest`: `{ code, description, segment }`. + +- Mesmas regras de `isValidCest`. Retorna `null` para um código desconhecido, revogado ou malformado. +- Os códigos NCM/SH que os anexos associam a cada CEST não fazem parte do resultado. + +```javascript +import { getCest } from '@brazilian-utils/brazilian-utils'; + +getCest('05.001.00'); // { code: '0500100', description: 'Cimento', segment: 'Cimentos' } +getCest(500100); // { code: '0500100', description: 'Cimento', segment: 'Cimentos' } +getCest('03.001.00'); // null (um item revogado) +getCest('0000000'); // null +getCest('abc0500100'); // null (não é uma forma documentada) +``` + +Fonte: [Convênio ICMS 142/18 consolidado](https://www.confaz.fazenda.gov.br/legislacao/convenios/2018/CV142_18), alterado por último pelo Convênio ICMS 180/24. + ### isValidCst Valida um código de CST (Código de Situação Tributária) para um tributo. Informe o tributo em `options.tax`: @@ -2602,6 +3124,229 @@ isValidCsosn(-101); // false (não é um inteiro seguro não negativo) Fonte: [Anexo III-A consolidado do Convênio SINIEF s/nº 1970](https://www.confaz.fazenda.gov.br/legislacao/ajustes/sinief/cvsn_70) e [Ajuste SINIEF 03/2010](https://www.confaz.fazenda.gov.br/legislacao/ajustes/2010/aj_003_10). +### isValidCstIbsCbs + +Valida um CST-IBS/CBS (Código de Situação Tributária do IBS e da CBS) contra a tabela oficial, o código que o campo `CST` do grupo `IBSCBS` leva nos documentos fiscais eletrônicos da reforma tributária (Lei Complementar nº 214/2025): NF-e, NFC-e, CT-e, NFS-e e os demais. + +- Os códigos vigentes são `000`, `010`, `011`, `200`, `220`, `221`, `222`, `400`, `410`, `510`, `515`, `550`, `620`, `800`, `810`, `811`, `820` e `830`. +- É uma função própria, não um `tax` de `isValidCst`: IBS e CBS compartilham uma única tabela, seus códigos de 3 dígitos colidem com a forma origem + Tabela B do ICMS (`000`, `200`), e `isValidCst` sem `tax` aceita um código de qualquer tabela, então incluir esta mudaria o que esse padrão aceita. +- Aceita uma string de dígitos puros, com espaços opcionais nas extremidades, ou um inteiro seguro não negativo. O campo é numérico com 3 dígitos e não tem máscara, então qualquer outra string é rejeitada em vez de ter os dígitos pinçados. +- Um valor com menos de 3 dígitos é completado com zeros à esquerda, como string ou como número, já que os códigos começam com zeros que um campo numérico descarta: `0`, `'0'` e `'000'` são todos o código `000`. + +```javascript +import { isValidCstIbsCbs } from '@brazilian-utils/brazilian-utils'; + +isValidCstIbsCbs('000'); // true +isValidCstIbsCbs(410); // true +isValidCstIbsCbs(10); // true (completado para '010') +isValidCstIbsCbs('100'); // false +isValidCstIbsCbs('cst200'); // false (não é uma forma documentada) +isValidCstIbsCbs(-200); // false (não é um inteiro seguro não negativo) +``` + +### getCstIbsCbs + +Busca um CST-IBS/CBS e retorna a descrição que a tabela oficial de CST dá a ele. O resultado é um registro `CstIbsCbs`: `{ code, description }`. + +- Valem a mesma tabela e as mesmas regras de entrada de `isValidCstIbsCbs`. Retorna `null` quando o código é desconhecido ou o valor não está em uma forma documentada. + +```javascript +import { getCstIbsCbs } from '@brazilian-utils/brazilian-utils'; + +getCstIbsCbs('000'); // { code: '000', description: 'Tributação integral' } +getCstIbsCbs(410); // { code: '410', description: 'Imunidade e não incidência' } +getCstIbsCbs(10); // { code: '010', description: 'Tributação com alíquotas uniformes' } +getCstIbsCbs('100'); // null +getCstIbsCbs('cst200'); // null (não é uma forma documentada) +``` + +### isValidClassTrib + +Valida um cClassTrib (Código de Classificação Tributária do IBS e da CBS) contra a tabela oficial, o código que o campo `cClassTrib` leva ao lado do CST-IBS/CBS. + +- **Opções** (`IsValidClassTribOptions`): `cst` é o CST-IBS/CBS que o documento leva, validado também contra a classificação. Omita-o para validar só o cClassTrib. +- Toda classificação pertence a exatamente um CST-IBS/CBS, os 3 primeiros dígitos do seu código, e um documento que leva um cClassTrib com outro CST é rejeitado (rejeição 1024, "Classificação Tributária do IBS e da CBS incompatível com o CST informado"). Um `cst` informado que não seja o CST da classificação, seja ele qual for, torna o resultado `false`. +- Só contam as classificações vigentes: o Informe Técnico 2025.002 exclui uma classificação encerrando sua vigência (`dFimVig`), como a v.1.60 fez com `220001`, `220002` e `220003`, e essas são rejeitadas. São 161 vigentes na versão publicada em 23/06/2026. +- Aceita uma string de dígitos puros, com espaços opcionais nas extremidades, ou um inteiro seguro não negativo. O campo é numérico com 6 dígitos e não tem máscara, então qualquer outra string é rejeitada. +- Um valor com menos de 6 dígitos é completado com zeros à esquerda: `1`, `'1'` e `'000001'` são todos o código `000001`. `cst` é lido da mesma forma, completado para 3 dígitos. +- Só a lista de códigos entra no bundle com esta função, não as descrições que `getClassTrib` retorna. + +```javascript +import { isValidClassTrib } from '@brazilian-utils/brazilian-utils'; + +isValidClassTrib('200001'); // true +isValidClassTrib(1); // true (completado para '000001') +isValidClassTrib('200001', { cst: '200' }); // true +isValidClassTrib('200001', { cst: '000' }); // false (a classificação pertence ao CST 200) +isValidClassTrib('999999'); // false +isValidClassTrib('220001'); // false (excluído pelo Informe Técnico 2025.002 v.1.60) +isValidClassTrib('c200001'); // false (não é uma forma documentada) +``` + +### getClassTrib + +Busca um cClassTrib e retorna a sua classificação oficial. O resultado é um registro `ClassTrib`: `{ code, cst, name, description }`. + +- Valem a mesma tabela e as mesmas regras de leitura do código de `isValidClassTrib`. Retorna `null` quando o código é desconhecido ou o valor não está em uma forma documentada. +- A opção `cst` existe só em `isValidClassTrib`, já que o registro retornado aqui já traz o seu CST em `cst`. +- `cst` é o CST-IBS/CBS a que a classificação pertence, os 3 primeiros dígitos do seu código; `name` é o nome reduzido que a tabela oficial dá para apresentação (a coluna "Nome cClassTrib") e `description` a situação a que se refere (a coluna "Descrição cClassTrib"). +- A redação legal que a planilha também traz em cada linha (o artigo da Lei Complementar nº 214/2025 e dos dois regulamentos) não é distribuída. + +```javascript +import { getClassTrib } from '@brazilian-utils/brazilian-utils'; + +getClassTrib('000002'); +// { +// code: '000002', +// cst: '000', +// name: 'Exploração de via', +// description: 'Exploração de via, observado o art. 11 da Lei Complementar nº 214, de 2025.', +// } +getClassTrib(2)?.code; // '000002' +getClassTrib('999999'); // null +getClassTrib('220001'); // null (excluído pelo Informe Técnico 2025.002 v.1.60) +getClassTrib('c200001'); // null (não é uma forma documentada) +``` + +Fonte: as abas CST e cClassTrib da planilha "Tabela de Classificação Tributária do IBS e CBS" que o [Portal Nacional da NF-e publica em "Documentos" > "Diversos"](https://www.nfe.fazenda.gov.br/portal/listaConteudo.aspx?tipoConteudo=/NJarYc9nus=) (a versão publicada em 23/06/2026), divulgada pelo [Informe Técnico 2025.002](https://www.nfe.fazenda.gov.br/portal/listaConteudo.aspx?tipoConteudo=hXzemuyNHW4=) (v.1.60), e a [Nota Técnica 2025.002-RTC](https://www.nfe.fazenda.gov.br/portal/listaConteudo.aspx?tipoConteudo=04BIflQt1aY=), campos UB13 e UB14. + +## GTIN (código de barras de produto) + +### isValidGtin + +Verifica se um GTIN (Global Trade Item Number, o número sob um código de barras EAN/UPC) é válido. + +- Cobre as quatro estruturas das GS1 General Specifications, as mesmas quatro que a NF-e aceita em `cEAN` e `cEANTrib`: GTIN-8, GTIN-12 (UPC), GTIN-13 (EAN) e GTIN-14 (DUN-14). +- **Opções** (`IsValidGtinOptions`): `lengths` aceita só alguns dos quatro tamanhos. O padrão são os quatro. +- O valor deve ser uma string de 8, 12, 13 ou 14 dígitos, fora os espaços em volta, cujo último dígito é o dígito verificador módulo 10 da GS1: pesos 3 e 1 alternados a partir da direita, e a soma subtraída do múltiplo de dez igual ou imediatamente superior. É o que as regras I03-10 e I12-10 da Nota Técnica 2021.003 da SEFAZ verificam (rejeições 611 e 612). +- Zeros à esquerda contam, então um número nunca é aceito, e um valor com máscara (`'7 890000 000017'`) é rejeitado em vez de ter seus dígitos extraídos. +- O literal `'SEM GTIN'`, que a NF-e usa para produto sem GTIN, não é um GTIN e portanto não é válido aqui: teste por ele antes de chamar. +- O prefixo não muda o veredito. Os Números de Circulação Restrita (prefixos 02, 04 e 20 a 29, os códigos que a loja imprime nas etiquetas da própria balança) e as faixas de ISSN, ISBN e cupons têm a mesma estrutura e o mesmo dígito verificador, e a "Tabela Prefixo GS1", contra a qual a SEFAZ valida o `cEAN`, lista essas faixas como válidas; use `getGtinInfo` para distingui-las. +- O prefixo também não é conferido contra a lista de Organizações Membro da GS1: a GS1 segue atribuindo faixas, e uma cópia dessa lista passaria a recusar números válidos conforme envelhecesse. Se o número está cadastrado (a consulta ao Cadastro Centralizado de GTIN que a SEFAZ faz para os prefixos 789 e 790) não dá para verificar offline. + +```javascript +import { isValidGtin } from '@brazilian-utils/brazilian-utils'; + +isValidGtin('7890000000017'); // true (GTIN-13, prefixo da GS1 Brasil) +isValidGtin('6291041500213'); // true (o exemplo da página de dígito verificador da GS1) +isValidGtin('78912342'); // true (GTIN-8) +isValidGtin('061414112345'); // true (GTIN-12) +isValidGtin('17890000000014'); // true (GTIN-14) +isValidGtin('7890000000018'); // false (dígito verificador errado) +isValidGtin('17890000000014', { lengths: [8, 12, 13] }); // false (GTIN-14 não aceito) +isValidGtin('7 890000 000017'); // false (somente dígitos) +isValidGtin('SEM GTIN'); // false +``` + +### getGtinInfo + +Extrai os campos de um GTIN, como um `GtinInfo`. + +- Retorna `null` quando o valor não é um GTIN válido, sob as mesmas regras de `isValidGtin`. +- O prefixo é lido como a "Tabela Prefixo GS1" do Portal da NF-e orienta: o valor é preenchido com zeros à esquerda até 14 dígitos, e o prefixo são as posições 7 a 9 quando as seis primeiras são zeros (um GTIN-8) e as posições 2 a 4 caso contrário. Um GTIN-12 tem, portanto, um prefixo que começa com `0`, e um GTIN-14 tem o prefixo do GTIN-13 que ele agrupa, depois do dígito indicador. + +| Campo | Descrição | +| --- | --- | +| `type` | `'GTIN-8'`, `'GTIN-12'`, `'GTIN-13'` ou `'GTIN-14'` (`GtinType`), conforme o tamanho com que o valor foi escrito | +| `length` | `8`, `12`, `13` ou `14` (`GtinLength`) | +| `prefix` | O Prefixo GS1 de três dígitos, ou um Prefixo GS1-8 quando os seis primeiros dígitos da forma de 14 dígitos são zeros, o que cobre todo GTIN-8 e o Prefixo GS1 `0000000`. Identifica a Organização Membro da GS1 que licenciou o número, não o país de origem | +| `isBrazilian` | `true` quando o prefixo é um dos da GS1 Brasil, `789` ou `790`, o que a NT 2021.003 chama de "prefixo do Brasil" | +| `isRestrictedCirculation` | `true` quando o prefixo está em uma faixa que a GS1 reserva para Números de Circulação Restrita (Prefixos GS1 02, 04 e 20 a 29; Prefixos GS1-8 000 a 099 e 200 a 299, faixa em que também cai o Prefixo GS1 `0000000`, já que sua forma de 14 dígitos começa com seis zeros), ou seja, o número só é único dentro de uma empresa ou região | +| `checkDigit` | O dígito verificador módulo 10, o último dígito | + +```javascript +import { getGtinInfo } from '@brazilian-utils/brazilian-utils'; + +getGtinInfo('7890000000017'); +// { type: 'GTIN-13', length: 13, prefix: '789', isBrazilian: true, +// isRestrictedCirculation: false, checkDigit: 7 } + +getGtinInfo('17890000000014'); +// { type: 'GTIN-14', length: 14, prefix: '789', isBrazilian: true, +// isRestrictedCirculation: false, checkDigit: 4 } + +getGtinInfo('061414112345'); +// { type: 'GTIN-12', length: 12, prefix: '006', isBrazilian: false, +// isRestrictedCirculation: false, checkDigit: 5 } + +getGtinInfo('2000000000015')?.isRestrictedCirculation; // true (número interno da loja) +getGtinInfo('7890000000018'); // null (dígito verificador errado) +``` + +Fonte: [GS1 General Specifications](https://ref.gs1.org/standards/genspecs/), [calculadora de dígito verificador da GS1](https://www.gs1.org/services/how-calculate-check-digit-manually), [Nota Técnica 2021.003 da SEFAZ](https://www.nfe.fazenda.gov.br/portal/exibirArquivo.aspx?conteudo=SrQT9ys8ODo%3D) e [Tabela Prefixo GS1](https://www.nfe.fazenda.gov.br/portal/exibirArquivo.aspx?conteudo=Oc+fygAxwmc%3D) do Portal da NF-e. + +## CID-10 + +### isValidCid10 + +Valida um código CID-10 contra as tabelas que o DATASUS publica, a edição brasileira da CID-10 (Classificação Estatística Internacional de Doenças e Problemas Relacionados à Saúde, 10ª revisão), o código que atestados médicos e sistemas de saúde carregam. + +- Os dois níveis da classificação são válidos: as categorias de 3 caracteres (`A00`) e as subcategorias de 4 caracteres, escritas com o ponto (`A00.0`) ou sem ele (`A000`). +- Maiúsculas, minúsculas e espaços em volta são ignorados. Qualquer outra coisa (outro separador, um quinto caractere, um sufixo de cruz ou asterisco, um valor que não é string) é rejeitada. +- As tabelas da V2008 são a única fonte: um código que não está nelas, como `U07.1` (COVID-19), não é encontrado. +- Só uma tabela de códigos é lida (cerca de 27 KB minificada), não as descrições que `getCid10` carrega. + +```javascript +import { isValidCid10 } from '@brazilian-utils/brazilian-utils'; + +isValidCid10('A00.0'); // true +isValidCid10('a000'); // true +isValidCid10('A00'); // true (uma categoria) +isValidCid10('I10'); // true (uma categoria que não é subdividida) +isValidCid10('A00.5'); // false (A00 não tem a subcategoria 5) +isValidCid10('I10.0'); // false (I10 não tem subcategorias) +isValidCid10('A00-0'); // false (não é uma forma documentada) +``` + +### formatCid10 + +Formata um código CID-10 do jeito que ele é impresso: em maiúsculas, com um ponto entre a categoria de 3 caracteres e o quarto caractere da subcategoria. Só a estrutura muda; use `isValidCid10` para conferir um código com as tabelas. + +- A máscara é aplicada até onde o valor vai, então uma categoria fica como está e o ponto só aparece com o quarto caractere. +- Caracteres fora da máscara são descartados e o valor é limitado a 4 caracteres. + +```javascript +import { formatCid10 } from '@brazilian-utils/brazilian-utils'; + +formatCid10('A000'); // A00.0 +formatCid10('f322'); // F32.2 +formatCid10('A00'); // A00 (uma categoria não tem ponto) +formatCid10('A00.0'); // A00.0 +``` + +### parseCid10 + +Remove a formatação de um código CID-10, mantém apenas letras e dígitos, em maiúsculas, e limita o resultado aos 4 caracteres de uma subcategoria, a forma que as tabelas do DATASUS guardam. + +- Um valor mais curto passa até onde ele vai. + +```javascript +import { parseCid10 } from '@brazilian-utils/brazilian-utils'; + +parseCid10('A00.0'); // 'A000' +parseCid10('f32.2'); // 'F322' +parseCid10('A00'); // 'A00' +``` + +### getCid10 + +Busca um código CID-10 e retorna a sua descrição oficial em português. O resultado é um registro `Cid10`: `{ code, description }`. + +- Mesmas regras de entrada de `isValidCid10`. O `code` vem em maiúsculas e sem o ponto. Retorna `null` quando o código é desconhecido ou o valor não está em uma forma documentada. +- Este é o utilitário mais pesado do pacote: ele embute as 2045 categorias e 12188 subcategorias com suas descrições, cerca de 1 MB minificado (147 KB com gzip). Carregue-o sob demanda pelo seu subpath, como mostrado em [Tamanho do bundle](pt-br/getting-started.md#tamanho-do-bundle), e use `isValidCid10` quando a descrição não for necessária. + +```javascript +import { getCid10 } from '@brazilian-utils/brazilian-utils'; + +getCid10('A00.0'); // { code: 'A000', description: 'Cólera devida a Vibrio cholerae 01, biótipo cholerae' } +getCid10('a000'); // { code: 'A000', description: 'Cólera devida a Vibrio cholerae 01, biótipo cholerae' } +getCid10('A00'); // { code: 'A00', description: 'Cólera' } +getCid10('A00.5'); // null +getCid10('A00-0'); // null (não é uma forma documentada) +``` + +Fonte: [tabelas da CID-10 V2008 que o DATASUS publica em CSV](http://www2.datasus.gov.br/cid10/V2008/descrcsv.htm). + ## Texto ### capitalize @@ -2696,7 +3441,27 @@ isValidEmail('john.doe@hotmail.com'); // true isValidEmail('invalid.email'); // false ``` -Fonte: [HTML da WHATWG, valid e-mail address](https://html.spec.whatwg.org/multipage/input.html#valid-e-mail-address) e [RFC 5322](https://www.rfc-editor.org/rfc/rfc5322). +### obfuscateEmail + +Esconde a maior parte de um endereço de e-mail com `*`, para os lugares em que o endereço é mostrado a alguém que só precisa reconhecê-lo. + +- Ficam os 2 primeiros caracteres da parte local e os 2 primeiros do domínio, sejam eles quais forem, inclusive um ponto, fica o `@`, e todo outro caractere, inclusive os demais pontos, vira um `*`, então o tamanho é preservado. É assim que a conta gov.br mostra o endereço cadastrado, `li***********@gm*******`. +- Um primeiro rótulo de domínio de 1 caractere, portanto, deixa visível o ponto que vem depois dele. +- O exemplo do gov.br não cobre uma parte local de 1 ou 2 caracteres, que essa regra mostraria inteira, então aqui uma parte local assim sempre perde o último caractere. +- O valor é julgado por `isValidEmail` como veio, sem remover espaços, e mantém maiúsculas e minúsculas. +- Retorna `''` quando o valor não é um e-mail válido. + +```javascript +import { obfuscateEmail } from '@brazilian-utils/brazilian-utils'; + +obfuscateEmail('fulano.silva@example.com'); // fu**********@ex********* +obfuscateEmail('ab@example.com.br'); // a*@ex************ +obfuscateEmail('a@example.com'); // *@ex********* +obfuscateEmail('maria@a.bc'); // ma***@a.** (um rótulo de 1 caractere deixa o ponto visível) +obfuscateEmail('não é e-mail'); // '' +``` + +Fonte: [HTML da WHATWG, valid e-mail address](https://html.spec.whatwg.org/multipage/input.html#valid-e-mail-address), [RFC 5322](https://www.rfc-editor.org/rfc/rfc5322) e a [conta gov.br](https://acesso.gov.br/faq/_perguntasdafaq/formarrecuperarconta.html), que define a forma do mascaramento. ## Cartão de crédito diff --git a/docs/snippets/document-field/_templates/angular/document-field.ts b/docs/snippets/document-field/templates/angular/document-field.ts.tmpl similarity index 100% rename from docs/snippets/document-field/_templates/angular/document-field.ts rename to docs/snippets/document-field/templates/angular/document-field.ts.tmpl diff --git a/docs/snippets/document-field/_templates/angular/field.ts b/docs/snippets/document-field/templates/angular/field.ts.tmpl similarity index 100% rename from docs/snippets/document-field/_templates/angular/field.ts rename to docs/snippets/document-field/templates/angular/field.ts.tmpl diff --git a/docs/snippets/document-field/_templates/angular/form.ts b/docs/snippets/document-field/templates/angular/form.ts.tmpl similarity index 100% rename from docs/snippets/document-field/_templates/angular/form.ts rename to docs/snippets/document-field/templates/angular/form.ts.tmpl diff --git a/docs/snippets/document-field/_templates/angular/mask.ts b/docs/snippets/document-field/templates/angular/mask.ts.tmpl similarity index 100% rename from docs/snippets/document-field/_templates/angular/mask.ts rename to docs/snippets/document-field/templates/angular/mask.ts.tmpl diff --git a/docs/snippets/document-field/_templates/mask-body.ts b/docs/snippets/document-field/templates/mask-body.ts.tmpl similarity index 100% rename from docs/snippets/document-field/_templates/mask-body.ts rename to docs/snippets/document-field/templates/mask-body.ts.tmpl diff --git a/docs/snippets/document-field/_templates/react/document-field.tsx b/docs/snippets/document-field/templates/react/document-field.tsx.tmpl similarity index 100% rename from docs/snippets/document-field/_templates/react/document-field.tsx rename to docs/snippets/document-field/templates/react/document-field.tsx.tmpl diff --git a/docs/snippets/document-field/_templates/react/field.tsx b/docs/snippets/document-field/templates/react/field.tsx.tmpl similarity index 100% rename from docs/snippets/document-field/_templates/react/field.tsx rename to docs/snippets/document-field/templates/react/field.tsx.tmpl diff --git a/docs/snippets/document-field/_templates/react/form.tsx b/docs/snippets/document-field/templates/react/form.tsx.tmpl similarity index 100% rename from docs/snippets/document-field/_templates/react/form.tsx rename to docs/snippets/document-field/templates/react/form.tsx.tmpl diff --git a/docs/snippets/document-field/_templates/react/mask.ts b/docs/snippets/document-field/templates/react/mask.ts.tmpl similarity index 100% rename from docs/snippets/document-field/_templates/react/mask.ts rename to docs/snippets/document-field/templates/react/mask.ts.tmpl diff --git a/docs/snippets/document-field/_templates/schema/arktype.ts b/docs/snippets/document-field/templates/schema/arktype.ts.tmpl similarity index 100% rename from docs/snippets/document-field/_templates/schema/arktype.ts rename to docs/snippets/document-field/templates/schema/arktype.ts.tmpl diff --git a/docs/snippets/document-field/_templates/schema/standard.ts b/docs/snippets/document-field/templates/schema/standard.ts.tmpl similarity index 100% rename from docs/snippets/document-field/_templates/schema/standard.ts rename to docs/snippets/document-field/templates/schema/standard.ts.tmpl diff --git a/docs/snippets/document-field/_templates/schema/valibot.ts b/docs/snippets/document-field/templates/schema/valibot.ts.tmpl similarity index 100% rename from docs/snippets/document-field/_templates/schema/valibot.ts rename to docs/snippets/document-field/templates/schema/valibot.ts.tmpl diff --git a/docs/snippets/document-field/_templates/schema/zod.ts b/docs/snippets/document-field/templates/schema/zod.ts.tmpl similarity index 100% rename from docs/snippets/document-field/_templates/schema/zod.ts rename to docs/snippets/document-field/templates/schema/zod.ts.tmpl diff --git a/docs/snippets/document-field/_templates/vanilla/field.html b/docs/snippets/document-field/templates/vanilla/field.html.tmpl similarity index 100% rename from docs/snippets/document-field/_templates/vanilla/field.html rename to docs/snippets/document-field/templates/vanilla/field.html.tmpl diff --git a/docs/snippets/document-field/_templates/vue/document-field.vue b/docs/snippets/document-field/templates/vue/document-field.vue.tmpl similarity index 100% rename from docs/snippets/document-field/_templates/vue/document-field.vue rename to docs/snippets/document-field/templates/vue/document-field.vue.tmpl diff --git a/docs/snippets/document-field/_templates/vue/field.vue b/docs/snippets/document-field/templates/vue/field.vue.tmpl similarity index 100% rename from docs/snippets/document-field/_templates/vue/field.vue rename to docs/snippets/document-field/templates/vue/field.vue.tmpl diff --git a/docs/snippets/document-field/_templates/vue/form.vue b/docs/snippets/document-field/templates/vue/form.vue.tmpl similarity index 100% rename from docs/snippets/document-field/_templates/vue/form.vue rename to docs/snippets/document-field/templates/vue/form.vue.tmpl diff --git a/docs/snippets/document-field/_templates/vue/mask.ts b/docs/snippets/document-field/templates/vue/mask.ts.tmpl similarity index 100% rename from docs/snippets/document-field/_templates/vue/mask.ts rename to docs/snippets/document-field/templates/vue/mask.ts.tmpl diff --git a/docs/utilities.md b/docs/utilities.md index ad699c341..61dd6464f 100644 --- a/docs/utilities.md +++ b/docs/utilities.md @@ -73,6 +73,37 @@ generateCpf('SP'); // the 9th digit is 8, the SP região fiscal code generateCpf('MG'); // the 9th digit is 6, the MG região fiscal code ``` +### getCpfInfo + +Read the fields a CPF encodes, as a `CpfInfo`: the 8 digit `base`, the `fiscalRegion` digit (the 9th digit, the Região Fiscal of the Receita Federal the CPF was registered in, `"1"` to `"9"` and `"0"` for the 10ª), the `states` of that region (`StateCode[]`, sorted by state name) and the 2 `checkDigits`. Accepts the same masked or unmasked input as `isValidCpf` and returns `null` for anything that is not a valid CPF. The region is the one of the address given at the first registration: it says nothing about where the holder was born, lives today or asked for the number, and a region with more than one state does not tell which of them it was. + +| `fiscalRegion` | `states` | +| --- | --- | +| `"1"` | DF, GO, MT, MS, TO | +| `"2"` | AC, AP, AM, PA, RO, RR | +| `"3"` | CE, MA, PI | +| `"4"` | AL, PB, PE, RN | +| `"5"` | BA, SE | +| `"6"` | MG | +| `"7"` | ES, RJ | +| `"8"` | SP | +| `"9"` | PR, SC | +| `"0"` | RS | + +```javascript +import { getCpfInfo } from '@brazilian-utils/brazilian-utils'; + +getCpfInfo('123.456.789-09'); +// { +// base: '12345678', +// fiscalRegion: '9', +// states: ['PR', 'SC'], +// checkDigits: '09', +// } + +getCpfInfo('12345678900'); // null (invalid check digits) +``` + Source: [Receita Federal, "Cadastros: CPF e CNPJ"](https://www.gov.br/receitafederal/pt-br/assuntos/educacao-fiscal/educacao_fiscal/folhetos-orientativos/cadastros-dig.pdf). ## CNPJ @@ -139,6 +170,40 @@ generateCnpj({ branch: 3 }); // ordem block '0003', e.g. '12345678000372' generateCnpj({ version: 2, branch: 1 }); // alphanumeric CNPJ whose ordem block is '0001' ``` +### getCnpjInfo + +Parse a CNPJ into the fields the number encodes. Accepts the same input forms as `isValidCnpj` and returns `null` whenever it would return `false` for the same arguments, so an alphanumeric CNPJ read under version `1` is `null`. + +- **Options** (`GetCnpjInfoOptions`): `version` is read the way `isValidCnpj` reads it, `1` (default) the numeric-only format, `2` both the numeric and the alphanumeric one. +- Returns a `CnpjInfo`, the 14 positions as Anexo XV lays them out: 8 (`root`, the raiz that identifies the entity) + 4 (`branch`, the establishment, called número de ordem by the Receita Federal) + 2 (`checkDigits`, always numeric). `branch` is named after the `branch` parameter of `generateCnpj`, which fills the same four positions. +- `isInitialHeadquarters` tells whether the branch is `0001`, the one the Receita Federal gives the headquarters (matriz) when the root is registered. A filial can later become the headquarters while keeping its número de ordem, so only the Receita Federal registry tells the current headquarters. +- The fields of an alphanumeric CNPJ are returned upper cased. + +```javascript +import { getCnpjInfo } from '@brazilian-utils/brazilian-utils'; + +getCnpjInfo('12.345.678/0001-95'); +// { +// root: '12345678', +// branch: '0001', +// checkDigits: '95', +// isInitialHeadquarters: true +// } + +getCnpjInfo('12.abc.345/01de-35', { version: 2 }); +// { +// root: '12ABC345', +// branch: '01DE', +// checkDigits: '35', +// isInitialHeadquarters: false +// } + +getCnpjInfo('12.ABC.345/01DE-35'); // null (alphanumeric, read under version 1) +getCnpjInfo('12.345.678/0001-90'); // null (bad check digits) +``` + +Source: [Instrução Normativa RFB nº 2.229/2024](http://normas.receita.fazenda.gov.br/sijut2consulta/link.action?idAto=141102), whose Anexo Único is the Anexo XV of IN RFB nº 2.119/2022 and lays the 14 positions out, [Receita Federal Q&A on the alphanumeric CNPJ](https://www.gov.br/receitafederal/pt-br/centrais-de-conteudo/publicacoes/perguntas-e-respostas/cnpj/cnpj-alfanumerico.pdf) (questions 21, 23 and 25). + ## CEP and address ### isValidCep @@ -389,7 +454,27 @@ getPixKeyInfo('51998259765'); // { type: 'cpf', value: '51998259765' } (also a v getPixKeyInfo('+5551998259765'); // { type: 'phone', value: '+5551998259765' } ``` -Source: [Manual de Padrões para Iniciação do Pix](https://www.bcb.gov.br/content/estabilidadefinanceira/pix/Regulamento_Pix/II_ManualdePadroesparaIniciacaodoPix.pdf), [DICT API](https://www.bcb.gov.br/content/estabilidadefinanceira/pix/API-DICT.html). +### obfuscatePixKey + +Hide most of a Pix key with `*`, for the places where a key is shown to someone who should only recognize it, such as a list of registered keys. + +- The key is identified by `getPixKeyInfo`, under the rules documented there, and each kind is hidden by the utility that already knows how: a CPF by `formatCpf` with `obfuscate` (`***.456.789-**`, the form the Banco Central prints for a "CPF mascarado"), a CNPJ by `formatCnpj` with `obfuscate`, a phone by `formatPhone` with the `"international"` mask and `obfuscate`, and an e-mail by `obfuscateEmail` over the lowercased address. +- A random key (EVP) is returned whole, lowercased: the DICT manual defines it as a sequence "que não possui qualquer significado, a não ser o de servir como uma chave Pix", so it carries no personal data to hide. +- The Pix user experience manual forbids masking the key on the screen where a payer confirms the recipient, so this is not meant for that screen. +- Returns `''` when the value is not a valid Pix key. + +```javascript +import { obfuscatePixKey } from '@brazilian-utils/brazilian-utils'; + +obfuscatePixKey('123.456.789-09'); // ***.456.789-** +obfuscatePixKey('12345678000195'); // **.345.678/0001-** +obfuscatePixKey('(11) 98765-4321'); // +55 11 *****-**21 +obfuscatePixKey('Fulano@Example.com'); // fu****@ex********* +obfuscatePixKey('71C7D9BE-4B85-4E43-9F1C-1F3B8B4E9A2D'); // 71c7d9be-4b85-4e43-9f1c-1f3b8b4e9a2d +obfuscatePixKey('not a key'); // '' +``` + +Source: [Manual de Padrões para Iniciação do Pix](https://www.bcb.gov.br/content/estabilidadefinanceira/pix/Regulamento_Pix/II_ManualdePadroesparaIniciacaodoPix.pdf), [DICT API](https://www.bcb.gov.br/content/estabilidadefinanceira/pix/API-DICT.html), [Manual Operacional do DICT](https://www.bcb.gov.br/content/estabilidadefinanceira/pix/Regulamento_Pix/X_ManualOperacionaldoDICT.pdf) and [Requisitos Mínimos para a Experiência do Usuário](https://www.bcb.gov.br/content/estabilidadefinanceira/pix/Regulamento_Pix/IV_RequisitosMinimosparaExperienciadoUsuario.pdf). ### isValidPixPayload @@ -569,6 +654,134 @@ getNfeKeyInfo('35170458716523000119620010000000121000123450'); getNfeKeyInfo('invalid'); // null ``` +## NFS-e key + +### isValidNfseKey + +Check if the access key (chave de acesso) of a national NFS-e, the Nota Fiscal de Serviço eletrônica of the Sistema Nacional NFS-e, is valid. + +- The key is one block of 50 digits, `Cód.Mun.(7) Amb.Ger.(1) Tipo de Inscrição Federal(1) Inscrição Federal(14) nNFSe(13) AAMM(4) Cód.Num.(9) DV(1)`. +- The `NFS` literal the `Id` attribute of `infNFSe` puts in front of the key is stripped, with surrounding whitespace. +- The key has no printed mask, since the DANFSe prints it as a single block of 50 digits, so, unlike `isValidNfeKey`, a separator anywhere in it is rejected instead of being stripped. +- The municipality code must start with an IBGE UF code; it is not looked up in the IBGE table. +- `ambGer` must be `1` (the system of the municipality) or `2` (the Sistema Nacional NFS-e), and the registration type `1` (a CPF, left padded with `000`) or `2` (a CNPJ), with a CPF or CNPJ whose own check digits are valid. +- `nNFSe` must not be all zeros and the month must be 01 to 12. +- The check digit is a modulus 11 over the first 49 digits, weights 2 to 9 cycling from the right, where a remainder of 0 or 1 gives 0. +- Keys carrying an alphanumeric CNPJ are not accepted yet: no official document states how a letter enters the check digit of the key. +- The municipal NFS-e models that are not the national standard are out of scope. + +```javascript +import { isValidNfseKey } from '@brazilian-utils/brazilian-utils'; + +isValidNfseKey('35503082258716523000119000000000001226011357924683'); // true (CNPJ issuer, SP) +isValidNfseKey('NFS35503082258716523000119000000000001226011357924683'); // true (XML Id prefix) +isValidNfseKey('43149021100040364478829000000000105725120484407255'); // true (CPF issuer, RS) +isValidNfseKey('35503082258716523000119000000000001226011357924684'); // false (check digit) +isValidNfseKey('3550308 2 2 58716523000119 0000000000012 2601 135792468 3'); // false (the key has no mask) +``` + +### parseNfseKey + +Remove everything but the digits from the access key of a national NFS-e, the `NFS` prefix of the XML `Id` attribute included, and cap the result to 50 digits. + +- That is the form the leiaute stores the key in and the one the DANFSe prints, a single block, which is why there is no `formatNfseKey`. + +```javascript +import { parseNfseKey } from '@brazilian-utils/brazilian-utils'; + +parseNfseKey('NFS35503082258716523000119000000000001226011357924683'); +// '35503082258716523000119000000000001226011357924683' + +parseNfseKey('3550308 2 2 58716523000119 0000000000012 2601 135792468 3'); +// '35503082258716523000119000000000001226011357924683' +``` + +### getNfseKeyInfo + +Parse the access key of a national NFS-e into its fields, as an `NfseKeyInfo`. Accepts the same input forms as `isValidNfseKey`. + +- Returns `municipalityCode`, `stateCode`, `generatorEnvironment`, `taxIdType`, `taxId`, `number`, `year`, `month`, `code` and `checkDigit`. +- `generatorEnvironment` is an `NfseKeyGeneratorEnvironment`: `1` the system of the municipality, `2` the Sistema Nacional NFS-e. +- `taxIdType` is an `NfseKeyTaxIdType`, `'cpf'` or `'cnpj'`, and `taxId` is the 11 digit CPF, without the `000` that pads it in the key, or the 14 digit CNPJ. +- Returns `null` when the key is not valid. + +```javascript +import { getNfseKeyInfo } from '@brazilian-utils/brazilian-utils'; + +getNfseKeyInfo('35503082258716523000119000000000001226011357924683'); +// { municipalityCode: '3550308', stateCode: 'SP', generatorEnvironment: 2, taxIdType: 'cnpj', +// taxId: '58716523000119', number: 12, year: 2026, month: 1, code: '135792468', checkDigit: 3 } + +getNfseKeyInfo('43149021100040364478829000000000105725120484407255'); +// { municipalityCode: '4314902', stateCode: 'RS', generatorEnvironment: 1, taxIdType: 'cpf', +// taxId: '40364478829', number: 1057, year: 2025, month: 12, code: '048440725', checkDigit: 5 } + +getNfseKeyInfo('invalid'); // null +``` + +Source: the [technical documentation of the Sistema Nacional NFS-e](https://www.gov.br/nfse/pt-br/biblioteca/documentacao-tecnica/documentacao-atual), whose schema types `TSIdNFSe` and `TSChaveNFSe` and ANEXO I field `NFSe/infNFSe/id` define the layout and the rules E1280 and E1284, the [manual da emissão por decisão administrativa ou judicial](https://www.gov.br/nfse/pt-br/biblioteca/documentacao-tecnica/documentacao-atual/manual-contribuintes-emissor-publico-api-emissao-decisao-administrativa-e-judicial.pdf), which names the modulus 11 check digit, and [Nota Técnica SE/CGNFS-e 008](https://www.gov.br/nfse/pt-br/biblioteca/documentacao-tecnica/rtc/nt-008-se-cgnfse-danfse-20260714-v1-02.pdf) (item 2.1.1), which prints the key as a single block. + +## SUFRAMA + +### isValidSuframa + +Check if an Inscrição SUFRAMA is valid. It is the registration number the Superintendência da Zona Franca de Manaus gives to companies with tax incentives, carried by the `ISUF` field of the NF-e recipient. + +- The number is `SS.NNNN.LLD`: sector of activity, sequential number, locality of the SUFRAMA unit and check digit. +- Accepts 8 or 9 digits: an 8 digit value is a number whose sector code lost its leading zero. +- Returns `false` for a sector code of `00` and for a wrong módulo 11 check digit. +- The sector and locality codes are not checked against a table, since the manual lists them only as examples. +- Besides the usual mask characters, `(`, `)`, `,` and `*` are also ignored. + +```javascript +import { isValidSuframa } from '@brazilian-utils/brazilian-utils'; + +isValidSuframa('123456789'); // true +isValidSuframa('12.3456.789'); // true +isValidSuframa('10001018'); // true (same as '010001018') +isValidSuframa('123456780'); // false +isValidSuframa('001234560'); // false (sector 00) +``` + +### formatSuframa + +Format an Inscrição SUFRAMA. + +- **Options** (`FormatSuframaOptions`): `pad` left-pads the value with zeros to the full 9 digits before masking (default `false`), which restores the leading zero of an 8 digit value. +- The mask is progressive, as in the other `format` utilities, so an 8 digit value without `pad` is grouped one position early: use `pad: true` for a value read straight out of the `ISUF` field, which may be stored with 8 digits. + +```javascript +import { formatSuframa } from '@brazilian-utils/brazilian-utils'; + +formatSuframa('123456789'); // 12.3456.789 +formatSuframa('10001018'); // 10.0010.18 (8 digits, the mask groups one position early) +formatSuframa('10001018', { pad: true }); // 01.0001.018 +``` + +### parseSuframa + +Remove Inscrição SUFRAMA formatting, keep only digits, and cap the result to 9 digits. + +```javascript +import { parseSuframa } from '@brazilian-utils/brazilian-utils'; + +parseSuframa('12.3456.789'); // 123456789 +``` + +### generateSuframa + +Generate a valid random 9 digit Inscrição SUFRAMA. + +- The check digit is valid and the sector code is never `00`. The sector and locality codes are random. + +```javascript +import { generateSuframa } from '@brazilian-utils/brazilian-utils'; + +generateSuframa(); // '205678106' +``` + +Source: [NF-e Manual de Orientação do Contribuinte 7.0, Visão Geral](https://www.confaz.fazenda.gov.br/legislacao/arquivo-manuais/moc7-visao-geral.pdf) (section 8.4), [MOC 7.0, Anexo I](https://www.confaz.fazenda.gov.br/legislacao/arquivo-manuais/moc7-anexo-i-leiaute-e-rv.pdf) (field 79, `E18` `ISUF`, and rule E18-20). + ## Phone ### isValidPhone @@ -595,11 +808,14 @@ Source: [Resolução Anatel nº 749/2022](https://informacoes.anatel.gov.br/legi Format a phone number according to Brazilian patterns. If `value` includes a DDD, pass `{ mask: 'auto' }` or `'nanp'`: the default `"sn"` mask assumes no DDD and truncates one. -- **Options** (`FormatPhoneOptions`): `mask` (`PhoneMask`, default `"sn"`) picks one of the patterns below. An unknown `mask` falls back to `"sn"`. +- **Options** (`FormatPhoneOptions`): `mask` (`PhoneMask`, default `"sn"`) picks one of the patterns below. An unknown `mask` falls back to `"sn"`. `obfuscate` (default `false`) hides the subscriber number under every mask. - `"sn"`: subscriber number only, 9 digits. `"nanp"`: DDD plus subscriber number, 11 digits for a mobile and 10 for a landline; any other length keeps the 11 digit grouping. - `"e164"` and `"international"` drop the country code first, as `parsePhone` does, and fall back to `"service"` for a service number. - `"service"`: the Códigos Não Geográficos (`0800 123 4567`) and the abbreviated `300X`/`400X` numbers (`4004-1234`). - `"auto"`: `"service"` for a service number, `"international"` when `value` carries a country code, otherwise `"nanp"` for more than 9 digits, else `"sn"`. +- `obfuscate` keeps 2 digits, the count the gov.br account shows for a registered mobile, and keeps the prefix that names a region or a service instead of a subscriber: the DDD, the `0800`-like code and the `300X`/`400X` root. +- The 2 digits are the last ones the mask itself has room for, so under the default `"sn"` a DDD-prefixed value is truncated first, exactly as it is without `obfuscate`, and the visible pair is the 8th and 9th digit rather than the last 2 of `value`. +- A 3 digit public utility code (`190`) identifies no one and is returned as it is; a value the `"service"` mask does not recognize has every digit replaced by a `*`, which hides the digits but not how many there were. The obfuscated patterns have a fixed number of slots, so under `"e164"` anything past the 11th national digit is dropped. ```javascript import { formatPhone } from '@brazilian-utils/brazilian-utils'; @@ -615,10 +831,19 @@ formatPhone('08001234567', { mask: 'service' }); // 0800 123 4567 formatPhone('40041234', { mask: 'service' }); // 4004-1234 formatPhone('+5511987654321', { mask: 'auto' }); // +55 11 98765-4321 ("auto" detects the +55 prefix and picks "international") formatPhone('5508001234567', { mask: 'auto' }); // 0800 123 4567 ("auto" reads the 0800 number, not a +55 08 one) +formatPhone('987654321', { obfuscate: true }); // *****-**21 +formatPhone('11987654321', { mask: 'auto', obfuscate: true }); // (11) *****-**21 +formatPhone('1130000000', { mask: 'auto', obfuscate: true }); // (11) ****-**00 +formatPhone('+5511987654321', { mask: 'auto', obfuscate: true }); // +55 11 *****-**21 +formatPhone('11987654321', { mask: 'e164', obfuscate: true }); // +5511*******21 +formatPhone('08001234567', { mask: 'service', obfuscate: true }); // 0800 *** **67 +formatPhone('40041234', { mask: 'service', obfuscate: true }); // 4004-**34 +formatPhone('11988887766', { mask: 'service', obfuscate: true }); // *********** (not a service number) +formatPhone('11987654321', { obfuscate: true }); // *****-**43 (BEWARE: "sn" truncates first, so "43", not "21") formatPhone('11900000000'); // 11900-0000 (BEWARE: default "sn" truncates a DDD-prefixed number) ``` -Source: [ITU-T E.164](https://www.itu.int/rec/T-REC-E.164), [Resolução Anatel nº 749/2022](https://informacoes.anatel.gov.br/legislacao/resolucoes/2022/1641-resolucao-749). +Source: [ITU-T E.164](https://www.itu.int/rec/T-REC-E.164), [Resolução Anatel nº 749/2022](https://informacoes.anatel.gov.br/legislacao/resolucoes/2022/1641-resolucao-749), [conta gov.br](https://acesso.gov.br/faq/_perguntasdafaq/formarrecuperarconta.html) for how many digits of a mobile stay visible. ### parsePhone @@ -883,13 +1108,16 @@ isValidPis('12056412547'); // false Format a PIS. -- **Options** (`FormatPisOptions`): `pad` left-pads the value with zeros to 11 digits before masking (default `false`). +- **Options** (`FormatPisOptions`): `pad` left-pads the value with zeros to 11 digits before masking (default `false`); `obfuscate` hides the first 3 digits and the check digit. +- `obfuscate` is applied after `pad`. +- No authority publishes a masking rule for the PIS, so `obfuscate` applies the one Lei nº 12.309/2010, art. 87, § 5º sets for the CPF ("ocultar os três primeiros dígitos e os dois dígitos verificadores"), a number with the same structure. ```javascript import { formatPis } from '@brazilian-utils/brazilian-utils'; formatPis('12345678901'); // 123.45678.90-1 formatPis('123456789', { pad: true }); // 001.23456.78-9 +formatPis('12345678901', { obfuscate: true }); // ***.45678.90-* ``` ### parsePis @@ -912,6 +1140,8 @@ import { generatePis } from '@brazilian-utils/brazilian-utils'; generatePis(); // '91077906857' ``` +Source: [Lei nº 12.309/2010, art. 87, § 5º](https://www.planalto.gov.br/ccivil_03/_ato2007-2010/2010/lei/l12309.htm), the CPF masking rule `obfuscate` borrows. + ## Processo jurídico ### isValidProcessoJuridico @@ -1366,6 +1596,33 @@ getStates(); Source: [IBGE Localidades](https://servicodados.ibge.gov.br/api/docs/localidades) +### getStateByCep + +Get the Brazilian state a CEP belongs to, from the CEP ranges the Correios assign to each state (the "Faixa de CEP" of each UF). + +- It runs offline: no CEP API is called, so the answer says which state owns the range, not whether the CEP is in use. +- Accepts what `isValidCep` accepts: 8 digits, as a string or a number, with spaces, dots and hyphens ignored. A CEP that starts with `0` has to be a string, and a negative or fractional number is rejected. +- Amazonas, Distrito Federal and Goiás have two ranges each, and no state range covers `00000-000` to `00999-999` nor `78900-000` to `78999-999`. +- A range is the block the state owns, not a promise that every CEP in it is in use: `10000-000` sits unused inside the São Paulo range and still answers São Paulo. +- Returns `null` for an invalid CEP or one outside every range. Exports the `State` type. + +```javascript +import { getStateByCep } from '@brazilian-utils/brazilian-utils'; + +getStateByCep('01310-100'); +// { code: 'SP', name: 'São Paulo', regionCode: 'SE', regionName: 'Sudeste', ibgeCode: 35 } + +getStateByCep(20040020); +// { code: 'RJ', name: 'Rio de Janeiro', regionCode: 'SE', regionName: 'Sudeste', ibgeCode: 33 } + +getStateByCep('69300-000')?.code; // 'RR' +getStateByCep('72800-000')?.code; // 'GO' +getStateByCep('00999-999'); // null +getStateByCep('12345'); // null +``` + +Source: [Correios, Busca Faixa de CEP](https://buscacepinter.correios.com.br/app/faixa_cep_uf_localidade/index.php) + ### getStateByIbgeCode Get the Brazilian state whose 2-digit IBGE code (`cUF`, the Código da Unidade da Federação) matches the given value. @@ -1653,7 +1910,10 @@ isHoliday(); // false Check if a date is a Brazilian business day (dia útil): not a Saturday, a Sunday or a holiday `getHolidays` lists for its local calendar day. -- **Options** (`BusinessDayOptions`, shared by every business day util): `includeOptional` (default `true`) also counts the `"optional"` holidays, Carnaval and Corpus Christi, as non-business days; `stateCode` also counts that state's holidays. +- **Options** (`BusinessDayOptions`, shared by every business day util): `includeOptional` (default `true`) also counts the `"optional"` holidays, Carnaval and Corpus Christi, as non-business days; `includeSaturday` (default `false`) counts Saturday as a business day; `stateCode` also counts that state's holidays. +- `includeSaturday` off is the Monday to Friday count banks and courts use. On, it is the labour law count of the payroll deadline of CLT art. 459 § 1º, the one labour inspection reads through Instrução Normativa MTP nº 2/2021, art. 14, I: "na contagem dos dias será incluído o sábado, excluindo-se o domingo e o feriado, inclusive o municipal". +- Sunday and holidays are still excluded with `includeSaturday` on, so a holiday that falls on a Saturday is still not a business day. +- The "inclusive o municipal" part of that rule is not covered: `getHolidays` carries national and state holidays only, so a municipal holiday counts here as an ordinary business day. Remove the municipal holidays yourself when a count has to be exact for one municipality. - Returns `false` when `value` is not a valid `Date` or its year is outside 1900 to 2099, or when `stateCode` is present and not a string. ```javascript @@ -1662,6 +1922,9 @@ import { isBusinessDay } from '@brazilian-utils/brazilian-utils'; isBusinessDay(new Date(2024, 0, 2)); // true (Tuesday, not a holiday) isBusinessDay(new Date(2024, 0, 1)); // false (Ano novo) isBusinessDay(new Date(2024, 0, 6)); // false (Saturday) +isBusinessDay(new Date(2024, 0, 6), { includeSaturday: true }); // true (labour law count) +isBusinessDay(new Date(2024, 8, 7), { includeSaturday: true }); // false (Independência, a holiday on a Saturday) +isBusinessDay(new Date(2024, 0, 7), { includeSaturday: true }); // false (Sunday is never included) isBusinessDay(new Date(2024, 1, 13)); // false (Carnaval, optional holiday, counts by default) isBusinessDay(new Date(2024, 1, 13), { includeOptional: false }); // true isBusinessDay(new Date(2024, 6, 9), { stateCode: 'SP' }); // false (Revolução Constitucionalista) @@ -1673,7 +1936,7 @@ isBusinessDay(new Date('not a date')); // false Add a number of Brazilian business days (dias úteis) to a date, skipping Saturdays, Sundays and the holidays `isBusinessDay` skips. Signature: `addBusinessDays(date, amount, options?)`, the same as date-fns. -- **Options** (`BusinessDayOptions`, shared with `isBusinessDay`): `includeOptional` (default `true`) also skips Carnaval and Corpus Christi; `stateCode` also skips that state's holidays. +- **Options** (`BusinessDayOptions`, shared with `isBusinessDay`): `includeOptional` (default `true`) also skips Carnaval and Corpus Christi; `includeSaturday` (default `false`) counts Saturday as a business day; `stateCode` also skips that state's holidays. - Returns a new `Date`, time of day preserved; `date` is never mutated. - An `amount` of `0` returns the same date, even on a weekend or holiday. A negative `amount` walks backwards. - Returns `null` when `date` is invalid, `amount` is not a finite integer, `stateCode` is not a string, or the result leaves the years 1900 to 2099. @@ -1685,6 +1948,8 @@ addBusinessDays(new Date(2024, 0, 2, 12), 1); // Date, 2024-01-03 12:00 (next da addBusinessDays(new Date(2024, 11, 31, 12), 1); // Date, 2025-01-02 12:00 (2025-01-01 is Ano novo, skipped) addBusinessDays(new Date(2024, 0, 5, 12), -1); // Date, 2024-01-04 12:00 (walks backwards) addBusinessDays(new Date(2024, 0, 6, 12), 0); // Date, 2024-01-06 12:00 (unchanged, even though Saturday is not a business day) +addBusinessDays(new Date(2024, 0, 5, 12), 1, { includeSaturday: true }); // Date, 2024-01-06 12:00 (labour law count, Saturday counts) +addBusinessDays(new Date(2024, 10, 1, 12), 1, { includeSaturday: true }); // Date, 2024-11-04 12:00 (2024-11-02 is Finados, a holiday on a Saturday) addBusinessDays(new Date(2024, 6, 8, 12), 1, { stateCode: 'SP' }); // Date, 2024-07-10 12:00 (2024-07-09 is Revolução Constitucionalista in SP, skipped) addBusinessDays(new Date('not a date'), 1); // null addBusinessDays(new Date(2024, 0, 2), 1.5); // null (not an integer) @@ -1704,6 +1969,8 @@ subBusinessDays(new Date(2024, 0, 8, 12), 1); // Date, 2024-01-05 12:00 (walks b subBusinessDays(new Date(2025, 0, 2, 12), 1); // Date, 2024-12-31 12:00 (2025-01-01 is Ano novo, skipped) subBusinessDays(new Date(2024, 0, 5, 12), -1); // Date, 2024-01-08 12:00 (walks forwards) subBusinessDays(new Date(2024, 0, 6, 12), 0); // Date, 2024-01-06 12:00 (unchanged, even though Saturday is not a business day) +subBusinessDays(new Date(2024, 0, 8, 12), 1, { includeSaturday: true }); // Date, 2024-01-06 12:00 (labour law count, Saturday counts) +subBusinessDays(new Date(2024, 10, 4, 12), 1, { includeSaturday: true }); // Date, 2024-11-01 12:00 (2024-11-02 is Finados, a holiday on a Saturday) subBusinessDays(new Date(2024, 6, 10, 12), 1, { stateCode: 'SP' }); // Date, 2024-07-08 12:00 (2024-07-09 is Revolução Constitucionalista in SP, skipped) subBusinessDays(new Date('not a date'), 1); // null subBusinessDays(new Date(2024, 0, 2), 1.5); // null (not an integer) @@ -1713,7 +1980,7 @@ subBusinessDays(new Date(2024, 0, 2), 1.5); // null (not an integer) Count the Brazilian business days (dias úteis) between two dates. Signature: `differenceInBusinessDays(laterDate, earlierDate, options?)`, the same as date-fns. -- **Options** (`BusinessDayOptions`, shared with `isBusinessDay`): `includeOptional` (default `true`) also skips Carnaval and Corpus Christi; `stateCode` also skips that state's holidays. +- **Options** (`BusinessDayOptions`, shared with `isBusinessDay`): `includeOptional` (default `true`) also skips Carnaval and Corpus Christi; `includeSaturday` (default `false`) counts Saturday as a business day; `stateCode` also skips that state's holidays. - Counts `earlierDate` when it is a business day and every business day strictly between the two dates; `laterDate` is never counted. The time of day is ignored. - The result is negative when `laterDate` is before `earlierDate`, and `0` on the same calendar day. - Returns `null` when either date is not a valid `Date` or is outside the years 1900 to 2099, or `stateCode` is not a string. @@ -1725,10 +1992,90 @@ differenceInBusinessDays(new Date(2024, 0, 2), new Date(2024, 0, 1)); // 0 (Jan differenceInBusinessDays(new Date(2024, 0, 3), new Date(2024, 0, 2)); // 1 (Jan 2 counted, a Tuesday; Jan 3 is not) differenceInBusinessDays(new Date(2024, 0, 2), new Date(2024, 0, 3)); // -1 (the later date comes first, so the count is negative) differenceInBusinessDays(new Date(2024, 0, 2), new Date(2024, 0, 2)); // 0 (same day) +differenceInBusinessDays(new Date(2024, 0, 8), new Date(2024, 0, 1)); // 4 (banking count, 2024-01-02 to 2024-01-05) +differenceInBusinessDays(new Date(2024, 0, 8), new Date(2024, 0, 1), { includeSaturday: true }); // 5 (2024-01-06, a Saturday, also counts) +differenceInBusinessDays(new Date(2024, 10, 4), new Date(2024, 10, 1), { includeSaturday: true }); // 1 (2024-11-02 is Finados, a holiday on a Saturday) differenceInBusinessDays(new Date(2024, 6, 10), new Date(2024, 6, 8), { stateCode: 'SP' }); // 1 (2024-07-09 is a state holiday in SP) differenceInBusinessDays(new Date(), new Date('not a date')); // null ``` +### getNextBusinessDay + +Get the first Brazilian business day (dia útil) strictly after a date. `getNextBusinessDay(date, options?)` is `addBusinessDays(date, 1, options)`. + +- **Options** (`BusinessDayOptions`, shared with `isBusinessDay`): `includeOptional` (default `true`) also skips Carnaval and Corpus Christi; `includeSaturday` (default `false`) counts Saturday as a business day; `stateCode` also skips that state's holidays. +- "Next" means strictly after, the meaning date-fns gives it in `nextDay`: a `date` that is itself a business day is never returned. For "on or after", check `isBusinessDay(date)` first and keep `date` when it answers `true`. +- Returns a new `Date`, time of day preserved; `date` is never mutated. +- Returns `null` when `date` is invalid, `stateCode` is not a string, or the result leaves the years 1900 to 2099. + +```javascript +import { getNextBusinessDay } from '@brazilian-utils/brazilian-utils'; + +getNextBusinessDay(new Date(2024, 0, 2, 12)); // Date, 2024-01-03 12:00 (strictly after, even though 2024-01-02 is a business day) +getNextBusinessDay(new Date(2024, 0, 5, 12)); // Date, 2024-01-08 12:00 (skips the weekend) +getNextBusinessDay(new Date(2024, 0, 6, 12)); // Date, 2024-01-08 12:00 (from a Saturday) +getNextBusinessDay(new Date(2024, 0, 5, 12), { includeSaturday: true }); // Date, 2024-01-06 12:00 (labour law count, Saturday counts) +getNextBusinessDay(new Date(2024, 10, 1, 12), { includeSaturday: true }); // Date, 2024-11-04 12:00 (2024-11-02 is Finados, a holiday on a Saturday) +getNextBusinessDay(new Date(2024, 11, 31, 12)); // Date, 2025-01-02 12:00 (2025-01-01 is Ano novo, skipped) +getNextBusinessDay(new Date(2024, 6, 8, 12), { stateCode: 'SP' }); // Date, 2024-07-10 12:00 (2024-07-09 is Revolução Constitucionalista in SP, skipped) +getNextBusinessDay(new Date('not a date')); // null +getNextBusinessDay(new Date(2099, 11, 31)); // null (the walk leaves the supported years) +``` + +### getNthBusinessDay + +Get the n-th Brazilian business day (dia útil) of the month a date falls in. Signature: `getNthBusinessDay(date, n, options?)`, the argument order of `addBusinessDays`. + +- **Options** (`BusinessDayOptions`, shared with `isBusinessDay`): `includeOptional` (default `true`) also skips Carnaval and Corpus Christi; `includeSaturday` (default `false`) counts Saturday as a business day; `stateCode` also skips that state's holidays. +- `date` is any date inside the month: its local year and month are what matter, the day of the month and the time of day are ignored. +- A positive `n` counts from the first day of the month (`1` is the first business day) and a negative `n` counts from the last one (`-1` is the last business day, `-2` the one before it), the way `Array#at` reads an index. +- Returns a new `Date` at the start of that local day (00:00); `date` is never mutated. +- Returns `null` when `date` is invalid, `n` is not a finite integer, is `0` or goes beyond the business days the month has (the answer never spills into a neighbouring month), `stateCode` is not a string, or the month leaves the years 1900 to 2099. An `options` that is not an object is ignored. +- The payroll deadline of CLT art. 459 § 1º ("até o quinto dia útil do mês subsequente ao vencido") is the labour count, not the banking one this gives by default: pass `{ includeSaturday: true }`, as in `getNthBusinessDay(date, 5, { includeSaturday: true })`. Municipal holidays are still counted as business days, which that rule excludes. +- The walk counts local calendar days, so it holds in every time zone. Where the resulting local day has no 00:00 (Brazilian summer time always started at midnight, so 6 October 1997 begins at 01:00 in São Paulo), the nearest instant of that day is returned, the same `Date` date-fns' `startOfDay` gives there. +- A local calendar day a zone never had, such as 30 December 2011 in `Pacific/Apia`, is neither counted nor returned. + +```javascript +import { getNthBusinessDay } from '@brazilian-utils/brazilian-utils'; + +getNthBusinessDay(new Date(2024, 0, 15), 1); // Date, 2024-01-02 00:00 (2024-01-01 is Ano novo) +getNthBusinessDay(new Date(2024, 0, 15), 5); // Date, 2024-01-08 00:00 +getNthBusinessDay(new Date(2024, 1, 1), 10); // Date, 2024-02-15 00:00 (Carnaval, 2024-02-13, skipped) +getNthBusinessDay(new Date(2024, 1, 1), 10, { includeOptional: false }); // Date, 2024-02-14 00:00 +getNthBusinessDay(new Date(2024, 2, 1), 5); // Date, 2024-03-07 00:00 (banking count) +getNthBusinessDay(new Date(2024, 2, 1), 5, { includeSaturday: true }); // Date, 2024-03-06 00:00 (labour law count, 2024-03-02 is a Saturday) +getNthBusinessDay(new Date(2024, 10, 1), 5, { includeSaturday: true }); // Date, 2024-11-07 00:00 (2024-11-02 is Finados, a holiday on a Saturday) +getNthBusinessDay(new Date(2024, 6, 1), 7, { stateCode: 'SP' }); // Date, 2024-07-10 00:00 (2024-07-09 is Revolução Constitucionalista in SP, skipped) +getNthBusinessDay(new Date(2024, 0, 15), -1); // Date, 2024-01-31 00:00 (the last business day) +getNthBusinessDay(new Date(2024, 0, 15), -2); // Date, 2024-01-30 00:00 +getNthBusinessDay(new Date(2024, 0, 15), 23); // null (January 2024 has 22 business days) +getNthBusinessDay(new Date(2024, 0, 15), 0); // null +getNthBusinessDay(new Date('not a date'), 1); // null +``` + +### getLastBusinessDayOfMonth + +Get the last Brazilian business day (dia útil) of the month a date falls in. `getLastBusinessDayOfMonth(date, options?)` is `getNthBusinessDay(date, -1, options)`. + +- Same rules as `getNthBusinessDay`, `BusinessDayOptions` included: any date inside the month, the result at the start of the local day, the untouched input, the years 1900 to 2099 and the `null` cases. +- The name follows date-fns' `lastDayOfMonth`. + +```javascript +import { getLastBusinessDayOfMonth } from '@brazilian-utils/brazilian-utils'; + +getLastBusinessDayOfMonth(new Date(2024, 0, 15)); // Date, 2024-01-31 00:00 +getLastBusinessDayOfMonth(new Date(2024, 2, 1)); // Date, 2024-03-28 00:00 (2024-03-29 is Sexta-feira Santa, then a weekend) +getLastBusinessDayOfMonth(new Date(2024, 7, 31, 18, 30)); // Date, 2024-08-30 00:00 (2024-08-31 is a Saturday) +getLastBusinessDayOfMonth(new Date(2018, 4, 1)); // Date, 2018-05-30 00:00 (2018-05-31 is Corpus Christi, optional, counts by default) +getLastBusinessDayOfMonth(new Date(2018, 4, 1), { includeOptional: false }); // Date, 2018-05-31 00:00 +getLastBusinessDayOfMonth(new Date(2024, 7, 1), { includeSaturday: true }); // Date, 2024-08-31 00:00 (labour law count, Saturday counts) +getLastBusinessDayOfMonth(new Date(2024, 10, 1), { stateCode: 'DF', includeSaturday: true }); // Date, 2024-11-29 00:00 (Saturday 2024-11-30 is Dia do Evangélico in DF) +getLastBusinessDayOfMonth(new Date(2023, 10, 1), { stateCode: 'DF' }); // Date, 2023-11-29 00:00 (2023-11-30 is Dia do Evangélico in DF) +getLastBusinessDayOfMonth(new Date('not a date')); // null +``` + +Source: [CLT, art. 459](https://www.planalto.gov.br/ccivil_03/decreto-lei/del5452.htm), [Instrução Normativa MTP nº 2/2021](https://www.gov.br/trabalho-e-emprego/pt-br/assuntos/inspecao-do-trabalho/areas-de-atuacao/in-2-de-8-denovembro-de-2021.pdf) (art. 14, I) and date-fns, whose [`nextDay`](https://date-fns.org/docs/nextDay), [`lastDayOfMonth`](https://date-fns.org/docs/lastDayOfMonth) and [`startOfDay`](https://date-fns.org/docs/startOfDay) name and shape these functions. + ## Passport ### isValidPassport @@ -1803,13 +2150,16 @@ Source: [Resolução CONTRAN nº 886/2021, art. 4º](https://www.gov.br/transpor Format a CNH. -- **Options** (`FormatCnhOptions`): `pad` left-pads the value with zeros to the full 11 digits before masking (default `false`). +- **Options** (`FormatCnhOptions`): `pad` left-pads the value with zeros to the full 11 digits before masking (default `false`); `obfuscate` hides the first 3 digits and the 2 check digits. +- `obfuscate` is applied after `pad`. +- No authority publishes a masking rule for the CNH, so `obfuscate` applies the one Lei nº 12.309/2010, art. 87, § 5º sets for the CPF ("ocultar os três primeiros dígitos e os dois dígitos verificadores"), a number with the same structure. ```javascript import { formatCnh } from '@brazilian-utils/brazilian-utils'; formatCnh('02650306461'); // 026503064-61 formatCnh('2650306461', { pad: true }); // 026503064-61 +formatCnh('02650306461', { obfuscate: true }); // ***503064-** ``` ### parseCnh @@ -1832,6 +2182,8 @@ import { generateCnh } from '@brazilian-utils/brazilian-utils'; generateCnh(); // '02650306461' ``` +Source: [Lei nº 12.309/2010, art. 87, § 5º](https://www.planalto.gov.br/ccivil_03/_ato2007-2010/2010/lei/l12309.htm), the CPF masking rule `obfuscate` borrows. + ## Legal nature ### isValidLegalNature @@ -1996,13 +2348,16 @@ Source: [Resolução TSE nº 23.659/2021, art. 36](https://www.tse.jus.br/legisl Format a voter ID number with the 12-digit grouping `0000 0000 00 00`. +- **Options** (`FormatVoterIdOptions`): `obfuscate` hides the first 3 digits and the 2 check digits, leaving the federative union code visible. - The 13-digit grouping `0000 0000 0 00 00` is used only when the value has more than 12 digits and its UF code (the 10th and 11th digits) is `01` or `02`. - Digits past the last slot of the pattern are dropped. +- No authority publishes a masking rule for the voter ID, so `obfuscate` applies the one Lei nº 12.309/2010, art. 87, § 5º sets for the CPF ("ocultar os três primeiros dígitos e os dois dígitos verificadores"), a number with the same structure. ```javascript import { formatVoterId } from '@brazilian-utils/brazilian-utils'; formatVoterId('123456780175'); // '1234 5678 01 75' +formatVoterId('123456780175', { obfuscate: true }); // '***4 5678 01 **' formatVoterId('1234567880191'); // '1234 5678 8 01 91' (13-digit SP/MG voter id) ``` @@ -2032,6 +2387,8 @@ generateVoterId('SP'); // valid random voter ID for Sao Paulo generateVoterId('XX'); // falls back to "ZZ" instead of throwing ``` +Source: [Lei nº 12.309/2010, art. 87, § 5º](https://www.planalto.gov.br/ccivil_03/_ato2007-2010/2010/lei/l12309.htm), the CPF masking rule `obfuscate` borrows. + ## CNS ### isValidCns @@ -2498,6 +2855,100 @@ parseNcm('8471.30.12'); // '84713012' parseNcm('8471'); // '8471' (a partial code is kept as written) ``` +### isValidNbs + +Check if an NBS (Nomenclatura Brasileira de Serviços, Intangíveis e Outras Operações que Produzam Variações no Patrimônio) code exists in the official NBS 2.0 table, the code the national NFS-e carries in `cNBS`. + +- A code has 9 digits, printed as `N.NNNN.NN.NN`: the digit 1, the chapter, the position, the two subposition levels, the item and the subitem. +- Accepts a string with the 9 digits or with the mask, with a single separator between the groups and optional surrounding whitespace, or a non-negative safe integer. Any other string is rejected instead of having its digits picked out. +- Only complete codes are valid: the chapter (`1.01`), position (`1.0101`) and subposition (`1.0101.1`) headings classify nothing by themselves. +- The ANEXO B of the Sistema Nacional NFS-e lists the same 920 codes except three (`1.0402.29.00`, `1.0403.29.00` and `1.0904.40.00`), so a code valid here can still be refused by the NFS-e. + +```javascript +import { isValidNbs } from '@brazilian-utils/brazilian-utils'; + +isValidNbs('1.0101.11.00'); // true +isValidNbs('101011100'); // true +isValidNbs(101011100); // true +isValidNbs('1.0101'); // false (a position heading, not a complete code) +isValidNbs('1.9999.99.99'); // false +isValidNbs('1.0101abc11.00'); // false (not a documented form) +``` + +### formatNbs + +Format an NBS (Nomenclatura Brasileira de Serviços) code into the `N.NNNN.NN.NN` mask the nomenclature prints. Only the structure changes; use `isValidNbs` to check a code against the table. + +- Every NBS code starts with 1, so, unlike `formatNcm`, there is no `pad` option. +- Same rules as `formatCnae` otherwise: the mask is applied as far as the value goes, characters outside it are dropped, and a number is read as the string of its digits. + +```javascript +import { formatNbs } from '@brazilian-utils/brazilian-utils'; + +formatNbs('101011100'); // 1.0101.11.00 +formatNbs(101011100); // 1.0101.11.00 +formatNbs('10101'); // 1.0101 (masked as far as it goes) +formatNbs('abc101011100'); // 1.0101.11.00 (only the digits are read) +``` + +### getNbs + +Look an NBS (Nomenclatura Brasileira de Serviços) code up and get its official description. The result is an `Nbs` record: `{ code, description }`. + +- Same rules as `isValidNbs`. `code` is the 9 digits, without the mask. Returns `null` when the code is unknown or the value is not in a documented form. + +```javascript +import { getNbs } from '@brazilian-utils/brazilian-utils'; + +getNbs('1.0101.11.00'); +// { code: '101011100', description: 'Serviços de construção de edificações residenciais de um e dois pavimentos' } + +getNbs(126050000); // { code: '126050000', description: 'Serviços domésticos' } +getNbs('1.0101'); // null (a position heading, not a complete code) +getNbs('1.9999.99.99'); // null +``` + +Source: [NBS 2.0 table published by the MDIC](https://www.gov.br/mdic/pt-br/assuntos/sdic/comercio-e-servicos/nbs-nomenclatura-brasileira-de-servicos), approved by the Portaria Conjunta RFB/SCS 1.429/2018 and amended by the Portaria Conjunta RFB/SCS 2.000/2018. + +### isValidServiceItem + +Check if a value is a subitem in force of the service list annexed to the Lei Complementar 116/2003, the list of the services the ISS is levied on. + +- The law numbers a subitem as the item, a dot and two digits, `1.01` to `40.01`. +- Accepts that form, a zero padded item (`'01.01'`) or the bare digits (`'0101'`, `'101'` or the integer `101`), which are the first four digits of the `cTribNac` code of the national NFS-e, with optional surrounding whitespace. +- The dot is the only separator the law ever prints between the item and the subitem, so, unlike the codes with a printed grouping mask (`isValidCfop`, `isValidNbs`), nothing else is accepted in its place and `'1-01'` is rejected. +- A number is only read when it is a non-negative safe integer, so the float `1.01` is rejected: write the dotted form as a string. +- The vetoed subitems (`3.01`, `7.14`, `7.15`, `13.01` and `17.07`), the item headings, the 6 digit national codes a subitem is split into and item 99 of the national list, which is not part of the law, are not valid. Municipal service codes are out of scope. + +```javascript +import { isValidServiceItem } from '@brazilian-utils/brazilian-utils'; + +isValidServiceItem('1.01'); // true +isValidServiceItem('01.01'); // true +isValidServiceItem('0101'); // true +isValidServiceItem(101); // true +isValidServiceItem('3.01'); // false (vetoed) +isValidServiceItem('99.01'); // false (national list only, not the law) +isValidServiceItem(1.01); // false (not a non-negative safe integer) +``` + +### getServiceItem + +Look a subitem of the service list annexed to the Lei Complementar 116/2003 up and get its official description. The result is a `ServiceItem` record: `{ code, description }`. + +- Same rules as `isValidServiceItem`. `code` is the form the law prints (`'1.01'`). Returns `null` when the subitem is unknown or the value is not in a documented form. + +```javascript +import { getServiceItem } from '@brazilian-utils/brazilian-utils'; + +getServiceItem('1.01'); // { code: '1.01', description: 'Análise e desenvolvimento de sistemas.' } +getServiceItem('0101'); // { code: '1.01', description: 'Análise e desenvolvimento de sistemas.' } +getServiceItem('40.01'); // { code: '40.01', description: 'Obras de arte sob encomenda.' } +getServiceItem('3.01'); // null (vetoed) +``` + +Source: [Lei Complementar 116/2003](https://www.planalto.gov.br/ccivil_03/leis/lcp/lcp116.htm) and the sheet `LISTA.SERV.NAC.` of the [ANEXO B of the Sistema Nacional NFS-e](https://www.gov.br/nfse/pt-br/biblioteca/documentacao-tecnica/documentacao-atual), the list in force in machine readable form. + ### isValidCfop Check if a CFOP (Código Fiscal de Operações e Prestações) code exists in the official table, the consolidated Anexo II of Convênio SINIEF s/nº 1970 in force. @@ -2550,6 +3001,77 @@ getCfop('abc5102'); // null (not a documented form) Source: [consolidated Anexo II of Convênio SINIEF s/nº 1970](https://www.confaz.fazenda.gov.br/legislacao/ajustes/sinief/cfop_cvsn_1-6.24), last amended by [Ajuste SINIEF 39/25](https://www.confaz.fazenda.gov.br/legislacao/ajustes/2025/AJ039_25). +### isValidCest + +Check if a CEST (Código Especificador da Substituição Tributária) is listed in the annexes of Convênio ICMS 142/18, the consolidated text in force. + +- Only the items in force count: an item the annexes mark as revoked is rejected. +- The check is about the code alone: it does not tell whether the code suits a given NCM, nor whether a state applies the substituição tributária regime to it. +- A CEST has 7 digits: the first two are the segment, the third to the fifth the item of the segment and the last two the specification of the item (cláusula sexta, IV). +- Accepts a string with the 7 digits or with the `NN.NNN.NN` form the annexes print, with a single separator between the groups and optional surrounding whitespace, or a non-negative safe integer. Any other string is rejected instead of having its digits picked out. +- The leading zero of segments 01 to 09 is part of the code, so a value written as bare digits is left padded with zeros to 7, as a string or as a number: `100100`, `'100100'` and `'0100100'` are the same code. A masked value is read as written. + +```javascript +import { isValidCest } from '@brazilian-utils/brazilian-utils'; + +isValidCest('01.001.00'); // true +isValidCest('0100100'); // true +isValidCest(100100); // true (padded to 7 digits, so this is '0100100') +isValidCest('03.001.00'); // false (a revoked item) +isValidCest('0000000'); // false +isValidCest('abc0100100'); // false (not a documented form) +isValidCest(-100100); // false (not a non-negative safe integer) +``` + +### formatCest + +Format a CEST (Código Especificador da Substituição Tributária) in the `NN.NNN.NN` form the annexes of Convênio ICMS 142/18 print. Only the structure changes; use `isValidCest` to check a code against the annexes. + +- **Options** (`FormatCestOptions`): `pad` (default `false`) first left pads the value with zeros to the 7 digits of a complete code. +- Same rules as `formatNcm`: without `pad` the mask is applied as far as the value goes, which is what an input being typed into needs, characters outside it are dropped, and a number is read as the string of its digits, so it is only padded under `pad: true`. + +```javascript +import { formatCest } from '@brazilian-utils/brazilian-utils'; + +formatCest('0100100'); // 01.001.00 +formatCest(2899900); // 28.999.00 +formatCest('01001'); // 01.001 (masked as far as it goes) +formatCest(100100, { pad: true }); // 01.001.00 (padded to 7 digits first) +formatCest('abc0100100'); // 01.001.00 (only the digits are read) +``` + +### parseCest + +Remove CEST (Código Especificador da Substituição Tributária) formatting, keep only digits, and cap the result to the 7 digits of a complete code. + +- Same rules as `parseCbo`: nothing is left padded here, so the leading zero of segments 01 to 09 has to be written out. Use `isValidCest` or `getCest`, which do pad a bare numeric code, to look a code up. + +```javascript +import { parseCest } from '@brazilian-utils/brazilian-utils'; + +parseCest('01.001.00'); // '0100100' +parseCest('28.999'); // '28999' (a partial code is kept as written) +``` + +### getCest + +Look a CEST (Código Especificador da Substituição Tributária) up and get the description of the goods and the name of its segment, as Anexos I to XXVI of Convênio ICMS 142/18 word them. The result is a `Cest` record: `{ code, description, segment }`. + +- Same rules as `isValidCest`. Returns `null` for an unknown, revoked or malformed code. +- The NCM/SH codes the annexes pair each CEST with are not part of the entry. + +```javascript +import { getCest } from '@brazilian-utils/brazilian-utils'; + +getCest('05.001.00'); // { code: '0500100', description: 'Cimento', segment: 'Cimentos' } +getCest(500100); // { code: '0500100', description: 'Cimento', segment: 'Cimentos' } +getCest('03.001.00'); // null (a revoked item) +getCest('0000000'); // null +getCest('abc0500100'); // null (not a documented form) +``` + +Source: [consolidated Convênio ICMS 142/18](https://www.confaz.fazenda.gov.br/legislacao/convenios/2018/CV142_18), last amended by Convênio ICMS 180/24. + ### isValidCst Check if a CST (Código de Situação Tributária) code is valid for a given tax. Pass the tax through `options.tax`: @@ -2602,6 +3124,229 @@ isValidCsosn(-101); // false (not a non-negative safe integer) Source: [consolidated Anexo III-A of Convênio SINIEF s/nº 1970](https://www.confaz.fazenda.gov.br/legislacao/ajustes/sinief/cvsn_70) and [Ajuste SINIEF 03/2010](https://www.confaz.fazenda.gov.br/legislacao/ajustes/2010/aj_003_10). +### isValidCstIbsCbs + +Check if a CST-IBS/CBS (Código de Situação Tributária do IBS e da CBS) exists in the official table, the code the field `CST` of the group `IBSCBS` carries in the electronic fiscal documents of the tax reform (Lei Complementar nº 214/2025): NF-e, NFC-e, CT-e, NFS-e and the others. + +- The codes in force are `000`, `010`, `011`, `200`, `220`, `221`, `222`, `400`, `410`, `510`, `515`, `550`, `620`, `800`, `810`, `811`, `820` and `830`. +- It is a function of its own, not a `tax` of `isValidCst`: IBS and CBS share one table, its 3 digit codes collide with the ICMS origin plus Tabela B form (`000`, `200`), and `isValidCst` without a `tax` accepts a code of any table, so adding this one would change what that default accepts. +- Accepts a string of bare digits with optional surrounding whitespace, or a non-negative safe integer. The field is numeric with 3 digits and has no mask, so any other string is rejected instead of having its digits picked out. +- A value narrower than 3 digits is left padded with zeros, as a string or as a number, since the codes start with zeros a numeric field drops: `0`, `'0'` and `'000'` are all the code `000`. + +```javascript +import { isValidCstIbsCbs } from '@brazilian-utils/brazilian-utils'; + +isValidCstIbsCbs('000'); // true +isValidCstIbsCbs(410); // true +isValidCstIbsCbs(10); // true (padded to '010') +isValidCstIbsCbs('100'); // false +isValidCstIbsCbs('cst200'); // false (not a documented form) +isValidCstIbsCbs(-200); // false (not a non-negative safe integer) +``` + +### getCstIbsCbs + +Look a CST-IBS/CBS up and get the description the official CST table gives it. The result is a `CstIbsCbs` record: `{ code, description }`. + +- Same table and input rules as `isValidCstIbsCbs`. Returns `null` when the code is unknown or the value is not in a documented form. + +```javascript +import { getCstIbsCbs } from '@brazilian-utils/brazilian-utils'; + +getCstIbsCbs('000'); // { code: '000', description: 'Tributação integral' } +getCstIbsCbs(410); // { code: '410', description: 'Imunidade e não incidência' } +getCstIbsCbs(10); // { code: '010', description: 'Tributação com alíquotas uniformes' } +getCstIbsCbs('100'); // null +getCstIbsCbs('cst200'); // null (not a documented form) +``` + +### isValidClassTrib + +Check if a cClassTrib (Código de Classificação Tributária do IBS e da CBS) exists in the official table, the code the field `cClassTrib` carries next to the CST-IBS/CBS. + +- **Options** (`IsValidClassTribOptions`): `cst` is the CST-IBS/CBS the document carries, checked against the classification as well. Omit it to check the cClassTrib alone. +- Every classification belongs to exactly one CST-IBS/CBS, the first 3 digits of its code, and a document that carries a cClassTrib with another CST is rejected (rejection 1024, "Classificação Tributária do IBS e da CBS incompatível com o CST informado"). A `cst` that is given and is not the CST of the classification, whatever it is, makes the result `false`. +- Only the classifications in force count: the Informe Técnico 2025.002 excludes a classification by closing its validity (`dFimVig`), as v.1.60 did with `220001`, `220002` and `220003`, and those are rejected. 161 are in force in the version published on 23/06/2026. +- Accepts a string of bare digits with optional surrounding whitespace, or a non-negative safe integer. The field is numeric with 6 digits and has no mask, so any other string is rejected. +- A value narrower than 6 digits is left padded with zeros: `1`, `'1'` and `'000001'` are all the code `000001`. `cst` is read the same way, padded to 3 digits. +- Only the code list is bundled with this function, not the descriptions `getClassTrib` returns. + +```javascript +import { isValidClassTrib } from '@brazilian-utils/brazilian-utils'; + +isValidClassTrib('200001'); // true +isValidClassTrib(1); // true (padded to '000001') +isValidClassTrib('200001', { cst: '200' }); // true +isValidClassTrib('200001', { cst: '000' }); // false (the classification belongs to CST 200) +isValidClassTrib('999999'); // false +isValidClassTrib('220001'); // false (excluded by Informe Técnico 2025.002 v.1.60) +isValidClassTrib('c200001'); // false (not a documented form) +``` + +### getClassTrib + +Look a cClassTrib up and get its official classification. The result is a `ClassTrib` record: `{ code, cst, name, description }`. + +- Same table and the same rules for reading the code as `isValidClassTrib`. Returns `null` when the code is unknown or the value is not in a documented form. +- The `cst` option exists only on `isValidClassTrib`, since the entry returned here already carries its CST as `cst`. +- `cst` is the CST-IBS/CBS the classification belongs to, the first 3 digits of its code; `name` is the short name the official table gives for display (the column "Nome cClassTrib") and `description` the situation it refers to (the column "Descrição cClassTrib"). +- The legal wording the workbook also prints for each row (the article of Lei Complementar nº 214/2025 and of both regulations) is not shipped. + +```javascript +import { getClassTrib } from '@brazilian-utils/brazilian-utils'; + +getClassTrib('000002'); +// { +// code: '000002', +// cst: '000', +// name: 'Exploração de via', +// description: 'Exploração de via, observado o art. 11 da Lei Complementar nº 214, de 2025.', +// } +getClassTrib(2)?.code; // '000002' +getClassTrib('999999'); // null +getClassTrib('220001'); // null (excluded by Informe Técnico 2025.002 v.1.60) +getClassTrib('c200001'); // null (not a documented form) +``` + +Source: the CST and cClassTrib sheets of the "Tabela de Classificação Tributária do IBS e CBS" workbook the [Portal Nacional da NF-e publishes under "Documentos" > "Diversos"](https://www.nfe.fazenda.gov.br/portal/listaConteudo.aspx?tipoConteudo=/NJarYc9nus=) (the version published on 23/06/2026), divulged by the [Informe Técnico 2025.002](https://www.nfe.fazenda.gov.br/portal/listaConteudo.aspx?tipoConteudo=hXzemuyNHW4=) (v.1.60), and the [Nota Técnica 2025.002-RTC](https://www.nfe.fazenda.gov.br/portal/listaConteudo.aspx?tipoConteudo=04BIflQt1aY=), fields UB13 and UB14. + +## GTIN (product barcode) + +### isValidGtin + +Check if a GTIN (Global Trade Item Number, the number under an EAN/UPC barcode) is valid. + +- Covers the four structures of the GS1 General Specifications, the same four the NF-e accepts in `cEAN` and `cEANTrib`: GTIN-8, GTIN-12 (UPC), GTIN-13 (EAN) and GTIN-14 (DUN-14). +- **Options** (`IsValidGtinOptions`): `lengths` accepts only some of the four lengths, and defaults to all four. +- The value must be a string of 8, 12, 13 or 14 digits, surrounding whitespace aside, whose last digit is the GS1 modulo 10 check digit: weights 3 and 1 alternating from the right, the sum subtracted from the nearest equal or higher multiple of ten. That is what rules I03-10 and I12-10 of SEFAZ Nota Técnica 2021.003 check (rejections 611 and 612). +- Leading zeros count, so a number is never accepted, and a masked value (`'7 890000 000017'`) is rejected instead of having its digits picked out. +- The `'SEM GTIN'` literal the NF-e uses for a product without a GTIN is not a GTIN, so it is not valid here: test for it before calling. +- The prefix does not change the verdict. Restricted Circulation Numbers (prefixes 02, 04 and 20 to 29, the codes a shop prints on its own scale labels) and the ISSN, ISBN and coupon ranges share the structure and the check digit, and the "Tabela Prefixo GS1" SEFAZ validates `cEAN` against lists them as valid; use `getGtinInfo` to tell them apart. +- The prefix is not checked against the list of GS1 Member Organisations either: GS1 keeps assigning ranges, so a copy of that list would turn down valid numbers as it ages. Whether the number is registered (the Cadastro Centralizado de GTIN lookup SEFAZ runs for the 789 and 790 prefixes) cannot be checked offline. + +```javascript +import { isValidGtin } from '@brazilian-utils/brazilian-utils'; + +isValidGtin('7890000000017'); // true (GTIN-13, GS1 Brasil prefix) +isValidGtin('6291041500213'); // true (the example of the GS1 check digit page) +isValidGtin('78912342'); // true (GTIN-8) +isValidGtin('061414112345'); // true (GTIN-12) +isValidGtin('17890000000014'); // true (GTIN-14) +isValidGtin('7890000000018'); // false (wrong check digit) +isValidGtin('17890000000014', { lengths: [8, 12, 13] }); // false (GTIN-14 not accepted) +isValidGtin('7 890000 000017'); // false (digits only) +isValidGtin('SEM GTIN'); // false +``` + +### getGtinInfo + +Parse a GTIN into its fields, as a `GtinInfo`. + +- Returns `null` when the value is not a valid GTIN, under the same rules as `isValidGtin`. +- The prefix is read the way the "Tabela Prefixo GS1" of the Portal da NF-e tells: the value is left padded with zeros to 14 digits, and the prefix is positions 7 to 9 when the first six are zeros (a GTIN-8) and positions 2 to 4 otherwise. A GTIN-12 therefore has a prefix that starts with `0`, and a GTIN-14 has the prefix of the GTIN-13 it packs, after the indicator digit. + +| Field | Description | +| --- | --- | +| `type` | `'GTIN-8'`, `'GTIN-12'`, `'GTIN-13'` or `'GTIN-14'` (`GtinType`), from the length the value was written with | +| `length` | `8`, `12`, `13` or `14` (`GtinLength`) | +| `prefix` | The three digit GS1 Prefix, or a GS1-8 Prefix when the first six digits of the 14 digit form are zeros, which covers every GTIN-8 and the GS1 Prefix `0000000`. It names the GS1 Member Organisation that licensed the number, not the country of origin | +| `isBrazilian` | `true` when the prefix is one of GS1 Brasil, `789` or `790`, what NT 2021.003 calls "prefixo do Brasil" | +| `isRestrictedCirculation` | `true` when the prefix is in a range GS1 sets aside for Restricted Circulation Numbers (GS1 Prefixes 02, 04 and 20 to 29; GS1-8 Prefixes 000 to 099 and 200 to 299, which is also where the GS1 Prefix `0000000` lands, since its 14 digit form starts with six zeros), so the number is only unique inside a company or region | +| `checkDigit` | The modulo 10 check digit, the last digit | + +```javascript +import { getGtinInfo } from '@brazilian-utils/brazilian-utils'; + +getGtinInfo('7890000000017'); +// { type: 'GTIN-13', length: 13, prefix: '789', isBrazilian: true, +// isRestrictedCirculation: false, checkDigit: 7 } + +getGtinInfo('17890000000014'); +// { type: 'GTIN-14', length: 14, prefix: '789', isBrazilian: true, +// isRestrictedCirculation: false, checkDigit: 4 } + +getGtinInfo('061414112345'); +// { type: 'GTIN-12', length: 12, prefix: '006', isBrazilian: false, +// isRestrictedCirculation: false, checkDigit: 5 } + +getGtinInfo('2000000000015')?.isRestrictedCirculation; // true (in-store number) +getGtinInfo('7890000000018'); // null (wrong check digit) +``` + +Source: [GS1 General Specifications](https://ref.gs1.org/standards/genspecs/), [GS1 check digit calculator](https://www.gs1.org/services/how-calculate-check-digit-manually), [SEFAZ Nota Técnica 2021.003](https://www.nfe.fazenda.gov.br/portal/exibirArquivo.aspx?conteudo=SrQT9ys8ODo%3D) and the [Tabela Prefixo GS1](https://www.nfe.fazenda.gov.br/portal/exibirArquivo.aspx?conteudo=Oc+fygAxwmc%3D) of the Portal da NF-e. + +## CID-10 + +### isValidCid10 + +Check if a CID-10 code exists in the tables DATASUS publishes, the Brazilian Portuguese edition of the ICD-10 (Classificação Estatística Internacional de Doenças e Problemas Relacionados à Saúde, 10th revision), the code medical certificates and health systems carry. + +- Both levels of the classification are valid: the 3 character categories (`A00`) and the 4 character subcategories, written with the dot (`A00.0`) or without it (`A000`). +- Letter case and surrounding whitespace are ignored. Anything else (another separator, a fifth character, a dagger or asterisk suffix, a value that is not a string) is rejected. +- The V2008 tables are the only source: a code that is not in them, such as `U07.1` (COVID-19), is not found. +- Only a table of codes is read (about 27 KB minified), not the descriptions `getCid10` carries. + +```javascript +import { isValidCid10 } from '@brazilian-utils/brazilian-utils'; + +isValidCid10('A00.0'); // true +isValidCid10('a000'); // true +isValidCid10('A00'); // true (a category) +isValidCid10('I10'); // true (a category that is not subdivided) +isValidCid10('A00.5'); // false (A00 has no subcategory 5) +isValidCid10('I10.0'); // false (I10 has no subcategories) +isValidCid10('A00-0'); // false (not a documented form) +``` + +### formatCid10 + +Format a CID-10 code the way it is printed: upper case, with a dot between the 3 character category and the fourth character of the subcategory. Only the structure changes; use `isValidCid10` to check a code against the tables. + +- The mask is applied as far as the value goes, so a category stays as it is and the dot only shows up with the fourth character. +- Characters outside the mask are dropped and the value is capped at 4 characters. + +```javascript +import { formatCid10 } from '@brazilian-utils/brazilian-utils'; + +formatCid10('A000'); // A00.0 +formatCid10('f322'); // F32.2 +formatCid10('A00'); // A00 (a category has no dot) +formatCid10('A00.0'); // A00.0 +``` + +### parseCid10 + +Remove CID-10 formatting, keep only letters and digits, upper case them and cap the result to the 4 characters of a subcategory, the form the DATASUS tables store. + +- A shorter value passes through as far as it goes. + +```javascript +import { parseCid10 } from '@brazilian-utils/brazilian-utils'; + +parseCid10('A00.0'); // 'A000' +parseCid10('f32.2'); // 'F322' +parseCid10('A00'); // 'A00' +``` + +### getCid10 + +Look a CID-10 code up and get its official Brazilian Portuguese description. The result is a `Cid10` record: `{ code, description }`. + +- Same input rules as `isValidCid10`. `code` is upper case and has no dot. Returns `null` when the code is unknown or the value is not in a documented form. +- This is the heaviest util of the package: it embeds the 2045 categories and 12188 subcategories with their descriptions, about 1 MB minified (147 KB gzipped). Load it lazily through its subpath, as shown in [Bundle size](getting-started.md#bundle-size), and use `isValidCid10` when the description is not needed. + +```javascript +import { getCid10 } from '@brazilian-utils/brazilian-utils'; + +getCid10('A00.0'); // { code: 'A000', description: 'Cólera devida a Vibrio cholerae 01, biótipo cholerae' } +getCid10('a000'); // { code: 'A000', description: 'Cólera devida a Vibrio cholerae 01, biótipo cholerae' } +getCid10('A00'); // { code: 'A00', description: 'Cólera' } +getCid10('A00.5'); // null +getCid10('A00-0'); // null (not a documented form) +``` + +Source: [CID-10 V2008 tables DATASUS publishes as CSV](http://www2.datasus.gov.br/cid10/V2008/descrcsv.htm). + ## Text ### capitalize @@ -2696,7 +3441,27 @@ isValidEmail('john.doe@hotmail.com'); // true isValidEmail('invalid.email'); // false ``` -Source: [WHATWG HTML, valid e-mail address](https://html.spec.whatwg.org/multipage/input.html#valid-e-mail-address) and [RFC 5322](https://www.rfc-editor.org/rfc/rfc5322). +### obfuscateEmail + +Hide most of an e-mail address with `*`, for the places where an address is shown to someone who should only recognize it. + +- The first 2 characters of the local part and the first 2 of the domain stay, whatever they are, a dot included, the `@` stays, and every other character, the remaining dots included, becomes one `*`, so the length is preserved. That is how the gov.br account shows the registered address, `li***********@gm*******`. +- A first domain label of a single character therefore keeps the dot that follows it visible. +- The gov.br sample does not cover a local part of 1 or 2 characters, which that rule would show whole, so such a local part always loses its last character here. +- The value is judged by `isValidEmail` as it comes, with no trimming, and keeps its letter case. +- Returns `''` when the value is not a valid e-mail address. + +```javascript +import { obfuscateEmail } from '@brazilian-utils/brazilian-utils'; + +obfuscateEmail('fulano.silva@example.com'); // fu**********@ex********* +obfuscateEmail('ab@example.com.br'); // a*@ex************ +obfuscateEmail('a@example.com'); // *@ex********* +obfuscateEmail('maria@a.bc'); // ma***@a.** (a 1 character label leaves its dot visible) +obfuscateEmail('not an e-mail'); // '' +``` + +Source: [WHATWG HTML, valid e-mail address](https://html.spec.whatwg.org/multipage/input.html#valid-e-mail-address), [RFC 5322](https://www.rfc-editor.org/rfc/rfc5322) and the [conta gov.br](https://acesso.gov.br/faq/_perguntasdafaq/formarrecuperarconta.html), which sets the masking shape. ## Credit card diff --git a/jsr.json b/jsr.json index 4b41130dd..1c1076217 100644 --- a/jsr.json +++ b/jsr.json @@ -16,6 +16,8 @@ "./format-cei": "./src/format-cei/format-cei.ts", "./format-cep": "./src/format-cep/format-cep.ts", "./format-certidao": "./src/format-certidao/format-certidao.ts", + "./format-cest": "./src/format-cest/format-cest.ts", + "./format-cid10": "./src/format-cid10/format-cid10.ts", "./format-cnae": "./src/format-cnae/format-cnae.ts", "./format-cnh": "./src/format-cnh/format-cnh.ts", "./format-cno": "./src/format-cno/format-cno.ts", @@ -26,12 +28,14 @@ "./format-iban": "./src/format-iban/format-iban.ts", "./format-legal-nature": "./src/format-legal-nature/format-legal-nature.ts", "./format-license-plate": "./src/format-license-plate/format-license-plate.ts", + "./format-nbs": "./src/format-nbs/format-nbs.ts", "./format-ncm": "./src/format-ncm/format-ncm.ts", "./format-nfe-key": "./src/format-nfe-key/format-nfe-key.ts", "./format-passport": "./src/format-passport/format-passport.ts", "./format-phone": "./src/format-phone/format-phone.ts", "./format-pis": "./src/format-pis/format-pis.ts", "./format-processo-juridico": "./src/format-processo-juridico/format-processo-juridico.ts", + "./format-suframa": "./src/format-suframa/format-suframa.ts", "./format-voter-id": "./src/format-voter-id/format-voter-id.ts", "./generate-boleto": "./src/generate-boleto/generate-boleto.ts", "./generate-cep": "./src/generate-cep/generate-cep.ts", @@ -46,6 +50,7 @@ "./generate-pix-payload": "./src/generate-pix-payload/generate-pix-payload.ts", "./generate-processo-juridico": "./src/generate-processo-juridico/generate-processo-juridico.ts", "./generate-renavam": "./src/generate-renavam/generate-renavam.ts", + "./generate-suframa": "./src/generate-suframa/generate-suframa.ts", "./generate-voter-id": "./src/generate-voter-id/generate-voter-id.ts", "./get-address-info-by-cep": "./src/get-address-info-by-cep/get-address-info-by-cep.ts", "./get-area-code-info": "./src/get-area-code-info/get-area-code-info.ts", @@ -57,21 +62,35 @@ "./get-cbo": "./src/get-cbo/get-cbo.ts", "./get-cep-info-by-address": "./src/get-cep-info-by-address/get-cep-info-by-address.ts", "./get-certidao-info": "./src/get-certidao-info/get-certidao-info.ts", + "./get-cest": "./src/get-cest/get-cest.ts", "./get-cfop": "./src/get-cfop/get-cfop.ts", + "./get-cid10": "./src/get-cid10/get-cid10.ts", "./get-cities": "./src/get-cities/get-cities.ts", + "./get-class-trib": "./src/get-class-trib/get-class-trib.ts", "./get-cnae": "./src/get-cnae/get-cnae.ts", + "./get-cnpj-info": "./src/get-cnpj-info/get-cnpj-info.ts", + "./get-cpf-info": "./src/get-cpf-info/get-cpf-info.ts", + "./get-cst-ibs-cbs": "./src/get-cst-ibs-cbs/get-cst-ibs-cbs.ts", "./get-format-license-plate": "./src/get-format-license-plate/get-format-license-plate.ts", + "./get-gtin-info": "./src/get-gtin-info/get-gtin-info.ts", "./get-holidays": "./src/get-holidays/get-holidays.ts", "./get-iban-info": "./src/get-iban-info/get-iban-info.ts", + "./get-last-business-day-of-month": "./src/get-last-business-day-of-month/get-last-business-day-of-month.ts", "./get-legal-nature": "./src/get-legal-nature/get-legal-nature.ts", "./get-legal-natures": "./src/get-legal-natures/get-legal-natures.ts", "./get-legal-natures-by-category": "./src/get-legal-natures-by-category/get-legal-natures-by-category.ts", "./get-municipalities": "./src/get-municipalities/get-municipalities.ts", "./get-municipality": "./src/get-municipality/get-municipality.ts", "./get-municipality-by-code": "./src/get-municipality-by-code/get-municipality-by-code.ts", + "./get-nbs": "./src/get-nbs/get-nbs.ts", + "./get-next-business-day": "./src/get-next-business-day/get-next-business-day.ts", "./get-nfe-key-info": "./src/get-nfe-key-info/get-nfe-key-info.ts", + "./get-nfse-key-info": "./src/get-nfse-key-info/get-nfse-key-info.ts", + "./get-nth-business-day": "./src/get-nth-business-day/get-nth-business-day.ts", "./get-pix-key-info": "./src/get-pix-key-info/get-pix-key-info.ts", "./get-pix-payload-info": "./src/get-pix-payload-info/get-pix-payload-info.ts", + "./get-service-item": "./src/get-service-item/get-service-item.ts", + "./get-state-by-cep": "./src/get-state-by-cep/get-state-by-cep.ts", "./get-state-by-ibge-code": "./src/get-state-by-ibge-code/get-state-by-ibge-code.ts", "./get-state-code-by-name": "./src/get-state-code-by-name/get-state-code-by-name.ts", "./get-state-name-by-code": "./src/get-state-name-by-code/get-state-name-by-code.ts", @@ -86,7 +105,10 @@ "./is-valid-cei": "./src/is-valid-cei/is-valid-cei.ts", "./is-valid-cep": "./src/is-valid-cep/is-valid-cep.ts", "./is-valid-certidao": "./src/is-valid-certidao/is-valid-certidao.ts", + "./is-valid-cest": "./src/is-valid-cest/is-valid-cest.ts", "./is-valid-cfop": "./src/is-valid-cfop/is-valid-cfop.ts", + "./is-valid-cid10": "./src/is-valid-cid10/is-valid-cid10.ts", + "./is-valid-class-trib": "./src/is-valid-class-trib/is-valid-class-trib.ts", "./is-valid-cnae": "./src/is-valid-cnae/is-valid-cnae.ts", "./is-valid-cnh": "./src/is-valid-cnh/is-valid-cnh.ts", "./is-valid-cno": "./src/is-valid-cno/is-valid-cno.ts", @@ -96,15 +118,19 @@ "./is-valid-credit-card": "./src/is-valid-credit-card/is-valid-credit-card.ts", "./is-valid-csosn": "./src/is-valid-csosn/is-valid-csosn.ts", "./is-valid-cst": "./src/is-valid-cst/is-valid-cst.ts", + "./is-valid-cst-ibs-cbs": "./src/is-valid-cst-ibs-cbs/is-valid-cst-ibs-cbs.ts", "./is-valid-email": "./src/is-valid-email/is-valid-email.ts", + "./is-valid-gtin": "./src/is-valid-gtin/is-valid-gtin.ts", "./is-valid-iban": "./src/is-valid-iban/is-valid-iban.ts", "./is-valid-ie": "./src/is-valid-ie/is-valid-ie.ts", "./is-valid-landline-phone": "./src/is-valid-landline-phone/is-valid-landline-phone.ts", "./is-valid-legal-nature": "./src/is-valid-legal-nature/is-valid-legal-nature.ts", "./is-valid-license-plate": "./src/is-valid-license-plate/is-valid-license-plate.ts", "./is-valid-mobile-phone": "./src/is-valid-mobile-phone/is-valid-mobile-phone.ts", + "./is-valid-nbs": "./src/is-valid-nbs/is-valid-nbs.ts", "./is-valid-ncm": "./src/is-valid-ncm/is-valid-ncm.ts", "./is-valid-nfe-key": "./src/is-valid-nfe-key/is-valid-nfe-key.ts", + "./is-valid-nfse-key": "./src/is-valid-nfse-key/is-valid-nfse-key.ts", "./is-valid-passport": "./src/is-valid-passport/is-valid-passport.ts", "./is-valid-phone": "./src/is-valid-phone/is-valid-phone.ts", "./is-valid-pis": "./src/is-valid-pis/is-valid-pis.ts", @@ -113,16 +139,22 @@ "./is-valid-processo-juridico": "./src/is-valid-processo-juridico/is-valid-processo-juridico.ts", "./is-valid-registro-profissional": "./src/is-valid-registro-profissional/is-valid-registro-profissional.ts", "./is-valid-renavam": "./src/is-valid-renavam/is-valid-renavam.ts", + "./is-valid-service-item": "./src/is-valid-service-item/is-valid-service-item.ts", "./is-valid-service-phone": "./src/is-valid-service-phone/is-valid-service-phone.ts", + "./is-valid-suframa": "./src/is-valid-suframa/is-valid-suframa.ts", "./is-valid-vin": "./src/is-valid-vin/is-valid-vin.ts", "./is-valid-voter-id": "./src/is-valid-voter-id/is-valid-voter-id.ts", + "./obfuscate-email": "./src/obfuscate-email/obfuscate-email.ts", + "./obfuscate-pix-key": "./src/obfuscate-pix-key/obfuscate-pix-key.ts", "./parse-boleto": "./src/parse-boleto/parse-boleto.ts", "./parse-caepf": "./src/parse-caepf/parse-caepf.ts", "./parse-cbo": "./src/parse-cbo/parse-cbo.ts", "./parse-cei": "./src/parse-cei/parse-cei.ts", "./parse-cep": "./src/parse-cep/parse-cep.ts", "./parse-certidao": "./src/parse-certidao/parse-certidao.ts", + "./parse-cest": "./src/parse-cest/parse-cest.ts", "./parse-cfop": "./src/parse-cfop/parse-cfop.ts", + "./parse-cid10": "./src/parse-cid10/parse-cid10.ts", "./parse-cnae": "./src/parse-cnae/parse-cnae.ts", "./parse-cnh": "./src/parse-cnh/parse-cnh.ts", "./parse-cno": "./src/parse-cno/parse-cno.ts", @@ -135,10 +167,12 @@ "./parse-license-plate": "./src/parse-license-plate/parse-license-plate.ts", "./parse-ncm": "./src/parse-ncm/parse-ncm.ts", "./parse-nfe-key": "./src/parse-nfe-key/parse-nfe-key.ts", + "./parse-nfse-key": "./src/parse-nfse-key/parse-nfse-key.ts", "./parse-passport": "./src/parse-passport/parse-passport.ts", "./parse-phone": "./src/parse-phone/parse-phone.ts", "./parse-pis": "./src/parse-pis/parse-pis.ts", "./parse-processo-juridico": "./src/parse-processo-juridico/parse-processo-juridico.ts", + "./parse-suframa": "./src/parse-suframa/parse-suframa.ts", "./parse-voter-id": "./src/parse-voter-id/parse-voter-id.ts", "./remove-accents": "./src/remove-accents/remove-accents.ts", "./sub-business-days": "./src/sub-business-days/sub-business-days.ts", diff --git a/package.json b/package.json index 7026d4835..0743159ec 100644 --- a/package.json +++ b/package.json @@ -9,6 +9,7 @@ "brazilian", "cbo", "cep", + "cest", "cfop", "cnae", "cnh", @@ -123,8 +124,7 @@ "check:vex": "node ./scripts/vex.ts", "test:mutation": "stryker run", "bench": "vp test bench --run", - "check:api": "npm run build && api-extractor run --verbose", - "check:api:update": "npm run build && api-extractor run --local --verbose", + "check:api": "npm run build && node ./scripts/api.ts", "check:commits": "commitlint --from origin/main --to HEAD --verbose", "check:lockfile": "lockfile-lint --path package-lock.json --type npm --allowed-hosts npm --validate-https --validate-integrity", "build:data": "node ./scripts/data.ts", diff --git a/reports/api/brazilian-utils.api.md b/reports/api/brazilian-utils.api.md deleted file mode 100644 index 75b328bda..000000000 --- a/reports/api/brazilian-utils.api.md +++ /dev/null @@ -1,1216 +0,0 @@ -## API Report File for "@brazilian-utils/brazilian-utils" - -> Do not edit this file. It is a report generated by [API Extractor](https://api-extractor.com/). - -```ts - -// @public -export const addBusinessDays: (date: Date, amount: number, options?: BusinessDayOptions) => Date | null; - -// @public -export type AddressInfo = { - cep: string; - state: string; - city: string; - neighborhood: string; - street: string; -}; - -// @public -export type AreaCodeInfo = { - areaCode: number; - stateCode: StateCode; - stateName: StateName; - regionCode: State["regionCode"]; - regionName: State["regionName"]; - stateCodes: StateCode[]; -}; - -// @public -export type Bank = { - code: string; - ispb: string; - name: string; -}; - -// @public -export type BoletoInfo = { - amount: number; - expirationDate: Date | null; - bankCode: string; - type?: "arrecadacao"; - segment?: number; - value?: number; - hasEffectiveValue?: boolean; -}; - -// @public -export type BusinessDayOptions = { - stateCode?: StateCode; - includeOptional?: boolean; -}; - -// @public -export const capitalize: (value: string, options?: CapitalizeOptions) => string; - -// @public -export type CapitalizeOptions = { - lowerCaseWords?: string[]; - upperCaseWords?: string[]; -}; - -// @public -export type Cbo = { - code: string; - description: string; -}; - -// @public -export type CepAddressInfo = { - cep: string; - logradouro: string; - complemento: string; - unidade?: string; - bairro: string; - localidade: string; - uf: string; - estado?: string; - regiao?: string; - ibge?: string; - gia?: string; - ddd?: string; - siafi?: string; -}; - -// @public -export type CepProvider = "viacep" | "widenet" | "brasilapi"; - -// @public -export type CertidaoInfo = { - registryCns: string; - acervo: string; - service: string; - year: number; - type: CertidaoType; - typeCode: number; - book: string; - page: string; - term: string; - checkDigits: string; -}; - -// @public -export type CertidaoType = "birth" | "marriage" | "religious-marriage" | "death" | "stillbirth" | "banns" | "other" | "emancipation" | "interdiction"; - -// @public -export type Cfop = { - code: string; - description: string; -}; - -// @public -export type Cnae = { - code: string; - description: string; -}; - -// @public -export const convertCurrencyToWords: (value: number) => string; - -// @public -export const convertDateToWords: (value: Date | string, options?: ConvertDateToWordsOptions) => string; - -// @public -export type ConvertDateToWordsOptions = { - style?: "full" | "month"; - weekday?: boolean; -}; - -// @public -export const convertLicensePlateToMercosul: (value: string) => string; - -// @public -export const convertNumberToWords: (value: number, options?: ConvertNumberToWordsOptions) => string; - -// @public -export type ConvertNumberToWordsOptions = { - gender?: NumberToWordsGender; -}; - -// @public -export const differenceInBusinessDays: (laterDate: Date, earlierDate: Date, options?: BusinessDayOptions) => number | null; - -// @public -export const formatBoleto: (value: string | number, options?: FormatBoletoOptions) => string; - -// @public -export type FormatBoletoOptions = { - pad?: boolean; -}; - -// @public -export const formatCaepf: (value: string | number, options?: FormatCaepfOptions) => string; - -// @public -export type FormatCaepfOptions = { - pad?: boolean; -}; - -// @public -export const formatCei: (value: string | number, options?: FormatCeiOptions) => string; - -// @public -export type FormatCeiOptions = { - pad?: boolean; -}; - -// @public @deprecated -export const formatCEP: typeof formatCep; - -// @public -export const formatCep: (value: string | number, options?: FormatCepOptions) => string; - -// @public -export type FormatCepOptions = { - pad?: boolean; -}; - -// @public -export const formatCertidao: (value: string | number, options?: FormatCertidaoOptions) => string; - -// @public -export type FormatCertidaoOptions = { - pad?: boolean; -}; - -// @public -export const formatCnae: (value: string | number, options?: FormatCnaeOptions) => string; - -// @public -export type FormatCnaeOptions = { - pad?: boolean; -}; - -// @public -export const formatCnh: (value: string | number, options?: FormatCnhOptions) => string; - -// @public -export type FormatCnhOptions = { - pad?: boolean; -}; - -// @public -export const formatCno: (value: string | number, options?: FormatCnoOptions) => string; - -// @public -export type FormatCnoOptions = { - pad?: boolean; -}; - -// @public @deprecated -export const formatCNPJ: typeof formatCnpj; - -// @public -export const formatCnpj: (value: string | number, options?: FormatCnpjOptions) => string; - -// @public -export type FormatCnpjOptions = { - pad?: boolean; - version?: 1 | 2; - obfuscate?: boolean; -}; - -// @public -export const formatCns: (value: string | number, options?: FormatCnsOptions) => string; - -// @public -export type FormatCnsOptions = { - pad?: boolean; -}; - -// @public @deprecated -export const formatCPF: typeof formatCpf; - -// @public -export const formatCpf: (value: string | number, options?: FormatCpfOptions) => string; - -// @public -export type FormatCpfOptions = { - pad?: boolean; - obfuscate?: boolean; -}; - -// @public -export const formatCurrency: (value: string | number, options?: FormatCurrencyOptions) => string; - -// @public -export type FormatCurrencyOptions = { - symbol?: boolean; - precision?: number; -}; - -// @public -export const formatIban: (value: string) => string; - -// @public -export const formatLegalNature: (value: string | number, options?: FormatLegalNatureOptions) => string; - -// @public -export type FormatLegalNatureOptions = { - pad?: boolean; -}; - -// @public -export const formatLicensePlate: (value: string) => string; - -// @public -export const formatNcm: (value: string | number, options?: FormatNcmOptions) => string; - -// @public -export type FormatNcmOptions = { - pad?: boolean; -}; - -// @public -export const formatNfeKey: (value: string, options?: FormatNfeKeyOptions) => string; - -// @public -export type FormatNfeKeyOptions = { - pad?: boolean; -}; - -// @public -export const formatPassport: (passport: string) => string; - -// @public -export const formatPhone: (value: string | number, options?: FormatPhoneOptions) => string; - -// @public -export type FormatPhoneOptions = { - mask?: PhoneMask; -}; - -// @public -export const formatPis: (value: string | number, options?: FormatPisOptions) => string; - -// @public -export type FormatPisOptions = { - pad?: boolean; -}; - -// @public -export const formatProcessoJuridico: (value: string | number, options?: FormatProcessoJuridicoOptions) => string; - -// @public -export type FormatProcessoJuridicoOptions = { - pad?: boolean; -}; - -// @public -export const formatVoterId: (value: string | number) => string; - -// @public -export const generateBoleto: (params?: GenerateBoletoParams) => string; - -// @public -export type GenerateBoletoParams = { - type?: "bancario" | "arrecadacao"; -}; - -// @public -export const generateCep: () => string; - -// @public -export const generateCnh: () => string; - -// @public @deprecated -export const generateCNPJ: typeof generateCnpj; - -// @public -export const generateCnpj: (versionOrParams?: 1 | 2 | GenerateCnpjParams) => string; - -// @public -export type GenerateCnpjParams = { - version?: 1 | 2; - branch?: number; -}; - -// @public @deprecated -export const generateCPF: typeof generateCpf; - -// @public -export const generateCpf: (state?: StateCode) => string; - -// @public -export const generateLegalNature: () => string; - -// @public -export const generateLicensePlate: (format?: GenerateLicensePlateFormat) => string; - -// @public -export type GenerateLicensePlateFormat = LicensePlateFormat; - -// @public -export const generatePassport: () => string; - -// @public -export const generatePhone: (type?: GeneratePhoneType) => string; - -// @public -export type GeneratePhoneType = "mobile" | "landline" | "service"; - -// @public -export const generatePis: () => string; - -// @public -export const generatePixPayload: (params: GeneratePixPayloadParams) => string | null; - -// @public -export type GeneratePixPayloadParams = { - key?: string; - url?: string; - merchantName: string; - merchantCity: string; - amount?: number; - txid?: string; - description?: string; -}; - -// @public -export const generateProcessoJuridico: (options?: GenerateProcessoJuridicoParams) => string | null; - -// @public @deprecated -export type GenerateProcessoJuridicoOptions = GenerateProcessoJuridicoParams; - -// @public -export type GenerateProcessoJuridicoParams = { - year?: number; - court?: number; -}; - -// @public -export const generateRenavam: () => string; - -// @public -export const generateVoterId: (state?: StateCode | "ZZ") => string; - -// @public -export const getAddressInfoByCep: (cep: string | number, options?: GetAddressInfoByCepOptions) => Promise; - -// @public -export class GetAddressInfoByCepError extends Error { - constructor(message: string); -} - -// @public -export class GetAddressInfoByCepNotFoundError extends GetAddressInfoByCepError { - constructor(message: string); -} - -// @public -export type GetAddressInfoByCepOptions = { - providers?: CepProvider[]; -}; - -// @public -export class GetAddressInfoByCepServiceError extends GetAddressInfoByCepError { - constructor(message: string); -} - -// @public -export class GetAddressInfoByCepValidationError extends GetAddressInfoByCepError { - constructor(message: string); -} - -// @public -export const getAreaCodeInfo: (areaCode: string | number) => AreaCodeInfo | null; - -// @public -export const getAreaCodesByState: (stateCode: string) => number[]; - -// @public -export const getBankByCode: (code: string | number) => Bank | null; - -// @public -export const getBankByIspb: (value: string | number) => Bank | null; - -// @public -export const getBanks: () => Bank[]; - -// @public -export const getBoletoInfo: (value: string, options?: GetBoletoInfoOptions) => BoletoInfo | null; - -// @public -export type GetBoletoInfoOptions = { - referenceDate?: Date; -}; - -// @public -export const getCbo: (value: string | number) => Cbo | null; - -// @public -export const getCepInfoByAddress: (params: GetCepInfoByAddressParams) => Promise; - -// @public -export class GetCepInfoByAddressError extends Error { - constructor(message: string); -} - -// @public -export class GetCepInfoByAddressNotFoundError extends GetCepInfoByAddressError { - constructor(message: string); -} - -// @public @deprecated -export type GetCepInfoByAddressOptions = GetCepInfoByAddressParams; - -// @public -export type GetCepInfoByAddressParams = { - federalUnit: string; - city: string; - street: string; -}; - -// @public -export class GetCepInfoByAddressValidationError extends GetCepInfoByAddressError { - constructor(message: string); -} - -// @public -export const getCertidaoInfo: (value: string) => CertidaoInfo | null; - -// @public -export const getCfop: (value: string | number) => Cfop | null; - -// @public @deprecated -export const getCities: (state?: StateCode) => string[]; - -// @public -export const getCnae: (value: string | number) => Cnae | null; - -// @public -export const getFormatLicensePlate: (value: string) => LicensePlateFormat | null; - -// @public -export function getHolidays(year: number): Holiday[]; - -// @public -export function getHolidays(options: GetHolidaysParams): Holiday[]; - -// @public @deprecated -export type GetHolidaysOptions = GetHolidaysParams; - -// @public -export type GetHolidaysParams = { - year: number; - stateCode?: StateCode; -}; - -// @public -export const getIbanInfo: (value: string) => IbanInfo | null; - -// @public -export const getLegalNature: (value: string | number) => LegalNature | null; - -// @public -export const getLegalNatures: (params?: GetLegalNaturesParams) => Record; - -// @public -export const getLegalNaturesByCategory: (category: string | number, options?: GetLegalNaturesByCategoryOptions) => LegalNature[]; - -// @public -export type GetLegalNaturesByCategoryOptions = { - includeLegacy?: boolean; -}; - -// @public -export type GetLegalNaturesParams = { - includeLegacy?: boolean; -}; - -// @public -export const getMunicipalities: (stateCode?: StateCode) => Municipality[]; - -// @public @deprecated -export function getMunicipality(options: GetMunicipalityByCodeParams): Promise<[string, string] | null>; - -// @public @deprecated -export function getMunicipality(options: GetMunicipalityByNameParams): Promise; - -// @public @deprecated -export function getMunicipality(options: GetMunicipalityParams): Promise<[string, string] | string | null>; - -// @public -export const getMunicipalityByCode: (code: string | number) => Municipality | null; - -// @public @deprecated -export type GetMunicipalityByCodeOptions = GetMunicipalityByCodeParams; - -// @public -export type GetMunicipalityByCodeParams = { - code: string | number; -}; - -// @public @deprecated -export type GetMunicipalityByNameOptions = GetMunicipalityByNameParams; - -// @public -export type GetMunicipalityByNameParams = { - municipalityName: string; - uf: string; -}; - -// @public @deprecated -export type GetMunicipalityOptions = GetMunicipalityParams; - -// @public -export type GetMunicipalityParams = GetMunicipalityByCodeParams | GetMunicipalityByNameParams; - -// @public -export const getNfeKeyInfo: (value: string) => NfeKeyInfo | null; - -// @public -export const getPixKeyInfo: (value: string) => PixKeyInfo | null; - -// @public -export const getPixPayloadInfo: (value: string) => PixPayloadInfo | null; - -// @public -export const getStateByIbgeCode: (code: string | number) => State | null; - -// @public -export const getStateCodeByName: (name: string) => StateCode | null; - -// @public -export const getStateNameByCode: (code: string) => StateName | null; - -// @public -export const getStates: () => State[]; - -// @public -export const getTimezoneByState: (stateCode: string) => string | null; - -// @public -export type Holiday = { - name: string; - date: Date; - type: HolidayType; -}; - -// @public -export type HolidayType = "national" | "state" | "optional" | "religious"; - -// @public -export type IbanInfo = { - countryCode: "BR"; - checkDigits: string; - bankIspb: string; - branch: string; - account: string; - accountType: string; - owner: string; -}; - -// @public -export const isBusinessDay: (value: Date, options?: BusinessDayOptions) => boolean; - -// @public -export const isHoliday: (options?: IsHolidayParams) => boolean; - -// @public @deprecated -export type IsHolidayOptions = IsHolidayParams; - -// @public -export type IsHolidayParams = { - targetDate: Date; - stateCode?: StateCode; -}; - -// @public -export const isValidBankAccount: (params: IsValidBankAccountParams) => boolean; - -// @public @deprecated -export type IsValidBankAccountOptions = IsValidBankAccountParams; - -// @public -export type IsValidBankAccountParams = { - bankCode: string; - agency: string; - account: string; - digit: string; -}; - -// @public -export const isValidBoleto: (value: string) => boolean; - -// @public -export const isValidCaepf: (value: string | number) => boolean; - -// @public -export const isValidCbo: (value: string | number) => boolean; - -// @public -export const isValidCei: (value: string | number) => boolean; - -// @public @deprecated -export const isValidCEP: typeof isValidCep; - -// @public -export const isValidCep: (cep: string | number) => boolean; - -// @public -export const isValidCertidao: (value: string, options?: IsValidCertidaoOptions) => boolean; - -// @public -export type IsValidCertidaoOptions = { - accept?: CertidaoType[]; -}; - -// @public -export const isValidCfop: (value: string | number) => boolean; - -// @public -export const isValidCnae: (value: string | number) => boolean; - -// @public -export const isValidCnh: (value: string) => boolean; - -// @public -export const isValidCno: (value: string | number) => boolean; - -// @public @deprecated -export const isValidCNPJ: typeof isValidCnpj; - -// @public -export const isValidCnpj: (cnpj: string, options?: IsValidCnpjOptions) => boolean; - -// @public -export type IsValidCnpjOptions = { - version?: 1 | 2; -}; - -// @public -export const isValidCns: (value: string | number) => boolean; - -// @public @deprecated -export const isValidCPF: typeof isValidCpf; - -// @public -export const isValidCpf: (cpf: string) => boolean; - -// @public -export const isValidCreditCard: (value: string | number) => boolean; - -// @public -export const isValidCsosn: (value: string | number) => boolean; - -// @public -export const isValidCst: (value: string | number, options?: IsValidCstOptions) => boolean; - -// @public -export type IsValidCstOptions = { - tax?: "icms" | "ipi" | "pis" | "cofins"; -}; - -// @public -export const isValidEmail: (value: string) => boolean; - -// @public -export const isValidIban: (value: string) => boolean; - -// @public @deprecated -export const isValidIE: typeof isValidIe; - -// @public -export function isValidIe(params: IsValidIeParams): boolean; - -// @public @deprecated -export function isValidIe(stateCode: StateCode, ie: string): boolean; - -// @public -export type IsValidIeParams = { - value: string; - stateCode: StateCode; -}; - -// @public -export const isValidLandlinePhone: (value: string) => boolean; - -// @public -export const isValidLegalNature: (code: string) => boolean; - -// @public -export const isValidLicensePlate: (value: string) => boolean; - -// @public -export const isValidMobilePhone: (value: string, options?: IsValidMobilePhoneOptions) => boolean; - -// @public -export type IsValidMobilePhoneOptions = { - version?: PhoneVersion; -}; - -// @public -export const isValidNcm: (value: string | number) => boolean; - -// @public -export const isValidNfeKey: (value: string) => boolean; - -// @public -export const isValidPassport: (passport: string | number) => boolean; - -// @public -export const isValidPhone: (value: string, options?: IsValidPhoneOptions) => boolean; - -// @public -export type IsValidPhoneOptions = { - version?: PhoneVersion; - accept?: PhoneType[]; -}; - -// @public @deprecated -export const isValidPIS: typeof isValidPis; - -// @public -export const isValidPis: (pis: string) => boolean; - -// @public -export const isValidPixKey: (value: string, options?: IsValidPixKeyOptions) => boolean; - -// @public -export type IsValidPixKeyOptions = { - accept?: PixKeyType[]; -}; - -// @public -export const isValidPixPayload: (value: string) => boolean; - -// @public -export const isValidProcessoJuridico: (value: string) => boolean; - -// @public -export const isValidRegistroProfissional: (params: IsValidRegistroProfissionalParams) => boolean; - -// @public -export type IsValidRegistroProfissionalParams = { - value: string; - council: RegistroProfissionalCouncil; - stateCode?: StateCode; -}; - -// @public -export const isValidRenavam: (renavam: string | number) => boolean; - -// @public -export const isValidServicePhone: (value: string) => boolean; - -// @public -export const isValidVin: (value: string) => boolean; - -// @public -export const isValidVoterId: (value: string) => boolean; - -// @public -export type LegalNature = { - code: string; - description: string; - category: LegalNatureCategory; -} & ({ - legacy: false; -} | { - legacy: true; - currentCode: string | null; -}); - -// @public -export type LegalNatureCategory = { - code: "1" | "2" | "3" | "4" | "5"; - description: string; -}; - -// @public -export type LicensePlateFormat = "LLLNNNN" | "LLLNLNN"; - -// @public -export type Municipality = { - code: string; - name: string; - stateCode: StateCode; -}; - -// @public -export type NfeKeyInfo = { - stateCode: StateCode; - year: number; - month: number; - taxId: string; - model: NfeKeyModel; - series: number; - number: number; - emissionType: number; - authorizationSite?: number; - code: string; - checkDigit: number; -}; - -// @public -export type NfeKeyModel = "55" | "57" | "58" | "62" | "63" | "64" | "65" | "66" | "67"; - -// @public -export type NumberToWordsGender = "masculine" | "feminine"; - -// @public -export const parseBoleto: (value: string | number) => string; - -// @public -export const parseCaepf: (value: string | number) => string; - -// @public -export const parseCbo: (value: string | number) => string; - -// @public -export const parseCei: (value: string | number) => string; - -// @public -export const parseCep: (value: string | number) => string; - -// @public -export const parseCertidao: (value: string | number) => string; - -// @public -export const parseCfop: (value: string | number) => string; - -// @public -export const parseCnae: (value: string | number) => string; - -// @public -export const parseCnh: (value: string | number) => string; - -// @public -export const parseCno: (value: string | number) => string; - -// @public -export const parseCnpj: (value: string | number, options?: ParseCnpjOptions) => string; - -// @public -export type ParseCnpjOptions = Pick; - -// @public -export const parseCns: (value: string | number) => string; - -// @public -export const parseCpf: (value: string | number) => string; - -// @public -export const parseCurrency: (value: string, options?: ParseCurrencyOptions) => number; - -// @public -export type ParseCurrencyOptions = { - precision?: number; -}; - -// @public -export const parseIban: (value: string | number) => string; - -// @public -export const parseLegalNature: (value: string | number) => string; - -// @public -export const parseLicensePlate: (value: string) => string; - -// @public -export const parseNcm: (value: string | number) => string; - -// @public -export const parseNfeKey: (value: string | number) => string; - -// @public -export const parsePassport: (passport: string) => string; - -// @public -export const parsePhone: (value: string | number) => string; - -// @public -export const parsePis: (value: string | number) => string; - -// @public -export const parseProcessoJuridico: (value: string | number) => string; - -// @public -export const parseVoterId: (value: string | number) => string; - -// @public -export type PhoneMask = "auto" | "e164" | "international" | "service" | "sn" | "nanp"; - -// @public -export type PhoneType = "mobile" | "landline" | "service"; - -// @public -export type PhoneVersion = 1 | 2; - -// @public -export type PixKeyInfo = { - type: PixKeyType; - value: string; -}; - -// @public -export type PixKeyType = "cpf" | "cnpj" | "email" | "phone" | "evp"; - -// @public -export type PixPayloadInfo = { - key?: string; - url?: string; - description?: string; - withdrawalFacilitator?: string; - merchantName: string; - merchantCity: string; - amount?: number; - txid?: string; - pointOfInitiation: PixPointOfInitiation; -}; - -// @public -export type PixPointOfInitiation = "static" | "dynamic"; - -// @public -export type RegistroProfissionalCouncil = "OAB" | "CRM" | "CRO" | "CRP" | "CRC"; - -// @public -export const removeAccents: (value: string) => string; - -// @public -export type StandardSchemaV1 = { - readonly "~standard": StandardSchemaV1Props; -}; - -// @public -export type StandardSchemaV1FailureResult = { - readonly issues: readonly StandardSchemaV1Issue[]; -}; - -// @public -export type StandardSchemaV1Issue = { - readonly message: string; - readonly path?: readonly (PropertyKey | StandardSchemaV1PathSegment)[]; -}; - -// @public -export type StandardSchemaV1Options = { - readonly libraryOptions?: Record; -}; - -// @public -export type StandardSchemaV1PathSegment = { - readonly key: PropertyKey; -}; - -// @public -export type StandardSchemaV1Props = { - readonly version: 1; - readonly vendor: string; - readonly validate: (value: unknown, options?: StandardSchemaV1Options) => StandardSchemaV1Result | Promise>; - readonly types?: StandardSchemaV1Types; -}; - -// @public -export type StandardSchemaV1Result = StandardSchemaV1SuccessResult | StandardSchemaV1FailureResult; - -// @public -export type StandardSchemaV1SuccessResult = { - readonly value: Output; - readonly issues?: undefined; -}; - -// @public -export type StandardSchemaV1Types = { - readonly input: Input; - readonly output: Output; -}; - -// @public -export type State = { - readonly code: "AC"; - readonly name: "Acre"; - readonly regionCode: "N"; - readonly regionName: "Norte"; - readonly ibgeCode: 12; -} | { - readonly code: "AL"; - readonly name: "Alagoas"; - readonly regionCode: "NE"; - readonly regionName: "Nordeste"; - readonly ibgeCode: 27; -} | { - readonly code: "AP"; - readonly name: "Amapá"; - readonly regionCode: "N"; - readonly regionName: "Norte"; - readonly ibgeCode: 16; -} | { - readonly code: "AM"; - readonly name: "Amazonas"; - readonly regionCode: "N"; - readonly regionName: "Norte"; - readonly ibgeCode: 13; -} | { - readonly code: "BA"; - readonly name: "Bahia"; - readonly regionCode: "NE"; - readonly regionName: "Nordeste"; - readonly ibgeCode: 29; -} | { - readonly code: "CE"; - readonly name: "Ceará"; - readonly regionCode: "NE"; - readonly regionName: "Nordeste"; - readonly ibgeCode: 23; -} | { - readonly code: "DF"; - readonly name: "Distrito Federal"; - readonly regionCode: "CO"; - readonly regionName: "Centro-Oeste"; - readonly ibgeCode: 53; -} | { - readonly code: "ES"; - readonly name: "Espírito Santo"; - readonly regionCode: "SE"; - readonly regionName: "Sudeste"; - readonly ibgeCode: 32; -} | { - readonly code: "GO"; - readonly name: "Goiás"; - readonly regionCode: "CO"; - readonly regionName: "Centro-Oeste"; - readonly ibgeCode: 52; -} | { - readonly code: "MA"; - readonly name: "Maranhão"; - readonly regionCode: "NE"; - readonly regionName: "Nordeste"; - readonly ibgeCode: 21; -} | { - readonly code: "MT"; - readonly name: "Mato Grosso"; - readonly regionCode: "CO"; - readonly regionName: "Centro-Oeste"; - readonly ibgeCode: 51; -} | { - readonly code: "MS"; - readonly name: "Mato Grosso do Sul"; - readonly regionCode: "CO"; - readonly regionName: "Centro-Oeste"; - readonly ibgeCode: 50; -} | { - readonly code: "MG"; - readonly name: "Minas Gerais"; - readonly regionCode: "SE"; - readonly regionName: "Sudeste"; - readonly ibgeCode: 31; -} | { - readonly code: "PA"; - readonly name: "Pará"; - readonly regionCode: "N"; - readonly regionName: "Norte"; - readonly ibgeCode: 15; -} | { - readonly code: "PB"; - readonly name: "Paraíba"; - readonly regionCode: "NE"; - readonly regionName: "Nordeste"; - readonly ibgeCode: 25; -} | { - readonly code: "PR"; - readonly name: "Paraná"; - readonly regionCode: "S"; - readonly regionName: "Sul"; - readonly ibgeCode: 41; -} | { - readonly code: "PE"; - readonly name: "Pernambuco"; - readonly regionCode: "NE"; - readonly regionName: "Nordeste"; - readonly ibgeCode: 26; -} | { - readonly code: "PI"; - readonly name: "Piauí"; - readonly regionCode: "NE"; - readonly regionName: "Nordeste"; - readonly ibgeCode: 22; -} | { - readonly code: "RJ"; - readonly name: "Rio de Janeiro"; - readonly regionCode: "SE"; - readonly regionName: "Sudeste"; - readonly ibgeCode: 33; -} | { - readonly code: "RN"; - readonly name: "Rio Grande do Norte"; - readonly regionCode: "NE"; - readonly regionName: "Nordeste"; - readonly ibgeCode: 24; -} | { - readonly code: "RS"; - readonly name: "Rio Grande do Sul"; - readonly regionCode: "S"; - readonly regionName: "Sul"; - readonly ibgeCode: 43; -} | { - readonly code: "RO"; - readonly name: "Rondônia"; - readonly regionCode: "N"; - readonly regionName: "Norte"; - readonly ibgeCode: 11; -} | { - readonly code: "RR"; - readonly name: "Roraima"; - readonly regionCode: "N"; - readonly regionName: "Norte"; - readonly ibgeCode: 14; -} | { - readonly code: "SC"; - readonly name: "Santa Catarina"; - readonly regionCode: "S"; - readonly regionName: "Sul"; - readonly ibgeCode: 42; -} | { - readonly code: "SP"; - readonly name: "São Paulo"; - readonly regionCode: "SE"; - readonly regionName: "Sudeste"; - readonly ibgeCode: 35; -} | { - readonly code: "SE"; - readonly name: "Sergipe"; - readonly regionCode: "NE"; - readonly regionName: "Nordeste"; - readonly ibgeCode: 28; -} | { - readonly code: "TO"; - readonly name: "Tocantins"; - readonly regionCode: "N"; - readonly regionName: "Norte"; - readonly ibgeCode: 17; -}; - -// @public -export type StateCode = State["code"]; - -// @public -export type StateName = State["name"]; - -// @public -export const subBusinessDays: (date: Date, amount: number, options?: BusinessDayOptions) => Date | null; - -// @public -export const toStandardSchema: (validate: (value: Value, options?: Options) => boolean, config?: ToStandardSchemaOptions) => StandardSchemaV1; - -// @public -export type ToStandardSchemaOptions = { - options?: Options; - message?: string; -}; - -// (No @packageDocumentation comment for this package) - -``` diff --git a/scripts/api.ts b/scripts/api.ts new file mode 100644 index 000000000..f8fd4725e --- /dev/null +++ b/scripts/api.ts @@ -0,0 +1,990 @@ +#!/usr/bin/env node + +/** + * Validates the public API of the local build (`dist/brazilian-utils.d.ts`, so run + * `npm run build` first) and compares it with the last release published on npm. + * + * Usage: + * node scripts/api.ts + * + * 1. Runs API Extractor with the settings of `api-extractor.json`: a type the public API refers to + * without exporting (`ae-forgotten-export`), a public declaration without a doc comment + * (`ae-undocumented`) and a compiler error in the bundled declarations fail. It runs as a local + * build, so it never compares against a committed report: the report is written to a temporary + * directory outside the repository and deleted at the end. + * 2. Downloads `@brazilian-utils/brazilian-utils@latest` with `npm pack` into the same temporary + * directory and checks, with the repository's `tsc`, that this build can replace it without + * breaking a consumer (see `renderBreakingCheck` for the rules). A breaking change fails, unless + * `package.json` is already on a higher major version than the published one. + * 3. Prints the declarations added, removed and changed since that release (from the two API + * Extractor reports) to stdout and, in GitHub Actions, to the job summary. Informational only. + * + * Exit code 1 means a check failed; exit code 2 means the check itself could not run (no build, + * registry unreachable, unreadable tarball). A package that was never published skips steps 2-3. + */ + +import { execFile } from "node:child_process"; +import { existsSync } from "node:fs"; +import { appendFile, mkdir, mkdtemp, readdir, readFile, rm, writeFile } from "node:fs/promises"; +import { tmpdir } from "node:os"; +import { join, relative, resolve } from "node:path"; + +import { + Extractor, + ExtractorConfig, + ExtractorLogLevel, + ExtractorMessageCategory, +} from "@microsoft/api-extractor"; + +const rootDir = resolve(import.meta.dirname, ".."); + +/** The outcome of a child process: its exit status and output. */ +type RunResult = { + ok: boolean; + stdout: string; + stderr: string; +}; + +const run = (command: string, args: string[], cwd = rootDir): Promise => + new Promise((_resolve) => { + execFile(command, args, { cwd, maxBuffer: 64 * 1024 * 1024 }, (error, stdout, stderr) => { + _resolve({ ok: error === null, stdout, stderr: stderr || (error?.message ?? "") }); + }); + }); + +const packageName = "@brazilian-utils/brazilian-utils"; +const entryName = "brazilian-utils"; +const reportFileName = `${entryName}.api.md`; + +/** Exit code of a check that ran and failed. */ +const FAILURE_EXIT_CODE = 1; + +/** Exit code of a check that could not run (no build, registry unreachable, bad tarball). */ +const ERROR_EXIT_CODE = 2; + +/** One exported declaration of an API Extractor report, overloads merged into one entry. */ +type Declaration = { + name: string; + kind: "value" | "type" | "class"; + text: string; + generic: boolean; +}; + +/** How consumers receive a named type: as something they pass in, get back, or both. */ +type Role = "input" | "output"; + +/** The subpath entry points of a package, and every declaration file of it joined. */ +type Subpaths = { + entries: Map; + sources: string; +}; + +/** One assertion of the generated type-check file, so a compiler error maps back to a reason. */ +type Assertion = { + code: string; + reason: string; +}; + +class CheckError extends Error {} + +const readJson = async (path: string): Promise => JSON.parse(await readFile(path, "utf8")); + +const readVersion = async (packageJsonPath: string): Promise => { + const parsed = await readJson(packageJsonPath); + + if ( + typeof parsed !== "object" || + parsed === null || + !("version" in parsed) || + typeof parsed.version !== "string" + ) { + throw new CheckError(`${packageJsonPath} has no version`); + } + + return parsed.version; +}; + +const major = (version: string): number => Number.parseInt(version.split(".")[0] ?? "", 10); + +/** + * Runs API Extractor over one `.d.ts` entry point and returns the path of the report it wrote. + * @param {object} options - What to extract and where. + * @param {string} options.configPath - The `api-extractor.json` whose settings are used. + * @param {string} options.reportDir - The directory the report is written to. + * @param {string} [options.packageDir] - The root of a package other than this repository (the + * published tarball): its entry point is used, its compiler errors and messages are ignored. + * @returns {Promise<{ succeeded: boolean; reportPath: string }>} Whether the run had no error, and + * the report path. + */ +const extract = async ({ + configPath, + reportDir, + packageDir, +}: { + configPath: string; + reportDir: string; + packageDir?: string; +}): Promise<{ succeeded: boolean; reportPath: string }> => { + await mkdir(reportDir, { recursive: true }); + + const configObject = ExtractorConfig.loadFile(configPath); + configObject.apiReport = { + enabled: true, + reportFolder: reportDir, + reportTempFolder: join(reportDir, "temp"), + reportFileName, + }; + + if (packageDir !== undefined) { + configObject.projectFolder = packageDir; + configObject.mainEntryPointFilePath = join(packageDir, "dist", `${entryName}.d.ts`); + configObject.compiler = { + overrideTsconfig: { + compilerOptions: { + lib: ["ESNext", "DOM"], + target: "ESNext", + module: "ESNext", + moduleResolution: "bundler", + strict: true, + skipLibCheck: true, + }, + }, + }; + configObject.messages = { + compilerMessageReporting: { default: { logLevel: ExtractorLogLevel.None } }, + extractorMessageReporting: { + default: { logLevel: ExtractorLogLevel.None, addToApiReportFile: false }, + }, + tsdocMessageReporting: { default: { logLevel: ExtractorLogLevel.None } }, + }; + } + + const config = ExtractorConfig.prepare({ + configObject, + configObjectFullPath: packageDir === undefined ? configPath : join(packageDir, "api.json"), + packageJsonFullPath: join(packageDir ?? rootDir, "package.json"), + }); + const result = Extractor.invoke(config, { + localBuild: true, + messageCallback: (message) => { + message.handled = true; + + const reported = + message.category !== ExtractorMessageCategory.Console && + (message.logLevel === ExtractorLogLevel.Error || + message.logLevel === ExtractorLogLevel.Warning); + + if (packageDir === undefined && reported) { + console.error(`${message.logLevel}: ${message.formatMessageWithLocation(rootDir)}`); + } + }, + }); + + return { succeeded: result.succeeded, reportPath: join(reportDir, reportFileName) }; +}; + +const DECLARATION_PATTERN = + /^export (?:declare )?(?:abstract )?(const|let|var|function|class|enum|type|interface|namespace) ([\w$]+)(<)?/m; + +const kindOf = (keyword: string): Declaration["kind"] => { + if (keyword === "class") return "class"; + return keyword === "type" || keyword === "interface" ? "type" : "value"; +}; + +/** + * Reads the declarations of an API Extractor report: the fenced block is one declaration per + * paragraph, each preceded by its `// @public` line; overloads are consecutive paragraphs. + * @param {string} report - The report file contents. + * @returns {Map} The declarations by exported name. + */ +const parseReport = (report: string): Map => { + const body = /```ts\n([\s\S]*)\n```/.exec(report)?.[1] ?? ""; + const declarations = new Map(); + + for (const paragraph of body.split(/\n{2,}/)) { + const match = DECLARATION_PATTERN.exec(paragraph); + + if (match === null) continue; + + const [, keyword = "", name = "", generic] = match; + const text = paragraph.trim(); + const existing = declarations.get(name); + + if (existing === undefined) { + declarations.set(name, { name, kind: kindOf(keyword), text, generic: generic === "<" }); + } else { + existing.text = `${existing.text}\n\n${text}`; + } + } + + if (declarations.size === 0) { + throw new CheckError( + "The API Extractor report has no declarations; its format may have changed", + ); + } + + return declarations; +}; + +const identifiers = (text: string): Set => new Set(text.match(/[A-Za-z_$][\w$]*/g) ?? []); + +/** + * Splits the text of a function declaration into its parameter list and its return type. + * @param {string} signature - One signature, from the first `(` to the end. + * @returns {{ params: string; returns: string } | null} The two parts, or null when the text is not + * a call signature. + */ +const splitSignature = (signature: string): { params: string; returns: string } | null => { + const start = signature.indexOf("("); + + if (start === -1) return null; + + let depth = 0; + for (let index = start; index < signature.length; index++) { + const char = signature[index]; + + if (char === "(") depth += 1; + if (char === ")") depth -= 1; + if (depth === 0) { + return { + params: signature.slice(start + 1, index), + returns: signature.slice(index + 1).replace(/^\s*(?:=>|:)/, ""), + }; + } + } + + return null; +}; + +/** + * Marks the types one signature of a value export refers to: in a parameter (of a function or a + * constructor) as input, in a return type or a non-function type as output. An alias of another + * export (`typeof formatCep`) marks nothing, the export it names does. + * @param {string} signature - One paragraph of the report, a single signature. + * @param {Function} mark - Marks the exported types the given text refers to with a role. + */ +const markSignature = (signature: string, mark: (text: string, role: Role) => void): void => { + const code = signature.replaceAll(/^\/\/.*\n/gm, ""); + const typeText = code.replace(DECLARATION_PATTERN, "").replace(/^\s*:/, ""); + const constructors = code.match(/constructor\([^)]*\)/g); + + if (/^\s*typeof /.test(typeText)) return; + if (constructors !== null) { + for (const constructorText of constructors) mark(constructorText, "input"); + return; + } + + const parts = splitSignature(typeText); + + if (parts === null) { + mark(typeText, "output"); + return; + } + + mark(parts.params, "input"); + mark(parts.returns, "output"); +}; + +/** + * Finds which exported types consumers pass in (they appear in a parameter of an exported + * function or constructor) and which they get back (a return type, a thrown class, or a type + * reached from a non-function export), following the types each type refers to. A type nothing + * refers to that only renames another one (`type GetHolidaysOptions = GetHolidaysParams`) takes the + * roles of the type it renames. + * @param {Map} declarations - The published declarations. + * @returns {Map>} The roles of every type that has one. + */ +const typeRoles = (declarations: Map): Map> => { + const typeNames = new Set( + [...declarations.values()].filter((d) => d.kind !== "value").map((d) => d.name), + ); + const roles = new Map>(); + const pending: [string, Role][] = []; + const mark = (text: string, role: Role): void => { + for (const name of identifiers(text)) { + if (typeNames.has(name)) pending.push([name, role]); + } + }; + + for (const declaration of declarations.values()) { + if (declaration.kind === "type") continue; + if (declaration.kind === "class") pending.push([declaration.name, "output"]); + + for (const signature of declaration.text.split(/\n\n/)) markSignature(signature, mark); + } + + while (pending.length > 0) { + const [name, role] = pending.pop() ?? ["", "input"]; + const known = roles.get(name) ?? new Set(); + + if (known.has(role)) continue; + + known.add(role); + roles.set(name, known); + mark(declarations.get(name)?.text.replace(DECLARATION_PATTERN, "") ?? "", role); + } + + for (const declaration of declarations.values()) { + const target = /^export type [\w$]+ = ([\w$]+);$/m.exec(declaration.text)?.[1]; + const targetRoles = target === undefined ? undefined : roles.get(target); + + if (!roles.has(declaration.name) && targetRoles !== undefined) { + roles.set(declaration.name, targetRoles); + } + } + + return roles; +}; + +/** + * Lists the subpath entry points of a package (`dist/.d.ts`, imported as + * `@brazilian-utils/brazilian-utils/`): every declaration file but the root and the shared + * chunks the others import. + * @param {string} distDir - The `dist` directory. + * @returns {Promise} The contents of each entry by subpath, and every declaration file + * joined (to find what a re-exported name is). + */ +const readSubpaths = async (distDir: string): Promise => { + const allFiles = await readdir(distDir); + const files = allFiles.filter((file) => file.endsWith(".d.ts")).sort(); + const texts = await Promise.all(files.map((file) => readFile(join(distDir, file), "utf8"))); + const entries = new Map( + files.map((file, index) => [file.slice(0, -".d.ts".length), texts[index] ?? ""]), + ); + + entries.delete(entryName); + for (const text of texts) { + for (const [, chunk = ""] of text.matchAll(/from "\.\/([^"]+)\.js"/g)) entries.delete(chunk); + } + + return { entries, sources: texts.join("\n") }; +}; + +const EXPORT_PATTERN = + /^export (?:declare )?(?:abstract )?(const|let|var|function|class|enum|type|interface|namespace) ([\w$]+)/gm; + +/** + * Reads the names a subpath declaration file exports, split into values and types. A name + * re-exported from a shared chunk without the `type` modifier is looked up in `sources`. + * @param {string} subpath - The subpath, for the error message. + * @param {string} text - The declaration file contents. + * @param {string} sources - Every declaration file of the package, joined. + * @returns {{ values: string[]; types: string[] }} The exported names. + */ +const subpathExports = ( + subpath: string, + text: string, + sources: string, +): { values: string[]; types: string[] } => { + const values = new Set(); + const types = new Set(); + const isTypeDeclaration = (name: string): boolean => { + const escaped = name.replaceAll("$", String.raw`\$`); + return new RegExp( + String.raw`^(?:export )?(?:declare )?(?:type|interface) ${escaped}\b`, + "m", + ).test(sources); + }; + + for (const [, keyword = "", name = ""] of text.matchAll(EXPORT_PATTERN)) { + (kindOf(keyword) === "type" ? types : values).add(name); + } + for (const [, typeOnly, list = ""] of text.matchAll(/^export (type )?\{([^}]*)\}/gm)) { + for (const item of list.split(",")) { + const parts = item.trim().split(/\s+/); + const name = parts.at(-1) ?? ""; + const isType = typeOnly !== undefined || parts[0] === "type" || isTypeDeclaration(name); + + if (name !== "") (isType ? types : values).add(name); + } + } + + if (values.size === 0 && types.size === 0) { + throw new CheckError( + `Found no export in the published ${subpath}.d.ts; its format may have changed`, + ); + } + + return { values: [...values].sort(), types: [...types].sort() }; +}; + +const identifier = (value: string): string => value.replaceAll(/[^\w$]/g, "_"); + +const moduleSpecifier = (fromDir: string, file: string): string => { + const path = relative(fromDir, file).replaceAll("\\", "/"); + return path.startsWith(".") ? path : `./${path}`; +}; + +/** + * Lists what a published subpath entry point no longer ships in this build: its files, then the + * names it exported. + * @param {object} options - The subpath to compare. + * @param {string} options.subpath - The subpath. + * @param {string} options.text - Its published declaration file. + * @param {string | undefined} options.current - Its declaration file in this build, if any. + * @param {Subpaths} options.baseSubpaths - The published subpath entry points. + * @param {Subpaths} options.headSubpaths - The subpath entry points of this build. + * @param {string[]} options.removed - Receives one line per missing file or name. + * @returns {string[]} The published value exports this build still has, to type-check. + */ +const compareSubpath = ({ + subpath, + text, + current, + baseSubpaths, + headSubpaths, + removed, +}: { + subpath: string; + text: string; + current: string | undefined; + baseSubpaths: Subpaths; + headSubpaths: Subpaths; + removed: string[]; +}): string[] => { + for (const extension of [".js", ".cjs", ".d.ts", ".d.cts"]) { + if (!existsSync(join(rootDir, "dist", `${subpath}${extension}`))) { + removed.push(`subpath "${subpath}": dist/${subpath}${extension} is no longer built`); + } + } + if (current === undefined) return []; + + const published = subpathExports(subpath, text, baseSubpaths.sources); + const exported = subpathExports(subpath, current, headSubpaths.sources); + const currentNames = new Set([...exported.values, ...exported.types]); + + for (const name of [...published.values, ...published.types]) { + if (!currentNames.has(name)) + removed.push(`subpath "${subpath}": \`${name}\` is no longer exported`); + } + + return published.values.filter((name) => currentNames.has(name)); +}; + +/** + * Builds the assertions a consumer of the published version relies on, as TypeScript that only + * compiles when this build can replace it: + * - every value export still exists and is assignable to the published one, so a parameter can + * only be widened or become optional, a new parameter must be optional, and a return type can + * only keep or narrow its values; + * - a function's return type does not narrow either (union of all overloads): a consumer that + * stored the result in an inferred variable (`let bank = getBankByCode(code)`) and later assigns + * the old type to it (`bank = null`) would stop compiling; + * - every type export still exists under the same name; one only passed in may widen (the published + * type is assignable to the new one), any other must be equivalent (assignable both ways), so a + * type consumers receive or build keeps its shape (new properties must be optional); + * - every subpath entry point still exists and exports the same names, its values with the same + * guarantees (its types are the root ones, checked above). + * @param {object} options - What to compare. + * @param {string} options.checkDir - The directory the generated file is written to. + * @param {string} options.baseDir - The published package root. + * @param {Map} options.base - The published declarations. + * @param {Map} options.head - The declarations of this build. + * @param {Subpaths} options.baseSubpaths - The published subpath entry points. + * @param {Subpaths} options.headSubpaths - The subpath entry points of this build. + * @returns {{ source: string; assertions: Assertion[]; removed: string[]; skipped: string[] }} The + * generated file, the assertion behind each line, what this build no longer ships, and the generic + * types whose shape is only shown in the diff (they cannot be named without type arguments). + */ +const renderBreakingCheck = ({ + checkDir, + baseDir, + base, + head, + baseSubpaths, + headSubpaths, +}: { + checkDir: string; + baseDir: string; + base: Map; + head: Map; + baseSubpaths: Subpaths; + headSubpaths: Subpaths; +}): { source: string; assertions: Assertion[]; removed: string[]; skipped: string[] } => { + const header = [ + "type Assignable = [Target, Source];", + "type Returns = F extends {", + "\t(...args: never[]): infer R1;", + "\t(...args: never[]): infer R2;", + "\t(...args: never[]): infer R3;", + "\t(...args: never[]): infer R4;", + "}", + "\t? R1 | R2 | R3 | R4", + "\t: F extends (...args: never[]) => infer R", + "\t\t? R", + "\t\t: never;", + ]; + const assertions: Assertion[] = []; + const removed: string[] = []; + const skipped: string[] = []; + const imports: string[] = []; + const roles = typeRoles(base); + + const addModule = (label: string, alias: string, subpath: string, names: string[]): void => { + const oldAlias = `Old${alias}`; + const newAlias = `New${alias}`; + + const file = `${subpath}.js`; + const oldSpecifier = moduleSpecifier(checkDir, join(baseDir, "dist", file)); + const newSpecifier = moduleSpecifier(checkDir, join(rootDir, "dist", file)); + + imports.push( + `import type * as ${oldAlias} from "${oldSpecifier}";`, + `import * as ${newAlias} from "${newSpecifier}";`, + ); + for (const name of names) { + const id = `${alias}_${identifier(name)}`; + assertions.push( + { + code: `const _value_${id}: typeof ${oldAlias}.${name} = ${newAlias}.${name};`, + reason: `${label}: \`${name}\` is not assignable to the published one (a parameter became required or narrower, a required parameter was added, or the return type widened)`, + }, + { + code: `type _returns_${id} = Assignable, Returns>;`, + reason: `${label}: \`${name}\` can no longer return everything the published one did (the return type narrowed, or a returned object gained a required property), so a variable inferred from its result no longer holds the published type`, + }, + ); + } + }; + + for (const declaration of base.values()) { + if (!head.has(declaration.name)) { + removed.push(`root: \`${declaration.name}\` is no longer exported`); + } + } + + addModule( + "root", + "", + entryName, + [...base.values()].filter((d) => d.kind !== "type" && head.has(d.name)).map((d) => d.name), + ); + + for (const type of base.values()) { + const name = type.name; + const typeRole = roles.get(name); + + if (type.kind === "value" || !head.has(name)) continue; + if (type.generic) { + skipped.push(name); + continue; + } + + assertions.push({ + code: `type _widens_${identifier(name)} = Assignable;`, + reason: `root: type \`${name}\` rejects values the published type accepts (a union member was removed, a property became required or narrower, or a required property was added)`, + }); + if (typeRole === undefined || typeRole.has("output")) { + assertions.push({ + code: `type _narrows_${identifier(name)} = Assignable;`, + reason: `root: type \`${name}\` (${typeRole === undefined ? "used by no function" : "returned or thrown"}, so it keeps its shape) accepts values the published type rejects (a union member was added, or a property was removed or widened)`, + }); + } + } + + for (const [subpath, text] of baseSubpaths.entries) { + const current = headSubpaths.entries.get(subpath); + const kept = compareSubpath({ subpath, text, current, baseSubpaths, headSubpaths, removed }); + + if (current === undefined) continue; + + addModule(`subpath "${subpath}"`, `_${identifier(subpath)}`, subpath, kept); + } + + const source = [...header, ...imports, ...assertions.map((a) => a.code), ""].join("\n"); + return { source, assertions, removed, skipped }; +}; + +/** + * Type-checks the generated file with the repository's `tsc` and maps each error to its reason. + * @param {string} checkDir - The directory holding the generated file. + * @param {string} source - The generated file contents. + * @param {Assertion[]} assertions - The assertion behind each line, in file order. + * @param {Map} labels - Short names for the absolute paths in compiler messages. + * @returns {Promise} One message per failed assertion, empty when none failed. + * @throws {CheckError} When `tsc` reports an error the generated file cannot explain, and when it + * exits non-zero without reporting one at all (a tsconfig error, a missing input, a compiler that + * did not start): an empty result would otherwise read as "no breaking change". + */ +const typeCheck = async ( + checkDir: string, + source: string, + assertions: Assertion[], + labels: Map, +): Promise => { + const file = join(checkDir, "check.ts"); + await writeFile(file, source); + await writeFile( + join(checkDir, "tsconfig.json"), + JSON.stringify({ + compilerOptions: { + lib: ["ESNext", "DOM"], + target: "ESNext", + module: "ESNext", + moduleResolution: "bundler", + strict: true, + noEmit: true, + skipLibCheck: true, + types: [], + }, + files: ["check.ts"], + }), + ); + + const tsc = join(rootDir, "node_modules", "typescript", "bin", "tsc"); + const { + ok, + stdout: output, + stderr, + } = await run(process.execPath, [tsc, "-p", checkDir, "--pretty", "false"]); + + const lines = source.split("\n"); + const byLine = new Map(assertions.map((a) => [lines.indexOf(a.code) + 1, a])); + const failures = new Map(); + let current: string[] | undefined; + + for (const line of output.split("\n")) { + const match = /^(.+?)\((\d+),\d+\): error (TS\d+: .*)$/.exec(line); + + if (match === null) { + if (current !== undefined && line.trim() !== "") current.push(line.trim()); + continue; + } + + const [, errorFile = "", lineNumber = "0", message = ""] = match; + + if (resolve(rootDir, errorFile) !== file || !byLine.has(Number(lineNumber))) { + throw new CheckError(`Unexpected compiler error in the generated check:\n${line}`); + } + + current = failures.get(Number(lineNumber)) ?? []; + current.push(message); + failures.set(Number(lineNumber), current); + } + + if (!ok && failures.size === 0) { + throw new CheckError( + `The generated check did not compile and reported no assertion:\n${output}${stderr}`.trim(), + ); + } + + return [...failures] + .sort(([a], [b]) => a - b) + .map(([lineNumber, messages]) => { + const assertion = byLine.get(lineNumber); + const details = messages.map((message) => { + let short = message; + for (const [path, label] of labels) short = short.replaceAll(path, label); + return ` ${short}`; + }); + return `- ${assertion?.reason ?? ""}\n${details.join("\n")}`; + }); +}; + +/** + * A line diff (longest common subsequence) of two declarations, for the reviewer summary. + * @param {string} before - The published text. + * @param {string} after - The current text. + * @returns {string} The lines prefixed with `-`, `+` or a space. + */ +const lineDiff = (before: string, after: string): string => { + const a = before.split("\n"); + const b = after.split("\n"); + const lengths = Array.from({ length: a.length + 1 }, () => + Array.from({ length: b.length + 1 }).fill(0), + ); + + for (let i = a.length - 1; i >= 0; i--) { + for (let j = b.length - 1; j >= 0; j--) { + const row = lengths[i] ?? []; + row[j] = + a[i] === b[j] + ? (lengths[i + 1]?.[j + 1] ?? 0) + 1 + : Math.max(lengths[i + 1]?.[j] ?? 0, row[j + 1] ?? 0); + } + } + + const lines: string[] = []; + let i = 0; + let j = 0; + const removesNext = (): boolean => + j >= b.length || (lengths[i + 1]?.[j] ?? 0) >= (lengths[i]?.[j + 1] ?? 0); + + while (i < a.length || j < b.length) { + if (i < a.length && j < b.length && a[i] === b[j]) { + lines.push(` ${a[i]}`); + i += 1; + j += 1; + } else if (i < a.length && removesNext()) { + lines.push(`- ${a[i]}`); + i += 1; + } else { + lines.push(`+ ${b[j]}`); + j += 1; + } + } + + return lines.join("\n"); +}; + +const fence = (language: string, blocks: string[]): string[] => [ + `\`\`\`${language}`, + blocks.join("\n\n"), + "```", + "", +]; + +/** + * Renders the declarations added, removed and changed between two reports as Markdown. + * @param {string} version - The published version compared against. + * @param {Map} base - The published declarations. + * @param {Map} head - The current declarations. + * @returns {string} The Markdown summary. + */ +const renderDiff = ( + version: string, + base: Map, + head: Map, +): string => { + const added = [...head.values()].filter((d) => !base.has(d.name)); + const removed = [...base.values()].filter((d) => !head.has(d.name)); + const changed = [...head.values()].filter((d) => { + const before = base.get(d.name); + return before !== undefined && before.text !== d.text; + }); + const lines = [`## Public API changes since ${version}`, ""]; + + if (added.length + removed.length + changed.length === 0) { + lines.push(`No declaration of the public API changed since ${version}.`, ""); + return lines.join("\n"); + } + + lines.push( + `${added.length} added, ${removed.length} removed, ${changed.length} changed (from the API Extractor reports of \`${packageName}@${version}\` and of this build).`, + "", + ); + if (added.length > 0) { + lines.push( + `### Added (${added.length})`, + "", + ...fence( + "ts", + added.map((d) => d.text), + ), + ); + } + if (removed.length > 0) { + lines.push( + `### Removed (${removed.length})`, + "", + ...fence( + "ts", + removed.map((d) => d.text), + ), + ); + } + if (changed.length > 0) { + lines.push( + `### Changed (${changed.length})`, + "", + ...fence( + "diff", + changed.map((d) => lineDiff(base.get(d.name)?.text ?? "", d.text)), + ), + ); + } + + return lines.join("\n"); +}; + +/** + * Asks the registry for the version behind the `latest` tag. + * @returns {Promise} The version, or null when the package was never published. + */ +/** + * Keeps the lines of an npm failure that say what went wrong, without the stack and log path. + * @param {string} stderr - The npm error output. + * @returns {string} The error code and message lines. + */ +const npmError = (stderr: string): string => { + const lines = stderr + .split("\n") + .filter((line) => /^npm error (?:code |\d{3} |FetchError|request to|network)/.test(line)); + + return lines.length > 0 ? lines.join("\n") : stderr.trim(); +}; + +const latestVersion = async (): Promise => { + const result = await run("npm", ["view", `${packageName}@latest`, "version", "--json"]); + + if (!result.ok) { + if (/\bE404\b/.test(`${result.stdout}${result.stderr}`)) return null; + + throw new CheckError( + `Could not fetch ${packageName}@latest from the npm registry, which the breaking-change check compares against. Check the network connection and retry.\n${npmError(result.stderr)}`, + ); + } + + const parsed: unknown = JSON.parse(result.stdout); + + if (typeof parsed !== "string") { + throw new CheckError(`Unexpected \`npm view\` output: ${result.stdout}`); + } + + return parsed; +}; + +const packedFilename = (stdout: string): string => { + const parsed: unknown = JSON.parse(stdout); + const first: unknown = Array.isArray(parsed) ? parsed.at(0) : undefined; + + if (typeof first === "object" && first !== null && "filename" in first) { + return String(first.filename); + } + + throw new CheckError(`Unexpected \`npm pack\` output: ${stdout}`); +}; + +/** + * Downloads and extracts one published version of the package. + * @param {string} version - The version to download. + * @param {string} dir - The directory to extract it into. + * @returns {Promise} The root of the extracted package. + */ +const downloadPackage = async (version: string, dir: string): Promise => { + await mkdir(dir, { recursive: true }); + + const packed = await run( + "npm", + ["pack", `${packageName}@${version}`, "--json", "--pack-destination", dir], + dir, + ); + + if (!packed.ok) { + throw new CheckError( + `Could not download ${packageName}@${version}. Check the network connection and retry.\n${npmError(packed.stderr)}`, + ); + } + + const extracted = await run("tar", ["-xzf", join(dir, packedFilename(packed.stdout)), "-C", dir]); + const packageDir = join(dir, "package"); + + if (!extracted.ok || !existsSync(join(packageDir, "dist", `${entryName}.d.ts`))) { + throw new CheckError( + `Could not extract dist/${entryName}.d.ts from ${packageName}@${version}.\n${extracted.stderr.trim()}`, + ); + } + + return packageDir; +}; + +const writeSummary = async (markdown: string): Promise => { + console.log(`\n${markdown}`); + + const summaryPath = process.env["GITHUB_STEP_SUMMARY"]; + + if (summaryPath !== undefined && summaryPath !== "") { + await appendFile(summaryPath, `${markdown}\n`); + } +}; + +const main = async (workDir: string): Promise => { + if (!existsSync(join(rootDir, "dist", `${entryName}.d.ts`))) { + throw new CheckError(`Missing dist/${entryName}.d.ts. Run \`npm run build\` first.`); + } + + const configPath = join(rootDir, "api-extractor.json"); + const head = await extract({ configPath, reportDir: join(workDir, "head") }); + + if (!head.succeeded) { + console.error( + "\nAPI Extractor reported errors in the public API (see above): export every type the API refers to, document every public declaration, fix any compiler error.", + ); + return FAILURE_EXIT_CODE; + } + + console.log("API Extractor: every public declaration is documented and exported."); + + const version = await latestVersion(); + + if (version === null) { + console.log( + `${packageName} was never published: nothing to compare the public API against, skipping the breaking-change check.`, + ); + return 0; + } + + const localVersion = await readVersion(join(rootDir, "package.json")); + console.log( + version === localVersion + ? `Comparing against ${packageName}@${version}, the version package.json is on: the release is the contract, so every change since it is checked.` + : `Comparing against ${packageName}@${version} (package.json is at ${localVersion}).`, + ); + + const baseDir = await downloadPackage(version, join(workDir, "base")); + const baseRun = await extract({ + configPath, + reportDir: join(workDir, "base-report"), + packageDir: baseDir, + }); + + if (!baseRun.succeeded) { + throw new CheckError(`API Extractor could not read ${packageName}@${version}`); + } + + const base = parseReport(await readFile(baseRun.reportPath, "utf8")); + const current = parseReport(await readFile(head.reportPath, "utf8")); + const checkDir = join(workDir, "check"); + await mkdir(checkDir, { recursive: true }); + + const { source, assertions, removed, skipped } = renderBreakingCheck({ + checkDir, + baseDir, + base, + head: current, + baseSubpaths: await readSubpaths(join(baseDir, "dist")), + headSubpaths: await readSubpaths(join(rootDir, "dist")), + }); + const labels = new Map([ + [join(baseDir, "dist"), `${packageName}@${version}/dist`], + [join(rootDir, "dist"), "dist"], + ]); + const failures = [ + ...removed.map((reason) => `- ${reason}`), + ...(await typeCheck(checkDir, source, assertions, labels)), + ]; + if (skipped.length > 0) { + console.log(`Generic types compared in the diff only: ${skipped.join(", ")}.`); + } + + const allowed = major(localVersion) > major(version); + const diff = renderDiff(version, base, current); + + if (failures.length === 0) { + await writeSummary(diff); + console.log( + `\nNo breaking change against ${version}: ${assertions.length} type assertions hold.`, + ); + return 0; + } + + const acceptance = allowed + ? `, accepted because package.json is on a new major version (${localVersion})` + : ""; + const verdict = `${failures.length} breaking change(s) against ${version}${acceptance}:`; + + await writeSummary(`${diff}\n### Breaking changes\n\n${verdict}\n\n${failures.join("\n")}\n`); + + return allowed ? 0 : FAILURE_EXIT_CODE; +}; + +const workDir = await mkdtemp(join(tmpdir(), "brazilian-utils-api-")); + +try { + process.exitCode = await main(workDir); +} catch (error) { + console.error(error instanceof Error ? error.message : String(error)); + process.exitCode = ERROR_EXIT_CODE; +} finally { + await rm(workDir, { recursive: true, force: true }); +} diff --git a/scripts/cest.ts b/scripts/cest.ts new file mode 100644 index 000000000..037381d88 --- /dev/null +++ b/scripts/cest.ts @@ -0,0 +1,344 @@ +#!/usr/bin/env node + +import { writeFile } from "node:fs/promises"; +import { resolve } from "node:path"; + +import { decodeEntities } from "./decode-entities.ts"; +import { fetchSortedRecord } from "./fetch-sorted-record.ts"; +import { removeUntilStable } from "./remove-until-stable.ts"; + +const scriptsDir = import.meta.dirname; + +const SOURCE_URL = "https://www.confaz.fazenda.gov.br/legislacao/convenios/2018/CV142_18"; + +/** An annex heading, e.g. `

ANEXO XVII

`. */ +const ANNEX_HEADING_REGEX = /

]*>\s*ANEXO ([IVX]+)\s*<\/p>/g; + +const ROW_REGEX = /]*>(.*?)<\/tr>/gs; +const CELL_REGEX = /]*>(.*?)<\/td>/gs; +const COMMENT_REGEX = //g; +const TAG_REGEX = /<[^>]+>/g; + +/** Anexo I names the segments; Anexos II to XXVI list the goods of one segment each. */ +const SEGMENTS_ANNEX = "I"; +const FIRST_GOODS_ANNEX = "II"; +const LAST_GOODS_ANNEX = "XXVI"; +const GOODS_ANNEXES = 25; + +/** A CEST the way the annexes print it, e.g. `01.001.00`. */ +const CEST_REGEX = /^(\d{2})\.(\d{3})\.(\d{2})$/; + +const SEGMENT_CODE_REGEX = /^\d{2}$/; + +/** + * CONFAZ keeps every superseded wording of a row next to the one in force. It prints them with + * the green `A9-...verde` paragraph classes, but not consistently (the previous rows of items + * 2.1, 2.3, 11.0 and 24.0 of Anexo XVII carry the classes of the text in force), so the note row + * that introduces a wording is read as well: "Redação anterior ..." and "Redação original ..." + * head a superseded row, "Nova redação ...", "Acrescido ..." and "Revogado ..." head the row in + * force. + * + * Both classes are looked for inside a `class` attribute rather than anywhere in the row, so a + * description that happens to carry the word ("milho verde") does not drop the row. + */ +const SUPERSEDED_CLASS_REGEX = /class="[^"]*verde[^"]*"/; +const NOTE_CLASS_REGEX = /class="[^"]*Remiss[^"]*"/; +const SUPERSEDED_NOTE_REGEX = /^Redação (?:anterior|original)/; + +/** A revoked item keeps its row, with this word in place of the description. */ +const REVOKED_MARKER = "REVOGADO"; + +/** + * The date an amendment takes effect from, e.g. `efeitos a partir de 01.02.25`. CONFAZ also + * drops "a partir de" (`efeitos 01.06.21. a 31.08.24`, Anexo IV item 5.0) and writes the first + * day of a month as an ordinal (`1º.01.27`), so all three spellings are read. + */ +const EFFECTIVE_FROM_REGEX = /efeitos(?: a partir)?(?: de)? (1[º°o]|\d{2})\.(\d{2})\.(\d{2})\b/g; + +/** The line under the title that lists every convênio the consolidated text carries. */ +const AMENDED_BY_REGEX = /

]*>(\s*Alterado pel.*?)<\/p>/s; + +const TRAILING_PUNCTUATION_REGEX = /[.;\s]+$/; + +/** + * Smallest number of codes a complete set of annexes yields. The consolidated text carries 1040 + * today, so a result far below it means the markup changed and the row patterns above stopped + * matching, not that codes were revoked. + */ +const MINIMUM_CODES = 1000; + +/** + * Turns a fragment of the page into the text it renders as. Comments and tags are removed + * repeatedly until nothing changes, since a single pass leaves the outer markup of a nested or + * overlapping match behind. + * @param {string} fragment - The markup to read the text out of. + * @returns {string} The text of `fragment`, entities decoded and whitespace collapsed. + */ +const toText = (fragment: string): string => { + const withoutComments = removeUntilStable(fragment, COMMENT_REGEX); + const withoutTags = removeUntilStable(withoutComments, TAG_REGEX); + + return decodeEntities(withoutTags).replaceAll(/\s+/g, " ").trim(); +}; + +/** Widest a line of the generated header may get, its ` * ` prefix left out. */ +const COMMENT_WIDTH = 90; + +const wrapComment = (text: string): string => { + const lines: string[] = []; + let line = ""; + + for (const word of text.split(" ")) { + if (line !== "" && line.length + word.length + 1 > COMMENT_WIDTH) { + lines.push(line); + line = ""; + } + + line = line === "" ? word : `${line} ${word}`; + } + + return [...lines, line].join("\n * "); +}; + +type Annex = { + numeral: string; + html: string; +}; + +const splitAnnexes = (html: string): Annex[] => { + const headings = [...html.matchAll(ANNEX_HEADING_REGEX)]; + + return headings.map((heading, index) => ({ + numeral: heading[1] ?? "", + html: html.slice(heading.index, headings[index + 1]?.index ?? html.length), + })); +}; + +type Row = { + cells: string[]; + isSuperseded: boolean; + isNote: boolean; +}; + +const readRows = (html: string): Row[] => + [...html.matchAll(ROW_REGEX)].map((row) => { + const markup = row[1] ?? ""; + + return { + cells: [...markup.matchAll(CELL_REGEX)].map((cell) => toText(cell[1] ?? "")), + isSuperseded: SUPERSEDED_CLASS_REGEX.test(markup), + isNote: NOTE_CLASS_REGEX.test(markup), + }; + }); + +/** + * Reads Anexo I, whose rows are `ITEM | NOME DO SEGMENTO | CÓDIGO DO SEGMENTO`. The item number + * and the segment code stopped matching when segments were dropped (item 15 is segment 16), and + * the first two digits of a CEST are the segment code, so the table is keyed by the last column. + * + * Superseded rows are skipped the same way the goods annexes skip them, so a re-worded segment + * name cannot be overwritten by the previous wording CONFAZ keeps under it. + * @param {string} html - The markup of Anexo I. + * @returns {Record} The segment names, keyed by the 2 digit segment code. + */ +const parseSegments = (html: string): Record => { + const segments: Record = {}; + let isNextSuperseded = false; + + for (const { cells, isSuperseded, isNote } of readRows(html)) { + const [item, name, code] = cells; + + if ( + cells.length !== 3 || + name === undefined || + code === undefined || + !SEGMENT_CODE_REGEX.test(code) + ) { + isNextSuperseded = isNote && SUPERSEDED_NOTE_REGEX.test(item ?? ""); + continue; + } + + const isCurrent = !isSuperseded && !isNextSuperseded; + isNextSuperseded = false; + + if (!isCurrent) continue; + + if (code in segments) { + throw new Error(`Segment ${code} of Anexo ${SEGMENTS_ANNEX} is listed twice as in force`); + } + + segments[code] = name; + } + + return segments; +}; + +/** + * Fails when an amendment note announces a wording that is not in force yet: the row under it + * would be read as current while the previous wording still applies, so a maintainer has to + * look at it rather than the table silently running ahead of the law. Every annex read into the + * generated file goes through it, Anexo I included, since a segment can be re-worded too. + * @param {string} html - The markup of an annex. + * @param {Date} today - The generation date. + */ +const assertNoPendingAmendment = (html: string, today: Date): void => { + for (const [, day, month, year] of toText(html).matchAll(EFFECTIVE_FROM_REGEX)) { + const effectiveFrom = new Date( + Date.UTC(2000 + Number(year), Number(month) - 1, Number.parseInt(day, 10)), + ); + + if (effectiveFrom > today) { + throw new Error( + `CEST annexes carry an amendment that only takes effect on ${day}.${month}.${year}; review which wording is in force before regenerating`, + ); + } + } +}; + +/** + * Reads the rows in force of one goods annex, `ITEM | CEST | NCM/SH | DESCRIÇÃO`, into `goods`. + * The annexes share one record so that a CEST listed in two of them fails the same way a CEST + * listed twice in one of them does. + * @param {Annex} annex - One of Anexos II to XXVI. + * @param {Record} segments - The segments of Anexo I. + * @param {Record} goods - The descriptions read so far, keyed by the 7 digits. + * The rows in force of `annex` are added to it. + */ +const parseGoods = ( + annex: Annex, + segments: Record, + goods: Record, +): void => { + let annexSegment: string | undefined; + let isNextSuperseded = false; + + for (const { cells, isSuperseded, isNote } of readRows(annex.html)) { + const [, cest, , description] = cells; + const match = CEST_REGEX.exec(cest ?? ""); + + if (!match) { + isNextSuperseded = isNote && SUPERSEDED_NOTE_REGEX.test(cells[0] ?? ""); + continue; + } + + const isCurrent = !isSuperseded && !isNextSuperseded; + isNextSuperseded = false; + + if (!isCurrent || description === undefined) continue; + if (description.toUpperCase().startsWith(REVOKED_MARKER)) continue; + + const [, segment, item, specification] = match; + const code = `${segment}${item}${specification}`; + + annexSegment ??= segment; + + if (segment !== annexSegment || segments[segment] === undefined) { + throw new Error( + `CEST ${cest} of Anexo ${annex.numeral} does not belong to the segment of its annex`, + ); + } + + if (description === "" || code in goods) { + throw new Error( + `CEST ${cest} of Anexo ${annex.numeral} is empty or listed twice as in force`, + ); + } + + goods[code] = description.replace(TRAILING_PUNCTUATION_REGEX, ""); + } +}; + +const main = async (): Promise => { + let segments: Record = {}; + let amendedBy = ""; + + const table = await fetchSortedRecord(SOURCE_URL, "CEST annexes", async (response) => { + const today = new Date(); + const html = await response.text(); + const annexes = splitAnnexes(html); + const numerals = annexes.map(({ numeral }) => numeral); + const goodsAnnexes = annexes.slice( + numerals.indexOf(FIRST_GOODS_ANNEX), + numerals.indexOf(LAST_GOODS_ANNEX) + 1, + ); + const segmentsAnnex = annexes.find(({ numeral }) => numeral === SEGMENTS_ANNEX)?.html ?? ""; + + assertNoPendingAmendment(segmentsAnnex, today); + segments = parseSegments(segmentsAnnex); + amendedBy = toText(AMENDED_BY_REGEX.exec(html)?.[1] ?? ""); + + if (amendedBy === "" || goodsAnnexes.length !== GOODS_ANNEXES) { + throw new Error("CEST page lost its amendment line or one of Anexos II to XXVI"); + } + + const data: Record = {}; + + for (const annex of goodsAnnexes) { + assertNoPendingAmendment(annex.html, today); + parseGoods(annex, segments, data); + } + + const count = Object.keys(data).length; + + if (count < MINIMUM_CODES) { + throw new Error( + `CEST annexes yielded ${count} codes, below the ${MINIMUM_CODES} a complete set holds; the markup probably changed`, + ); + } + + return data; + }); + + const sortedSegments: Record = {}; + + for (const code of Object.keys(segments).sort()) { + sortedSegments[code] = segments[code]; + } + + await writeFile( + resolve(scriptsDir, "..", "./src/_internals/constants/cest.ts"), + `/** + * CEST (Código Especificador da Substituição Tributária) table, indexed by the 7 digit code. + * + * Built from Anexos II to XXVI of Convênio ICMS 142/18, the consolidated text in force, which + * CONFAZ heads with this line: + * ${wrapComment(`"${amendedBy}"`)} + * + * Only the wording in force of each item is kept: the superseded wordings CONFAZ prints next + * to it and the items marked "REVOGADO" are left out. The NCM/SH column of the annexes is not + * carried. + * + * Both tables below are built in ascending code order, which is not the order they read in: + * JavaScript lists the keys of an object that look like array indexes before the rest, so + * segments 10 to 28 come first and segments 01 to 09 follow, as in \`cbo.ts\` and \`cnae.ts\`. + * + * Generated by \`node ./scripts/cest.ts\`. Do not edit by hand. + * + * @see Official: ${SOURCE_URL} + * Convênio ICMS 142/18, the consolidated text and its annexes. + */ +export const CEST_TABLE: Record = ${JSON.stringify(table)}; + +/** + * Segment names of Anexo I of Convênio ICMS 142/18, indexed by the 2 digit segment code, which + * is the first two digits of every CEST of the segment. + * + * @see Official: ${SOURCE_URL} + * Anexo I, "Segmentos de mercadorias". + */ +export const CEST_SEGMENTS: Record = ${JSON.stringify(sortedSegments)}; + +/** + * Shape a CEST has to be written in: the 7 digits, optionally split into segment, item and + * specification by a single whitespace or mask character, the way the annexes print them + * ("01.001.00"). + */ +export const CEST_FORMAT_REGEX = /^\\d{2}[\\s.\\-/]?\\d{3}[\\s.\\-/]?\\d{2}$/; +`, + ); +}; + +await main().catch((error) => { + console.error(error instanceof Error ? error.message : error); + process.exit(1); +}); diff --git a/scripts/cfop.ts b/scripts/cfop.ts index 87ae66c3c..55ff4b64d 100644 --- a/scripts/cfop.ts +++ b/scripts/cfop.ts @@ -3,6 +3,7 @@ import { writeFile } from "node:fs/promises"; import { resolve } from "node:path"; +import { decodeEntities } from "./decode-entities.ts"; import { fetchSortedRecord } from "./fetch-sorted-record.ts"; const scriptsDir = import.meta.dirname; @@ -22,18 +23,6 @@ const CURRENT_TEXT_PARAGRAPH_REGEX = /

([^<]*)<\/p>/g; */ const MINIMUM_OPERABLE_CODES = 600; -const HTML_ENTITIES: Record = { - "&": "&", - "<": "<", - ">": ">", - """: '"', - "'": "'", - " ": " ", -}; - -const decodeEntities = (text: string): string => - text.replaceAll(/&(?:amp|lt|gt|quot|#39|nbsp);/g, (entity) => HTML_ENTITIES[entity] ?? entity); - /** A code line, e.g. `1.101 - Compra para industrialização ou produção rural.`. */ const CODE_LINE_REGEX = /^(\d)\.(\d{3})\s*[-–]\s*(.+)$/; diff --git a/scripts/cid10.ts b/scripts/cid10.ts new file mode 100644 index 000000000..49b5b10e2 --- /dev/null +++ b/scripts/cid10.ts @@ -0,0 +1,295 @@ +#!/usr/bin/env node + +import { createHash } from "node:crypto"; +import { writeFile } from "node:fs/promises"; +import { resolve } from "node:path"; +import { setTimeout as delay } from "node:timers/promises"; +import { inflateRawSync } from "node:zlib"; + +import { sortRecord } from "./sort-record.ts"; + +const scriptsDir = import.meta.dirname; + +/** The official CSVs are published in ISO-8859-1, not UTF-8. */ +const CID10_CSV_DECODER = new TextDecoder("iso-8859-1"); + +/** + * DATASUS serves this host over plain HTTP only: port 443 times out and neither + * `datasus.saude.gov.br` nor `tabnet.datasus.gov.br` publishes the archive. The download is kept + * in this script, on its own `fetch`, so that plain HTTP never reaches the library's + * `fetch-with-retry`, and every byte is checked against `CID10_ZIP_SHA256` before it is read. + */ +// oxlint-disable-next-line sonarjs/no-clear-text-protocols -- see the comment above +const CID10_ZIP_URL = "http://www2.datasus.gov.br/cid10/V2008/downloads/CID10CSV.zip"; + +/** + * SHA-256 of the reviewed CID-10 V2008 archive, whose files are dated October 2007. It is what + * makes the plain HTTP download safe: any other content fails the run, including this generator's + * step of the weekly `Update datasets` job, which then opens no pull request for the other + * datasets either. When DATASUS publishes a revision, a maintainer reviews the new archive, puts + * its digest here and regenerates the tables with `node ./scripts/cid10.ts`. + */ +const CID10_ZIP_SHA256 = "84f23809275575f751255048064bbb244b0de33fd5987ab98df0f98e5f5d2c95"; + +/** How many times the download is retried, and the delay each retry waits for. */ +const CID10_DOWNLOAD_RETRIES = 2; +const CID10_RETRY_DELAY_MS = 1000; + +/** + * Statuses the DATASUS server answers with while it is busy or restarting, not while it is + * saying no. Anything else is taken as the answer it means to give. + */ +const CID10_RETRYABLE_STATUSES = new Set([429, 500, 502, 503, 504]); + +const CID10_CODE_REGEX = /^[A-Z]\d{2}\d?$/; + +const CATEGORY_LENGTH = 3; + +const ZIP_END_OF_CENTRAL_DIRECTORY_SIGNATURE = 0x06_05_4b_50; +const ZIP_CENTRAL_FILE_HEADER_SIGNATURE = 0x02_01_4b_50; +const ZIP_END_OF_CENTRAL_DIRECTORY_LENGTH = 22; +const ZIP_CENTRAL_FILE_HEADER_LENGTH = 46; +const ZIP_LOCAL_FILE_HEADER_LENGTH = 30; +const ZIP_METHOD_STORED = 0; +const ZIP_METHOD_DEFLATED = 8; + +type Cid10Table = { + /** The file name inside `CID10CSV.zip`. */ + file: string; + /** The header of the column that holds the code. */ + codeColumn: string; +}; + +const CID10_TABLES: Cid10Table[] = [ + { file: "CID-10-CATEGORIAS.CSV", codeColumn: "CAT" }, + { file: "CID-10-SUBCATEGORIAS.CSV", codeColumn: "SUBCAT" }, +]; + +const CID10_DESCRIPTION_COLUMN = "DESCRICAO"; + +/** + * Requests the archive, retrying the DATASUS host, which drops connections and answers 503 + * often enough that a single attempt fails the weekly run. Written here rather than with + * `fetchWithRetry` so the plain HTTP URL stays inside this script. + * @param {number} [attempt] - Which attempt this is, counting from zero. + * @returns {Promise} The first response that is not a transient failure, or the last + * one once the retries are spent. + */ +const fetchZip = async (attempt = 0): Promise => { + const lastAttempt = attempt >= CID10_DOWNLOAD_RETRIES; + + try { + const response = await fetch(CID10_ZIP_URL); + + if (lastAttempt || !CID10_RETRYABLE_STATUSES.has(response.status)) return response; + } catch (error) { + if (lastAttempt) throw error; + } + + await delay(CID10_RETRY_DELAY_MS * (attempt + 1)); + + return fetchZip(attempt + 1); +}; + +/** + * Downloads the official archive and returns it only when it is byte for byte the reviewed one. + * @returns {Promise} The archive whose SHA-256 is `CID10_ZIP_SHA256`. + */ +const downloadZip = async (): Promise => { + const response = await fetchZip(); + + if (!response.ok) { + throw new Error(`CID-10 zip request failed with status ${response.status}`); + } + + const zip = Buffer.from(await response.arrayBuffer()); + const digest = createHash("sha256").update(zip).digest("hex"); + + if (digest !== CID10_ZIP_SHA256) { + throw new Error(`CID-10 zip has the SHA-256 ${digest}, not the reviewed ${CID10_ZIP_SHA256}`); + } + + return zip; +}; + +/** + * Finds the end of central directory record of a zip archive, which sits at the very end of + * the file, before an optional archive comment. + * @param {Buffer} zip - The whole archive. + * @returns {number} The offset of the record. + */ +const findEndOfCentralDirectory = (zip: Buffer): number => { + for (let offset = zip.length - ZIP_END_OF_CENTRAL_DIRECTORY_LENGTH; offset >= 0; offset--) { + if (zip.readUInt32LE(offset) === ZIP_END_OF_CENTRAL_DIRECTORY_SIGNATURE) return offset; + } + + throw new Error("CID-10 zip has no end of central directory record"); +}; + +/** + * Reads the entries of a zip archive through its central directory, with no dependency: the + * DATASUS archive only uses the stored and deflated methods, which `node:zlib` covers. + * @param {Buffer} zip - The whole archive. + * @returns {Record} The uncompressed content of every entry, by file name. + */ +const unzip = (zip: Buffer): Record => { + const end = findEndOfCentralDirectory(zip); + const entries = zip.readUInt16LE(end + 10); + const files: Record = {}; + let offset = zip.readUInt32LE(end + 16); + + for (let entry = 0; entry < entries; entry++) { + if (zip.readUInt32LE(offset) !== ZIP_CENTRAL_FILE_HEADER_SIGNATURE) { + throw new Error("CID-10 zip has a malformed central directory"); + } + + const method = zip.readUInt16LE(offset + 10); + const compressedSize = zip.readUInt32LE(offset + 20); + const nameLength = zip.readUInt16LE(offset + 28); + const extraLength = zip.readUInt16LE(offset + 30); + const commentLength = zip.readUInt16LE(offset + 32); + const localOffset = zip.readUInt32LE(offset + 42); + const nameStart = offset + ZIP_CENTRAL_FILE_HEADER_LENGTH; + const name = zip.toString("latin1", nameStart, nameStart + nameLength); + const dataStart = + localOffset + + ZIP_LOCAL_FILE_HEADER_LENGTH + + zip.readUInt16LE(localOffset + 26) + + zip.readUInt16LE(localOffset + 28); + const data = zip.subarray(dataStart, dataStart + compressedSize); + + if (method === ZIP_METHOD_DEFLATED) { + files[name] = inflateRawSync(data); + } else if (method === ZIP_METHOD_STORED) { + files[name] = data; + } else { + throw new Error(`CID-10 zip entry "${name}" uses the unsupported method ${method}`); + } + + offset = nameStart + nameLength + extraLength + commentLength; + } + + return files; +}; + +/** + * Reads the code and `DESCRICAO` columns of one of the official CID-10 CSVs into `data`. The + * files are plain `;` separated tables with no quoting: a `"` in a description is literal. + * @param {string} csv - The decoded CSV. + * @param {Cid10Table} table - Which file this is and where its code is. + * @param {Record} data - The record the rows are added to. + * @returns {number} How many rows were read. + */ +const parseCsv = (csv: string, table: Cid10Table, data: Record): number => { + const [header = "", ...rows] = csv.split(/\r?\n/); + const columns = header.trim().split(";"); + const codeIndex = columns.indexOf(table.codeColumn); + const descriptionIndex = columns.indexOf(CID10_DESCRIPTION_COLUMN); + + if (codeIndex === -1 || descriptionIndex === -1) { + throw new Error( + `${table.file} header has no "${table.codeColumn}" or "${CID10_DESCRIPTION_COLUMN}" column`, + ); + } + + let count = 0; + + for (const row of rows) { + const fields = row.split(";"); + const code = (fields[codeIndex] ?? "").trim(); + const description = (fields[descriptionIndex] ?? "").trim(); + + if (!CID10_CODE_REGEX.test(code) || description === "") continue; + + data[code] = description; + count++; + } + + return count; +}; + +/** + * Builds the compact validity table: every category, with the fourth characters of its + * subcategories. A category with no subcategory maps to an empty string. + * @param {string[]} codes - Every category and subcategory code, sorted. + * @returns {Record} The fourth characters of each category's subcategories. + */ +const groupSubcategories = (codes: string[]): Record => { + const subcategories: Record = {}; + + for (const code of codes) { + const category = code.slice(0, CATEGORY_LENGTH); + + subcategories[category] = (subcategories[category] ?? "") + code.slice(CATEGORY_LENGTH); + } + + return subcategories; +}; + +const main = async (): Promise => { + const files = unzip(await downloadZip()); + const data: Record = {}; + + for (const table of CID10_TABLES) { + const file = files[table.file]; + + if (file === undefined) throw new Error(`CID-10 zip has no ${table.file}`); + + if (parseCsv(CID10_CSV_DECODER.decode(file), table, data) === 0) { + throw new Error(`${table.file} holds no code`); + } + } + + const sorted = sortRecord(data); + const subcategories = groupSubcategories(Object.keys(sorted)); + + await writeFile( + resolve(scriptsDir, "..", "./src/_internals/constants/cid10-descriptions.ts"), + `/** + * CID-10 (Classificação Estatística Internacional de Doenças e Problemas Relacionados à Saúde, + * 10th revision) descriptions in Brazilian Portuguese, indexed by the code without the dot: the + * 3 character categories (\`A00\`) and the 4 character subcategories (\`A000\`, printed \`A00.0\`). + * + * Built from \`CID-10-CATEGORIAS.CSV\` and \`CID-10-SUBCATEGORIAS.CSV\`, the two \`;\` separated + * ISO-8859-1 tables DATASUS publishes inside \`CID10CSV.zip\` (CID-10 V2008). The descriptions are + * the \`DESCRICAO\` column, as published. A category with no subcategory is listed by both files + * with the same description and shows up once here. + * + * This table is about 1 MB, so it has a module of its own: \`CID10_SUBCATEGORIES\`, which holds + * the same codes without the descriptions, lives in \`cid10.ts\` and never loads this one. + * + * Generated by \`node ./scripts/cid10.ts\`. Do not edit by hand. + * + * @see Official: http://www2.datasus.gov.br/cid10/V2008/downloads/CID10CSV.zip + * The CID-10 tables in CSV, as published by DATASUS (Ministério da Saúde). + * @see Official: http://www2.datasus.gov.br/cid10/V2008/descrcsv.htm + * The DATASUS page that links the archive and documents its files, columns and encoding. + */ +export const CID10_DESCRIPTIONS: Record = ${JSON.stringify(sorted)}; +`, + ); + + await writeFile( + resolve(scriptsDir, "..", "./src/_internals/constants/cid10.ts"), + `/** + * Every CID-10 category, with the fourth characters of its subcategories: \`A00: "019"\` stands + * for \`A00.0\`, \`A00.1\` and \`A00.9\`, and an empty string for a category that is not + * subdivided. It holds the same codes as \`CID10_DESCRIPTIONS\` without the descriptions, so that + * checking a code does not cost the whole table. + * + * Generated by \`node ./scripts/cid10.ts\`. Do not edit by hand. + * + * @see Official: http://www2.datasus.gov.br/cid10/V2008/downloads/CID10CSV.zip + * The CID-10 tables in CSV, as published by DATASUS (Ministério da Saúde). + * @see Official: http://www2.datasus.gov.br/cid10/V2008/descrcsv.htm + * The DATASUS page that links the archive and documents its files, columns and encoding. + */ +export const CID10_SUBCATEGORIES: Record = ${JSON.stringify(subcategories)}; +`, + ); +}; + +await main().catch((error) => { + console.error(error instanceof Error ? error.message : error); + process.exit(1); +}); diff --git a/scripts/data.ts b/scripts/data.ts index 850c569d0..3a870ae0a 100644 --- a/scripts/data.ts +++ b/scripts/data.ts @@ -22,20 +22,31 @@ const run = (command: string, args: string[]): Promise => const generators = [ "banks.ts", "cbo.ts", + "cest.ts", "cfop.ts", + "cid10.ts", "cities.ts", "cnae.ts", + "ibs-cbs.ts", "legal-natures.ts", + "nbs.ts", "ncm.ts", + "service-items.ts", "states.ts", ]; const generatedFiles = [ "./src/_internals/constants/banks.ts", "./src/_internals/constants/cbo.ts", + "./src/_internals/constants/cest.ts", "./src/_internals/constants/cfop.ts", + "./src/_internals/constants/cid10-descriptions.ts", + "./src/_internals/constants/cid10.ts", "./src/_internals/constants/cities.ts", "./src/_internals/constants/cnae.ts", + "./src/_internals/constants/ibs-cbs.ts", + "./src/_internals/constants/nbs.ts", + "./src/_internals/constants/service-items.ts", "./src/_internals/constants/states.ts", "./src/is-valid-legal-nature/constants.ts", "./src/is-valid-ncm/constants.ts", diff --git a/scripts/decode-entities.ts b/scripts/decode-entities.ts new file mode 100644 index 000000000..fa54771db --- /dev/null +++ b/scripts/decode-entities.ts @@ -0,0 +1,18 @@ +const HTML_ENTITIES: Record = { + "&": "&", + "<": "<", + ">": ">", + """: '"', + "'": "'", + " ": " ", +}; + +/** + * Decodes the handful of HTML entities the CONFAZ pages use. Shared by the dataset generator + * scripts that read a table out of the HTML of a convênio or an ajuste. + * + * @param {string} text - The text of an HTML fragment, tags already removed. + * @returns {string} The text with its entities replaced by the characters they stand for. + */ +export const decodeEntities = (text: string): string => + text.replaceAll(/&(?:amp|lt|gt|quot|#39|nbsp);/g, (entity) => HTML_ENTITIES[entity] ?? entity); diff --git a/scripts/decode-xml.ts b/scripts/decode-xml.ts new file mode 100644 index 000000000..46febeff7 --- /dev/null +++ b/scripts/decode-xml.ts @@ -0,0 +1,29 @@ +const XML_ENTITIES: Record = { + "&": "&", + "<": "<", + ">": ">", + """: '"', + "'": "'", +}; + +const MAXIMUM_CODE_POINT = 0x10_ff_ff; + +/** + * Decodes the five entities of XML and the numeric character references a writer other than + * Excel emits, ` ` and `é` alike. Anything else is left as it is. Shared by the xlsx + * reader and the generators that read a listing page of a government portal. + * + * @param {string} text - The text as the XML carries it. + * @returns {string} The decoded text. + */ +export const decodeXml = (text: string): string => + text.replaceAll(/&(?:amp|lt|gt|quot|apos|#\d+|#x[\da-fA-F]+);/g, (entity) => { + if (!entity.startsWith("&#")) return XML_ENTITIES[entity] ?? entity; + + const reference = entity.slice(2, -1); + const code = reference.startsWith("x") + ? Number.parseInt(reference.slice(1), 16) + : Number(reference); + + return code <= MAXIMUM_CODE_POINT ? String.fromCodePoint(code) : entity; + }); diff --git a/scripts/examples.ts b/scripts/examples.ts index b56568e44..2cdbb56b9 100644 --- a/scripts/examples.ts +++ b/scripts/examples.ts @@ -4,7 +4,7 @@ * Writes the examples the document field guide shows (`docs/guides/document-field.md`): one * focused example per document and framework, so a reader copies the CPF field, not a generic one * that has to be narrowed down first. Every file comes from a template in - * `docs/snippets/document-field/_templates`, filled in from the table below, together with the + * `docs/snippets/document-field/templates`, filled in from the table below, together with the * `mask` function they share. One page runs them all in the browser, `docs/snippets/live`, told * which files to compile by its query string. The Check workflow fails when these are stale. * @@ -17,7 +17,7 @@ import { join } from "node:path"; const ROOT = join(import.meta.dirname, ".."); const EXAMPLE_DIR = join(ROOT, "docs", "snippets", "document-field"); -const TEMPLATE_DIR = join(EXAMPLE_DIR, "_templates"); +const TEMPLATE_DIR = join(EXAMPLE_DIR, "templates"); type Document = { /** The kebab-case name of the document, which names its folder and its files. */ @@ -184,11 +184,15 @@ function values(document: Document): Record { } /** - * @param {string} name - A file of `docs/snippets/document-field/_templates`. + * A template carries `@@placeholder@@` markers, so it is not the language its name says it is: + * `schema/zod.ts` on its own does not parse as TypeScript. The extra `.tmpl` at the end keeps it + * out of every tool that walks the repository for `.ts`/`.tsx` files, the declaration build of the + * package included, while the extension before it still says what the filled in file will be. + * @param {string} name - A file of `docs/snippets/document-field/templates`, without the `.tmpl`. * @returns {string} Its contents. */ function readTemplate(name: string): string { - return readFileSync(join(TEMPLATE_DIR, name), "utf8"); + return readFileSync(join(TEMPLATE_DIR, `${name}.tmpl`), "utf8"); } /** diff --git a/scripts/fetch-sorted-record.ts b/scripts/fetch-sorted-record.ts index 9d969eb27..ee4be714b 100644 --- a/scripts/fetch-sorted-record.ts +++ b/scripts/fetch-sorted-record.ts @@ -1,4 +1,5 @@ import { fetchWithRetry } from "../src/_internals/fetch-with-retry/fetch-with-retry.ts"; +import { sortRecord } from "./sort-record.ts"; /** * Fetches a dataset with retry, fails when the response is not ok, and returns the parsed @@ -23,12 +24,5 @@ export const fetchSortedRecord = async ( throw new Error(`${label} request failed with status ${response.status}`); } - const data = await parse(response); - const sorted: Record = {}; - - for (const key of Object.keys(data).sort()) { - sorted[key] = data[key]; - } - - return sorted; + return sortRecord(await parse(response)); }; diff --git a/scripts/ibs-cbs.ts b/scripts/ibs-cbs.ts new file mode 100644 index 000000000..3ceed81ad --- /dev/null +++ b/scripts/ibs-cbs.ts @@ -0,0 +1,331 @@ +#!/usr/bin/env node + +import { writeFile } from "node:fs/promises"; +import { resolve } from "node:path"; + +import { fetchWithRetry } from "../src/_internals/fetch-with-retry/fetch-with-retry.ts"; +import { decodeXml } from "./decode-xml.ts"; +import { readXlsxSheets } from "./read-xlsx-sheet.ts"; +import { serializeRecord } from "./serialize-record.ts"; + +const scriptsDir = import.meta.dirname; + +const PORTAL = "https://www.nfe.fazenda.gov.br/portal/"; + +/** "Documentos" > "Diversos" of the Portal Nacional da NF-e, where every table version is listed. */ +const TABLES_LISTING = `${PORTAL}listaConteudo.aspx?tipoConteudo=/NJarYc9nus=`; + +/** "Documentos" > "Informes Técnicos", where every version of the Informe Técnico 2025.002 is listed. */ +const INFORMES_LISTING = `${PORTAL}listaConteudo.aspx?tipoConteudo=hXzemuyNHW4=`; + +/** + * The portal answers a request without this cookie with a redirect that only sets it, and a + * request that then arrives without an ASP.NET session with a redirect to the home page. + * Sending the cookie up front gets the page in one request. + */ +const PORTAL_HEADERS = { Cookie: "AspxAutoDetectCookieSupport=1" }; + +const ANCHOR_REGEX = /]*href="(exibirArquivo\.aspx\?conteudo=[^"]*)"[^>]*>([\s\S]*?)<\/a>/g; + +/** + * The listing title of a table version. The wording changed between versions ("Tabela de Código + * de Classificação Tributária do IBS/CBS", "Tabela de Classificação Tributária do IBS e CBS"), + * so only the stable part is matched. + */ +const TABLE_TITLE_REGEX = + /Tabela de (?:Código de )?Classificação Tributária do IBS.*Publicada em (\d{2})\/(\d{2})\/(\d{4})/; + +const INFORME_TITLE_REGEX = + /Informe Técnico 2025\.002\s*-?\s*v\.(\d+\.\d+).*Publicado em (\d{2})\/(\d{2})\/(\d{4})/; + +/** + * Smallest number of rows a complete table yields. The table published on 23/06/2026 carries 18 + * CST codes and 164 classifications, and new versions only add rows or close them with a + * `dFimVig`, so a result far below it means the workbook layout changed, not that codes were + * revoked. + */ +const MINIMUM_CST_CODES = 15; +const MINIMUM_CLASSIFICATIONS = 150; + +const CST_HEADER = "CST-IBS/CBS"; +const CST_DESCRIPTION_HEADER = "Descrição CST-IBS/CBS"; +const CLASS_TRIB_HEADER = "cClassTrib"; +const CLASS_TRIB_NAME_HEADER = "Nome cClassTrib"; +const CLASS_TRIB_DESCRIPTION_HEADER = "Descrição cClassTrib"; +const START_OF_VALIDITY_HEADER = "dIniVig"; +const END_OF_VALIDITY_HEADER = "dFimVig"; + +const normalizeText = (text: string): string => text.replaceAll(/\s+/g, " ").trim(); + +type Listing = { + /** Absolute download URL. */ + url: string; + /** The title the portal lists the file under. */ + title: string; + /** Publication date as `yyyy-mm-dd`, which sorts chronologically. */ + publishedAt: string; + /** The groups the title regex captured. */ + groups: string[]; +}; + +/** + * Reads a listing page of the portal and returns the newest entry whose title matches. + * @param {string} listingUrl - The listing page. + * @param {RegExp} titleRegex - Matches the title; its last three groups are day, month and year. + * @returns {Promise

} The entry with the latest publication date. + */ +const fetchLatestListing = async (listingUrl: string, titleRegex: RegExp): Promise => { + const response = await fetchWithRetry(listingUrl, { headers: PORTAL_HEADERS }); + + if (!response.ok) { + throw new Error(`Portal da NF-e listing request failed with status ${response.status}`); + } + + const html = await response.text(); + const listings: Listing[] = []; + + for (const [, href = "", body = ""] of html.matchAll(ANCHOR_REGEX)) { + const title = normalizeText(decodeXml(body.replaceAll(/<[^>]+>/g, " "))); + const match = titleRegex.exec(title); + + if (match === null) continue; + + const groups = match.slice(1); + const [day, month, year] = groups.slice(-3); + + listings.push({ + url: new URL(decodeXml(href).replaceAll(" ", "+"), PORTAL).href, + title, + publishedAt: `${year}-${month}-${day}`, + groups, + }); + } + + const [latest] = listings.sort((a, b) => b.publishedAt.localeCompare(a.publishedAt)); + + if (latest === undefined) { + throw new Error(`No entry of ${listingUrl} matches ${titleRegex.source}; the listing changed`); + } + + return latest; +}; + +type Row = Record; + +/** + * Turns the rows of a worksheet into records keyed by the text of its header row (the first + * one). Every cell is whitespace-normalised and an empty one is left out. + * @param {string[][]} rows - The rows of the worksheet. + * @returns {Row[]} One record per data row. + */ +const toRecords = (rows: string[][]): Row[] => { + const [header = [], ...body] = rows.map((cells) => cells.map((cell) => normalizeText(cell))); + + return body.map((cells) => { + const row: Row = {}; + + for (const [column, value] of cells.entries()) { + const key = header[column]; + + if (key !== undefined && key !== "" && value !== "") row[key] = value; + } + + return row; + }); +}; + +const MS_PER_DAY = 86_400_000; + +/** + * Reads an Excel serial date (days since 30/12/1899) as milliseconds at UTC midnight. + * @param {string} serial - The cell as the sheet writes it. + * @param {string} header - The column the cell comes from, for the error message. + * @returns {number} The date in milliseconds. + * @throws {Error} When the cell is not a number, so a malformed date is never read as an open + * end of the validity window. + */ +const fromSerialDate = (serial: string, header: string): number => { + const days = Number(serial); + + if (!Number.isFinite(days)) throw new Error(`${header} is not a serial date: "${serial}"`); + + return Date.UTC(1899, 11, 30) + days * MS_PER_DAY; +}; + +/** + * Whether a row is in force on `today`. `dIniVig` and `dFimVig` are Excel serial dates (days + * since 30/12/1899) and both ends of the window are inclusive, the way `scripts/ncm.ts` reads the + * Siscomex window. A classification the Informe Técnico excludes is not deleted from the table, + * it gets a `dFimVig` (220001, 220002 and 220003 in v.1.60), so this is what keeps it out, and a + * classification published before it starts to apply stays out until its `dIniVig`. + * + * A date that does not read as a serial number throws instead of being ignored: a malformed + * `dFimVig` would otherwise drop the row from the table without a word. + * @param {Row} row - A classification row. + * @param {number} today - The reference date, in milliseconds at UTC midnight. + * @returns {boolean} True when `today` is inside the validity window the row declares. + * @throws {Error} When either end of the window is not a serial date. + */ +const isInForce = (row: Row, today: number): boolean => { + const start = row[START_OF_VALIDITY_HEADER]; + const end = row[END_OF_VALIDITY_HEADER]; + + if (start !== undefined && today < fromSerialDate(start, START_OF_VALIDITY_HEADER)) return false; + + return end === undefined || today <= fromSerialDate(end, END_OF_VALIDITY_HEADER); +}; + +type Tables = { + /** CST description by 3 digit code. */ + csts: Record; + /** `[name, description]` by 6 digit cClassTrib. */ + classifications: Record; +}; + +/** + * Reads the CST worksheet, the one without a cClassTrib column. The cClassTrib worksheet repeats + * the CST description on every row but refines it per classification ("Alíquota reduzida em + * 60%", "Alíquota zero"), so it is not where the description of a CST comes from. + * @param {Row[]} rows - The rows of every worksheet. + * @returns {Record} The description of each CST. + */ +const buildCsts = (rows: Row[]): Record => { + const csts: Record = {}; + + for (const row of rows) { + const cst = row[CST_HEADER]; + const description = row[CST_DESCRIPTION_HEADER]; + + if (cst === undefined || description === undefined || CLASS_TRIB_HEADER in row) continue; + + if (!/^\d{3}$/.test(cst)) throw new Error(`CST "${cst}" is not a 3 digit code`); + + csts[cst] = description; + } + + return csts; +}; + +/** + * Builds both tables out of the workbook. + * @param {Row[]} rows - The rows of every worksheet. + * @param {number} today - The reference date, in milliseconds at UTC midnight. + * @returns {Tables} The CST table and the classifications in force. + */ +const buildTables = (rows: Row[], today: number): Tables => { + const csts = buildCsts(rows); + const classifications: Record = {}; + + for (const row of rows) { + const code = row[CLASS_TRIB_HEADER]; + + if (code === undefined || !isInForce(row, today)) continue; + + if (!/^\d{6}$/.test(code)) throw new Error(`cClassTrib "${code}" is not a 6 digit code`); + + const cst = row[CST_HEADER]; + + if (cst === undefined || !code.startsWith(cst) || !(cst in csts)) { + throw new Error(`cClassTrib "${code}" does not start with a CST of the CST table`); + } + + const name = row[CLASS_TRIB_NAME_HEADER]; + const description = row[CLASS_TRIB_DESCRIPTION_HEADER]; + + if (name === undefined || description === undefined) { + throw new Error(`cClassTrib "${code}" has no name or no description`); + } + + classifications[code] = [name, description]; + } + + return { csts, classifications }; +}; + +const main = async (): Promise => { + const table = await fetchLatestListing(TABLES_LISTING, TABLE_TITLE_REGEX); + const informe = await fetchLatestListing(INFORMES_LISTING, INFORME_TITLE_REGEX); + const response = await fetchWithRetry(table.url, { headers: PORTAL_HEADERS }); + + if (!response.ok) { + throw new Error(`cClassTrib table request failed with status ${response.status}`); + } + + const now = new Date(); + const today = Date.UTC(now.getUTCFullYear(), now.getUTCMonth(), now.getUTCDate()); + const workbook = Buffer.from(await response.arrayBuffer()); + const { csts, classifications } = buildTables( + [...readXlsxSheets(workbook).values()].flatMap((rows) => toRecords(rows)), + today, + ); + const codes = Object.keys(classifications).sort(); + + if (Object.keys(csts).length < MINIMUM_CST_CODES || codes.length < MINIMUM_CLASSIFICATIONS) { + throw new Error( + `The table yielded ${Object.keys(csts).length} CST codes and ${codes.length} classifications, below the ${MINIMUM_CST_CODES} and ${MINIMUM_CLASSIFICATIONS} a complete table holds; the workbook layout probably changed`, + ); + } + + await writeFile( + resolve(scriptsDir, "..", "./src/_internals/constants/ibs-cbs.ts"), + `/** + * CST-IBS/CBS (Código de Situação Tributária do IBS e da CBS) table, indexed by the 3 digit + * code, with the description the official table gives each one. + * + * Table version: + * "${table.title}", + * the workbook of the Portal Nacional da NF-e ("Documentos" > "Diversos"), divulged by Informe + * Técnico 2025.002 v.${informe.groups[0]} (published on ${informe.publishedAt}). The generator always reads the + * newest workbook listed and records it here, so a refresh that picks a new version up shows in + * this header. + * + * Generated by \`node ./scripts/ibs-cbs.ts\`. Do not edit by hand. + * + * @see Official: ${table.url} + * ${table.title}. + * @see Official: ${informe.url} + * Informe Técnico 2025.002 v.${informe.groups[0]}, which defines the columns of both tables. + * @see Official: https://www.nfe.fazenda.gov.br/portal/listaConteudo.aspx?tipoConteudo=/NJarYc9nus= + * "Documentos" > "Diversos" of the Portal Nacional da NF-e, where every table version is listed. + * @see Official: https://www.planalto.gov.br/ccivil_03/leis/lcp/lcp214.htm + * Lei Complementar nº 214/2025, which institutes the IBS and the CBS. + */ +export const CST_IBS_CBS_TABLE: Record = ${serializeRecord(csts)}; + +/** + * cClassTrib (Código de Classificação Tributária do IBS e da CBS) codes in force on the + * generation date, sorted ascending. A row of the workbook whose \`dFimVig\` (end of validity) + * has passed is left out: that is how the Informe Técnico excludes a classification (220001, + * 220002 and 220003 in v.1.60). The first 3 digits of a code are its CST-IBS/CBS. + * + * Kept apart from the descriptions so that validating a code does not bundle them. + */ +export const CLASS_TRIB_CODES: readonly string[] = ${JSON.stringify(codes)}; + +/** + * The \`[name, description]\` pair of every code of \`CLASS_TRIB_CODES\`: the columns "Nome + * cClassTrib" (the short name the table gives for display) and "Descrição cClassTrib" (the + * situation the classification refers to). The legal wording columns ("LC Redação", + * "Regulamento CBS", "Regulamento IBS") are not shipped. + */ +export const CLASS_TRIB_TABLE: Record = ${serializeRecord(classifications)}; + +/** Shape a CST-IBS/CBS has to be written in: the 3 digits of the field \`CST\` (UB13, N 3). */ +export const CST_IBS_CBS_FORMAT_REGEX = /^\\d{3}$/; + +/** Shape a cClassTrib has to be written in: the 6 digits of the field \`cClassTrib\` (UB14, N 6). */ +export const CLASS_TRIB_FORMAT_REGEX = /^\\d{6}$/; + +/** Width of a CST-IBS/CBS, which is also the prefix a cClassTrib shares with its CST. */ +export const CST_IBS_CBS_LENGTH = 3; + +/** Width of a cClassTrib. */ +export const CLASS_TRIB_LENGTH = 6; +`, + ); +}; + +await main().catch((error) => { + console.error(error instanceof Error ? error.message : error); + process.exit(1); +}); diff --git a/scripts/llms.ts b/scripts/llms.ts index 6b0ea9ce9..93177d546 100644 --- a/scripts/llms.ts +++ b/scripts/llms.ts @@ -2,6 +2,7 @@ import { readFileSync, writeFileSync } from "node:fs"; import { join } from "node:path"; import { parseFrontMatter } from "./front-matter.ts"; +import { removeUntilStable } from "./remove-until-stable.ts"; const ROOT = join(import.meta.dirname, ".."); const DOCS_DIR = join(ROOT, "docs"); @@ -18,23 +19,6 @@ const SLUG_STRIP_PATTERN = /[\u2000-\u206F\u2E00-\u2E7F\\'!"#$%&()*+,./:;<=>?@[\ const VARIATION_SELECTOR_PATTERN = /\uFE0F/g; const EMOJI_PATTERN = /[\p{Emoji_Presentation}\p{Extended_Pictographic}]/gu; -/** - * Removes every match of `pattern` repeatedly until nothing changes, so nested or overlapping - * matches cannot survive a single pass. - * @param {string} value - The string to strip matches from. - * @param {RegExp} pattern - The pattern to remove, repeatedly. - * @returns {string} `value` with every match of `pattern` removed. - */ -function removeUntilStable(value: string, pattern: RegExp): string { - let current = value; - let previous = ""; - while (current !== previous) { - previous = current; - current = current.replace(pattern, ""); - } - return current; -} - /** * Reproduces docsify's heading-to-anchor slug algorithm (see * `src/core/render/slugify.js` in the docsify source) so links into @@ -57,15 +41,16 @@ function slugify(heading: string): string { const ABBREVIATION_PLACEHOLDER = String.fromCharCode(1); /** - * Extracts the first sentence of a paragraph, treating `e.g.`/`i.e.` as - * abbreviations rather than sentence boundaries. + * Extracts the first sentence of a paragraph, treating `e.g.`, `i.e.` and `art.` (the way a + * Brazilian law article is cited, as in "LGPD, art. 6º III") as abbreviations rather than + * sentence boundaries. * @param {string} paragraph - The paragraph to extract the first sentence from. * @returns {string} The first sentence of `paragraph`. */ function firstSentence(paragraph: string): string { const withoutLinks = paragraph.replaceAll(/\[([^\]]+)\]\([^)]+\)/g, "$1"); const protectedText = withoutLinks.replaceAll( - /\b(e\.g|i\.e)\./gi, + /\b(e\.g|i\.e|art)\./gi, (_match, abbr: string) => `${abbr}${ABBREVIATION_PLACEHOLDER}`, ); const match = /[\s\S]*?[.!?](?=\s|$)/.exec(protectedText); diff --git a/scripts/nbs.ts b/scripts/nbs.ts new file mode 100644 index 000000000..f08773939 --- /dev/null +++ b/scripts/nbs.ts @@ -0,0 +1,146 @@ +#!/usr/bin/env node + +import { writeFile } from "node:fs/promises"; +import { resolve } from "node:path"; + +import { fetchSortedRecord } from "./fetch-sorted-record.ts"; +import { serializeRecord } from "./serialize-record.ts"; + +const scriptsDir = import.meta.dirname; + +/** The official CSV is published in ISO-8859-1, not UTF-8. */ +const NBS_CSV_DECODER = new TextDecoder("iso-8859-1"); + +const NBS_CSV_HEADER = "NBS 2.0;DESCRIÇÃO"; + +/** + * A complete code, e.g. `1.0101.11.00`. The CSV also carries the chapter (`1.01`), position + * (`1.0101`) and subposition (`1.0101.1`) headings, which classify nothing by themselves and are + * left out of the table. + */ +const NBS_CODE_REGEX = /^\d\.\d{4}\.\d{2}\.\d{2}$/; + +/** + * Smallest number of complete codes the table yields. NBS 2.0 carries 920 and only a new version + * of the nomenclature changes that, so a result far below it means the CSV layout changed. + */ +const MINIMUM_CODES = 900; + +/** + * Splits a CSV into records. A line break inside a quoted field does not end a record, so a + * description written over two lines stays in one piece. + * @param {string} csv - The decoded CSV. + * @returns {string[]} One string per record, the line breaks between records removed. + */ +const splitRecords = (csv: string): string[] => { + const records: string[] = []; + let record = ""; + let quoted = false; + + for (const character of csv) { + if (character === '"') quoted = !quoted; + + if (character === "\n" && !quoted) { + records.push(record); + record = ""; + } else if (character !== "\r" || quoted) { + record += character; + } + } + + return [...records, record]; +}; + +/** + * Reads a field the way RFC 4180 writes it: a quoted field loses its outer quotes and every + * doubled quote inside it becomes one. + * @param {string} field - The raw field, quotes included. + * @returns {string} The text of the field, whitespace collapsed. + */ +const readField = (field: string): string => { + const trimmed = field.trim(); + + if (!trimmed.startsWith('"')) return trimmed.replaceAll(/\s+/g, " "); + + if (trimmed.length < 2 || !trimmed.endsWith('"')) { + throw new Error(`NBS CSV field ${trimmed} opens a quote it never closes`); + } + + return trimmed.slice(1, -1).replaceAll('""', '"').replaceAll(/\s+/g, " "); +}; + +/** + * Reads the `NBS 2.0;DESCRIÇÃO` rows of the official NBS 2.0 CSV. + * @param {string} csv - The decoded CSV. + * @returns {Record} One entry per complete code, keyed by its 9 digits. + */ +const parseCsv = (csv: string): Record => { + const [header, ...rows] = splitRecords(csv); + + if (header?.trim() !== NBS_CSV_HEADER) { + throw new Error(`NBS CSV header is not "${NBS_CSV_HEADER}"`); + } + + const data: Record = {}; + + for (const row of rows) { + const separator = row.indexOf(";"); + const code = row.slice(0, Math.max(separator, 0)).trim(); + const description = readField(row.slice(separator + 1)); + + if (!NBS_CODE_REGEX.test(code) || description === "") continue; + + data[code.replaceAll(".", "")] = description; + } + + return data; +}; + +const main = async (): Promise => { + const sorted = await fetchSortedRecord( + "https://www.gov.br/mdic/pt-br/images/REPOSITORIO/scs/decos/NBS/NBSa_2-0.csv", + "NBS CSV", + async (response) => { + const data = parseCsv(NBS_CSV_DECODER.decode(await response.arrayBuffer())); + + if (Object.keys(data).length < MINIMUM_CODES) { + throw new Error(`NBS CSV holds fewer than ${MINIMUM_CODES} codes`); + } + + return data; + }, + ); + + await writeFile( + resolve(scriptsDir, "..", "./src/_internals/constants/nbs.ts"), + `/** + * NBS 2.0 (Nomenclatura Brasileira de Serviços, Intangíveis e Outras Operações que Produzam + * Variações no Patrimônio) descriptions, indexed by the raw 9 digit code. + * + * Built from the official \`NBSa_2-0.csv\` the MDIC publishes on gov.br, a plain + * \`NBS 2.0;DESCRIÇÃO\` CSV in ISO-8859-1, the version 2.0 as amended by the Portaria Conjunta + * RFB/SCS 2.000 of 18 December 2018. Only the complete codes are kept: the chapter, position and + * subposition headings of the CSV classify nothing by themselves. + * + * Generated by \`node ./scripts/nbs.ts\`. Do not edit by hand. + * + * @see Official: https://www.gov.br/mdic/pt-br/assuntos/sdic/comercio-e-servicos/nbs-nomenclatura-brasileira-de-servicos + * The NBS page of the MDIC, which links the CSV and the Anexo I of the Portaria. + * @see Official: https://www.gov.br/mdic/pt-br/images/REPOSITORIO/scs/decos/NBS/NBSa_2-0.csv + * The NBS 2.0 table in CSV. + */ +export const NBS_DESCRIPTIONS: Record = ${serializeRecord(sorted)}; + +/** + * Shape an NBS code has to be written in: the 9 digits, optionally split into the printed + * groups of 1, 4, 2 and 2 by a single whitespace or mask character. + */ +export const NBS_FORMAT_REGEX = /^\\d[\\s.\\-/]?\\d{4}[\\s.\\-/]?\\d{2}[\\s.\\-/]?\\d{2}$/; +`, + ); +}; + +await main().catch((error) => { + console.error(error instanceof Error ? error.message : error); + process.exit(1); +}); diff --git a/scripts/read-xlsx-sheet.ts b/scripts/read-xlsx-sheet.ts new file mode 100644 index 000000000..c328f0c3b --- /dev/null +++ b/scripts/read-xlsx-sheet.ts @@ -0,0 +1,325 @@ +import { inflateRawSync } from "node:zlib"; + +import { decodeXml } from "./decode-xml.ts"; + +const END_OF_CENTRAL_DIRECTORY_SIGNATURE = 0x06_05_4b_50; + +const CENTRAL_DIRECTORY_SIGNATURE = 0x02_01_4b_50; + +const LOCAL_HEADER_SIGNATURE = 0x04_03_4b_50; + +const CENTRAL_DIRECTORY_HEADER_SIZE = 46; + +const LOCAL_HEADER_SIZE = 30; + +const DEFLATE = 8; + +/** Largest file the reader inflates, so a corrupt archive cannot exhaust the memory. */ +const MAXIMUM_FILE_SIZE = 64 * 1024 * 1024; + +/** + * Largest amount the files read out of one workbook may hold together. A central directory can + * list thousands of sheets, so bounding each file alone does not bound the whole read. + */ +const MAXIMUM_WORKBOOK_SIZE = 128 * 1024 * 1024; + +/** + * The part that holds the text of the cells. A workbook whose cells are all inline strings does + * not carry it, which is valid, so it is read only when the archive has it. + */ +const SHARED_STRINGS = "xl/sharedStrings.xml"; + +/** Rows a worksheet can hold, `1048576`. A reference past it is not a sheet this reader can read. */ +const MAXIMUM_ROWS = 1_048_576; + +/** Columns a worksheet can hold, `A` to `XFD`. */ +const MAXIMUM_COLUMNS = 16_384; + +const ALPHABET_LENGTH = 26; + +const CODE_BEFORE_A = 64; + +/** One file of a zip archive, still compressed. */ +type ZipEntry = { + /** The compression method of the entry, 8 for deflate and 0 for stored. */ + method: number; + /** The bytes of the entry as the archive carries them. */ + data: Buffer; +}; + +/** The entries of an archive and how much has been inflated out of it so far. */ +type Archive = { + /** Every entry, keyed by its path, left compressed. */ + files: Map; + /** Bytes read out of the archive so far, checked against `MAXIMUM_WORKBOOK_SIZE`. */ + read: number; +}; + +/** One sheet of a workbook, as `xl/workbook.xml` lists it. */ +type SheetEntry = { + /** The name of the sheet, as its tab shows it. */ + name: string; + /** The path of the worksheet part inside the archive. */ + path: string; +}; + +/** A workbook opened far enough to read any of its sheets. */ +type Workbook = { + /** The archive of the workbook. */ + archive: Archive; + /** The shared strings of the workbook. */ + strings: string[]; + /** The sheets, in the order of their tabs. */ + sheets: SheetEntry[]; +}; + +/** + * Reads the entries of a zip archive out of its central directory. ZIP64 is not supported, so + * an archive above 4 GB or with more than 65535 entries is out of reach, which no table the + * government publishes comes close to. + * @param {Buffer} archive - The whole archive. + * @returns {Archive} Every entry, keyed by its path, left compressed. + */ +const unzip = (archive: Buffer): Archive => { + let end = archive.length - 22; + + while (end >= 0 && archive.readUInt32LE(end) !== END_OF_CENTRAL_DIRECTORY_SIGNATURE) end--; + + if (end < 0) throw new Error("not a zip archive"); + + const files = new Map(); + let offset = archive.readUInt32LE(end + 16); + + for (let index = archive.readUInt16LE(end + 10); index > 0; index--) { + if (archive.readUInt32LE(offset) !== CENTRAL_DIRECTORY_SIGNATURE) { + throw new Error("the zip central directory is broken"); + } + + const method = archive.readUInt16LE(offset + 10); + const size = archive.readUInt32LE(offset + 20); + const nameLength = archive.readUInt16LE(offset + 28); + const skipped = archive.readUInt16LE(offset + 30) + archive.readUInt16LE(offset + 32); + const local = archive.readUInt32LE(offset + 42); + const nameStart = offset + CENTRAL_DIRECTORY_HEADER_SIZE; + const name = archive.toString("utf8", nameStart, nameStart + nameLength); + + if (archive.readUInt32LE(local) !== LOCAL_HEADER_SIGNATURE) { + throw new Error(`the zip entry ${name} points at no local header`); + } + + const start = + local + + LOCAL_HEADER_SIZE + + archive.readUInt16LE(local + 26) + + archive.readUInt16LE(local + 28); + + files.set(name, { method, data: archive.subarray(start, start + size) }); + offset = nameStart + nameLength + skipped; + } + + return { files, read: 0 }; +}; + +/** + * Turns the letters of a cell reference into a zero based column index: `A` is 0, `AA` is 26. + * @param {string} letters - The column letters of the reference. + * @returns {number} The zero based index of the column. + */ +const columnIndex = (letters: string): number => { + let index = 0; + + for (let position = 0; position < letters.length; position++) { + index = index * ALPHABET_LENGTH + letters.charCodeAt(position) - CODE_BEFORE_A; + } + + return index - 1; +}; + +/** + * Inflates one file of the archive and reads it as UTF-8. Only the files a caller asks for are + * inflated, which leaves the themes, the styles and the custom XML of a workbook untouched. + * @param {Archive} archive - The archive. + * @param {string} path - The path of the file inside the archive. + * @returns {string} The content of the file. + */ +const readFile = (archive: Archive, path: string): string => { + const entry = archive.files.get(path); + + if (entry === undefined) throw new Error(`the workbook has no ${path}`); + + const content = + entry.method === DEFLATE + ? inflateRawSync(entry.data, { maxOutputLength: MAXIMUM_FILE_SIZE }) + : entry.data; + + archive.read += content.length; + + if (archive.read > MAXIMUM_WORKBOOK_SIZE) { + throw new Error(`the workbook holds more than ${MAXIMUM_WORKBOOK_SIZE} bytes`); + } + + return content.toString("utf8"); +}; + +/** + * Joins the text runs of a shared string or of an inline string. A cell whose text is styled in + * pieces carries one `` per piece. The `` elements hold the phonetic reading of the + * text, not the text, so they are dropped first. + * @param {string} xml - The content of the `` or `` element. + * @returns {string} The text of the element. + */ +const joinRuns = (xml: string): string => + [...xml.replaceAll(//gs, "").matchAll(/]*>([^<]*)<\/t>/g)] + .map((run) => decodeXml(run[1])) + .join(""); + +/** + * Resolves the target of a workbook relationship into a path inside the archive. The OPC spec + * allows an absolute target (`/xl/worksheets/sheet1.xml`) and one that climbs out of the part + * folder (`../worksheets/sheet1.xml`) as well as the plain relative form. + * @param {string} target - The `Target` of the relationship. + * @returns {string} The path of the part inside the archive. + */ +const resolveTarget = (target: string): string => + decodeURIComponent(new URL(target, "file:///xl/").pathname).slice(1); + +/** + * Reads the cells of one row, placed by the column of their reference. A cell past the last + * column a worksheet can hold fails the run, so a corrupt reference cannot make the row array + * grow to its index. + * @param {string} row - The content of the `` element. + * @param {string[]} strings - The shared strings of the workbook. + * @returns {string[]} The cells of the row, an absent one as `""`. + */ +const readCells = (row: string, strings: string[]): string[] => { + const cells: string[] = []; + + for (const cell of row.matchAll(/]*?)(?:\/>|>(.*?)<\/c>)/gs)) { + const reference = /\br="([A-Z]+)\d+"/.exec(cell[1])?.[1]; + + if (reference === undefined) continue; + + const column = columnIndex(reference); + + if (column >= MAXIMUM_COLUMNS) throw new Error(`the column ${reference} is past the sheet`); + + const type = /\bt="([^"]*)"/.exec(cell[1])?.[1]; + const body = cell[2] ?? ""; + const value = /([^<]*)<\/v>/.exec(body)?.[1] ?? ""; + + if (type === "inlineStr") cells[column] = joinRuns(body); + else if (type === "s") + cells[column] = /^\d+$/.test(value) ? (strings[Number(value)] ?? "") : ""; + else cells[column] = decodeXml(value); + } + + return Array.from(cells, (cell) => cell ?? ""); +}; + +/** + * Reads the rows of a worksheet, placed by the `r` attribute of the row rather than by the + * order they are written in, so a skipped row leaves a gap instead of shifting the table. + * @param {string} sheet - The worksheet XML. + * @param {string[]} strings - The shared strings of the workbook. + * @returns {string[][]} The rows of the sheet. + */ +const readRows = (sheet: string, strings: string[]): string[][] => { + const rows: string[][] = []; + + for (const row of sheet.matchAll(/]*?)(?:\/>|>(.*?)<\/row>)/gs)) { + const index = Number(/\br="(\d+)"/.exec(row[1])?.[1] ?? rows.length + 1) - 1; + + if (index >= MAXIMUM_ROWS) throw new Error(`the row ${index + 1} is past the sheet`); + + rows[index] = readCells(row[2] ?? "", strings); + } + + return Array.from(rows, (row) => row ?? []); +}; + +/** + * Opens a workbook: its archive, its shared strings and the list of its sheets, each resolved + * through `xl/_rels/workbook.xml.rels` to the part that holds it. + * @param {Buffer} buffer - The `.xlsx` file. + * @returns {Workbook} The opened workbook. + */ +const openWorkbook = (buffer: Buffer): Workbook => { + const archive = unzip(buffer); + const relations = readFile(archive, "xl/_rels/workbook.xml.rels").matchAll( + /]*>/g, + ); + const targets = new Map(); + + for (const [tag] of relations) { + const id = /\bId="([^"]+)"/.exec(tag)?.[1]; + const target = /\bTarget="([^"]+)"/.exec(tag)?.[1]; + + if (id !== undefined && target !== undefined) targets.set(id, decodeXml(target)); + } + + const sheets: SheetEntry[] = []; + + for (const [tag] of readFile(archive, "xl/workbook.xml").matchAll(/]*>/g)) { + const name = /\bname="([^"]*)"/.exec(tag)?.[1]; + const target = targets.get(/\br:id="([^"]+)"/.exec(tag)?.[1] ?? ""); + + if (name !== undefined && target !== undefined) { + sheets.push({ name: decodeXml(name), path: resolveTarget(target) }); + } + } + + const shared = archive.files.has(SHARED_STRINGS) ? readFile(archive, SHARED_STRINGS) : ""; + const items = shared.matchAll(/]*?(?:\/>|>(.*?)<\/si>)/gs); + const strings = [...items].map((item) => joinRuns(item[1] ?? "")); + + return { archive, strings, sheets }; +}; + +/** + * Reads one sheet of an opened workbook and checks its rows against the dimension it declares. + * @param {Workbook} workbook - The opened workbook. + * @param {SheetEntry} sheet - The sheet to read. + * @returns {string[][]} The rows of the sheet. + */ +const readSheet = (workbook: Workbook, sheet: SheetEntry): string[][] => { + const content = readFile(workbook.archive, sheet.path); + const rows = readRows(content, workbook.strings); + const dimension = / { + const opened = openWorkbook(workbook); + const sheet = opened.sheets.find(({ name }) => name === sheetName); + + if (sheet === undefined) throw new Error(`the workbook has no sheet named ${sheetName}`); + + return readSheet(opened, sheet); +}; + +/** + * Reads every sheet of an `.xlsx` workbook the way `readXlsxSheet` reads one, for a workbook + * whose sheet names change from one version to the next. + * @param {Buffer} workbook - The `.xlsx` file. + * @returns {Map} The rows of each sheet, by sheet name, in the order of the tabs. + */ +export const readXlsxSheets = (workbook: Buffer): Map => { + const opened = openWorkbook(workbook); + + return new Map(opened.sheets.map((sheet) => [sheet.name, readSheet(opened, sheet)])); +}; diff --git a/scripts/remove-until-stable.ts b/scripts/remove-until-stable.ts new file mode 100644 index 000000000..1ab6095df --- /dev/null +++ b/scripts/remove-until-stable.ts @@ -0,0 +1,19 @@ +/** + * Removes every match of `pattern` repeatedly until nothing changes, so nested or overlapping + * matches cannot survive a single pass. Shared by the scripts that strip markup out of text. + * + * @param {string} value - The string to strip matches from. + * @param {RegExp} pattern - The pattern to remove, repeatedly. + * @returns {string} `value` with every match of `pattern` removed. + */ +export const removeUntilStable = (value: string, pattern: RegExp): string => { + let current = value; + let previous = ""; + + while (current !== previous) { + previous = current; + current = current.replace(pattern, ""); + } + + return current; +}; diff --git a/scripts/serialize-record.ts b/scripts/serialize-record.ts new file mode 100644 index 000000000..4c8e31a1e --- /dev/null +++ b/scripts/serialize-record.ts @@ -0,0 +1,15 @@ +/** + * Serializes a record as an object literal whose entries are written in ascending key order. + * `JSON.stringify` follows the insertion order of the object, and JavaScript hoists the keys + * that are canonical array indices (`"1001"`) ahead of the others (`"0101"`), so a record built + * from sorted keys is not always emitted sorted. Writing the entries out in order keeps the + * generated tables readable and their diffs small. + * + * @param {Record} data - The entries to serialize. + * @returns {string} The object literal, sorted by key. + */ +export const serializeRecord = (data: Record): string => + `{${Object.keys(data) + .sort() + .map((key) => `${JSON.stringify(key)}:${JSON.stringify(data[key])}`) + .join(",")}}`; diff --git a/scripts/service-items.ts b/scripts/service-items.ts new file mode 100644 index 000000000..57d283157 --- /dev/null +++ b/scripts/service-items.ts @@ -0,0 +1,129 @@ +#!/usr/bin/env node + +import { writeFile } from "node:fs/promises"; +import { resolve } from "node:path"; + +import { fetchWithRetry } from "../src/_internals/fetch-with-retry/fetch-with-retry.ts"; +import { decodeXml } from "./decode-xml.ts"; +import { readXlsxSheet } from "./read-xlsx-sheet.ts"; +import { serializeRecord } from "./serialize-record.ts"; + +const scriptsDir = import.meta.dirname; + +const DOCUMENTATION_URL = + "https://www.gov.br/nfse/pt-br/biblioteca/documentacao-tecnica/documentacao-atual"; + +/** + * The ANEXO B is published under a file name that carries its version and date, e.g. + * `anexo_b-nbs2-lista_servico_nacional-snnfse-v1-01-20260122.xlsx`, so the link is read from the + * documentation page instead of being pinned here: a new version is picked up by the next run. + * The `href` is read as the page writes it, so it is decoded and resolved against the page before + * it is fetched, the way `scripts/ibs-cbs.ts` reads the links of the Portal da NF-e. + */ +const ANNEX_LINK_REGEX = /href="([^"]*anexo_b-nbs2-lista_servico_nacional[^"]*\.xlsx)"/i; + +const SHEET_NAME = "LISTA.SERV.NAC."; + +const SHEET_HEADER = "CÓDIGO DE TRIBUTAÇÃO NACIONAL|ITEM|SUBITEM|DESDOBRO NACIONAL|DESCRIÇÃO"; + +/** + * Item 99, "Serviços sem a incidência de ISSQN e ICMS", is an addition of the national list: the + * list annexed to the Lei Complementar 116/2003 ends at item 40. + */ +const LAST_LAW_ITEM = 40; + +/** + * Smallest number of subitems a complete list yields. The law carries 200 in force today and is + * only ever amended by another lei complementar, so a result far below it means the sheet + * changed, not that subitems were revoked. + */ +const MINIMUM_SUBITEMS = 190; + +const fetchOk = async (url: string, label: string): Promise => { + const response = await fetchWithRetry(url); + + if (!response.ok) throw new Error(`${label} request failed with status ${response.status}`); + + return response; +}; + +/** + * Reads the subitems of the law out of the national service list. The sheet prints three levels: + * the item (`SUBITEM` 0), the subitem of the law (`DESDOBRO NACIONAL` 0) and the national codes + * the Comitê Gestor splits a subitem into. Only the second level is the list annexed to the law. + * @param {string[][]} rows - The rows of the sheet, header included. + * @returns {Record} One entry per subitem, keyed by the 4 digits (`0101`). + */ +const parseSheet = (rows: string[][]): Record => { + const [header, ...body] = rows; + + if (header?.join("|") !== SHEET_HEADER) { + throw new Error(`the ${SHEET_NAME} header is not "${SHEET_HEADER}"`); + } + + const data: Record = {}; + + for (const [, item, subitem, split, description] of body) { + const isLawSubitem = Number(item) <= LAST_LAW_ITEM && Number(subitem) > 0 && split === "0"; + const text = (description ?? "").trim().replaceAll(/\s+/g, " "); + + if (!isLawSubitem || text === "") continue; + + data[`${item.padStart(2, "0")}${subitem.padStart(2, "0")}`] = text; + } + + return data; +}; + +const main = async (): Promise => { + const pageResponse = await fetchOk(DOCUMENTATION_URL, "NFS-e documentation page"); + const page = await pageResponse.text(); + const link = ANNEX_LINK_REGEX.exec(page)?.[1]; + + if (link === undefined) throw new Error("the NFS-e documentation page links no ANEXO B"); + + const annex = new URL(decodeXml(link), DOCUMENTATION_URL).href; + const workbookResponse = await fetchOk(annex, "NFS-e ANEXO B"); + const workbook = await workbookResponse.arrayBuffer(); + const data = parseSheet(readXlsxSheet(Buffer.from(workbook), SHEET_NAME)); + + if (Object.keys(data).length < MINIMUM_SUBITEMS) { + throw new Error(`the national service list holds fewer than ${MINIMUM_SUBITEMS} subitems`); + } + + await writeFile( + resolve(scriptsDir, "..", "./src/_internals/constants/service-items.ts"), + `/** + * The subitems in force of the service list annexed to the Lei Complementar 116/2003, indexed by + * the raw 4 digits of the subitem (\`0101\` for \`1.01\`), the first four digits of the national + * \`cTribNac\` code. + * + * Built from the sheet \`${SHEET_NAME}\` of the \`ANEXO_B-NBS2-LISTA_SERVICO_NACIONAL\` workbook + * of the Sistema Nacional NFS-e, which prints the list in force, vetoed subitems left out and + * the amendments of later leis complementares applied. The item headings, the national codes a + * subitem is split into and item 99, an addition of the national list, are not part of the law + * and are left out. + * + * Generated by \`node ./scripts/service-items.ts\` from \`${link.slice(link.lastIndexOf("/") + 1)}\`. + * Do not edit by hand. + * + * @see Official: https://www.planalto.gov.br/ccivil_03/leis/lcp/lcp116.htm + * Lei Complementar 116/2003, "Lista de serviços anexa". + * @see Official: ${DOCUMENTATION_URL} + * Sistema Nacional NFS-e, current technical documentation, ANEXO B. + */ +export const SERVICE_ITEM_DESCRIPTIONS: Record = ${serializeRecord(data)}; + +/** + * Shape a subitem has to be written in: one or two digits of the item and the two of the + * subitem, with the dot the law prints between them or without it. + */ +export const SERVICE_ITEM_FORMAT_REGEX = /^\\d{1,2}\\.?\\d{2}$/; +`, + ); +}; + +await main().catch((error) => { + console.error(error instanceof Error ? error.message : error); + process.exit(1); +}); diff --git a/scripts/sort-record.ts b/scripts/sort-record.ts new file mode 100644 index 000000000..8757c6aee --- /dev/null +++ b/scripts/sort-record.ts @@ -0,0 +1,11 @@ +/** + * Returns the entries of a record sorted ascending by key, so that a generated constants table + * is stable between runs and a dataset refresh diffs to what actually changed upstream. The + * entries are rebuilt with `Object.fromEntries`, which defines every key as an own property: a + * remote dataset that carries a `__proto__` key keeps it instead of losing it to the prototype. + * + * @param {Record} data - The unsorted entries. + * @returns {Record} The same entries, in key order. + */ +export const sortRecord = (data: Record): Record => + Object.fromEntries(Object.entries(data).sort(([left], [right]) => (left < right ? -1 : 1))); diff --git a/src/_internals/constants/cest.ts b/src/_internals/constants/cest.ts new file mode 100644 index 000000000..b7a3bd4f5 --- /dev/null +++ b/src/_internals/constants/cest.ts @@ -0,0 +1,1517 @@ +/** + * CEST (Código Especificador da Substituição Tributária) table, indexed by the 7 digit code. + * + * Built from Anexos II to XXVI of Convênio ICMS 142/18, the consolidated text in force, which + * CONFAZ heads with this line: + * "Alterado pelo Conv. ICMS 38/19, 130/19, 142/19, 165/19, 240/19, 72/20, 120/20, 150/20, + * 74/21, 04/22, 66/22, 108/22, 154/22, 195/22, 53/23, 171/23, 206/23, 225/23, 51/24, 95/24, + * 123/24, 174/24, 178/24, 180/24." + * + * Only the wording in force of each item is kept: the superseded wordings CONFAZ prints next + * to it and the items marked "REVOGADO" are left out. The NCM/SH column of the annexes is not + * carried. + * + * Both tables below are built in ascending code order, which is not the order they read in: + * JavaScript lists the keys of an object that look like array indexes before the rest, so + * segments 10 to 28 come first and segments 01 to 09 follow, as in `cbo.ts` and `cnae.ts`. + * + * Generated by `node ./scripts/cest.ts`. Do not edit by hand. + * + * @see Official: https://www.confaz.fazenda.gov.br/legislacao/convenios/2018/CV142_18 + * Convênio ICMS 142/18, the consolidated text and its annexes. + */ +export const CEST_TABLE: Record = { + "1000100": "Cal", + "1000200": "Argamassas", + "1000300": "Outras argamassas", + "1000400": "Silicones em formas primárias, para uso na construção", + "1000500": + "Revestimentos de PVC e outros plásticos; forro, sancas e afins de PVC, para uso na construção", + "1000600": + "Tubos, e seus acessórios (por exemplo, juntas, cotovelos, flanges, uniões), de plásticos, para uso na construção", + "1000700": "Revestimento de pavimento de PVC e outros plásticos", + "1000800": + "Chapas, folhas, tiras, fitas, películas e outras formas planas, autoadesivas, de plásticos, mesmo em rolos, para uso na construção", + "1000900": "Veda rosca, lona plástica para uso na construção, fitas isolantes e afins", + "1001000": "Telha de plástico, mesmo reforçada com fibra de vidro", + "1001100": "Cumeeira de plástico, mesmo reforçada com fibra de vidro", + "1001200": + "Chapas, laminados plásticos em bobina, para uso na construção, exceto os descritos no CEST 10.010.00 e 10.011.00", + "1001300": + "Banheiras, boxes para chuveiros, pias, lavatórios, bidês, sanitários e seus assentos e tampas, caixas de descarga e artigos semelhantes para usos sanitários ou higiênicos, de plásticos", + "1001400": "Artefatos de higiene/toucador de plástico, para uso na construção", + "1001500": "Caixa d’água, inclusive sua tampa, de plástico, mesmo reforçadas com fibra de vidro", + "1001600": + "Outras telhas, cumeeira e caixa d’água, inclusive sua tampa, de plástico, mesmo reforçadas com fibra de vidro", + "1001700": + "Artefatos para apetrechamento de construções, de plásticos, não especificados nem compreendidos em outras posições, incluindo persianas, sancas, molduras, apliques e rosetas, caixilhos de polietileno e outros plásticos, exceto os descritos nos CEST 10.015.00 e 10.016.00", + "1001800": "Portas, janelas e seus caixilhos, alizares e soleiras", + "1001900": "Postigos, estores (incluídas as venezianas) e artefatos semelhantes e suas partes", + "1002000": "Outras obras de plástico, para uso na construção", + "1002100": "Papel de parede e revestimentos de parede semelhantes; papel para vitrais", + "1002200": "Telhas de concreto", + "1002400": + "Caixas d’água, tanques e reservatórios e suas tampas, telhas, calhas, cumeeiras e afins, de fibrocimento, cimento-celulose ou semelhantes, contendo ou não amianto", + "1002500": + "Tijolos, placas (lajes), ladrilhos e outras peças cerâmicas de farinhas siliciosas fósseis (“kieselghur”, tripolita, diatomita, por exemplo) ou de terras siliciosas semelhantes", + "1002600": + "Tijolos, placas (lajes), ladrilhos e peças cerâmicas semelhantes, para uso na construção, refratários, que não sejam de farinhas siliciosas fósseis nem de terras siliciosas semelhantes", + "1002700": "Tijolos para construção, tijoleiras, tapa-vigas e produtos semelhantes, de cerâmica", + "1002800": + "Telhas, elementos de chaminés, condutores de fumaça, ornamentos arquitetônicos, de cerâmica, e outros produtos cerâmicos para uso na construção", + "1002900": "Tubos, calhas ou algerozes e acessórios para canalizações, de cerâmica", + "1003000": "Ladrilhos e placas de cerâmica, exclusivamente para pavimentação ou revestimento", + "1003001": + "Cubos, pastilhas e artigos semelhantes de cerâmica, mesmo com suporte, exceto os descritos CEST 10.030.00", + "1003100": + "Pias, lavatórios, colunas para lavatórios, banheiras, bidês, sanitários, caixas de descarga, mictórios e aparelhos fixos semelhantes para usos sanitários, de cerâmica", + "1003200": "Artefatos de higiene/toucador de cerâmica", + "1003300": + "Vidro vazado ou laminado, em chapas, folhas ou perfis, mesmo com camada absorvente, refletora ou não, mas sem qualquer outro trabalho", + "1003400": + "Vidro estirado ou soprado, em folhas, mesmo com camada absorvente, refletora ou não, mas sem qualquer outro trabalho", + "1003500": + "Vidro flotado e vidro desbastado ou polido em uma ou em ambas as faces, em chapas ou em folhas, mesmo com camada absorvente, refletora ou não, mas sem qualquer outro trabalho", + "1003600": "Vidros temperados", + "1003700": "Vidros laminados", + "1003800": "Vidros isolantes de paredes múltiplas", + "1003900": + "Blocos, placas, tijolos, ladrilhos, telhas e outros artefatos, de vidro prensado ou moldado, mesmo armado, para uso na construção; cubos, pastilhas e outros artigos semelhantes", + "1004000": "Barras próprias para construções, exceto vergalhões", + "1004100": "Outras barras próprias para construções, exceto vergalhões", + "1004101": "Outros vergalhões", + "1004200": "Vergalhões", + "1004300": "Outros vergalhões", + "1004400": + "Fios de ferro ou aço não ligados, não revestidos, mesmo polidos; cordas, cabos, tranças (entrançados), lingas e artefatos semelhantes, de ferro ou aço, não isolados para usos elétricos", + "1004500": + "Outros fios de ferro ou aço, não ligados, galvanizados com teor de carbono superior ou igual a 0,6%, em peso", + "1004501": "Outros fios de ferro ou aço, não ligados, galvanizados", + "1004600": + "Acessórios para tubos (inclusive uniões, cotovelos, luvas ou mangas), de ferro fundido, ferro ou aço", + "1004700": + "Portas e janelas, e seus caixilhos, alizares e soleiras de ferro fundido, ferro ou aço", + "1004800": + "Material para andaimes, para armações (cofragens) e para escoramentos, (inclusive armações prontas, para estruturas de concreto armado ou argamassa armada), eletrocalhas e perfilados de ferro fundido, ferro ou aço, próprios para construção, exceto treliças de aço", + "1004900": "Treliças de aço", + "1005000": "Telhas metálicas", + "1005100": + "Caixas diversas (tais como caixa de correio, de entrada de água, de energia, de instalação) de ferro fundido, ferro ou aço; próprias para a construção", + "1005200": + "Arame farpado, de ferro ou aço, arames ou tiras, retorcidos, mesmo farpados, de ferro ou aço, dos tipos utilizados em cercas", + "1005300": "Telas metálicas, grades e redes, de fios de ferro ou aço", + "1005400": "Correntes de rolos, de ferro fundido, ferro ou aço", + "1005500": "Outras correntes de elos articulados, de ferro fundido, ferro ou aço", + "1005600": "Correntes de elos soldados, de ferro fundido, de ferro ou aço", + "1005700": + "Tachas, pregos, percevejos, escápulas, grampos ondulados ou biselados e artefatos semelhantes, de ferro fundido, ferro ou aço, mesmo com a cabeça de outra matéria, exceto cobre", + "1005800": + "Parafusos, pinos ou pernos, roscados, porcas, tira-fundos, ganchos roscados, rebites, chavetas, contrapinos ou troços, arruelas (anilhas) (incluindo as de pressão) e artigos semelhantes, de ferro fundido, ferro ou aço", + "1005900": + "Palha de ferro ou aço, exceto os de uso doméstico classificados na posição NCM 7323.10.00", + "1005901": + "Esponjas, esfregões, luvas e artefatos semelhantes para limpeza, polimento e usos semelhantes, de ferro ou aço, exceto os de uso doméstico classificados na posição NCM 7323.10.00", + "1006000": + "Artefatos de higiene ou de toucador, e suas partes, de ferro fundido, ferro ou aço, incluídas as pias, banheiras, lavatórios, cubas, mictórios, tanques e afins de ferro fundido, ferro ou aço, para uso na construção", + "1006100": "Outras obras moldadas, de ferro fundido, ferro ou aço, para uso na construção", + "1006200": "Abraçadeiras", + "1006300": "Barras de cobre", + "1006400": + "Tubos de cobre e suas ligas, para instalações de água quente e gás, para uso na construção", + "1006500": + "Acessórios para tubos (por exemplo, uniões, cotovelos, luvas ou mangas) de cobre e suas ligas, para uso na construção", + "1006600": + "Tachas, pregos, percevejos, escápulas e artefatos semelhantes, de cobre, ou de ferro ou aço com cabeça de cobre, parafusos, pinos ou pernos, roscados, porcas, ganchos roscados, rebites, chavetas, cavilhas, contrapinos, arruelas (incluídas as de pressão), e artefatos semelhantes, de cobre", + "1006700": "Artefatos de higiene/toucador de cobre, para uso na construção", + "1006800": "Manta de subcobertura aluminizada", + "1006900": + "Tubos de alumínio e suas ligas, para refrigeração e ar condicionado, para uso na construção", + "1007000": + "Acessórios para tubos (por exemplo, uniões, cotovelos, luvas ou mangas), de alumínio, para uso na construção", + "1007100": + "Construções e suas partes (por exemplo, pontes e elementos de pontes, torres, pórticos ou pilones, pilares, colunas, armações, estruturas para telhados, portas e janelas, e seus caixilhos, alizares e soleiras, balaustradas), de alumínio, exceto as construções pré-fabricadas da posição 9406; chapas, barras, perfis, tubos e semelhantes, de alumínio, próprios para construções", + "1007200": "Artefatos de higiene/toucador de alumínio, para uso na construção", + "1007300": "Outras obras de alumínio, próprias para construções, incluídas as persianas", + "1007400": + "Outras guarnições, ferragens e artigos semelhantes de metais comuns, para construções, inclusive puxadores", + "1007500": + "Fechaduras e ferrolhos (de chave, de segredo ou elétricos), de metais comuns, incluídas as suas partes fechos e armações com fecho, com fechadura, de metais comuns chaves para estes artigos, de metais comuns; exceto os de uso automotivo", + "1007600": "Dobradiças de metais comuns, de qualquer tipo", + "1007700": "Tubos flexíveis de metais comuns, mesmo com acessórios, para uso na construção", + "1007800": + "Fios, varetas, tubos, chapas, eletrodos e artefatos semelhantes, de metais comuns ou de carbonetos metálicos, revestidos exterior ou interiormente de decapantes ou de fundentes, para soldagem (soldadura) ou depósito de metal ou de carbonetos metálicos fios e varetas de pós de metais comuns aglomerados, para metalização por projeção", + "1007900": + "Torneiras, válvulas (incluídas as redutoras de pressão e as termostáticas) e dispositivos semelhantes, para canalizações, caldeiras, reservatórios, cubas e outros recipientes", + "1008000": "Espelhos de vidro, mesmo emoldurados, exceto os de uso automotivo", + "1100100": "Água sanitária, branqueador e outros alvejantes", + "1100200": + "Sabões, desinfetantes e sanitizantes, todos em pó, flocos, palhetas, grânulos ou outras formas semelhantes, para lavar roupas", + "1100300": "Sabões, desinfetantes e sanitizantes, todos líquidos para lavar roupas", + "1100400": + "Detergentes em pó, flocos, palhetas, grânulos ou outras formas semelhantes, inclusive adicionados de propriedades desinfetantes ou sanitizantes", + "1100500": "Detergentes líquidos, exceto para lavar roupa", + "1100600": + "Detergente líquido para lavar roupa, inclusive adicionados de propriedades desinfetantes ou sanitizantes", + "1100700": + "Outros agentes orgânicos de superfície (exceto sabões); preparações tensoativas, preparações para lavagem (incluídas as preparações auxiliares para lavagem) e preparações para limpeza (inclusive multiuso e limpadores), mesmo contendo sabão, exceto os produtos descritos nos CEST 11.001.00, 11.004.00, 11.005.00 e 11.006.00; em embalagem de conteúdo inferior ou igual a 50 litros ou 50 kg", + "1100800": "Amaciante/suavizante", + "1100900": "Esponjas para limpeza", + "1101000": "Álcool etílico para limpeza", + "1101100": + "Esponjas e palhas de aço; esponjas para limpeza, polimento ou uso semelhantes; todas de uso doméstico", + "1101200": "Sacos de lixo de conteúdo igual ou inferior a 100 litros", + "1200100": + "Transformadores, bobinas de reatância e de auto indução, inclusive os transformadores de potência superior a 16 KVA, classificados nas posições 8504.33.00 e 8504.34.00; exceto os demais transformadores da subposição 8504.3, os reatores para lâmpadas elétricas de descarga classificados no código 8504.10.00, os carregadores de acumuladores do código 8504.40.10, os equipamentos de alimentação ininterrupta de energia (UPS ou “no break”), no código 8504.40.40 e os de uso automotivo", + "1200200": + "Aquecedores elétricos de água, incluídos os de imersão, chuveiros ou duchas elétricos, torneiras elétricas, resistências de aquecimento, inclusive as de duchas e chuveiros elétricos e suas partes; exceto outros fornos, fogareiros (incluídas as chapas de cocção), grelhas e assadeiras, classificados na posição 8516.60.00", + "1200300": + "Aparelhos para interrupção, seccionamento, proteção, derivação, ligação ou conexão de circuitos elétricos (por exemplo, interruptores, comutadores, corta-circuitos, para-raios, limitadores de tensão, eliminadores de onda, tomadas de corrente e outros conectores, caixas de junção), para tensão superior a 1.000V, exceto os de uso automotivo", + "1200400": + "Aparelhos para interrupção, seccionamento, proteção, derivação, ligação ou conexão de circuitos elétricos (por exemplo, interruptores, comutadores, relés, corta-circuitos, eliminadores de onda, plugues e tomadas de corrente, suportes para lâmpadas e outros conectores, caixas de junção), para uma tensão não superior a 1.000V; conectores para fibras ópticas, feixes ou cabos de fibras ópticas; exceto “starter” classificado na subposição 8536.50 e os de uso automotivo", + "1200500": + "Partes reconhecíveis como exclusiva ou principalmente destinadas aos aparelhos das posições 8535 e 8536", + "1200600": + "Cabos, tranças e semelhantes, de cobre, não isolados para usos elétricos, exceto os de uso automotivo", + "1200700": + "Fios, cabos (incluídos os cabos coaxiais) e outros condutores, isolados ou não, para usos elétricos (incluídos os de cobre ou alumínio, envernizados ou oxidados anodicamente), mesmo com peças de conexão, inclusive fios e cabos elétricos, para tensão não superior a 1000V, para uso na construção; fios e cabos telefônicos e para transmissão de dados; cabos de fibras ópticas, constituídos de fibras embainhadas individualmente, mesmo com condutores elétricos ou munidos de peças de conexão; cordas, cabos, tranças e semelhantes, de alumínio, não isolados para uso elétricos; exceto os de uso automotivo", + "1200800": "Isoladores de qualquer matéria, para usos elétricos", + "1200900": + "Peças isolantes inteiramente de matérias isolantes, ou com simples peças metálicas de montagem (suportes roscados, por exemplo) incorporadas na massa, para máquinas, aparelhos e instalações elétricas; tubos isoladores e suas peças de ligação, de metais comuns, isolados interiormente", + "1300100": "Medicamentos de referência - positiva, exceto para uso veterinário", + "1300101": "Medicamentos de referência - negativa, exceto para uso veterinário", + "1300102": "Medicamentos de referência - neutra, exceto para uso veterinário", + "1300200": "Medicamentos genérico - positiva, exceto para uso veterinário", + "1300201": "Medicamentos genérico - negativa, exceto para uso veterinário", + "1300202": "Medicamentos genérico - neutra, exceto para uso veterinário", + "1300300": "Medicamentos similar - positiva, exceto para uso veterinário", + "1300301": "Medicamentos similar - negativa, exceto para uso veterinário", + "1300302": "Medicamentos similar - neutra, exceto para uso veterinário", + "1300400": "Outros tipos de medicamentos - positiva, exceto para uso veterinário", + "1300401": "Outros tipos de medicamentos - negativa, exceto para uso veterinário", + "1300402": "Outros tipos de medicamentos - neutra, exceto para uso veterinário", + "1300500": + "Preparações químicas contraceptivas de referência, à base de hormônios, de outros produtos da posição 29.37 ou de espermicidas - positiva", + "1300501": + "Preparações químicas contraceptivas de referência, à base de hormônios, de outros produtos da posição 29.37 ou de espermicidas - negativa", + "1300502": + "Preparações químicas contraceptivas genérico, à base de hormônios, de outros produtos da posição 29.37 ou de espermicidas – positiva", + "1300503": + "Preparações químicas contraceptivas genérico, à base de hormônios, de outros produtos da posição 29.37 ou de espermicidas – negativa", + "1300504": + "Preparações químicas contraceptivas similar, à base de hormônios, de outros produtos da posição 29.37 ou de espermicidas – positiva", + "1300505": + "Preparações químicas contraceptivas similar, à base de hormônios, de outros produtos da posição 29.37 ou de espermicidas – negativa", + "1300600": + "Provitaminas e vitaminas, naturais ou reproduzidas por síntese (incluídos os concentrados naturais), bem como os seus derivados utilizados principalmente como vitaminas, misturados ou não entre si, mesmo em quaisquer soluções - neutra", + "1300700": + "Preparações opacificantes (contrastantes) para exames radiográficos e reagentes de diagnóstico concebidos para serem administrados ao paciente - positiva", + "1300701": + "Preparações opacificantes (contrastantes) para exames radiográficos e reagentes de diagnóstico concebidos para serem administrados ao paciente - negativa", + "1300800": + "Antissoro, outras frações do sangue, produtos imunológicos modificados, mesmo obtidos por via biotecnológica, exceto para uso veterinário - positiva", + "1300801": + "Antissoro, outras frações do sangue, produtos imunológicos modificados, mesmo obtidos por via biotecnológica, exceto para uso veterinário - negativa", + "1300900": "Vacinas e produtos semelhantes, exceto para uso veterinário - positiva", + "1300901": "Vacinas e produtos semelhantes, exceto para uso veterinário - negativa", + "1301000": + "Curativos (pensos) adesivos e outros artigos com uma camada adesiva, impregnados ou recobertos de substâncias farmacêuticas - Lista Positiva", + "1301001": + "Curativos (pensos) adesivos e outros artigos com uma camada adesiva, impregnados ou recobertos de substâncias farmacêuticas - Lista Negativa", + "1301100": + "Algodão, atadura, esparadrapo, gazes, pensos, sinapismos, e outros, acondicionados para venda a retalho para usos medicinais, cirúrgicos ou dentários, não impregnados ou recobertos de substâncias farmacêuticas - Lista Neutra", + "1301200": "Luvas cirúrgicas e luvas de procedimento - neutra", + "1301300": "Preservativo – neutra", + "1301400": "Seringas, mesmo com agulhas - neutra", + "1301500": "Agulhas para seringas - neutra", + "1301600": "Contraceptivos (dispositivos intrauterinos - DIU) - neutra", + "1400100": "Objetos de vidro para serviço de mesa ou de cozinha", + "1400200": "Outros copos, exceto de vitrocerâmica", + "1400300": "Objetos para serviço de mesa (exceto copos) ou de cozinha, exceto de vitrocerâmica", + "1400400": "Lonas plásticas, exceto as para uso na construção", + "1400500": "Artefatos de higiene/toucador de plástico, exceto os para uso na construção", + "1400600": + "Serviços de mesa e outros utensílios de mesa ou de cozinha, de plástico, não descartáveis", + "1400601": + "Serviços de mesa e outros utensílios de mesa ou de cozinha, de plástico, descartáveis", + "1400700": + "Artigos para serviço de mesa ou de cozinha, de porcelana, inclusive os descartáveis - estojos", + "1400800": + "Artigos para serviço de mesa ou de cozinha, de porcelana, inclusive os descartáveis - avulsos", + "1400900": "Artigos para serviço de mesa ou de cozinha, de cerâmica", + "1401000": "Velas para filtros", + "1401100": "Filtros descartáveis para coar café ou chá", + "1401200": + "Bandejas, travessas, pratos, xícaras ou chávenas, taças, copos e artigos semelhantes, de papel ou cartão", + "1401300": "Papel para cigarro", + "1600100": + "Pneus novos, dos tipos utilizados em automóveis de passageiros (incluídos os veículos de uso misto - camionetas e os automóveis de corrida)", + "1600200": + "Pneus novos, dos tipos utilizados em caminhões (inclusive para os fora-de-estrada), ônibus, aviões, máquinas de terraplenagem, de construção e conservação de estradas, máquinas e tratores agrícolas, pá-carregadeira", + "1600300": "Pneus novos para motocicletas", + "1600400": "Outros tipos de pneus novos, exceto os itens classificados no CEST 16.005.00", + "1600500": "Pneus novos de borracha dos tipos utilizados em bicicletas", + "1600600": "Pneus recauchutados", + "1600700": "Protetores de borracha, exceto os itens classificados no CEST 16.007.01", + "1600701": "Protetores de borracha para bicicletas", + "1600800": "Câmaras de ar de borracha, exceto os itens classificados no CEST 16.009.00", + "1600900": "Câmaras de ar de borracha dos tipos utilizados em bicicletas", + "1700100": + "Chocolate branco, em embalagens de conteúdo inferior ou igual a 1 kg, exceto os classificados no CEST 17.005.00", + "1700101": + "Chocolate branco, em embalagens de conteúdo superior a 1 kg e inferior ou igual a 2 kg, exceto os classificados no CEST 17.005.00", + "1700102": + "Coberturas de chocolate branco e outros produtos de confeitaria com manteiga de cacau, em embalagens de conteúdo inferior ou igual a 1 kg, exceto os classificados no CEST 17.008.00", + "1700103": + "Coberturas de chocolate branco e outros produtos de confeitaria com manteiga de cacau, em embalagens de conteúdo superior a 1 kg e inferior ou igual a 2 kg, exceto os classificados no CEST 17.008.00", + "1700200": + "Chocolates, em tabletes, barras ou paus, recheados, em recipientes ou embalagens imediatas de conteúdo inferior ou igual a 1 kg", + "1700201": + "Chocolates, em tabletes, barras ou paus, recheados, em recipientes ou embalagens de conteúdo superior a 1 kg e inferior ou igual a 2 kg", + "1700202": + "Outras preparações alimentícias que contenham cacau, em tabletes, barras ou paus, recheados, em recipientes ou embalagens imediatas de conteúdo inferior ou igual a 1 kg", + "1700203": + "Outras preparações alimentícias que contenham cacau, em tabletes, barras ou paus, recheados, em recipientes ou embalagens de conteúdo superior a 1 kg e inferior ou igual a 2 kg", + "1700300": + "Chocolates, em tabletes, barras ou paus, não recheados, em recipientes ou embalagens imediatas de conteúdo inferior ou igual a 2 kg", + "1700301": + "Outras preparações alimentícias que contenham cacau, em tabletes, barras ou paus, não recheados, em recipientes ou embalagens imediatas de conteúdo inferior ou igual a 2 kg", + "1700400": + "Chocolates e outras preparações alimentícias contendo cacau, em embalagens de conteúdo inferior ou igual a 1 kg, exceto os classificados nos CEST 17.005.01, 17.006.00, 17.006.02, 17.007.00 e 17.109.00", + "1700401": + "Chocolates e outras preparações alimentícias contendo cacau, em embalagens de conteúdo superior a 1 kg e inferior ou igual a 2 kg, exceto os classificados nos CEST 17.005.01, 17.006.00, 17.006.02 e 17.007.00", + "1700500": "Ovos de páscoa de chocolate branco", + "1700501": "Ovos de páscoa de chocolate", + "1700600": + "Achocolatados em pó, em embalagens de conteúdo inferior ou igual a 1 kg, exceto os classificados no CEST 17.006.02", + "1700601": + "Cacau em pó, com adição de açúcar ou de outros edulcorantes, em embalagens de conteúdo inferior ou igual a 1kg", + "1700602": "Achocolatados em pó, em cápsulas", + "1700700": "Caixas de bombons contendo cacau, em embalagens de conteúdo inferior ou igual a 1 kg", + "1700800": "Bombons, inclusive à base de chocolate branco sem cacau", + "1700900": + "Bombons, balas, caramelos, confeitos, pastilhas e outros produtos de confeitaria, contendo cacau", + "1701000": "Sucos de frutas ou de produtos hortícolas; mistura de sucos", + "1701100": "Água de coco", + "1701200": "Leite em pó, blocos ou grânulos, exceto creme de leite", + "1701300": "Farinha láctea", + "1701400": "Leite modificado para alimentação de crianças", + "1701500": + "Preparações para alimentação infantil à base de farinhas, grumos, sêmolas ou amidos e outros", + "1701600": + "Leite “longa vida” (UHT - “Ultra High Temperature”), em recipiente de conteúdo inferior ou igual a 2 litros", + "1701601": + "Leite “longa vida” (UHT - “Ultra High Temperature”), em recipiente de conteúdo superior a 2 litros e inferior ou igual a 5 litros", + "1701700": "Leite em recipiente de conteúdo inferior ou igual a 1 litro", + "1701701": "Leite em recipiente de conteúdo superior a 1 litro e inferior ou igual a 5 litros", + "1701800": "Leite do tipo pasteurizado em recipiente de conteúdo inferior ou igual a 1 litro", + "1701801": + "Leite do tipo pasteurizado em recipiente de conteúdo superior a 1 litro e inferior ou igual a 5 litros", + "1701900": "Creme de leite, em recipiente de conteúdo inferior ou igual a 1 kg", + "1701901": "Creme de leite, em recipiente de conteúdo superior a 1 kg", + "1701902": "Outros cremes de leite, em recipiente de conteúdo inferior ou igual a 1kg", + "1701903": "Outros cremes de leite, em recipiente de conteúdo superior a 1kg", + "1702000": "Leite condensado, em recipiente de conteúdo inferior ou igual a 1 kg", + "1702001": "Leite condensado, em recipiente de conteúdo superior a 1 kg", + "1702100": + "Iogurte e leite fermentado em recipiente de conteúdo inferior ou igual a 2 litros, exceto o item classificado no CEST 17.022.00", + "1702101": + "Iogurte e leite fermentado em recipiente de conteúdo superior a 2 litros, exceto o item classificado no CEST 17.022.00", + "1702200": "Coalhada", + "1702300": + "Requeijão e similares, em recipiente de conteúdo inferior ou igual a 1 kg, exceto as embalagens individuais de conteúdo inferior ou igual a 10 g", + "1702301": "Requeijão e similares, em recipiente de conteúdo superior a 1 kg", + "1702400": "Queijos, exceto os dos CEST 17.024.01, 17.024.02, 17.024.03, 17.024.04 e 17.024.05", + "1702401": "Queijo muçarela", + "1702402": "Queijo minas frescal", + "1702403": "Queijo ricota", + "1702404": "Queijo petitsuisse", + "1702405": "Queijo cremoso (“cream cheese”)", + "1702500": + "Manteiga, em embalagem de conteúdo inferior ou igual a 1 kg, exceto as embalagens individuais de conteúdo inferior ou igual a 10 g", + "1702501": "Manteiga, em embalagem de conteúdo superior a 1 kg", + "1702502": "Manteiga de garrafa", + "1702600": + "Margarina e creme vegetal em recipiente de conteúdo inferior ou igual a 500 g, exceto as embalagens individuais de conteúdo inferior ou igual a 10 g", + "1702700": + "Margarina e creme vegetal, em recipiente de conteúdo superior a 500 g e inferior ou igual a 1 kg, exceto as embalagens individuais de conteúdo inferior ou igual a 10 g", + "1702701": "Margarina e creme vegetal, em recipiente de conteúdo superior a 1 kg", + "1702702": + "Outras margarinas e cremes vegetais em recipiente de conteúdo inferior a 1 kg, exceto as embalagens individuais de conteúdo inferior ou igual a 10 g", + "1702800": + "Gorduras e óleos vegetais e respectivas frações, parcial ou totalmente hidrogenados, interesterificados, reesterificados ou elaidinizados, mesmo refinados, mas não preparados de outro modo, em recipiente de conteúdo inferior ou igual a 1 kg, exceto as embalagens individuais de conteúdo inferior ou igual a 10 g", + "1702801": + "Gorduras e óleos vegetais e respectivas frações, parcial ou totalmente hidrogenados, interesterificados, reesterificados ou elaidinizados, mesmo refinados, mas não preparados de outro modo, em recipiente de conteúdo superior a 1 kg, exceto as embalagens individuais de conteúdo inferior ou igual a 10 g", + "1702900": "Doces de leite", + "1703000": "Produtos à base de cereais, obtidos por expansão ou torrefação", + "1703100": "Salgadinhos diversos, exceto os classificados no CEST 17.031.01 e 17.031.02", + "1703101": "Salgadinhos diversos, derivados de farinha de trigo", + "1703102": "Biscoitos de polvilho", + "1703200": "Batata frita, inhame e mandioca fritos", + "1703300": + "Amendoim e castanhas tipo aperitivo, em embalagem de conteúdo inferior ou igual a 1 kg", + "1703301": "Amendoim e castanhas tipo aperitivo, em embalagem de conteúdo superior a 1 kg", + "1703400": + "Catchup em embalagens imediatas de conteúdo inferior ou igual a 650 g, exceto as embalagens contendo envelopes individualizados (sachês) de conteúdo inferior ou igual a 10 g", + "1703500": + "Condimentos e temperos compostos, incluindo molho de pimenta e outros molhos, em embalagens imediatas de conteúdo inferior ou igual a 1 kg, exceto as embalagens contendo envelopes individualizados (sachês) de conteúdo inferior ou igual a 3 g", + "1703600": + "Molhos de soja preparados em embalagens imediatas de conteúdo inferior ou igual a 650 g, exceto as embalagens contendo envelopes individualizados (sachês) de conteúdo inferior ou igual a 10 g", + "1703700": "Farinha de mostarda em embalagens de conteúdo inferior ou igual a 1 kg", + "1703800": + "Mostarda preparada em embalagens imediatas de conteúdo inferior ou igual a 650 g, exceto as embalagens contendo envelopes individualizados (sachês) de conteúdo inferior ou igual a 10 g", + "1703900": + "Maionese em embalagens imediatas de conteúdo inferior ou igual a 650 g, exceto as embalagens contendo envelopes individualizados (sachês) de conteúdo inferior ou igual a 10 g", + "1704000": + "Tomates preparados ou conservados, exceto em vinagre ou em ácido acético, em embalagens de conteúdo inferior ou igual a 1 kg", + "1704100": "Molhos de tomate em embalagens imediatas de conteúdo inferior ou igual a 1 kg", + "1704200": "Barra de cereais", + "1704300": "Barra de cereais contendo cacau", + "1704400": "Farinha de trigo especial, em embalagem inferior ou igual a 1 kg", + "1704401": "Farinha de trigo especial, em embalagem superior a 1 kg e inferior a 5 kg", + "1704402": "Farinha de trigo especial, em embalagem igual a 5 kg", + "1704403": "Farinha de trigo especial, em embalagem superior a 5 kg e inferior ou igual a 25 kg", + "1704404": "Farinha de trigo especial, em embalagem superior a 25 kg e inferior ou igual a 50 kg", + "1704405": "Farinha de trigo comum, em embalagem igual a 5 kg", + "1704406": "Farinha de trigo comum, em embalagem superior a 5 kg e inferior ou igual a 25 kg", + "1704407": "Farinha de trigo comum, em embalagem superior a 25 kg e inferior ou igual a 50 kg", + "1704408": + "Farinha de trigo doméstica especial, em embalagem superior a 5 kg e inferior e igual a 10 kg", + "1704409": + "Farinha de trigo doméstica com fermento, em embalagem superior a 5 kg e inferior e igual a 10 kg", + "1704410": "Farinha de trigo especial, em embalagem superior a 50 Kg", + "1704411": "Farinha de trigo comum, em embalagem inferior ou igual a 1 kg", + "1704412": "Farinha de trigo comum, em embalagem superior a 1 kg e inferior a 5 Kg", + "1704413": "Farinha de trigo comum, em embalagem superior a 50 kg", + "1704414": "Farinha de trigo doméstica especial, em embalagem inferior ou igual a 1 kg", + "1704415": "Farinha de trigo doméstica especial, em embalagem superior a 1 kg e inferior a 5 Kg", + "1704416": "Farinha de trigo doméstica especial, em embalagem igual a 5 Kg", + "1704417": "Farinha de trigo doméstica especial, em embalagem superior a 10 Kg", + "1704418": "Farinha de trigo doméstica com fermento, em embalagem inferior ou igual a 1 kg", + "1704419": + "Farinha de trigo doméstica com fermento, em embalagem superior a 1 kg e inferior a 5 Kg", + "1704420": "Farinha de trigo doméstica com fermento, em embalagem igual a 5 Kg", + "1704421": "Farinha de trigo doméstica com fermento, em embalagem superior a 10 Kg", + "1704422": "Outras farinhas de trigo, em embalagem inferior ou igual a 1 kg", + "1704423": "Outras farinhas de trigo, em embalagem superior a 1 kg e inferior a 5 Kg", + "1704424": "Outras farinhas de trigo, em embalagem igual a 5 Kg", + "1704425": "Outras farinhas de trigo, em embalagem superior a 5 Kg e inferior ou igual a 25 kg", + "1704426": "Outras farinhas de trigo, em embalagem superior a 25 Kg e inferior ou igual a 50 kg", + "1704427": "Outras farinhas de trigo, em embalagem superior a 50 Kg", + "1704500": "Farinha de mistura de trigo com centeio (méteil)", + "1704600": "Misturas e preparações para bolos, em embalagem inferior 5 kg", + "1704601": "Misturas e preparações para bolos, em embalagem igual a 5 kg", + "1704602": + "Misturas e preparações para bolos, em embalagem superior a 5 kg e inferior ou igual a 25 Kg", + "1704603": + "Misturas e preparações para bolos, em embalagem superior a 25 kg e inferior ou igual a 50 Kg", + "1704604": "Misturas e preparações para bolos, em embalagem superior a 50 Kg", + "1704605": + "Misturas e preparações para pães com menos de 80% de farinha de trigo na sua composição final, em embalagem inferior a 5 kg", + "1704606": + "Misturas e preparações para pães com menos de 80% de farinha de trigo na sua composição final, em embalagem igual a 5 kg", + "1704607": + "Misturas e preparações para pães com menos de 80% de farinha de trigo na sua composição final, em embalagem superior a 5 kg e inferior ou igual a 25 Kg", + "1704608": + "Misturas e preparações para pães com menos de 80% de farinha de trigo na sua composição final, em embalagem superior a 25 kg e inferior ou igual a 50 Kg", + "1704609": + "Misturas e preparações para pães com menos de 80% de farinha de trigo na sua composição final, em embalagem superior a 50 Kg", + "1704610": + "Misturas e preparações para pães com, no mínimo, 80% de farinha de trigo na sua composição final, em embalagem inferior a 5 kg", + "1704611": + "Misturas e preparações para pães com, no mínimo, 80% de farinha de trigo na sua composição final, em embalagem igual a 5 kg", + "1704612": + "Misturas e preparações para pães com, no mínimo, 80% de farinha de trigo na sua composição final, em embalagem superior a 5 kg e inferior ou igual a 25 Kg", + "1704613": + "Misturas e preparações para pães com, no mínimo, 80% de farinha de trigo na sua composição final, em embalagem superior a 25 kg e inferior ou igual a 50 Kg", + "1704614": + "Misturas e preparações para pães com, no mínimo, 80% de farinha de trigo na sua composição final, em embalagem superior a 50 Kg", + "1704615": + "Misturas e pastas para a preparação de produtos de padaria, pastelaria e da indústria de bolachas e biscoitos, da posição 19.05, exceto os previstos nos CEST 17.046.00 a 17.046.14 e 17.046.16", + "1704616": + "Misturas e preparações com, no mínimo, 80% de farinha de trigo na sua composição final, exceto as descritas nos CEST 17.046.10 a 17.046.15", + "1704700": "Massas alimentícias tipo instantânea, exceto as descritas no CEST 17047.01", + "1704701": "Massas alimentícias tipo instantânea, derivadas de farinha de trigo", + "1704800": + "Massas alimentícias, cozidas ou recheadas (de carne ou de outras substâncias) ou preparadas de outro modo, exceto as descritas nos CEST 17.047.00, 17.048.01, e 17.048.02", + "1704801": "Cuscuz", + "1704802": "Massas alimentícias recheadas (mesmo cozidas ou preparadas de outro modo)", + "1704900": + "Massas alimentícias do tipo comum, não cozidas, nem recheadas, nem preparadas de outro modo, não derivadas do trigo", + "1704901": + "Massas alimentícias do tipo sêmola, não cozidas, nem recheadas, nem preparadas de outro modo, não derivadas do trigo", + "1704902": + "Massas alimentícias do tipo grano duro, não cozidas, nem recheadas, nem preparadas de outro modo, que contenham ovos", + "1704903": + "Outras massas alimentícias do tipo comum, não cozidas, nem recheadas, nem preparadas de outro modo, que não contenham ovos, derivadas de farinha de trigo", + "1704904": + "Outras massas alimentícias do tipo sêmola, não cozidas, nem recheadas, nem preparadas de outro modo, que não contenham ovos, derivadas do trigo", + "1704905": + "Outras massas alimentícias do tipo grano duro, não cozidas, nem recheadas, nem preparadas de outro modo, que não contenham ovos", + "1704906": + "Massas alimentícias do tipo comum, não cozidas, nem recheadas, nem preparadas de outro modo, que contenham ovos, derivadas de farinha de trigo", + "1704907": + "Massas alimentícias do tipo sêmola, não cozidas, nem recheadas, nem preparadas de outro modo, que contenham ovos, derivadas do trigo", + "1705000": "Pães industrializados, inclusive de especiarias, exceto panetones e bolo de forma", + "1705100": "Bolo de forma, inclusive de especiarias", + "1705200": "Panetones", + "1705300": + "Biscoitos e bolachas derivados de farinha de trigo; (exceto dos tipos “cream cracker”, “água e sal”, “maisena”, “maria” e outros de consumo popular que não sejam adicionados de cacau, nem recheados, cobertos ou amanteigados, independentemente de sua denominação comercial)", + "1705301": + "Biscoitos e bolachas derivados de farinha de trigo dos tipos “maisena” e “maria” e outros de consumo popular que não sejam adicionados de cacau, nem recheados, cobertos ou amanteigados, independentemente de sua denominação comercial, exceto o CEST 17.053.02", + "1705302": + 'Biscoitos e bolachas derivados de farinha de trigo dos tipos "cream cracker" e "água e sal" de consumo popular', + "1705400": + 'Biscoitos e bolachas não derivados de farinha de trigo; (exceto dos tipos "cream cracker", "água e sal", "maisena" e "maria" e outros de consumo popular que não sejam adicionados de cacau, nem recheados, cobertos ou amanteigados, independentemente de sua denominação comercial)', + "1705401": + 'Biscoitos e bolachas não derivados de farinha de trigo dos tipos "maisena" e "maria" e outros de consumo popular que não sejam adicionados de cacau, nem recheados, cobertos ou amanteigados, independentemente de sua denominação comercial, exceto o CEST 17.054.02', + "1705402": + 'Biscoitos e bolachas não derivados de farinha de trigo dos tipos "cream cracker" e "água e sal" de consumo popular', + "1705600": + "Biscoitos e bolachas derivados de farinha de trigo dos tipos “cream cracker” e “água e sal”", + "1705601": + "Biscoitos e bolachas não derivados de farinha de trigo dos tipos “cream cracker” e “água e sal”", + "1705602": + "Outras bolachas, exceto casquinhas para sorvete e os biscoitos e bolachas relacionados nos CEST 17.056.00 e 17.056.01", + "1705700": "“Waffles” e “wafers” - sem cobertura", + "1705800": "“Waffles” e “wafers” - com cobertura", + "1705900": "Torradas, pão torrado e produtos semelhantes torrados", + "1706000": "Outros pães de forma", + "1706200": "Outros pães, exceto o classificado no CEST 17.062.03", + "1706201": + "Outros bolos industrializados e produtos de panificação não especificados anteriormente, incluindo as pizzas; exceto os classificados nos CEST 17.062.02 e 17.062.03", + "1706202": "Casquinhas para sorvete", + "1706203": "Pão francês até 200g", + "1706300": "Pão denominado knackebrot", + "1706400": "Demais pães industrializados", + "1706500": + "Óleo de soja refinado, em recipientes com capacidade inferior ou igual a 5 litros, exceto as embalagens individuais de conteúdo inferior ou igual a 15 mililitros", + "1706600": + "Óleo de amendoim refinado, em recipientes com capacidade inferior ou igual a 5 litros, exceto as embalagens individuais de conteúdo inferior ou igual a 15 mililitros", + "1706700": + "Azeites de oliva, em recipientes com capacidade inferior a 2 litros, exceto as embalagens individuais de conteúdo inferior ou igual a 20 mililitros", + "1706701": + "Azeites de oliva, em recipientes com capacidade igual ou superior a 2 litros e inferior ou igual a 5 litros", + "1706702": "Azeites de oliva, em recipientes com capacidade superior a 5 litros", + "1706800": + "Outros óleos e respectivas frações, obtidos exclusivamente a partir de azeitonas, mesmo refinados, mas não quimicamente modificados, e misturas desses óleos ou frações com óleos ou frações da posição 15.09, em recipientes com capacidade inferior ou igual a 5 litros, exceto as embalagens individuais de conteúdo inferior ou igual a 15 mililitros", + "1706900": + "Óleo de girassol em recipientes com capacidade inferior ou igual a 5 litros, exceto as embalagens individuais de conteúdo inferior ou igual a 15 mililitros", + "1706901": + "Óleo de algodão refinado em recipientes com capacidade inferior ou igual a 5 litros, exceto as embalagens individuais de conteúdo inferior ou igual a 15 mililitros", + "1707000": + "Óleo de canola, em recipientes com capacidade inferior ou igual a 5 litros, exceto as embalagens individuais de conteúdo inferior ou igual a 15 mililitros", + "1707100": + "Óleo de linhaça refinado, em recipientes com capacidade inferior ou igual a 5 litros, exceto as embalagens individuais de conteúdo inferior ou igual a 15 mililitros", + "1707200": + "Óleo de milho refinado, em recipientes com capacidade inferior ou igual a 5 litros, exceto as embalagens individuais de conteúdo inferior ou igual a 15 mililitros", + "1707300": + "Outros óleos refinados, em recipientes com capacidade inferior ou igual a 5 litros, exceto as embalagens individuais de conteúdo inferior ou igual a 15 mililitros", + "1707400": + "Misturas de óleos refinados, para consumo humano, em recipientes com capacidade inferior ou igual a 5 litros, exceto as embalagens individuais de conteúdo inferior ou igual a 15 mililitros", + "1707500": "Outros óleos vegetais comestíveis não especificados anteriormente", + "1707600": + "Enchidos (embutidos) e produtos semelhantes, de carne, miudezas ou sangue; exceto salsicha, linguiça e mortadela", + "1707700": "Salsicha e linguiça, exceto as descritas nos CEST 17.077.01", + "1707701": "Salsicha em lata", + "1707800": "Mortadela", + "1707900": + "Outras preparações e conservas de carne, miudezas ou de sangue, exceto as descritas nos CEST 17.079.01, 17.079.02, 17.079.03, 17.079.04, 17.079.05, 17.079.06, 17.079.07 e 17.079.08", + "1707901": + "Outras preparações e conservas de carne, de miudezas ou de sangue, de aves da posição 01.05: de peruas e de perus, exceto as descritas no CEST 17.079.08", + "1707902": + "Outras preparações e conservas de carne, de miudezas ou de sangue, de aves da posição 01.05: de galos e de galinhas, com conteúdo de carne ou de miudezas superior ou igual a 57 %, em peso, não cozidas, exceto as descritas no CEST 17.079.08", + "1707903": + "Outras preparações e conservas de carne, de miudezas ou de sangue, de aves da posição 01.05: de galos e de galinhas, com conteúdo de carne ou de miudezas superior ou igual a 57 %, em peso, cozidas, exceto as descritas no CEST 17.079.08", + "1707904": + "Outras preparações e conservas de carne, de miudezas ou de sangue, da espécie suína: pernas e respectivos pedaços", + "1707905": + "Outras preparações e conservas de carne, de miudezas ou de sangue, da espécie suína: outras, incluindo as misturas, exceto os descritos no CEST 17.079.07", + "1707906": "Outras preparações e conservas de carne, de miudezas ou de sangue, da espécie bovina", + "1707907": "Apresuntado", + "1707908": "Carnes de aves inteiras e com peso unitário superior a 3 kg, temperadas", + "1708000": + "Preparações e conservas de peixes; caviar e seus sucedâneos preparados a partir de ovas de peixe; exceto os descritos nos CEST 17.080.01 e 17.081.00", + "1708001": "Outras preparações e conservas de atuns", + "1708100": "Sardinha em conserva", + "1708200": "Crustáceos, moluscos e outros invertebrados aquáticos, preparados ou em conservas", + "1708300": + "Carne de gado bovino, ovino e bufalino e produtos comestíveis resultantes da matança desse gado submetidos à salga, secagem ou desidratação, exceto os descritos no CEST 17.083.01", + "1708301": "Charque e jerkedbeef", + "1708400": + "Carne de gado bovino, ovino e bufalino e demais produtos comestíveis resultantes da matança desse gado frescos, refrigerados ou congelados", + "1708500": "Carnes de animais das espécies caprina, frescas, refrigeradas ou congeladas", + "1708600": + "Carnes e demais produtos comestíveis frescos, resfriados, congelados, salgados ou salmourados resultantes do abate de caprinos", + "1708700": + "Carnes e demais produtos comestíveis frescos, resfriados, congelados, salgados, em salmoura, simplesmente temperados, secos ou defumados, resultantes do abate de aves, exceto os descritos no CEST 17.087.02", + "1708701": + "Carnes e demais produtos comestíveis frescos, resfriados, congelados, salgados, em salmoura, simplesmente temperados, secos ou defumados, resultantes do abate de suínos", + "1708702": "Carnes de aves inteiras e com peso unitário superior a 3 kg", + "1708800": + "Produtos hortícolas, cozidos em água ou vapor, congelados, em embalagens de conteúdo inferior ou igual a 1 kg", + "1708801": + "Produtos hortícolas, cozidos em água ou vapor, congelados, em embalagens de conteúdo superior a 1 kg", + "1708900": + "Frutas, não cozidas ou cozidas em água ou vapor, congeladas, mesmo adicionadas de açúcar ou de outros edulcorantes, em embalagens de conteúdo inferior ou igual a 1 kg", + "1708901": + "Frutas, não cozidas ou cozidas em água ou vapor, congeladas, mesmo adicionadas de açúcar ou de outros edulcorantes, em embalagens de conteúdo superior a 1 kg", + "1709000": + "Produtos hortícolas, frutas e outras partes comestíveis de plantas, preparados ou conservados em vinagre ou em ácido acético, em embalagens de conteúdo inferior ou igual a 1 kg", + "1709001": + "Produtos hortícolas, frutas e outras partes comestíveis de plantas, preparados ou conservados em vinagre ou em ácido acético, em embalagens de conteúdo superior a 1 kg", + "1709100": + "Outros produtos hortícolas preparados ou conservados, exceto em vinagre ou em ácido acético, congelados, com exceção dos produtos da posição 20.06, em embalagens de conteúdo inferior ou igual a 1 kg", + "1709101": + "Outros produtos hortícolas preparados ou conservados, exceto em vinagre ou em ácido acético, congelados, com exceção dos produtos da posição 20.06, em embalagens de conteúdo superior a 1 kg", + "1709200": + "Outros produtos hortícolas preparados ou conservados, exceto em vinagre ou em ácido acético, não congelados, com exceção dos produtos da posição 20.06, excluídos batata, inhame e mandioca fritos, em embalagens de conteúdo inferior ou igual a 1 kg", + "1709201": + "Outros produtos hortícolas preparados ou conservados, exceto em vinagre ou em ácido acético, não congelados, com exceção dos produtos da posição 20.06, excluídos batata, inhame e mandioca fritos, em embalagens de conteúdo superior a 1 kg", + "1709300": + "Produtos hortícolas, frutas, cascas de frutas e outras partes de plantas, conservados com açúcar (passados por calda, glaceados ou cristalizados), em embalagens de conteúdo inferior ou igual a 1 kg", + "1709301": + "Produtos hortícolas, frutas, cascas de frutas e outras partes de plantas, conservados com açúcar (passados por calda, glaceados ou cristalizados), em embalagens de conteúdo superior a 1 kg", + "1709400": + "Doces, geleias, “marmelades”, purês e pastas de frutas, obtidos por cozimento, com ou sem adição de açúcar ou de outros edulcorantes, em embalagens de conteúdo inferior ou igual a 1 kg, exceto as embalagens individuais de conteúdo inferior ou igual a 10 g", + "1709401": + "Doces, geleias, “marmelades”, purês e pastas de frutas, obtidos por cozimento, com ou sem adição de açúcar ou de outros edulcorantes, em embalagens de conteúdo superior a 1 kg", + "1709500": + "Frutas e outras partes comestíveis de plantas, preparadas ou conservadas de outro modo, com ou sem adição de açúcar ou de outros edulcorantes ou de álcool, não especificadas nem compreendidas em outras posições, excluídos os amendoins e castanhas tipo aperitivo, da posição 2008.1, em embalagens de conteúdo inferior ou igual a 1 kg", + "1709501": + "Frutas e outras partes comestíveis de plantas, preparadas ou conservadas de outro modo, com ou sem adição de açúcar ou de outros edulcorantes ou de álcool, não especificadas nem compreendidas em outras posições, excluídos os amendoins e castanhas tipo aperitivo, da posição 2008.1, em embalagens superior a 1 kg", + "1709600": + "Café torrado e moído, em embalagens de conteúdo inferior ou igual a 2 kg, exceto os classificados nos CEST 17.096.04 e 17.096.05", + "1709601": "Café torrado e moído, em embalagens de conteúdo superior a 2 kg", + "1709602": "Café torrado em grão, em embalagens de conteúdo inferior ou igual a 2 kg", + "1709603": "Café torrado em grão, em embalagens de conteúdo superior a 2 kg", + "1709604": "Café torrado e moído, em cápsulas, exceto os descritos no CEST 17.096.05", + "1709605": "Café descafeinado torrado e moído, em cápsulas", + "1709700": "Chá, mesmo aromatizado", + "1709800": "Mate", + "1709900": + "Açúcar refinado, em embalagens de conteúdo inferior ou igual a 2 kg, exceto as embalagens contendo envelopes individualizados (sachês) de conteúdo inferior ou igual a 10 g", + "1709901": + "Açúcar refinado, em embalagens de conteúdo superior a 2 kg e inferior ou igual a 5 kg", + "1709902": "Açúcar refinado, em embalagens de conteúdo superior a 5 kg", + "1710000": + "Açúcar refinado adicionado de aromatizante ou de corante em embalagens de conteúdo inferior ou igual a 2 kg, exceto as embalagens contendo envelopes individualizados (sachês) de conteúdo inferior ou igual a 10 g", + "1710001": + "Açúcar refinado adicionado de aromatizante ou de corante em embalagens de conteúdo superior a 2 kg e inferior ou igual a 5 kg", + "1710002": + "Açúcar refinado adicionado de aromatizante ou de corante em embalagens de conteúdo superior a 5 kg", + "1710100": + "Açúcar cristal, em embalagens de conteúdo inferior ou igual a 2 kg, exceto as embalagens contendo envelopes individualizados (sachês) de conteúdo inferior ou igual a 10 g", + "1710101": "Açúcar cristal, em embalagens de conteúdo superior a 2 kg e inferior ou igual a 5 kg", + "1710102": "Açúcar cristal, em embalagens de conteúdo superior a 5 kg", + "1710200": + "Açúcar cristal adicionado de aromatizante ou de corante, em embalagens de conteúdo inferior ou igual a 2 kg, exceto as embalagens contendo envelopes individualizados (sachês) de conteúdo inferior ou igual a 10 g", + "1710201": + "Açúcar cristal adicionado de aromatizante ou de corante, em embalagens de conteúdo superior a 2 kg e inferior ou igual a 5 kg", + "1710202": + "Açúcar cristal adicionado de aromatizante ou de corante, em embalagens de conteúdo superior a 5 kg", + "1710300": + "Outros tipos de açúcar, em embalagens de conteúdo inferior ou igual a 2 kg, exceto as embalagens contendo envelopes individualizados (sachês) de conteúdo inferior ou igual a 10 g", + "1710301": + "Outros tipos de açúcar, em embalagens de conteúdo superior a 2 kg e inferior ou igual a 5 kg", + "1710302": "Outros tipos de açúcar, em embalagens de conteúdo superior a 5 kg", + "1710400": + "Outros tipos de açúcar adicionado de aromatizante ou de corante, em embalagens de conteúdo inferior ou igual a 2 kg, exceto as embalagens contendo envelopes individualizados (sachês) de conteúdo inferior ou igual a 10 g", + "1710401": + "Outros tipos de açúcar adicionado de aromatizante ou de corante, em embalagens de conteúdo superior a 2 kg e inferior ou igual a 5 kg", + "1710402": + "Outros tipos de açúcar adicionado de aromatizante ou de corante, em embalagens de conteúdo superior a 5 kg", + "1710500": + "Outros açúcares em embalagens de conteúdo inferior ou igual a 2 kg, exceto as embalagens contendo envelopes individualizados (sachês) de conteúdo inferior ou igual a 10 g", + "1710501": + "Outros açúcares, em embalagens de conteúdo superior a 2 kg e inferior ou igual a 5 kg", + "1710502": "Outros açúcares, em embalagens de conteúdo superior a 5 kg", + "1710600": "Milho para pipoca (micro-ondas)", + "1710700": + "Extratos, essências e concentrados de café e preparações à base destes extratos, essências ou concentrados ou à base de café, em embalagens de conteúdo inferior ou igual a 500 g, exceto os classificados no CEST 17.107.01", + "1710701": + "Extratos, essências e concentrados de café e preparações à base destes extratos, essências ou concentrados ou à base de café, em cápsulas", + "1710800": + "Extratos, essências e concentrados de chá ou de mate e preparações à base destes extratos, essências ou concentrados ou à base de chá ou de mate, em embalagens de conteúdo inferior ou igual a 500 g, exceto as bebidas prontas à base de mate ou chá e os itens classificados no CEST 17.108.01", + "1710801": + "Extratos, essências e concentrados de chá ou de mate e preparações à base destes extratos, essências ou concentrados ou à base de chá ou de mate, em cápsulas", + "1710900": + "Preparações em pó para cappuccino e similares, em embalagens de conteúdo inferior ou igual a 500 g", + "1711000": "Refrescos e outras bebidas prontas para beber, à base de chá e mate", + "1711100": + "Refrescos e outras bebidas não alcoólicas, exceto os refrigerantes e as demais bebidas nos CEST 03.007.00 e 17.110.00", + "1711200": + "Néctares de frutas e outras bebidas não alcoólicas prontas para beber, exceto bebidas hidroeletrolíticas e energéticos", + "1711300": "Bebidas prontas à base de mate ou chá", + "1711400": "Bebidas prontas à base de café", + "1711500": + "Bebidas alimentares prontas à base de soja, leite ou cacau, inclusive os produtos denominados bebidas lácteas", + "1711600": + "Sementes de anis (erva-doce), badiana (anis-estrelado), funcho, coentro, cominho ou alcaravia; bagas de zimbro; fruta seca, misturas de fruta seca ou de fruta de casa rija; quando acondicionadas em saquinhos, especialmente, para a preparação de infusões ou de tisanas (“chás”)", + "1711700": + "Outras preparações em blocos ou em barras, com peso superior a 2kg, ou no estado líquido, em pasta, em pó, grânulos ou formas semelhantes, em recipientes ou embalagens imediatas de conteúdo superior a 2kg", + "1900100": "Tinta guache", + "1900200": + "Espiral - perfil para encadernação, de plástico e outros materiais classificados nas posições 3901 a 3914", + "1900300": + "Outros espirais - perfil para encadernação, de plástico e outros materiais classificados nas posições 3901 a 3914", + "1900400": + "Artigos de escritório e artigos escolares de plástico e outros materiais classificados nas posições 3901 a 3914, exceto estojos", + "1900500": "Maletas e pastas para documentos e de estudante, e artefatos semelhantes", + "1900501": "Baús, malas e maletas para viagem", + "1900600": "Prancheta de plástico", + "1900700": "Bobina para fax", + "1900800": "Papel seda", + "1900900": "Bobina para máquina de calcular, PDV ou equipamentos similares", + "1901000": + "Cartolina escolar e papel cartão, brancos e coloridos, cortados em folhas em que um lado seja inferior ou igual a 500 mm e o outro inferior ou igual a 700 mm, quando não dobradas, e peso igual ou superior a 120g/m²; recados autoadesivos (LP note); papéis de presente; todos cortados em tamanho pronto para uso escolar e doméstico", + "1901100": + "Papel fotográfico, exceto: (i) os papéis fotográficos emulsionados com haleto de prata tipo brilhante, matte ou lustre, em rolo e, com largura igual ou superior a 102 mm e comprimento inferior ou igual a 350 m, (ii) os papéis fotográficos emulsionados com haleto de prata tipo brilhante ou fosco, em folha e com largura igual ou superior a 152 mm e comprimento inferior ou igual a 307 mm, (iii) papel de qualidade fotográfica com tecnologia “Thermo-autochrome”, que submetido a um processo de aquecimento seja capaz de formar imagens por reação química e combinação das camadas cyan, magenta e amarela", + "1901200": "Papel almaço", + "1901300": "Papel hectográfico", + "1901400": "Papel celofane e tipo celofane", + "1901500": "Papel impermeável", + "1901600": "Papel crepon", + "1901700": "Papel fantasia", + "1901800": + "Papel-carbono, papel autocopiativo (exceto os vendidos em rolos de diâmetro igual ou superior a 60 cm e os vendidos em folhas de formato igual ou superior a 60 cm de altura e igual ou superior a 90 cm de largura) e outros papéis para cópia ou duplicação (incluídos os papéis para estênceis ou para chapas ofsete), estênceis completos e chapas ofsete, de papel, em folhas, mesmo acondicionados em caixas", + "1901900": + "Envelopes, aerogramas, bilhetes-postais não ilustrados e cartões para correspondência, de papel ou cartão, caixas, sacos e semelhantes, de papel ou cartão, contendo um sortido de artigos para correspondência", + "1902000": + "Livros de registro e de contabilidade, blocos de notas, de encomendas, de recibos, de apontamentos, de papel para cartas, agendas e artigos semelhantes", + "1902100": "Cadernos", + "1902200": + "Classificadores, capas para encadernação (exceto as capas para livros) e capas de processos", + "1902300": + "Formulários em blocos tipo “manifold”, mesmo com folhas intercaladas de papel-carbono", + "1902400": "Álbuns para amostras ou para coleções", + "1902500": + "Pastas para documentos, outros artigos escolares, de escritório ou de papelaria, de papel ou cartão e capas para livros, de papel ou cartão", + "1902600": + "Cartões postais impressos ou ilustrados, cartões impressos com votos ou mensagens pessoais, mesmo ilustrados, com ou sem envelopes, guarnições ou aplicações (conhecidos como cartões de expressão social - de época/sentimento)", + "1902700": "Canetas esferográficas", + "1902800": "Canetas e marcadores, com ponta de feltro ou com outras pontas porosas", + "1902900": "Canetas tinteiro", + "1903000": "Outras canetas; sortidos de canetas", + "1903100": "Papel cortado “cutsize” (tipo A3, A4, ofício I e II, carta e outros)", + "1903200": "Papel camurça", + "1903300": "Papel laminado e papel espelho", + "2000100": "Henna (embalagens de conteúdo inferior ou igual a 200 g)", + "2000101": "Henna (embalagens de conteúdo superior a 200 g)", + "2000200": "Vaselina", + "2000300": "Amoníaco em solução aquosa (amônia)", + "2000400": "Peróxido de hidrogênio, em embalagens de conteúdo inferior ou igual a 500 ml", + "2000500": "Lubrificação íntima", + "2000600": + "Óleos essenciais (desterpenados ou não), incluídos os chamados “concretos” ou “absolutos”; resinoides; oleorresinas de extração; soluções concentradas de óleos essenciais em gorduras, em óleos fixos, em ceras ou em matérias análogas, obtidas por tratamento de flores através de substâncias gordas ou por maceração; subprodutos terpênicos residuais da desterpenação dos óleos essenciais; águas destiladas aromáticas e soluções aquosas de óleos essenciais, em embalagens de conteúdo inferior ou igual a 500 ml", + "2000700": "Perfumes (extratos)", + "2000800": "Águas-de-colônia", + "2000900": "Produtos de maquilagem para os lábios", + "2001000": "Sombra, delineador, lápis para sobrancelhas e rímel", + "2001100": "Outros produtos de maquilagem para os olhos", + "2001200": + "Preparações para manicuros e pedicuros, incluindo removedores de esmalte à base de acetona", + "2001300": "Pós, incluídos os compactos", + "2001400": "Cremes de beleza, cremes nutritivos e loções tônicas", + "2001500": + "Outros produtos de beleza ou de maquilagem preparados e preparações para conservação ou cuidados da pele, exceto as preparações solares e antissolares", + "2001600": "Preparações solares e antissolares", + "2001700": "Xampus para o cabelo", + "2001800": "Preparações para ondulação ou alisamento, permanentes, dos cabelos", + "2001900": "Laquês para o cabelo", + "2002000": "Outras preparações capilares, incluindo máscaras e finalizadores", + "2002100": "Condicionadores", + "2002200": "Tintura para o cabelo", + "2002300": "Dentifrícios", + "2002400": "Fios utilizados para limpar os espaços interdentais (fios dentais)", + "2002500": "Outras preparações para higiene bucal ou dentária", + "2002600": "Preparações para barbear (antes, durante ou após)", + "2002700": + "Desodorantes (desodorizantes) corporais líquidos, exceto os classificados no CEST 20.027.01", + "2002701": "Loções e óleos desodorantes hidratantes líquidos", + "2002800": "Antiperspirantes líquidos", + "2002900": + "Outros desodorantes (desodorizantes) corporais, exceto os classificados no CEST 20.029.01", + "2002901": "Outras loções e óleos desodorantes hidratantes", + "2003000": "Outros antiperspirantes", + "2003100": "Sais perfumados e outras preparações para banhos", + "2003200": "Outros produtos de perfumaria preparados", + "2003201": "Outros produtos de toucador preparados", + "2003300": "Soluções para lentes de contato ou para olhos artificiais", + "2003400": "Sabões de toucador em barras, pedaços ou figuras moldados, exceto CEST 20.034.01", + "2003401": "Lenços umedecidos", + "2003500": "Outros sabões, produtos e preparações, em barras, pedaços ou figuras moldados", + "2003600": "Sabões de toucador sob outras formas", + "2003700": + "Produtos e preparações orgânicos tensoativos para lavagem da pele, na forma de líquido ou de creme, acondicionados para venda a retalho, mesmo contendo sabão", + "2003800": "Bolsa para gelo ou para água quente", + "2003900": "Chupetas e bicos para mamadeiras e para chupetas, de borracha", + "2004000": "Chupetas e bicos para mamadeiras e para chupetas, de silicone", + "2004100": "Malas e maletas de toucador", + "2004200": "Papel higiênico - folha simples", + "2004300": "Papel higiênico - folha dupla, tripla e quádrupla", + "2004400": "Lenços (incluídos os de maquilagem) e toalhas de mão", + "2004500": + "Papel toalha de uso institucional do tipo comercializado em rolos igual ou superior a 80 metros e do tipo comercializado em folhas intercaladas", + "2004600": "Toalhas e guardanapos de mesa", + "2004700": "Toalhas de cozinha (papel toalha de uso doméstico)", + "2004800": "Fraldas, exceto os descritos no CEST 20.048.01", + "2004801": "Fraldas de fibras têxteis", + "2004900": "Tampões higiênicos", + "2005000": "Absorventes higiênicos externos", + "2005100": "Hastes flexíveis (uso não medicinal)", + "2005200": "Sutiã descartável, assemelhados e papel para depilação", + "2005300": "Pinças para sobrancelhas", + "2005400": "Espátulas (artigos de cutelaria)", + "2005500": + "Utensílios e sortidos de utensílios de manicuros ou de pedicuros (incluídas as limas para unhas)", + "2005600": "Termômetros, inclusive o digital", + "2005700": + "Escovas e pincéis de barba, escovas para cabelos, para cílios ou para unhas e outras escovas de toucador de pessoas, incluídas as que sejam partes de aparelhos, exceto escovas de dentes", + "2005800": "Escovas de dentes, incluídas as escovas para dentaduras", + "2005900": "Pincéis para aplicação de produtos cosméticos", + "2006000": + "Sortidos de viagem, para toucador de pessoas para costura ou para limpeza de calçado ou de roupas", + "2006100": + "Pentes, travessas para cabelo e artigos semelhantes; grampos (alfinetes) para cabelo; pinças (pinceguiches), onduladores, bobes (rolos) e artefatos semelhantes para penteados, e suas partes, exceto os classificados na posição 8516 e suas partes", + "2006200": + "Borlas ou esponjas para pós ou para aplicação de outros cosméticos ou de produtos de toucador", + "2006300": "Mamadeiras", + "2006400": "Aparelhos e lâminas de barbear", + "2006500": "Algodão hidrófilo, não estéril, destinado à higiene pessoal", + "2100100": "Fogões de cozinha de uso doméstico e suas partes", + "2100200": + "Combinações de refrigeradores e congeladores (“freezers”), munidos de portas exteriores separadas", + "2100300": "Refrigeradores do tipo doméstico, de compressão", + "2100400": "Outros refrigeradores do tipo doméstico", + "2100500": + "Congeladores (“freezers”) horizontais tipo arca, de capacidade não superior a 800 litros", + "2100600": + "Congeladores (“freezers”) verticais tipo armário, de capacidade não superior a 900 litros", + "2100700": + "Outros móveis (arcas, armários, vitrines, balcões e móveis semelhantes) para a conservação e exposição de produtos, que incorporem um equipamento para a produção de frio", + "2100800": "Mini adega e similares", + "2100900": "Máquinas para produção de gelo", + "2101000": + "Partes dos refrigeradores, congeladores, mini adegas e similares, máquinas para produção de gelo e bebedouros descritos nos CEST 21.002.00, 21.003.00, 21.004.00, 21.005.00, 21.006.00, 21.007.00, 21.008.00, 21.009.00 e 21.013.00", + "2101100": "Secadoras de roupa de uso doméstico", + "2101200": "Outras secadoras de roupas e centrífugas de uso doméstico", + "2101300": "Bebedouros refrigerados para água", + "2101400": + "Partes das secadoras de roupas e centrífugas de uso doméstico e dos aparelhos para filtrar ou depurar água, descritos nos CEST 21.011.00 e 21.012.00 e 21.098.00", + "2101500": "Máquinas de lavar louça do tipo doméstico e suas partes", + "2101600": + "Máquinas que executem pelo menos duas das seguintes funções: impressão, cópia ou transmissão de telecópia (fax), capazes de ser conectadas a uma máquina automática para processamento de dados ou a uma rede", + "2101700": + "Outras impressoras, máquinas copiadoras e telecopiadores (fax), mesmo combinados entre si, capazes de ser conectados a uma máquina automática para processamento de dados ou a uma rede", + "2101800": + "Partes e acessórios de máquinas e aparelhos de impressão por meio de blocos, cilindros e outros elementos de impressão da posição 8442; e de outras impressoras, máquinas copiadoras e telecopiadores (fax), mesmo combinados entre si", + "2101900": + "Máquinas de lavar roupa, mesmo com dispositivos de secagem, de uso doméstico, de capacidade não superior a 10 kg, em peso de roupa seca, inteiramente automáticas", + "2102000": + "Outras máquinas de lavar roupa, mesmo com dispositivos de secagem, de uso doméstico, com secador centrífugo incorporado", + "2102100": "Outras máquinas de lavar roupa, mesmo com dispositivos de secagem, de uso doméstico", + "2102200": + "Máquinas de lavar roupa, mesmo com dispositivos de secagem, de uso doméstico, de capacidade superior a 10 kg, em peso de roupa seca", + "2102300": + "Partes de máquinas de lavar roupa, mesmo com dispositivos de secagem, de uso doméstico", + "2102400": + "Máquinas de secar de uso doméstico de capacidade não superior a 10 kg, em peso de roupa seca", + "2102500": "Outras máquinas de secar de uso doméstico", + "2102600": "Partes de máquinas de secar de uso doméstico", + "2102700": "Máquinas de costura de uso doméstico", + "2102800": + "Máquinas automáticas para processamento de dados, portáteis, de peso não superior a 10 kg, contendo pelo menos uma unidade central de processamento, um teclado e uma tela", + "2102900": "Outras máquinas automáticas para processamento de dados", + "2103000": + "Unidades de processamento, de pequena capacidade, exceto as das subposições 8471.41 ou 8471.49, podendo conter, no mesmo corpo, um ou dois dos seguintes tipos de unidades: unidade de memória, unidade de entrada e unidade de saída; baseadas em microprocessadores, com capacidade de instalação, dentro do mesmo gabinete, de unidades de memória da subposição 8471.70, podendo conter múltiplos conectores de expansão (“slots”), e valor FOB inferior ou igual a US$ 12.500,00, por unidade", + "2103100": "Unidades de entrada, exceto as classificadas no código 8471.60.54", + "2103200": + "Outras unidades de entrada ou de saída, podendo conter, no mesmo corpo, unidades de memória", + "2103300": "Unidades de memória", + "2103400": + "Outras máquinas automáticas para processamento de dados e suas unidades; leitores magnéticos ou ópticos, máquinas para registrar dados em suporte sob forma codificada, e máquinas para processamento desses dados, não especificadas nem compreendidas em outras posições", + "2103500": "Partes e acessórios das máquinas da posição 84.71", + "2103600": "Outros transformadores, exceto os classificados nos códigos 8504.33.00 e 8504.34.00", + "2103700": "Carregadores de acumuladores", + "2103800": "Equipamentos de alimentação ininterrupta de energia (UPS ou “no break”)", + "2103900": "Outros acumuladores", + "2104000": "Aspiradores", + "2104100": + "Aparelhos eletromecânicos de motor elétrico incorporado, de uso doméstico e suas partes", + "2104200": "Enceradeiras", + "2104300": "Chaleiras elétricas", + "2104400": "Ferros elétricos de passar", + "2104500": "Fornos de micro-ondas", + "2104600": + "Outros fornos; fogareiros (incluídas as chapas de cocção), grelhas e assadeiras, exceto os portáteis", + "2104700": + "Outros fornos; fogareiros (incluídas as chapas de cocção), grelhas e assadeiras, portáteis", + "2104800": "Outros aparelhos eletrotérmicos de uso doméstico - Cafeteiras", + "2104900": "Outros aparelhos eletrotérmicos de uso doméstico - Torradeiras", + "2105000": "Outros aparelhos eletrotérmicos de uso doméstico", + "2105100": + "Partes das chaleiras, ferros, fornos e outros aparelhos eletrotérmicos da posição 85.16, descritos nos CEST 21.043.00, 21.044.00, 21.045.00, 21.046.00, 21.047.00, 21.048.00, 21.049.00 e 21.050.00", + "2105200": "Aparelhos telefônicos por fio com unidade auscultador - microfone sem fio", + "2105300": + "Telefones inteligentes (“smartphones”) e para redes celulares, excetos por satélite, os de uso automotivo e os classificados nos CEST 21.053.01", + "2105301": + "Telefones inteligentes (“smartphones”) e para redes celulares portáteis, excetos por satélite", + "2105400": + "Outros telefones para outras redes sem fio, excetos os de uso automotivo e os classificados nos CEST 21.053.00 e 21.053.01", + "2105500": "Outros aparelhos telefônicos não combinados com outros aparelhos", + "2105501": "Outros aparelhos telefônicos", + "2105600": + "Outros aparelhos para transmissão ou recepção de voz, imagem ou outros dados em rede com fio", + "2105601": "Distribuidores de conexões para rede (“hubs”) e moduladores/demoduladores (“modens”)", + "2105700": + "Microfones e seus suportes; alto-falantes, mesmo montados nos seus receptáculos, fones de ouvido (auscultadores), mesmo combinados com microfone e conjuntos ou sortidos constituídos por um microfone e um ou mais alto-falantes, amplificadores elétricos de audiofrequência, aparelhos elétricos de amplificação de som; suas partes e acessórios; exceto os de uso automotivo", + "2105800": + "Aparelhos de radiodifusão suscetíveis de funcionarem sem fonte externa de energia. Aparelhos de gravação de som; aparelhos de reprodução de som; aparelhos de gravação e de reprodução de som; partes e acessórios; exceto os de uso automotivo", + "2105900": + "Outros aparelhos de gravação de som; aparelhos de reprodução de som; aparelhos de gravação e de reprodução de som; partes e acessórios; exceto os de uso automotivo", + "2106000": + "Gravador-reprodutor e editor de imagem e som, em discos, por meio magnético, óptico ou optomagnético, exceto de uso automotivo", + "2106100": + "Outros aparelhos videofônicos de gravação ou reprodução, mesmo incorporando um receptor de sinais videofônicos, exceto os de uso automotivo", + "2106200": 'Cartões de memória ("memorycards")', + "2106300": 'Cartões inteligentes ("smartcards"), exceto o item classificado no CEST 21.064.00', + "2106400": 'Cartões inteligentes ("sim cards")', + "2106500": "Câmeras fotográficas digitais e câmeras de vídeo", + "2106600": + "Outros aparelhos receptores para radiodifusão, mesmo combinados num invólucro, com um aparelho de gravação ou de reprodução de som, ou com um relógio, inclusive caixa acústica para Home Theaters classificados na posição 8518", + "2106700": + "Monitores e projetores que não incorporem aparelhos receptores de televisão, policromáticos", + "2106701": + "Projetores capazes de serem conectados diretamente a uma máquina automática para processamento de dados da posição 84.71 e concebidos para serem utilizados com esta máquina", + "2106800": + "Outros monitores capazes de serem conectados diretamente a uma máquina automática para processamento de dados da posição 84.71 e concebidos para serem utilizados com esta máquina, policromáticos", + "2106900": + "Aparelhos receptores de televisão, mesmo que incorporem um aparelho receptor de radiodifusão ou um aparelho de gravação ou reprodução de som ou de imagens - Televisores de CRT (tubo de raios catódicos)", + "2107000": + "Aparelhos receptores de televisão, mesmo que incorporem um aparelho receptor de radiodifusão ou um aparelho de gravação ou reprodução de som ou de imagens - Televisores de LCD (Display de Cristal Líquido)", + "2107100": + "Aparelhos receptores de televisão, mesmo que incorporem um aparelho receptor de radiodifusão ou um aparelho de gravação ou reprodução de som ou de imagens - Televisores de Plasma", + "2107200": + "Outros aparelhos receptores de televisão não dotados de monitores ou display de vídeo", + "2107300": + "Outros aparelhos receptores de televisão não relacionados nos CEST 21.069.00, 21.070.00, 21.071.00 e 21.072.00", + "2107400": + "Câmeras fotográficas dos tipos utilizadas para preparação de clichês ou cilindros de impressão", + "2107500": "Câmeras fotográficas para filmes de revelação e copiagem instantâneas", + "2107600": "Aparelhos de diatermia", + "2107700": "Aparelhos de massagem", + "2107800": "Reguladores de voltagem eletrônicos", + "2107900": "Consoles e máquinas de jogos de vídeo, exceto os classificados na subposição 9504.30", + "2108000": "Multiplexadores e concentradores", + "2108100": "Centrais automáticas privadas, de capacidade inferior ou igual a 25 ramais", + "2108200": "Outros aparelhos para comutação", + "2108300": "Roteadores digitais, em redes com ou sem fio", + "2108400": "Aparelhos emissores com receptor incorporado de tecnologia celular", + "2108500": + "Outros aparelhos de recepção, conversão e transmissão ou regeneração de voz, imagens ou outros dados, incluindo os aparelhos de comutação e roteamento", + "2108600": "Antenas próprias para telefones celulares portáteis, exceto as telescópicas", + "2108700": + "Aparelhos ou máquinas de barbear, máquinas de cortar o cabelo ou de tosquiar e aparelhos de depilar, e suas partes", + "2108800": "Ventiladores, exceto os de uso agrícola e do CEST 21.088.01", + "2108801": "Microventiladores com área de carcaça inferior a 90 cm²", + "2108900": "Ventiladores de uso agrícola", + "2109000": "Coifas com dimensão horizontal máxima não superior a 120 cm", + "2109100": "Partes de ventiladores ou coifas aspirantes", + "2109200": + "Máquinas e aparelhos de ar condicionado contendo um ventilador motorizado e dispositivos próprios para modificar a temperatura e a umidade, incluídos as máquinas e aparelhos em que a umidade não seja regulável separadamente", + "2109300": + "Aparelhos de ar-condicionado tipo Split System (sistema com elementos separados) com unidade externa e interna", + "2109400": + "Aparelhos de ar-condicionado com capacidade inferior ou igual a 30.000 frigorias/hora", + "2109500": "Aparelhos de ar-condicionado com capacidade acima de 30.000 frigorias/hora", + "2109600": + "Unidades evaporadoras (internas) de aparelho de ar-condicionado do tipo Split System (sistema com elementos separados), com capacidade inferior ou igual a 30.000 frigorias/hora", + "2109700": + "Unidades condensadoras (externas) de aparelho de ar-condicionado do tipo Split System (sistema com elementos separados), com capacidade inferior ou igual a 30.000 frigorias/hora", + "2109800": + "Aparelhos elétricos para filtrar ou depurar água (purificadores de água refrigerados), exceto os itens classificados no CEST 21.098.01", + "2109801": "Outros aparelhos elétricos para filtrar ou depurar água", + "2109900": "Lavadora de alta pressão e suas partes", + "2110000": "Furadeiras elétricas", + "2110100": "Aparelhos elétricos para aquecimento de ambientes", + "2110200": "Secadores de cabelo", + "2110300": "Outros aparelhos para arranjos do cabelo", + "2110400": + "Aparelhos receptores para radiodifusão, mesmo combinados num mesmo invólucro, com um aparelho de gravação ou de reprodução de som, ou com um relógio, exceto os classificados na posição 8527.1, 8527.2 e 8527.9 que sejam de uso automotivo", + "2110500": "Climatizadores de ar", + "2110600": + "Outras partes para máquinas e aparelhos de ar-condicionado que contenham um ventilador motorizado e dispositivos próprios para modificar a temperatura e a umidade, incluindo as máquinas e aparelhos em que a umidade não seja regulável separadamente", + "2110700": "Câmeras de televisão", + "2110800": "Balanças de uso doméstico", + "2110900": + "Tubos e válvulas, eletrônicos, de cátodo quente, cátodo frio ou fotocátodo (por exemplo, tubos e válvulas, de vácuo, de vapor ou de gás, ampolas retificadoras de vapor de mercúrio, tubos catódicos, tubos e válvulas para câmeras de televisão)", + "2111000": + "Aparelhos elétricos para telefonia; outros aparelhos para transmissão ou recepção de voz, imagens ou outros dados, incluídos os aparelhos para comunicação em redes por fio ou redes sem fio, tal como uma rede local (LAN) ou uma rede de área estendida (WAN), incluídas suas partes, exceto os de uso automotivo, os classificados nos códigos NCM/SH 8517.62.51, 8517.62.52 e 8517.62.53 e no código CEST 21.127.00", + "2111100": "Interfones, seus acessórios, tomadas e “plugs”", + "2111200": + "Partes reconhecíveis como exclusiva ou principalmente destinadas aos aparelhos das posições 8525 a 8528; exceto as de uso automotivo", + "2111300": + "Aparelhos elétricos de sinalização acústica ou visual (por exemplo, campainhas, sirenes, quadros indicadores, aparelhos de alarme para proteção contra roubo ou incêndio); exceto os de uso automotivo e os classificados nas posições 8531.10 e 8531.80.00", + "2111400": + "Aparelhos elétricos de alarme, para proteção contra roubo ou incêndio e aparelhos semelhantes, exceto os de uso automotivo", + "2111500": "Outros aparelhos de sinalização acústica ou visual, exceto os de uso automotivo", + "2111600": "Circuitos impressos, exceto os de uso automotivo", + "2111700": "Diodos emissores de luz (LED), exceto diodos “laser”", + "2111800": "Eletrificadores de cercas eletrônicos", + "2111900": + "Aparelhos e instrumentos para medida ou controle da tensão, intensidade, resistência ou da potência, sem dispositivo registrador; exceto os de uso automotivo", + "2112000": + "Analisadores lógicos de circuitos digitais, de espectro de frequência, frequencímetros, fasímetros, e outros instrumentos e aparelhos de controle de grandezas elétricas e detecção", + "2112100": + "Interruptores horários e outros aparelhos que permitam acionar um mecanismo em tempo determinado, munidos de maquinismo de aparelhos de relojoaria ou de motor síncrono", + "2112200": + "Aparelhos de iluminação (incluídos os projetores) e suas partes, não especificados nem compreendidos em outras posições; anúncios, cartazes ou tabuletas e placas indicadoras luminosos, e artigos semelhantes, contendo uma fonte luminosa fixa permanente, e suas partes não especificadas nem compreendidas em outras posições, com exceção dos itens classificados nos CEST 21.123.00, 21.124.00 e 21.125.00", + "2112300": + "Lustres e outros aparelhos elétricos de iluminação, próprios para serem suspensos ou fixados no teto ou na parede, exceto os dos tipos utilizados na iluminação pública; e suas partes", + "2112400": + "Abajures de cabeceiras, de escritório e lampadários de interior, elétricos e suas partes", + "2112500": "Outras luminárias e aparelhos de iluminação, elétricos, e suas partes", + "2112600": "Microprocessador", + "2112700": + "Aparelho emissor com receptor incorporado, digital, com tecnologias de transmissão/recepção sem fio, tela sensível ao toque “smartwatch”", + "2200100": "Ração tipo “pet” para animais domésticos", + "2300100": "Sorvetes de qualquer espécie", + "2300200": "Preparados para fabricação de sorvete em máquina", + "2400100": "Tintas, vernizes", + "2400200": + "Xadrez e pós assemelhados, em embalagem de conteúdo inferior ou igual a 1 kg, exceto pigmentos à base de dióxido de titânio classificados no código NCM 3206.11.10", + "2400201": + "Xadrez e pós assemelhados, em embalagem de conteúdo superior a 1 kg, exceto pigmentos à base de dióxido de titânio classificados no código NCM 3206.11.10", + "2400300": "Corantes para aplicação em bases, tintas e vernizes", + "2500100": + "Veículos automóveis para transporte de 10 pessoas ou mais, incluindo o motorista, unicamente com motor de pistão, de ignição por compressão (diesel ou semidiesel), com volume interno de habitáculo, destinado a passageiros e motorista, superior a 6 m³, mas inferior a 9 m³", + "2500200": + "Veículos automóveis para transporte de 10 pessoas ou mais, incluindo o motorista, unicamente com motor elétrico para propulsão, com volume interno de habitáculo, destinado a passageiros e motorista, superior a 6 m³, mas inferior a 9 m³", + "2500300": + "Automóveis unicamente com motor de pistão alternativo de ignição por centelha (faísca*), de cilindrada não superior a 1000 cm³", + "2500400": + "Automóveis unicamente com motor de pistão alternativo de ignição por centelha (faísca*), de cilindrada superior a 1000 cm³, mas não superior a 1500 cm³, com capacidade de transporte de pessoas sentadas inferior ou igual a 6, incluído o condutor, exceto carro celular", + "2500500": + "Outros automóveis unicamente com motor de pistão alternativo de ignição por centelha (faísca*), de cilindrada superior a 1000 cm³, mas não superior a 1500 cm³, exceto carro celular", + "2500600": + "Automóveis unicamente com motor de pistão alternativo de ignição por centelha (faísca*), de cilindrada superior a 1500 cm³, mas não superior a 3000 cm³, com capacidade de transporte de pessoas sentadas inferior ou igual a 6, incluído o condutor, exceto carro celular, carro funerário e automóveis de corrida", + "2500700": + "Outros automóveis unicamente com motor de pistão alternativo de ignição por centelha (faísca*), de cilindrada superior a 1500 cm³, mas não superior a 3000 cm³, exceto carro celular, carro funerário e automóveis de corrida", + "2500800": + "Automóveis unicamente com motor de pistão alternativo de ignição por centelha (faísca*), de cilindrada superior a 3000 cm³, com capacidade de transporte de pessoas sentadas inferior ou igual a 6, incluído o condutor, exceto carro celular, carro funerário e automóveis de corrida", + "2500900": + "Outros automóveis unicamente com motor de pistão alternativo de ignição por centelha (faísca*), de cilindrada superior a 3000 cm³, exceto carro celular, carro funerário e automóveis de corrida", + "2501000": + "Automóveis unicamente com motor diesel ou semidiesel, de cilindrada superior a 1500 cm³, mas não superior a 2500 cm³, com capacidade de transporte de pessoas sentadas inferior ou igual a 6, incluído o condutor, exceto ambulância, carro celular e carro funerário", + "2501100": + "Outros automóveis unicamente com motor diesel ou semidiesel, de cilindrada superior a 1500 cm³, mas não superior a 2500 cm³, exceto ambulância, carro celular e carro funerário", + "2501200": + "Automóveis unicamente com motor diesel ou semidiesel, de cilindrada superior a 2500 cm³, com capacidade de transporte de pessoas sentadas inferior ou igual a 6, incluído o condutor, exceto carro celular e carro funerário", + "2501300": + "Outros automóveis unicamente com motor diesel ou semidiesel, de cilindrada superior a 2500 cm³, exceto carro celular e carro funerário", + "2501400": + "Veículos automóveis para transporte de mercadorias, de peso em carga máxima não superior a 5 toneladas, chassis com motor diesel ou semidiesel e cabina, exceto caminhão de peso em carga máxima superior a 3,9 toneladas", + "2501500": + "Veículos automóveis para transporte de mercadorias, de peso em carga máxima não superior a 5 toneladas, com motor diesel ou semidiesel, com caixa basculante, exceto caminhão de peso em carga máxima superior a 3,9 toneladas", + "2501600": + "Veículos automóveis para transporte de mercadorias, de peso em carga máxima não superior a 5 toneladas, frigoríficos ou isotérmicos, com motor diesel ou semidiesel, exceto caminhão de peso em carga máxima superior a 3,9 toneladas", + "2501700": + "Outros veículos automóveis para transporte de mercadorias, de peso em carga máxima não superior a 5 toneladas, com motor diesel ou semidiesel, exceto carro-forte para transporte de valores e caminhão de peso em carga máxima superior a 3,9 toneladas", + "2501800": + "Veículos automóveis para transporte de mercadorias, de peso em carga máxima não superior a 5 toneladas, com motor a explosão, chassis e cabina, exceto caminhão de peso em carga máxima superior a 3,9 toneladas", + "2501900": + "Veículos automóveis para transporte de mercadorias, de peso em carga máxima não superior a 5 toneladas, com motor explosão com caixa basculante, exceto caminhão de peso em carga máxima superior a 3,9 toneladas", + "2502000": + "Veículos automóveis para transporte de mercadorias, de peso em carga máxima não superior a 5 toneladas, frigoríficos ou isotérmicos com motor explosão, exceto caminhão de peso em carga máxima superior a 3,9 toneladas", + "2502100": + "Outros veículos automóveis para transporte de mercadorias, de peso em carga máxima não superior a 5 toneladas, com motor a explosão, exceto carro-forte para transporte de valores e caminhão de peso em carga máxima superior a 3,9 toneladas", + "2502200": + "Veículos automóveis para transporte de 10 pessoas ou mais, incluindo o motorista, com motor de pistão, de ignição por compressão (diesel ou semidiesel) e um motor elétrico, com volume interno de habitáculo, destinado a passageiros e motorista, superior a 6 m³, mas inferior a 9 m³", + "2502300": + "Veículos automóveis para transporte de 10 pessoas ou mais, incluindo o motorista, com motor de pistão alternativo, de ignição por centelha (faísca) e um motor elétrico, com volume interno de habitáculo, destinado a passageiros e motorista, superior a 6 m³, mas inferior a 9 m³", + "2502400": + "Outros veículos automóveis para transporte de 10 pessoas ou mais, incluindo o motorista, com volume interno de habitáculo, destinado a passageiros e motorista, superior a 6 m³, mas inferior a 9 m³", + "2502500": + "Automóveis equipados para propulsão, simultaneamente, com um motor de pistão alternativo de ignição por centelha (faísca*) e um motor elétrico, exceto os suscetíveis de serem carregados por conexão a uma fonte externa de energia elétrica, o carro celular e o carro funerário", + "2502600": + "Automóveis equipados para propulsão, simultaneamente, com um motor de pistão por compressão (diesel ou semidiesel) e um motor elétrico, exceto os suscetíveis de serem carregados por conexão a uma fonte externa de energia elétrica, exceto o carro celular e o carro funerário", + "2502700": + "Automóveis equipados para propulsão, simultaneamente, com um motor de pistão alternativo de ignição por centelha (faísca*) e um motor elétrico, suscetíveis de serem carregados por conexão a uma fonte externa de energia elétrica, exceto o carro celular e o carro funerário", + "2502800": + "Automóveis equipados para propulsão, simultaneamente, com um motor de pistão por compressão (diesel ou semidiesel) e um motor elétrico, suscetíveis de serem carregados por conexão a uma fonte externa de energia elétrica, exceto o carro celular e o carro funerário", + "2502900": "Outros veículos, equipados unicamente com motor elétrico para propulsão", + "2503000": + "Outros veículos para transportes de mercadorias equipados para propulsão, simultaneamente, com motor de pistão de ignição por compressão (diesel ou semidiesel) e motor elétrico de peso em carga máxima (bruto) não superior a 5 toneladas, exceto caminhão de peso em carga máxima superior a 3,9 toneladas", + "2503100": + "Outros veículos para transportes de mercadorias equipados para propulsão, simultaneamente, com motor de pistão de ignição por centelha (faísca) e motor elétrico de peso em carga máxima (bruto) não superior a 5 toneladas, exceto caminhão de peso em carga máxima superior a 3,9 toneladas", + "2503200": + "Outros veículos para transporte de mercadorias, unicamente com motor elétrico para propulsão, exceto veículo de peso em carga máxima superior a 3,9 toneladas", + "2600100": + "Motocicletas (incluídos os ciclomotores) e outros ciclos equipados com motor auxiliar, mesmo com carro lateral, exceto os classificados no CEST 26.001.01; carros laterais", + "2600101": + "Bicicletas e outros ciclos (incluídos os triciclos) com propulsão de motor elétrico auxiliar assistido pela força humana", + "2800100": "Perfumes (extratos)", + "2800200": "Águas-de-colônia", + "2800300": "Produtos de maquiagem para os lábios", + "2800400": "Sombra, delineador, lápis para sobrancelhas e rímel", + "2800500": "Outros produtos de maquiagem para os olhos", + "2800600": "Preparações para manicuros e pedicuros", + "2800700": "Pós para maquiagem, incluindo os compactos", + "2800800": "Cremes de beleza, cremes nutritivos e loções tônicas", + "2800900": + "Outros produtos de beleza ou de maquiagem preparados e preparações para conservação ou cuidados da pele, exceto as preparações antissolares e os bronzeadores", + "2801000": "Preparações antissolares e os bronzeadores", + "2801100": "Xampus para o cabelo", + "2801200": "Preparações para ondulação ou alisamento, permanentes, dos cabelos", + "2801300": "Outras preparações capilares", + "2801400": "Tintura para o cabelo", + "2801500": "Preparações para barbear (antes, durante ou após)", + "2801600": + "Desodorantes (desodorizantes) corporais líquidos, exceto os classificados no CEST 28.016.01", + "2801601": "Loções e óleos desodorantes hidratantes líquidos", + "2801602": "Antiperspirantes líquidos", + "2801700": + "Outros desodorantes (desodorizantes) corporais, exceto os classificados no CEST 28.017.01", + "2801701": "Outras loções e óleos desodorantes hidratantes", + "2801702": "Outros antiperspirantes", + "2801800": "Outros produtos de perfumaria ou de toucador preparados", + "2801900": "Outras preparações cosméticas", + "2802000": "Sabões de toucador em barras, pedaços ou figuras moldados, exceto CEST 28.020.01", + "2802001": "Lenços umedecidos", + "2802100": + "Outros sabões, produtos e preparações orgânicos tensoativos, inclusive papel, pastas (ouates), feltros e falsos tecidos, impregnados, revestidos ou recobertos de sabão ou de detergentes", + "2802200": "Sabões de toucador sob outras formas", + "2802300": + "Produtos e preparações orgânicos tensoativos para lavagem da pele, em forma de líquido ou de creme, acondicionados para venda a retalho, mesmo contendo sabão", + "2802400": "Lenços de papel, incluindo os de desmaquiar", + "2802401": "Toalhas de mão", + "2802500": "Apontadores de lápis para maquiagem", + "2802501": "Espátulas, abre-cartas e raspadeiras", + "2802502": "Lâminas de espátulas, de abre-cartas, de raspadeiras e de apontadores de lápis", + "2802600": + "Utensílios e sortidos de utensílios de manicuros ou de pedicuros (incluindo as limas para unhas)", + "2802700": + "Escovas e pincéis de barba, escovas para cabelos, para cílios ou para unhas e outras escovas de toucador de pessoas", + "2802701": + "Vassouras e escovas, mesmo constituindo partes de máquinas, de aparelhos ou de veículos, vassouras mecânicas de uso manual não motorizadas, pincéis e espanadores; cabeças preparadas para escovas, pincéis e artigos semelhantes; bonecas e rolos para pintura; rodos de borracha ou de matérias flexíveis semelhantes, outros", + "2802800": "Pincéis para aplicação de produtos cosméticos", + "2802801": "Pincéis e escovas, para artistas e pincéis de escrever", + "2802900": "Vaporizadores de toucador, suas armações e cabeças de armações", + "2803000": + "Borlas ou esponjas para pós ou para aplicação de outros cosméticos ou de produtos de toucador", + "2803100": "Malas e maletas de toucador", + "2803200": + "Pentes, travessas para cabelo e artigos semelhantes; grampos (alfinetes) para cabelo; pinças (“pinceguiches”), onduladores, bobs (rolos) e artefatos semelhantes para penteados, e suas partes", + "2803300": "Mamadeiras", + "2803400": "Chupetas e bicos para mamadeiras e para chupetas", + "2803500": "Outras plantas e partes, para perfumaria, medicina e semelhantes", + "2803600": "Vestuário e seus acessórios, de plásticos, inclusive luvas", + "2803700": "Estatuetas e outros objetos de ornamentação, de plásticos", + "2803800": "Outras obras de plásticos", + "2803900": "Bolsas de folhas de plástico", + "2804000": "Bolsas de matérias têxteis", + "2804100": "Bolsas de outras matérias", + "2804200": "Artigos de bolsos/bolsas, de outras matérias", + "2804300": "Outros artefatos, de folhas de plásticos ou matérias têxteis", + "2804400": "Outros artefatos, de outras matérias", + "2804500": "Caixas e cartonagens, dobráveis, de papel/cartão, não ondulados", + "2804600": "Outros sacos, bolsas e cartuchos, de papel ou cartão", + "2804700": "Etiquetas de papel ou cartão, impressas", + "2804800": "Outros impressos publicitários, catálogos comerciais e semelhantes", + "2804900": "Outras meias de malha de outras matérias têxteis", + "2805000": "Outros acessórios confeccionados, de vestuário", + "2805100": "Roupas de toucador/cozinha, de tecidos atoalhados de algodão", + "2805200": "Outros artefatos têxteis confeccionados", + "2805300": "Chapéus e outros artefatos de outras matérias, exceto de malha", + "2805400": "Artigos para outras festas, carnaval ou outros divertimentos", + "2805500": "Produtos destinados à higiene bucal", + "2805600": + "Outros produtos cosméticos e de higiene pessoal não relacionados em outros itens deste anexo", + "2805700": + "Outros artigos destinados a cuidados pessoais não relacionados em outros itens deste anexo", + "2805800": + "Acessórios (por exemplo, bijuterias, relógios, óculos de sol, bolsas, mochilas, frasqueiras, carteiras, porta-cartões, porta-documentos, porta-celulares e embalagens presenteáveis (por exemplo, caixinhas de papel), entre outros itens assemelhados)", + "2805900": + "Vestuário e seus acessórios; calçados, polainas e artefatos semelhantes, e suas partes", + "2806000": "Outros artigos de vestuário em geral, exceto os relacionados no item anterior", + "2806100": "Artigos de casa", + "2806200": "Produtos das indústrias alimentares e bebidas", + "2806300": "Produtos de limpeza e conservação doméstica", + "2806400": "Artigos infantis", + "2899900": + "Outros produtos comercializados pelo sistema de marketing direto porta-a-porta a consumidor final não relacionados em outros itens deste anexo", + "0100100": + "Catalisadores em colmeia cerâmica ou metálica para conversão catalítica de gases de escape de veículos e outros catalisadores", + "0100200": + "Tubos e seus acessórios (por exemplo, juntas, cotovelos, flanges, uniões), de plásticos", + "0100300": "Protetores de caçamba", + "0100400": "Reservatórios de óleo", + "0100500": "Frisos, decalques, molduras e acabamentos", + "0100600": + "Correias de transmissão de borracha vulcanizada, de matérias têxteis, mesmo impregnadas, revestidas ou recobertas, de plástico, ou estratificadas com plástico ou reforçadas com metal ou com outras matérias", + "0100700": "Juntas, gaxetas e outros elementos com função semelhante de vedação", + "0100800": "Partes de veículos automóveis, tratores e máquinas autopropulsadas", + "0100900": "Tapetes, revestimentos, mesmo confeccionados, batentes, buchas e coxins", + "0101000": "Tecidos impregnados, revestidos, recobertos ou estratificados, com plástico", + "0101100": + "Mangueiras e tubos semelhantes, de matérias têxteis, mesmo com reforço ou acessórios de outras matérias", + "0101200": "Encerados e toldos", + "0101300": + "Capacetes e artefatos de uso semelhante, de proteção, para uso em motocicletas, incluídos ciclomotores", + "0101400": + "Guarnições de fricção (por exemplo, placas, rolos, tiras, segmentos, discos, anéis, pastilhas), não montadas, para freios, embreagens ou qualquer outro mecanismo de fricção, à base de amianto, de outras substâncias minerais ou de celulose, mesmo combinadas com têxteis ou outras matérias", + "0101500": "Vidros de dimensões e formatos que permitam aplicação automotiva", + "0101600": "Espelhos retrovisores", + "0101700": "Lentes de faróis, lanternas e outros utensílios", + "0101800": "Cilindro de aço para GNV (gás natural veicular)", + "0101900": + "Recipientes para gases comprimidos ou liquefeitos, de ferro fundido, ferro ou aço, exceto o descrito no item 18.0", + "0102000": "Molas e folhas de molas, de ferro ou aço", + "0102100": "Obras moldadas, de ferro fundido, ferro ou aço, exceto as do código 7325.91.00", + "0102200": "Peso de chumbo para balanceamento de roda", + "0102300": "Peso para balanceamento de roda e outros utensílios de estanho", + "0102400": "Fechaduras e partes de fechaduras", + "0102500": "Chaves apresentadas isoladamente", + "0102600": "Dobradiças, guarnições, ferragens e artigos semelhantes de metais comuns", + "0102700": "Triângulo de segurança", + "0102800": + "Motores de pistão alternativo dos tipos utilizados para propulsão de veículos do Capítulo 87", + "0102900": "Motores dos tipos utilizados para propulsão de veículos automotores", + "0103000": + "Partes reconhecíveis como exclusiva ou principalmente destinadas aos motores das posições 8407 ou 8408", + "0103100": "Motores hidráulicos", + "0103200": + "Bombas para combustíveis, lubrificantes ou líquidos de arrefecimento, próprias para motores de ignição por centelha ou por compressão", + "0103300": "Bombas de vácuo", + "0103400": "Compressores e turbocompressores de ar", + "0103500": + "Partes das bombas, compressores e turbocompressores dos CEST 01.032.00, 01.033.00 e 01.034.00", + "0103600": "Máquinas e aparelhos de ar condicionado", + "0103700": + "Aparelhos para filtrar óleos minerais nos motores de ignição por centelha ou por compressão", + "0103800": "Filtros a vácuo", + "0103900": "Partes dos aparelhos para filtrar ou depurar líquidos ou gases", + "0104000": "Extintores, mesmo carregados", + "0104100": "Filtros de entrada de ar para motores de ignição por centelha ou por compressão", + "0104200": "Depuradores por conversão catalítica de gases de escape", + "0104300": "Macacos", + "0104400": "Partes para macacos do CEST 01.043.00", + "0104500": + "Partes reconhecíveis como exclusiva ou principalmente destinadas às máquinas agrícolas ou rodoviárias", + "0104501": + "Partes reconhecíveis como exclusiva ou principalmente destinadas às máquinas agrícolas ou rodoviárias", + "0104600": "Válvulas redutoras de pressão", + "0104700": "Válvulas para transmissão óleo-hidráulicas ou pneumáticas", + "0104800": "Válvulas solenoides", + "0104900": "Rolamentos", + "0105000": + "Árvores de transmissão (incluídas as árvores de “cames” e virabrequins) e manivelas; mancais e “bronzes”; engrenagens e rodas de fricção; eixos de esferas ou de roletes; redutores, multiplicadores, caixas de transmissão e variadores de velocidade, incluídos os conversores de torque; volantes e polias, incluídas as polias para cadernais; embreagens e dispositivos de acoplamento, incluídas as juntas de articulação", + "0105100": + "Juntas metaloplásticas; jogos ou sortidos de juntas de composições diferentes, apresentados em bolsas, envelopes ou embalagens semelhantes; juntas de vedação mecânicas (selos mecânicos)", + "0105200": "Acoplamentos, embreagens, variadores de velocidade e freios, eletromagnéticos", + "0105300": + "Acumuladores elétricos de chumbo, do tipo utilizado para o arranque dos motores de pistão, exceto os classificados no CEST 01.053.01", + "0105301": + "Acumuladores elétricos de chumbo, do tipo utilizado para o arranque dos motores de pistão e de capacidade inferior ou igual a 20 Ah e tensão inferior ou igual a 12 V", + "0105400": + "Aparelhos e dispositivos elétricos de ignição ou de arranque para motores de ignição por centelha ou por compressão (por exemplo, magnetos, dínamos-magnetos, bobinas de ignição, velas de ignição ou de aquecimento, motores de arranque); geradores (dínamos e alternadores, por exemplo) e conjuntores-disjuntores utilizados com estes motores", + "0105500": + "Aparelhos elétricos de iluminação ou de sinalização (exceto os da posição 8539), limpadores de para-brisas, degeladores e desembaçadores (desembaciadores) elétricos e suas partes", + "0105600": "Telefones móveis do tipo dos utilizados em veículos automóveis", + "0105700": "Alto-falantes, amplificadores elétricos de audiofrequência e partes", + "0105800": "Aparelhos elétricos de amplificação de som para veículos automotores", + "0105900": "Aparelhos de reprodução de som", + "0106000": + "Aparelhos transmissores (emissores) de radiotelefonia ou radiotelegrafia (rádio receptor/transmissor)", + "0106100": + "Aparelhos receptores de radiodifusão que só funcionem com fonte externa de energia combinados com um aparelho de gravação ou de reprodução de som, do tipo utilizado em veículos automóveis", + "0106200": + "Outros aparelhos receptores de radiodifusão que só funcionem com fonte externa de energia, do tipo utilizado em veículos automóveis", + "0106201": + "Outros aparelhos videofônicos de gravação ou de reprodução, mesmo incorporando um receptor de sinais videofônicos, dos tipos utilizados exclusivamente em veículos automotores", + "0106300": "Antenas", + "0106400": "Circuitos impressos", + "0106500": "Interruptores e seccionadores e comutadores", + "0106600": "Fusíveis e corta-circuitos de fusíveis", + "0106700": "Disjuntores", + "0106800": "Relés", + "0106900": + "Partes reconhecíveis como exclusivas ou principalmente destinados aos aparelhos dos CEST 01.065.00, 01.066.00, 01.067.00 e 01.068.00", + "0107000": "Faróis e projetores, em unidades seladas", + "0107100": "Lâmpadas e tubos de incandescência, exceto de raios ultravioleta ou infravermelhos", + "0107200": "Cabos coaxiais e outros condutores elétricos coaxiais", + "0107300": "Jogos de fios para velas de ignição e outros jogos de fios", + "0107400": + "Carroçarias para os veículos automóveis das posições 8701 a 8705, incluídas as cabinas", + "0107500": "Partes e acessórios dos veículos automóveis das posições 8701 a 8705", + "0107600": "Parte e acessórios de motocicletas (incluídos os ciclomotores)", + "0107700": "Engates para reboques e semirreboques", + "0107800": "Medidores de nível; Medidores de vazão", + "0107900": "Aparelhos para medida ou controle da pressão", + "0108000": "Contadores, indicadores de velocidade e tacômetros, suas partes e acessórios", + "0108100": "Amperímetros", + "0108200": + "Aparelhos digitais, de uso em veículos automóveis, para medida e indicação de múltiplas grandezas tais como: velocidade média, consumos instantâneo e médio e autonomia (computador de bordo)", + "0108300": "Controladores eletrônicos", + "0108400": "Relógios para painéis de instrumentos e relógios semelhantes", + "0108500": "Assentos e partes de assentos", + "0108600": "Acendedores", + "0108700": "Tubos de borracha vulcanizada não endurecida, mesmo providos de seus acessórios", + "0108800": "Juntas de vedação de cortiça natural e de amianto", + "0108900": "Papel-diagrama para tacógrafo, em disco", + "0109000": + "Fitas, tiras, adesivos, autocolantes, de plástico, refletores, mesmo em rolos; placas metálicas com película de plástico refletora, próprias para colocação em carrocerias, para-choques de veículos de carga, motocicletas, ciclomotores, capacetes, bonés de agentes de trânsito e de condutores de veículos, atuando como dispositivos refletivos de segurança rodoviários", + "0109100": "Cilindros pneumáticos", + "0109200": "Bomba elétrica de lavador de para-brisa", + "0109300": "Bomba de assistência de direção hidráulica", + "0109400": "Motoventiladores", + "0109500": "Filtros de pólen do ar-condicionado", + "0109600": "“Máquina” de vidro elétrico de porta", + "0109700": "Motor de limpador de para-brisa", + "0109800": "Bobinas de reatância e de autoindução", + "0109900": "Baterias de chumbo e de níquel-cádmio", + "0110000": "Aparelhos de sinalização acústica (buzina)", + "0110100": "Instrumentos para regulação de grandezas não elétricas", + "0110200": "Analisadores de gases ou de fumaça (sonda lambda)", + "0110300": "Perfilados de borracha vulcanizada não endurecida", + "0110400": "Artefatos de pasta de fibra de uso automotivo", + "0110500": "Tapetes/carpetes – náilon", + "0110600": "Tapetes de matérias têxteis sintéticas", + "0110700": "Forração interior capacete", + "0110800": "Outros para-brisas", + "0110900": "Moldura com espelho", + "0111100": "Corrente transmissão", + "0111200": "Outras correntes de transmissão", + "0111300": "Condensador tubular metálico", + "0111400": "Trocadores de calor", + "0111500": "Partes de aparelhos mecânicos de pulverizar ou dispersar", + "0111600": "Macacos manuais para veículos", + "0111700": "Caçambas, pás, ganchos e tenazes para máquinas rodoviárias", + "0111800": "Geradores de corrente alternada de potência não superior a 75 kva", + "0111900": "Aparelhos elétricos para alarme de uso automotivo", + "0112000": "Bússolas", + "0112100": "Indicadores de temperatura", + "0112200": "Partes de indicadores de temperatura", + "0112300": "Partes de aparelhos de medida ou controle", + "0112400": "Termostatos", + "0112500": "Instrumentos e aparelhos para regulação", + "0112600": "Pressostatos", + "0112700": "Peças para reboques e semirreboques, exceto os itens classificados no CEST 01.077.00", + "0112800": + "Geradores de ar quente a combustível líquido, com capacidade superior ou igual a 1.500 kcal/h, mas inferior ou igual a 10.400 kcal/h, do tipo dos utilizados em veículos automóveis", + "0199900": + "Outras peças, partes e acessórios para veículos automotores não relacionados nos demais itens deste anexo", + "0200100": "Aperitivos, amargos, bitter e similares", + "0200200": "Batida e similares", + "0200300": "Bebida ice", + "0200400": "Cachaça e aguardentes", + "0200500": "Catuaba e similares", + "0200600": "Conhaque, brandy e similares", + "0200700": "Cooler", + "0200800": "Gim (gin) e genebra", + "0200900": "Jurubeba e similares", + "0201000": "Licores e similares", + "0201100": "Pisco", + "0201200": "Rum", + "0201300": "Saquê", + "0201400": "Steinhaeger", + "0201500": "Tequila", + "0201600": "Uísque", + "0201700": "Vermute e similares", + "0201800": "Vodka", + "0201900": "Derivados de vodka", + "0202000": "Arak", + "0202100": "Aguardente vínica / grappa", + "0202200": "Sidra e similares", + "0202300": "Sangrias e coquetéis", + "0202400": "Vinhos de uvas frescas, incluindo os vinhos enriquecidos com álcool; mostos de uvas", + "0299900": "Outras bebidas alcoólicas não especificadas nos itens anteriores", + "0300300": "Água mineral, gasosa ou não, ou potável, naturais, em embalagem de vidro descartável", + "0300301": + "Água mineral, gasosa ou não, ou potável, naturais, adicionadas de sais, em embalagem de vidro descartável", + "0300500": "Água mineral, gasosa ou não, ou potável, naturais, em copo plástico descartável", + "0300501": + "Água mineral, gasosa ou não, ou potável, naturais, adicionadas de sais, em copo plástico descartável", + "0300502": "Água mineral, gasosa ou não, ou potável, naturais, em jarra descartável", + "0300503": + "Água mineral, gasosa ou não, ou potável, naturais, adicionadas de sais, em jarra descartável", + "0300504": "Água mineral, gasosa ou não, ou potável, naturais, em demais embalagens descartáveis", + "0300505": + "Água mineral, gasosa ou não, ou potável, naturais, adicionadas de sais, em demais embalagens descartáveis", + "0300600": + "Outras águas minerais, gasosa ou não, ou potável, naturais; exceto as classificadas no CEST 03.003.00, 03.003.01, 03.005.00, 03.005.01 a 03.005.05, 03.024.00 e 03.025.00", + "0300700": "Água aromatizada artificialmente, exceto os refrescos e refrigerantes", + "0300800": + "Outras águas minerais, gasosa ou não, ou potável, naturais, inclusive gaseificadas ou aromatizadas artificialmente, exceto os refrescos e refrigerantes", + "0301000": "Refrigerante em vidro descartável", + "0301001": "Refrigerante em embalagem pet", + "0301002": "Refrigerante em lata", + "0301100": + "Demais refrigerantes, exceto os classificados no CEST 03.010.00, 03.010.01, 03.010.02 e 03.011.01", + "0301101": "Espumantes sem álcool", + "0301200": + "Xarope ou extrato concentrado destinados ao preparo de refrigerante em máquina “pré-mix” ou “post-mix”, exceto o classificado no CEST 03.012.01", + "0301201": "Cápsula de refrigerante", + "0301300": "Bebidas energéticas em lata", + "0301301": "Bebidas energéticas em embalagem PET", + "0301302": "Bebidas energéticas em vidro", + "0301500": "Bebidas hidroeletrolíticas", + "0302100": "Cerveja em garrafa de vidro retornável", + "0302101": "Cerveja em garrafa de vidro descartável", + "0302102": "Cerveja em garrafa de alumínio", + "0302103": "Cerveja em lata", + "0302104": "Cerveja em barril", + "0302105": "Cerveja em embalagem PET", + "0302106": "Cerveja em outras embalagens", + "0302200": "Cerveja sem álcool em garrafa de vidro retornável", + "0302201": "Cerveja sem álcool em garrafa de vidro descartável", + "0302202": "Cerveja sem álcool em garrafa de alumínio", + "0302203": "Cerveja sem álcool em lata", + "0302204": "Cerveja sem álcool em barril", + "0302205": "Cerveja sem álcool em embalagem PET", + "0302206": "Cerveja sem álcool em outras embalagens", + "0302300": "Chope", + "0302400": + "Água mineral em embalagens retornáveis com capacidade igual ou superior a 10 (dez) e inferior a 20 (vinte) litros", + "0302500": + "Água mineral em embalagens retornáveis com capacidade igual ou superior a 20 (vinte) litros", + "0400100": "Charutos, cigarrilhas e cigarros, de tabaco ou dos seus sucedâneos", + "0400200": "Tabaco para fumar, mesmo contendo sucedâneos de tabaco em qualquer proporção", + "0500100": "Cimento", + "0600100": + "Álcool etílico não desnaturado, com um teor alcoólico em volume igual ou superior a 80% vol - Com um teor de água igual ou inferior a 1 % vol (álcool etílico anidro combustível)", + "0600101": + "Álcool etílico não desnaturado, com um teor alcoólico em volume igual ou superior a 80% vol - Outros (álcool etílico hidratado combustível)", + "0600200": "Gasolina automotiva A, exceto Premium", + "0600201": "Gasolina automotiva C, exceto Premium", + "0600202": "Gasolina automotiva A Premium", + "0600203": "Gasolina automotiva C Premium", + "0600300": "Gasolina de aviação", + "0600400": "Querosenes, exceto de aviação", + "0600500": "Querosene de aviação", + "0600600": "Óleo diesel A, exceto S10 e Marítimo", + "0600601": "Óleo diesel B, exceto S10 (mistura obrigatória)", + "0600602": "Óleo diesel B, exceto S10 (misturas autorizativas)", + "0600603": "Óleo diesel B, exceto S10 (misturas experimentais)", + "0600604": "Óleo diesel A S10", + "0600605": "Óleo diesel B S10 (mistura obrigatória)", + "0600606": "Óleo diesel B S10 (misturas autorizativas)", + "0600607": "Óleo diesel B S10 (misturas experimentais)", + "0600608": "Óleo Diesel Marítimo", + "0600609": "Outros óleos combustíveis, exceto os classificados no CEST 06.006.10 e 06.006.11", + "0600610": "Óleo combustível derivado de xisto", + "0600611": "Óleo combustível pesado", + "0600700": "Óleos lubrificantes", + "0600800": + "Outros óleos de petróleo ou de minerais betuminosos (exceto óleos brutos) e preparações não especificadas nem compreendidas noutras posições, que contenham, como constituintes básicos, 70% ou mais, em peso, de óleos de petróleo ou de minerais betuminosos, exceto os que contenham biodiesel, exceto os resíduos de óleos e exceto as graxas lubrificantes", + "0600801": "Graxa lubrificante", + "0600900": "Resíduos de óleos", + "0601000": + "Gás de petróleo e outros hidrocarbonetos gasosos, exceto GLP, GLGN, Gás Natural e Gás de xisto", + "0601100": "Gás liquefeito de petróleo em botijão de 13 Kg (GLP)", + "0601101": "Gás liquefeito de petróleo (GLP), exceto em botijão de 13 Kg", + "0601102": "Gás liquefeito de petróleo em botijão de 13 Kg (GLGNn)", + "0601103": "Gás liquefeito de petróleo (GLGNn), exceto em botijão de 13 Kg", + "0601104": "Gás liquefeito de petróleo em botijão de 13 Kg (GLGNi)", + "0601105": "Gás liquefeito de petróleo (GLGNi), exceto em botijão de 13 Kg", + "0601106": "Gás liquefeito de petróleo em botijão de 13 kg (Misturas)", + "0601107": "Gás liquefeito de petróleo (Misturas), exceto em botijão de 13 Kg", + "0601200": "Gás Natural Liquefeito", + "0601300": "Gás Natural Gasoso", + "0601400": "Gás de xisto", + "0601500": "Coque de petróleo e outros resíduos de óleo de petróleo ou de minerais betuminosos", + "0601600": + "Biodiesel e suas misturas, que não contenham ou que contenham menos de 70%, em peso, de óleos de petróleo ou de óleos minerais betuminosos", + "0601700": + "Preparações lubrificantes, exceto as contendo, como constituintes de base, 70% ou mais, em peso, de óleos de petróleo ou de minerais betuminosos", + "0601800": + "Óleos de petróleo ou de minerais betuminosos (exceto óleos brutos) e preparações não especificadas nem compreendidas noutras posições, que contenham, como constituintes básicos, 70% ou mais, em peso, de óleos de petróleo ou de minerais betuminosos, que contenham biodiesel, exceto os resíduos de óleos", + "0601900": "Naftas, exceto a Nafta petroquímica", + "0700100": "Energia elétrica", + "0800100": "Ferramentas de borracha vulcanizada não endurecida", + "0800200": "Ferramentas, armações e cabos de ferramentas, de madeira", + "0800300": + "Mós e artefatos semelhantes, sem armação, para moer, desfibrar, triturar, amolar, polir, retificar ou cortar; pedras para amolar ou para polir, manualmente, e suas partes, de pedras naturais, de abrasivos naturais ou artificiais aglomerados ou de cerâmica, mesmo com partes de outras matérias", + "0800400": + "Pás, alviões, picaretas, enxadas, sachos, forcados e forquilhas, ancinhos e raspadeiras; machados, podões e ferramentas semelhantes com gume; tesouras de podar de todos os tipos; foices e foicinhas, facas para feno ou para palha, tesouras para sebes, cunhas e outras ferramentas manuais para agricultura, horticultura ou silvicultura", + "0800500": "Folhas de serras de fita", + "0800600": "Lâminas de serras máquinas", + "0800700": + "Serras manuais e outras folhas de serras (incluídas as fresas-serras e as folhas não dentadas para serrar), exceto as classificadas nos CEST 08.005.00 e 08.006.00", + "0800800": + "Limas, grosas, alicates (mesmo cortantes), tenazes, pinças, cisalhas para metais, corta-tubos, corta-pinos, saca-bocados e ferramentas semelhantes, manuais, exceto as pinças para sobrancelhas classificadas na posição 8203.20.90", + "0800900": + "Chaves de porcas, manuais (incluídas as chaves dinamométricas); chaves de caixa intercambiáveis, mesmo com cabos", + "0801000": + "Ferramentas manuais (incluídos os diamantes de vidraceiro) não especificadas nem compreendidas em outras posições, lamparinas ou lâmpadas de soldar (maçaricos) e semelhantes; tornos de apertar, sargentos e semelhantes, exceto os acessórios ou partes de máquinas-ferramentas; bigornas; forjas-portáteis; mós com armação, manuais ou de pedal", + "0801100": + "Ferramentas de pelo menos duas das posições 8202 a 8205, acondicionadas em sortidos para venda a retalho", + "0801200": + "Ferramentas de roscar interior ou exteriormente; de mandrilar ou de brochar; e de fresar", + "0801300": + "Outras ferramentas intercambiáveis para ferramentas manuais, mesmo mecânicas, ou para máquinas-ferramentas (por exemplo, de embutir, estampar, puncionar, furar, tornear, aparafusar), incluídas as fieiras de estiragem ou de extrusão, para metais, e as ferramentas de perfuração ou de sondagem, exceto forma ou gabarito de produtos em epoxy e as classificadas no CEST 08.012.00", + "0801400": "Facas e lâminas cortantes, para máquinas ou para aparelhos mecânicos", + "0801500": "Plaquetas ou pastilhas intercambiáveis", + "0801600": + "Outras plaquetas, varetas, pontas e objetos semelhantes para ferramentas, não montados, de ceramais (“cermets”), exceto as classificadas no CEST 08.015.00", + "0801700": + "Facas de lâmina cortante ou serrilhada, incluídas as podadeiras de lâmina móvel, e suas lâminas, exceto as de uso doméstico", + "0801800": "Tesouras e suas lâminas", + "0801900": + "Ferramentas pneumáticas, hidráulicas ou com motor (elétrico ou não elétrico) incorporado, de uso manual, exceto o descrito no CEST 08.019.01", + "0801901": + "Moto-serras portáteis de corrente, com motor incorporado, não elétrico, de uso agrícola", + "0802000": + "Instrumentos e aparelhos de geodesia, topografia, agrimensura, nivelamento, fotogrametria, hidrografia, oceanografia, hidrologia, meteorologia ou de geofísica, exceto bussolas; telêmetros", + "0802100": + "Instrumentos de desenho, de traçado ou de cálculo; metros, micrômetros, paquímetros, calibres e semelhantes; partes e acessórios", + "0802200": "Termômetros, suas partes e acessórios", + "0802300": "Pirômetros, suas partes e acessórios", + "0900100": "Lâmpadas elétricas", + "0900200": "Lâmpadas eletrônicas", + "0900300": "Reatores para lâmpadas ou tubos de descargas", + "0900400": "“Starter”", + "0900500": "Lâmpadas de LED (diodos emissores de luz)", +}; + +/** + * Segment names of Anexo I of Convênio ICMS 142/18, indexed by the 2 digit segment code, which + * is the first two digits of every CEST of the segment. + * + * @see Official: https://www.confaz.fazenda.gov.br/legislacao/convenios/2018/CV142_18 + * Anexo I, "Segmentos de mercadorias". + */ +export const CEST_SEGMENTS: Record = { + "10": "Materiais de construção e congêneres", + "11": "Materiais de limpeza", + "12": "Materiais elétricos", + "13": "Medicamentos de uso humano e outros produtos farmacêuticos para uso humano ou veterinário", + "14": "Papéis, plásticos, produtos cerâmicos e vidros", + "16": "Pneumáticos, câmaras de ar e protetores de borracha", + "17": "Produtos alimentícios", + "19": "Produtos de papelaria", + "20": "Produtos de perfumaria e de higiene pessoal e cosméticos", + "21": "Produtos eletrônicos, eletroeletrônicos e eletrodomésticos", + "22": "Rações para animais domésticos", + "23": "Sorvetes e preparados para fabricação de sorvetes em máquinas", + "24": "Tintas e vernizes", + "25": "Veículos automotores", + "26": "Veículos de duas e três rodas motorizados", + "28": "Venda de mercadorias pelo sistema porta a porta", + "01": "Autopeças", + "02": "Bebidas alcoólicas, exceto cerveja e chope", + "03": "Cervejas, chopes, refrigerantes, águas e outras bebidas", + "04": "Cigarros e outros produtos derivados do fumo", + "05": "Cimentos", + "06": "Combustíveis e lubrificantes", + "07": "Energia elétrica", + "08": "Ferramentas", + "09": "Lâmpadas, reatores e “starter”", +}; + +/** + * Shape a CEST has to be written in: the 7 digits, optionally split into segment, item and + * specification by a single whitespace or mask character, the way the annexes print them + * ("01.001.00"). + */ +export const CEST_FORMAT_REGEX = /^\d{2}[\s.\-/]?\d{3}[\s.\-/]?\d{2}$/; diff --git a/src/_internals/constants/cid10-descriptions.ts b/src/_internals/constants/cid10-descriptions.ts new file mode 100644 index 000000000..e41d21a82 --- /dev/null +++ b/src/_internals/constants/cid10-descriptions.ts @@ -0,0 +1,14255 @@ +/** + * CID-10 (Classificação Estatística Internacional de Doenças e Problemas Relacionados à Saúde, + * 10th revision) descriptions in Brazilian Portuguese, indexed by the code without the dot: the + * 3 character categories (`A00`) and the 4 character subcategories (`A000`, printed `A00.0`). + * + * Built from `CID-10-CATEGORIAS.CSV` and `CID-10-SUBCATEGORIAS.CSV`, the two `;` separated + * ISO-8859-1 tables DATASUS publishes inside `CID10CSV.zip` (CID-10 V2008). The descriptions are + * the `DESCRICAO` column, as published. A category with no subcategory is listed by both files + * with the same description and shows up once here. + * + * This table is about 1 MB, so it has a module of its own: `CID10_SUBCATEGORIES`, which holds + * the same codes without the descriptions, lives in `cid10.ts` and never loads this one. + * + * Generated by `node ./scripts/cid10.ts`. Do not edit by hand. + * + * @see Official: http://www2.datasus.gov.br/cid10/V2008/downloads/CID10CSV.zip + * The CID-10 tables in CSV, as published by DATASUS (Ministério da Saúde). + * @see Official: http://www2.datasus.gov.br/cid10/V2008/descrcsv.htm + * The DATASUS page that links the archive and documents its files, columns and encoding. + */ +export const CID10_DESCRIPTIONS: Record = { + A00: "Cólera", + A000: "Cólera devida a Vibrio cholerae 01, biótipo cholerae", + A001: "Cólera devida a Vibrio cholerae 01, biótipo El Tor", + A009: "Cólera não especificada", + A01: "Febres tifóide e paratifóide", + A010: "Febre tifóide", + A011: "Febre paratifóide A", + A012: "Febre paratifóide B", + A013: "Febre paratifóide C", + A014: "Febre paratifóide não especificada", + A02: "Outras infecções por Salmonella", + A020: "Enterite por salmonela", + A021: "Septicemia por salmonela", + A022: "Infecções localizadas por salmonela", + A028: "Outras infecções especificadas por salmonela", + A029: "Infecção não especificada por salmonela", + A03: "Shiguelose", + A030: "Shiguelose devida a Shigella dysenteriae", + A031: "Shiguelose devida a Shigella flexneri", + A032: "Shiguelose devida a Shigella boydii", + A033: "Shiguelose devida a Shigella sonnei", + A038: "Outras shigueloses", + A039: "Shiguelose não especificada", + A04: "Outras infecções intestinais bacterianas", + A040: "Infecção por Escherichia coli enteropatogênica", + A041: "Infecção por Escherichia coli enterotoxigênica", + A042: "Infecção por Escherichia coli enteroinvasiva", + A043: "Infecção por Escherichia coli enterohemorrágica", + A044: "Outras infecções intestinais por Escherichia coli", + A045: "Enterite por Campylobacter", + A046: "Enterite devida a Yersinia enterocolítica", + A047: "Enterocolite devida a Clostridium difficile", + A048: "Outras infecções bacterianas intestinais especificadas", + A049: "Infecção intestinal bacteriana não especificada", + A05: "Outras intoxicações alimentares bacterianas, não classificadas em outra parte", + A050: "Intoxicação alimentar estafilocócica", + A051: "Botulismo", + A052: "Intoxicação alimentar devida a Clostridium perfringens [Clostridium welchii]", + A053: "Intoxicação alimentar devida a Vibrio parahemolyticus", + A054: "Intoxicação alimentar devida a Bacillus cereus", + A058: "Outras intoxicações alimentares bacterianas especificadas", + A059: "Intoxicação alimentar bacteriana não especificada", + A06: "Amebíase", + A060: "Disenteria amebiana aguda", + A061: "Amebíase intestinal crônica", + A062: "Colite amebiana não-disentérica", + A063: "Ameboma intestinal", + A064: "Abscesso amebiano do fígado", + A065: "Abscesso amebiano do pulmão", + A066: "Abscesso amebiano do cérebro", + A067: "Amebíase cutânea", + A068: "Infecção amebiana de outras localizações", + A069: "Amebíase não especificada", + A07: "Outras doenças intestinais por protozoários", + A070: "Balantidíase", + A071: "Giardíase [lamblíase]", + A072: "Criptosporidiose", + A073: "Isosporíase", + A078: "Outras doenças intestinais especificadas por protozoários", + A079: "Doença intestinal não especificada por protozoários", + A08: "Infecções intestinais virais, outras e as não especificadas", + A080: "Enterite por rotavírus", + A081: "Gastroenteropatia aguda pelo agente de Norwalk", + A082: "Enterite por adenovírus", + A083: "Outras enterites virais", + A084: "Infecção intestinal devida a vírus não especificado", + A085: "Outras infecções intestinais especificadas", + A09: "Diarréia e gastroenterite de origem infecciosa presumível", + A15: "Tuberculose respiratória, com confirmação bacteriológica e histológica", + A150: "Tuberculose pulmonar, com confirmação por exame microscópico da expectoração, com ou sem cultura", + A151: "Tuberculose pulmonar, com confirmação somente por cultura", + A152: "Tuberculose pulmonar, com confirmação histológica", + A153: "Tuberculose pulmonar, com confirmação por meio não especificado", + A154: "Tuberculose dos gânglios intratorácicos, com confirmação bacteriológica e histológica", + A155: "Tuberculose da laringe, da traquéia e dos brônquios, com confirmação bacteriológica e histológica", + A156: "Pleuris tuberculoso, com confirmação bacteriológica e histológica", + A157: "Tuberculose primária das vias respiratórias, com confirmação bacteriológica e histológica", + A158: "Outras formas de tuberculose das vias respiratórias, com confirmação bacteriológica e histológica", + A159: "Tuberculose não especificada das vias respiratórias, com confirmação bacteriológica e histológica", + A16: "Tuberculose das vias respiratórias, sem confirmação bacteriológica ou histológica", + A160: "Tuberculose pulmonar com exames bacteriológico e histológico negativos", + A161: "Tuberculose pulmonar, sem realização de exame bacteriológico ou histológico", + A162: "Tuberculose pulmonar, sem menção de confirmação bacteriológica ou histológica", + A163: "Tuberculose dos gânglios intratorácicos, sem menção de confirmação bacteriológica ou histológica", + A164: "Tuberculose da laringe, da traquéia e dos brônquios, sem menção de confirmação bacteriológica ou histológica", + A165: "Pleurisia tuberculosa, sem menção de confirmação bacteriológica ou histológica", + A167: "Tuberculosa respiratória primária sem menção de confirmação bacteriológica ou histológica", + A168: "Outras formas de tuberculose das vias respiratórias, sem menção de confirmação bacteriológica ou histológica", + A169: "Tuberculose respiratória, não especificada, sem menção de confirmação bacteriológica ou histológica", + A17: "Tuberculose do sistema nervoso", + A170: "Meningite tuberculosa", + A171: "Tuberculoma meníngeo", + A178: "Outras tuberculoses do sistema nervoso", + A179: "Tuberculose não especificada do sistema nervoso", + A18: "Tuberculose de outros órgãos", + A180: "Tuberculose óssea e das articulações", + A181: "Tuberculose do aparelho geniturinário", + A182: "Linfadenopatia tuberculosa periférica", + A183: "Tuberculose do intestino, do peritônio e dos gânglios mesentéricos", + A184: "Tuberculose de pele e do tecido celular subcutâneo", + A185: "Tuberculose do olho", + A186: "Tuberculose do ouvido", + A187: "Tuberculose das supra-renais", + A188: "Tuberculose de outros órgãos especificados", + A19: "Tuberculose miliar", + A190: "Tuberculose miliar aguda de localização única e especificada", + A191: "Tuberculose miliar aguda de múltiplas localizações", + A192: "Tuberculose miliar aguda não especificada", + A198: "Outras tuberculoses miliares", + A199: "Tuberculose miliar não especificada", + A20: "Peste", + A200: "Peste bubônica", + A201: "Peste celulocutânea", + A202: "Peste pneumônica", + A203: "Peste meníngea", + A207: "Peste septicêmica", + A208: "Outras formas de peste", + A209: "Peste, forma não especificada", + A21: "Tularemia", + A210: "Tularemia ulceroglandular", + A211: "Tularemia oculoglandular", + A212: "Tularemia pulmonar", + A213: "Tularemia gastrointestinal", + A217: "Tularemia generalizada", + A218: "Outras formas de tularemia", + A219: "Tularemia, forma não especificada", + A22: "Carbúnculo", + A220: "Carbúnculo cutâneo", + A221: "Carbúnculo pulmonar", + A222: "Carbúnculo gastrointestinal", + A227: "Septicemia carbunculosa", + A228: "Outras formas de carbúnculo", + A229: "Carbúnculo, forma não especificada", + A23: "Brucelose", + A230: "Brucelose por Brucella melitensis", + A231: "Brucelose por Brucella abortus", + A232: "Brucelose por Brucella suis", + A233: "Brucelose por Brucella canis", + A238: "Outras bruceloses", + A239: "Brucelose não especificada", + A24: "Mormo e melioidose", + A240: "Mormo", + A241: "Melioidose aguda e fulminante", + A242: "Melioidose subaguda e crônica", + A243: "Outras melioidoses", + A244: "Melioidose não especificada", + A25: "Febres transmitidas por mordedura de rato", + A250: "Espirilose", + A251: "Estreptobacilose", + A259: "Febre transmitida por mordedura de rato, tipo não especificado", + A26: "Erisipelóide", + A260: "Erisipelóide cutâneo", + A267: "Septicemia por Erysipelothrix", + A268: "Outras formas de erisipelóide", + A269: "Erisipelóide não especificado", + A27: "Leptospirose", + A270: "Leptopirose icterohemorrágica", + A278: "Outras formas de leptospirose", + A279: "Leptospirose não especificada", + A28: "Outras doenças bacterianas zoonóticas não classificadas em outra parte", + A280: "Pasteurelose", + A281: "Doença por arranhadura do gato", + A282: "Yersiniose extra-intestinal", + A288: "Outras doenças bacterianas zoonóticas especificadas não classificadas em outra parte", + A289: "Doença bacteriana zoonótica não especificada", + A30: "Hanseníase [doença de Hansen] [lepra]", + A300: "Hanseníase [lepra] indeterminada", + A301: "Hanseníase [lepra] tuberculóide", + A302: "Hanseníase [lepra] tuberculóide borderline", + A303: "Hanseníase [lepra] dimorfa", + A304: "Hanseníase [lepra] lepromatosa borderline", + A305: "Hanseníase [lepra] lepromatosa", + A308: "Outras formas de hanseníase [lepra]", + A309: "Hanseníase [lepra] não especificada", + A31: "Infecções devidas a outras micobactérias", + A310: "Infecção pulmonar micobacteriana", + A311: "Infecção cutânea micobacteriana", + A318: "Outras infecções micobacterianas", + A319: "Infecção micobacteriana não especificada", + A32: "Listeriose [listeríase]", + A320: "Listeriose cutânea", + A321: "Meningite e meningoencefalite por listéria", + A327: "Septicemia listeriótica", + A328: "Outras formas de listeriose", + A329: "Listeriose não especificada", + A33: "Tétano do recém-nascido [neonatal]", + A34: "Tétano obstétrico", + A35: "Outros tipos de tétano", + A36: "Difteria", + A360: "Difteria faríngea", + A361: "Difteria nasofaríngea", + A362: "Difteria laríngea", + A363: "Difteria cutânea", + A368: "Outras formas de difteria", + A369: "Difteria não especificada", + A37: "Coqueluche", + A370: "Coqueluche por Bordetella pertussis", + A371: "Coqueluche por Bordetella parapertussis", + A378: "Coqueluche por outras espécies da Bordetella", + A379: "Coqueluche não especificada", + A38: "Escarlatina", + A39: "Infecção meningogócica", + A390: "Meningite meningocócica", + A391: "Síndrome de Waterhouse-Friderichsen", + A392: "Meningococcemia aguda", + A393: "Meningococcemia crônica", + A394: "Meningococcemia não especificada", + A395: "Cardite por meningococos", + A398: "Outras infecções por meningococos", + A399: "Infecção meningocócica não especificada", + A40: "Septicemia estreptocócica", + A400: "Septicemia por Streptococcus do grupo A", + A401: "Septicemia por Streptococcus do grupo B", + A402: "Septicemia por Streptococcus do grupo D", + A403: "Septicemia por Streptococcus pneumonia", + A408: "Outras septicemias estreptocócicas", + A409: "Septicemia estreptocócica não especificada", + A41: "Outras septicemias", + A410: "Septicemia por Staphylococcus aureus", + A411: "Septicemia por outros estafilococos especificados", + A412: "Septicemia por estafilococos não especificados", + A413: "Septicemia por Haemophilus influenzae", + A414: "Septicemia por anaeróbios", + A415: "Septicemia por outros microorganismos gram-negativos", + A418: "Outras septicemias especificadas", + A419: "Septicemia não especificada", + A42: "Actinomicose", + A420: "Actinomicose pulmonar", + A421: "Actinomicose abdominal", + A422: "Actinomicose cervicofacial", + A427: "Septicemia actinomicótica", + A428: "Outras formas de actinomicose", + A429: "Actinomicose não especificada", + A43: "Nocardiose", + A430: "Nocardiose pulmonar", + A431: "Nocardiose cutânea", + A438: "Outras formas de nocardiose", + A439: "Nocardiose não especificada", + A44: "Bartonelose", + A440: "Bartonelose sistêmica", + A441: "Bartonelose cutânea e cutâneo-mucosa", + A448: "Outras formas de bartonelose", + A449: "Bartonelose não especificada", + A46: "Erisipela", + A48: "Outras doenças bacterianas não classificadas em outra parte", + A480: "Gangrena gasosa", + A481: "Doença dos legionários", + A482: "Doença dos legionários não-pneumônica [febre de Pontiac]", + A483: "Síndrome do choque tóxico", + A484: "Febre purpúrica do Brasil", + A488: "Outras doenças bacterianas especificadas", + A49: "Infecção bacteriana de localização não especificada", + A490: "Infecção estafilocócica de localização não especificada", + A491: "Infecção estreptocócica de localização não especificada", + A492: "Infecção por Haemophilus influenzae de localização não especificada", + A493: "Infecção por Mycoplasma de localização não especificada", + A498: "Outras infecções bacterianas de localização não especificada", + A499: "Infecção bacteriana não especificada", + A50: "Sífilis congênita", + A500: "Sífilis congênita precoce sintomática", + A501: "Sífilis congênita precoce, forma latente", + A502: "Sífilis congênita precoce não especificada", + A503: "Oculopatia sifilítica congênita tardia", + A504: "Neurossífilis congênita tardia [neurossífilis juvenil]", + A505: "Outras formas tardias e sintomáticas da sífilis congênita", + A506: "Sífilis congênita tardia latente", + A507: "Sífilis congênita tardia não especificada", + A509: "Sífilis congênita não especificada", + A51: "Sífilis precoce", + A510: "Sífilis genital primária", + A511: "Sífilis anal primária", + A512: "Sífilis primária de outras localizações", + A513: "Sífilis secundária da pele e das mucosas", + A514: "Outras formas de sífilis secundária", + A515: "Sífilis precoce latente", + A519: "Sífilis precoce não especificada", + A52: "Sífilis tardia", + A520: "Sífilis cardiovascular", + A521: "Neurossífilis sintomática", + A522: "Neurossífilis assintomática", + A523: "Neurossífilis não especificada", + A527: "Outras formas de sífilis tardia sintomática", + A528: "Sífilis tardia latente", + A529: "Sífilis tardia não especificada", + A53: "Outras formas e as não especificadas da sífilis", + A530: "Sífilis latente, não especificada se recente ou tardia", + A539: "Sífilis não especificada", + A54: "Infecção gonocócica", + A540: "Infecção gonocócica do trato geniturinário inferior, sem abscesso periuretral ou das glândulas acessórias", + A541: "Infecção gonocócica do trato geniturinário inferior, com abscesso periuretral ou das glândulas acessórias", + A542: "Pelviperitonite gonocócica e outras infecções geniturinárias gonocócicas", + A543: "Infecção gonocócica do olho", + A544: "Infecção gonocócica do sistema músculo-esquelético", + A545: "Faringite gonocócica", + A546: "Infecção gonocócica do ânus ou do reto", + A548: "Outras infecções gonocócicas", + A549: "Infecção gonocócica não especificada", + A55: "Linfogranuloma (venéreo) por clamídia", + A56: "Outras infecções causadas por clamídias transmitidas por via sexual", + A560: "Infecções por clamídias do trato geniturinário inferior", + A561: "Infecção por clamídias, pelviperitonial e de outros órgãos geniturinários", + A562: "Infecção por clamídias do trato geniturinário, localização não especificada", + A563: "Infecção do ânus e do reto por clamídias", + A564: "Infecção da faringe por clamídias", + A568: "Infecção por clamídias transmitida por via sexual, de outras localizações", + A57: "Cancro mole", + A58: "Granuloma inguinal", + A59: "Tricomoníase", + A590: "Tricomoníase urogenital", + A598: "Outras localizações de tricomoníase", + A599: "Tricomoníase não especificada", + A60: "Infecções anogenitais pelo vírus do herpes [herpes simples]", + A600: "Infecção dos órgãos genitais e do trato geniturinário pelo vírus do herpes", + A601: "Infecção da margem cutânea do ânus e do reto pelo vírus do herpes", + A609: "Infecção anogenital não especificada pelo vírus do herpes", + A63: "Outras doenças de transmissão predominantemente sexual, não classificadas em outra parte", + A630: "Verrugas anogenitais (venéreas)", + A638: "Outras doenças especificadas de transmissão predominantemente sexual", + A64: "Doenças sexualmente transmitidas, não especificadas", + A65: "Sífilis não-venérea", + A66: "Bouba", + A660: "Lesões iniciais da bouba", + A661: "Papilomas múltiplos e bouba plantar úmida (cravo de bouba)", + A662: "Outras lesões cutâneas precoces da bouba", + A663: "Hiperceratose devida a bouba", + A664: "Gomas e úlceras devidas à bouba", + A665: "Gangosa", + A666: "Lesões osteoarticulares devidas à bouba", + A667: "Outras manifestações da bouba", + A668: "Bouba latente", + A669: "Bouba não especificada", + A67: "Pinta [carate]", + A670: "Lesões primárias da pinta", + A671: "Lesões intermediárias da pinta", + A672: "Lesões tardias da pinta", + A673: "Lesões mistas da pinta", + A679: "Pinta não especificada", + A68: "Febres recorrentes [Borrelioses]", + A680: "Febre recorrente transmitida por piolhos", + A681: "Febre recorrente transmitida por carrapatos", + A689: "Febre recorrente não especificada", + A69: "Outras infecções por espiroquetas", + A690: "Estomatite ulcerativa necrotizante", + A691: "Outras infecções de Vincent", + A692: "Doença de Lyme", + A698: "Outras infecções especificadas por espiroquetas", + A699: "Infecção por espiroqueta, não especificada", + A70: "Infecções causadas por Clamídia psittaci", + A71: "Tracoma", + A710: "Fase inicial do tracoma", + A711: "Fase ativa do tracoma", + A719: "Tracoma não especificado", + A74: "Outras doenças causadas por Clamídias", + A740: "Conjuntivite causada por clamídias", + A748: "Outras doenças causadas por clamídias", + A749: "Infecção causada por clamídias não especificada", + A75: "Tifo exantemático", + A750: "Tifo epidêmico transmitido por piolhos devido a Rickettsia prowazekii", + A751: "Tifo recrudescente [doença de Brill]", + A752: "Tifo por Rickettsia typhi", + A753: "Tifo por Rickettsia tsutsugamuchi", + A759: "Tifo não especificado", + A77: "Febre maculosa [rickettsioses transmitidas por carrapatos]", + A770: "Febre maculosa por Rickettsia richettsii", + A771: "Febre maculosa por Rickettsia conorii", + A772: "Febre maculosa devida à Rickettsia siberica", + A773: "Febre maculosa devida à Rickettsia australis", + A778: "Outras febres maculosas", + A779: "Febre maculosa não especificada", + A78: "Febre Q", + A79: "Outras rickettsioses", + A790: "Febre das trincheiras", + A791: "Rickettsiose variceliforme devida à Rickettsia akari", + A798: "Outros tipos de rickettsioses especificadas", + A799: "Rickettsiose não especificada", + A80: "Poliomielite aguda", + A800: "Poliomielite paralítica aguda, associada ao vírus vacinal", + A801: "Poliomielite paralítica aguda, vírus selvagem importado", + A802: "Poliomielite paralítica aguda, vírus selvagem indígena", + A803: "Poliomielites paralíticas agudas, outras e não especificadas", + A804: "Poliomielite aguda não-paralítica", + A809: "Poliomielite aguda não especificada", + A81: "Infecções por vírus atípicos do sistema nervoso central", + A810: "Doença de Creutzfeldt-Jakob", + A811: "Panencefalite esclerosante subaguda", + A812: "Leucoencefalopatia multifocal progressiva", + A818: "Outras infecções por vírus atípicos do sistema nervoso central", + A819: "Infecção não especificada do sistema nervosos central por vírus atípicos", + A82: "Raiva", + A820: "Raiva silvestre", + A821: "Raiva urbana", + A829: "Raiva não especificada", + A83: "Encefalite por vírus transmitidos por mosquitos", + A830: "Encefalite japonesa", + A831: "Encefalite eqüina ocidental", + A832: "Encefalite eqüina oriental", + A833: "Encefalite de St. Louis", + A834: "Encefalite australiana", + A835: "Encefalite da Califórnia", + A836: "Doença pelo vírus de Rocio", + A838: "Outras encefalites por vírus transmitidas por mosquitos", + A839: "Encefalite não especificada por vírus transmitida por mosquitos", + A84: "Encefalite por vírus transmitido por carrapatos", + A840: "Encefalite da taiga [encefalite vernoestival russa]", + A841: "Encefalite da Europa Central transmitida por carrapatos", + A848: "Outras encefalites por vírus transmitidas por carrapatos", + A849: "Encefalite não especificada por vírus transmitida por carrapatos", + A85: "Outras encefalites virais, não classificadas em outra parte", + A850: "Encefalite por enterovírus", + A851: "Encefalite por adenovírus", + A852: "Encefalite por vírus transmitido por artrópodes, não especificada", + A858: "Outras encefalites virais especificadas", + A86: "Encefalite viral, não especificada", + A87: "Meningite viral", + A870: "Meningite por enterovírus", + A871: "Meningite por adenovírus", + A872: "Coriomeningite linfocitária", + A878: "Outras meningites virais", + A879: "Meningite viral não especificada", + A88: "Outras infecções virais do sistema nervoso central não classificadas em outra parte", + A880: "Febre exantemática por enterovírus [exantema de Boston]", + A881: "Vertigem epidêmica", + A888: "Outras infecções virais especificadas do sistema nervoso central", + A89: "Infecções virais não especificadas do sistema nervoso central", + A90: "Dengue [dengue clássico]", + A91: "Febre hemorrágica devida ao vírus do dengue", + A92: "Outras febres virais transmitidas por mosquitos", + A920: "Febre de Chikungunya", + A921: "Febre de O'nyong-nyong", + A922: "Febre eqüina venezuelana", + A923: "Infecção pelo vírus West Nile", + A924: "Febre do vale do Rift", + A928: "Outras febres virais especificadas transmitidas por mosquitos", + A929: "Febre viral transmitida por mosquitos, não especificada", + A93: "Outras febres por vírus transmitidas por artrópodes não classificadas em outra parte", + A930: "Febre de Oropouche", + A931: "Febre por flebótomos", + A932: "Febre do Colorado transmitida por carrapatos", + A938: "Outras febres virais especificadas transmitidas por artrópodes", + A94: "Febre viral transmitida por artrópodes, não especificada", + A95: "Febre amarela", + A950: "Febre amarela silvestre", + A951: "Febre amarela urbana", + A959: "Febre amarela não especificada", + A96: "Febre hemorrágica por arenavírus", + A960: "Febre hemorrágica de Junin", + A961: "Febre hemorrágica de Machupo", + A962: "Febre de Lassa", + A968: "Outras febres hemorrágicas por arenavírus", + A969: "Febre hemorrágica por arenavírus, não especificada", + A98: "Outras febres hemorrágicas por vírus, não classificadas em outra parte", + A980: "Febre hemorrágica da Criméia (do Congo)", + A981: "Febre hemorrágica de Omsk", + A982: "Doença da floresta de Kyasanur", + A983: "Doença de Marburg", + A984: "Doença pelo vírus Ebola", + A985: "Febre hemorrágica com síndrome renal", + A988: "Outras febres hemorrágicas especificadas por vírus", + A99: "Febres hemorrágicas virais não especificadas", + B00: "Infecções pelo vírus do herpes [herpes simples]", + B000: "Eczema herpético", + B001: "Dermatite vesicular devido ao vírus do herpes", + B002: "Gengivoestomatite e faringoamigdalite devida ao vírus do herpes", + B003: "Meningite devida ao vírus do herpes", + B004: "Encefalite devida ao vírus do herpes", + B005: "Afecções oculares devidas ao vírus do herpes", + B007: "Doença disseminada devida ao vírus do herpes", + B008: "Outras formas de infecção devida ao vírus do herpes", + B009: "Infecção não especificada devida ao vírus do herpes", + B01: "Varicela [Catapora]", + B010: "Meningite por varicela", + B011: "Encefalite por varicela", + B012: "Pneumopatia varicelosa", + B018: "Varicela com outras complicações", + B019: "Varicela sem complicação", + B02: "Herpes zoster [Zona]", + B020: "Encefalite pelo vírus do herpes zoster", + B021: "Meningite pelo vírus do herpes zoster", + B022: "Herpes zoster acompanhado de outras manifestações neurológicas", + B023: "Herpes zoster oftálmico", + B027: "Herpes zoster disseminado", + B028: "Herpes zoster com outras complicações", + B029: "Herpes zoster sem complicação", + B03: "Varíola", + B04: "Varíola dos macacos [Monkeypox]", + B05: "Sarampo", + B050: "Sarampo complicado por encefalite", + B051: "Sarampo complicado por meningite", + B052: "Sarampo complicado por pneumonia", + B053: "Sarampo complicado por otite média", + B054: "Sarampo com complicações intestinais", + B058: "Sarampo com outras complicações", + B059: "Sarampo sem complicação", + B06: "Rubéola", + B060: "Rubéola com complicações neurológicas", + B068: "Rubéola com outras complicações", + B069: "Rubéola sem complicação", + B07: "Verrugas de origem viral", + B08: "Outras infecções virais caracterizadas por lesões da pele e das membranas mucosas, não classificadas em outra parte", + B080: "Outras infecções por ortopoxvírus", + B081: "Molusco contagioso", + B082: "Exantema súbito [sexta doença]", + B083: "Eritema infeccioso [quinta doença]", + B084: "Estomatite vesicular devida a enterovírus com exantema", + B085: "Faringite vesicular devida a enterovírus", + B088: "Outras infecções virais especificadas caracterizadas por lesões de pele e das membranas mucosas", + B09: "Infecção viral não especificada caracterizada por lesões da pele e membranas mucosas", + B15: "Hepatite aguda A", + B150: "Hepatite A com coma hepático", + B159: "Hepatite A sem coma hepático", + B16: "Hepatite aguda B", + B160: "Hepatite aguda B com agente Delta (co-infecção), com coma hepático", + B161: "Hepatite aguda B com agente Delta, (co-infecção), sem coma hepático", + B162: "Hepatite aguda B sem agente Delta, com coma hepático", + B169: "Hepatite aguda B sem agente Delta e sem coma hepático", + B17: "Outras hepatites virais agudas", + B170: "(Super)infecção Delta aguda de portador de hepatite B", + B171: "Hepatite aguda C", + B172: "Hepatite aguda E", + B178: "Outras hepatites virais agudas especificadas", + B18: "Hepatite viral crônica", + B180: "Hepatite viral crônica B com agente Delta", + B181: "Hepatite crônica viral B sem agente Delta", + B182: "Hepatite viral crônica C", + B188: "Outras hepatites crônicas virais", + B189: "Hepatite viral crônica não especificada", + B19: "Hepatite viral não especificada", + B190: "Hepatite viral, não especificada, com coma", + B199: "Hepatite viral, não especificada, sem coma", + B20: "Doença pelo vírus da imunodeficiência humana [HIV], resultando em doenças infecciosas e parasitárias", + B200: "Doença pelo HIV resultando em infecções micobacterianas", + B201: "Doença pelo HIV resultando em outras infecções bacterianas", + B202: "Doença pelo HIV resultando em doença citomegálica", + B203: "Doença pelo HIV resultando em outras infecções virais", + B204: "Doença pelo HIV resultando em candidíase", + B205: "Doença pelo HIV resultando em outras micoses", + B206: "Doença pelo HIV resultando em pneumonia por Pneumocystis jirovecii", + B207: "Doença pelo HIV resultando em infecções múltiplas", + B208: "Doença pelo HIV resultando em outras doenças infecciosas e parasitárias", + B209: "Doença pelo HIV resultando em doença infecciosa ou parasitária não especificada", + B21: "Doença pelo vírus da imunodeficiência humana [HIV], resultando em neoplasias malignas", + B210: "Doença pelo HIV resultando em sarcoma de Kaposi", + B211: "Doença pelo HIV resultando em linfoma de Burkitt", + B212: "Doença pelo HIV resultando em outros tipos de linfoma não-Hodgkin", + B213: "Doença pelo HIV resultando em outras neoplasias malignas dos tecidos linfático, hematopoético e correlatos", + B217: "Doença pelo HIV resultando em múltiplas neoplasias malignas", + B218: "Doença pelo HIV resultando em outras neoplasias malignas", + B219: "Doença pelo HIV resultando em neoplasia maligna não especificada", + B22: "Doença pelo vírus da imunodeficiência humana [HIV] resultando em outras doenças especificadas", + B220: "Doença pelo HIV resultando em encefalopatia", + B221: "Doença pelo HIV resultando em pneumonite intersticial linfática", + B222: "Doença pelo HIV resultando em síndrome de emaciação", + B227: "Doença pelo HIV resultando em doenças múltiplas classificadas em outra parte", + B23: "Doença pelo vírus da imunodeficiência humana [HIV] resultando em outras doenças", + B230: "Síndrome de infecção aguda pelo HIV", + B231: "Doença pelo HIV resultando em linfadenopatias generalizadas (persistentes)", + B232: "Doença pelo HIV resultando em anomalias hematológicas e imunológicas não classificadas em outra parte", + B238: "Doença pelo HIV resultando em outra afecções especificadas", + B24: "Doença pelo vírus da imunodeficiência humana [HIV] não especificada", + B25: "Doença por citomegalovírus", + B250: "Pneumonite por citomegalovírus", + B251: "Hepatite por citomegalovírus", + B252: "Pancreatite por citomegalovírus", + B258: "Outras doenças por citomegalovírus", + B259: "Doença não especificada por citomegalovírus", + B26: "Caxumba [Parotidite epidêmica]", + B260: "Orquite por caxumba [parotidite epidêmica]", + B261: "Meningite por caxumba [parotidite epidêmica]", + B262: "Encefalite por caxumba [parotidite epidêmica]", + B263: "Pancreatite por caxumba [parotidite epidêmica]", + B268: "Caxumba [parotidite epidêmica] com outras complicações", + B269: "Caxumba [parotidite epidêmica] sem complicações", + B27: "Mononucleose infecciosa", + B270: "Mononucleose pelo vírus herpes gama", + B271: "Mononucleose por citomegalovírus", + B278: "Outras mononucleoses infecciosas", + B279: "Mononucleose infecciosa não especificada", + B30: "Conjuntivite viral", + B300: "Ceratoconjuntivite devida a adenovírus", + B301: "Conjuntivite devida a adenovírus", + B302: "Faringoconjuntivite viral", + B303: "Conjuntivite hemorrágica aguda endêmica (por enterovírus)", + B308: "Outras conjuntivites virais", + B309: "Conjuntivite viral não especificada", + B33: "Outras doenças por vírus não classificada em outra parte", + B330: "Mialgia epidêmica", + B331: "Doença de Ross River", + B332: "Cardite viral", + B333: "Infecção por retrovírus não classificada em outra parte", + B334: "Síndrome (cardio-)pulmonar por Hantavírus [SPH] [SCPH]", + B338: "Outras doenças especificadas por vírus", + B34: "Doenças por vírus, de localização não especificada", + B340: "Infecção por adenovírus de localização não especificada", + B341: "Infecção por enterovírus de localização não especificada", + B342: "Infecção por coronavírus de localização não especificada", + B343: "Infecção por parvovírus de localização não especificada", + B344: "Infecção por papovavírus de localização não especificada", + B348: "Outras infecções por vírus de localização não especificada", + B349: "Infecção viral não especificada", + B35: "Dermatofitose", + B350: "Tinha da barba e do couro cabeludo", + B351: "Tinha das unhas", + B352: "Tinha da mão", + B353: "Tinha dos pés", + B354: "Tinha do corpo", + B355: "Tinha imbricada", + B356: "Tinea cruris", + B358: "Outras dermatofitoses", + B359: "Dermatofitose não especificada", + B36: "Outras micoses superficiais", + B360: "Pitiríase versicolor", + B361: "Tinha negra", + B362: "Piedra branca", + B363: "Piedra negra", + B368: "Outras micoses superficiais especificadas", + B369: "Micose superficial não especificada", + B37: "Candidíase", + B370: "Estomatite por Candida", + B371: "Candidíase pulmonar", + B372: "Candidíase da pele e das unhas", + B373: "Candidíase da vulva e da vagina", + B374: "Candidíase de outras localizações urogenitais", + B375: "Meningite por Candida", + B376: "Endocardite por Candida", + B377: "Septicemia por Candida", + B378: "Candidíase de outras localizações", + B379: "Candidíase não especificada", + B38: "Coccidioidomicose", + B380: "Coccidioidomicose pulmonar aguda", + B381: "Coccidioidomicose pulmonar crônica", + B382: "Coccidioidomicose pulmonar não especificada", + B383: "Coccidioidomicose cutânea", + B384: "Meningite por coccidioidomicose", + B387: "Coccidioidomicose disseminada", + B388: "Outras formas de coccidioidomicose", + B389: "Coccidioidomicose não especificada", + B39: "Histoplasmose", + B390: "Histoplasmose pulmonar aguda por Histoplasma capsulatum", + B391: "Histoplasmose pulmonar crônica por Histoplasma capsulatum", + B392: "Histoplasmose pulmonar não especificada por Histoplasma capsulatum", + B393: "Histoplasmose disseminada por Histoplasma capsulatum", + B394: "Histoplasmose não especificada por Histoplasma capsulatum", + B395: "Histoplasmose por Histoplasma duboisii", + B399: "Histoplasmose não especificada", + B40: "Blastomicose", + B400: "Blastomicose pulmonar aguda", + B401: "Blastomicose pulmonar crônica", + B402: "Blastomicose pulmonar não especificada", + B403: "Blastomicose cutânea", + B407: "Blastomicose disseminada", + B408: "Outras formas de blastomicose", + B409: "Blastomicose não especificada", + B41: "Paracoccidioidomicose", + B410: "Paracoccidioidomicose pulmonar", + B417: "Paracoccidioidomicose disseminada", + B418: "Outras formas de paracoccidioidomicose", + B419: "Paracoccidioidomicose não especificada", + B42: "Esporotricose", + B420: "Esporotricose pulmonar", + B421: "Esporotricose linfocutânea", + B427: "Esporotricose disseminada", + B428: "Outras formas de esporotricose", + B429: "Esporotricose não especificada", + B43: "Cromomicose e abscesso feomicótico", + B430: "Cromomicose cutânea", + B431: "Abscesso cerebral feomicótico", + B432: "Abscesso e cisto feomicótico subcutâneos", + B438: "Outras formas de cromomicose", + B439: "Cromomicose não especificada", + B44: "Aspergilose", + B440: "Aspergilose pulmonar invasiva", + B441: "Outras aspergiloses pulmonares", + B442: "Aspergilose amigdaliana", + B447: "Aspergilose disseminada", + B448: "Outras formas de aspergilose", + B449: "Aspergilose não especificada", + B45: "Criptococose", + B450: "Criptococose pulmonar", + B451: "Criptococose cerebral", + B452: "Criptococose cutânea", + B453: "Criptococose óssea", + B457: "Criptococose disseminada", + B458: "Outras formas de criptococose", + B459: "Criptococose não especificada", + B46: "Zigomicose", + B460: "Mucormicose pulmonar", + B461: "Mucormicose rinocerebral", + B462: "Mucormicose gastrointestinal", + B463: "Mucormicose cutânea", + B464: "Mucormicose disseminada", + B465: "Mucormicose não especificada", + B468: "Outras zigomicoses", + B469: "Zigomicose não especificada", + B47: "Micetoma", + B470: "Eumicetoma", + B471: "Actinomicetoma", + B479: "Micetoma não especificado", + B48: "Outras micoses, não classificadas em outra parte", + B480: "Lobomicose", + B481: "Rinosporidiose", + B482: "Alesqueriose", + B483: "Geotricose", + B484: "Penicilose", + B487: "Micoses oportunistas", + B488: "Outras micoses especificadas", + B49: "Micose não especificada", + B50: "Malária por Plasmodium falciparum", + B500: "Malária por Plasmodium falciparum com complicações cerebrais", + B508: "Outras formas graves e complicadas de malária por Plasmodium falciparum", + B509: "Malária não especificada por Plasmodium falciparum", + B51: "Malária por Plasmodium vivax", + B510: "Malária por Plasmodium vivax com rotura do baço", + B518: "Malária por Plasmodium vivax com outras complicações", + B519: "Malária por Plasmodium vivax sem complicações", + B52: "Malária por Plasmodium malariae", + B520: "Malária por Plasmodium malariae com nefropatia", + B528: "Malária por Plasmodium malariae com outras complicações", + B529: "Malária por Plasmodium malariae sem complicações", + B53: "Outras formas de malária confirmadas por exames parasitológicos", + B530: "Malária por Plasmodium ovale", + B531: "Malária por plasmódios de macacos", + B538: "Outras formas de malárias com confirmação parasitológica, não classificadas em outra parte", + B54: "Malária não especificada", + B55: "Leishmaniose", + B550: "Leishmaniose visceral", + B551: "Leishmaniose cutânea", + B552: "Leishmaniose cutâneo-mucosa", + B559: "Leishmaniose não especificada", + B56: "Tripanossomíase africana", + B560: "Tripanossomíase por Trypanosoma gambiense", + B561: "Tripanossomíase por Trypanosoma rhodesiense", + B569: "Tripanossomíase africana não especificada", + B57: "Doença de Chagas", + B570: "Forma aguda da doença de Chagas, com comprometimento cardíaco", + B571: "Forma aguda da doença de Chagas, sem comprometimento cardíaco", + B572: "Doença de Chagas (crônica) com comprometimento cardíaco", + B573: "Doença de Chagas (crônica) com comprometimento do aparelho digestivo", + B574: "Doença de Chagas (crônica) com comprometimento do sistema nervoso", + B575: "Doença de Chagas (crônica) com comprometimento de outros órgãos", + B58: "Toxoplasmose", + B580: "Oculopatia por Toxoplasma", + B581: "Hepatite por Toxoplasma", + B582: "Meningoencefalite por Toxoplasma", + B583: "Toxoplasmose pulmonar", + B588: "Toxoplasmose com comprometimento de outros órgãos", + B589: "Toxoplasmose não especificada", + B59: "Pneumocistose", + B60: "Outras doenças devidas a protozoários, não classificadas em outra parte", + B600: "Babesiose", + B601: "Acantamebíase", + B602: "Naegleríase", + B608: "Outras doenças especificadas devidas a protozoários", + B64: "Doença não especificada devida a protozoários", + B65: "Esquistossomose [bilharziose] [Schistosomíase]", + B650: "Esquistossomose devida ao Schistosoma haematobium [esquistossomose urinária]", + B651: "Esquistossomose devida ao Schistosoma mansoni [esquistossomose intestinal]", + B652: "Esquistossomose devida ao Schistosoma japonicum", + B653: "Dermatite por cercárias", + B658: "Outras esquistossomoses", + B659: "Esquistossomose não especificada", + B66: "Outras infestações por trematódeos", + B660: "Opistorquíase", + B661: "Clonorquíase", + B662: "Dicrocelíase", + B663: "Fasciolíase", + B664: "Paragonimíase", + B665: "Fasciolopsíase", + B668: "Outras infestações por trematódeos especificados", + B669: "Infecção não especificada por trematódeo", + B67: "Equinococose", + B670: "Infestação hepática por Echinococcus granulosus", + B671: "Infestação pulmonar por Echinococcus granulosus", + B672: "Infestação óssea por Echinococcus granulosus", + B673: "Infestações por Echinmococcus granulosus, outras e de localizações múltiplas", + B674: "Infestação não especificada por Echinococcus granulosus", + B675: "Infestação hepática por Echinococcus multilocularis", + B676: "Infecções por Echinococcus multilocularis, outras e de localizações múltiplas", + B677: "Infestação não especificada por Echinococcus multilocularis", + B678: "Infestação hepática não especificada, por Echinococcus", + B679: "Infestações por Echinococcus, outras e as não especificadas", + B68: "Infestação por Taenia", + B680: "Infestação por Taenia solium", + B681: "Infestação por Taenia saginata", + B689: "Infestação não especificada por Taenia", + B69: "Cisticercose", + B690: "Cisticercose do sistema nervoso central", + B691: "Cisticercose do olho", + B698: "Cisticercose de outras localizações", + B699: "Cisticercose não especificada", + B70: "Difilobotríase e esparganose", + B700: "Difilobotríase", + B701: "Esparganose", + B71: "Outras infestações por cestóides", + B710: "Infestação por Hymenolepis", + B711: "Infestação por Dipylidium", + B718: "Outras infestações especificadas por cestóides", + B719: "Infestação não especificada por cestóides", + B72: "Dracontíase", + B73: "Oncocercose", + B74: "Filariose", + B740: "Filariose por Wuchereria bancrofti", + B741: "Filariose por Brugia malayi", + B742: "Filariose por Brugia timori", + B743: "Loaíase", + B744: "Mansonelose", + B748: "Outras filarioses", + B749: "Filariose não especificada", + B75: "Triquinose", + B76: "Ancilostomíase", + B760: "Ancilostomose", + B761: "Necatoríase", + B768: "Outras ancilostomíases", + B769: "Ancilostomíase não especificada", + B77: "Ascaridíase", + B770: "Ascaridíase com complicações intestinais", + B778: "Ascaridíase com outras complicações", + B779: "Ascaridíase não especificada", + B78: "Estrongiloidíase", + B780: "Estrongiloidíase intestinal", + B781: "Estrongiloidíase cutânea", + B787: "Estrongiloidíase disseminada", + B789: "Estrongiloidíase não especificada", + B79: "Tricuríase", + B80: "Oxiuríase", + B81: "Outras helmintíases intestinais, não classificadas em outra parte", + B810: "Anisaquíase", + B811: "Capilaríase intestinal", + B812: "Tricostrongilose", + B813: "Angiostrongilíase intestinal", + B814: "Helmintíases intestinais mistas", + B818: "Outras helmintíases intestinais especificadas", + B82: "Parasitose intestinal não especificada", + B820: "Helmintíase intestinal não especificada", + B829: "Parasitose intestinal não especificada", + B83: "Outras helmintíases", + B830: "Larva migrans visceral", + B831: "Gnatostomíase", + B832: "Angrostrongilíase devida a Parastrongylus cantonensis", + B833: "Singamose", + B834: "Hirudiníase interna", + B838: "Outras helmintíases especificadas", + B839: "Helmintíase não especificada", + B85: "Pediculose e ftiríase", + B850: "Pediculose devida a Pediculus humanus capitis", + B851: "Pediculose devida a Pediculus humanus corporis", + B852: "Pediculose não especificada", + B853: "Ftiríase", + B854: "Pediculose e ftiríase mista", + B86: "Escabiose [sarna]", + B87: "Miíase", + B870: "Miíase cutânea", + B871: "Miíase das feridas", + B872: "Miíase ocular", + B873: "Miíase nasofaríngea", + B874: "Miíase auricular", + B878: "Miíase de outras localizações", + B879: "Miíase não especificada", + B88: "Outras infestações", + B880: "Outras acaríases", + B881: "Tungíase [infestação pela pulga da areia]", + B882: "Outras infestações por artrópodos", + B883: "Hirudiníase externa", + B888: "Outras infestações especificadas", + B889: "Infestação não especificada", + B89: "Doença parasitária não especificada", + B90: "Seqüelas de tuberculose", + B900: "Seqüelas de tuberculose do sistema nervoso central", + B901: "Seqüelas de tuberculose geniturinária", + B902: "Seqüelas de tuberculose óssea e das articulações", + B908: "Seqüelas de tuberculose de outros órgãos", + B909: "Seqüelas de tuberculose das vias respiratórias e de órgãos não especificados", + B91: "Seqüelas de poliomielite", + B92: "Seqüelas de hanseníase [lepra]", + B94: "Seqüelas de outras doenças infecciosas e parasitárias e das não especificadas", + B940: "Seqüelas de tracoma", + B941: "Seqüelas de encefalite viral", + B942: "Seqüelas de hepatite viral", + B948: "Seqüelas de outras doenças infecciosas e parasitárias especificadas", + B949: "Seqüelas de doença infecciosa ou parasitária não especificada", + B95: "Estreptococos e estafilococos como causa de doenças classificadas em outros capítulos", + B950: "Estreptococo do grupo A, como causa de doenças classificadas em outros capítulos", + B951: "Estreptococo do grupo B, como causa de doenças classificadas em outros capítulos", + B952: "Estreptococo do grupo D, como causa de doenças classificadas em outros capítulos", + B953: "Streptococcus pneumoniae, como causa de doenças classificadas em outros capítulos", + B954: "Outros estreptococos, como causa de doenças classificadas em outros capítulos", + B955: "Estreptococo não especificado, como causa de doenças classificadas em outros capítulos", + B956: "Staphylococcus aureus, como causa de doenças classificadas em outros capítulos", + B957: "Outros estafilococos como causa de doenças classificadas em outros capítulos", + B958: "Estafilococo não especificado, como causa de doenças classificadas em outros capítulos", + B96: "Outros agentes bacterianos, como causa de doenças classificadas em outros capítulos", + B960: "Mycoplasma pneumoniae [M. pneumoniae], como causa de doenças classificadas em outros capítulos", + B961: "Klebsiella pneumoniae [M. pneumoniae], como causa de doenças classificadas em outros capítulos", + B962: "Escherichia coli [E. Coli], como causa de doenças classificadas em outros capítulos", + B963: "Haemophilus influenzae [H. influenzae], como causa de doenças classificadas em outros capítulos", + B964: "Proteus (mirabilis) (morganii), como causa de doenças classificadas em outros capítulos", + B965: "Pseudomonas (aeruginosa) (mallei) (pseudomallei), como causa de doenças classificadas em outros capítulos", + B966: "Bacillus fragilis [B. fragilis], como causa de doenças classificadas em outros capítulos", + B967: "Clostridium perfringens [C. perfringens], como causa de doenças classificadas em outros capítulos", + B968: "Outros agentes bacterianos especificados, como causa de doenças classificadas em outros capítulos", + B97: "Vírus como causa de doenças classificadas em outros capítulos", + B970: "Adenovírus, como causa de doenças classificadas em outros capítulos", + B971: "Enterovírus, como causa de doenças classificadas em outros capítulos", + B972: "Coronavírus, como causa de doenças classificadas em outros capítulos", + B973: "Retrovírus, como causa de doenças classificadas em outros capítulos", + B974: "Vírus sincicial respiratório, como causa de doenças classificadas em outros capítulos", + B975: "Reovírus, como causa de doenças classificadas em outros capítulos", + B976: "Parvovírus, como causa de doenças classificadas em outros capítulos", + B977: "Papilomavírus, como causa de doenças classificadas em outros capítulos", + B978: "Outros agentes virais, como causa de doenças classificadas em outros capítulos", + B99: "Doenças infecciosas, outras e as não especificadas", + C00: "Neoplasia maligna do lábio", + C000: "Neoplasia maligna do lábio superior externo", + C001: "Neoplasia maligna do lábio inferior externo", + C002: "Neoplasia maligna do lábio externo, não especificado", + C003: "Neoplasia maligna do lábio superior, face interna", + C004: "Neoplasia maligna do lábio inferior, face interna", + C005: "Neoplasia maligna do lábio, sem especificação, face interna", + C006: "Neoplasia maligna da comissura labial", + C008: "Neoplasia maligna do lábio com lesão invasiva", + C009: "Neoplasia maligna do lábio, não especificado", + C01: "Neoplasia maligna da base da língua", + C02: "Neoplasia maligna de outras partes e de partes não especificadas da língua", + C020: "Neoplasia maligna da face dorsal da língua", + C021: "Neoplasia maligna da borda da língua", + C022: "Neoplasia maligna da face ventral da língua", + C023: "Neoplasia maligna de dois terços anteriores da língua, parte não especificada", + C024: "Neoplasia maligna da amígdala lingual", + C028: "Neoplasia maligna da língua com lesão invasiva", + C029: "Neoplasia maligna da língua, não especificada", + C03: "Neoplasia maligna da gengiva", + C030: "Neoplasia maligna da gengiva superior", + C031: "Neoplasia maligna da gengiva inferior", + C039: "Neoplasia maligna da gengiva, não especificada", + C04: "Neoplasia maligna do assoalho da boca", + C040: "Neoplasia maligna do assoalho anterior da boca", + C041: "Neoplasia maligna do assoalho lateral da boca", + C048: "Neoplasia maligna do assoalho da boca com lesão invasiva", + C049: "Neoplasia maligna do assoalho da boca, não especificado", + C05: "Neoplasia maligna do palato", + C050: "Neoplasia maligna do palato duro", + C051: "Neoplasia maligna do palato mole", + C052: "Neoplasia maligna da úvula", + C058: "Neoplasia maligna do palato com lesão invasiva", + C059: "Neoplasia maligna do palato, não especificado", + C06: "Neoplasia maligna de outras partes e de partes não especificadas da boca", + C060: "Neoplasia maligna da mucosa oral", + C061: "Neoplasia maligna do vestíbulo da boca", + C062: "Neoplasia maligna da área retromolar", + C068: "Neoplasia maligna de outras partes e de partes não especificadas da boca com lesão invasiva", + C069: "Neoplasia maligna da boca, não especificada", + C07: "Neoplasia maligna da glândula parótida", + C08: "Neoplasia maligna de outras glândulas salivares maiores e as não especificadas", + C080: "Neoplasia maligna da glândula submandibular", + C081: "Neoplasia maligna da glândula sublingual", + C088: "Neoplasia maligna das glândulas salivares maiores com lesão invasiva", + C089: "Neoplasia maligna da glândula salivar maior, não especificada", + C09: "Neoplasia maligna da amígdala", + C090: "Neoplasia maligna da fossa amigdaliana", + C091: "Neoplasia maligna do pilar amigdaliano (anterior) (posterior)", + C098: "Neoplasia maligna da amígdala com lesão invasiva", + C099: "Neoplasia maligna da amígdala, não especificada", + C10: "Neoplasia maligna da orofaringe", + C100: "Neoplasia maligna da valécula", + C101: "Neoplasia maligna da face anterior da epiglote", + C102: "Neoplasia maligna da parede lateral da orofaringe", + C103: "Neoplasia maligna da parede posterior da orofaringe", + C104: "Neoplasia maligna da fenda branquial", + C108: "Neoplasia maligna da orofaringe com lesão invasiva", + C109: "Neoplasia maligna da orofaringe, não especificada", + C11: "Neoplasia maligna da nasofaringe", + C110: "Neoplasia maligna da parede superior da nasofaringe", + C111: "Neoplasia maligna da parede posterior da nasofaringe", + C112: "Neoplasia maligna da parede lateral da nasofaringe", + C113: "Neoplasia maligna da parede anterior da nasofaringe", + C118: "Neoplasia maligna da nasofaringe com lesão invasiva", + C119: "Neoplasia maligna da nasofaringe, não especificada", + C12: "Neoplasia maligna do seio piriforme", + C13: "Neoplasia maligna da hipofaringe", + C130: "Neoplasia maligna da região pós-cricóidea", + C131: "Neoplasia maligna da prega ariepiglótica, face hipofaríngea", + C132: "Neoplasia maligna da parede posterior da hipofaringe", + C138: "Neoplasia maligna da hipofaringe com lesão invasiva", + C139: "Neoplasia maligna da hipofaringe, não especificada", + C14: "Neoplasia maligna de outras localizações e de localizações mal definida, do lábio, cavidade oral e faringe", + C140: "Neoplasia maligna da faringe, não especificada", + C142: "Neoplasia maligna do anel de Waldeyer", + C148: "Neoplasia maligna do lábio, cavidade oral e faringe com lesão invasiva", + C15: "Neoplasia maligna do esôfago", + C150: "Neoplasia maligna da porção cervical do esôfago (esôfago cervical)", + C151: "Neoplasia maligna da porção torácica do esôfago (esôfago torácico)", + C152: "Neoplasia maligna da porção abdominal do esôfago (esôfago abdominal)", + C153: "Neoplasia maligna do terço superior do esôfago", + C154: "Neoplasia maligna do terço médio do esôfago", + C155: "Neoplasia maligna do terço inferior do esôfago", + C158: "Neoplasia maligna do esôfago com lesão invasiva", + C159: "Neoplasia maligna do esôfago, não especificado", + C16: "Neoplasia maligna do estômago", + C160: "Neoplasia maligna da cárdia", + C161: "Neoplasia maligna do fundo do estômago", + C162: "Neoplasia maligna do corpo do estômago", + C163: "Neoplasia maligna do antro pilórico", + C164: "Neoplasia maligna do piloro", + C165: "Neoplasia maligna da pequena curvatura do estômago, não especificada", + C166: "Neoplasia maligna da grande curvatura do estômago, não especificada", + C168: "Neoplasia maligna do estômago com lesão invasiva", + C169: "Neoplasia maligna do estômago, não especificado", + C17: "Neoplasia maligna do intestino delgado", + C170: "Neoplasia maligna do duodeno", + C171: "Neoplasia maligna do jejuno", + C172: "Neoplasia maligna do íleo", + C173: "Neoplasia maligna do divertículo de Meckel", + C178: "Neoplasia maligna do intestino delgado com lesão invasiva", + C179: "Neoplasia maligna do intestino delgado, não especificado", + C18: "Neoplasia maligna do cólon", + C180: "Neoplasia maligna do ceco", + C181: "Neoplasia maligna do apêndice (vermiforme)", + C182: "Neoplasia maligna do cólon ascendente", + C183: "Neoplasia maligna da flexura (ângulo) hepática(o)", + C184: "Neoplasia maligna do cólon transverso", + C185: "Neoplasia maligna da flexura (ângulo) esplênica(o)", + C186: "Neoplasia maligna do cólon descendente", + C187: "Neoplasia maligna do cólon sigmóide", + C188: "Neoplasia maligna do cólon com lesão invasiva", + C189: "Neoplasia maligna do cólon, não especificado", + C19: "Neoplasia maligna da junção retossigmóide", + C20: "Neoplasia maligna do reto", + C21: "Neoplasia maligna do ânus e do canal anal", + C210: "Neoplasia maligna do ânus, não especificado", + C211: "Neoplasia maligna do canal anal", + C212: "Neoplasia maligna da zona cloacogênica", + C218: "Neoplasia maligna do reto, ânus e do canal anal com lesão invasiva", + C22: "Neoplasia maligna do fígado e das vias biliares intra-hepáticas", + C220: "Carcinoma de células hepáticas", + C221: "Carcinoma de vias biliares intra-hepáticas", + C222: "Hepatoblastoma", + C223: "Angiossarcoma do fígado", + C224: "Outros sarcomas do fígado", + C227: "Outros carcinomas especificados do fígado", + C229: "Neoplasia maligna do fígado, não especificada", + C23: "Neoplasia maligna da vesícula biliar", + C24: "Neoplasia maligna de outras partes, e de partes não especificadas das vias biliares", + C240: "Neoplasia maligna das vias biliares extra-hepáticas", + C241: "Neoplasia maligna da ampola de Vater", + C248: "Neoplasia maligna das vias biliares com lesão invasiva", + C249: "Neoplasia maligna da via biliar, não especificada", + C25: "Neoplasia maligna do pâncreas", + C250: "Neoplasia maligna da cabeça do pâncreas", + C251: "Neoplasia maligna do corpo do pâncreas", + C252: "Neoplasia maligna da cauda do pâncreas", + C253: "Neoplasia maligna do canal pancreático", + C254: "Neoplasia maligna do pâncreas endócrino", + C257: "Neoplasia maligna de outras partes do pâncreas", + C258: "Neoplasia maligna do pâncreas com lesão invasiva", + C259: "Neoplasia maligna do pâncreas, não especificado", + C26: "Neoplasia maligna de outros órgãos digestivos e de localizações mal definidas no aparelho digestivo", + C260: "Neoplasia maligna do trato intestinal, parte não especificada", + C261: "Neoplasia maligna do baço", + C268: "Neoplasia maligna do aparelho digestivo com lesão invasiva", + C269: "Neoplasia maligna de localizações mal definidas dentro do aparelho digestivo", + C30: "Neoplasia maligna da cavidade nasal e do ouvido médio", + C300: "Neoplasia maligna da cavidade nasal", + C301: "Neoplasia maligna do ouvido médio", + C31: "Neoplasia maligna dos seios da face", + C310: "Neoplasia maligna do seio maxilar", + C311: "Neoplasia maligna do seio etmoidal", + C312: "Neoplasia maligna do seio frontal", + C313: "Neoplasia maligna do seio esfenoidal", + C318: "Neoplasia maligna dos seios da face com lesão invasiva", + C319: "Neoplasia maligna do seio da face, não especificado", + C32: "Neoplasia maligna da laringe", + C320: "Neoplasia maligna da glote", + C321: "Neoplasia maligna da região supraglótica", + C322: "Neoplasia maligna da região subglótica", + C323: "Neoplasia maligna das cartilagens da laringe", + C328: "Neoplasia maligna da laringe com lesão invasiva", + C329: "Neoplasia maligna da laringe, não especificada", + C33: "Neoplasia maligna da traquéia", + C34: "Neoplasia maligna dos brônquios e dos pulmões", + C340: "Neoplasia maligna do brônquio principal", + C341: "Neoplasia maligna do lobo superior, brônquio ou pulmão", + C342: "Neoplasia maligna do lobo médio, brônquio ou pulmão", + C343: "Neoplasia maligna do lobo inferior, brônquio ou pulmão", + C348: "Neoplasia maligna dos brônquios e dos pulmões com lesão invasiva", + C349: "Neoplasia maligna dos brônquios ou pulmões, não especificado", + C37: "Neoplasia maligna do timo", + C38: "Neoplasia maligna do coração, mediastino e pleura", + C380: "Neoplasia maligna do coração", + C381: "Neoplasia maligna do mediastino anterior", + C382: "Neoplasia maligna do mediastino posterior", + C383: "Neoplasia maligna do mediastino, porção não especificada", + C384: "Neoplasia maligna da pleura", + C388: "Neoplasia maligna do coração, mediastino e pleura com lesão invasiva", + C39: "Neoplasia maligna de outras localizações e de localizações mal definidas do aparelho respiratório e dos órgãos intratorácicos", + C390: "Neoplasia maligna do trato respiratório superior, porção não especificada", + C398: "Neoplasia maligna do aparelho respiratório e dos órgãos intratorácicos com lesão invasiva", + C399: "Neoplasia maligna de localizações mal definidas do aparelho respiratório", + C40: "Neoplasia maligna dos ossos e cartilagens articulares dos membros", + C400: "Neoplasia maligna da omoplata [escápula] e ossos longos dos membros superiores", + C401: "Neoplasia maligna dos ossos curtos dos membros superiores", + C402: "Neoplasia maligna dos ossos longos dos membros inferiores", + C403: "Neoplasia maligna dos ossos curtos dos membros inferiores", + C408: "Neoplasia maligna dos ossos e cartilagens articulares dos membros com lesão invasiva", + C409: "Neoplasia maligna dos ossos e cartilagens articulares de membro não especificado", + C41: "Neoplasia maligna dos ossos e das cartilagens articulares de outras localizações e de localizações não especificadas", + C410: "Neoplasia maligna dos ossos do crânio e da face", + C411: "Neoplasia maligna da mandíbula", + C412: "Neoplasia maligna da coluna vertebral", + C413: "Neoplasia maligna das costelas, esterno e clavícula", + C414: "Neoplasia maligna dos ossos da pelve, sacro e cóccix", + C418: "Neoplasia maligna dos ossos e das cartilagens articulares com lesão invasiva", + C419: "Neoplasia maligna dos ossos e cartilagens articulares, não especificados", + C43: "Melanoma maligno da pele", + C430: "Melanoma maligno do lábio", + C431: "Melanoma maligno da pálpebra, incluindo as comissuras palpebrais", + C432: "Melanoma maligno da orelha e do conduto auditivo externo", + C433: "Melanoma maligno de outras partes e partes não especificadas da face", + C434: "Melanoma maligno do couro cabeludo e do pescoço", + C435: "Melanoma maligno do tronco", + C436: "Melanoma maligno do membro superior, incluindo ombro", + C437: "Melanoma maligno do membro inferior, incluindo quadril", + C438: "Melanoma maligno invasivo da pele", + C439: "Melanoma maligno de pele, não especificado", + C44: "Outras neoplasias malignas da pele", + C440: "Neoplasia maligna da pele do lábio", + C441: "Neoplasia maligna da pele da pálpebra, incluindo o canto", + C442: "Neoplasia maligna da pele da orelha e do conduto auditivo externo", + C443: "Neoplasia maligna da pele de outras partes e de partes não especificadas da face", + C444: "Neoplasia maligna da pele do couro cabeludo e do pescoço", + C445: "Neoplasia maligna da pele do tronco", + C446: "Neoplasia maligna da pele do membro superior, incluindo ombro", + C447: "Neoplasia maligna da pele do membro inferior, incluindo quadril", + C448: "Neoplasia maligna da pele com lesão invasiva", + C449: "Neoplasia maligna da pele, não especificada", + C45: "Mesotelioma", + C450: "Mesotelioma da pleura", + C451: "Mesotelioma do peritônio", + C452: "Mesotelioma do pericárdio", + C457: "Mesotelioma de outras localizações", + C459: "Mesotelioma, não especificado", + C46: "Sarcoma de Kaposi", + C460: "Sarcoma de Kaposi da pele", + C461: "Sarcoma de Kaposi de tecidos moles", + C462: "Sarcoma de Kaposi do palato", + C463: "Sarcoma de Kaposi dos gânglios linfáticos", + C467: "Sarcoma de Kaposi de outras localizações", + C468: "Sarcoma de Kaposi de múltiplos órgãos", + C469: "Sarcoma de Kaposi, não especificado", + C47: "Neoplasia maligna dos nervos periféricos e do sistema nervoso autônomo", + C470: "Neoplasia maligna dos nervos periféricos da cabeça, face e pescoço", + C471: "Neoplasia maligna dos nervos periféricos dos membros superiores, incluindo ombro", + C472: "Neoplasia maligna dos nervos periféricos dos membros inferiores, incluindo quadril", + C473: "Neoplasia maligna dos nervos periféricos do tórax", + C474: "Neoplasia maligna dos nervos periféricos do abdome", + C475: "Neoplasia maligna dos nervos periféricos da pelve", + C476: "Neoplasia maligna dos nervos periféricos do tronco", + C478: "Neoplasia maligna dos nervos periféricos e do sistema nervoso autônomo com lesão invasiva", + C479: "Neoplasia maligna dos nervos periféricos e sistema nervoso autônomo, não especificados", + C48: "Neoplasia maligna dos tecidos moles do retroperitônio e do peritônio", + C480: "Neoplasia maligna do retroperitônio", + C481: "Neoplasia maligna de partes especificadas do peritônio", + C482: "Neoplasia maligna do peritônio", + C488: "Neoplasia maligna dos tecidos moles do retroperitônio e do peritônio com lesão invasiva", + C49: "Neoplasia maligna do tecido conjuntivo e de outros tecidos moles", + C490: "Neoplasia maligna do tecido conjuntivo e tecidos moles da cabeça, face e pescoço", + C491: "Neoplasia maligna do tecido conjuntivo e tecidos moles dos membros superiores, incluindo ombro", + C492: "Neoplasia maligna do tecido conjuntivo e tecidos moles dos membros inferiores, incluindo quadril", + C493: "Neoplasia maligna do tecido conjuntivo e tecidos moles do tórax", + C494: "Neoplasia maligna do tecido conjuntivo e tecidos moles do abdome", + C495: "Neoplasia maligna do tecido conjuntivo e tecidos moles da pelve", + C496: "Neoplasia maligna do tecido conjuntivo e tecidos moles do tronco", + C498: "Neoplasia maligna do tecido conjuntivo e dos tecidos moles com lesão invasiva", + C499: "Neoplasia maligna do tecido conjuntivo e tecidos moles, não especificados", + C50: "Neoplasia maligna da mama", + C500: "Neoplasia maligna do mamilo e aréola", + C501: "Neoplasia maligna da porção central da mama", + C502: "Neoplasia maligna do quadrante superior interno da mama", + C503: "Neoplasia maligna do quadrante inferior interno da mama", + C504: "Neoplasia maligna do quadrante superior externo da mama", + C505: "Neoplasia maligna do quadrante inferior externo da mama", + C506: "Neoplasia maligna da porção axilar da mama", + C508: "Neoplasia maligna da mama com lesão invasiva", + C509: "Neoplasia maligna da mama, não especificada", + C51: "Neoplasia maligna da vulva", + C510: "Neoplasia maligna dos grandes lábios", + C511: "Neoplasia maligna dos pequenos lábios", + C512: "Neoplasia maligna do clitóris", + C518: "Neoplasia maligna da vulva com lesão invasiva", + C519: "Neoplasia maligna da vulva, não especificada", + C52: "Neoplasia maligna da vagina", + C53: "Neoplasia maligna do colo do útero", + C530: "Neoplasia maligna do endocérvix", + C531: "Neoplasia maligna do exocérvix", + C538: "Neoplasia maligna do colo do útero com lesão invasiva", + C539: "Neoplasia maligna do colo do útero, não especificado", + C54: "Neoplasia maligna do corpo do útero", + C540: "Neoplasia maligna do istmo do útero", + C541: "Neoplasia maligna do endométrio", + C542: "Neoplasia maligna do miométrio", + C543: "Neoplasia maligna do fundo do útero", + C548: "Neoplasia maligna do corpo do útero com lesão invasiva", + C549: "Neoplasia maligna do corpo do útero, não especificado", + C55: "Neoplasia maligna do útero, porção não especificada", + C56: "Neoplasia maligna do ovário", + C57: "Neoplasia maligna de outros órgãos genitais femininos e dos não especificados", + C570: "Neoplasia maligna da trompa de Falópio", + C571: "Neoplasia maligna do ligamento largo", + C572: "Neoplasia maligna do ligamento redondo", + C573: "Neoplasia maligna do paramétrio", + C574: "Neoplasia maligna dos anexos uterinos", + C577: "Neoplasia maligna de outras partes especificadas dos órgãos genitais femininos", + C578: "Neoplasia maligna dos órgãos genitais femininos com lesão invasiva", + C579: "Neoplasia maligna de órgão genital feminino, não especificado", + C58: "Neoplasia maligna da placenta", + C60: "Neoplasia maligna do pênis", + C600: "Neoplasia maligna do prepúcio", + C601: "Neoplasia maligna da glande", + C602: "Neoplasia maligna do corpo do pênis", + C608: "Neoplasia maligna do pênis com lesão invasiva", + C609: "Neoplasia maligna do pênis, não especificado", + C61: "Neoplasia maligna da próstata", + C62: "Neoplasia maligna dos testículos", + C620: "Neoplasia maligna do testículo criptorquídico", + C621: "Neoplasia maligna do testículo tópico", + C629: "Neoplasia maligna do testículo, sem outras especificações", + C63: "Neoplasia maligna de outros órgãos genitais masculinos e dos não especificados", + C630: "Neoplasia maligna do epidídimo", + C631: "Neoplasia maligna do cordão espermático", + C632: "Neoplasia maligna do escroto", + C637: "Neoplasia maligna de outros órgãos genitais masculinos especificados", + C638: "Neoplasia maligna dos órgãos genitais masculinos com lesão invasiva", + C639: "Neoplasia maligna de órgão genital masculino, não especificado", + C64: "Neoplasia maligna do rim, exceto pelve renal", + C65: "Neoplasia maligna da pelve renal", + C66: "Neoplasia maligna dos ureteres", + C67: "Neoplasia maligna da bexiga", + C670: "Neoplasia maligna do trígono da bexiga", + C671: "Neoplasia maligna da cúpula da bexiga", + C672: "Neoplasia maligna da parede lateral da bexiga", + C673: "Neoplasia maligna da parede anterior da bexiga", + C674: "Neoplasia maligna da parede posterior da bexiga", + C675: "Neoplasia maligna do colo da bexiga", + C676: "Neoplasia maligna do orifício uretérico", + C677: "Neoplasia maligna do úraco", + C678: "Neoplasia maligna da bexiga com lesão invasiva", + C679: "Neoplasia maligna da bexiga, sem outra especificações", + C68: "Neoplasia maligna de outros órgãos urinários e dos não especificados", + C680: "Neoplasia maligna da uretra", + C681: "Neoplasia maligna da glândula parauretral", + C688: "Neoplasia maligna dos órgãos urinários com lesão invasiva", + C689: "Neoplasia maligna de órgão urinário, não especificado", + C69: "Neoplasia maligna do olho e anexos", + C690: "Neoplasia maligna da conjuntiva", + C691: "Neoplasia maligna da córnea", + C692: "Neoplasia maligna da retina", + C693: "Neoplasia maligna da coróide", + C694: "Neoplasia maligna do corpo ciliar", + C695: "Neoplasia maligna da glândula e canal lacrimal", + C696: "Neoplasia maligna da órbita", + C698: "Neoplasia maligna do olho e anexos com lesão invasiva", + C699: "Neoplasia maligna do olho, não especificado", + C70: "Neoplasia maligna das meninges", + C700: "Neoplasia maligna das meninges cerebrais", + C701: "Neoplasia maligna das meninges espinhais", + C709: "Neoplasia maligna da meninge, não especificada", + C71: "Neoplasia maligna do encéfalo", + C710: "Neoplasia maligna do cérebro, exceto lobos e ventrículos", + C711: "Neoplasia maligna do lobo frontal", + C712: "Neoplasia maligna do lobo temporal", + C713: "Neoplasia maligna do lobo parietal", + C714: "Neoplasia maligna do lobo occipital", + C715: "Neoplasia maligna do ventrículo cerebral", + C716: "Neoplasia maligna do cerebelo", + C717: "Neoplasia maligna do tronco cerebral", + C718: "Neoplasia maligna do encéfalo com lesão invasiva", + C719: "Neoplasia maligna do encéfalo, não especificado", + C72: "Neoplasia maligna da medula espinhal, dos nervos cranianos e de outras partes do sistema nervoso central", + C720: "Neoplasia maligna da medula espinhal", + C721: "Neoplasia maligna da cauda eqüina", + C722: "Neoplasia maligna do nervo olfativo", + C723: "Neoplasia maligna do nervo óptico", + C724: "Neoplasia maligna do nervo acústico", + C725: "Neoplasia maligna de outros nervos cranianos e os não especificados", + C728: "Neoplasia maligna do encéfalo e de outras partes do sistema nervoso central com lesão invasiva", + C729: "Neoplasia maligna do sistema nervoso central, não especificado", + C73: "Neoplasia maligna da glândula tireóide", + C74: "Neoplasia maligna da glândula supra-renal [Glândula adrenal]", + C740: "Neoplasia maligna do córtex da supra-renal", + C741: "Neoplasia maligna da medula da supra-renal", + C749: "Neoplasia maligna da glândula supra-renal, não especificada", + C75: "Neoplasia maligna de outras glândulas endócrinas e de estruturas relacionadas", + C750: "Neoplasia maligna da glândula paratireóide", + C751: "Neoplasia maligna da glândula hipófise (pituitária)", + C752: "Neoplasia maligna do conduto craniofaríngeo", + C753: "Neoplasia maligna da glândula pineal", + C754: "Neoplasia maligna do corpo carotídeo", + C755: "Neoplasia maligna do corpo aórtico e outros paragânglios", + C758: "Neoplasia maligna com comprometimento pluriglandular, sem outra especificação", + C759: "Neoplasia maligna de glândula endócrina, não especificada", + C76: "Neoplasia maligna de outras localizações e de localizações mal definidas", + C760: "Neoplasia maligna da cabeça, face e pescoço", + C761: "Neoplasia maligna do tórax", + C762: "Neoplasia maligna do abdome", + C763: "Neoplasia maligna da pelve", + C764: "Neoplasia maligna do membro superior", + C765: "Neoplasia maligna do membro inferior", + C767: "Neoplasia maligna de outras localizações mal definidas", + C768: "Neoplasia maligna de outras localizações e das mal definidas com lesão invasiva", + C77: "Neoplasia maligna secundária e não especificada dos gânglios linfáticos", + C770: "Neoplasia maligna secundária e não especificada dos gânglios linfáticos da cabeça, face e pescoço", + C771: "Neoplasia maligna secundária e não especificada dos gânglios linfáticos intratorácicos", + C772: "Neoplasia maligna secundária e não especificada dos gânglios linfáticos intra-abdominais", + C773: "Neoplasia maligna secundária e não especificada dos gânglios linfáticos axilares e dos membros superiores", + C774: "Neoplasia maligna secundária e não especificada dos gânglios linfáticos inguinais e dos membros inferiores", + C775: "Neoplasia maligna secundária e não especificada dos gânglios linfáticos intrapélvicos", + C778: "Neoplasia maligna secundária e não especificada dos gânglios linfáticos de múltiplas regiões", + C779: "Neoplasia maligna secundária e não especificada de gânglio linfático, não especificado", + C78: "Neoplasia maligna secundária dos órgãos respiratórios e digestivos", + C780: "Neoplasia maligna secundária dos pulmões", + C781: "Neoplasia maligna secundária do mediastino", + C782: "Neoplasia maligna secundária da pleura", + C783: "Neoplasia maligna secundária de outros órgãos respiratórios e não especificados", + C784: "Neoplasia maligna secundária do intestino delgado", + C785: "Neoplasia maligna secundária do intestino grosso e do reto", + C786: "Neoplasia maligna secundária do retroperitônio e do peritônio", + C787: "Neoplasia maligna secundária do fígado", + C788: "Neoplasia maligna secundária de outros órgãos digestivos e não especificados", + C79: "Neoplasia maligna secundária de outras localizações", + C790: "Neoplasia maligna secundária do rim e da pelve renal", + C791: "Neoplasia maligna secundária da bexiga, de outro órgão urinário e não especificado", + C792: "Neoplasia maligna secundária da pele", + C793: "Neoplasia maligna secundária do encéfalo e das meninges cerebrais", + C794: "Neoplasia maligna secundária de outras partes do sistema nervoso e não especificadas", + C795: "Neoplasia maligna secundária dos ossos e da medula óssea", + C796: "Neoplasia maligna secundária do ovário", + C797: "Neoplasia maligna secundária das glândulas supra-renais (adrenais)", + C798: "Neoplasia maligna secundária de outra localização especificada", + C80: "Neoplasia maligna, sem especificação de localização", + C81: "Doença de Hodgkin", + C810: "Doença de Hodgkin, predominância linfocítica", + C811: "Doença de Hodgkin, esclerose nodular", + C812: "Doença de Hodgkin, celularidade mista", + C813: "Doença de Hodgkin, depleção linfocítica", + C817: "Outra forma da doença de Hodgkin", + C819: "Doença de Hodgkin, não especificada", + C82: "Linfoma não-Hodgkin, folicular (nodular)", + C820: "Linfoma não-Hodgkin, pequenas células clivadas, folicular", + C821: "Linfoma não-Hodgkin, misto, de pequenas e grandes células clivadas, folicular", + C822: "Linfoma não-Hodgkin, grandes células, folicular", + C827: "Outros tipos de linfoma não-Hodgkin, folicular", + C829: "Linfoma não-Hodgkin, folicular, não especificado", + C83: "Linfoma não-Hodgkin difuso", + C830: "Linfoma não-Hodgkin difuso, pequenas células (difuso)", + C831: "Linfoma não-Hodgkin difuso, pequenas células clivadas (difuso)", + C832: "Linfoma não-Hodgkin difuso, misto, de pequenas e grandes células (difuso)", + C833: "Linfoma não-Hodgkin difuso, grandes células (difuso)", + C834: "Linfoma não-Hodgkin difuso, imunoblástico (difuso)", + C835: "Linfoma não-Hodgkin difuso, linfoblástico (difuso)", + C836: "Linfoma não-Hodgkin difuso, indiferenciado (difuso)", + C837: "Tumor de Burkitt", + C838: "Outros tipos de linfoma não-Hodgkin difuso", + C839: "Linfoma não-Hodgkin difuso, não especificado", + C84: "Linfomas de células T cutâneas e periféricas", + C840: "Micose fungóide", + C841: "Doença de Sézary", + C842: "Linfoma da zona T", + C843: "Linfoma linfoepitelióide", + C844: "Linfoma de células T, periférico", + C845: "Outros linfomas de células T e os não especificados", + C85: "Linfoma não-Hodgkin de outros tipos e de tipo não especificado", + C850: "Linfossarcoma", + C851: "Linfoma de células B, não especificado", + C857: "Outros tipos especificados de linfoma não-Hodgkin", + C859: "Linfoma não-Hodgkin de tipo não especificado", + C88: "Doenças imunoproliferativas malignas", + C880: "Macroglobulinemia de Waldenström", + C881: "Doença de cadeia pesada alfa", + C882: "Doença de cadeia pesada gama", + C883: "Doença imunoproliferativa do intestino delgado", + C887: "Outras doenças imunoproliferativas malignas", + C889: "Doença imunoproliferativa maligna, não especificada", + C90: "Mieloma múltiplo e neoplasias malignas de plasmócitos", + C900: "Mieloma múltiplo", + C901: "Leucemia plasmocitária", + C902: "Plasmocitoma extramedular", + C91: "Leucemia linfóide", + C910: "Leucemia linfoblástica aguda", + C911: "Leucemia linfocítica crônica", + C912: "Leucemia linfocítica subaguda", + C913: "Leucemia pró-linfocítica", + C914: "Leucemia de células pilosas", + C915: "Leucemia de células T do adulto", + C917: "Outras leucemias linfóides", + C919: "Leucemia linfóide, não especificada", + C92: "Leucemia mielóide", + C920: "Leucemia mielóide aguda", + C921: "Leucemia mielóide crônica", + C922: "Leucemia mielóide subaguda", + C923: "Sarcoma mielóide", + C924: "Leucemia pró-mielocítica aguda", + C925: "Leucemia mielomonocítica aguda", + C927: "Outras leucemias mielóides", + C929: "Leucemia mielóide, não especificada", + C93: "Leucemia monocítica", + C930: "Leucemia monocítica aguda", + C931: "Leucemia monocítica crônica", + C932: "Leucemia monocítica subaguda", + C937: "Outras leucemias monocíticas", + C939: "Leucemia monocítica, não especificada", + C94: "Outras leucemias de células de tipo especificado", + C940: "Eritremia e eritroleucemia agudas", + C941: "Eritremia crônica", + C942: "Leucemia megacarioblástica aguda", + C943: "Leucemia de mastócitos", + C944: "Panmielose aguda", + C945: "Mielofibrose aguda", + C947: "Outras leucemias especificadas", + C95: "Leucemia de tipo celular não especificado", + C950: "Leucemia aguda de tipo celular não especificado", + C951: "Leucemia crônica de tipo celular não especificado", + C952: "Leucemia subaguda de tipo celular não especificado", + C957: "Outras leucemias de tipo celular não especificado", + C959: "Leucemia não especificada", + C96: "Outras neoplasias malignas e as não especificadas dos tecidos linfático, hematopoético e tecidos correlatos", + C960: "Doença de Letterer-Siwe", + C961: "Histiocitose maligna", + C962: "Tumor maligno de mastócitos", + C963: "Linfoma histiocítico verdadeiro", + C967: "Outras neoplasias malignas especificadas dos tecidos linfático, hematopoético e tecidos correlatos", + C969: "Neoplasia maligna dos tecidos linfático, hematopoético e tecidos correlatos, não especificada", + C97: "Neoplasias malignas de localizações múltiplas independentes (primárias)", + D00: "Carcinoma in situ da cavidade oral, do esôfago e do estômago", + D000: "Carcinoma in situ dos lábios, cavidade oral e faringe", + D001: "Carcinoma in situ do esôfago", + D002: "Carcinoma in situ do estômago", + D01: "Carcinoma in situ de outros órgãos digestivos", + D010: "Carcinoma in situ do cólon", + D011: "Carcinoma in situ da junção retossigmóide", + D012: "Carcinoma in situ do reto", + D013: "Carcinoma in situ do ânus e canal anal", + D014: "Carcinoma in situ de outras partes do intestino e as não especificadas", + D015: "Carcinoma in situ do fígado, vesícula biliar e vias biliares", + D017: "Carcinoma in situ de outros órgãos especificados do aparelho digestivo", + D019: "Carcinoma in situ de órgãos digestivos, não especificado", + D02: "Carcinoma in situ do ouvido médio e do aparelho respiratório", + D020: "Carcinoma in situ da laringe", + D021: "Carcinoma in situ da traquéia", + D022: "Carcinoma in situ dos brônquios e pulmões", + D023: "Carcinoma in situ de outras partes do aparelho respiratório", + D029: "Carcinoma in situ do aparelho respiratório, não especificado", + D03: "Melanoma in situ", + D030: "Melanoma in situ do lábio", + D031: "Melanoma in situ da pálpebra, incluindo o canto", + D032: "Melanoma in situ da orelha e do conduto auditivo externo", + D033: "Melanoma in situ de outras partes, e de partes não especificadas da face", + D034: "Melanoma in situ do couro cabeludo e do pescoço", + D035: "Melanoma in situ do tronco", + D036: "Melanoma in situ dos membros superiores, incluindo ombro", + D037: "Melanoma in situ dos membros inferiores, incluindo quadril", + D038: "Melanoma in situ de outras localizações", + D039: "Melanoma in situ, não especificado", + D04: "Carcinoma in situ da pele", + D040: "Carcinoma in situ da pele do lábio", + D041: "Carcinoma in situ da pele da pálpebra, incluindo o canto", + D042: "Carcinoma in situ da pele da orelha e do conduto auditivo externo", + D043: "Carcinoma in situ da pele de outras partes e de partes não especificadas da face", + D044: "Carcinoma in situ da pele do couro cabeludo e do pescoço", + D045: "Carcinoma in situ da pele do tronco", + D046: "Carcinoma in situ da pele dos membros superiores, incluindo ombro", + D047: "Carcinoma in situ da pele dos membros inferiores, incluindo quadril", + D048: "Carcinoma in situ da pele de outras localizações", + D049: "Carcinoma in situ da pele, não especificada", + D05: "Carcinoma in situ da mama", + D050: "Carcinoma lobular in situ", + D051: "Carcinoma intraductal in situ", + D057: "Outros carcinomas in situ", + D059: "Carcinoma in situ da mama, não especificado", + D06: "Carcinoma in situ do colo do útero (cérvix)", + D060: "Carcinoma in situ do endocérvix", + D061: "Carcinoma in situ do exocérvix", + D067: "Carcinoma in situ de outras partes do colo do útero", + D069: "Carcinoma in situ do colo do útero, não especificado", + D07: "Carcinoma in situ de outros órgãos genitais e dos não especificados", + D070: "Carcinoma in situ do endométrio", + D071: "Carcinoma in situ da vulva", + D072: "Carcinoma in situ da vagina", + D073: "Carcinoma in situ de outros órgãos genitais femininos e os não especificados", + D074: "Carcinoma in situ do pênis", + D075: "Carcinoma in situ da próstata", + D076: "Carcinoma in situ de outros órgãos genitais masculinos e os não especificados", + D09: "Carcinoma in situ de outras localizações e das não especificadas", + D090: "Carcinoma in situ da bexiga", + D091: "Carcinoma in situ de outros órgãos urinários e os não especificados", + D092: "Carcinoma in situ do olho", + D093: "Carcinoma in situ da tireóide e de outras glândulas endócrinas", + D097: "Carcinoma in situ de outras localizações especificadas", + D099: "Carcinoma in situ, não especificado", + D10: "Neoplasia benigna da boca e da faringe", + D100: "Neoplasia benigna dos lábios", + D101: "Neoplasia benigna da língua", + D102: "Neoplasia benigna do assoalho da boca", + D103: "Neoplasia benigna de outras partes da boca e as não especificadas", + D104: "Neoplasia benigna da amígdala", + D105: "Neoplasia benigna de outras partes da orofaringe", + D106: "Neoplasia benigna da nasofaringe", + D107: "Neoplasia benigna da hipofaringe", + D109: "Neoplasia benigna da faringe, não especificada", + D11: "Neoplasia benigna de glândulas salivares maiores", + D110: "Neoplasia benigna da glândula parótida", + D117: "Neoplasia benigna de outras glândulas salivares maiores", + D119: "Neoplasia benigna da glândula salivar maior, não especificada", + D12: "Neoplasia benigna do cólon, reto, canal anal e ânus", + D120: "Neoplasia benigna do ceco", + D121: "Neoplasia benigna do apêndice (vermiforme)", + D122: "Neoplasia benigna do cólon ascendente", + D123: "Neoplasia benigna do cólon transverso", + D124: "Neoplasia benigna do cólon descendente", + D125: "Neoplasia benigna do cólon sigmóide", + D126: "Neoplasia benigna do cólon, não especificada", + D127: "Neoplasia benigna da junção retossigmóide", + D128: "Neoplasia benigna do reto", + D129: "Neoplasia benigna do canal anal e ânus", + D13: "Neoplasia benigna de outras partes e de partes mal definidas do aparelho digestivo", + D130: "Neoplasia benigna do esôfago", + D131: "Neoplasia benigna do estômago", + D132: "Neoplasia benigna do duodeno", + D133: "Neoplasia benigna de outras partes e partes não especificadas do intestino delgado", + D134: "Neoplasia benigna do fígado", + D135: "Neoplasia benigna das vias biliares extra-hepáticas", + D136: "Neoplasia benigna do pâncreas", + D137: "Neoplasia benigna do pâncreas endócrino", + D139: "Neoplasia benigna de localizações mal definidas do aparelho digestivo", + D14: "Neoplasia benigna do ouvido médio e do aparelho respiratório", + D140: "Neoplasia benigna do ouvido médio, cavidade nasal e seios paranasais", + D141: "Neoplasia benigna da laringe", + D142: "Neoplasia benigna da traquéia", + D143: "Neoplasia benigna dos brônquios e pulmão", + D144: "Neoplasia benigna do aparelho respiratório, não especificado", + D15: "Neoplasia benigna de outros órgãos intratorácicos e dos não especificados", + D150: "Neoplasia benigna do timo", + D151: "Neoplasia benigna do coração", + D152: "Neoplasia benigna do mediastino", + D157: "Neoplasia benigna de outros órgãos intratorácicos especificados", + D159: "Neoplasia benigna de órgão intratorácico, não especificado", + D16: "Neoplasia benigna de osso e de cartilagem articular", + D160: "Neoplasia benigna da omoplata [escápula] e ossos longos dos membros superiores", + D161: "Neoplasia benigna dos ossos curtos dos membros superiores", + D162: "Neoplasia benigna dos ossos longos dos membros inferiores", + D163: "Neoplasia benigna dos ossos curtos dos membros inferiores", + D164: "Neoplasia benigna dos ossos do crânio e da face", + D165: "Neoplasia benigna do osso da mandíbula", + D166: "Neoplasia benigna da coluna vertebral", + D167: "Neoplasia benigna das costelas, do esterno e da clavícula", + D168: "Neoplasia benigna dos ossos pélvicos, sacro e cóccix", + D169: "Neoplasia benigna do osso e cartilagem articular, não especificado", + D17: "Neoplasia lipomatosa benigna", + D170: "Neoplasia lipomatosa benigna da pele e do tecido subcutâneo da cabeça, face e pescoço", + D171: "Neoplasia lipomatosa benigna da pele e tecido subcutâneo do tronco", + D172: "Neoplasia lipomatosa benigna da pele e tecido subcutâneo dos membros", + D173: "Neoplasia lipomatosa benigna da pele e tecido subcutâneo de outras localizações e de localizações não especificadas", + D174: "Neoplasia lipomatosa benigna de órgãos intratorácicos", + D175: "Neoplasia lipomatosa benigna de órgãos intra-abdominais", + D176: "Neoplasia lipomatosa benigna do cordão espermático", + D177: "Neoplasia lipomatosa benigna de outras localizações", + D179: "Neoplasia lipomatosa benigna de localização não especificada", + D18: "Hemangioma e linfangioma de qualquer localização", + D180: "Hemangioma de qualquer localização", + D181: "Linfangioma de qualquer localização", + D19: "Neoplasia benigna de tecido mesotelial", + D190: "Neoplasia benigna do tecido mesotelial da pleura", + D191: "Neoplasia benigna do tecido mesotelial do peritônio", + D197: "Neoplasia benigna do tecido mesotelial de outras localizações", + D199: "Neoplasia benigna do tecido mesotelial, não especificado", + D20: "Neoplasia benigna de tecido mole do retroperitônio e do peritônio", + D200: "Neoplasia benigna do retroperitônio", + D201: "Neoplasia benigna do peritônio", + D21: "Outras neoplasias benignas do tecido conjuntivo e de outros tecidos moles", + D210: "Neoplasia benigna do tecido conjuntivo e outros tecidos moles da cabeça, face e pescoço", + D211: "Neoplasia benigna do tecido conjuntivo e outros tecidos moles dos membros superiores, incluindo ombro", + D212: "Neoplasia benigna do tecido conjuntivo e outros tecidos moles dos membros inferiores, incluindo quadril", + D213: "Neoplasia benigna do tecido conjuntivo e outros tecidos moles do tórax", + D214: "Neoplasia benigna do tecido conjuntivo e outros tecidos moles do abdome", + D215: "Neoplasia benigna do tecido conjuntivo e outros tecidos moles da pelve", + D216: "Neoplasia benigna do tecido conjuntivo e outros tecidos moles do tronco, não especificado", + D219: "Neoplasia benigna do tecido conjuntivo e outros tecidos moles, sem outra especificação", + D22: "Nevos melanocíticos", + D220: "Nevo melanocítico do lábio", + D221: "Nevo melanocítico da pálpebra, incluindo o canto", + D222: "Nevo melanocítico da orelha e do conduto auditivo externo", + D223: "Nevo melanocítico de outras partes e de partes não especificadas da face", + D224: "Nevo melanocítico do couro cabeludo e do pescoço", + D225: "Nevo melanocítico do tronco", + D226: "Nevo melanocítico dos membros superiores, incluindo ombro", + D227: "Nevo melanocítico dos membros inferiores, incluindo quadril", + D229: "Nevo melanocítico, não especificado", + D23: "Outras neoplasias benignas da pele", + D230: "Neoplasia benigna da pele dos lábios", + D231: "Neoplasia benigna da pele da pálpebra, incluindo o canto", + D232: "Neoplasia benigna da pele da orelha e do conduto auditivo externo", + D233: "Neoplasia benigna da pele de outras partes e de partes não especificadas da face", + D234: "Neoplasia benigna da pele do couro cabeludo e do pescoço", + D235: "Neoplasia benigna da pele do tronco", + D236: "Neoplasia benigna da pele dos membros superiores, incluindo o ombro", + D237: "Neoplasia benigna da pele dos membros inferiores, incluindo o quadril", + D239: "Neoplasia benigna da pele, não especificada", + D24: "Neoplasia benigna da mama", + D25: "Leiomioma do útero", + D250: "Leiomioma submucoso do útero", + D251: "Leiomioma intramural do útero", + D252: "Leiomioma subseroso do útero", + D259: "Leiomioma do útero, não especificado", + D26: "Outras neoplasias benignas do útero", + D260: "Neoplasia benigna do colo do útero", + D261: "Neoplasia benigna do corpo do útero", + D267: "Neoplasia benigna de outras partes do útero", + D269: "Neoplasia benigna do útero, não especificado", + D27: "Neoplasia benigna do ovário", + D28: "Neoplasia benigna de outros órgãos genitais femininos e de órgãos não especificados", + D280: "Neoplasia benigna da vulva", + D281: "Neoplasia benigna da vagina", + D282: "Neoplasia benigna das trompas e ligamentos uterinos", + D287: "Neoplasia benigna de outros órgãos genitais femininos especificados", + D289: "Neoplasia benigna de órgão genital feminino, não especificado", + D29: "Neoplasia benigna dos órgãos genitais masculinos", + D290: "Neoplasia benigna do pênis", + D291: "Neoplasia benigna da próstata", + D292: "Neoplasia benigna dos testículos", + D293: "Neoplasia benigna do epidídimo", + D294: "Neoplasia benigna do escroto", + D297: "Neoplasia benigna de outros órgãos genitais masculinos", + D299: "Neoplasia benigna de órgão genital masculino, não especificado", + D30: "Neoplasia benigna dos órgãos urinários", + D300: "Neoplasia benigna do rim", + D301: "Neoplasia benigna da pelve renal", + D302: "Neoplasia benigna do ureter", + D303: "Neoplasia benigna da bexiga", + D304: "Neoplasia benigna da uretra", + D307: "Neoplasia benigna de outros órgãos urinários", + D309: "Neoplasia benigna de órgão urinário, não especificado", + D31: "Neoplasia benigna do olho e anexos", + D310: "Neoplasia benigna da conjuntiva", + D311: "Neoplasia benigna da córnea", + D312: "Neoplasia benigna da retina", + D313: "Neoplasia benigna da coróide", + D314: "Neoplasia benigna do corpo ciliar", + D315: "Neoplasia benigna das glândulas e dos canais lacrimais", + D316: "Neoplasia benigna da órbita, não especificada", + D319: "Neoplasia benigna do olho, não especificado", + D32: "Neoplasia benigna das meninges", + D320: "Neoplasia benigna das meninges cerebrais", + D321: "Neoplasia benigna das meninges espinhais", + D329: "Neoplasia benigna das meninges, não especificada", + D33: "Neoplasia benigna do encéfalo e de outras partes do sistema nervoso central", + D330: "Neoplasia benigna do encéfalo, supratentorial", + D331: "Neoplasia benigna do encéfalo, infratentorial", + D332: "Neoplasia benigna do encéfalo, não especificado", + D333: "Neoplasia benigna dos nervos cranianos", + D334: "Neoplasia benigna da medula espinhal", + D337: "Neoplasia benigna de outras partes especificadas do sistema nervoso central", + D339: "Neoplasia benigna do sistema nervoso central, não especificado", + D34: "Neoplasia benigna da glândula tireóide", + D35: "Neoplasia benigna de outras glândulas endócrinas e das não especificadas", + D350: "Neoplasia benigna da glândula supra-renal (adrenal)", + D351: "Neoplasia benigna da glândula paratireóide", + D352: "Neoplasia benigna da glândula hipófise (pituitária)", + D353: "Neoplasia benigna do conduto craniofaríngeo", + D354: "Neoplasia benigna da glândula pineal", + D355: "Neoplasia benigna do corpo carotídeo", + D356: "Neoplasia benigna dos corpos aórticos e outros paragânglios", + D357: "Neoplasia benigna de outras glândulas endócrinas especificadas", + D358: "Neoplasia benigna com comprometimento pluriglandular", + D359: "Neoplasia benigna de glândula endócrina, não especificada", + D36: "Neoplasia benigna de outras localizações e de localizações não especificadas", + D360: "Neoplasia benigna dos gânglios linfáticos (linfonodos)", + D361: "Neoplasia benigna dos nervos periféricos e sistema nervoso autônomo", + D367: "Neoplasia benigna de outras localizações especificadas", + D369: "Neoplasia benigna de localização não especificada", + D37: "Neoplasia de comportamento incerto ou desconhecido da cavidade oral e dos órgãos digestivos", + D370: "Neoplasia de comportamento incerto ou desconhecido do lábio, cavidade oral e faringe", + D371: "Neoplasia de comportamento incerto ou desconhecido do estômago", + D372: "Neoplasia de comportamento incerto ou desconhecido do intestino delgado", + D373: "Neoplasia de comportamento incerto ou desconhecido do apêndice", + D374: "Neoplasia de comportamento incerto ou desconhecido dos cólons", + D375: "Neoplasia de comportamento incerto ou desconhecido do reto", + D376: "Neoplasia de comportamento incerto ou desconhecido do fígado, vesícula biliar e vias biliares", + D377: "Neoplasia de comportamento incerto ou desconhecido de outros órgãos digestivos", + D379: "Neoplasia de comportamento incerto ou desconhecido de órgão digestivo, não especificado", + D38: "Neoplasia de comportamento incerto ou desconhecido do ouvido médio e dos órgãos respiratórios e intratorácicos", + D380: "Neoplasia de comportamento incerto ou desconhecido da laringe", + D381: "Neoplasia de comportamento incerto ou desconhecido da traquéia, brônquios e pulmão", + D382: "Neoplasia de comportamento incerto ou desconhecido da pleura", + D383: "Neoplasia de comportamento incerto ou desconhecido do mediastino", + D384: "Neoplasia de comportamento incerto ou desconhecido do timo", + D385: "Neoplasia de comportamento incerto ou desconhecido de outros órgãos respiratórios", + D386: "Neoplasia de comportamento incerto ou desconhecido de órgão respiratório, não especificado", + D39: "Neoplasia de comportamento incerto ou desconhecido dos órgãos genitais femininos", + D390: "Neoplasia de comportamento incerto ou desconhecido do útero", + D391: "Neoplasia de comportamento incerto ou desconhecido do ovário", + D392: "Neoplasia de comportamento incerto ou desconhecido da placenta", + D397: "Neoplasia de comportamento incerto ou desconhecido de outros órgãos genitais femininos", + D399: "Neoplasia de comportamento incerto ou desconhecido de órgão genital feminino, não especificado", + D40: "Neoplasia de comportamento incerto ou desconhecido dos órgãos genitais masculinos", + D400: "Neoplasia de comportamento incerto ou desconhecido da próstata", + D401: "Neoplasia de comportamento incerto ou desconhecido do testículo", + D407: "Neoplasia de comportamento incerto ou desconhecido de outros órgãos genitais masculinos", + D409: "Neoplasia de comportamento incerto ou desconhecido de órgão genital masculino, não especificado", + D41: "Neoplasia de comportamento incerto ou desconhecido dos órgãos urinários", + D410: "Neoplasia de comportamento incerto ou desconhecido do rim", + D411: "Neoplasia de comportamento incerto ou desconhecido da pelve renal", + D412: "Neoplasia de comportamento incerto ou desconhecido do ureter", + D413: "Neoplasia de comportamento incerto ou desconhecido da uretra", + D414: "Neoplasia de comportamento incerto ou desconhecido da bexiga", + D417: "Neoplasia de comportamento incerto ou desconhecido de outros órgãos urinários", + D419: "Neoplasia de comportamento incerto ou desconhecido de órgão urinário, não especificado", + D42: "Neoplasia de comportamento incerto ou desconhecido das meninges", + D420: "Neoplasia de comportamento incerto ou desconhecido das meninges cerebrais", + D421: "Neoplasia de comportamento incerto ou desconhecido das meninges espinhais", + D429: "Neoplasia de comportamento incerto ou desconhecido de meninges não especificadas", + D43: "Neoplasia de comportamento incerto ou desconhecido do encéfalo e do sistema nervoso central", + D430: "Neoplasia de comportamento incerto ou desconhecido do encéfalo, supratentorial", + D431: "Neoplasia de comportamento incerto ou desconhecido do encéfalo, infratentorial", + D432: "Neoplasia de comportamento incerto ou desconhecido do encéfalo, não especificado", + D433: "Neoplasia de comportamento incerto ou desconhecido dos nervos cranianos", + D434: "Neoplasia de comportamento incerto ou desconhecido da medula espinhal", + D437: "Neoplasia de comportamento incerto ou desconhecido de outras partes do sistema nervoso central", + D439: "Neoplasia de comportamento incerto ou desconhecido do sistema nervoso central, não especificado", + D44: "Neoplasia de comportamento incerto ou desconhecido das glândulas endócrinas", + D440: "Neoplasia de comportamento incerto ou desconhecido da glândula tireóide", + D441: "Neoplasia de comportamento incerto ou desconhecido da glândula supra-renal (adrenal)", + D442: "Neoplasia de comportamento incerto ou desconhecido da glândula paratireóide", + D443: "Neoplasia de comportamento incerto ou desconhecido da glândula hipófise (pituitária)", + D444: "Neoplasia de comportamento incerto ou desconhecido do conduto craniofaríngeo", + D445: "Neoplasia de comportamento incerto ou desconhecido da glândula pineal", + D446: "Neoplasia de comportamento incerto ou desconhecido do corpo carotídeo", + D447: "Neoplasia de comportamento incerto ou desconhecido dos corpos aórticos e outros paragânglios", + D448: "Neoplasia de comportamento incerto ou desconhecido com comprometimento pluriglandular", + D449: "Neoplasia de comportamento incerto ou desconhecido de glândula endócrina, não especificada", + D45: "Policitemia vera", + D46: "Síndromes mielodisplásicas", + D460: "Anemia refratária sem sideroblastos", + D461: "Anemia refratária com sideroblastos", + D462: "Anemia refratária com excesso de blastos", + D463: "Anemia refratária com excesso de blastos com transformação", + D464: "Anemia refratária, não especificada", + D467: "Outras síndromes mielodisplásicas", + D469: "Síndrome mielodisplásica, não especificada", + D47: "Outras neoplasias de comportamento incerto ou desconhecido dos tecidos linfático, hematopoético e tecidos correlatos", + D470: "Tumores de comportamento incerto ou desconhecido de mastócitos e células histiocíticas", + D471: "Doença mieloproliferativa crônica", + D472: "Gamopatia monoclonal", + D473: "Trombocitemia essencial (hemorrágica)", + D477: "Outras neoplasias especificadas de comportamento incerto ou desconhecido dos tecidos linfático, hematopoético e tecidos relacionados", + D479: "Neoplasia de comportamento incerto ou desconhecido dos tecidos linfático, hematopoético e tecidos correlatos, não especificada", + D48: "Neoplasia de comportamento incerto ou desconhecido de outras localizações e de localizações não especificadas", + D480: "Neoplasia de comportamento incerto ou desconhecido dos ossos e cartilagens articulares", + D481: "Neoplasia de comportamento incerto ou desconhecido do tecido conjuntivo e outros tecidos moles", + D482: "Neoplasia de comportamento incerto ou desconhecido dos nervos periféricos e do sistema nervoso periférico", + D483: "Neoplasia de comportamento incerto ou desconhecido do retroperitônio", + D484: "Neoplasia de comportamento incerto ou desconhecido do peritônio", + D485: "Neoplasia de comportamento incerto ou desconhecido da pele", + D486: "Neoplasia de comportamento incerto ou desconhecido da mama", + D487: "Neoplasia de comportamento incerto ou desconhecido de outras localizações especificadas", + D489: "Neoplasia de comportamento incerto ou desconhecido sem outra especificação", + D50: "Anemia por deficiência de ferro", + D500: "Anemia por deficiência de ferro secundária à perda de sangue (crônica)", + D501: "Disfagia sideropênica", + D508: "Outras anemias por deficiência de ferro", + D509: "Anemia por deficiência de ferro não especificada", + D51: "Anemia por deficiência de vitamina B12", + D510: "Anemia por deficiência de vitamina B12 devida à deficiência de fator intrínseco", + D511: "Anemia por deficiência de vitamina B12 devida à má-absorção seletiva de vitamina B12 com proteinúria", + D512: "Deficiência de transcobalamina II", + D513: "Outras anemias por deficiência de vitamina B12 na dieta", + D518: "Outras anemias por deficiência de vitamina B12", + D519: "Anemia por deficiência de vitamina B12 não especificada", + D52: "Anemia por deficiência de folato", + D520: "Anemia por deficiência de folato na dieta", + D521: "Anemia por deficiência de folato induzida por drogas", + D528: "Outras anemias por deficiência de folato", + D529: "Anemia por deficiência de folato não especificada", + D53: "Outras anemias nutricionais", + D530: "Anemia por deficiência de proteínas", + D531: "Outras anemias megaloblásticas não classificadas em outras partes", + D532: "Anemia escorbútica", + D538: "Outras anemias nutricionais especificadas", + D539: "Anemia nutricional não especificada", + D55: "Anemia devida a transtornos enzimáticos", + D550: "Anemia devida à deficiência de glicose-6-fosfato-desidrogenase [G-6-PD]", + D551: "Anemia devida a outros transtornos do metabolismo do glutation", + D552: "Anemia devida a transtornos das enzimas glicolíticas", + D553: "Anemia devida a transtornos do metabolismo de nucleotídios", + D558: "Outras anemias devidas a transtornos enzimáticos", + D559: "Anemia devida a transtorno enzimático não especificada", + D56: "Talassemia", + D560: "Talassemia alfa", + D561: "Talassemia beta", + D562: "Talassemia delta-beta", + D563: "Estigma talassêmico", + D564: "Persistência hereditária de hemoglobina fetal", + D568: "Outras talassemias", + D569: "Talassemia não especificada", + D57: "Transtornos falciformes", + D570: "Anemia falciforme com crise", + D571: "Anemia falciforme sem crise", + D572: "Transtornos falciformes heterozigóticos duplos", + D573: "Estigma falciforme", + D578: "Outros transtornos falciformes", + D58: "Outras anemias hemolíticas hereditárias", + D580: "Esferocitose hereditária", + D581: "Eliptocitose hereditária", + D582: "Outras hemoglobinopatias", + D588: "Outras anemias hemolíticas hereditárias especificadas", + D589: "Anemia hemolítica hereditária não especificada", + D59: "Anemia hemolítica adquirida", + D590: "Anemia hemolítica auto-imune induzida por droga", + D591: "Outras anemias hemolíticas auto-imunes", + D592: "Anemia hemolítica não-auto-imune induzida por drogas", + D593: "Síndrome hemolítico-urêmica", + D594: "Outras anemias hemolíticas não-autoimunes", + D595: "Hemoglobinúria paroxística noturna [Marchiafava-Micheli]", + D596: "Hemoglobinúria devida à hemólise por outras causas externas", + D598: "Outras anemias hemolíticas adquiridas", + D599: "Anemia hemolítica adquirida não especificada", + D60: "Aplasia pura da série vermelha, adquirida [eritroblastopenia]", + D600: "Aplasia pura adquirida crônica da série vermelha", + D601: "Aplasia pura adquirida transitória da série vermelha", + D608: "Outras aplasias puras adquiridas da série vermelha", + D609: "Aplasia pura adquirida, não especificada, da série vermelha", + D61: "Outras anemias aplásticas", + D610: "Anemia aplástica constitucional", + D611: "Anemia aplástica induzida por drogas", + D612: "Anemia aplástica devida a outros agentes externos", + D613: "Anemia aplástica idiopática", + D618: "Outras anemias aplásticas especificadas", + D619: "Anemia aplástica não especificada", + D62: "Anemia aguda pós-hemorrágica", + D63: "Anemia em doenças crônicas classificadas em outra parte", + D630: "Anemia em neoplasias", + D638: "Anemia em outras doenças classificadas em outra parte", + D64: "Outras anemias", + D640: "Anemia sideroblástica hereditária", + D641: "Anemia sideroblástica secundária a doença", + D642: "Anemia sideroblástica secundária ao uso de drogas e a toxinas", + D643: "Outras anemias sideroblásticas", + D644: "Anemia diseritropoética congênita", + D648: "Outras anemias especificadas", + D649: "Anemia não especificada", + D65: "Coagulação intravascular disseminada [síndrome de desfibrinação]", + D66: "Deficiência hereditária do fator VIII", + D67: "Deficiência hereditária do fator IX", + D68: "Outros defeitos da coagulação", + D680: "Doença de Von Willebrand", + D681: "Deficiência hereditária de fator XI", + D682: "Deficiência hereditária de outros fatores de coagulação", + D683: "Transtorno hemorrágico devido a anticoagulantes circulantes", + D684: "Deficiência adquirida de fator de coagulação", + D688: "Outros defeitos especificados da coagulação", + D689: "Defeito de coagulação não especificado", + D69: "Púrpura e outras afecções hemorrágicas", + D690: "Púrpura alérgica", + D691: "Defeitos qualitativos das plaquetas", + D692: "Outras púrpuras não-trombocitopênicas", + D693: "Púrpura trombocitopênica idiopática", + D694: "Outra trombocitopenia primária", + D695: "Trombocitopenia secundária", + D696: "Trombocitopenia não especificada", + D698: "Outras afecções hemorrágicas especificadas", + D699: "Afecção hemorrágica não especificada", + D70: "Agranulocitose", + D71: "Transtornos funcionais dos neutrófilos polimorfonucleares", + D72: "Outros transtornos dos glóbulos brancos", + D720: "Anomalias genéticas dos leucócitos", + D721: "Eosinofilia", + D728: "Outros transtornos especificados dos glóbulos brancos", + D729: "Transtornos não especificados dos glóbulos brancos", + D73: "Doenças do baço", + D730: "Hipoesplenismo", + D731: "Hiperesplenismo", + D732: "Esplenomegalia congestiva crônica", + D733: "Abscesso do baço", + D734: "Cisto do baço", + D735: "Infarto do baço", + D738: "Outras doenças do baço", + D739: "Doença não especificada do baço", + D74: "Metemoglobinemia", + D740: "Metemoglobinemia congênita", + D748: "Outras metemoglobinemias", + D749: "Metemoglobinemia não especificada", + D75: "Outras doenças do sangue e dos órgãos hematopoéticos", + D750: "Eritrocitose familiar", + D751: "Policitemia secundária", + D752: "Trombocitose essencial", + D758: "Outras doenças especificadas do sangue e dos órgãos hematopoéticos", + D759: "Doença não especificada do sangue e dos órgãos hematopoéticos", + D76: "Algumas doenças que envolvem o tecido linforreticular e o sistema reticulohistiocítico", + D760: "Histiocitose das células de Langerhans não classificadas em outra parte", + D761: "Linfohistiocitose hemofagocítica", + D762: "Síndrome hematofagocítica associada à infecção", + D763: "Outras síndromes histiocíticas", + D77: "Outros transtornos do sangue e dos órgãos hematopoéticos em doenças classificadas em outra parte", + D80: "Imunodeficiência com predominância de defeitos de anticorpos", + D800: "Hipogamaglobulinemia hereditária", + D801: "Hipogamaglobulinemia não familiar", + D802: "Deficiência seletiva de imunoglobulina A [IgA]", + D803: "Deficiência seletiva de subclasses de imunoglobulina G [IgG]", + D804: "Deficiência seletiva de imunoglobulina M [IgM]", + D805: "Imunodeficiência com aumento de imunoglobulina M [IgM]", + D806: "Deficiência de anticorpos com imunoglobulinas próximas do normal ou com hiperimunoglobulinemia", + D807: "Hipogamaglobulinemia transitória da infância", + D808: "Outras imunodeficiências com predominância de defeitos de anticorpos", + D809: "Imunodeficiência não especificada com predominância de defeitos de anticorpos", + D81: "Deficiências imunitárias combinadas", + D810: "Imunodeficiência combinada grave [SCID] com disgenesia reticular", + D811: "Imunodeficiência combinada grave [SCID] com números baixos de células T e B", + D812: "Imunodeficiência combinada grave [SCID] com números baixos ou normais de células B", + D813: "Deficiência de adenosina-deaminase [ADA]", + D814: "Síndrome de Nezelof", + D815: "Deficiência de purina-nucleosídeo fosforilase [PNP]", + D816: "Deficiência major classe I do complexo de histocompatibilidade", + D817: "Deficiência major classe II do complexo de histocompatibilidade", + D818: "Outras deficiências imunitárias combinadas", + D819: "Deficiências imunitárias combinadas não especificadas", + D82: 'Imunodeficiência associada com outros defeitos "major"', + D820: "Síndrome de Wiskott-Aldrich", + D821: "Síndrome de Di George", + D822: "Imunodeficiência com encurtamento de membros", + D823: "Imunodeficiência que se segue à resposta hereditária defeituosa ao vírus de Epstein-Barr (EB)", + D824: "Síndrome da hiperimunoglobulina E [IgE]", + D828: 'Imunodeficiências associadas com outros defeitos "major" especificados', + D829: 'Imunodeficiência associada com defeitos "major" não especificados', + D83: "Imunodeficiência comum variável", + D830: "Imunodeficiência comum variável com predominância de anormalidades do número e da função das células B", + D831: "Imunodeficiência comum variável com predominância de transtornos imunorregulatórios de células T", + D832: "Imunodeficiência comum variável com auto-anticorpos às células B ou T", + D838: "Outras imunodeficiências comuns variáveis", + D839: "Imunodeficiência comum variável não especificada", + D84: "Outras imunodeficiências", + D840: "Defeito do antígeno-1 da função de linfócito [LFA-1]", + D841: "Defeitos no sistema complemento", + D848: "Outras imunodeficiências especificadas", + D849: "Imunodeficiência não especificada", + D86: "Sarcoidose", + D860: "Sarcoidose do pulmão", + D861: "Sarcoidose dos gânglios linfáticos", + D862: "Sarcoidose do pulmão com sarcoidose dos gânglios linfáticos", + D863: "Sarcoidose da pele", + D868: "Sarcoidose de outros locais especificados e locais combinados", + D869: "Sarcoidose não especificada", + D89: "Outros transtornos que comprometem o mecanismo imunitário não classificados em outra parte", + D890: "Hipergamaglobulinemia policlonal", + D891: "Crioglobulinemia", + D892: "Hipergamaglobulinemia não especificada", + D898: "Outros transtornos especificados que comprometem o mecanismo imunitário não classificados em outra parte", + D899: "Transtornos não especificados que comprometem o mecanismo imunitário", + E00: "Síndrome de deficiência congênita de iodo", + E000: "Síndrome da deficiência congênita de iodo do tipo neurológico", + E001: "Síndrome da deficiência congênita de iodo do tipo mixedematoso", + E002: "Síndrome da deficiência congênita de iodo do tipo misto", + E009: "Síndrome da deficiência congênita de iodo, não especificada", + E01: "Transtornos tireoidianos e afecções associadas, relacionados à deficiência de iodo", + E010: "Bócio (endêmico) difuso por deficiência de iodo", + E011: "Bócio (endêmico) multinodular por deficiência de iodo", + E012: "Bócio (endêmico) não especificado, por deficiência de iodo", + E018: "Outros transtornos tireoidianos e afecções associadas, relacionados com a deficiência de iodo", + E02: "Hipotireoidismo subclínico por deficiência de iodo", + E03: "Outros hipotireoidismos", + E030: "Hipotireoidismo congênito com bócio difuso", + E031: "Hipotireoidismo congênito sem bócio", + E032: "Hipotireoidismo devido a medicamentos e outras substâncias exógenas", + E033: "Hipotireoidismo pós-infeccioso", + E034: "Atrofia (adquirida) da tireóide", + E035: "Coma mixedematoso", + E038: "Outros hipotireoidismos especificados", + E039: "Hipotireoidismo não especificado", + E04: "Outros bócios não-tóxicos", + E040: "Bócio não-tóxico difuso", + E041: "Bócio não-tóxico uninodular", + E042: "Bócio não-tóxico multinodular", + E048: "Outro bócio não-tóxico especificado", + E049: "Bócio não-tóxico, não especificado", + E05: "Tireotoxicose [hipertireoidismo]", + E050: "Tireotoxicose com bócio difuso", + E051: "Tireotoxicose com bócio tóxico uninodular", + E052: "Tireotoxicose com bócio tóxico multinodular", + E053: "Tireotoxicose causada por tecido tireoidiano ectópico", + E054: "Tireotoxicose factícia", + E055: 'Crise ou "tempestade" tireotóxica', + E058: "Outras tireotoxicoses", + E059: "Tireotoxicose não especificada", + E06: "Tireoidite", + E060: "Tireoidite aguda", + E061: "Tireoidite subaguda", + E062: "Tireoidite crônica com tireotoxicose transitória", + E063: "Tireoidite auto-imune", + E064: "Tireoidite induzida por droga", + E065: "Outras tireoidites crônicas", + E069: "Tireoidite não especificada", + E07: "Outros transtornos da tireóide", + E070: "Hipersecreção de calcitonina", + E071: "Bócio disormonogênico", + E078: "Outros transtornos especificados da tireóide", + E079: "Transtorno não especificado da tireóide", + E10: "Diabetes mellitus insulino-dependente", + E100: "Diabetes mellitus insulino-dependente - com coma", + E101: "Diabetes mellitus insulino-dependente - com cetoacidose", + E102: "Diabetes mellitus insulino-dependente - com complicações renais", + E103: "Diabetes mellitus insulino-dependente - com complicações oftálmicas", + E104: "Diabetes mellitus insulino-dependente - com complicações neurológicas", + E105: "Diabetes mellitus insulino-dependente - com complicações circulatórias periféricas", + E106: "Diabetes mellitus insulino-dependente - com outras complicações especificadas", + E107: "Diabetes mellitus insulino-dependente - com complicações múltiplas", + E108: "Diabetes mellitus insulino-dependente - com complicações não especificadas", + E109: "Diabetes mellitus insulino-dependente - sem complicações", + E11: "Diabetes mellitus não-insulino-dependente", + E110: "Diabetes mellitus não-insulino-dependente - com coma", + E111: "Diabetes mellitus não-insulino-dependente - com cetoacidose", + E112: "Diabetes mellitus não-insulino-dependente - com complicações renais", + E113: "Diabetes mellitus não-insulino-dependente - com complicações oftálmicas", + E114: "Diabetes mellitus não-insulino-dependente - com complicações neurológicas", + E115: "Diabetes mellitus não-insulino-dependente - com complicações circulatórias periféricas", + E116: "Diabetes mellitus não-insulino-dependente - com outras complicações especificadas", + E117: "Diabetes mellitus não-insulino-dependente - com complicações múltiplas", + E118: "Diabetes mellitus não-insulino-dependente - com complicações não especificadas", + E119: "Diabetes mellitus não-insulino-dependente - sem complicações", + E12: "Diabetes mellitus relacionado com a desnutrição", + E120: "Diabetes mellitus relacionado com a desnutrição - com coma", + E121: "Diabetes mellitus relacionado com a desnutrição - com cetoacidose", + E122: "Diabetes mellitus relacionado com a desnutrição - com complicações renais", + E123: "Diabetes mellitus relacionado com a desnutrição - com complicações oftálmicas", + E124: "Diabetes mellitus relacionado com a desnutrição - com complicações neurológicas", + E125: "Diabetes mellitus relacionado com a desnutrição - com complicações circulatórias periféricas", + E126: "Diabetes mellitus relacionado com a desnutrição - com outras complicações especificadas", + E127: "Diabetes mellitus relacionado com a desnutrição - com complicações múltiplas", + E128: "Diabetes mellitus relacionado com a desnutrição - com complicações não especificadas", + E129: "Diabetes mellitus relacionado com a desnutrição - sem complicações", + E13: "Outros tipos especificados de diabetes mellitus", + E130: "Outros tipos especificados de diabetes mellitus - com coma", + E131: "Outros tipos especificados de diabetes mellitus - com cetoacidose", + E132: "Outros tipos especificados de diabetes mellitus - com complicações renais", + E133: "Outros tipos especificados de diabetes mellitus - com complicações oftálmicas", + E134: "Outros tipos especificados de diabetes mellitus - com complicações neurológicas", + E135: "Outros tipos especificados de diabetes mellitus - com complicações circulatórias periféricas", + E136: "Outros tipos especificados de diabetes mellitus - com outras complicações especificadas", + E137: "Outros tipos especificados de diabetes mellitus - com complicações múltiplas", + E138: "Outros tipos especificados de diabetes mellitus - com complicações não especificadas", + E139: "Outros tipos especificados de diabetes mellitus - sem complicações", + E14: "Diabetes mellitus não especificado", + E140: "Diabetes mellitus não especificado - com coma", + E141: "Diabetes mellitus não especificado - com cetoacidose", + E142: "Diabetes mellitus não especificado - com complicações renais", + E143: "Diabetes mellitus não especificado - com complicações oftálmicas", + E144: "Diabetes mellitus não especificado - com complicações neurológicas", + E145: "Diabetes mellitus não especificado - com complicações circulatórias periféricas", + E146: "Diabetes mellitus não especificado - com outras complicações especificadas", + E147: "Diabetes mellitus não especificado - com complicações múltiplas", + E148: "Diabetes mellitus não especificado - com complicações não especificadas", + E149: "Diabetes mellitus não especificado - sem complicações", + E15: "Coma hipoglicêmico não-diabético", + E16: "Outros transtornos da secreção pancreática interna", + E160: "Hipoglicemia induzida por droga sem coma", + E161: "Outra hipoglicemia", + E162: "Hipoglicemia não especificada", + E163: "Aumento da secreção de glucagon", + E164: "Secreção anormal de gastrina", + E168: "Outros transtornos especificados da secreção pancreática interna", + E169: "Transtorno não especificado da secreção pancreática interna", + E20: "Hipoparatireoidismo", + E200: "Hipoparatireoidismo idiopático", + E201: "Pseudohipoparatireoidismo", + E208: "Outro hipoparatireoidismo", + E209: "Hipoparatireoidismo não especificado", + E21: "Hiperparatireoidismo e outros transtornos da glândula paratireóide", + E210: "Hiperparatireoidismo primário", + E211: "Hiperparatireoidismo secundário não classificado em outra parte", + E212: "Outro hiperparatireoidismo", + E213: "Hiperparatireoidismo não especificado", + E214: "Outros transtornos especificados da glândula paratireóide", + E215: "Transtorno não especificado da glândula paratireóide", + E22: "Hiperfunção da hipófise", + E220: "Acromegalia e gigantismo hipofisário", + E221: "Hiperprolactinemia", + E222: "Síndrome da secreção inadequada de hormônio antidiurético", + E228: "Outras hiperfunções da hipófise", + E229: "Hiperfunção não especificada da hipófise", + E23: "Hipofunção e outros transtornos da hipófise", + E230: "Hipopituitarismo", + E231: "Hipopituitarismo induzido por droga", + E232: "Diabetes insípido", + E233: "Disfunção hipotalâmica não classificada em outra parte", + E236: "Outros transtornos da hipófise", + E237: "Transtorno não especificado da hipófise", + E24: "Síndrome de Cushing", + E240: "Síndrome de Cushing dependente da hipófise", + E241: "Síndrome de Nelson", + E242: "Síndrome de Cushing induzida por droga", + E243: "Síndrome do ACTH ectópico", + E244: "Síndrome de pseudo-Cushing induzida pelo álcool", + E248: "Outra síndrome de Cushing", + E249: "Síndrome de Cushing não especificada", + E25: "Transtornos adrenogenitais", + E250: "Transtornos adrenogenitais congênitos associados à deficiência enzimática", + E258: "Outros transtornos adrenogenitais", + E259: "Transtorno adrenogenital não especificado", + E26: "Hiperaldosteronismo", + E260: "Hiperaldosteronismo primário", + E261: "Hiperaldosteronismo secundário", + E268: "Outro hiperaldosteronismo", + E269: "Hiperaldosteronismo não especificado", + E27: "Outros transtornos da glândula supra-renal", + E270: "Outros excessos de atividade adrenocortical", + E271: "Insuficiência adrenocortical primária", + E272: "Crise addisoniana", + E273: "Insuficiência adrenocortical induzida por drogas", + E274: "Outras insuficiências adrenocorticais e as não especificadas", + E275: "Hiperfunção adrenomedular", + E278: "Outros transtornos especificados da supra-renal", + E279: "Transtorno não especificado da supra-renal", + E28: "Disfunção ovariana", + E280: "Excesso de estrógeno", + E281: "Excesso de andrógenos", + E282: "Síndrome do ovário policístico", + E283: "Insuficiência ovariana primária", + E288: "Outra disfunção ovariana", + E289: "Disfunção ovariana não especificada", + E29: "Disfunção testicular", + E290: "Hiperfunção testicular", + E291: "Hipofunção testicular", + E298: "Outra disfunção testicular", + E299: "Disfunção testicular não especificada", + E30: "Transtornos da puberdade não classificados em outra parte", + E300: "Puberdade retardada", + E301: "Puberdade precoce", + E308: "Outros transtornos da puberdade", + E309: "Transtorno não especificado da puberdade", + E31: "Disfunção poliglandular", + E310: "Insuficiência poliglandular auto-imune", + E311: "Hiperfunção poliglandular", + E318: "Outra disfunção poliglandular", + E319: "Disfunção poliglandular não especificada", + E32: "Doenças do timo", + E320: "Hiperplasia persistente do timo", + E321: "Abscesso do timo", + E328: "Outras doenças do timo", + E329: "Doença do timo não especificada", + E34: "Outros transtornos endócrinos", + E340: "Síndrome carcinóide", + E341: "Outra hipersecreção de hormônios intestinais", + E342: "Secreção hormonal ectópica, não classificada em outra parte", + E343: "Nanismo, não classificado em outra parte", + E344: "Alta estatura constitucional", + E345: "Síndrome de resistência a andrógenos", + E348: "Outros transtornos endócrinos especificados", + E349: "Transtorno endócrino não especificado", + E35: "Transtornos das glândulas endócrinas em doenças classificadas em outra parte", + E350: "Transtornos da glândula tireóide em doenças classificadas em outra parte", + E351: "Transtornos das supra-renais em doenças classificadas em outra parte", + E358: "Transtornos de outras glândulas endócrinas em doenças classificadas em outra parte", + E40: "Kwashiorkor", + E41: "Marasmo nutricional", + E42: "Kwashiorkor marasmático", + E43: "Desnutrição protéico-calórica grave não especificada", + E44: "Desnutrição protéico-calórica de graus moderado e leve", + E440: "Desnutrição protéico-calórica moderada", + E441: "Desnutrição protéico-calórica leve", + E45: "Atraso do desenvolvimento devido à desnutrição protéico-calórica", + E46: "Desnutrição protéico-calórica não especificada", + E50: "Deficiência de vitamina A", + E500: "Deficiência de vitamina A com xerose conjuntival", + E501: "Deficiência de vitamina A com mancha de Bitot e xerose conjuntival", + E502: "Deficiência de vitamina A com xerose da córnea", + E503: "Deficiência de vitamina A com ulceração e xerose da córnea", + E504: "Deficiência de vitamina A com ceratomalácia", + E505: "Deficiência de vitamina A com cegueira noturna", + E506: "Deficiência de vitamina A com cicatrizes xeroftálmicas da córnea", + E507: "Outras manifestações oculares devidas a deficiência de vitamina A", + E508: "Outras manifestações devidas a deficiência de vitamina A", + E509: "Deficiência não especificada de vitamina A", + E51: "Deficiência de tiamina", + E511: "Beribéri", + E512: "Encefalopatia de Wernicke", + E518: "Outras manifestações da deficiência de tiamina", + E519: "Deficiência não especificada de tiamina", + E52: "Deficiência de niacina [pelagra]", + E53: "Deficiência de outras vitaminas do grupo B", + E530: "Deficiência de riboflavina", + E531: "Deficiência de piridoxina", + E538: "Deficiência de outras vitaminas especificadas do grupo B", + E539: "Deficiência não especificada de vitamina B", + E54: "Deficiência de ácido ascórbico", + E55: "Deficiência de vitamina D", + E550: "Raquitismo ativo", + E559: "Deficiência não especificada de vitamina D", + E56: "Outras deficiências vitamínicas", + E560: "Deficiência de vitamina E", + E561: "Deficiência de vitamina K", + E568: "Deficiência de outras vitaminas", + E569: "Deficiência vitamínica não especificada", + E58: "Deficiência de cálcio da dieta", + E59: "Deficiência de selênio da dieta", + E60: "Deficiência de zinco da dieta", + E61: "Deficiência de outros elementos nutrientes", + E610: "Deficiência de cobre", + E611: "Deficiência de ferro", + E612: "Deficiência de magnésio", + E613: "Deficiência de manganês", + E614: "Deficiência de cromo", + E615: "Deficiência de molibdênio", + E616: "Deficiência de vanádio", + E617: "Deficiência de múltiplos elementos nutrientes", + E618: "Deficiência de outros elementos nutrientes especificados", + E619: "Deficiência de elementos nutrientes não especificados", + E63: "Outras deficiências nutricionais", + E630: "Deficiência de ácido graxo essencial", + E631: "Desequilíbrio de constituintes da ingestão de alimentos", + E638: "Outras deficiências nutricionais especificadas", + E639: "Deficiência nutricional não especificada", + E64: "Seqüelas de desnutrição e de outras deficiências nutricionais", + E640: "Seqüelas de desnutrição protéico-calórica", + E641: "Seqüelas da deficiência de vitamina A", + E642: "Seqüelas da deficiência de vitamina C", + E643: "Seqüelas do raquitismo", + E648: "Seqüelas de outras deficiências nutricionais", + E649: "Seqüelas de deficiência nutricional não especificada", + E65: "Adiposidade localizada", + E66: "Obesidade", + E660: "Obesidade devida a excesso de calorias", + E661: "Obesidade induzida por drogas", + E662: "Obesidade extrema com hipoventilação alveolar", + E668: "Outra obesidade", + E669: "Obesidade não especificada", + E67: "Outras formas de hiperalimentação", + E670: "Hipervitaminose A", + E671: "Hipercarotenemia", + E672: "Síndrome de megavitamina B6", + E673: "Hipervitaminose D", + E678: "Outras formas especificadas de hiperalimentação", + E68: "Seqüelas de hiperalimentação", + E70: "Distúrbios do metabolismo de aminoácidos aromáticos", + E700: "Fenilcetonúria clássica", + E701: "Outras hiperfenilalaninemias", + E702: "Distúrbios do metabolismo da tirosina", + E703: "Albinismo", + E708: "Outros distúrbios do metabolismo de aminoácidos aromáticos", + E709: "Distúrbio não especificado do metabolismo de aminoácidos aromáticos", + E71: "Distúrbios do metabolismo de aminoácidos de cadeia ramificada e do metabolismo dos ácidos graxos", + E710: "Doença da urina em xarope de ácer (ou bordo) (Maple-syrup urine disease)", + E711: "Outros distúrbios do metabolismo de aminoácidos de cadeia ramificada", + E712: "Distúrbio não especificado do metabolismo de aminoácidos de cadeia ramificada", + E713: "Distúrbios do metabolismo de ácidos graxos", + E72: "Outros distúrbios do metabolismo de aminoácidos", + E720: "Distúrbios do transporte de aminoácidos", + E721: "Distúrbios do metabolismo dos aminoácidos que contêm enxofre", + E722: "Distúrbios do metabolismo do ciclo da uréia", + E723: "Distúrbios do metabolismo da lisina e da hidroxilisina", + E724: "Distúrbios do metabolismo da ornitina", + E725: "Distúrbios do metabolismo da glicina", + E728: "Outros distúrbios especificados do metabolismo dos aminoácidos", + E729: "Distúrbio não especificado do metabolismo dos aminoácidos", + E73: "Intolerância à lactose", + E730: "Deficiência congênita de lactase", + E731: "Deficiência secundária de lactase", + E738: "Outras intolerâncias à lactose", + E739: "Intolerância à lactose, não especificada", + E74: "Outros distúrbios do metabolismo de carboidratos", + E740: "Doença de depósito de glicogênio", + E741: "Distúrbios do metabolismo da frutose", + E742: "Distúrbios do metabolismo da galactose", + E743: "Outros distúrbios da absorção intestinal de carboidratos", + E744: "Distúrbios do metabolismo do piruvato e da gliconeogênese", + E748: "Outros distúrbios especificados do metabolismo de carboidratos", + E749: "Distúrbio não especificado do metabolismo de carboidratos", + E75: "Distúrbios do metabolismo de esfingolípides e outros distúrbios de depósito de lípides", + E750: "Gangliosidose GM2", + E751: "Outras gangliosidoses", + E752: "Outras esfingolipidoses", + E753: "Esfingolipidose não especificada", + E754: "Lipofuscinose neuronal ceróide", + E755: "Outros distúrbios do depósito de lípides", + E756: "Distúrbio não especificado do depósito de lípides", + E76: "Distúrbios do metabolismo do glicosaminoglicano", + E760: "Mucopolissacaridose do tipo I", + E761: "Mucopolissacaridose do tipo II", + E762: "Outras mucopolissacaridoses", + E763: "Mucopolissacaridose não especificada", + E768: "Outros distúrbios do metabolismo do glicosaminoglicano", + E769: "Distúrbio não especificado do metabolismo do glicosaminoglicano", + E77: "Distúrbios do metabolismo de glicoproteínas", + E770: "Defeitos na modificação pós-translacional de enzimas lisossômicas", + E771: "Defeitos na degradação das glicoproteínas", + E778: "Outros distúrbios do metabolismo de glicoproteínas", + E779: "Distúrbio não especificado do metabolismo de glicoproteínas", + E78: "Distúrbios do metabolismo de lipoproteínas e outras lipidemias", + E780: "Hipercolesterolemia pura", + E781: "Hipergliceridemia pura", + E782: "Hiperlipidemia mista", + E783: "Hiperquilomicronemia", + E784: "Outras hiperlipidemias", + E785: "Hiperlipidemia não especificada", + E786: "Deficiências de lipoproteínas", + E788: "Outros distúrbios do metabolismo de lipoproteínas", + E789: "Distúrbio não especificado do metabolismo de lipoproteínas", + E79: "Distúrbios do metabolismo de purina e pirimidina", + E790: "Hiperuricemia sem sinais de artrite inflamatória e de doença com tofos", + E791: "Síndrome de Lesch-Nyhan", + E798: "Outros distúrbios do metabolismo da purina e pirimidina", + E799: "Distúrbio não especificado do metabolismo da purina e pirimidina", + E80: "Distúrbios do metabolismo da porfirina e da bilirrubina", + E800: "Porfiria hereditária eritropoética", + E801: "Porfiria cutânea tardia", + E802: "Outras porfirias", + E803: "Defeitos da catalase e da peroxidase", + E804: "Síndrome de Gilbert", + E805: "Síndrome da Crigler-Najjar", + E806: "Outros distúrbios do metabolismo da bilirrubina", + E807: "Distúrbio não especificado do metabolismo da bilirrubina", + E83: "Distúrbios do metabolismo de minerais", + E830: "Distúrbios do metabolismo do cobre", + E831: "Doença do metabolismo do ferro", + E832: "Distúrbios do metabolismo do zinco", + E833: "Distúrbios do metabolismo do fósforo", + E834: "Distúrbios do metabolismo do magnésio", + E835: "Distúrbios do metabolismo do cálcio", + E838: "Outros distúrbios do metabolismo mineral", + E839: "Distúrbio não especificado do metabolismo mineral", + E84: "Fibrose cística", + E840: "Fibrose cística com manifestações pulmonares", + E841: "Fibrose cística com manifestações intestinais", + E848: "Fibrose cística com outras manifestações", + E849: "Fibrose cística não especificada", + E85: "Amiloidose", + E850: "Amiloidose heredofamiliar não-neuropática", + E851: "Amiloidose heredofamiliar neuropática", + E852: "Amiloidose heredofamiliar não especificada", + E853: "Amiloidose sistêmica secundária", + E854: "Amiloidose limitada a órgãos", + E858: "Outras amiloidoses", + E859: "Amiloidose não especificada", + E86: "Depleção de volume", + E87: "Outros transtornos do equilíbrio hidroeletrolítico e ácido-básico", + E870: "Hiperosmolaridade e hipernatremia", + E871: "Hiposmolaridade e hiponatremia", + E872: "Acidose", + E873: "Alcalose", + E874: "Distúrbio misto do equilíbrio ácido-básico", + E875: "Hiperpotassemia", + E876: "Hipopotassemia", + E877: "Sobrecarga de líquidos", + E878: "Outros transtornos do equilíbrio hidroeletrolítico não classificados em outra parte", + E88: "Outros distúrbios metabólicos", + E880: "Distúrbios do metabolismo das proteínas plasmáticas não classificados em outra parte", + E881: "Lipodistrofia não classificada em outra parte", + E882: "Lipomatose não classificada em outra parte", + E888: "Outros distúrbios especificados do metabolismo", + E889: "Distúrbio metabólico não especificado", + E89: "Transtornos endócrinos e metabólicos pós-procedimentos, não classificados em outra parte", + E890: "Hipotireoidismo pós-procedimento", + E891: "Hipoinsulinemia pós-procedimento", + E892: "Hipoparatireoidismo pós-procedimento", + E893: "Hipopituitarismo pós-procedimento", + E894: "Insuficiência ovariana pós-procedimento", + E895: "Hipofunção testicular pós-procedimento", + E896: "Hipofunção adrenocortical(-medular) pós-procedimento", + E898: "Outros transtornos endócrinos e metabólicos pós-procedimento", + E899: "Transtornos endócrinos e metabólicos não especificados pós-procedimento", + E90: "Transtornos nutricionais e metabólicos em doenças classificadas em outra parte", + F00: "Demência na doença de Alzheimer", + F000: "Demência na doença de Alzheimer de início precoce", + F001: "Demência na doença de Alzheimer de início tardio", + F002: "Demência na doença de Alzheimer, forma atípica ou mista", + F009: "Demência não especificada na doença de Alzheimer", + F01: "Demência vascular", + F010: "Demência vascular de início agudo", + F011: "Demência por infartos múltiplos", + F012: "Demência vascular subcortical", + F013: "Demência vascular mista, cortical e subcortical", + F018: "Outra demência vascular", + F019: "Demência vascular não especificada", + F02: "Demência em outras doenças classificadas em outra parte", + F020: "Demência da doença de Pick", + F021: "Demência na doença de Creutzfeldt-Jakob", + F022: "Demência na doença de Huntington", + F023: "Demência na doença de Parkinson", + F024: "Demência na doença pelo vírus da imunodeficiência humana [HIV]", + F028: "Demência em outras doenças especificadas classificadas em outra parte", + F03: "Demência não especificada", + F04: "Síndrome amnésica orgânica não induzida pelo álcool ou por outras substâncias psicoativas", + F05: "Delirium não induzido pelo álcool ou por outras substâncias psicoativas", + F050: "Delirium não superposto a uma demência, assim descrito", + F051: "Delirium superposto a uma demência", + F058: "Outro delirium", + F059: "Delirium não especificado", + F06: "Outros transtornos mentais devidos a lesão e disfunção cerebral e a doença física", + F060: "Alucinose orgânica", + F061: "Estado catatônico orgânico", + F062: "Transtorno delirante orgânico [tipo esquizofrênico]", + F063: "Transtornos do humor [afetivos] orgânicos", + F064: "Transtornos da ansiedade orgânicos", + F065: "Transtorno dissociativo orgânico", + F066: "Transtorno de labilidade emocional [astênico] orgânico", + F067: "Transtorno cognitivo leve", + F068: "Outros transtornos mentais especificados devidos a uma lesão e disfunção cerebral e a uma doença física", + F069: "Transtorno mental não especificado devido a uma lesão e disfunção cerebral e a uma doença física", + F07: "Transtornos de personalidade e do comportamento devidos a doença, a lesão e a disfunção cerebral", + F070: "Transtorno orgânico da personalidade", + F071: "Síndrome pós-encefalítica", + F072: "Síndrome pós-traumática", + F078: "Outros transtornos orgânicos da personalidade e do comportamento devidos a doença cerebral, lesão e disfunção", + F079: "Transtorno orgânico não especificado da personalidade e do comportamento devido a doença cerebral, lesão e disfunção", + F09: "Transtorno mental orgânico ou sintomático não especificado", + F10: "Transtornos mentais e comportamentais devidos ao uso de álcool", + F100: "Transtornos mentais e comportamentais devidos ao uso de álcool - intoxicação aguda", + F101: "Transtornos mentais e comportamentais devidos ao uso de álcool - uso nocivo para a saúde", + F102: "Transtornos mentais e comportamentais devidos ao uso de álcool - síndrome de dependência", + F103: "Transtornos mentais e comportamentais devidos ao uso de álcool - síndrome [estado] de abstinência", + F104: "Transtornos mentais e comportamentais devidos ao uso de álcool - síndrome de abstinência com delirium", + F105: "Transtornos mentais e comportamentais devidos ao uso de álcool - transtorno psicótico", + F106: "Transtornos mentais e comportamentais devidos ao uso de álcool - síndrome amnésica", + F107: "Transtornos mentais e comportamentais devidos ao uso de álcool - transtorno psicótico residual ou de instalação tardia", + F108: "Transtornos mentais e comportamentais devidos ao uso de álcool - outros transtornos mentais ou comportamentais", + F109: "Transtornos mentais e comportamentais devidos ao uso de álcool - transtorno mental ou comportamental não especificado", + F11: "Transtornos mentais e comportamentais devidos ao uso de opiáceos", + F110: "Transtornos mentais e comportamentais devidos ao uso de opiáceos - intoxicação aguda", + F111: "Transtornos mentais e comportamentais devidos ao uso de opiáceos - uso nocivo para a saúde", + F112: "Transtornos mentais e comportamentais devidos ao uso de opiáceos - síndrome de dependência", + F113: "Transtornos mentais e comportamentais devidos ao uso de opiáceos - síndrome [estado] de abstinência", + F114: "Transtornos mentais e comportamentais devidos ao uso de opiáceos - síndrome de abstinência com delirium", + F115: "Transtornos mentais e comportamentais devidos ao uso de opiáceos - transtorno psicótico", + F116: "Transtornos mentais e comportamentais devidos ao uso de opiáceos - síndrome amnésica", + F117: "Transtornos mentais e comportamentais devidos ao uso de opiáceos - transtorno psicótico residual ou de instalação tardia", + F118: "Transtornos mentais e comportamentais devidos ao uso de opiáceos - outros transtornos mentais ou comportamentais", + F119: "Transtornos mentais e comportamentais devidos ao uso de opiáceos - transtorno mental ou comportamental não especificado", + F12: "Transtornos mentais e comportamentais devidos ao uso de canabinóides", + F120: "Transtornos mentais e comportamentais devidos ao uso de canabinóides - intoxicação aguda", + F121: "Transtornos mentais e comportamentais devidos ao uso de canabinóides - uso nocivo para a saúde", + F122: "Transtornos mentais e comportamentais devidos ao uso de canabinóides - síndrome de dependência", + F123: "Transtornos mentais e comportamentais devidos ao uso de canabinóides - síndrome [estado] de abstinência", + F124: "Transtornos mentais e comportamentais devidos ao uso de canabinóides - síndrome de abstinência com delirium", + F125: "Transtornos mentais e comportamentais devidos ao uso de canabinóides - transtorno psicótico", + F126: "Transtornos mentais e comportamentais devidos ao uso de canabinóides - síndrome amnésica", + F127: "Transtornos mentais e comportamentais devidos ao uso de canabinóides - transtorno psicótico residual ou de instalação tardia", + F128: "Transtornos mentais e comportamentais devidos ao uso de canabinóides - outros transtornos mentais ou comportamentais", + F129: "Transtornos mentais e comportamentais devidos ao uso de canabinóides - transtorno mental ou comportamental não especificado", + F13: "Transtornos mentais e comportamentais devidos ao uso de sedativos e hipnóticos", + F130: "Transtornos mentais e comportamentais devidos ao uso de sedativos e hipnóticos - intoxicação aguda", + F131: "Transtornos mentais e comportamentais devidos ao uso de sedativos e hipnóticos - uso nocivo para a saúde", + F132: "Transtornos mentais e comportamentais devidos ao uso de sedativos e hipnóticos - síndrome de dependência", + F133: "Transtornos mentais e comportamentais devidos ao uso de sedativos e hipnóticos - síndrome [estado] de abstinência", + F134: "Transtornos mentais e comportamentais devidos ao uso de sedativos e hipnóticos - síndrome de abstinência com delirium", + F135: "Transtornos mentais e comportamentais devidos ao uso de sedativos e hipnóticos - transtorno psicótico", + F136: "Transtornos mentais e comportamentais devidos ao uso de sedativos e hipnóticos - síndrome amnésica", + F137: "Transtornos mentais e comportamentais devidos ao uso de sedativos e hipnóticos - transtorno psicótico residual ou de instalação tardia", + F138: "Transtornos mentais e comportamentais devidos ao uso de sedativos e hipnóticos - outros transtornos mentais ou comportamentais", + F139: "Transtornos mentais e comportamentais devidos ao uso de sedativos e hipnóticos - transtorno mental ou comportamental não especificado", + F14: "Transtornos mentais e comportamentais devidos ao uso da cocaína", + F140: "Transtornos mentais e comportamentais devidos ao uso da cocaína - intoxicação aguda", + F141: "Transtornos mentais e comportamentais devidos ao uso da cocaína - uso nocivo para a saúde", + F142: "Transtornos mentais e comportamentais devidos ao uso da cocaína - síndrome de dependência", + F143: "Transtornos mentais e comportamentais devidos ao uso da cocaína - síndrome [estado] de abstinência", + F144: "Transtornos mentais e comportamentais devidos ao uso da cocaína - síndrome de abstinência com delirium", + F145: "Transtornos mentais e comportamentais devidos ao uso da cocaína - transtorno psicótico", + F146: "Transtornos mentais e comportamentais devidos ao uso da cocaína - síndrome amnésica", + F147: "Transtornos mentais e comportamentais devidos ao uso da cocaína - transtorno psicótico residual ou de instalação tardia", + F148: "Transtornos mentais e comportamentais devidos ao uso da cocaína - outros transtornos mentais ou comportamentais", + F149: "Transtornos mentais e comportamentais devidos ao uso da cocaína - transtorno mental ou comportamental não especificado", + F15: "Transtornos mentais e comportamentais devidos ao uso de outros estimulantes, inclusive a cafeína", + F150: "Transtornos mentais e comportamentais devidos ao uso de outros estimulantes, inclusive a cafeína - intoxicação aguda", + F151: "Transtornos mentais e comportamentais devidos ao uso de outros estimulantes, inclusive a cafeína - uso nocivo para a saúde", + F152: "Transtornos mentais e comportamentais devidos ao uso de outros estimulantes, inclusive a cafeína - síndrome de dependência", + F153: "Transtornos mentais e comportamentais devidos ao uso de outros estimulantes, inclusive a cafeína - síndrome [estado] de abstinência", + F154: "Transtornos mentais e comportamentais devidos ao uso de outros estimulantes, inclusive a cafeína - síndrome de abstinência com delirium", + F155: "Transtornos mentais e comportamentais devidos ao uso de outros estimulantes, inclusive a cafeína - transtorno psicótico", + F156: "Transtornos mentais e comportamentais devidos ao uso de outros estimulantes, inclusive a cafeína - síndrome amnésica", + F157: "Transtornos mentais e comportamentais devidos ao uso de outros estimulantes, inclusive a cafeína - transtorno psicótico residual ou de instalação tardia", + F158: "Transtornos mentais e comportamentais devidos ao uso de outros estimulantes, inclusive a cafeína - outros transtornos mentais ou comportamentais", + F159: "Transtornos mentais e comportamentais devidos ao uso de outros estimulantes, inclusive a cafeína - transtorno mental ou comportamental não especificado", + F16: "Transtornos mentais e comportamentais devidos ao uso de alucinógenos", + F160: "Transtornos mentais e comportamentais devidos ao uso de alucinógenos - intoxicação aguda", + F161: "Transtornos mentais e comportamentais devidos ao uso de alucinógenos - uso nocivo para a saúde", + F162: "Transtornos mentais e comportamentais devidos ao uso de alucinógenos - síndrome de dependência", + F163: "Transtornos mentais e comportamentais devidos ao uso de alucinógenos - síndrome [estado] de abstinência", + F164: "Transtornos mentais e comportamentais devidos ao uso de alucinógenos - síndrome de abstinência com delirium", + F165: "Transtornos mentais e comportamentais devidos ao uso de alucinógenos - transtorno psicótico", + F166: "Transtornos mentais e comportamentais devidos ao uso de alucinógenos - síndrome amnésica", + F167: "Transtornos mentais e comportamentais devidos ao uso de alucinógenos - transtorno psicótico residual ou de instalação tardia", + F168: "Transtornos mentais e comportamentais devidos ao uso de alucinógenos - outros transtornos mentais ou comportamentais", + F169: "Transtornos mentais e comportamentais devidos ao uso de alucinógenos - transtorno mental ou comportamental não especificado", + F17: "Transtornos mentais e comportamentais devidos ao uso de fumo", + F170: "Transtornos mentais e comportamentais devidos ao uso de fumo - intoxicação aguda", + F171: "Transtornos mentais e comportamentais devidos ao uso de fumo - uso nocivo para a saúde", + F172: "Transtornos mentais e comportamentais devidos ao uso de fumo - síndrome de dependência", + F173: "Transtornos mentais e comportamentais devidos ao uso de fumo - síndrome [estado] de abstinência", + F174: "Transtornos mentais e comportamentais devidos ao uso de fumo - síndrome de abstinência com delirium", + F175: "Transtornos mentais e comportamentais devidos ao uso de fumo - transtorno psicótico", + F176: "Transtornos mentais e comportamentais devidos ao uso de fumo - síndrome amnésica", + F177: "Transtornos mentais e comportamentais devidos ao uso de fumo - transtorno psicótico residual ou de instalação tardia", + F178: "Transtornos mentais e comportamentais devidos ao uso de fumo - outros transtornos mentais ou comportamentais", + F179: "Transtornos mentais e comportamentais devidos ao uso de fumo - transtorno mental ou comportamental não especificado", + F18: "Transtornos mentais e comportamentais devidos ao uso de solventes voláteis", + F180: "Transtornos mentais e comportamentais devidos ao uso de solventes voláteis - intoxicação aguda", + F181: "Transtornos mentais e comportamentais devidos ao uso de solventes voláteis - uso nocivo para a saúde", + F182: "Transtornos mentais e comportamentais devidos ao uso de solventes voláteis - síndrome de dependência", + F183: "Transtornos mentais e comportamentais devidos ao uso de solventes voláteis - síndrome [estado] de abstinência", + F184: "Transtornos mentais e comportamentais devidos ao uso de solventes voláteis - síndrome de abstinência com delirium", + F185: "Transtornos mentais e comportamentais devidos ao uso de solventes voláteis - transtorno psicótico", + F186: "Transtornos mentais e comportamentais devidos ao uso de solventes voláteis - síndrome amnésica", + F187: "Transtornos mentais e comportamentais devidos ao uso de solventes voláteis - transtorno psicótico residual ou de instalação tardia", + F188: "Transtornos mentais e comportamentais devidos ao uso de solventes voláteis - outros transtornos mentais ou comportamentais", + F189: "Transtornos mentais e comportamentais devidos ao uso de solventes voláteis - transtorno mental ou comportamental não especificado", + F19: "Transtornos mentais e comportamentais devidos ao uso de múltiplas drogas e ao uso de outras substâncias psicoativas", + F190: "Transtornos mentais e comportamentais devidos ao uso de múltiplas drogas e ao uso de outras substâncias psicoativas - intoxicação aguda", + F191: "Transtornos mentais e comportamentais devidos ao uso de múltiplas drogas e ao uso de outras substâncias psicoativas - uso nocivo para a saúde", + F192: "Transtornos mentais e comportamentais devidos ao uso de múltiplas drogas e ao uso de outras substâncias psicoativas - síndrome de dependência", + F193: "Transtornos mentais e comportamentais devidos ao uso de múltiplas drogas e ao uso de outras substâncias psicoativas - síndrome [estado] de abstinência", + F194: "Transtornos mentais e comportamentais devidos ao uso de múltiplas drogas e ao uso de outras substâncias psicoativas - síndrome de abstinência com delirium", + F195: "Transtornos mentais e comportamentais devidos ao uso de múltiplas drogas e ao uso de outras substâncias psicoativas - transtorno psicótico", + F196: "Transtornos mentais e comportamentais devidos ao uso de múltiplas drogas e ao uso de outras substâncias psicoativas - síndrome amnésica", + F197: "Transtornos mentais e comportamentais devidos ao uso de múltiplas drogas e ao uso de outras substâncias psicoativas - transtorno psicótico residual ou de instalação tardia", + F198: "Transtornos mentais e comportamentais devidos ao uso de múltiplas drogas e ao uso de outras substâncias psicoativas - outros transtornos mentais ou comportamentais", + F199: "Transtornos mentais e comportamentais devidos ao uso de múltiplas drogas e ao uso de outras substâncias psicoativas - transtorno mental ou comportamental não especificado", + F20: "Esquizofrenia", + F200: "Esquizofrenia paranóide", + F201: "Esquizofrenia hebefrênica", + F202: "Esquizofrenia catatônica", + F203: "Esquizofrenia indiferenciada", + F204: "Depressão pós-esquizofrênica", + F205: "Esquizofrenia residual", + F206: "Esquizofrenia simples", + F208: "Outras esquizofrenias", + F209: "Esquizofrenia não especificada", + F21: "Transtorno esquizotípico", + F22: "Transtornos delirantes persistentes", + F220: "Transtorno delirante", + F228: "Outros transtornos delirantes persistentes", + F229: "Transtorno delirante persistente não especificado", + F23: "Transtornos psicóticos agudos e transitórios", + F230: "Transtorno psicótico agudo polimorfo, sem sintomas esquizofrênicos", + F231: "Transtorno psicótico agudo polimorfo, com sintomas esquizofrênicos", + F232: "Transtorno psicótico agudo de tipo esquizofrênico (schizophrenia-like)", + F233: "Outros transtornos psicóticos agudos, essencialmente delirantes", + F238: "Outros transtornos psicóticos agudos e transitórios", + F239: "Transtorno psicótico agudo e transitório não especificado", + F24: "Transtorno delirante induzido", + F25: "Transtornos esquizoafetivos", + F250: "Transtorno esquizoafetivo do tipo maníaco", + F251: "Transtorno esquizoafetivo do tipo depressivo", + F252: "Transtorno esquizoafetivo do tipo misto", + F258: "Outros transtornos esquizoafetivos", + F259: "Transtorno esquizoafetivo não especificado", + F28: "Outros transtornos psicóticos não-orgânicos", + F29: "Psicose não-orgânica não especificada", + F30: "Episódio maníaco", + F300: "Hipomania", + F301: "Mania sem sintomas psicóticos", + F302: "Mania com sintomas psicóticos", + F308: "Outros episódios maníacos", + F309: "Episódio maníaco não especificado", + F31: "Transtorno afetivo bipolar", + F310: "Transtorno afetivo bipolar, episódio atual hipomaníaco", + F311: "Transtorno afetivo bipolar, episódio atual maníaco sem sintomas psicóticos", + F312: "Transtorno afetivo bipolar, episódio atual maníaco com sintomas psicóticos", + F313: "Transtorno afetivo bipolar, episódio atual depressivo leve ou moderado", + F314: "Transtorno afetivo bipolar, episódio atual depressivo grave sem sintomas psicóticos", + F315: "Transtorno afetivo bipolar, episódio atual depressivo grave com sintomas psicóticos", + F316: "Transtorno afetivo bipolar, episódio atual misto", + F317: "Transtorno afetivo bipolar, atualmente em remissão", + F318: "Outros transtornos afetivos bipolares", + F319: "Transtorno afetivo bipolar não especificado", + F32: "Episódios depressivos", + F320: "Episódio depressivo leve", + F321: "Episódio depressivo moderado", + F322: "Episódio depressivo grave sem sintomas psicóticos", + F323: "Episódio depressivo grave com sintomas psicóticos", + F328: "Outros episódios depressivos", + F329: "Episódio depressivo não especificado", + F33: "Transtorno depressivo recorrente", + F330: "Transtorno depressivo recorrente, episódio atual leve", + F331: "Transtorno depressivo recorrente, episódio atual moderado", + F332: "Transtorno depressivo recorrente, episódio atual grave sem sintomas psicóticos", + F333: "Transtorno depressivo recorrente, episódio atual grave com sintomas psicóticos", + F334: "Transtorno depressivo recorrente, atualmente em remissão", + F338: "Outros transtornos depressivos recorrentes", + F339: "Transtorno depressivo recorrente sem especificação", + F34: "Transtornos de humor [afetivos] persistentes", + F340: "Ciclotimia", + F341: "Distimia", + F348: "Outros transtornos do humor [afetivos] persistentes", + F349: "Transtorno do humor [afetivo] persistente não especificado", + F38: "Outros transtornos do humor [afetivos]", + F380: "Outros transtornos do humor [afetivos] isolados", + F381: "Outros transtornos do humor [afetivos] recorrentes", + F388: "Outros transtornos especificados do humor [afetivos]", + F39: "Transtorno do humor [afetivo] não especificado", + F40: "Transtornos fóbico-ansiosos", + F400: "Agorafobia", + F401: "Fobias sociais", + F402: "Fobias específicas (isoladas)", + F408: "Outros transtornos fóbico-ansiosos", + F409: "Transtorno fóbico-ansioso não especificado", + F41: "Outros transtornos ansiosos", + F410: "Transtorno de pânico [ansiedade paroxística episódica]", + F411: "Ansiedade generalizada", + F412: "Transtorno misto ansioso e depressivo", + F413: "Outros transtornos ansiosos mistos", + F418: "Outros transtornos ansiosos especificados", + F419: "Transtorno ansioso não especificado", + F42: "Transtorno obsessivo-compulsivo", + F420: "Transtorno obsessivo-compulsivo com predominância de idéias ou de ruminações obsessivas", + F421: "Transtorno obsessivo-compulsivo com predominância de comportamentos compulsivos [rituais obsessivos]", + F422: "Transtorno obsessivo-compulsivo, forma mista, com idéias obsessivas e comportamentos compulsivos", + F428: "Outros transtornos obsessivo-compulsivos", + F429: "Transtorno obsessivo-compulsivo não especificado", + F43: 'Reações ao "stress" grave e transtornos de adaptação', + F430: 'Reação aguda ao "stress"', + F431: 'Estado de "stress" pós-traumático', + F432: "Transtornos de adaptação", + F438: 'Outras reações ao "stress" grave', + F439: 'Reação não especificada a um "stress" grave', + F44: "Transtornos dissociativos [de conversão]", + F440: "Amnésia dissociativa", + F441: "Fuga dissociativa", + F442: "Estupor dissociativo", + F443: "Estados de transe e de possessão", + F444: "Transtornos dissociativos do movimento", + F445: "Convulsões dissociativas", + F446: "Anestesia e perda sensorial dissociativas", + F447: "Transtorno dissociativo misto [de conversão]", + F448: "Outros transtornos dissociativos [de conversão]", + F449: "Transtorno dissociativo [de conversão] não especificado", + F45: "Transtornos somatoformes", + F450: "Transtorno de somatização", + F451: "Transtorno somatoforme indiferenciado", + F452: "Transtorno hipocondríaco", + F453: "Transtorno neurovegetativo somatoforme", + F454: "Transtorno doloroso somatoforme persistente", + F458: "Outros transtornos somatoformes", + F459: "Transtorno somatoforme não especificado", + F48: "Outros transtornos neuróticos", + F480: "Neurastenia", + F481: "Síndrome de despersonalização-desrealização", + F488: "Outros transtornos neuróticos especificados", + F489: "Transtorno neurótico não especificado", + F50: "Transtornos da alimentação", + F500: "Anorexia nervosa", + F501: "Anorexia nervosa atípica", + F502: "Bulimia nervosa", + F503: "Bulimia nervosa atípica", + F504: "Hiperfagia associada a outros distúrbios psicológicos", + F505: "Vômitos associados a outros distúrbios psicológicos", + F508: "Outros transtornos da alimentação", + F509: "Transtorno de alimentação não especificado", + F51: "Transtornos não-orgânicos do sono devidos a fatores emocionais", + F510: "Insônia não-orgânica", + F511: "Hipersonia não-orgânica", + F512: "Transtorno do ciclo vigília-sono devido a fatores não-orgânicos", + F513: "Sonambulismo", + F514: "Terrores noturnos", + F515: "Pesadelos", + F518: "Outros transtornos do sono devidos a fatores não-orgânicos", + F519: "Transtorno do sono devido a fatores não-orgânicos não especificados", + F52: "Disfunção sexual, não causada por transtorno ou doença orgânica", + F520: "Ausência ou perda do desejo sexual", + F521: "Aversão sexual e ausência de prazer sexual", + F522: "Falha de resposta genital", + F523: "Disfunção orgásmica", + F524: "Ejaculação precoce", + F525: "Vaginismo não-orgânico", + F526: "Dispareunia não-orgânica", + F527: "Apetite sexual excessivo", + F528: "Outras disfunções sexuais não devidas a transtorno ou à doença orgânica", + F529: "Disfunção sexual não devida a transtorno ou à doença orgânica, não especificada", + F53: "Transtornos mentais e comportamentais associados ao puerpério, não classificados em outra parte", + F530: "Transtornos mentais e comportamentais leves associados ao puerpério não classificados em outra parte", + F531: "Transtornos mentais e comportamentais graves associados ao puerpério não classificados em outra parte", + F538: "Outros transtornos mentais e comportamentais associados ao puerpério não classificados em outra parte", + F539: "Transtorno mental e comportamental associado ao puerpério, não especificado", + F54: "Fatores psicológicos ou comportamentais associados a doença ou a transtornos classificados em outra parte", + F55: "Abuso de substâncias que não produzem dependência", + F59: "Síndromes comportamentais associados a transtornos das funções fisiológicas e a fatores físicos, não especificadas", + F60: "Transtornos específicos da personalidade", + F600: "Personalidade paranóica", + F601: "Personalidade esquizóide", + F602: "Personalidade dissocial", + F603: "Transtorno de personalidade com instabilidade emocional", + F604: "Personalidade histriônica", + F605: "Personalidade anancástica", + F606: "Personalidade ansiosa [esquiva]", + F607: "Personalidade dependente", + F608: "Outros transtornos específicos da personalidade", + F609: "Transtorno não especificado da personalidade", + F61: "Transtornos mistos da personalidade e outros transtornos da personalidade", + F62: "Modificações duradouras da personalidade não atribuíveis a lesão ou doença cerebral", + F620: "Modificação duradoura da personalidade após uma experiência catastrófica", + F621: "Modificação duradoura da personalidade após doença psiquiátrica", + F628: "Outras modificações duradouras da personalidade", + F629: "Modificação duradoura da personalidade, não especificada", + F63: "Transtornos dos hábitos e dos impulsos", + F630: "Jogo patológico", + F631: "Piromania", + F632: "Roubo patológico [cleptomania]", + F633: "Tricotilomania", + F638: "Outros transtornos dos hábitos e dos impulsos", + F639: "Transtorno dos hábitos e impulsos, não especificado", + F64: "Transtornos da identidade sexual", + F640: "Transexualismo", + F641: "Travestismo bivalente", + F642: "Transtorno de identidade sexual na infância", + F648: "Outros transtornos da identidade sexual", + F649: "Transtorno não especificado da identidade sexual", + F65: "Transtornos da preferência sexual", + F650: "Fetichismo", + F651: "Travestismo fetichista", + F652: "Exibicionismo", + F653: "Voyeurismo", + F654: "Pedofilia", + F655: "Sadomasoquismo", + F656: "Transtornos múltiplos da preferência sexual", + F658: "Outros transtornos da preferência sexual", + F659: "Transtorno da preferência sexual, não especificado", + F66: "Transtornos psicológicos e comportamentais associados ao desenvolvimento sexual e à sua orientação", + F660: "Transtorno da maturação sexual", + F661: "Orientação sexual egodistônica", + F662: "Transtorno do relacionamento sexual", + F668: "Outros transtornos do desenvolvimento psicossexual", + F669: "Transtorno do desenvolvimento sexual, não especificado", + F68: "Outros transtornos da personalidade e do comportamento do adulto", + F680: "Sintomas físicos aumentados por fatores psicológicos", + F681: "Produção deliberada ou simulação de sintomas ou de incapacidades, físicas ou psicológicas [transtorno fictício]", + F688: "Outros transtornos especificados da personalidade e do comportamento do adulto", + F69: "Transtorno da personalidade e do comportamento do adulto, não especificado", + F70: "Retardo mental leve", + F700: "Retardo mental leve - menção de ausência de ou de comprometimento mínimo do comportamento", + F701: "Retardo mental leve - comprometimento significativo do comportamento, requerendo vigilância ou tratamento", + F708: "Retardo mental leve - outros comprometimentos do comportamento", + F709: "Retardo mental leve - sem menção de comprometimento do comportamento", + F71: "Retardo mental moderado", + F710: "Retardo mental moderado - menção de ausência de ou de comprometimento mínimo do comportamento", + F711: "Retardo mental moderado - comprometimento significativo do comportamento, requerendo vigilância ou tratamento", + F718: "Retardo mental moderado - outros comprometimentos do comportamento", + F719: "Retardo mental moderado - sem menção de comprometimento do comportamento", + F72: "Retardo mental grave", + F720: "Retardo mental grave - menção de ausência de ou de comprometimento mínimo do comportamento", + F721: "Retardo mental grave - comprometimento significativo do comportamento, requerendo vigilância ou tratamento", + F728: "Retardo mental grave - outros comprometimentos do comportamento", + F729: "Retardo mental grave - sem menção de comprometimento do comportamento", + F73: "Retardo mental profundo", + F730: "Retardo mental profundo - menção de ausência de ou de comprometimento mínimo do comportamento", + F731: "Retardo mental profundo - comprometimento significativo do comportamento, requerendo vigilância ou tratamento", + F738: "Retardo mental profundo - outros comprometimentos do comportamento", + F739: "Retardo mental profundo - sem menção de comprometimento do comportamento", + F78: "Outro retardo mental", + F780: "Outro retardo mental - menção de ausência de ou de comprometimento mínimo do comportamento", + F781: "Outro retardo mental - comprometimento significativo do comportamento, requerendo vigilância ou tratamento", + F788: "Outro retardo mental - outros comprometimentos do comportamento", + F789: "Outro retardo mental - sem menção de comprometimento do comportamento", + F79: "Retardo mental não especificado", + F790: "Retardo mental não especificado - menção de ausência de ou de comprometimento mínimo do comportamento", + F791: "Retardo mental não especificado - comprometimento significativo do comportamento, requerendo vigilância ou tratamento", + F798: "Retardo mental não especificado - outros comprometimentos do comportamento", + F799: "Retardo mental não especificado - sem menção de comprometimento do comportamento", + F80: "Transtornos específicos do desenvolvimento da fala e da linguagem", + F800: "Transtorno específico da articulação da fala", + F801: "Transtorno expressivo de linguagem", + F802: "Transtorno receptivo da linguagem", + F803: "Afasia adquirida com epilepsia [síndrome de Landau-Kleffner]", + F808: "Outros transtornos de desenvolvimento da fala ou da linguagem", + F809: "Transtorno não especificado do desenvolvimento da fala ou da linguagem", + F81: "Transtornos específicos do desenvolvimento das habilidades escolares", + F810: "Transtorno específico de leitura", + F811: "Transtorno específico da soletração", + F812: "Transtorno específico da habilidade em aritmética", + F813: "Transtorno misto de habilidades escolares", + F818: "Outros transtornos do desenvolvimento das habilidades escolares", + F819: "Transtorno não especificado do desenvolvimento das habilidades escolares", + F82: "Transtorno específico do desenvolvimento motor", + F83: "Transtornos específicos misto do desenvolvimento", + F84: "Transtornos globais do desenvolvimento", + F840: "Autismo infantil", + F841: "Autismo atípico", + F842: "Síndrome de Rett", + F843: "Outro transtorno desintegrativo da infância", + F844: "Transtorno com hipercinesia associada a retardo mental e a movimentos estereotipados", + F845: "Síndrome de Asperger", + F848: "Outros transtornos globais do desenvolvimento", + F849: "Transtornos globais não especificados do desenvolvimento", + F88: "Outros transtornos do desenvolvimento psicológico", + F89: "Transtorno do desenvolvimento psicológico não especificado", + F90: "Transtornos hipercinéticos", + F900: "Distúrbios da atividade e da atenção", + F901: "Transtorno hipercinético de conduta", + F908: "Outros transtornos hipercinéticos", + F909: "Transtorno hipercinético não especificado", + F91: "Distúrbios de conduta", + F910: "Distúrbio de conduta restrito ao contexto familiar", + F911: "Distúrbio de conduta não-socializado", + F912: "Distúrbio de conduta do tipo socializado", + F913: "Distúrbio desafiador e de oposição", + F918: "Outros transtornos de conduta", + F919: "Transtorno de conduta não especificado", + F92: "Transtornos mistos de conduta e das emoções", + F920: "Distúrbio depressivo de conduta", + F928: "Outros transtornos mistos da conduta e das emoções", + F929: "Transtorno misto da conduta e das emoções não especificado", + F93: "Transtornos emocionais com início especificamente na infância", + F930: "Transtorno ligado à angústia de separação", + F931: "Transtorno fóbico ansioso da infância", + F932: "Distúrbio de ansiedade social da infância", + F933: "Transtorno de rivalidade entre irmãos", + F938: "Outros transtornos emocionais da infância", + F939: "Transtorno emocional da infância não especificado", + F94: "Transtornos do funcionamento social com início especificamente durante a infância ou a adolescência", + F940: "Mutismo eletivo", + F941: "Distúrbio reativo de vinculação da infância", + F942: "Transtorno de fixação da infância, com desinibição", + F948: "Outros transtornos do funcionamento social na infância", + F949: "Transtorno do funcionamento social da infância não especificado", + F95: "Tiques", + F950: "Tique transitório", + F951: "Tique motor ou vocal crônico", + F952: "Tiques vocais e motores múltiplos combinados [doença de Gilles de la Tourette]", + F958: "Outros tiques", + F959: "Tique não especificado", + F98: "Outros transtornos comportamentais e emocionais com início habitualmente durante a infância ou a adolescência", + F980: "Enurese de origem não-orgânica", + F981: "Encoprese de origem não-orgânica", + F982: "Transtorno de alimentação na infância", + F983: "Pica do lactente ou da criança", + F984: "Estereotipias motoras", + F985: "Gagueira [tartamudez]", + F986: "Linguagem precipitada", + F988: "Outros transtornos comportamentais e emocionais especificados com início habitualmente na infância ou adolescência", + F989: "Transtornos comportamentais e emocionais não especificados com início habitualmente na infância ou adolescência", + F99: "Transtorno mental não especificado em outra parte", + G00: "Meningite bacteriana não classificada em outra parte", + G000: "Meningite por Haemophilus", + G001: "Meningite pneumocócica", + G002: "Meningite estreptocócica", + G003: "Meningite estafilocócica", + G008: "Outras meningites bacterianas", + G009: "Meningite bacteriana não especificada", + G01: "Meningite em doenças bacterianas classificadas em outra parte", + G02: "Meningite em outras doenças infecciosas e parasitárias classificadas em outra parte", + G020: "Meningite em doenças virais classificadas em outra parte", + G021: "Meningite em micoses", + G028: "Meningite em outras doenças infecciosas e parasitárias classificadas em outra parte", + G03: "Meningite devida a outras causas e a causas não especificadas", + G030: "Meningite não-piogênica", + G031: "Meningite crônica", + G032: "Meningite recorrente benigna [Mollaret]", + G038: "Meningite devida a outras causas especificadas", + G039: "Meningite não especificada", + G04: "Encefalite, mielite e encefalomielite", + G040: "Encefalite aguda disseminada", + G041: "Paraplegia espástica tropical", + G042: "Meningoencefalite e meningomielite bacterianas não classificadas em outra parte", + G048: "Outras encefalites, mielites e encefalomielites", + G049: "Encefalite, mielite e encefalomielite não especificada", + G05: "Encefalite, mielite e encefalomielite em doenças classificadas em outra parte", + G050: "Encefalite, mielite e encefalomielite em doenças bacterianas classificadas em outra parte", + G051: "Encefalite, mielite e encefalomielite em doenças virais classificadas em outra parte", + G052: "Encefalite, mielite e encefalomielite em outras doenças infecciosas e parasitárias classificadas em outra parte", + G058: "Encefalite, mielite e encefalomielite em outras doenças classificadas em outra parte", + G06: "Abscesso e granuloma intracranianos e intra-raquidianos", + G060: "Abscesso e granuloma intracranianos", + G061: "Abscesso e granuloma intra-raquidianos", + G062: "Abscesso extradural e subdural não especificados", + G07: "Abscesso e granuloma intracranianos e intraspinais em doenças classificadas em outra parte", + G08: "Flebite e tromboflebite intracranianas e intra-raquidianas", + G09: "Seqüelas de doenças inflamatórias do sistema nervoso central", + G10: "Doença de Huntington", + G11: "Ataxia hereditária", + G110: "Ataxia congênita não-progressiva", + G111: "Ataxia cerebelar de início precoce", + G112: "Ataxia cerebelar de início tardio", + G113: "Ataxia cerebelar com déficit na reparação do DNA", + G114: "Paraplegia espástica hereditária", + G118: "Outras ataxias hereditárias", + G119: "Ataxia hereditária não especificada", + G12: "Atrofia muscular espinal e síndromes correlatas", + G120: "Atrofia muscular espinal infantil tipo I [Werdnig-Hoffman]", + G121: "Outras atrofias musculares espinais hereditárias", + G122: "Doença do neurônio motor", + G128: "Outras atrofias musculares espinais e síndromes musculares correlatas", + G129: "Atrofia muscular espinal não especificada", + G13: "Atrofias sistêmicas que afetam principalmente o sistema nervoso central em doenças classificadas em outra parte", + G130: "Neuromiopatia e neuropatia paraneoplásicas", + G131: "Outra atrofia sistêmica que afeta primariamente o sistema nervoso central em doenças neoplásicas", + G132: "Atrofia sistêmica que afeta primariamente o sistema nervoso central no mixedema", + G138: "Atrofia sistêmica que afeta primariamente o sistema nervoso central em outras doenças classificadas em outra parte", + G20: "Doença de Parkinson", + G21: "Parkinsonismo secundário", + G210: "Síndrome maligna dos neurolépticos", + G211: "Outras formas de parkinsonismo secundário induzido por drogas", + G212: "Parkinsonismo secundário devido a outros agentes externos", + G213: "Parkinsonismo pós-encefalítico", + G218: "Outras formas de parkinsonismo secundário", + G219: "Parkinsonismo secundário não especificado", + G22: "Parkinsonismo em doenças classificadas em outra parte", + G23: "Outras doenças degenerativas dos gânglios da base", + G230: "Doença de Hallervorden-Spatz", + G231: "Oftalmoplegia supranuclear progressiva [Steele-Richardson-Olszewski]", + G232: "Degeneração estrionígrica", + G238: "Outras doenças degenerativas especificadas dos gânglios da base", + G239: "Doença degenerativa dos gânglios da base, não especificada", + G24: "Distonia", + G240: "Distonia induzida por drogas", + G241: "Distonia familiar idiopática", + G242: "Distonia não-familiar idiopática", + G243: "Torcicolo espasmódico", + G244: "Distonia orofacial idiopática", + G245: "Blefaroespasmo", + G248: "Outras distonias", + G249: "Distonia não especificada", + G25: "Outras doenças extrapiramidais e transtornos dos movimentos", + G250: "Tremor essencial", + G251: "Tremor induzido por drogas", + G252: "Outras formas especificadas de tremor", + G253: "Mioclonia", + G254: "Coréia induzida por droga", + G255: "Outras formas de coréia", + G256: "Tiques induzidos por droga e outros tipos de origem orgânica", + G258: "Outras doenças extrapiramidais e transtornos dos movimentos, especificados", + G259: "Doenças extrapiramidais e transtornos dos movimentos, não especificados", + G26: "Doenças extrapiramidais e transtornos dos movimentos em doenças classificadas em outra parte", + G30: "Doença de Alzheimer", + G300: "Doença de Alzheimer de início precoce", + G301: "Doença de Alzheimer de início tardio", + G308: "Outras formas de doença de Alzheimer", + G309: "Doença de Alzheimer não especificada", + G31: "Outras doenças degenerativas do sistema nervoso não classificadas em outra parte", + G310: "Atrofia cerebral circunscrita", + G311: "Degeneração cerebral senil, não classificadas em outra parte", + G312: "Degeneração do sistema nervoso devida ao álcool", + G318: "Outras doenças degenerativas especificadas do sistema nervoso", + G319: "Doença degenerativa do sistema nervoso, não especificada", + G32: "Outros transtornos degenerativos do sistema nervoso em doenças classificadas em outra parte", + G320: "Degeneração combinada subaguda da medula espinal em doenças classificadas em outra parte", + G328: "Outros transtornos degenerativos especificados do sistema nervoso em doenças classificadas em outra parte", + G35: "Esclerose múltipla", + G36: "Outras desmielinizações disseminadas agudas", + G360: "Neuromielite óptica [doença de Devic]", + G361: "Leucoencefalite hemorrágica aguda e subaguda [Hurst]", + G368: "Outras desmielinizações disseminadas agudas especificadas", + G369: "Desmielinização disseminada aguda não especificada", + G37: "Outras doenças desmielinizantes do sistema nervoso central", + G370: "Esclerose difusa", + G371: "Desmielinização central do corpo caloso", + G372: "Mielinólise central da ponte", + G373: "Mielite transversa aguda em doenças desmielinizantes do sistema nervoso central", + G374: "Mielite subaguda necrótica", + G375: "Esclerose concêntrica [Baló]", + G378: "Outras doenças desmielinizantes especificadas do sistema nervoso central", + G379: "Doença desmielinizante do sistema nervoso central, não especificada", + G40: "Epilepsia", + G400: "Epilepsia e síndromes epilépticas idiopáticas definidas por sua localização (focal) (parcial) com crises de início focal", + G401: "Epilepsia e síndromes epilépticas sintomáticas definidas por sua localização (focal) (parcial) com crises parciais simples", + G402: "Epilepsia e síndromes epilépticas sintomáticas definidas por sua localização (focal) (parcial) com crises parciais complexas", + G403: "Epilepsia e síndromes epilépticas generalizadas idiopáticas", + G404: "Outras epilepsias e síndromes epilépticas generalizadas", + G405: "Síndromes epilépticas especiais", + G406: "Crise de grande mal, não especificada (com ou sem pequeno mal)", + G407: "Pequeno mal não especificado, sem crises de grande mal", + G408: "Outras epilepsias", + G409: "Epilepsia, não especificada", + G41: "Estado de mal epiléptico", + G410: "Estado de grande mal epiléptico", + G411: "Estado de pequeno mal epiléptico", + G412: "Estado de mal epiléptico parcial complexo", + G418: "Outros estados de mal epiléptico", + G419: "Estado de mal epiléptico, não especificado", + G43: "Enxaqueca", + G430: "Enxaqueca sem aura [enxaqueca comum]", + G431: "Enxaqueca com aura [enxaqueca clássica]", + G432: "Estado de mal enxaquecoso", + G433: "Enxaqueca complicada", + G438: "Outras formas de enxaqueca", + G439: "Enxaqueca, sem especificação", + G44: "Outras síndromes de algias cefálicas", + G440: 'Síndrome de "cluster-headache"', + G441: "Cefaléia vascular, não classificada em outra parte", + G442: "Cefaléia tensional", + G443: "Cefaléia crônica pós-traumática", + G444: "Cefaléia induzida por drogas, não classificada em outra parte", + G448: "Outras síndromes de cefaléia especificadas", + G45: "Acidentes vasculares cerebrais isquêmicos transitórios e síndromes correlatas", + G450: "Síndrome da artéria vértebro-basilar", + G451: "Síndrome da artéria carotídea (hemisférica)", + G452: "Síndrome das artérias pré-cerebrais, múltiplas e bilaterais", + G453: "Amaurose fugaz", + G454: "Amnésia global transitória", + G458: "Outros acidentes isquêmicos cerebrais transitórios e síndromes correlatas", + G459: "Isquemia cerebral transitória não especificada", + G46: "Síndromes vasculares cerebrais que ocorrem em doenças cerebrovasculares", + G460: "Síndrome da artéria cerebral média", + G461: "Síndrome da artéria cerebral anterior", + G462: "Síndrome da artéria cerebral posterior", + G463: "Síndromes vasculares do tronco cerebral", + G464: "Síndrome vascular cerebelar", + G465: "Síndrome lacunar motora pura", + G466: "Síndrome lacunar sensorial pura", + G467: "Outras síndromes lacunares", + G468: "Outras síndromes vasculares cerebrais em doenças cerebrovasculares", + G47: "Distúrbios do sono", + G470: "Distúrbios do início e da manutenção do sono [insônias]", + G471: "Distúrbios do sono por sonolência excessiva [hipersonia]", + G472: "Distúrbios do ciclo vigília-sono", + G473: "Apnéia de sono", + G474: "Narcolepsia e cataplexia", + G478: "Outros distúrbios do sono", + G479: "Distúrbio do sono, não especificado", + G50: "Transtornos do nervo trigêmeo", + G500: "Nevralgia do trigêmeo", + G501: "Dor facial atípica", + G508: "Outros transtornos do nervo trigêmeo", + G509: "Transtorno não especificado do nervo trigêmeo", + G51: "Transtornos do nervo facial", + G510: "Paralisia de Bell", + G511: "Ganglionite geniculada", + G512: "Síndrome de Melkersson", + G513: "Espasmo hemifacial clônico", + G514: "Mioquimia facial", + G518: "Outros transtornos do nervo facial", + G519: "Transtorno não especificado do nervo facial", + G52: "Transtornos de outros nervos cranianos", + G520: "Transtornos do nervo olfatório", + G521: "Transtornos do nervo glossofaríngeo", + G522: "Transtornos do nervo vago", + G523: "Transtornos do nervo hipoglosso", + G527: "Transtornos de múltiplos nervos cranianos", + G528: "Transtornos de outros nervos cranianos especificados", + G529: "Transtorno de nervo craniano não especificado", + G53: "Transtornos dos nervos cranianos em doenças classificadas em outra parte", + G530: "Nevralgia pós-zoster", + G531: "Paralisias de múltiplos nervos cranianos em doenças infecciosas e parasitárias classificadas em outra parte", + G532: "Paralisias de múltiplos nervos cranianos na sarcoidose", + G533: "Paralisias de múltiplos nervos cranianos em doenças neoplásicas", + G538: "Outros transtornos de nervos cranianos em outras doenças classificadas em outra parte", + G54: "Transtornos das raízes e dos plexos nervosos", + G540: "Transtornos do plexo braquial", + G541: "Transtornos do plexo lombossacral", + G542: "Transtornos das raízes cervicais não classificadas em outra parte", + G543: "Transtornos das raízes torácicas não classificadas em outra parte", + G544: "Transtornos das raízes lombossacras não classificadas em outra parte", + G545: "Amiotrofia nevrálgica", + G546: "Síndrome dolorosa do membro fantasma", + G547: "Síndrome do membro fantasma sem manifestação dolorosa", + G548: "Outros transtornos das raízes e dos plexos nervosos", + G549: "Transtorno não especificado das raízes e dos plexos nervosos", + G55: "Compressões das raízes e dos plexos nervosos em doenças classificadas em outra parte", + G550: "Compressões das raízes e dos plexos nervosos em doenças neoplásicas", + G551: "Compressões das raízes e dos plexos nervosos em transtornos dos discos intervertebrais", + G552: "Compressões das raízes e dos plexos nervosos na espondilose", + G553: "Compressões das raízes e dos plexos nervosos em outras dorsopatias", + G558: "Compressões das raízes e dos plexos nervosos em outras doenças classificadas em outra parte", + G56: "Mononeuropatias dos membros superiores", + G560: "Síndrome do túnel do carpo", + G561: "Outras lesões do nervo mediano", + G562: "Lesões do nervo cubital [ulnar]", + G563: "Lesão do nervo radial", + G564: "Causalgia", + G568: "Outras mononeuropatias dos membros superiores", + G569: "Mononeuropatia dos membros superiores, não especificada", + G57: "Mononeuropatias dos membros inferiores", + G570: "Lesão do nervo ciático", + G571: "Meralgia parestésica", + G572: "Lesão do nervo femoral", + G573: "Lesão do nervo poplíteo lateral", + G574: "Lesão do nervo poplíteo medial", + G575: "Síndrome do túnel do tarso", + G576: "Lesão do nervo plantar", + G578: "Outras mononeuropatias dos membros inferiores", + G579: "Mononeuropatia dos membros inferiores, não especificada", + G58: "Outras mononeuropatias", + G580: "Neuropatia intercostal", + G587: "Mononeurite múltipla", + G588: "Outras mononeuropatias especificadas", + G589: "Mononeuropatia não especificada", + G59: "Mononeuropatias em doenças classificadas em outra parte", + G590: "Mononeuropatia diabética", + G598: "Outras mononeuropatias em doenças classificadas em outra parte", + G60: "Neuropatia hereditária e idiopática", + G600: "Neuropatia hereditária motora e sensorial", + G601: "Doença de Refsum", + G602: "Neuropatia associada a ataxia hereditária", + G603: "Neuropatia progressiva idiopática", + G608: "Outras neuropatias hereditárias e idiopáticas", + G609: "Neuropatia hereditária e idiopática não especificada", + G61: "Polineuropatia inflamatória", + G610: "Síndrome de Guillain-Barré", + G611: "Neuropatia sérica", + G618: "Outras polineuropatias inflamatórias", + G619: "Polineuropatia inflamatória não especificada", + G62: "Outras polineuropatias", + G620: "Polineuropatia induzida por drogas", + G621: "Polineuropatia alcoólica", + G622: "Polineuropatia devida a outros agentes tóxicos", + G628: "Outras polineuropatias especificadas", + G629: "Polineuropatia não especificada", + G63: "Polineuropatia em doenças classificadas em outra parte", + G630: "Polineuropatia em doenças infecciosas e parasitárias classificadas em outra parte", + G631: "Polineuropatia em doenças neoplásicas", + G632: "Polineuropatia diabética", + G633: "Polineuropatia em outras doenças endócrinas e metabólicas", + G634: "Polineuropatia em deficiências nutricionais", + G635: "Polineuropatia em doenças sistêmicas do tecido conjuntivo", + G636: "Polineuropatia em outros transtornos osteomusculares", + G638: "Polineuropatia em outras doenças classificadas em outra parte", + G64: "Outros transtornos do sistema nervoso periférico", + G70: "Miastenia gravis e outros transtornos neuromusculares", + G700: "Miastenia gravis", + G701: "Transtornos mioneurais tóxicos", + G702: "Miastenia congênita e do desenvolvimento", + G708: "Outros transtornos mioneurais especificados", + G709: "Transtorno mioneural não especificado", + G71: "Transtornos primários dos músculos", + G710: "Distrofia muscular", + G711: "Transtornos miotônicos", + G712: "Miopatias congênitas", + G713: "Miopatia mitocondrial não classificada em outra parte", + G718: "Outros transtornos primários dos músculos", + G719: "Transtorno muscular primário não especificado", + G72: "Outras miopatias", + G720: "Miopatia induzida por drogas", + G721: "Miopatia alcoólica", + G722: "Miopatia devida a outros agentes tóxicos", + G723: "Paralisia periódica", + G724: "Miopatia inflamatória não classificada em outra parte", + G728: "Outras miopatias especificadas", + G729: "Miopatia não especificada", + G73: "Transtornos da junção mioneural e dos músculos em doenças classificadas em outra parte", + G730: "Síndromes miastênicas em doenças endócrinas", + G731: "Síndrome de Eaton-Lambert", + G732: "Outras síndromes miastênicas em doenças neoplásicas", + G733: "Síndromes miastênicas em outras doenças classificadas em outra parte", + G734: "Miopatia em doenças infecciosas e parasitárias classificadas em outra parte", + G735: "Miopatia em doenças endócrinas", + G736: "Miopatia em doenças metabólicas", + G737: "Miopatia em outras doenças classificadas em outra parte", + G80: "Paralisia cerebral", + G800: "Paralisia cerebral quadriplágica espástica", + G801: "Paralisia cerebral diplégica espástica", + G802: "Paralisia cerebral hemiplégica espástica", + G803: "Paralisia cerebral discinética", + G804: "Paralisia cerebral atáxica", + G808: "Outras formas de paralisia cerebral", + G809: "Paralisia cerebral não especificada", + G81: "Hemiplegia", + G810: "Hemiplegia flácida", + G811: "Hemiplegia espástica", + G819: "Hemiplegia não especificada", + G82: "Paraplegia e tetraplegia", + G820: "Paraplegia flácida", + G821: "Paraplegia espástica", + G822: "Paraplegia não especificada", + G823: "Tetraplegia flácida", + G824: "Tetraplegia espástica", + G825: "Tetraplegia não especificada", + G83: "Outras síndromes paralíticas", + G830: "Diplegia dos membros superiores", + G831: "Monoplegia do membro inferior", + G832: "Monoplegia do membro superior", + G833: "Monoplegia não especificada", + G834: "Síndrome da cauda eqüina", + G838: "Outras síndromes paralíticas especificadas", + G839: "Síndrome paralítica não especificada", + G90: "Transtornos do sistema nervoso autônomo", + G900: "Neuropatia autonômica periférica idiopática", + G901: "Disautonomia familiar [Síndrome de Riley-Day]", + G902: "Síndrome de Horner", + G903: "Degeneração multissistêmica", + G904: "Disreflexia autonômica", + G908: "Outros transtornos do sistema nervoso autônomo", + G909: "Transtorno não especificado do sistema nervoso autônomo", + G91: "Hidrocefalia", + G910: "Hidrocefalia comunicante", + G911: "Hidrocefalia obstrutiva", + G912: "Hidrocefalia de pressão normal", + G913: "Hidrocefalia pós-traumática não especificada", + G918: "Outras formas de hidrocefalia", + G919: "Hidrocefalia não especificada", + G92: "Encefalopatia tóxica", + G93: "Outros transtornos do encéfalo", + G930: "Cistos cerebrais", + G931: "Lesão encefálica anóxica, não classificada em outra parte", + G932: "Hipertensão intracraniana benigna", + G933: "Síndrome da fadiga pós-viral", + G934: "Encefalopatia não especificada", + G935: "Compressão do encéfalo", + G936: "Edema cerebral", + G937: "Síndrome de Reye", + G938: "Outros transtornos especificados do encéfalo", + G939: "Transtorno não especificado do encéfalo", + G94: "Outros transtornos do encéfalo em doenças classificadas em outra parte", + G940: "Hidrocefalia em doenças infecciosas e parasitárias classificadas em outra parte", + G941: "Hidrocefalia em doenças neoplásicas", + G942: "Hidrocefalia em outras doenças classificadas em outra parte", + G948: "Outros transtornos encefálicos especificados em doenças classificadas em outra parte", + G95: "Outras doenças da medula espinal", + G950: "Siringomielia e siringobulbia", + G951: "Mielopatias vasculares", + G952: "Compressão não especificada de medula espinal", + G958: "Outras doenças especificadas da medula espinal", + G959: "Doença não especificada da medula espinal", + G96: "Outros transtornos do sistema nervoso central", + G960: "Fístula liquórica", + G961: "Transtornos das meninges não classificados em outra parte", + G968: "Outros transtornos especificados do sistema nervoso central", + G969: "Transtorno não especificado do sistema nervoso central", + G97: "Transtornos pós-procedimento do sistema nervoso não classificados em outra parte", + G970: "Perda de líquor resultante de punção espinal", + G971: "Outra reação à punção espinal e lombar", + G972: "Hipotensão intracraniana conseqüente à derivação ventricular", + G978: "Outros transtornos pós-procedimento do sistema nervoso", + G979: "Transtorno pós-procedimento do sistema nervoso, não especificado", + G98: "Outros transtornos do sistema nervoso não classificados em outra parte", + G99: "Outros transtornos do sistema nervoso em doenças classificadas em outra parte", + G990: "Neuropatia autonômica em doenças endócrinas e metabólicas", + G991: "Outros transtornos do sistema nervoso autônomo em doenças classificadas em outra parte", + G992: "Mielopatia em doenças classificadas em outra parte", + G998: "Outros transtornos especificados do sistema nervoso em doenças classificadas em outra parte", + H00: "Hordéolo e calázio", + H000: "Hordéolo e outras inflamações profundas das pálpebras", + H001: "Calázio", + H01: "Outras inflamações da pálpebra", + H010: "Blefarite", + H011: "Dermatoses não infecciosas da pálpebra", + H018: "Outras inflamações especificadas da pálpebra", + H019: "Inflamação não especificada da pálpebra", + H02: "Outros transtornos da pálpebra", + H020: "Entrópio e triquíase da pálpebra", + H021: "Ectrópio da pálpebra", + H022: "Lagoftalmo", + H023: "Blefarocalásia", + H024: "Ptose da pálpebra", + H025: "Outros transtornos que afetam a função da pálpebra", + H026: "Xantelasma da pálpebra", + H027: "Outros transtornos degenerativos da pálpebra e da área periocular", + H028: "Outros transtornos especificados das pálpebras", + H029: "Transtorno não especificado da pálpebra", + H03: "Transtornos da pálpebra em doenças classificadas em outras partes", + H030: "Infestação parasitária da pálpebra em doenças classificadas em outra parte", + H031: "Comprometimento da pálpebra em outras doenças infecciosas classificadas em outra parte", + H038: "Comprometimento da pálpebra em outras doenças classificadas em outras partes", + H04: "Transtornos do aparelho lacrimal", + H040: "Dacrioadenite", + H041: "Outros transtornos da glândula lacrimal", + H042: "Epífora", + H043: "Inflamação aguda e não especificada dos canais lacrimais", + H044: "Inflamação crônica dos canais lacrimais", + H045: "Estenose e insuficiência dos canais lacrimais", + H046: "Outras alterações nos canais lacrimais", + H048: "Outros transtornos do aparelho lacrimal", + H049: "Transtorno não especificado do aparelho lacrimal", + H05: "Transtornos da órbita", + H050: "Inflamação aguda da órbita", + H051: "Transtornos inflamatórios crônicos da órbita", + H052: "Afecções exoftálmicas", + H053: "Deformidade da órbita", + H054: "Enoftalmia", + H055: "Corpo estranho (antigo) retido conseqüente a ferimento perfurante da órbita", + H058: "Outros transtornos da órbita", + H059: "Transtorno não especificado da órbita", + H06: "Transtornos do aparelho lacrimal e da órbita em doenças classificadas em outra parte", + H060: "Transtornos do aparelho lacrimal em doenças classificadas em outra parte", + H061: "Infestação parasitária da órbita em doenças classificadas em outra parte", + H062: "Exoftalmo distireoídeo", + H063: "Outros transtornos da órbita em doenças classificadas em outra parte", + H10: "Conjuntivite", + H100: "Conjuntivite mucopurulenta", + H101: "Conjuntivite aguda atópica", + H102: "Outras conjuntivites agudas", + H103: "Conjuntivite aguda não especificada", + H104: "Conjuntivite crônica", + H105: "Blefaroconjuntivite", + H108: "Outras conjuntivites", + H109: "Conjuntivite não especificada", + H11: "Outros transtornos da conjuntiva", + H110: "Pterígio", + H111: "Degenerações e depósitos da conjuntiva", + H112: "Cicatrizes da conjuntiva", + H113: "Hemorragia conjuntival", + H114: "Outros transtornos vasculares e cistos conjuntivais", + H118: "Outros transtornos especificados da conjuntiva", + H119: "Transtorno não especificado da conjuntiva", + H13: "Transtornos da conjuntiva em doenças classificadas em outra parte", + H130: "Infestação por filárias na conjuntiva", + H131: "Conjuntivite em doenças infecciosas e parasitárias classificadas em outra parte", + H132: "Conjuntivite em outras doenças classificadas em outra parte", + H133: "Penfigóide ocular", + H138: "Outros transtornos da conjuntiva em doença classificadas em outra parte", + H15: "Transtornos da esclerótica", + H150: "Esclerite", + H151: "Episclerite", + H158: "Outros transtornos da esclerótica", + H159: "Transtorno não especificado da esclerótica", + H16: "Ceratite", + H160: "Úlcera de córnea", + H161: "Outras ceratites superficiais sem conjuntivite", + H162: "Ceratoconjuntivite", + H163: "Ceratites intersticial e profunda", + H164: "Neovascularização da córnea", + H168: "Outras ceratites", + H169: "Ceratite não especificada", + H17: "Cicatrizes e opacidades da córnea", + H170: "Leucoma aderente", + H171: "Outra opacidade central da córnea", + H178: "Outras cicatrizes e opacidades da córnea", + H179: "Cicatriz e opacidade não especificadas da córnea", + H18: "Outros transtornos da córnea", + H180: "Pigmentações e depósitos da córnea", + H181: "Ceratopatia bolhosa", + H182: "Outros edemas da córnea", + H183: "Alterações nas membranas da córnea", + H184: "Degenerações da córnea", + H185: "Distrofias hereditárias da córnea", + H186: "Ceratocone", + H187: "Outras deformidades da córnea", + H188: "Outros transtornos especificados da córnea", + H189: "Transtorno não especificado da córnea", + H19: "Transtorno da esclerótica e da córnea em doenças classificadas em outra parte", + H190: "Esclerite e episclerite em doenças classificadas em outra parte", + H191: "Ceratite e ceratoconjuntivite pelo vírus do herpes simples", + H192: "Ceratite e ceratoconjuntivite em outras doenças infecciosas e parasitárias classificadas em outra parte", + H193: "Ceratite e ceratoconjuntivite em outras doenças classificadas em outra parte", + H198: "Outros transtornos de esclerótica e da córnea em doenças classificadas em outra parte", + H20: "Iridociclite", + H200: "Iridociclite aguda e subaguda", + H201: "Iridociclite crônica", + H202: "Iridociclite induzida pelo cristalino", + H208: "Outras iridociclites", + H209: "Iridociclite não especificada", + H21: "Outros transtornos da íris e do corpo ciliar", + H210: "Hifema", + H211: "Outros transtornos vasculares da íris e do corpo ciliar", + H212: "Degenerações da íris e do corpo ciliar", + H213: "Cistos da íris, do corpo ciliar e da câmara anterior", + H214: "Membranas pupilares", + H215: "Outras aderências e roturas da íris e do corpo ciliar", + H218: "Outros transtornos especificados da íris e do corpo ciliar", + H219: "Transtorno não especificado da íris e do corpo ciliar", + H22: "Transtornos da íris e do corpo ciliar em doenças classificadas em outra parte", + H220: "Iridociclite em doenças infecciosas e parasitárias classificadas em outra parte", + H221: "Iridociclite em outras doenças classificadas em outra parte", + H228: "Outros transtornos da íris e do corpo ciliar em doenças classificadas em outra parte", + H25: "Catarata senil", + H250: "Catarata senil incipiente", + H251: "Catarata senil nuclear", + H252: "Catarata senil tipo Morgagni", + H258: "Outras cataratas senis", + H259: "Catarata senil não especificada", + H26: "Outras cataratas", + H260: "Catarata infantil, juvenil e pré-senil", + H261: "Catarata traumática", + H262: "Catarata complicada", + H263: "Catarata induzida por drogas", + H264: "Pós-catarata", + H268: "Outras cataratas especificadas", + H269: "Catarata não especificada", + H27: "Outros transtornos do cristalino", + H270: "Afacia", + H271: "Deslocamento do cristalino", + H278: "Outros transtornos especificados do cristalino", + H279: "Transtorno não especificado do cristalino", + H28: "Catarata e outros transtornos do cristalino em doenças classificadas em outra parte", + H280: "Catarata diabética", + H281: "Catarata em outras doenças endócrinas, nutricionais e metabólicas", + H282: "Catarata em outras doenças classificadas em outra parte", + H288: "Outros transtorno do cristalino em doenças classificadas em outra parte", + H30: "Inflamação coriorretiniana", + H300: "Inflamação coriorretiniana focal", + H301: "Inflamação corrorretiniana disseminada", + H302: "Ciclite posterior", + H308: "Outras inflamações coriorretinianas", + H309: "Inflamação não especificada da coróide e da retina", + H31: "Outros transtornos da coróide", + H310: "Cicatrizes coriorretinianas", + H311: "Degeneração da coróide", + H312: "Distrofia hereditária da coróide", + H313: "Hemorragia e rotura da coróide", + H314: "Descolamento da coróide", + H318: "Outros transtornos especificados da coróide", + H319: "Transtorno não especificado da coróide", + H32: "Transtornos coriorretinianos em doenças classificadas em outra parte", + H320: "Inflamação coriorretiniana em doenças infecciosas e parasitárias classificadas em outra parte", + H328: "Outros transtornos coriorretinianos em doenças classificadas em outra parte", + H33: "Descolamentos e defeitos da retina", + H330: "Descolamento da retina com defeito retiniano", + H331: "Retinosquise e cistos da retina", + H332: "Descolamento seroso da retina", + H333: "Defeitos da retina sem descolamento", + H334: "Descolamento da retina por tração", + H335: "Outros descolamentos da retina", + H34: "Oclusões vasculares da retina", + H340: "Oclusão arterial retiniana transitória", + H341: "Oclusão da artéria retiniana central", + H342: "Outras oclusões da artéria retiniana", + H348: "Outras oclusões vasculares retinianas", + H349: "Oclusão vascular retiniana não especificada", + H35: "Outros transtornos da retina", + H350: "Retinopatias de fundo e alterações vasculares da retina", + H351: "Retinopatia da prematuridade", + H352: "Outras retinopatias proliferativas", + H353: "Degeneração da mácula e do pólo posterior", + H354: "Degenerações periféricas da retina", + H355: "Distrofias hereditárias da retina", + H356: "Hemorragia retiniana", + H357: "Separação das camadas da retina", + H358: "Outros transtornos especificados da retina", + H359: "Transtorno da retina não especificado", + H36: "Transtornos da retina em doenças classificadas em outra parte", + H360: "Retinopatia diabética", + H368: "Outros transtornos retinianos em doenças classificadas em outra parte", + H40: "Glaucoma", + H400: "Suspeita de glaucoma", + H401: "Glaucoma primário de ângulo aberto", + H402: "Glaucoma primário de ângulo fechado", + H403: "Glaucoma secundário a traumatismo ocular", + H404: "Glaucoma secundário a inflamação ocular", + H405: "Glaucoma secundário a outros transtornos do olho", + H406: "Glaucoma secundário a drogas", + H408: "Outro glaucoma", + H409: "Glaucoma não especificado", + H42: "Glaucoma em doenças classificadas em outra parte", + H420: "Glaucoma em doenças endócrinas, nutricionais e metabólicas classificadas em outra parte", + H428: "Glaucoma em outras doenças classificadas em outra parte", + H43: "Transtornos do humor vítreo", + H430: "Prolapso do humor vítreo", + H431: "Hemorragia do humor vítreo", + H432: "Depósitos cristalinos no humor vítreo", + H433: "Outras opacidades do vítreo", + H438: "Outros transtornos do humor vítreo", + H439: "Transtorno não especificado do humor vítreo", + H44: "Transtornos do globo ocular", + H440: "Endoftalmite purulenta", + H441: "Outras endoftalmites", + H442: "Miopia degenerativa", + H443: "Outros transtornos degenerativos do globo ocular", + H444: "Hipotonia do olho", + H445: "Afecções degenerativas do globo ocular", + H446: "Corpo estranho retido (antigo) intra-ocular de natureza magnética", + H447: "Corpo estranho retido (antigo) intra-ocular de natureza não-magnética", + H448: "Outros transtornos do globo ocular", + H449: "Transtorno não especificado do globo ocular", + H45: "Transtornos do humor vítreo e do globo ocular em doenças classificadas em outra parte", + H450: "Hemorragia vítrea em doenças classificadas em outra parte", + H451: "Endoftalmite em doenças classificadas em outra parte", + H458: "Outros transtornos do humor vítreo e do globo ocular em doenças classificadas em outra parte", + H46: "Neurite óptica", + H47: "Outros transtornos do nervo óptico e das vias ópticas", + H470: "Transtornos do nervo óptico não classificados em outra parte", + H471: "Papiledema não especificado", + H472: "Atrofia óptica", + H473: "Outros transtornos do disco óptico", + H474: "Transtornos do quiasma óptico", + H475: "Transtornos de outras vias ópticas", + H476: "Transtornos do córtex visual", + H477: "Transtornos não especificados das vias ópticas", + H48: "Transtornos do nervo óptico [segundo par] e das vias ópticas em doenças classificadas em outra parte", + H480: "Atrofia óptica em doenças classificadas em outra parte", + H481: "Neurite retrobulbar em doenças classificadas em outra parte", + H488: "Outros transtornos do nervo óptico e das vias ópticas em doenças classificadas em outra parte", + H49: "Estrabismo paralítico", + H490: "Paralisia do terceiro par [oculomotor]", + H491: "Paralisia do quarto par [troclear]", + H492: "Paralisia do sexto par [abducente]", + H493: "Oftalmoplegia total (externa)", + H494: "Oftalmoplegia externa progressiva", + H498: "Outros estrabismos paralíticos", + H499: "Estrabismo paralítico não especificado", + H50: "Outros estrabismos", + H500: "Estrabismo convergente concomitante", + H501: "Estrabismo divergente concomitante", + H502: "Estrabismo vertical", + H503: "Heterotropia intermitente", + H504: "Outras heterotropias e as não especificadas", + H505: "Heteroforia", + H506: "Estrabismo mecânico", + H508: "Outros estrabismos especificados", + H509: "Estrabismo não especificado", + H51: "Outros transtornos do movimento binocular", + H510: "Paralisia do olhar conjugado", + H511: "Insuficiência ou excesso de convergência", + H512: "Oftalmoplegia internuclear", + H518: "Outros transtornos especificados do movimento binocular", + H519: "Transtorno não especificado do movimento binocular", + H52: "Transtornos da refração e da acomodação", + H520: "Hipermetropia", + H521: "Miopia", + H522: "Astigmatismo", + H523: "Anisometropia e aniseiconia", + H524: "Presbiopia", + H525: "Transtornos da acomodação", + H526: "Outros transtornos da refração", + H527: "Transtorno não especificado da refração", + H53: "Distúrbios visuais", + H530: "Ambliopia por anopsia", + H531: "Distúrbios visuais subjetivos", + H532: "Diplopia", + H533: "Outros transtornos da visão binocular", + H534: "Defeitos do campo visual", + H535: "Deficiências da visão cromática", + H536: "Cegueira noturna", + H538: "Outros distúrbios visuais", + H539: "Distúrbio visual não especificado", + H54: "Cegueira e visão subnormal", + H540: "Cegueira, ambos os olhos", + H541: "Cegueira em um olho e visão subnormal em outro", + H542: "Visão subnormal de ambos os olhos", + H543: "Perda não qualificada da visão em ambos os olhos", + H544: "Cegueira em um olho", + H545: "Visão subnormal em um olho", + H546: "Perda não qualificada da visão em um olho", + H547: "Perda não especificada da visão", + H55: "Nistagmo e outros movimentos irregulares do olho", + H57: "Outros transtornos do olho e anexos", + H570: "Anomalias da função pupilar", + H571: "Dor ocular", + H578: "Outros transtornos especificados do olho e anexos", + H579: "Transtorno não especificado do olho e anexos", + H58: "Outros transtornos do olho e anexos em doenças classificadas em outra parte", + H580: "Anomalias da função pupilar em doenças classificadas em outra parte", + H581: "Distúrbios visuais em doenças classificadas em outra parte", + H588: "Outros transtornos especificados do olho e anexos em doenças classificadas em outra parte", + H59: "Transtornos do olho e anexos pós-procedimento não classificados em outra parte", + H590: "Ceropatia (bolhosa afácica) subseqüente a cirurgia de catarata", + H598: "Outros transtornos do olho e anexos pós-procedimentos", + H599: "Transtorno não especificado do olho e anexos pós-procedimento", + H60: "Otite externa", + H600: "Abscesso do ouvido externo", + H601: "Celulite do ouvido externo", + H602: "Otite externa maligna", + H603: "Outras otites externas infecciosas", + H604: "Colesteatoma do ouvido externo", + H605: "Otite externa aguda não-infecciosa", + H608: "Outras otites externas", + H609: "Otite externa não especificada", + H61: "Outros transtornos do ouvido externo", + H610: "Pericondrite do pavilhão da orelha", + H611: "Transtornos não-infecciosos do pavilhão da orelha", + H612: "Cerume impactado", + H613: "Estenose adquirida do conduto auditivo externo", + H618: "Outros transtornos especificados do ouvido externo", + H619: "Transtorno não especificado do ouvido externo", + H62: "Transtornos do ouvido externo em doenças classificadas em outra parte", + H620: "Otite externa em doenças bacterianas classificadas em outra parte", + H621: "Otite externa em doenças virais classificadas em outra parte", + H622: "Otite externa em micoses", + H623: "Otite externa em outras doenças infecciosas e parasitárias classificadas em outra parte", + H624: "Otite externa em outras doenças classificadas em outra parte", + H628: "Outros transtornos do ouvido externo em doenças classificadas em outra parte", + H65: "Otite média não-supurativa", + H650: "Otite média aguda serosa", + H651: "Outras otites médias agudas não-supurativas", + H652: "Otite média serosa crônica", + H653: "Otite média mucóide crônica", + H654: "Outras otites médias crônicas não-supurativas", + H659: "Otite média não-supurativa, não especificada", + H66: "Otite média supurativa e as não especificadas", + H660: "Otite média aguda supurativa", + H661: "Otite média tubotimpânica supurativa crônica", + H662: "Otite média ático-antral supurativa crônica", + H663: "Outras otites médias supurativas crônicas", + H664: "Otite média supurativa não especificada", + H669: "Otite média não especificada", + H67: "Otite média em doenças classificadas em outra parte", + H670: "Otite média em doenças bacterianas classificadas em outra parte", + H671: "Otite média em doenças virais classificadas em outra parte", + H678: "Otite média em outras doenças classificadas em outra parte", + H68: "Salpingite e obstrução da trompa de Eustáquio", + H680: "Salpingite da trompa de Eustáquio", + H681: "Obstrução da trompa de Eustáquio", + H69: "Outros transtornos da trompa de Eustáquio", + H690: "Trompa de Eustáquio aberta (patente) (patulosa)", + H698: "Outros transtornos especificados da trompa de Eustáquio", + H699: "Transtorno não especificado da trompa de Eustáquio", + H70: "Mastoidite e afecções correlatas", + H700: "Mastoidite aguda", + H701: "Mastoidite crônica", + H702: "Petrosite", + H708: "Outras mastoidites e afecções relacionadas com a mastoidite", + H709: "Mastoidite não especificada", + H71: "Colesteatoma do ouvido médio", + H72: "Perfuração da membrana do tímpano", + H720: "Perfuração central da membrana do tímpano", + H721: "Perfuração ática da membrana do tímpano", + H722: "Outras perfurações marginais da membrana do tímpano", + H728: "Outras perfurações da membrana do tímpano", + H729: "Perfuração não especificada da membrana do tímpano", + H73: "Outros transtornos da membrana do tímpano", + H730: "Miringite aguda", + H731: "Miringite crônica", + H738: "Outros transtornos especificados da membrana do tímpano", + H739: "Transtorno não especificado da membrana do tímpano", + H74: "Outros transtornos do ouvido médio e da mastóide", + H740: "Timpanosclerose", + H741: "Doença adesiva do ouvido médio", + H742: "Descontinuidade e deslocamento dos ossículos do ouvido", + H743: "Outras anormalidades adquiridas dos ossículos do ouvido", + H744: "Pólipo do ouvido médio", + H748: "Outros transtornos especificados do ouvido médio e da mastóide", + H749: "Transtorno não especificado do ouvido médio e da mastóide", + H75: "Outros transtornos do ouvido médio e da mastóide em doenças classificadas em outra parte", + H750: "Mastoidite em doenças infecciosas e parasitárias classificadas em outra parte", + H758: "Outros transtornos especificados do ouvido médio e da mastóide em doenças classificadas em outra parte", + H80: "Otosclerose", + H800: "Otosclerose que compromete a janela oval, não-obliterante", + H801: "Otosclerose que compromete a janela oval, obliterante", + H802: "Otosclerose da cóclea", + H808: "Outras otoscleroses", + H809: "Otosclerose não especificada", + H81: "Transtornos da função vestibular", + H810: "Doença de Ménière", + H811: "Vertigem paroxística benigna", + H812: "Neuronite vestibular", + H813: "Outras vertigens periféricas", + H814: "Vertigem de origem central", + H818: "Outros transtornos da função vestibular", + H819: "Transtornos não especificados da função vestibular", + H82: "Síndromes vertiginosas em doenças classificadas em outra parte", + H83: "Outros transtornos do ouvido interno", + H830: "Labirintite", + H831: "Fístula do labirinto", + H832: "Disfunção do labirinto", + H833: "Efeitos do ruído sobre o ouvido interno", + H838: "Outros transtornos especificados do ouvido interno", + H839: "Transtorno não especificado do ouvido interno", + H90: "Perda de audição por transtorno de condução e/ou neuro-sensorial", + H900: "Perda de audição bilateral devida a transtorno de condução", + H901: "Perda de audição unilateral por transtorno de condução, sem restrição de audição contralateral", + H902: "Perda não especificada de audição devida a transtorno de condução", + H903: "Perda de audição bilateral neuro-sensorial", + H904: "Perda de audição unilateral neuro-sensorial, sem restrição de audição contralateral", + H905: "Perda de audição neuro-sensorial não especificada", + H906: "Perda de audição bilateral mista, de condução e neuro-sensorial", + H907: "Perda de audição unilateral mista, de condução e neuro-sensorial, sem restrição de audição contralateral", + H908: "Perda de audição mista, de condução e neuro-sensorial, não especificada", + H91: "Outras perdas de audição", + H910: "Perda de audição ototóxica", + H911: "Presbiacusia", + H912: "Perda de audição súbita idiopática", + H913: "Surdo-mudez não classificada em outra parte", + H918: "Outras perdas de audição especificadas", + H919: "Perda não especificada de audição", + H92: "Otalgia e secreção auditiva", + H920: "Otalgia", + H921: "Otorréia", + H922: "Otorragia", + H93: "Outros transtornos do ouvido não classificados em outra parte", + H930: "Transtornos degenerativos e vasculares do ouvido", + H931: "Tinnitus", + H932: "Outras percepções auditivas anormais", + H933: "Transtornos do nervo acústico", + H938: "Outros transtornos especificados do ouvido", + H939: "Transtorno não especificado do ouvido", + H94: "Outros transtornos do ouvido em doenças classificadas em outra parte", + H940: "Neurite acústica em doenças infecciosas e parasitárias classificadas em outra parte", + H948: "Outros transtornos especificados do ouvido em doenças classificadas em outra parte", + H95: "Transtornos do ouvido e da apófise mastóide pós-procedimentos, não classificados em outra parte", + H950: "Colesteatoma recorrente da cavidade pós-mastoidectomia", + H951: "Outros transtornos conseqüentes à mastoidectomia", + H958: "Outros transtornos do ouvido e da apófise mastóide pós-procedimento", + H959: "Transtorno não especificado do ouvido e da apófise mastóide pós-procedimento", + I00: "Febre reumática sem menção de comprometimento do coração", + I01: "Febre reumática com comprometimento do coração", + I010: "Pericardite reumática aguda", + I011: "Endocardite reumática aguda", + I012: "Miocardite reumática aguda", + I018: "Outras formas de doença cardíaca reumática aguda", + I019: "Doença cardíaca reumática aguda não especificada", + I02: "Coréia reumática", + I020: "Coréia reumática com comprometimento cardíaco", + I029: "Coréia reumática sem comprometimento cardíaco", + I05: "Doenças reumáticas da valva mitral", + I050: "Estenose mitral", + I051: "Insuficiência mitral reumática", + I052: "Estenose mitral com insuficiência", + I058: "Outras doenças da valva mitral", + I059: "Doença não especificada da valva mitral", + I06: "Doenças reumáticas da valva aórtica", + I060: "Estenose aórtica reumática", + I061: "Insuficiência aórtica reumática", + I062: "Estenose aórtica reumática com insuficiência", + I068: "Outras doenças reumáticas da valva aórtica", + I069: "Doença reumática da valva aórtica, não especificada", + I07: "Doenças reumáticas da valva tricúspide", + I070: "Estenose tricúspide", + I071: "Insuficiência tricúspide", + I072: "Estenose tricúspide com insuficiência", + I078: "Outras doenças da valva tricúspide", + I079: "Doença não especificada da valva tricúspide", + I08: "Doenças de múltiplas valvas", + I080: "Transtornos de valvas mitral e aórtica", + I081: "Transtornos de ambas as valvas mitral e tricúspide", + I082: "Transtornos de ambas as valvas aórtica e tricúspide", + I083: "Transtornos das valvas mitral, aórtica e tricúspide", + I088: "Outras doenças de múltiplas valvas", + I089: "Doença não especificada de múltiplas valvas", + I09: "Outras doenças reumáticas do coração", + I090: "Miocardite reumática", + I091: "Doenças reumáticas do endocárdio, valva não especificada", + I092: "Pericardite reumática crônica", + I098: "Outras doenças reumáticas especificadas do coração", + I099: "Doença cardíaca reumática não especificada", + I10: "Hipertensão essencial (primária)", + I11: "Doença cardíaca hipertensiva", + I110: "Doença cardíaca hipertensiva com insuficiência cardíaca (congestiva)", + I119: "Doença cardíaca hipertensiva sem insuficiência cardíaca (congestiva)", + I12: "Doença renal hipertensiva", + I120: "Doença renal hipertensiva com insuficiência renal", + I129: "Doença renal hipertensiva sem insuficiência renal", + I13: "Doença cardíaca e renal hipertensiva", + I130: "Doença cardíaca e renal hipertensiva com insuficiência cardíaca (congestiva)", + I131: "Doença cardíaca e renal hipertensiva com insuficiência renal", + I132: "Doença cardíaca e renal hipertensiva com insuficiência cardíaca (congestiva) e insuficiência renal", + I139: "Doença cardíaca e renal hipertensiva, não especificada", + I15: "Hipertensão secundária", + I150: "Hipertensão renovascular", + I151: "Hipertensão secundária a outras afecções renais", + I152: "Hipertensão secundária a afecções endócrinas", + I158: "Outras formas de hipertensão secundária", + I159: "Hipertensão secundária, não especificada", + I20: "Angina pectoris", + I200: "Angina instável", + I201: "Angina pectoris com espasmo documentado", + I208: "Outras formas de angina pectoris", + I209: "Angina pectoris, não especificada", + I21: "Infarto agudo do miocárdio", + I210: "Infarto agudo transmural da parede anterior do miocárdio", + I211: "Infarto agudo transmural da parede inferior do miocárdio", + I212: "Infarto agudo transmural do miocárdio de outras localizações", + I213: "Infarto agudo transmural do miocárdio, de localização não especificada", + I214: "Infarto agudo subendocárdico do miocárdio", + I219: "Infarto agudo do miocárdio não especificado", + I22: "Infarto do miocárdio recorrente", + I220: "Infarto do miocárdio recorrente da parede anterior", + I221: "Infarto do miocárdio recorrente da parede inferior", + I228: "Infarto do miocárdio recorrente de outras localizações", + I229: "Infarto do miocárdio recorrente de localização não especificada", + I23: "Algumas complicações atuais subseqüentes ao infarto agudo do miocárdio", + I230: "Hemopericárdio como complicação atual subseqüente ao infarto agudo do miocárdio", + I231: "Comunicação interatrial como complicação atual subseqüente ao infarto agudo do miocárdio", + I232: "Comunicação interventricular como complicação atual subseqüente ao infarto agudo do miocárdio", + I233: "Ruptura da parede do coração sem ocorrência de hemopericárdio como complicação atual subseqüente ao infarto agudo do miocárdio", + I234: "Ruptura de cordoalhas tendíneas como complicação atual subseqüente ao infarto agudo do miocárdio", + I235: "Ruptura de músculos papilares como complicação atual subseqüente ao infarto agudo do miocárdio", + I236: "Trombose de átrio, aurícula e ventrículo como complicação atual subseqüente ao infarto agudo do miocárdio", + I238: "Outras complicações atuais subseqüentes ao infarto agudo do miocárdio", + I24: "Outras doenças isquêmicas agudas do coração", + I240: "Trombose coronária que não resulta em infarto do miocárdio", + I241: "Síndrome de Dressler", + I248: "Outras formas de doença isquêmica aguda do coração", + I249: "Doença isquêmica aguda do coração não especificada", + I25: "Doença isquêmica crônica do coração", + I250: "Doença cardiovascular aterosclerótica, descrita desta maneira", + I251: "Doença aterosclerótica do coração", + I252: "Infarto antigo do miocárdio", + I253: "Aneurisma cardíaco", + I254: "Aneurisma de artéria coronária", + I255: "Miocardiopatia isquêmica", + I256: "Isquemia miocárdica silenciosa", + I258: "Outras formas de doença isquêmica crônica do coração", + I259: "Doença isquêmica crônica do coração não especificada", + I26: "Embolia pulmonar", + I260: "Embolia pulmonar com menção de cor pulmonale agudo", + I269: "Embolia pulmonar sem menção de cor pulmonale agudo", + I27: "Outras formas de doença cardíaca pulmonar", + I270: "Hipertensão pulmonar primária", + I271: "Cardiopatia cifoescoliótica", + I272: "Outra hipertensão pulmonar secundária", + I278: "Outras doenças pulmonares do coração especificadas", + I279: "Cardiopatia pulmonar não especificada", + I28: "Outras doenças dos vasos pulmonares", + I280: "Fístula arteriovenosa de vasos pulmonares", + I281: "Aneurisma da artéria pulmonar", + I288: "Outras doenças especificadas dos vasos pulmonares", + I289: "Doença não especificada dos vasos pulmonares", + I30: "Pericardite aguda", + I300: "Pericardite aguda idiopática não específica", + I301: "Pericardite infecciosa", + I308: "Outras formas de pericardite aguda", + I309: "Pericardite aguda não especificada", + I31: "Outras doenças do pericárdio", + I310: "Pericardite adesiva crônica", + I311: "Pericardite constritiva crônica", + I312: "Hemopericárdio não classificado em outra parte", + I313: "Derrame pericárdico (não-inflamatório)", + I318: "Outras doenças especificadas do pericárdio", + I319: "Doença não especificada do pericárdio", + I32: "Pericardite em doenças classificadas em outra parte", + I320: "Pericardite em doenças bacterianas classificadas em outra parte", + I321: "Pericardite em outras doenças infecciosas e parasitárias classificadas em outra parte", + I328: "Pericardite em outras doenças classificadas em outra parte", + I33: "Endocardite aguda e subaguda", + I330: "Endocardite infecciosa aguda e subaguda", + I339: "Endocardite aguda não especificada", + I34: "Transtornos não-reumáticos da valva mitral", + I340: "Insuficiência (da valva) mitral", + I341: "Prolapso (da valva) mitral", + I342: "Estenose (da valva) mitral, não-reumática", + I348: "Outros transtornos não-reumáticos da valva mitral", + I349: "Transtornos não-reumáticos da valva mitral, não especificados", + I35: "Transtornos não-reumáticos da valva aórtica", + I350: "Estenose (da valva) aórtica", + I351: "Insuficiência (da valva) aórtica", + I352: "Estenose (da valva) aórtica com insuficiência", + I358: "Outros transtornos da valva aórtica", + I359: "Transtornos não especificados da valva aórtica", + I36: "Transtornos não-reumáticos da valva tricúspide", + I360: "Estenose (da valva) tricúspide não-reumática", + I361: "Insuficiência (da valva) tricúspide não-reumática", + I362: "Estenose (da valva) tricúspide com insuficiência, não-reumática", + I368: "Outros transtornos não-reumáticos da valva tricúspide", + I369: "Transtornos não-reumáticos da valva tricúspide, não especificados", + I37: "Transtornos da valva pulmonar", + I370: "Estenose da valva pulmonar", + I371: "Insuficiência da valva pulmonar", + I372: "Estenose da valva pulmonar com insuficiência", + I378: "Outros transtornos da valva pulmonar", + I379: "Transtornos não especificados da valva pulmonar", + I38: "Endocardite de valva não especificada", + I39: "Endocardite e transtornos valvulares cardíacos em doenças classificadas em outra parte", + I390: "Transtornos da valva mitral em doenças classificadas em outra parte", + I391: "Transtornos da valva aórtica em doenças classificadas em outra parte", + I392: "Transtornos da valva tricúspide em doenças classificadas em outra parte", + I393: "Transtornos da valva pulmonar em doenças classificadas em outra parte", + I394: "Transtornos de múltiplas valvas em doenças classificadas em outra parte", + I398: "Endocardite, de valva não especificada, em doenças classificadas em outra parte", + I40: "Miocardite aguda", + I400: "Miocardite infecciosa", + I401: "Miocardite isolada", + I408: "Outras miocardites agudas", + I409: "Miocardite aguda não especificada", + I41: "Miocardite em doenças classificadas em outra parte", + I410: "Miocardite em doenças bacterianas classificadas em outra parte", + I411: "Miocardite em doenças virais classificadas em outra parte", + I412: "Miocardite em outras doenças infecciosas e parasitárias classificadas em outra parte", + I418: "Miocardite em outras doenças classificadas em outra parte", + I42: "Cardiomiopatias", + I420: "Cardiomiopatia dilatada", + I421: "Cardiomiopatia obstrutiva hipertrófica", + I422: "Outras cardiomiopatias hipertróficas", + I423: "Doença endomiocárdica (eosinofílica)", + I424: "Fibroelastose endocárdica", + I425: "Outras cardiomiopatias restritivas", + I426: "Cardiomiopatia alcoólica", + I427: "Cardiomiopatia devida a drogas e outros agentes externos", + I428: "Outras cardiomiopatias", + I429: "Cardiomiopatia não especificada", + I43: "Cardiomiopatia em doenças classificadas em outra parte", + I430: "Cardiomiopatia em doenças infecciosas e parasitárias classificadas em outra parte", + I431: "Cardiomiopatia em doenças metabólicas", + I432: "Cardiomiopatia em doenças nutricionais", + I438: "Cardiomiopatia em outras doenças classificadas em outra parte", + I44: "Bloqueio atrioventricular e do ramo esquerdo", + I440: "Bloqueio atrioventricular de primeiro grau", + I441: "Bloqueio atrioventricular de segundo grau", + I442: "Bloqueio atrioventricular total", + I443: "Outras formas de bloqueio atrioventricular e as não especificadas", + I444: "Bloqueio do fascículo anterior esquerdo", + I445: "Bloqueio do fascículo posterior esquerdo", + I446: "Outras formas de bloqueio fascicular e as não especificadas", + I447: "Bloqueio de ramo esquerdo não especificado", + I45: "Outros transtornos de condução", + I450: "Bloqueio fascicular direito", + I451: "Outras formas de bloqueio de ramo direito e as não especificadas", + I452: "Bloqueio bifascicular", + I453: "Bloqueio trifascicular", + I454: "Bloqueio intraventricular não específico", + I455: "Outras formas especificadas de bloqueio cardíaco", + I456: "Síndrome de pré-excitação", + I458: "Outros transtornos especificados da condução", + I459: "Transtorno de condução não especificado", + I46: "Parada cardíaca", + I460: "Parada cardíaca com ressuscitação bem sucedida", + I461: "Morte súbita (de origem) cardíaca, descrita desta forma", + I469: "Parada cardíaca não especificada", + I47: "Taquicardia paroxística", + I470: "Arritmia ventricular por reentrada", + I471: "Taquicardia supraventricular", + I472: "Taquicardia ventricular", + I479: "Taquicardia paroxística não especificada", + I48: '"Flutter" e fibrilação atrial', + I49: "Outras arritmias cardíacas", + I490: '"Flutter" e fibrilação ventricular', + I491: "Despolarização atrial prematura", + I492: "Despolarização juncional prematura", + I493: "Despolarização ventricular prematura", + I494: "Outras formas de despolarização prematura e as não especificadas", + I495: "Síndrome do nó sinusal", + I498: "Outras arritmias cardíacas especificadas", + I499: "Arritmia cardíaca não especificada", + I50: "Insuficiência cardíaca", + I500: "Insuficiência cardíaca congestiva", + I501: "Insuficiência ventricular esquerda", + I509: "Insuficiência cardíaca não especificada", + I51: "Complicações de cardiopatias e doenças cardíacas mal definidas", + I510: "Defeito adquirido de septo cardíaco", + I511: "Ruptura de cordoalha tendínea, não classificada em outra parte", + I512: "Ruptura de músculo papilar, não classificada em outra parte", + I513: "Trombose intracardíaca, não classificada em outra parte", + I514: "Miocardite não especificada", + I515: "Degeneração miocárdica", + I516: "Doença cardiovascular não especificada", + I517: "Cardiomegalia", + I518: "Outras doenças mal definidas do coração", + I519: "Doença não especificada do coração", + I52: "Outras afecções cardíacas em doenças classificadas em outra parte", + I520: "Outras afecções cardíacas em doenças bacterianas classificadas em outra parte", + I521: "Outras afecções cardíacas em outras doenças infecciosas e parasitárias classificadas em outra parte", + I528: "Outras afecções cardíacas em outras doenças classificadas em outra parte", + I60: "Hemorragia subaracnóide", + I600: "Hemorragia subaracnóide proveniente do sifão e da bifurcação da carótida", + I601: "Hemorragia subaracnóide proveniente da artéria cerebral média", + I602: "Hemorragia subaracnóide proveniente da artéria comunicante anterior", + I603: "Hemorragia subaracnóide proveniente da artéria comunicante posterior", + I604: "Hemorragia subaracnóide proveniente da artéria basilar", + I605: "Hemorragia subaracnóide proveniente da artéria vertebral", + I606: "Hemorragia subaracnóide proveniente de outras artérias intracranianas", + I607: "Hemorragia subaracnóide proveniente de artéria intracraniana não especificada", + I608: "Outras hemorragias subaracnóides", + I609: "Hemorragia subaracnóide não especificada", + I61: "Hemorragia intracerebral", + I610: "Hemorragia intracerebral hemisférica subcortical", + I611: "Hemorragia intracerebral hemisférica cortical", + I612: "Hemorragia intracerebral hemisférica não especificada", + I613: "Hemorragia intracerebral do tronco cerebral", + I614: "Hemorragia intracerebral cerebelar", + I615: "Hemorragia intracerebral intraventricular", + I616: "Hemorragia intracerebral de múltiplas localizações", + I618: "Outras hemorragias intracerebrais", + I619: "Hemorragia intracerebral não especificada", + I62: "Outras hemorragias intracranianas não-traumáticas", + I620: "Hemorragia subdural (aguda) (não-traumática)", + I621: "Hemorragia extradural não-traumática", + I629: "Hemorragia intracraniana (não-traumática) não especificada", + I63: "Infarto cerebral", + I630: "Infarto cerebral devido a trombose de artérias pré-cerebrais", + I631: "Infarto cerebral devido a embolia de artérias pré-cerebrais", + I632: "Infarto cerebral devido a oclusão ou estenose não especificadas de artérias pré-cerebrais", + I633: "Infarto cerebral devido a trombose de artérias cerebrais", + I634: "Infarto cerebral devido a embolia de artérias cerebrais", + I635: "Infarto cerebral devido a oclusão ou estenose não especificadas de artérias cerebrais", + I636: "Infarto cerebral devido a trombose venosa cerebral não-piogênica", + I638: "Outros infartos cerebrais", + I639: "Infarto cerebral não especificado", + I64: "Acidente vascular cerebral, não especificado como hemorrágico ou isquêmico", + I65: "Oclusão e estenose de artérias pré-cerebrais que não resultam em infarto cerebral", + I650: "Oclusão e estenose da artéria vertebral", + I651: "Oclusão e estenose da artéria basilar", + I652: "Oclusão e estenose da artéria carótida", + I653: "Oclusão e estenose de artérias pré-cerebrais múltiplas e bilaterais", + I658: "Oclusão e estenose de outra artéria pré-cerebral", + I659: "Oclusão e estenose de artérias pré-cerebrais não especificadas", + I66: "Oclusão e estenose de artérias cerebrais que não resultam em infarto cerebral", + I660: "Oclusão e estenose da artéria cerebral média", + I661: "Oclusão e estenose da artéria cerebral anterior", + I662: "Oclusão e estenose da artéria cerebral posterior", + I663: "Oclusão e estenose de artérias cerebelares", + I664: "Oclusão e estenose de artérias cerebrais, múltiplas e bilaterais", + I668: "Oclusão e estenose de outra artéria cerebral", + I669: "Oclusão e estenose de artéria cerebral não especificada", + I67: "Outras doenças cerebrovasculares", + I670: "Dissecção de artérias cerebrais, sem ruptura", + I671: "Aneurisma cerebral não-roto", + I672: "Aterosclerose cerebral", + I673: "Leucoencefalopatia vascular progressiva", + I674: "Encefalopatia hipertensiva", + I675: "Doença de Moyamoya", + I676: "Trombose não-piogênica do sistema venoso intracraniano", + I677: "Arterite cerebral não classificada em outra parte", + I678: "Outras doenças cerebrovasculares especificadas", + I679: "Doença cerebrovascular não especificada", + I68: "Transtornos cerebrovasculares em doenças classificadas em outra parte", + I680: "Angiopatia cerebral amiloidótica", + I681: "Arterite cerebral em doenças infecciosas e parasitárias", + I682: "Arterite cerebral em outras doenças classificadas em outra parte", + I688: "Outros transtornos cerebrovasculares em doenças classificadas em outra parte", + I69: "Seqüelas de doenças cerebrovasculares", + I690: "Seqüelas de hemorragia subaracnoídea", + I691: "Seqüelas de hemorragia intracerebral", + I692: "Seqüelas de outras hemorragias intracranianas não traumáticas", + I693: "Seqüelas de infarto cerebral", + I694: "Seqüelas de acidente vascular cerebral não especificado como hemorrágico ou isquêmico", + I698: "Seqüelas de outras doenças cerebrovasculares e das não especificadas", + I70: "Aterosclerose", + I700: "Aterosclerose da aorta", + I701: "Aterosclerose da artéria renal", + I702: "Aterosclerose das artérias das extremidades", + I708: "Aterosclerose de outras artérias", + I709: "Aterosclerose generalizada e a não especificada", + I71: "Aneurisma e dissecção da aorta", + I710: "Aneurisma dissecante da aorta [qualquer porção]", + I711: "Aneurisma da aorta torácica, roto", + I712: "Aneurisma da aorta torácica, sem menção de ruptura", + I713: "Aneurisma da aorta abdominal, roto", + I714: "Aneurisma da aorta abdominal, sem menção de ruptura", + I715: "Aneurisma da aorta tóraco-abdominal, roto", + I716: "Aneurisma da aorta toráco-abdominal, sem menção de ruptura", + I718: "Aneurisma da aorta de localização não especificada, roto", + I719: "Aneurisma aórtico de localização não especificada, sem menção de ruptura", + I72: "Outros aneurismas", + I720: "Aneurisma da artéria carótida", + I721: "Aneurisma de artéria dos membros superiores", + I722: "Aneurisma da artéria renal", + I723: "Aneurisma de artéria ilíaca", + I724: "Aneurisma de artéria dos membros inferiores", + I728: "Aneurisma de outras artérias especificadas", + I729: "Aneurisma de localização não especificada", + I73: "Outras doenças vasculares periféricas", + I730: "Síndrome de Raynaud", + I731: "Tromboangeíte obliterante [doença de Buerger]", + I738: "Outras doenças vasculares periféricas especificadas", + I739: "Doenças vasculares periféricas não especificada", + I74: "Embolia e trombose arteriais", + I740: "Embolia e trombose da aorta abdominal", + I741: "Embolia e trombose de outras porções da aorta e das não especificadas", + I742: "Embolia e trombose de artérias dos membros superiores", + I743: "Embolia e trombose de artérias dos membros inferiores", + I744: "Embolia e trombose de artérias dos membros não especificadas", + I745: "Embolia e trombose da artéria ilíaca", + I748: "Embolia e trombose de outras artérias", + I749: "Embolia e trombose de artéria não especificada", + I77: "Outras afecções das artérias e arteríolas", + I770: "Fístula arteriovenosa adquirida", + I771: "Estenose de artéria", + I772: "Ruptura de artéria", + I773: "Displasia fibromuscular arterial", + I774: "Síndrome de compressão da artéria celíaca", + I775: "Necrose de artéria", + I776: "Arterite não especificada", + I778: "Outras afecções especificadas das artérias e das arteríolas", + I779: "Afecções de artérias e arteríolas, não especificadas", + I78: "Doenças dos capilares", + I780: "Telangiectasia hemorrágica hereditária", + I781: "Nevo não-neoplásico", + I788: "Outras doenças dos capilares", + I789: "Doenças não especificadas dos capilares", + I79: "Transtornos das artérias, das arteríolas e dos capilares em doenças classificadas em outra parte", + I790: "Aneurisma da aorta em doenças classificadas em outra parte", + I791: "Aortite em doenças classificadas em outra parte", + I792: "Angiopatia periférica em doenças classificadas em outra parte", + I798: "Outros transtornos das artérias, das arteríolas e dos capilares em doenças classificadas em outra parte", + I80: "Flebite e tromboflebite", + I800: "Flebite e tromboflebite dos vasos superficiais dos membros inferiores", + I801: "Flebite e tromboflebite da veia femural", + I802: "Flebite e tromboflebite de outros vasos profundos dos membros inferiores", + I803: "Flebite e tromboflebite dos membros inferiores, não especificada", + I808: "Flebite e tromboflebite de outras localizações", + I809: "Flebite e tromboflebite de localização não especificada", + I81: "Trombose da veia porta", + I82: "Outra embolia e trombose venosas", + I820: "Síndrome de Budd-Chiari", + I821: "Tromboflebite migratória", + I822: "Embolia e trombose de veia cava", + I823: "Embolia e trombose de veia renal", + I828: "Embolia e trombose de outras veias especificadas", + I829: "Embolia e trombose venosas de veia não especificada", + I83: "Varizes dos membros inferiores", + I830: "Varizes dos membros inferiores com úlcera", + I831: "Varizes dos membros inferiores com inflamação", + I832: "Varizes dos membros inferiores com úlcera e inflamação", + I839: "Varizes dos membros inferiores sem úlcera ou inflamação", + I84: "Hemorróidas", + I840: "Hemorróidas internas trombosadas", + I841: "Hemorróidas internas com outras complicações", + I842: "Hemorróidas internas sem complicações", + I843: "Hemorróidas externas trombosadas", + I844: "Hemorróidas externas com outras complicações", + I845: "Hemorróidas externas sem complicação", + I846: "Plicomas hemorroidários residuais", + I847: "Hemorróidas trombosadas, não especificadas", + I848: "Hemorróidas não especificadas com outras complicações", + I849: "Hemorróidas sem complicações, não especificadas", + I85: "Varizes esofagianas", + I850: "Varizes esofagianas sangrantes", + I859: "Varizes esofagianas sem sangramento", + I86: "Varizes de outras localizações", + I860: "Varizes sublinguais", + I861: "Varizes escrotais", + I862: "Varizes pélvicas", + I863: "Varizes da vulva", + I864: "Varizes gástricas", + I868: "Varizes de outras localizações especificadas", + I87: "Outros transtornos das veias", + I870: "Síndrome pós-flebite", + I871: "Compressão venosa", + I872: "Insuficiência venosa (crônica) (periférica)", + I878: "Outros transtornos venosos especificados", + I879: "Transtorno venoso não especificado", + I88: "Linfadenite inespecífica", + I880: "Linfadenite mesentérica não específica", + I881: "Linfadenite crônica, exceto a mesentérica", + I888: "Outras linfadenites inespecíficas", + I889: "Linfadenite não especificada", + I89: "Outros transtornos não-infecciosos dos vasos linfáticos e dos gânglios linfáticos", + I890: "Linfedema não classificado em outra parte", + I891: "Linfangite", + I898: "Outros transtornos não-infecciosos, especificados, dos vasos linfáticos e dos gânglios linfáticos", + I899: "Transtornos não-infecciosos dos vasos linfáticos e dos gânglios linfáticos, não especificados", + I95: "Hipotensão", + I950: "Hipotensão idiopática", + I951: "Hipotensão ortostática", + I952: "Hipotensão devida a drogas", + I958: "Outros tipos de hipotensão", + I959: "Hipotensão não especificada", + I97: "Transtornos do aparelho circulatório, subseqüentes a procedimentos não classificados em outra parte", + I970: "Síndrome pós-cardiotomia", + I971: "Outros distúrbios funcionais subseqüentes à cirurgia cardíaca", + I972: "Síndrome do linfedema pós-mastectomia", + I978: "Outros transtornos do aparelho circulatório subseqüentes a procedimentos não classificados em outra parte", + I979: "Transtornos do aparelho circulatório, subseqüentes a procedimento não especificado", + I98: "Outros transtornos do aparelho circulatório em doenças classificadas em outra parte", + I980: "Sífilis cardiovascular", + I981: "Transtornos cardiovasculares em outras doenças infecciosas e parasitárias classificadas em outra parte", + I982: "Varizes esofagianas em doenças classificadas em outra parte", + I988: "Outros transtornos especificados do aparelho circulatório em doenças classificadas em outra parte", + I99: "Outros transtornos do aparelho circulatório e os não especificados", + J00: "Nasofaringite aguda [resfriado comum]", + J01: "Sinusite aguda", + J010: "Sinusite maxilar aguda", + J011: "Sinusite frontal aguda", + J012: "Sinusite etmoidal aguda", + J013: "Sinusite esfenoidal aguda", + J014: "Pansinusite aguda", + J018: "Outras sinusites agudas", + J019: "Sinusite aguda não especificada", + J02: "Faringite aguda", + J020: "Faringite estreptocócica", + J028: "Faringite aguda devida a outros microorganismos especificados", + J029: "Faringite aguda não especificada", + J03: "Amigdalite aguda", + J030: "Amigdalite estreptocócica", + J038: "Amigdalite aguda devida a outros microorganismos especificados", + J039: "Amigdalite aguda não especificada", + J04: "Laringite e traqueíte agudas", + J040: "Laringite aguda", + J041: "Traqueíte aguda", + J042: "Laringotraqueíte aguda", + J05: "Laringite obstrutiva aguda [crupe] e epiglotite", + J050: "Laringite obstrutiva aguda [crupe]", + J051: "Epiglotite aguda", + J06: "Infecções agudas das vias aéreas superiores de localizações múltiplas e não especificadas", + J060: "Laringofaringite aguda", + J068: "Outras infecções agudas das vias aéreas superiores de localizações múltiplas", + J069: "Infecção aguda das vias aéreas superiores não especificada", + J09: "Influenza [gripe] devida a vírus identificado da gripe aviária", + J10: "Influenza devida a outro vírus da influenza [gripe] identificado", + J100: "Influenza com pneumonia devida a outro vírus da influenza [gripe] identificado", + J101: "Influenza com outras manifestações respiratórias, devida a outro vírus da influenza [gripe] identificado", + J108: "Influenza com outras manifestações, devida a outro vírus da influenza [gripe] identificado", + J11: "Influenza [gripe] devida a vírus não identificado", + J110: "Influenza [gripe] com pneumonia, devida a vírus não identificado", + J111: "Influenza [gripe] com outras manifestações respiratórias, devida a vírus não identificado", + J118: "Influenza [gripe] com outras manifestações, devida a vírus não identificado", + J12: "Pneumonia viral não classificada em outra parte", + J120: "Pneumonia devida a adenovírus", + J121: "Pneumonia devida a vírus respiratório sincicial", + J122: "Pneumonia devida à parainfluenza", + J128: "Outras pneumonias virais", + J129: "Pneumonia viral não especificada", + J13: "Pneumonia devida a Streptococcus pneumoniae", + J14: "Pneumonia devida a Haemophilus infuenzae", + J15: "Pneumonia bacteriana não classificada em outra parte", + J150: "Pneumonia devida à Klebsiella pneumoniae", + J151: "Pneumonia devida a Pseudomonas", + J152: "Pneumonia devida a Staphylococcus", + J153: "Pneumonia devida a Streptococcus do grupo B", + J154: "Pneumonia devida a outros estreptococos", + J155: "Pneumonia devida a Escherichia coli", + J156: "Pneumonia devida a outras bactérias aeróbicas gram-negativas", + J157: "Pneumonia devida a Mycoplasma pneumoniae", + J158: "Outras pneumonias bacterianas", + J159: "Pneumonia bacteriana não especificada", + J16: "Pneumonia devida a outros microorganismos infecciosos especificados não classificados em outra parte", + J160: "Pneumonia devida a clamídias", + J168: "Pneumonia devida a outros microorganismos infecciosos especificados", + J17: "Pneumonia em doenças classificadas em outra parte", + J170: "Pneumonia em doenças bacterianas classificadas em outra parte", + J171: "Pneumonia em doenças virais classificadas em outra parte", + J172: "Pneumonia em micoses classificadas em outra parte", + J173: "Pneumonia em doenças parasitárias classificadas em outra parte", + J178: "Pneumonia em outras doenças classificadas em outra parte", + J18: "Pneumonia por microorganismo não especificada", + J180: "Broncopneumonia não especificada", + J181: "Pneumonia lobar não especificada", + J182: "Pneumonia hipostática não especificada", + J188: "Outras pneumonias devidas a microorganismos não especificados", + J189: "Pneumonia não especificada", + J20: "Bronquite aguda", + J200: "Bronquite aguda devida a Mycoplasma pneumoniae", + J201: "Bronquite aguda devida a Haemophilus influenzae", + J202: "Bronquite aguda devida a estreptococos", + J203: "Bronquite aguda devida a vírus Coxsackie", + J204: "Bronquite aguda devida a vírus parainfluenza", + J205: "Bronquite aguda devida a vírus sincicial respiratório", + J206: "Bronquite aguda devida a rinovírus", + J207: "Bronquite aguda devida a echovírus", + J208: "Bronquite aguda devida a outros microorganismos especificados", + J209: "Bronquite aguda não especificada", + J21: "Bronquiolite aguda", + J210: "Bronquiolite aguda devida a vírus sincicial respiratório", + J218: "Bronquiolite aguda devida a outros microorganismos especificados", + J219: "Bronquite aguda não especificada", + J22: "Infecções agudas não especificada das vias aéreas inferiores", + J30: "Rinite alérgica e vasomotora", + J300: "Rinite vasomotora", + J301: "Rinite alérgica devida a pólen", + J302: "Outras rinites alérgicas sazonais", + J303: "Outras rinites alérgicas", + J304: "Rinite alérgica não especificada", + J31: "Rinite, nasofaringite e faringite crônicas", + J310: "Rinite crônica", + J311: "Nasofaringite crônica", + J312: "Faringite crônica", + J32: "Sinusite crônica", + J320: "Sinusite maxilar crônica", + J321: "Sinusite frontal crônica", + J322: "Sinusite etmoidal crônica", + J323: "Sinusite esfenoidal crônica", + J324: "Pansinusite crônica", + J328: "Outras sinusites crônicas", + J329: "Sinusite crônica não especificada", + J33: "Pólipo nasal", + J330: "Pólipo da cavidade nasal", + J331: "Degeneração polipóide do seio paranasal", + J338: "Outros pólipos do seio paranasal", + J339: "Pólipo nasal não especificado", + J34: "Outros transtornos do nariz e dos seios paranasais", + J340: "Abscesso, furúnculo e antraz do nariz", + J341: "Cisto e mucocele do nariz e do seio paranasal", + J342: "Desvio do septo nasal", + J343: "Hipertrofia dos cornetos nasais", + J348: "Outros transtornos especificados do nariz e dos seios paranasais", + J35: "Doenças crônicas das amígdalas e das adenóides", + J350: "Amigdalite crônica", + J351: "Hipertrofia das amígdalas", + J352: "Hipertrofia das adenóides", + J353: "Hipertrofia das amígdalas com hipertrofia das adenóides", + J358: "Outras doenças crônicas das amígdalas e das adenóides", + J359: "Doenças das amígdalas e das adenóides não especificadas", + J36: "Abscesso periamigdaliano", + J37: "Laringite e laringotraqueíte crônicas", + J370: "Laringite crônica", + J371: "Laringotraqueíte crônica", + J38: "Doenças das cordas vocais e da laringe não classificadas em outra parte", + J380: "Paralisia das cordas vocais e da laringe", + J381: "Pólipo das cordas vocais e da laringe", + J382: "Nódulos das cordas vocais", + J383: "Outras doenças das cordas vocais", + J384: "Edema da laringe", + J385: "Espasmo da laringe", + J386: "Estenose da laringe", + J387: "Outras doenças da laringe", + J39: "Outras doenças das vias aéreas superiores", + J390: "Abscesso retrofaríngeo e parafaríngeo", + J391: "Outros abscessos da faringe", + J392: "Outras doenças da faringe", + J393: "Reação de hipersensibilidade das vias aéreas superiores de localização não especificada", + J398: "Outras doenças especificadas das vias aéreas superiores", + J399: "Doença não especificada das vias aéreas superiores", + J40: "Bronquite não especificada como aguda ou crônica", + J41: "Bronquite crônica simples e a mucopurulenta", + J410: "Bronquite crônica simples", + J411: "Bronquite crônica mucopurulenta", + J418: "Bronquite crônica mista, simples e mucopurulenta", + J42: "Bronquite crônica não especificada", + J43: "Enfisema", + J430: "Síndrome de MacLeod", + J431: "Enfisema panlobular", + J432: "Enfisema centrolobular", + J438: "Outras formas de enfisema", + J439: "Enfisema não especificado", + J44: "Outras doenças pulmonares obstrutivas crônicas", + J440: "Doença pulmonar obstrutiva crônica com infecção respiratória aguda do trato respiratório inferior", + J441: "Doença pulmonar obstrutiva crônica com exacerbação aguda não especificada", + J448: "Outras formas especificadas de doença pulmonar obstrutiva crônica", + J449: "Doença pulmonar obstrutiva crônica não especificada", + J45: "Asma", + J450: "Asma predominantemente alérgica", + J451: "Asma não-alérgica", + J458: "Asma mista", + J459: "Asma não especificada", + J46: "Estado de mal asmático", + J47: "Bronquectasia", + J60: "Pneumoconiose dos mineiros de carvão", + J61: "Pneumoconiose devida a amianto [asbesto] e outras fibras minerais", + J62: "Pneumoconiose devida a poeira que contenham sílica", + J620: "Pneumoconiose devida a pó de talco", + J628: "Pneumoconiose devida a outras poeiras que contenham sílica", + J63: "Pneumoconiose devida a outras poeiras inorgânicas", + J630: "Aluminose (do pulmão)", + J631: "Fibrose (do pulmão) causada por bauxita", + J632: "Beriliose", + J633: "Fibrose (do pulmão) causada por grafite", + J634: "Siderose", + J635: "Estanose", + J638: "Pneumoconiose devida a outras poeira inorgânicas especificados", + J64: "Pneumoconiose não especificada", + J65: "Pneumoconiose associada com tuberculose", + J66: "Doenças das vias aéreas devida a poeiras orgânicas específicas", + J660: "Bissinose", + J661: "Doença dos cardadores de linho", + J662: "Canabinose", + J668: "Doenças das vias aéreas devida a outras poeiras orgânicas específicas", + J67: "Pneumonite de hipersensibilidade devida a poeiras orgânicas", + J670: "Pulmão de fazendeiro", + J671: "Bagaçose", + J672: "Pulmão dos criadores de pássaros", + J673: "Suberose", + J674: "Pulmão dos trabalhadores do malte", + J675: "Pulmão dos que trabalham com cogumelos", + J676: "Pulmão dos cortadores de casca do bordo", + J677: "Doença pulmonar devida aos sistemas de ar condicionado e de umidificação do ar", + J678: "Pneumonites de hipersensibilidade, devidas a outras poeiras orgânicas", + J679: "Pneumonite de hipersensibilidade devida a poeira orgânica não especificada", + J68: "Afecções respiratórias devidas a inalação de produtos químicos, gases, fumaças e vapores", + J680: "Bronquite e pneumonite devida a produtos químicos, gases, fumaças e vapores", + J681: "Edema pulmonar devido a produtos químicos, gases, fumaças e vapores", + J682: "Inflamação das vias aéreas superiores devida a produtos químicos, gases, fumaças e vapores, não classificada em outra parte", + J683: "Outras afecções respiratórias agudas e subagudas devidas a produtos químicos, gases, fumaças e vapores", + J684: "Afecções respiratórias crônicas devidas a produtos químicos, gases, fumaças e vapores", + J688: "Outras afecções respiratórias devida a produtos químicos, gases, fumaças e vapores", + J689: "Afecção respiratória não especificada devida a produtos químicos, gases, fumaça e vapores", + J69: "Pneumonite devida a sólidos e líquidos", + J690: "Pneumonite devida a alimento ou vômito", + J691: "Pneumonite devida a óleos e essências", + J698: "Pneumonite devida a outros sólidos e líquidos", + J70: "Afecções respiratórias devida a outros agentes externos", + J700: "Manifestações pulmonares agudas devidas à radiação", + J701: "Manifestações pulmonares crônicas e outras, devidas a radiação", + J702: "Transtornos pulmonares intersticiais agudos, induzidos por droga", + J703: "Transtornos pulmonares intersticiais crônicos induzidos por droga", + J704: "Transtornos pulmonar intersticial não especificado induzido por droga", + J708: "Afecções respiratórias devidas a outros agentes externos especificados", + J709: "Afecções respiratórias devidas a agentes externos não especificados", + J80: "Síndrome do desconforto respiratório do adulto", + J81: "Edema pulmonar, não especificado de outra forma", + J82: "Eosinofilia pulmonar, não classificada em outra parte", + J84: "Outras doenças pulmonares intersticiais", + J840: "Afecções alveolares e parieto-alveolares", + J841: "Outras doenças pulmonares intersticiais com fibrose", + J848: "Outras doenças pulmonares intersticiais especificadas", + J849: "Doença pulmonar intersticial não especificadas", + J85: "Abscesso do pulmão e do mediastino", + J850: "Gangrena e necrose do pulmão", + J851: "Abscesso do pulmão com pneumonia", + J852: "Abscesso do pulmão sem pneumonia", + J853: "Abscesso do mediastino", + J86: "Piotórax", + J860: "Piotórax com fístula", + J869: "Piotórax sem fístula", + J90: "Derrame pleural não classificado em outra parte", + J91: "Derrame pleural em afecções classificadas em outra parte", + J92: "Placas pleurais", + J920: "Placas pleurais com presença de amianto [asbesto]", + J929: "Placas pleurais sem presença de amianto [asbesto]", + J93: "Pneumotórax", + J930: "Pneumotórax de tensão, espontâneo", + J931: "Outras formas de pneumotórax espontâneo", + J938: "Outros tipos de pneumotórax, especificados", + J939: "Pneumotórax não especificado", + J94: "Outras afecções pleurais", + J940: "Derrame quiloso ou quiliforme", + J941: "Fibrotórax", + J942: "Hemotórax", + J948: "Outras afecções pleurais especificadas", + J949: "Afecção pleural não especificada", + J95: "Afecções respiratórias pós-procedimentos não classificadas em outra parte", + J950: "Mau funcionamento de traqueostomia", + J951: "Insuficiência pulmonar aguda subsequente a cirurgia torácica", + J952: "Insuficiência pulmonar aguda subsequente a cirurgia não torácica", + J953: "Insuficiência pulmonar crônica pós-cirúrgica", + J954: "Síndrome de Mendelson", + J955: "Estenose subglótica pós-procedimento", + J958: "Outros transtornos respiratórios pós-procedimentos", + J959: "Transtornos respiratórios pós-procedimentos não especificados", + J96: "Insuficiência respiratória não classificada de outra parte", + J960: "Insuficiência respiratória aguda", + J961: "Insuficiência respiratória crônica", + J969: "Insuficiência respiratória não especificada", + J98: "Outros transtornos respiratórios", + J980: "Outras doenças dos brônquios não classificadas em outra parte", + J981: "Colapso pulmonar", + J982: "Enfisema intersticial", + J983: "Enfisema compensatório", + J984: "Outros transtornos pulmonares", + J985: "Doenças do mediastino não classificadas em outra parte", + J986: "Transtornos do diafragma", + J988: "Outros transtornos respiratórios especificados", + J989: "Transtorno respiratório não especificados", + J99: "Transtornos respiratórios em doenças classificadas em outra parte", + J990: "Doença pulmonar reumatóide", + J991: "Transtornos respiratórios em outras doenças sistêmicas do tecido conjuntivo classificadas em outra parte", + J998: "Transtornos respiratórios em outras doenças classificadas em outra parte", + K00: "Distúrbios do desenvolvimento e da erupção dos dentes", + K000: "Anodontia", + K001: "Dentes supranumerários", + K002: "Anomalias do tamanho e da forma dos dentes", + K003: "Dentes manchados", + K004: "Distúrbios na formação dos dentes", + K005: "Anomalias hereditárias da estrutura dentária não classificadas em outra parte", + K006: "Distúrbios da erupção dentária", + K007: "Síndrome da erupção dentária", + K008: "Outros distúrbios do desenvolvimento dos dentes", + K009: "Distúrbio não especificado do desenvolvimento dentário", + K01: "Dentes inclusos e impactados", + K010: "Dentes inclusos", + K011: "Dentes impactados", + K02: "Cárie dentária", + K020: "Cáries limitadas ao esmalte", + K021: "Cáries da dentina", + K022: "Cárie do cemento", + K023: "Cáries dentárias estáveis", + K024: "Odontoclasia", + K028: "Outras cáries dentárias", + K029: "Cárie dentária, sem outra especificação", + K03: "Outras doenças dos tecidos dentários duros", + K030: "Atrito dentário excessivo", + K031: "Abrasão dentária", + K032: "Erosão dentária", + K033: "Reabsorção patológica dos dentes", + K034: "Hipercementose", + K035: "Ancilose dentária", + K036: "Depósitos nos dentes", + K037: "Alterações pós-eruptivas da cor dos tecidos duros dos dentes", + K038: "Outras doenças especificadas dos tecidos duros dos dentes", + K039: "Doença dos tecidos duros dos dentes, não especificada", + K04: "Doenças da polpa e dos tecidos periapicais", + K040: "Pulpite", + K041: "Necrose da polpa", + K042: "Degeneração da polpa", + K043: "Formação anormal de tecidos duros na polpa", + K044: "Periodontite apical aguda de origem pulpar", + K045: "Periodontite apical crônica", + K046: "Abscesso periapical com fístula", + K047: "Abscesso periapical sem fístula", + K048: "Cisto radicular", + K049: "Outras doenças da polpa e dos tecidos periapicais e as não especificadas", + K05: "Gengivite e doenças periodontais", + K050: "Gengivite aguda", + K051: "Gengivite crônica", + K052: "Periodontite aguda", + K053: "Periodontite crônica", + K054: "Periodontose", + K055: "Outras doenças periodontais", + K056: "Doença periodontal, sem outra especificação", + K06: "Outros transtornos da gengiva e do rebordo alveolar sem dentes", + K060: "Retração gengival", + K061: "Hiperplasia gengival", + K062: "Lesões da gengiva e do rebordo alveolar sem dentes, associadas a traumatismos", + K068: "Outros transtornos especificados da gengiva e do rebordo alveolar sem dentes", + K069: "Transtorno da gengiva e do rebordo alveolar sem dentes sem outra especificação", + K07: "Anomalias dentofaciais (inclusive a maloclusão)", + K070: "Anomalias importantes (major) do tamanho da mandíbula", + K071: "Anomalias da relação entre a mandíbula com a base do crânio", + K072: "Anomalias da relação entre as arcadas dentárias", + K073: "Anomalias da posição dos dentes", + K074: "Maloclusão, não especificada", + K075: "Anormalidades dentofaciais funcionais", + K076: "Transtornos da articulação temporomandibular", + K078: "Outras anomalias dentofaciais", + K079: "Anomalia dentofacial, sem outra especificação", + K08: "Outros transtornos dos dentes e de suas estruturas de sustentação", + K080: "Exfoliação dos dentes devida a causas sistêmicas", + K081: "Perda de dentes devida a acidente, extração ou a doenças periodontais localizadas", + K082: "Atrofia do rebordo alveolar sem dentes", + K083: "Raiz dentária retida", + K088: "Outros transtornos especificados dos dentes e das estruturas de sustentação", + K089: "Transtorno dos dentes e de suas estruturas de sustentação, sem outra especificação", + K09: "Cistos da região bucal não classificados em outra parte", + K090: "Cistos odontogênicos de desenvolvimento", + K091: "Cistos de desenvolvimento (não-odontogênicos) da região bucal", + K092: "Outros cistos das mandíbulas", + K098: "Outros cistos da região oral não classificados em outra parte", + K099: "Cistos da região oral, sem outras especificações", + K10: "Outras doenças dos maxilares", + K100: "Transtornos do desenvolvimento dos maxilares", + K101: "Granuloma central de células gigantes", + K102: "Afecções inflamatórias dos maxilares", + K103: "Alveolite maxilar", + K108: "Outras doenças especificadas dos maxilares", + K109: "Doença dos maxilares, sem outra especificação", + K11: "Doenças das glândulas salivares", + K110: "Atrofia de glândula salivar", + K111: "Hipertrofia de glândula salivar", + K112: "Sialadenite", + K113: "Abscesso de glândula salivar", + K114: "Fístula de glândula salivar", + K115: "Sialolitíase", + K116: "Mucocele de glândula salivar", + K117: "Alterações da secreção salivar", + K118: "Outras doenças das glândulas salivares", + K119: "Doença de glândula salivar, sem outra especificação", + K12: "Estomatite e lesões correlatas", + K120: "Aftas bucais recidivantes", + K121: "Outras formas de estomatite", + K122: "Celulite e abscesso da boca", + K13: "Outras doenças do lábio e da mucosa oral", + K130: "Doenças dos lábios", + K131: "Mordedura da mucosa das bochechas e dos lábios", + K132: "Leucoplasia e outras afecções do epitélio oral, inclusive da língua", + K133: "Leucoplasia pilosa", + K134: "Lesões granulomatosas e granulomatóides da mucosa oral", + K135: "Fibrose oral submucosa", + K136: "Hiperplasia irritativa da mucosa oral", + K137: "Outras lesões e as não especificadas da mucosa oral", + K14: "Doenças da língua", + K140: "Glossite", + K141: "Língua geográfica", + K142: "Glossite rombóide mediana", + K143: "Hipertrofia das papilas linguais", + K144: "Atrofia das papilas linguais", + K145: "Língua escrotal", + K146: "Glossodínia", + K148: "Outras doenças da língua", + K149: "Doença da língua, sem outra especificação", + K20: "Esofagite", + K21: "Doença de refluxo gastroesofágico", + K210: "Doença de refluxo gastroesofágico com esofagite", + K219: "Doença de refluxo gastroesofágico sem esofagite", + K22: "Outras doenças do esôfago", + K220: "Acalásia do cárdia", + K221: "Úlcera do esôfago", + K222: "Obstrução do esôfago", + K223: "Perfuração do esôfago", + K224: "Discinesia do esôfago", + K225: "Divertículo do esôfago adquirido", + K226: "Síndrome da laceração hemorrágica gastroesofágica", + K227: "Esôfago de Barret", + K228: "Outras doenças especificadas do esôfago", + K229: "Doença do esôfago, sem outra especificação", + K23: "Transtornos do esôfago em doenças classificadas em outra parte", + K230: "Esofagite tuberculosa", + K231: "Megaesôfago na doença de Chagas", + K238: "Transtornos do esôfago em outras doenças classificadas em outra parte", + K25: "Úlcera gástrica", + K250: "Úlcera gástrica - aguda com hemorragia", + K251: "Úlcera gástrica - aguda com perfuração", + K252: "Úlcera gástrica - aguda com hemorragia e perfuração", + K253: "Úlcera gástrica - aguda sem hemorragia ou perfuração", + K254: "Úlcera gástrica - crônica ou não especificada com hemorragia", + K255: "Úlcera gástrica - crônica ou não especificada com perfuração", + K256: "Úlcera gástrica - crônica ou não especificada com hemorragia e perfuração", + K257: "Úlcera gástrica - crônica sem hemorragia ou perfuração", + K259: "Úlcera gástrica - não especificada como aguda ou crônica, sem hemorragia ou perfuração", + K26: "Úlcera duodenal", + K260: "Úlcera duodenal - aguda com hemorragia", + K261: "Úlcera duodenal - aguda com perfuração", + K262: "Úlcera duodenal - aguda com hemorragia e perfuração", + K263: "Úlcera duodenal - aguda sem hemorragia ou perfuração", + K264: "Úlcera duodenal - crônica ou não especificada com hemorragia", + K265: "Úlcera duodenal - crônica ou não especificada com perfuração", + K266: "Úlcera duodenal - crônica ou não especificada com hemorragia e perfuração", + K267: "Úlcera duodenal - crônica sem hemorragia ou perfuração", + K269: "Úlcera duodenal - não especificada como aguda ou crônica, sem hemorragia ou perfuração", + K27: "Úlcera péptica de localização não especificada", + K270: "Úlcera péptica de localização não especificada - aguda com hemorragia", + K271: "Úlcera péptica de localização não especificada - aguda com perfuração", + K272: "Úlcera péptica de localização não especificada - aguda com hemorragia e perfuração", + K273: "Úlcera péptica de localização não especificada - aguda sem hemorragia ou perfuração", + K274: "Úlcera péptica de localização não especificada - crônica ou não especificada com hemorragia", + K275: "Úlcera péptica de localização não especificada - crônica ou não especificada com perfuração", + K276: "Úlcera péptica de localização não especificada - crônica ou não especificada com hemorragia e perfuração", + K277: "Úlcera péptica de localização não especificada - crônica sem hemorragia ou perfuração", + K279: "Úlcera péptica de localização não especificada - não especificada como aguda ou crônica, sem hemorragia ou perfuração", + K28: "Úlcera gastrojejunal", + K280: "Úlcera gastrojejunal - aguda com hemorragia", + K281: "Úlcera gastrojejunal - aguda com perfuração", + K282: "Úlcera gastrojejunal - aguda com hemorragia e perfuração", + K283: "Úlcera gastrojejunal - aguda sem hemorragia ou perfuração", + K284: "Úlcera gastrojejunal - crônica ou não especificada com hemorragia", + K285: "Úlcera gastrojejunal - crônica ou não especificada com perfuração", + K286: "Úlcera gastrojejunal - crônica ou não especificada com hemorragia e perfuração", + K287: "Úlcera gastrojejunal - crônica sem hemorragia ou perfuração", + K289: "Úlcera gastrojejunal - não especificada como aguda ou crônica, sem hemorragia ou perfuração", + K29: "Gastrite e duodenite", + K290: "Gastrite hemorrágica aguda", + K291: "Outras gastrites agudas", + K292: "Gastrite alcoólica", + K293: "Gastrite superficial crônica", + K294: "Gastrite atrófica crônica", + K295: "Gastrite crônica, sem outra especificação", + K296: "Outras gastrites", + K297: "Gastrite não especificada", + K298: "Duodenite", + K299: "Gastroduodenite, sem outra especificação", + K30: "Dispepsia", + K31: "Outras doenças do estômago e do duodeno", + K310: "Dilatação aguda do estômago", + K311: "Estenose pilórica hipertrófica do adulto", + K312: "Estenose e estreitamento em ampulheta do estômago", + K313: "Espasmo do piloro não classificado em outra parte", + K314: "Divertículo gástrico", + K315: "Obstrução do duodeno", + K316: "Fístula do estômago e do duodeno", + K317: "Pólipo do estômago e do duodeno", + K318: "Outras doenças especificadas do estômago e do duodeno", + K319: "Doenças do estômago e do duodeno, sem outra especificação", + K35: "Apendicite aguda", + K350: "Apendicite aguda com peritonite generalizada", + K351: "Apendicite aguda com abscesso peritonial", + K359: "Apendicite aguda sem outra especificação", + K36: "Outras formas de apendicite", + K37: "Apendicite, sem outras especificações", + K38: "Outras doenças do apêndice", + K380: "Hiperplasia do apêndice", + K381: "Concreções apendiculares", + K382: "Divertículo do apêndice", + K383: "Fístula do apêndice", + K388: "Outras doenças especificadas do apêndice", + K389: "Doença do apêndice, sem outra especificação", + K40: "Hérnia inguinal", + K400: "Hérnia inguinal bilateral, com obstrução, sem gangrena", + K401: "Hérnia inguinal bilateral, com gangrena", + K402: "Hérnia inguinal bilateral, sem obstrução ou gangrena", + K403: "Hérnia inguinal unilateral ou não especificada, com obstrução sem gangrena", + K404: "Hérnia inguinal unilateral ou não especificada, com gangrena", + K409: "Hérnia inguinal unilateral ou não especificada, sem obstrução ou gangrena", + K41: "Hérnia femoral", + K410: "Hérnia femoral bilateral, com obstrução, sem gangrena", + K411: "Hérnia femoral bilateral, com gangrena", + K412: "Hérnia femoral bilateral, sem obstrução ou gangrena", + K413: "Hérnia femoral unilateral ou não especificada, com obstrução, sem gangrena", + K414: "Hérnia femoral unilateral ou não especificada, com gangrena", + K419: "Hérnia femoral unilateral ou não especificada, sem obstrução ou gangrena", + K42: "Hérnia umbilical", + K420: "Hérnia umbilical com obstrução, sem gangrena", + K421: "Hérnia umbilical com gangrena", + K429: "Hérnia umbilical sem obstrução ou gangrena", + K43: "Hérnia ventral", + K430: "Hérnia ventral com obstrução, sem gangrena", + K431: "Hérnia ventral com gangrena", + K439: "Hérnia ventral sem obstrução ou gangrena", + K44: "Hérnia diafragmática", + K440: "Hérnia diafragmática com obstrução, sem gangrena", + K441: "Hérnia diafragmática com gangrena", + K449: "Hérnia diafragmática sem obstrução ou gangrena", + K45: "Outras hérnias abdominais", + K450: "Outras hérnias abdominais especificadas, com obstrução, sem gangrena", + K451: "Outras hérnias abdominais especificadas, com gangrena", + K458: "Outras hérnias abdominais especificadas, sem obstrução ou gangrena", + K46: "Hérnia abdominal não especificada", + K460: "Hérnia abdominal não especificada, com obstrução, sem gangrena", + K461: "Hérnia abdominal não especificada com gangrena", + K469: "Hérnia abdominal não especificada, sem obstrução ou gangrena", + K50: "Doença de Crohn [enterite regional]", + K500: "Doença de Crohn do intestino delgado", + K501: "Doença de Crohn do intestino grosso", + K508: "Outra forma de doença de Crohn", + K509: "Doença de Crohn de localização não especificada", + K51: "Colite ulcerativa", + K510: "Enterocolite ulcerativa (crônica)", + K511: "Ileocolite ulcerativa (crônica)", + K512: "Proctite ulcerativa (crônica)", + K513: "Retossigmoidite ulcerativa (crônica)", + K514: "Pseudopolipose do cólon", + K515: "Proctocolite mucosa", + K518: "Outras colites ulcerativas", + K519: "Colite ulcerativa, sem outra especificação", + K52: "Outras gastroenterites e colites não-infecciosas", + K520: "Gastroenterite e colite devida à radiação", + K521: "Gastroenterite e colite tóxicas", + K522: "Gastroenterite e colite alérgicas ou ligadas à dieta", + K528: "Outras gastroenterites e colites especificadas, não-infecciosas", + K529: "Gastroenterite e colite não-infecciosas, não especificadas", + K55: "Transtornos vasculares do intestino", + K550: "Transtornos vasculares agudos do intestino", + K551: "Transtornos vasculares crônicos do intestino", + K552: "Angiodisplasia do cólon", + K558: "Outros transtornos vasculares do intestino", + K559: "Transtorno vascular do intestino, sem outra especificação", + K56: "Íleo paralítico e obstrução intestinal sem hérnia", + K560: "Íleo paralítico", + K561: "Intussuscepção", + K562: "Volvo", + K563: "Íleo biliar", + K564: "Outras obstruções do intestino", + K565: "Aderências intestinais (bridas) com obstrução", + K566: "Outras formas de obstrução intestinal, e as não especificadas", + K567: "Íleo, não especificado", + K57: "Doença diverticular do intestino", + K570: "Doença diverticular do intestino delgado com perfuração e abscesso", + K571: "Doença diverticular do intestino delgado sem perfuração ou abscesso", + K572: "Doença diverticular do intestino grosso com perfuração e abscesso", + K573: "Doença diverticular do intestino grosso sem perfuração ou abscesso", + K574: "Doença diverticular concomitante dos intestinos delgado e grosso com perfuração e abscesso", + K575: "Doença diverticular concomitante dos intestinos delgado e grosso sem perfuração ou abscesso", + K578: "Doença diverticular do intestino, de localização não especificada, com perfuração e abscesso", + K579: "Doença diverticular do intestino, de localização não especificada, sem perfuração ou abscesso", + K58: "Síndrome do cólon irritável", + K580: "Síndrome do cólon irritável com diarréia", + K589: "Síndrome do cólon irritável sem diarréia", + K59: "Outros transtornos funcionais do intestino", + K590: "Constipação", + K591: "Diarréia funcional", + K592: "Cólon neurogênico não classificado em outra parte", + K593: "Megacólon não classificado em outra parte", + K594: "Espasmo anal", + K598: "Outros transtornos funcionais especificados do intestino", + K599: "Transtorno intestinal funcional, não especificado", + K60: "Fissura e fístula das regiões anal e retal", + K600: "Fissura anal aguda", + K601: "Fissura anal crônica", + K602: "Fissura anal, não especificada", + K603: "Fístula anal", + K604: "Fístula retal", + K605: "Fístula anorretal", + K61: "Abscesso das regiões anal e retal", + K610: "Abscesso anal", + K611: "Abscesso retal", + K612: "Abscesso anorretal", + K613: "Abscesso ísquio-retal", + K614: "Abscesso intra-esfincteriano", + K62: "Outras doenças do reto e do ânus", + K620: "Pólipo anal", + K621: "Pólipo retal", + K622: "Prolapso anal", + K623: "Prolapso retal", + K624: "Estenose do ânus e do reto", + K625: "Hemorragia do ânus e do reto", + K626: "Úlcera do ânus e do reto", + K627: "Proctite por radiação", + K628: "Outras doenças especificadas do ânus e do reto", + K629: "Doença do ânus e do reto, sem outra especificação", + K63: "Outras doenças do intestino", + K630: "Abscesso do intestino", + K631: "Perfuração do intestino (não-traumática)", + K632: "Fístula do intestino", + K633: "Úlcera do intestino", + K634: "Enteroptose", + K635: "Pólipo do cólon", + K638: "Outras doenças especificadas do intestino", + K639: "Doença do intestino, sem outra especificação", + K65: "Peritonite", + K650: "Peritonite aguda", + K658: "Outras peritonites", + K659: "Peritonite, sem outras especificações", + K66: "Outros transtornos do peritônio", + K660: "Aderências peritoniais", + K661: "Hemoperitônio", + K668: "Outras afecções especificadas do peritônio", + K669: "Afecções do peritônio, sem outra especificação", + K67: "Comprometimento do peritônio, em doenças infecciosas classificadas em outra parte", + K670: "Peritonite por clamídias", + K671: "Peritonite gonocócica", + K672: "Peritonite sifilítica", + K673: "Peritonite tuberculosa", + K678: "Outras formas de comprometimento do peritônio em doenças infecciosas classificadas em outra parte", + K70: "Doença alcoólica do fígado", + K700: "Fígado gorduroso alcoólico", + K701: "Hepatite alcoólica", + K702: "Fibrose e esclerose alcoólicas do fígado", + K703: "Cirrose hepática alcoólica", + K704: "Insuficiência hepática alcoólica", + K709: "Doença alcoólica do fígado, sem outra especificação", + K71: "Doença hepática tóxica", + K710: "Doença hepática tóxica com colestase", + K711: "Doença hepática tóxica com necrose hepática", + K712: "Doença hepática tóxica com hepatite aguda", + K713: "Doença hepática tóxica com hepatite crônica persistente", + K714: "Doença hepática tóxica com hepatite crônica lobular", + K715: "Doença hepática tóxica com hepatite crônica ativa", + K716: "Doença hepática tóxica com hepatite não classificada em outra parte", + K717: "Doença hepática tóxica com fibrose e cirrose hepáticas", + K718: "Doença hepática tóxica com outros transtornos do fígado", + K719: "Doença hepática tóxica, sem outra especificação", + K72: "Insuficiência hepática não classificada em outra parte", + K720: "Insuficiência hepática aguda e subaguda", + K721: "Insuficiência hepática crônica", + K729: "Insuficiência hepática, sem outras especificações", + K73: "Hepatite crônica não classificada em outra parte", + K730: "Hepatite crônica persistente, não classificada em outra parte", + K731: "Hepatite crônica lobular, não classificada em outra parte", + K732: "Hepatite crônica ativa, não classificada em outra parte", + K738: "Outras hepatites crônicas não classificada em outra parte", + K739: "Hepatite crônica, sem outra especificação", + K74: "Fibrose e cirrose hepáticas", + K740: "Fibrose hepática", + K741: "Esclerose hepática", + K742: "Fibrose hepática com esclerose hepática", + K743: "Cirrose biliar primária", + K744: "Cirrose biliar secundária", + K745: "Cirrose biliar, sem outra especificação", + K746: "Outras formas de cirrose hepática e as não especificadas", + K75: "Outras doenças inflamatórias do fígado", + K750: "Abscesso hepático", + K751: "Flebite da veia porta", + K752: "Hepatite reativa não-específica", + K753: "Hepatite granulomatosa não classificada em outra parte", + K754: "Hepatite autoimune", + K758: "Outras doenças hepáticas inflamatórias especificadas", + K759: "Doença hepática inflamatória, sem outra especificação", + K76: "Outras doenças do fígado", + K760: "Degeneração gordurosa do fígado não classificada em outra parte", + K761: "Congestão passiva crônica do fígado", + K762: "Necrose hemorrágica central do fígado", + K763: "Infarto do fígado", + K764: "Peliose hepática", + K765: "Doença hepática veno-oclusiva", + K766: "Hipertensão portal", + K767: "Síndrome hepatorrenal", + K768: "Outras doenças especificadas do fígado", + K769: "Doença hepática, sem outra especificação", + K77: "Transtornos do fígado em doenças classificadas em outra parte", + K770: "Transtornos hepáticos em doenças infecciosas e parasitárias classificadas em outra parte", + K778: "Transtornos hepáticos em outras doenças classificadas em outra parte", + K80: "Colelitíase", + K800: "Calculose da vesícula biliar com colicistite aguda", + K801: "Calculose da vesícula biliar com outras formas de colecistite", + K802: "Calculose da vesícula biliar sem colecistite", + K803: "Calculose de via biliar com colangite", + K804: "Calculose de via biliar com colecistite", + K805: "Calculose de via biliar sem colangite ou colecistite", + K808: "Outras colelitíases", + K81: "Colecistite", + K810: "Colecistite aguda", + K811: "Colecistite crônica", + K818: "Outras colecistites", + K819: "Colecistite, sem outra especificação", + K82: "Outras doenças da vesícula biliar", + K820: "Obstrução da vesícula biliar", + K821: "Hidropsia da vesícula biliar", + K822: "Perfuração da vesícula biliar", + K823: "Fístula da vesícula biliar", + K824: "Colesterolose da vesícula biliar", + K828: "Outras doenças especificadas da vesícula biliar", + K829: "Doença da vesícula biliar, sem outra especificação", + K83: "Outras doenças das vias biliares", + K830: "Colangite", + K831: "Obstrução de via biliar", + K832: "Perfuração de via biliar", + K833: "Fístula de via biliar", + K834: "Espasmo do esfíncter de Oddi", + K835: "Cisto biliar", + K838: "Outras doenças especificadas das vias biliares", + K839: "Doença das vias biliares, sem outra especificação", + K85: "Pancreatite aguda", + K850: "Pancreatite aguda idiopática", + K851: "Pancreatite aguda biliar", + K852: "Pancreatite aguda induzida por álcool", + K853: "Pancreatite aguda induzida por droga", + K858: "Outras pancreatites agudas", + K859: "Pancreatite aguda, não especificada", + K86: "Outras doenças do pâncreas", + K860: "Pancreatite crônica induzida por álcool", + K861: "Outras pancreatites crônicas", + K862: "Cisto do pâncreas", + K863: "Pseudocisto do pâncreas", + K868: "Outras doenças especificadas do pâncreas", + K869: "Doença do pâncreas, sem outra especificação", + K87: "Transtornos da vesícula biliar, das vias biliares e do pâncreas em doenças classificadas em outra parte", + K870: "Transtornos da vesícula biliar e das vias biliares em doenças classificadas em outra parte", + K871: "Transtornos do pâncreas em doenças classificadas em outra parte", + K90: "Má-absorção intestinal", + K900: "Doença celíaca", + K901: "Espru tropical", + K902: "Síndrome da alça cega não classificada em outra parte", + K903: "Esteatorréia pancreática", + K904: "Má-absorção devida a intolerância não classificada em outra parte", + K908: "Outras formas de má-absorção intestinal", + K909: "Má-absorção intestinal, sem outra especificação", + K91: "Transtornos do aparelho digestivo pós-procedimentos, não classificados em outra parte", + K910: "Vômitos pós-cirurgia gastrointestinal", + K911: "Síndromes pós-cirurgia gástrica", + K912: "Má-absorção pós-cirúrgica não classificada em outra parte", + K913: "Obstrução intestinal pós-operatória", + K914: "Mau funcionamento de colostomia e enterostomia", + K915: "Síndrome pós-colecistectomia", + K918: "Outros transtornos do aparelho digestivo, pós-cirúrgicos, não classificados em outra parte", + K919: "Transtorno do aparelho digestivo pós procedimento", + K92: "Outras doenças do aparelho digestivo", + K920: "Hematêmese", + K921: "Melena", + K922: "Hemorragia gastrointestinal, sem outra especificação", + K928: "Outras doenças especificadas do aparelho digestivo", + K929: "Doença do aparelho digestivo, sem outra especificação", + K93: "Transtornos de outros órgãos digestivos em doenças classificadas em outra parte", + K930: "Transtornos devido a tuberculose do intestino, do peritônio e dos gânglios do mesentério", + K931: "Megacólon na doença de Chagas", + K938: "Transtornos de outros órgãos digestivos especificados em doenças classificadas em outra parte", + L00: "Síndrome da pele escaldada estafilocócica do recém-nascido", + L01: "Impetigo", + L010: "Impetigo [qualquer localização] [qualquer microorganismo]", + L011: "Impetiginização de outras dermatoses", + L02: "Abscesso cutâneo, furúnculo e antraz", + L020: "Abscesso cutâneo, furúnculo e antraz da face", + L021: "Abscesso cutâneo, furúnculo e antraz do pescoço", + L022: "Abscesso cutâneo, furúnculo e antraz do tronco", + L023: "Abscesso cutâneo, furúnculo e antraz da nádega", + L024: "Abscesso cutâneo, furúnculo e antraz do(s) membro(s)", + L028: "Abscesso cutâneo, furúnculo e antraz de outras localizações", + L029: "Abscesso cutâneo, furúnculo e antraz de localização não especificada", + L03: "Celulite (Flegmão)", + L030: "Celulite de dedos das mãos e dos pés", + L031: "Celulite de outras partes do(s) membro(s)", + L032: "Celulite da face", + L033: "Celulite do tronco", + L038: "Celulite de outros locais", + L039: "Celulite não especificada", + L04: "Linfadenite aguda", + L040: "Linfadenite aguda de face, cabeça e pescoço", + L041: "Linfadenite aguda do tronco", + L042: "Linfadenite aguda de membro superior", + L043: "Linfadenite aguda de membro inferior", + L048: "Linfadenite aguda de outras localizações", + L049: "Linfadenite aguda de localização não especificada", + L05: "Cisto pilonidal", + L050: "Cisto pilonidal com abscesso", + L059: "Cisto pilonidal sem abscesso", + L08: "Outras infecções localizadas da pele e do tecido subcutâneo", + L080: "Piodermite", + L081: "Eritrasma", + L088: "Outras infecções localizadas, especificadas, da pele e do tecido subcutâneo", + L089: "Infecção localizada da pele e do tecido subcutâneo, não especificada", + L10: "Pênfigo", + L100: "Pênfigo vulgar", + L101: "Pênfigo vegetante", + L102: "Pênfigo foliáceo", + L103: "Pênfigo brasileiro [fogo selvagem]", + L104: "Pênfigo eritematoso", + L105: "Pênfigo induzido por drogas", + L108: "Outras formas de pênfigo", + L109: "Pênfigo, não especificado", + L11: "Outras afecções acantolíticas", + L110: "Ceratose folicular adquirida", + L111: "Dermatose acantolítica transitória [Grover]", + L118: "Outras afecções acantolíticas especificadas", + L119: "Afecções acantolíticas não especificadas", + L12: "Penfigóide", + L120: "Penfigóide bolhoso", + L121: "Penfigóide cicatricial", + L122: "Doença bolhosa crônica da infância", + L123: "Epidermólise bolhosa adquirida", + L128: "Outras formas de penfigóide", + L129: "Penfigóide, não especificado", + L13: "Outras afecções bolhosas", + L130: "Dermatite herpetiforme", + L131: "Dermatite pustular subcorneana", + L138: "Outras afecções bolhosas especificadas", + L139: "Doença bolhosa, não especificada", + L14: "Afecções bolhosas em doenças classificadas em outra parte", + L20: "Dermatite atópica", + L200: "Prurigo de Besnier", + L208: "Outras dermatites atópicas", + L209: "Dermatite atópica, não especificada", + L21: "Dermatite seborréica", + L210: "Seborréia do couro cabeludo", + L211: "Dermatite seborréica infantil", + L218: "Outras dermatites seborréicas", + L219: "Dermatite seborréica, não especificada", + L22: "Dermatite das fraldas", + L23: "Dermatites alérgicas de contato", + L230: "Dermatite alérgica de contato devida a metais", + L231: "Dermatite alérgica de contato devida a adesivos", + L232: "Dermatite alérgica de contato devida a cosméticos", + L233: "Dermatite alérgica de contato devido a drogas em contato com a pele", + L234: "Dermatite alérgica de contato devida a corantes", + L235: "Dermatite alérgica de contato devida a outros produtos químicos", + L236: "Dermatite alérgica de contato devida a alimentos em contato com a pele", + L237: "Dermatite alérgica de contato devido a plantas, exceto alimentos", + L238: "Dermatite alérgica de contato devido a outros agentes", + L239: "Dermatite alérgica de contato, de causa não especificada", + L24: "Dermatites de contato por irritantes", + L240: "Dermatite de contato por irritantes devida a detergentes", + L241: "Dermatite de contato por irritantes devido a óleos e gorduras", + L242: "Dermatite de contato por irritantes devida a solventes", + L243: "Dermatite de contato por irritantes devida a cosméticos", + L244: "Dermatite de contato por irritantes devida a drogas em contato com a pele", + L245: "Dermatite de contato por irritantes devida a outros produtos químicos", + L246: "Dermatite de contato por irritantes devida a alimentos em contato com a pele", + L247: "Dermatite de contato por irritantes devido a plantas, exceto alimentos", + L248: "Dermatite de contato por irritantes devido a outros agentes", + L249: "Dermatite de contato por irritantes, de causa não especificada", + L25: "Dermatite de contato não especificada", + L250: "Dermatite de contato não especificada devida a cosméticos", + L251: "Dermatite de contato não especificada devida a drogas em contato com a pele", + L252: "Dermatite de contato não especificada devida a corantes", + L253: "Dermatite de contato não especificada devida a outros produtos químicos", + L254: "Dermatite de contato não especificada devida a alimentos em contato com a pele", + L255: "Dermatite de contato não especificada devida a plantas, exceto alimentos", + L258: "Dermatite de contato não especificada devida a outros agentes", + L259: "Dermatite de contato não especificada, de causa não especificada", + L26: "Dermatite esfoliativa", + L27: "Dermatite devida a substâncias de uso interno", + L270: "Erupção cutânea generalizada devida a drogas e medicamentos", + L271: "Erupção cutânea localizada devida a drogas e medicamentos", + L272: "Dermatite devida à ingestão de alimentos", + L278: "Dermatite devida a outras substâncias de uso interno", + L279: "Dermatite devida a substância não especificada de uso interno", + L28: "Líquen simples crônico e prurigo", + L280: "Líquen simples crônico", + L281: "Prurigo nodular", + L282: "Outras formas de prurigo", + L29: "Prurido", + L290: "Prurido anal", + L291: "Prurido escrotal", + L292: "Prurido vulvar", + L293: "Prurido anogenital, não especificado", + L298: "Outras formas de prurido", + L299: "Prurido não especificado", + L30: "Outras dermatites", + L300: "Dermatite numular", + L301: "Disidrose [pompholyx]", + L302: "Autossensibilização cutânea", + L303: "Dermatite infectada", + L304: "Intertrigo eritematoso", + L305: "Pitiríase alba", + L308: "Outras dermatites especificadas", + L309: "Dermatite não especificada", + L40: "Psoríase", + L400: "Psoríase vulgar", + L401: "Psoríase pustulosa generalizada", + L402: "Acrodermatite contínua", + L403: "Pustulose palmar e plantar", + L404: "Psoríase gutata", + L405: "Artropatia psoriásica", + L408: "Outras formas de psoríase", + L409: "Psoríase não especificada", + L41: "Parapsoríase", + L410: "Pitiríase liquenóide e varioliforme aguda", + L411: "Pitiríase liquenóide crônica", + L412: "Papulose linfomatóide", + L413: "Parapsoríase de pequenas placas", + L414: "Parapsoríase de grandes placas", + L415: "Parapsoríase retiforme", + L418: "Outras parapsoríases", + L419: "Parapsoríase, não especificada", + L42: "Pitiríase rósea", + L43: "Líquen plano", + L430: "Líquen plano hipertrófico", + L431: "Líquen plano bolhoso", + L432: "Reação liquenóide a droga", + L433: "Líquen plano subagudo (ativo)", + L438: "Outras formas de líquen plano", + L439: "Líquen plano, não especificado", + L44: "Outras afecções pápulo-descamativas", + L440: "Pitiríase rubra pilar", + L441: "Líquen nítido", + L442: "Líquen estriado", + L443: "Líquen rubro moniliforme", + L444: "Acrodermatite papular infantil [Síndrome de Gianotti-Crosti]", + L448: "Outras afecções pápulo-descamativas especificadas", + L449: "Afecções pápulo-descamativas, não especificadas", + L45: "Afecções pápulo-descamativas em doenças classificadas em outra parte", + L50: "Urticária", + L500: "Urticária alérgica", + L501: "Urticária idiopática", + L502: "Urticária devida a frio e a calor", + L503: "Urticária dermatográfica", + L504: "Urticária vibratória", + L505: "Urticária colinérgica", + L506: "Urticária de contato", + L508: "Outras urticárias", + L509: "Urticária não especificada", + L51: "Eritema polimorfo (eritema multiforme)", + L510: "Eritema multiforme não bolhoso", + L511: "Eritema multiforme bolhoso", + L512: "Necrólise epidérmica tóxica [Síndrome de Lyell]", + L518: "Outras formas de eritema multiforme", + L519: "Eritema multiforme, não especificado", + L52: "Eritema nodoso", + L53: "Outras afecções eritematosas", + L530: "Eritema tóxico", + L531: "Eritema anular centrífugo", + L532: "Eritema marginado", + L533: "Outras formas de eritema figurado crônico", + L538: "Outras afecções eritematosas especificadas", + L539: "Afecções eritematosas, não especificadas", + L54: "Eritema em doenças classificadas em outra parte", + L540: "Eritema marginado na febre reumática aguda", + L548: "Eritema em outras doenças classificadas em outra parte", + L55: "Queimadura solar", + L550: "Queimadura solar de primeiro grau", + L551: "Queimadura solar de segundo grau", + L552: "Queimadura solar de terceiro grau", + L558: "Outras queimaduras solares", + L559: "Queimadura solar, não especificada", + L56: "Outras alterações agudas da pele devidas a radiação ultravioleta", + L560: "Resposta fototóxica a drogas", + L561: "Resposta fotoalérgica a drogas", + L562: "Dermatite por fotocontato [dermatite do berloque]", + L563: "Urticária solar", + L564: "Erupção polimorfa à luz", + L568: "Outras alterações agudas especificadas da pele devidas a radiação ultravioleta", + L569: "Alterações agudas da pele devidas a radiação ultravioleta, não especificadas", + L57: "Alterações da pele devidas à exposição crônica à radiação não ionizante", + L570: "Ceratose actínica", + L571: "Reticulóide actínica", + L572: "Cútis romboidal da nuca", + L573: "Poiquilodermia de Civatte", + L574: "Cútis laxa senil", + L575: "Granuloma actínico", + L578: "Outras alterações da pele devidas a exposição crônica à radiação não-ionizante", + L579: "Alterações da pele devidas a exposição crônica a radiação não-ionizante, não especificadas", + L58: "Radiodermatite", + L580: "Radiodermatite aguda", + L581: "Radiodermatite crônica", + L589: "Radiodermatite, não especificada", + L59: "Outras afecções da pele e do tecido subcutâneo relacionadas com a radiação", + L590: "Eritema devido ao calor ou ao fogo [dermatite ab igne]", + L598: "Outras afecções especificadas da pele e do tecido subcutâneo relacionadas com a radiação", + L599: "Afecções da pele e do tecido subcutâneo relacionadas com a radiação, não especificadas", + L60: "Afecções das unhas", + L600: "Unha encravada", + L601: "Onicólise", + L602: "Onicogrifose", + L603: "Distrofia ungueal", + L604: "Linhas de Beau", + L605: "Síndrome das unhas amareladas", + L608: "Outras afecções das unhas", + L609: "Afecções das unhas, não especificadas", + L62: "Afecções das unhas em doenças classificadas em outra parte", + L620: "Paquidermoperiostose com unhas hipocráticas (em vidro de relógio)", + L628: "Afecções das unhas em outras doenças classificadas em outra parte", + L63: "Alopécia areata", + L630: "Alopécia total (capitis)", + L631: "Alopécia universal", + L632: "Ofíase", + L638: "Outras formas de alopécia areata", + L639: "Alopécia areata, não especificada", + L64: "Alopécia androgênica", + L640: "Alopécia androgênica induzida por droga", + L648: "Outras alopécias androgênicas", + L649: "Alopécia androgênica, não especificada", + L65: "Outras formas não cicatriciais da perda de cabelos ou pêlos", + L650: "Eflúvio telógeno", + L651: "Eflúvio anágeno", + L652: "Alopécia mucinosa", + L658: "Outras formas, especificadas, não cicatriciais, de perda de cabelos ou pêlos", + L659: "Perda de cabelos ou pêlos não cicatriciais, não especificada", + L66: "Alopécia cicatricial [perda de cabelos ou pêlos, cicatricial]", + L660: "Pseudopelada", + L661: "Líquen planopilar", + L662: "Foliculite descalvante", + L663: "Perifoliculite abscedante da cabeça", + L664: "Foliculite uleritematosa reticulada", + L668: "Outras formas de alopécia cicatricial", + L669: "Alopécia cicatricial, não especificada", + L67: "Anormalidades da cor e do pedículo dos cabelos e dos pêlos", + L670: "Tricorrexe nodosa", + L671: "Variações da cor dos cabelos ou pêlos", + L678: "Outras anormalidades da cor e do pedículo dos cabelos ou pêlos", + L679: "Anormalidades da cor e do pedículo dos cabelos e dos pêlos, não especificadas", + L68: "Hipertricose", + L680: "Hirsutismo", + L681: "Hipertricose lanuginosa adquirida", + L682: "Hipertricose localizada", + L683: "Politríquia", + L688: "Outras formas de hipertricose", + L689: "Hipertricose, não especificada", + L70: "Acne", + L700: "Acne vulgar", + L701: "Acne conglobata", + L702: "Acne varioliforme", + L703: "Acne tropical", + L704: "Acne infantil", + L705: "Acne escoriada das mulheres jovens", + L708: "Outras formas de acne", + L709: "Acne, não especificada", + L71: "Rosácea", + L710: "Dermatite perioral", + L711: "Rinofima", + L718: "Outras formas de rosácea", + L719: "Rosácea, não especificada", + L72: "Cistos foliculares da pele e do tecido subcutâneo", + L720: "Cisto epidérmico", + L721: "Cisto triquilemal", + L722: "Esteatocistoma múltiplo", + L728: "Outras formas de cistos foliculares da pele e do tecido subcutâneo", + L729: "Cisto folicular, não especificado da pele e do tecido subcutâneo", + L73: "Outras afecções foliculares", + L730: "Acne quelóide", + L731: "Pseudofoliculite da barba", + L732: "Hidradenite supurativa", + L738: "Outras afecções foliculares especificadas", + L739: "Afecções foliculares, não especificadas", + L74: "Afecções das glândulas sudoríparas écrinas", + L740: "Miliária rubra", + L741: "Miliária cristalina", + L742: "Miliária profunda", + L743: "Miliária, não especificada", + L744: "Anidrose", + L748: "Outras afecções das glândulas sudoríparas écrinas", + L749: "Afecções das glândulas sudoríparas écrinas, não especificadas", + L75: "Afecções das glândulas sudoríparas apócrinas", + L750: "Bromidrose", + L751: "Cromidrose", + L752: "Miliária apócrina", + L758: "Outras afecções das glândulas sudoríparas apócrinas", + L759: "Afecções de glândulas sudoríparas apócrinas, não especificadas", + L80: "Vitiligo", + L81: "Outros transtornos da pigmentação", + L810: "Hiperpigmentação pós-inflamatória", + L811: "Cloasma", + L812: "Sardas", + L813: "Manchas café-com-leite", + L814: "Outras formas de hiperpigmentação pela melanina", + L815: "Leucodermia não classificada em outra parte", + L816: "Outros transtornos ligados à diminuição da formação de melanina", + L817: "Dermatose purpúrica pigmentada", + L818: "Outros transtornos especificados da pigmentação", + L819: "Transtorno da pigmentação, não especificado", + L82: "Ceratose seborréica", + L83: "Acantose nigricans", + L84: "Calos e calosidades", + L85: "Outras formas de espessamento epidérmico", + L850: "Ictiose adquirida", + L851: "Ceratose adquirida [ceratodermia] palmar e plantar", + L852: "Ceratose punctata (palmar e plantar)", + L853: "Xerose cutânea", + L858: "Outras formas de espessamento epidérmico", + L859: "Espessamento epidérmico, não especificado", + L86: "Ceratodermia em doenças classificadas em outra parte", + L87: "Transtornos da eliminação transepidérmica", + L870: "Ceratose folicular e parafolicular penetrante na pele [Síndrome de Kyrle]", + L871: "Colagenose perfurante reativa", + L872: "Elastose perfurante serpiginosa", + L878: "Outros transtornos da eliminação transepidérmica", + L879: "Transtorno da eliminação transepidérmica, não especificado", + L88: "Piodermite gangrenosa", + L89: "Úlcera de decúbito", + L90: "Afecções atróficas da pele", + L900: "Líquen escleroso e atrófico", + L901: "Anetodermia de Schweninger-Buzzi", + L902: "Anetodermia de Jadassohn-Pellizzari", + L903: "Atrofodermia de Pasini e Pierini", + L904: "Acrodermatite crônica atrófica", + L905: "Cicatrizes e fibrose cutânea", + L906: "Estrias atróficas", + L908: "Outras afecções atróficas da pele", + L909: "Afecções atróficas da pele, não especificadas", + L91: "Afecções hipertróficas da pele", + L910: "Cicatriz quelóide", + L918: "Outras afecções hipertróficas da pele", + L919: "Afecções hipertróficas da pele, não especificadas", + L92: "Afecções granulomatosas da pele e do tecido subcutâneo", + L920: "Granuloma anular", + L921: "Necrobiose lipoídica não classificada em outra parte", + L922: "Granuloma facial [granuloma eosinófilo da pele]", + L923: "Granuloma de corpo estranho da pele e do tecido subcutâneo", + L928: "Outras afecções granulomatosas da pele e do tecido subcutâneo", + L929: "Afecções granulomatosas da pele e do tecido subcutâneo, não especificados", + L93: "Lúpus eritematoso", + L930: "Lúpus eritematoso discóide", + L931: "Lúpus eritematoso cutâneo subagudo", + L932: "Outras formas de lúpus eritematoso localizado", + L94: "Outras afecções localizadas do tecido conjuntivo", + L940: "Esclerodermia localizada [morféia]", + L941: "Esclerodermia linear", + L942: "Calcinose cutânea", + L943: "Esclerodactilia", + L944: "Pápulas de Gottron", + L945: "Poiquilodermia vascular atrófica", + L946: "Ainhum", + L948: "Outras afecções localizadas do tecido conjuntivo, especificadas", + L949: "Afecções localizadas do tecido conjuntivo, não especificadas", + L95: "Vasculite limitada a pele não classificadas em outra parte", + L950: "Vasculite livedóide", + L951: "Eritema elevado diutino (duradouro)", + L958: "Outras vasculites limitadas a pele", + L959: "Vasculites limitadas a pele, não especificadas", + L97: "Úlcera dos membros inferiores não classificada em outra parte", + L98: "Outras afecções da pele e do tecido subcutâneo não classificadas em outra parte", + L980: "Granuloma piogênico", + L981: "Dermatite factícia", + L982: "Dermatose neutrofílica febril [Sweet]", + L983: "Celulite eosinofílica [Wells]", + L984: "Úlcera crônica da pele, não classificada em outra parte", + L985: "Mucinose da pele", + L986: "Outras afecções infiltrativas da pele e do tecido subcutâneo", + L988: "Outras afecções especificadas da pele e do tecido subcutâneo", + L989: "Afecções da pele e do tecido subcutâneo, não especificados", + L99: "Outras afecções da pele e do tecido subcutâneo em doenças classificadas em outra parte", + L990: "Amiloidose cutânea", + L998: "Outras afecções especificadas da pele e do tecido subcutâneo em doenças classificadas em outra parte", + M00: "Artrite piogênica", + M000: "Artrite e pioliartrite estafilocócicas", + M001: "Artrite e poliartrite pneumocócicas", + M002: "Outras artrites e poliartrites estreptocócicas", + M008: "Artrite e poliartrite devidas a outro agente bacteriano especificado", + M009: "Artrite piogênica, não especificada", + M01: "Infecções diretas da articulação em doenças infecciosas e parasitárias classificadas em outra parte", + M010: "Artrite meningocócica", + M011: "Artrite tuberculosa", + M012: "Artrite na doença de Lyme", + M013: "Artrite em outras doenças bacterianas classificadas em outra parte", + M014: "Artrite na rubéola", + M015: "Artrite em outras doenças virais classificadas em outra parte", + M016: "Artrite em micoses", + M018: "Artrite em outras doenças infecciosas e parasitárias classificadas em outra parte", + M02: "Artropatias reacionais", + M020: "Artropatia pós-derivação intestinal", + M021: "Artropatia pós-desintérica", + M022: "Artropatia pós-imunização", + M023: "Doença de Reiter", + M028: "Outras artropatias reacionais", + M029: "Artropatia reacional não especificada", + M03: "Artropatias pós-infecciosas e reacionais em doenças infecciosas classificadas em outra parte", + M030: "Artrite pós-meningocócica", + M031: "Artropatia pós-infecciosa na sífilis", + M032: "Outras artropatias pós-infecciosas em doenças classificadas em outra parte", + M036: "Artropatia reacional em outras doenças classificadas em outra parte", + M05: "Artrite reumatóide soro-positiva", + M050: "Síndrome de Felty", + M051: "Doença reumatóide do pulmão", + M052: "Vasculite reumatóide", + M053: "Artrite reumatóide com comprometimento de outros órgãos e sistemas", + M058: "Outras artrites reumatóides soro-positivas", + M059: "Artrite reumatóide soro-positiva não especificada", + M06: "Outras artrites reumatóides", + M060: "Artrite reumatóide soro-negativa", + M061: "Doença de Still do adulto", + M062: "Bursite reumatóide", + M063: "Nódulo reumatóide", + M064: "Poliartropatia inflamatória", + M068: "Outras artrites reumatóides especificadas", + M069: "Artrite reumatóide não especificada", + M07: "Artropatias psoriásicas e enteropáticas", + M070: "Artropatia psoriásica interfalangiana distal", + M071: "Artrite mutilante", + M072: "Espondilite psoriásica", + M073: "Outras artropatias psoriásicas", + M074: "Artropatia na doença de Crohn [enterite regional]", + M075: "Artropatia na colite ulcerativa", + M076: "Outras artropatias enteropáticas", + M08: "Artrite juvenil", + M080: "Artrite reumatóide juvenil", + M081: "Espondilite ancilosante juvenil", + M082: "Artrite juvenil com início sistêmico", + M083: "Poliartrite juvenil (soro-negativa)", + M084: "Artrite juvenil pauciarticular", + M088: "Outras artrites juvenis", + M089: "Artrite juvenil não especificada", + M09: "Artrite juvenil em doenças classificadas em outra parte", + M090: "Artrite juvenil na psoríase", + M091: "Artrite juvenil na doença de Chron [enterite regional]", + M092: "Artrite juvenil na colite ulcerativa", + M098: "Artrite juvenil em outras doenças classificadas em outra parte", + M10: "Gota", + M100: "Gota idiopática", + M101: "Gota induzida por chumbo", + M102: "Gota induzida por drogas", + M103: "Gota devida à disfunção renal", + M104: "Outra gota secundária", + M109: "Gota, não especificada", + M11: "Outras artropatias por deposição de cristais", + M110: "Doença por deposição de hidroxiapatita", + M111: "Condrocalcinose familiar", + M112: "Outras condrocalcinoses", + M118: "Outras artropatias especificadas por deposição de cristais", + M119: "Artropatia por deposição de cristais, não especificada", + M12: "Outras artropatias especificadas", + M120: "Artropatia pós-reumática crônica [Jaccoud]", + M121: "Doença de Kashin-Beck", + M122: "Sinovite vilonodular (pigmentada)", + M123: "Reumatismo palindrômico", + M124: "Hidrartrose intermitente", + M125: "Artropatia traumática", + M128: "Outras artropatias específicas não classificadas em outra parte", + M13: "Outras artrites", + M130: "Poliartrite não especificada", + M131: "Monoartrites não classificadas em outra parte", + M138: "Outras artrites especificadas", + M139: "Artrite não especificada", + M14: "Artropatias em outras doenças classificadas em outra parte", + M140: "Artropatia gotosa devida a defeitos enzimáticos e a outras doenças hereditárias", + M141: "Artropatia por depósito de cristais em outras doenças metabólicas classificadas em outra parte", + M142: "Artropatia diabética", + M143: "Dermatoartrite lipóide", + M144: "Artropatia na amiloidose", + M145: "Artropatias em outras doenças endócrinas, nutricionais e metabólicas", + M146: "Artropatia neuropática", + M148: "Artropatias em outras doenças especificadas classificadas em outra parte", + M15: "Poliartrose", + M150: "(Osteo)artrose primária generalizada", + M151: "Nódulos de Heberden (com artropatia)", + M152: "Nódulos de Bouchard (com artropatia)", + M153: "Artrose múltipla secundária", + M154: "(Osteo)artrose erosiva", + M158: "Outras poliartroses", + M159: "Poliartrose não especificada", + M16: "Coxartrose [artrose do quadril]", + M160: "Coxartrose primária bilateral", + M161: "Outras coxartroses primárias", + M162: "Coxartrose bilateral resultante de displasia", + M163: "Outras coxartroses displásicas", + M164: "Coxartrose bilateral pós-traumática", + M165: "Outras coxartroses pós-traumáticas", + M166: "Outras coxartroses secundárias bilaterais", + M167: "Outras coxartroses secundárias", + M169: "Coxartrose não especificada", + M17: "Gonartrose [artrose do joelho]", + M170: "Gonartrose primária bilateral", + M171: "Outras gonartroses primárias", + M172: "Gonartrose pós-traumática bilateral", + M173: "Outras gonartroses pós-traumática", + M174: "Outras gonartroses secundárias bilaterais", + M175: "Outras gonartroses secundárias", + M179: "Gonartrose não especificada", + M18: "Artrose da primeira articulação carpometacarpiana", + M180: "Artrose primária bilateral das primeiras articulações carpometacarpianas", + M181: "Outras artroses primárias da primeira articulação carpometacarpiana", + M182: "Artrose pós-traumática bilateral da primeira articulação carpometacarpiana", + M183: "Outras artroses pós-traumáticas da primeira articulação carpometacarpiana", + M184: "Outras cartroses secundárias bilaterais das primeiras articulações carpometacarpianas", + M185: "Outras artroses secundárias da primeira articulação carpometacarpiana", + M189: "Artrose não especificada da primeira articulação carpometacarpiana", + M19: "Outras artroses", + M190: "Artrose primária de outras articulações", + M191: "Artrose pós-traumática de outras articulações", + M192: "Outras artroses secundárias", + M198: "Outras artroses especificadas", + M199: "Artrose não especificada", + M20: "Deformidades adquiridas dos dedos das mãos e dos pés", + M200: "Deformidade(s) do(s) dedo(s) das mãos", + M201: "Hallux valgo (adquirido)", + M202: "Hallux rigidus", + M203: "Outra deformidade do hallux (adquirida)", + M204: "Dedo(s) do pé em malho (adquirido)", + M205: "Outras deformidades (adquiridas) do(s) dedo(s) dos pés", + M206: "Deformidade adquirida não especificada de dedo(s) do pé", + M21: "Outras deformidades adquiridas dos membros", + M210: "Deformidade em valgo não classificada em outra parte", + M211: "Deformidade em varo não classificada em outra parte", + M212: "Deformidade em flexão", + M213: "Mão (pulso) ou pé pendente (adquirido)", + M214: "Pé chato [pé plano] (adquirido)", + M215: "Mão e pé em garra e mão e pé tortos adquiridos", + M216: "Outras deformidades adquiridas do tornozelo e do pé", + M217: "Desigualdade (adquirida) do comprimento dos membros", + M218: "Outras deformidades adquiridas especificadas dos membros", + M219: "Deformidade adquirida não especificada de membro", + M22: "Transtornos da rótula [patela]", + M220: "Deslocamento recidivante da rótula", + M221: "Subluxação recidivante da rótula", + M222: "Transtornos femuropatelares", + M223: "Outros desarranjos da rótula", + M224: "Condromalácia da rótula", + M228: "Outros transtornos da rótula", + M229: "Transtorno da rótula, não especificado", + M23: "Transtornos internos dos joelhos", + M230: "Menisco cístico", + M231: "Menisco discóide (congênito)", + M232: "Transtorno do menisco devido à ruptura ou lesão antiga", + M233: "Outros transtornos do menisco", + M234: "Corpo flutuante no joelho", + M235: "Instabilidade crônica do joelho", + M236: "Outras rupturas espontâneas de ligamento(s) do joelho", + M238: "Outros transtornos internos do joelho", + M239: "Transtorno interno não especificado do joelho", + M24: "Outros transtornos articulares específicos", + M240: "Corpo flutuante em articulação", + M241: "Outros transtornos das cartilagens articulares", + M242: "Transtornos de ligamentos", + M243: "Deslocamento e subluxação patológicas de articulação, não classificada em outra parte", + M244: "Deslocamento e subluxação de articulação recidivantes", + M245: "Contratura articular", + M246: "Ancilose articular", + M247: "Protusão do acetábulo", + M248: "Outros transtornos articulares específicos, não classificados em outra parte", + M249: "Desarranjo articular não especificado", + M25: "Outros transtornos articulares não classificados em outra parte", + M250: "Hemartrose", + M251: "Fístula articular", + M252: '"Flail joint"', + M253: "Outras instabilidades articulares", + M254: "Derrame articular", + M255: "Dor articular", + M256: "Rigidez articular não classificada em outra parte", + M257: "Osteofito", + M258: "Outros transtornos articulares especificados", + M259: "Transtorno articular não especificado", + M30: "Poliarterite nodosa e afecções correlatas", + M300: "Poliarterite nodosa", + M301: "Poliarterite com comprometimento pulmonar [Churg-Strauss]", + M302: "Poliarterite juvenil", + M303: "Síndrome de linfonodos mucocutâneos [Kawasaki]", + M308: "Outras afecções comuns na poliarterite nodosa", + M31: "Outras vasculopatias necrotizantes", + M310: "Angeíte de hipersensibilidade", + M311: "Microangiopatia trombótica", + M312: "Granuloma da linha média letal", + M313: "Granulomatose de Wegener", + M314: "Síndrome do arco aórtico [Takayasu]", + M315: "Arterite de células gigantes com polimialgia reumática", + M316: "Outras arterites de células gigantes", + M317: "Poliangeíte microscópica", + M318: "Outras vasculopatias necrotizantes especificadas", + M319: "Vasculopatia necrotizante não especificada", + M32: "Lúpus eritematoso disseminado [sistêmico]", + M320: "Lúpus eritematoso disseminado [sistêmico] induzido por drogas", + M321: "Lúpus eritematoso disseminado [sistêmico] com comprometimento de outros órgãos e sistemas", + M328: "Outras formas de lúpus eritematoso disseminado [sistêmico]", + M329: "Lúpus eritematoso disseminado [sistêmico] não especificado", + M33: "Dermatopoliomiosite", + M330: "Dermatomiosite juvenil", + M331: "Outras dermatomiosites", + M332: "Polimiosite", + M339: "Dermatopolimiosite não especificada", + M34: "Esclerose sistêmica", + M340: "Esclerose sistêmica progressiva", + M341: "Síndrome CR(E)ST", + M342: "Esclerose sistêmica induzida por droga e substâncias químicas", + M348: "Outras formas de esclerose sistêmica", + M349: "Esclerose sistêmica não especificada", + M35: "Outras afecções sistêmicas do tecido conjuntivo", + M350: "Síndrome seca [Sjögren]", + M351: "Outras síndromes superpostas", + M352: "Doença de Behçet", + M353: "Polimialgia reumática", + M354: "Fasciíte (eosinofílica) difusa", + M355: "Fibroesclerose multifocal", + M356: "Paniculite recidivante [Weber-Christian]", + M357: "Síndrome de hipermobilidade", + M358: "Outro comprometimento sistêmico especificado do tecido conjuntivo", + M359: "Comprometimento sistêmico não especificado do tecido conjuntivo", + M36: "Doenças sistêmicas do tecido conjuntivo em doenças classificadas em outra parte", + M360: "Dermato(poli)miosite em doenças neoplásicas", + M361: "Artropatia em doenças neoplásicas classificadas", + M362: "Artropatia hemofílica", + M363: "Artropatias em outras doenças hematológicas", + M364: "Artropatia associada a reações de hipersensibilidade classificadas em outra parte", + M368: "Doenças sistêmicas do tecido conjuntivo em outras doenças classificadas em outra parte", + M40: "Cifose e lordose", + M400: "Cifose postural", + M401: "Outras cifoses secundárias", + M402: "Outras cifoses e as não especificadas", + M403: "Síndrome da retificação da coluna vertebral", + M404: "Outras lordoses", + M405: "Lordose não especificada", + M41: "Escoliose", + M410: "Escoliose idiopática infantil", + M411: "Escoliose idiopática juvenil", + M412: "Outras escolioses idiopáticas", + M413: "Escoliose toracogênica", + M414: "Escoliose neuromuscular", + M415: "Outras escolioses secundárias", + M418: "Outras formas de escoliose", + M419: "Escoliose não especificada", + M42: "Osteocondrose da coluna vertebral", + M420: "Osteocondrose vertebral juvenil", + M421: "Osteocondrose vertebral do adulto", + M429: "Osteocondrose vertebral, não especificada", + M43: "Outras dorsopatias deformantes", + M430: "Espondilólise", + M431: "Espondilolistese", + M432: "Outras fusões da coluna vertebral", + M433: "Subluxação atlanto-axial recidivante com mielopatia", + M434: "Outras subluxações atlanto-axiais recidivantes", + M435: "Outras subluxações vertebrais recidivantes", + M436: "Torcicolo", + M438: "Outras dorsopatias deformantes especificadas", + M439: "Dorsopatia deformante, não especificada", + M45: "Espondilite ancilosante", + M46: "Outras espondilopatias inflamatórias", + M460: "Entesopatia vertebral", + M461: "Sacroileíte não classificada em outra parte", + M462: "Osteomielite das vértebras", + M463: "Infecção (piogênica) do disco intervertebral", + M464: "Discite não especificada", + M465: "Outras espondilopatias infecciosas", + M468: "Outras espondilopatias inflamatórias especificadas", + M469: "Espondilopatia inflamatória não especificada", + M47: "Espondilose", + M470: "Síndromes de compressão da artéria espinhal anterior ou vertebral anterior", + M471: "Outras espondiloses com mielopatia", + M472: "Outras espondiloses com radiculopatias", + M478: "Outras espondiloses", + M479: "Espondilose não especificada", + M48: "Outras espondilopatias", + M480: "Estenose da coluna vertebral", + M481: "Hiperostose ancilosante [Forestier]", + M482: '"Kissing spine"', + M483: "Espondilopatia traumática", + M484: "Fratura de fadiga de vértebra", + M485: "Vértebra colapsada não classificada em outra parte", + M488: "Outras espondilopatias especificadas", + M489: "Espondilopatia não especificada", + M49: "Espondilopatias em doenças classificadas em outra parte", + M490: "Tuberculose da coluna vertebral", + M491: "Espondilite por Brucella", + M492: "Espondilite por enterobactérias", + M493: "Espondilopatia em outras doenças infeciosas e parasitárias classificadas em outra parte", + M494: "Espondilopatia neuropática", + M495: "Vértebra colapsada em doenças classificadas em outra parte", + M498: "Espondilopatia em outras doenças classificadas em outra parte", + M50: "Transtornos dos discos cervicais", + M500: "Transtorno do disco cervical com mielopatia", + M501: "Transtorno do disco cervical com radiculopatia", + M502: "Outro deslocamento de disco cervical", + M503: "Outra degeneração de disco cervical", + M508: "Outros transtornos de discos cervicais", + M509: "Transtorno não especificado de disco cervical", + M51: "Outros transtornos de discos intervertebrais", + M510: "Transtornos de discos lombares e de outros discos intervertebrais com mielopatia", + M511: "Transtornos de discos lombares e de outros discos intervertebrais com radiculopatia", + M512: "Outros deslocamentos discais intervertebrais especificados", + M513: "Outra degeneração especificada de disco intervertebral", + M514: "Nódulos de Schmorl", + M518: "Outros transtornos especificados de discos intervertebrais", + M519: "Transtorno não especificado de disco intervertebral", + M53: "Outras dorsopatias não classificadas em outra parte", + M530: "Síndrome cervicocraniana", + M531: "Síndrome cervicobraquial", + M532: "Instabilidades da coluna vertebral", + M533: "Transtornos sacroccígeos não classificados em outra parte", + M538: "Outras dorsopatias especificadas", + M539: "Dorsopatia não especificada", + M54: "Dorsalgia", + M540: "Paniculite atingindo regiões do pescoço e do dorso", + M541: "Radiculopatia", + M542: "Cervicalgia", + M543: "Ciática", + M544: "Lumbago com ciática", + M545: "Dor lombar baixa", + M546: "Dor na coluna torácica", + M548: "Outra dorsalgia", + M549: "Dorsalgia não especificada", + M60: "Miosite", + M600: "Miosite infecciosa", + M601: "Miosite intersticial", + M602: "Granuloma de corpo estranho no tecido mole não classificado em outra parte", + M608: "Outras miosites", + M609: "Miosite não especificada", + M61: "Calcificação e ossificação do músculo", + M610: "Miosite ossificante traumática", + M611: "Miosite ossificante progressiva", + M612: "Calcificação e ossificação paralítica de músculo", + M613: "Calcificação e ossificação de músculo associadas com queimaduras", + M614: "Outra calcificação de músculo", + M615: "Outra ossificação de músculo", + M619: "Calcificação e ossificação de músculo não especificada", + M62: "Outros transtornos musculares", + M620: "Diástase de músculo", + M621: "Outras rupturas musculares (não-traumáticas)", + M622: "Infarto isquêmico do músculo", + M623: "Síndrome de imobilidade (paraplégica)", + M624: "Contratura de músculo", + M625: "Perda e atrofia muscular não classificadas em outra parte", + M626: "Distensão muscular", + M628: "Outros transtornos musculares especificados", + M629: "Transtorno muscular não especificado", + M63: "Transtornos de músculo em doenças classificadas em outra parte", + M630: "Miosite em doenças bacterianas classificadas em outra parte", + M631: "Miosite em doenças infecciosas causadas por protozoários e parasitas classificadas em outra parte", + M632: "Miosite em outras doenças infecciosas classificadas em outra parte", + M633: "Miosite na sarcoidose", + M638: "Outros transtornos musculares em doenças classificadas em outra parte", + M65: "Sinovite e tenossinovite", + M650: "Abscesso da bainha tendínea", + M651: "Outras (teno)sinovites infecciosas", + M652: "Tendinite calcificada", + M653: "Dedo em gatilho", + M654: "Tenossinovite estilóide radial [de Quervain]", + M658: "Outras sinovites e tenossinovites", + M659: "Sinovite e tenossinovite não especificadas", + M66: "Ruptura espontânea de sinóvia e de tendão", + M660: "Ruptura de cisto poplíteo", + M661: "Ruptura de sinóvia", + M662: "Ruptura espontânea de tendões extensores", + M663: "Ruptura espontânea de tendões flexores", + M664: "Ruptura espontânea de outros tendões", + M665: "Ruptura espontânea de tendões não especificados", + M67: "Outros transtornos das sinóvias e dos tendões", + M670: "Tendão de Aquiles curto (adquirido)", + M671: "Outra contratura de tendão (bainha)", + M672: "Hipertrofia sinovial não classificada em outra parte", + M673: "Sinovite transitória", + M674: "Gânglios", + M678: "Outros transtornos especificados da sinóvia e do tendão", + M679: "Transtorno não especificado da sinóvia e do tendão", + M68: "Transtorno de sinóvias e de tendões em doenças classificadas em outra parte", + M680: "Sinovite e tenossinovite em doenças bacterianas classificadas em outra parte", + M688: "Outros transtornos de sinóvias e de tendões em doenças classificadas em outra parte", + M70: "Transtornos dos tecidos moles relacionados com o uso, uso excessivo e pressão", + M700: "Sinovite crepitante crônica da mão e do punho", + M701: "Bursite da mão", + M702: "Bursite do olécrano", + M703: "Outras bursites do cotovelo", + M704: "Bursite pré-patelar", + M705: "Outras bursites do joelho", + M706: "Bursite trocantérica", + M707: "Outras bursites do quadril", + M708: "Outros transtornos dos tecidos moles relacionados com o uso, uso excessivo e pressão", + M709: "Transtorno não especificado dos tecidos moles relacionados com o uso, uso excessivo e pressão", + M71: "Outras bursopatias", + M710: "Abscesso de bolsa sinovial", + M711: "Outras bursites infecciosas", + M712: "Cisto sinovial do espaço poplíteo [Baker]", + M713: "Outros cistos de bolsa sinovial", + M714: "Depósito de cálcio em bolsa sinovial", + M715: "Outras bursites não classificadas em outra parte", + M718: "Outras bursopatias especificadas", + M719: "Bursopatia não especificada", + M72: "Transtornos fibroblásticos", + M720: "Fibromatose de fáscia palmar [Dupuytren]", + M721: "Coxins interfalângicos (nó dos dedos)", + M722: "Fibromatose da fáscia plantar", + M724: "Fibromatose pseudossarcomatosa", + M726: "Fasciíte necrosante", + M728: "Outros transtornos fibroblásticos", + M729: "Transtorno fibroblástico não especificado", + M73: "Transtornos dos tecidos moles em doenças classificadas em outra parte", + M730: "Bursite gonocócica", + M731: "Bursite sifilítica", + M738: "Outros transtornos dos tecidos moles em outras doenças classificadas em outra parte", + M75: "Lesões do ombro", + M750: "Capsulite adesiva do ombro", + M751: "Síndrome do manguito rotador", + M752: "Tendinite bicepital", + M753: "Tendinite calcificante do ombro", + M754: "Síndrome de colisão do ombro", + M755: "Bursite do ombro", + M758: "Outras lesões do ombro", + M759: "Lesão não especificada do ombro", + M76: "Entesopatias dos membros inferiores, excluindo pé", + M760: "Tendinite glútea", + M761: "Tendinite do psoas", + M762: "Esporão da crista ilíaca", + M763: "Síndrome da faixa iliotibial", + M764: "Bursite tibial colateral [Pellegrini-Stieda]", + M765: "Tendinite patelar", + M766: "Tendinite aquileana", + M767: "Tendinite do perôneo", + M768: "Outras entesopatias do membro inferior, excluindo o pé", + M769: "Entesopatia do membro inferior não especificada", + M77: "Outras entesopatias", + M770: "Epicondilite medial", + M771: "Epicondilite lateral", + M772: "Periartrite do punho", + M773: "Esporão do calcâneo", + M774: "Metatarsalgia", + M775: "Outra entesopatia do pé", + M778: "Outras entesopatias não classificadas em outra parte", + M779: "Entesopatia não especificada", + M79: "Outros transtornos dos tecidos moles, não classificados em outra parte", + M790: "Reumatismo não especificado", + M791: "Mialgia", + M792: "Nevralgia e neurite não especificadas", + M793: "Paniculite não especificada", + M794: "Hipertrofia do coxim gorduroso (infrapatelar)", + M795: "Corpo estranho residual no tecido mole", + M796: "Dor em membro", + M797: "Fibromialgia", + M798: "Outros transtornos especificados dos tecidos moles", + M799: "Transtorno dos tecidos moles não especificado", + M80: "Osteoporose com fratura patológica", + M800: "Osteoporose pós-menopáusica com fratura patológica", + M801: "Osteoporose pós-ooforectomia com fratura patológica", + M802: "Osteoporose de desuso com fratura patológica", + M803: "Osteoporose por má-absorção pós-cirúrgica com fratura patológica", + M804: "Osteoporose induzida por drogas com fratura patológica", + M805: "Osteoporose idiopática com fratura patológica", + M808: "Outras osteoporoses com fratura patológica", + M809: "Osteoporose não especificada com fratura patológica", + M81: "Osteoporose sem fratura patológica", + M810: "Osteoporose pós-menopáusica", + M811: "Osteoporose pós-ooforectomia", + M812: "Osteoporose de desuso", + M813: "Osteoporose devida à má-absorção pós-cirúrgica", + M814: "Osteoporose induzida por drogas", + M815: "Osteoporose idiopática", + M816: "Osteoporose localizada [Lequesne]", + M818: "Outras osteoporoses", + M819: "Osteoporose não especificada", + M82: "Osteoporose em doenças classificadas em outra parte", + M820: "Osteoporose na mielomatose múltipla", + M821: "Osteoporose em distúrbios endócrinos", + M828: "Osteoporose em outras doenças classificadas em outra parte", + M83: "Osteomalácia do adulto", + M830: "Osteomalácia puerperal", + M831: "Osteomalácia senil", + M832: "Osteomalácia do adulto devida a má-absorção", + M833: "Osteomalácia do adulto devido à desnutrição", + M834: "Doença óssea pelo alumínio", + M835: "Outras osteomalácias do adulto induzidas por drogas", + M838: "Outra osteomalácia do adulto", + M839: "Osteomalácia não especificada do adulto", + M84: "Transtornos da continuidade do osso", + M840: "Defeito de consolidação da fratura", + M841: "Ausência de consolidação da fratura [pseudo-artrose]", + M842: "Atraso de consolidação de fratura", + M843: 'Fratura de fadiga ("stress") não classificada em outra parte', + M844: "Fratura patológica não classificada em outra parte", + M848: "Outros transtornos da continuidade do osso", + M849: "Transtorno não especificado da continuidade do osso", + M85: "Outros transtornos da densidade e da estrutura ósseas", + M850: "Displasia fibrosa (monostótica)", + M851: "Fluorose esquelética", + M852: "Hiperostose do crânio", + M853: "Osteíte condensante", + M854: "Cisto ósseo solitário", + M855: "Cisto ósseo aneurismático", + M856: "Outro cisto ósseo", + M858: "Outros transtornos especificados da densidade e da estrutura ósseas", + M859: "Transtorno não especificado da densidade e da estrutura ósseas", + M86: "Osteomielite", + M860: "Osteomielite aguda hematogênica", + M861: "Outra osteomielite aguda", + M862: "Osteomielite subaguda", + M863: "Osteomielite crônica multifocal", + M864: "Osteomielite crônica com seio drenante", + M865: "Outra osteomielite crônica hematogênica", + M866: "Outra osteomielite crônica", + M868: "Outra osteomielite", + M869: "Osteomielite não especificada", + M87: "Osteonecrose", + M870: "Necrose asséptica idiopática do osso", + M871: "Osteonecrose devida a drogas", + M872: "Osteonecrose devida a traumatismo anterior", + M873: "Outras osteonecroses secundárias", + M878: "Outras osteonecroses", + M879: "Osteonecrose não especificada", + M88: "Doença de Paget do osso (osteíte deformante)", + M880: "Doença de Paget do crânio", + M888: "Doença de Paget de outros ossos", + M889: "Doença de Paget de osso não especificado", + M89: "Outros transtornos ósseos", + M890: "Algoneurodistrofia", + M891: "Parada de crescimento epifisário", + M892: "Outros transtornos do desenvolvimento e do crescimento ósseo", + M893: "Hipertrofia óssea", + M894: "Outras osteoartropatias hipertróficas", + M895: "Osteolise", + M896: "Osteopatia pós-poliomielite", + M898: "Outros transtornos especificados do osso", + M899: "Transtorno não especificado do osso", + M90: "Osteopatias em doenças classificadas em outra parte", + M900: "Tuberculose óssea", + M901: "Periostite em outras doenças infecciosas classificadas em outra parte", + M902: "Osteopatia em outras doenças infecciosas classificadas em outra parte", + M903: 'Osteonecrose em "mal dos caixões"', + M904: "Osteonecrose devida à hemoglobinopatia", + M905: "Osteonecrose em outras doenças classificadas em outra parte", + M906: "Osteíte deformante em doenças neoplásicas", + M907: "Fratura óssea em doenças neoplásicas", + M908: "Osteopatia em outras doenças classificadas em outra parte", + M91: "Osteocondrose juvenil do quadril e da pelve", + M910: "Osteocondrose juvenil da pelve", + M911: "Osteocondrose juvenil da cabeça do fêmur [Legg-Calvé-Perthes]", + M912: "Coxa plana", + M913: "Pseudocoxalgia", + M918: "Outras osteocondroses juvenis do quadril e da pelve", + M919: "Osteocondrose juvenil não especificada do quadril e da pelve", + M92: "Outras osteocondroses juvenis", + M920: "Osteocondrose juvenil do úmero", + M921: "Osteocondrose juvenil do rádio e do cúbito [ulna]", + M922: "Osteocondrose juvenil da mão", + M923: "Outras osteocondroses juvenis do membro superior", + M924: "Osteocondrose juvenil da rótula [patela]", + M925: "Osteocondrose juvenil da tíbia e perônio [fíbula]", + M926: "Osteocondrose juvenil do tarso", + M927: "Osteocondrose juvenil do metatarso", + M928: "Outras osteocondroses juvenis especificadas", + M929: "Osteocondrose juvenil, não especificada", + M93: "Outras osteocondropatias", + M930: "Luxação (não-traumática) da epífise superior do fêmur", + M931: "Doença de Kienböck do adulto", + M932: "Osteocondrite dissecante", + M938: "Outras osteocondropatias, especificadas", + M939: "Osteocondropatias, não especificada", + M94: "Outros transtornos das cartilagens", + M940: "Síndrome da junção condrocostal [Tietze]", + M941: "Policondrite recidivante", + M942: "Condromalácia", + M943: "Condrolise", + M948: "Outros transtornos especificados da cartilagem", + M949: "Transtornos não especificados da cartilagem", + M95: "Outras deformidades adquiridas do sistema osteomuscular e do tecido conjuntivo", + M950: "Deformidade adquirida do nariz", + M951: "Orelha em couve-flor", + M952: "Outras deformidades adquiridas da cabeça", + M953: "Deformidade adquirida do pescoço", + M954: "Deformidade adquirida do tórax e das costelas", + M955: "Deformidade adquirida da pelve", + M958: "Outras deformidades adquiridas especificadas do sistema osteomuscular", + M959: "Deformidade adquirida do sistema osteomuscular não especificada", + M96: "Transtornos osteomusculares pós-procedimentos não classificados em outra parte", + M960: "Pseudo-artrose após fusão ou artrodese", + M961: "Síndrome pós-laminectomia não classificada em outra parte", + M962: "Cifose pós-radiação", + M963: "Cifose pós-laminectomia", + M964: "Lordose pós-cirúrgica", + M965: "Escoliose pós-radiação", + M966: "Fratura de osso subsequente a implante ortopédico, prótese articular ou placa óssea", + M968: "Outros transtornos osteomusculares pós-procedimentos", + M969: "Transtorno osteomuscular não especificado pós-procedimento", + M99: "Lesões biomecânicas não classificadas em outra parte", + M990: "Disfunção segmentar e somática", + M991: "Complexo de subluxação (vertebral)", + M992: "Estenose de subluxação do canal medular", + M993: "Estenose óssea do canal medular", + M994: "Estenose de tecido conjuntivo do canal medular", + M995: "Estenose de disco intervertebral do canal medular", + M996: "Estenose óssea e subluxação dos forames intervertebrais", + M997: "Estenose de tecido conjuntivo e do disco dos forames intervertebrais", + M998: "Outras lesões biomecânicas", + M999: "Lesão biomecânica não especificada", + N00: "Síndrome nefrítica aguda", + N000: "Síndrome nefrítica aguda - anormalidade glomerular minor", + N001: "Síndrome nefrítica aguda - lesões glomerulares focais e segmentares", + N002: "Síndrome nefrítica aguda - glomerulonefrite membranosa difusa", + N003: "Síndrome nefrítica aguda - glomerulonefrite proliferativa mesangial difusa", + N004: "Síndrome nefrítica aguda - glomerulonefrite proliferativa endocapilar difusa", + N005: "Síndrome nefrítica aguda - glomerulonefrite mesangiocapilar difusa", + N006: "Síndrome nefrítica aguda - doença de depósito denso", + N007: "Síndrome nefrítica aguda - glomerulonefrite difusa em crescente", + N008: "Síndrome nefrítica aguda - outras", + N009: "Síndrome nefrítica aguda - não especificada", + N01: "Síndrome nefrítica rapidamente progressiva", + N010: "Síndrome nefrítica rapidamente progressiva - anormalidade glomerular minor", + N011: "Síndrome nefrítica rapidamente progressiva - lesões glomerulares focais e segmentares", + N012: "Síndrome nefrítica rapidamente progressiva - glomerulonefrite membranosa difusa", + N013: "Síndrome nefrítica rapidamente progressiva - glomerulonefrite proliferativa mesangial difusa", + N014: "Síndrome nefrítica rapidamente progressiva - glomerulonefrite proliferativa endocapilar difusa", + N015: "Síndrome nefrítica rapidamente progressiva - glomerulonefrite mesangiocapilar difusa", + N016: "Síndrome nefrítica rapidamente progressiva - doença de depósito denso", + N017: "Síndrome nefrítica rapidamente progressiva - glomerulonefrite difusa em crescente", + N018: "Síndrome nefrítica rapidamente progressiva - outras", + N019: "Síndrome nefrítica rapidamente progressiva - não especificada", + N02: "Hematúria recidivante e persistente", + N020: "Hematúria recidivante e persistente - anormalidade glomerular minor", + N021: "Hematúria recidivante e persistente - lesões glomerulares focais e segmentares", + N022: "Hematúria recidivante e persistente - glomerulonefrite membranosa difusa", + N023: "Hematúria recidivante e persistente - glomerulonefrite proliferativa mesangial difusa", + N024: "Hematúria recidivante e persistente - glomerulonefrite proliferativa endocapilar difusa", + N025: "Hematúria recidivante e persistente - glomerulonefrite mesangiocapilar difusa", + N026: "Hematúria recidivante e persistente - doença de depósito denso", + N027: "Hematúria recidivante e persistente - glomerulonefrite difusa em crescente", + N028: "Hematúria recidivante e persistente - outras", + N029: "Hematúria recidivante e persistente - não especificada", + N03: "Síndrome nefrítica crônica", + N030: "Síndrome nefrítica crônica - anormalidade glomerular minor", + N031: "Síndrome nefrítica crônica - lesões glomerulares focais e segmentares", + N032: "Síndrome nefrítica crônica - glomerulonefrite membranosa difusa", + N033: "Síndrome nefrítica crônica - glomerulonefrite proliferativa mesangial difusa", + N034: "Síndrome nefrítica crônica - glomerulonefrite proliferativa endocapilar difusa", + N035: "Síndrome nefrítica crônica - glomerulonefrite mesangiocapilar difusa", + N036: "Síndrome nefrítica crônica - doença de depósito denso", + N037: "Síndrome nefrítica crônica - glomerulonefrite difusa em crescente", + N038: "Síndrome nefrítica crônica - outras", + N039: "Síndrome nefrítica crônica - não especificada", + N04: "Síndrome nefrótica", + N040: "Síndrome nefrótica - anormalidade glomerular minor", + N041: "Síndrome nefrótica - lesões glomerulares focais e segmentares", + N042: "Síndrome nefrótica - glomerulonefrite membranosa difusa", + N043: "Síndrome nefrótica - glomerulonefrite proliferativa mesangial difusa", + N044: "Síndrome nefrótica - glomerulonefrite proliferativa endocapilar difusa", + N045: "Síndrome nefrótica - glomerulonefrite mesangiocapilar difusa", + N046: "Síndrome nefrótica - doença de depósito denso", + N047: "Síndrome nefrótica - glomerulonefrite difusa em crescente", + N048: "Síndrome nefrótica - outras", + N049: "Síndrome nefrótica - não especificada", + N05: "Síndrome nefrítica não especificada", + N050: "Síndrome nefrítica não especificada - anormalidade glomerular minor", + N051: "Síndrome nefrítica não especificada - lesões glomerulares focais e segmentares", + N052: "Síndrome nefrítica não especificada - glomerulonefrite membranosa difusa", + N053: "Síndrome nefrítica não especificada - glomerulonefrite proliferativa mesangial difusa", + N054: "Síndrome nefrítica não especificada - glomerulonefrite proliferativa endocapilar difusa", + N055: "Síndrome nefrítica não especificada - glomerulonefrite mesangiocapilar difusa", + N056: "Síndrome nefrítica não especificada - doença de depósito denso", + N057: "Síndrome nefrítica não especificada - glomerulonefrite difusa em crescente", + N058: "Síndrome nefrítica não especificada - outras", + N059: "Síndrome nefrítica não especificada - não especificada", + N06: "Proteinúria isolada com lesão morfológica especificada", + N060: "Proteinúria isolada com lesão morfológica especificada - anormalidade glomerular minor", + N061: "Proteinúria isolada com lesão morfológica especificada - lesões glomerulares focais e segmentares", + N062: "Proteinúria isolada com lesão morfológica especificada - glomerulonefrite membranosa difusa", + N063: "Proteinúria isolada com lesão morfológica especificada - glomerulonefrite proliferativa mesangial difusa", + N064: "Proteinúria isolada com lesão morfológica especificada - glomerulonefrite proliferativa endocapilar difusa", + N065: "Proteinúria isolada com lesão morfológica especificada - glomerulonefrite mesangiocapilar difusa", + N066: "Proteinúria isolada com lesão morfológica especificada - doença de depósito denso", + N067: "Proteinúria isolada com lesão morfológica especificada - glomerulonefrite difusa em crescente", + N068: "Proteinúria isolada com lesão morfológica especificada - outras", + N069: "Proteinúria isolada com lesão morfológica especificada - não especificada", + N07: "Nefropatia hereditária não classificada em outra parte", + N070: "Nefropatia hereditária não classificada em outra parte - anormalidade glomerular minor", + N071: "Nefropatia hereditária não classificada em outra parte - lesões glomerulares focais e segmentares", + N072: "Nefropatia hereditária não classificada em outra parte - glomerulonefrite membranosa difusa", + N073: "Nefropatia hereditária não classificada em outra parte - glomerulonefrite proliferativa mesangial difusa", + N074: "Nefropatia hereditária não classificada em outra parte - glomerulonefrite proliferativa endocapilar difusa", + N075: "Nefropatia hereditária não classificada em outra parte - glomerulonefrite mesangiocapilar difusa", + N076: "Nefropatia hereditária não classificada em outra parte - doença de depósito denso", + N077: "Nefropatia hereditária não classificada em outra parte - glomerulonefrite difusa em crescente", + N078: "Nefropatia hereditária não classificada em outra parte - outras", + N079: "Nefropatia hereditária não classificada em outra parte - não especificada", + N08: "Transtornos glomerulares em doenças classificadas em outra parte", + N080: "Transtornos glomerulares em doenças infecciosas e parasitárias classificadas em outra parte", + N081: "Transtornos glomerulares em doenças neoplásicas", + N082: "Transtornos glomerulares em doenças do sangue e transtornos imunitários", + N083: "Transtornos glomerulares no diabetes mellitus", + N084: "Transtornos glomerulares em doenças endócrinas, nutricionais e metabólicas", + N085: "Transtornos glomerulares em doenças sistêmicas do tecido conjuntivo", + N088: "Transtornos glomerulares em outras doenças classificadas em outra parte", + N10: "Nefrite túbulo-intersticial aguda", + N11: "Nefrite túbulo-intersticial crônica", + N110: "Pielonefrite não-obstrutiva crônica associada a refluxo", + N111: "Pielonefrite obstrutiva crônica", + N118: "Outras nefrites túbulo-intersticiais crônicas", + N119: "Nefrite túbulo-intersticial crônica não especificada", + N12: "Nefrite túbulo-intersticial não especificada se aguda ou crônica", + N13: "Uropatia obstrutiva e por refluxo", + N130: "Hidronefrose com obstrução da junção uretero-pélvica", + N131: "Hidronefrose com estreitamento de ureter não classificada em outra parte", + N132: "Hidronefrose com obstrução por calculose renal e ureteral", + N133: "Outras hidronefroses e as não especificadas", + N134: "Hidroureter", + N135: "Torção e estreitamento do ureter sem hidronefrose", + N136: "Pionefrose", + N137: "Uropatia associada a refluxo vésico-ureteral", + N138: "Outras uropatias obstrutivas e por refluxo", + N139: "Uropatia obstrutiva e por refluxo não especificada", + N14: "Afecções tubulares e túbulo-intersticiais induzidas por drogas ou metais pesados", + N140: "Nefropatia induzida por analgésico", + N141: "Nefropatia induzida por outras drogas, medicamentos e substâncias biológicas", + N142: "Nefropatia induzida por drogas, medicamentos e substâncias biológicas não especificadas", + N143: "Nefropatia induzida por metais pesados", + N144: "Nefropatia tóxica não classificada em outra parte", + N15: "Outras doenças renais túbulo-intersticiais", + N150: "Nefropatia dos Bálcãs", + N151: "Abscesso renal e perinefrético", + N158: "Outras doenças renais túbulo-intersticiais especificadas", + N159: "Doença renal túbulo-intersticial não especificada", + N16: "Transtornos renais túbulo-intersticiais em doenças classificadas em outra parte", + N160: "Transtornos renais túbulo-intersticiais em doenças infecciosas e parasitárias classificadas em outra parte", + N161: "Transtornos renais túbulo-intersticiais em doenças neoplásicas", + N162: "Transtornos renais túbulo-intersticiais em doenças do sangue e transtornos imunitários", + N163: "Transtornos renais túbulo-intersticiais em doenças metabólicas", + N164: "Transtornos renais túbulo-intersticiais em doenças do tecido conjuntivo", + N165: "Transtornos renais túbulo-intersticiais em rejeição a transplantes", + N168: "Transtornos renais túbulo-intersticiais em outras doenças classificadas em outra parte", + N17: "Insuficiência renal aguda", + N170: "Insuficiência renal aguda com necrose tubular", + N171: "Insuficiência renal aguda com necrose cortical aguda", + N172: "Insuficiência renal aguda com necrose medular", + N178: "Outro tipo de insuficiência renal aguda", + N179: "Insuficiência renal aguda não especificada", + N18: "Insuficiência renal crônica", + N180: "Doença renal em estádio final", + N188: "Outra insuficiência renal crônica", + N189: "Insuficiência renal crônica não especificada", + N19: "Insuficiência renal não especificada", + N20: "Calculose do rim e do ureter", + N200: "Calculose do rim", + N201: "Calculose do ureter", + N202: "Calculose do rim com cálculo do ureter", + N209: "Calculose urinária, não especificada", + N21: "Calculose do trato urinário inferior", + N210: "Calculose na bexiga", + N211: "Cálculo uretral", + N218: "Outros cálculos do trato urinário inferior", + N219: "Cálculo do trato urinário inferior, porção não especificada", + N22: "Calculose do trato urinário inferior em doenças classificadas em outra parte", + N220: "Cálculo urinário na esquistossomose [bilharziose] [schistosomíase]", + N228: "Calculose do trato urinário em outras doenças classificadas em outra parte", + N23: "Cólica nefrética não especificada", + N25: "Transtornos resultantes de função renal tubular alterada", + N250: "Osteodistrofia renal", + N251: "Diabetes insípido nefrogênico", + N258: "Outros transtornos resultantes de função renal tubular alterada", + N259: "Transtornos resultante de função tubular alterada", + N26: "Rim contraído, não especificado", + N27: "Hipoplasia renal de causa desconhecida", + N270: "Hipoplasia renal unilateral", + N271: "Hipoplasia renal bilateral", + N279: "Hipoplasia renal não especificada", + N28: "Outros transtornos do rim e do ureter não classificado em outra parte", + N280: "Isquemia e infarto renal", + N281: "Cisto do rim, adquirido", + N288: "Outros transtornos especificados do rim e do ureter", + N289: "Transtorno não especificado do rim e do ureter", + N29: "Outros transtornos do rim e do ureter em doenças classificadas em outra parte", + N290: "Sífilis tardia renal", + N291: "Outros transtornos do rim e do ureter em doenças infecciosas e parasitárias classificadas em outra parte", + N298: "Outros transtornos do rim e do ureter em outras doenças classificadas em outra parte", + N30: "Cistite", + N300: "Cistite aguda", + N301: "Cistite intersticial (crônica)", + N302: "Outras cistites crônicas", + N303: "Trigonite", + N304: "Cistite por radiação", + N308: "Outras cistites", + N309: "Cistite, não especificada", + N31: "Disfunções neuromusculares da bexiga não classificados em outra parte", + N310: "Bexiga neuropática não-inibida não classificada em outra parte", + N311: "Bexiga neuropática reflexa não classificada em outra parte", + N312: "Bexiga neuropática flácida não classificada em outra parte", + N318: "Outra disfunção neuromuscular da bexiga", + N319: "Disfunção neuromuscular não especificada da bexiga", + N32: "Outros transtornos da bexiga", + N320: "Obstrução do colo da bexiga", + N321: "Fístula êntero-vesical", + N322: "Fístula vesical não classificada em outra parte", + N323: "Divertículo da bexiga", + N324: "Ruptura da bexiga, não-traumática", + N328: "Outros transtornos especificados da bexiga", + N329: "Transtorno não especificado da bexiga", + N33: "Transtornos da bexiga em doenças classificadas em outra parte", + N330: "Cistite tuberculosa", + N338: "Transtornos da bexiga em outras doenças classificadas em outra parte", + N34: "Uretrite e síndrome uretral", + N340: "Abscesso uretral", + N341: "Uretrites não específicas", + N342: "Outras uretrites", + N343: "Síndrome uretral, não especificada", + N35: "Estenose da uretra", + N350: "Estenose uretral pós-traumática", + N351: "Estenose uretral pós-infecciosa não classificada em outra parte", + N358: "Outra estenose (estreitamento) uretral", + N359: "Estenose (estreitamento) uretral não especificada(o)", + N36: "Outros transtornos da uretra", + N360: "Fístula uretral", + N361: "Divertículo uretral", + N362: "Carúncula uretral", + N363: "Prolapso da mucosa uretral", + N368: "Outros transtornos especificados da uretra", + N369: "Transtorno não especificado da uretra", + N37: "Transtornos da uretra em doenças classificadas em outra parte", + N370: "Uretrite em doenças classificadas em outra parte", + N378: "Outros transtornos da uretra em doenças classificadas em outra parte", + N39: "Outros transtornos do trato urinário", + N390: "Infecção do trato urinário de localização não especificada", + N391: "Proteinúria persistente não especificada", + N392: "Proteinúria ortostática não especificada", + N393: 'Incontinência de tensão ("stress")', + N394: "Outras incontinências urinárias especificadas", + N398: "Outros transtornos especificados do aparelho urinário", + N399: "Transtornos não especificados do aparelho urinário", + N40: "Hiperplasia da próstata", + N41: "Doenças inflamatórias da próstata", + N410: "Prostatite aguda", + N411: "Prostatite crônica", + N412: "Abscesso da próstata", + N413: "Prostatocistite", + N418: "Outras doenças inflamatórias da próstata", + N419: "Doença inflamatória não especificada da próstata", + N42: "Outras afecções da próstata", + N420: "Cálculo da próstata", + N421: "Congestão e hemorragia da próstata", + N422: "Atrofia da próstata", + N428: "Outras afecções especificadas da próstata", + N429: "Afecção não especificada da próstata", + N43: "Hidrocele e espermatocele", + N430: "Hidrocele encistada", + N431: "Hidrocele infectada", + N432: "Outra hidrocele", + N433: "Hidrocele não especificada", + N434: "Espermatocele", + N44: "Torção do testículo", + N45: "Orquite e epididimite", + N450: "Orquite, epididimite e epidídimo-orquite, com menção de abscesso", + N459: "Orquite, epididimite e epidídimo-orquite, sem menção de abscesso", + N46: "Infertilidade masculina", + N47: "Hipertrofia do prepúcio, fimose e parafimose", + N48: "Outros transtornos do pênis", + N480: "Leucoplasia do pênis", + N481: "Balanopostite", + N482: "Outros transtornos inflamatórios do pênis", + N483: "Priapismo", + N484: "Impotência de origem orgânica", + N485: "Úlcera do pênis", + N486: "Induratio penis plastica", + N488: "Outros transtornos especificados do pênis", + N489: "Transtorno não especificado do pênis", + N49: "Transtornos inflamatórios de órgãos genitais masculinos, não classificados em outra parte", + N490: "Transtornos inflamatórios da vesícula seminal", + N491: "Transtornos inflamatórios do cordão espermático, túnica vaginal e vasos deferentes", + N492: "Transtorno inflamatório do escroto", + N498: "Transtornos inflamatórios de outros órgãos genitais masculinos especificados", + N499: "Transtorno inflamatório de órgão genital masculino, não especificado", + N50: "Outros transtornos dos órgãos genitais masculinos", + N500: "Atrofia do testículo", + N501: "Transtornos vasculares dos órgãos genitais masculinos", + N508: "Outros transtornos especificados dos órgãos genitais masculinos", + N509: "Transtorno não especificado dos órgãos genitais masculinos", + N51: "Transtornos dos órgãos genitais masculinos em doenças classificadas em outra parte", + N510: "Transtornos da próstata em doenças classificadas em outra parte", + N511: "Transtornos do testículo e do epidídimo em doenças classificadas em outra parte", + N512: "Balanite em doenças classificadas em outra parte", + N518: "Outros transtornos dos órgãos genitais masculinos em doenças classificadas em outra parte", + N60: "Displasias mamárias benignas", + N600: "Cisto solitário da mama", + N601: "Mastopatia cística difusa", + N602: "Fibroadenose da mama", + N603: "Fibrosclerose da mama", + N604: "Ectasia de dutos mamários", + N608: "Outras displasias mamárias benignas", + N609: "Displasia mamária benigna não especificada", + N61: "Transtornos inflamatórios da mama", + N62: "Hipertrofia da mama", + N63: "Nódulo mamário não especificado", + N64: "Outras doenças da mama", + N640: "Fissura e fístula do mamilo", + N641: "Necrose gordurosa da mama", + N642: "Atrofia da mama", + N643: "Galactorréia não-associada ao parto", + N644: "Mastodinia", + N645: "Outros sintomas e sinais da mama", + N648: "Outros transtornos especificados da mama", + N649: "Transtorno da mama não especificado", + N70: "Salpingite e ooforite", + N700: "Salpingite e ooforite agudas", + N701: "Salpingite e ooforite crônicas", + N709: "Salpingite e ooforite não especificadas", + N71: "Doença inflamatória do útero, exceto o colo", + N710: "Doença inflamatória aguda do útero", + N711: "Doença inflamatória crônica do útero", + N719: "Doença inflamatória não especificada do útero", + N72: "Doença inflamatória do colo do útero", + N73: "Outras doenças inflamatórias pélvicas femininas", + N730: "Parametrite e celulite pélvicas agudas", + N731: "Parametrite e celulite pélvicas crônicas", + N732: "Parametrite e celulite pélvicas não especificadas", + N733: "Pelviperitonite aguda feminina", + N734: "Pelviperitonite crônica feminina", + N735: "Pelviperitonite não especificada feminina", + N736: "Aderências pelviperitonais femininas", + N738: "Outras doenças inflamatórias especificadas da pelve feminina", + N739: "Doença inflamatória não especificada da pelve feminina", + N74: "Transtornos inflamatórios da pelve feminina em doenças classificadas em outra parte", + N740: "Tuberculose do colo do útero", + N741: "Tuberculose da pelve feminina", + N742: "Sífilis pélvica feminina", + N743: "Infecção gonocócica pélvica feminina", + N744: "Infecção pélvica feminina por clamídia", + N748: "Inflamação pélvica feminina em outras doenças classificadas em outra parte", + N75: "Doenças da glândula de Bartholin", + N750: "Cisto da glândula de Bartholin", + N751: "Abscesso da glândula de Bartholin", + N758: "Outras doenças da glândula de Bartholin", + N759: "Doença não especificada da glândula de Bartholin", + N76: "Outras afecções inflamatórias da vagina e da vulva", + N760: "Vaginite aguda", + N761: "Vaginite subaguda e crônica", + N762: "Vulvite aguda", + N763: "Vulvite subaguda e crônica", + N764: "Abscesso vulvar", + N765: "Ulceração vaginal", + N766: "Ulceração vulvar", + N768: "Outras inflamações especificadas da vagina e da vulva", + N77: "Ulceração e inflamação vulvovaginais em doenças classificadas em outra parte", + N770: "Ulceração da vulva em doenças infecciosas e parasitárias classificadas em outra parte", + N771: "Vaginite, vulvite e vulvovaginite em doenças infecciosas e parasitárias classificadas em outra parte", + N778: "Ulceração e inflamação vulvovaginais em outras doenças classificadas em outra parte", + N80: "Endometriose", + N800: "Endometriose do útero", + N801: "Endometriose do ovário", + N802: "Endometriose da trompa de Falópio", + N803: "Endometriose do peritônio pélvico", + N804: "Endometriose do septo retovaginal e da vagina", + N805: "Endometriose do intestino", + N806: "Endometriose em cicatriz cutânea", + N808: "Outra endometriose", + N809: "Endometriose não especificada", + N81: "Prolapso genital feminino", + N810: "Uretrocele feminina", + N811: "Cistocele", + N812: "Prolapso uterovaginal incompleto", + N813: "Prolapso uterovaginal completo", + N814: "Prolapso uterovaginal não especificado", + N815: "Enterocele vaginal", + N816: "Retocele", + N818: "Outro prolapso genital feminino", + N819: "Prolapso genital feminino não especificado", + N82: "Fístulas do trato genital feminino", + N820: "Fístula vesicovaginal", + N821: "Outras fístulas do trato geniturinário feminino", + N822: "Fístula vagina-intestino delgado", + N823: "Fístula vagina-cólon", + N824: "Outras fístulas genito-intestinais femininas", + N825: "Fístula genitocutânea feminina", + N828: "Outras fístulas do trato genital feminino", + N829: "Fístulas não especificadas do trato genital feminino", + N83: "Transtornos não-inflamatórios do ovário, da trompa de Falópio e do ligamento largo", + N830: "Cisto folicular do ovário", + N831: "Cisto do corpo lúteo", + N832: "Outros cistos ovarianos e os não especificados", + N833: "Atrofia adquirida do ovário e da trompa de Falópio", + N834: "Prolapso e hérnia do ovário e da trompa de Falópio", + N835: "Torção do ovário, do pedículo ovariano e da trompa de Falópio", + N836: "Hematossalpinge", + N837: "Hematoma do ligamento largo", + N838: "Outros transtornos não-inflamatórios do ovário, da trompa de Falópio e do ligamento largo", + N839: "Transtornos não-inflamatórios do ovário, da trompa de Falópio e do ligamento largo, não especificados", + N84: "Pólipo do trato genital feminino", + N840: "Pólipo do corpo do útero", + N841: "Pólipo do colo do útero", + N842: "Pólipo da vagina", + N843: "Pólipo da vulva", + N848: "Pólipo de outras partes do trato genital feminino", + N849: "Pólipo do trato genital feminino não especificado", + N85: "Outros transtornos não-inflamatórios do útero, exceto do colo do útero", + N850: "Hiperplasia glandular endometrial", + N851: "Hiperplasia adenomatosa endometrial", + N852: "Hipertrofia do útero", + N853: "Subinvolução do útero", + N854: "Posição anormal do útero", + N855: "Inversão do útero", + N856: "Sinéquias intra-uterinas", + N857: "Hematometra", + N858: "Outros transtornos não-inflamatórios especificados do útero", + N859: "Transtornos não-inflamatórios do útero, não especificados", + N86: "Erosão e ectrópio do colo do útero", + N87: "Displasia do colo do útero", + N870: "Displasia cervical leve", + N871: "Displasia cervical moderada", + N872: "Displasia cervical grave, não classificada em outra parte", + N879: "Displasia do colo do útero, não especificada", + N88: "Outros transtornos não-inflamatórios do colo do útero", + N880: "Leucoplasia do colo do útero", + N881: "Laceração antiga do colo do útero", + N882: "Estreitamento e estenose do colo do útero", + N883: "Incompetência do colo do útero", + N884: "Alongamento hipertrófico do colo do útero", + N888: "Outros transtornos não-inflamatórios especificados do colo do útero", + N889: "Transtorno não-inflamatório e não especificado do colo do útero", + N89: "Outros transtornos não-inflamatórios da vagina", + N890: "Displasia vaginal leve", + N891: "Displasia vaginal moderada", + N892: "Displasia vaginal grave, não classificada em outra parte", + N893: "Displasia da vagina, não especificada", + N894: "Leucoplasia da vagina", + N895: "Estreitamento e atresia da vagina", + N896: "Anel himenal apertado", + N897: "Hematocolpos", + N898: "Outros transtornos não-inflamatórios especificados da vagina", + N899: "Transtorno não-inflamatório da vagina, não especificado", + N90: "Outros transtornos não-inflamatórios da vulva e do períneo", + N900: "Displasia vulvar leve", + N901: "Displasia vulvar moderada", + N902: "Displasia vulvar grave, não classificada em outra parte", + N903: "Displasia de vulva, não especificada", + N904: "Leucoplasia de vulva", + N905: "Atrofia da vulva", + N906: "Hipertrofia da vulva", + N907: "Cisto vulvar", + N908: "Outros transtornos não-inflamatórios especificados da vulva e do períneo", + N909: "Transtorno não-inflamatório e não especificado da vulva e do períneo", + N91: "Menstruação ausente, escassa e pouco freqüente", + N910: "Amenorréia primária", + N911: "Amenorréia secundária", + N912: "Amenorréia, não especificada", + N913: "Oligomenorréia primária", + N914: "Oligomenorréia secundária", + N915: "Oligomenorréia, não especificada", + N92: "Menstruação excessiva, freqüente e irregular", + N920: "Menstruação excessiva e freqüente com ciclo regular", + N921: "Menstruação excessiva e freqüente com ciclo irregular", + N922: "Menstruação excessiva na puberdade", + N923: "Sangramento da ovulação", + N924: "Sangramento abundante na pré-menopausa", + N925: "Outros tipos especificados de irregularidade da menstruação", + N926: "Menstruação irregular, não especificada", + N93: "Outros sangramentos anormais do útero e da vagina", + N930: "Sangramentos pós-coito ou de contato", + N938: "Outros sangramentos anormais especificados do útero e da vagina", + N939: "Sangramento anormal do útero ou da vagina, não especificado", + N94: "Dor e outras afecções associadas com os órgãos genitais femininos e com o ciclo menstrual", + N940: "Ovulação dolorosa [Mittelschmerz]", + N941: "Dispareunia", + N942: "Vaginismo", + N943: "Síndrome de tensão pré-menstrual", + N944: "Dismenorréia primária", + N945: "Dismenorréia secundária", + N946: "Dismenorréia não especificada", + N948: "Outras afecções especificadas associadas com os órgãos genitais femininos e com o ciclo menstrual", + N949: "Afecções não especificadas associadas com os órgãos genitais femininos e com o ciclo menstrual", + N95: "Transtornos da menopausa e da perimenopausa", + N950: "Sangramento pós-menopausa", + N951: "Estado da menopausa e do climatério feminino", + N952: "Vaginite atrófica pós-menopausa", + N953: "Condições associadas com a menopausa artificial", + N958: "Outros transtornos especificados da menopausa e da perimenopausa", + N959: "Transtorno não especificado da menopausa e da perimenopausa", + N96: "Abortamento habitual", + N97: "Infertilidade feminina", + N970: "Infertilidade feminina associada à anovulação", + N971: "Infertilidade feminina de origem tubária", + N972: "Infertilidade feminina de origem uterina", + N973: "Infertilidade feminina de origem cervical", + N974: "Infertilidade feminina associada à fatores do parceiro", + N978: "Infertilidade feminina de outra origem", + N979: "Infertilidade feminina não especificada", + N98: "Complicações associadas à fecundação artificial", + N980: "Infecção associada à inseminação artificial", + N981: "Hiperestimulação dos ovários", + N982: "Complicações relacionadas com a tentativa de introdução do óvulo fecundado artificialmente (in vitro)", + N983: "Complicações relacionadas com a tentativa de transferência do embrião", + N988: "Outras complicações associadas à fecundação artificial", + N989: "Complicações não especificadas associadas à fecundação artificial", + N99: "Transtornos do trato geniturinário pós-procedimentos não classificados em outra parte", + N990: "Insuficiência renal pós-procedimentos", + N991: "Estreitamento de uretra pós-procedimentos", + N992: "Aderências pós-operatórias da vagina", + N993: "Prolapso de cúpula de vagina pós-histerectomia", + N994: "Aderências do peritônio pélvico pós-procedimentos", + N995: "Mau funcionamento de abertura externa (estoma) do trato urinário", + N998: "Outros transtornos pós-procedimentos do aparelho geniturinário", + N999: "Transtorno pós-procedimento não especificado do aparelho geniturinário", + O00: "Gravidez ectópica", + O000: "Gravidez abdominal", + O001: "Gravidez tubária", + O002: "Gravidez ovariana", + O008: "Outras formas de gravidez ectópica", + O009: "Gravidez ectópica, não especificada", + O01: "Mola hidatiforme", + O010: "Mola hidatiforme clássica", + O011: "Mola hidatiforme incompleta ou parcial", + O019: "Mola hidatiforme não especificada", + O02: "Outros produtos anormais da concepção", + O020: "Ovo claro e mola não-hidatiforme", + O021: "Aborto retido", + O028: "Outros produtos anormais da concepção especificados", + O029: "Produto anormal da concepção, não especificado", + O03: "Aborto espontâneo", + O030: "Aborto espontâneo - incompleto, complicado por infecção do trato genital ou dos órgãos pélvicos", + O031: "Aborto espontâneo - incompleto, complicado por hemorragia excessiva ou tardia", + O032: "Aborto espontâneo - incompleto, complicado por embolia", + O033: "Aborto espontâneo - incompleto, com outras complicações ou com complicações não especificadas", + O034: "Aborto espontâneo - incompleto, sem complicações", + O035: "Aborto espontâneo - completo ou não especificado, complicado por infecções do trato genital ou dos órgãos pélvicos", + O036: "Aborto espontâneo - completo ou não especificado, complicado por hemorragia excessiva ou tardia", + O037: "Aborto espontâneo - completo ou não especificado, complicado por embolia", + O038: "Aborto espontâneo - completo ou não especificado, com outras complicações ou com complicações não especificadas", + O039: "Aborto espontâneo - completo ou não especificado, sem complicações", + O04: "Aborto por razões médicas e legais", + O040: "Aborto por razões médicas e legais - incompleto, complicado por infecção do trato genital ou dos órgãos pélvicos", + O041: "Aborto por razões médicas e legais - incompleto, complicado por hemorragia excessiva ou tardia", + O042: "Aborto por razões médicas e legais - incompleto, complicado por embolia", + O043: "Aborto por razões médicas e legais - incompleto, com outras complicações ou com complicações não especificadas", + O044: "Aborto por razões médicas e legais - incompleto, sem complicações", + O045: "Aborto por razões médicas e legais - completo ou não especificado, complicado por infecções do trato genital ou dos órgãos pélvicos", + O046: "Aborto por razões médicas e legais - completo ou não especificado, complicado por hemorragia excessiva ou tardia", + O047: "Aborto por razões médicas e legais - completo ou não especificado, complicado por embolia", + O048: "Aborto por razões médicas e legais - completo ou não especificado, com outras complicações ou com complicações não especificadas", + O049: "Aborto por razões médicas e legais - completo ou não especificado, sem complicações", + O05: "Outros tipos de aborto", + O050: "Outros tipos de aborto - incompleto, complicado por infecção do trato genital ou dos órgãos pélvicos", + O051: "Outros tipos de aborto - incompleto, complicado por hemorragia excessiva ou tardia", + O052: "Outros tipos de aborto - incompleto, complicado por embolia", + O053: "Outros tipos de aborto - incompleto, com outras complicações ou com complicações não especificadas", + O054: "Outros tipos de aborto - incompleto, sem complicações", + O055: "Outros tipos de aborto - completo ou não especificado, complicado por infecções do trato genital ou dos órgãos pélvicos", + O056: "Outros tipos de aborto - completo ou não especificado, complicado por hemorragia excessiva ou tardia", + O057: "Outros tipos de aborto - completo ou não especificado, complicado por embolia", + O058: "Outros tipos de aborto - completo ou não especificado, com outras complicações ou com complicações não especificadas", + O059: "Outros tipos de aborto - completo ou não especificado, sem complicações", + O06: "Aborto não especificado", + O060: "Aborto não especificado - incompleto, complicado por infecção do trato genital ou dos órgãos pélvicos", + O061: "Aborto não especificado - incompleto, complicado por hemorragia excessiva ou tardia", + O062: "Aborto não especificado - incompleto, complicado por embolia", + O063: "Aborto não especificado - incompleto, com outras complicações ou com complicações não especificadas", + O064: "Aborto não especificado - incompleto, sem complicações", + O065: "Aborto não especificado - completo ou não especificado, complicado por infecções do trato genital ou dos órgãos pélvicos", + O066: "Aborto não especificado - completo ou não especificado, complicado por hemorragia excessiva ou tardia", + O067: "Aborto não especificado - completo ou não especificado, complicado por embolia", + O068: "Aborto não especificado - completo ou não especificado, com outras complicações ou com complicações não especificadas", + O069: "Aborto não especificado - completo ou não especificado, sem complicações", + O07: "Falha de tentativa de aborto", + O070: "Falha de aborto provocado por razões médicas, complicado por infecção do trato genital ou dos órgãos pélvicos", + O071: "Falha de aborto provocado por razões médicas, complicado por hemorragia tardia ou excessiva", + O072: "Falha de aborto provocado por razões médicas, complicado por embolia", + O073: "Falha de aborto provocado por razões médicas, com outras complicações ou com complicações não especificadas", + O074: "Falha de aborto provocado por razões médicas, sem complicações", + O075: "Outras formas, e as não especificadas, de falha na provocação de aborto, complicadas por infecção do trato genital e por infecção dos órgãos pélvicos", + O076: "Outras formas, e as não especificadas, de falha na provocação de aborto, complicadas por hemorragia tardia ou excessiva", + O077: "Outras formas, e as não especificadas, de falha na provocação de aborto, complicadas por embolia", + O078: "Outras formas, e as não especificadas, de falha na provocação de aborto, com outras complicações ou com complicações não especificadas", + O079: "Outras formas, e as não especificadas, de falha na provocação de aborto, sem complicação", + O08: "Complicações conseqüentes a aborto e gravidez ectópica ou molar", + O080: "Infecção do trato genital e dos órgãos pélvicos conseqüente a aborto e gravidez ectópica e molar", + O081: "Hemorragia tardia ou excessiva conseqüente a aborto e a gravidez ectópica e molar", + O082: "Embolia conseqüente a aborto e a gravidez ectópica e molar", + O083: "Choque conseqüente a aborto e a gravidez ectópica e molar", + O084: "Insuficiência renal conseqüente a aborto e a gravidez ectópica e molar", + O085: "Distúrbios metabólicos conseqüentes a aborto e a gravidez ectópica e molar", + O086: "Lesão a órgãos e a tecidos pélvicos conseqüentes a aborto e a gravidez ectópica e molar", + O087: "Outras complicações venosas conseqüentes a aborto e a gravidez ectópica e molar", + O088: "Outras complicações conseqüentes a aborto e a gravidez ectópica e molar", + O089: "Complicações conseqüentes a aborto e gravidez ectópica e molar, não especificadas", + O10: "Hipertensão pré-existente complicando a gravidez, o parto e o puerpério", + O100: "Hipertensão essencial pré-existente complicando a gravidez, o parto e o puerpério", + O101: "Doença cardíaca hipertensiva pré-existente complicando a gravidez, o parto e o puerpério", + O102: "Doença renal hipertensiva pré-existente complicando a gravidez, o parto e o puerpério", + O103: "Doença cardíaca e renal hipertensiva pré-existente complicando a gravidez, o parto e o puerpério", + O104: "Hipertensão secundária pré-existente complicando a gravidez, o parto e o puerpério", + O109: "Hipertensão pré-existente não especificada, complicando a gravidez, o parto e o puerpério", + O11: "Distúrbio hipertensivo pré-existente com proteinúria superposta", + O12: "Edema e proteinúria gestacionais [induzidos pela gravidez], sem hipertensão", + O120: "Edema gestacional", + O121: "Proteinúria gestacional", + O122: "Edema gestacional com proteinúria", + O13: "Hipertensão gestacional [induzida pela gravidez] sem proteinúria significativa", + O14: "Hipertensão gestacional [induzida pela gravidez] com proteinúria significativa", + O140: "Pré-eclâmpsia moderada", + O141: "Pré-eclâmpsia grave", + O149: "Pré-eclâmpsia não especificada", + O15: "Eclâmpsia", + O150: "Eclâmpsia na gravidez", + O151: "Eclâmpsia no trabalho de parto", + O152: "Eclâmpsia no puerpério", + O159: "Eclâmpsia não especificada quanto ao período", + O16: "Hipertensão materna não especificada", + O20: "Hemorragia do início da gravidez", + O200: "Ameaça de aborto", + O208: "Outras hemorragias do início da gravidez", + O209: "Hemorragia do início da gravidez, não especificada", + O21: "Vômitos excessivos na gravidez", + O210: "Hiperêmese gravídica leve", + O211: "Hiperêmese gravídica com distúrbio metabólico", + O212: "Vômitos tardios da gravidez", + O218: "Outras formas de vômitos complicando a gravidez", + O219: "Vômitos da gravidez, não especificados", + O22: "Complicações venosas na gravidez", + O220: "Varizes dos membros inferiores na gravidez", + O221: "Varizes genitais na gravidez", + O222: "Tromboflebite superficial na gravidez", + O223: "Flebotrombose profunda na gravidez", + O224: "Hemorróidas na gravidez", + O225: "Trombose venosa cerebral na gravidez", + O228: "Outras complicações venosas na gravidez", + O229: "Complicações venosas na gravidez, não especificadas", + O23: "Infecções do trato geniturinário na gravidez", + O230: "Infecções do rim na gravidez", + O231: "Infecções da bexiga na gravidez", + O232: "Infecções da uretra na gravidez", + O233: "Infecções de outras partes do trato urinário na gravidez", + O234: "Infecção não especificada do trato urinário na gravidez", + O235: "Infecções do trato genital na gravidez", + O239: "Outras infecções e as não especificadas do trato urinário na gravidez", + O24: "Diabetes mellitus na gravidez", + O240: "Diabetes mellitus pré-existente, insulino-dependente", + O241: "Diabetes mellitus pré-existente, não-insulino-dependente", + O242: "Diabetes mellitus pré-existente, relacionado com a desnutrição", + O243: "Diabetes mellitus pré-existente, não especificado", + O244: "Diabetes mellitus que surge durante a gravidez", + O249: "Diabetes mellitus na gravidez, não especificado", + O25: "Desnutrição na gravidez", + O26: "Assistência materna por outras complicações ligadas predominantemente à gravidez", + O260: "Ganho excessivo de peso na gravidez", + O261: "Ganho de peso insuficiente na gravidez", + O262: "Assistência à gravidez por motivo de abortamento habitual", + O263: "Retenção de dispositivo intra-uterino contraceptivo (DIU) na gravidez", + O264: "Herpes gestacional", + O265: "Síndrome da hipotensão materna", + O266: "Transtornos do fígado na gravidez, no parto e no puerpério", + O267: "Subluxação da sínfise (púbica) na gravidez, parto e puerpério", + O268: "Outras afecções especificadas, ligadas a gravidez", + O269: "Afecções ligadas a gravidez, não especificadas", + O28: 'Achados anormais do rastreamento ["screening"] antenatal da mãe', + O280: 'Achados hematológicos anormais do rastreamento ["screening"] antenatal da mãe', + O281: 'Achados bioquímicos anormais do rastreamento ["screening"] antenatal da mãe', + O282: 'Achados citológicos anormais do rastreamento ["screening"] antenatal da mãe', + O283: 'Achados ultrassonográficos anormais do rastreamento ["screening"] antenatal da mãe', + O284: 'Achados radiológicos anormais do rastreamento ["screening"] antenatal da mãe', + O285: 'Achados cromossômicos e genéticos anormais do rastreamento ["screening"] antenatal da mãe', + O288: 'Outros achados anormais do rastreamento ["screening"] antenatal da mãe', + O289: 'Achados anormais do rastreamento ["screening"] antenatal da mãe, não especificados', + O29: "Complicações de anestesia administrada durante a gravidez", + O290: "Complicações pulmonares de anestesia administrada durante a gravidez", + O291: "Complicações cardíacas de anestesia administrada durante a gravidez", + O292: "Complicações relativas ao sistema nervoso central devidas a anestesia administrada durante a gravidez", + O293: "Reação tóxica causada por anestesia local administrada durante a gravidez", + O294: "Cefaléia causada por anestesia raquidiana ou peridural administradas durante a gravidez", + O295: "Outras complicações de anestesia raquidiana ou peridural administradas durante a gravidez", + O296: "Falha ou dificuldade na entubação durante a gravidez", + O298: "Outras complicações de anestesia durante a gravidez", + O299: "Complicações de anestesia durante a gravidez, não especificadas", + O30: "Gestação múltipla", + O300: "Gravidez dupla", + O301: "Gravidez trigemelar", + O302: "Gravidez quadrigemelar", + O308: "Outras gestações múltiplas", + O309: "Gestação múltipla, não especificada", + O31: "Complicações específicas de gestação múltipla", + O310: "Feto papiráceo", + O311: "Continuação da gravidez após aborto de um ou mais fetos", + O312: "Continuação da gravidez após a morte intra-uterina de um ou mais fetos", + O318: "Outras complicações específicas de gestação múltipla", + O32: "Assistência prestada à mãe por motivo de apresentação anormal, conhecida ou suspeitada, do feto", + O320: "Assistência prestada à mãe por posição fetal instável", + O321: "Assistência prestada à mãe por apresentação pélvica", + O322: "Assistência prestada à mãe por posição fetal transversa e oblíqua", + O323: "Assistência prestada à mãe por apresentação de face, mento e fronte", + O324: "Assistência prestada à mãe por polo cefálico alto em gestação a termo", + O325: "Assistência prestada à mãe por gestação múltipla com apresentação anormal de um ou mais fetos", + O326: "Assistência prestada à mãe por apresentação composta", + O328: "Assistência prestada à mãe por outras formas de apresentação anormal do feto", + O329: "Assistência prestada à mãe por apresentação anormal do feto, não especificada", + O33: "Assistência prestada à mãe por uma desproporção conhecida ou suspeita", + O330: "Assistência prestada à mãe por uma desproporção devida à deformidade da pelve óssea materna", + O331: "Assistência prestada à mãe por uma desproporção devida à contração geral da pelve", + O332: "Assistência prestada à mãe por uma desproporção devida à contração do estreito superior da pelve", + O333: "Assistência prestada à mãe por uma desproporção devida à contração do estreito inferior da pelve", + O334: "Assistência prestada à mãe por uma desproporção de origem mista, materna e fetal", + O335: "Assistência prestada à mãe por uma desproporção devida a feto excepcionalmente grande", + O336: "Assistência prestada à mãe por uma desproporção devida a feto hidrocefálico", + O337: "Assistência prestada à mãe por uma desproporção devida a outras deformidades fetais", + O338: "Assistência prestada à mãe por uma desproporção de outra origem", + O339: "Assistência prestada à mãe por uma desproporção, não especificada", + O34: "Assistência prestada à mãe por anormalidade, conhecida ou suspeita, dos órgãos pélvicos maternos", + O340: "Assistência à mãe por malformação congênita do útero", + O341: "Assistência prestada à mãe por tumor do corpo do útero", + O342: "Assistência prestada à mãe por cicatriz uterina devida a uma cirurgia anterior", + O343: "Assistência prestada à mãe por incompetência cervical", + O344: "Assistência prestada à mãe por outras anormalidades do colo do útero", + O345: "Assistência prestada à mãe por outras anormalidades do útero gravídico", + O346: "Assistência prestada à mãe por anormalidade da vagina", + O347: "Assistência prestada à mãe por anormalidade da vulva e do períneo", + O348: "Assistência prestada à mãe por outras anormalidades dos órgãos pélvicos", + O349: "Assistência prestada à mãe por anormalidade de órgãos pélvicos, não especificada", + O35: "Assistência prestada à mãe por anormalidade e lesão fetais, conhecidas ou suspeitadas", + O350: "Assistência prestada à mãe por malformação do sistema nervoso central do feto (suspeitada)", + O351: "Assistência prestada à mãe por anormalidade cromossômica (suspeitada) do feto", + O352: "Assistência prestada à mãe por doença hereditária (suspeitada) do feto", + O353: "Assistência prestada à mãe por lesão fetal (suspeitada) causada por doença viral materna", + O354: "Assistência prestada à mãe por lesão (suspeitada) causada ao feto por alcoolismo materno", + O355: "Assistência prestada à mãe por lesão fetal (suspeitada) causada por drogas", + O356: "Assistência prestada à mãe por lesão fetal (suspeitada) causada por radiação", + O357: "Assistência prestada à mãe por lesão fetal (suspeitada) causada por outros procedimentos médicos", + O358: "Assistência prestada à mãe por outras anormalidades ou lesões fetais (suspeitadas)", + O359: "Assistência prestada à mãe por lesão ou anormalidade fetais (suspeitadas), não especificadas", + O36: "Assistência prestada à mãe por outros problemas fetais conhecidos ou suspeitados", + O360: "Assistência prestada à mãe por isoimunização Rh", + O361: "Assistência prestada à mãe por outros tipos de isoimunização", + O362: "Assistência prestada à mãe por hidropsia fetal", + O363: "Assistência prestada à mãe por sinais de hipóxia fetal", + O364: "Assistência prestada à mãe por morte intra-uterina", + O365: "Assistência prestada à mãe por insuficiência de crescimento fetal", + O366: "Assistência prestada à mãe por crescimento fetal excessivo", + O367: "Assistência prestada à mãe por feto viável em gravidez abdominal", + O368: "Assistência prestada à mãe por outros problemas fetais especificados", + O369: "Assistência prestada à mãe por problema fetal não especificado", + O40: "Polihidrâmnio", + O41: "Outros transtornos das membranas e do líquido amniótico", + O410: "Oligohidrâmnio", + O411: "Infecção do saco amniótico e das membranas", + O418: "Outros transtornos especificados do líquido amniótico e das membranas", + O419: "Transtornos do líquido amniótico e das membranas não especificados", + O42: "Ruptura prematura de membranas", + O420: "Ruptura prematura de membranas, com início do trabalho de parto dentro de 24 horas", + O421: "Ruptura prematura de membranas, com início do trabalho de parto depois das primeiras 24 horas", + O422: "Ruptura prematura de membranas, com trabalho de parto retardado por terapêutica", + O429: "Ruptura prematura de membranas, não especificada", + O43: "Transtornos da placenta", + O430: "Síndromes de transfusão placentária", + O431: "Malformação da placenta", + O438: "Outros transtornos da placenta", + O439: "Transtorno da placenta, não especificado", + O44: "Placenta prévia", + O440: "Placenta prévia especificada como sem hemorragia", + O441: "Placenta prévia com hemorragia", + O45: "Descolamento prematuro da placenta [abruptio placentae]", + O450: "Descolamento prematuro da placenta com deficiência de coagulação", + O458: "Outro descolamento prematuro da placenta", + O459: "Descolamento prematuro da placenta, não especificado", + O46: "Hemorragia anteparto não classificada em outra parte", + O460: "Hemorragia anteparto com deficiência de coagulação", + O468: "Outra forma de hemorragia anteparto", + O469: "Hemorragia anteparto, não especificada", + O47: "Falso trabalho de parto", + O470: "Falso trabalho de parto antes de se completarem 37 semanas de gestação", + O471: "Falso trabalho de parto na 37ª semana completa ou depois dela", + O479: "Falso trabalho de parto, não especificado", + O48: "Gravidez prolongada", + O60: "Trabalho de parto pré-termo", + O600: "Trabalho de parto pré-termo sem parto", + O601: "Trabalho de parto pré-termo com parto pré-termo", + O602: "Trabalho de parto pré-termo com parto a termo", + O61: "Falha na indução do trabalho de parto", + O610: "Falha na indução médica do trabalho de parto", + O611: "Falha na indução instrumental do trabalho de parto", + O618: "Outras formas de falha na indução do trabalho de parto", + O619: "Falha na indução do trabalho de parto, não especificada", + O62: "Anormalidades da contração uterina", + O620: "Contrações iniciais inadequadas", + O621: "Inércia uterina secundária", + O622: "Outras formas de inércia uterina", + O623: "Trabalho de parto precipitado", + O624: "Contrações uterinas hipertônicas, incoordenadas ou prolongadas", + O628: "Outras anormalidades da contração uterina", + O629: "Anormalidades da contração uterina, não especificadas", + O63: "Trabalho de parto prolongado", + O630: "Prolongamento do primeiro período (dilatação)", + O631: "Prolongamento do segundo período (expulsão)", + O632: "Parto retardado do segundo gêmeo, do terceiro gêmeo etc", + O639: "Trabalho de parto prolongado, não especificado", + O64: "Obstrução do trabalho de parto devida à má-posição ou má-apresentação do feto", + O640: "Obstrução do trabalho de parto devida à rotação incompleta do polo cefálico fetal", + O641: "Obstrução do trabalho de parto devida à apresentação pélvica", + O642: "Obstrução do trabalho de parto devida à apresentação de face", + O643: "Obstrução do trabalho de parto devida à apresentação de fronte", + O644: "Obstrução do trabalho de parto devida à apresentação de ombro", + O645: "Obstrução do trabalho de parto devida à apresentação complexa", + O648: "Obstrução do trabalho de parto devida a outras formas de má-apresentação e má-posição", + O649: "Obstrução do trabalho de parto devida a má-posição ou má-apresentação, não especificadas", + O65: "Obstrução do trabalho de parto devida a anormalidade pélvica da mãe", + O650: "Obstrução do trabalho de parto devida a deformidade pélvica", + O651: "Obstrução do trabalho de parto devida à contração geral da pelve", + O652: "Obstrução do trabalho de parto devida à contração do estreito superior", + O653: "Obstrução do trabalho de parto devida à contração do estreito inferior ou da cavidade mediana", + O654: "Obstrução do trabalho de parto devida a desproporção feto-pélvica, não especificada", + O655: "Obstrução do trabalho de parto devida a anormalidade dos órgãos pélvicos maternos", + O658: "Obstrução do trabalho de parto devida a outras anormalidades pélvicas maternas", + O659: "Obstrução do trabalho de parto devida a anormalidades pélvicas maternas não especificadas", + O66: "Outras formas de obstrução do trabalho de parto", + O660: "Obstrução do trabalho de parto devido a distócia de ombro", + O661: "Obstrução do trabalho de parto por colisão de gêmeos", + O662: "Obstrução do trabalho de parto por feto excepcionalmente grande", + O663: "Obstrução do trabalho de parto devido a outras anormalidades do feto", + O664: "Falha de tentativa de trabalho de parto, não especificada", + O665: "Falha de aplicação de fórceps e vácuo-extrator, não especificada", + O668: "Outras formas de obstrução do trabalho de parto, especificadas", + O669: "Obstrução do trabalho de parto, não especificado", + O67: "Trabalho de parto e parto complicados por hemorragia intraparto não classificados em outra parte", + O670: "Hemorragia intraparto com deficiência de coagulação", + O678: "Outras hemorragias intraparto", + O679: "Hemorragia intraparto não especificada", + O68: "Trabalho de parto e parto complicados por sofrimento fetal", + O680: "Trabalho de parto e parto complicados por anormalidade da freqüência cardíaca fetal", + O681: "Trabalho de parto e parto complicados por mecônio no líquido amniótico", + O682: "Trabalho de parto e parto complicados por anormalidade na freqüência cardíaca fetal com mecônio no líquido amniótico", + O683: "Trabalho de parto e parto complicados por evidências bioquímicas de sofrimento fetal", + O688: "Trabalho de parto e parto complicados por outras evidências de sofrimento fetal", + O689: "Trabalho de parto e parto complicados por sofrimento fetal, não especificado", + O69: "Trabalho de parto e parto complicados por anormalidade do cordão umbilical", + O690: "Trabalho de parto e parto complicados por prolapso do cordão", + O691: "Trabalho de parto e parto complicados por circular de cordão, com compressão", + O692: "Trabalho de parto e parto complicados por outros enovelamentos do cordão", + O693: "Trabalho de parto e parto complicados por cordão curto", + O694: "Trabalho de parto e parto complicados por vasa praevia", + O695: "Trabalho de parto e parto complicados por lesão vascular do cordão", + O698: "Trabalho de parto e parto complicados por outras complicações do cordão", + O699: "Trabalho de parto e parto complicados por complicações do cordão, não especificadas", + O70: "Laceração do períneo durante o parto", + O700: "Laceração de períneo de primeiro grau durante o parto", + O701: "Laceração de períneo de segundo grau durante o parto", + O702: "Laceração de períneo de terceiro grau durante o parto", + O703: "Laceração de períneo de quarto grau durante o parto", + O709: "Laceração de períneo durante o parto, não especificada", + O71: "Outros traumatismos obstétricos", + O710: "Ruptura do útero antes do início do trabalho de parto", + O711: "Ruptura do útero durante o trabalho de parto", + O712: "Inversão do útero pós-parto", + O713: "Laceração obstétrica do colo do útero", + O714: "Laceração vaginal alta isolada, de origem obstétrica", + O715: "Outras lesões obstétricas aos órgãos pélvicos", + O716: "Lesão obstétrica das articulações e dos ligamentos pélvicos", + O717: "Hematoma obstétrico da pelve", + O718: "Outros traumatismos obstétricos especificados", + O719: "Traumatismo obstétrico, não especificado", + O72: "Hemorragia pós-parto", + O720: "Hemorragia do terceiro estágio", + O721: "Outras hemorragias do pós-parto imediato", + O722: "Hemorragias pós-parto, tardias e secundárias", + O723: "Deficiências de coagulação pós-parto", + O73: "Retenção da placenta e das membranas, sem hemorragias", + O730: "Retenção da placenta sem hemorragia", + O731: "Retenção de partes da placenta ou das membranas, sem hemorragia", + O74: "Complicações de anestesia durante o trabalho de parto e o parto", + O740: "Pneumonite aspirativa devida a anestesia durante o trabalho de parto e o parto", + O741: "Outras complicações pulmonares devidas a anestesia durante o trabalho de parto e no parto", + O742: "Complicações cardíacas devidas a anestesia durante o trabalho de parto e no parto", + O743: "Complicações do sistema nervoso central devidas a anestesia durante o trabalho de parto e no parto", + O744: "Reação tóxica a anestesia local durante trabalho de parto e o parto", + O745: "Cefaléia pós-anestesia raquidiana e peridural, durante o trabalho de parto e parto", + O746: "Outras complicações de anestesia raquidiana ou peridural, durante o trabalho de parto e parto", + O747: "Falha ou dificuldade de entubação durante o trabalho de parto e parto", + O748: "Outras complicações de anestesia durante o trabalho de parto e parto", + O749: "Complicações de anestesia durante o trabalho de parto e parto, não especificadas", + O75: "Outras complicações do trabalho de parto e do parto não classificadas em outra parte", + O750: "Sofrimento materno durante o trabalho de parto e o parto", + O751: "Choque durante ou subseqüente ao trabalho de parto e o parto", + O752: "Febre durante o trabalho de parto não classificada em outra parte", + O753: "Outras infecções durante o trabalho de parto", + O754: "Outras complicações de procedimentos ou de cirurgia obstétrica", + O755: "Demora do parto após ruptura artificial das membranas", + O756: "Demora do parto após ruptura espontânea ou não especificada das membranas", + O757: "Parto vaginal subseqüente a cesariana anterior", + O758: "Outras complicações especificadas do trabalho de parto e do parto", + O759: "Complicações do trabalho de parto e do parto, não especificadas", + O80: "Parto único espontâneo", + O800: "Parto espontâneo cefálico", + O801: "Parto espontâneo pélvico", + O808: "Outros tipos de parto único espontâneo", + O809: "Parto único espontâneo, não especificado", + O81: "Parto único por fórceps ou vácuo-extrator", + O810: "Parto por fórceps baixo", + O811: "Parto por fórceps da cavidade mediana", + O812: "Fórceps da cavidade mediana com rotação", + O813: "Outros tipos de parto por fórceps e os não especificados", + O814: "Parto por vácuo-extrator", + O815: "Parto por combinação de fórceps e vácuo-extrator", + O82: "Parto único por cesariana", + O820: "Parto por cesariana eletiva", + O821: "Parto por cesariana de emergência", + O822: "Parto por cesariana para histerectomia", + O828: "Outros tipos de parto único por cesariana", + O829: "Parto por cesariana, não especificada", + O83: "Outros tipos de parto único assistido", + O830: "Extração pélvica", + O831: "Outros tipos de parto pélvico assistido", + O832: "Outras formas de parto com o auxílio de manipulação", + O833: "Parto de gravidez intra-abdominal com feto viável", + O834: "Cirurgia destrutiva para facilitar o parto", + O838: "Outros tipos especificados de parto único assistido", + O839: "Parto único assistido, não especificado", + O84: "Parto múltiplo", + O840: "Parto múltiplo, todos espontâneos", + O841: "Parto múltiplo, todos por fórceps ou vácuo-extrator", + O842: "Parto múltiplo, todos por cesariana", + O848: "Outro tipo de parto múltiplo", + O849: "Parto múltiplo, não especificado", + O85: "Infecção puerperal", + O86: "Outras infecções puerperais", + O860: "Infecção da incisão cirúrgica de origem obstétrica", + O861: "Outras infecções dos órgãos genitais subseqüentes ao parto", + O862: "Infecção das vias urinárias subseqüentes ao parto", + O863: "Outras infecções das vias genitourinárias subseqüentes ao parto", + O864: "Febre de origem desconhecida subseqüente ao parto", + O868: "Outras infecções puerperais especificadas", + O87: "Complicações venosas no puerpério", + O870: "Tromboflebite superficial no puerpério", + O871: "Tromboflebite profunda no puerpério", + O872: "Hemorróidas no puerpério", + O873: "Trombose venosa cerebral no puerpério", + O878: "Outras complicações venosas no puerpério", + O879: "Complicações venosas no puerpério, não especificadas", + O88: "Embolia de origem obstétrica", + O880: "Embolia gasosa de origem obstétrica", + O881: "Embolia amniótica", + O882: "Embolia obstétrica por coágulo de sangue", + O883: "Embolia séptica ou piêmica de origem obstétrica", + O888: "Outras embolias de origem obstétrica", + O89: "Complicações da anestesia administrada durante o puerpério", + O890: "Complicações pulmonares da anestesia durante o puerpério", + O891: "Complicações cardíacas devidas a anestesia durante o puerpério", + O892: "Complicações relativas ao sistema nervoso central devidas a anestesia durante o puerpério", + O893: "Reação tóxica a uma anestesia local durante o puerpério", + O894: "Cefaléia provocada por uma anestesia raquidiana ou peridural, durante o puerpério", + O895: "Outras complicações de anestesia raquidiana ou peridural, durante o puerpério", + O896: "Falha na ou dificuldade de entubação, durante o puerpério", + O898: "Outras complicações da anestesia durante o puerpério", + O899: "Complicação devida a anestesia, durante o puerpério, não especificada", + O90: "Complicações do puerpério não classificadas em outra parte", + O900: "Ruptura da incisão de cesariana", + O901: "Ruptura da incisão obstétrica, no períneo", + O902: "Hematoma da incisão obstétrica", + O903: "Cardiomiopatia no puerpério", + O904: "Insuficiência renal aguda do pós-parto", + O905: "Tireoidite do pós-parto", + O908: "Outras complicações do puerpério, não classificadas em outra parte", + O909: "Complicação do puerpério não especificada", + O91: "Infecções mamárias associadas ao parto", + O910: "Infecção do mamilo associada ao parto", + O911: "Abscesso da mama associada ao parto", + O912: "Mastite não purulenta associada ao parto", + O92: "Outras afecções da mama e da lactação associadas ao parto", + O920: "Mamilo retraído associado ao parto", + O921: "Fissuras do mamilo associadas ao parto", + O922: "Outras afecções da mama, e as não especificadas, associadas ao parto", + O923: "Agalactia", + O924: "Hipogalactia", + O925: "Suspensão da lactação", + O926: "Galactorréia", + O927: "Outros distúrbios da lactação e os não especificados", + O94: "Seqüelas de complicações da gravidez, parto e puerpério", + O95: "Morte obstétrica de causa não especificada", + O96: "Morte, por qualquer causa obstétrica, que ocorre mais de 42 dias, mas menos de 1 ano, após o parto", + O97: "Morte por seqüelas de causas obstétricas diretas", + O98: "Doenças infecciosas e parasitárias maternas classificáveis em outra parte mas que compliquem a gravidez, o parto e o puerpério", + O980: "Tuberculose complicando a gravidez, o parto e o puerpério", + O981: "Sífilis complicando a gravidez, o parto e o puerpério", + O982: "Gonorréia complicando a gravidez, o parto e o puerpério", + O983: "Outras infecções em que a via de transmissão é predominantemente sexual, complicando a gravidez, o parto e o puerpério", + O984: "Hepatite viral complicando a gravidez, o parto e o puerpério", + O985: "Outras doenças virais complicando a gravidez, o parto e o puerpério", + O986: "Doenças causadas por protozoários complicando a gravidez, o parto e o puerpério", + O988: "Outras doenças infecciosas e parasitárias maternas complicando a gravidez, o parto e o puerpério", + O989: "Doenças infecciosas e parasitárias maternas, não especificadas, complicando a gravidez, o parto e o puerpério", + O99: "Outras doenças da mãe, classificadas em outra parte, mas que complicam a gravidez o parto e o puerpério", + O990: "Anemia complicando a gravidez, o parto e o puerpério", + O991: "Outras doenças do sangue e dos órgãos hematopoéticos e alguns transtornos que comprometem o sistema imunológico, complicando a gravidez, o parto e o puerpério", + O992: "Doenças endócrinas, nutricionais e metabólicas complicando a gravidez, o parto e o puerpério", + O993: "Transtornos mentais e doenças do sistema nervoso complicando a gravidez, o parto e o puerpério", + O994: "Doenças do aparelho circulatório complicando a gravidez, o parto e o puerpério", + O995: "Doenças do aparelho respiratório complicando a gravidez, o parto e o puerpério", + O996: "Doenças do aparelho digestivo complicando a gravidez, o parto e o puerpério", + O997: "Doenças da pele e do tecido subcutâneo complicando a gravidez, o parto e o puerpério", + O998: "Outras doenças e afecções especificadas complicando a gravidez, o parto e o puerpério", + P00: "Feto e recém-nascido afetados por afecções maternas, não obrigatoriamente relacionadas com a gravidez atual", + P000: "Feto e recém-nascido afetados por transtornos maternos hipertensivos", + P001: "Feto e recém-nascido afetados por doenças maternas renais e das vias urinárias", + P002: "Feto e recém-nascido afetados por doenças infecciosas e parasitárias da mãe", + P003: "Feto e recém-nascido afetados por outras doenças circulatórias e respiratórias maternas", + P004: "Feto e recém-nascido afetados por transtornos nutricionais maternos", + P005: "Feto e recém-nascido afetados por traumatismo materno", + P006: "Feto e recém-nascido afetados por intervenção cirúrgica na mãe", + P007: "Feto e recém-nascido afetados por outros procedimentos médicos na mãe, não classificados em outra parte", + P008: "Feto e recém-nascido afetados por outras afecções maternas", + P009: "Feto e recém-nascido afetados por afecção materna não especificada", + P01: "Feto e recém-nascido afetados por complicações maternas da gravidez", + P010: "Feto e recém-nascido afetados por incompetência do colo uterino", + P011: "Feto e recém-nascido afetados por ruptura prematura das membranas", + P012: "Feto e recém-nascido afetados por oligohidrâmnio", + P013: "Feto e recém-nascido afetados por polihidrâmnio", + P014: "Feto e recém-nascido afetados por gravidez ectópica", + P015: "Feto e recém-nascido afetados por gravidez múltipla", + P016: "Feto e recém-nascido afetados por morte materna", + P017: "Feto e recém-nascido afetados por apresentação anormal antes do trabalho de parto", + P018: "Feto e recém-nascido afetados por outras complicações maternas da gravidez", + P019: "Feto e recém-nascido afetados por afecções maternas da gravidez, não especificadas", + P02: "Feto e recém-nascido afetados por complicações da placenta, do cordão umbilical e das membranas", + P020: "Feto e recém-nascido afetados por placenta prévia", + P021: "Feto e recém-nascido afetados por outras formas de descolamento da placenta e hemorragia", + P022: "Feto e recém-nascido afetados por outras anormalidades morfológicas e funcionais da placenta e as não especificadas", + P023: "Feto e recém-nascido afetados por síndromes de transfusão placentária", + P024: "Feto e recém-nascido afetados por prolapso de cordão umbilical", + P025: "Feto e recém-nascido afetados por outras compressões do cordão umbilical", + P026: "Feto e recém-nascido afetados por outras afecções do cordão umbilical e as não especificadas", + P027: "Feto e recém-nascido afetados por corioamnionite", + P028: "Feto e recém-nascido afetados por outras anormalidades das membranas", + P029: "Feto e recém-nascido afetados por anormalidade não especificada das membranas", + P03: "Feto e recém-nascido afetados por outras complicações do trabalho de parto e do parto", + P030: "Feto e recém-nascido afetados por parto e extração pélvicas", + P031: "Feto e recém-nascido afetados por outras apresentações anormais, má-posições e desproporções durante o trabalho de parto e o parto", + P032: "Feto e recém-nascido afetados por parto por fórceps", + P033: "Feto e recém-nascido afetados por parto por vácuo-extrator [ventosa]", + P034: "Feto e recém-nascido afetados por parto por cesariana", + P035: "Feto e recém-nascido afetados por parto precipitado", + P036: "Feto e recém-nascido afetados por contrações uterinas anormais", + P038: "Feto e recém-nascido afetados por outras complicações especificadas do trabalho de parto e do parto", + P039: "Feto e recém-nascido afetados por complicações não especificadas do trabalho de parto e do parto", + P04: "Feto e recém-nascido afetados por influências nocivas transmitidas ao feto via placenta ou leite materno", + P040: "Feto e recém-nascido afetados por anestesia e analgesia materna durante a gravidez, trabalho de parto e parto", + P041: "Feto e recém-nascido afetados por outros medicamentos utilizados pela mãe", + P042: "Feto e recém-nascido afetados pelo uso de fumo pela mãe", + P043: "Feto e recém-nascido afetados pelo uso de álcool pela mãe", + P044: "Feto e recém-nascido afetados pelo uso de drogas que causam dependência pela mãe", + P045: "Feto e recém-nascido afetados por uso materno de substâncias químicas dos alimentos", + P046: "Feto e recém-nascido afetados pela exposição da mãe a substâncias químicas do meio ambiente", + P048: "Feto e recém-nascido afetados por outras influências nocivas maternas", + P049: "Feto e recém-nascido afetados por influências nocivas maternas não especificadas", + P05: "Crescimento fetal retardado e desnutrição fetal", + P050: "Recém-nascido de baixo peso para a idade gestacional", + P051: "Pequeno para a idade gestacional", + P052: "Desnutrição fetal sem menção de peso e comprimento baixos para a idade gestacional", + P059: "Retardo não especificado do crescimento fetal", + P07: "Transtornos relacionados com a gestação de curta duração e peso baixo ao nascer não classificados em outra parte", + P070: "Recém-nascido com peso muito baixo", + P071: "Outros recém-nascidos de peso baixo", + P072: "Imaturidade extrema", + P073: "Outros recém-nascidos de pré-termo", + P08: "Transtornos relacionados com a gestação prolongada e peso elevado ao nascer", + P080: "Recém-nascido de tamanho excessivamente grande", + P081: "Outros recém-nascidos grandes para a idade gestacional", + P082: "Recém-nascido pós-termo, não-grande para a idade gestacional", + P10: "Laceração intracraniana e hemorragia devidas a traumatismo de parto", + P100: "Hemorragia subdural devida a traumatismo de parto", + P101: "Hemorragia cerebral devida a traumatismo de parto", + P102: "Hemorragia intraventricular devida a traumatismo de parto", + P103: "Hemorragia subaracnoídea devida a traumatismo de parto", + P104: "Ruptura tentorial devida a traumatismo de parto", + P108: "Outras lacerações e hemorragias intracranianas devidas a traumatismo de parto", + P109: "Laceração e hemorragia intracranianas não especificadas devidas a traumatismo de parto", + P11: "Outros traumatismos de parto do sistema nervoso central", + P110: "Edema cerebral devido a traumatismo de parto", + P111: "Outras lesões cerebrais especificadas devidas a traumatismo de parto", + P112: "Lesão cerebral não especificada devida a traumatismo de parto", + P113: "Traumatismo de parto do nervo facial", + P114: "Traumatismo de parto de outros nervos cranianos", + P115: "Traumatismo de parto da coluna e da medula espinhal", + P119: "Traumatismo de parto não especificado do sistema nervoso central", + P12: "Lesão do couro cabeludo devida a traumatismo de parto", + P120: "Céfalo-hematoma devido a traumatismo de parto", + P121: '"Chignon" devido a traumatismo de parto', + P122: "Hemorragia subaponeurótica epicraniana devida a traumatismo de parto", + P123: "Esmagamento do couro cabeludo devido a traumatismo de parto", + P124: "Lesão por monitorização do couro cabeludo do recém-nascido", + P128: "Outras lesões do couro cabeludo devidas a traumatismo de parto", + P129: "Lesão não especificada do couro cabeludo devida a traumatismo de parto", + P13: "Lesões do esqueleto devidas a traumatismo de parto", + P130: "Fratura de crânio devida a traumatismo de parto", + P131: "Outras lesões cranianas devidas a traumatismo de parto", + P132: "Lesão do fêmur devida a traumatismo de parto", + P133: "Lesão de outros ossos longos devida a traumatismo de parto", + P134: "Fratura da clavícula devida a traumatismo de parto", + P138: "Lesões de outras partes do esqueleto devidas a traumatismo de parto", + P139: "Lesões não especificadas do esqueleto devidas a traumatismo de parto", + P14: "Lesões ao nascer do sistema nervoso periférico", + P140: "Paralisia de Erb devida a traumatismo de parto", + P141: "Paralisia de Klumpke devida a traumatismo de parto", + P142: "Paralisia do nervo frênico devida a traumatismo de parto", + P143: "Outras lesões do plexo braquial devidas a traumatismo de parto", + P148: "Outras lesões de outras partes do sistema nervoso periférico devidas a traumatismo de parto", + P149: "Lesão não especificada do sistema nervoso periférico devida a traumatismo de parto", + P15: "Outros traumatismos de parto", + P150: "Lesão do fígado devida a traumatismo de parto", + P151: "Lesão do baço devida a traumatismo de parto", + P152: "Lesão do esternomastóide devida a traumatismo de parto", + P153: "Lesão dos olhos devida a traumatismo de parto", + P154: "Lesão da face ao nascer", + P155: "Lesão dos órgãos genitais externos, devida a traumatismo de parto", + P156: "Necrose de gordura subcutânea devida a traumatismo de parto", + P158: "Outros traumatismos de parto especificados", + P159: "Traumatismo de parto não especificado", + P20: "Hipóxia intra-uterina", + P200: "Hipóxia intra-uterina diagnosticada antes do início do trabalho de parto", + P201: "Hipóxia intra-uterina diagnosticada durante o trabalho de parto e o parto", + P209: "Hipóxia intra-uterina não especificada", + P21: "Asfixia ao nascer", + P210: "Asfixia grave ao nascer", + P211: "Asfixia leve ou moderada ao nascer", + P219: "Asfixia ao nascer, não especificada", + P22: "Desconforto (angústia) respiratório(a) do recém-nascido", + P220: "Síndrome da angústia respiratória do recém-nascido", + P221: "Taquipnéia transitória do recém-nascido", + P228: "Outros desconfortos respiratórios do recém-nascido", + P229: "Desconforto respiratório não especificado do recém-nascido", + P23: "Pneumonia congênita", + P230: "Pneumonia congênita devida a agente viral", + P231: "Pneumonia congênita devida a Clamídia", + P232: "Pneumonia congênita devida a estafilococo", + P233: "Pneumonia congênita devida a estreptococo do grupo B", + P234: "Pneumonia congênita devida a Escherichia coli", + P235: "Pneumonia congênita devida a Pseudomonas", + P236: "Pneumonia congênita devida a outros agentes bacterianos", + P238: "Pneumonia congênita devida a outros organismos", + P239: "Pneumonia congênita não especificada", + P24: "Síndrome de aspiração neonatal", + P240: "Aspiração neonatal de mecônio", + P241: "Aspiração neonatal de líquido amniótico e muco", + P242: "Aspiração neonatal de sangue", + P243: "Aspiração neonatal de leite e alimento regurgitados", + P248: "Outras síndromes de aspiração neonatais", + P249: "Síndrome de aspiração neonatal não especificada", + P25: "Enfisema intersticial e afecções correlatas originadas no período perinatal", + P250: "Enfisema intersticial originado no período perinatal", + P251: "Pneumotórax originado no período perinatal", + P252: "Pneumomediastino originado no período perinatal", + P253: "Pneumopericárdio originado no período perinatal", + P258: "Outras afecções relacionadas com o enfisema intersticial originadas no período perinatal", + P26: "Hemorragia pulmonar originada no período perinatal", + P260: "Hemorragia traqueobrônquica originada no período perinatal", + P261: "Hemorragia pulmonar maciça originada no período perinatal", + P268: "Outras hemorragias pulmonares originadas no período perinatal", + P269: "Hemorragia pulmonar não especificada originada no período perinatal", + P27: "Doença respiratória crônica originada no período perinatal", + P270: "Síndrome de Wilson-Mikity", + P271: "Displasia broncopulmonar originada no período perinatal", + P278: "Outras doenças respiratórias crônicas originadas no período perinatal", + P279: "Doença respiratória crônica não especificada originada no período perinatal", + P28: "Outras afecções respiratórias originadas no período perinatal", + P280: "Atelectasia primária do recém-nascido", + P281: "Outras atelectasias do recém-nascido e as não especificadas", + P282: "Crises cianóticas do recém-nascido", + P283: "Apnéia primária do sono do recém-nascido", + P284: "Outras apnéias do recém-nascido", + P285: "Insuficiência respiratória do recém-nascido", + P288: "Outras afecções respiratórias especificadas do recém-nascido", + P289: "Afecção respiratória do recém-nascido, não especificada", + P29: "Transtornos cardiovasculares originados no período perinatal", + P290: "Insuficiência cardíaca neonatal", + P291: "Disritmia cardíaca neonatal", + P292: "Hipertensão neonatal", + P293: "Persistência da circulação fetal", + P294: "Isquemia miocárdica transitória do recém-nascido", + P298: "Outros transtornos cardiovasculares originados no período perinatal", + P299: "Transtornos cardiovasculares não especificados originados no período perinatal", + P35: "Doenças virais congênitas", + P350: "Síndrome da rubéola congênita", + P351: "Infecção congênita por citomegalovirus", + P352: "Infecção congênita por vírus do herpes [simples]", + P353: "Hepatite viral congênita", + P358: "Outras doenças virais congênitas", + P359: "Doença viral congênita não especificada", + P36: "Septicemia bacteriana do recém-nascido", + P360: "Septicemia do recém-nascido devida a estreptococo do grupo B", + P361: "Septicemia do recém-nascido devida a outros estreptococos e aos não especificados", + P362: "Septicemia do recém-nascido devida ao Stafilococcus aureus", + P363: "Septicemia do recém-nascido devida a outros estafilococos e aos não especificados", + P364: "Septicemia do recém-nascido devida a Escherichia coli", + P365: "Septicemia do recém-nascido devida a anaeróbios", + P368: "Outras septicemias bacterianas do recém-nascido", + P369: "Septicemia bacteriana não especificada do recém-nascido", + P37: "Outras doenças infecciosas e parasitárias congênitas", + P370: "Tuberculose congênita", + P371: "Toxoplasmose congênita", + P372: "Listeriose neonatal (disseminada)", + P373: "Malária falciparum congênita", + P374: "Outras malárias congênitas", + P375: "Candidíase neonatal", + P378: "Outras doenças infecciosas e parasitárias congênitas especificadas", + P379: "Doença infecciosa ou parasitária congênita não especificada", + P38: "Onfalite do recém-nascido com ou sem hemorragia leve", + P39: "Outras infecções específicas do período perinatal", + P390: "Mastite infecciosa neonatal", + P391: "Conjuntivite e dacriocistite neonatais", + P392: "Infecção intra-amniótica do feto não classificada em outra parte", + P393: "Infecção neonatal do trato urinário", + P394: "Infecção neonatal da pele", + P398: "Outras infecções especificadas próprias do período perinatal", + P399: "Infecção própria do período perinatal não especificada", + P50: "Perda sangüínea fetal", + P500: "Perda sangüínea fetal devida a vasa prévia", + P501: "Perda sangüínea fetal por ruptura do cordão", + P502: "Perda sangüínea fetal originada da placenta", + P503: "Hemorragia para a circulação do outro gêmeo", + P504: "Hemorragia para a circulação materna", + P505: "Perda sangüínea devido a secção do cordão umbilical do outro gemelar", + P508: "Outras perdas sangüíneas fetais", + P509: "Perda sangüínea fetal não especificada", + P51: "Hemorragia umbilical do recém-nascido", + P510: "Hemorragia umbilical maciça do recém-nascido", + P518: "Outras hemorragias umbilicais do recém-nascido", + P519: "Hemorragia umbilical do recém-nascido, não especificada", + P52: "Hemorragia intracraniana não-traumática do feto e do recém-nascido", + P520: "Hemorragia intraventricular (não-traumática) grau 1, do feto e do recém-nascido", + P521: "Hemorragia intraventricular (não-traumática) grau 2, do feto e do recém-nascido", + P522: "Hemorragia intraventricular (não-traumática) grau 3, do feto e do recém-nascido", + P523: "Hemorragia intraventricular (não-traumática) não especificada, do feto ou do recém-nascido", + P524: "Hemorragia intracerebral (não-traumática) do feto e do recém-nascido", + P525: "Hemorragia subaracnoídea (não-traumática) do feto e do recém-nascido", + P526: "Hemorragia cerebelar (não-traumática) e da fossa posterior do feto ou recém-nascido", + P528: "Outras hemorragias intracranianas (não-traumáticas) do feto e do recém-nascido", + P529: "Hemorragia intracraniana (não-traumática) do feto e do recém-nascido, não especificada", + P53: "Doença hemorrágica do feto e do recém-nascido", + P54: "Outras hemorragias neonatais", + P540: "Hematêmese neonatal", + P541: "Melena neonatal", + P542: "Hemorragia retal neonatal", + P543: "Outras hemorragias gastrointestinais do período neonatal", + P544: "Hemorragia supra-renal neonatal", + P545: "Hemorragia cutânea neonatal", + P546: "Hemorragia vaginal neonatal", + P548: "Outras hemorragias fetais e neonatais especificadas", + P549: "Hemorragia fetal e neonatal não especificada", + P55: "Doença hemolítica do feto e do recém-nascido", + P550: "Isoimunização Rh do feto e do recém-nascido", + P551: "Isoimunização ABO do feto e do recém-nascido", + P558: "Outras doenças hemolíticas do feto e do recém-nascido", + P559: "Doença hemolítica não especificada do feto e do recém-nascido", + P56: "Hidropsia fetal devida a doença hemolítica", + P560: "Hidropsia fetal devida à isoimunização", + P569: "Hidropsia fetal devida a outras doenças hemolíticas e às não especificadas", + P57: "Kernicterus", + P570: "Kernicterus devido à isoimunização", + P578: "Outros kernicterus especificados", + P579: "Kernicterus não especificado", + P58: "Icterícia neonatal devida a outras hemólises excessivas", + P580: "Icterícia neonatal devida a contusões", + P581: "Icterícia neonatal devida a sangramento", + P582: "Icterícia neonatal devida a infecção", + P583: "Icterícia neonatal devida a policitemia", + P584: "Icterícia neonatal devida a drogas ou toxinas transmitidas pela mãe ou administradas ao recém-nascido", + P585: "Icterícia neonatal devida à deglutação de sangue materno", + P588: "Icterícia neonatal devida a outras hemólises excessivas especificadas", + P589: "Icterícia neonatal devida a hemólise excessiva não especificada", + P59: "Icterícia neonatal devida a outras causas e às não especificadas", + P590: "Icterícia neonatal associada ao parto prematuro", + P591: "Síndrome da bile espessa", + P592: "Icterícia neonatal de outras lesões hepatocelulares e das não especificadas", + P593: "Icterícia neonatal devida a inibidores do leite materno", + P598: "Icterícia neonatal devida a outras causas especificadas", + P599: "Icterícia neonatal não especificada", + P60: "Coagulação intravascular disseminada do feto e do recém-nascido", + P61: "Outros transtornos hematológicos perinatais", + P610: "Trombocitopenia transitória neonatal", + P611: "Policitemia neonatal", + P612: "Anemia da prematuridade", + P613: "Anemia congênita por perda sangüínea fetal", + P614: "Outras anemias congênitas não classificada em outra parte", + P615: "Neutropenia transitória neonatal", + P616: "Outros transtornos transitórios de coagulação do período neonatal", + P618: "Outros transtornos hematológicos perinatais especificados", + P619: "Transtorno hematológico perinatal não especificado", + P70: "Transtornos transitórios do metabolismo dos carboidratos específicos do feto e do recém-nascido", + P700: "Síndrome do filho de mãe com diabetes gestacional", + P701: "Síndrome do filho de mãe diabética", + P702: "Diabetes mellitus neonatal", + P703: "Hipoglicemia neonatal iatrogênica", + P704: "Outras hipoglicemias neonatais", + P708: "Outros transtornos transitórios do metabolismo dos carboidratos do feto e do recém-nascido", + P709: "Transtorno transitório não especificado do metabolismo dos carboidratos do feto e do recém-nascido", + P71: "Transtornos transitórios do metabolismo do cálcio e do magnésio do período neonatal", + P710: "Hipocalcemia do recém-nascido pelo uso de leite de vaca", + P711: "Outras hipocalcemias neonatais", + P712: "Hipomagnesemia neonatal", + P713: "Tetania neonatal sem deficiência de cálcio ou magnésio", + P714: "Hipoparatiroidismo neonatal transitório", + P718: "Outros transtornos transitórios do metabolismo do cálcio e do magnésio do período neonatal", + P719: "Transtornos transitórios não especificados do metabolismo do cálcio e do magnésio do período neonatal", + P72: "Outros transtornos endócrinos transitórios do período neonatal", + P720: "Bócio neonatal, não classificado em outra parte", + P721: "Hipotireoidismo neonatal transitório", + P722: "Outros transtornos transitórios da função de tireóide não classificados em outra parte", + P728: "Outros transtornos endócrinos transitórios e especificados do período neonatal", + P729: "Transtorno endócrino neonatal transitório não especificado", + P74: "Outros distúrbios eletrolíticos e metabólicos transitórios do período neonatal", + P740: "Acidose metabólica tardia do recém-nascido", + P741: "Desidratação do recém-nascido", + P742: "Distúrbios do equilíbrio de sódio do recém-nascido", + P743: "Distúrbios do equilíbrio de potássio do recém-nascido", + P744: "Outros distúrbios eletrolíticos transitórios do recém-nascido", + P745: "Tirosinemia transitória do recém-nascido", + P748: "Outros distúrbios metabólicos transitórios do recém-nascido", + P749: "Distúrbio metabólico transitório não especificado do recém-nascido", + P75: "Íleo meconial", + P76: "Outras obstruções intestinais do recém-nascido", + P760: 'Síndrome da "rolha de mecônio"', + P761: "Íleo transitório do recém-nascido", + P762: "Obstrução intestinal devido a leite espesso", + P768: "Outras obstruções intestinais especificadas do recém-nascido", + P769: "Obstrução intestinal não especificada do recém-nascido", + P77: "Enterocolite necrotizante do feto e do recém-nascido", + P78: "Outros transtornos do aparelho digestivo do período perinatal", + P780: "Perfuração intestinal no período perinatal", + P781: "Outras peritonites neonatais", + P782: "Hematemese e melena devidas a deglutição de sangue materno", + P783: "Diarréia neonatal não-infecciosa", + P788: "Outros transtornos perinatais especificados do aparelho digestivo", + P789: "Transtorno perinatal não especificado do aparelho digestivo", + P80: "Hipotermia do recém-nascido", + P800: "Síndrome de lesão pelo frio", + P808: "Outras hipotermias do recém-nascido", + P809: "Hipotermia não especificada do recém-nascido", + P81: "Outros distúrbios da regulação térmica do recém-nascido", + P810: "Hipertermia ambiental do recém-nascido", + P818: "Outros distúrbios especificados da regulação térmica do recém-nascido", + P819: "Distúrbio não especificado da regulação térmica do recém-nascido", + P83: "Outras afecções comprometendo o tegumento específicas do feto e do recém-nascido", + P830: "Esclerema neonatal", + P831: "Eritema tóxico neonatal", + P832: "Hidropsia fetal não-devida à doença hemolítica", + P833: "Outros edemas e os não especificados próprios do feto e do recém-nascido", + P834: "Intumescimento mamário do recém-nascido", + P835: "Hidrocele congênita", + P836: "Pólipo umbilical do recém-nascido", + P838: "Outras afecções especificadas do tegumento próprias do feto e do recém-nascido", + P839: "Afecção não especificada do tegumento própria do feto e do recém-nascido", + P90: "Convulsões do recém-nascido", + P91: "Outros distúrbios da função cerebral do recém-nascido", + P910: "Isquemia cerebral neonatal", + P911: "Cistos periventriculares adquiridos do recém-nascido", + P912: "Leucomalácia cerebral neonatal", + P913: "Irritabilidade cerebral neonatal", + P914: "Depressão cerebral neonatal", + P915: "Coma neonatal", + P916: "Encefalopatia hipóxico-isquêmica do recém-nascido", + P918: "Outros distúrbios especificados da função cerebral do recém-nascido", + P919: "Distúrbio não especificado da função cerebral do recém-nascido", + P92: "Problemas de alimentação do recém-nascido", + P920: "Vômitos no recém-nascido", + P921: "Regurgitação e ruminação no recém-nascido", + P922: "Alimentação vagarosa do recém-nascido", + P923: "Subalimentação do recém-nascido", + P924: "Hiperalimentação do recém-nascido", + P925: "Dificuldade neonatal na amamentação no peito", + P928: "Outros problemas de alimentação do recém-nascido", + P929: "Problema não especificado de alimentação do recém-nascido", + P93: "Reações e intoxicações devidas a drogas administradas ao feto e ao recém-nascido", + P94: "Transtornos do tônus muscular do recém-nascido", + P940: "Miastenia grave neonatal transitória", + P941: "Hipertonia congênita", + P942: "Hipotonia congênita", + P948: "Outros transtornos do tônus muscular do recém-nascido", + P949: "Transtorno não especificado do tônus muscular do recém-nascido", + P95: "Morte fetal de causa não especificada", + P96: "Outras afecções originadas no período perinatal", + P960: "Insuficiência renal congênita", + P961: "Sintomas de abstinência neonatal de drogas utilizadas pela mãe", + P962: "Sintomas de abstinência do uso de drogas terapêuticas no recém-nascido", + P963: "Suturas cranianas amplas no recém-nascido", + P964: "Interrupção de gravidez, afetando o feto e recém-nascido", + P965: "Complicações de procedimentos intra-uterinos não classificados em outra parte", + P968: "Outras afecções especificadas originadas no período perinatal", + P969: "Afecções originadas no período perinatal não especificadas", + Q00: "Anencefalia e malformações similares", + Q000: "Anencefalia", + Q001: "Craniorraquisquise", + Q002: "Iniencefalia", + Q01: "Encefalocele", + Q010: "Encefalocele frontal", + Q011: "Encefalocele nasofrontal", + Q012: "Encefalocele occipital", + Q018: "Encefalocele de outras localizações", + Q019: "Encefalocele não especificada", + Q02: "Microcefalia", + Q03: "Hidrocefalia congênita", + Q030: "Malformações do aqueduto de Sylvius", + Q031: "Atresia das fendas de Luschka e do forâmen de Magendie", + Q038: "Outra hidrocefalia congênita", + Q039: "Hidrocefalia congênita não especificada", + Q04: "Outras malformações congênitas do cérebro", + Q040: "Malformações congênitas do corpo caloso", + Q041: "Arrinencefalia", + Q042: "Holoprosencefalia", + Q043: "Outras deformidades por redução do encéfalo", + Q044: "Displasia do septo e das vias ópticas", + Q045: "Megalencefalia", + Q046: "Cistos cerebrais congênitos", + Q048: "Outras malformações congênitas especificadas do encéfalo", + Q049: "Malformação congênita não especificada do encéfalo", + Q05: "Espinha bífida", + Q050: "Espinha bífida cervical com hidrocefalia", + Q051: "Espinha bífida torácica com hidrocefalia", + Q052: "Espinha bífida lombar com hidrocefalia", + Q053: "Espinha bífida sacra com hidrocefalia", + Q054: "Espinha bífida não especificada, com hidrocefalia", + Q055: "Espinha bífida cervical, sem hidrocefalia", + Q056: "Espinha bífida torácica, sem hidrocefalia", + Q057: "Espinha bífida lombar, sem hidrocefalia", + Q058: "Espinha bífida sacra, sem hidrocefalia", + Q059: "Espinha bífida não especificada", + Q06: "Outras malformações congênitas da medula espinhal", + Q060: "Amielia", + Q061: "Hipoplasia e displasia da medula espinal", + Q062: "Diastematomielia", + Q063: "Outras malformações congênitas da cauda eqüina", + Q064: "Hidromielia", + Q068: "Outras malformações congênitas especificadas da medula espinal", + Q069: "Malformação congênita não especificada da medula espinal", + Q07: "Outras malformações congênitas do sistema nervoso", + Q070: "Síndrome de Arnold-Chiari", + Q078: "Outras malformações congênitas especificadas do sistema nervoso", + Q079: "Malformação congênita não especificada do sistema nervoso", + Q10: "Malformações congênitas das pálpebras, do aparelho lacrimal e da órbita", + Q100: "Ptose congênita", + Q101: "Ectrópio congênito", + Q102: "Entrópio congênito", + Q103: "Outras malformações congênitas das pálpebras", + Q104: "Ausência ou agenesia do aparelho lacrimal", + Q105: "Estenose ou estreitamento congênito do canal lacrimal", + Q106: "Outras malformações congênitas do aparelho lacrimal", + Q107: "Malformação congênita da órbita", + Q11: "Anoftalmia, microftalmia e macroftalmia", + Q110: "Olho cístico", + Q111: "Outras formas de anoftalmia", + Q112: "Microftalmia", + Q113: "Macroftalmia", + Q12: "Malformações congênitas do cristalino", + Q120: "Catarata congênita", + Q121: "Luxação congênita do cristalino", + Q122: "Coloboma do cristalino", + Q123: "Afaquia congênita", + Q124: "Esferofaquia", + Q128: "Outras malformações congênitas do cristalino", + Q129: "Malformação congênita não especificada do cristalino", + Q13: "Malformações congênitas da câmara anterior do olho", + Q130: "Coloboma da íris", + Q131: "Ausência de íris", + Q132: "Outras malformações congênitas da íris", + Q133: "Opacidade congênita da córnea", + Q134: "Outras malformações congênitas da córnea", + Q135: "Esclerótica azul", + Q138: "Outras malformações congênitas da câmara anterior do olho", + Q139: "Malformação congênita não especificada da câmara anterior do olho", + Q14: "Malformações congênitas da câmara posterior do olho", + Q140: "Malformação congênita do humor vítreo", + Q141: "Malformação congênita da retina", + Q142: "Malformação congênita do disco óptico", + Q143: "Malformação congênita da coróide", + Q148: "Outras malformações congênitas da câmara posterior do olho", + Q149: "Malformação congênita não especificada da câmara posterior do olho", + Q15: "Outras malformações congênitas do olho", + Q150: "Glaucoma congênito", + Q158: "Outras malformações congênitas especificadas do olho", + Q159: "Malformação congênita não especificada do olho", + Q16: "Malformações congênitas do ouvido causando comprometimento da audição", + Q160: "Ausência congênita do pavilhão auricular [orelha]", + Q161: "Ausência, atresia e estreitamento congênitos do conduto auditivo (externo)", + Q162: "Ausência da trompa de Eustáquio", + Q163: "Malformação congênita dos ossículos do ouvido", + Q164: "Outras malformações congênitas do ouvido médio", + Q165: "Malformação congênita do ouvido interno", + Q169: "Malformação congênita do ouvido não especificada causando comprometimento da audição", + Q17: "Outras malformações congênitas da orelha", + Q170: "Pavilhão supranumerário", + Q171: "Macrotia", + Q172: "Microtia", + Q173: "Outras deformidades da orelha", + Q174: "Anomalia de posição da orelha", + Q175: "Orelhas proeminentes", + Q178: "Outras malformações congênitas especificadas da orelha", + Q179: "Malformação congênita não especificada da orelha", + Q18: "Outras malformações congênitas da face e do pescoço", + Q180: "Seio, fístula e cisto de origem branquial", + Q181: "Seio, fístula e cisto pré-auricular", + Q182: "Outras malformações da fenda branquial", + Q183: "Pescoço alado", + Q184: "Macrostomia", + Q185: "Microstomia", + Q186: "Macroqueilia", + Q187: "Microqueilia", + Q188: "Outras malformações congênitas especificadas da face e do pescoço", + Q189: "Malformação congênita não especificada da face e do pescoço", + Q20: "Malformações congênitas das câmaras e das comunicações cardíacas", + Q200: "Tronco arterial comum", + Q201: "Ventrículo direito com dupla via de saída", + Q202: "Ventrículo esquerdo com dupla via de saída", + Q203: "Comunicação ventrículo-atrial discordante", + Q204: "Ventrículo com dupla via de entrada", + Q205: "Comunicação átrio-ventricular discordante", + Q206: "Isomerismo dos apêndices atriais", + Q208: "Outras malformações congênitas das câmaras e das comunicações cardíacas", + Q209: "Malformação congênita não especificada das câmaras e das comunicações cardíacas", + Q21: "Malformações congênitas dos septos cardíacos", + Q210: "Comunicação interventricular", + Q211: "Comunicação interatrial", + Q212: "Comunicação atrioventricular", + Q213: "Tetralogia de Fallot", + Q214: "Comunicação aortopulmonar", + Q218: "Outras malformações congênitas dos septos cardíacos", + Q219: "Malformação congênita não especificada de septo cardíaco", + Q22: "Malformações congênitas das valvas pulmonar e tricúspide", + Q220: "Atresia da valva pulmonar", + Q221: "Estenose congênita da valva pulmonar", + Q222: "Insuficiência congênita da valva pulmonar", + Q223: "Outras malformações congênitas da valva pulmonar", + Q224: "Estenose congênita da valva tricúspide", + Q225: "Anomalia de Ebstein", + Q226: "Síndrome do coração direito hipoplásico", + Q228: "Outras malformações congênitas da valva tricúspide", + Q229: "Malformação congênita não especificada da valva tricúspide", + Q23: "Malformações congênitas das valvas aórtica e mitral", + Q230: "Estenose congênita da valva aórtica", + Q231: "Insuficiência congênita da valva aórtica", + Q232: "Estenose mitral congênita", + Q233: "Insuficiência mitral congênita", + Q234: "Síndrome do coração esquerdo hipoplásico", + Q238: "Outras malformações congênitas das valvas aórtica e mitral", + Q239: "Malformação congênita não especificada das valvas aórtica e mitral", + Q24: "Outras malformações congênitas do coração", + Q240: "Dextrocardia", + Q241: "Levocardia", + Q242: "Cor triatriatum", + Q243: "Estenose do infundíbulo pulmonar", + Q244: "Estenose subaórtica congênita", + Q245: "Malformações dos vasos coronários", + Q246: "Bloqueio congênito do coração", + Q248: "Outras malformações congênitas especificadas do coração", + Q249: "Malformação não especificada do coração", + Q25: "Malformações congênitas das grandes artérias", + Q250: "Permeabilidade do canal arterial", + Q251: "Coartação da aorta", + Q252: "Atresia da aorta", + Q253: "Estenose da aorta", + Q254: "Outras malformações congênitas da aorta", + Q255: "Atresia da artéria pulmonar", + Q256: "Estenose da artéria pulmonar", + Q257: "Outras malformações congênitas da artéria pulmonar", + Q258: "Outras malformações congênitas das grandes artérias", + Q259: "Malformação congênita não especificada das grandes artérias", + Q26: "Malformações congênitas das grandes veias", + Q260: "Estenose congênita da veia cava", + Q261: "Persistência da veia cava superior esquerda", + Q262: "Comunicação venosa pulmonar anormal total", + Q263: "Comunicação venosa pulmonar anormal parcial", + Q264: "Comunicação venosa pulmonar anormal não especificado", + Q265: "Comunicação venosa portal anormal", + Q266: "Fístula entre a veia porta e a artéria hepática", + Q268: "Outras malformações congênitas das grandes veias", + Q269: "Malformação congênita não especificada de grande veia", + Q27: "Outras malformações congênitas do sistema vascular periférico", + Q270: "Ausência congênita e hipoplasia da artéria umbilical", + Q271: "Estenose congênita da artéria renal", + Q272: "Outras malformações congênitas da artéria renal", + Q273: "Malformação artério-venosa periférica", + Q274: "Ectasia venosa (flebectasia) congênita", + Q278: "Outras malformações congênitas especificadas do sistema vascular periférico", + Q279: "Malformação congênita não especificada do sistema vascular periférico", + Q28: "Outras malformações congênitas do aparelho circulatório", + Q280: "Malformação arteriovenosa de vasos pré-cerebrais", + Q281: "Outras malformações dos vasos pré-cerebrais", + Q282: "Malformação arteriovenosa dos vasos cerebrais", + Q283: "Outras malformações dos vasos cerebrais", + Q288: "Outras malformações congênitas especificadas do aparelho circulatório", + Q289: "Malformação congênita não especificada do aparelho circulatório", + Q30: "Malformação congênita do nariz", + Q300: "Atresia das coanas", + Q301: "Agenesia ou hipoplasia do nariz", + Q302: "Fissura, entalhe ou fenda nasal", + Q303: "Perfuração congênita do septo nasal", + Q308: "Outras malformações congênitas do nariz", + Q309: "Malformação congênita não especificada do nariz", + Q31: "Malformações congênitas da laringe", + Q310: "Pterígio da laringe", + Q311: "Estenose subglótica congênita", + Q312: "Hipoplasia da laringe", + Q313: "Laringocele", + Q315: "Laringomalácia congênita", + Q318: "Outras malformações congênitas da laringe", + Q319: "Malformação congênita não especificada da laringe", + Q32: "Malformações congênitas da traquéia e dos brônquios", + Q320: "Traqueomalácia congênita", + Q321: "Outras malformações congênitas da traquéia", + Q322: "Broncomalácia congênita", + Q323: "Estenose congênita dos brônquios", + Q324: "Outras malformações congênitas dos brônquios", + Q33: "Malformações congênitas do pulmão", + Q330: "Pulmão cístico congênito", + Q331: "Lobo pulmonar supranumerário", + Q332: "Seqüestro pulmonar", + Q333: "Agenesia do pulmão", + Q334: "Bronquectasia congênita", + Q335: "Tecido ectópico intrapulmonar", + Q336: "Hipoplasia e displasia do pulmão", + Q338: "Outras malformações congênitas do pulmão", + Q339: "Malformação congênita não especificada do pulmão", + Q34: "Outras malformações congênitas do aparelho respiratório", + Q340: "Anomalia da pleura", + Q341: "Cisto congênito do mediastino", + Q348: "Outras malformações congênitas especificadas do aparelho respiratório", + Q349: "Malformação congênita não especificada do aparelho respiratório", + Q35: "Fenda palatina", + Q351: "Fenda do palato duro", + Q353: "Fenda do palato mole", + Q355: "Fenda do palato duro com fenda do palato mole", + Q357: "Fenda da úvula", + Q359: "Fenda palatina não especificada", + Q36: "Fenda labial", + Q360: "Fenda labial bilateral", + Q361: "Fenda labial mediana", + Q369: "Fenda labial unilateral", + Q37: "Fenda labial com fenda palatina", + Q370: "Fenda do palato duro com fenda labial bilateral", + Q371: "Fenda do palato duro com fenda labial unilateral", + Q372: "Fenda do palato mole com fenda labial bilateral", + Q373: "Fenda do palato mole com fenda labial unilateral", + Q374: "Fenda dos palatos duro e mole com fenda labial bilateral", + Q375: "Fenda dos palatos duro e mole com fenda labial unilateral", + Q378: "Fenda do palato com fenda labial bilateral, não especificada", + Q379: "Fenda do palato com fenda labial unilateral, não especificada", + Q38: "Outras malformações congênitas da língua, da boca e da faringe", + Q380: "Malformações congênitas dos lábios, não classificadas em outra parte", + Q381: "Anquiloglossia", + Q382: "Macroglossia", + Q383: "Outras malformações congênitas da língua", + Q384: "Malformações congênitas das glândulas e dutos salivares", + Q385: "Malformações congênitas do palato não classificadas em outra parte", + Q386: "Outras malformações congênitas da boca", + Q387: "Bolsa faríngea", + Q388: "Outras malformações congênitas da faringe", + Q39: "Malformações congênitas do esôfago", + Q390: "Atresia de esôfago, sem fístula", + Q391: "Atresia de esôfago, com fístula traqueoesofágica", + Q392: "Fístula traqueoesofágica congênita, sem atresia", + Q393: "Estenose congênita e estreitamento congênito do esôfago", + Q394: "Pterígio do esôfago", + Q395: "Dilatação congênita do esôfago", + Q396: "Divertículo do esôfago", + Q398: "Outras malformações congênitas do esôfago", + Q399: "Malformação congênita não especificada do esôfago", + Q40: "Outras malformações congênitas do trato digestivo superior", + Q400: "Estenose hipertrófica congênita do piloro", + Q401: "Hérnia congênita de hiato", + Q402: "Outras malformações congênitas especificadas do estômago", + Q403: "Malformação congênita não especificada do estômago", + Q408: "Outras malformações congênitas especificadas do trato digestivo superior", + Q409: "Malformação congênita não especificada do trato digestivo superior", + Q41: "Ausência, atresia e estenose congênita do intestino delgado", + Q410: "Ausência, atresia e estenose congênita do duodeno", + Q411: "Ausência, atresia e estenose congênita do jejuno", + Q412: "Ausência, atresia e estenose congênita do íleo", + Q418: "Ausência, atresia e estenose congênita de outras partes especificadas do intestino delgado", + Q419: "Ausência, atresia e estenose congênita do intestino delgado, sem especificação de localização", + Q42: "Ausência, atresia e estenose congênita do cólon", + Q420: "Ausência, atresia e estenose congênita do reto, com fístula", + Q421: "Ausência, atresia e estenose congênita do reto, sem fístula", + Q422: "Ausência, atresia e estenose congênita do ânus, com fístula", + Q423: "Ausência, atresia e estenose congênita do ânus, sem fístula", + Q428: "Ausência, atresia e estenose congênita de outras partes do cólon (intestino grosso)", + Q429: "Ausência, atresia e estenose congênita de partes não especificadas do cólon (intestino grosso)", + Q43: "Outras malformações congênitas do intestino", + Q430: "Divertículo de Meckel", + Q431: "Doença de Hirschsprung", + Q432: "Outros transtornos funcionais congênitos do cólon", + Q433: "Malformações congênitas da fixação do intestino", + Q434: "Duplicação do intestino", + Q435: "Ânus ectópico", + Q436: "Fístula congênita do reto e do ânus", + Q437: "Persistência de cloaca", + Q438: "Outras malformações congênitas especificadas do intestino", + Q439: "Malformação congênita não especificada do intestino", + Q44: "Malformações congênitas da vesícula biliar, das vias biliares e do fígado", + Q440: "Agenesia, aplasia e hipoplasia da vesícula biliar", + Q441: "Outras malformações congênitas da vesícula biliar", + Q442: "Atresia das vias biliares", + Q443: "Estenose e estreitamento congênitos das vias biliares", + Q444: "Cisto do colédoco", + Q445: "Outras malformações congênitas das vias biliares", + Q446: "Doença cística do fígado", + Q447: "Outras malformações congênitas do fígado", + Q45: "Outras malformações congênitas do aparelho digestivo", + Q450: "Agenesia, aplasia e hipoplasia do pâncreas", + Q451: "Pâncreas anular", + Q452: "Cisto pancreático congênito", + Q453: "Outras malformações congênitas do pâncreas e do duto pancreático", + Q458: "Outras malformações congênitas especificadas do aparelho digestivo", + Q459: "Malformação congênita não especificada do aparelho digestivo", + Q50: "Malformações congênitas dos ovários, das trompas de Falópio e dos ligamentos largos", + Q500: "Ausência congênita dos ovários", + Q501: "Cisto ovariano de desenvolvimento", + Q502: "Torsão congênita do ovário", + Q503: "Outras malformações congênitas do ovário", + Q504: "Cisto embrionário da trompa de Falópio", + Q505: "Cisto embrionário do ligamento largo", + Q506: "Outras malformações congênitas das trompas de Falópio e dos ligamentos largos", + Q51: "Malformações congênitas do útero e do colo do útero", + Q510: "Agenesia e aplasia do útero", + Q511: "Útero duplo com duplicação do colo uterino e da vagina", + Q512: "Outra duplicação do útero", + Q513: "Útero bicórneo", + Q514: "Útero unicórneo", + Q515: "Agenesia e aplasia do colo do útero", + Q516: "Cisto embrionário do colo do útero", + Q517: "Fístula congênita útero-digestiva ou útero-urinária", + Q518: "Outras malformações congênitas do útero e do colo do útero", + Q519: "Malformação congênita não especificada do útero e do colo do útero SOE", + Q52: "Outras malformações congênitas dos órgãos genitais femininos", + Q520: "Ausência congênita da vagina", + Q521: "Duplicação da vagina", + Q522: "Fístula reto-vaginal congênita", + Q523: "Imperfuração do hímen", + Q524: "Outras malformações congênitas da vagina", + Q525: "Fusão dos lábios vulvares", + Q526: "Malformação congênita do clitóris", + Q527: "Outras malformações congênitas da vulva", + Q528: "Outras malformações congênitas especificadas dos órgãos genitais femininos", + Q529: "Malformação congênita não especificada dos órgãos genitais femininos", + Q53: "Testículo não-descido", + Q530: "Testículo ectópico", + Q531: "Testículo não-descido, unilateral", + Q532: "Testículo não-descido, bilateral", + Q539: "Testículo não-descido, não especificado", + Q54: "Hipospádias", + Q540: "Hipospádia balânica", + Q541: "Hipospádia peniana", + Q542: "Hipospádia penoscrotal", + Q543: "Hipospádia perineal", + Q544: "Corda venérea congênita", + Q548: "Outras hipospádias", + Q549: "Hipospádia não especificada", + Q55: "Outras malformações congênitas dos órgãos genitais masculinos", + Q550: "Ausência e aplasia do testículo", + Q551: "Hipoplasia do(s) testículo(s) e do escroto", + Q552: "Outras malformações congênitas do(s) testículo(s) e do escroto", + Q553: "Atresia do canal deferente", + Q554: "Outras malformações congênitas do canal deferente, do epidídimo, das vesículas seminais e da próstata", + Q555: "Ausência e aplasia congênitas do pênis", + Q556: "Outras malformações congênitas do pênis", + Q558: "Outras malformações congênitas especificadas dos órgãos genitais masculinos", + Q559: "Malformação congênita não especificada dos órgãos genitais masculinos", + Q56: "Sexo indeterminado e pseudo-hermafroditismo", + Q560: "Hermafroditismo não classificado em outra parte", + Q561: "Pseudo-hermafroditismo masculino, não classificado em outra parte", + Q562: "Pseudo-hermafroditismo feminino, não classificado em outra parte", + Q563: "Pseudo-hermafroditismo não especificado", + Q564: "Sexo indeterminado, não especificado", + Q60: "Agenesia renal e outros defeitos de redução do rim", + Q600: "Agenesia unilateral do rim", + Q601: "Agenesia bilateral do rim", + Q602: "Agenesia renal não especificada", + Q603: "Hipoplasia renal unilateral", + Q604: "Hipoplasia renal bilateral", + Q605: "Hipoplasia renal não especificada", + Q606: "Síndrome de Potter", + Q61: "Doenças císticas do rim", + Q610: "Cisto congênito único do rim", + Q611: "Rim policístico, autossômico recessivo", + Q612: "Rim policístico, autossômico dominante", + Q613: "Rim policístico não especificado", + Q614: "Displasia renal", + Q615: "Cisto medular do rim", + Q618: "Outras doenças císticas do rim", + Q619: "Doença cística não especificada do rim", + Q62: "Anomalias congênitas obstrutivas da pelve renal e malformações congênitas do ureter", + Q620: "Hidronefrose congênita", + Q621: "Atresia e estenose do ureter", + Q622: "Megaureter congênito", + Q623: "Outras anomalias obstrutivas da pelve renal e do ureter", + Q624: "Agenesia do ureter", + Q625: "Duplicação do ureter", + Q626: "Má-posição do ureter", + Q627: "Refluxo vésico-uretero-renal congênito", + Q628: "Outras malformações congênitas do ureter", + Q63: "Outras malformações congênitas do rim", + Q630: "Rim supranumerário", + Q631: "Rim lobulado, fundido ou em ferradura", + Q632: "Rim ectópico", + Q633: "Rim hiperplásico e gigante", + Q638: "Outras malformações congênitas especificadas do rim", + Q639: "Malformação congênita não especificada do rim", + Q64: "Outras malformações congênitas do aparelho urinário", + Q640: "Epispádias", + Q641: "Extrofia vesical", + Q642: "Válvulas uretrais posteriores congênitas", + Q643: "Outras formas de atresia e de estenose de uretra e do colo da bexiga", + Q644: "Malformação do úraco", + Q645: "Ausência congênita da bexiga e da uretra", + Q646: "Divertículo congênito da bexiga", + Q647: "Outras malformações congênitas da bexiga e da uretra", + Q648: "Outras malformações congênitas especificadas do aparelho urinário", + Q649: "Malformação congênita não especificada do aparelho urinário", + Q65: "Malformações congênitas do quadril", + Q650: "Luxação congênita unilateral do quadril", + Q651: "Luxação congênita bilateral do quadril", + Q652: "Luxação congênita não especificada do quadril", + Q653: "Subluxação congênita unilateral do quadril", + Q654: "Subluxação congênita bilateral do quadril", + Q655: "Subluxação congênita não especificada do quadril", + Q656: "Quadril instável", + Q658: "Outras deformidades congênitas do quadril", + Q659: "Deformidade congênita não especificada do quadril", + Q66: "Deformidades congênitas do pé", + Q660: "Pé torto eqüinovaro", + Q661: "Pé torto calcaneovaro", + Q662: "Metatarso varo", + Q663: "Outras deformidades congênitas dos pés em varo", + Q664: "Pé torto calcaneovalgo", + Q665: "Pé chato congênito", + Q666: "Outras deformidades congênitas dos pés em valgo", + Q667: "Pé cavo", + Q668: "Outras deformidades congênitas do pé", + Q669: "Deformidade congênita não especificada do pé", + Q67: "Deformidades osteomusculares congênitas da cabeça, da face, da coluna e do tórax", + Q670: "Assimetria facial", + Q671: "Deformidade facial por compressão", + Q672: "Dolicocefalia", + Q673: "Plagiocefalia", + Q674: "Outras deformidades congênitas do crânio, da face e da mandíbula", + Q675: "Deformidades congênitas da coluna vertebral", + Q676: "Tórax escavado", + Q677: "Tórax carinado", + Q678: "Outras deformidades congênitas do tórax", + Q68: "Outras deformidades osteomusculares congênitas", + Q680: "Deformidade congênita do músculo esternocleidomastoideu", + Q681: "Deformidade congênita da mão", + Q682: "Deformidade congênita do joelho", + Q683: "Encurvamento congênito do fêmur", + Q684: "Encurvamento congênito da tíbia e da perônio [fíbula]", + Q685: "Encurvamento congênito de ossos longos não especificados do membro inferior", + Q688: "Outras deformidades osteomusculares congênitas", + Q69: "Polidactilia", + Q690: "Dedo(s) da mão supranumerário(s)", + Q691: "Polegar(es) supranumerário(s)", + Q692: "Artelho(s) supranumerário(s)", + Q699: "Polidactilia não especificada", + Q70: "Sindactilia", + Q700: "Coalescência dos dedos (dedos da mão fundidos)", + Q701: "Dedos palmados", + Q702: "Coalescência dos artelhos (artelhos fundidos)", + Q703: "Artelhos palmados", + Q704: "Polissindactilia", + Q709: "Sindactilia não especificada", + Q71: "Defeitos, por redução, do membro superior", + Q710: "Ausência congênita completa do(s) membro(s) superior(es)", + Q711: "Ausência congênita do braço e do antebraço, com mão presente", + Q712: "Ausência congênita do antebraço e da mão", + Q713: "Ausência congênita da mão e de dedo(s)", + Q714: "Defeito de redução longitudinal do rádio", + Q715: "Defeito de redução longitudinal do cúbito [ulna]", + Q716: "Mão em garra de lagosta", + Q718: "Outros defeitos de redução do membro superior", + Q719: "Defeito por redução do membro superior, não especificado", + Q72: "Defeitos, por redução, do membro inferior", + Q720: "Ausência congênita completa do(s) membro(s) inferior(es)", + Q721: "Ausência congênita da coxa e da perna com pé presente", + Q722: "Ausência congênita da perna e do pé", + Q723: "Ausência congênita do pé e de artelho(s)", + Q724: "Defeito por redução longitudinal da tíbia", + Q725: "Defeito por redução longitudinal da tíbia", + Q726: "Defeito por redução longitudinal do perônio [fíbula]", + Q727: "Pé bífido", + Q728: "Outros defeitos por redução do(s) membro(s) inferior(es)", + Q729: "Defeito não especificado por redução do membro inferior", + Q73: "Defeitos por redução de membro não especificado", + Q730: "Ausência congênita de membro(s) não especificado(s)", + Q731: "Focomelia, membro(s) não especificado(s)", + Q738: "Outros defeitos por redução de membro(s) não especificado(s)", + Q74: "Outras malformações congênitas dos membros", + Q740: "Outras malformações congênitas do(s) membro(s) superiores, inclusive da cintura escapular", + Q741: "Malformação congênita do joelho", + Q742: "Outras malformações congênitas do(s) membro(s) inferiores, inclusive da cintura pélvica", + Q743: "Artrogripose congênita múltipla", + Q748: "Outras malformações congênitas especificadas de membro(s)", + Q749: "Malformações congênitas não especificadas de membro(s)", + Q75: "Outras malformações congênitas dos ossos do crânio e da face", + Q750: "Craniossinostose", + Q751: "Disostose craniofacial", + Q752: "Hipertelorismo", + Q753: "Macrocefalia", + Q754: "Disostose mandíbulo-facial", + Q755: "Disostose óculo-mandibular", + Q758: "Outras malformações congênitas especificadas dos ossos do crânio e da face", + Q759: "Malformação congênita não especificada dos ossos do crânio e da face", + Q76: "Malformações congênitas da coluna vertebral e dos ossos do tórax", + Q760: "Espinha bífida oculta", + Q761: "Síndrome de Klippel-Feil", + Q762: "Espondilolistese congênita", + Q763: "Escoliose congênita devida à malformação óssea congênita", + Q764: "Outras malformações congênitas da coluna vertebral não-associadas com escoliose", + Q765: "Costela cervical", + Q766: "Outras malformações congênitas das costelas", + Q767: "Malformação congênita do esterno", + Q768: "Outras malformações congênitas dos ossos do tórax", + Q769: "Malformação congênita não especificada dos ossos do tórax", + Q77: "Osteocondrodisplasia com anomalias de crescimento dos ossos longos e da coluna vertebral", + Q770: "Acondrogenesia", + Q771: "Nanismo tanatofórico", + Q772: "Síndrome das costelas curtas", + Q773: "Condrodisplasia puntacta", + Q774: "Acondroplasia", + Q775: "Displasia diastrófica", + Q776: "Displasia condroectodérmica", + Q777: "Displasia espondiloepifisária", + Q778: "Outras osteocondrodisplasias com anomalias do crescimento dos ossos longos e da coluna vertebral", + Q779: "Osteocondrodisplasia não especificada com anomalias do crescimento dos ossos longos e da coluna vertebral", + Q78: "Outras osteocondrodisplasias", + Q780: "Osteogênese imperfeita", + Q781: "Displasia poliostótica fibrosa", + Q782: "Osteopetrose", + Q783: "Displasia diafisária progressiva", + Q784: "Encondromatose", + Q785: "Displasia metafisária", + Q786: "Exostoses congênitas múltiplas", + Q788: "Outras osteocondrodisplasias especificadas", + Q789: "Osteocondrodisplasia não especificada", + Q79: "Malformações congênitas do sistema osteomuscular não classificadas em outra parte", + Q790: "Hérnia diafragmática congênita", + Q791: "Outras malformações congênitas do diafragma", + Q792: "Exonfalia", + Q793: "Gastrosquise", + Q794: 'Síndrome do abdome em ameixa seca ("prune belly syndrome")', + Q795: "Outras malformações congênitas da parede abdominal", + Q796: "Síndrome de Ehlers-Danlos", + Q798: "Outras malformações congênitas do sistema osteomuscular", + Q799: "Malformação congênita não especificada do sistema osteomuscular", + Q80: "Ictiose congênita", + Q800: "Ictiose vulgar", + Q801: "Ictiose ligada ao cromossomo X", + Q802: "Ictiose lamelar", + Q803: "Eritrodermia ictiosiforme bulhosa congênita", + Q804: "Feto arlequim", + Q808: "Outras ictioses congênitas", + Q809: "Ictiose congênita não especificada", + Q81: "Epidermólise bolhosa", + Q810: "Epidermólise bolhosa simples", + Q811: "Epidermólise bolhosa letal", + Q812: "Epidermólise bolhosa distrófica", + Q818: "Outras epidermólises bolhosas", + Q819: "Epidermólise bolhosa não especificada", + Q82: "Outras malformações congênitas da pele", + Q820: "Linfedema hereditário", + Q821: "Xeroderma pigmentoso", + Q822: "Mastocitose", + Q823: "Incontinentia pigmenti", + Q824: "Displasia ectodérmica (anidrótica)", + Q825: "Nevo não-neoplásico congênito", + Q828: "Outras malformações congênitas especificadas da pele", + Q829: "Malformação congênita não especificada da pele", + Q83: "Malformações congênitas da mama", + Q830: "Ausência congênita da mama com ausência do mamilo", + Q831: "Mama supranumerária", + Q832: "Ausência de mamilo", + Q833: "Mamilo acessório", + Q838: "Outras malformações congênitas da mama", + Q839: "Malformação congênita não especificada da mama", + Q84: "Outras malformações congênitas do tegumento", + Q840: "Alopécia congênita", + Q841: "Alterações morfológicas congênitas dos cabelos não classificadas em outra parte", + Q842: "Outras malformações congênitas dos cabelos", + Q843: "Anoníquia", + Q844: "Leuconíquia congênita", + Q845: "Hipertrofia e alargamento das unhas", + Q846: "Outras malformações congênitas das unhas", + Q848: "Outras malformações congênitas especificadas do tegumento", + Q849: "Malformação congênita não especificada do tegumento", + Q85: "Facomatoses não classificadas em outra parte", + Q850: "Neurofibromatose (não-maligna)", + Q851: "Esclerose tuberosa", + Q858: "Outras facomatoses não classificadas em outra parte", + Q859: "Facomatose não especificada", + Q86: "Síndromes com malformações congênitas devidas a causas exógenas conhecidas, não classificadas em outra parte", + Q860: "Síndrome fetal alcoólico (dismórfico)", + Q861: "Síndrome fetal devida à hidantoína", + Q862: "Dismorfismo devido ao Warfarin", + Q868: "Outras síndromes com malformações congênitas devidas a causas exógenas conhecidas", + Q87: "Outras síndromes com malformações congênitas que acometem múltiplos sistemas", + Q870: "Síndromes com malformações congênitas afetando predominantemente o aspecto da face", + Q871: "Síndromes com malformações congênitas associadas predominantemente com nanismo", + Q872: "Síndromes com malformações congênitas afetando predominantemente os membros", + Q873: "Síndromes com malformações congênitas com hipercrescimento precoce", + Q874: "Síndrome de Marfan", + Q875: "Outras síndromes com malformações congênitas com outras alterações do esqueleto", + Q878: "Outras síndromes com malformações congênitas especificadas, não classificadas em outra parte", + Q89: "Outras malformações congênitas não classificadas em outra parte", + Q890: "Malformações congênitas do baço", + Q891: "Malformações congênitas das supra-renais", + Q892: "Malformações congênitas de outras glândulas endócrinas", + Q893: "Situs inversus", + Q894: "Reunião de gêmeos", + Q897: "Malformações congênitas múltiplas, não classificadas em outra parte", + Q898: "Outras malformações congênitas especificadas", + Q899: "Malformações congênitas não especificadas", + Q90: "Síndrome de Down", + Q900: "Trissomia 21, não-disjunção meiótica", + Q901: "Trissomia 21, mosaicismo (não-disjunção mitótica)", + Q902: "Trissomia 21, translocação", + Q909: "Síndrome de Down não especificada", + Q91: "Síndrome de Edwards e síndrome de Patau", + Q910: "Trissomia 18, não-disjunção meiótica", + Q911: "Trissomia 18, mosaicismo cromossômico (não-disjunção mitótica)", + Q912: "Trissomia 18, translocação", + Q913: "Síndrome de Edwards não especificada", + Q914: "Trissomia 13, não-disjunção meiótica", + Q915: "Trissomia 13, mosaicismo cromossômico (não-disjunção mitótica)", + Q916: "Trissomia 13, translocação", + Q917: "Síndrome de Patau não especificada", + Q92: "Outras trissomias e trissomias parciais dos autossomos, não classificadas em outra parte", + Q920: "Trissomia de um cromossomo inteiro, não-disjunção meiótica", + Q921: "Trissomia de um cromossomo inteiro, mosaicismo cromossômico (não-disjunção mitótica)", + Q922: "Trissomia parcial major", + Q923: "Trissomia parcial minor", + Q924: "Duplicações vistas somente na prometáfase", + Q925: "Duplicação com outros rearranjos complexos", + Q926: "Cromossomos marcadores suplementares", + Q927: "Triploidia e poliploidia", + Q928: "Outras trissomias especificadas e trissomias parciais dos autossomos", + Q929: "Trissomia e trissomia parcial não especificada dos autossomos", + Q93: "Monossomias e deleções dos autossomos, não classificadas em outra parte", + Q930: "Monossomia de cromossomo inteiro, não-disjunção meiótica", + Q931: "Monossomia de cromossomo inteiro, mosaicismo cromossômico (não-disjunção mitótica)", + Q932: "Cromossomo substituído por anel ou dicêntrico", + Q933: "Deleção do braço curto do cromossomo 4", + Q934: "Deleção do braço curto do cromossomo 5", + Q935: "Outras deleções parciais de cromossomo", + Q936: "Deleções vistas somente na prometáfase", + Q937: "Deleções com outros rearranjos complexos", + Q938: "Outras deleções dos autossomos", + Q939: "Deleções não especificadas dos autossomos", + Q95: "Rearranjos equilibrados e marcadores estruturais, não classificados em outra parte", + Q950: "Translocação ou inserção equilibrada em sujeito normal", + Q951: "Inversão cromossômica em sujeito normal", + Q952: "Rearranjo autossômico equilibrado em sujeito anormal", + Q953: "Rearranjo sexual/autossômico equilibrado em sujeito anormal", + Q954: "Sujeito com marcador de heterocromatina", + Q955: "Sujeito com sítio autossômico frágil", + Q958: "Outros rearranjos e marcadores equilibrados", + Q959: "Rearranjos e marcadores equilibrados não especificados", + Q96: "Síndrome de Turner", + Q960: "Cariótipo 45, X", + Q961: "Cariótipo 46, X iso (Xq)", + Q962: "Cariótipo 46, X com cromossomo sexual anormal, salvo iso (Xq)", + Q963: "Mosaicismo cromossômico, 45, X/46, XX ou XY", + Q964: "Mosaicismo cromossômico, 45, X/outra(s) linhagens celular(es) com cromossomo sexual anormal", + Q968: "Outras variantes da síndrome de Turner", + Q969: "Síndrome de Turner não especificada", + Q97: "Outras anomalias dos cromossomos sexuais, fenótipo feminino, não classificadas em outra parte", + Q970: "Cariótipo 47, XXX", + Q971: "Mulher com mais de três cromossomos X", + Q972: "Mosaicismo cromossômico, linhagens com diversos números de cromossomos X", + Q973: "Mulher com cariótipo 46, XY", + Q978: "Outras anomalias especificadas dos cromossomos sexuais, fenótipo feminino", + Q979: "Anomalias não especificadas dos cromossomos sexuais, fenótipo feminino", + Q98: "Outras anomalias dos cromossomos sexuais, fenótipo masculino, não classificadas em outra parte", + Q980: "Síndrome de Klinefelter, cariótipo 47, XXY", + Q981: "Síndrome de Klinefelter, homem com mais de dois cromossomos X", + Q982: "Síndrome de Klinefelter, homem com cariótipo 46, XX", + Q983: "Outro homem com cariótipo 46, XX", + Q984: "Síndrome de Klinefelter não especificada", + Q985: "Cariótipo 47, XYY", + Q986: "Homem com cromossomos sexuais de estrutura anormal", + Q987: "Homem com mosaicismo dos cromossomos sexuais", + Q988: "Outras anomalias especificadas dos cromossomos sexuais, fenótipo masculino", + Q989: "Anomalias não especificadas dos cromossomos sexuais, fenótipo masculino", + Q99: "Outras anomalias dos cromossomos, não classificadas em outra parte", + Q990: "Quimera 46, XX/46, XY", + Q991: "Hermafrodite verdadeiro 46, XX", + Q992: "Cromossomo X frágil", + Q998: "Outras anomalias cromossômicas especificadas", + Q999: "Anomalia cromossômica não especificada", + R00: "Anormalidades do batimento cardíaco", + R000: "Taquicardia não especificada", + R001: "Bradicardia não especificada", + R002: "Palpitações", + R008: "Outras anormalidades e as não especificadas do batimento cardíaco", + R01: "Sopros e outros ruídos cardíacos", + R010: "Sopros cardíacos benignos ou inocentes", + R011: "Sopro cardíaco, não especificado", + R012: "Outros ruídos cardíacos", + R02: "Gangrena não classificada em outra parte", + R03: "Valor anormal da pressão arterial sem diagnóstico", + R030: "Valor elevado da pressão arterial sem o diagnóstico de hipertensão", + R031: "Valor baixo da pressão arterial não específico", + R04: "Hemorragia das vias respiratórias", + R040: "Epistaxis", + R041: "Hemorragia da garganta", + R042: "Hemoptise", + R048: "Hemorragia de outras localizações das vias respiratórias", + R049: "Hemorragia não especificada das vias respiratórias", + R05: "Tosse", + R06: "Anormalidades da respiração", + R060: "Dispnéia", + R061: "Estridor", + R062: "Respiração ofegante", + R063: "Respiração periódica", + R064: "Hiperventilação", + R065: "Respiração pela boca", + R066: "Soluço", + R067: "Espirro", + R068: "Outras anormalidades e as não especificadas da respiração", + R07: "Dor de garganta e no peito", + R070: "Dor de garganta", + R071: "Dor torácica ao respirar", + R072: "Dor precordial", + R073: "Outra dor torácica", + R074: "Dor torácica, não especificada", + R09: "Outros sintomas e sinais relativos aos aparelhos circulatório e respiratório", + R090: "Asfixia", + R091: "Pleurisia", + R092: "Parada respiratória", + R093: "Escarro anormal", + R098: "Outros sintomas e sinais especificados relativos aos aparelhos circulatório e respiratório", + R10: "Dor abdominal e pélvica", + R100: "Abdome agudo", + R101: "Dor localizada no abdome superior", + R102: "Dor pélvica e perineal", + R103: "Dor localizada em outras partes do abdome inferior", + R104: "Outras dores abdominais e as não especificadas", + R11: "Náusea e vômitos", + R12: "Pirose", + R13: "Disfagia", + R14: "Flatulência e afecções correlatas", + R15: "Incontinência fecal", + R16: "Hepatomegalia e esplenomegalia não classificadas em outra parte", + R160: "Hepatomegalia não classificada em outra parte", + R161: "Esplenomegalia não classificada em outra parte", + R162: "Hepatomegalia com esplenomegalia não classificada em outra parte", + R17: "Icterícia não especificada", + R18: "Ascite", + R19: "Outros sintomas e sinais relativos ao aparelho digestivo e ao abdome", + R190: "Massa, tumoração ou tumefação intra-abdominal e pélvica", + R191: "Ruídos hidroaéreos anormais", + R192: "Peristaltismo visível", + R193: "Rigidez abdominal", + R194: "Alteração do hábito intestinal", + R195: "Outras anormalidades fecais", + R196: "Halitose", + R198: "Outros sintomas e sinais especificados relativos ao aparelho digestivo e ao abdome", + R20: "Distúrbios da sensibilidade cutânea", + R200: "Anestesia cutânea", + R201: "Hipoestesia cutânea", + R202: "Parestesias cutâneas", + R203: "Hiperestesia", + R208: "Outros distúrbios e os não especificadas da sensibilidade cutânea", + R21: "Eritema e outras erupções cutâneas não especificadas", + R22: "Tumefação, massa ou tumoração localizadas da pele e do tecido subcutâneo", + R220: "Tumefação, massa ou tumoração localizadas da cabeça", + R221: "Tumefação, massa ou tumoração localizadas do pescoço", + R222: "Tumefação, massa ou tumoração localizadas do tronco", + R223: "Tumefação, massa ou tumoração localizadas de membro superior", + R224: "Tumefação, massa ou tumoração localizadas no membro inferior", + R227: "Tumefação, massa ou tumoração localizadas de múltiplas localizações", + R229: "Tumefação, massa ou tumoração não especificadas, localizadas", + R23: "Outras alterações cutâneas", + R230: "Cianose", + R231: "Palidez", + R232: "Rubor", + R233: "Equimoses espontâneas", + R234: "Alterações na textura da pele", + R238: "Outras alterações da pele e as não especificadas", + R25: "Movimentos involuntários anormais", + R250: "Movimentos anormais da cabeça", + R251: "Tremor não especificado", + R252: "Cãibras e espasmos", + R253: "Fasciculação", + R258: "Outros movimentos involuntários anormais e os não especificados", + R26: "Anormalidades da marcha e da mobilidade", + R260: "Marcha atáxica", + R261: "Marcha paralítica", + R262: "Dificuldade para andar não classificada em outra parte", + R268: "Outras anormalidades da marcha e da mobilidade e as não especificadas", + R27: "Outros distúrbios da coordenação", + R270: "Ataxia não especificada", + R278: "Outros distúrbios da coordenação e os não especificados", + R29: "Outros sintomas e sinais relativos aos sistemas nervoso e osteomuscular", + R290: "Tetania", + R291: "Meningismo", + R292: "Reflexos anormais", + R293: "Postura anormal", + R294: "Quadril estalante", + R296: "Tendência a queda, não classificada em outra parte", + R298: "Outros sintomas e sinais relativos aos sistemas nervoso e osteomuscular e os não especificados", + R30: "Dor associada à micção", + R300: "Disúria", + R301: "Tenesmo vesical", + R309: "Micção dolorosa, não especificada", + R31: "Hematúria não especificada", + R32: "Incontinência urinária não especificada", + R33: "Retenção urinária", + R34: "Anúria e oligúria", + R35: "Poliúria", + R36: "Secreção uretral", + R39: "Outros sintomas e sinais relativos ao aparelho urinário", + R390: "Extravasamento de urina", + R391: "Outras dificuldades à micção", + R392: "Uremia extra-renal", + R398: "Outros sintomas e sinais relativos ao aparelho urinário e os não especificados", + R40: "Sonolência, estupor e coma", + R400: "Sonolência", + R401: "Estupor", + R402: "Coma não especificado", + R41: "Outros sintomas e sinais relativos à função cognitiva e à consciência", + R410: "Desorientação não especificada", + R411: "Amnésia anterógrada", + R412: "Amnésia retrógrada", + R413: "Outra amnésia", + R418: "Outros sintomas e sinais especificados relativos às funções cognitivas e à consciência", + R42: "Tontura e instabilidade", + R43: "Distúrbios do olfato e do paladar", + R430: "Anosmia", + R431: "Parosmia", + R432: "Parageusia", + R438: "Outros distúrbios do olfato e do paladar e os não especificados", + R44: "Outros sintomas e sinais relativos às sensações e às percepções gerais", + R440: "Alucinações auditivas", + R441: "Alucinações visuais", + R442: "Outras alucinações", + R443: "Alucinações não especificadas", + R448: "Outros sintomas e sinais especificados relativos às sensações e percepções gerais", + R45: "Sintomas e sinais relativos ao estado emocional", + R450: "Nervosismo", + R451: "Agitação e inquietação", + R452: "Tristeza", + R453: "Apatia e desinteresse", + R454: "Irritabilidade e mau humor", + R455: "Hostilidade", + R456: "Violência física", + R457: "Estado de choque emocional e tensão, não especificado", + R458: "Outros sintomas e sinais relativos ao estado emocional", + R46: "Sintomas e sinais relativos à aparência e ao comportamento", + R460: "Baixo nível de higiene pessoal", + R461: "Aparência pessoal bizarra", + R462: "Comportamento estranho e inexplicável", + R463: "Hiperatividade", + R464: "Lentidão e baixa reatividade", + R465: "Personalidade suspeita e evasiva", + R466: 'Inquietação e preocupação exageradas com acontecimentos "estressantes"', + R467: "Verborragia e pormenores circunstanciais mascarando o motivo da consulta", + R468: "Outros sintomas e sinais relativos à aparência e ao comportamento", + R47: "Distúrbios da fala não classificados em outra parte", + R470: "Disfasia e afasia", + R471: "Disartria e anartria", + R478: "Outros distúrbios da fala e os não especificados", + R48: "Dislexia e outras disfunções simbólicas, não classificadas em outra parte", + R480: "Dislexia e alexia", + R481: "Agnosia", + R482: "Apraxia", + R488: "Outras disfunções simbólicas e as não especificadas", + R49: "Distúrbios da voz", + R490: "Disfonia", + R491: "Afonia", + R492: "Hipernasalidade e hiponasalidade", + R498: "Outros distúrbios da voz e os não especificados", + R50: "Febre de origem desconhecida e de outras origens", + R502: "Febre induzida por drogas", + R508: "Outra febre especificada", + R509: "Febre não especificada", + R51: "Cefaléia", + R52: "Dor não classificada em outra parte", + R520: "Dor aguda", + R521: "Dor crônica intratável", + R522: "Outra dor crônica", + R529: "Dor não especificada", + R53: "Mal estar, fadiga", + R54: "Senilidade", + R55: "Síncope e colapso", + R56: "Convulsões, não classificadas em outra parte", + R560: "Convulsões febris", + R568: "Outras convulsões e as não especificadas", + R57: "Choque não classificado em outra parte", + R570: "Choque cardiogênico", + R571: "Choque hipovolêmico", + R578: "Outras formas de choque", + R579: "Choque não especificado", + R58: "Hemorragia não classificada em outra parte", + R59: "Aumento de volume dos gânglios linfáticos", + R590: "Aumento de volume localizado de gânglios linfáticos", + R591: "Aumento de volume generalizado de gânglios linfáticos", + R599: "Adenomegalia ou aumento de volume dos gânglios linfáticos, não especificado", + R60: "Edema não classificado em outra parte", + R600: "Edema localizado", + R601: "Edema generalizado", + R609: "Edema não especificado", + R61: "Hiperidrose", + R610: "Hiperidrose localizada", + R611: "Hiperidrose generalizada", + R619: "Hiperidrose não especificada", + R62: "Retardo do desenvolvimento fisiológico normal", + R620: "Retardo de maturação", + R628: "Outras formas de retardo do desenvolvimento fisiológico normal", + R629: "Retardo do desenvolvimento fisiológico normal, não especificado", + R63: "Sintomas e sinais relativos à ingestão de alimentos e líquidos", + R630: "Anorexia", + R631: "Polidipsia", + R632: "Polifagia", + R633: "Dificuldades de alimentação e erros na administração de alimentos", + R634: "Perda de peso anormal", + R635: "Ganho de peso anormal", + R638: "Outros sintomas e sinais relativos a ingestão de alimentos e de líquidos", + R64: "Caquexia", + R68: "Outros sintomas e sinais gerais", + R680: "Hipotermia não associada à baixa temperatura ambiental", + R681: "Sintomas não específicos peculiares à infância", + R682: "Boca seca, não especificada", + R683: "Baqueteamento dos dedos", + R688: "Outros sintomas e sinais gerais especificados", + R69: "Causas desconhecidas e não especificadas de morbidade", + R70: "Velocidade de hemossedimentação elevada e outras anormalidades da viscosidade plasmática", + R700: "Velocidade de hemossedimentação elevada", + R701: "Viscosidade plasmática anormal", + R71: "Anormalidade das hemácias", + R72: "Anormalidade dos leucócitos não classificada em outra parte", + R73: "Aumento da glicemia", + R730: "Teste de tolerância a glicose anormal", + R739: "Hiperglicemia não especificada", + R74: "Anormalidades dos níveis de enzimas séricas", + R740: "Aumento dos níveis de transaminases e da desidrogenase lática (DHL)", + R748: "Níveis anormais de outras enzimas séricas", + R749: "Anormalidade dos níveis de enzimas séricas, não especificada", + R75: "Evidência laboratorial do vírus da imunodeficiência humana [HIV]", + R76: "Outros achados imunológicos anormais no soro", + R760: "Título aumentado de anticorpos", + R761: "Reação anormal ao teste da tuberculina", + R762: "Exame sorológico falso positivo para sífilis", + R768: "Outros achados imunológicos especificados anormais no soro", + R769: "Achado anormal de exame imunológico sérico, não especificado", + R77: "Outras anormalidades das proteínas plasmáticas", + R770: "Anormalidade da albumina", + R771: "Anormalidade das globulinas", + R772: "Anormalidade da alfafetoproteína", + R778: "Outras anormalidades especificadas das proteínas plasmáticas", + R779: "Anormalidades de proteína plasmática, não especificadas", + R78: "Presença de drogas e de outras substâncias normalmente não encontradas no sangue", + R780: "Presença de álcool no sangue", + R781: "Presença de opiáceos no sangue", + R782: "Presença de cocaína no sangue", + R783: "Presença de alucinógeno no sangue", + R784: "Presença de outras drogas com potencial de causar dependência, no sangue", + R785: "Presença de droga psicotrópica no sangue", + R786: "Presença de agente esteróide no sangue", + R787: "Presença de nível anormal de metais pesados no sangue", + R788: "Presença de outras substâncias especificadas não normalmente encontradas no sangue", + R789: "Presença de substância não especificada normalmente não encontrada no sangue", + R79: "Outros achados anormais de exames químicos do sangue", + R790: "Anormalidade do nível de elementos minerais no sangue", + R798: "Outros achados anormais especificados de exames químicos do sangue", + R799: "Achado anormal de exame químico do sangue, não especificado", + R80: "Proteinúria isolada", + R81: "Glicosúria", + R82: "Outros achados anormais na urina", + R820: "Quilúria", + R821: "Mioglobinúria", + R822: "Biliúria", + R823: "Hemoglobinúria", + R824: "Acetonúria", + R825: "Níveis urinários elevados de drogas, medicamentos e substâncias biológicas", + R826: "Níveis urinários anormais de substâncias cuja origem é essencialmente não-medicinal", + R827: "Achados anormais ao exame microbiológico da urina", + R828: "Achados anormais ao exame citológico e histológico da urina", + R829: "Outros achados anormais na urina e os não especificados", + R83: "Achados anormais no líquido cefalorraquidiano", + R830: "Achados anormais no líquido cefalorraquidiano - nível enzimático anormal", + R831: "Achados anormais no líquido cefalorraquidiano - nível hormonal anormal", + R832: "Achados anormais no líquido cefalorraquidiano - nível anormal de outras drogas, medicamentos e substâncias biológicas", + R833: "Achados anormais no líquido cefalorraquidiano - nível anormal de substâncias cuja origem é essencialmente não medicinal", + R834: "Achados anormais no líquido cefalorraquidiano - achados imunológicos anormais", + R835: "Achados anormais no líquido cefalorraquidiano - achados microbiológicos anormais", + R836: "Achados anormais no líquido cefalorraquidiano - achados citológicos anormais", + R837: "Achados anormais no líquido cefalorraquidiano - achados histológicos anormais", + R838: "Achados anormais no líquido cefalorraquidiano - outros achados anormais", + R839: "Achados anormais no líquido cefalorraquidiano - achado anormal não especificado", + R84: "Achados anormais de material proveniente dos órgãos respiratórios e do tórax", + R840: "Achados anormais de material proveniente dos órgãos respiratórios e do tórax - nível enzimático anormal", + R841: "Achados anormais de material proveniente dos órgãos respiratórios e do tórax - nível hormonal anormal", + R842: "Achados anormais de material proveniente dos órgãos respiratórios e do tórax - nível anormal de outras drogas, medicamentos e substâncias biológicas", + R843: "Achados anormais de material proveniente dos órgãos respiratórios e do tórax - nível anormal de substâncias cuja origem é essencialmente não medicinal", + R844: "Achados anormais de material proveniente dos órgãos respiratórios e do tórax - achados imunológicos anormais", + R845: "Achados anormais de material proveniente dos órgãos respiratórios e do tórax - achados microbiológicos anormais", + R846: "Achados anormais de material proveniente dos órgãos respiratórios e do tórax - achados citológicos anormais", + R847: "Achados anormais de material proveniente dos órgãos respiratórios e do tórax - achados histológicos anormais", + R848: "Achados anormais de material proveniente dos órgãos respiratórios e do tórax - outros achados anormais", + R849: "Achados anormais de material proveniente dos órgãos respiratórios e do tórax - achado anormal não especificado", + R85: "Achados anormais de material proveniente dos órgãos digestivos e da cavidade abdominal", + R850: "Achados anormais de material proveniente dos órgãos digestivos e da cavidade abdominal - nível enzimático anormal", + R851: "Achados anormais de material proveniente dos órgãos digestivos e da cavidade abdominal - nível hormonal anormal", + R852: "Achados anormais de material proveniente dos órgãos digestivos e da cavidade abdominal - nível anormal de outras drogas, medicamentos e substâncias biológicas", + R853: "Achados anormais de material proveniente dos órgãos digestivos e da cavidade abdominal - nível anormal de substâncias cuja origem é essencialmente não medicinal", + R854: "Achados anormais de material proveniente dos órgãos digestivos e da cavidade abdominal - achados imunológicos anormais", + R855: "Achados anormais de material proveniente dos órgãos digestivos e da cavidade abdominal - achados microbiológicos anormais", + R856: "Achados anormais de material proveniente dos órgãos digestivos e da cavidade abdominal - achados citológicos anormais", + R857: "Achados anormais de material proveniente dos órgãos digestivos e da cavidade abdominal - achados histológicos anormais", + R858: "Achados anormais de material proveniente dos órgãos digestivos e da cavidade abdominal - outros achados anormais", + R859: "Achados anormais de material proveniente dos órgãos digestivos e da cavidade abdominal - achado anormal não especificado", + R86: "Achados anormais de material proveniente dos órgãos genitais masculinos", + R860: "Achados anormais de material proveniente dos órgãos genitais masculinos - nível enzimático anormal", + R861: "Achados anormais de material proveniente dos órgãos genitais masculinos - nível hormonal anormal", + R862: "Achados anormais de material proveniente dos órgãos genitais masculinos - nível anormal de outras drogas, medicamentos e substâncias biológicas", + R863: "Achados anormais de material proveniente dos órgãos genitais masculinos - nível anormal de substâncias cuja origem é essencialmente não medicinal", + R864: "Achados anormais de material proveniente dos órgãos genitais masculinos - achados imunológicos anormais", + R865: "Achados anormais de material proveniente dos órgãos genitais masculinos - achados microbiológicos anormais", + R866: "Achados anormais de material proveniente dos órgãos genitais masculinos - achados citológicos anormais", + R867: "Achados anormais de material proveniente dos órgãos genitais masculinos - achados histológicos anormais", + R868: "Achados anormais de material proveniente dos órgãos genitais masculinos - outros achados anormais", + R869: "Achados anormais de material proveniente dos órgãos genitais masculinos - achado anormal não especificado", + R87: "Achados anormais de material proveniente dos órgãos genitais femininos", + R870: "Achados anormais de material proveniente dos órgãos genitais femininos - nível enzimático anormal", + R871: "Achados anormais de material proveniente dos órgãos genitais femininos - nível hormonal anormal", + R872: "Achados anormais de material proveniente dos órgãos genitais femininos - nível anormal de outras drogas, medicamentos e substâncias biológicas", + R873: "Achados anormais de material proveniente dos órgãos genitais femininos - nível anormal de substâncias cuja origem é essencialmente não medicinal", + R874: "Achados anormais de material proveniente dos órgãos genitais femininos - achados imunológicos anormais", + R875: "Achados anormais de material proveniente dos órgãos genitais femininos - achados microbiológicos anormais", + R876: "Achados anormais de material proveniente dos órgãos genitais femininos - achados citológicos anormais", + R877: "Achados anormais de material proveniente dos órgãos genitais femininos - achados histológicos anormais", + R878: "Achados anormais de material proveniente dos órgãos genitais femininos - outros achados anormais", + R879: "Achados anormais de material proveniente dos órgãos genitais femininos - achado anormal não especificado", + R89: "Achados anormais de material proveniente de outros órgãos, aparelhos, sistemas e tecidos", + R890: "Achados anormais de material proveniente de outros órgãos, aparelhos, sistemas e tecidos - nível enzimático anormal", + R891: "Achados anormais de material proveniente de outros órgãos, aparelhos, sistemas e tecidos - nível hormonal anormal", + R892: "Achados anormais de material proveniente de outros órgãos, aparelhos, sistemas e tecidos - nível anormal de outras drogas, medicamentos e substâncias biológicas", + R893: "Achados anormais de material proveniente de outros órgãos, aparelhos, sistemas e tecidos - nível anormal de substâncias cuja origem é essencialmente não medicinal", + R894: "Achados anormais de material proveniente de outros órgãos, aparelhos, sistemas e tecidos - achados imunológicos anormais", + R895: "Achados anormais de material proveniente de outros órgãos, aparelhos, sistemas e tecidos - achados microbiológicos anormais", + R896: "Achados anormais de material proveniente de outros órgãos, aparelhos, sistemas e tecidos - achados citológicos anormais", + R897: "Achados anormais de material proveniente de outros órgãos, aparelhos, sistemas e tecidos - achados histológicos anormais", + R898: "Achados anormais de material proveniente de outros órgãos, aparelhos, sistemas e tecidos - outros achados anormais", + R899: "Achados anormais de material proveniente de outros órgãos, aparelhos, sistemas e tecidos - achado anormal não especificado", + R90: "Resultados anormais de exames para diagnóstico por imagem do sistema nervoso central", + R900: "Lesão intracraniana ocupando espaço", + R908: "Outros resultados anormais de exames para diagnóstico por imagem do sistema nervoso central", + R91: "Achados anormais, de exames para diagnóstico por imagem, do pulmão", + R92: "Achados anormais, de exames para diagnóstico por imagem, da mama", + R93: "Achados anormais de exames para diagnóstico por imagem de outras estruturas do corpo", + R930: "Achados anormais de exames para diagnóstico por imagem do crânio e da cabeça não classificados em outra parte", + R931: "Achados anormais de exames para diagnóstico por imagem do coração e da circulação coronariana", + R932: "Achados anormais de exames para diagnóstico por imagem do fígado e das vias biliares", + R933: "Achados anormais de exames para diagnóstico por imagem de outras partes do tubo digestivo", + R934: "Achados anormais de exames para diagnóstico por imagem dos órgãos urinários", + R935: "Achados anormais de exames para diagnóstico por imagem de outras regiões do abdome, incluindo o retroperitônio", + R936: "Achados anormais de exames para diagnóstico por imagem dos membros", + R937: "Achados anormais de exames para diagnóstico por imagem de outras partes do sistema osteomuscular", + R938: "Achados anormais de exames diagnósticos por imagem de outras estruturas somáticas especificadas", + R94: "Resultados anormais de estudos de função", + R940: "Resultados anormais de estudos de função do sistema nervoso central", + R941: "Resultados anormais de estudos de função do sistema nervoso periférico e dos órgãos dos sentidos", + R942: "Resultados anormais de estudos da função pulmonar", + R943: "Resultados anormais de estudos da função cardiovascular", + R944: "Resultados anormais de estudos de função renal", + R945: "Resultados anormais de estudos de função hepática", + R946: "Resultados anormais de estudos de função tireoidiana", + R947: "Resultados anormais de estudos de função de outras glândulas endócrinas", + R948: "Resultados anormais de estudos de função de outros órgãos, aparelhos e sistemas", + R95: "Síndrome da morte súbita na infância", + R96: "Outras mortes súbitas de causa desconhecida", + R960: "Morte instantânea", + R961: "Morte que ocorre em menos de 24 horas após o início dos sintomas, que não pode ser explicada", + R98: "Morte sem assistência", + R99: "Outras causas mal definidas e as não especificadas de mortalidade", + S00: "Traumatismo superficial da cabeça", + S000: "Traumatismo superficial do couro cabeludo", + S001: "Contusão da pálpebra e da região periocular", + S002: "Outros traumatismos superficiais da pálpebra e da região periocular", + S003: "Traumatismo superficial do nariz", + S004: "Traumatismo superficial do ouvido", + S005: "Traumatismo superficial dos lábios e da cavidade oral", + S007: "Traumatismos superficiais múltiplos da cabeça", + S008: "Traumatismo superficial de outras partes da cabeça", + S009: "Traumatismo superficial da cabeça, parte não especificada", + S01: "Ferimento da cabeça", + S010: "Ferimento do couro cabeludo", + S011: "Ferimento da pálpebra e da região periocular", + S012: "Ferimento do nariz", + S013: "Ferimento do ouvido", + S014: "Ferimento da bochecha e região têmporo-mandibular", + S015: "Ferimento do lábio e da cavidade oral", + S017: "Ferimentos múltiplos da cabeça", + S018: "Ferimento na cabeça, de outras localizações", + S019: "Ferimento na cabeça, parte não especificada", + S02: "Fratura do crânio e dos ossos da face", + S020: "Fratura da abóbada do crânio", + S021: "Fratura da base do crânio", + S022: "Fratura dos ossos nasais", + S023: "Fratura do assoalho orbital", + S024: "Fratura dos ossos malares e maxilares", + S025: "Fratura de dentes", + S026: "Fratura de mandíbula", + S027: "Fraturas múltiplas envolvendo os ossos do crânio e da face", + S028: "Outras fraturas do crânio e dos ossos da face", + S029: "Fratura do crânio ou dos ossos da face, parte não especificada", + S03: "Luxação, entorse ou distensão das articulações e dos ligamentos da cabeça", + S030: "Luxação do maxilar", + S031: "Luxação da cartilagem do septo nasal", + S032: "Luxação dentária", + S033: "Luxação de outras partes da cabeça e das não especificadas", + S034: "Entorse e distensão do maxilar", + S035: "Entorse e distensão da articulações e dos ligamentos de outras localizações e de localizações não especificadas da cabeça", + S04: "Traumatismo dos nervos cranianos", + S040: "Traumatismo do nervo e das vias ópticas", + S041: "Traumatismo do nervo oculomotor", + S042: "Traumatismo do nervo troclear", + S043: "Traumatismo do nervo trigêmeo", + S044: "Traumatismo do nervo abducente", + S045: "Traumatismo do nervo facial", + S046: "Traumatismo do nervo acústico", + S047: "Traumatismo do nervo acessório", + S048: "Traumatismo de outros nervos cranianos", + S049: "Traumatismo de nervo craniano não especificado", + S05: "Traumatismo do olho e da órbita ocular", + S050: "Traumatismo da conjuntiva e abrasão da córnea sem menção de corpo estranho", + S051: "Contusão do globo ocular e dos tecidos da órbita", + S052: "Laceração e ruptura ocular com prolapso ou perda de tecido intra-ocular", + S053: "Laceração ocular sem prolapso ou perda de tecido intra-ocular", + S054: "Ferimento penetrante da órbita com ou sem corpo estranho", + S055: "Ferimento penetrante do globo ocular com corpo estranho", + S056: "Ferimento penetrante do globo ocular sem corpo estranho", + S057: "Avulsão do olho", + S058: "Outros traumatismos do olho e da órbita", + S059: "Traumatismo do olho e da órbita, não especificado", + S06: "Traumatismo intracraniano", + S060: "Concussão cerebral", + S061: "Edema cerebral traumático", + S062: "Traumatismo cerebral difuso", + S063: "Traumatismo cerebral focal", + S064: "Hemorragia epidural", + S065: "Hemorragia subdural devida a traumatismo", + S066: "Hemorragia subaracnóide devida a traumatismo", + S067: "Traumatismo intracraniano com coma prolongado", + S068: "Outros traumatismos intracranianos", + S069: "Traumatismo intracraniano, não especificado", + S07: "Lesões por esmagamento da cabeça", + S070: "Lesão por esmagamento da face", + S071: "Lesão por esmagamento do crânio", + S078: "Lesão por esmagamento de outras partes da cabeça", + S079: "Lesão por esmagamento da cabeça, parte não especificada", + S08: "Amputação traumática de parte da cabeça", + S080: "Avulsão do couro cabeludo", + S081: "Amputação traumática da orelha", + S088: "Amputação traumática de outras partes da cabeça", + S089: "Amputação traumática de parte não especificada da cabeça", + S09: "Outros traumatismos da cabeça e os não especificados", + S090: "Traumatismo dos vasos sangüíneos da cabeça não classificados em outra parte", + S091: "Traumatismo dos músculos e dos tendões da cabeça", + S092: "Ruptura traumática do tímpano", + S097: "Traumatismos múltiplos da cabeça", + S098: "Outros traumatismos especificados da cabeça", + S099: "Traumatismo não especificado da cabeça", + S10: "Traumatismo superficial do pescoço", + S100: "Contusão da garganta", + S101: "Outros traumatismos superficiais da garganta e os não especificados", + S107: "Traumatismos superficiais múltiplos do pescoço", + S108: "Traumatismo superficial de outras localizações do pescoço", + S109: "Traumatismo superficial do pescoço, parte não especificada", + S11: "Ferimento do pescoço", + S110: "Ferimento envolvendo a laringe e a traquéia", + S111: "Ferimento da glândula tireóide", + S112: "Ferimento envolvendo a faringe e o esôfago cervical", + S117: "Ferimentos múltiplos do pescoço", + S118: "Ferimentos de outras partes do pescoço", + S119: "Ferimentos do pescoço, parte não especificada", + S12: "Fratura do pescoço", + S120: "Fratura da primeira vértebra cervical", + S121: "Fratura da segunda vértebra cervical", + S122: "Fratura de outras vértebras cervicais especificadas", + S127: "Fraturas múltiplas da coluna cervical", + S128: "Fratura de outras partes do pescoço", + S129: "Fratura do pescoço, parte não especificada", + S13: "Luxação, entorse ou distensão das articulações e dos ligamentos do pescoço", + S130: "Ruptura traumática de disco intervertebral cervical", + S131: "Luxação de vértebra cervical", + S132: "Luxação de outras partes do pescoço e das não especificadas", + S133: "Luxações múltiplas do pescoço", + S134: "Distensão e entorse da coluna cervical", + S135: "Distensão e entorse da região tireoidiana", + S136: "Distensão e entorse de articulações e de ligamentos de outras localizações e das não especificadas do pescoço", + S14: "Traumatismo de nervos e da medula espinhal ao nível cervical", + S140: "Concussão e edema da medula cervical", + S141: "Outros traumatismos e os não especificados da medula cervical", + S142: "Traumatismo da raiz nervosa da coluna cervical", + S143: "Traumatismo do plexo braquial", + S144: "Traumatismo dos nervos periféricos do pescoço", + S145: "Traumatismo dos nervos simpáticos do pescoço", + S146: "Traumatismo de outros nervos e dos não especificados do pescoço", + S15: "Traumatismo dos vasos sangüíneos ao nível do pescoço", + S150: "Traumatismo da artéria carótida", + S151: "Traumatismo da artéria vertebral", + S152: "Traumatismo da veia jugular externa", + S153: "Traumatismo da veia jugular interna", + S157: "Traumatismo de múltiplos vasos sangüíneos ao nível do pescoço", + S158: "Traumatismo de outros vasos sangüíneos ao nível do pescoço", + S159: "Traumatismo de vasos sangüíneos não especificados ao nível do pescoço", + S16: "Traumatismo de tendões e de músculos do pescoço", + S17: "Lesões por esmagamento do pescoço", + S170: "Lesão por esmagamento da laringe e da traquéia", + S178: "Lesão por esmagamento de outras partes do pescoço", + S179: "Lesão por esmagamento do pescoço, parte não especificada", + S18: "Amputação traumática ao nível do pescoço", + S19: "Outros traumatismos do pescoço e os não especificados", + S197: "Traumatismos múltiplos do pescoço", + S198: "Outros traumatismos especificados do pescoço", + S199: "Traumatismo não especificado do pescoço", + S20: "Traumatismo superficial do tórax", + S200: "Contusão da mama", + S201: "Outros traumatismos superficiais da mama e os não especificados", + S202: "Contusão do tórax", + S203: "Outros traumatismos superficiais da parede anterior do tórax", + S204: "Outros traumatismos superficiais da parede posterior do tórax", + S207: "Traumatismos superficiais múltiplos do tórax", + S208: "Traumatismo superficial de outras partes especificadas do tórax e das não especificadas", + S21: "Ferimento do tórax", + S210: "Ferimento da mama", + S211: "Ferimento da parede anterior do tórax", + S212: "Ferimento da parede posterior do tórax", + S217: "Ferimentos múltiplos da parede torácica", + S218: "Ferimento de outras partes do tórax", + S219: "Ferimento do tórax parte não especificada", + S22: "Fratura de costela(s), esterno e coluna torácica", + S220: "Fratura de vértebra torácica", + S221: "Fraturas múltiplas da coluna torácica", + S222: "Fratura do esterno", + S223: "Fratura de costela", + S224: "Fraturas múltiplas de costelas", + S225: "Tórax fundido (oscilante)", + S228: "Fraturas de outras partes dos ossos do tórax", + S229: "Fratura dos ossos do tórax, parte não especificada", + S23: "Luxação, entorse e distensão de articulações e dos ligamentos do tórax", + S230: "Ruptura traumática de disco intervertebral torácico", + S231: "Luxação de vértebra torácica", + S232: "Luxação de outras partes do tórax e das não especificadas", + S233: "Entorse e distensão da coluna torácica", + S234: "Entorse e distensão das costelas e do esterno", + S235: "Entorse e distensão de outras partes do tórax e de partes não especificadas", + S24: "Traumatismos de nervos e da medula espinhal ao nível do tórax", + S240: "Concussão e edema da medula espinhal torácica", + S241: "Outros traumatismos da medula espinhal torácica e os não especificados", + S242: "Traumatismo da raiz de nervo da coluna torácica", + S243: "Traumatismo de nervos periféricos do tórax", + S244: "Traumatismo de nervos simpáticos do tórax", + S245: "Traumatismo de outros nervos do tórax", + S246: "Traumatismo de nervo do tórax não especificado", + S25: "Traumatismo de vasos sangüíneos do tórax", + S250: "Traumatismo da aorta torácica", + S251: "Traumatismo da artéria subclávia ou inominada [braquiocefálica]", + S252: "Traumatismo da veia cava superior", + S253: "Traumatismo da veia subclávia ou inominada [braquiocefálica]", + S254: "Traumatismo de vasos sangüíneos pulmonares", + S255: "Traumatismo de vasos sangüíneos intercostais", + S257: "Traumatismo de múltiplos vasos sangüíneos do tórax", + S258: "Traumatismo de outros vasos sangüíneos do tórax", + S259: "Traumatismo de vaso sangüíneo não especificado do tórax", + S26: "Traumatismo do coração", + S260: "Traumatismo do coração com hemopericárdio", + S268: "Outros traumatismos do coração", + S269: "Traumatismo do coração não especificado", + S27: "Traumatismo de outros órgãos intratorácicos e dos não especificados", + S270: "Pneumotórax traumático", + S271: "Hemotórax traumático", + S272: "Hemopneumotórax traumático", + S273: "Outros traumatismos do pulmão", + S274: "Traumatismo dos brônquios", + S275: "Traumatismo da traquéia torácica", + S276: "Traumatismo da pleura", + S277: "Traumatismos múltiplos de órgãos intratorácicos", + S278: "Traumatismo de outros órgãos intratorácicos especificados", + S279: "Traumatismo de órgão intratorácico não especificado", + S28: "Lesão por esmagamento do tórax e amputação traumática de parte do tórax", + S280: "Esmagamento do tórax", + S281: "Amputação traumática de parte do tórax", + S29: "Outros traumatismos do tórax e os não especificados", + S290: "Traumatismo de músculo e de tendão ao nível tóracico", + S297: "Traumatismos múltiplos do tórax", + S298: "Outros traumatismos especificados do tórax", + S299: "Traumatismo não especificado do tórax", + S30: "Traumatismo superficial do abdome, do dorso e da pelve", + S300: "Contusão do dorso e da pelve", + S301: "Contusão da parede abdominal", + S302: "Contusão dos órgãos genitais externos", + S307: "Traumatismos superficiais múltiplos do abdome, do dorso e da pelve", + S308: "Outros traumatismos superficiais do abdome, do dorso e da pelve", + S309: "Traumatismo superficial de parte não especificada do abdome, do dorso e da pelve", + S31: "Ferimento do abdome, do dorso e da pelve", + S310: "Ferimento do dorso e da pelve", + S311: "Ferimento da parede abdominal", + S312: "Ferimento do pênis", + S313: "Ferimento do escroto e do testículo", + S314: "Ferimento da vagina e da vulva", + S315: "Ferimento de outros órgãos genitais externos e os não especificados", + S317: "Ferimentos múltiplos do abdome, do dorso e da pelve", + S318: "Ferimento de outras partes e de partes não especificadas do abdome", + S32: "Fratura da coluna lombar e da pelve", + S320: "Fratura de vértebra lombar", + S321: "Fratura do sacro", + S322: "Fratura do cóccix", + S323: "Fratura do ílio", + S324: "Fratura do acetábulo", + S325: "Fratura do púbis", + S327: "Fraturas múltiplas de coluna lombar e da pelve", + S328: "Fratura de outras partes da coluna lombossacra e da pelve e de partes não especificadas", + S33: "Luxação, entorse ou distensão das articulações e dos ligamentos da coluna lombar e da pelve", + S330: "Ruptura traumática do disco intervertebral lombar", + S331: "Luxação da vértebra lombar", + S332: "Luxação das articulações sacroilíaca e sacrococcígea", + S333: "Luxação de outras partes e das não especificadas da coluna lombar e da pelve", + S334: "Ruptura traumática da sínfise púbica", + S335: "Entorse e distensão da coluna lombar", + S336: "Entorse e distensão da articulação sacroilíaca", + S337: "Entorse e distensão de outras partes e das não especificadas da coluna lombar e da pelve", + S34: "Traumatismo dos nervos e da medula lombar ao nível do abdome, do dorso e da pelve", + S340: "Concussão e edema da medula lombar", + S341: "Outro traumatismo da medula lombar", + S342: "Traumatismo de raiz nervosa da medula lombar e sacra", + S343: "Traumatismo de cauda eqüina", + S344: "Traumatismo do plexo lombossacro", + S345: "Traumatismo de nervos simpáticos lombares, sacros e pélvicos", + S346: "Traumatismo do(s) nervo(s) periférico(s) do abdome, do dorso e da pelve", + S348: "Traumatismo de outros nervos e dos não especificados ao nível do abdome, do dorso e da pelve", + S35: "Traumatismo de vasos sangüíneos ao nível do abdome, do dorso e da pelve", + S350: "Traumatismo da aorta abdominal", + S351: "Traumatismo da veia cava inferior", + S352: "Traumatismo da artéria celíaca ou mesentérica", + S353: "Traumatismo da veia porta ou esplênica", + S354: "Traumatismo de vaso sangüíneo renal", + S355: "Traumatismo de vaso sangüíneo ilíaco", + S357: "Traumatismo de vasos múltiplos ao nível do abdome, do dorso e da pelve", + S358: "Traumatismo de outros vasos sangüíneos ao nível do abdome, do dorso e da pelve", + S359: "Traumatismo de vaso sangüíneo não especificado ao nível do abdome, do dorso e da pelve", + S36: "Traumatismo de órgãos intra-abdominais", + S360: "Traumatismo do baço", + S361: "Traumatismo do fígado ou da vesícula biliar", + S362: "Traumatismo do pâncreas", + S363: "Traumatismo do estômago", + S364: "Traumatismo do intestino delgado", + S365: "Traumatismo do cólon", + S366: "Traumatismo do reto", + S367: "Traumatismo de múltiplos órgãos intra-abdominais", + S368: "Traumatismo de outros órgãos intra-abdominais", + S369: "Traumatismo de órgão intra-abdominal não especificado", + S37: "Traumatismo do aparelho urinário e de órgãos pélvicos", + S370: "Traumatismo do rim", + S371: "Traumatismo do ureter", + S372: "Traumatismo da bexiga", + S373: "Traumatismo da uretra", + S374: "Traumatismo do ovário", + S375: "Traumatismo da trompa de Falópio", + S376: "Traumatismo do útero", + S377: "Traumatismo de múltiplos órgãos pélvicos", + S378: "Traumatismo de outros órgãos pélvicos", + S379: "Traumatismo de órgão pélvico não especificado", + S38: "Lesão por esmagamento e amputação traumática de parte do abdome, do dorso e da pelve", + S380: "Lesão por esmagamento dos órgãos genitais externos", + S381: "Lesão por esmagamento de outras partes e de partes não especificadas do abdome, do dorso e da pelve", + S382: "Amputação traumática de órgãos genitais externos", + S383: "Amputação traumática de outras partes e de partes não especificadas do abdome, do dorso e da pelve", + S39: "Outros traumatismos e os não especificados do abdome, do dorso e da pelve", + S390: "Traumatismo de músculo e de tendão do abdome, do dorso e da pelve", + S396: "Traumatismo de órgão(s) intra-abdominal(is) com órgão(s) pélvico(s)", + S397: "Outros traumatismos múltiplos do abdome, do dorso e da pelve", + S398: "Outros traumatismos especificados do abdome, do dorso e da pelve", + S399: "Traumatismo não especificado do abdome, do dorso e da pelve", + S40: "Traumatismo superficial do ombro e do braço", + S400: "Contusão do ombro e do braço", + S407: "Traumatismos superficiais múltiplos do ombro e do braço", + S408: "Outros traumatismos superficiais do ombro e do braço", + S409: "Traumatismo superficial não especificado do ombro e do braço", + S41: "Ferimento do ombro e do braço", + S410: "Ferimento do ombro", + S411: "Ferimento do braço", + S417: "Ferimentos múltiplos do ombro e do braço", + S418: "Ferimento de outras partes e de partes não especificadas da cintura escapular", + S42: "Fratura do ombro e do braço", + S420: "Fratura da clavícula", + S421: "Fratura da omoplata [escápula]", + S422: "Fratura da extremidade superior do úmero", + S423: "Fratura da diáfise do úmero", + S424: "Fratura da extremidade inferior do úmero", + S427: "Fraturas múltiplas da clavícula, da omoplata [escápula] e do úmero", + S428: "Fratura de outras partes do ombro e do braço", + S429: "Fratura da cintura escapular, parte não especificada", + S43: "Luxação, entorse e distensão das articulações e dos ligamentos da cintura escapular", + S430: "Luxação da articulação do ombro", + S431: "Luxação da articulação acromioclavicular", + S432: "Luxação da articulação esternoclavicular", + S433: "Luxação de outras partes e das não especificadas da cintura escapular", + S434: "Entorse e distensão de articulação do ombro", + S435: "Entorse e distensão da articulação acromioclavicular", + S436: "Entorse e distensão da articulação esternoclavicular", + S437: "Entorse e distensão de outras partes e de partes não especificadas da cintura escapular", + S44: "Traumatismo de nervos ao nível do ombro e do braço", + S440: "Traumatismo do nervo cubital [ulnar] ao nível do braço", + S441: "Traumatismo do nervo mediano ao nível do braço", + S442: "Traumatismo do nervo radial ao nível do braço", + S443: "Traumatismo do nervo axilar", + S444: "Traumatismo do nervo musculocutâneo", + S445: "Traumatismo do nervo sensitivo cutâneo ao nível do ombro e do braço", + S447: "Traumatismo de múltiplos nervos ao nível do ombro e do braço", + S448: "Traumatismo de outros nervos ao nível do ombro e do braço", + S449: "Traumatismo de nervo não especificado ao nível do ombro e do braço", + S45: "Traumatismo dos vasos sangüíneos ao nível do ombro e do braço", + S450: "Traumatismo da artéria axilar", + S451: "Traumatismo da artéria braquial", + S452: "Traumatismo da veia axilar ou braquial", + S453: "Traumatismo de veia superficial ao nível do ombro e do braço", + S457: "Traumatismo de múltiplos vasos sangüíneos ao nível do ombro e do braço", + S458: "Traumatismo de outros vasos sangüíneos ao nível do ombro e do braço", + S459: "Traumatismo de vaso sangüíneo não especificado ao nível do ombro e do braço", + S46: "Traumatismo de tendão e músculo ao nível do ombro e do braço", + S460: "Traumatismo do tendão do manguito rotador do ombro", + S461: "Traumatismo do músculo e tendão da cabeça longa do bíceps", + S462: "Traumatismo do músculo e tendão de outras partes do bíceps", + S463: "Traumatismo do músculo e tendão do tríceps", + S467: "Traumatismo de múltiplos músculos e tendões ao nível do ombro e do braço", + S468: "Traumatismo de outros músculos e tendões ao nível do ombro e do braço", + S469: "Traumatismo de músculo e tendão não especificado ao nível do ombro e do braço", + S47: "Lesão por esmagamento do ombro e do braço", + S48: "Amputação traumática do ombro e do braço", + S480: "Amputação traumática da articulação do ombro", + S481: "Amputação traumática de localização entre o ombro e o cotovelo", + S489: "Amputação traumática do ombro e do braço, de localização não especificada", + S49: "Outros traumatismos e os não especificados do ombro e do braço", + S497: "Traumatismos múltiplos do ombro e do braço", + S498: "Outros traumatismos especificados do ombro e do braço", + S499: "Traumatismo não especificado do ombro e do braço", + S50: "Traumatismo superficial do cotovelo e do antebraço", + S500: "Contusão do cotovelo", + S501: "Contusão de outras partes e de partes não especificadas do antebraço", + S507: "Traumatismos superficiais múltiplos do antebraço", + S508: "Outros traumatismos superficiais do antebraço", + S509: "Traumatismo superficial do antebraço, não especificado", + S51: "Ferimento do antebraço", + S510: "Ferimento do cotovelo", + S517: "Ferimentos múltiplos do antebraço", + S518: "Ferimento de outras partes do antebraço", + S519: "Ferimento do antebraço, parte não especificado", + S52: "Fratura do antebraço", + S520: "Fratura da extremidade superior do cúbito [ulna]", + S521: "Fratura da extremidade superior do rádio", + S522: "Fratura da diáfise do cúbito [ulna]", + S523: "Fratura da diáfise do rádio", + S524: "Fratura das diáfises do rádio e do cúbito [ulna]", + S525: "Fratura da extremidade distal do rádio", + S526: "Fratura da extremidade distal do rádio e do cúbito [ulna]", + S527: "Fraturas múltiplas do antebraço", + S528: "Fratura de outras partes do antebraço", + S529: "Fratura do antebraço, parte não especificada", + S53: "Luxação, entorse e distensão das articulações e dos ligamentos do cotovelo", + S530: "Luxação da cabeça do rádio", + S531: "Luxação do cotovelo, não especificada", + S532: "Ruptura traumática do ligamento colateral do rádio", + S533: "Ruptura traumática do ligamento colateral do cúbito [ulna]", + S534: "Entorse e distensão do cotovelo", + S54: "Traumatismo de nervos ao nível do antebraço", + S540: "Traumatismo do nervo cubital [ulnar] ao nível do antebraço", + S541: "Traumatismo do nervo mediano ao nível do antebraço", + S542: "Traumatismo do nervo radial ao nível do antebraço", + S543: "Traumatismo do nervo cutâneo sensitivo ao nível do antebraço", + S547: "Traumatismo de múltiplos nervos ao nível do antebraço", + S548: "Traumatismo de outros nervos ao nível do antebraço", + S549: "Traumatismo de nervo não especificado ao nível do antebraço", + S55: "Traumatismo de vasos sangüíneos ao nível do antebraço", + S550: "Traumatismo da artéria cubital [ulnar] ao nível do antebraço", + S551: "Traumatismo da artéria radial ao nível do antebraço", + S552: "Traumatismo de veia ao nível do antebraço", + S557: "Traumatismo de múltiplos vasos sangüíneos ao nível do antebraço", + S558: "Traumatismo de outros vasos sangüíneos ao nível do antebraço", + S559: "Traumatismo de vasos sangüíneos não especificados ao nível do antebraço", + S56: "Traumatismo do músculo e tendão ao nível do antebraço", + S560: "Traumatismo do músculo flexor e tendão do polegar ao nível do antebraço", + S561: "Traumatismo do músculo flexor e tendão de outro(s) dedo(s) ao nível do antebraço", + S562: "Traumatismo de outro músculo flexor e tendão ao nível do antebraço", + S563: "Traumatismo dos músculos extensor ou abdutor e tendões do polegar ao nível do antebraço", + S564: "Traumatismo do músculo extensor e tendão de outro(s) dedo(s) ao nível do antebraço", + S565: "Traumatismo de outros músculos extensores e tendões ao nível do antebraço", + S567: "Traumatismo de músculos e tendões múltiplos ao nível do antebraço", + S568: "Traumatismo de outros músculos e tendões e dos não especificados ao nível do antebraço", + S57: "Lesão por esmagamento do antebraço", + S570: "Lesão por esmagamento do cotovelo", + S578: "Lesão por esmagamento de outras partes do antebraço", + S579: "Lesão por esmagamento de parte não especificada do antebraço", + S58: "Amputação traumática do cotovelo e do antebraço", + S580: "Amputação traumática ao nível do cotovelo", + S581: "Amputação traumática do antebraço entre o cotovelo e o punho", + S589: "Amputação traumática do antebraço, nível não especificado", + S59: "Outros traumatismos do antebraço e os não especificados", + S597: "Traumatismos múltiplos do cotovelo", + S598: "Outros traumatismos especificados do antebraço", + S599: "Traumatismo não especificado do antebraço", + S60: "Traumatismo superficial do punho e da mão", + S600: "Contusão de dedo(s) sem lesão da unha", + S601: "Contusão de dedo(s) com lesão da unha", + S602: "Contusão de outras partes do punho e da mão", + S607: "Traumatismos superficiais múltiplos do punho e da mão", + S608: "Outros traumatismos superficiais do punho e da mão", + S609: "Traumatismo superficial não especificado do punho e da mão", + S61: "Ferimento do punho e da mão", + S610: "Ferimento de dedo(s) sem lesão da unha", + S611: "Ferimento de dedo(s) com lesão da unha", + S617: "Ferimentos múltiplos do punho e da mão", + S618: "Ferimento de outras partes do punho e da mão", + S619: "Ferimento do punho e da mão, parte não especificada", + S62: "Fratura ao nível do punho e da mão", + S620: "Fratura do osso navicular [escafoíde] da mão", + S621: "Fratura de outro(s) osso(s) do carpo", + S622: "Fratura do primeiro metacarpiano", + S623: "Fratura de outros ossos do metacarpo", + S624: "Fraturas múltiplas de ossos metacarpianos", + S625: "Fratura do polegar", + S626: "Fratura de outros dedos", + S627: "Fraturas múltiplas de dedo(s)", + S628: "Fratura de outras partes e de partes não especificadas do punho e da mão", + S63: "Luxação, entorse e distensão das articulações e dos ligamentos ao nível do punho e da mão", + S630: "Luxação do punho", + S631: "Luxação do dedo", + S632: "Luxações múltiplas dos dedos", + S633: "Ruptura traumática de ligamento(s) do punho e do carpo", + S634: "Ruptura traumática do ligamento do dedo nas articulações metacarpofalangianas e interfalangianas", + S635: "Entorse e distensão do punho", + S636: "Entorse e distensão do(s) dedo(s)", + S637: "Entorse e distensão de outras partes e das não especificadas da mão", + S64: "Traumatismo de nervos ao nível do punho e da mão", + S640: "Traumatismo do nervo cubital [ulnar] ao nível do punho e da mão", + S641: "Traumatismo do nervo mediano ao nível do punho e da mão", + S642: "Traumatismo do nervo radial ao nível do punho e da mão", + S643: "Traumatismo do nervo digital do polegar", + S644: "Traumatismo do nervo digital de outro dedo", + S647: "Traumatismo de múltiplos nervos ao nível de punho e da mão", + S648: "Traumatismo de outros nervos ao nível do punho e da mão", + S649: "Traumatismo de nervo não especificado ao nível do punho e da mão", + S65: "Traumatismo de vasos sangüíneos ao nível do punho e da mão", + S650: "Traumatismo da artéria cubital [ulnar] ao nível do punho e da mão", + S651: "Traumatismo da artéria radial ao nível do punho e da mão", + S652: "Traumatismo do arco palmar superficial", + S653: "Traumatismo do arco palmar profundo", + S654: "Traumatismo de vaso(s) sangüíneo(s) do polegar", + S655: "Traumatismo de vaso(s) sangüíneo(s) de outro dedo", + S657: "Traumatismo de vasos sangüíneos múltiplos ao nível de punho e da mão", + S658: "Traumatismo de outros vasos sangüíneos ao nível do punho e de mão", + S659: "Traumatismo de vaso sangüíneo não especificado ao nível do punho e da mão", + S66: "Traumatismo de músculo e tendão ao nível do punho e da mão", + S660: "Traumatismo do músculo flexor longo e tendão do polegar ao nível do punho e da mão", + S661: "Traumatismo do músculo flexor e tendão de outro dedo ao nível do punho e da mão", + S662: "Traumatismo do músculo extensor e tendão do polegar ao nível do punho e da mão", + S663: "Traumatismo do músculo extensor e tendão de outro dedo ao nível do punho e da mão", + S664: "Traumatismo do músculo intrínseco e tendão do polegar ao nível do punho e da mão", + S665: "Traumatismo do músculo intrínseco e tendão de outro dedo ao nível do punho e da mão", + S666: "Traumatismo de músculos flexores e tendões múltiplos ao nível do punho e da mão", + S667: "Traumatismo de músculos extensores e tendões múltiplos ao nível do punho e da mão", + S668: "Traumatismo de outros músculos e tendões ao nível do punho e da mão", + S669: "Traumatismo de músculo e tendão não especificado ao nível do punho e da mão", + S67: "Lesão por esmagamento do punho e da mão", + S670: "Lesão por esmagamento do polegar e de outro(s) dedo(s)", + S678: "Lesão por esmagamento de outras partes e das não especificadas do punho e da mão", + S68: "Amputação traumática ao nível do punho e da mão", + S680: "Amputação traumática do polegar (completa) (parcial)", + S681: "Amputação traumática de um outro dedo apenas (completa) (parcial)", + S682: "Amputação traumática de dois ou mais dedos somente (completa) (parcial)", + S683: "Amputação traumática combinada de (partes de) dedo(s) associada a outras partes do punho e da mão", + S684: "Amputação traumática da mão ao nível do punho", + S688: "Amputação traumática de outras partes do punho e da mão", + S689: "Amputação traumática do punho e da mão, nível não especificado", + S69: "Outros traumatismos e os não especificados do punho e da mão", + S697: "Traumatismos múltiplos do punho e da mão", + S698: "Outros traumatismos especificados do punho e da mão", + S699: "Traumatismo não especificados do punho e da mão", + S70: "Traumatismo superficial do quadril e da coxa", + S700: "Contusão do quadril", + S701: "Contusão da coxa", + S707: "Traumatismos superficiais múltiplos do quadril e da coxa", + S708: "Outros traumatismos superficiais do quadril e da coxa", + S709: "Traumatismo superficial não especificado do quadril e da coxa", + S71: "Ferimento do quadril e da coxa", + S710: "Ferimento do quadril", + S711: "Ferimento da coxa", + S717: "Ferimentos múltiplos do quadril e da coxa", + S718: "Ferimentos de outras partes e das não especificadas da cintura pélvica", + S72: "Fratura do fêmur", + S720: "Fratura do colo do fêmur", + S721: "Fratura pertrocantérica", + S722: "Fratura subtrocantérica", + S723: "Fratura da diáfise do fêmur", + S724: "Fratura da extremidade distal do fêmur", + S727: "Fraturas múltiplas do fêmur", + S728: "Fraturas de outras partes do fêmur", + S729: "Fratura do fêmur, parte não especificada", + S73: "Luxação, entorse e distensão da articulação e dos ligamentos do quadril", + S730: "Luxação da articulação do quadril", + S731: "Entorse e distensão do quadril", + S74: "Traumatismo de nervos ao nível do quadril e da coxa", + S740: "Traumatismo do nervo ciático ao nível do quadril e da coxa", + S741: "Traumatismo do nervo femural ao nível do quadril e da coxa", + S742: "Traumatismo do nervo sensitivo cutâneo ao nível do quadril e da coxa", + S747: "Traumatismo de nervos múltiplos ao nível do quadril e da coxa", + S748: "Traumatismo de outros nervos ao nível do quadril e da coxa", + S749: "Traumatismo de nervo não especificado ao nível do quadril e da coxa", + S75: "Traumatismo de vasos sangüíneos ao nível do quadril e da coxa", + S750: "Traumatismo da artéria femural", + S751: "Traumatismo da veia femural ao nível do quadril e da coxa", + S752: "Traumatismo da veia grande safena ao nível do quadril e da coxa", + S757: "Traumatismo de múltiplos vasos sangüíneos ao nível do quadril e da coxa", + S758: "Traumatismo de outros vaso sangüíneos ao nível do quadril e da coxa", + S759: "Traumatismo de vaso sangüíneo não especificado ao nível do quadril e da coxa", + S76: "Traumatismo de músculo e de tendão ao nível do quadril e da coxa", + S760: "Traumatismo do músculo e do tendão do quadril", + S761: "Traumatismo do músculo e do tendão do quadríceps", + S762: "Traumatismo do músculo e do tendão do adutor da coxa", + S763: "Traumatismo do músculo e do tendão dos músculos posteriores ao nível da coxa", + S764: "Traumatismo de outros músculos e tendões e os não especificados ao nível da coxa", + S767: "Traumatismo de múltiplos músculos e tendões ao nível do quadril e da coxa", + S77: "Lesão por esmagamento do quadril e da coxa", + S770: "Lesão por esmagamento do quadril", + S771: "Lesão por esmagamento da coxa", + S772: "Lesão por esmagamento do quadril e da coxa", + S78: "Amputação traumática do quadril e da coxa", + S780: "Amputação traumática na articulação do quadril", + S781: "Amputação traumática localizada entre o joelho e o quadril", + S789: "Amputação traumática do quadril e coxa nível não especificado", + S79: "Outros traumatismos e os não especificados do quadril e da coxa", + S797: "Traumatismos múltiplos do quadril e da coxa", + S798: "Outros traumatismos especificados do quadril e da coxa", + S799: "Traumatismo não especificado do quadril e da coxa", + S80: "Traumatismo superficial da perna", + S800: "Contusão do joelho", + S801: "Contusão de outras partes e de partes não especificadas da perna", + S807: "Traumatismos superficiais múltiplos da perna", + S808: "Outros traumatismos superficiais da perna", + S809: "Traumatismo superficial não especificado da perna", + S81: "Ferimento da perna", + S810: "Ferimento do joelho", + S817: "Ferimentos múltiplos da perna", + S818: "Ferimento de outras partes da perna", + S819: "Ferimento da perna, parte não especificada", + S82: "Fratura da perna, incluindo tornozelo", + S820: "Fratura da rótula [patela]", + S821: "Fratura da extremidade proximal da tíbia", + S822: "Fratura da diáfise da tíbia", + S823: "Fratura da extremidade distal da tíbia", + S824: "Fratura do perônio [fíbula]", + S825: "Fratura do maléolo medial", + S826: "Fratura do maléolo lateral", + S827: "Fraturas múltiplas da perna", + S828: "Fratura de outras partes da perna", + S829: "Fratura da perna, parte não especificada", + S83: "Luxação, entorse e distensão das articulações e dos ligamentos do joelho", + S830: "Luxação da rótula [patela]", + S831: "Luxação do joelho", + S832: "Ruptura do menisco, atual", + S833: "Ruptura atual da cartilagem da articulação do joelho", + S834: "Entorse e distensão envolvendo ligamento colateral (peronial) (tibial) do joelho", + S835: "Entorse e distensão envolvendo ligamento cruzado (anterior) (posterior) do joelho", + S836: "Entorse e distensão de outras partes e das não especificadas do joelho", + S837: "Traumatismo de estruturas múltiplas do joelho", + S84: "Traumatismo de nervos periféricos da perna", + S840: "Traumatismo do nervo tibial ao nível da perna", + S841: "Traumatismo do nervo peronial ao nível da perna", + S842: "Traumatismo do nervo cutâneo sensitivo ao nível da perna", + S847: "Traumatismo de múltiplos nervos ao nível da perna", + S848: "Traumatismo de outros nervos ao nível da perna", + S849: "Traumatismo de nervo não especificado ao nível da perna", + S85: "Traumatismo de vasos sangüíneos da perna", + S850: "Traumatismo da artéria poplítea", + S851: "Traumatismo da artéria tibial (anterior) (posterior)", + S852: "Traumatismo da artéria peronial", + S853: "Traumatismo da veia grande safena ao nível da perna", + S854: "Traumatismo da veia safena menor ao nível da perna", + S855: "Traumatismo da veia poplítea", + S857: "Traumatismo de múltiplos vasos sangüíneos ao nível da perna", + S858: "Traumatismo de outros vasos sangüíneos ao nível da perna", + S859: "Traumatismo de vasos sangüíneos não especificados ao nível da perna", + S86: "Traumatismos de músculo e de tendão ao nível da perna", + S860: "Traumatismo do tendão de Aquiles", + S861: "Traumatismo de outro(s) músculo(s) e tendão(ões) do grupo muscular posterior ao nível da perna", + S862: "Traumatismo do(s) músculo(s) e tendão(ões) do grupo muscular anterior ao nível da perna", + S863: "Traumatismo do(s) músculo(s) e tendão(ões) do grupo muscular peronial ao nível da perna", + S867: "Traumatismo de múltiplos músculos e tendões ao nível da perna", + S868: "Traumatismos de outros músculos e tendões ao nível da perna", + S869: "Traumatismo de músculo e de tendão não especificado ao nível da perna", + S87: "Traumatismo por esmagamento da perna", + S870: "Traumatismo por esmagamento do joelho", + S878: "Traumatismo por esmagamento de outra parte e de partes não especificadas da perna", + S88: "Amputação traumática da perna", + S880: "Amputação traumática ao nível do joelho", + S881: "Amputação traumática entre o joelho e o tornozelo", + S889: "Amputação traumática da perna ao nível não especificado", + S89: "Outros traumatismos e os não especificados da perna", + S890: "Traumatismos múltiplos da perna", + S898: "Outros traumatismos especificados da perna", + S899: "Traumatismo não especificado da perna", + S90: "Traumatismo superficial do tornozelo e do pé", + S900: "Contusão do tornozelo", + S901: "Contusão de artelho sem lesão da unha", + S902: "Contusão de artelho(s) com lesão da unha", + S903: "Contusão de outras partes e partes não especificadas do pé", + S907: "Traumatismos superficiais múltiplos do tornozelo e do pé", + S908: "Outros traumatismos superficiais do tornozelo e do pé", + S909: "Traumatismo superficial do tornozelo e do pé, não especificado", + S91: "Ferimentos do tornozelo e do pé", + S910: "Ferimento do tornozelo", + S911: "Ferimento do(s) artelho(s) sem lesão da unha", + S912: "Ferimento do(s) artelho(s) com lesão da unha", + S913: "Ferimento de outras partes do pé", + S917: "Ferimentos múltiplos do tornozelo e do pé", + S92: "Fratura do pé (exceto do tornozelo)", + S920: "Fratura do calcâneo", + S921: "Fratura do astrágalo", + S922: "Fratura de outros ossos do tarso", + S923: "Fratura de ossos do metatarso", + S924: "Fratura do hálux", + S925: "Fratura de outro artelho", + S927: "Fraturas múltiplas do pé", + S929: "Fratura do pé não especificada", + S93: "Luxação, entorse e distensão das articulações e dos ligamentos ao nível do tornozelo e do pé", + S930: "Luxação da articulação do tornozelo", + S931: "Luxação do(s) artelho(s)", + S932: "Ruptura de ligamentos ao nível do tornozelo e do pé", + S933: "Luxação de outras partes e das não especificadas do pé", + S934: "Entorse e distensão do tornozelo", + S935: "Entorse e distensão do(s) artelho(s)", + S936: "Entorse e distensão de outras partes e de partes não especificadas do pé", + S94: "Traumatismo dos nervos ao nível do tornozelo e do pé", + S940: "Traumatismo do nervo plantar externo (lateral)", + S941: "Traumatismo do nervo plantar interno (medial)", + S942: "Traumatismo nervo peronial [fibular] profundo ao nível do tornozelo e do pé", + S943: "Traumatismo do nervo sensitivo cutâneo ao nível do tornozelo e do pé", + S947: "Traumatismo de múltiplos nervos ao nível do tornozelo e do pé", + S948: "Traumatismo de outros nervos ao nível do tornozelo e do pé", + S949: "Traumatismo de nervo não especificado, ao nível do tornozelo e do pé", + S95: "Traumatismo de vasos sangüíneos ao nível do tornozelo e do pé", + S950: "Traumatismo da artéria dorsal do pé", + S951: "Traumatismo da artéria plantar do pé", + S952: "Traumatismo da veia dorsal do pé", + S957: "Traumatismo de múltiplos vasos sangüíneos ao nível do tornozelo e do pé", + S958: "Traumatismo de outros vasos sangüíneos ao nível do tornozelo e do pé", + S959: "Traumatismo de vaso sangüíneo não especificado ao nível do tornozelo e do pé", + S96: "Traumatismos do músculo e tendão ao nível do tornozelo e do pé", + S960: "Traumatismo do músculo e tendão do músculo flexor longo do(s) artelho(s) ao nível do tornozelo e do pé", + S961: "Traumatismo do músculo e tendão do extensor longo do(s) artelho(s) ao nível do tornozelo e do pé", + S962: "Traumatismo de músculo intrínseco e tendão ao nível do tornozelo e do pé", + S967: "Traumatismo de múltiplos músculos e tendões ao nível do tornozelo e do pé", + S968: "Traumatismo de outros tendões e músculos ao nível do tornozelo e do pé", + S969: "Traumatismo de músculo e tendão não especificados do tornozelo e do pé", + S97: "Lesão por esmagamento do tornozelo e do pé", + S970: "Lesão por esmagamento do tornozelo", + S971: "Lesão por esmagamento do(s) artelho(s)", + S978: "Lesão por esmagamento de outras partes do tornozelo e do pé", + S98: "Amputação traumática do tornozelo e do pé", + S980: "Amputação traumática do pé ao nível do tornozelo", + S981: "Amputação traumática de apenas um artelho", + S982: "Amputação traumática de dois ou mais artelhos", + S983: "Amputação traumática de outras partes do pé", + S984: "Amputação traumática do pé ao nível não especificado", + S99: "Outros traumatismos e os não especificados do tornozelo e do pé", + S997: "Traumatismos múltiplos do tornozelo e do pé", + S998: "Outros traumatismos especificados do tornozelo e do pé", + S999: "Traumatismos não especificados do tornozelo e do pé", + T00: "Traumatismos superficiais envolvendo múltiplas regiões do corpo", + T000: "Traumatismos superficiais envolvendo a cabeça com o pescoço", + T001: "Traumatismos superficiais envolvendo o tórax com o abdome, parte inferior do dorso e da pelve", + T002: "Traumatismos superficiais envolvendo regiões múltiplas do(s) membro(s) superior(es)", + T003: "Traumatismos superficiais envolvendo regiões múltiplas do(s) membro(s) inferior(es)", + T006: "Traumatismos superficiais envolvendo regiões múltiplas dos membros superiores com membro(s) inferiores", + T008: "Traumatismos superficiais envolvendo outras combinações de regiões do corpo", + T009: "Traumatismos superficiais múltiplos não especificados", + T01: "Ferimentos envolvendo múltiplas regiões do corpo", + T010: "Ferimentos envolvendo a cabeça com o pescoço", + T011: "Ferimentos envolvendo o tórax com o abdome, parte inferior do dorso e da pelve", + T012: "Ferimentos envolvendo regiões múltiplas do(s) membro(s) superior(es)", + T013: "Ferimentos envolvendo múltiplas regiões do(s) membro(s) inferior(es)", + T016: "Ferimentos envolvendo regiões múltiplas do(s) membro(s) superior(es) com membro(s) inferior(es)", + T018: "Ferimentos envolvendo outras combinações de regiões do corpo", + T019: "Ferimentos múltiplos não especificados", + T02: "Fraturas envolvendo múltiplas regiões do corpo", + T020: "Fraturas envolvendo cabeça com pescoço", + T021: "Fraturas envolvendo tórax com parte inferior do dorso e da pelve", + T022: "Fraturas envolvendo regiões múltiplas de um membro superior", + T023: "Fraturas envolvendo regiões múltiplas de um membro inferior", + T024: "Fraturas envolvendo regiões múltiplas de ambos os membros superiores", + T025: "Fraturas envolvendo regiões múltiplas de ambos os membros inferiores", + T026: "Fraturas envolvendo regiões múltiplas do(s) membro(s) superior(es) com inferior(es)", + T027: "Fraturas envolvendo tórax com parte inferior do dorso e pelve com membro(s)", + T028: "Fraturas envolvendo outras combinações de regiões do corpo", + T029: "Fraturas múltiplas não especificadas", + T03: "Luxações, entorses e distensões envolvendo regiões múltiplas do corpo", + T030: "Luxações, entorses e distensões envolvendo a cabeça com o pescoço", + T031: "Luxações, entorses e distensões envolvendo tórax com parte inferior do dorso e da pelve", + T032: "Luxações, entorses e distensões envolvendo regiões múltiplas de membro(s) superior(es)", + T033: "Luxações, entorses e distensões envolvendo regiões múltiplas do(s) membro(s) inferior(es)", + T034: "Luxações, entorses e distensões envolvendo regiões múltiplas dos membros superiores com inferiores", + T038: "Luxações, entorses e distensões envolvendo outras combinações de regiões do corpo", + T039: "Luxações, entorses e distensões múltiplas, não especificadas", + T04: "Traumatismos por esmagamento envolvendo múltiplas regiões do corpo", + T040: "Traumatismos por esmagamento envolvendo a cabeça com o pescoço", + T041: "Traumatismos por esmagamento envolvendo tórax com o abdome, parte inferior do dorso e da pelve", + T042: "Traumatismos por esmagamento envolvendo regiões múltiplas do(s) membro(s) superior(es)", + T043: "Traumatismos por esmagamento envolvendo regiões múltiplas do(s) membro(s) inferior(es)", + T044: "Traumatismos por esmagamento envolvendo regiões múltiplas do(s) membro(s) superior(es) com inferior(es)", + T047: "Traumatismo por esmagamento do tórax com abdome, parte inferior do dorso, pelve e membro(s)", + T048: "Traumatismos por esmagamento envolvendo outras combinações de regiões do corpo", + T049: "Traumatismo múltiplos por esmagamento não especificados", + T05: "Amputações traumáticas envolvendo múltiplas regiões do corpo", + T050: "Amputação traumática de ambas as mãos", + T051: "Amputação traumática de uma mão e de um outro braço [qualquer nível, exceto mão]", + T052: "Amputação traumática de ambos os braços [qualquer nível]", + T053: "Amputação traumática de ambos os pés", + T054: "Amputação traumática de um pé e outra perna [qualquer nível, exceto pé]", + T055: "Amputação traumática de ambas as pernas [qualquer nível]", + T056: "Amputação traumática de membros superiores e inferiores, qualquer combinação [qualquer nível]", + T058: "Amputações traumáticas envolvendo outras combinações de regiões do corpo", + T059: "Amputações traumáticas múltiplas não especificadas", + T06: "Outros traumatismos envolvendo regiões múltiplas do corpo, não classificados em outra parte", + T060: "Traumatismos de cérebro e nervos cranianos com traumatismos de nervos e da medula espinhal ao nível do pescoço", + T061: "Traumatismos de nervos e da medula espinhal envolvendo outras regiões múltiplas do corpo", + T062: "Traumatismos de nervos envolvendo regiões múltiplas do corpo", + T063: "Traumatismos de vasos sangüíneos envolvendo regiões múltiplas do corpo", + T064: "Traumatismos de músculos e de tendões envolvendo regiões múltiplas do corpo", + T065: "Traumatismos de órgãos intratorácicos com órgãos intra-abdominais e pélvicos", + T068: "Outros traumatismos especificados envolvendo regiões múltiplas do corpo", + T07: "Traumatismos múltiplos não especificados", + T08: "Fratura da coluna, nível não especificado", + T09: "Outros traumatismos de coluna e tronco, nível não especificado", + T090: "Traumatismo superficial do tronco, nível não especificado", + T091: "Ferimento do tronco, nível não especificado", + T092: "Luxação, entorse e distensão de articulações e ligamentos não especificados do tronco", + T093: "Traumatismo de medula espinhal, nível não especificado", + T094: "Traumatismo de nervos, de raízes de nervos espinhais e de plexos não especificados do tronco", + T095: "Traumatismo de músculo e tendão não especificados do tronco", + T096: "Amputação traumática do tronco, nível não especificado", + T098: "Outros traumatismos especificados do tronco, nível não especificado", + T099: "Traumatismo não especificado do tronco, nível não especificado", + T10: "Fratura do membro superior, nível não especificado", + T11: "Outros traumatismos de membro superior, nível não especificado", + T110: "Traumatismo superficial do membro superior, nível não especificado", + T111: "Ferimento do membro superior, nível não especificado", + T112: "Luxação, entorse e distensão de articulação e ligamento não especificados do membro superior, nível não especificado", + T113: "Traumatismo de nervo não especificado do membro superior, nível não especificado", + T114: "Traumatismo de vaso sangüíneo não especificado, do membro superior, nível não especificado", + T115: "Traumatismo de músculo e tendão não especificado do membro superior, nível não especificado", + T116: "Amputação traumática do membro superior, nível não especificado", + T118: "Outros traumatismos especificados do membro superior nível não especificado", + T119: "Traumatismo não especificado do membro superior nível não especificado", + T12: "Fratura do membro inferior, nível não especificado", + T13: "Outros traumatismos de membro inferior, nível não especificado", + T130: "Traumatismo superficial de membro inferior, nível não especificado", + T131: "Ferimento de membro inferior, nível não especificado", + T132: "Luxação, entorse e distensão de articulação e ligamento não especificados de membro inferior, nível não especificado", + T133: "Traumatismo de nervo não especificado de membro inferior, nível não especificado", + T134: "Traumatismo de vaso sangüíneo não especificado de membro inferior, nível não especificado", + T135: "Traumatismo de músculo e tendão não especificado de membro inferior, nível não especificado", + T136: "Amputação traumática de membro inferior, nível não especificado", + T138: "Outros traumatismos especificados de membro inferior, nível não especificado", + T139: "Traumatismo não especificado do membro inferior, nível não especificado", + T14: "Traumatismo de região não especificada do corpo", + T140: "Traumatismo superficial de região não especificada do corpo", + T141: "Ferimento de região não especificada do corpo", + T142: "Fratura de região não especificada do corpo", + T143: "Luxação, entorse e distensão de região não especificada do corpo", + T144: "Traumatismo de nervo(s) de região não especificada do corpo", + T145: "Traumatismo de vaso(s) sangüíneo(s) de região não especificada do corpo", + T146: "Traumatismo de músculos e tendões de região não especificada do corpo", + T147: "Traumatismo por esmagamento e amputação traumática de regiões não especificadas do corpo", + T148: "Outros traumatismos de região não especificada do corpo", + T149: "Traumatismo não especificado", + T15: "Corpo estranho na parte externa do olho", + T150: "Corpo estranho na córnea", + T151: "Corpo estranho no saco conjuntival", + T158: "Corpo estranho em outros locais e em locais múltiplos da parte externa do olho", + T159: "Corpo estranho em parte não especificada da região externa do olho", + T16: "Corpo estranho no ouvido", + T17: "Corpo estranho no trato respiratório", + T170: "Corpo estranho no seio nasal", + T171: "Corpo estranho na narina", + T172: "Corpo estranho na faringe", + T173: "Corpo estranho na laringe", + T174: "Corpo estranho na traquéia", + T175: "Corpo estranho no brônquio", + T178: "Corpo estranho em outras partes e partes múltiplas do trato respiratório", + T179: "Corpo estranho no trato respiratório, parte não especificada", + T18: "Corpo estranho no aparelho digestivo", + T180: "Corpo estranho na boca", + T181: "Corpo estranho no esôfago", + T182: "Corpo estranho no estômago", + T183: "Corpo estranho no intestino delgado", + T184: "Corpo estranho no cólon", + T185: "Corpo estranho no ânus e reto", + T188: "Corpo estranho em outras partes e partes múltiplas do aparelho digestivo", + T189: "Corpo estranho em parte não especificada do aparelho digestivo", + T19: "Corpo estranho no trato geniturinário", + T190: "Corpo estranho na uretra", + T191: "Corpo estranho na bexiga", + T192: "Corpo estranho na vulva e vagina", + T193: "Corpo estranho no útero [qualquer parte]", + T198: "Corpo estranho em outras partes e partes múltiplas do trato geniturinário", + T199: "Corpo estranho no trato geniturinário, parte não especificada", + T20: "Queimadura e corrosão da cabeça e pescoço", + T200: "Queimadura da cabeça e do pescoço, grau não especificado", + T201: "Queimadura de primeiro grau da cabeça e do pescoço", + T202: "Queimadura de segundo grau da cabeça e do pescoço", + T203: "Queimadura de terceiro grau da cabeça e do pescoço", + T204: "Corrosão da cabeça e do pescoço, grau não especificado", + T205: "Corrosão de primeiro grau da cabeça e do pescoço", + T206: "Corrosão de segundo grau da cabeça e do pescoço", + T207: "Corrosão de terceiro grau da cabeça e do pescoço", + T21: "Queimadura e corrosão do tronco", + T210: "Queimadura do tronco, grau não especificado", + T211: "Queimadura de primeiro grau do tronco", + T212: "Queimadura de segundo grau do tronco", + T213: "Queimadura de terceiro grau do tronco", + T214: "Corrosão do tronco, grau não especificado", + T215: "Corrosão de primeiro grau do tronco", + T216: "Corrosão de segundo grau do tronco", + T217: "Corrosão de terceiro grau do tronco", + T22: "Queimadura e corrosão do ombro e membro superior, exceto punho e mão", + T220: "Queimadura do ombro e do membro superior, exceto punho e mão, grau não especificado", + T221: "Queimadura de primeiro grau do ombro e do membro superior, exceto punho e mão", + T222: "Queimadura de segundo grau do ombro e do membro superior, exceto punho e mão", + T223: "Queimadura de terceiro grau do ombro e do membro superior, exceto punho e mão", + T224: "Corrosão do ombro e do membro superior, exceto punho e mão, grau não especificado", + T225: "Corrosão de primeiro grau do ombro e do membro superior, exceto punho e mão", + T226: "Corrosão de segundo grau do ombro e do membro superior, exceto punho e mão", + T227: "Corrosão de terceiro grau do ombro e do membro superior, exceto punho e mão", + T23: "Queimadura e corrosão do punho e da mão", + T230: "Queimadura do punho e da mão, grau não especificado", + T231: "Queimadura de primeiro grau do punho e da mão", + T232: "Queimadura de segundo grau do punho e da mão", + T233: "Queimadura de terceiro grau do punho e da mão", + T234: "Corrosão do punho e da mão, grau não especificado", + T235: "Corrosão de primeiro grau do punho e da mão", + T236: "Corrosão de segundo grau do punho e da mão", + T237: "Corrosão de terceiro grau do punho e da mão", + T24: "Queimadura e corrosão do quadril e membro inferior, exceto tornozelo e do pé", + T240: "Queimadura do quadril e membro inferior, exceto tornozelo e do pé, grau não especificado", + T241: "Queimadura de primeiro grau do quadril e do membro inferior, exceto tornozelo e do pé", + T242: "Queimadura de segundo grau do quadril e do membro inferior, exceto tornozelo e do pé", + T243: "Queimadura de terceiro grau do quadril e do membro inferior, exceto tornozelo e do pé", + T244: "Corrosão do quadril e do membro inferior, exceto tornozelo e do pé, grau não especificado", + T245: "Corrosão de primeiro grau do quadril e do membro inferior, exceto tornozelo e do pé", + T246: "Corrosão de segundo grau do quadril e do membro inferior, exceto tornozelo e do pé", + T247: "Corrosão de terceiro grau do quadril e do membro inferior, exceto tornozelo e do pé", + T25: "Queimadura e corrosão do tornozelo e do pé", + T250: "Queimadura do tornozelo e do pé, grau não especificado", + T251: "Queimadura de primeiro grau do tornozelo e do pé", + T252: "Queimadura de segundo grau do tornozelo e do pé", + T253: "Queimadura de terceiro grau do tornozelo e do pé", + T254: "Corrosão do tornozelo e do pé, grau não especificado", + T255: "Corrosão de primeiro grau do tornozelo e do pé", + T256: "Corrosão de segundo grau do tornozelo e do pé", + T257: "Corrosão de terceiro grau do tornozelo e do pé", + T26: "Queimadura e corrosão limitadas ao olho e seus anexos", + T260: "Queimadura da pálpebra e da região periocular", + T261: "Queimadura da córnea e do saco conjuntival", + T262: "Queimadura com resultante ruptura e destruição do globo ocular", + T263: "Queimadura de outras partes do olho e anexos", + T264: "Queimadura do olho e anexos, parte não especificada", + T265: "Corrosão da pálpebra e da região periocular", + T266: "Corrosão da córnea e do saco conjuntival", + T267: "Corrosão com resultante ruptura e destruição do globo ocular", + T268: "Corrosão de outras partes do olho e anexos", + T269: "Corrosão do olho e anexos, parte não especificada", + T27: "Queimadura e corrosão do trato respiratório", + T270: "Queimadura da laringe e traquéia", + T271: "Queimadura da laringe, traquéia com pulmão", + T272: "Queimadura de outras partes do trato respiratório", + T273: "Queimadura do trato respiratório, parte não especificada", + T274: "Corrosão da laringe e traquéia", + T275: "Corrosão da laringe, traquéia com corrosão de pulmão", + T276: "Corrosão de outras partes do trato respiratório", + T277: "Corrosão do trato respiratório, parte não especificada", + T28: "Queimadura e corrosão de outros órgãos internos", + T280: "Queimadura da boca e da faringe", + T281: "Queimadura do esôfago", + T282: "Queimadura de outras partes do trato alimentar", + T283: "Queimadura dos órgãos geniturinários internos", + T284: "Queimadura de outros órgãos internos e dos não especificados", + T285: "Corrosão da boca e faringe", + T286: "Corrosão do esôfago", + T287: "Corrosão de outras partes do trato alimentar", + T288: "Corrosão de órgãos geniturinários internos", + T289: "Corrosão de outros órgãos internos e dos não especificados", + T29: "Queimaduras e corrosões de múltiplas regiões do corpo", + T290: "Queimaduras múltiplas, grau não especificado", + T291: "Queimaduras múltiplas, sem mencionar queimadura(s) ultrapassando o primeiro grau", + T292: "Queimaduras múltiplas, sem mencionar queimadura(s) ultrapassando o segundo grau", + T293: "Queimaduras múltiplas, mencionando ao menos uma queimadura de terceiro grau", + T294: "Corrosões múltiplas, grau não especificado", + T295: "Corrosões múltiplas, sem mencionar corrosão(ões) ultrapassando o primeiro grau", + T296: "Corrosões múltiplas, sem mencionar corrosão(ões) ultrapassando o segundo grau", + T297: "Corrosões múltiplas, mencionado ao menos uma corrosão de terceiro grau", + T30: "Queimadura e corrosão, parte não especificada do corpo", + T300: "Queimadura, parte do corpo não especificada, grau não especificado", + T301: "Queimadura de primeiro grau, parte do corpo não especificada", + T302: "Queimadura de segundo grau, parte do corpo não especificada", + T303: "Queimadura de terceiro grau, parte do corpo não especificada", + T304: "Corrosão, parte do corpo não especificada, grau não especificado", + T305: "Corrosão de primeiro grau, parte do corpo não especificada", + T306: "Corrosão de segundo grau, parte do corpo não especificada", + T307: "Corrosão de terceiro grau, parte do corpo não especificada", + T31: "Queimaduras classificadas segundo a extensão da superfície corporal atingida", + T310: "Queimaduras envolvendo menos de 10% da superfície corporal", + T311: "Queimaduras envolvendo de 10 - 19% da superfície corporal", + T312: "Queimaduras envolvendo de 20 - 29% da superfície corporal", + T313: "Queimaduras envolvendo de 30 - 39% da superfície corporal", + T314: "Queimaduras envolvendo de 40 - 49% da superfície corporal", + T315: "Queimaduras envolvendo de 50 - 59% da superfície corporal", + T316: "Queimaduras envolvendo de 60 - 69% da superfície corporal", + T317: "Queimaduras envolvendo de 70 - 79% da superfície corporal", + T318: "Queimaduras envolvendo de 80 - 89% da superfície corporal", + T319: "Queimaduras envolvendo 90% ou mais da superfície corporal", + T32: "Corrosões classificadas segundo a extensão da superfície corporal atingida", + T320: "Corrosões envolvendo menos de 10% da superfície corporal", + T321: "Corrosões envolvendo 10 - 19% da superfície corporal", + T322: "Corrosões envolvendo 20 - 29% da superfície corporal", + T323: "Corrosões envolvendo 30 - 39% da superfície corporal", + T324: "Corrosões envolvendo 40 - 49% da superfície corporal", + T325: "Corrosões envolvendo 50 - 59% da superfície corporal", + T326: "Corrosões envolvendo 60 - 69% da superfície corporal", + T327: "Corrosões envolvendo 70 - 79% da superfície corporal", + T328: "Corrosões envolvendo 80 - 89% da superfície corporal", + T329: "Corrosões envolvendo 90% ou mais da superfície corporal", + T33: "Geladura superficial", + T330: "Geladura superficial da cabeça", + T331: "Geladura superficial do pescoço", + T332: "Geladura superficial do tórax", + T333: "Geladura superficial da parede abdominal, parte inferior do dorso e da pelve", + T334: "Geladura superficial do braço", + T335: "Geladura superficial do punho e da mão", + T336: "Geladura superficial do quadril e da coxa", + T337: "Geladura superficial do joelho e da perna", + T338: "Geladura superficial do tornozelo e do pé", + T339: "Geladura superficial de outros locais e de locais não especificados", + T34: "Geladura com necrose de tecidos", + T340: "Geladura, com necrose de tecidos, da cabeça", + T341: "Geladura, com necrose de tecidos, do pescoço", + T342: "Geladura, com necrose de tecidos, do tórax", + T343: "Geladura, com necrose de tecidos, da parede abdominal, parte inferior do dorso e da pelve", + T344: "Geladura, com necrose de tecidos, do braço", + T345: "Geladura, com necrose de tecidos, do punho e da mão", + T346: "Geladura, com necrose de tecidos, do quadril e da coxa", + T347: "Geladura, com necrose de tecidos, do joelho e da perna", + T348: "Geladura, com necrose de tecidos, do tornozelo e do pé", + T349: "Geladura, com necrose de tecidos, de localização não especificada", + T35: "Geladura de múltiplas partes do corpo e das não especificadas", + T350: "Geladura superficial envolvendo múltiplas partes do corpo", + T351: "Geladura, com necrose de tecidos, de múltiplas partes do corpo", + T352: "Geladura, de grau não especificado, da cabeça e do pescoço", + T353: "Geladura, de grau não especificado, do tórax, abdome, parte inferior do dorso e da pelve", + T354: "Geladura, de grau não especificado, do membro superior", + T355: "Geladura, de grau não especificado, do membro inferior", + T356: "Geladura, de grau não especificado, de múltiplas partes do corpo", + T357: "Geladura, de grau não especificado, de localização não especificada", + T36: "Intoxicação por antibióticos sistêmicos", + T360: "Intoxicação por penicilinas", + T361: "Intoxicação por cefalosporinas e outras betalactaminas", + T362: "Intoxicação pelo grupo do cloranfenicol", + T363: "Intoxicação por macrolídios", + T364: "Intoxicação por tetraciclinas", + T365: "Intoxicação por aminoglicosídeos", + T366: "Intoxicação por rifamicinas", + T367: "Intoxicação por antibióticos antifúngicos administrados por via sistêmica", + T368: "Intoxicação por outros antibióticos sistêmicos", + T369: "Intoxicação por antibióticos sistêmicos não especificados", + T37: "Intoxicação por outras substâncias antiinfecciosas ou antiparasitárias sistêmicas", + T370: "Intoxicação por sulfonamidas", + T371: "Intoxicação por drogas antimicobacterianas", + T372: "Intoxicação por antimaláricos e drogas que atuam sobre outros protozoários do sangue", + T373: "Intoxicação por outros medicamentos antiprotozoários", + T374: "Intoxicação por anti-helmínticos", + T375: "Intoxicação por drogas antivirais", + T378: "Intoxicação por outros agentes antiinfecciosos e antiparasitários especificados", + T379: "Intoxicação por agentes antiinfecciosos e antiparasitários sistêmicos não especificados", + T38: "Intoxicação por hormônios, seus substitutos sintéticos e seus antagonistas não classificados em outra parte", + T380: "Intoxicação por glicocorticóides e análogos sintéticos", + T381: "Intoxicação por hormônios tireoidianos e seus derivados", + T382: "Intoxicação por medicamentos antitireoidianos", + T383: "Intoxicação por insulina e drogas hipoglicemiantes orais [antidiabéticos]", + T384: "Intoxicação por anticoncepcionais orais", + T385: "Intoxicação por outros estrógenos e progestágenos", + T386: "Intoxicação por antigonadotrofinas, antiestrógenos, antiandrógenos não classificados em outra parte", + T387: "Intoxicação por andrógenos e anabolizantes congêneres", + T388: "Intoxicação por outros hormônios e substitutos sintéticos, e os não especificados", + T389: "Intoxicação por outros antagonistas hormonais, e os não especificados", + T39: "Intoxicação por analgésicos, antipiréticos e anti-reumáticos não-opiáceos", + T390: "Intoxicação por salicilatos", + T391: "Intoxicação por derivados do 4-aminofenol", + T392: "Intoxicação por derivados pirazolônicos", + T393: "Intoxicação por outros antiinflamatórios não esteróides", + T394: "Intoxicação por anti-reumáticos não classificados em outra parte", + T398: "Intoxicação por outros analgésicos não opiáceos e antipiréticos não classificados em outra parte", + T399: "Intoxicação por analgésico não-opiáceo, antipirético e anti-reumático, não especificados", + T40: "Intoxicação por narcóticos e psicodislépticos [alucinógenos]", + T400: "Intoxicação por ópio", + T401: "Intoxicação por heroína", + T402: "Intoxicação por outros opiáceos", + T403: "Intoxicação por metadona", + T404: "Intoxicação por outros narcóticos sintéticos", + T405: "Intoxicação por cocaína", + T406: "Intoxicação por outros narcóticos e os não especificados", + T407: "Intoxicação por cannabis (derivados)", + T408: "Intoxicação por lisergida [LSD]", + T409: "Intoxicação por outros psicodislépticos e os não especificados [alucinógenos]", + T41: "Intoxicação por anestésicos e gases terapêuticos", + T410: "Intoxicação por anestésicos inalatórios", + T411: "Intoxicação por anestésicos intravenosos", + T412: "Intoxicação por outros anestésicos gerais e os não especificados", + T413: "Intoxicação por anestésicos locais", + T414: "Intoxicação por anestésico não especificado", + T415: "Intoxicação por gases terapêuticos", + T42: "Intoxicação por antiepilépticos, sedativos-hipnóticos e antiparkinsonianos", + T420: "Intoxicação por derivados da hidantoína", + T421: "Intoxicação por iminostilbenos", + T422: "Intoxicação por succinimidas e oxazolidinadionas", + T423: "Intoxicação por barbitúricos", + T424: "Intoxicação por benzodiazepinas", + T425: "Intoxicação por antiepiléticos em associação, não classificados em outra parte", + T426: "Intoxicação por outras drogas antiepilépticas e sedativos-hipnóticos", + T427: "Intoxicação por drogas antiepilépticos, sedativos-hipnóticos, não especificados", + T428: "Intoxicação por drogas antiparkinsonianos e outros depressores centrais do tônus muscular", + T43: "Intoxicação por drogas psicotrópicas não classificadas em outra parte", + T430: "Intoxicação por antidepressivos tricíclicos e tetracíclicos", + T431: "Intoxicação por antidepressivos inibidores da monoaminooxidase (MAO)", + T432: "Intoxicação por outros antidepressivos e os não especificados", + T433: "Intoxicação por antipsicóticos e neurolépticos derivados da fenotiazina", + T434: "Intoxicação por neurolépticos do tipo butirofenona e tioxanteno", + T435: "Intoxicação por outros antipsicóticos e neurolépticos e os não especificados", + T436: "Intoxicação por psicoestimulantes que potencialmente podem provocar dependência", + T438: "Intoxicação por outras drogas psicotrópicas não classificadas em outra parte", + T439: "Intoxicação por droga psicotrópica não especificada", + T44: "Intoxicação por drogas que afetam principalmente o sistema nervoso autônomo", + T440: "Intoxicação por agentes anticolinesterase", + T441: "Intoxicação por outros agentes parassimpaticomiméticos [colinérgicos]", + T442: "Intoxicação por bloqueadores ganglionares não classificados em outra parte", + T443: "Intoxicação por outros parassimpaticolíticos [anticolinérgicos e antimuscarínicos] e espasmolíticos não classificados em outra parte", + T444: "Intoxicação por agonistas principalmente alfa-adrenorreceptores não classificados em outra parte", + T445: "Intoxicação por agonistas principalmente beta-adrenorreceptores não classificados em outra parte", + T446: "Intoxicação por antagonistas alfa-adrenorreceptores não classificados em outra parte", + T447: "Intoxicação por antagonistas beta-adrenorreceptores não classificados em outra parte", + T448: "Intoxicação por bloqueadores neuronais adrenérgicos e de ação central, não classificados em outra parte", + T449: "Intoxicação por outras drogas que afetam principalmente o sistema nervoso autônomo e as não especificadas", + T45: "Intoxicação por substâncias de ação essencialmente sistêmica e substâncias hematológicas, não classificadas em outra parte", + T450: "Intoxicação por drogas antialérgicas e antieméticas", + T451: "Intoxicação por drogas antineoplásicas e imunomupressoras", + T452: "Intoxicação por vitaminas, não classificadas em outra parte", + T453: "Intoxicação por enzimas, não classificadas em outra parte", + T454: "Intoxicação por ferro e seus compostos", + T455: "Intoxicação por anticoagulantes", + T456: "Intoxicação por drogas que afetam a fibrinólise", + T457: "Intoxicação por antagonistas de anticoagulantes, vitamina K e de outros fatores de coagulação", + T458: "Intoxicação por outras substâncias primariamente sistêmicas e hematológicas", + T459: "Intoxicação por substância essencialmente sistêmica e hematológica não especificada", + T46: "Intoxicação por substâncias que atuam primariamente sobre o aparelho circulatório", + T460: "Intoxicação por glicosídeos estimulantes do coração e substâncias de ação semelhante", + T461: "Intoxicação por bloqueadores dos canais de cálcio", + T462: "Intoxicação por outras drogas antidisrítmicas não classificadas em outra parte", + T463: "Intoxicação por vasodilatadores coronarianos, não classificados em outra parte", + T464: "Intoxicação por inibidores da enzima de conversão da angiotensina", + T465: "Intoxicação por outras drogas anti-hipertensivas não classificadas em outra parte", + T466: "Intoxicação por drogas antihiperlipêmicas e antiarterioscleróticas", + T467: "Intoxicação por vasodilatadores periféricos", + T468: "Intoxicação por drogas antivaricosas, incluindo substâncias esclerosantes", + T469: "Intoxicação por outras substâncias e as não especificadas que agem essencialmente sobre o aparelho circulatório", + T47: "Intoxicação por substâncias que atuam primariamente sobre o aparelho gastrointestinal", + T470: "Intoxicação por antagonistas dos receptores H2 da histamina", + T471: "Intoxicação por outros antiácidos e drogas que inibem a secreção gástrica", + T472: "Intoxicação por laxativos estimulantes", + T473: "Intoxicação por laxativos salinos e osmóticos", + T474: "Intoxicação por outros laxativos", + T475: "Intoxicação por digestivos", + T476: "Intoxicação por drogas antidiarréicas", + T477: "Intoxicação por eméticos", + T478: "Intoxicação por outras substâncias que atuam primariamente sobre o aparelho gastrintestinal", + T479: "Intoxicação por substância não especificada que atua primariamente sobre o aparelho gastrointestinal", + T48: "Intoxicação por substâncias que atuam primariamente sobre os músculos lisos e esqueléticos e sobre o aparelho respiratório", + T480: "Intoxicação por drogas ocitócicas", + T481: "Intoxicação por relaxantes musculares esqueléticos [bloqueadores neuromusculares]", + T482: "Intoxicação por outras substâncias e as não especificadas que atuam sobre os músculos", + T483: "Intoxicação por antitussígenos", + T484: "Intoxicação por expectorantes", + T485: "Intoxicação por drogas anti-resfriado", + T486: "Intoxicação por antiasmáticos não classificados em outra parte", + T487: "Intoxicação por outras substâncias e as não especificadas que atuam primariamente sobre o aparelho respiratório", + T49: "Intoxicação por substâncias de uso tópico que atuam primariamente sobre a pele e as mucosas e por medicamentos utilizados em oftalmologia, otorrinolaringologia e odontologia", + T490: "Intoxicação por antifúngicos, antiinfecciosos e antiinflamatórios de uso tópico, não classificados em outra parte", + T491: "Intoxicação por antipruriginosos", + T492: "Intoxicação por adstringentes e detergentes de uso local", + T493: "Intoxicação por emolientes, demulcentes e protetores", + T494: "Intoxicação por ceratolíticos, ceratoplásticos e outras drogas e preparados para o tratamento dos cabelos", + T495: "Intoxicação por drogas e preparações de uso oftalmológico", + T496: "Intoxicação por drogas e preparações de uso otorrinolaringológico", + T497: "Intoxicação por drogas dentárias de uso tópico", + T498: "Intoxicação por outras drogas de uso tópico", + T499: "Intoxicação por preparado de uso tópico, não especificado", + T50: "Intoxicação por diuréticos e outras drogas, medicamentos e substâncias biológicas e as não especificadas", + T500: "Intoxicação por mineralocorticóides e seus antagonistas", + T501: "Intoxicação por diuréticos de alça", + T502: "Intoxicação por inibidores da anidrase carbônica, benzotiazidas e outros diuréticos", + T503: "Intoxicação por produtos que agem sobre o equilíbrio eletrolítico, calórico e hídrico", + T504: "Intoxicação por drogas que agem sobre o metabolismo do ácido úrico", + T505: "Intoxicação por inibidores do apetite", + T506: "Intoxicação por antídotos e quelantes não classificados em outra parte", + T507: "Intoxicação por analépticos e antagonistas dos receptores de opiáceos", + T508: "Intoxicação por agentes de diagnóstico", + T509: "Intoxicação por outras drogas, medicamentos e substâncias biológicas e as não especificadas", + T51: "Efeito tóxico do álcool", + T510: "Efeito tóxico do etanol", + T511: "Efeito tóxico do metanol", + T512: "Efeito tóxico do 2-propanol", + T513: "Efeito tóxico do óleo de fusel", + T518: "Efeito tóxico de outros álcoois", + T519: "Efeito tóxico de álcool não especificado", + T52: "Efeito tóxico de solventes orgânicos", + T520: "Efeito tóxico de derivados do petróleo", + T521: "Efeito tóxico do benzeno", + T522: "Efeito tóxico de homólogos do benzeno", + T523: "Efeito tóxico de glicóis", + T524: "Efeito tóxico de cetonas", + T528: "Efeito tóxico de outros solventes orgânicos", + T529: "Efeito tóxico de solvente orgânico não especificado", + T53: "Efeito tóxico de derivados halogênicos de hidrocarbonetos alifáticos e aromáticos", + T530: "Efeito tóxico do tetracloreto de carbono", + T531: "Efeito tóxico do clorofórmio", + T532: "Efeito tóxico do tricloroetileno", + T533: "Efeito tóxico do tetracloroetileno", + T534: "Efeito tóxico do diclorometano", + T535: "Efeito tóxico do clorofluorcarbono", + T536: "Efeito tóxico de outros derivados halogênicos de hidrocarbonetos alifáticos", + T537: "Efeito tóxico de derivados halogênicos de hidrocarbonetos aromáticos", + T539: "Efeito tóxico de derivados halogênicos de hidrocarbonetos alifáticos e aromáticos não especificados", + T54: "Efeito tóxico de corrosivos", + T540: "Efeito tóxico do fenol e homólogos do fenol", + T541: "Efeito tóxico de outros compostos corrosivos orgânicos", + T542: "Efeito tóxico de ácidos corrosivos e substâncias semelhantes", + T543: "Efeito tóxico de bases (álcalis) cáusticas(os) e substâncias semelhantes", + T549: "Efeito tóxico de substância corrosiva não especificada", + T55: "Efeito tóxico de sabões e detergentes", + T56: "Efeito tóxico de metais", + T560: "Efeito tóxico do chumbo e seus compostos", + T561: "Efeito tóxico do mercúrio e seus compostos", + T562: "Efeito tóxico do cromo e seus compostos", + T563: "Efeito tóxico do cádmio e seus compostos", + T564: "Efeito tóxico do cobre e seus compostos", + T565: "Efeito tóxico do zinco e seus compostos", + T566: "Efeito tóxico do estanho e seus compostos", + T567: "Efeito tóxico do berilo e seus compostos", + T568: "Efeito tóxico de outros metais", + T569: "Efeito tóxico de metal, não especificado", + T57: "Efeito tóxico de outras substâncias inorgânicas", + T570: "Efeito tóxico do arsênico e seus compostos", + T571: "Efeito tóxico do fósforo e seus compostos", + T572: "Efeito tóxico do manganês e seus compostos", + T573: "Efeito tóxico do cianeto de hidrogênio (ácido cianídrico)", + T578: "Efeito tóxico de outras substâncias inorgânicas especificadas", + T579: "Efeito tóxico de substância inorgânica não especificada", + T58: "Efeito tóxico do monóxido de carbono", + T59: "Efeito tóxico de outros gases, fumaças e vapores", + T590: "Efeito tóxico de óxidos de nitrogênio", + T591: "Efeito tóxico do dióxido de enxofre", + T592: "Efeito tóxico de formaldeído", + T593: "Efeito tóxico do gás lacrimogêneo", + T594: "Efeito tóxico do cloro gasoso", + T595: "Efeito tóxico do fluoreto gasoso e ácido fluorídrico", + T596: "Efeito tóxico do ácido sulfídrico", + T597: "Efeito tóxico do dióxido de carbono", + T598: "Efeito tóxico de outros gases, fumaças e vapores especificados", + T599: "Efeito tóxico de gases, fumaças e vapores não especificados", + T60: "Efeito tóxico de pesticidas", + T600: "Efeito tóxico de inseticidas organofosforados e carbamatos", + T601: "Efeito tóxico de inseticidas halogenados", + T602: "Efeito tóxico de outros inseticidas", + T603: "Efeito tóxico de herbicidas e fungicidas", + T604: "Efeito tóxico de rodenticidas", + T608: "Efeito tóxico de outros pesticidas", + T609: "Efeito tóxico de pesticida não especificado", + T61: "Efeito tóxico de substâncias nocivas consumidas como fruto do mar", + T610: "Intoxicação pelo peixe ciguatera", + T611: "Intoxicação por peixes escombrídeos", + T612: "Outras intoxicações por peixes e mariscos", + T618: "Efeito tóxico de outros frutos do mar", + T619: "Efeito tóxico de frutos do mar não especificados", + T62: "Efeito tóxico de outras substâncias nocivas ingeridas como alimento", + T620: "Efeito tóxico de ingestão de cogumelos", + T621: "Efeito tóxico de ingestão de frutos", + T622: "Efeito tóxico de ingestão de outras (partes de) plantas", + T628: "Efeito tóxico de outras substâncias nocivas ingeridas como alimento", + T629: "Efeito tóxico de substâncias nocivas ingeridas como alimento, não especificadas", + T63: "Efeito tóxico de contato com animais venenosos", + T630: "Efeito tóxico do veneno de serpente", + T631: "Efeito tóxico do veneno de outros répteis", + T632: "Efeito tóxico do veneno de escorpião", + T633: "Efeito tóxico do veneno de aranha", + T634: "Efeito tóxico do veneno de outros artrópodes", + T635: "Efeito tóxico de contato com peixe", + T636: "Efeito tóxico de contato com outros animais marinhos", + T638: "Efeito tóxico de contato com outros animais venenosos", + T639: "Efeito tóxico de contato com animal venenoso não especificado", + T64: "Efeito tóxico da aflatoxina e de outras micotoxinas contaminantes de alimentos", + T65: "Efeito tóxico de outras substâncias e as não especificadas", + T650: "Efeito tóxico de cianetos", + T651: "Efeito tóxico da estricnina e seus sais", + T652: "Efeito tóxico do tabaco e da nicotina", + T653: "Efeito tóxico de nitroderivados e aminoderivados do benzeno e seus homólogos", + T654: "Efeito tóxico do dissulfeto de carbono", + T655: "Efeito tóxico da nitroglicerina e outros ácidos e ésteres nítricos", + T656: "Efeito tóxico de tinturas e corantes, não classificadas em outra parte", + T658: "Efeito tóxico de outras substâncias especificadas", + T659: "Efeito tóxico de substância não especificada", + T66: "Efeitos não especificados de radiação", + T67: "Efeitos do calor e da luz", + T670: "Golpe de calor e insolação", + T671: "Síncope devida ao calor", + T672: "Cãibras devidas ao calor", + T673: "Exaustão devida ao calor e à perda hídrica", + T674: "Exaustão devida ao calor e à perda de sal", + T675: "Exaustão devida ao calor, sem especificação", + T676: "Fadiga transitória devida ao calor", + T677: "Edema devido ao calor", + T678: "Outros efeitos do calor e da luz", + T679: "Efeito do calor e da luz não especificado", + T68: "Hipotermia", + T69: "Outros efeitos da temperatura reduzida", + T690: "Mão e pé de imersão", + T691: "Congelamento [chilblains]", + T698: "Outros efeitos especificados de temperatura reduzida", + T699: "Efeito não especificado de temperatura reduzida", + T70: "Efeitos da pressão atmosférica e da pressão da água", + T700: "Otite barotraumática", + T701: "Sinusite barotraumática", + T702: "Outros efeitos das grandes altitude e os não especificados", + T703: "Mal dos caixões [doença de descompressão]", + T704: "Efeito dos fluidos em alta pressão", + T708: "Outros efeitos da pressão atmosférica ou da pressão da água", + T709: "Efeitos não especificados da pressão atmosférica ou da pressão da água", + T71: "Asfixia", + T73: "Efeitos de outras privações", + T730: "Efeitos da fome", + T731: "Efeitos da sede", + T732: "Exaustão devida às intempéries", + T733: "Exaustão devido a um esforço intenso", + T738: "Outros efeitos de privação", + T739: "Efeito não especificado de privação", + T74: "Síndromes de maus tratos", + T740: "Abandono", + T741: "Sevícias físicas", + T742: "Abuso sexual", + T743: "Abuso psicológico", + T748: "Outras síndromes especificadas de maus tratos", + T749: "Síndrome não especificada de maus tratos", + T75: "Efeitos de outras causas externas", + T750: "Efeitos do raio", + T751: "Afogamento e submersão não mortal", + T752: "Efeitos da vibração", + T753: "Doença causada pelo movimento", + T754: "Efeitos da corrente elétrica", + T758: "Outros efeitos especificados de causas externas", + T78: "Efeitos adversos não classificados em outra parte", + T780: "Choque anafilático devido à intolerância alimentar", + T781: "Outras reações de intolerância alimentar não classificadas em outra parte", + T782: "Choque anafilático não especificado", + T783: "Edema angioneurótico", + T784: "Alergia não especificada", + T788: "Outros efeitos adversos não classificados em outra parte", + T789: "Efeito adverso não especificado", + T79: "Algumas complicações precoces dos traumatismos não classificadas em outra parte", + T790: "Embolia gasosa (traumática)", + T791: "Embolia gordurosa (traumática)", + T792: "Hemorragia traumática secundária e recidivante", + T793: "Infecção pós-traumática de ferimento não classificada em outra parte", + T794: "Choque traumático", + T795: "Anúria traumática", + T796: "Isquemia muscular traumática", + T797: "Enfisema subcutâneo de origem traumática", + T798: "Outras complicações precoces de traumatismo", + T799: "Complicação precoce não especificada de traumatismo", + T80: "Complicações conseqüentes à infusão, transfusão ou injeção terapêutica", + T800: "Embolia aérea subseqüentes à infusão, transfusão e injeção terapêutica", + T801: "Complicações vasculares subseqüentes à infusão, transfusão e injeção terapêutica", + T802: "Infecções subseqüentes à infusão, transfusão e injeção terapêutica", + T803: "Reação de incompatibilidade ABO", + T804: "Reação de incompatibilidade Rh", + T805: "Choque anafilático devido a soro", + T806: "Outras reações ao soro", + T808: "Outras complicações subseqüentes à infusão, transfusão e injeção terapêutica", + T809: "Complicação não especificada subseqüente à infusão, transfusão e injeção terapêutica", + T81: "Complicações de procedimentos não classificadas em outra parte", + T810: "Hemorragia e hematoma complicando procedimento não classificado em outra parte", + T811: "Choque durante ou resultante de procedimento não classificado em outra parte", + T812: "Perfuração e laceração acidentais durante um procedimento não classificado em outra parte", + T813: "Deiscência de ferida cirúrgica não classificada em outra parte", + T814: "Infecção subseqüente a procedimento não classificada em outra parte", + T815: "Corpo estranho deixado acidentalmente em cavidade corporal ou em ferida operatória subseqüente a procedimento", + T816: "Reação aguda à substância estranha deixada acidentalmente durante um procedimento", + T817: "Complicações vasculares subseqüentes a um procedimento não classificado em outra parte", + T818: "Outras complicações de procedimentos não classificadas em outra parte", + T819: "Complicação não especificada de procedimento", + T82: "Complicações de dispositivos protéticos, implantes e enxertos cardíacos e vasculares", + T820: "Complicação mecânica de prótese valvular cardíaca", + T821: "Complicação mecânica de dispositivo eletrônico cardíaco", + T822: "Complicação mecânica de enxerto de ponte coronária e implantes de valvas", + T823: "Complicações mecânicas de outros enxertos vasculares", + T824: "Complicação mecânica de cateter vascular de diálise", + T825: "Complicações mecânicas de outros dispositivos e implantes cardiovasculares", + T826: "Infecção e reação inflamatórias devidas à prótese valvular cardíaca", + T827: "Infecção e reação inflamatórias devidas a outros dispositivos, implantes e enxertos cardíacos e vasculares", + T828: "Outras complicações de dispositivos protéticos, implantes e enxertos cardíacos e vasculares", + T829: "Complicações não especificada de dispositivo protético, implante e enxerto cardíacos e vasculares", + T83: "Complicações de dispositivos protéticos, implantes e enxertos geniturinários internos", + T830: "Complicação mecânica de cateter (de demora) urinário", + T831: "Complicação mecânica de outros dispositivos e implantes urinários", + T832: "Complicação mecânica de enxerto de órgão urinário", + T833: "Complicação mecânica de dispositivo intra-uterino (anticoncepcional)", + T834: "Complicação mecânica de outros dispositivos protéticos, implantes e enxertos do trato genital", + T835: "Infecção e reação inflamatória devidas à dispositivo protético, implante e enxerto no aparelho urinário", + T836: "Infecção e reação inflamatória devidas à dispositivo protético, implante e enxerto no trato genital", + T838: "Outras complicações de dispositivos protéticos, implantes e enxertos geniturinários", + T839: "Complicação não especificada de prótese, implante e enxerto geniturinários", + T84: "Complicações de dispositivos protéticos, implantes e enxertos ortopédicos internos", + T840: "Complicação mecânica de prótese articular interna", + T841: "Complicação mecânica de dispositivo de fixação interna de ossos dos membros", + T842: "Complicação mecânica de dispositivo de fixação interna de outros ossos", + T843: "Complicação mecânica de outros dispositivos, implantes e enxertos ósseos", + T844: "Complicação mecânica de outros dispositivos, implantes e enxertos ortopédicos internos", + T845: "Infecção e reação inflamatória devidas à prótese articular interna", + T846: "Infecção e reação inflamatória devidas a dispositivo de fixação interna [qualquer local]", + T847: "Infecção e reação inflamatória devidas a outros dispositivos protéticos, implantes e enxertos ortopédicos internos", + T848: "Outras complicações de dispositivos protéticos, implantes e enxertos ortopédicos internos", + T849: "Complicação não especificada de dispositivo protético, implante e enxerto ortopédicos internos", + T85: "Complicações de outros dispositivos protéticos, implantes e enxertos internos", + T850: "Complicação mecânica de shunt ventricular (comunicação) intracraniano", + T851: "Complicação mecânica de estimulador eletrônico implantado no sistema nervoso", + T852: "Complicação mecânica de lente intraocular", + T853: "Complicações mecânicas de outros dispositivos protéticos, implantes e enxertos oculares", + T854: "Complicação mecânica de prótese e implante mamários", + T855: "Complicação mecânica de dispositivos protéticos, implante e enxerto gastrointestinais", + T856: "Complicação mecânica de outros dispositivos protéticos, implantes e enxertos internos especificados", + T857: "Infecção e reação inflamatória devida a outros dispositivos protéticos, implantes e enxertos internos", + T858: "Outras complicações de dispositivos protéticos, implantes e enxertos internos não classificados em outra parte", + T859: "Complicação não especificada de outros dispositivos protéticos, implantes e enxertos internos", + T86: "Falha e rejeição de órgãos e tecidos transplantados", + T860: "Rejeição a transplante de medula óssea", + T861: "Falência ou rejeição de transplante de rim", + T862: "Falência ou rejeição de transplante de coração", + T863: "Falência ou rejeição de transplante duplo de coração e pulmão", + T864: "Falência ou rejeição de transplante de fígado", + T868: "Outra insuficiência ou rejeição de outros órgãos ou tecidos transplantados", + T869: "Falência e rejeição a transplante de órgão ou tecido não especificado", + T87: "Complicações próprias de reimplante e amputação", + T870: "Complicações de reimplante (de parte) de extremidade superior", + T871: "Complicações de reimplante (de parte) de extremidade inferior", + T872: "Complicações de outras partes reimplantadas do corpo", + T873: "Neuroma de coto da amputação", + T874: "Infecção de coto da amputação", + T875: "Necrose do coto da amputação", + T876: "Outras complicações e as não especificadas do coto de amputação", + T88: "Outras complicações de cuidados médicos e cirúrgicos não classificadas em outra parte", + T880: "Infecção subseqüente à imunização", + T881: "Outras complicações subseqüentes à imunização não classificadas em outra parte", + T882: "Choque devido à anestesia", + T883: "Hipertermia maligna devida à anestesia", + T884: "Entubação falha ou difícil", + T885: "Outras complicações de anestesia", + T886: "Choque anafilático devido a efeito adverso de droga ou medicamento corretos e administrados de maneira apropriada", + T887: "Efeito adverso não especificado de droga ou medicamento", + T888: "Outras complicações de cuidados médicos e cirúrgicos especificados não classificados em outra parte", + T889: "Complicação não especificada de cuidados médicos e cirúrgicos", + T90: "Seqüelas de traumatismo da cabeça", + T900: "Seqüelas de traumatismo superficial da cabeça", + T901: "Seqüelas de ferimento da cabeça", + T902: "Seqüelas de fratura de crânio e de ossos da face", + T903: "Seqüelas de traumatismo de nervos cranianos", + T904: "Seqüelas de traumatismo do olho e da órbita", + T905: "Seqüelas de traumatismo intracraniano", + T908: "Seqüelas de outros traumatismos especificados da cabeça", + T909: "Seqüelas de traumatismo não especificado da cabeça", + T91: "Seqüelas de traumatismos do pescoço e do tronco", + T910: "Seqüelas de traumatismo superficial e ferimento do pescoço e do tronco", + T911: "Seqüelas de fratura de coluna vertebral", + T912: "Seqüelas de outra fratura do tórax e da pelve", + T913: "Seqüelas de traumatismo de medula espinhal", + T914: "Seqüelas de traumatismo de órgãos intratorácicos", + T915: "Seqüelas de traumatismo de órgãos intra-abdominais e órgãos pélvicos", + T918: "Seqüelas de outros traumatismos especificados do pescoço e do tronco", + T919: "Seqüelas de traumatismo não especificado do pescoço e do tronco", + T92: "Seqüelas de traumatismos do membro superior", + T920: "Seqüelas de ferimento do membro superior", + T921: "Seqüelas de fratura do braço", + T922: "Seqüelas de fratura ao nível do punho e da mão", + T923: "Seqüelas de luxação, entorse e distensão do membro superior", + T924: "Seqüelas de traumatismo de nervo de membro superior", + T925: "Seqüelas de traumatismo de músculo e tendão do membro superior", + T926: "Seqüelas de esmagamento e amputação traumática do membro superior", + T928: "Seqüelas de outros traumatismos especificados do membro superior", + T929: "Seqüelas de traumatismo não especificado do membro superior", + T93: "Seqüelas de traumatismos do membro inferior", + T930: "Seqüelas de ferimento do membro inferior", + T931: "Seqüelas de fratura do fêmur", + T932: "Seqüelas de outras fraturas do membro inferior", + T933: "Seqüelas de luxação, entorse e distensão do membro inferior", + T934: "Seqüelas de traumatismo de nervo do membro inferior", + T935: "Seqüelas de traumatismo de músculo e tendão do membro inferior", + T936: "Seqüelas de esmagamento e amputação traumática do membro inferior", + T938: "Seqüelas de outros traumatismos especificados do membro inferior", + T939: "Seqüelas de traumatismo não especificado do membro inferior", + T94: "Seqüelas de traumatismos envolvendo múltiplas regiões do corpo e as não especificadas", + T940: "Seqüelas de traumatismos envolvendo regiões múltiplas do corpo", + T941: "Seqüelas de traumatismos não especificados por regiões do corpo", + T95: "Seqüelas de queimaduras, corrosões e geladuras", + T950: "Seqüelas de queimadura, corrosão e geladura da cabeça e pescoço", + T951: "Seqüelas de queimadura, corrosão e geladura do tronco", + T952: "Seqüelas de queimadura, corrosão e geladura do membro superior", + T953: "Seqüelas de queimadura, corrosão e geladura do membro inferior", + T954: "Seqüelas de queimadura e corrosão classificável só de acordo com a extensão da área corporal envolvida", + T958: "Seqüelas de outra queimadura, corrosões e geladuras especificadas", + T959: "Seqüelas de queimadura, corrosão e geladura de local não especificado", + T96: "Seqüelas de intoxicação por drogas, medicamentos e substâncias biológicas", + T97: "Seqüelas de efeitos tóxicos de substâncias de origem predominantemente não-medicinal", + T98: "Seqüelas de outros efeitos de causas externas e dos não especificados", + T980: "Seqüelas dos efeitos da penetração de corpo estranho através de orifício natural", + T981: "Seqüelas em outros efeitos de causas externas e os não especificados", + T982: "Seqüelas de algumas complicações precoces de traumatismos", + T983: "Seqüelas de complicações dos cuidados médicos e cirúrgicos não classificados em outra parte", + U04: "Síndrome respiratória aguda grave [severe acute respiratory syndrome SARS]", + U049: "Síndrome respiratória aguda grave [Severe acute respiratory syndrome) [SARS], não especificada", + U80: "Agente resistente à penicilina e antibióticos relacionados", + U800: "Agente resistente à penicilina", + U801: "Agente resistente à meticilina", + U808: "Agente resistente a outro antibiótico relacionado à penicilina", + U81: "Agente resistente à vancomicina e antibióticos relacionados", + U810: "Agente resistente à vancomicina", + U818: "Agente resistente a outros antibióticos relacionado à vancomicina", + U88: "Agente resistente a múltiplos antibióticos", + U89: "Agente resistente a outros antibióticos e a antibióticos não especificados", + U898: "Agente resistente a outro antibiótico especificado único", + U899: "Agente resistente a antibiótico não especificado", + U99: "CID 10ª Revisão não disponível", + V01: "Pedestre traumatizado em colisão com um veículo a pedal", + V010: "Pedestre traumatizado em colisão com um veículo a pedal - acidente não-de-trânsito", + V011: "Pedestre traumatizado em colisão com um veículo a pedal - acidente de trânsito", + V019: "Pedestre traumatizado em colisão com um veículo a pedal - acidente não especificado se de trânsito ou não de trânsito", + V02: "Pedestre traumatizado em colisão com um veículo a motor de duas ou três rodas", + V020: "Pedestre traumatizado em colisão com um veículo a motor de duas ou três rodas - acidente não-de-trânsito", + V021: "Pedestre traumatizado em colisão com um veículo a motor de duas ou três rodas - acidente de trânsito", + V029: "Pedestre traumatizado em colisão com um veículo a motor de duas ou três rodas - acidente não especificado se de trânsito ou não de trânsito", + V03: 'Pedestre traumatizado em colisão com um automóvel [carro], "pick up" ou caminhonete', + V030: 'Pedestre traumatizado em colisão com um automóvel [carro], "pick up" ou caminhonete - acidente não-de-trânsito', + V031: 'Pedestre traumatizado em colisão com um automóvel [carro], "pick up" ou caminhonete - acidente de trânsito', + V039: 'Pedestre traumatizado em colisão com um automóvel [carro], "pick up" ou caminhonete - acidente não especificado se de trânsito ou não de trânsito', + V04: "Pedestre traumatizado em colisão com um veículo de transporte pesado ou com um ônibus", + V040: "Pedestre traumatizado em colisão com um veículo de transporte pesado ou com um ônibus - acidente não-de-trânsito", + V041: "Pedestre traumatizado em colisão com um veículo de transporte pesado ou com um ônibus - acidente de trânsito", + V049: "Pedestre traumatizado em colisão com um veículo de transporte pesado ou com um ônibus - acidente não especificado se de trânsito ou não de trânsito", + V05: "Pedestre traumatizado em colisão com trem [comboio] ou um veículo ferroviário", + V050: "Pedestre traumatizado em colisão com trem [comboio] ou um veículo ferroviário - acidente não-de-trânsito", + V051: "Pedestre traumatizado em colisão com trem [comboio] ou um veículo ferroviário - acidente de trânsito", + V059: "Pedestre traumatizado em colisão com trem [comboio] ou um veículo ferroviário - acidente não especificado se de trânsito ou não de trânsito", + V06: "Pedestre traumatizado em colisão com outro veículo não-motorizado", + V060: "Pedestre traumatizado em colisão com outro veículo não-motorizado - acidente não-de-trânsito", + V061: "Pedestre traumatizado em colisão com outro veículo não-motorizado - acidente de trânsito", + V069: "Pedestre traumatizado em colisão com outro veículo não-motorizado - acidente não especificado se de trânsito ou não de trânsito", + V09: "Pedestre traumatizado em outros acidentes de transporte e em acidentes de transporte não especificados", + V090: "Pedestre traumatizado em um acidente não-de-trânsito, envolvendo outros veículos a motor e os não especificados", + V091: "Pedestre traumatizado em um acidente não-de-trânsito não especificado", + V092: "Pedestre traumatizado em um acidente de trânsito envolvendo outros veículos e os não especificados, a motor", + V093: "Pedestre traumatizado em um acidente de trânsito não especificado", + V099: "Pedestre traumatizado em um acidente de transporte não especificado", + V10: "Ciclista traumatizado em colisão com um pedestre ou um animal", + V100: "Ciclista traumatizado em colisão com um pedestre ou um animal - condutor traumatizado em acidente não-de-trânsito", + V101: "Ciclista traumatizado em colisão com um pedestre ou um animal - passageiro traumatizado em acidente não-de-trânsito", + V102: "Ciclista traumatizado em colisão com um pedestre ou um animal - ciclista não especificado traumatizado em acidente não-de-trânsito", + V103: "Ciclista traumatizado em colisão com um pedestre ou um animal - pessoa traumatizada ao subir ou descer do veículo", + V104: "Ciclista traumatizado em colisão com um pedestre ou um animal - condutor traumatizado em um acidente de trânsito", + V105: "Ciclista traumatizado em colisão com um pedestre ou um animal - passageiro traumatizado em um acidente de trânsito", + V109: "Ciclista traumatizado em colisão com um pedestre ou um animal - ciclista não especificado traumatizado em um acidente de trânsito", + V11: "Ciclista traumatizado em colisão com outro veículo a pedal", + V110: "Ciclista traumatizado em colisão com outro veículo a pedal - condutor traumatizado em acidente não-de-trânsito", + V111: "Ciclista traumatizado em colisão com outro veículo a pedal - passageiro traumatizado em acidente não-de-trânsito", + V112: "Ciclista traumatizado em colisão com outro veículo a pedal - ciclista não especificado traumatizado em acidente não-de-trânsito", + V113: "Ciclista traumatizado em colisão com outro veículo a pedal - pessoa traumatizada ao subir ou descer do veículo", + V114: "Ciclista traumatizado em colisão com outro veículo a pedal - condutor traumatizado em um acidente de trânsito", + V115: "Ciclista traumatizado em colisão com outro veículo a pedal - passageiro traumatizado em um acidente de trânsito", + V119: "Ciclista traumatizado em colisão com outro veículo a pedal - ciclista não especificado traumatizado em um acidente de trânsito", + V12: "Ciclista traumatizado em colisão com um veículo a motor de duas ou três rodas", + V120: "Ciclista traumatizado em colisão com um veículo a motor de duas ou três rodas - condutor traumatizado em acidente não-de-trânsito", + V121: "Ciclista traumatizado em colisão com um veículo a motor de duas ou três rodas - passageiro traumatizado em acidente não-de-trânsito", + V122: "Ciclista traumatizado em colisão com um veículo a motor de duas ou três rodas - ciclista não especificado traumatizado em acidente não-de-trânsito", + V123: "Ciclista traumatizado em colisão com um veículo a motor de duas ou três rodas - pessoa traumatizada ao subir ou descer do veículo", + V124: "Ciclista traumatizado em colisão com um veículo a motor de duas ou três rodas - condutor traumatizado em um acidente de trânsito", + V125: "Ciclista traumatizado em colisão com um veículo a motor de duas ou três rodas - passageiro traumatizado em um acidente de trânsito", + V129: "Ciclista traumatizado em colisão com um veículo a motor de duas ou três rodas - ciclista não especificado traumatizado em um acidente de trânsito", + V13: 'Ciclista traumatizado em colisão com um automóvel, "pick up" ou caminhonete', + V130: 'Ciclista traumatizado em colisão com um automóvel, "pick up" ou caminhonete - condutor traumatizado em acidente não-de-trânsito', + V131: 'Ciclista traumatizado em colisão com um automóvel, "pick up" ou caminhonete - passageiro traumatizado em acidente não-de-trânsito', + V132: 'Ciclista traumatizado em colisão com um automóvel, "pick up" ou caminhonete - ciclista não especificado traumatizado em acidente não-de-trânsito', + V133: 'Ciclista traumatizado em colisão com um automóvel, "pick up" ou caminhonete - pessoa traumatizada ao subir ou descer do veículo', + V134: 'Ciclista traumatizado em colisão com um automóvel, "pick up" ou caminhonete - condutor traumatizado em um acidente de trânsito', + V135: 'Ciclista traumatizado em colisão com um automóvel, "pick up" ou caminhonete - passageiro traumatizado em um acidente de trânsito', + V139: 'Ciclista traumatizado em colisão com um automóvel, "pick up" ou caminhonete - ciclista não especificado traumatizado em um acidente de trânsito', + V14: "Ciclista traumatizado em colisão com um veículo de transporte pesado ou um ônibus", + V140: "Ciclista traumatizado em colisão com um veículo de transporte pesado ou um ônibus - condutor traumatizado em acidente não-de-trânsito", + V141: "Ciclista traumatizado em colisão com um veículo de transporte pesado ou um ônibus - passageiro traumatizado em acidente não-de-trânsito", + V142: "Ciclista traumatizado em colisão com um veículo de transporte pesado ou um ônibus - ciclista não especificado traumatizado em acidente não-de-trânsito", + V143: "Ciclista traumatizado em colisão com um veículo de transporte pesado ou um ônibus - pessoa traumatizada ao subir ou descer do veículo", + V144: "Ciclista traumatizado em colisão com um veículo de transporte pesado ou um ônibus - condutor traumatizado em um acidente de trânsito", + V145: "Ciclista traumatizado em colisão com um veículo de transporte pesado ou um ônibus - passageiro traumatizado em um acidente de trânsito", + V149: "Ciclista traumatizado em colisão com um veículo de transporte pesado ou um ônibus - ciclista não especificado traumatizado em um acidente de trânsito", + V15: "Ciclista traumatizado em colisão com um trem ou um veículo ferroviário", + V150: "Ciclista traumatizado em colisão com um trem ou um veículo ferroviário - condutor traumatizado em acidente não-de-trânsito", + V151: "Ciclista traumatizado em colisão com um trem ou um veículo ferroviário - passageiro traumatizado em acidente não-de-trânsito", + V152: "Ciclista traumatizado em colisão com um trem ou um veículo ferroviário - ciclista não especificado traumatizado em acidente não-de-trânsito", + V153: "Ciclista traumatizado em colisão com um trem ou um veículo ferroviário - pessoa traumatizada ao subir ou descer do veículo", + V154: "Ciclista traumatizado em colisão com um trem ou um veículo ferroviário - condutor traumatizado em um acidente de trânsito", + V155: "Ciclista traumatizado em colisão com um trem ou um veículo ferroviário - passageiro traumatizado em um acidente de trânsito", + V159: "Ciclista traumatizado em colisão com um trem ou um veículo ferroviário - ciclista não especificado traumatizado em um acidente de trânsito", + V16: "Ciclista traumatizado em colisão com outro veículo não-motorizado", + V160: "Ciclista traumatizado em colisão com outro veículo não-motorizado - condutor traumatizado em acidente não-de-trânsito", + V161: "Ciclista traumatizado em colisão com outro veículo não-motorizado - passageiro traumatizado em acidente não-de-trânsito", + V162: "Ciclista traumatizado em colisão com outro veículo não-motorizado - ciclista não especificado traumatizado em acidente não-de-trânsito", + V163: "Ciclista traumatizado em colisão com outro veículo não-motorizado - pessoa traumatizada ao subir ou descer do veículo", + V164: "Ciclista traumatizado em colisão com outro veículo não-motorizado - condutor traumatizado em um acidente de trânsito", + V165: "Ciclista traumatizado em colisão com outro veículo não-motorizado - passageiro traumatizado em um acidente de trânsito", + V169: "Ciclista traumatizado em colisão com outro veículo não-motorizado - ciclista não especificado traumatizado em um acidente de trânsito", + V17: "Ciclista traumatizado em colisão com um objeto fixo ou parado", + V170: "Ciclista traumatizado em colisão com um objeto fixo ou parado - condutor traumatizado em acidente não-de-trânsito", + V171: "Ciclista traumatizado em colisão com um objeto fixo ou parado - passageiro traumatizado em acidente não-de-trânsito", + V172: "Ciclista traumatizado em colisão com um objeto fixo ou parado - ciclista não especificado traumatizado em acidente não-de-trânsito", + V173: "Ciclista traumatizado em colisão com um objeto fixo ou parado - pessoa traumatizada ao subir ou descer do veículo", + V174: "Ciclista traumatizado em colisão com um objeto fixo ou parado - condutor traumatizado em um acidente de trânsito", + V175: "Ciclista traumatizado em colisão com um objeto fixo ou parado - passageiro traumatizado em um acidente de trânsito", + V179: "Ciclista traumatizado em colisão com um objeto fixo ou parado - ciclista não especificado traumatizado em um acidente de trânsito", + V18: "Ciclista traumatizado em um acidente de transporte sem colisão", + V180: "Ciclista traumatizado em um acidente de transporte sem colisão - condutor traumatizado em acidente não-de-trânsito", + V181: "Ciclista traumatizado em um acidente de transporte sem colisão - passageiro traumatizado em acidente não-de-trânsito", + V182: "Ciclista traumatizado em um acidente de transporte sem colisão - ciclista não especificado traumatizado em acidente não-de-trânsito", + V183: "Ciclista traumatizado em um acidente de transporte sem colisão - pessoa traumatizada ao subir ou descer do veículo", + V184: "Ciclista traumatizado em um acidente de transporte sem colisão - condutor traumatizado em um acidente de trânsito", + V185: "Ciclista traumatizado em um acidente de transporte sem colisão - passageiro traumatizado em um acidente de trânsito", + V189: "Ciclista traumatizado em um acidente de transporte sem colisão - ciclista não especificado traumatizado em um acidente de trânsito", + V19: "Ciclista traumatizado em outros acidentes de transporte e em acidentes de transporte não especificados", + V190: "Condutor traumatizado em colisão com outros veículos e com veículos não especificados, a motor, em um acidente não-de-trânsito", + V191: "Passageiro traumatizado em colisão com outro veículos e com veículos não especificados, a motor, em um acidente não-de-trânsito", + V192: "Ciclista não especificado traumatizado em colisão com outros veículos e com veículos não especificados, a motor, em um acidente não-de-trânsito", + V193: "Ciclista [qualquer] traumatizado em um acidente não especificado e não-de-trânsito", + V194: "Condutor traumatizado em colisão com outros veículos e com veículos não especificados, a motor, em um acidente de trânsito", + V195: "Passageiro traumatizado em colisão com outros veículos e com veículos não especificados, a motor, em um acidente de trânsito", + V196: "Ciclista não especificado traumatizado em colisão com outros veículos e com veículos não especificados, a motor, em um acidente de trânsito", + V198: "Ciclista [qualquer] traumatizado em outros acidentes de transporte especificados", + V199: "Ciclista [qualquer] traumatizado em um acidente de trânsito não especificado", + V20: "Motociclista traumatizado em colisão com um pedestre ou um animal", + V200: "Motociclista traumatizado em colisão com um pedestre ou um animal - condutor traumatizado em acidente não-de-trânsito", + V201: "Motociclista traumatizado em colisão com um pedestre ou um animal - passageiro traumatizado em acidente não-de-trânsito", + V202: "Motociclista traumatizado em colisão com um pedestre ou um animal - motociclista não especificado traumatizado em acidente não-de-trânsito", + V203: "Motociclista traumatizado em colisão com um pedestre ou um animal - pessoa traumatizado ao subir ou descer do veículo", + V204: "Motociclista traumatizado em colisão com um pedestre ou um animal - condutor traumatizado em um acidente de trânsito", + V205: "Motociclista traumatizado em colisão com um pedestre ou um animal - passageiro traumatizado em um acidente de trânsito", + V209: "Motociclista traumatizado em colisão com um pedestre ou um animal - motociclista não especificado traumatizado em um acidente de trânsito", + V21: "Motociclista traumatizado em colisão com um veículo a pedal", + V210: "Motociclista traumatizado em colisão com um veículo a pedal - condutor traumatizado em acidente não-de-trânsito", + V211: "Motociclista traumatizado em colisão com um veículo a pedal - passageiro traumatizado em acidente não-de-trânsito", + V212: "Motociclista traumatizado em colisão com um veículo a pedal - motociclista não especificado traumatizado em acidente não-de-trânsito", + V213: "Motociclista traumatizado em colisão com um veículo a pedal - pessoa traumatizado ao subir ou descer do veículo", + V214: "Motociclista traumatizado em colisão com um veículo a pedal - condutor traumatizado em um acidente de trânsito", + V215: "Motociclista traumatizado em colisão com um veículo a pedal - passageiro traumatizado em um acidente de trânsito", + V219: "Motociclista traumatizado em colisão com um veículo a pedal - motociclista não especificado traumatizado em um acidente de trânsito", + V22: "Motociclista traumatizado em colisão com um veículo a motor de duas ou três rodas", + V220: "Motociclista traumatizado em colisão com um veículo a motor de duas ou três rodas - condutor traumatizado em acidente não-de-trânsito", + V221: "Motociclista traumatizado em colisão com um veículo a motor de duas ou três rodas - passageiro traumatizado em acidente não-de-trânsito", + V222: "Motociclista traumatizado em colisão com um veículo a motor de duas ou três rodas - motociclista não especificado traumatizado em acidente não-de-trânsito", + V223: "Motociclista traumatizado em colisão com um veículo a motor de duas ou três rodas - pessoa traumatizado ao subir ou descer do veículo", + V224: "Motociclista traumatizado em colisão com um veículo a motor de duas ou três rodas - condutor traumatizado em um acidente de trânsito", + V225: "Motociclista traumatizado em colisão com um veículo a motor de duas ou três rodas - passageiro traumatizado em um acidente de trânsito", + V229: "Motociclista traumatizado em colisão com um veículo a motor de duas ou três rodas - motociclista não especificado traumatizado em um acidente de trânsito", + V23: 'Motociclista traumatizado em colisão com um automóvel [carro], "pick up" ou caminhonete', + V230: 'Motociclista traumatizado em colisão com um automóvel [carro], "pick up" ou caminhonete - condutor traumatizado em acidente não-de-trânsito', + V231: 'Motociclista traumatizado em colisão com um automóvel [carro], "pick up" ou caminhonete - passageiro traumatizado em acidente não-de-trânsito', + V232: 'Motociclista traumatizado em colisão com um automóvel [carro], "pick up" ou caminhonete - motociclista não especificado traumatizado em acidente não-de-trânsito', + V233: 'Motociclista traumatizado em colisão com um automóvel [carro], "pick up" ou caminhonete - pessoa traumatizado ao subir ou descer do veículo', + V234: 'Motociclista traumatizado em colisão com um automóvel [carro], "pick up" ou caminhonete - condutor traumatizado em um acidente de trânsito', + V235: 'Motociclista traumatizado em colisão com um automóvel [carro], "pick up" ou caminhonete - passageiro traumatizado em um acidente de trânsito', + V239: 'Motociclista traumatizado em colisão com um automóvel [carro], "pick up" ou caminhonete - motociclista não especificado traumatizado em um acidente de trânsito', + V24: "Motociclista traumatizado em colisão com um veículo de transporte pesado ou um ônibus", + V240: "Motociclista traumatizado em colisão com um veículo de transporte pesado ou um ônibus - condutor traumatizado em acidente não-de-trânsito", + V241: "Motociclista traumatizado em colisão com um veículo de transporte pesado ou um ônibus - passageiro traumatizado em acidente não-de-trânsito", + V242: "Motociclista traumatizado em colisão com um veículo de transporte pesado ou um ônibus - motociclista não especificado traumatizado em acidente não-de-trânsito", + V243: "Motociclista traumatizado em colisão com um veículo de transporte pesado ou um ônibus - pessoa traumatizado ao subir ou descer do veículo", + V244: "Motociclista traumatizado em colisão com um veículo de transporte pesado ou um ônibus - condutor traumatizado em um acidente de trânsito", + V245: "Motociclista traumatizado em colisão com um veículo de transporte pesado ou um ônibus - passageiro traumatizado em um acidente de trânsito", + V249: "Motociclista traumatizado em colisão com um veículo de transporte pesado ou um ônibus - motociclista não especificado traumatizado em um acidente de trânsito", + V25: "Motociclista traumatizado em colisão com um trem ou um veículo ferroviário", + V250: "Motociclista traumatizado em colisão com um trem ou um veículo ferroviário - condutor traumatizado em acidente não-de-trânsito", + V251: "Motociclista traumatizado em colisão com um trem ou um veículo ferroviário - passageiro traumatizado em acidente não-de-trânsito", + V252: "Motociclista traumatizado em colisão com um trem ou um veículo ferroviário - motociclista não especificado traumatizado em acidente não-de-trânsito", + V253: "Motociclista traumatizado em colisão com um trem ou um veículo ferroviário - pessoa traumatizado ao subir ou descer do veículo", + V254: "Motociclista traumatizado em colisão com um trem ou um veículo ferroviário - condutor traumatizado em um acidente de trânsito", + V255: "Motociclista traumatizado em colisão com um trem ou um veículo ferroviário - passageiro traumatizado em um acidente de trânsito", + V259: "Motociclista traumatizado em colisão com um trem ou um veículo ferroviário - motociclista não especificado traumatizado em um acidente de trânsito", + V26: "Motociclista traumatizado em colisão com outro veículo não-motorizado", + V260: "Motociclista traumatizado em colisão com outro veículo não-motorizado - condutor traumatizado em acidente não-de-trânsito", + V261: "Motociclista traumatizado em colisão com outro veículo não-motorizado - passageiro traumatizado em acidente não-de-trânsito", + V262: "Motociclista traumatizado em colisão com outro veículo não-motorizado - motociclista não especificado traumatizado em acidente não-de-trânsito", + V263: "Motociclista traumatizado em colisão com outro veículo não-motorizado - pessoa traumatizado ao subir ou descer do veículo", + V264: "Motociclista traumatizado em colisão com outro veículo não-motorizado - condutor traumatizado em um acidente de trânsito", + V265: "Motociclista traumatizado em colisão com outro veículo não-motorizado - passageiro traumatizado em um acidente de trânsito", + V269: "Motociclista traumatizado em colisão com outro veículo não-motorizado - motociclista não especificado traumatizado em um acidente de trânsito", + V27: "Motociclista traumatizado em colisão com um objeto fixo ou parado", + V270: "Motociclista traumatizado em colisão com um objeto fixo ou parado - condutor traumatizado em acidente não-de-trânsito", + V271: "Motociclista traumatizado em colisão com um objeto fixo ou parado - passageiro traumatizado em acidente não-de-trânsito", + V272: "Motociclista traumatizado em colisão com um objeto fixo ou parado - motociclista não especificado traumatizado em acidente não-de-trânsito", + V273: "Motociclista traumatizado em colisão com um objeto fixo ou parado - pessoa traumatizado ao subir ou descer do veículo", + V274: "Motociclista traumatizado em colisão com um objeto fixo ou parado - condutor traumatizado em um acidente de trânsito", + V275: "Motociclista traumatizado em colisão com um objeto fixo ou parado - passageiro traumatizado em um acidente de trânsito", + V279: "Motociclista traumatizado em colisão com um objeto fixo ou parado - motociclista não especificado traumatizado em um acidente de trânsito", + V28: "Motociclista traumatizado em um acidente de transporte sem colisão", + V280: "Motociclista traumatizado em um acidente de transporte sem colisão - condutor traumatizado em acidente não-de-trânsito", + V281: "Motociclista traumatizado em um acidente de transporte sem colisão - passageiro traumatizado em acidente não-de-trânsito", + V282: "Motociclista traumatizado em um acidente de transporte sem colisão - motociclista não especificado traumatizado em acidente não-de-trânsito", + V283: "Motociclista traumatizado em um acidente de transporte sem colisão - pessoa traumatizado ao subir ou descer do veículo", + V284: "Motociclista traumatizado em um acidente de transporte sem colisão - condutor traumatizado em um acidente de trânsito", + V285: "Motociclista traumatizado em um acidente de transporte sem colisão - passageiro traumatizado em um acidente de trânsito", + V289: "Motociclista traumatizado em um acidente de transporte sem colisão - motociclista não especificado traumatizado em um acidente de trânsito", + V29: "Motociclista traumatizado em outros acidentes de transporte e em acidentes de transporte não especificados", + V290: "Condutor traumatizado em colisão com outros veículos e com veículos não especificados, a motor, em um acidente não-de-trânsito", + V291: "Passageiro traumatizado em colisão com outros veículos com veículos não especificados, a motor, em um acidente não-de-trânsito", + V292: "Motociclista não especificado traumatizado em colisão com outros veículos e com veículos não especificados, a motor, em um acidente não-de-trânsito", + V293: "Motociclista [qualquer] traumatizado em um acidente não especificado, não-de-trânsito", + V294: "Condutor traumatizado em colisão com outros veículos e com veículos não especificados, a motor, em um acidente de trânsito", + V295: "Passageiro traumatizado em colisão com outros veículos e com veículos não especificados, a motor, em um acidente de trânsito", + V296: "Motociclista não especificado traumatizado em colisão com outros veículos e com veículos não especificados, a motor em um acidente de trânsito", + V298: "Motociclista [qualquer] traumatizado em outros acidentes de transporte especificados", + V299: "Motociclista [qualquer] traumatizado em um acidente de trânsito não especificado", + V30: "Ocupante de um triciclo motorizado traumatizado em colisão com um pedestre ou um animal", + V300: "Ocupante de um triciclo motorizado traumatizado em colisão com um pedestre ou um animal - condutor traumatizado em acidente não-de-trânsito", + V301: "Ocupante de um triciclo motorizado traumatizado em colisão com um pedestre ou um animal - passageiro traumatizado em acidente não-de-trânsito", + V302: "Ocupante de um triciclo motorizado traumatizado em colisão com um pedestre ou um animal - pessoa viajando no exterior do veículo traumatizada em um acidente não-de-trânsito", + V303: "Ocupante de um triciclo motorizado traumatizado em colisão com um pedestre ou um animal - ocupante não especificado de um triciclo motorizado traumatizado em acidente não-de-trânsito", + V304: "Ocupante de um triciclo motorizado traumatizado em colisão com um pedestre ou um animal - pessoa traumatizada ao subir ou descer do veículo", + V305: "Ocupante de um triciclo motorizado traumatizado em colisão com um pedestre ou um animal - condutor traumatizado em um acidente de trânsito", + V306: "Ocupante de um triciclo motorizado traumatizado em colisão com um pedestre ou um animal - passageiro traumatizado em um acidente de trânsito", + V307: "Ocupante de um triciclo motorizado traumatizado em colisão com um pedestre ou um animal - pessoa viajando no exterior do veículo traumatizada em um acidente de trânsito", + V309: "Ocupante de um triciclo motorizado traumatizado em colisão com um pedestre ou um animal - ocupante não especificado de um triciclo motorizado traumatizado em um acidente de trânsito", + V31: "Ocupante de um triciclo motorizado traumatizado em colisão com um veículo a pedal", + V310: "Ocupante de um triciclo motorizado traumatizado em colisão com um veículo a pedal - condutor traumatizado em acidente não-de-trânsito", + V311: "Ocupante de um triciclo motorizado traumatizado em colisão com um veículo a pedal - passageiro traumatizado em acidente não-de-trânsito", + V312: "Ocupante de um triciclo motorizado traumatizado em colisão com um veículo a pedal - pessoa viajando no exterior do veículo traumatizada em um acidente não-de-trânsito", + V313: "Ocupante de um triciclo motorizado traumatizado em colisão com um veículo a pedal - ocupante não especificado de um triciclo motorizado traumatizado em acidente não-de-trânsito", + V314: "Ocupante de um triciclo motorizado traumatizado em colisão com um veículo a pedal - pessoa traumatizada ao subir ou descer do veículo", + V315: "Ocupante de um triciclo motorizado traumatizado em colisão com um veículo a pedal - condutor traumatizado em um acidente de trânsito", + V316: "Ocupante de um triciclo motorizado traumatizado em colisão com um veículo a pedal - passageiro traumatizado em um acidente de trânsito", + V317: "Ocupante de um triciclo motorizado traumatizado em colisão com um veículo a pedal - pessoa viajando no exterior do veículo traumatizada em um acidente de trânsito", + V319: "Ocupante de um triciclo motorizado traumatizado em colisão com um veículo a pedal - ocupante não especificado de um triciclo motorizado traumatizado em um acidente de trânsito", + V32: "Ocupante de um triciclo motorizado traumatizado em colisão com outro veículo a motor de duas ou três rodas", + V320: "Ocupante de um triciclo motorizado traumatizado em colisão com outro veículo a motor de duas ou três rodas - condutor traumatizado em acidente não-de-trânsito", + V321: "Ocupante de um triciclo motorizado traumatizado em colisão com outro veículo a motor de duas ou três rodas - passageiro traumatizado em acidente não-de-trânsito", + V322: "Ocupante de um triciclo motorizado traumatizado em colisão com outro veículo a motor de duas ou três rodas - pessoa viajando no exterior do veículo traumatizada em um acidente não-de-trânsito", + V323: "Ocupante de um triciclo motorizado traumatizado em colisão com outro veículo a motor de duas ou três rodas - ocupante não especificado de um triciclo motorizado traumatizado em acidente não-de-trânsito", + V324: "Ocupante de um triciclo motorizado traumatizado em colisão com outro veículo a motor de duas ou três rodas - pessoa traumatizada ao subir ou descer do veículo", + V325: "Ocupante de um triciclo motorizado traumatizado em colisão com outro veículo a motor de duas ou três rodas - condutor traumatizado em um acidente de trânsito", + V326: "Ocupante de um triciclo motorizado traumatizado em colisão com outro veículo a motor de duas ou três rodas - passageiro traumatizado em um acidente de trânsito", + V327: "Ocupante de um triciclo motorizado traumatizado em colisão com outro veículo a motor de duas ou três rodas - pessoa viajando no exterior do veículo traumatizada em um acidente de trânsito", + V329: "Ocupante de um triciclo motorizado traumatizado em colisão com outro veículo a motor de duas ou três rodas - ocupante não especificado de um triciclo motorizado traumatizado em um acidente de trânsito", + V33: 'Ocupante de um triciclo motorizado traumatizado em colisão com um automóvel, "pick up" ou caminhonete', + V330: 'Ocupante de um triciclo motorizado traumatizado em colisão com um automóvel, "pick up" ou caminhonete - condutor traumatizado em acidente não-de-trânsito', + V331: 'Ocupante de um triciclo motorizado traumatizado em colisão com um automóvel, "pick up" ou caminhonete - passageiro traumatizado em acidente não-de-trânsito', + V332: 'Ocupante de um triciclo motorizado traumatizado em colisão com um automóvel, "pick up" ou caminhonete - pessoa viajando no exterior do veículo traumatizada em um acidente não-de-trânsito', + V333: 'Ocupante de um triciclo motorizado traumatizado em colisão com um automóvel, "pick up" ou caminhonete - ocupante não especificado de um triciclo motorizado traumatizado em acidente não-de-trânsito', + V334: 'Ocupante de um triciclo motorizado traumatizado em colisão com um automóvel, "pick up" ou caminhonete - pessoa traumatizada ao subir ou descer do veículo', + V335: 'Ocupante de um triciclo motorizado traumatizado em colisão com um automóvel, "pick up" ou caminhonete - condutor traumatizado em um acidente de trânsito', + V336: 'Ocupante de um triciclo motorizado traumatizado em colisão com um automóvel, "pick up" ou caminhonete - passageiro traumatizado em um acidente de trânsito', + V337: 'Ocupante de um triciclo motorizado traumatizado em colisão com um automóvel, "pick up" ou caminhonete - pessoa viajando no exterior do veículo traumatizada em um acidente de trânsito', + V339: 'Ocupante de um triciclo motorizado traumatizado em colisão com um automóvel, "pick up" ou caminhonete - ocupante não especificado de um triciclo motorizado traumatizado em um acidente de trânsito', + V34: "Ocupante de um triciclo motorizado traumatizado em colisão com um veículo de transporte pesado ou um ônibus", + V340: "Ocupante de um triciclo motorizado traumatizado em colisão com um veículo de transporte pesado ou um ônibus - condutor traumatizado em acidente não-de-trânsito", + V341: "Ocupante de um triciclo motorizado traumatizado em colisão com um veículo de transporte pesado ou um ônibus - passageiro traumatizado em acidente não-de-trânsito", + V342: "Ocupante de um triciclo motorizado traumatizado em colisão com um veículo de transporte pesado ou um ônibus - pessoa viajando no exterior do veículo traumatizada em um acidente não-de-trânsito", + V343: "Ocupante de um triciclo motorizado traumatizado em colisão com um veículo de transporte pesado ou um ônibus - ocupante não especificado de um triciclo motorizado traumatizado em acidente não-de-trânsito", + V344: "Ocupante de um triciclo motorizado traumatizado em colisão com um veículo de transporte pesado ou um ônibus - pessoa traumatizada ao subir ou descer do veículo", + V345: "Ocupante de um triciclo motorizado traumatizado em colisão com um veículo de transporte pesado ou um ônibus - condutor traumatizado em um acidente de trânsito", + V346: "Ocupante de um triciclo motorizado traumatizado em colisão com um veículo de transporte pesado ou um ônibus - passageiro traumatizado em um acidente de trânsito", + V347: "Ocupante de um triciclo motorizado traumatizado em colisão com um veículo de transporte pesado ou um ônibus - pessoa viajando no exterior do veículo traumatizada em um acidente de trânsito", + V349: "Ocupante de um triciclo motorizado traumatizado em colisão com um veículo de transporte pesado ou um ônibus - ocupante não especificado de um triciclo motorizado traumatizado em um acidente de trânsito", + V35: "Ocupante de um triciclo motorizado traumatizado em colisão com um trem [comboio] ou um veículo ferroviário", + V350: "Ocupante de um triciclo motorizado traumatizado em colisão com um trem [comboio] ou um veículo ferroviário - condutor traumatizado em acidente não-de-trânsito", + V351: "Ocupante de um triciclo motorizado traumatizado em colisão com um trem [comboio] ou um veículo ferroviário - passageiro traumatizado em acidente não-de-trânsito", + V352: "Ocupante de um triciclo motorizado traumatizado em colisão com um trem [comboio] ou um veículo ferroviário - pessoa viajando no exterior do veículo traumatizada em um acidente não-de-trânsito", + V353: "Ocupante de um triciclo motorizado traumatizado em colisão com um trem [comboio] ou um veículo ferroviário - ocupante não especificado de um triciclo motorizado traumatizado em acidente não-de-trânsito", + V354: "Ocupante de um triciclo motorizado traumatizado em colisão com um trem [comboio] ou um veículo ferroviário - pessoa traumatizada ao subir ou descer do veículo", + V355: "Ocupante de um triciclo motorizado traumatizado em colisão com um trem [comboio] ou um veículo ferroviário - condutor traumatizado em um acidente de trânsito", + V356: "Ocupante de um triciclo motorizado traumatizado em colisão com um trem [comboio] ou um veículo ferroviário - passageiro traumatizado em um acidente de trânsito", + V357: "Ocupante de um triciclo motorizado traumatizado em colisão com um trem [comboio] ou um veículo ferroviário - pessoa viajando no exterior do veículo traumatizada em um acidente de trânsito", + V359: "Ocupante de um triciclo motorizado traumatizado em colisão com um trem [comboio] ou um veículo ferroviário - ocupante não especificado de um triciclo motorizado traumatizado em um acidente de trânsito", + V36: "Ocupante de um triciclo motorizado traumatizado em colisão com outro veículo não-motorizado", + V360: "Ocupante de um triciclo motorizado traumatizado em colisão com outro veículo não-motorizado - condutor traumatizado em acidente não-de-trânsito", + V361: "Ocupante de um triciclo motorizado traumatizado em colisão com outro veículo não-motorizado - passageiro traumatizado em acidente não-de-trânsito", + V362: "Ocupante de um triciclo motorizado traumatizado em colisão com outro veículo não-motorizado - pessoa viajando no exterior do veículo traumatizada em um acidente não-de-trânsito", + V363: "Ocupante de um triciclo motorizado traumatizado em colisão com outro veículo não-motorizado - ocupante não especificado de um triciclo motorizado traumatizado em acidente não-de-trânsito", + V364: "Ocupante de um triciclo motorizado traumatizado em colisão com outro veículo não-motorizado - pessoa traumatizada ao subir ou descer do veículo", + V365: "Ocupante de um triciclo motorizado traumatizado em colisão com outro veículo não-motorizado - condutor traumatizado em um acidente de trânsito", + V366: "Ocupante de um triciclo motorizado traumatizado em colisão com outro veículo não-motorizado - passageiro traumatizado em um acidente de trânsito", + V367: "Ocupante de um triciclo motorizado traumatizado em colisão com outro veículo não-motorizado - pessoa viajando no exterior do veículo traumatizada em um acidente de trânsito", + V369: "Ocupante de um triciclo motorizado traumatizado em colisão com outro veículo não-motorizado - ocupante não especificado de um triciclo motorizado traumatizado em um acidente de trânsito", + V37: "Ocupante de um triciclo motorizado traumatizado em colisão com um objeto fixo ou parado", + V370: "Ocupante de um triciclo motorizado traumatizado em colisão com um objeto fixo ou parado - condutor traumatizado em acidente não-de-trânsito", + V371: "Ocupante de um triciclo motorizado traumatizado em colisão com um objeto fixo ou parado - passageiro traumatizado em acidente não-de-trânsito", + V372: "Ocupante de um triciclo motorizado traumatizado em colisão com um objeto fixo ou parado - pessoa viajando no exterior do veículo traumatizada em um acidente não-de-trânsito", + V373: "Ocupante de um triciclo motorizado traumatizado em colisão com um objeto fixo ou parado - ocupante não especificado de um triciclo motorizado traumatizado em acidente não-de-trânsito", + V374: "Ocupante de um triciclo motorizado traumatizado em colisão com um objeto fixo ou parado - pessoa traumatizada ao subir ou descer do veículo", + V375: "Ocupante de um triciclo motorizado traumatizado em colisão com um objeto fixo ou parado - condutor traumatizado em um acidente de trânsito", + V376: "Ocupante de um triciclo motorizado traumatizado em colisão com um objeto fixo ou parado - passageiro traumatizado em um acidente de trânsito", + V377: "Ocupante de um triciclo motorizado traumatizado em colisão com um objeto fixo ou parado - pessoa viajando no exterior do veículo traumatizada em um acidente de trânsito", + V379: "Ocupante de um triciclo motorizado traumatizado em colisão com um objeto fixo ou parado - ocupante não especificado de um triciclo motorizado traumatizado em um acidente de trânsito", + V38: "Ocupante de um triciclo motorizado traumatizado em um acidente de transporte sem colisão", + V380: "Ocupante de um triciclo motorizado traumatizado em um acidente de transporte sem colisão - condutor traumatizado em acidente não-de-trânsito", + V381: "Ocupante de um triciclo motorizado traumatizado em um acidente de transporte sem colisão - passageiro traumatizado em acidente não-de-trânsito", + V382: "Ocupante de um triciclo motorizado traumatizado em um acidente de transporte sem colisão - pessoa viajando no exterior do veículo traumatizada em um acidente não-de-trânsito", + V383: "Ocupante de um triciclo motorizado traumatizado em um acidente de transporte sem colisão - ocupante não especificado de um triciclo motorizado traumatizado em acidente não-de-trânsito", + V384: "Ocupante de um triciclo motorizado traumatizado em um acidente de transporte sem colisão - pessoa traumatizada ao subir ou descer do veículo", + V385: "Ocupante de um triciclo motorizado traumatizado em um acidente de transporte sem colisão - condutor traumatizado em um acidente de trânsito", + V386: "Ocupante de um triciclo motorizado traumatizado em um acidente de transporte sem colisão - passageiro traumatizado em um acidente de trânsito", + V387: "Ocupante de um triciclo motorizado traumatizado em um acidente de transporte sem colisão - pessoa viajando no exterior do veículo traumatizada em um acidente de trânsito", + V389: "Ocupante de um triciclo motorizado traumatizado em um acidente de transporte sem colisão - ocupante não especificado de um triciclo motorizado traumatizado em um acidente de trânsito", + V39: "Ocupante de um triciclo motorizado traumatizado em outros acidentes de transporte e em acidentes de transporte não especificados", + V390: "Condutor traumatizado em colisão com outros veículos e com veículos não especificados, a motor, em um acidente não-de-trânsito", + V391: "Passageiro traumatizado em colisão com outros veículos e com veículos não especificados, a motor, em um acidente não-de-trânsito", + V392: "Ocupante não especificado de um triciclo motorizado traumatizado em colisão com outros veículos e com veículos não especificados, a motor, em um acidente não-de-trânsito", + V393: "Ocupante [qualquer] de um triciclo motorizado traumatizado em um acidente não especificado e não-de-trânsito", + V394: "Condutor traumatizado em colisão com outros veículos e com veículos não especificados, a motor, em um acidente de trânsito", + V395: "Passageiro traumatizado em colisão outros veículos e com veículos não especificados, a motor, em um acidente de trânsito", + V396: "Ocupante não especificado de um triciclo motorizado traumatizado em colisão com outros veículos e com veículos não especificados, a motor, em um acidente de trânsito", + V398: "Ocupante [qualquer] de um triciclo motorizado traumatizado em outros acidentes de trânsito especificados", + V399: "Ocupante [qualquer] de um triciclo motorizado, traumatizado em acidente de trânsito não especificado", + V40: "Ocupante de um automóvel [carro] traumatizado em colisão com um pedestre ou um animal", + V400: "Ocupante de um automóvel [carro] traumatizado em colisão com um pedestre ou um animal - condutor [motorista] traumatizado em um acidente não-de-trânsito", + V401: "Ocupante de um automóvel [carro] traumatizado em colisão com um pedestre ou um animal - passageiro traumatizado em um acidente não-de-trânsito", + V402: "Ocupante de um automóvel [carro] traumatizado em colisão com um pedestre ou um animal - pessoa viajando no exterior do veículo traumatizada em um acidente não-de-trânsito", + V403: "Ocupante de um automóvel [carro] traumatizado em colisão com um pedestre ou um animal - ocupante não especificado de um automóvel [carro] traumatizado em um acidente não-de-trânsito", + V404: "Ocupante de um automóvel [carro] traumatizado em colisão com um pedestre ou um animal - pessoa traumatizada ao subir ou descer do veículo", + V405: "Ocupante de um automóvel [carro] traumatizado em colisão com um pedestre ou um animal - condutor [motorista] traumatizado em um acidente de trânsito", + V406: "Ocupante de um automóvel [carro] traumatizado em colisão com um pedestre ou um animal - passageiro traumatizado em um acidente de trânsito", + V407: "Ocupante de um automóvel [carro] traumatizado em colisão com um pedestre ou um animal - pessoa viajando no exterior do veículo traumatizada em um acidente de trânsito", + V409: "Ocupante de um automóvel [carro] traumatizado em colisão com um pedestre ou um animal - ocupante não especificado de um automóvel [carro] traumatizado em um acidente de trânsito", + V41: "Ocupante de um automóvel [carro] traumatizado em colisão com um veículo a pedal", + V410: "Ocupante de um automóvel [carro] traumatizado em colisão com um veículo a pedal - condutor [motorista] traumatizado em um acidente não-de-trânsito", + V411: "Ocupante de um automóvel [carro] traumatizado em colisão com um veículo a pedal - passageiro traumatizado em um acidente não-de-trânsito", + V412: "Ocupante de um automóvel [carro] traumatizado em colisão com um veículo a pedal - pessoa viajando no exterior do veículo traumatizada em um acidente não-de-trânsito", + V413: "Ocupante de um automóvel [carro] traumatizado em colisão com um veículo a pedal - ocupante não especificado de um automóvel [carro] traumatizado em um acidente não-de-trânsito", + V414: "Ocupante de um automóvel [carro] traumatizado em colisão com um veículo a pedal - pessoa traumatizada ao subir ou descer do veículo", + V415: "Ocupante de um automóvel [carro] traumatizado em colisão com um veículo a pedal - condutor [motorista] traumatizado em um acidente de trânsito", + V416: "Ocupante de um automóvel [carro] traumatizado em colisão com um veículo a pedal - passageiro traumatizado em um acidente de trânsito", + V417: "Ocupante de um automóvel [carro] traumatizado em colisão com um veículo a pedal - pessoa viajando no exterior do veículo traumatizada em um acidente de trânsito", + V419: "Ocupante de um automóvel [carro] traumatizado em colisão com um veículo a pedal - ocupante não especificado de um automóvel [carro] traumatizado em um acidente de trânsito", + V42: "Ocupante de um automóvel [carro] traumatizado em colisão com outro veículo a motor de duas ou três rodas", + V420: "Ocupante de um automóvel [carro] traumatizado em colisão com outro veículo a motor de duas ou três rodas - condutor [motorista] traumatizado em um acidente não-de-trânsito", + V421: "Ocupante de um automóvel [carro] traumatizado em colisão com outro veículo a motor de duas ou três rodas - passageiro traumatizado em um acidente não-de-trânsito", + V422: "Ocupante de um automóvel [carro] traumatizado em colisão com outro veículo a motor de duas ou três rodas - pessoa viajando no exterior do veículo traumatizada em um acidente não-de-trânsito", + V423: "Ocupante de um automóvel [carro] traumatizado em colisão com outro veículo a motor de duas ou três rodas - ocupante não especificado de um automóvel [carro] traumatizado em um acidente não-de-trânsito", + V424: "Ocupante de um automóvel [carro] traumatizado em colisão com outro veículo a motor de duas ou três rodas - pessoa traumatizada ao subir ou descer do veículo", + V425: "Ocupante de um automóvel [carro] traumatizado em colisão com outro veículo a motor de duas ou três rodas - condutor [motorista] traumatizado em um acidente de trânsito", + V426: "Ocupante de um automóvel [carro] traumatizado em colisão com outro veículo a motor de duas ou três rodas - passageiro traumatizado em um acidente de trânsito", + V427: "Ocupante de um automóvel [carro] traumatizado em colisão com outro veículo a motor de duas ou três rodas - pessoa viajando no exterior do veículo traumatizada em um acidente de trânsito", + V429: "Ocupante de um automóvel [carro] traumatizado em colisão com outro veículo a motor de duas ou três rodas - ocupante não especificado de um automóvel [carro] traumatizado em um acidente de trânsito", + V43: 'Ocupante de um automóvel [carro] traumatizado em colisão com um automóvel [carro], "pick up" ou caminhonete', + V430: 'Ocupante de um automóvel [carro] traumatizado em colisão com um automóvel [carro], "pick up" ou caminhonete - condutor [motorista] traumatizado em um acidente não-de-trânsito', + V431: 'Ocupante de um automóvel [carro] traumatizado em colisão com um automóvel [carro], "pick up" ou caminhonete - passageiro traumatizado em um acidente não-de-trânsito', + V432: 'Ocupante de um automóvel [carro] traumatizado em colisão com um automóvel [carro], "pick up" ou caminhonete - pessoa viajando no exterior do veículo traumatizada em um acidente não-de-trânsito', + V433: 'Ocupante de um automóvel [carro] traumatizado em colisão com um automóvel [carro], "pick up" ou caminhonete - ocupante não especificado de um automóvel [carro] traumatizado em um acidente não-de-trânsito', + V434: 'Ocupante de um automóvel [carro] traumatizado em colisão com um automóvel [carro], "pick up" ou caminhonete - pessoa traumatizada ao subir ou descer do veículo', + V435: 'Ocupante de um automóvel [carro] traumatizado em colisão com um automóvel [carro], "pick up" ou caminhonete - condutor [motorista] traumatizado em um acidente de trânsito', + V436: 'Ocupante de um automóvel [carro] traumatizado em colisão com um automóvel [carro], "pick up" ou caminhonete - passageiro traumatizado em um acidente de trânsito', + V437: 'Ocupante de um automóvel [carro] traumatizado em colisão com um automóvel [carro], "pick up" ou caminhonete - pessoa viajando no exterior do veículo traumatizada em um acidente de trânsito', + V439: 'Ocupante de um automóvel [carro] traumatizado em colisão com um automóvel [carro], "pick up" ou caminhonete - ocupante não especificado de um automóvel [carro] traumatizado em um acidente de trânsito', + V44: "Ocupante de um automóvel [carro] traumatizado em colisão com um veículo de transporte pesado ou um ônibus", + V440: "Ocupante de um automóvel [carro] traumatizado em colisão com um veículo de transporte pesado ou um ônibus - condutor [motorista] traumatizado em um acidente não-de-trânsito", + V441: "Ocupante de um automóvel [carro] traumatizado em colisão com um veículo de transporte pesado ou um ônibus - passageiro traumatizado em um acidente não-de-trânsito", + V442: "Ocupante de um automóvel [carro] traumatizado em colisão com um veículo de transporte pesado ou um ônibus - pessoa viajando no exterior do veículo traumatizada em um acidente não-de-trânsito", + V443: "Ocupante de um automóvel [carro] traumatizado em colisão com um veículo de transporte pesado ou um ônibus - ocupante não especificado de um automóvel [carro] traumatizado em um acidente não-de-trânsito", + V444: "Ocupante de um automóvel [carro] traumatizado em colisão com um veículo de transporte pesado ou um ônibus - pessoa traumatizada ao subir ou descer do veículo", + V445: "Ocupante de um automóvel [carro] traumatizado em colisão com um veículo de transporte pesado ou um ônibus - condutor [motorista] traumatizado em um acidente de trânsito", + V446: "Ocupante de um automóvel [carro] traumatizado em colisão com um veículo de transporte pesado ou um ônibus - passageiro traumatizado em um acidente de trânsito", + V447: "Ocupante de um automóvel [carro] traumatizado em colisão com um veículo de transporte pesado ou um ônibus - pessoa viajando no exterior do veículo traumatizada em um acidente de trânsito", + V449: "Ocupante de um automóvel [carro] traumatizado em colisão com um veículo de transporte pesado ou um ônibus - ocupante não especificado de um automóvel [carro] traumatizado em um acidente de trânsito", + V45: "Ocupante de um automóvel [carro] traumatizado em colisão com um trem [comboio] ou um veículo ferroviário", + V450: "Ocupante de um automóvel [carro] traumatizado em colisão com um trem [comboio] ou um veículo ferroviário - condutor [motorista] traumatizado em um acidente não-de-trânsito", + V451: "Ocupante de um automóvel [carro] traumatizado em colisão com um trem [comboio] ou um veículo ferroviário - passageiro traumatizado em um acidente não-de-trânsito", + V452: "Ocupante de um automóvel [carro] traumatizado em colisão com um trem [comboio] ou um veículo ferroviário - pessoa viajando no exterior do veículo traumatizada em um acidente não-de-trânsito", + V453: "Ocupante de um automóvel [carro] traumatizado em colisão com um trem [comboio] ou um veículo ferroviário - ocupante não especificado de um automóvel [carro] traumatizado em um acidente não-de-trânsito", + V454: "Ocupante de um automóvel [carro] traumatizado em colisão com um trem [comboio] ou um veículo ferroviário - pessoa traumatizada ao subir ou descer do veículo", + V455: "Ocupante de um automóvel [carro] traumatizado em colisão com um trem [comboio] ou um veículo ferroviário - condutor [motorista] traumatizado em um acidente de trânsito", + V456: "Ocupante de um automóvel [carro] traumatizado em colisão com um trem [comboio] ou um veículo ferroviário - passageiro traumatizado em um acidente de trânsito", + V457: "Ocupante de um automóvel [carro] traumatizado em colisão com um trem [comboio] ou um veículo ferroviário - pessoa viajando no exterior do veículo traumatizada em um acidente de trânsito", + V459: "Ocupante de um automóvel [carro] traumatizado em colisão com um trem [comboio] ou um veículo ferroviário - ocupante não especificado de um automóvel [carro] traumatizado em um acidente de trânsito", + V46: "Ocupante de um automóvel [carro] traumatizado em colisão com outro veículo não-motorizado", + V460: "Ocupante de um automóvel [carro] traumatizado em colisão com outro veículo não-motorizado - condutor [motorista] traumatizado em um acidente não-de-trânsito", + V461: "Ocupante de um automóvel [carro] traumatizado em colisão com outro veículo não-motorizado - passageiro traumatizado em um acidente não-de-trânsito", + V462: "Ocupante de um automóvel [carro] traumatizado em colisão com outro veículo não-motorizado - pessoa viajando no exterior do veículo traumatizada em um acidente não-de-trânsito", + V463: "Ocupante de um automóvel [carro] traumatizado em colisão com outro veículo não-motorizado - ocupante não especificado de um automóvel [carro] traumatizado em um acidente não-de-trânsito", + V464: "Ocupante de um automóvel [carro] traumatizado em colisão com outro veículo não-motorizado - pessoa traumatizada ao subir ou descer do veículo", + V465: "Ocupante de um automóvel [carro] traumatizado em colisão com outro veículo não-motorizado - condutor [motorista] traumatizado em um acidente de trânsito", + V466: "Ocupante de um automóvel [carro] traumatizado em colisão com outro veículo não-motorizado - passageiro traumatizado em um acidente de trânsito", + V467: "Ocupante de um automóvel [carro] traumatizado em colisão com outro veículo não-motorizado - pessoa viajando no exterior do veículo traumatizada em um acidente de trânsito", + V469: "Ocupante de um automóvel [carro] traumatizado em colisão com outro veículo não-motorizado - ocupante não especificado de um automóvel [carro] traumatizado em um acidente de trânsito", + V47: "Ocupante de um automóvel [carro] traumatizado em colisão com um objeto fixo ou parado", + V470: "Ocupante de um automóvel [carro] traumatizado em colisão com um objeto fixo ou parado - condutor [motorista] traumatizado em um acidente não-de-trânsito", + V471: "Ocupante de um automóvel [carro] traumatizado em colisão com um objeto fixo ou parado - passageiro traumatizado em um acidente não-de-trânsito", + V472: "Ocupante de um automóvel [carro] traumatizado em colisão com um objeto fixo ou parado - pessoa viajando no exterior do veículo traumatizada em um acidente não-de-trânsito", + V473: "Ocupante de um automóvel [carro] traumatizado em colisão com um objeto fixo ou parado - ocupante não especificado de um automóvel [carro] traumatizado em um acidente não-de-trânsito", + V474: "Ocupante de um automóvel [carro] traumatizado em colisão com um objeto fixo ou parado - pessoa traumatizada ao subir ou descer do veículo", + V475: "Ocupante de um automóvel [carro] traumatizado em colisão com um objeto fixo ou parado - condutor [motorista] traumatizado em um acidente de trânsito", + V476: "Ocupante de um automóvel [carro] traumatizado em colisão com um objeto fixo ou parado - passageiro traumatizado em um acidente de trânsito", + V477: "Ocupante de um automóvel [carro] traumatizado em colisão com um objeto fixo ou parado - pessoa viajando no exterior do veículo traumatizada em um acidente de trânsito", + V479: "Ocupante de um automóvel [carro] traumatizado em colisão com um objeto fixo ou parado - ocupante não especificado de um automóvel [carro] traumatizado em um acidente de trânsito", + V48: "Ocupante de um automóvel [carro] traumatizado em um acidente de transporte sem colisão", + V480: "Ocupante de um automóvel [carro] traumatizado em um acidente de transporte sem colisão - condutor [motorista] traumatizado em um acidente não-de-trânsito", + V481: "Ocupante de um automóvel [carro] traumatizado em um acidente de transporte sem colisão - passageiro traumatizado em um acidente não-de-trânsito", + V482: "Ocupante de um automóvel [carro] traumatizado em um acidente de transporte sem colisão - pessoa viajando no exterior do veículo traumatizada em um acidente não-de-trânsito", + V483: "Ocupante de um automóvel [carro] traumatizado em um acidente de transporte sem colisão - ocupante não especificado de um automóvel [carro] traumatizado em um acidente não-de-trânsito", + V484: "Ocupante de um automóvel [carro] traumatizado em um acidente de transporte sem colisão - pessoa traumatizada ao subir ou descer do veículo", + V485: "Ocupante de um automóvel [carro] traumatizado em um acidente de transporte sem colisão - condutor [motorista] traumatizado em um acidente de trânsito", + V486: "Ocupante de um automóvel [carro] traumatizado em um acidente de transporte sem colisão - passageiro traumatizado em um acidente de trânsito", + V487: "Ocupante de um automóvel [carro] traumatizado em um acidente de transporte sem colisão - pessoa viajando no exterior do veículo traumatizada em um acidente de trânsito", + V489: "Ocupante de um automóvel [carro] traumatizado em um acidente de transporte sem colisão - ocupante não especificado de um automóvel [carro] traumatizado em um acidente de trânsito", + V49: "Ocupante de um automóvel [carro] traumatizado em outro acidentes de transporte e em acidentes de transporte não especificados", + V490: "Condutor [motorista] traumatizado em colisão com outros veículos e com veículos não especificados, a motor em um acidente não-de-trânsito", + V491: "Passageiro traumatizado em colisão com outros veículos e com veículos não especificados, a motor, em um acidente não-de-trânsito", + V492: "Ocupante não especificado de um automóvel [carro] traumatizado em colisão com outros veículos e com veículos não especificados, a motor, em um acidente não-de-trânsito", + V493: "Ocupante [qualquer] de um automóvel [carro] traumatizado em um acidente não especificado e não-de-trânsito", + V494: "Condutor [motorista] traumatizado em colisão com outros veículos e com veículos não especificados, a motor, em um acidente de trânsito", + V495: "Passageiro traumatizado em colisão com outros veículos e com veículos não especificados, a motor, em um acidente de trânsito", + V496: "Ocupante não especificado de um automóvel [carro] traumatizado em colisão com outros veículos e com veículos não especificados, a motor, em um acidente de trânsito", + V498: "Ocupante [qualquer] de um automóvel [carro] traumatizado em outros acidentes de transporte especificados", + V499: "Ocupante [qualquer] de um automóvel [carro], traumatizado em um acidente de trânsito não especificado", + V50: "Ocupante de uma caminhonete traumatizado em colisão com um pedestre ou um animal", + V500: "Ocupante de uma caminhonete traumatizado em colisão com um pedestre ou um animal - condutor [motorista] traumatizado em um acidente não-de-trânsito", + V501: "Ocupante de uma caminhonete traumatizado em colisão com um pedestre ou um animal - passageiro traumatizado em um acidente não-de-trânsito", + V502: "Ocupante de uma caminhonete traumatizado em colisão com um pedestre ou um animal - pessoa viajando no exterior do veículo traumatizada em um acidente não-de-trânsito", + V503: "Ocupante de uma caminhonete traumatizado em colisão com um pedestre ou um animal - ocupante não especificado de uma caminhonete traumatizado em um acidente não-de-trânsito", + V504: "Ocupante de uma caminhonete traumatizado em colisão com um pedestre ou um animal - pessoa traumatizado ao subir ou descer do veículo", + V505: "Ocupante de uma caminhonete traumatizado em colisão com um pedestre ou um animal - condutor [motorista] traumatizado em um acidente de trânsito", + V506: "Ocupante de uma caminhonete traumatizado em colisão com um pedestre ou um animal - passageiro traumatizado em um acidente de trânsito", + V507: "Ocupante de uma caminhonete traumatizado em colisão com um pedestre ou um animal - pessoa viajando no exterior do veículo traumatizada em um acidente de trânsito", + V509: "Ocupante de uma caminhonete traumatizado em colisão com um pedestre ou um animal - ocupante não especificado de uma caminhonete traumatizado em um acidente de trânsito", + V51: "Ocupante de uma caminhonete traumatizado em colisão com um veículo a pedal", + V510: "Ocupante de uma caminhonete traumatizado em colisão com um veículo a pedal - condutor [motorista] traumatizado em um acidente não-de-trânsito", + V511: "Ocupante de uma caminhonete traumatizado em colisão com um veículo a pedal - passageiro traumatizado em um acidente não-de-trânsito", + V512: "Ocupante de uma caminhonete traumatizado em colisão com um veículo a pedal - pessoa viajando no exterior do veículo traumatizada em um acidente não-de-trânsito", + V513: "Ocupante de uma caminhonete traumatizado em colisão com um veículo a pedal - ocupante não especificado de uma caminhonete traumatizado em um acidente não-de-trânsito", + V514: "Ocupante de uma caminhonete traumatizado em colisão com um veículo a pedal - pessoa traumatizado ao subir ou descer do veículo", + V515: "Ocupante de uma caminhonete traumatizado em colisão com um veículo a pedal - condutor [motorista] traumatizado em um acidente de trânsito", + V516: "Ocupante de uma caminhonete traumatizado em colisão com um veículo a pedal - passageiro traumatizado em um acidente de trânsito", + V517: "Ocupante de uma caminhonete traumatizado em colisão com um veículo a pedal - pessoa viajando no exterior do veículo traumatizada em um acidente de trânsito", + V519: "Ocupante de uma caminhonete traumatizado em colisão com um veículo a pedal - ocupante não especificado de uma caminhonete traumatizado em um acidente de trânsito", + V52: "Ocupante de uma caminhonete traumatizado em colisão com veículo a motor de duas ou três rodas", + V520: "Ocupante de uma caminhonete traumatizado em colisão com veículo a motor de duas ou três rodas - condutor [motorista] traumatizado em um acidente não-de-trânsito", + V521: "Ocupante de uma caminhonete traumatizado em colisão com veículo a motor de duas ou três rodas - passageiro traumatizado em um acidente não-de-trânsito", + V522: "Ocupante de uma caminhonete traumatizado em colisão com veículo a motor de duas ou três rodas - pessoa viajando no exterior do veículo traumatizada em um acidente não-de-trânsito", + V523: "Ocupante de uma caminhonete traumatizado em colisão com veículo a motor de duas ou três rodas - ocupante não especificado de uma caminhonete traumatizado em um acidente não-de-trânsito", + V524: "Ocupante de uma caminhonete traumatizado em colisão com veículo a motor de duas ou três rodas - pessoa traumatizado ao subir ou descer do veículo", + V525: "Ocupante de uma caminhonete traumatizado em colisão com veículo a motor de duas ou três rodas - condutor [motorista] traumatizado em um acidente de trânsito", + V526: "Ocupante de uma caminhonete traumatizado em colisão com veículo a motor de duas ou três rodas - passageiro traumatizado em um acidente de trânsito", + V527: "Ocupante de uma caminhonete traumatizado em colisão com veículo a motor de duas ou três rodas - pessoa viajando no exterior do veículo traumatizada em um acidente de trânsito", + V529: "Ocupante de uma caminhonete traumatizado em colisão com veículo a motor de duas ou três rodas - ocupante não especificado de uma caminhonete traumatizado em um acidente de trânsito", + V53: "Ocupante de uma caminhonete traumatizado em colisão com um automóvel [carro] ou uma caminhonete", + V530: "Ocupante de uma caminhonete traumatizado em colisão com um automóvel [carro] ou uma caminhonete - condutor [motorista] traumatizado em um acidente não-de-trânsito", + V531: "Ocupante de uma caminhonete traumatizado em colisão com um automóvel [carro] ou uma caminhonete - passageiro traumatizado em um acidente não-de-trânsito", + V532: "Ocupante de uma caminhonete traumatizado em colisão com um automóvel [carro] ou uma caminhonete - pessoa viajando no exterior do veículo traumatizada em um acidente não-de-trânsito", + V533: "Ocupante de uma caminhonete traumatizado em colisão com um automóvel [carro] ou uma caminhonete - ocupante não especificado de uma caminhonete traumatizado em um acidente não-de-trânsito", + V534: "Ocupante de uma caminhonete traumatizado em colisão com um automóvel [carro] ou uma caminhonete - pessoa traumatizado ao subir ou descer do veículo", + V535: "Ocupante de uma caminhonete traumatizado em colisão com um automóvel [carro] ou uma caminhonete - condutor [motorista] traumatizado em um acidente de trânsito", + V536: "Ocupante de uma caminhonete traumatizado em colisão com um automóvel [carro] ou uma caminhonete - passageiro traumatizado em um acidente de trânsito", + V537: "Ocupante de uma caminhonete traumatizado em colisão com um automóvel [carro] ou uma caminhonete - pessoa viajando no exterior do veículo traumatizada em um acidente de trânsito", + V539: "Ocupante de uma caminhonete traumatizado em colisão com um automóvel [carro] ou uma caminhonete - ocupante não especificado de uma caminhonete traumatizado em um acidente de trânsito", + V54: "Ocupante de uma caminhonete traumatizado em colisão com um veículo de transporte pesado ou um ônibus", + V540: "Ocupante de uma caminhonete traumatizado em colisão com um veículo de transporte pesado ou um ônibus - condutor [motorista] traumatizado em um acidente não-de-trânsito", + V541: "Ocupante de uma caminhonete traumatizado em colisão com um veículo de transporte pesado ou um ônibus - passageiro traumatizado em um acidente não-de-trânsito", + V542: "Ocupante de uma caminhonete traumatizado em colisão com um veículo de transporte pesado ou um ônibus - pessoa viajando no exterior do veículo traumatizada em um acidente não-de-trânsito", + V543: "Ocupante de uma caminhonete traumatizado em colisão com um veículo de transporte pesado ou um ônibus - ocupante não especificado de uma caminhonete traumatizado em um acidente não-de-trânsito", + V544: "Ocupante de uma caminhonete traumatizado em colisão com um veículo de transporte pesado ou um ônibus - pessoa traumatizado ao subir ou descer do veículo", + V545: "Ocupante de uma caminhonete traumatizado em colisão com um veículo de transporte pesado ou um ônibus - condutor [motorista] traumatizado em um acidente de trânsito", + V546: "Ocupante de uma caminhonete traumatizado em colisão com um veículo de transporte pesado ou um ônibus - passageiro traumatizado em um acidente de trânsito", + V547: "Ocupante de uma caminhonete traumatizado em colisão com um veículo de transporte pesado ou um ônibus - pessoa viajando no exterior do veículo traumatizada em um acidente de trânsito", + V549: "Ocupante de uma caminhonete traumatizado em colisão com um veículo de transporte pesado ou um ônibus - ocupante não especificado de uma caminhonete traumatizado em um acidente de trânsito", + V55: "Ocupante de uma caminhonete traumatizado em colisão com um trem [comboio] ou veículo ferroviário", + V550: "Ocupante de uma caminhonete traumatizado em colisão com um trem [comboio] ou veículo ferroviário - condutor [motorista] traumatizado em um acidente não-de-trânsito", + V551: "Ocupante de uma caminhonete traumatizado em colisão com um trem [comboio] ou veículo ferroviário - passageiro traumatizado em um acidente não-de-trânsito", + V552: "Ocupante de uma caminhonete traumatizado em colisão com um trem [comboio] ou veículo ferroviário - pessoa viajando no exterior do veículo traumatizada em um acidente não-de-trânsito", + V553: "Ocupante de uma caminhonete traumatizado em colisão com um trem [comboio] ou veículo ferroviário - ocupante não especificado de uma caminhonete traumatizado em um acidente não-de-trânsito", + V554: "Ocupante de uma caminhonete traumatizado em colisão com um trem [comboio] ou veículo ferroviário - pessoa traumatizado ao subir ou descer do veículo", + V555: "Ocupante de uma caminhonete traumatizado em colisão com um trem [comboio] ou veículo ferroviário - condutor [motorista] traumatizado em um acidente de trânsito", + V556: "Ocupante de uma caminhonete traumatizado em colisão com um trem [comboio] ou veículo ferroviário - passageiro traumatizado em um acidente de trânsito", + V557: "Ocupante de uma caminhonete traumatizado em colisão com um trem [comboio] ou veículo ferroviário - pessoa viajando no exterior do veículo traumatizada em um acidente de trânsito", + V559: "Ocupante de uma caminhonete traumatizado em colisão com um trem [comboio] ou veículo ferroviário - ocupante não especificado de uma caminhonete traumatizado em um acidente de trânsito", + V56: "Ocupante de uma caminhonete traumatizado em colisão com outro veículo não-motorizado", + V560: "Ocupante de uma caminhonete traumatizado em colisão com outro veículo não-motorizado - condutor [motorista] traumatizado em um acidente não-de-trânsito", + V561: "Ocupante de uma caminhonete traumatizado em colisão com outro veículo não-motorizado - passageiro traumatizado em um acidente não-de-trânsito", + V562: "Ocupante de uma caminhonete traumatizado em colisão com outro veículo não-motorizado - pessoa viajando no exterior do veículo traumatizada em um acidente não-de-trânsito", + V563: "Ocupante de uma caminhonete traumatizado em colisão com outro veículo não-motorizado - ocupante não especificado de uma caminhonete traumatizado em um acidente não-de-trânsito", + V564: "Ocupante de uma caminhonete traumatizado em colisão com outro veículo não-motorizado - pessoa traumatizado ao subir ou descer do veículo", + V565: "Ocupante de uma caminhonete traumatizado em colisão com outro veículo não-motorizado - condutor [motorista] traumatizado em um acidente de trânsito", + V566: "Ocupante de uma caminhonete traumatizado em colisão com outro veículo não-motorizado - passageiro traumatizado em um acidente de trânsito", + V567: "Ocupante de uma caminhonete traumatizado em colisão com outro veículo não-motorizado - pessoa viajando no exterior do veículo traumatizada em um acidente de trânsito", + V569: "Ocupante de uma caminhonete traumatizado em colisão com outro veículo não-motorizado - ocupante não especificado de uma caminhonete traumatizado em um acidente de trânsito", + V57: "Ocupante de uma caminhonete traumatizado em colisão com um objeto fixo ou parado", + V570: "Ocupante de uma caminhonete traumatizado em colisão com um objeto fixo ou parado - condutor [motorista] traumatizado em um acidente não-de-trânsito", + V571: "Ocupante de uma caminhonete traumatizado em colisão com um objeto fixo ou parado - passageiro traumatizado em um acidente não-de-trânsito", + V572: "Ocupante de uma caminhonete traumatizado em colisão com um objeto fixo ou parado - pessoa viajando no exterior do veículo traumatizada em um acidente não-de-trânsito", + V573: "Ocupante de uma caminhonete traumatizado em colisão com um objeto fixo ou parado - ocupante não especificado de uma caminhonete traumatizado em um acidente não-de-trânsito", + V574: "Ocupante de uma caminhonete traumatizado em colisão com um objeto fixo ou parado - pessoa traumatizado ao subir ou descer do veículo", + V575: "Ocupante de uma caminhonete traumatizado em colisão com um objeto fixo ou parado - condutor [motorista] traumatizado em um acidente de trânsito", + V576: "Ocupante de uma caminhonete traumatizado em colisão com um objeto fixo ou parado - passageiro traumatizado em um acidente de trânsito", + V577: "Ocupante de uma caminhonete traumatizado em colisão com um objeto fixo ou parado - pessoa viajando no exterior do veículo traumatizada em um acidente de trânsito", + V579: "Ocupante de uma caminhonete traumatizado em colisão com um objeto fixo ou parado - ocupante não especificado de uma caminhonete traumatizado em um acidente de trânsito", + V58: "Ocupante de uma caminhonete traumatizado em um acidente de transporte sem colisão", + V580: "Ocupante de uma caminhonete traumatizado em um acidente de transporte sem colisão - condutor [motorista] traumatizado em um acidente não-de-trânsito", + V581: "Ocupante de uma caminhonete traumatizado em um acidente de transporte sem colisão - passageiro traumatizado em um acidente não-de-trânsito", + V582: "Ocupante de uma caminhonete traumatizado em um acidente de transporte sem colisão - pessoa viajando no exterior do veículo traumatizada em um acidente não-de-trânsito", + V583: "Ocupante de uma caminhonete traumatizado em um acidente de transporte sem colisão - ocupante não especificado de uma caminhonete traumatizado em um acidente não-de-trânsito", + V584: "Ocupante de uma caminhonete traumatizado em um acidente de transporte sem colisão - pessoa traumatizado ao subir ou descer do veículo", + V585: "Ocupante de uma caminhonete traumatizado em um acidente de transporte sem colisão - condutor [motorista] traumatizado em um acidente de trânsito", + V586: "Ocupante de uma caminhonete traumatizado em um acidente de transporte sem colisão - passageiro traumatizado em um acidente de trânsito", + V587: "Ocupante de uma caminhonete traumatizado em um acidente de transporte sem colisão - pessoa viajando no exterior do veículo traumatizada em um acidente de trânsito", + V589: "Ocupante de uma caminhonete traumatizado em um acidente de transporte sem colisão - ocupante não especificado de uma caminhonete traumatizado em um acidente de trânsito", + V59: "Ocupante de uma caminhonete traumatizado em outros acidentes de transporte e em acidentes de transporte não especificados", + V590: "Condutor [motorista] traumatizado em colisão com outros veículos e com veículos não especificados, a motor, em um acidente não-de-trânsito", + V591: "Passageiro traumatizado em colisão com outros veículos e com veículos não especificados, a motor, em um acidente não-de-trânsito", + V592: "Ocupante não especificado de uma caminhonete traumatizado em colisão com outros veículos e com veículos não especificados, a motor, em um acidente não-de-trânsito", + V593: "Ocupante [qualquer] de uma caminhonete traumatizado em um acidente não especificado e não-de-trânsito", + V594: "Condutor [motorista] traumatizado em colisão com outros veículos e com veículos não especificados, a motor, em um acidente de trânsito", + V595: "Passageiro de uma caminhonete traumatizado em colisão com outros veículos e com veículos não especificados, a motor, em um acidente de trânsito", + V596: "Ocupante não especificado de uma caminhonete traumatizado em colisão com outros veículos e com veículos não especificados, a motor, em um acidente de trânsito", + V598: "Ocupante [qualquer] de uma caminhonete traumatizado em outros acidentes de transporte especificados", + V599: "Ocupante [qualquer] de uma caminhonete traumatizado em um acidente de trânsito não especificado", + V60: "Ocupante de um veículo de transporte pesado traumatizado em colisão com um pedestre ou um animal", + V600: "Ocupante de um veículo de transporte pesado traumatizado em colisão com um pedestre ou um animal - condutor [motorista] traumatizado em um acidente não-de-trânsito", + V601: "Ocupante de um veículo de transporte pesado traumatizado em colisão com um pedestre ou um animal - passageiro traumatizado em um acidente não-de-trânsito", + V602: "Ocupante de um veículo de transporte pesado traumatizado em colisão com um pedestre ou um animal - pessoa viajando no exterior do veículo traumatizada em um acidente não-de-trânsito", + V603: "Ocupante de um veículo de transporte pesado traumatizado em colisão com um pedestre ou um animal - ocupante não especificado de um veículo de transporte pesado traumatizado em um acidente não-de-trânsito", + V604: "Ocupante de um veículo de transporte pesado traumatizado em colisão com um pedestre ou um animal - pessoa traumatizado ao subir ou descer do veículo", + V605: "Ocupante de um veículo de transporte pesado traumatizado em colisão com um pedestre ou um animal - condutor [motorista] traumatizado em um acidente de trânsito", + V606: "Ocupante de um veículo de transporte pesado traumatizado em colisão com um pedestre ou um animal - passageiro traumatizado em um acidente de trânsito", + V607: "Ocupante de um veículo de transporte pesado traumatizado em colisão com um pedestre ou um animal - pessoa viajando no exterior do veículo traumatizada em um acidente de trânsito", + V609: "Ocupante de um veículo de transporte pesado traumatizado em colisão com um pedestre ou um animal - ocupante não especificado de um veículo de transporte pesado traumatizado em um acidente de trânsito", + V61: "Ocupante de um veículo de transporte pesado traumatizado em colisão com um veículo a pedal", + V610: "Ocupante de um veículo de transporte pesado traumatizado em colisão com um veículo a pedal - condutor [motorista] traumatizado em um acidente não-de-trânsito", + V611: "Ocupante de um veículo de transporte pesado traumatizado em colisão com um veículo a pedal - passageiro traumatizado em um acidente não-de-trânsito", + V612: "Ocupante de um veículo de transporte pesado traumatizado em colisão com um veículo a pedal - pessoa viajando no exterior do veículo traumatizada em um acidente não-de-trânsito", + V613: "Ocupante de um veículo de transporte pesado traumatizado em colisão com um veículo a pedal - ocupante não especificado de um veículo de transporte pesado traumatizado em um acidente não-de-trânsito", + V614: "Ocupante de um veículo de transporte pesado traumatizado em colisão com um veículo a pedal - pessoa traumatizado ao subir ou descer do veículo", + V615: "Ocupante de um veículo de transporte pesado traumatizado em colisão com um veículo a pedal - condutor [motorista] traumatizado em um acidente de trânsito", + V616: "Ocupante de um veículo de transporte pesado traumatizado em colisão com um veículo a pedal - passageiro traumatizado em um acidente de trânsito", + V617: "Ocupante de um veículo de transporte pesado traumatizado em colisão com um veículo a pedal - pessoa viajando no exterior do veículo traumatizada em um acidente de trânsito", + V619: "Ocupante de um veículo de transporte pesado traumatizado em colisão com um veículo a pedal - ocupante não especificado de um veículo de transporte pesado traumatizado em um acidente de trânsito", + V62: "Ocupante de um veículo de transporte pesado traumatizado em colisão com um veículo a motor de duas ou três rodas", + V620: "Ocupante de um veículo de transporte pesado traumatizado em colisão com um veículo a motor de duas ou três rodas - condutor [motorista] traumatizado em um acidente não-de-trânsito", + V621: "Ocupante de um veículo de transporte pesado traumatizado em colisão com um veículo a motor de duas ou três rodas - passageiro traumatizado em um acidente não-de-trânsito", + V622: "Ocupante de um veículo de transporte pesado traumatizado em colisão com um veículo a motor de duas ou três rodas - pessoa viajando no exterior do veículo traumatizada em um acidente não-de-trânsito", + V623: "Ocupante de um veículo de transporte pesado traumatizado em colisão com um veículo a motor de duas ou três rodas - ocupante não especificado de um veículo de transporte pesado traumatizado em um acidente não-de-trânsito", + V624: "Ocupante de um veículo de transporte pesado traumatizado em colisão com um veículo a motor de duas ou três rodas - pessoa traumatizado ao subir ou descer do veículo", + V625: "Ocupante de um veículo de transporte pesado traumatizado em colisão com um veículo a motor de duas ou três rodas - condutor [motorista] traumatizado em um acidente de trânsito", + V626: "Ocupante de um veículo de transporte pesado traumatizado em colisão com um veículo a motor de duas ou três rodas - passageiro traumatizado em um acidente de trânsito", + V627: "Ocupante de um veículo de transporte pesado traumatizado em colisão com um veículo a motor de duas ou três rodas - pessoa viajando no exterior do veículo traumatizada em um acidente de trânsito", + V629: "Ocupante de um veículo de transporte pesado traumatizado em colisão com um veículo a motor de duas ou três rodas - ocupante não especificado de um veículo de transporte pesado traumatizado em um acidente de trânsito", + V63: "Ocupante de um veículo de transporte pesado traumatizado em colisão com um automóvel [carro] ou uma caminhonete", + V630: "Ocupante de um veículo de transporte pesado traumatizado em colisão com um automóvel [carro] ou uma caminhonete - condutor [motorista] traumatizado em um acidente não-de-trânsito", + V631: "Ocupante de um veículo de transporte pesado traumatizado em colisão com um automóvel [carro] ou uma caminhonete - passageiro traumatizado em um acidente não-de-trânsito", + V632: "Ocupante de um veículo de transporte pesado traumatizado em colisão com um automóvel [carro] ou uma caminhonete - pessoa viajando no exterior do veículo traumatizada em um acidente não-de-trânsito", + V633: "Ocupante de um veículo de transporte pesado traumatizado em colisão com um automóvel [carro] ou uma caminhonete - ocupante não especificado de um veículo de transporte pesado traumatizado em um acidente não-de-trânsito", + V634: "Ocupante de um veículo de transporte pesado traumatizado em colisão com um automóvel [carro] ou uma caminhonete - pessoa traumatizado ao subir ou descer do veículo", + V635: "Ocupante de um veículo de transporte pesado traumatizado em colisão com um automóvel [carro] ou uma caminhonete - condutor [motorista] traumatizado em um acidente de trânsito", + V636: "Ocupante de um veículo de transporte pesado traumatizado em colisão com um automóvel [carro] ou uma caminhonete - passageiro traumatizado em um acidente de trânsito", + V637: "Ocupante de um veículo de transporte pesado traumatizado em colisão com um automóvel [carro] ou uma caminhonete - pessoa viajando no exterior do veículo traumatizada em um acidente de trânsito", + V639: "Ocupante de um veículo de transporte pesado traumatizado em colisão com um automóvel [carro] ou uma caminhonete - ocupante não especificado de um veículo de transporte pesado traumatizado em um acidente de trânsito", + V64: "Ocupante de um veículo de transporte pesado traumatizado em colisão com um outro veículo de transporte pesado ou um ônibus", + V640: "Ocupante de um veículo de transporte pesado traumatizado em colisão com um outro veículo de transporte pesado ou um ônibus - condutor [motorista] traumatizado em um acidente não-de-trânsito", + V641: "Ocupante de um veículo de transporte pesado traumatizado em colisão com um outro veículo de transporte pesado ou um ônibus - passageiro traumatizado em um acidente não-de-trânsito", + V642: "Ocupante de um veículo de transporte pesado traumatizado em colisão com um outro veículo de transporte pesado ou um ônibus - pessoa viajando no exterior do veículo traumatizada em um acidente não-de-trânsito", + V643: "Ocupante de um veículo de transporte pesado traumatizado em colisão com um outro veículo de transporte pesado ou um ônibus - ocupante não especificado de um veículo de transporte pesado traumatizado em um acidente não-de-trânsito", + V644: "Ocupante de um veículo de transporte pesado traumatizado em colisão com um outro veículo de transporte pesado ou um ônibus - pessoa traumatizado ao subir ou descer do veículo", + V645: "Ocupante de um veículo de transporte pesado traumatizado em colisão com um outro veículo de transporte pesado ou um ônibus - condutor [motorista] traumatizado em um acidente de trânsito", + V646: "Ocupante de um veículo de transporte pesado traumatizado em colisão com um outro veículo de transporte pesado ou um ônibus - passageiro traumatizado em um acidente de trânsito", + V647: "Ocupante de um veículo de transporte pesado traumatizado em colisão com um outro veículo de transporte pesado ou um ônibus - pessoa viajando no exterior do veículo traumatizada em um acidente de trânsito", + V649: "Ocupante de um veículo de transporte pesado traumatizado em colisão com um outro veículo de transporte pesado ou um ônibus - ocupante não especificado de um veículo de transporte pesado traumatizado em um acidente de trânsito", + V65: "Ocupante de um veículo de transporte pesado traumatizado em colisão com um trem [comboio] ou um veículo ferroviário", + V650: "Ocupante de um veículo de transporte pesado traumatizado em colisão com um trem [comboio] ou um veículo ferroviário - condutor [motorista] traumatizado em um acidente não-de-trânsito", + V651: "Ocupante de um veículo de transporte pesado traumatizado em colisão com um trem [comboio] ou um veículo ferroviário - passageiro traumatizado em um acidente não-de-trânsito", + V652: "Ocupante de um veículo de transporte pesado traumatizado em colisão com um trem [comboio] ou um veículo ferroviário - pessoa viajando no exterior do veículo traumatizada em um acidente não-de-trânsito", + V653: "Ocupante de um veículo de transporte pesado traumatizado em colisão com um trem [comboio] ou um veículo ferroviário - ocupante não especificado de um veículo de transporte pesado traumatizado em um acidente não-de-trânsito", + V654: "Ocupante de um veículo de transporte pesado traumatizado em colisão com um trem [comboio] ou um veículo ferroviário - pessoa traumatizado ao subir ou descer do veículo", + V655: "Ocupante de um veículo de transporte pesado traumatizado em colisão com um trem [comboio] ou um veículo ferroviário - condutor [motorista] traumatizado em um acidente de trânsito", + V656: "Ocupante de um veículo de transporte pesado traumatizado em colisão com um trem [comboio] ou um veículo ferroviário - passageiro traumatizado em um acidente de trânsito", + V657: "Ocupante de um veículo de transporte pesado traumatizado em colisão com um trem [comboio] ou um veículo ferroviário - pessoa viajando no exterior do veículo traumatizada em um acidente de trânsito", + V659: "Ocupante de um veículo de transporte pesado traumatizado em colisão com um trem [comboio] ou um veículo ferroviário - ocupante não especificado de um veículo de transporte pesado traumatizado em um acidente de trânsito", + V66: "Ocupante de um veículo de transporte pesado traumatizado em colisão com um outro veículo não-motorizado", + V660: "Ocupante de um veículo de transporte pesado traumatizado em colisão com um outro veículo não-motorizado - condutor [motorista] traumatizado em um acidente não-de-trânsito", + V661: "Ocupante de um veículo de transporte pesado traumatizado em colisão com um outro veículo não-motorizado - passageiro traumatizado em um acidente não-de-trânsito", + V662: "Ocupante de um veículo de transporte pesado traumatizado em colisão com um outro veículo não-motorizado - pessoa viajando no exterior do veículo traumatizada em um acidente não-de-trânsito", + V663: "Ocupante de um veículo de transporte pesado traumatizado em colisão com um outro veículo não-motorizado - ocupante não especificado de um veículo de transporte pesado traumatizado em um acidente não-de-trânsito", + V664: "Ocupante de um veículo de transporte pesado traumatizado em colisão com um outro veículo não-motorizado - pessoa traumatizado ao subir ou descer do veículo", + V665: "Ocupante de um veículo de transporte pesado traumatizado em colisão com um outro veículo não-motorizado - condutor [motorista] traumatizado em um acidente de trânsito", + V666: "Ocupante de um veículo de transporte pesado traumatizado em colisão com um outro veículo não-motorizado - passageiro traumatizado em um acidente de trânsito", + V667: "Ocupante de um veículo de transporte pesado traumatizado em colisão com um outro veículo não-motorizado - pessoa viajando no exterior do veículo traumatizada em um acidente de trânsito", + V669: "Ocupante de um veículo de transporte pesado traumatizado em colisão com um outro veículo não-motorizado - ocupante não especificado de um veículo de transporte pesado traumatizado em um acidente de trânsito", + V67: "Ocupante de um veículo de transporte pesado traumatizado em colisão com um objeto fixo ou parado", + V670: "Ocupante de um veículo de transporte pesado traumatizado em colisão com um objeto fixo ou parado - condutor [motorista] traumatizado em um acidente não-de-trânsito", + V671: "Ocupante de um veículo de transporte pesado traumatizado em colisão com um objeto fixo ou parado - passageiro traumatizado em um acidente não-de-trânsito", + V672: "Ocupante de um veículo de transporte pesado traumatizado em colisão com um objeto fixo ou parado - pessoa viajando no exterior do veículo traumatizada em um acidente não-de-trânsito", + V673: "Ocupante de um veículo de transporte pesado traumatizado em colisão com um objeto fixo ou parado - ocupante não especificado de um veículo de transporte pesado traumatizado em um acidente não-de-trânsito", + V674: "Ocupante de um veículo de transporte pesado traumatizado em colisão com um objeto fixo ou parado - pessoa traumatizado ao subir ou descer do veículo", + V675: "Ocupante de um veículo de transporte pesado traumatizado em colisão com um objeto fixo ou parado - condutor [motorista] traumatizado em um acidente de trânsito", + V676: "Ocupante de um veículo de transporte pesado traumatizado em colisão com um objeto fixo ou parado - passageiro traumatizado em um acidente de trânsito", + V677: "Ocupante de um veículo de transporte pesado traumatizado em colisão com um objeto fixo ou parado - pessoa viajando no exterior do veículo traumatizada em um acidente de trânsito", + V679: "Ocupante de um veículo de transporte pesado traumatizado em colisão com um objeto fixo ou parado - ocupante não especificado de um veículo de transporte pesado traumatizado em um acidente de trânsito", + V68: "Ocupante de um veículo de transporte pesado traumatizado em um acidente de transporte sem colisão", + V680: "Ocupante de um veículo de transporte pesado traumatizado em um acidente de transporte sem colisão - condutor [motorista] traumatizado em um acidente não-de-trânsito", + V681: "Ocupante de um veículo de transporte pesado traumatizado em um acidente de transporte sem colisão - passageiro traumatizado em um acidente não-de-trânsito", + V682: "Ocupante de um veículo de transporte pesado traumatizado em um acidente de transporte sem colisão - pessoa viajando no exterior do veículo traumatizada em um acidente não-de-trânsito", + V683: "Ocupante de um veículo de transporte pesado traumatizado em um acidente de transporte sem colisão - ocupante não especificado de um veículo de transporte pesado traumatizado em um acidente não-de-trânsito", + V684: "Ocupante de um veículo de transporte pesado traumatizado em um acidente de transporte sem colisão - pessoa traumatizado ao subir ou descer do veículo", + V685: "Ocupante de um veículo de transporte pesado traumatizado em um acidente de transporte sem colisão - condutor [motorista] traumatizado em um acidente de trânsito", + V686: "Ocupante de um veículo de transporte pesado traumatizado em um acidente de transporte sem colisão - passageiro traumatizado em um acidente de trânsito", + V687: "Ocupante de um veículo de transporte pesado traumatizado em um acidente de transporte sem colisão - pessoa viajando no exterior do veículo traumatizada em um acidente de trânsito", + V689: "Ocupante de um veículo de transporte pesado traumatizado em um acidente de transporte sem colisão - ocupante não especificado de um veículo de transporte pesado traumatizado em um acidente de trânsito", + V69: "Ocupante de um veículo de transporte pesado traumatizado em outros acidentes de transporte não especificados", + V690: "Condutor [motorista] traumatizado em colisão com outros veículos e com veículos não especificados, a motor, em um acidente não-de-trânsito", + V691: "Passageiro traumatizado em colisão com outros veículos e com veículos não especificados, a motor, em um acidente não-de-trânsito", + V692: "Ocupante não especificado de um veículo de transporte pesado traumatizado em colisão com outros veículos e com veículos não especificados, a motor, em um acidente não-de-trânsito", + V693: "Ocupante [qualquer] de um veículo de transporte pesado traumatizado em um acidente não especificado e não-de-trânsito", + V694: "Condutor [motorista] traumatizado em colisão com outros veículos e com veículos não especificados, a motor, em um acidente de trânsito", + V695: "Passageiro traumatizado em colisão com outros veículos e com veículos não especificados, a motor, em um acidente de trânsito", + V696: "Ocupante não especificado de um veículo de transporte pesado traumatizado em colisão com outros veículos e com veículos não especificados, a motor, em um acidente de trânsito", + V698: "Ocupante [qualquer] de um veículo de transporte pesado traumatizado em outros acidentes de transporte especificados", + V699: "Ocupante [qualquer] de um veículo de transporte pesado traumatizado em um acidente de trânsito não especificado", + V70: "Ocupante de um ônibus traumatizado em colisão com um pedestre ou um animal", + V700: "Ocupante de um ônibus traumatizado em colisão com um pedestre ou um animal - condutor [motorista] traumatizado em um acidente não-de-trânsito", + V701: "Ocupante de um ônibus traumatizado em colisão com um pedestre ou um animal - passageiro traumatizado em um acidente não-de-trânsito", + V702: "Ocupante de um ônibus traumatizado em colisão com um pedestre ou um animal - pessoa viajando no exterior do veículo traumatizada em um acidente não-de-trânsito", + V703: "Ocupante de um ônibus traumatizado em colisão com um pedestre ou um animal - ocupante não especificado de um ônibus traumatizado em um acidente não-de-trânsito", + V704: "Ocupante de um ônibus traumatizado em colisão com um pedestre ou um animal - pessoa traumatizado ao subir ou descer do veículo", + V705: "Ocupante de um ônibus traumatizado em colisão com um pedestre ou um animal - condutor [motorista] traumatizado em um acidente de trânsito", + V706: "Ocupante de um ônibus traumatizado em colisão com um pedestre ou um animal - passageiro traumatizado em um acidente de trânsito", + V707: "Ocupante de um ônibus traumatizado em colisão com um pedestre ou um animal - pessoa viajando no exterior do veículo traumatizada em um acidente de trânsito", + V709: "Ocupante de um ônibus traumatizado em colisão com um pedestre ou um animal - ocupante não especificado de um ônibus traumatizado em um acidente de trânsito", + V71: "Ocupante de um ônibus traumatizado em colisão com um veículo a pedal", + V710: "Ocupante de um ônibus traumatizado em colisão com um veículo a pedal - condutor [motorista] traumatizado em um acidente não-de-trânsito", + V711: "Ocupante de um ônibus traumatizado em colisão com um veículo a pedal - passageiro traumatizado em um acidente não-de-trânsito", + V712: "Ocupante de um ônibus traumatizado em colisão com um veículo a pedal - pessoa viajando no exterior do veículo traumatizada em um acidente não-de-trânsito", + V713: "Ocupante de um ônibus traumatizado em colisão com um veículo a pedal - ocupante não especificado de um ônibus traumatizado em um acidente não-de-trânsito", + V714: "Ocupante de um ônibus traumatizado em colisão com um veículo a pedal - pessoa traumatizado ao subir ou descer do veículo", + V715: "Ocupante de um ônibus traumatizado em colisão com um veículo a pedal - condutor [motorista] traumatizado em um acidente de trânsito", + V716: "Ocupante de um ônibus traumatizado em colisão com um veículo a pedal - passageiro traumatizado em um acidente de trânsito", + V717: "Ocupante de um ônibus traumatizado em colisão com um veículo a pedal - pessoa viajando no exterior do veículo traumatizada em um acidente de trânsito", + V719: "Ocupante de um ônibus traumatizado em colisão com um veículo a pedal - ocupante não especificado de um ônibus traumatizado em um acidente de trânsito", + V72: "Ocupante de um ônibus traumatizado em colisão com um outro veículo a motor de duas ou três rodas", + V720: "Ocupante de um ônibus traumatizado em colisão com um outro veículo a motor de duas ou três rodas - condutor [motorista] traumatizado em um acidente não-de-trânsito", + V721: "Ocupante de um ônibus traumatizado em colisão com um outro veículo a motor de duas ou três rodas - passageiro traumatizado em um acidente não-de-trânsito", + V722: "Ocupante de um ônibus traumatizado em colisão com um outro veículo a motor de duas ou três rodas - pessoa viajando no exterior do veículo traumatizada em um acidente não-de-trânsito", + V723: "Ocupante de um ônibus traumatizado em colisão com um outro veículo a motor de duas ou três rodas - ocupante não especificado de um ônibus traumatizado em um acidente não-de-trânsito", + V724: "Ocupante de um ônibus traumatizado em colisão com um outro veículo a motor de duas ou três rodas - pessoa traumatizado ao subir ou descer do veículo", + V725: "Ocupante de um ônibus traumatizado em colisão com um outro veículo a motor de duas ou três rodas - condutor [motorista] traumatizado em um acidente de trânsito", + V726: "Ocupante de um ônibus traumatizado em colisão com um outro veículo a motor de duas ou três rodas - passageiro traumatizado em um acidente de trânsito", + V727: "Ocupante de um ônibus traumatizado em colisão com um outro veículo a motor de duas ou três rodas - pessoa viajando no exterior do veículo traumatizada em um acidente de trânsito", + V729: "Ocupante de um ônibus traumatizado em colisão com um outro veículo a motor de duas ou três rodas - ocupante não especificado de um ônibus traumatizado em um acidente de trânsito", + V73: "Ocupante de um ônibus traumatizado em colisão com um automóvel [carro] ou uma caminhonete", + V730: "Ocupante de um ônibus traumatizado em colisão com um automóvel [carro] ou uma caminhonete - condutor [motorista] traumatizado em um acidente não-de-trânsito", + V731: "Ocupante de um ônibus traumatizado em colisão com um automóvel [carro] ou uma caminhonete - passageiro traumatizado em um acidente não-de-trânsito", + V732: "Ocupante de um ônibus traumatizado em colisão com um automóvel [carro] ou uma caminhonete - pessoa viajando no exterior do veículo traumatizada em um acidente não-de-trânsito", + V733: "Ocupante de um ônibus traumatizado em colisão com um automóvel [carro] ou uma caminhonete - ocupante não especificado de um ônibus traumatizado em um acidente não-de-trânsito", + V734: "Ocupante de um ônibus traumatizado em colisão com um automóvel [carro] ou uma caminhonete - pessoa traumatizado ao subir ou descer do veículo", + V735: "Ocupante de um ônibus traumatizado em colisão com um automóvel [carro] ou uma caminhonete - condutor [motorista] traumatizado em um acidente de trânsito", + V736: "Ocupante de um ônibus traumatizado em colisão com um automóvel [carro] ou uma caminhonete - passageiro traumatizado em um acidente de trânsito", + V737: "Ocupante de um ônibus traumatizado em colisão com um automóvel [carro] ou uma caminhonete - pessoa viajando no exterior do veículo traumatizada em um acidente de trânsito", + V739: "Ocupante de um ônibus traumatizado em colisão com um automóvel [carro] ou uma caminhonete - ocupante não especificado de um ônibus traumatizado em um acidente de trânsito", + V74: "Ocupante de um ônibus traumatizado em colisão com um veículo de transporte pesado ou um ônibus", + V740: "Ocupante de um ônibus traumatizado em colisão com um veículo de transporte pesado ou um ônibus - condutor [motorista] traumatizado em um acidente não-de-trânsito", + V741: "Ocupante de um ônibus traumatizado em colisão com um veículo de transporte pesado ou um ônibus - passageiro traumatizado em um acidente não-de-trânsito", + V742: "Ocupante de um ônibus traumatizado em colisão com um veículo de transporte pesado ou um ônibus - pessoa viajando no exterior do veículo traumatizada em um acidente não-de-trânsito", + V743: "Ocupante de um ônibus traumatizado em colisão com um veículo de transporte pesado ou um ônibus - ocupante não especificado de um ônibus traumatizado em um acidente não-de-trânsito", + V744: "Ocupante de um ônibus traumatizado em colisão com um veículo de transporte pesado ou um ônibus - pessoa traumatizado ao subir ou descer do veículo", + V745: "Ocupante de um ônibus traumatizado em colisão com um veículo de transporte pesado ou um ônibus - condutor [motorista] traumatizado em um acidente de trânsito", + V746: "Ocupante de um ônibus traumatizado em colisão com um veículo de transporte pesado ou um ônibus - passageiro traumatizado em um acidente de trânsito", + V747: "Ocupante de um ônibus traumatizado em colisão com um veículo de transporte pesado ou um ônibus - pessoa viajando no exterior do veículo traumatizada em um acidente de trânsito", + V749: "Ocupante de um ônibus traumatizado em colisão com um veículo de transporte pesado ou um ônibus - ocupante não especificado de um ônibus traumatizado em um acidente de trânsito", + V75: "Ocupante de um ônibus traumatizado em colisão com um trem [comboio] ou um veículo ferroviário", + V750: "Ocupante de um ônibus traumatizado em colisão com um trem [comboio] ou um veículo ferroviário - condutor [motorista] traumatizado em um acidente não-de-trânsito", + V751: "Ocupante de um ônibus traumatizado em colisão com um trem [comboio] ou um veículo ferroviário - passageiro traumatizado em um acidente não-de-trânsito", + V752: "Ocupante de um ônibus traumatizado em colisão com um trem [comboio] ou um veículo ferroviário - pessoa viajando no exterior do veículo traumatizada em um acidente não-de-trânsito", + V753: "Ocupante de um ônibus traumatizado em colisão com um trem [comboio] ou um veículo ferroviário - ocupante não especificado de um ônibus traumatizado em um acidente não-de-trânsito", + V754: "Ocupante de um ônibus traumatizado em colisão com um trem [comboio] ou um veículo ferroviário - pessoa traumatizado ao subir ou descer do veículo", + V755: "Ocupante de um ônibus traumatizado em colisão com um trem [comboio] ou um veículo ferroviário - condutor [motorista] traumatizado em um acidente de trânsito", + V756: "Ocupante de um ônibus traumatizado em colisão com um trem [comboio] ou um veículo ferroviário - passageiro traumatizado em um acidente de trânsito", + V757: "Ocupante de um ônibus traumatizado em colisão com um trem [comboio] ou um veículo ferroviário - pessoa viajando no exterior do veículo traumatizada em um acidente de trânsito", + V759: "Ocupante de um ônibus traumatizado em colisão com um trem [comboio] ou um veículo ferroviário - ocupante não especificado de um ônibus traumatizado em um acidente de trânsito", + V76: "Ocupante de um ônibus traumatizado em colisão com outro veículo não-motorizado", + V760: "Ocupante de um ônibus traumatizado em colisão com outro veículo não-motorizado - condutor [motorista] traumatizado em um acidente não-de-trânsito", + V761: "Ocupante de um ônibus traumatizado em colisão com outro veículo não-motorizado - passageiro traumatizado em um acidente não-de-trânsito", + V762: "Ocupante de um ônibus traumatizado em colisão com outro veículo não-motorizado - pessoa viajando no exterior do veículo traumatizada em um acidente não-de-trânsito", + V763: "Ocupante de um ônibus traumatizado em colisão com outro veículo não-motorizado - ocupante não especificado de um ônibus traumatizado em um acidente não-de-trânsito", + V764: "Ocupante de um ônibus traumatizado em colisão com outro veículo não-motorizado - pessoa traumatizado ao subir ou descer do veículo", + V765: "Ocupante de um ônibus traumatizado em colisão com outro veículo não-motorizado - condutor [motorista] traumatizado em um acidente de trânsito", + V766: "Ocupante de um ônibus traumatizado em colisão com outro veículo não-motorizado - passageiro traumatizado em um acidente de trânsito", + V767: "Ocupante de um ônibus traumatizado em colisão com outro veículo não-motorizado - pessoa viajando no exterior do veículo traumatizada em um acidente de trânsito", + V769: "Ocupante de um ônibus traumatizado em colisão com outro veículo não-motorizado - ocupante não especificado de um ônibus traumatizado em um acidente de trânsito", + V77: "Ocupante de um ônibus traumatizado em colisão com um objeto fixo ou parado", + V770: "Ocupante de um ônibus traumatizado em colisão com um objeto fixo ou parado - condutor [motorista] traumatizado em um acidente não-de-trânsito", + V771: "Ocupante de um ônibus traumatizado em colisão com um objeto fixo ou parado - passageiro traumatizado em um acidente não-de-trânsito", + V772: "Ocupante de um ônibus traumatizado em colisão com um objeto fixo ou parado - pessoa viajando no exterior do veículo traumatizada em um acidente não-de-trânsito", + V773: "Ocupante de um ônibus traumatizado em colisão com um objeto fixo ou parado - ocupante não especificado de um ônibus traumatizado em um acidente não-de-trânsito", + V774: "Ocupante de um ônibus traumatizado em colisão com um objeto fixo ou parado - pessoa traumatizado ao subir ou descer do veículo", + V775: "Ocupante de um ônibus traumatizado em colisão com um objeto fixo ou parado - condutor [motorista] traumatizado em um acidente de trânsito", + V776: "Ocupante de um ônibus traumatizado em colisão com um objeto fixo ou parado - passageiro traumatizado em um acidente de trânsito", + V777: "Ocupante de um ônibus traumatizado em colisão com um objeto fixo ou parado - pessoa viajando no exterior do veículo traumatizada em um acidente de trânsito", + V779: "Ocupante de um ônibus traumatizado em colisão com um objeto fixo ou parado - ocupante não especificado de um ônibus traumatizado em um acidente de trânsito", + V78: "Ocupante de um ônibus traumatizado em um acidente de transporte sem colisão", + V780: "Ocupante de um ônibus traumatizado em um acidente de transporte sem colisão - condutor [motorista] traumatizado em um acidente não-de-trânsito", + V781: "Ocupante de um ônibus traumatizado em um acidente de transporte sem colisão - passageiro traumatizado em um acidente não-de-trânsito", + V782: "Ocupante de um ônibus traumatizado em um acidente de transporte sem colisão - pessoa viajando no exterior do veículo traumatizada em um acidente não-de-trânsito", + V783: "Ocupante de um ônibus traumatizado em um acidente de transporte sem colisão - ocupante não especificado de um ônibus traumatizado em um acidente não-de-trânsito", + V784: "Ocupante de um ônibus traumatizado em um acidente de transporte sem colisão - pessoa traumatizado ao subir ou descer do veículo", + V785: "Ocupante de um ônibus traumatizado em um acidente de transporte sem colisão - condutor [motorista] traumatizado em um acidente de trânsito", + V786: "Ocupante de um ônibus traumatizado em um acidente de transporte sem colisão - passageiro traumatizado em um acidente de trânsito", + V787: "Ocupante de um ônibus traumatizado em um acidente de transporte sem colisão - pessoa viajando no exterior do veículo traumatizada em um acidente de trânsito", + V789: "Ocupante de um ônibus traumatizado em um acidente de transporte sem colisão - ocupante não especificado de um ônibus traumatizado em um acidente de trânsito", + V79: "Ocupante de um ônibus traumatizado em outros acidentes de transporte e em acidentes de transporte não especificados", + V790: "Condutor [motorista] traumatizado em colisão com outros veículos e com veículos não especificados, a motor, em um acidente não-de-trânsito", + V791: "Passageiro traumatizado em colisão com outros veículos e com veículos não especificados, a motor, em um acidente não-de-trânsito", + V792: "Ocupante não especificado de um ônibus traumatizado em colisão com outros veículos e com um veículos não especificados, a motor, em um acidente não-de-trânsito", + V793: "Ocupante [qualquer] de um ônibus traumatizado em um acidente não-de-trânsito", + V794: "Condutor [motorista] traumatizado em colisão com outros veículos e com veículos não especificados, a motor, em um acidente de trânsito", + V795: "Passageiro traumatizado em colisão com outros veículos e com veículos não especificados, a motor, em um acidente de trânsito", + V796: "Ocupante não especificado de um ônibus traumatizado em colisão com um outros veículos e com um veículos não especificados, a motor, em um acidente de trânsito", + V798: "Ocupante [ qualquer] de um ônibus traumatizado em outros acidentes de transporte especificados", + V799: "Ocupante [qualquer] de um ônibus traumatizado em um acidente de trânsito não especificado", + V80: "Pessoa montada em animal ou ocupante de um veículo a tração animal traumatizado em um acidente de transporte", + V800: "Queda ou ejeção de uma pessoa montada em animal ou ocupante de um veículo a tração animal em um acidente sem colisão", + V801: "Pessoa montada em animal ou ocupante de um veículo a tração animal traumatizado em colisão com um pedestre ou um animal", + V802: "Pessoa montada em animal ou ocupante de um veículo a tração animal traumatizado em colisão com um veículo a pedal", + V803: "Pessoa montada em animal ou ocupante de um veículo a tração animal traumatizado em colisão com um veículo a motor de duas ou três rodas", + V804: "Pessoa montada em animal ou ocupante de um veículo a tração animal traumatizado em colisão com um automóvel [carro], uma caminhonete, um veículo de transporte pesado ou um ônibus", + V805: "Pessoa montada em animal ou ocupante de um veículo a tração animal traumatizado em colisão com um outro veículo a motor especificado", + V806: "Pessoa montada em animal ou ocupante de um veículo a tração animal traumatizado em colisão com um trem [comboio] ou um veículo ferroviário", + V807: "Pessoa montada em animal ou ocupante de um veículo a tração animal traumatizado em colisão com um outro veículo não-motorizado", + V808: "Pessoa montada em animal ou ocupante de um veículo a tração animal traumatizado em colisão com um objeto fixo ou parado", + V809: "Pessoa montada em animal ou ocupante de um veículo a tração animal traumatizado em outros acidentes de transporte e em acidentes de transporte não especificados", + V81: "Ocupante de um trem [comboio] ou um veículo ferroviário traumatizado em um acidente de transporte", + V810: "Ocupante de um trem [comboio] ou de um veículo ferroviário traumatizado em colisão com um veículo a motor em um acidente não-de-trânsito", + V811: "Ocupante de um trem [comboio] ou de um veículo ferroviário traumatizado em colisão com um veículo a motor em um acidente de trânsito", + V812: "Ocupante de um trem [comboio] ou de um veículo ferroviário traumatizado em colisão com ou atingido por material rodante", + V813: "Ocupante de um trem [comboio] ou de um veículo ferroviário traumatizado em colisão com outro objeto", + V814: "Pessoa traumatizada ao subir ou descer de um trem [comboio] ou de um veículo ferroviário", + V815: "Ocupante de um trem [comboio] ou de um veículo ferroviário traumatizado devido a uma queda no interior dos mesmos", + V816: "Ocupante de um trem [comboio] ou de um veículo ferroviário traumatizado devido a uma queda do trem ou do veículo ferroviário", + V817: "Ocupante de um trem [comboio] ou de um veículo ferroviário traumatizado em razão de um descarrilhamento sem colisão antecedente", + V818: "Ocupante de um trem [comboio] ou de um veículo ferroviário traumatizado em outro acidente ferroviário especificado", + V819: "Ocupante de um trem [comboio] ou de um veículo ferroviário traumatizado em um acidente ferroviário não especificado", + V82: "Ocupante de um bonde [carro elétrico] traumatizado em um acidente de transporte", + V820: "Ocupante de um bonde [carro elétrico] traumatizado em uma colisão com um veículo a motor em um acidente não-de-trânsito", + V821: "Ocupante de um bonde [carro elétrico] traumatizado em uma colisão com um veículo a motor em um acidente de trânsito", + V822: "Ocupante de um bonde [carro elétrico] traumatizado em uma colisão com ou atingido por material rodante", + V823: "Ocupante de um bonde [carro elétrico] traumatizado em uma colisão com outro objeto", + V824: "Pessoa traumatizada ao subir ou descer de um bonde [carro elétrico]", + V825: "Ocupante de um bonde [carro elétrico] traumatizado devido a uma queda no interior do mesmo", + V826: "Ocupante de um bonde [carro elétrico] traumatizado devido a uma queda do mesmo", + V827: "Ocupante de um bonde [carro elétrico] traumatizado devido a um descarrilhamento sem colisão antecedente", + V828: "Ocupante de um bonde [carro elétrico] traumatizado em outros acidentes de transporte especificados", + V829: "Ocupante de um bonde [carro elétrico] traumatizado em um acidente de trânsito não especificado", + V83: "Ocupante de um veículo especial a motor usado principalmente em áreas industriais traumatizado em um acidente de transporte", + V830: "Condutor [motorista] de um veículo especial a motor usado principalmente em áreas industrias traumatizado em um acidente de trânsito", + V831: "Passageiro de um veículo especial a motor usado principalmente em áreas industriais traumatizado em um acidente de trânsito", + V832: "Pessoa viajando no exterior de um veículo especial a motor usado principalmente em áreas industriais traumatizado em um acidente de trânsito", + V833: "Ocupante não especificado de um veículo especial a motor usado principalmente em áreas industriais traumatizado em um acidente de trânsito", + V834: "Pessoa traumatizada ao subir ou descer de um veículo especial a motor usado principalmente em áreas industriais", + V835: "Condutor [motorista] de um veículo especial a motor usado principalmente em áreas industrias traumatizado em um acidente não-de-trânsito", + V836: "Passageiro de um veículo especial a motor usado principalmente em áreas industriais traumatizado em um acidente não-de-trânsito", + V837: "Pessoa viajando no exterior de um veículo especial a motor usado principalmente em áreas industriais traumatizado em um acidente não-de-trânsito", + V839: "Ocupante não especificado de um veículo especial a motor usado principalmente em áreas industriais traumatizado em um acidente não-de-trânsito", + V84: "Ocupante de um veículo especial a motor de uso essencialmente agrícola traumatizado em um acidente de transporte", + V840: "Condutor [motorista] de um veículo especial a motor de uso essencialmente agrícola traumatizado em um acidente de trânsito", + V841: "Passageiro de um veículo especial a motor de uso essencialmente agrícola traumatizado em um acidente de trânsito", + V842: "Pessoa viajando no exterior de um veículo especial a motor de uso essencialmente agrícola traumatizado em um acidente de trânsito", + V843: "Ocupante não especificado de um veículo especial a motor de uso essencialmente agrícola traumatizado em um acidente de trânsito", + V844: "Pessoa traumatizado ao subir ou descer de um veículo especial a motor de uso essencialmente agrícola", + V845: "Condutor [motorista] de um veículo especial a motor de uso essencialmente agrícola traumatizado em um acidente não-de-trânsito", + V846: "Passageiro de um veículo especial a motor de uso essencialmente agrícola traumatizado em um acidente não-de-trânsito", + V847: "Pessoa viajando no exterior de um veículo especial a motor de uso essencialmente agrícola traumatizado em um acidente não-de-trânsito", + V849: "Ocupante não especificado de um veículo especial a motor de uso essencialmente agrícola traumatizada em um acidente não-de-trânsito", + V85: "Ocupante de um veículo a motor especial de construções traumatizado em um acidente de transporte", + V850: "Condutor [motorista] de um veículo a motor especial de construções traumatizado em um acidente de trânsito", + V851: "Passageiro de um veículo a motor especial de construções traumatizado em um acidente de trânsito", + V852: "Pessoa viajando no exterior de um veículo a motor especial de construções traumatizado em um acidente de trânsito", + V853: "Ocupante não especificado de um veículo a motor especial de construções traumatizado em um acidente de trânsito", + V854: "Pessoa traumatizada ao subir ou descer de um veículo a motor especial de construções", + V855: "Condutor [motorista] de um veículo a motor especial de construções traumatizado em um acidente não-de-trânsito", + V856: "Passageiro de um veículo a motor especial de construções traumatizado em um acidente não-de-trânsito", + V857: "Pessoa viajando no exterior de um veículo a motor especial de construções traumatizado em um acidente não-de-trânsito", + V859: "Ocupante não especificado de um veículo a motor especial de construções traumatizado em um acidente não-de-trânsito", + V86: "Ocupante de um veículo especial para qualquer terreno ou de outro veículo a motor projetado essencialmente para uso não em via pública, traumatizado em um acidente de transporte", + V860: "Condutor [motorista] de um veículo especial para qualquer terreno ou de outro veículo a motor projetado essencialmente para uso não em via pública, traumatizado em um acidente de trânsito", + V861: "Passageiro de um veículo especial para qualquer terreno ou de outro veículo a motor projetado essencialmente para uso não em via pública, traumatizado em um acidente de trânsito", + V862: "Pessoa viajando no exterior de um veículo especial para qualquer terreno ou de outro veículo a motor projetado essencialmente para uso não em via pública, traumatizado em um acidente de trânsito", + V863: "Ocupante não especificado de um veículo especial para qualquer terreno ou de outro veículo a motor projetado essencialmente para uso não em via pública traumatizado em um acidente de trânsito", + V864: "Pessoa traumatizada ao subir ou descer de um veículo especial para qualquer terreno ou de outro veículo a motor projetado essencialmente para uso não em via pública", + V865: "Condutor [motorista] de um veículo especial para qualquer terreno ou de outro veículo a motor projetado essencialmente para uso não em via pública traumatizado em um acidente não-de-trânsito", + V866: "Passageiro de um veículo especial para qualquer terreno ou de outro veículo a motor projetado essencialmente para uso não em via pública traumatizado em um acidente não-de-trânsito", + V867: "Pessoa viajando no exterior de um veículo especial para qualquer terreno ou de outro veículo a motor projetado essencialmente para uso não em via pública traumatizado em um acidente não-de-trânsito", + V869: "Ocupante não especificado de um veículo especial para qualquer terreno ou de outro veículo a motor projetado essencialmente para uso não em via pública traumatizado em um acidente não-de-trânsito", + V87: "Acidente de trânsito de tipo especificado, mas sendo desconhecido o modo de transporte da vítima", + V870: "Pessoa traumatizada em uma colisão entre um automóvel [carro] e um veículo a motor de duas ou três rodas (acidente de trânsito)", + V871: "Pessoa traumatizada em uma colisão entre outro veículo a motor e um veículo a motor de duas ou três rodas (acidente de trânsito)", + V872: "Pessoa traumatizada em uma colisão entre um automóvel [carro] e uma caminhonete (acidente de trânsito)", + V873: "Pessoa traumatizada em uma colisão entre um automóvel [carro] e um ônibus (acidente de trânsito)", + V874: "Pessoa traumatizada em uma colisão entre um automóvel [carro] e um veículo de transporte pesado (acidente de trânsito)", + V875: "Pessoa traumatizada em uma colisão entre um veículo de transporte pesado e um ônibus (acidente de trânsito)", + V876: "Pessoa traumatizada em uma colisão entre um trem ou um veículo ferroviário e um automóvel [carro] (acidente de trânsito)", + V877: "Pessoa traumatizada em uma colisão entre outros veículos a motor especificados (acidente de trânsito)", + V878: "Pessoa traumatizada em outros acidentes de transporte especificados com veículo a motor, sem colisão (acidente de trânsito)", + V879: "Pessoa traumatizada em outros acidentes de transporte especificados (com colisão) (sem colisão) envolvendo um veículo não-motorizado (acidente de trânsito)", + V88: "Acidente não-de-trânsito de tipo especificado, mas sendo desconhecido o modo de transporte da vítima", + V880: "Pessoa traumatizada em uma colisão entre um automóvel [carro] e um veículo a motor de duas ou três rodas, não-de-trânsito", + V881: "Pessoa traumatizada em uma colisão entre outro veículo a motor e um veículo a motor de duas ou três rodas, não-de-trânsito", + V882: "Pessoa traumatizada em uma colisão entre um automóvel [carro] e uma caminhonete, não-de-trânsito", + V883: "Pessoa traumatizada em uma colisão entre um automóvel [carro] e um ônibus, não-de-trânsito", + V884: "Pessoa traumatizada em uma colisão entre um automóvel [carro] e um veículo de transporte pesado, não-de-trânsito", + V885: "Pessoa traumatizada em uma colisão entre um veículo de transporte pesado e um ônibus, não-de-trânsito", + V886: "Pessoa traumatizada em uma colisão entre um trem ou um veículo ferroviário e um automóvel [carro], não-de-trânsito", + V887: "Pessoa traumatizada em uma colisão entre outros veículos a motor especificados, não-de-trânsito", + V888: "Pessoa traumatizada em outros acidentes de transporte especificados, com um veículo a motor, sem colisão, não-de-trânsito", + V889: "Pessoa traumatizada em outros acidente de transporte especificados (com colisão) (sem colisão), envolvendo um veículo não-motorizado, não-de-trânsito", + V89: "Acidente com um veículo a motor ou não-motorizado, tipo(s) de veículo(s) não especificado(s)", + V890: "Pessoa traumatizada em um acidente com um veículo a motor não especificado, não-de-trânsito", + V891: "Pessoa traumatizada em um acidente com veículo não-motorizado, não especificado, não-de-trânsito", + V892: "Pessoa traumatizada em um acidente de trânsito com um veículo a motor não especificado", + V893: "Pessoa traumatizado em um acidente de trânsito com um veículo não-motorizado, não especificado", + V899: "Pessoa traumatizada em um acidente com um veículo não especificado", + V90: "Acidente com embarcação causando afogamento e submersão", + V900: "Acidente com embarcação causando afogamento e submersão - navio mercante", + V901: "Acidente com embarcação causando afogamento e submersão - navio de passageiros", + V902: "Acidente com embarcação causando afogamento e submersão - barco de pesca", + V903: "Acidente com embarcação causando afogamento e submersão - outras embarcações a motor", + V904: "Acidente com embarcação causando afogamento e submersão - barco a vela", + V905: "Acidente com embarcação causando afogamento e submersão - caiaque ou canoa", + V906: "Acidente com embarcação causando afogamento e submersão - bote inflável (sem motor)", + V907: "Acidente com embarcação causando afogamento e submersão - esqui aquático", + V908: "Acidente com embarcação causando afogamento e submersão - outras embarcações sem motor", + V909: "Acidente com embarcação causando afogamento e submersão - embarcação não especificada", + V91: "Acidente com embarcação causando outro tipo de traumatismo", + V910: "Acidente com embarcação causando outro tipo de traumatismo - navio mercante", + V911: "Acidente com embarcação causando outro tipo de traumatismo - navio de passageiros", + V912: "Acidente com embarcação causando outro tipo de traumatismo - barco de pesca", + V913: "Acidente com embarcação causando outro tipo de traumatismo - outras embarcações a motor", + V914: "Acidente com embarcação causando outro tipo de traumatismo - barco a vela", + V915: "Acidente com embarcação causando outro tipo de traumatismo - caiaque ou canoa", + V916: "Acidente com embarcação causando outro tipo de traumatismo - bote inflável (sem motor)", + V917: "Acidente com embarcação causando outro tipo de traumatismo - esqui aquático", + V918: "Acidente com embarcação causando outro tipo de traumatismo - outras embarcações sem motor", + V919: "Acidente com embarcação causando outro tipo de traumatismo - embarcação não especificada", + V92: "Afogamento e submersão relacionados com transporte por água sem acidente com a embarcação", + V920: "Afogamento e submersão relacionados com transporte por água sem acidente com a embarcação - navio mercante", + V921: "Afogamento e submersão relacionados com transporte por água sem acidente com a embarcação - navio de passageiros", + V922: "Afogamento e submersão relacionados com transporte por água sem acidente com a embarcação - barco de pesca", + V923: "Afogamento e submersão relacionados com transporte por água sem acidente com a embarcação - outras embarcações a motor", + V924: "Afogamento e submersão relacionados com transporte por água sem acidente com a embarcação - barco a vela", + V925: "Afogamento e submersão relacionados com transporte por água sem acidente com a embarcação - caiaque ou canoa", + V926: "Afogamento e submersão relacionados com transporte por água sem acidente com a embarcação - bote inflável (sem motor)", + V927: "Afogamento e submersão relacionados com transporte por água sem acidente com a embarcação - esqui aquático", + V928: "Afogamento e submersão relacionados com transporte por água sem acidente com a embarcação - outras embarcações sem motor", + V929: "Afogamento e submersão relacionados com transporte por água sem acidente com a embarcação - embarcação não especificada", + V93: "Acidente a bordo de uma embarcação, sem acidente da embarcação e não causando afogamento ou submersão", + V930: "Acidente a bordo de uma embarcação, sem acidente da embarcação e não causando afogamento ou submersão - navio mercante", + V931: "Acidente a bordo de uma embarcação, sem acidente da embarcação e não causando afogamento ou submersão - navio de passageiros", + V932: "Acidente a bordo de uma embarcação, sem acidente da embarcação e não causando afogamento ou submersão - barco de pesca", + V933: "Acidente a bordo de uma embarcação, sem acidente da embarcação e não causando afogamento ou submersão - outras embarcações a motor", + V934: "Acidente a bordo de uma embarcação, sem acidente da embarcação e não causando afogamento ou submersão - barco a vela", + V935: "Acidente a bordo de uma embarcação, sem acidente da embarcação e não causando afogamento ou submersão - caiaque ou canoa", + V936: "Acidente a bordo de uma embarcação, sem acidente da embarcação e não causando afogamento ou submersão - bote inflável (sem motor)", + V937: "Acidente a bordo de uma embarcação, sem acidente da embarcação e não causando afogamento ou submersão - esqui aquático", + V938: "Acidente a bordo de uma embarcação, sem acidente da embarcação e não causando afogamento ou submersão - outras embarcações sem motor", + V939: "Acidente a bordo de uma embarcação, sem acidente da embarcação e não causando afogamento ou submersão - embarcação não especificada", + V94: "Outros acidentes de transporte por água e os não especificados", + V940: "Outros acidentes de transporte por água e os não especificados - navio mercante", + V941: "Outros acidentes de transporte por água e os não especificados - navio de passageiros", + V942: "Outros acidentes de transporte por água e os não especificados - barco de pesca", + V943: "Outros acidentes de transporte por água e os não especificados - outras embarcações a motor", + V944: "Outros acidentes de transporte por água e os não especificados - barco a vela", + V945: "Outros acidentes de transporte por água e os não especificados - caiaque ou canoa", + V946: "Outros acidentes de transporte por água e os não especificados - bote inflável (sem motor)", + V947: "Outros acidentes de transporte por água e os não especificados - esqui aquático", + V948: "Outros acidentes de transporte por água e os não especificados - outras embarcações sem motor", + V949: "Outros acidentes de transporte por água e os não especificados - embarcação não especificada", + V95: "Acidente de aeronave a motor causando traumatismo ao ocupante", + V950: "Acidente de helicóptero causando traumatismo a ocupante", + V951: "Acidente de planador motorizado e ultraleve causando traumatismo a ocupante", + V952: "Acidente de outra aeronave de asa fixa de uso particular causando traumatismo a ocupante", + V953: "Acidente de aeronave de asa fixa de uso comercial causando traumatismo a ocupante", + V954: "Acidente de nave espacial causando traumatismo a ocupante", + V958: "Outros acidente de aeronaves causando traumatismo a ocupante", + V959: "Acidente de aeronave não especificada causando traumatismo a ocupante", + V96: "Acidente de uma aeronave sem motor causando traumatismo a ocupante", + V960: "Acidente de balão causando traumatismo a ocupante", + V961: "Acidente de asa delta causando traumatismo a ocupante", + V962: "Acidente de planador (não-motorizado) causando traumatismo a ocupante", + V968: "Outros acidentes de aeronaves não-motorizadas causando traumatismo a ocupante", + V969: "Acidente não especificado de aeronave não-motorizada causando traumatismo a ocupante", + V97: "Outros acidentes especificados de transporte aéreo", + V970: "Ocupante de uma aeronave traumatizado em outros acidentes de transporte aéreo especificados", + V971: "Pessoa traumatizada ao embarcar em ou desembarcar de uma aeronave", + V972: "Paraquedista traumatizado em acidente de transporte aéreo", + V973: "Pessoa em terra traumatizada em acidente de transporte aéreo", + V978: "Outros acidentes de transporte aéreo não classificados em outra parte", + V98: "Outros acidentes de transporte especificados", + V99: "Acidente de transporte não especificado", + W00: "Queda no mesmo nível envolvendo gelo e neve", + W000: "Queda no mesmo nível envolvendo gelo e neve - residência", + W001: "Queda no mesmo nível envolvendo gelo e neve - habitação coletiva", + W002: "Queda no mesmo nível envolvendo gelo e neve - escolas, outras instituições e áreas de administração pública", + W003: "Queda no mesmo nível envolvendo gelo e neve - área para a prática de esportes e atletismo", + W004: "Queda no mesmo nível envolvendo gelo e neve - rua e estrada", + W005: "Queda no mesmo nível envolvendo gelo e neve - áreas de comércio e de serviços", + W006: "Queda no mesmo nível envolvendo gelo e neve - áreas industriais e em construção", + W007: "Queda no mesmo nível envolvendo gelo e neve - fazenda", + W008: "Queda no mesmo nível envolvendo gelo e neve - outros locais especificados", + W009: "Queda no mesmo nível envolvendo gelo e neve - local não especificado", + W01: "Queda no mesmo nível por escorregão, tropeção ou passos em falsos [traspés]", + W010: "Queda no mesmo nível por escorregão, tropeção ou passos em falsos [traspés] - residência", + W011: "Queda no mesmo nível por escorregão, tropeção ou passos em falsos [traspés] - habitação coletiva", + W012: "Queda no mesmo nível por escorregão, tropeção ou passos em falsos [traspés] - escolas, outras instituições e áreas de administração pública", + W013: "Queda no mesmo nível por escorregão, tropeção ou passos em falsos [traspés] - área para a prática de esportes e atletismo", + W014: "Queda no mesmo nível por escorregão, tropeção ou passos em falsos [traspés] - rua e estrada", + W015: "Queda no mesmo nível por escorregão, tropeção ou passos em falsos [traspés] - áreas de comércio e de serviços", + W016: "Queda no mesmo nível por escorregão, tropeção ou passos em falsos [traspés] - áreas industriais e em construção", + W017: "Queda no mesmo nível por escorregão, tropeção ou passos em falsos [traspés] - fazenda", + W018: "Queda no mesmo nível por escorregão, tropeção ou passos em falsos [traspés] - outros locais especificados", + W019: "Queda no mesmo nível por escorregão, tropeção ou passos em falsos [traspés] - local não especificado", + W02: "Queda envolvendo patins de rodas ou para gelo, esqui ou pranchas de rodas", + W020: "Queda envolvendo patins de rodas ou para gelo, esqui ou pranchas de rodas - residência", + W021: "Queda envolvendo patins de rodas ou para gelo, esqui ou pranchas de rodas - habitação coletiva", + W022: "Queda envolvendo patins de rodas ou para gelo, esqui ou pranchas de rodas - escolas, outras instituições e áreas de administração pública", + W023: "Queda envolvendo patins de rodas ou para gelo, esqui ou pranchas de rodas - área para a prática de esportes e atletismo", + W024: "Queda envolvendo patins de rodas ou para gelo, esqui ou pranchas de rodas - rua e estrada", + W025: "Queda envolvendo patins de rodas ou para gelo, esqui ou pranchas de rodas - áreas de comércio e de serviços", + W026: "Queda envolvendo patins de rodas ou para gelo, esqui ou pranchas de rodas - áreas industriais e em construção", + W027: "Queda envolvendo patins de rodas ou para gelo, esqui ou pranchas de rodas - fazenda", + W028: "Queda envolvendo patins de rodas ou para gelo, esqui ou pranchas de rodas - outros locais especificados", + W029: "Queda envolvendo patins de rodas ou para gelo, esqui ou pranchas de rodas - local não especificado", + W03: "Outras quedas no mesmo nível por colisão com ou empurrão por outra pessoa", + W030: "Outras quedas no mesmo nível por colisão com ou empurrão por outra pessoa - residência", + W031: "Outras quedas no mesmo nível por colisão com ou empurrão por outra pessoa - habitação coletiva", + W032: "Outras quedas no mesmo nível por colisão com ou empurrão por outra pessoa - escolas, outras instituições e áreas de administração pública", + W033: "Outras quedas no mesmo nível por colisão com ou empurrão por outra pessoa - área para a prática de esportes e atletismo", + W034: "Outras quedas no mesmo nível por colisão com ou empurrão por outra pessoa - rua e estrada", + W035: "Outras quedas no mesmo nível por colisão com ou empurrão por outra pessoa - áreas de comércio e de serviços", + W036: "Outras quedas no mesmo nível por colisão com ou empurrão por outra pessoa - áreas industriais e em construção", + W037: "Outras quedas no mesmo nível por colisão com ou empurrão por outra pessoa - fazenda", + W038: "Outras quedas no mesmo nível por colisão com ou empurrão por outra pessoa - outros locais especificados", + W039: "Outras quedas no mesmo nível por colisão com ou empurrão por outra pessoa - local não especificado", + W04: "Queda, enquanto estava sendo carregado ou apoiado por outra(s) pessoa(s)", + W040: "Queda, enquanto estava sendo carregado ou apoiado por outra(s) pessoa(s) - residência", + W041: "Queda, enquanto estava sendo carregado ou apoiado por outra(s) pessoa(s) - habitação coletiva", + W042: "Queda, enquanto estava sendo carregado ou apoiado por outra(s) pessoa(s) - escolas, outras instituições e áreas de administração pública", + W043: "Queda, enquanto estava sendo carregado ou apoiado por outra(s) pessoa(s) - área para a prática de esportes e atletismo", + W044: "Queda, enquanto estava sendo carregado ou apoiado por outra(s) pessoa(s) - rua e estrada", + W045: "Queda, enquanto estava sendo carregado ou apoiado por outra(s) pessoa(s) - áreas de comércio e de serviços", + W046: "Queda, enquanto estava sendo carregado ou apoiado por outra(s) pessoa(s) - áreas industriais e em construção", + W047: "Queda, enquanto estava sendo carregado ou apoiado por outra(s) pessoa(s) - fazenda", + W048: "Queda, enquanto estava sendo carregado ou apoiado por outra(s) pessoa(s) - outros locais especificados", + W049: "Queda, enquanto estava sendo carregado ou apoiado por outra(s) pessoa(s) - local não especificado", + W05: "Queda envolvendo uma cadeira de rodas", + W050: "Queda envolvendo uma cadeira de rodas - residência", + W051: "Queda envolvendo uma cadeira de rodas - habitação coletiva", + W052: "Queda envolvendo uma cadeira de rodas - escolas, outras instituições e áreas de administração pública", + W053: "Queda envolvendo uma cadeira de rodas - área para a prática de esportes e atletismo", + W054: "Queda envolvendo uma cadeira de rodas - rua e estrada", + W055: "Queda envolvendo uma cadeira de rodas - áreas de comércio e de serviços", + W056: "Queda envolvendo uma cadeira de rodas - áreas industriais e em construção", + W057: "Queda envolvendo uma cadeira de rodas - fazenda", + W058: "Queda envolvendo uma cadeira de rodas - outros locais especificados", + W059: "Queda envolvendo uma cadeira de rodas - local não especificado", + W06: "Queda de um leito", + W060: "Queda de um leito - residência", + W061: "Queda de um leito - habitação coletiva", + W062: "Queda de um leito - escolas, outras instituições e áreas de administração pública", + W063: "Queda de um leito - área para a prática de esportes e atletismo", + W064: "Queda de um leito - rua e estrada", + W065: "Queda de um leito - áreas de comércio e de serviços", + W066: "Queda de um leito - áreas industriais e em construção", + W067: "Queda de um leito - fazenda", + W068: "Queda de um leito - outros locais especificados", + W069: "Queda de um leito - local não especificado", + W07: "Queda de uma cadeira", + W070: "Queda de uma cadeira - residência", + W071: "Queda de uma cadeira - habitação coletiva", + W072: "Queda de uma cadeira - escolas, outras instituições e áreas de administração pública", + W073: "Queda de uma cadeira - área para a prática de esportes e atletismo", + W074: "Queda de uma cadeira - rua e estrada", + W075: "Queda de uma cadeira - áreas de comércio e de serviços", + W076: "Queda de uma cadeira - áreas industriais e em construção", + W077: "Queda de uma cadeira - fazenda", + W078: "Queda de uma cadeira - outros locais especificados", + W079: "Queda de uma cadeira - local não especificado", + W08: "Queda de outro tipo de mobília", + W080: "Queda de outro tipo de mobília - residência", + W081: "Queda de outro tipo de mobília - habitação coletiva", + W082: "Queda de outro tipo de mobília - escolas, outras instituições e áreas de administração pública", + W083: "Queda de outro tipo de mobília - área para a prática de esportes e atletismo", + W084: "Queda de outro tipo de mobília - rua e estrada", + W085: "Queda de outro tipo de mobília - áreas de comércio e de serviços", + W086: "Queda de outro tipo de mobília - áreas industriais e em construção", + W087: "Queda de outro tipo de mobília - fazenda", + W088: "Queda de outro tipo de mobília - outros locais especificados", + W089: "Queda de outro tipo de mobília - local não especificado", + W09: 'Queda envolvendo equipamento de "playground"', + W090: 'Queda envolvendo equipamento de "playground" - residência', + W091: 'Queda envolvendo equipamento de "playground" - habitação coletiva', + W092: 'Queda envolvendo equipamento de "playground" - escolas, outras instituições e áreas de administração pública', + W093: 'Queda envolvendo equipamento de "playground" - área para a prática de esportes e atletismo', + W094: 'Queda envolvendo equipamento de "playground" - rua e estrada', + W095: 'Queda envolvendo equipamento de "playground" - áreas de comércio e de serviços', + W096: 'Queda envolvendo equipamento de "playground" - áreas industriais e em construção', + W097: 'Queda envolvendo equipamento de "playground" - fazenda', + W098: 'Queda envolvendo equipamento de "playground" - outros locais especificados', + W099: 'Queda envolvendo equipamento de "playground" - local não especificado', + W10: "Queda em ou de escadas ou degraus", + W100: "Queda em ou de escadas ou degraus - residência", + W101: "Queda em ou de escadas ou degraus - habitação coletiva", + W102: "Queda em ou de escadas ou degraus - escolas, outras instituições e áreas de administração pública", + W103: "Queda em ou de escadas ou degraus - área para a prática de esportes e atletismo", + W104: "Queda em ou de escadas ou degraus - rua e estrada", + W105: "Queda em ou de escadas ou degraus - áreas de comércio e de serviços", + W106: "Queda em ou de escadas ou degraus - áreas industriais e em construção", + W107: "Queda em ou de escadas ou degraus - fazenda", + W108: "Queda em ou de escadas ou degraus - outros locais especificados", + W109: "Queda em ou de escadas ou degraus - local não especificado", + W11: "Queda em ou de escadas de mão", + W110: "Queda em ou de escadas de mão - residência", + W111: "Queda em ou de escadas de mão - habitação coletiva", + W112: "Queda em ou de escadas de mão - escolas, outras instituições e áreas de administração pública", + W113: "Queda em ou de escadas de mão - área para a prática de esportes e atletismo", + W114: "Queda em ou de escadas de mão - rua e estrada", + W115: "Queda em ou de escadas de mão - áreas de comércio e de serviços", + W116: "Queda em ou de escadas de mão - áreas industriais e em construção", + W117: "Queda em ou de escadas de mão - fazenda", + W118: "Queda em ou de escadas de mão - outros locais especificados", + W119: "Queda em ou de escadas de mão - local não especificado", + W12: "Queda em ou de um andaime", + W120: "Queda em ou de um andaime - residência", + W121: "Queda em ou de um andaime - habitação coletiva", + W122: "Queda em ou de um andaime - escolas, outras instituições e áreas de administração pública", + W123: "Queda em ou de um andaime - área para a prática de esportes e atletismo", + W124: "Queda em ou de um andaime - rua e estrada", + W125: "Queda em ou de um andaime - áreas de comércio e de serviços", + W126: "Queda em ou de um andaime - áreas industriais e em construção", + W127: "Queda em ou de um andaime - fazenda", + W128: "Queda em ou de um andaime - outros locais especificados", + W129: "Queda em ou de um andaime - local não especificado", + W13: "Queda de ou para fora de edifícios ou outras estruturas", + W130: "Queda de ou para fora de edifícios ou outras estruturas - residência", + W131: "Queda de ou para fora de edifícios ou outras estruturas - habitação coletiva", + W132: "Queda de ou para fora de edifícios ou outras estruturas - escolas, outras instituições e áreas de administração pública", + W133: "Queda de ou para fora de edifícios ou outras estruturas - área para a prática de esportes e atletismo", + W134: "Queda de ou para fora de edifícios ou outras estruturas - rua e estrada", + W135: "Queda de ou para fora de edifícios ou outras estruturas - áreas de comércio e de serviços", + W136: "Queda de ou para fora de edifícios ou outras estruturas - áreas industriais e em construção", + W137: "Queda de ou para fora de edifícios ou outras estruturas - fazenda", + W138: "Queda de ou para fora de edifícios ou outras estruturas - outros locais especificados", + W139: "Queda de ou para fora de edifícios ou outras estruturas - local não especificado", + W14: "Queda de árvore", + W140: "Queda de árvore - residência", + W141: "Queda de árvore - habitação coletiva", + W142: "Queda de árvore - escolas, outras instituições e áreas de administração pública", + W143: "Queda de árvore - área para a prática de esportes e atletismo", + W144: "Queda de árvore - rua e estrada", + W145: "Queda de árvore - áreas de comércio e de serviços", + W146: "Queda de árvore - áreas industriais e em construção", + W147: "Queda de árvore - fazenda", + W148: "Queda de árvore - outros locais especificados", + W149: "Queda de árvore - local não especificado", + W15: "Queda de penhasco", + W150: "Queda de penhasco - residência", + W151: "Queda de penhasco - habitação coletiva", + W152: "Queda de penhasco - escolas, outras instituições e áreas de administração pública", + W153: "Queda de penhasco - área para a prática de esportes e atletismo", + W154: "Queda de penhasco - rua e estrada", + W155: "Queda de penhasco - áreas de comércio e de serviços", + W156: "Queda de penhasco - áreas industriais e em construção", + W157: "Queda de penhasco - fazenda", + W158: "Queda de penhasco - outros locais especificados", + W159: "Queda de penhasco - local não especificado", + W16: "Mergulho ou pulo na água causando outro traumatismo que não afogamento ou submersão", + W160: "Mergulho ou pulo na água causando outro traumatismo que não afogamento ou submersão - residência", + W161: "Mergulho ou pulo na água causando outro traumatismo que não afogamento ou submersão - habitação coletiva", + W162: "Mergulho ou pulo na água causando outro traumatismo que não afogamento ou submersão - escolas, outras instituições e áreas de administração pública", + W163: "Mergulho ou pulo na água causando outro traumatismo que não afogamento ou submersão - área para a prática de esportes e atletismo", + W164: "Mergulho ou pulo na água causando outro traumatismo que não afogamento ou submersão - rua e estrada", + W165: "Mergulho ou pulo na água causando outro traumatismo que não afogamento ou submersão - áreas de comércio e de serviços", + W166: "Mergulho ou pulo na água causando outro traumatismo que não afogamento ou submersão - áreas industriais e em construção", + W167: "Mergulho ou pulo na água causando outro traumatismo que não afogamento ou submersão - fazenda", + W168: "Mergulho ou pulo na água causando outro traumatismo que não afogamento ou submersão - outros locais especificados", + W169: "Mergulho ou pulo na água causando outro traumatismo que não afogamento ou submersão - local não especificado", + W17: "Outras quedas de um nível a outro", + W170: "Outras quedas de um nível a outro - residência", + W171: "Outras quedas de um nível a outro - habitação coletiva", + W172: "Outras quedas de um nível a outro - escolas, outras instituições e áreas de administração pública", + W173: "Outras quedas de um nível a outro - área para a prática de esportes e atletismo", + W174: "Outras quedas de um nível a outro - rua e estrada", + W175: "Outras quedas de um nível a outro - áreas de comércio e de serviços", + W176: "Outras quedas de um nível a outro - áreas industriais e em construção", + W177: "Outras quedas de um nível a outro - fazenda", + W178: "Outras quedas de um nível a outro - outros locais especificados", + W179: "Outras quedas de um nível a outro - local não especificado", + W18: "Outras quedas no mesmo nível", + W180: "Outras quedas no mesmo nível - residência", + W181: "Outras quedas no mesmo nível - habitação coletiva", + W182: "Outras quedas no mesmo nível - escolas, outras instituições e áreas de administração pública", + W183: "Outras quedas no mesmo nível - área para a prática de esportes e atletismo", + W184: "Outras quedas no mesmo nível - rua e estrada", + W185: "Outras quedas no mesmo nível - áreas de comércio e de serviços", + W186: "Outras quedas no mesmo nível - áreas industriais e em construção", + W187: "Outras quedas no mesmo nível - fazenda", + W188: "Outras quedas no mesmo nível - outros locais especificados", + W189: "Outras quedas no mesmo nível - local não especificado", + W19: "Queda sem especificação", + W190: "Queda sem especificação - residência", + W191: "Queda sem especificação - habitação coletiva", + W192: "Queda sem especificação - escolas, outras instituições e áreas de administração pública", + W193: "Queda sem especificação - área para a prática de esportes e atletismo", + W194: "Queda sem especificação - rua e estrada", + W195: "Queda sem especificação - áreas de comércio e de serviços", + W196: "Queda sem especificação - áreas industriais e em construção", + W197: "Queda sem especificação - fazenda", + W198: "Queda sem especificação - outros locais especificados", + W199: "Queda sem especificação - local não especificado", + W20: "Impacto causado por objeto lançado, projetado ou em queda", + W200: "Impacto causado por objeto lançado, projetado ou em queda - residência", + W201: "Impacto causado por objeto lançado, projetado ou em queda - habitação coletiva", + W202: "Impacto causado por objeto lançado, projetado ou em queda - escolas, outras instituições e áreas de administração pública", + W203: "Impacto causado por objeto lançado, projetado ou em queda - área para a prática de esportes e atletismo", + W204: "Impacto causado por objeto lançado, projetado ou em queda - rua e estrada", + W205: "Impacto causado por objeto lançado, projetado ou em queda - áreas de comércio e de serviços", + W206: "Impacto causado por objeto lançado, projetado ou em queda - áreas industriais e em construção", + W207: "Impacto causado por objeto lançado, projetado ou em queda - fazenda", + W208: "Impacto causado por objeto lançado, projetado ou em queda - outros locais especificados", + W209: "Impacto causado por objeto lançado, projetado ou em queda - local não especificado", + W21: "Impacto acidental ativo ou passivo causado por equipamento esportivo", + W210: "Impacto acidental ativo ou passivo causado por equipamento esportivo - residência", + W211: "Impacto acidental ativo ou passivo causado por equipamento esportivo - habitação coletiva", + W212: "Impacto acidental ativo ou passivo causado por equipamento esportivo - escolas, outras instituições e áreas de administração pública", + W213: "Impacto acidental ativo ou passivo causado por equipamento esportivo - área para a prática de esportes e atletismo", + W214: "Impacto acidental ativo ou passivo causado por equipamento esportivo - rua e estrada", + W215: "Impacto acidental ativo ou passivo causado por equipamento esportivo - áreas de comércio e de serviços", + W216: "Impacto acidental ativo ou passivo causado por equipamento esportivo - áreas industriais e em construção", + W217: "Impacto acidental ativo ou passivo causado por equipamento esportivo - fazenda", + W218: "Impacto acidental ativo ou passivo causado por equipamento esportivo - outros locais especificados", + W219: "Impacto acidental ativo ou passivo causado por equipamento esportivo - local não especificado", + W22: "Impacto acidental ativo ou passivo causado por outros objetos", + W220: "Impacto acidental ativo ou passivo causado por outros objetos - residência", + W221: "Impacto acidental ativo ou passivo causado por outros objetos - habitação coletiva", + W222: "Impacto acidental ativo ou passivo causado por outros objetos - escolas, outras instituições e áreas de administração pública", + W223: "Impacto acidental ativo ou passivo causado por outros objetos - área para a prática de esportes e atletismo", + W224: "Impacto acidental ativo ou passivo causado por outros objetos - rua e estrada", + W225: "Impacto acidental ativo ou passivo causado por outros objetos - áreas de comércio e de serviços", + W226: "Impacto acidental ativo ou passivo causado por outros objetos - áreas industriais e em construção", + W227: "Impacto acidental ativo ou passivo causado por outros objetos - fazenda", + W228: "Impacto acidental ativo ou passivo causado por outros objetos - outros locais especificados", + W229: "Impacto acidental ativo ou passivo causado por outros objetos - local não especificado", + W23: "Apertado, colhido, comprimido ou esmagado dentro de ou entre objetos", + W230: "Apertado, colhido, comprimido ou esmagado dentro de ou entre objetos - residência", + W231: "Apertado, colhido, comprimido ou esmagado dentro de ou entre objetos - habitação coletiva", + W232: "Apertado, colhido, comprimido ou esmagado dentro de ou entre objetos - escolas, outras instituições e áreas de administração pública", + W233: "Apertado, colhido, comprimido ou esmagado dentro de ou entre objetos - área para a prática de esportes e atletismo", + W234: "Apertado, colhido, comprimido ou esmagado dentro de ou entre objetos - rua e estrada", + W235: "Apertado, colhido, comprimido ou esmagado dentro de ou entre objetos - áreas de comércio e de serviços", + W236: "Apertado, colhido, comprimido ou esmagado dentro de ou entre objetos - áreas industriais e em construção", + W237: "Apertado, colhido, comprimido ou esmagado dentro de ou entre objetos - fazenda", + W238: "Apertado, colhido, comprimido ou esmagado dentro de ou entre objetos - outros locais especificados", + W239: "Apertado, colhido, comprimido ou esmagado dentro de ou entre objetos - local não especificado", + W24: "Contato com elevadores e instrumentos de transmissão, não classificados em outra parte", + W240: "Contato com elevadores e instrumentos de transmissão, não classificados em outra parte - residência", + W241: "Contato com elevadores e instrumentos de transmissão, não classificados em outra parte - habitação coletiva", + W242: "Contato com elevadores e instrumentos de transmissão, não classificados em outra parte - escolas, outras instituições e áreas de administração pública", + W243: "Contato com elevadores e instrumentos de transmissão, não classificados em outra parte - área para a prática de esportes e atletismo", + W244: "Contato com elevadores e instrumentos de transmissão, não classificados em outra parte - rua e estrada", + W245: "Contato com elevadores e instrumentos de transmissão, não classificados em outra parte - áreas de comércio e de serviços", + W246: "Contato com elevadores e instrumentos de transmissão, não classificados em outra parte - áreas industriais e em construção", + W247: "Contato com elevadores e instrumentos de transmissão, não classificados em outra parte - fazenda", + W248: "Contato com elevadores e instrumentos de transmissão, não classificados em outra parte - outros locais especificados", + W249: "Contato com elevadores e instrumentos de transmissão, não classificados em outra parte - local não especificado", + W25: "Contato com vidro cortante", + W250: "Contato com vidro cortante - residência", + W251: "Contato com vidro cortante - habitação coletiva", + W252: "Contato com vidro cortante - escolas, outras instituições e áreas de administração pública", + W253: "Contato com vidro cortante - área para a prática de esportes e atletismo", + W254: "Contato com vidro cortante - rua e estrada", + W255: "Contato com vidro cortante - áreas de comércio e de serviços", + W256: "Contato com vidro cortante - áreas industriais e em construção", + W257: "Contato com vidro cortante - fazenda", + W258: "Contato com vidro cortante - outros locais especificados", + W259: "Contato com vidro cortante - local não especificado", + W26: "Contato com faca, espada e punhal", + W260: "Contato com faca, espada e punhal - residência", + W261: "Contato com faca, espada e punhal - habitação coletiva", + W262: "Contato com faca, espada e punhal - escolas, outras instituições e áreas de administração pública", + W263: "Contato com faca, espada e punhal - área para a prática de esportes e atletismo", + W264: "Contato com faca, espada e punhal - rua e estrada", + W265: "Contato com faca, espada e punhal - áreas de comércio e de serviços", + W266: "Contato com faca, espada e punhal - áreas industriais e em construção", + W267: "Contato com faca, espada e punhal - fazenda", + W268: "Contato com faca, espada e punhal - outros locais especificados", + W269: "Contato com faca, espada e punhal - local não especificado", + W27: "Contato com ferramentas manuais sem motor", + W270: "Contato com ferramentas manuais sem motor - residência", + W271: "Contato com ferramentas manuais sem motor - habitação coletiva", + W272: "Contato com ferramentas manuais sem motor - escolas, outras instituições e áreas de administração pública", + W273: "Contato com ferramentas manuais sem motor - área para a prática de esportes e atletismo", + W274: "Contato com ferramentas manuais sem motor - rua e estrada", + W275: "Contato com ferramentas manuais sem motor - áreas de comércio e de serviços", + W276: "Contato com ferramentas manuais sem motor - áreas industriais e em construção", + W277: "Contato com ferramentas manuais sem motor - fazenda", + W278: "Contato com ferramentas manuais sem motor - outros locais especificados", + W279: "Contato com ferramentas manuais sem motor - local não especificado", + W28: "Contato com segadeira motorizada para cortar ou aparar a grama", + W280: "Contato com segadeira motorizada para cortar ou aparar a grama - residência", + W281: "Contato com segadeira motorizada para cortar ou aparar a grama - habitação coletiva", + W282: "Contato com segadeira motorizada para cortar ou aparar a grama - escolas, outras instituições e áreas de administração pública", + W283: "Contato com segadeira motorizada para cortar ou aparar a grama - área para a prática de esportes e atletismo", + W284: "Contato com segadeira motorizada para cortar ou aparar a grama - rua e estrada", + W285: "Contato com segadeira motorizada para cortar ou aparar a grama - áreas de comércio e de serviços", + W286: "Contato com segadeira motorizada para cortar ou aparar a grama - áreas industriais e em construção", + W287: "Contato com segadeira motorizada para cortar ou aparar a grama - fazenda", + W288: "Contato com segadeira motorizada para cortar ou aparar a grama - outros locais especificados", + W289: "Contato com segadeira motorizada para cortar ou aparar a grama - local não especificado", + W29: "Contato com outros utensílios manuais e aparelhos domésticos equipados com motor", + W290: "Contato com outros utensílios manuais e aparelhos domésticos equipados com motor - residência", + W291: "Contato com outros utensílios manuais e aparelhos domésticos equipados com motor - habitação coletiva", + W292: "Contato com outros utensílios manuais e aparelhos domésticos equipados com motor - escolas, outras instituições e áreas de administração pública", + W293: "Contato com outros utensílios manuais e aparelhos domésticos equipados com motor - área para a prática de esportes e atletismo", + W294: "Contato com outros utensílios manuais e aparelhos domésticos equipados com motor - rua e estrada", + W295: "Contato com outros utensílios manuais e aparelhos domésticos equipados com motor - áreas de comércio e de serviços", + W296: "Contato com outros utensílios manuais e aparelhos domésticos equipados com motor - áreas industriais e em construção", + W297: "Contato com outros utensílios manuais e aparelhos domésticos equipados com motor - fazenda", + W298: "Contato com outros utensílios manuais e aparelhos domésticos equipados com motor - outros locais especificados", + W299: "Contato com outros utensílios manuais e aparelhos domésticos equipados com motor - local não especificado", + W30: "Contato com maquinaria agrícola", + W300: "Contato com maquinaria agrícola - residência", + W301: "Contato com maquinaria agrícola - habitação coletiva", + W302: "Contato com maquinaria agrícola - escolas, outras instituições e áreas de administração pública", + W303: "Contato com maquinaria agrícola - área para a prática de esportes e atletismo", + W304: "Contato com maquinaria agrícola - rua e estrada", + W305: "Contato com maquinaria agrícola - áreas de comércio e de serviços", + W306: "Contato com maquinaria agrícola - áreas industriais e em construção", + W307: "Contato com maquinaria agrícola - fazenda", + W308: "Contato com maquinaria agrícola - outros locais especificados", + W309: "Contato com maquinaria agrícola - local não especificado", + W31: "Contato com outras máquinas e com as não especificadas", + W310: "Contato com outras máquinas e com as não especificadas - residência", + W311: "Contato com outras máquinas e com as não especificadas - habitação coletiva", + W312: "Contato com outras máquinas e com as não especificadas - escolas, outras instituições e áreas de administração pública", + W313: "Contato com outras máquinas e com as não especificadas - área para a prática de esportes e atletismo", + W314: "Contato com outras máquinas e com as não especificadas - rua e estrada", + W315: "Contato com outras máquinas e com as não especificadas - áreas de comércio e de serviços", + W316: "Contato com outras máquinas e com as não especificadas - áreas industriais e em construção", + W317: "Contato com outras máquinas e com as não especificadas - fazenda", + W318: "Contato com outras máquinas e com as não especificadas - outros locais especificados", + W319: "Contato com outras máquinas e com as não especificadas - local não especificado", + W32: "Projétil de revólver", + W320: "Projétil de revólver - residência", + W321: "Projétil de revólver - habitação coletiva", + W322: "Projétil de revólver - escolas, outras instituições e áreas de administração pública", + W323: "Projétil de revólver - área para a prática de esportes e atletismo", + W324: "Projétil de revólver - rua e estrada", + W325: "Projétil de revólver - áreas de comércio e de serviços", + W326: "Projétil de revólver - áreas industriais e em construção", + W327: "Projétil de revólver - fazenda", + W328: "Projétil de revólver - outros locais especificados", + W329: "Projétil de revólver - local não especificado", + W33: "Rifle, espingarda e armas de fogo de maior tamanho", + W330: "Rifle, espingarda e armas de fogo de maior tamanho - residência", + W331: "Rifle, espingarda e armas de fogo de maior tamanho - habitação coletiva", + W332: "Rifle, espingarda e armas de fogo de maior tamanho - escolas, outras instituições e áreas de administração pública", + W333: "Rifle, espingarda e armas de fogo de maior tamanho - área para a prática de esportes e atletismo", + W334: "Rifle, espingarda e armas de fogo de maior tamanho - rua e estrada", + W335: "Rifle, espingarda e armas de fogo de maior tamanho - áreas de comércio e de serviços", + W336: "Rifle, espingarda e armas de fogo de maior tamanho - áreas industriais e em construção", + W337: "Rifle, espingarda e armas de fogo de maior tamanho - fazenda", + W338: "Rifle, espingarda e armas de fogo de maior tamanho - outros locais especificados", + W339: "Rifle, espingarda e armas de fogo de maior tamanho - local não especificado", + W34: "Projéteis de outras armas de fogo e das não especificadas", + W340: "Projéteis de outras armas de fogo e das não especificadas - residência", + W341: "Projéteis de outras armas de fogo e das não especificadas - habitação coletiva", + W342: "Projéteis de outras armas de fogo e das não especificadas - escolas, outras instituições e áreas de administração pública", + W343: "Projéteis de outras armas de fogo e das não especificadas - área para a prática de esportes e atletismo", + W344: "Projéteis de outras armas de fogo e das não especificadas - rua e estrada", + W345: "Projéteis de outras armas de fogo e das não especificadas - áreas de comércio e de serviços", + W346: "Projéteis de outras armas de fogo e das não especificadas - áreas industriais e em construção", + W347: "Projéteis de outras armas de fogo e das não especificadas - fazenda", + W348: "Projéteis de outras armas de fogo e das não especificadas - outros locais especificados", + W349: "Projéteis de outras armas de fogo e das não especificadas - local não especificado", + W35: "Explosão ou ruptura de caldeira", + W350: "Explosão ou ruptura de caldeira - residência", + W351: "Explosão ou ruptura de caldeira - habitação coletiva", + W352: "Explosão ou ruptura de caldeira - escolas, outras instituições e áreas de administração pública", + W353: "Explosão ou ruptura de caldeira - área para a prática de esportes e atletismo", + W354: "Explosão ou ruptura de caldeira - rua e estrada", + W355: "Explosão ou ruptura de caldeira - áreas de comércio e de serviços", + W356: "Explosão ou ruptura de caldeira - áreas industriais e em construção", + W357: "Explosão ou ruptura de caldeira - fazenda", + W358: "Explosão ou ruptura de caldeira - outros locais especificados", + W359: "Explosão ou ruptura de caldeira - local não especificado", + W36: "Explosão ou ruptura de cilindro de gás", + W360: "Explosão ou ruptura de cilindro de gás - residência", + W361: "Explosão ou ruptura de cilindro de gás - habitação coletiva", + W362: "Explosão ou ruptura de cilindro de gás - escolas, outras instituições e áreas de administração pública", + W363: "Explosão ou ruptura de cilindro de gás - área para a prática de esportes e atletismo", + W364: "Explosão ou ruptura de cilindro de gás - rua e estrada", + W365: "Explosão ou ruptura de cilindro de gás - áreas de comércio e de serviços", + W366: "Explosão ou ruptura de cilindro de gás - áreas industriais e em construção", + W367: "Explosão ou ruptura de cilindro de gás - fazenda", + W368: "Explosão ou ruptura de cilindro de gás - outros locais especificados", + W369: "Explosão ou ruptura de cilindro de gás - local não especificado", + W37: "Explosão ou ruptura de pneumático, tubulação ou mangueira, pressurizados", + W370: "Explosão ou ruptura de pneumático, tubulação ou mangueira, pressurizados - residência", + W371: "Explosão ou ruptura de pneumático, tubulação ou mangueira, pressurizados - habitação coletiva", + W372: "Explosão ou ruptura de pneumático, tubulação ou mangueira, pressurizados - escolas, outras instituições e áreas de administração pública", + W373: "Explosão ou ruptura de pneumático, tubulação ou mangueira, pressurizados - área para a prática de esportes e atletismo", + W374: "Explosão ou ruptura de pneumático, tubulação ou mangueira, pressurizados - rua e estrada", + W375: "Explosão ou ruptura de pneumático, tubulação ou mangueira, pressurizados - áreas de comércio e de serviços", + W376: "Explosão ou ruptura de pneumático, tubulação ou mangueira, pressurizados - áreas industriais e em construção", + W377: "Explosão ou ruptura de pneumático, tubulação ou mangueira, pressurizados - fazenda", + W378: "Explosão ou ruptura de pneumático, tubulação ou mangueira, pressurizados - outros locais especificados", + W379: "Explosão ou ruptura de pneumático, tubulação ou mangueira, pressurizados - local não especificado", + W38: "Explosão ou ruptura de outros aparelhos pressurizados especificados", + W380: "Explosão ou ruptura de outros aparelhos pressurizados especificados - residência", + W381: "Explosão ou ruptura de outros aparelhos pressurizados especificados - habitação coletiva", + W382: "Explosão ou ruptura de outros aparelhos pressurizados especificados - escolas, outras instituições e áreas de administração pública", + W383: "Explosão ou ruptura de outros aparelhos pressurizados especificados - área para a prática de esportes e atletismo", + W384: "Explosão ou ruptura de outros aparelhos pressurizados especificados - rua e estrada", + W385: "Explosão ou ruptura de outros aparelhos pressurizados especificados - áreas de comércio e de serviços", + W386: "Explosão ou ruptura de outros aparelhos pressurizados especificados - áreas industriais e em construção", + W387: "Explosão ou ruptura de outros aparelhos pressurizados especificados - fazenda", + W388: "Explosão ou ruptura de outros aparelhos pressurizados especificados - outros locais especificados", + W389: "Explosão ou ruptura de outros aparelhos pressurizados especificados - local não especificado", + W39: "Queima de fogos de artifício", + W390: "Queima de fogos de artifício - residência", + W391: "Queima de fogos de artifício - habitação coletiva", + W392: "Queima de fogos de artifício - escolas, outras instituições e áreas de administração pública", + W393: "Queima de fogos de artifício - área para a prática de esportes e atletismo", + W394: "Queima de fogos de artifício - rua e estrada", + W395: "Queima de fogos de artifício - áreas de comércio e de serviços", + W396: "Queima de fogos de artifício - áreas industriais e em construção", + W397: "Queima de fogos de artifício - fazenda", + W398: "Queima de fogos de artifício - outros locais especificados", + W399: "Queima de fogos de artifício - local não especificado", + W40: "Explosão de outros materiais", + W400: "Explosão de outros materiais - residência", + W401: "Explosão de outros materiais - habitação coletiva", + W402: "Explosão de outros materiais - escolas, outras instituições e áreas de administração pública", + W403: "Explosão de outros materiais - área para a prática de esportes e atletismo", + W404: "Explosão de outros materiais - rua e estrada", + W405: "Explosão de outros materiais - áreas de comércio e de serviços", + W406: "Explosão de outros materiais - áreas industriais e em construção", + W407: "Explosão de outros materiais - fazenda", + W408: "Explosão de outros materiais - outros locais especificados", + W409: "Explosão de outros materiais - local não especificado", + W41: "Exposição a um jato de alta pressão", + W410: "Exposição a um jato de alta pressão - residência", + W411: "Exposição a um jato de alta pressão - habitação coletiva", + W412: "Exposição a um jato de alta pressão - escolas, outras instituições e áreas de administração pública", + W413: "Exposição a um jato de alta pressão - área para a prática de esportes e atletismo", + W414: "Exposição a um jato de alta pressão - rua e estrada", + W415: "Exposição a um jato de alta pressão - áreas de comércio e de serviços", + W416: "Exposição a um jato de alta pressão - áreas industriais e em construção", + W417: "Exposição a um jato de alta pressão - fazenda", + W418: "Exposição a um jato de alta pressão - outros locais especificados", + W419: "Exposição a um jato de alta pressão - local não especificado", + W42: "Exposição ao ruído", + W420: "Exposição ao ruído - residência", + W421: "Exposição ao ruído - habitação coletiva", + W422: "Exposição ao ruído - escolas, outras instituições e áreas de administração pública", + W423: "Exposição ao ruído - área para a prática de esportes e atletismo", + W424: "Exposição ao ruído - rua e estrada", + W425: "Exposição ao ruído - áreas de comércio e de serviços", + W426: "Exposição ao ruído - áreas industriais e em construção", + W427: "Exposição ao ruído - fazenda", + W428: "Exposição ao ruído - outros locais especificados", + W429: "Exposição ao ruído - local não especificado", + W43: "Exposição à vibração", + W430: "Exposição à vibração - residência", + W431: "Exposição à vibração - habitação coletiva", + W432: "Exposição à vibração - escolas, outras instituições e áreas de administração pública", + W433: "Exposição à vibração - área para a prática de esportes e atletismo", + W434: "Exposição à vibração - rua e estrada", + W435: "Exposição à vibração - áreas de comércio e de serviços", + W436: "Exposição à vibração - áreas industriais e em construção", + W437: "Exposição à vibração - fazenda", + W438: "Exposição à vibração - outros locais especificados", + W439: "Exposição à vibração - local não especificado", + W44: "Penetração de corpo estranho no ou através de olho ou orifício natural", + W440: "Penetração de corpo estranho no ou através de olho ou orifício natural - residência", + W441: "Penetração de corpo estranho no ou através de olho ou orifício natural - habitação coletiva", + W442: "Penetração de corpo estranho no ou através de olho ou orifício natural - escolas, outras instituições e áreas de administração pública", + W443: "Penetração de corpo estranho no ou através de olho ou orifício natural - área para a prática de esportes e atletismo", + W444: "Penetração de corpo estranho no ou através de olho ou orifício natural - rua e estrada", + W445: "Penetração de corpo estranho no ou através de olho ou orifício natural - áreas de comércio e de serviços", + W446: "Penetração de corpo estranho no ou através de olho ou orifício natural - áreas industriais e em construção", + W447: "Penetração de corpo estranho no ou através de olho ou orifício natural - fazenda", + W448: "Penetração de corpo estranho no ou através de olho ou orifício natural - outros locais especificados", + W449: "Penetração de corpo estranho no ou através de olho ou orifício natural - local não especificado", + W45: "Penetração de corpo ou objeto estranho através da pele", + W450: "Penetração de corpo ou objeto estranho através da pele - residência", + W451: "Penetração de corpo ou objeto estranho através da pele - habitação coletiva", + W452: "Penetração de corpo ou objeto estranho através da pele - escolas, outras instituições e áreas de administração pública", + W453: "Penetração de corpo ou objeto estranho através da pele - área para a prática de esportes e atletismo", + W454: "Penetração de corpo ou objeto estranho através da pele - rua e estrada", + W455: "Penetração de corpo ou objeto estranho através da pele - áreas de comércio e de serviços", + W456: "Penetração de corpo ou objeto estranho através da pele - áreas industriais e em construção", + W457: "Penetração de corpo ou objeto estranho através da pele - fazenda", + W458: "Penetração de corpo ou objeto estranho através da pele - outros locais especificados", + W459: "Penetração de corpo ou objeto estranho através da pele - local não especificado", + W46: "Contato com agulha hipodérmica", + W460: "Contato com agulha hipodérmica - residência", + W461: "Contato com agulha hipodérmica - habitação coletiva", + W462: "Contato com agulha hipodérmica - escolas, outras instituições e áreas de administração pública", + W463: "Contato com agulha hipodérmica - área para a prática de esportes e atletismo", + W464: "Contato com agulha hipodérmica - rua e estrada", + W465: "Contato com agulha hipodérmica - áreas de comércio e de serviços", + W466: "Contato com agulha hipodérmica - áreas industriais e em construção", + W467: "Contato com agulha hipodérmica - fazenda", + W468: "Contato com agulha hipodérmica - outros locais especificados", + W469: "Contato com agulha hipodérmica - local não especificado", + W49: "Exposição a outras forças mecânicas inanimadas e às não especificadas", + W490: "Exposição a outras forças mecânicas inanimadas e às não especificadas - residência", + W491: "Exposição a outras forças mecânicas inanimadas e às não especificadas - habitação coletiva", + W492: "Exposição a outras forças mecânicas inanimadas e às não especificadas - escolas, outras instituições e áreas de administração pública", + W493: "Exposição a outras forças mecânicas inanimadas e às não especificadas - área para a prática de esportes e atletismo", + W494: "Exposição a outras forças mecânicas inanimadas e às não especificadas - rua e estrada", + W495: "Exposição a outras forças mecânicas inanimadas e às não especificadas - áreas de comércio e de serviços", + W496: "Exposição a outras forças mecânicas inanimadas e às não especificadas - áreas industriais e em construção", + W497: "Exposição a outras forças mecânicas inanimadas e às não especificadas - fazenda", + W498: "Exposição a outras forças mecânicas inanimadas e às não especificadas - outros locais especificados", + W499: "Exposição a outras forças mecânicas inanimadas e às não especificadas - local não especificado", + W50: "Golpe, pancada, pontapé, mordedura ou escoriação infligidos por outra pessoa", + W500: "Golpe, pancada, pontapé, mordedura ou escoriação infligidos por outra pessoa - residência", + W501: "Golpe, pancada, pontapé, mordedura ou escoriação infligidos por outra pessoa - habitação coletiva", + W502: "Golpe, pancada, pontapé, mordedura ou escoriação infligidos por outra pessoa - escolas, outras instituições e áreas de administração pública", + W503: "Golpe, pancada, pontapé, mordedura ou escoriação infligidos por outra pessoa - área para a prática de esportes e atletismo", + W504: "Golpe, pancada, pontapé, mordedura ou escoriação infligidos por outra pessoa - rua e estrada", + W505: "Golpe, pancada, pontapé, mordedura ou escoriação infligidos por outra pessoa - áreas de comércio e de serviços", + W506: "Golpe, pancada, pontapé, mordedura ou escoriação infligidos por outra pessoa - áreas industriais e em construção", + W507: "Golpe, pancada, pontapé, mordedura ou escoriação infligidos por outra pessoa - fazenda", + W508: "Golpe, pancada, pontapé, mordedura ou escoriação infligidos por outra pessoa - outros locais especificados", + W509: "Golpe, pancada, pontapé, mordedura ou escoriação infligidos por outra pessoa - local não especificado", + W51: "Colisão entre duas pessoas", + W510: "Colisão entre duas pessoas - residência", + W511: "Colisão entre duas pessoas - habitação coletiva", + W512: "Colisão entre duas pessoas - escolas, outras instituições e áreas de administração pública", + W513: "Colisão entre duas pessoas - área para a prática de esportes e atletismo", + W514: "Colisão entre duas pessoas - rua e estrada", + W515: "Colisão entre duas pessoas - áreas de comércio e de serviços", + W516: "Colisão entre duas pessoas - áreas industriais e em construção", + W517: "Colisão entre duas pessoas - fazenda", + W518: "Colisão entre duas pessoas - outros locais especificados", + W519: "Colisão entre duas pessoas - local não especificado", + W52: "Esmagado, empurrado ou pisoteado por multidão ou debandada em massa de pessoas", + W520: "Esmagado, empurrado ou pisoteado por multidão ou debandada em massa de pessoas - residência", + W521: "Esmagado, empurrado ou pisoteado por multidão ou debandada em massa de pessoas - habitação coletiva", + W522: "Esmagado, empurrado ou pisoteado por multidão ou debandada em massa de pessoas - escolas, outras instituições e áreas de administração pública", + W523: "Esmagado, empurrado ou pisoteado por multidão ou debandada em massa de pessoas - área para a prática de esportes e atletismo", + W524: "Esmagado, empurrado ou pisoteado por multidão ou debandada em massa de pessoas - rua e estrada", + W525: "Esmagado, empurrado ou pisoteado por multidão ou debandada em massa de pessoas - áreas de comércio e de serviços", + W526: "Esmagado, empurrado ou pisoteado por multidão ou debandada em massa de pessoas - áreas industriais e em construção", + W527: "Esmagado, empurrado ou pisoteado por multidão ou debandada em massa de pessoas - fazenda", + W528: "Esmagado, empurrado ou pisoteado por multidão ou debandada em massa de pessoas - outros locais especificados", + W529: "Esmagado, empurrado ou pisoteado por multidão ou debandada em massa de pessoas - local não especificado", + W53: "Mordedura de rato", + W530: "Mordedura de rato - residência", + W531: "Mordedura de rato - habitação coletiva", + W532: "Mordedura de rato - escolas, outras instituições e áreas de administração pública", + W533: "Mordedura de rato - área para a prática de esportes e atletismo", + W534: "Mordedura de rato - rua e estrada", + W535: "Mordedura de rato - áreas de comércio e de serviços", + W536: "Mordedura de rato - áreas industriais e em construção", + W537: "Mordedura de rato - fazenda", + W538: "Mordedura de rato - outros locais especificados", + W539: "Mordedura de rato - local não especificado", + W54: "Mordedura ou golpe provocado por cão", + W540: "Mordedura ou golpe provocado por cão - residência", + W541: "Mordedura ou golpe provocado por cão - habitação coletiva", + W542: "Mordedura ou golpe provocado por cão - escolas, outras instituições e áreas de administração pública", + W543: "Mordedura ou golpe provocado por cão - área para a prática de esportes e atletismo", + W544: "Mordedura ou golpe provocado por cão - rua e estrada", + W545: "Mordedura ou golpe provocado por cão - áreas de comércio e de serviços", + W546: "Mordedura ou golpe provocado por cão - áreas industriais e em construção", + W547: "Mordedura ou golpe provocado por cão - fazenda", + W548: "Mordedura ou golpe provocado por cão - outros locais especificados", + W549: "Mordedura ou golpe provocado por cão - local não especificado", + W55: "Mordedura ou golpe provocado por outros animais mamíferos", + W550: "Mordedura ou golpe provocado por outros animais mamíferos - residência", + W551: "Mordedura ou golpe provocado por outros animais mamíferos - habitação coletiva", + W552: "Mordedura ou golpe provocado por outros animais mamíferos - escolas, outras instituições e áreas de administração pública", + W553: "Mordedura ou golpe provocado por outros animais mamíferos - área para a prática de esportes e atletismo", + W554: "Mordedura ou golpe provocado por outros animais mamíferos - rua e estrada", + W555: "Mordedura ou golpe provocado por outros animais mamíferos - áreas de comércio e de serviços", + W556: "Mordedura ou golpe provocado por outros animais mamíferos - áreas industriais e em construção", + W557: "Mordedura ou golpe provocado por outros animais mamíferos - fazenda", + W558: "Mordedura ou golpe provocado por outros animais mamíferos - outros locais especificados", + W559: "Mordedura ou golpe provocado por outros animais mamíferos - local não especificado", + W56: "Contato com animais marinhos", + W560: "Contato com animais marinhos - residência", + W561: "Contato com animais marinhos - habitação coletiva", + W562: "Contato com animais marinhos - escolas, outras instituições e áreas de administração pública", + W563: "Contato com animais marinhos - área para a prática de esportes e atletismo", + W564: "Contato com animais marinhos - rua e estrada", + W565: "Contato com animais marinhos - áreas de comércio e de serviços", + W566: "Contato com animais marinhos - áreas industriais e em construção", + W567: "Contato com animais marinhos - fazenda", + W568: "Contato com animais marinhos - outros locais especificados", + W569: "Contato com animais marinhos - local não especificado", + W57: "Mordeduras e picadas de inseto e de outros artrópodes, não-venenosos", + W570: "Mordeduras e picadas de inseto e de outros artrópodes, não-venenosos - residência", + W571: "Mordeduras e picadas de inseto e de outros artrópodes, não-venenosos - habitação coletiva", + W572: "Mordeduras e picadas de inseto e de outros artrópodes, não-venenosos - escolas, outras instituições e áreas de administração pública", + W573: "Mordeduras e picadas de inseto e de outros artrópodes, não-venenosos - área para a prática de esportes e atletismo", + W574: "Mordeduras e picadas de inseto e de outros artrópodes, não-venenosos - rua e estrada", + W575: "Mordeduras e picadas de inseto e de outros artrópodes, não-venenosos - áreas de comércio e de serviços", + W576: "Mordeduras e picadas de inseto e de outros artrópodes, não-venenosos - áreas industriais e em construção", + W577: "Mordeduras e picadas de inseto e de outros artrópodes, não-venenosos - fazenda", + W578: "Mordeduras e picadas de inseto e de outros artrópodes, não-venenosos - outros locais especificados", + W579: "Mordeduras e picadas de inseto e de outros artrópodes, não-venenosos - local não especificado", + W58: "Mordedura ou golpe provocado por crocodilo ou aligátor", + W580: "Mordedura ou golpe provocado por crocodilo ou aligátor - residência", + W581: "Mordedura ou golpe provocado por crocodilo ou aligátor - habitação coletiva", + W582: "Mordedura ou golpe provocado por crocodilo ou aligátor - escolas, outras instituições e áreas de administração pública", + W583: "Mordedura ou golpe provocado por crocodilo ou aligátor - área para a prática de esportes e atletismo", + W584: "Mordedura ou golpe provocado por crocodilo ou aligátor - rua e estrada", + W585: "Mordedura ou golpe provocado por crocodilo ou aligátor - áreas de comércio e de serviços", + W586: "Mordedura ou golpe provocado por crocodilo ou aligátor - áreas industriais e em construção", + W587: "Mordedura ou golpe provocado por crocodilo ou aligátor - fazenda", + W588: "Mordedura ou golpe provocado por crocodilo ou aligátor - outros locais especificados", + W589: "Mordedura ou golpe provocado por crocodilo ou aligátor - local não especificado", + W59: "Mordedura ou esmagamento provocado por outros répteis", + W590: "Mordedura ou esmagamento provocado por outros répteis - residência", + W591: "Mordedura ou esmagamento provocado por outros répteis - habitação coletiva", + W592: "Mordedura ou esmagamento provocado por outros répteis - escolas, outras instituições e áreas de administração pública", + W593: "Mordedura ou esmagamento provocado por outros répteis - área para a prática de esportes e atletismo", + W594: "Mordedura ou esmagamento provocado por outros répteis - rua e estrada", + W595: "Mordedura ou esmagamento provocado por outros répteis - áreas de comércio e de serviços", + W596: "Mordedura ou esmagamento provocado por outros répteis - áreas industriais e em construção", + W597: "Mordedura ou esmagamento provocado por outros répteis - fazenda", + W598: "Mordedura ou esmagamento provocado por outros répteis - outros locais especificados", + W599: "Mordedura ou esmagamento provocado por outros répteis - local não especificado", + W60: "Contato com espinhos de plantas ou com folhas aguçadas", + W600: "Contato com espinhos de plantas ou com folhas aguçadas - residência", + W601: "Contato com espinhos de plantas ou com folhas aguçadas - habitação coletiva", + W602: "Contato com espinhos de plantas ou com folhas aguçadas - escolas, outras instituições e áreas de administração pública", + W603: "Contato com espinhos de plantas ou com folhas aguçadas - área para a prática de esportes e atletismo", + W604: "Contato com espinhos de plantas ou com folhas aguçadas - rua e estrada", + W605: "Contato com espinhos de plantas ou com folhas aguçadas - áreas de comércio e de serviços", + W606: "Contato com espinhos de plantas ou com folhas aguçadas - áreas industriais e em construção", + W607: "Contato com espinhos de plantas ou com folhas aguçadas - fazenda", + W608: "Contato com espinhos de plantas ou com folhas aguçadas - outros locais especificados", + W609: "Contato com espinhos de plantas ou com folhas aguçadas - local não especificado", + W64: "Exposição a outras forças mecânicas animadas e às não especificadas", + W640: "Exposição a outras forças mecânicas animadas e às não especificadas - residência", + W641: "Exposição a outras forças mecânicas animadas e às não especificadas - habitação coletiva", + W642: "Exposição a outras forças mecânicas animadas e às não especificadas - escolas, outras instituições e áreas de administração pública", + W643: "Exposição a outras forças mecânicas animadas e às não especificadas - área para a prática de esportes e atletismo", + W644: "Exposição a outras forças mecânicas animadas e às não especificadas - rua e estrada", + W645: "Exposição a outras forças mecânicas animadas e às não especificadas - áreas de comércio e de serviços", + W646: "Exposição a outras forças mecânicas animadas e às não especificadas - áreas industriais e em construção", + W647: "Exposição a outras forças mecânicas animadas e às não especificadas - fazenda", + W648: "Exposição a outras forças mecânicas animadas e às não especificadas - outros locais especificados", + W649: "Exposição a outras forças mecânicas animadas e às não especificadas - local não especificado", + W65: "Afogamento e submersão durante banho em banheira", + W650: "Afogamento e submersão durante banho em banheira - residência", + W651: "Afogamento e submersão durante banho em banheira - habitação coletiva", + W652: "Afogamento e submersão durante banho em banheira - escolas, outras instituições e áreas de administração pública", + W653: "Afogamento e submersão durante banho em banheira - área para a prática de esportes e atletismo", + W654: "Afogamento e submersão durante banho em banheira - rua e estrada", + W655: "Afogamento e submersão durante banho em banheira - áreas de comércio e de serviços", + W656: "Afogamento e submersão durante banho em banheira - áreas industriais e em construção", + W657: "Afogamento e submersão durante banho em banheira - fazenda", + W658: "Afogamento e submersão durante banho em banheira - outros locais especificados", + W659: "Afogamento e submersão durante banho em banheira - local não especificado", + W66: "Afogamento e submersão consecutiva a queda dentro de uma banheira", + W660: "Afogamento e submersão consecutiva a queda dentro de uma banheira - residência", + W661: "Afogamento e submersão consecutiva a queda dentro de uma banheira - habitação coletiva", + W662: "Afogamento e submersão consecutiva a queda dentro de uma banheira - escolas, outras instituições e áreas de administração pública", + W663: "Afogamento e submersão consecutiva a queda dentro de uma banheira - área para a prática de esportes e atletismo", + W664: "Afogamento e submersão consecutiva a queda dentro de uma banheira - rua e estrada", + W665: "Afogamento e submersão consecutiva a queda dentro de uma banheira - áreas de comércio e de serviços", + W666: "Afogamento e submersão consecutiva a queda dentro de uma banheira - áreas industriais e em construção", + W667: "Afogamento e submersão consecutiva a queda dentro de uma banheira - fazenda", + W668: "Afogamento e submersão consecutiva a queda dentro de uma banheira - outros locais especificados", + W669: "Afogamento e submersão consecutiva a queda dentro de uma banheira - local não especificado", + W67: "Afogamento e submersão em piscina", + W670: "Afogamento e submersão em piscina - residência", + W671: "Afogamento e submersão em piscina - habitação coletiva", + W672: "Afogamento e submersão em piscina - escolas, outras instituições e áreas de administração pública", + W673: "Afogamento e submersão em piscina - área para a prática de esportes e atletismo", + W674: "Afogamento e submersão em piscina - rua e estrada", + W675: "Afogamento e submersão em piscina - áreas de comércio e de serviços", + W676: "Afogamento e submersão em piscina - áreas industriais e em construção", + W677: "Afogamento e submersão em piscina - fazenda", + W678: "Afogamento e submersão em piscina - outros locais especificados", + W679: "Afogamento e submersão em piscina - local não especificado", + W68: "Afogamento e submersão conseqüente a queda dentro de uma piscina", + W680: "Afogamento e submersão conseqüente a queda dentro de uma piscina - residência", + W681: "Afogamento e submersão conseqüente a queda dentro de uma piscina - habitação coletiva", + W682: "Afogamento e submersão conseqüente a queda dentro de uma piscina - escolas, outras instituições e áreas de administração pública", + W683: "Afogamento e submersão conseqüente a queda dentro de uma piscina - área para a prática de esportes e atletismo", + W684: "Afogamento e submersão conseqüente a queda dentro de uma piscina - rua e estrada", + W685: "Afogamento e submersão conseqüente a queda dentro de uma piscina - áreas de comércio e de serviços", + W686: "Afogamento e submersão conseqüente a queda dentro de uma piscina - áreas industriais e em construção", + W687: "Afogamento e submersão conseqüente a queda dentro de uma piscina - fazenda", + W688: "Afogamento e submersão conseqüente a queda dentro de uma piscina - outros locais especificados", + W689: "Afogamento e submersão conseqüente a queda dentro de uma piscina - local não especificado", + W69: "Afogamento e submersão em águas naturais", + W690: "Afogamento e submersão em águas naturais - residência", + W691: "Afogamento e submersão em águas naturais - habitação coletiva", + W692: "Afogamento e submersão em águas naturais - escolas, outras instituições e áreas de administração pública", + W693: "Afogamento e submersão em águas naturais - área para a prática de esportes e atletismo", + W694: "Afogamento e submersão em águas naturais - rua e estrada", + W695: "Afogamento e submersão em águas naturais - áreas de comércio e de serviços", + W696: "Afogamento e submersão em águas naturais - áreas industriais e em construção", + W697: "Afogamento e submersão em águas naturais - fazenda", + W698: "Afogamento e submersão em águas naturais - outros locais especificados", + W699: "Afogamento e submersão em águas naturais - local não especificado", + W70: "Afogamento e submersão conseqüentes a queda dentro de águas naturais", + W700: "Afogamento e submersão conseqüentes a queda dentro de águas naturais - residência", + W701: "Afogamento e submersão conseqüentes a queda dentro de águas naturais - habitação coletiva", + W702: "Afogamento e submersão conseqüentes a queda dentro de águas naturais - escolas, outras instituições e áreas de administração pública", + W703: "Afogamento e submersão conseqüentes a queda dentro de águas naturais - área para a prática de esportes e atletismo", + W704: "Afogamento e submersão conseqüentes a queda dentro de águas naturais - rua e estrada", + W705: "Afogamento e submersão conseqüentes a queda dentro de águas naturais - áreas de comércio e de serviços", + W706: "Afogamento e submersão conseqüentes a queda dentro de águas naturais - áreas industriais e em construção", + W707: "Afogamento e submersão conseqüentes a queda dentro de águas naturais - fazenda", + W708: "Afogamento e submersão conseqüentes a queda dentro de águas naturais - outros locais especificados", + W709: "Afogamento e submersão conseqüentes a queda dentro de águas naturais - local não especificado", + W73: "Outros afogamentos e submersão especificados", + W730: "Outros afogamentos e submersão especificados - residência", + W731: "Outros afogamentos e submersão especificados - habitação coletiva", + W732: "Outros afogamentos e submersão especificados - escolas, outras instituições e áreas de administração pública", + W733: "Outros afogamentos e submersão especificados - área para a prática de esportes e atletismo", + W734: "Outros afogamentos e submersão especificados - rua e estrada", + W735: "Outros afogamentos e submersão especificados - áreas de comércio e de serviços", + W736: "Outros afogamentos e submersão especificados - áreas industriais e em construção", + W737: "Outros afogamentos e submersão especificados - fazenda", + W738: "Outros afogamentos e submersão especificados - outros locais especificados", + W739: "Outros afogamentos e submersão especificados - local não especificado", + W74: "Afogamento e submersão não especificados", + W740: "Afogamento e submersão não especificados - residência", + W741: "Afogamento e submersão não especificados - habitação coletiva", + W742: "Afogamento e submersão não especificados - escolas, outras instituições e áreas de administração pública", + W743: "Afogamento e submersão não especificados - área para a prática de esportes e atletismo", + W744: "Afogamento e submersão não especificados - rua e estrada", + W745: "Afogamento e submersão não especificados - áreas de comércio e de serviços", + W746: "Afogamento e submersão não especificados - áreas industriais e em construção", + W747: "Afogamento e submersão não especificados - fazenda", + W748: "Afogamento e submersão não especificados - outros locais especificados", + W749: "Afogamento e submersão não especificados - local não especificado", + W75: "Sufocação e estrangulamento acidental na cama", + W750: "Sufocação e estrangulamento acidental na cama - residência", + W751: "Sufocação e estrangulamento acidental na cama - habitação coletiva", + W752: "Sufocação e estrangulamento acidental na cama - escolas, outras instituições e áreas de administração pública", + W753: "Sufocação e estrangulamento acidental na cama - área para a prática de esportes e atletismo", + W754: "Sufocação e estrangulamento acidental na cama - rua e estrada", + W755: "Sufocação e estrangulamento acidental na cama - áreas de comércio e de serviços", + W756: "Sufocação e estrangulamento acidental na cama - áreas industriais e em construção", + W757: "Sufocação e estrangulamento acidental na cama - fazenda", + W758: "Sufocação e estrangulamento acidental na cama - outros locais especificados", + W759: "Sufocação e estrangulamento acidental na cama - local não especificado", + W76: "Outro enforcamento e estrangulamento acidental", + W760: "Outro enforcamento e estrangulamento acidental - residência", + W761: "Outro enforcamento e estrangulamento acidental - habitação coletiva", + W762: "Outro enforcamento e estrangulamento acidental - escolas, outras instituições e áreas de administração pública", + W763: "Outro enforcamento e estrangulamento acidental - área para a prática de esportes e atletismo", + W764: "Outro enforcamento e estrangulamento acidental - rua e estrada", + W765: "Outro enforcamento e estrangulamento acidental - áreas de comércio e de serviços", + W766: "Outro enforcamento e estrangulamento acidental - áreas industriais e em construção", + W767: "Outro enforcamento e estrangulamento acidental - fazenda", + W768: "Outro enforcamento e estrangulamento acidental - outros locais especificados", + W769: "Outro enforcamento e estrangulamento acidental - local não especificado", + W77: "Risco a respiração devido a desmoronamento, queda de terra e de outras substâncias", + W770: "Risco a respiração devido a desmoronamento, queda de terra e de outras substâncias - residência", + W771: "Risco a respiração devido a desmoronamento, queda de terra e de outras substâncias - habitação coletiva", + W772: "Risco a respiração devido a desmoronamento, queda de terra e de outras substâncias - escolas, outras instituições e áreas de administração pública", + W773: "Risco a respiração devido a desmoronamento, queda de terra e de outras substâncias - área para a prática de esportes e atletismo", + W774: "Risco a respiração devido a desmoronamento, queda de terra e de outras substâncias - rua e estrada", + W775: "Risco a respiração devido a desmoronamento, queda de terra e de outras substâncias - áreas de comércio e de serviços", + W776: "Risco a respiração devido a desmoronamento, queda de terra e de outras substâncias - áreas industriais e em construção", + W777: "Risco a respiração devido a desmoronamento, queda de terra e de outras substâncias - fazenda", + W778: "Risco a respiração devido a desmoronamento, queda de terra e de outras substâncias - outros locais especificados", + W779: "Risco a respiração devido a desmoronamento, queda de terra e de outras substâncias - local não especificado", + W78: "Inalação do conteúdo gástrico", + W780: "Inalação do conteúdo gástrico - residência", + W781: "Inalação do conteúdo gástrico - habitação coletiva", + W782: "Inalação do conteúdo gástrico - escolas, outras instituições e áreas de administração pública", + W783: "Inalação do conteúdo gástrico - área para a prática de esportes e atletismo", + W784: "Inalação do conteúdo gástrico - rua e estrada", + W785: "Inalação do conteúdo gástrico - áreas de comércio e de serviços", + W786: "Inalação do conteúdo gástrico - áreas industriais e em construção", + W787: "Inalação do conteúdo gástrico - fazenda", + W788: "Inalação do conteúdo gástrico - outros locais especificados", + W789: "Inalação do conteúdo gástrico - local não especificado", + W79: "Inalação e ingestão de alimentos causando obstrução do trato respiratório", + W790: "Inalação e ingestão de alimentos causando obstrução do trato respiratório - residência", + W791: "Inalação e ingestão de alimentos causando obstrução do trato respiratório - habitação coletiva", + W792: "Inalação e ingestão de alimentos causando obstrução do trato respiratório - escolas, outras instituições e áreas de administração pública", + W793: "Inalação e ingestão de alimentos causando obstrução do trato respiratório - área para a prática de esportes e atletismo", + W794: "Inalação e ingestão de alimentos causando obstrução do trato respiratório - rua e estrada", + W795: "Inalação e ingestão de alimentos causando obstrução do trato respiratório - áreas de comércio e de serviços", + W796: "Inalação e ingestão de alimentos causando obstrução do trato respiratório - áreas industriais e em construção", + W797: "Inalação e ingestão de alimentos causando obstrução do trato respiratório - fazenda", + W798: "Inalação e ingestão de alimentos causando obstrução do trato respiratório - outros locais especificados", + W799: "Inalação e ingestão de alimentos causando obstrução do trato respiratório - local não especificado", + W80: "Inalação e ingestão de outros objetos causando obstrução do trato respiratório", + W800: "Inalação e ingestão de outros objetos causando obstrução do trato respiratório - residência", + W801: "Inalação e ingestão de outros objetos causando obstrução do trato respiratório - habitação coletiva", + W802: "Inalação e ingestão de outros objetos causando obstrução do trato respiratório - escolas, outras instituições e áreas de administração pública", + W803: "Inalação e ingestão de outros objetos causando obstrução do trato respiratório - área para a prática de esportes e atletismo", + W804: "Inalação e ingestão de outros objetos causando obstrução do trato respiratório - rua e estrada", + W805: "Inalação e ingestão de outros objetos causando obstrução do trato respiratório - áreas de comércio e de serviços", + W806: "Inalação e ingestão de outros objetos causando obstrução do trato respiratório - áreas industriais e em construção", + W807: "Inalação e ingestão de outros objetos causando obstrução do trato respiratório - fazenda", + W808: "Inalação e ingestão de outros objetos causando obstrução do trato respiratório - outros locais especificados", + W809: "Inalação e ingestão de outros objetos causando obstrução do trato respiratório - local não especificado", + W81: "Confinado ou aprisionado em um ambiente pobre em oxigênio", + W810: "Confinado ou aprisionado em um ambiente pobre em oxigênio - residência", + W811: "Confinado ou aprisionado em um ambiente pobre em oxigênio - habitação coletiva", + W812: "Confinado ou aprisionado em um ambiente pobre em oxigênio - escolas, outras instituições e áreas de administração pública", + W813: "Confinado ou aprisionado em um ambiente pobre em oxigênio - área para a prática de esportes e atletismo", + W814: "Confinado ou aprisionado em um ambiente pobre em oxigênio - rua e estrada", + W815: "Confinado ou aprisionado em um ambiente pobre em oxigênio - áreas de comércio e de serviços", + W816: "Confinado ou aprisionado em um ambiente pobre em oxigênio - áreas industriais e em construção", + W817: "Confinado ou aprisionado em um ambiente pobre em oxigênio - fazenda", + W818: "Confinado ou aprisionado em um ambiente pobre em oxigênio - outros locais especificados", + W819: "Confinado ou aprisionado em um ambiente pobre em oxigênio - local não especificado", + W83: "Outros riscos especificados à respiração", + W830: "Outros riscos especificados à respiração - residência", + W831: "Outros riscos especificados à respiração - habitação coletiva", + W832: "Outros riscos especificados à respiração - escolas, outras instituições e áreas de administração pública", + W833: "Outros riscos especificados à respiração - área para a prática de esportes e atletismo", + W834: "Outros riscos especificados à respiração - rua e estrada", + W835: "Outros riscos especificados à respiração - áreas de comércio e de serviços", + W836: "Outros riscos especificados à respiração - áreas industriais e em construção", + W837: "Outros riscos especificados à respiração - fazenda", + W838: "Outros riscos especificados à respiração - outros locais especificados", + W839: "Outros riscos especificados à respiração - local não especificado", + W84: "Riscos não especificados à respiração", + W840: "Riscos não especificados à respiração - residência", + W841: "Riscos não especificados à respiração - habitação coletiva", + W842: "Riscos não especificados à respiração - escolas, outras instituições e áreas de administração pública", + W843: "Riscos não especificados à respiração - área para a prática de esportes e atletismo", + W844: "Riscos não especificados à respiração - rua e estrada", + W845: "Riscos não especificados à respiração - áreas de comércio e de serviços", + W846: "Riscos não especificados à respiração - áreas industriais e em construção", + W847: "Riscos não especificados à respiração - fazenda", + W848: "Riscos não especificados à respiração - outros locais especificados", + W849: "Riscos não especificados à respiração - local não especificado", + W85: "Exposição a linhas de transmissão de corrente elétrica", + W850: "Exposição a linhas de transmissão de corrente elétrica - residência", + W851: "Exposição a linhas de transmissão de corrente elétrica - habitação coletiva", + W852: "Exposição a linhas de transmissão de corrente elétrica - escolas, outras instituições e áreas de administração pública", + W853: "Exposição a linhas de transmissão de corrente elétrica - área para a prática de esportes e atletismo", + W854: "Exposição a linhas de transmissão de corrente elétrica - rua e estrada", + W855: "Exposição a linhas de transmissão de corrente elétrica - áreas de comércio e de serviços", + W856: "Exposição a linhas de transmissão de corrente elétrica - áreas industriais e em construção", + W857: "Exposição a linhas de transmissão de corrente elétrica - fazenda", + W858: "Exposição a linhas de transmissão de corrente elétrica - outros locais especificados", + W859: "Exposição a linhas de transmissão de corrente elétrica - local não especificado", + W86: "Exposição a outra corrente elétrica especificada", + W860: "Exposição a outra corrente elétrica especificada - residência", + W861: "Exposição a outra corrente elétrica especificada - habitação coletiva", + W862: "Exposição a outra corrente elétrica especificada - escolas, outras instituições e áreas de administração pública", + W863: "Exposição a outra corrente elétrica especificada - área para a prática de esportes e atletismo", + W864: "Exposição a outra corrente elétrica especificada - rua e estrada", + W865: "Exposição a outra corrente elétrica especificada - áreas de comércio e de serviços", + W866: "Exposição a outra corrente elétrica especificada - áreas industriais e em construção", + W867: "Exposição a outra corrente elétrica especificada - fazenda", + W868: "Exposição a outra corrente elétrica especificada - outros locais especificados", + W869: "Exposição a outra corrente elétrica especificada - local não especificado", + W87: "Exposição a corrente elétrica não especificada", + W870: "Exposição a corrente elétrica não especificada - residência", + W871: "Exposição a corrente elétrica não especificada - habitação coletiva", + W872: "Exposição a corrente elétrica não especificada - escolas, outras instituições e áreas de administração pública", + W873: "Exposição a corrente elétrica não especificada - área para a prática de esportes e atletismo", + W874: "Exposição a corrente elétrica não especificada - rua e estrada", + W875: "Exposição a corrente elétrica não especificada - áreas de comércio e de serviços", + W876: "Exposição a corrente elétrica não especificada - áreas industriais e em construção", + W877: "Exposição a corrente elétrica não especificada - fazenda", + W878: "Exposição a corrente elétrica não especificada - outros locais especificados", + W879: "Exposição a corrente elétrica não especificada - local não especificado", + W88: "Exposição a radiação ionizante", + W880: "Exposição a radiação ionizante - residência", + W881: "Exposição a radiação ionizante - habitação coletiva", + W882: "Exposição a radiação ionizante - escolas, outras instituições e áreas de administração pública", + W883: "Exposição a radiação ionizante - área para a prática de esportes e atletismo", + W884: "Exposição a radiação ionizante - rua e estrada", + W885: "Exposição a radiação ionizante - áreas de comércio e de serviços", + W886: "Exposição a radiação ionizante - áreas industriais e em construção", + W887: "Exposição a radiação ionizante - fazenda", + W888: "Exposição a radiação ionizante - outros locais especificados", + W889: "Exposição a radiação ionizante - local não especificado", + W89: "Exposição a fontes luminosas artificiais visíveis ou à luz ultravioleta", + W890: "Exposição a fontes luminosas artificiais visíveis ou à luz ultravioleta - residência", + W891: "Exposição a fontes luminosas artificiais visíveis ou à luz ultravioleta - habitação coletiva", + W892: "Exposição a fontes luminosas artificiais visíveis ou à luz ultravioleta - escolas, outras instituições e áreas de administração pública", + W893: "Exposição a fontes luminosas artificiais visíveis ou à luz ultravioleta - área para a prática de esportes e atletismo", + W894: "Exposição a fontes luminosas artificiais visíveis ou à luz ultravioleta - rua e estrada", + W895: "Exposição a fontes luminosas artificiais visíveis ou à luz ultravioleta - áreas de comércio e de serviços", + W896: "Exposição a fontes luminosas artificiais visíveis ou à luz ultravioleta - áreas industriais e em construção", + W897: "Exposição a fontes luminosas artificiais visíveis ou à luz ultravioleta - fazenda", + W898: "Exposição a fontes luminosas artificiais visíveis ou à luz ultravioleta - outros locais especificados", + W899: "Exposição a fontes luminosas artificiais visíveis ou à luz ultravioleta - local não especificado", + W90: "Exposição a outros tipos de radiação não-ionizante", + W900: "Exposição a outros tipos de radiação não-ionizante - residência", + W901: "Exposição a outros tipos de radiação não-ionizante - habitação coletiva", + W902: "Exposição a outros tipos de radiação não-ionizante - escolas, outras instituições e áreas de administração pública", + W903: "Exposição a outros tipos de radiação não-ionizante - área para a prática de esportes e atletismo", + W904: "Exposição a outros tipos de radiação não-ionizante - rua e estrada", + W905: "Exposição a outros tipos de radiação não-ionizante - áreas de comércio e de serviços", + W906: "Exposição a outros tipos de radiação não-ionizante - áreas industriais e em construção", + W907: "Exposição a outros tipos de radiação não-ionizante - fazenda", + W908: "Exposição a outros tipos de radiação não-ionizante - outros locais especificados", + W909: "Exposição a outros tipos de radiação não-ionizante - local não especificado", + W91: "Exposição a tipo não especificado de radiação", + W910: "Exposição a tipo não especificado de radiação - residência", + W911: "Exposição a tipo não especificado de radiação - habitação coletiva", + W912: "Exposição a tipo não especificado de radiação - escolas, outras instituições e áreas de administração pública", + W913: "Exposição a tipo não especificado de radiação - área para a prática de esportes e atletismo", + W914: "Exposição a tipo não especificado de radiação - rua e estrada", + W915: "Exposição a tipo não especificado de radiação - áreas de comércio e de serviços", + W916: "Exposição a tipo não especificado de radiação - áreas industriais e em construção", + W917: "Exposição a tipo não especificado de radiação - fazenda", + W918: "Exposição a tipo não especificado de radiação - outros locais especificados", + W919: "Exposição a tipo não especificado de radiação - local não especificado", + W92: "Exposição a um calor excessivo de origem artificial", + W920: "Exposição a um calor excessivo de origem artificial - residência", + W921: "Exposição a um calor excessivo de origem artificial - habitação coletiva", + W922: "Exposição a um calor excessivo de origem artificial - escolas, outras instituições e áreas de administração pública", + W923: "Exposição a um calor excessivo de origem artificial - área para a prática de esportes e atletismo", + W924: "Exposição a um calor excessivo de origem artificial - rua e estrada", + W925: "Exposição a um calor excessivo de origem artificial - áreas de comércio e de serviços", + W926: "Exposição a um calor excessivo de origem artificial - áreas industriais e em construção", + W927: "Exposição a um calor excessivo de origem artificial - fazenda", + W928: "Exposição a um calor excessivo de origem artificial - outros locais especificados", + W929: "Exposição a um calor excessivo de origem artificial - local não especificado", + W93: "Exposição a um frio excessivo de origem artificial", + W930: "Exposição a um frio excessivo de origem artificial - residência", + W931: "Exposição a um frio excessivo de origem artificial - habitação coletiva", + W932: "Exposição a um frio excessivo de origem artificial - escolas, outras instituições e áreas de administração pública", + W933: "Exposição a um frio excessivo de origem artificial - área para a prática de esportes e atletismo", + W934: "Exposição a um frio excessivo de origem artificial - rua e estrada", + W935: "Exposição a um frio excessivo de origem artificial - áreas de comércio e de serviços", + W936: "Exposição a um frio excessivo de origem artificial - áreas industriais e em construção", + W937: "Exposição a um frio excessivo de origem artificial - fazenda", + W938: "Exposição a um frio excessivo de origem artificial - outros locais especificados", + W939: "Exposição a um frio excessivo de origem artificial - local não especificado", + W94: "Exposição a alta, baixa e a variações da pressão atmosférica", + W940: "Exposição a alta, baixa e a variações da pressão atmosférica - residência", + W941: "Exposição a alta, baixa e a variações da pressão atmosférica - habitação coletiva", + W942: "Exposição a alta, baixa e a variações da pressão atmosférica - escolas, outras instituições e áreas de administração pública", + W943: "Exposição a alta, baixa e a variações da pressão atmosférica - área para a prática de esportes e atletismo", + W944: "Exposição a alta, baixa e a variações da pressão atmosférica - rua e estrada", + W945: "Exposição a alta, baixa e a variações da pressão atmosférica - áreas de comércio e de serviços", + W946: "Exposição a alta, baixa e a variações da pressão atmosférica - áreas industriais e em construção", + W947: "Exposição a alta, baixa e a variações da pressão atmosférica - fazenda", + W948: "Exposição a alta, baixa e a variações da pressão atmosférica - outros locais especificados", + W949: "Exposição a alta, baixa e a variações da pressão atmosférica - local não especificado", + W99: "Exposição a outros fatores ambientais artificiais e aos não especificados", + W990: "Exposição a outros fatores ambientais artificiais e aos não especificados - residência", + W991: "Exposição a outros fatores ambientais artificiais e aos não especificados - habitação coletiva", + W992: "Exposição a outros fatores ambientais artificiais e aos não especificados - escolas, outras instituições e áreas de administração pública", + W993: "Exposição a outros fatores ambientais artificiais e aos não especificados - área para a prática de esportes e atletismo", + W994: "Exposição a outros fatores ambientais artificiais e aos não especificados - rua e estrada", + W995: "Exposição a outros fatores ambientais artificiais e aos não especificados - áreas de comércio e de serviços", + W996: "Exposição a outros fatores ambientais artificiais e aos não especificados - áreas industriais e em construção", + W997: "Exposição a outros fatores ambientais artificiais e aos não especificados - fazenda", + W998: "Exposição a outros fatores ambientais artificiais e aos não especificados - outros locais especificados", + W999: "Exposição a outros fatores ambientais artificiais e aos não especificados - local não especificado", + X00: "Exposição a fogo não-controlado em um edifício ou outro tipo de construção", + X000: "Exposição a fogo não-controlado em um edifício ou outro tipo de construção - residência", + X001: "Exposição a fogo não-controlado em um edifício ou outro tipo de construção - habitação coletiva", + X002: "Exposição a fogo não-controlado em um edifício ou outro tipo de construção - escolas, outras instituições e áreas de administração pública", + X003: "Exposição a fogo não-controlado em um edifício ou outro tipo de construção - área para a prática de esportes e atletismo", + X004: "Exposição a fogo não-controlado em um edifício ou outro tipo de construção - rua e estrada", + X005: "Exposição a fogo não-controlado em um edifício ou outro tipo de construção - áreas de comércio e de serviços", + X006: "Exposição a fogo não-controlado em um edifício ou outro tipo de construção - áreas industriais e em construção", + X007: "Exposição a fogo não-controlado em um edifício ou outro tipo de construção - fazenda", + X008: "Exposição a fogo não-controlado em um edifício ou outro tipo de construção - outros locais especificados", + X009: "Exposição a fogo não-controlado em um edifício ou outro tipo de construção - local não especificado", + X01: "Exposição a fogo não-controlado fora de um edifício ou de outro tipo de construção", + X010: "Exposição a fogo não-controlado fora de um edifício ou de outro tipo de construção - residência", + X011: "Exposição a fogo não-controlado fora de um edifício ou de outro tipo de construção - habitação coletiva", + X012: "Exposição a fogo não-controlado fora de um edifício ou de outro tipo de construção - escolas, outras instituições e áreas de administração pública", + X013: "Exposição a fogo não-controlado fora de um edifício ou de outro tipo de construção - área para a prática de esportes e atletismo", + X014: "Exposição a fogo não-controlado fora de um edifício ou de outro tipo de construção - rua e estrada", + X015: "Exposição a fogo não-controlado fora de um edifício ou de outro tipo de construção - áreas de comércio e de serviços", + X016: "Exposição a fogo não-controlado fora de um edifício ou de outro tipo de construção - áreas industriais e em construção", + X017: "Exposição a fogo não-controlado fora de um edifício ou de outro tipo de construção - fazenda", + X018: "Exposição a fogo não-controlado fora de um edifício ou de outro tipo de construção - outros locais especificados", + X019: "Exposição a fogo não-controlado fora de um edifício ou de outro tipo de construção - local não especificado", + X02: "Exposição a fogo controlado em um edifício ou outro tipo de construção", + X020: "Exposição a fogo controlado em um edifício ou outro tipo de construção - residência", + X021: "Exposição a fogo controlado em um edifício ou outro tipo de construção - habitação coletiva", + X022: "Exposição a fogo controlado em um edifício ou outro tipo de construção - escolas, outras instituições e áreas de administração pública", + X023: "Exposição a fogo controlado em um edifício ou outro tipo de construção - área para a prática de esportes e atletismo", + X024: "Exposição a fogo controlado em um edifício ou outro tipo de construção - rua e estrada", + X025: "Exposição a fogo controlado em um edifício ou outro tipo de construção - áreas de comércio e de serviços", + X026: "Exposição a fogo controlado em um edifício ou outro tipo de construção - áreas industriais e em construção", + X027: "Exposição a fogo controlado em um edifício ou outro tipo de construção - fazenda", + X028: "Exposição a fogo controlado em um edifício ou outro tipo de construção - outros locais especificados", + X029: "Exposição a fogo controlado em um edifício ou outro tipo de construção - local não especificado", + X03: "Exposição a fogo controlado fora de um edifício ou de outro tipo de construção", + X030: "Exposição a fogo controlado fora de um edifício ou de outro tipo de construção - residência", + X031: "Exposição a fogo controlado fora de um edifício ou de outro tipo de construção - habitação coletiva", + X032: "Exposição a fogo controlado fora de um edifício ou de outro tipo de construção - escolas, outras instituições e áreas de administração pública", + X033: "Exposição a fogo controlado fora de um edifício ou de outro tipo de construção - área para a prática de esportes e atletismo", + X034: "Exposição a fogo controlado fora de um edifício ou de outro tipo de construção - rua e estrada", + X035: "Exposição a fogo controlado fora de um edifício ou de outro tipo de construção - áreas de comércio e de serviços", + X036: "Exposição a fogo controlado fora de um edifício ou de outro tipo de construção - áreas industriais e em construção", + X037: "Exposição a fogo controlado fora de um edifício ou de outro tipo de construção - fazenda", + X038: "Exposição a fogo controlado fora de um edifício ou de outro tipo de construção - outros locais especificados", + X039: "Exposição a fogo controlado fora de um edifício ou de outro tipo de construção - local não especificado", + X04: "Exposição a combustão de substância muito inflamável", + X040: "Exposição a combustão de substância muito inflamável - residência", + X041: "Exposição a combustão de substância muito inflamável - habitação coletiva", + X042: "Exposição a combustão de substância muito inflamável - escolas, outras instituições e áreas de administração pública", + X043: "Exposição a combustão de substância muito inflamável - área para a prática de esportes e atletismo", + X044: "Exposição a combustão de substância muito inflamável - rua e estrada", + X045: "Exposição a combustão de substância muito inflamável - áreas de comércio e de serviços", + X046: "Exposição a combustão de substância muito inflamável - áreas industriais e em construção", + X047: "Exposição a combustão de substância muito inflamável - fazenda", + X048: "Exposição a combustão de substância muito inflamável - outros locais especificados", + X049: "Exposição a combustão de substância muito inflamável - local não especificado", + X05: "Exposição a combustão de roupa de dormir", + X050: "Exposição a combustão de roupa de dormir - residência", + X051: "Exposição a combustão de roupa de dormir - habitação coletiva", + X052: "Exposição a combustão de roupa de dormir - escolas, outras instituições e áreas de administração pública", + X053: "Exposição a combustão de roupa de dormir - área para a prática de esportes e atletismo", + X054: "Exposição a combustão de roupa de dormir - rua e estrada", + X055: "Exposição a combustão de roupa de dormir - áreas de comércio e de serviços", + X056: "Exposição a combustão de roupa de dormir - áreas industriais e em construção", + X057: "Exposição a combustão de roupa de dormir - fazenda", + X058: "Exposição a combustão de roupa de dormir - outros locais especificados", + X059: "Exposição a combustão de roupa de dormir - local não especificado", + X06: "Exposição a combustão de outro tipo de roupa ou de acessórios", + X060: "Exposição a combustão de outro tipo de roupa ou de acessórios - residência", + X061: "Exposição a combustão de outro tipo de roupa ou de acessórios - habitação coletiva", + X062: "Exposição a combustão de outro tipo de roupa ou de acessórios - escolas, outras instituições e áreas de administração pública", + X063: "Exposição a combustão de outro tipo de roupa ou de acessórios - área para a prática de esportes e atletismo", + X064: "Exposição a combustão de outro tipo de roupa ou de acessórios - rua e estrada", + X065: "Exposição a combustão de outro tipo de roupa ou de acessórios - áreas de comércio e de serviços", + X066: "Exposição a combustão de outro tipo de roupa ou de acessórios - áreas industriais e em construção", + X067: "Exposição a combustão de outro tipo de roupa ou de acessórios - fazenda", + X068: "Exposição a combustão de outro tipo de roupa ou de acessórios - outros locais especificados", + X069: "Exposição a combustão de outro tipo de roupa ou de acessórios - local não especificado", + X08: "Exposição a outro tipo especificado de fumaça, fogo ou chamas", + X080: "Exposição a outro tipo especificado de fumaça, fogo ou chamas - residência", + X081: "Exposição a outro tipo especificado de fumaça, fogo ou chamas - habitação coletiva", + X082: "Exposição a outro tipo especificado de fumaça, fogo ou chamas - escolas, outras instituições e áreas de administração pública", + X083: "Exposição a outro tipo especificado de fumaça, fogo ou chamas - área para a prática de esportes e atletismo", + X084: "Exposição a outro tipo especificado de fumaça, fogo ou chamas - rua e estrada", + X085: "Exposição a outro tipo especificado de fumaça, fogo ou chamas - áreas de comércio e de serviços", + X086: "Exposição a outro tipo especificado de fumaça, fogo ou chamas - áreas industriais e em construção", + X087: "Exposição a outro tipo especificado de fumaça, fogo ou chamas - fazenda", + X088: "Exposição a outro tipo especificado de fumaça, fogo ou chamas - outros locais especificados", + X089: "Exposição a outro tipo especificado de fumaça, fogo ou chamas - local não especificado", + X09: "Exposição a tipo não especificado de fumaça, fogo ou chamas", + X090: "Exposição a tipo não especificado de fumaça, fogo ou chamas - residência", + X091: "Exposição a tipo não especificado de fumaça, fogo ou chamas - habitação coletiva", + X092: "Exposição a tipo não especificado de fumaça, fogo ou chamas - escolas, outras instituições e áreas de administração pública", + X093: "Exposição a tipo não especificado de fumaça, fogo ou chamas - área para a prática de esportes e atletismo", + X094: "Exposição a tipo não especificado de fumaça, fogo ou chamas - rua e estrada", + X095: "Exposição a tipo não especificado de fumaça, fogo ou chamas - áreas de comércio e de serviços", + X096: "Exposição a tipo não especificado de fumaça, fogo ou chamas - áreas industriais e em construção", + X097: "Exposição a tipo não especificado de fumaça, fogo ou chamas - fazenda", + X098: "Exposição a tipo não especificado de fumaça, fogo ou chamas - outros locais especificados", + X099: "Exposição a tipo não especificado de fumaça, fogo ou chamas - local não especificado", + X10: "Contato com bebidas, alimentos, gordura e óleo de cozinha quentes", + X100: "Contato com bebidas, alimentos, gordura e óleo de cozinha quentes - residência", + X101: "Contato com bebidas, alimentos, gordura e óleo de cozinha quentes - habitação coletiva", + X102: "Contato com bebidas, alimentos, gordura e óleo de cozinha quentes - escolas, outras instituições e áreas de administração pública", + X103: "Contato com bebidas, alimentos, gordura e óleo de cozinha quentes - área para a prática de esportes e atletismo", + X104: "Contato com bebidas, alimentos, gordura e óleo de cozinha quentes - rua e estrada", + X105: "Contato com bebidas, alimentos, gordura e óleo de cozinha quentes - áreas de comércio e de serviços", + X106: "Contato com bebidas, alimentos, gordura e óleo de cozinha quentes - áreas industriais e em construção", + X107: "Contato com bebidas, alimentos, gordura e óleo de cozinha quentes - fazenda", + X108: "Contato com bebidas, alimentos, gordura e óleo de cozinha quentes - outros locais especificados", + X109: "Contato com bebidas, alimentos, gordura e óleo de cozinha quentes - local não especificado", + X11: "Contato com água corrente quente de torneira", + X110: "Contato com água corrente quente de torneira - residência", + X111: "Contato com água corrente quente de torneira - habitação coletiva", + X112: "Contato com água corrente quente de torneira - escolas, outras instituições e áreas de administração pública", + X113: "Contato com água corrente quente de torneira - área para a prática de esportes e atletismo", + X114: "Contato com água corrente quente de torneira - rua e estrada", + X115: "Contato com água corrente quente de torneira - áreas de comércio e de serviços", + X116: "Contato com água corrente quente de torneira - áreas industriais e em construção", + X117: "Contato com água corrente quente de torneira - fazenda", + X118: "Contato com água corrente quente de torneira - outros locais especificados", + X119: "Contato com água corrente quente de torneira - local não especificado", + X12: "Contato com outros líquidos quentes", + X120: "Contato com outros líquidos quentes - residência", + X121: "Contato com outros líquidos quentes - habitação coletiva", + X122: "Contato com outros líquidos quentes - escolas, outras instituições e áreas de administração pública", + X123: "Contato com outros líquidos quentes - área para a prática de esportes e atletismo", + X124: "Contato com outros líquidos quentes - rua e estrada", + X125: "Contato com outros líquidos quentes - áreas de comércio e de serviços", + X126: "Contato com outros líquidos quentes - áreas industriais e em construção", + X127: "Contato com outros líquidos quentes - fazenda", + X128: "Contato com outros líquidos quentes - outros locais especificados", + X129: "Contato com outros líquidos quentes - local não especificado", + X13: "Contato com vapor d'água e com vapores quentes", + X130: "Contato com vapor d'água e com vapores quentes - residência", + X131: "Contato com vapor d'água e com vapores quentes - habitação coletiva", + X132: "Contato com vapor d'água e com vapores quentes - escolas, outras instituições e áreas de administração pública", + X133: "Contato com vapor d'água e com vapores quentes - área para a prática de esportes e atletismo", + X134: "Contato com vapor d'água e com vapores quentes - rua e estrada", + X135: "Contato com vapor d'água e com vapores quentes - áreas de comércio e de serviços", + X136: "Contato com vapor d'água e com vapores quentes - áreas industriais e em construção", + X137: "Contato com vapor d'água e com vapores quentes - fazenda", + X138: "Contato com vapor d'água e com vapores quentes - outros locais especificados", + X139: "Contato com vapor d'água e com vapores quentes - local não especificado", + X14: "Contato com ar e gases quentes", + X140: "Contato com ar e gases quentes - residência", + X141: "Contato com ar e gases quentes - habitação coletiva", + X142: "Contato com ar e gases quentes - escolas, outras instituições e áreas de administração pública", + X143: "Contato com ar e gases quentes - área para a prática de esportes e atletismo", + X144: "Contato com ar e gases quentes - rua e estrada", + X145: "Contato com ar e gases quentes - áreas de comércio e de serviços", + X146: "Contato com ar e gases quentes - áreas industriais e em construção", + X147: "Contato com ar e gases quentes - fazenda", + X148: "Contato com ar e gases quentes - outros locais especificados", + X149: "Contato com ar e gases quentes - local não especificado", + X15: "Contato com aparelhos domésticos quentes", + X150: "Contato com aparelhos domésticos quentes - residência", + X151: "Contato com aparelhos domésticos quentes - habitação coletiva", + X152: "Contato com aparelhos domésticos quentes - escolas, outras instituições e áreas de administração pública", + X153: "Contato com aparelhos domésticos quentes - área para a prática de esportes e atletismo", + X154: "Contato com aparelhos domésticos quentes - rua e estrada", + X155: "Contato com aparelhos domésticos quentes - áreas de comércio e de serviços", + X156: "Contato com aparelhos domésticos quentes - áreas industriais e em construção", + X157: "Contato com aparelhos domésticos quentes - fazenda", + X158: "Contato com aparelhos domésticos quentes - outros locais especificados", + X159: "Contato com aparelhos domésticos quentes - local não especificado", + X16: "Contato com aquecedores, radiadores e tubulação", + X160: "Contato com aquecedores, radiadores e tubulação - residência", + X161: "Contato com aquecedores, radiadores e tubulação - habitação coletiva", + X162: "Contato com aquecedores, radiadores e tubulação - escolas, outras instituições e áreas de administração pública", + X163: "Contato com aquecedores, radiadores e tubulação - área para a prática de esportes e atletismo", + X164: "Contato com aquecedores, radiadores e tubulação - rua e estrada", + X165: "Contato com aquecedores, radiadores e tubulação - áreas de comércio e de serviços", + X166: "Contato com aquecedores, radiadores e tubulação - áreas industriais e em construção", + X167: "Contato com aquecedores, radiadores e tubulação - fazenda", + X168: "Contato com aquecedores, radiadores e tubulação - outros locais especificados", + X169: "Contato com aquecedores, radiadores e tubulação - local não especificado", + X17: "Contato com motores, máquinas e ferramentas quentes", + X170: "Contato com motores, máquinas e ferramentas quentes - residência", + X171: "Contato com motores, máquinas e ferramentas quentes - habitação coletiva", + X172: "Contato com motores, máquinas e ferramentas quentes - escolas, outras instituições e áreas de administração pública", + X173: "Contato com motores, máquinas e ferramentas quentes - área para a prática de esportes e atletismo", + X174: "Contato com motores, máquinas e ferramentas quentes - rua e estrada", + X175: "Contato com motores, máquinas e ferramentas quentes - áreas de comércio e de serviços", + X176: "Contato com motores, máquinas e ferramentas quentes - áreas industriais e em construção", + X177: "Contato com motores, máquinas e ferramentas quentes - fazenda", + X178: "Contato com motores, máquinas e ferramentas quentes - outros locais especificados", + X179: "Contato com motores, máquinas e ferramentas quentes - local não especificado", + X18: "Contato com outros metais quentes", + X180: "Contato com outros metais quentes - residência", + X181: "Contato com outros metais quentes - habitação coletiva", + X182: "Contato com outros metais quentes - escolas, outras instituições e áreas de administração pública", + X183: "Contato com outros metais quentes - área para a prática de esportes e atletismo", + X184: "Contato com outros metais quentes - rua e estrada", + X185: "Contato com outros metais quentes - áreas de comércio e de serviços", + X186: "Contato com outros metais quentes - áreas industriais e em construção", + X187: "Contato com outros metais quentes - fazenda", + X188: "Contato com outros metais quentes - outros locais especificados", + X189: "Contato com outros metais quentes - local não especificado", + X19: "Contato com outras fontes de calor ou com substâncias quentes não especificados", + X190: "Contato com outras fontes de calor ou com substâncias quentes não especificados - residência", + X191: "Contato com outras fontes de calor ou com substâncias quentes não especificados - habitação coletiva", + X192: "Contato com outras fontes de calor ou com substâncias quentes não especificados - escolas, outras instituições e áreas de administração pública", + X193: "Contato com outras fontes de calor ou com substâncias quentes não especificados - área para a prática de esportes e atletismo", + X194: "Contato com outras fontes de calor ou com substâncias quentes não especificados - rua e estrada", + X195: "Contato com outras fontes de calor ou com substâncias quentes não especificados - áreas de comércio e de serviços", + X196: "Contato com outras fontes de calor ou com substâncias quentes não especificados - áreas industriais e em construção", + X197: "Contato com outras fontes de calor ou com substâncias quentes não especificados - fazenda", + X198: "Contato com outras fontes de calor ou com substâncias quentes não especificados - outros locais especificados", + X199: "Contato com outras fontes de calor ou com substâncias quentes não especificados - local não especificado", + X20: "Contato com serpentes e lagartos venenosos", + X200: "Contato com serpentes e lagartos venenosos - residência", + X201: "Contato com serpentes e lagartos venenosos - habitação coletiva", + X202: "Contato com serpentes e lagartos venenosos - escolas, outras instituições e áreas de administração pública", + X203: "Contato com serpentes e lagartos venenosos - área para a prática de esportes e atletismo", + X204: "Contato com serpentes e lagartos venenosos - rua e estrada", + X205: "Contato com serpentes e lagartos venenosos - áreas de comércio e de serviços", + X206: "Contato com serpentes e lagartos venenosos - áreas industriais e em construção", + X207: "Contato com serpentes e lagartos venenosos - fazenda", + X208: "Contato com serpentes e lagartos venenosos - outros locais especificados", + X209: "Contato com serpentes e lagartos venenosos - local não especificado", + X21: "Contato com aranhas venenosas", + X210: "Contato com aranhas venenosas - residência", + X211: "Contato com aranhas venenosas - habitação coletiva", + X212: "Contato com aranhas venenosas - escolas, outras instituições e áreas de administração pública", + X213: "Contato com aranhas venenosas - área para a prática de esportes e atletismo", + X214: "Contato com aranhas venenosas - rua e estrada", + X215: "Contato com aranhas venenosas - áreas de comércio e de serviços", + X216: "Contato com aranhas venenosas - áreas industriais e em construção", + X217: "Contato com aranhas venenosas - fazenda", + X218: "Contato com aranhas venenosas - outros locais especificados", + X219: "Contato com aranhas venenosas - local não especificado", + X22: "Contato com escorpiões", + X220: "Contato com escorpiões - residência", + X221: "Contato com escorpiões - habitação coletiva", + X222: "Contato com escorpiões - escolas, outras instituições e áreas de administração pública", + X223: "Contato com escorpiões - área para a prática de esportes e atletismo", + X224: "Contato com escorpiões - rua e estrada", + X225: "Contato com escorpiões - áreas de comércio e de serviços", + X226: "Contato com escorpiões - áreas industriais e em construção", + X227: "Contato com escorpiões - fazenda", + X228: "Contato com escorpiões - outros locais especificados", + X229: "Contato com escorpiões - local não especificado", + X23: "Contato com abelhas, vespas e vespões", + X230: "Contato com abelhas, vespas e vespões - residência", + X231: "Contato com abelhas, vespas e vespões - habitação coletiva", + X232: "Contato com abelhas, vespas e vespões - escolas, outras instituições e áreas de administração pública", + X233: "Contato com abelhas, vespas e vespões - área para a prática de esportes e atletismo", + X234: "Contato com abelhas, vespas e vespões - rua e estrada", + X235: "Contato com abelhas, vespas e vespões - áreas de comércio e de serviços", + X236: "Contato com abelhas, vespas e vespões - áreas industriais e em construção", + X237: "Contato com abelhas, vespas e vespões - fazenda", + X238: "Contato com abelhas, vespas e vespões - outros locais especificados", + X239: "Contato com abelhas, vespas e vespões - local não especificado", + X24: "Contato com centopéias e miriápodes venenosas (tropicais)", + X240: "Contato com centopéias e miriápodes venenosas (tropicais) - residência", + X241: "Contato com centopéias e miriápodes venenosas (tropicais) - habitação coletiva", + X242: "Contato com centopéias e miriápodes venenosas (tropicais) - escolas, outras instituições e áreas de administração pública", + X243: "Contato com centopéias e miriápodes venenosas (tropicais) - área para a prática de esportes e atletismo", + X244: "Contato com centopéias e miriápodes venenosas (tropicais) - rua e estrada", + X245: "Contato com centopéias e miriápodes venenosas (tropicais) - áreas de comércio e de serviços", + X246: "Contato com centopéias e miriápodes venenosas (tropicais) - áreas industriais e em construção", + X247: "Contato com centopéias e miriápodes venenosas (tropicais) - fazenda", + X248: "Contato com centopéias e miriápodes venenosas (tropicais) - outros locais especificados", + X249: "Contato com centopéias e miriápodes venenosas (tropicais) - local não especificado", + X25: "Contato com outros artrópodes venenosos", + X250: "Contato com outros artrópodes venenosos - residência", + X251: "Contato com outros artrópodes venenosos - habitação coletiva", + X252: "Contato com outros artrópodes venenosos - escolas, outras instituições e áreas de administração pública", + X253: "Contato com outros artrópodes venenosos - área para a prática de esportes e atletismo", + X254: "Contato com outros artrópodes venenosos - rua e estrada", + X255: "Contato com outros artrópodes venenosos - áreas de comércio e de serviços", + X256: "Contato com outros artrópodes venenosos - áreas industriais e em construção", + X257: "Contato com outros artrópodes venenosos - fazenda", + X258: "Contato com outros artrópodes venenosos - outros locais especificados", + X259: "Contato com outros artrópodes venenosos - local não especificado", + X26: "Contato com animais e plantas marinhos venenosos", + X260: "Contato com animais e plantas marinhos venenosos - residência", + X261: "Contato com animais e plantas marinhos venenosos - habitação coletiva", + X262: "Contato com animais e plantas marinhos venenosos - escolas, outras instituições e áreas de administração pública", + X263: "Contato com animais e plantas marinhos venenosos - área para a prática de esportes e atletismo", + X264: "Contato com animais e plantas marinhos venenosos - rua e estrada", + X265: "Contato com animais e plantas marinhos venenosos - áreas de comércio e de serviços", + X266: "Contato com animais e plantas marinhos venenosos - áreas industriais e em construção", + X267: "Contato com animais e plantas marinhos venenosos - fazenda", + X268: "Contato com animais e plantas marinhos venenosos - outros locais especificados", + X269: "Contato com animais e plantas marinhos venenosos - local não especificado", + X27: "Contato com outros animais venenosos especificados", + X270: "Contato com outros animais venenosos especificados - residência", + X271: "Contato com outros animais venenosos especificados - habitação coletiva", + X272: "Contato com outros animais venenosos especificados - escolas, outras instituições e áreas de administração pública", + X273: "Contato com outros animais venenosos especificados - área para a prática de esportes e atletismo", + X274: "Contato com outros animais venenosos especificados - rua e estrada", + X275: "Contato com outros animais venenosos especificados - áreas de comércio e de serviços", + X276: "Contato com outros animais venenosos especificados - áreas industriais e em construção", + X277: "Contato com outros animais venenosos especificados - fazenda", + X278: "Contato com outros animais venenosos especificados - outros locais especificados", + X279: "Contato com outros animais venenosos especificados - local não especificado", + X28: "Contato com outras plantas venenosas especificadas", + X280: "Contato com outras plantas venenosas especificadas - residência", + X281: "Contato com outras plantas venenosas especificadas - habitação coletiva", + X282: "Contato com outras plantas venenosas especificadas - escolas, outras instituições e áreas de administração pública", + X283: "Contato com outras plantas venenosas especificadas - área para a prática de esportes e atletismo", + X284: "Contato com outras plantas venenosas especificadas - rua e estrada", + X285: "Contato com outras plantas venenosas especificadas - áreas de comércio e de serviços", + X286: "Contato com outras plantas venenosas especificadas - áreas industriais e em construção", + X287: "Contato com outras plantas venenosas especificadas - fazenda", + X288: "Contato com outras plantas venenosas especificadas - outros locais especificados", + X289: "Contato com outras plantas venenosas especificadas - local não especificado", + X29: "Contato com animais ou plantas venenosos, sem especificação", + X290: "Contato com animais ou plantas venenosos, sem especificação - residência", + X291: "Contato com animais ou plantas venenosos, sem especificação - habitação coletiva", + X292: "Contato com animais ou plantas venenosos, sem especificação - escolas, outras instituições e áreas de administração pública", + X293: "Contato com animais ou plantas venenosos, sem especificação - área para a prática de esportes e atletismo", + X294: "Contato com animais ou plantas venenosos, sem especificação - rua e estrada", + X295: "Contato com animais ou plantas venenosos, sem especificação - áreas de comércio e de serviços", + X296: "Contato com animais ou plantas venenosos, sem especificação - áreas industriais e em construção", + X297: "Contato com animais ou plantas venenosos, sem especificação - fazenda", + X298: "Contato com animais ou plantas venenosos, sem especificação - outros locais especificados", + X299: "Contato com animais ou plantas venenosos, sem especificação - local não especificado", + X30: "Exposição a calor natural excessivo", + X300: "Exposição a calor natural excessivo - residência", + X301: "Exposição a calor natural excessivo - habitação coletiva", + X302: "Exposição a calor natural excessivo - escolas, outras instituições e áreas de administração pública", + X303: "Exposição a calor natural excessivo - área para a prática de esportes e atletismo", + X304: "Exposição a calor natural excessivo - rua e estrada", + X305: "Exposição a calor natural excessivo - áreas de comércio e de serviços", + X306: "Exposição a calor natural excessivo - áreas industriais e em construção", + X307: "Exposição a calor natural excessivo - fazenda", + X308: "Exposição a calor natural excessivo - outros locais especificados", + X309: "Exposição a calor natural excessivo - local não especificado", + X31: "Exposição a frio natural excessivo", + X310: "Exposição a frio natural excessivo - residência", + X311: "Exposição a frio natural excessivo - habitação coletiva", + X312: "Exposição a frio natural excessivo - escolas, outras instituições e áreas de administração pública", + X313: "Exposição a frio natural excessivo - área para a prática de esportes e atletismo", + X314: "Exposição a frio natural excessivo - rua e estrada", + X315: "Exposição a frio natural excessivo - áreas de comércio e de serviços", + X316: "Exposição a frio natural excessivo - áreas industriais e em construção", + X317: "Exposição a frio natural excessivo - fazenda", + X318: "Exposição a frio natural excessivo - outros locais especificados", + X319: "Exposição a frio natural excessivo - local não especificado", + X32: "Exposição à luz solar", + X320: "Exposição à luz solar - residência", + X321: "Exposição à luz solar - habitação coletiva", + X322: "Exposição à luz solar - escolas, outras instituições e áreas de administração pública", + X323: "Exposição à luz solar - área para a prática de esportes e atletismo", + X324: "Exposição à luz solar - rua e estrada", + X325: "Exposição à luz solar - áreas de comércio e de serviços", + X326: "Exposição à luz solar - áreas industriais e em construção", + X327: "Exposição à luz solar - fazenda", + X328: "Exposição à luz solar - outros locais especificados", + X329: "Exposição à luz solar - local não especificado", + X33: "Vítima de raio", + X330: "Vítima de raio - residência", + X331: "Vítima de raio - habitação coletiva", + X332: "Vítima de raio - escolas, outras instituições e áreas de administração pública", + X333: "Vítima de raio - área para a prática de esportes e atletismo", + X334: "Vítima de raio - rua e estrada", + X335: "Vítima de raio - áreas de comércio e de serviços", + X336: "Vítima de raio - áreas industriais e em construção", + X337: "Vítima de raio - fazenda", + X338: "Vítima de raio - outros locais especificados", + X339: "Vítima de raio - local não especificado", + X34: "Vítima de terremoto", + X340: "Vítima de terremoto - residência", + X341: "Vítima de terremoto - habitação coletiva", + X342: "Vítima de terremoto - escolas, outras instituições e áreas de administração pública", + X343: "Vítima de terremoto - área para a prática de esportes e atletismo", + X344: "Vítima de terremoto - rua e estrada", + X345: "Vítima de terremoto - áreas de comércio e de serviços", + X346: "Vítima de terremoto - áreas industriais e em construção", + X347: "Vítima de terremoto - fazenda", + X348: "Vítima de terremoto - outros locais especificados", + X349: "Vítima de terremoto - local não especificado", + X35: "Vítima de erupção vulcânica", + X350: "Vítima de erupção vulcânica - residência", + X351: "Vítima de erupção vulcânica - habitação coletiva", + X352: "Vítima de erupção vulcânica - escolas, outras instituições e áreas de administração pública", + X353: "Vítima de erupção vulcânica - área para a prática de esportes e atletismo", + X354: "Vítima de erupção vulcânica - rua e estrada", + X355: "Vítima de erupção vulcânica - áreas de comércio e de serviços", + X356: "Vítima de erupção vulcânica - áreas industriais e em construção", + X357: "Vítima de erupção vulcânica - fazenda", + X358: "Vítima de erupção vulcânica - outros locais especificados", + X359: "Vítima de erupção vulcânica - local não especificado", + X36: "Vítima de avalanche, desabamento de terra e outros movimentos da superfície terrestre", + X360: "Vítima de avalanche, desabamento de terra e outros movimentos da superfície terrestre - residência", + X361: "Vítima de avalanche, desabamento de terra e outros movimentos da superfície terrestre - habitação coletiva", + X362: "Vítima de avalanche, desabamento de terra e outros movimentos da superfície terrestre - escolas, outras instituições e áreas de administração pública", + X363: "Vítima de avalanche, desabamento de terra e outros movimentos da superfície terrestre - área para a prática de esportes e atletismo", + X364: "Vítima de avalanche, desabamento de terra e outros movimentos da superfície terrestre - rua e estrada", + X365: "Vítima de avalanche, desabamento de terra e outros movimentos da superfície terrestre - áreas de comércio e de serviços", + X366: "Vítima de avalanche, desabamento de terra e outros movimentos da superfície terrestre - áreas industriais e em construção", + X367: "Vítima de avalanche, desabamento de terra e outros movimentos da superfície terrestre - fazenda", + X368: "Vítima de avalanche, desabamento de terra e outros movimentos da superfície terrestre - outros locais especificados", + X369: "Vítima de avalanche, desabamento de terra e outros movimentos da superfície terrestre - local não especificado", + X37: "Vítima de tempestade cataclísmica", + X370: "Vítima de tempestade cataclísmica - residência", + X371: "Vítima de tempestade cataclísmica - habitação coletiva", + X372: "Vítima de tempestade cataclísmica - escolas, outras instituições e áreas de administração pública", + X373: "Vítima de tempestade cataclísmica - área para a prática de esportes e atletismo", + X374: "Vítima de tempestade cataclísmica - rua e estrada", + X375: "Vítima de tempestade cataclísmica - áreas de comércio e de serviços", + X376: "Vítima de tempestade cataclísmica - áreas industriais e em construção", + X377: "Vítima de tempestade cataclísmica - fazenda", + X378: "Vítima de tempestade cataclísmica - outros locais especificados", + X379: "Vítima de tempestade cataclísmica - local não especificado", + X38: "Vítima de inundação", + X380: "Vítima de inundação - residência", + X381: "Vítima de inundação - habitação coletiva", + X382: "Vítima de inundação - escolas, outras instituições e áreas de administração pública", + X383: "Vítima de inundação - área para a prática de esportes e atletismo", + X384: "Vítima de inundação - rua e estrada", + X385: "Vítima de inundação - áreas de comércio e de serviços", + X386: "Vítima de inundação - áreas industriais e em construção", + X387: "Vítima de inundação - fazenda", + X388: "Vítima de inundação - outros locais especificados", + X389: "Vítima de inundação - local não especificado", + X39: "Exposição a outras forças da natureza e às não especificadas", + X390: "Exposição a outras forças da natureza e às não especificadas - residência", + X391: "Exposição a outras forças da natureza e às não especificadas - habitação coletiva", + X392: "Exposição a outras forças da natureza e às não especificadas - escolas, outras instituições e áreas de administração pública", + X393: "Exposição a outras forças da natureza e às não especificadas - área para a prática de esportes e atletismo", + X394: "Exposição a outras forças da natureza e às não especificadas - rua e estrada", + X395: "Exposição a outras forças da natureza e às não especificadas - áreas de comércio e de serviços", + X396: "Exposição a outras forças da natureza e às não especificadas - áreas industriais e em construção", + X397: "Exposição a outras forças da natureza e às não especificadas - fazenda", + X398: "Exposição a outras forças da natureza e às não especificadas - outros locais especificados", + X399: "Exposição a outras forças da natureza e às não especificadas - local não especificado", + X40: "Envenenamento [intoxicação] acidental por e exposição a analgésicos, antipiréticos e anti-reumáticos, não-opiáceos", + X400: "Envenenamento [intoxicação] acidental por e exposição a analgésicos, antipiréticos e anti-reumáticos, não-opiáceos - residência", + X401: "Envenenamento [intoxicação] acidental por e exposição a analgésicos, antipiréticos e anti-reumáticos, não-opiáceos - habitação coletiva", + X402: "Envenenamento [intoxicação] acidental por e exposição a analgésicos, antipiréticos e anti-reumáticos, não-opiáceos - escolas, outras instituições e áreas de administração pública", + X403: "Envenenamento [intoxicação] acidental por e exposição a analgésicos, antipiréticos e anti-reumáticos, não-opiáceos - área para a prática de esportes e atletismo", + X404: "Envenenamento [intoxicação] acidental por e exposição a analgésicos, antipiréticos e anti-reumáticos, não-opiáceos - rua e estrada", + X405: "Envenenamento [intoxicação] acidental por e exposição a analgésicos, antipiréticos e anti-reumáticos, não-opiáceos - áreas de comércio e de serviços", + X406: "Envenenamento [intoxicação] acidental por e exposição a analgésicos, antipiréticos e anti-reumáticos, não-opiáceos - áreas industriais e em construção", + X407: "Envenenamento [intoxicação] acidental por e exposição a analgésicos, antipiréticos e anti-reumáticos, não-opiáceos - fazenda", + X408: "Envenenamento [intoxicação] acidental por e exposição a analgésicos, antipiréticos e anti-reumáticos, não-opiáceos - outros locais especificados", + X409: "Envenenamento [intoxicação] acidental por e exposição a analgésicos, antipiréticos e anti-reumáticos, não-opiáceos - local não especificado", + X41: "Envenenamento [intoxicação] acidental por e exposição a anticonvulsivantes [antiepilépticos], sedativos, hipnóticos, antiparkinsonianos e psicotrópicos não classificadas em outra parte", + X410: "Envenenamento [intoxicação] acidental por e exposição a anticonvulsivantes [antiepilépticos], sedativos, hipnóticos, antiparkinsonianos e psicotrópicos não classificadas em outra parte - residência", + X411: "Envenenamento [intoxicação] acidental por e exposição a anticonvulsivantes [antiepilépticos], sedativos, hipnóticos, antiparkinsonianos e psicotrópicos não classificadas em outra parte - habitação coletiva", + X412: "Envenenamento [intoxicação] acidental por e exposição a anticonvulsivantes [antiepilépticos], sedativos, hipnóticos, antiparkinsonianos e psicotrópicos não classificadas em outra parte - escolas, outras instituições e áreas de administração pública", + X413: "Envenenamento [intoxicação] acidental por e exposição a anticonvulsivantes [antiepilépticos], sedativos, hipnóticos, antiparkinsonianos e psicotrópicos não classificadas em outra parte - área para a prática de esportes e atletismo", + X414: "Envenenamento [intoxicação] acidental por e exposição a anticonvulsivantes [antiepilépticos], sedativos, hipnóticos, antiparkinsonianos e psicotrópicos não classificadas em outra parte - rua e estrada", + X415: "Envenenamento [intoxicação] acidental por e exposição a anticonvulsivantes [antiepilépticos], sedativos, hipnóticos, antiparkinsonianos e psicotrópicos não classificadas em outra parte - áreas de comércio e de serviços", + X416: "Envenenamento [intoxicação] acidental por e exposição a anticonvulsivantes [antiepilépticos], sedativos, hipnóticos, antiparkinsonianos e psicotrópicos não classificadas em outra parte - áreas industriais e em construção", + X417: "Envenenamento [intoxicação] acidental por e exposição a anticonvulsivantes [antiepilépticos], sedativos, hipnóticos, antiparkinsonianos e psicotrópicos não classificadas em outra parte - fazenda", + X418: "Envenenamento [intoxicação] acidental por e exposição a anticonvulsivantes [antiepilépticos], sedativos, hipnóticos, antiparkinsonianos e psicotrópicos não classificadas em outra parte - outros locais especificados", + X419: "Envenenamento [intoxicação] acidental por e exposição a anticonvulsivantes [antiepilépticos], sedativos, hipnóticos, antiparkinsonianos e psicotrópicos não classificadas em outra parte - local não especificado", + X42: "Envenenamento [intoxicação] acidental por e exposição a narcóticos e psicodislépticos [alucinógenos] não classificados em outra parte", + X420: "Envenenamento [intoxicação] acidental por e exposição a narcóticos e psicodislépticos [alucinógenos] não classificados em outra parte - residência", + X421: "Envenenamento [intoxicação] acidental por e exposição a narcóticos e psicodislépticos [alucinógenos] não classificados em outra parte - habitação coletiva", + X422: "Envenenamento [intoxicação] acidental por e exposição a narcóticos e psicodislépticos [alucinógenos] não classificados em outra parte - escolas, outras instituições e áreas de administração pública", + X423: "Envenenamento [intoxicação] acidental por e exposição a narcóticos e psicodislépticos [alucinógenos] não classificados em outra parte - área para a prática de esportes e atletismo", + X424: "Envenenamento [intoxicação] acidental por e exposição a narcóticos e psicodislépticos [alucinógenos] não classificados em outra parte - rua e estrada", + X425: "Envenenamento [intoxicação] acidental por e exposição a narcóticos e psicodislépticos [alucinógenos] não classificados em outra parte - áreas de comércio e de serviços", + X426: "Envenenamento [intoxicação] acidental por e exposição a narcóticos e psicodislépticos [alucinógenos] não classificados em outra parte - áreas industriais e em construção", + X427: "Envenenamento [intoxicação] acidental por e exposição a narcóticos e psicodislépticos [alucinógenos] não classificados em outra parte - fazenda", + X428: "Envenenamento [intoxicação] acidental por e exposição a narcóticos e psicodislépticos [alucinógenos] não classificados em outra parte - outros locais especificados", + X429: "Envenenamento [intoxicação] acidental por e exposição a narcóticos e psicodislépticos [alucinógenos] não classificados em outra parte - local não especificado", + X43: "Envenenamento [intoxicação] acidental por e exposição a outras substâncias farmacológicas de ação sobre o sistema nervoso autônomo", + X430: "Envenenamento [intoxicação] acidental por e exposição a outras substâncias farmacológicas de ação sobre o sistema nervoso autônomo - residência", + X431: "Envenenamento [intoxicação] acidental por e exposição a outras substâncias farmacológicas de ação sobre o sistema nervoso autônomo - habitação coletiva", + X432: "Envenenamento [intoxicação] acidental por e exposição a outras substâncias farmacológicas de ação sobre o sistema nervoso autônomo - escolas, outras instituições e áreas de administração pública", + X433: "Envenenamento [intoxicação] acidental por e exposição a outras substâncias farmacológicas de ação sobre o sistema nervoso autônomo - área para a prática de esportes e atletismo", + X434: "Envenenamento [intoxicação] acidental por e exposição a outras substâncias farmacológicas de ação sobre o sistema nervoso autônomo - rua e estrada", + X435: "Envenenamento [intoxicação] acidental por e exposição a outras substâncias farmacológicas de ação sobre o sistema nervoso autônomo - áreas de comércio e de serviços", + X436: "Envenenamento [intoxicação] acidental por e exposição a outras substâncias farmacológicas de ação sobre o sistema nervoso autônomo - áreas industriais e em construção", + X437: "Envenenamento [intoxicação] acidental por e exposição a outras substâncias farmacológicas de ação sobre o sistema nervoso autônomo - fazenda", + X438: "Envenenamento [intoxicação] acidental por e exposição a outras substâncias farmacológicas de ação sobre o sistema nervoso autônomo - outros locais especificados", + X439: "Envenenamento [intoxicação] acidental por e exposição a outras substâncias farmacológicas de ação sobre o sistema nervoso autônomo - local não especificado", + X44: "Envenenamento [intoxicação] acidental por e exposição a outras drogas, medicamentos e substâncias biológicas não especificadas", + X440: "Envenenamento [intoxicação] acidental por e exposição a outras drogas, medicamentos e substâncias biológicas não especificadas - residência", + X441: "Envenenamento [intoxicação] acidental por e exposição a outras drogas, medicamentos e substâncias biológicas não especificadas - habitação coletiva", + X442: "Envenenamento [intoxicação] acidental por e exposição a outras drogas, medicamentos e substâncias biológicas não especificadas - escolas, outras instituições e áreas de administração pública", + X443: "Envenenamento [intoxicação] acidental por e exposição a outras drogas, medicamentos e substâncias biológicas não especificadas - área para a prática de esportes e atletismo", + X444: "Envenenamento [intoxicação] acidental por e exposição a outras drogas, medicamentos e substâncias biológicas não especificadas - rua e estrada", + X445: "Envenenamento [intoxicação] acidental por e exposição a outras drogas, medicamentos e substâncias biológicas não especificadas - áreas de comércio e de serviços", + X446: "Envenenamento [intoxicação] acidental por e exposição a outras drogas, medicamentos e substâncias biológicas não especificadas - áreas industriais e em construção", + X447: "Envenenamento [intoxicação] acidental por e exposição a outras drogas, medicamentos e substâncias biológicas não especificadas - fazenda", + X448: "Envenenamento [intoxicação] acidental por e exposição a outras drogas, medicamentos e substâncias biológicas não especificadas - outros locais especificados", + X449: "Envenenamento [intoxicação] acidental por e exposição a outras drogas, medicamentos e substâncias biológicas não especificadas - local não especificado", + X45: "Envenenamento [intoxicação] acidental por e exposição ao álcool", + X450: "Envenenamento [intoxicação] acidental por e exposição ao álcool - residência", + X451: "Envenenamento [intoxicação] acidental por e exposição ao álcool - habitação coletiva", + X452: "Envenenamento [intoxicação] acidental por e exposição ao álcool - escolas, outras instituições e áreas de administração pública", + X453: "Envenenamento [intoxicação] acidental por e exposição ao álcool - área para a prática de esportes e atletismo", + X454: "Envenenamento [intoxicação] acidental por e exposição ao álcool - rua e estrada", + X455: "Envenenamento [intoxicação] acidental por e exposição ao álcool - áreas de comércio e de serviços", + X456: "Envenenamento [intoxicação] acidental por e exposição ao álcool - áreas industriais e em construção", + X457: "Envenenamento [intoxicação] acidental por e exposição ao álcool - fazenda", + X458: "Envenenamento [intoxicação] acidental por e exposição ao álcool - outros locais especificados", + X459: "Envenenamento [intoxicação] acidental por e exposição ao álcool - local não especificado", + X46: "Envenenamento [intoxicação] acidental por e exposição a solventes orgânicos e hidrocarbonetos halogenados e seus vapores", + X460: "Envenenamento [intoxicação] acidental por e exposição a solventes orgânicos e hidrocarbonetos halogenados e seus vapores - residência", + X461: "Envenenamento [intoxicação] acidental por e exposição a solventes orgânicos e hidrocarbonetos halogenados e seus vapores - habitação coletiva", + X462: "Envenenamento [intoxicação] acidental por e exposição a solventes orgânicos e hidrocarbonetos halogenados e seus vapores - escolas, outras instituições e áreas de administração pública", + X463: "Envenenamento [intoxicação] acidental por e exposição a solventes orgânicos e hidrocarbonetos halogenados e seus vapores - área para a prática de esportes e atletismo", + X464: "Envenenamento [intoxicação] acidental por e exposição a solventes orgânicos e hidrocarbonetos halogenados e seus vapores - rua e estrada", + X465: "Envenenamento [intoxicação] acidental por e exposição a solventes orgânicos e hidrocarbonetos halogenados e seus vapores - áreas de comércio e de serviços", + X466: "Envenenamento [intoxicação] acidental por e exposição a solventes orgânicos e hidrocarbonetos halogenados e seus vapores - áreas industriais e em construção", + X467: "Envenenamento [intoxicação] acidental por e exposição a solventes orgânicos e hidrocarbonetos halogenados e seus vapores - fazenda", + X468: "Envenenamento [intoxicação] acidental por e exposição a solventes orgânicos e hidrocarbonetos halogenados e seus vapores - outros locais especificados", + X469: "Envenenamento [intoxicação] acidental por e exposição a solventes orgânicos e hidrocarbonetos halogenados e seus vapores - local não especificado", + X47: "Intoxicação acidental por e exposição a outros gases e vapores", + X470: "Intoxicação acidental por e exposição a outros gases e vapores - residência", + X471: "Intoxicação acidental por e exposição a outros gases e vapores - habitação coletiva", + X472: "Intoxicação acidental por e exposição a outros gases e vapores - escolas, outras instituições e áreas de administração pública", + X473: "Intoxicação acidental por e exposição a outros gases e vapores - área para a prática de esportes e atletismo", + X474: "Intoxicação acidental por e exposição a outros gases e vapores - rua e estrada", + X475: "Intoxicação acidental por e exposição a outros gases e vapores - áreas de comércio e de serviços", + X476: "Intoxicação acidental por e exposição a outros gases e vapores - áreas industriais e em construção", + X477: "Intoxicação acidental por e exposição a outros gases e vapores - fazenda", + X478: "Intoxicação acidental por e exposição a outros gases e vapores - outros locais especificados", + X479: "Intoxicação acidental por e exposição a outros gases e vapores - local não especificado", + X48: "Envenenamento [intoxicação] acidental por e exposição a pesticidas", + X480: "Envenenamento [intoxicação] acidental por e exposição a pesticidas - residência", + X481: "Envenenamento [intoxicação] acidental por e exposição a pesticidas - habitação coletiva", + X482: "Envenenamento [intoxicação] acidental por e exposição a pesticidas - escolas, outras instituições e áreas de administração pública", + X483: "Envenenamento [intoxicação] acidental por e exposição a pesticidas - área para a prática de esportes e atletismo", + X484: "Envenenamento [intoxicação] acidental por e exposição a pesticidas - rua e estrada", + X485: "Envenenamento [intoxicação] acidental por e exposição a pesticidas - áreas de comércio e de serviços", + X486: "Envenenamento [intoxicação] acidental por e exposição a pesticidas - áreas industriais e em construção", + X487: "Envenenamento [intoxicação] acidental por e exposição a pesticidas - fazenda", + X488: "Envenenamento [intoxicação] acidental por e exposição a pesticidas - outros locais especificados", + X489: "Envenenamento [intoxicação] acidental por e exposição a pesticidas - local não especificado", + X49: "Envenenamento [intoxicação] acidental por e exposição a outras substâncias químicas nocivas e às não especificadas", + X490: "Envenenamento [intoxicação] acidental por e exposição a outras substâncias químicas nocivas e às não especificadas - residência", + X491: "Envenenamento [intoxicação] acidental por e exposição a outras substâncias químicas nocivas e às não especificadas - habitação coletiva", + X492: "Envenenamento [intoxicação] acidental por e exposição a outras substâncias químicas nocivas e às não especificadas - escolas, outras instituições e áreas de administração pública", + X493: "Envenenamento [intoxicação] acidental por e exposição a outras substâncias químicas nocivas e às não especificadas - área para a prática de esportes e atletismo", + X494: "Envenenamento [intoxicação] acidental por e exposição a outras substâncias químicas nocivas e às não especificadas - rua e estrada", + X495: "Envenenamento [intoxicação] acidental por e exposição a outras substâncias químicas nocivas e às não especificadas - áreas de comércio e de serviços", + X496: "Envenenamento [intoxicação] acidental por e exposição a outras substâncias químicas nocivas e às não especificadas - áreas industriais e em construção", + X497: "Envenenamento [intoxicação] acidental por e exposição a outras substâncias químicas nocivas e às não especificadas - fazenda", + X498: "Envenenamento [intoxicação] acidental por e exposição a outras substâncias químicas nocivas e às não especificadas - outros locais especificados", + X499: "Envenenamento [intoxicação] acidental por e exposição a outras substâncias químicas nocivas e às não especificadas - local não especificado", + X50: "Excesso de exercícios e movimentos vigorosos ou repetitivos", + X500: "Excesso de exercícios e movimentos vigorosos ou repetitivos - residência", + X501: "Excesso de exercícios e movimentos vigorosos ou repetitivos - habitação coletiva", + X502: "Excesso de exercícios e movimentos vigorosos ou repetitivos - escolas, outras instituições e áreas de administração pública", + X503: "Excesso de exercícios e movimentos vigorosos ou repetitivos - área para a prática de esportes e atletismo", + X504: "Excesso de exercícios e movimentos vigorosos ou repetitivos - rua e estrada", + X505: "Excesso de exercícios e movimentos vigorosos ou repetitivos - áreas de comércio e de serviços", + X506: "Excesso de exercícios e movimentos vigorosos ou repetitivos - áreas industriais e em construção", + X507: "Excesso de exercícios e movimentos vigorosos ou repetitivos - fazenda", + X508: "Excesso de exercícios e movimentos vigorosos ou repetitivos - outros locais especificados", + X509: "Excesso de exercícios e movimentos vigorosos ou repetitivos - local não especificado", + X51: "Viagem e movimento", + X510: "Viagem e movimento - residência", + X511: "Viagem e movimento - habitação coletiva", + X512: "Viagem e movimento - escolas, outras instituições e áreas de administração pública", + X513: "Viagem e movimento - área para a prática de esportes e atletismo", + X514: "Viagem e movimento - rua e estrada", + X515: "Viagem e movimento - áreas de comércio e de serviços", + X516: "Viagem e movimento - áreas industriais e em construção", + X517: "Viagem e movimento - fazenda", + X518: "Viagem e movimento - outros locais especificados", + X519: "Viagem e movimento - local não especificado", + X52: "Estadia prolongada em ambiente agravitacional", + X520: "Estadia prolongada em ambiente agravitacional - residência", + X521: "Estadia prolongada em ambiente agravitacional - habitação coletiva", + X522: "Estadia prolongada em ambiente agravitacional - escolas, outras instituições e áreas de administração pública", + X523: "Estadia prolongada em ambiente agravitacional - área para a prática de esportes e atletismo", + X524: "Estadia prolongada em ambiente agravitacional - rua e estrada", + X525: "Estadia prolongada em ambiente agravitacional - áreas de comércio e de serviços", + X526: "Estadia prolongada em ambiente agravitacional - áreas industriais e em construção", + X527: "Estadia prolongada em ambiente agravitacional - fazenda", + X528: "Estadia prolongada em ambiente agravitacional - outros locais especificados", + X529: "Estadia prolongada em ambiente agravitacional - local não especificado", + X53: "Falta de alimento", + X530: "Falta de alimento - residência", + X531: "Falta de alimento - habitação coletiva", + X532: "Falta de alimento - escolas, outras instituições e áreas de administração pública", + X533: "Falta de alimento - área para a prática de esportes e atletismo", + X534: "Falta de alimento - rua e estrada", + X535: "Falta de alimento - áreas de comércio e de serviços", + X536: "Falta de alimento - áreas industriais e em construção", + X537: "Falta de alimento - fazenda", + X538: "Falta de alimento - outros locais especificados", + X539: "Falta de alimento - local não especificado", + X54: "Falta de água", + X540: "Falta de água - residência", + X541: "Falta de água - habitação coletiva", + X542: "Falta de água - escolas, outras instituições e áreas de administração pública", + X543: "Falta de água - área para a prática de esportes e atletismo", + X544: "Falta de água - rua e estrada", + X545: "Falta de água - áreas de comércio e de serviços", + X546: "Falta de água - áreas industriais e em construção", + X547: "Falta de água - fazenda", + X548: "Falta de água - outros locais especificados", + X549: "Falta de água - local não especificado", + X57: "Privação não especificada", + X570: "Privação não especificada - residência", + X571: "Privação não especificada - habitação coletiva", + X572: "Privação não especificada - escolas, outras instituições e áreas de administração pública", + X573: "Privação não especificada - área para a prática de esportes e atletismo", + X574: "Privação não especificada - rua e estrada", + X575: "Privação não especificada - áreas de comércio e de serviços", + X576: "Privação não especificada - áreas industriais e em construção", + X577: "Privação não especificada - fazenda", + X578: "Privação não especificada - outros locais especificados", + X579: "Privação não especificada - local não especificado", + X58: "Exposição a outros fatores especificados", + X580: "Exposição a outros fatores especificados - residência", + X581: "Exposição a outros fatores especificados - habitação coletiva", + X582: "Exposição a outros fatores especificados - escolas, outras instituições e áreas de administração pública", + X583: "Exposição a outros fatores especificados - área para a prática de esportes e atletismo", + X584: "Exposição a outros fatores especificados - rua e estrada", + X585: "Exposição a outros fatores especificados - áreas de comércio e de serviços", + X586: "Exposição a outros fatores especificados - áreas industriais e em construção", + X587: "Exposição a outros fatores especificados - fazenda", + X588: "Exposição a outros fatores especificados - outros locais especificados", + X589: "Exposição a outros fatores especificados - local não especificado", + X59: "Exposição a fatores não especificados", + X590: "Exposição a fator não especificado causando fratura", + X599: "Exposição a fator não especificado causando outro tr|aumatismo e traumatismo não especificado", + X60: "Auto-intoxicação por e exposição, intencional, a analgésicos, antipiréticos e anti-reumáticos, não-opiáceos", + X600: "Auto-intoxicação por e exposição, intencional, a analgésicos, antipiréticos e anti-reumáticos, não-opiáceos - residência", + X601: "Auto-intoxicação por e exposição, intencional, a analgésicos, antipiréticos e anti-reumáticos, não-opiáceos - habitação coletiva", + X602: "Auto-intoxicação por e exposição, intencional, a analgésicos, antipiréticos e anti-reumáticos, não-opiáceos - escolas, outras instituições e áreas de administração pública", + X603: "Auto-intoxicação por e exposição, intencional, a analgésicos, antipiréticos e anti-reumáticos, não-opiáceos - área para a prática de esportes e atletismo", + X604: "Auto-intoxicação por e exposição, intencional, a analgésicos, antipiréticos e anti-reumáticos, não-opiáceos - rua e estrada", + X605: "Auto-intoxicação por e exposição, intencional, a analgésicos, antipiréticos e anti-reumáticos, não-opiáceos - áreas de comércio e de serviços", + X606: "Auto-intoxicação por e exposição, intencional, a analgésicos, antipiréticos e anti-reumáticos, não-opiáceos - áreas industriais e em construção", + X607: "Auto-intoxicação por e exposição, intencional, a analgésicos, antipiréticos e anti-reumáticos, não-opiáceos - fazenda", + X608: "Auto-intoxicação por e exposição, intencional, a analgésicos, antipiréticos e anti-reumáticos, não-opiáceos - outros locais especificados", + X609: "Auto-intoxicação por e exposição, intencional, a analgésicos, antipiréticos e anti-reumáticos, não-opiáceos - local não especificado", + X61: "Auto-intoxicação por e exposição, intencional, a drogas anticonvulsivantes [antiepilépticos] sedativos, hipnóticos, antiparkinsonianos e psicotrópicos não classificados em outra parte", + X610: "Auto-intoxicação por e exposição, intencional, a drogas anticonvulsivantes [antiepilépticos] sedativos, hipnóticos, antiparkinsonianos e psicotrópicos não classificados em outra parte - residência", + X611: "Auto-intoxicação por e exposição, intencional, a drogas anticonvulsivantes [antiepilépticos] sedativos, hipnóticos, antiparkinsonianos e psicotrópicos não classificados em outra parte - habitação coletiva", + X612: "Auto-intoxicação por e exposição, intencional, a drogas anticonvulsivantes [antiepilépticos] sedativos, hipnóticos, antiparkinsonianos e psicotrópicos não classificados em outra parte - escolas, outras instituições e áreas de administração pública", + X613: "Auto-intoxicação por e exposição, intencional, a drogas anticonvulsivantes [antiepilépticos] sedativos, hipnóticos, antiparkinsonianos e psicotrópicos não classificados em outra parte - área para a prática de esportes e atletismo", + X614: "Auto-intoxicação por e exposição, intencional, a drogas anticonvulsivantes [antiepilépticos] sedativos, hipnóticos, antiparkinsonianos e psicotrópicos não classificados em outra parte - rua e estrada", + X615: "Auto-intoxicação por e exposição, intencional, a drogas anticonvulsivantes [antiepilépticos] sedativos, hipnóticos, antiparkinsonianos e psicotrópicos não classificados em outra parte - áreas de comércio e de serviços", + X616: "Auto-intoxicação por e exposição, intencional, a drogas anticonvulsivantes [antiepilépticos] sedativos, hipnóticos, antiparkinsonianos e psicotrópicos não classificados em outra parte - áreas industriais e em construção", + X617: "Auto-intoxicação por e exposição, intencional, a drogas anticonvulsivantes [antiepilépticos] sedativos, hipnóticos, antiparkinsonianos e psicotrópicos não classificados em outra parte - fazenda", + X618: "Auto-intoxicação por e exposição, intencional, a drogas anticonvulsivantes [antiepilépticos] sedativos, hipnóticos, antiparkinsonianos e psicotrópicos não classificados em outra parte - outros locais especificados", + X619: "Auto-intoxicação por e exposição, intencional, a drogas anticonvulsivantes [antiepilépticos] sedativos, hipnóticos, antiparkinsonianos e psicotrópicos não classificados em outra parte - local não especificado", + X62: "Auto-intoxicação por e exposição, intencional, a narcóticos e psicodislépticos [alucinógenos] não classificados em outra parte", + X620: "Auto-intoxicação por e exposição, intencional, a narcóticos e psicodislépticos [alucinógenos] não classificados em outra parte - residência", + X621: "Auto-intoxicação por e exposição, intencional, a narcóticos e psicodislépticos [alucinógenos] não classificados em outra parte - habitação coletiva", + X622: "Auto-intoxicação por e exposição, intencional, a narcóticos e psicodislépticos [alucinógenos] não classificados em outra parte - escolas, outras instituições e áreas de administração pública", + X623: "Auto-intoxicação por e exposição, intencional, a narcóticos e psicodislépticos [alucinógenos] não classificados em outra parte - área para a prática de esportes e atletismo", + X624: "Auto-intoxicação por e exposição, intencional, a narcóticos e psicodislépticos [alucinógenos] não classificados em outra parte - rua e estrada", + X625: "Auto-intoxicação por e exposição, intencional, a narcóticos e psicodislépticos [alucinógenos] não classificados em outra parte - áreas de comércio e de serviços", + X626: "Auto-intoxicação por e exposição, intencional, a narcóticos e psicodislépticos [alucinógenos] não classificados em outra parte - áreas industriais e em construção", + X627: "Auto-intoxicação por e exposição, intencional, a narcóticos e psicodislépticos [alucinógenos] não classificados em outra parte - fazenda", + X628: "Auto-intoxicação por e exposição, intencional, a narcóticos e psicodislépticos [alucinógenos] não classificados em outra parte - outros locais especificados", + X629: "Auto-intoxicação por e exposição, intencional, a narcóticos e psicodislépticos [alucinógenos] não classificados em outra parte - local não especificado", + X63: "Auto-intoxicação por e exposição, intencional, a outras substâncias farmacológicas de ação sobre o sistema nervoso autônomo", + X630: "Auto-intoxicação por e exposição, intencional, a outras substâncias farmacológicas de ação sobre o sistema nervoso autônomo - residência", + X631: "Auto-intoxicação por e exposição, intencional, a outras substâncias farmacológicas de ação sobre o sistema nervoso autônomo - habitação coletiva", + X632: "Auto-intoxicação por e exposição, intencional, a outras substâncias farmacológicas de ação sobre o sistema nervoso autônomo - escolas, outras instituições e áreas de administração pública", + X633: "Auto-intoxicação por e exposição, intencional, a outras substâncias farmacológicas de ação sobre o sistema nervoso autônomo - área para a prática de esportes e atletismo", + X634: "Auto-intoxicação por e exposição, intencional, a outras substâncias farmacológicas de ação sobre o sistema nervoso autônomo - rua e estrada", + X635: "Auto-intoxicação por e exposição, intencional, a outras substâncias farmacológicas de ação sobre o sistema nervoso autônomo - áreas de comércio e de serviços", + X636: "Auto-intoxicação por e exposição, intencional, a outras substâncias farmacológicas de ação sobre o sistema nervoso autônomo - áreas industriais e em construção", + X637: "Auto-intoxicação por e exposição, intencional, a outras substâncias farmacológicas de ação sobre o sistema nervoso autônomo - fazenda", + X638: "Auto-intoxicação por e exposição, intencional, a outras substâncias farmacológicas de ação sobre o sistema nervoso autônomo - outros locais especificados", + X639: "Auto-intoxicação por e exposição, intencional, a outras substâncias farmacológicas de ação sobre o sistema nervoso autônomo - local não especificado", + X64: "Auto-intoxicação por e exposição, intencional, a outras drogas, medicamentos e substâncias biológicas e às não especificadas", + X640: "Auto-intoxicação por e exposição, intencional, a outras drogas, medicamentos e substâncias biológicas e às não especificadas - residência", + X641: "Auto-intoxicação por e exposição, intencional, a outras drogas, medicamentos e substâncias biológicas e às não especificadas - habitação coletiva", + X642: "Auto-intoxicação por e exposição, intencional, a outras drogas, medicamentos e substâncias biológicas e às não especificadas - escolas, outras instituições e áreas de administração pública", + X643: "Auto-intoxicação por e exposição, intencional, a outras drogas, medicamentos e substâncias biológicas e às não especificadas - área para a prática de esportes e atletismo", + X644: "Auto-intoxicação por e exposição, intencional, a outras drogas, medicamentos e substâncias biológicas e às não especificadas - rua e estrada", + X645: "Auto-intoxicação por e exposição, intencional, a outras drogas, medicamentos e substâncias biológicas e às não especificadas - áreas de comércio e de serviços", + X646: "Auto-intoxicação por e exposição, intencional, a outras drogas, medicamentos e substâncias biológicas e às não especificadas - áreas industriais e em construção", + X647: "Auto-intoxicação por e exposição, intencional, a outras drogas, medicamentos e substâncias biológicas e às não especificadas - fazenda", + X648: "Auto-intoxicação por e exposição, intencional, a outras drogas, medicamentos e substâncias biológicas e às não especificadas - outros locais especificados", + X649: "Auto-intoxicação por e exposição, intencional, a outras drogas, medicamentos e substâncias biológicas e às não especificadas - local não especificado", + X65: "Auto-intoxicação voluntária por álcool", + X650: "Auto-intoxicação voluntária por álcool - residência", + X651: "Auto-intoxicação voluntária por álcool - habitação coletiva", + X652: "Auto-intoxicação voluntária por álcool - escolas, outras instituições e áreas de administração pública", + X653: "Auto-intoxicação voluntária por álcool - área para a prática de esportes e atletismo", + X654: "Auto-intoxicação voluntária por álcool - rua e estrada", + X655: "Auto-intoxicação voluntária por álcool - áreas de comércio e de serviços", + X656: "Auto-intoxicação voluntária por álcool - áreas industriais e em construção", + X657: "Auto-intoxicação voluntária por álcool - fazenda", + X658: "Auto-intoxicação voluntária por álcool - outros locais especificados", + X659: "Auto-intoxicação voluntária por álcool - local não especificado", + X66: "Auto-intoxicação intencional por solventes orgânicos, hidrocarbonetos halogenados e seus vapores", + X660: "Auto-intoxicação intencional por solventes orgânicos, hidrocarbonetos halogenados e seus vapores - residência", + X661: "Auto-intoxicação intencional por solventes orgânicos, hidrocarbonetos halogenados e seus vapores - habitação coletiva", + X662: "Auto-intoxicação intencional por solventes orgânicos, hidrocarbonetos halogenados e seus vapores - escolas, outras instituições e áreas de administração pública", + X663: "Auto-intoxicação intencional por solventes orgânicos, hidrocarbonetos halogenados e seus vapores - área para a prática de esportes e atletismo", + X664: "Auto-intoxicação intencional por solventes orgânicos, hidrocarbonetos halogenados e seus vapores - rua e estrada", + X665: "Auto-intoxicação intencional por solventes orgânicos, hidrocarbonetos halogenados e seus vapores - áreas de comércio e de serviços", + X666: "Auto-intoxicação intencional por solventes orgânicos, hidrocarbonetos halogenados e seus vapores - áreas industriais e em construção", + X667: "Auto-intoxicação intencional por solventes orgânicos, hidrocarbonetos halogenados e seus vapores - fazenda", + X668: "Auto-intoxicação intencional por solventes orgânicos, hidrocarbonetos halogenados e seus vapores - outros locais especificados", + X669: "Auto-intoxicação intencional por solventes orgânicos, hidrocarbonetos halogenados e seus vapores - local não especificado", + X67: "Auto-intoxicação intencional por outros gases e vapores", + X670: "Auto-intoxicação intencional por outros gases e vapores - residência", + X671: "Auto-intoxicação intencional por outros gases e vapores - habitação coletiva", + X672: "Auto-intoxicação intencional por outros gases e vapores - escolas, outras instituições e áreas de administração pública", + X673: "Auto-intoxicação intencional por outros gases e vapores - área para a prática de esportes e atletismo", + X674: "Auto-intoxicação intencional por outros gases e vapores - rua e estrada", + X675: "Auto-intoxicação intencional por outros gases e vapores - áreas de comércio e de serviços", + X676: "Auto-intoxicação intencional por outros gases e vapores - áreas industriais e em construção", + X677: "Auto-intoxicação intencional por outros gases e vapores - fazenda", + X678: "Auto-intoxicação intencional por outros gases e vapores - outros locais especificados", + X679: "Auto-intoxicação intencional por outros gases e vapores - local não especificado", + X68: "Auto-intoxicação por e exposição, intencional, a pesticidas", + X680: "Auto-intoxicação por e exposição, intencional, a pesticidas - residência", + X681: "Auto-intoxicação por e exposição, intencional, a pesticidas - habitação coletiva", + X682: "Auto-intoxicação por e exposição, intencional, a pesticidas - escolas, outras instituições e áreas de administração pública", + X683: "Auto-intoxicação por e exposição, intencional, a pesticidas - área para a prática de esportes e atletismo", + X684: "Auto-intoxicação por e exposição, intencional, a pesticidas - rua e estrada", + X685: "Auto-intoxicação por e exposição, intencional, a pesticidas - áreas de comércio e de serviços", + X686: "Auto-intoxicação por e exposição, intencional, a pesticidas - áreas industriais e em construção", + X687: "Auto-intoxicação por e exposição, intencional, a pesticidas - fazenda", + X688: "Auto-intoxicação por e exposição, intencional, a pesticidas - outros locais especificados", + X689: "Auto-intoxicação por e exposição, intencional, a pesticidas - local não especificado", + X69: "Auto-intoxicação por e exposição, intencional, a outros produtos químicos e substâncias nocivas não especificadas", + X690: "Auto-intoxicação por e exposição, intencional, a outros produtos químicos e substâncias nocivas não especificadas - residência", + X691: "Auto-intoxicação por e exposição, intencional, a outros produtos químicos e substâncias nocivas não especificadas - habitação coletiva", + X692: "Auto-intoxicação por e exposição, intencional, a outros produtos químicos e substâncias nocivas não especificadas - escolas, outras instituições e áreas de administração pública", + X693: "Auto-intoxicação por e exposição, intencional, a outros produtos químicos e substâncias nocivas não especificadas - área para a prática de esportes e atletismo", + X694: "Auto-intoxicação por e exposição, intencional, a outros produtos químicos e substâncias nocivas não especificadas - rua e estrada", + X695: "Auto-intoxicação por e exposição, intencional, a outros produtos químicos e substâncias nocivas não especificadas - áreas de comércio e de serviços", + X696: "Auto-intoxicação por e exposição, intencional, a outros produtos químicos e substâncias nocivas não especificadas - áreas industriais e em construção", + X697: "Auto-intoxicação por e exposição, intencional, a outros produtos químicos e substâncias nocivas não especificadas - fazenda", + X698: "Auto-intoxicação por e exposição, intencional, a outros produtos químicos e substâncias nocivas não especificadas - outros locais especificados", + X699: "Auto-intoxicação por e exposição, intencional, a outros produtos químicos e substâncias nocivas não especificadas - local não especificado", + X70: "Lesão autoprovocada intencionalmente por enforcamento, estrangulamento e sufocação", + X700: "Lesão autoprovocada intencionalmente por enforcamento, estrangulamento e sufocação - residência", + X701: "Lesão autoprovocada intencionalmente por enforcamento, estrangulamento e sufocação - habitação coletiva", + X702: "Lesão autoprovocada intencionalmente por enforcamento, estrangulamento e sufocação - escolas, outras instituições e áreas de administração pública", + X703: "Lesão autoprovocada intencionalmente por enforcamento, estrangulamento e sufocação - área para a prática de esportes e atletismo", + X704: "Lesão autoprovocada intencionalmente por enforcamento, estrangulamento e sufocação - rua e estrada", + X705: "Lesão autoprovocada intencionalmente por enforcamento, estrangulamento e sufocação - áreas de comércio e de serviços", + X706: "Lesão autoprovocada intencionalmente por enforcamento, estrangulamento e sufocação - áreas industriais e em construção", + X707: "Lesão autoprovocada intencionalmente por enforcamento, estrangulamento e sufocação - fazenda", + X708: "Lesão autoprovocada intencionalmente por enforcamento, estrangulamento e sufocação - outros locais especificados", + X709: "Lesão autoprovocada intencionalmente por enforcamento, estrangulamento e sufocação - local não especificado", + X71: "Lesão autoprovocada intencionalmente por afogamento e submersão", + X710: "Lesão autoprovocada intencionalmente por afogamento e submersão - residência", + X711: "Lesão autoprovocada intencionalmente por afogamento e submersão - habitação coletiva", + X712: "Lesão autoprovocada intencionalmente por afogamento e submersão - escolas, outras instituições e áreas de administração pública", + X713: "Lesão autoprovocada intencionalmente por afogamento e submersão - área para a prática de esportes e atletismo", + X714: "Lesão autoprovocada intencionalmente por afogamento e submersão - rua e estrada", + X715: "Lesão autoprovocada intencionalmente por afogamento e submersão - áreas de comércio e de serviços", + X716: "Lesão autoprovocada intencionalmente por afogamento e submersão - áreas industriais e em construção", + X717: "Lesão autoprovocada intencionalmente por afogamento e submersão - fazenda", + X718: "Lesão autoprovocada intencionalmente por afogamento e submersão - outros locais especificados", + X719: "Lesão autoprovocada intencionalmente por afogamento e submersão - local não especificado", + X72: "Lesão autoprovocada intencionalmente por disparo de arma de fogo de mão", + X720: "Lesão autoprovocada intencionalmente por disparo de arma de fogo de mão - residência", + X721: "Lesão autoprovocada intencionalmente por disparo de arma de fogo de mão - habitação coletiva", + X722: "Lesão autoprovocada intencionalmente por disparo de arma de fogo de mão - escolas, outras instituições e áreas de administração pública", + X723: "Lesão autoprovocada intencionalmente por disparo de arma de fogo de mão - área para a prática de esportes e atletismo", + X724: "Lesão autoprovocada intencionalmente por disparo de arma de fogo de mão - rua e estrada", + X725: "Lesão autoprovocada intencionalmente por disparo de arma de fogo de mão - áreas de comércio e de serviços", + X726: "Lesão autoprovocada intencionalmente por disparo de arma de fogo de mão - áreas industriais e em construção", + X727: "Lesão autoprovocada intencionalmente por disparo de arma de fogo de mão - fazenda", + X728: "Lesão autoprovocada intencionalmente por disparo de arma de fogo de mão - outros locais especificados", + X729: "Lesão autoprovocada intencionalmente por disparo de arma de fogo de mão - local não especificado", + X73: "Lesão autoprovocada intencionalmente por disparo de espingarda, carabina, ou arma de fogo de maior calibre", + X730: "Lesão autoprovocada intencionalmente por disparo de espingarda, carabina, ou arma de fogo de maior calibre - residência", + X731: "Lesão autoprovocada intencionalmente por disparo de espingarda, carabina, ou arma de fogo de maior calibre - habitação coletiva", + X732: "Lesão autoprovocada intencionalmente por disparo de espingarda, carabina, ou arma de fogo de maior calibre - escolas, outras instituições e áreas de administração pública", + X733: "Lesão autoprovocada intencionalmente por disparo de espingarda, carabina, ou arma de fogo de maior calibre - área para a prática de esportes e atletismo", + X734: "Lesão autoprovocada intencionalmente por disparo de espingarda, carabina, ou arma de fogo de maior calibre - rua e estrada", + X735: "Lesão autoprovocada intencionalmente por disparo de espingarda, carabina, ou arma de fogo de maior calibre - áreas de comércio e de serviços", + X736: "Lesão autoprovocada intencionalmente por disparo de espingarda, carabina, ou arma de fogo de maior calibre - áreas industriais e em construção", + X737: "Lesão autoprovocada intencionalmente por disparo de espingarda, carabina, ou arma de fogo de maior calibre - fazenda", + X738: "Lesão autoprovocada intencionalmente por disparo de espingarda, carabina, ou arma de fogo de maior calibre - outros locais especificados", + X739: "Lesão autoprovocada intencionalmente por disparo de espingarda, carabina, ou arma de fogo de maior calibre - local não especificado", + X74: "Lesão autoprovocada intencionalmente por disparo de outra arma de fogo e de arma de fogo não especificada", + X740: "Lesão autoprovocada intencionalmente por disparo de outra arma de fogo e de arma de fogo não especificada - residência", + X741: "Lesão autoprovocada intencionalmente por disparo de outra arma de fogo e de arma de fogo não especificada - habitação coletiva", + X742: "Lesão autoprovocada intencionalmente por disparo de outra arma de fogo e de arma de fogo não especificada - escolas, outras instituições e áreas de administração pública", + X743: "Lesão autoprovocada intencionalmente por disparo de outra arma de fogo e de arma de fogo não especificada - área para a prática de esportes e atletismo", + X744: "Lesão autoprovocada intencionalmente por disparo de outra arma de fogo e de arma de fogo não especificada - rua e estrada", + X745: "Lesão autoprovocada intencionalmente por disparo de outra arma de fogo e de arma de fogo não especificada - áreas de comércio e de serviços", + X746: "Lesão autoprovocada intencionalmente por disparo de outra arma de fogo e de arma de fogo não especificada - áreas industriais e em construção", + X747: "Lesão autoprovocada intencionalmente por disparo de outra arma de fogo e de arma de fogo não especificada - fazenda", + X748: "Lesão autoprovocada intencionalmente por disparo de outra arma de fogo e de arma de fogo não especificada - outros locais especificados", + X749: "Lesão autoprovocada intencionalmente por disparo de outra arma de fogo e de arma de fogo não especificada - local não especificado", + X75: "Lesão autoprovocada intencionalmente por dispositivos explosivos", + X750: "Lesão autoprovocada intencionalmente por dispositivos explosivos - residência", + X751: "Lesão autoprovocada intencionalmente por dispositivos explosivos - habitação coletiva", + X752: "Lesão autoprovocada intencionalmente por dispositivos explosivos - escolas, outras instituições e áreas de administração pública", + X753: "Lesão autoprovocada intencionalmente por dispositivos explosivos - área para a prática de esportes e atletismo", + X754: "Lesão autoprovocada intencionalmente por dispositivos explosivos - rua e estrada", + X755: "Lesão autoprovocada intencionalmente por dispositivos explosivos - áreas de comércio e de serviços", + X756: "Lesão autoprovocada intencionalmente por dispositivos explosivos - áreas industriais e em construção", + X757: "Lesão autoprovocada intencionalmente por dispositivos explosivos - fazenda", + X758: "Lesão autoprovocada intencionalmente por dispositivos explosivos - outros locais especificados", + X759: "Lesão autoprovocada intencionalmente por dispositivos explosivos - local não especificado", + X76: "Lesão autoprovocada intencionalmente pela fumaça, pelo fogo e por chamas", + X760: "Lesão autoprovocada intencionalmente pela fumaça, pelo fogo e por chamas - residência", + X761: "Lesão autoprovocada intencionalmente pela fumaça, pelo fogo e por chamas - habitação coletiva", + X762: "Lesão autoprovocada intencionalmente pela fumaça, pelo fogo e por chamas - escolas, outras instituições e áreas de administração pública", + X763: "Lesão autoprovocada intencionalmente pela fumaça, pelo fogo e por chamas - área para a prática de esportes e atletismo", + X764: "Lesão autoprovocada intencionalmente pela fumaça, pelo fogo e por chamas - rua e estrada", + X765: "Lesão autoprovocada intencionalmente pela fumaça, pelo fogo e por chamas - áreas de comércio e de serviços", + X766: "Lesão autoprovocada intencionalmente pela fumaça, pelo fogo e por chamas - áreas industriais e em construção", + X767: "Lesão autoprovocada intencionalmente pela fumaça, pelo fogo e por chamas - fazenda", + X768: "Lesão autoprovocada intencionalmente pela fumaça, pelo fogo e por chamas - outros locais especificados", + X769: "Lesão autoprovocada intencionalmente pela fumaça, pelo fogo e por chamas - local não especificado", + X77: "Lesão autoprovocada intencionalmente por vapor de água, gases ou objetos quentes", + X770: "Lesão autoprovocada intencionalmente por vapor de água, gases ou objetos quentes - residência", + X771: "Lesão autoprovocada intencionalmente por vapor de água, gases ou objetos quentes - habitação coletiva", + X772: "Lesão autoprovocada intencionalmente por vapor de água, gases ou objetos quentes - escolas, outras instituições e áreas de administração pública", + X773: "Lesão autoprovocada intencionalmente por vapor de água, gases ou objetos quentes - área para a prática de esportes e atletismo", + X774: "Lesão autoprovocada intencionalmente por vapor de água, gases ou objetos quentes - rua e estrada", + X775: "Lesão autoprovocada intencionalmente por vapor de água, gases ou objetos quentes - áreas de comércio e de serviços", + X776: "Lesão autoprovocada intencionalmente por vapor de água, gases ou objetos quentes - áreas industriais e em construção", + X777: "Lesão autoprovocada intencionalmente por vapor de água, gases ou objetos quentes - fazenda", + X778: "Lesão autoprovocada intencionalmente por vapor de água, gases ou objetos quentes - outros locais especificados", + X779: "Lesão autoprovocada intencionalmente por vapor de água, gases ou objetos quentes - local não especificado", + X78: "Lesão autoprovocada intencionalmente por objeto cortante ou penetrante", + X780: "Lesão autoprovocada intencionalmente por objeto cortante ou penetrante - residência", + X781: "Lesão autoprovocada intencionalmente por objeto cortante ou penetrante - habitação coletiva", + X782: "Lesão autoprovocada intencionalmente por objeto cortante ou penetrante - escolas, outras instituições e áreas de administração pública", + X783: "Lesão autoprovocada intencionalmente por objeto cortante ou penetrante - área para a prática de esportes e atletismo", + X784: "Lesão autoprovocada intencionalmente por objeto cortante ou penetrante - rua e estrada", + X785: "Lesão autoprovocada intencionalmente por objeto cortante ou penetrante - áreas de comércio e de serviços", + X786: "Lesão autoprovocada intencionalmente por objeto cortante ou penetrante - áreas industriais e em construção", + X787: "Lesão autoprovocada intencionalmente por objeto cortante ou penetrante - fazenda", + X788: "Lesão autoprovocada intencionalmente por objeto cortante ou penetrante - outros locais especificados", + X789: "Lesão autoprovocada intencionalmente por objeto cortante ou penetrante - local não especificado", + X79: "Lesão autoprovocada intencionalmente por objeto contundente", + X790: "Lesão autoprovocada intencionalmente por objeto contundente - residência", + X791: "Lesão autoprovocada intencionalmente por objeto contundente - habitação coletiva", + X792: "Lesão autoprovocada intencionalmente por objeto contundente - escolas, outras instituições e áreas de administração pública", + X793: "Lesão autoprovocada intencionalmente por objeto contundente - área para a prática de esportes e atletismo", + X794: "Lesão autoprovocada intencionalmente por objeto contundente - rua e estrada", + X795: "Lesão autoprovocada intencionalmente por objeto contundente - áreas de comércio e de serviços", + X796: "Lesão autoprovocada intencionalmente por objeto contundente - áreas industriais e em construção", + X797: "Lesão autoprovocada intencionalmente por objeto contundente - fazenda", + X798: "Lesão autoprovocada intencionalmente por objeto contundente - outros locais especificados", + X799: "Lesão autoprovocada intencionalmente por objeto contundente - local não especificado", + X80: "Lesão autoprovocada intencionalmente por precipitação de um lugar elevado", + X800: "Lesão autoprovocada intencionalmente por precipitação de um lugar elevado - residência", + X801: "Lesão autoprovocada intencionalmente por precipitação de um lugar elevado - habitação coletiva", + X802: "Lesão autoprovocada intencionalmente por precipitação de um lugar elevado - escolas, outras instituições e áreas de administração pública", + X803: "Lesão autoprovocada intencionalmente por precipitação de um lugar elevado - área para a prática de esportes e atletismo", + X804: "Lesão autoprovocada intencionalmente por precipitação de um lugar elevado - rua e estrada", + X805: "Lesão autoprovocada intencionalmente por precipitação de um lugar elevado - áreas de comércio e de serviços", + X806: "Lesão autoprovocada intencionalmente por precipitação de um lugar elevado - áreas industriais e em construção", + X807: "Lesão autoprovocada intencionalmente por precipitação de um lugar elevado - fazenda", + X808: "Lesão autoprovocada intencionalmente por precipitação de um lugar elevado - outros locais especificados", + X809: "Lesão autoprovocada intencionalmente por precipitação de um lugar elevado - local não especificado", + X81: "Lesão autoprovocada intencionalmente por precipitação ou permanência diante de um objeto em movimento", + X810: "Lesão autoprovocada intencionalmente por precipitação ou permanência diante de um objeto em movimento - residência", + X811: "Lesão autoprovocada intencionalmente por precipitação ou permanência diante de um objeto em movimento - habitação coletiva", + X812: "Lesão autoprovocada intencionalmente por precipitação ou permanência diante de um objeto em movimento - escolas, outras instituições e áreas de administração pública", + X813: "Lesão autoprovocada intencionalmente por precipitação ou permanência diante de um objeto em movimento - área para a prática de esportes e atletismo", + X814: "Lesão autoprovocada intencionalmente por precipitação ou permanência diante de um objeto em movimento - rua e estrada", + X815: "Lesão autoprovocada intencionalmente por precipitação ou permanência diante de um objeto em movimento - áreas de comércio e de serviços", + X816: "Lesão autoprovocada intencionalmente por precipitação ou permanência diante de um objeto em movimento - áreas industriais e em construção", + X817: "Lesão autoprovocada intencionalmente por precipitação ou permanência diante de um objeto em movimento - fazenda", + X818: "Lesão autoprovocada intencionalmente por precipitação ou permanência diante de um objeto em movimento - outros locais especificados", + X819: "Lesão autoprovocada intencionalmente por precipitação ou permanência diante de um objeto em movimento - local não especificado", + X82: "Lesão autoprovocada intencionalmente por impacto de um veículo a motor", + X820: "Lesão autoprovocada intencionalmente por impacto de um veículo a motor - residência", + X821: "Lesão autoprovocada intencionalmente por impacto de um veículo a motor - habitação coletiva", + X822: "Lesão autoprovocada intencionalmente por impacto de um veículo a motor - escolas, outras instituições e áreas de administração pública", + X823: "Lesão autoprovocada intencionalmente por impacto de um veículo a motor - área para a prática de esportes e atletismo", + X824: "Lesão autoprovocada intencionalmente por impacto de um veículo a motor - rua e estrada", + X825: "Lesão autoprovocada intencionalmente por impacto de um veículo a motor - áreas de comércio e de serviços", + X826: "Lesão autoprovocada intencionalmente por impacto de um veículo a motor - áreas industriais e em construção", + X827: "Lesão autoprovocada intencionalmente por impacto de um veículo a motor - fazenda", + X828: "Lesão autoprovocada intencionalmente por impacto de um veículo a motor - outros locais especificados", + X829: "Lesão autoprovocada intencionalmente por impacto de um veículo a motor - local não especificado", + X83: "Lesão autoprovocada intencionalmente por outros meios especificados", + X830: "Lesão autoprovocada intencionalmente por outros meios especificados - residência", + X831: "Lesão autoprovocada intencionalmente por outros meios especificados - habitação coletiva", + X832: "Lesão autoprovocada intencionalmente por outros meios especificados - escolas, outras instituições e áreas de administração pública", + X833: "Lesão autoprovocada intencionalmente por outros meios especificados - área para a prática de esportes e atletismo", + X834: "Lesão autoprovocada intencionalmente por outros meios especificados - rua e estrada", + X835: "Lesão autoprovocada intencionalmente por outros meios especificados - áreas de comércio e de serviços", + X836: "Lesão autoprovocada intencionalmente por outros meios especificados - áreas industriais e em construção", + X837: "Lesão autoprovocada intencionalmente por outros meios especificados - fazenda", + X838: "Lesão autoprovocada intencionalmente por outros meios especificados - outros locais especificados", + X839: "Lesão autoprovocada intencionalmente por outros meios especificados - local não especificado", + X84: "Lesão autoprovocada intencionalmente por meios não especificados", + X840: "Lesão autoprovocada intencionalmente por meios não especificados - residência", + X841: "Lesão autoprovocada intencionalmente por meios não especificados - habitação coletiva", + X842: "Lesão autoprovocada intencionalmente por meios não especificados - escolas, outras instituições e áreas de administração pública", + X843: "Lesão autoprovocada intencionalmente por meios não especificados - área para a prática de esportes e atletismo", + X844: "Lesão autoprovocada intencionalmente por meios não especificados - rua e estrada", + X845: "Lesão autoprovocada intencionalmente por meios não especificados - áreas de comércio e de serviços", + X846: "Lesão autoprovocada intencionalmente por meios não especificados - áreas industriais e em construção", + X847: "Lesão autoprovocada intencionalmente por meios não especificados - fazenda", + X848: "Lesão autoprovocada intencionalmente por meios não especificados - outros locais especificados", + X849: "Lesão autoprovocada intencionalmente por meios não especificados - local não especificado", + X85: "Agressão por meio de drogas, medicamentos e substâncias biológicas", + X850: "Agressão por meio de drogas, medicamentos e substâncias biológicas - residência", + X851: "Agressão por meio de drogas, medicamentos e substâncias biológicas - habitação coletiva", + X852: "Agressão por meio de drogas, medicamentos e substâncias biológicas - escolas, outras instituições e áreas de administração pública", + X853: "Agressão por meio de drogas, medicamentos e substâncias biológicas - área para a prática de esportes e atletismo", + X854: "Agressão por meio de drogas, medicamentos e substâncias biológicas - rua e estrada", + X855: "Agressão por meio de drogas, medicamentos e substâncias biológicas - áreas de comércio e de serviços", + X856: "Agressão por meio de drogas, medicamentos e substâncias biológicas - áreas industriais e em construção", + X857: "Agressão por meio de drogas, medicamentos e substâncias biológicas - fazenda", + X858: "Agressão por meio de drogas, medicamentos e substâncias biológicas - outros locais especificados", + X859: "Agressão por meio de drogas, medicamentos e substâncias biológicas - local não especificado", + X86: "Agressão por meio de substâncias corrosivas", + X860: "Agressão por meio de substâncias corrosivas - residência", + X861: "Agressão por meio de substâncias corrosivas - habitação coletiva", + X862: "Agressão por meio de substâncias corrosivas - escolas, outras instituições e áreas de administração pública", + X863: "Agressão por meio de substâncias corrosivas - área para a prática de esportes e atletismo", + X864: "Agressão por meio de substâncias corrosivas - rua e estrada", + X865: "Agressão por meio de substâncias corrosivas - áreas de comércio e de serviços", + X866: "Agressão por meio de substâncias corrosivas - áreas industriais e em construção", + X867: "Agressão por meio de substâncias corrosivas - fazenda", + X868: "Agressão por meio de substâncias corrosivas - outros locais especificados", + X869: "Agressão por meio de substâncias corrosivas - local não especificado", + X87: "Agressão por pesticidas", + X870: "Agressão por pesticidas - residência", + X871: "Agressão por pesticidas - habitação coletiva", + X872: "Agressão por pesticidas - escolas, outras instituições e áreas de administração pública", + X873: "Agressão por pesticidas - área para a prática de esportes e atletismo", + X874: "Agressão por pesticidas - rua e estrada", + X875: "Agressão por pesticidas - áreas de comércio e de serviços", + X876: "Agressão por pesticidas - áreas industriais e em construção", + X877: "Agressão por pesticidas - fazenda", + X878: "Agressão por pesticidas - outros locais especificados", + X879: "Agressão por pesticidas - local não especificado", + X88: "Agressão por meio de gases e vapores", + X880: "Agressão por meio de gases e vapores - residência", + X881: "Agressão por meio de gases e vapores - habitação coletiva", + X882: "Agressão por meio de gases e vapores - escolas, outras instituições e áreas de administração pública", + X883: "Agressão por meio de gases e vapores - área para a prática de esportes e atletismo", + X884: "Agressão por meio de gases e vapores - rua e estrada", + X885: "Agressão por meio de gases e vapores - áreas de comércio e de serviços", + X886: "Agressão por meio de gases e vapores - áreas industriais e em construção", + X887: "Agressão por meio de gases e vapores - fazenda", + X888: "Agressão por meio de gases e vapores - outros locais especificados", + X889: "Agressão por meio de gases e vapores - local não especificado", + X89: "Agressão por meio de outros produtos químicos e substâncias nocivas especificados", + X890: "Agressão por meio de outros produtos químicos e substâncias nocivas especificados - residência", + X891: "Agressão por meio de outros produtos químicos e substâncias nocivas especificados - habitação coletiva", + X892: "Agressão por meio de outros produtos químicos e substâncias nocivas especificados - escolas, outras instituições e áreas de administração pública", + X893: "Agressão por meio de outros produtos químicos e substâncias nocivas especificados - área para a prática de esportes e atletismo", + X894: "Agressão por meio de outros produtos químicos e substâncias nocivas especificados - rua e estrada", + X895: "Agressão por meio de outros produtos químicos e substâncias nocivas especificados - áreas de comércio e de serviços", + X896: "Agressão por meio de outros produtos químicos e substâncias nocivas especificados - áreas industriais e em construção", + X897: "Agressão por meio de outros produtos químicos e substâncias nocivas especificados - fazenda", + X898: "Agressão por meio de outros produtos químicos e substâncias nocivas especificados - outros locais especificados", + X899: "Agressão por meio de outros produtos químicos e substâncias nocivas especificados - local não especificado", + X90: "Agressão por meio de produtos químicos e substâncias nocivas não especificados", + X900: "Agressão por meio de produtos químicos e substâncias nocivas não especificados - residência", + X901: "Agressão por meio de produtos químicos e substâncias nocivas não especificados - habitação coletiva", + X902: "Agressão por meio de produtos químicos e substâncias nocivas não especificados - escolas, outras instituições e áreas de administração pública", + X903: "Agressão por meio de produtos químicos e substâncias nocivas não especificados - área para a prática de esportes e atletismo", + X904: "Agressão por meio de produtos químicos e substâncias nocivas não especificados - rua e estrada", + X905: "Agressão por meio de produtos químicos e substâncias nocivas não especificados - áreas de comércio e de serviços", + X906: "Agressão por meio de produtos químicos e substâncias nocivas não especificados - áreas industriais e em construção", + X907: "Agressão por meio de produtos químicos e substâncias nocivas não especificados - fazenda", + X908: "Agressão por meio de produtos químicos e substâncias nocivas não especificados - outros locais especificados", + X909: "Agressão por meio de produtos químicos e substâncias nocivas não especificados - local não especificado", + X91: "Agressão por meio de enforcamento, estrangulamento e sufocação", + X910: "Agressão por meio de enforcamento, estrangulamento e sufocação - residência", + X911: "Agressão por meio de enforcamento, estrangulamento e sufocação - habitação coletiva", + X912: "Agressão por meio de enforcamento, estrangulamento e sufocação - escolas, outras instituições e áreas de administração pública", + X913: "Agressão por meio de enforcamento, estrangulamento e sufocação - área para a prática de esportes e atletismo", + X914: "Agressão por meio de enforcamento, estrangulamento e sufocação - rua e estrada", + X915: "Agressão por meio de enforcamento, estrangulamento e sufocação - áreas de comércio e de serviços", + X916: "Agressão por meio de enforcamento, estrangulamento e sufocação - áreas industriais e em construção", + X917: "Agressão por meio de enforcamento, estrangulamento e sufocação - fazenda", + X918: "Agressão por meio de enforcamento, estrangulamento e sufocação - outros locais especificados", + X919: "Agressão por meio de enforcamento, estrangulamento e sufocação - local não especificado", + X92: "Agressão por meio de afogamento e submersão", + X920: "Agressão por meio de afogamento e submersão - residência", + X921: "Agressão por meio de afogamento e submersão - habitação coletiva", + X922: "Agressão por meio de afogamento e submersão - escolas, outras instituições e áreas de administração pública", + X923: "Agressão por meio de afogamento e submersão - área para a prática de esportes e atletismo", + X924: "Agressão por meio de afogamento e submersão - rua e estrada", + X925: "Agressão por meio de afogamento e submersão - áreas de comércio e de serviços", + X926: "Agressão por meio de afogamento e submersão - áreas industriais e em construção", + X927: "Agressão por meio de afogamento e submersão - fazenda", + X928: "Agressão por meio de afogamento e submersão - outros locais especificados", + X929: "Agressão por meio de afogamento e submersão - local não especificado", + X93: "Agressão por meio de disparo de arma de fogo de mão", + X930: "Agressão por meio de disparo de arma de fogo de mão - residência", + X931: "Agressão por meio de disparo de arma de fogo de mão - habitação coletiva", + X932: "Agressão por meio de disparo de arma de fogo de mão - escolas, outras instituições e áreas de administração pública", + X933: "Agressão por meio de disparo de arma de fogo de mão - área para a prática de esportes e atletismo", + X934: "Agressão por meio de disparo de arma de fogo de mão - rua e estrada", + X935: "Agressão por meio de disparo de arma de fogo de mão - áreas de comércio e de serviços", + X936: "Agressão por meio de disparo de arma de fogo de mão - áreas industriais e em construção", + X937: "Agressão por meio de disparo de arma de fogo de mão - fazenda", + X938: "Agressão por meio de disparo de arma de fogo de mão - outros locais especificados", + X939: "Agressão por meio de disparo de arma de fogo de mão - local não especificado", + X94: "Agressão por meio de disparo de espingarda, carabina ou arma de fogo de maior calibre", + X940: "Agressão por meio de disparo de espingarda, carabina ou arma de fogo de maior calibre - residência", + X941: "Agressão por meio de disparo de espingarda, carabina ou arma de fogo de maior calibre - habitação coletiva", + X942: "Agressão por meio de disparo de espingarda, carabina ou arma de fogo de maior calibre - escolas, outras instituições e áreas de administração pública", + X943: "Agressão por meio de disparo de espingarda, carabina ou arma de fogo de maior calibre - área para a prática de esportes e atletismo", + X944: "Agressão por meio de disparo de espingarda, carabina ou arma de fogo de maior calibre - rua e estrada", + X945: "Agressão por meio de disparo de espingarda, carabina ou arma de fogo de maior calibre - áreas de comércio e de serviços", + X946: "Agressão por meio de disparo de espingarda, carabina ou arma de fogo de maior calibre - áreas industriais e em construção", + X947: "Agressão por meio de disparo de espingarda, carabina ou arma de fogo de maior calibre - fazenda", + X948: "Agressão por meio de disparo de espingarda, carabina ou arma de fogo de maior calibre - outros locais especificados", + X949: "Agressão por meio de disparo de espingarda, carabina ou arma de fogo de maior calibre - local não especificado", + X95: "Agressão por meio de disparo de outra arma de fogo ou de arma não especificada", + X950: "Agressão por meio de disparo de outra arma de fogo ou de arma não especificada - residência", + X951: "Agressão por meio de disparo de outra arma de fogo ou de arma não especificada - habitação coletiva", + X952: "Agressão por meio de disparo de outra arma de fogo ou de arma não especificada - escolas, outras instituições e áreas de administração pública", + X953: "Agressão por meio de disparo de outra arma de fogo ou de arma não especificada - área para a prática de esportes e atletismo", + X954: "Agressão por meio de disparo de outra arma de fogo ou de arma não especificada - rua e estrada", + X955: "Agressão por meio de disparo de outra arma de fogo ou de arma não especificada - áreas de comércio e de serviços", + X956: "Agressão por meio de disparo de outra arma de fogo ou de arma não especificada - áreas industriais e em construção", + X957: "Agressão por meio de disparo de outra arma de fogo ou de arma não especificada - fazenda", + X958: "Agressão por meio de disparo de outra arma de fogo ou de arma não especificada - outros locais especificados", + X959: "Agressão por meio de disparo de outra arma de fogo ou de arma não especificada - local não especificado", + X96: "Agressão por meio de material explosivo", + X960: "Agressão por meio de material explosivo - residência", + X961: "Agressão por meio de material explosivo - habitação coletiva", + X962: "Agressão por meio de material explosivo - escolas, outras instituições e áreas de administração pública", + X963: "Agressão por meio de material explosivo - área para a prática de esportes e atletismo", + X964: "Agressão por meio de material explosivo - rua e estrada", + X965: "Agressão por meio de material explosivo - áreas de comércio e de serviços", + X966: "Agressão por meio de material explosivo - áreas industriais e em construção", + X967: "Agressão por meio de material explosivo - fazenda", + X968: "Agressão por meio de material explosivo - outros locais especificados", + X969: "Agressão por meio de material explosivo - local não especificado", + X97: "Agressão por meio de fumaça, fogo e chamas", + X970: "Agressão por meio de fumaça, fogo e chamas - residência", + X971: "Agressão por meio de fumaça, fogo e chamas - habitação coletiva", + X972: "Agressão por meio de fumaça, fogo e chamas - escolas, outras instituições e áreas de administração pública", + X973: "Agressão por meio de fumaça, fogo e chamas - área para a prática de esportes e atletismo", + X974: "Agressão por meio de fumaça, fogo e chamas - rua e estrada", + X975: "Agressão por meio de fumaça, fogo e chamas - áreas de comércio e de serviços", + X976: "Agressão por meio de fumaça, fogo e chamas - áreas industriais e em construção", + X977: "Agressão por meio de fumaça, fogo e chamas - fazenda", + X978: "Agressão por meio de fumaça, fogo e chamas - outros locais especificados", + X979: "Agressão por meio de fumaça, fogo e chamas - local não especificado", + X98: "Agressão por meio de vapor de água, gases ou objetos quentes", + X980: "Agressão por meio de vapor de água, gases ou objetos quentes - residência", + X981: "Agressão por meio de vapor de água, gases ou objetos quentes - habitação coletiva", + X982: "Agressão por meio de vapor de água, gases ou objetos quentes - escolas, outras instituições e áreas de administração pública", + X983: "Agressão por meio de vapor de água, gases ou objetos quentes - área para a prática de esportes e atletismo", + X984: "Agressão por meio de vapor de água, gases ou objetos quentes - rua e estrada", + X985: "Agressão por meio de vapor de água, gases ou objetos quentes - áreas de comércio e de serviços", + X986: "Agressão por meio de vapor de água, gases ou objetos quentes - áreas industriais e em construção", + X987: "Agressão por meio de vapor de água, gases ou objetos quentes - fazenda", + X988: "Agressão por meio de vapor de água, gases ou objetos quentes - outros locais especificados", + X989: "Agressão por meio de vapor de água, gases ou objetos quentes - local não especificado", + X99: "Agressão por meio de objeto cortante ou penetrante", + X990: "Agressão por meio de objeto cortante ou penetrante - residência", + X991: "Agressão por meio de objeto cortante ou penetrante - habitação coletiva", + X992: "Agressão por meio de objeto cortante ou penetrante - escolas, outras instituições e áreas de administração pública", + X993: "Agressão por meio de objeto cortante ou penetrante - área para a prática de esportes e atletismo", + X994: "Agressão por meio de objeto cortante ou penetrante - rua e estrada", + X995: "Agressão por meio de objeto cortante ou penetrante - áreas de comércio e de serviços", + X996: "Agressão por meio de objeto cortante ou penetrante - áreas industriais e em construção", + X997: "Agressão por meio de objeto cortante ou penetrante - fazenda", + X998: "Agressão por meio de objeto cortante ou penetrante - outros locais especificados", + X999: "Agressão por meio de objeto cortante ou penetrante - local não especificado", + Y00: "Agressão por meio de um objeto contundente", + Y000: "Agressão por meio de um objeto contundente - residência", + Y001: "Agressão por meio de um objeto contundente - habitação coletiva", + Y002: "Agressão por meio de um objeto contundente - escolas, outras instituições e áreas de administração pública", + Y003: "Agressão por meio de um objeto contundente - área para a prática de esportes e atletismo", + Y004: "Agressão por meio de um objeto contundente - rua e estrada", + Y005: "Agressão por meio de um objeto contundente - áreas de comércio e de serviços", + Y006: "Agressão por meio de um objeto contundente - áreas industriais e em construção", + Y007: "Agressão por meio de um objeto contundente - fazenda", + Y008: "Agressão por meio de um objeto contundente - outros locais especificados", + Y009: "Agressão por meio de um objeto contundente - local não especificado", + Y01: "Agressão por meio de projeção de um lugar elevado", + Y010: "Agressão por meio de projeção de um lugar elevado - residência", + Y011: "Agressão por meio de projeção de um lugar elevado - habitação coletiva", + Y012: "Agressão por meio de projeção de um lugar elevado - escolas, outras instituições e áreas de administração pública", + Y013: "Agressão por meio de projeção de um lugar elevado - área para a prática de esportes e atletismo", + Y014: "Agressão por meio de projeção de um lugar elevado - rua e estrada", + Y015: "Agressão por meio de projeção de um lugar elevado - áreas de comércio e de serviços", + Y016: "Agressão por meio de projeção de um lugar elevado - áreas industriais e em construção", + Y017: "Agressão por meio de projeção de um lugar elevado - fazenda", + Y018: "Agressão por meio de projeção de um lugar elevado - outros locais especificados", + Y019: "Agressão por meio de projeção de um lugar elevado - local não especificado", + Y02: "Agressão por meio de projeção ou colocação da vítima diante de um objeto em movimento", + Y020: "Agressão por meio de projeção ou colocação da vítima diante de um objeto em movimento - residência", + Y021: "Agressão por meio de projeção ou colocação da vítima diante de um objeto em movimento - habitação coletiva", + Y022: "Agressão por meio de projeção ou colocação da vítima diante de um objeto em movimento - escolas, outras instituições e áreas de administração pública", + Y023: "Agressão por meio de projeção ou colocação da vítima diante de um objeto em movimento - área para a prática de esportes e atletismo", + Y024: "Agressão por meio de projeção ou colocação da vítima diante de um objeto em movimento - rua e estrada", + Y025: "Agressão por meio de projeção ou colocação da vítima diante de um objeto em movimento - áreas de comércio e de serviços", + Y026: "Agressão por meio de projeção ou colocação da vítima diante de um objeto em movimento - áreas industriais e em construção", + Y027: "Agressão por meio de projeção ou colocação da vítima diante de um objeto em movimento - fazenda", + Y028: "Agressão por meio de projeção ou colocação da vítima diante de um objeto em movimento - outros locais especificados", + Y029: "Agressão por meio de projeção ou colocação da vítima diante de um objeto em movimento - local não especificado", + Y03: "Agressão por meio de impacto de um veículo a motor", + Y030: "Agressão por meio de impacto de um veículo a motor - residência", + Y031: "Agressão por meio de impacto de um veículo a motor - habitação coletiva", + Y032: "Agressão por meio de impacto de um veículo a motor - escolas, outras instituições e áreas de administração pública", + Y033: "Agressão por meio de impacto de um veículo a motor - área para a prática de esportes e atletismo", + Y034: "Agressão por meio de impacto de um veículo a motor - rua e estrada", + Y035: "Agressão por meio de impacto de um veículo a motor - áreas de comércio e de serviços", + Y036: "Agressão por meio de impacto de um veículo a motor - áreas industriais e em construção", + Y037: "Agressão por meio de impacto de um veículo a motor - fazenda", + Y038: "Agressão por meio de impacto de um veículo a motor - outros locais especificados", + Y039: "Agressão por meio de impacto de um veículo a motor - local não especificado", + Y04: "Agressão por meio de força corporal", + Y040: "Agressão por meio de força corporal - residência", + Y041: "Agressão por meio de força corporal - habitação coletiva", + Y042: "Agressão por meio de força corporal - escolas, outras instituições e áreas de administração pública", + Y043: "Agressão por meio de força corporal - área para a prática de esportes e atletismo", + Y044: "Agressão por meio de força corporal - rua e estrada", + Y045: "Agressão por meio de força corporal - áreas de comércio e de serviços", + Y046: "Agressão por meio de força corporal - áreas industriais e em construção", + Y047: "Agressão por meio de força corporal - fazenda", + Y048: "Agressão por meio de força corporal - outros locais especificados", + Y049: "Agressão por meio de força corporal - local não especificado", + Y05: "Agressão sexual por meio de força física", + Y050: "Agressão sexual por meio de força física - residência", + Y051: "Agressão sexual por meio de força física - habitação coletiva", + Y052: "Agressão sexual por meio de força física - escolas, outras instituições e áreas de administração pública", + Y053: "Agressão sexual por meio de força física - área para a prática de esportes e atletismo", + Y054: "Agressão sexual por meio de força física - rua e estrada", + Y055: "Agressão sexual por meio de força física - áreas de comércio e de serviços", + Y056: "Agressão sexual por meio de força física - áreas industriais e em construção", + Y057: "Agressão sexual por meio de força física - fazenda", + Y058: "Agressão sexual por meio de força física - outros locais especificados", + Y059: "Agressão sexual por meio de força física - local não especificado", + Y06: "Negligência e abandono", + Y060: "Negligência e abandono pelo esposo ou companheiro", + Y061: "Negligência e abandono pelos pais", + Y062: "Negligência e abandono por conhecido ou amigo", + Y068: "Negligência e abandono por outra pessoa especificada", + Y069: "Negligência e abandono por pessoa não especificada", + Y07: "Outras síndromes de maus tratos", + Y070: "Outras síndromes de maus tratos pelo esposo ou companheiro", + Y071: "Outras síndromes de maus tratos pelos pais", + Y072: "Outras síndromes de maus tratos por conhecido ou amigo", + Y073: "Outras síndromes de maus tratos por autoridades oficiais", + Y078: "Outras síndromes de maus tratos por outra pessoa especificada", + Y079: "Outras síndromes de maus tratos por pessoa não especificada", + Y08: "Agressão por outros meios especificados", + Y080: "Agressão por outros meios especificados - residência", + Y081: "Agressão por outros meios especificados - habitação coletiva", + Y082: "Agressão por outros meios especificados - escolas, outras instituições e áreas de administração pública", + Y083: "Agressão por outros meios especificados - área para a prática de esportes e atletismo", + Y084: "Agressão por outros meios especificados - rua e estrada", + Y085: "Agressão por outros meios especificados - áreas de comércio e de serviços", + Y086: "Agressão por outros meios especificados - áreas industriais e em construção", + Y087: "Agressão por outros meios especificados - fazenda", + Y088: "Agressão por outros meios especificados - outros locais especificados", + Y089: "Agressão por outros meios especificados - local não especificado", + Y09: "Agressão por meios não especificados", + Y090: "Agressão por meios não especificados - residência", + Y091: "Agressão por meios não especificados - habitação coletiva", + Y092: "Agressão por meios não especificados - escolas, outras instituições e áreas de administração pública", + Y093: "Agressão por meios não especificados - área para a prática de esportes e atletismo", + Y094: "Agressão por meios não especificados - rua e estrada", + Y095: "Agressão por meios não especificados - áreas de comércio e de serviços", + Y096: "Agressão por meios não especificados - áreas industriais e em construção", + Y097: "Agressão por meios não especificados - fazenda", + Y098: "Agressão por meios não especificados - outros locais especificados", + Y099: "Agressão por meios não especificados - local não especificado", + Y10: "Envenenamento [intoxicação] por e exposição a analgésicos, antipiréticos e anti-reumáticos não-opiáceos, intenção não determinada", + Y100: "Envenenamento [intoxicação] por e exposição a analgésicos, antipiréticos e anti-reumáticos não-opiáceos, intenção não determinada - residência", + Y101: "Envenenamento [intoxicação] por e exposição a analgésicos, antipiréticos e anti-reumáticos não-opiáceos, intenção não determinada - habitação coletiva", + Y102: "Envenenamento [intoxicação] por e exposição a analgésicos, antipiréticos e anti-reumáticos não-opiáceos, intenção não determinada - escolas, outras instituições e áreas de administração pública", + Y103: "Envenenamento [intoxicação] por e exposição a analgésicos, antipiréticos e anti-reumáticos não-opiáceos, intenção não determinada - área para a prática de esportes e atletismo", + Y104: "Envenenamento [intoxicação] por e exposição a analgésicos, antipiréticos e anti-reumáticos não-opiáceos, intenção não determinada - rua e estrada", + Y105: "Envenenamento [intoxicação] por e exposição a analgésicos, antipiréticos e anti-reumáticos não-opiáceos, intenção não determinada - áreas de comércio e de serviços", + Y106: "Envenenamento [intoxicação] por e exposição a analgésicos, antipiréticos e anti-reumáticos não-opiáceos, intenção não determinada - áreas industriais e em construção", + Y107: "Envenenamento [intoxicação] por e exposição a analgésicos, antipiréticos e anti-reumáticos não-opiáceos, intenção não determinada - fazenda", + Y108: "Envenenamento [intoxicação] por e exposição a analgésicos, antipiréticos e anti-reumáticos não-opiáceos, intenção não determinada - outros locais especificados", + Y109: "Envenenamento [intoxicação] por e exposição a analgésicos, antipiréticos e anti-reumáticos não-opiáceos, intenção não determinada - local não especificado", + Y11: "Envenenamento [intoxicação] por e exposição a anticonvulsivantes [antiepilépticos], sedativos, hipnóticos, antiparkinsonianos e psicotrópicos não classificados em outra parte, intenção não determinada", + Y110: "Envenenamento [intoxicação] por e exposição a anticonvulsivantes [antiepilépticos], sedativos, hipnóticos, antiparkinsonianos e psicotrópicos não classificados em outra parte, intenção não determinada - residência", + Y111: "Envenenamento [intoxicação] por e exposição a anticonvulsivantes [antiepilépticos], sedativos, hipnóticos, antiparkinsonianos e psicotrópicos não classificados em outra parte, intenção não determinada - habitação coletiva", + Y112: "Envenenamento [intoxicação] por e exposição a anticonvulsivantes [antiepilépticos], sedativos, hipnóticos, antiparkinsonianos e psicotrópicos não classificados em outra parte, intenção não determinada - escolas, outras instituições e áreas de administração pública", + Y113: "Envenenamento [intoxicação] por e exposição a anticonvulsivantes [antiepilépticos], sedativos, hipnóticos, antiparkinsonianos e psicotrópicos não classificados em outra parte, intenção não determinada - área para a prática de esportes e atletismo", + Y114: "Envenenamento [intoxicação] por e exposição a anticonvulsivantes [antiepilépticos], sedativos, hipnóticos, antiparkinsonianos e psicotrópicos não classificados em outra parte, intenção não determinada - rua e estrada", + Y115: "Envenenamento [intoxicação] por e exposição a anticonvulsivantes [antiepilépticos], sedativos, hipnóticos, antiparkinsonianos e psicotrópicos não classificados em outra parte, intenção não determinada - áreas de comércio e de serviços", + Y116: "Envenenamento [intoxicação] por e exposição a anticonvulsivantes [antiepilépticos], sedativos, hipnóticos, antiparkinsonianos e psicotrópicos não classificados em outra parte, intenção não determinada - áreas industriais e em construção", + Y117: "Envenenamento [intoxicação] por e exposição a anticonvulsivantes [antiepilépticos], sedativos, hipnóticos, antiparkinsonianos e psicotrópicos não classificados em outra parte, intenção não determinada - fazenda", + Y118: "Envenenamento [intoxicação] por e exposição a anticonvulsivantes [antiepilépticos], sedativos, hipnóticos, antiparkinsonianos e psicotrópicos não classificados em outra parte, intenção não determinada - outros locais especificados", + Y119: "Envenenamento [intoxicação] por e exposição a anticonvulsivantes [antiepilépticos], sedativos, hipnóticos, antiparkinsonianos e psicotrópicos não classificados em outra parte, intenção não determinada - local não especificado", + Y12: "Envenenamento [intoxicação] por e exposição a narcóticos e a psicodislépticos [alucinógenos] não classificados em outra parte, intenção não determinada", + Y120: "Envenenamento [intoxicação] por e exposição a narcóticos e a psicodislépticos [alucinógenos] não classificados em outra parte, intenção não determinada - residência", + Y121: "Envenenamento [intoxicação] por e exposição a narcóticos e a psicodislépticos [alucinógenos] não classificados em outra parte, intenção não determinada - habitação coletiva", + Y122: "Envenenamento [intoxicação] por e exposição a narcóticos e a psicodislépticos [alucinógenos] não classificados em outra parte, intenção não determinada - escolas, outras instituições e áreas de administração pública", + Y123: "Envenenamento [intoxicação] por e exposição a narcóticos e a psicodislépticos [alucinógenos] não classificados em outra parte, intenção não determinada - área para a prática de esportes e atletismo", + Y124: "Envenenamento [intoxicação] por e exposição a narcóticos e a psicodislépticos [alucinógenos] não classificados em outra parte, intenção não determinada - rua e estrada", + Y125: "Envenenamento [intoxicação] por e exposição a narcóticos e a psicodislépticos [alucinógenos] não classificados em outra parte, intenção não determinada - áreas de comércio e de serviços", + Y126: "Envenenamento [intoxicação] por e exposição a narcóticos e a psicodislépticos [alucinógenos] não classificados em outra parte, intenção não determinada - áreas industriais e em construção", + Y127: "Envenenamento [intoxicação] por e exposição a narcóticos e a psicodislépticos [alucinógenos] não classificados em outra parte, intenção não determinada - fazenda", + Y128: "Envenenamento [intoxicação] por e exposição a narcóticos e a psicodislépticos [alucinógenos] não classificados em outra parte, intenção não determinada - outros locais especificados", + Y129: "Envenenamento [intoxicação] por e exposição a narcóticos e a psicodislépticos [alucinógenos] não classificados em outra parte, intenção não determinada - local não especificado", + Y13: "Envenenamento [intoxicação] por e exposição a outras substâncias farmacológicas de ação sobre o sistema nervoso autônomo, intenção não determinada", + Y130: "Envenenamento [intoxicação] por e exposição a outras substâncias farmacológicas de ação sobre o sistema nervoso autônomo, intenção não determinada - residência", + Y131: "Envenenamento [intoxicação] por e exposição a outras substâncias farmacológicas de ação sobre o sistema nervoso autônomo, intenção não determinada - habitação coletiva", + Y132: "Envenenamento [intoxicação] por e exposição a outras substâncias farmacológicas de ação sobre o sistema nervoso autônomo, intenção não determinada - escolas, outras instituições e áreas de administração pública", + Y133: "Envenenamento [intoxicação] por e exposição a outras substâncias farmacológicas de ação sobre o sistema nervoso autônomo, intenção não determinada - área para a prática de esportes e atletismo", + Y134: "Envenenamento [intoxicação] por e exposição a outras substâncias farmacológicas de ação sobre o sistema nervoso autônomo, intenção não determinada - rua e estrada", + Y135: "Envenenamento [intoxicação] por e exposição a outras substâncias farmacológicas de ação sobre o sistema nervoso autônomo, intenção não determinada - áreas de comércio e de serviços", + Y136: "Envenenamento [intoxicação] por e exposição a outras substâncias farmacológicas de ação sobre o sistema nervoso autônomo, intenção não determinada - áreas industriais e em construção", + Y137: "Envenenamento [intoxicação] por e exposição a outras substâncias farmacológicas de ação sobre o sistema nervoso autônomo, intenção não determinada - fazenda", + Y138: "Envenenamento [intoxicação] por e exposição a outras substâncias farmacológicas de ação sobre o sistema nervoso autônomo, intenção não determinada - outros locais especificados", + Y139: "Envenenamento [intoxicação] por e exposição a outras substâncias farmacológicas de ação sobre o sistema nervoso autônomo, intenção não determinada - local não especificado", + Y14: "Envenenamento [intoxicação] por e exposição a outras drogas, medicamentos e substâncias biológicas e as não especificadas, intenção não determinada", + Y140: "Envenenamento [intoxicação] por e exposição a outras drogas, medicamentos e substâncias biológicas e as não especificadas, intenção não determinada - residência", + Y141: "Envenenamento [intoxicação] por e exposição a outras drogas, medicamentos e substâncias biológicas e as não especificadas, intenção não determinada - habitação coletiva", + Y142: "Envenenamento [intoxicação] por e exposição a outras drogas, medicamentos e substâncias biológicas e as não especificadas, intenção não determinada - escolas, outras instituições e áreas de administração pública", + Y143: "Envenenamento [intoxicação] por e exposição a outras drogas, medicamentos e substâncias biológicas e as não especificadas, intenção não determinada - área para a prática de esportes e atletismo", + Y144: "Envenenamento [intoxicação] por e exposição a outras drogas, medicamentos e substâncias biológicas e as não especificadas, intenção não determinada - rua e estrada", + Y145: "Envenenamento [intoxicação] por e exposição a outras drogas, medicamentos e substâncias biológicas e as não especificadas, intenção não determinada - áreas de comércio e de serviços", + Y146: "Envenenamento [intoxicação] por e exposição a outras drogas, medicamentos e substâncias biológicas e as não especificadas, intenção não determinada - áreas industriais e em construção", + Y147: "Envenenamento [intoxicação] por e exposição a outras drogas, medicamentos e substâncias biológicas e as não especificadas, intenção não determinada - fazenda", + Y148: "Envenenamento [intoxicação] por e exposição a outras drogas, medicamentos e substâncias biológicas e as não especificadas, intenção não determinada - outros locais especificados", + Y149: "Envenenamento [intoxicação] por e exposição a outras drogas, medicamentos e substâncias biológicas e as não especificadas, intenção não determinada - local não especificado", + Y15: "Envenenamento [intoxicação] por e exposição ao álcool, intenção não determinada", + Y150: "Envenenamento [intoxicação] por e exposição ao álcool, intenção não determinada - residência", + Y151: "Envenenamento [intoxicação] por e exposição ao álcool, intenção não determinada - habitação coletiva", + Y152: "Envenenamento [intoxicação] por e exposição ao álcool, intenção não determinada - escolas, outras instituições e áreas de administração pública", + Y153: "Envenenamento [intoxicação] por e exposição ao álcool, intenção não determinada - área para a prática de esportes e atletismo", + Y154: "Envenenamento [intoxicação] por e exposição ao álcool, intenção não determinada - rua e estrada", + Y155: "Envenenamento [intoxicação] por e exposição ao álcool, intenção não determinada - áreas de comércio e de serviços", + Y156: "Envenenamento [intoxicação] por e exposição ao álcool, intenção não determinada - áreas industriais e em construção", + Y157: "Envenenamento [intoxicação] por e exposição ao álcool, intenção não determinada - fazenda", + Y158: "Envenenamento [intoxicação] por e exposição ao álcool, intenção não determinada - outros locais especificados", + Y159: "Envenenamento [intoxicação] por e exposição ao álcool, intenção não determinada - local não especificado", + Y16: "Envenenamento [intoxicação] por e exposição a solventes orgânicos e hidrocarbonetos halogenados e seus vapores, intenção não determinada", + Y160: "Envenenamento [intoxicação] por e exposição a solventes orgânicos e hidrocarbonetos halogenados e seus vapores, intenção não determinada - residência", + Y161: "Envenenamento [intoxicação] por e exposição a solventes orgânicos e hidrocarbonetos halogenados e seus vapores, intenção não determinada - habitação coletiva", + Y162: "Envenenamento [intoxicação] por e exposição a solventes orgânicos e hidrocarbonetos halogenados e seus vapores, intenção não determinada - escolas, outras instituições e áreas de administração pública", + Y163: "Envenenamento [intoxicação] por e exposição a solventes orgânicos e hidrocarbonetos halogenados e seus vapores, intenção não determinada - área para a prática de esportes e atletismo", + Y164: "Envenenamento [intoxicação] por e exposição a solventes orgânicos e hidrocarbonetos halogenados e seus vapores, intenção não determinada - rua e estrada", + Y165: "Envenenamento [intoxicação] por e exposição a solventes orgânicos e hidrocarbonetos halogenados e seus vapores, intenção não determinada - áreas de comércio e de serviços", + Y166: "Envenenamento [intoxicação] por e exposição a solventes orgânicos e hidrocarbonetos halogenados e seus vapores, intenção não determinada - áreas industriais e em construção", + Y167: "Envenenamento [intoxicação] por e exposição a solventes orgânicos e hidrocarbonetos halogenados e seus vapores, intenção não determinada - fazenda", + Y168: "Envenenamento [intoxicação] por e exposição a solventes orgânicos e hidrocarbonetos halogenados e seus vapores, intenção não determinada - outros locais especificados", + Y169: "Envenenamento [intoxicação] por e exposição a solventes orgânicos e hidrocarbonetos halogenados e seus vapores, intenção não determinada - local não especificado", + Y17: "Envenenamento [intoxicação] por e exposição a outros gases e vapores, intenção não determinada", + Y170: "Envenenamento [intoxicação] por e exposição a outros gases e vapores, intenção não determinada - residência", + Y171: "Envenenamento [intoxicação] por e exposição a outros gases e vapores, intenção não determinada - habitação coletiva", + Y172: "Envenenamento [intoxicação] por e exposição a outros gases e vapores, intenção não determinada - escolas, outras instituições e áreas de administração pública", + Y173: "Envenenamento [intoxicação] por e exposição a outros gases e vapores, intenção não determinada - área para a prática de esportes e atletismo", + Y174: "Envenenamento [intoxicação] por e exposição a outros gases e vapores, intenção não determinada - rua e estrada", + Y175: "Envenenamento [intoxicação] por e exposição a outros gases e vapores, intenção não determinada - áreas de comércio e de serviços", + Y176: "Envenenamento [intoxicação] por e exposição a outros gases e vapores, intenção não determinada - áreas industriais e em construção", + Y177: "Envenenamento [intoxicação] por e exposição a outros gases e vapores, intenção não determinada - fazenda", + Y178: "Envenenamento [intoxicação] por e exposição a outros gases e vapores, intenção não determinada - outros locais especificados", + Y179: "Envenenamento [intoxicação] por e exposição a outros gases e vapores, intenção não determinada - local não especificado", + Y18: "Envenenamento [intoxicação] por e exposição a pesticidas, intenção não determinada", + Y180: "Envenenamento [intoxicação] por e exposição a pesticidas, intenção não determinada - residência", + Y181: "Envenenamento [intoxicação] por e exposição a pesticidas, intenção não determinada - habitação coletiva", + Y182: "Envenenamento [intoxicação] por e exposição a pesticidas, intenção não determinada - escolas, outras instituições e áreas de administração pública", + Y183: "Envenenamento [intoxicação] por e exposição a pesticidas, intenção não determinada - área para a prática de esportes e atletismo", + Y184: "Envenenamento [intoxicação] por e exposição a pesticidas, intenção não determinada - rua e estrada", + Y185: "Envenenamento [intoxicação] por e exposição a pesticidas, intenção não determinada - áreas de comércio e de serviços", + Y186: "Envenenamento [intoxicação] por e exposição a pesticidas, intenção não determinada - áreas industriais e em construção", + Y187: "Envenenamento [intoxicação] por e exposição a pesticidas, intenção não determinada - fazenda", + Y188: "Envenenamento [intoxicação] por e exposição a pesticidas, intenção não determinada - outros locais especificados", + Y189: "Envenenamento [intoxicação] por e exposição a pesticidas, intenção não determinada - local não especificado", + Y19: "Envenenamento [intoxicação] por e exposição a outros produtos químicos e substâncias nocivas e aos não especificados, intenção não determinada", + Y190: "Envenenamento [intoxicação] por e exposição a outros produtos químicos e substâncias nocivas e aos não especificados, intenção não determinada - residência", + Y191: "Envenenamento [intoxicação] por e exposição a outros produtos químicos e substâncias nocivas e aos não especificados, intenção não determinada - habitação coletiva", + Y192: "Envenenamento [intoxicação] por e exposição a outros produtos químicos e substâncias nocivas e aos não especificados, intenção não determinada - escolas, outras instituições e áreas de administração pública", + Y193: "Envenenamento [intoxicação] por e exposição a outros produtos químicos e substâncias nocivas e aos não especificados, intenção não determinada - área para a prática de esportes e atletismo", + Y194: "Envenenamento [intoxicação] por e exposição a outros produtos químicos e substâncias nocivas e aos não especificados, intenção não determinada - rua e estrada", + Y195: "Envenenamento [intoxicação] por e exposição a outros produtos químicos e substâncias nocivas e aos não especificados, intenção não determinada - áreas de comércio e de serviços", + Y196: "Envenenamento [intoxicação] por e exposição a outros produtos químicos e substâncias nocivas e aos não especificados, intenção não determinada - áreas industriais e em construção", + Y197: "Envenenamento [intoxicação] por e exposição a outros produtos químicos e substâncias nocivas e aos não especificados, intenção não determinada - fazenda", + Y198: "Envenenamento [intoxicação] por e exposição a outros produtos químicos e substâncias nocivas e aos não especificados, intenção não determinada - outros locais especificados", + Y199: "Envenenamento [intoxicação] por e exposição a outros produtos químicos e substâncias nocivas e aos não especificados, intenção não determinada - local não especificado", + Y20: "Enforcamento, estrangulamento e sufocação, intenção não determinada", + Y200: "Enforcamento, estrangulamento e sufocação, intenção não determinada - residência", + Y201: "Enforcamento, estrangulamento e sufocação, intenção não determinada - habitação coletiva", + Y202: "Enforcamento, estrangulamento e sufocação, intenção não determinada - escolas, outras instituições e áreas de administração pública", + Y203: "Enforcamento, estrangulamento e sufocação, intenção não determinada - área para a prática de esportes e atletismo", + Y204: "Enforcamento, estrangulamento e sufocação, intenção não determinada - rua e estrada", + Y205: "Enforcamento, estrangulamento e sufocação, intenção não determinada - áreas de comércio e de serviços", + Y206: "Enforcamento, estrangulamento e sufocação, intenção não determinada - áreas industriais e em construção", + Y207: "Enforcamento, estrangulamento e sufocação, intenção não determinada - fazenda", + Y208: "Enforcamento, estrangulamento e sufocação, intenção não determinada - outros locais especificados", + Y209: "Enforcamento, estrangulamento e sufocação, intenção não determinada - local não especificado", + Y21: "Afogamento e submersão, intenção não determinada", + Y210: "Afogamento e submersão, intenção não determinada - residência", + Y211: "Afogamento e submersão, intenção não determinada - habitação coletiva", + Y212: "Afogamento e submersão, intenção não determinada - escolas, outras instituições e áreas de administração pública", + Y213: "Afogamento e submersão, intenção não determinada - área para a prática de esportes e atletismo", + Y214: "Afogamento e submersão, intenção não determinada - rua e estrada", + Y215: "Afogamento e submersão, intenção não determinada - áreas de comércio e de serviços", + Y216: "Afogamento e submersão, intenção não determinada - áreas industriais e em construção", + Y217: "Afogamento e submersão, intenção não determinada - fazenda", + Y218: "Afogamento e submersão, intenção não determinada - outros locais especificados", + Y219: "Afogamento e submersão, intenção não determinada - local não especificado", + Y22: "Disparo de pistola, intenção não determinada", + Y220: "Disparo de pistola, intenção não determinada - residência", + Y221: "Disparo de pistola, intenção não determinada - habitação coletiva", + Y222: "Disparo de pistola, intenção não determinada - escolas, outras instituições e áreas de administração pública", + Y223: "Disparo de pistola, intenção não determinada - área para a prática de esportes e atletismo", + Y224: "Disparo de pistola, intenção não determinada - rua e estrada", + Y225: "Disparo de pistola, intenção não determinada - áreas de comércio e de serviços", + Y226: "Disparo de pistola, intenção não determinada - áreas industriais e em construção", + Y227: "Disparo de pistola, intenção não determinada - fazenda", + Y228: "Disparo de pistola, intenção não determinada - outros locais especificados", + Y229: "Disparo de pistola, intenção não determinada - local não especificado", + Y23: "Disparo de fuzil, carabina e arma de fogo de maior calibre, intenção não determinada", + Y230: "Disparo de fuzil, carabina e arma de fogo de maior calibre, intenção não determinada - residência", + Y231: "Disparo de fuzil, carabina e arma de fogo de maior calibre, intenção não determinada - habitação coletiva", + Y232: "Disparo de fuzil, carabina e arma de fogo de maior calibre, intenção não determinada - escolas, outras instituições e áreas de administração pública", + Y233: "Disparo de fuzil, carabina e arma de fogo de maior calibre, intenção não determinada - área para a prática de esportes e atletismo", + Y234: "Disparo de fuzil, carabina e arma de fogo de maior calibre, intenção não determinada - rua e estrada", + Y235: "Disparo de fuzil, carabina e arma de fogo de maior calibre, intenção não determinada - áreas de comércio e de serviços", + Y236: "Disparo de fuzil, carabina e arma de fogo de maior calibre, intenção não determinada - áreas industriais e em construção", + Y237: "Disparo de fuzil, carabina e arma de fogo de maior calibre, intenção não determinada - fazenda", + Y238: "Disparo de fuzil, carabina e arma de fogo de maior calibre, intenção não determinada - outros locais especificados", + Y239: "Disparo de fuzil, carabina e arma de fogo de maior calibre, intenção não determinada - local não especificado", + Y24: "Disparo de outra arma de fogo e de arma de fogo não especificada, intenção não determinada", + Y240: "Disparo de outra arma de fogo e de arma de fogo não especificada, intenção não determinada - residência", + Y241: "Disparo de outra arma de fogo e de arma de fogo não especificada, intenção não determinada - habitação coletiva", + Y242: "Disparo de outra arma de fogo e de arma de fogo não especificada, intenção não determinada - escolas, outras instituições e áreas de administração pública", + Y243: "Disparo de outra arma de fogo e de arma de fogo não especificada, intenção não determinada - área para a prática de esportes e atletismo", + Y244: "Disparo de outra arma de fogo e de arma de fogo não especificada, intenção não determinada - rua e estrada", + Y245: "Disparo de outra arma de fogo e de arma de fogo não especificada, intenção não determinada - áreas de comércio e de serviços", + Y246: "Disparo de outra arma de fogo e de arma de fogo não especificada, intenção não determinada - áreas industriais e em construção", + Y247: "Disparo de outra arma de fogo e de arma de fogo não especificada, intenção não determinada - fazenda", + Y248: "Disparo de outra arma de fogo e de arma de fogo não especificada, intenção não determinada - outros locais especificados", + Y249: "Disparo de outra arma de fogo e de arma de fogo não especificada, intenção não determinada - local não especificado", + Y25: "Contato com material explosivo, intenção não determinada", + Y250: "Contato com material explosivo, intenção não determinada - residência", + Y251: "Contato com material explosivo, intenção não determinada - habitação coletiva", + Y252: "Contato com material explosivo, intenção não determinada - escolas, outras instituições e áreas de administração pública", + Y253: "Contato com material explosivo, intenção não determinada - área para a prática de esportes e atletismo", + Y254: "Contato com material explosivo, intenção não determinada - rua e estrada", + Y255: "Contato com material explosivo, intenção não determinada - áreas de comércio e de serviços", + Y256: "Contato com material explosivo, intenção não determinada - áreas industriais e em construção", + Y257: "Contato com material explosivo, intenção não determinada - fazenda", + Y258: "Contato com material explosivo, intenção não determinada - outros locais especificados", + Y259: "Contato com material explosivo, intenção não determinada - local não especificado", + Y26: "Exposição a fumaça, fogo e chamas, intenção não determinada", + Y260: "Exposição a fumaça, fogo e chamas, intenção não determinada - residência", + Y261: "Exposição a fumaça, fogo e chamas, intenção não determinada - habitação coletiva", + Y262: "Exposição a fumaça, fogo e chamas, intenção não determinada - escolas, outras instituições e áreas de administração pública", + Y263: "Exposição a fumaça, fogo e chamas, intenção não determinada - área para a prática de esportes e atletismo", + Y264: "Exposição a fumaça, fogo e chamas, intenção não determinada - rua e estrada", + Y265: "Exposição a fumaça, fogo e chamas, intenção não determinada - áreas de comércio e de serviços", + Y266: "Exposição a fumaça, fogo e chamas, intenção não determinada - áreas industriais e em construção", + Y267: "Exposição a fumaça, fogo e chamas, intenção não determinada - fazenda", + Y268: "Exposição a fumaça, fogo e chamas, intenção não determinada - outros locais especificados", + Y269: "Exposição a fumaça, fogo e chamas, intenção não determinada - local não especificado", + Y27: "Exposição a vapor de água, gases ou objetos quentes, intenção não determinada", + Y270: "Exposição a vapor de água, gases ou objetos quentes, intenção não determinada - residência", + Y271: "Exposição a vapor de água, gases ou objetos quentes, intenção não determinada - habitação coletiva", + Y272: "Exposição a vapor de água, gases ou objetos quentes, intenção não determinada - escolas, outras instituições e áreas de administração pública", + Y273: "Exposição a vapor de água, gases ou objetos quentes, intenção não determinada - área para a prática de esportes e atletismo", + Y274: "Exposição a vapor de água, gases ou objetos quentes, intenção não determinada - rua e estrada", + Y275: "Exposição a vapor de água, gases ou objetos quentes, intenção não determinada - áreas de comércio e de serviços", + Y276: "Exposição a vapor de água, gases ou objetos quentes, intenção não determinada - áreas industriais e em construção", + Y277: "Exposição a vapor de água, gases ou objetos quentes, intenção não determinada - fazenda", + Y278: "Exposição a vapor de água, gases ou objetos quentes, intenção não determinada - outros locais especificados", + Y279: "Exposição a vapor de água, gases ou objetos quentes, intenção não determinada - local não especificado", + Y28: "Contato com objeto cortante ou penetrante, intenção não determinada", + Y280: "Contato com objeto cortante ou penetrante, intenção não determinada - residência", + Y281: "Contato com objeto cortante ou penetrante, intenção não determinada - habitação coletiva", + Y282: "Contato com objeto cortante ou penetrante, intenção não determinada - escolas, outras instituições e áreas de administração pública", + Y283: "Contato com objeto cortante ou penetrante, intenção não determinada - área para a prática de esportes e atletismo", + Y284: "Contato com objeto cortante ou penetrante, intenção não determinada - rua e estrada", + Y285: "Contato com objeto cortante ou penetrante, intenção não determinada - áreas de comércio e de serviços", + Y286: "Contato com objeto cortante ou penetrante, intenção não determinada - áreas industriais e em construção", + Y287: "Contato com objeto cortante ou penetrante, intenção não determinada - fazenda", + Y288: "Contato com objeto cortante ou penetrante, intenção não determinada - outros locais especificados", + Y289: "Contato com objeto cortante ou penetrante, intenção não determinada - local não especificado", + Y29: "Contato com objeto contundente, intenção não determinada", + Y290: "Contato com objeto contundente, intenção não determinada - residência", + Y291: "Contato com objeto contundente, intenção não determinada - habitação coletiva", + Y292: "Contato com objeto contundente, intenção não determinada - escolas, outras instituições e áreas de administração pública", + Y293: "Contato com objeto contundente, intenção não determinada - área para a prática de esportes e atletismo", + Y294: "Contato com objeto contundente, intenção não determinada - rua e estrada", + Y295: "Contato com objeto contundente, intenção não determinada - áreas de comércio e de serviços", + Y296: "Contato com objeto contundente, intenção não determinada - áreas industriais e em construção", + Y297: "Contato com objeto contundente, intenção não determinada - fazenda", + Y298: "Contato com objeto contundente, intenção não determinada - outros locais especificados", + Y299: "Contato com objeto contundente, intenção não determinada - local não especificado", + Y30: "Queda, salto ou empurrado de um lugar elevado, intenção não determinada", + Y300: "Queda, salto ou empurrado de um lugar elevado, intenção não determinada - residência", + Y301: "Queda, salto ou empurrado de um lugar elevado, intenção não determinada - habitação coletiva", + Y302: "Queda, salto ou empurrado de um lugar elevado, intenção não determinada - escolas, outras instituições e áreas de administração pública", + Y303: "Queda, salto ou empurrado de um lugar elevado, intenção não determinada - área para a prática de esportes e atletismo", + Y304: "Queda, salto ou empurrado de um lugar elevado, intenção não determinada - rua e estrada", + Y305: "Queda, salto ou empurrado de um lugar elevado, intenção não determinada - áreas de comércio e de serviços", + Y306: "Queda, salto ou empurrado de um lugar elevado, intenção não determinada - áreas industriais e em construção", + Y307: "Queda, salto ou empurrado de um lugar elevado, intenção não determinada - fazenda", + Y308: "Queda, salto ou empurrado de um lugar elevado, intenção não determinada - outros locais especificados", + Y309: "Queda, salto ou empurrado de um lugar elevado, intenção não determinada - local não especificado", + Y31: "Queda, permanência ou corrida diante de um objeto em movimento, intenção não determinada", + Y310: "Queda, permanência ou corrida diante de um objeto em movimento, intenção não determinada - residência", + Y311: "Queda, permanência ou corrida diante de um objeto em movimento, intenção não determinada - habitação coletiva", + Y312: "Queda, permanência ou corrida diante de um objeto em movimento, intenção não determinada - escolas, outras instituições e áreas de administração pública", + Y313: "Queda, permanência ou corrida diante de um objeto em movimento, intenção não determinada - área para a prática de esportes e atletismo", + Y314: "Queda, permanência ou corrida diante de um objeto em movimento, intenção não determinada - rua e estrada", + Y315: "Queda, permanência ou corrida diante de um objeto em movimento, intenção não determinada - áreas de comércio e de serviços", + Y316: "Queda, permanência ou corrida diante de um objeto em movimento, intenção não determinada - áreas industriais e em construção", + Y317: "Queda, permanência ou corrida diante de um objeto em movimento, intenção não determinada - fazenda", + Y318: "Queda, permanência ou corrida diante de um objeto em movimento, intenção não determinada - outros locais especificados", + Y319: "Queda, permanência ou corrida diante de um objeto em movimento, intenção não determinada - local não especificado", + Y32: "Impacto de um veículo a motor, intenção não determinada", + Y320: "Impacto de um veículo a motor, intenção não determinada - residência", + Y321: "Impacto de um veículo a motor, intenção não determinada - habitação coletiva", + Y322: "Impacto de um veículo a motor, intenção não determinada - escolas, outras instituições e áreas de administração pública", + Y323: "Impacto de um veículo a motor, intenção não determinada - área para a prática de esportes e atletismo", + Y324: "Impacto de um veículo a motor, intenção não determinada - rua e estrada", + Y325: "Impacto de um veículo a motor, intenção não determinada - áreas de comércio e de serviços", + Y326: "Impacto de um veículo a motor, intenção não determinada - áreas industriais e em construção", + Y327: "Impacto de um veículo a motor, intenção não determinada - fazenda", + Y328: "Impacto de um veículo a motor, intenção não determinada - outros locais especificados", + Y329: "Impacto de um veículo a motor, intenção não determinada - local não especificado", + Y33: "Outros fatos ou eventos especificados, intenção não determinada", + Y330: "Outros fatos ou eventos especificados, intenção não determinada - residência", + Y331: "Outros fatos ou eventos especificados, intenção não determinada - habitação coletiva", + Y332: "Outros fatos ou eventos especificados, intenção não determinada - escolas, outras instituições e áreas de administração pública", + Y333: "Outros fatos ou eventos especificados, intenção não determinada - área para a prática de esportes e atletismo", + Y334: "Outros fatos ou eventos especificados, intenção não determinada - rua e estrada", + Y335: "Outros fatos ou eventos especificados, intenção não determinada - áreas de comércio e de serviços", + Y336: "Outros fatos ou eventos especificados, intenção não determinada - áreas industriais e em construção", + Y337: "Outros fatos ou eventos especificados, intenção não determinada - fazenda", + Y338: "Outros fatos ou eventos especificados, intenção não determinada - outros locais especificados", + Y339: "Outros fatos ou eventos especificados, intenção não determinada - local não especificado", + Y34: "Fatos ou eventos não especificados e intenção não determinada", + Y340: "Fatos ou eventos não especificados e intenção não determinada - residência", + Y341: "Fatos ou eventos não especificados e intenção não determinada - habitação coletiva", + Y342: "Fatos ou eventos não especificados e intenção não determinada - escolas, outras instituições e áreas de administração pública", + Y343: "Fatos ou eventos não especificados e intenção não determinada - área para a prática de esportes e atletismo", + Y344: "Fatos ou eventos não especificados e intenção não determinada - rua e estrada", + Y345: "Fatos ou eventos não especificados e intenção não determinada - áreas de comércio e de serviços", + Y346: "Fatos ou eventos não especificados e intenção não determinada - áreas industriais e em construção", + Y347: "Fatos ou eventos não especificados e intenção não determinada - fazenda", + Y348: "Fatos ou eventos não especificados e intenção não determinada - outros locais especificados", + Y349: "Fatos ou eventos não especificados e intenção não determinada - local não especificado", + Y35: "Intervenção legal", + Y350: "Intervenção legal envolvendo o uso de armas de fogo", + Y351: "Intervenção legal envolvendo o uso de explosivos", + Y352: "Intervenção legal envolvendo o uso de gás", + Y353: "Intervenção legal envolvendo o uso de objetos contundentes", + Y354: "Intervenção legal envolvendo o uso de objetos cortantes e penetrantes", + Y355: "Execução legal", + Y356: "Intervenção legal envolvendo o uso de outros meios especificados", + Y357: "Intervenção legal, meio não especificado", + Y36: "Operações de guerra", + Y360: "Operações de guerra envolvendo explosão de armamento naval", + Y361: "Operações de guerra envolvendo destruição de aeronave", + Y362: "Operações de guerra envolvendo outras explosões ou fragmentos", + Y363: "Operações de guerra envolvendo incêndio, fogo e substâncias quentes", + Y364: "Operações de guerra envolvendo disparo de armas de fogo e de outras formas convencionais de combate", + Y365: "Operações de guerra envolvendo armamento nuclear", + Y366: "Operações de guerra envolvendo armas biológicas", + Y367: "Operações de guerra envolvendo armas químicas e outros meios de combate não-convencionais", + Y368: "Operações de guerra ocorridas após a cessação das hostilidades", + Y369: "Operações de guerra não especificadas", + Y40: "Efeitos adversos de antibióticos sistêmicos", + Y400: "Efeitos adversos de penicilinas", + Y401: "Efeitos adversos de cefalosporinas e outras betalactaminas", + Y402: "Efeitos adversos do grupo do cloranfenicol", + Y403: "Efeitos adversos de macrolídeos", + Y404: "Efeitos adversos de tetraciclinas", + Y405: "Efeitos adversos de aminoglicosídeos", + Y406: "Efeitos adversos de rifamicinas", + Y407: "Efeitos adversos de antibióticos antifúngicos administrados por via sistêmica", + Y408: "Efeitos adversos de outros antibióticos administrados por via sistêmica", + Y409: "Efeitos adversos de antibiótico sistêmico, não especificado", + Y41: "Efeitos adversos de outros antiinfecciosos e antiparasitários sistêmicos", + Y410: "Efeitos adversos de sulfonamidas", + Y411: "Efeitos adversos de drogas antimicobacterianas", + Y412: "Efeitos adversos de antimaláricos e drogas que atuam sobre outros protozoários parasitas do sangue", + Y413: "Efeitos adversos de outras drogas antiprotozoárias", + Y414: "Efeitos adversos de anti-helmínticos", + Y415: "Efeitos adversos de drogas antivirais", + Y418: "Efeitos adversos de outros antiinfecciosos e antiparasitários especificados", + Y419: "Efeitos adversos de antiinfecciosos e antiparasitários sistêmicos não especificados", + Y42: "Efeitos adversos de hormônios e seus substitutos sintéticos e antagonistas, não classificados em outra parte", + Y420: "Efeitos adversos de glicocorticóides e análogos sintéticos", + Y421: "Efeitos adversos de hormônios e substitutos da tireóide", + Y422: "Efeitos adversos de drogas antitireoidianas", + Y423: "Efeitos adversos de insulina e hipoglicêmicos orais (antidiabéticos)", + Y424: "Efeitos adversos de anticoncepcionais [contraceptivos] orais", + Y425: "Efeitos adversos de outros estrógenos e progestágenos", + Y426: "Efeitos adversos de antigonadotrofinas, antiestrógenos e antiandrógenos, não classificados em outra parte", + Y427: "Efeitos adversos de andrógenos e anabolizantes congêneres", + Y428: "Efeitos adversos de outros hormônios e os não especificados e seus substitutos sintéticos", + Y429: "Efeitos adversos de outros antagonistas hormonais e os não especificados", + Y43: "Efeitos adversos de substâncias de ação primariamente sistêmica", + Y430: "Efeitos adversos de drogas antialérgicas e antieméticas", + Y431: "Efeitos adversos de antimetabólicos antineoplásicos", + Y432: "Efeitos adversos de produtos naturais antineoplásicos", + Y433: "Efeitos adversos de outras drogas antineoplásicas", + Y434: "Efeitos adversos de agentes imunossupressores", + Y435: "Efeitos adversos de acidificantes e alcalinizantes", + Y436: "Efeitos adversos de enzimas, não classificadas em outra parte", + Y438: "Efeitos adversos de outras substâncias farmacológicas de ação primariamente sistêmica, não classificadas em outra parte", + Y439: "Efeitos adversos de substância farmacológica de ação sistêmica, não especificada", + Y44: "Efeitos adversos de substâncias farmacológicas que atuam primariamente sobre os constituintes do sangue", + Y440: "Efeitos adversos de preparações a base de ferro e outros preparações prescritas na anemia hipocrômica", + Y441: "Efeitos adversos da vitamina B12, ácido fólico e outros preparações prescritas nas anemias megaloblásticas", + Y442: "Efeitos adversos de anticoagulantes", + Y443: "Efeitos adversos de antagonistas de anticoagulantes, vitamina K e outros coagulantes", + Y444: "Efeitos adversos de drogas antitrombóticas [inibidores da agregação de plaquetas]", + Y445: "Efeitos adversos de trombolíticos", + Y446: "Efeitos adversos do sangue natural e produtos do sangue", + Y447: "Efeitos adversos de substitutos do plasma", + Y449: "Efeitos adversos de outras substâncias farmacológicas que atuam sobre os constituintes do sangue e as não especificadas", + Y45: "Efeitos adversos de substâncias analgésicas, antipiréticas e antiinflamatórias", + Y450: "Efeitos adversos de opiáceos e analgésicos correlatos", + Y451: "Efeitos adversos de salicilatos", + Y452: "Efeitos adversos de derivados do ácido propiônico", + Y453: "Efeitos adversos de outras drogas antiinflamatórias não-esteróides", + Y454: "Efeitos adversos de anti-reumáticos", + Y455: "Efeitos adversos de derivados do 4-aminofenol", + Y458: "Efeitos adversos de outros analgésicos e antipiréticos", + Y459: "Efeitos adversos de substâncias analgésicas e antipiréticas não especificadas", + Y46: "Efeitos adversos de drogas anticonvulsivantes (antiepilépticas) e antiparkinsonianas", + Y460: "Efeitos adversos de succimidas", + Y461: "Efeitos adversos de oxazolidínas", + Y462: "Efeitos adversos de derivados da hidantoína", + Y463: "Efeitos adversos de desoxibarbitúricos", + Y464: "Efeitos adversos de iminostilbenos", + Y465: "Efeitos adversos do ácido valpróico", + Y466: "Efeitos adversos de outros anticonvulsivantes (antiepilépticos) e os não especificados", + Y467: "Efeitos adversos de drogas antiparkinsonianas", + Y468: "Efeitos adversos de substâncias miorrelaxantes (anti-espásticas)", + Y47: "Efeitos adversos de sedativos, hipnóticos e tranquilizantes [ansiolíticos]", + Y470: "Efeitos adversos de barbitúricos, não classificados em outra parte", + Y471: "Efeitos adversos de benzodiazepínicos", + Y472: "Efeitos adversos de derivados do cloral", + Y473: "Efeitos adversos de paraldeído", + Y474: "Efeitos adversos de compostos de bromo", + Y475: "Efeitos adversos de sedativos e hipnóticos em associações não classificados em outra parte", + Y478: "Efeitos adversos de outros sedativos, hipnóticos e tranquilizantes [ansiolíticos]", + Y479: "Efeitos adversos de sedativos, hipnóticos e tranquilizantes [ansiolíticos], não especificados", + Y48: "Efeitos adversos de anestésicos e gases terapêuticos", + Y480: "Efeitos adversos de anestésicos por inalação", + Y481: "Efeitos adversos de anestésicos por via parenteral", + Y482: "Efeitos adversos de outros anestésicos gerais e os não especificados", + Y483: "Efeitos adversos de anestésicos locais", + Y484: "Efeitos adversos de anestésico, não especificado", + Y485: "Efeitos adversos de gases terapêuticos", + Y49: "Efeitos adversos de substâncias psicotrópicas, não classificadas em outra parte", + Y490: "Efeitos adversos de antidepressivos triciclos e tetracíclicos", + Y491: "Efeitos adversos de antidepressivos inibidores da mono-amino-oxidase", + Y492: "Efeitos adversos de outros antidepressivos e os não especificados", + Y493: "Efeitos adversos de antipsicóticos e neurolépticos fenotiazínicos", + Y494: "Efeitos adversos de neurolépticos a base da butirofenona e do tioxanteno", + Y495: "Efeitos adversos de outros antipsicóticos e neurolépticos", + Y496: "Efeitos adversos de psicodislépticos [alucinógenos]", + Y497: "Efeitos adversos de psicoestimulantes que podem provocar dependência", + Y498: "Efeitos adversos de outras substâncias psicotrópicas, não classificados em outra parte", + Y499: "Efeitos adversos de substância psicotrópica, não especificada", + Y50: "Efeitos adversos de estimulantes do sistema nervoso central, não classificados em outra parte", + Y500: "Efeitos adversos de analépticos", + Y501: "Efeitos adversos de antagonistas de receptores dos opiáceos", + Y502: "Efeitos adversos de metilxantinas, não classificadas em outra parte", + Y508: "Efeitos adversos de outros estimulantes do sistema nervoso central", + Y509: "Efeitos adversos de estimulante do sistema nervoso central, não especificado", + Y51: "Efeitos adversos de drogas que atuam primariamente sobre o sistema nervoso autônomo", + Y510: "Efeitos adversos de agentes anticolinesterásicos", + Y511: "Efeitos adversos de outros parasimpaticomiméticos [colinérgicos]", + Y512: "Efeitos adversos de ganglioplégicos, não classificados em outra parte", + Y513: "Efeitos adversos de outros parassimpaticolíticos [anticolinérgicos e antimuscarínicos] e espasmolíticos, não classificados em outra parte", + Y514: "Efeitos adversos de agonistas predominantemente alfa-adrenorreceptores, não classificados em outra parte", + Y515: "Efeitos adversos de agonistas predominantemente beta-adrenorreceptores, não classificados em outra parte", + Y516: "Efeitos adversos de antagonistas alfa-adrenorreceptores, não classificados em outra parte", + Y517: "Efeitos adversos de antagonistas beta-adrenorreceptores, não classificados em outra parte", + Y518: "Efeitos adversos de bloqueadores nervosos de ação central e adrenérgicos, não classificados em outra parte", + Y519: "Efeitos adversos de outras drogas que atuam primariamente sobre o sistema nervoso autônomo e as não especificadas", + Y52: "Efeitos adversos de substâncias que atuam primariamente sobre o aparelho cardiovascular", + Y520: "Efeitos adversos de glicosídeos estimulantes do coração e substâncias de ação semelhante", + Y521: "Efeitos adversos de antagonistas do cálcio [inibidores do cálcio]", + Y522: "Efeitos adversos de outras drogas antidisrrítmicas, não classificadas em outra parte", + Y523: "Efeitos adversos de vasodilatadores coronarianos, não classificados em outra parte", + Y524: "Efeitos adversos de inibidores da enzima de conversão da angiotensina", + Y525: "Efeitos adversos de outras drogas anti-hipertensivas, não classificadas em outra parte", + Y526: "Efeitos adversos de drogas anti-hiperlipidêmicas e antiarterioscleróticas", + Y527: "Efeitos adversos de vasodilatadores periféricos", + Y528: "Efeitos adversos de drogas antivaricosas, incluindo os agentes esclerosantes", + Y529: "Efeitos adversos de outras drogas que atuam primariamente sobre o aparelho cardiovascular e as não especificadas", + Y53: "Efeitos adversos de substâncias que atuam primariamente sobre o aparelho gastrointestinal", + Y530: "Efeitos adversos de antagonistas dos receptores H2 da histamina", + Y531: "Efeitos adversos de outros medicamentos antiácidos e anti-secreção gástrica", + Y532: "Efeitos adversos de laxativos estimulantes", + Y533: "Efeitos adversos de laxativos salinos e osmóticos", + Y534: "Efeitos adversos de outros laxativos", + Y535: "Efeitos adversos de medicamentos que facilitam a digestão", + Y536: "Efeitos adversos de antidiarréicos", + Y537: "Efeitos adversos de eméticos", + Y538: "Efeitos adversos de outras substâncias que atuam primariamente sobre o aparelho gastrointestinal", + Y539: "Efeitos adversos de substâncias que atuam primariamente sobre o aparelho gastrointestinal, não especificadas", + Y54: "Efeitos adversos de substâncias que atuam primariamente sobre o metabolismo da água, dos sais minerais e do ácido úrico", + Y540: "Efeitos adversos de mineralocorticóides", + Y541: "Efeitos adversos de antagonistas dos mineralocorticóides [antagonistas da aldosterona]", + Y542: "Efeitos adversos de inibidores da anidrase carbônica", + Y543: "Efeitos adversos de derivados da benzotiadiazína", + Y544: "Efeitos adversos de diuréticos de alça", + Y545: "Efeitos adversos de outros diuréticos", + Y546: "Efeitos adversos de agentes que atuam sobre o equilíbrio eletrolítico, calórico e hídrico", + Y547: "Efeitos adversos de medicamentos que atuam sobre o metabolismo de cálcio", + Y548: "Efeitos adversos de drogas que atuam sobre o metabolismo de ácido úrico", + Y549: "Efeitos adversos de sais minerais não classificados em outra parte", + Y55: "Efeitos adversos de substâncias que atuam primariamente sobre os músculos lisos e esqueléticos e sobre o aparelho respiratório", + Y550: "Efeitos adversos de ocitócicos", + Y551: "Efeitos adversos de relaxantes da musculatura esquelética [bloqueadores neuromusculares] [curarizantes]", + Y552: "Efeitos adversos de outras substâncias que atuam primariamente sobre os músculos e as não especificadas", + Y553: "Efeitos adversos de antitússicos", + Y554: "Efeitos adversos de expectorantes", + Y555: "Efeitos adversos de drogas anti-resfriado comum", + Y556: "Efeitos adversos de antiasmáticos, não classificados em outra parte", + Y559: "Efeitos adversos de outras drogas que atuam sobre o aparelho respiratório e as não especificadas", + Y56: "Efeitos adversos de substâncias de uso tópico que atuam primariamente sobre a pele e as membranas mucosas e drogas de uso oftalmológico, otorrinolaringológico e dentário", + Y560: "Efeitos adversos de drogas antifúngicas, antiinfecciosas e antiinflamatórias de uso local, não classificadas em outra parte", + Y561: "Efeitos adversos de antipruriginosos", + Y562: "Efeitos adversos de adstringentes e detergentes locais", + Y563: "Efeitos adversos de emolientes, suavizantes e protetores da pele", + Y564: "Efeitos adversos de ceratolíticos, ceratoplásticos e outros medicamentos e preparações capilares", + Y565: "Efeitos adversos de medicamentos e preparações de uso oftalmológico", + Y566: "Efeitos adversos de medicamentos e preparações usados em otorrinolaringologia", + Y567: "Efeitos adversos de drogas de uso dentário aplicadas topicamente", + Y568: "Efeitos adversos de outras substâncias de uso tópico", + Y569: "Efeitos adversos de substância não especificada de uso tópico", + Y57: "Efeitos adversos de outras drogas e medicamentos e as não especificadas", + Y570: "Efeitos adversos de depressores do apetite [anoréxicos]", + Y571: "Efeitos adversos de lipotrópicos", + Y572: "Efeitos adversos de antídotos e agentes quelantes, não classificados em outra parte", + Y573: "Efeitos adversos de substâncias para restringir a ingestão de álcool", + Y574: "Efeitos adversos de excipientes farmacêuticos", + Y575: "Efeitos adversos de substâncias utilizadas como contraste em radiologia", + Y576: "Efeitos adversos de outras substâncias para fins diagnósticos", + Y577: "Efeitos adversos de vitaminas, não classificadas em outra parte", + Y578: "Efeitos adversos de outras drogas e medicamentos", + Y579: "Efeitos adversos de droga e medicamento não especificado", + Y58: "Efeitos adversos de vacinas bacterianas", + Y580: "Efeitos adversos da vacina BCG", + Y581: "Efeitos adversos de vacinas antitifoídica e antiparafoídica", + Y582: "Efeitos adversos da vacina anticolérica", + Y583: "Efeitos adversos da vacina antipeste", + Y584: "Efeitos adversos da vacina antitetânica", + Y585: "Efeitos adversos da vacina antidiftérica", + Y586: "Efeitos adversos da vacina antipertussis, incluindo as combinações em que um dos componentes é a antipertussis", + Y588: "Efeitos adversos de vacinas bacterianas mistas, exceto as combinações em que um dos componentes é a antipertussis", + Y589: "Efeitos adversos de outras vacinas bacterianas e as não especificadas", + Y59: "Efeitos adversos de outras vacinas e substâncias biológicas e as não especificadas", + Y590: "Efeitos adversos de vacinas antivirais", + Y591: "Efeitos adversos de vacinas anti-rickettsias", + Y592: "Efeitos adversos de vacinas antiprotozoários", + Y593: "Efeitos adversos da imunoglobulina", + Y598: "Efeitos adversos de outras vacinas e substâncias biológicas especificadas", + Y599: "Efeitos adversos de vacina ou substância biológica, não especificada", + Y60: "Corte, punção, perfuração ou hemorragia acidentais durante a prestação de cuidados médicos ou cirúrgicos", + Y600: "Corte, punção, perfuração ou hemorragia acidentais durante intervenção cirúrgica", + Y601: "Corte, punção, perfuração ou hemorragia acidentais durante infusão ou transfusão", + Y602: "Corte, punção, perfuração ou hemorragia acidentais durante hemodiálise ou outras perfusões", + Y603: "Corte, punção, perfuração ou hemorragia acidentais durante injeção ou vacinação (imunização)", + Y604: "Corte, punção, perfuração ou hemorragia acidentais durante exame endoscópico", + Y605: "Corte, punção, perfuração ou hemorragia acidentais durante cateterismo cardíaco", + Y606: "Corte, punção, perfuração ou hemorragia acidentais durante aspiração, punção ou outro tipo de cateterização", + Y607: "Corte, punção, perfuração ou hemorragia acidentais durante a administração de enema", + Y608: "Corte, punção, perfuração ou hemorragia acidentais durante a prestação de outros cuidados cirúrgicos e médicos", + Y609: "Corte, punção, perfuração ou hemorragia acidentais durante a prestação de cuidado cirúrgico e médico, não especificados", + Y61: "Objeto estranho deixado acidentalmente no corpo durante a prestação de cuidados cirúrgicos e médicos", + Y610: "Objeto estranho deixado acidentalmente no corpo durante intervenção cirúrgica", + Y611: "Objeto estranho deixado acidentalmente no corpo durante infusão ou transfusão", + Y612: "Objeto estranho deixado acidentalmente no corpo durante hemodiálise ou outras perfusões", + Y613: "Objeto estranho deixado acidentalmente no corpo durante injeção ou vacinação (imunização)", + Y614: "Objeto estranho deixado acidentalmente no corpo durante exame endoscópico", + Y615: "Objeto estranho deixado acidentalmente no corpo durante cateterismo cardíaco", + Y616: "Objeto estranho deixado acidentalmente no corpo durante aspiração, punção ou outro tipo de cateterização", + Y617: "Objeto estranho deixado acidentalmente no corpo durante a extração de um cateter ou de compressas", + Y618: "Objeto estranho deixado acidentalmente no corpo durante a prestação de outro cuidado cirúrgico e médico", + Y619: "Objeto estranho deixado acidentalmente no corpo durante a prestação de cuidado cirúrgico e médico não especificados", + Y62: "Assepsia insuficiente durante a prestação de cuidados cirúrgicos e médicos", + Y620: "Assepsia insuficiente durante intervenção cirúrgica", + Y621: "Assepsia insuficiente durante infusão ou transfusão", + Y622: "Assepsia insuficiente durante hemodiálise ou outras perfusões", + Y623: "Assepsia insuficiente durante injeção ou vacinação (imunização)", + Y624: "Assepsia insuficiente durante exame endoscópico", + Y625: "Assepsia insuficiente durante cateterismo cardíaco", + Y626: "Assepsia insuficiente durante aspiração, punção ou outro tipo de cateterização", + Y628: "Assepsia insuficiente durante a prestação de outro cuidado cirúrgico e médico", + Y629: "Assepsia insuficiente durante a prestação de cuidado cirúrgico e médico não especificados", + Y63: "Erros de dosagem durante a prestação de cuidados médicos e cirúrgicos", + Y630: "Administração de quantidade excessiva de sangue ou de um outro líquido durante transfusão ou infusão", + Y631: "Diluição incorreta de líquido usado durante a infusão", + Y632: "Superdosagem de radiação administrada durante a terapia", + Y633: "Exposição inadvertida de paciente a radiação durante a prestação de cuidado médico", + Y634: "Erro de dosagem na terapia por eletrochoque ou choque insulínico", + Y635: "Temperatura inadequada durante aplicação local ou curativo", + Y636: "Não administração de droga, medicamento ou substância biológica necessária", + Y638: "Erros de dosagem durante a prestação de outro cuidado médico e cirúrgico", + Y639: "Erros de dosagem durante a prestação de cuidados médico e cirúrgico, não especificados", + Y64: "Medicamentos ou substâncias biológicas contaminados", + Y640: "Transfusão ou infusão de medicamento ou substância biológica contaminados", + Y641: "Injeção ou vacinação com medicamento ou substância biológica contaminados", + Y648: "Administração por outros meios de medicamento ou substância biológicas contaminados", + Y649: "Medicamento e substância biológica contaminados, administrada por meios não especificados", + Y65: "Outros acidentes durante a prestação de cuidados médicos e cirúrgicos", + Y650: "Uso de sangue incompatível em transfusão", + Y651: "Uso de líquido errado em infusão", + Y652: "Falha de sutura ou de ligadura durante intervenção cirúrgica", + Y653: "Cânula endotraqueal mal posicionada durante procedimento anestésico", + Y654: "Falha na introdução ou na remoção de outras cânulas ou instrumentos", + Y655: "Realização de uma operação inapropriada", + Y658: "Outros acidentes especificados durante a prestação de cuidado médico e cirúrgico", + Y66: "Não administração de cuidado médico e cirúrgico", + Y69: "Acidente não especificado durante a prestação de cuidado médico e cirúrgico", + Y70: "Dispositivos (aparelhos) de anestesiologia, associados a incidentes adversos", + Y700: "Dispositivos (aparelhos) de anestesiologia, associados a incidentes adversos - dispositivos (aparelhos) para fins diagnósticos ou de monitorização", + Y701: "Dispositivos (aparelhos) de anestesiologia, associados a incidentes adversos - dispositivos (aparelhos) para fins terapêuticos (não-cirúrgicos) e aparelhagem de reabilitação", + Y702: "Dispositivos (aparelhos) de anestesiologia, associados a incidentes adversos - próteses e outros implantes, incluindo materiais e acessórios", + Y703: "Dispositivos (aparelhos) de anestesiologia, associados a incidentes adversos - instrumentos, materiais e aparelhos cirúrgicos (incluindo suturas)", + Y708: "Dispositivos (aparelhos) de anestesiologia, associados a incidentes adversos - dispositivos (aparelhos) diversos, inclusive combinações, não classificada em outra parte", + Y71: "Dispositivos (aparelhos) cardiovasculares, associados a incidentes adversos", + Y710: "Dispositivos (aparelhos) cardiovasculares, associados a incidentes adversos - dispositivos (aparelhos) para fins diagnósticos ou de monitorização", + Y711: "Dispositivos (aparelhos) cardiovasculares, associados a incidentes adversos - dispositivos (aparelhos) para fins terapêuticos (não-cirúrgicos) e aparelhagem de reabilitação", + Y712: "Dispositivos (aparelhos) cardiovasculares, associados a incidentes adversos - próteses e outros implantes, incluindo materiais e acessórios", + Y713: "Dispositivos (aparelhos) cardiovasculares, associados a incidentes adversos - instrumentos, materiais e aparelhos cirúrgicos (incluindo suturas)", + Y718: "Dispositivos (aparelhos) cardiovasculares, associados a incidentes adversos - dispositivos (aparelhos) diversos, inclusive combinações, não classificada em outra parte", + Y72: "Dispositivos (aparelhos) utilizados em otorrinolaringologia, associados a incidentes adversos", + Y720: "Dispositivos (aparelhos) utilizados em otorrinolaringologia, associados a incidentes adversos - dispositivos (aparelhos) para fins diagnósticos ou de monitorização", + Y721: "Dispositivos (aparelhos) utilizados em otorrinolaringologia, associados a incidentes adversos - dispositivos (aparelhos) para fins terapêuticos (não-cirúrgicos) e aparelhagem de reabilitação", + Y722: "Dispositivos (aparelhos) utilizados em otorrinolaringologia, associados a incidentes adversos - próteses e outros implantes, incluindo materiais e acessórios", + Y723: "Dispositivos (aparelhos) utilizados em otorrinolaringologia, associados a incidentes adversos - instrumentos, materiais e aparelhos cirúrgicos (incluindo suturas)", + Y728: "Dispositivos (aparelhos) utilizados em otorrinolaringologia, associados a incidentes adversos - dispositivos (aparelhos) diversos, inclusive combinações, não classificada em outra parte", + Y73: "Dispositivos (aparelhos) usados em gastroenterologia e em urologia, associados a incidentes adversos", + Y730: "Dispositivos (aparelhos) usados em gastroenterologia e em urologia, associados a incidentes adversos - dispositivos (aparelhos) para fins diagnósticos ou de monitorização", + Y731: "Dispositivos (aparelhos) usados em gastroenterologia e em urologia, associados a incidentes adversos - dispositivos (aparelhos) para fins terapêuticos (não-cirúrgicos) e aparelhagem de reabilitação", + Y732: "Dispositivos (aparelhos) usados em gastroenterologia e em urologia, associados a incidentes adversos - próteses e outros implantes, incluindo materiais e acessórios", + Y733: "Dispositivos (aparelhos) usados em gastroenterologia e em urologia, associados a incidentes adversos - instrumentos, materiais e aparelhos cirúrgicos (incluindo suturas)", + Y738: "Dispositivos (aparelhos) usados em gastroenterologia e em urologia, associados a incidentes adversos - dispositivos (aparelhos) diversos, inclusive combinações, não classificada em outra parte", + Y74: "Dispositivos (aparelhos) gerais de uso hospitalar ou pessoal, associados a incidentes adversos", + Y740: "Dispositivos (aparelhos) gerais de uso hospitalar ou pessoal, associados a incidentes adversos - dispositivos (aparelhos) para fins diagnósticos ou de monitorização", + Y741: "Dispositivos (aparelhos) gerais de uso hospitalar ou pessoal, associados a incidentes adversos - dispositivos (aparelhos) para fins terapêuticos (não-cirúrgicos) e aparelhagem de reabilitação", + Y742: "Dispositivos (aparelhos) gerais de uso hospitalar ou pessoal, associados a incidentes adversos - próteses e outros implantes, incluindo materiais e acessórios", + Y743: "Dispositivos (aparelhos) gerais de uso hospitalar ou pessoal, associados a incidentes adversos - instrumentos, materiais e aparelhos cirúrgicos (incluindo suturas)", + Y748: "Dispositivos (aparelhos) gerais de uso hospitalar ou pessoal, associados a incidentes adversos - dispositivos (aparelhos) diversos, inclusive combinações, não classificada em outra parte", + Y75: "Dispositivos (aparelhos) utilizados em neurologia, associados a incidentes adversos", + Y750: "Dispositivos (aparelhos) utilizados em neurologia, associados a incidentes adversos - dispositivos (aparelhos) para fins diagnósticos ou de monitorização", + Y751: "Dispositivos (aparelhos) utilizados em neurologia, associados a incidentes adversos - dispositivos (aparelhos) para fins terapêuticos (não-cirúrgicos) e aparelhagem de reabilitação", + Y752: "Dispositivos (aparelhos) utilizados em neurologia, associados a incidentes adversos - próteses e outros implantes, incluindo materiais e acessórios", + Y753: "Dispositivos (aparelhos) utilizados em neurologia, associados a incidentes adversos - instrumentos, materiais e aparelhos cirúrgicos (incluindo suturas)", + Y758: "Dispositivos (aparelhos) utilizados em neurologia, associados a incidentes adversos - dispositivos (aparelhos) diversos, inclusive combinações, não classificada em outra parte", + Y76: "Dispositivos (aparelhos) utilizados em obstetrícia e em ginecologia, associados a incidentes adversos", + Y760: "Dispositivos (aparelhos) utilizados em obstetrícia e em ginecologia, associados a incidentes adversos - dispositivos (aparelhos) para fins diagnósticos ou de monitorização", + Y761: "Dispositivos (aparelhos) utilizados em obstetrícia e em ginecologia, associados a incidentes adversos - dispositivos (aparelhos) para fins terapêuticos (não-cirúrgicos) e aparelhagem de reabilitação", + Y762: "Dispositivos (aparelhos) utilizados em obstetrícia e em ginecologia, associados a incidentes adversos - próteses e outros implantes, incluindo materiais e acessórios", + Y763: "Dispositivos (aparelhos) utilizados em obstetrícia e em ginecologia, associados a incidentes adversos - instrumentos, materiais e aparelhos cirúrgicos (incluindo suturas)", + Y768: "Dispositivos (aparelhos) utilizados em obstetrícia e em ginecologia, associados a incidentes adversos - dispositivos (aparelhos) diversos, inclusive combinações, não classificada em outra parte", + Y77: "Dispositivos (aparelhos) utilizados em oftalmologia, associados a incidentes adversos", + Y770: "Dispositivos (aparelhos) utilizados em oftalmologia, associados a incidentes adversos - dispositivos (aparelhos) para fins diagnósticos ou de monitorização", + Y771: "Dispositivos (aparelhos) utilizados em oftalmologia, associados a incidentes adversos - dispositivos (aparelhos) para fins terapêuticos (não-cirúrgicos) e aparelhagem de reabilitação", + Y772: "Dispositivos (aparelhos) utilizados em oftalmologia, associados a incidentes adversos - próteses e outros implantes, incluindo materiais e acessórios", + Y773: "Dispositivos (aparelhos) utilizados em oftalmologia, associados a incidentes adversos - instrumentos, materiais e aparelhos cirúrgicos (incluindo suturas)", + Y778: "Dispositivos (aparelhos) utilizados em oftalmologia, associados a incidentes adversos - dispositivos (aparelhos) diversos, inclusive combinações, não classificada em outra parte", + Y78: "Dispositivos (aparelhos) utilizados em radiologia, associados a incidentes adversos", + Y780: "Dispositivos (aparelhos) utilizados em radiologia, associados a incidentes adversos - dispositivos (aparelhos) para fins diagnósticos ou de monitorização", + Y781: "Dispositivos (aparelhos) utilizados em radiologia, associados a incidentes adversos - dispositivos (aparelhos) para fins terapêuticos (não-cirúrgicos) e aparelhagem de reabilitação", + Y782: "Dispositivos (aparelhos) utilizados em radiologia, associados a incidentes adversos - próteses e outros implantes, incluindo materiais e acessórios", + Y783: "Dispositivos (aparelhos) utilizados em radiologia, associados a incidentes adversos - instrumentos, materiais e aparelhos cirúrgicos (incluindo suturas)", + Y788: "Dispositivos (aparelhos) utilizados em radiologia, associados a incidentes adversos - dispositivos (aparelhos) diversos, inclusive combinações, não classificada em outra parte", + Y79: "Dispositivos (aparelhos) ortopédicos, associado a incidentes adversos", + Y790: "Dispositivos (aparelhos) ortopédicos, associado a incidentes adversos - dispositivos (aparelhos) para fins diagnósticos ou de monitorização", + Y791: "Dispositivos (aparelhos) ortopédicos, associado a incidentes adversos - dispositivos (aparelhos) para fins terapêuticos (não-cirúrgicos) e aparelhagem de reabilitação", + Y792: "Dispositivos (aparelhos) ortopédicos, associado a incidentes adversos - próteses e outros implantes, incluindo materiais e acessórios", + Y793: "Dispositivos (aparelhos) ortopédicos, associado a incidentes adversos - instrumentos, materiais e aparelhos cirúrgicos (incluindo suturas)", + Y798: "Dispositivos (aparelhos) ortopédicos, associado a incidentes adversos - dispositivos (aparelhos) diversos, inclusive combinações, não classificada em outra parte", + Y80: "Dispositivos (aparelhos) utilizados em medicina física (fisiatria), associado a incidentes adversos", + Y800: "Dispositivos (aparelhos) utilizados em medicina física (fisiatria), associado a incidentes adversos - dispositivos (aparelhos) para fins diagnósticos ou de monitorização", + Y801: "Dispositivos (aparelhos) utilizados em medicina física (fisiatria), associado a incidentes adversos - dispositivos (aparelhos) para fins terapêuticos (não-cirúrgicos) e aparelhagem de reabilitação", + Y802: "Dispositivos (aparelhos) utilizados em medicina física (fisiatria), associado a incidentes adversos - próteses e outros implantes, incluindo materiais e acessórios", + Y803: "Dispositivos (aparelhos) utilizados em medicina física (fisiatria), associado a incidentes adversos - instrumentos, materiais e aparelhos cirúrgicos (incluindo suturas)", + Y808: "Dispositivos (aparelhos) utilizados em medicina física (fisiatria), associado a incidentes adversos - dispositivos (aparelhos) diversos, inclusive combinações, não classificada em outra parte", + Y81: "Dispositivos (aparelhos) utilizados em cirurgia geral ou cirurgia plástica, associados a incidente adversos", + Y810: "Dispositivos (aparelhos) utilizados em cirurgia geral ou cirurgia plástica, associados a incidente adversos - dispositivos (aparelhos) para fins diagnósticos ou de monitorização", + Y811: "Dispositivos (aparelhos) utilizados em cirurgia geral ou cirurgia plástica, associados a incidente adversos - dispositivos (aparelhos) para fins terapêuticos (não-cirúrgicos) e aparelhagem de reabilitação", + Y812: "Dispositivos (aparelhos) utilizados em cirurgia geral ou cirurgia plástica, associados a incidente adversos - próteses e outros implantes, incluindo materiais e acessórios", + Y813: "Dispositivos (aparelhos) utilizados em cirurgia geral ou cirurgia plástica, associados a incidente adversos - instrumentos, materiais e aparelhos cirúrgicos (incluindo suturas)", + Y818: "Dispositivos (aparelhos) utilizados em cirurgia geral ou cirurgia plástica, associados a incidente adversos - dispositivos (aparelhos) diversos, inclusive combinações, não classificada em outra parte", + Y82: "Outros dispositivos (aparelhos) associados a incidentes adversos e os não especificados", + Y820: "Outros dispositivos (aparelhos) associados a incidentes adversos e os não especificados - dispositivos (aparelhos) para fins diagnósticos ou de monitorização", + Y821: "Outros dispositivos (aparelhos) associados a incidentes adversos e os não especificados - dispositivos (aparelhos) para fins terapêuticos (não-cirúrgicos) e aparelhagem de reabilitação", + Y822: "Outros dispositivos (aparelhos) associados a incidentes adversos e os não especificados - próteses e outros implantes, incluindo materiais e acessórios", + Y823: "Outros dispositivos (aparelhos) associados a incidentes adversos e os não especificados - instrumentos, materiais e aparelhos cirúrgicos (incluindo suturas)", + Y828: "Outros dispositivos (aparelhos) associados a incidentes adversos e os não especificados - dispositivos (aparelhos) diversos, inclusive combinações, não classificada em outra parte", + Y83: "Reação anormal em paciente ou complicação tardia, causadas por intervenção cirúrgica e por outros atos cirúrgicos, sem menção de acidente durante a intervenção", + Y830: "Reação anormal em paciente ou complicação tardia, causadas por intervenção cirúrgica com transplante de todo o órgão, sem menção de acidente durante a intervenção", + Y831: "Reação anormal em paciente ou complicação tardia, causadas por intervenção cirúrgica com implante de uma prótese interna, sem menção de acidente durante a intervenção", + Y832: 'Reação anormal em paciente ou complicação tardia, causadas por intervenção cirúrgica com anastomose, derivação ("bypass") ou enxerto, sem menção de acidente durante a intervenção', + Y833: "Reação anormal em paciente ou complicação tardia, causadas por intervenção cirúrgica com formação de estoma externo, sem menção de acidente durante a intervenção", + Y834: "Reação anormal em paciente ou complicação tardia, causadas por outras cirurgias reparadoras, sem menção de acidente durante a intervenção", + Y835: "Reação anormal em paciente ou complicação tardia, causadas por amputação de membro(s), sem menção de acidente durante a intervenção", + Y836: "Reação anormal em paciente ou complicação tardia, causadas por remoção de um outro órgão (parcial) (total), sem menção de acidente durante a intervenção", + Y838: "Reação anormal em paciente ou complicação tardia, causadas por outras intervenções ou procedimentos cirúrgicos, sem menção de acidente durante a intervenção", + Y839: "Reação anormal em paciente ou complicação tardia, causadas por intervenção cirúrgica, não especificada, sem menção de acidente durante a intervenção", + Y84: "Reação anormal em paciente ou complicação tardia, causadas por outros procedimentos médicos, sem menção de acidente durante o procedimento", + Y840: "Reação anormal em paciente ou complicação tardia, causadas por cateterismo cardíaco, sem menção de acidente durante o procedimento", + Y841: "Reação anormal em paciente ou complicação tardia, causadas por hemodiálise, sem menção de acidente durante o procedimento", + Y842: "Reação anormal em paciente ou complicação tardia, causadas por procedimento radiológico e radioterapia, sem menção de acidente durante o procedimento", + Y843: "Reação anormal em paciente ou complicação tardia, causadas por terapia por choque, sem menção de acidente durante o procedimento", + Y844: "Reação anormal em paciente ou complicação tardia, causadas por aspiração de líquido, sem menção de acidente durante o procedimento", + Y845: "Reação anormal em paciente ou complicação tardia, causadas por colocação de sonda gástrica ou duodenal, sem menção de acidente durante o procedimento", + Y846: "Reação anormal em paciente ou complicação tardia, causadas por cateterismo urinário, sem menção de acidente durante o procedimento", + Y847: "Reação anormal em paciente ou complicação tardia, causadas por amostra de sangue, sem menção de acidente durante o procedimento", + Y848: "Reação anormal em paciente ou complicação tardia, causadas por outros procedimentos médicos, sem menção de acidente durante o procedimento", + Y849: "Reação anormal em paciente ou complicação tardia, causadas por procedimento médico, não especificado, sem menção de acidente durante o procedimento", + Y85: "Seqüelas de acidentes de transporte", + Y850: "Seqüelas de um acidente de veículo a motor", + Y859: "Seqüelas de outros acidentes de transporte e dos não especificados", + Y86: "Seqüelas de outros acidentes", + Y87: "Seqüelas de uma lesão autoprovocada intencionalmente, de agressão ou de um fato cuja intenção é indeterminada", + Y870: "Seqüelas de lesões autoprovocadas intencionalmente", + Y871: "Seqüelas de uma agressão", + Y872: "Seqüelas de um fato cuja intenção é indeterminada", + Y88: "Seqüelas de cuidado médico ou cirúrgico considerados como uma causa externa", + Y880: "Seqüelas de efeitos adversos causados por drogas, medicamentos ou substâncias biológicas usados com finalidade terapêutica", + Y881: "Seqüelas de acidentes durante a prestação de cuidado médico e cirúrgico", + Y882: "Seqüelas de incidentes adversos associados com o uso de dispositivos (aparelhos) médicos durante atos diagnósticos ou terapêuticos", + Y883: "Seqüelas de reação anormal em paciente ou complicação tardia causada por procedimento médico e cirúrgico sem menção de acidente durante o procedimento", + Y89: "Seqüelas de outras causas externas", + Y890: "Seqüelas de intervenção legal", + Y891: "Seqüelas de operações de guerra", + Y899: "Seqüelas de causa externa não especificada", + Y90: "Evidência de alcoolismo determinada por taxas de alcoolemia", + Y900: "Alcoolemia inferior a 20 mg/100 ml", + Y901: "Alcoolemia de 20-39 mg/100ml", + Y902: "Alcoolemia de 40-59 mg/100ml", + Y903: "Alcoolemia de 60-79 mg/100ml", + Y904: "Alcoolemia de 80-99 mg/100ml", + Y905: "Alcoolemia de 100-119 mg/100ml", + Y906: "Alcoolemia de 120-199 mg/100ml", + Y907: "Alcoolemia de 200-239 mg/100ml", + Y908: "Alcoolemia igual ou superior a 240 mg/100ml", + Y909: "Presença de álcool no sangue, taxa não especificada", + Y91: "Evidência de alcoolismo determinada pelo nível da intoxicação", + Y910: "Intoxicação alcoólica leve", + Y911: "Intoxicação alcoólica moderada", + Y912: "Intoxicação alcoólica grave", + Y913: "Intoxicação alcoólica muito grave", + Y919: "Envolvimento com álcool não especificado de outra forma", + Y95: "Circunstância relativa as condições nosocomiais (hospitalares)", + Y96: "Circunstância relativa às condições de trabalho", + Y97: "Circunstâncias relativas a condições de poluição ambiental", + Y98: "Circunstâncias relativas a condições do modo de vida", + Z00: "Exame geral e investigação de pessoas sem queixas ou diagnóstico relatado", + Z000: "Exame médico geral", + Z001: "Exame de rotina de saúde da criança", + Z002: "Exame no período de crescimento rápido na infância", + Z003: "Exame do adolescente durante o crescimento na puberdade", + Z004: "Exame psiquiátrico geral não classificado em outra parte", + Z005: "Exame de doador potencial de órgão e tecido", + Z006: "Exame para comparação ou de controle de normalidade num programa de investigação clínica", + Z008: "Outros exames gerais", + Z01: "Outros exames e investigações especiais de pessoas sem queixa ou diagnóstico relatado", + Z010: "Exame dos olhos e da visão", + Z011: "Exame dos ouvidos e da audição", + Z012: "Exame dentário", + Z013: "Exame da pressão arterial", + Z014: "Exame ginecológico (geral) (de rotina)", + Z015: "Testes cutâneos de diagnóstico e sensibilização", + Z016: "Exame radiológico não classificado em outra parte", + Z017: "Exame de laboratório", + Z018: "Outros exames especiais especificados", + Z019: "Exame especial não especificado", + Z02: "Exame médico e consulta com finalidades administrativas", + Z020: "Exame para admissão a instituição educacional", + Z021: "Exame pré-emprego (pré-admissional)", + Z022: "Exame para admissão em instituição residencial", + Z023: "Exame para a incorporação nas forças armadas", + Z024: "Exame para licença para a condução de veículos (carteira de motorista)", + Z025: "Exame para participação em esporte", + Z026: "Exame para fins de seguro", + Z027: "Obtenção de atestado médico", + Z028: "Outros exames para propósitos administrativos", + Z029: "Exame não especificado com finalidades administrativas", + Z03: "Observação e avaliação médica por doenças e afecções suspeitas", + Z030: "Observação por suspeita de tuberculose", + Z031: "Observação por suspeita de neoplasia maligna", + Z032: "Observação por suspeita de transtornos mentais e do comportamento", + Z033: "Observação por suspeita de transtorno do sistema nervoso", + Z034: "Observação por suspeita de infarto do miocárdio", + Z035: "Observação por suspeita de outras doenças cardiovasculares", + Z036: "Observação por suspeita de efeito tóxico de substância ingerida", + Z038: "Observação por suspeita de outras doenças e afecções", + Z039: "Observação por suspeita de doença ou afecção não especificada", + Z04: "Exame e observação por outras razões", + Z040: "Teste para álcool e para drogas no sangue", + Z041: "Exame e observação após acidente de transporte", + Z042: "Exame e observação após acidente de trabalho", + Z043: "Exame e observação após outro acidente", + Z044: "Exame e observação após alegação de estupro e sedução", + Z045: "Exame e observação após outros ferimentos infligidos", + Z046: "Exame psiquiátrico geral, requerido por autoridade", + Z048: "Exame e observação por outras razões especificadas", + Z049: "Exame e observação por razão não especificada", + Z08: "Exame de seguimento após tratamento por neoplasia maligna", + Z080: "Exame de seguimento após tratamento cirúrgico de neoplasia maligna", + Z081: "Exame de seguimento após radioterapia por neoplasia maligna", + Z082: "Exame de seguimento após quimioterapia por neoplasia maligna", + Z087: "Exame de seguimento após tratamento misto por neoplasia maligna", + Z088: "Exame de seguimento após outro tratamento por neoplasia maligna", + Z089: "Exame de seguimento após tratamento não especificado por neoplasia maligna", + Z09: "Exame de seguimento após tratamento de outras afecções que não neoplasias malignas", + Z090: "Exame de seguimento após cirurgia por outras afecções", + Z091: "Exame de seguimento após radioterapia por outras afecções", + Z092: "Exame de seguimento após quimioterapia por outras afecções", + Z093: "Exame de seguimento após psicoterapia", + Z094: "Exame de seguimento após tratamento de fratura", + Z097: "Exame de seguimento após tratamento combinado por outras afecções", + Z098: "Exame de seguimento após outro tratamento por outras afecções", + Z099: "Exame de seguimento após tratamento não especificado por outras afecções", + Z10: 'Exame geral de rotina ("check up") de uma subpopulação definida', + Z100: "Exame de saúde ocupacional", + Z101: "Exame geral de rotina de residentes de instituições", + Z102: "Exame geral de rotina de pessoas das forças armadas", + Z103: "Exame geral de rotina de equipe esportiva", + Z108: "Exame geral de rotina de outra subpopulação definida", + Z11: 'Exame especial de rastreamento ("screening") de doenças infecciosas e parasitárias', + Z110: "Exame especial de rastreamento de doenças infecciosas intestinais", + Z111: "Exame especial de rastreamento de tuberculose pulmonar", + Z112: "Exame especial de rastreamento de outras doenças bacterianas", + Z113: "Exame especial de rastreamento de infecções de transmissão predominantemente sexual", + Z114: "Exame especial de rastreamento de vírus da imunodeficiência humana [HIV]", + Z115: "Exame especial de rastreamento de outras doenças virais", + Z116: "Exame especial de rastreamento de outras doenças por protozoários e por helmintos", + Z118: "Exame especial de rastreamento de outras doenças infecciosas e parasitárias", + Z119: "Exame especial de rastreamento para doença infecciosa e parasitária não especificada", + Z12: 'Exame especial de rastreamento ("screening") de neoplasias', + Z120: "Exame especial de rastreamento de neoplasia do estômago", + Z121: "Exame especial de rastreamento de neoplasia do trato intestinal", + Z122: "Exame especial de rastreamento de neoplasia de órgãos respiratórios", + Z123: "Exame especial de rastreamento de neoplasia de mama", + Z124: "Exame especial de rastreamento de neoplasia do colo do útero", + Z125: "Exame especial de rastreamento de neoplasia da próstata", + Z126: "Exame especial de rastreamento de neoplasia da bexiga", + Z128: "Exame especial de rastreamento de neoplasias de outras localizações", + Z129: "Exame especial de rastreamento de neoplasia não especificada", + Z13: 'Exame especial de rastreamento ("screening") de outros transtornos e doenças', + Z130: "Exame especial de rastreamento de doenças do sangue e dos órgãos hematopoéticos de alguns transtornos imunitários", + Z131: "Exame especial de rastreamento de diabetes mellitus", + Z132: "Exame especial de rastreamento de transtornos nutricionais", + Z133: "Exame especial de rastreamento de transtornos mentais e do comportamento", + Z134: "Exame especial de rastreamento de alguns transtornos do desenvolvimento na infância", + Z135: "Exame especial de rastreamento de doenças dos ouvidos e dos olhos", + Z136: "Exame especial de rastreamento de doenças cardiovasculares", + Z137: "Exame especial de rastreamento de malformações congênitas, deformidades e anomalias cromossômicas", + Z138: "Exame especial de rastreamento de outras doenças e transtornos especificados", + Z139: "Exame especial de rastreamento não especificado", + Z20: "Contato com e exposição a doenças transmissíveis", + Z200: "Contato com e exposição a doenças infecciosas intestinais", + Z201: "Contato com e exposição à tuberculose", + Z202: "Contato com e exposição a infecções de transmissão predominantemente sexual", + Z203: "Contato com e exposição à raiva", + Z204: "Contato com e exposição à rubéola", + Z205: "Contato com e exposição à hepatite viral", + Z206: "Contato com e exposição ao vírus da imunodeficiência humana [HIV]", + Z207: "Contato com e exposição à pediculose, acaríase e outras infestações", + Z208: "Contato com e exposição a outras doenças transmissíveis", + Z209: "Contato com e exposição a doença transmissível não especificada", + Z21: "Estado de infecção assintomática pelo vírus da imunodeficiência humana [HIV]", + Z22: "Portador de doença infecciosa", + Z220: "Portador de febre tifóide", + Z221: "Portador de outras doenças infecciosas intestinais", + Z222: "Portador de difteria", + Z223: "Portador de outras doenças bacterianas especificadas", + Z224: "Portador de infecções com modo de transmissão predominantemente sexual", + Z225: "Portador de hepatite viral", + Z226: "Portador de infecção pelo vírus T-linfotrópico tipo 1 [HTLV-1]", + Z228: "Portador de outras doenças infecciosas", + Z229: "Portador de doença infecciosa não especificada", + Z23: "Necessidade de imunização contra uma única doença bacteriana", + Z230: "Necessidade de imunização somente contra cólera", + Z231: "Necessidade de imunização somente contra febre tifóide e paratifóide [TAB]", + Z232: "Necessidade de imunização contra tuberculose [BCG]", + Z233: "Necessidade de imunização contra a peste", + Z234: "Necessidade de imunização contra a tularemia", + Z235: "Necessidade de imunização somente contra o tétano", + Z236: "Necessidade de imunização somente contra a difteria", + Z237: "Necessidade de imunização somente contra a coqueluche", + Z238: "Vacinação contra outras doenças bacterianas únicas", + Z24: "Necessidade de imunização contra algumas doenças virais únicas", + Z240: "Necessidade de imunização contra a poliomielite", + Z241: "Necessidade de imunização contra a encefalite viral transmitida por artrópodes", + Z242: "Necessidade de imunização contra a raiva", + Z243: "Necessidade de imunização contra a febre amarela", + Z244: "Necessidade de imunização somente contra o sarampo", + Z245: "Necessidade de imunização somente contra a rubéola", + Z246: "Necessidade de imunização somente contra a hepatite viral", + Z25: "Necessidade de imunização contra outras doenças virais únicas", + Z250: "Necessidade de imunização somente contra a caxumba [parotidite epidêmica]", + Z251: "Necessidade de imunização somente contra a influenza [gripe]", + Z258: "Necessidade de imunização contra outras doenças virais únicas especificadas", + Z26: "Necessidade de imunização contra outras doenças infecciosas únicas", + Z260: "Necessidade de imunização contra a leishmaniose", + Z268: "Necessidade de imunização contra outras doenças infecciosas especificadas únicas", + Z269: "Necessidade de imunização contra doença infecciosa não especificada", + Z27: "Necessidade de imunização associada contra combinações de doenças infecciosas", + Z270: "Necessidade de imunização contra a cólera e as febres tifóide e paratifóides [Cólera + TAB]", + Z271: "Necessidade de imunização associada contra a difteria-pertussis-tétano, combinada [DPT]", + Z272: "Necessidade de imunização contra a difteria-pertussis-tétano com febres tifóide e paratifóides [DPT + TAB]", + Z273: "Necessidade de imunização contra a difteria-pertussis-tétano com poliomielite [DPT + pólio]", + Z274: "Necessidade de imunização contra o sarampo-caxumba-rubéola", + Z278: "Necessidade de imunização contra outras combinações de doenças infecciosas", + Z279: "Necessidade de imunização contra combinações não especificadas de doenças infecciosas", + Z28: "Imunização não realizada", + Z280: "Imunização não realizada por contra-indicação", + Z281: "Imunização não realizada por decisão do paciente devida à crença ou a grupo de pressão", + Z282: "Imunização não realizada por decisão do paciente devida a razões outras e às não especificadas", + Z288: "Imunização não realizada por outras razões", + Z289: "Imunização não realizada por razões não especificadas", + Z29: "Necessidade de outras medidas profiláticas", + Z290: "Isolamento", + Z291: "Imunoterapia profilática", + Z292: "Outras quimioterapias profiláticas", + Z298: "Outras medidas profiláticas especificadas", + Z299: "Medida profilática não especificada", + Z30: "Anticoncepção", + Z300: "Aconselhamento geral sobre contracepção", + Z301: "Inserção de dispositivo anticoncepcional (intra-uterino)", + Z302: "Esterilização", + Z303: "Extração menstrual", + Z304: "Supervisão do uso de medicamentos anticoncepcionais", + Z305: "Supervisão de dispositivo anticoncepcional (intra-uterino)", + Z308: "Outro procedimento anticoncepcional", + Z309: "Procedimento anticoncepcional não especificado", + Z31: "Medidas de procriação", + Z310: "Tuboplastia ou vasoplastia após esterilização prévia", + Z311: "Inseminação artificial", + Z312: 'Fecundação "in vitro"', + Z313: "Outros métodos assistidos de fertilização", + Z314: "Investigação e testes com relação à procriação", + Z315: "Aconselhamento genético", + Z316: "Aconselhamento geral sobre a procriação", + Z318: "Outra medida especificada de procriação", + Z319: "Medida procriativa não especificada", + Z32: "Exame ou teste de gravidez", + Z320: "Gravidez (ainda) não confirmada", + Z321: "Gravidez confirmada", + Z33: "Gravidez como achado casual", + Z34: "Supervisão de gravidez normal", + Z340: "Supervisão de primeira gravidez normal", + Z348: "Supervisão de outra gravidez normal", + Z349: "Supervisão de gravidez normal, não especificada", + Z35: "Supervisão de gravidez de alto risco", + Z350: "Supervisão de gravidez com história de esterilidade", + Z351: "Supervisão de gravidez com história de aborto", + Z352: "Supervisão de gravidez com outros antecedentes de procriação problemática", + Z353: "Supervisão de gravidez com história de assistência pré-natal insuficiente", + Z354: "Supervisão de gravidez com grande multiparidade", + Z355: "Supervisão de primigesta idosa", + Z356: "Supervisão de primigesta muito jovem", + Z357: "Supervisão de gravidez de alto risco devido a problemas sociais", + Z358: "Supervisão de outras gravidezes de alto risco", + Z359: "Supervisão não especificada de gravidez de alto risco", + Z36: 'Rastreamento ("screening") pré-natal', + Z360: "Rastreamento de anomalias cromossômicas", + Z361: "Rastreamento pré-natal de taxa elevada de alfa-fetoproteínas", + Z362: "Outros rastreamentos pré-natais por amniocentese", + Z363: "Rastreamento pré-natal de malformações por ultrassom e outros meios físicos", + Z364: "Rastreamento pré-natal do retardo de crescimento do feto por ultrassom e outros métodos físicos", + Z365: "Rastreamento pré-natal de isoimunização", + Z368: "Outros rastreamentos pré-natais", + Z369: "Rastreamento pré-natal não especificado", + Z37: "Resultado do parto", + Z370: "Nascimento único, nativivo [nado-vivo]", + Z371: "Nascimento único, natimorto [feto-morto]", + Z372: "Nascimento gemelar, gêmeos (ambos) nativivos [nado-vivos]", + Z373: "Nascimento gemelar, um dos gêmeos, nativivo [nado-vivo], o outro, natimorto [feto-morto]", + Z374: "Nascimento gemelar, gêmeos natimortos [feto-mortos]", + Z375: "Outros nascimentos múltiplos, todos nativivos [nado-vivos]", + Z376: "Outros nascimentos múltiplos, alguns nativivos [nado-vivos]", + Z377: "Outros nascimentos múltiplos, todos natimortos [feto-mortos]", + Z379: "Nascimento não especificado", + Z38: "Nascidos vivos [nado-vivos] segundo o local de nascimento", + Z380: "Criança única, nascida em hospital", + Z381: "Criança única, nascida fora do hospital", + Z382: "Criança única, não especificado quanto ao local de nascimento", + Z383: "Gêmeos (duplos), nascidos em hospital", + Z384: "Gêmeos (duplos), nascidos fora de hospital", + Z385: "Gêmeos, não especificados quanto ao local de nascimento", + Z386: "Outros nascimentos múltiplos, em hospital", + Z387: "Outros nascimentos múltiplos, fora de hospital", + Z388: "Outros nascimentos múltiplos, não especificados quanto ao local de nascimento", + Z39: "Assistência e exame pós-natal", + Z390: "Assistência e exame imediatamente após o parto", + Z391: "Assistência e exame da mãe nutriz", + Z392: "Seguimento pós-parto de rotina", + Z40: "Cirurgia profilática", + Z400: "Cirurgia profilática para fatores de risco relacionados com neoplasias malignas", + Z408: "Outra cirurgia profilática", + Z409: "Cirurgia profilática não especificada", + Z41: "Procedimentos para outros propósitos exceto cuidados de saúde", + Z410: "Transplante de cabelo", + Z411: "Outras intervenções de cirurgia plástica por razões estéticas", + Z412: "Circuncisão ritual e de rotina", + Z413: "Perfuração do lobo da orelha", + Z418: "Outros procedimentos para outros propósitos exceto cuidados de saúde", + Z419: "Procedimentos não especificado para outros propósitos exceto cuidados de saúde", + Z42: "Seguimento envolvendo cirurgia plástica", + Z420: "Seguimento envolvendo cirurgia plástica da cabeça e do pescoço", + Z421: "Seguimento envolvendo cirurgia plástica de mama", + Z422: "Seguimento envolvendo cirurgia plástica de outras partes do tronco", + Z423: "Seguimento envolvendo cirurgia plástica das extremidades superiores", + Z424: "Seguimento envolvendo cirurgia plástica das extremidades inferiores", + Z428: "Seguimento envolvendo cirurgia plástica de outras partes do corpo", + Z429: "Seguimento envolvendo cirurgia plástica não especificada", + Z43: "Atenção a orifícios artificiais", + Z430: "Cuidados à traqueostomia", + Z431: "Cuidados à gastrostomia", + Z432: "Cuidados à ileostomia", + Z433: "Cuidados à colostomia", + Z434: "Cuidados a outros orifícios artificiais do tubo digestivo", + Z435: "Cuidados à cistostomia", + Z436: "Cuidados a outros orifícios artificiais das vias urinárias", + Z437: "Cuidados à vagina artificial", + Z438: "Cuidados a outros orifícios artificiais", + Z439: "Cuidados a orifício artificial não especificado", + Z44: "Colocação e ajustamento de aparelhos de prótese externa", + Z440: "Colocação e ajustamento de braço artificial (parcial) (total)", + Z441: "Colocação e ajustamento de perna artificial (parcial) (total)", + Z442: "Colocação e ajustamento de olho artificial", + Z443: "Colocação e ajustamento de prótese externa de mama", + Z448: "Colocação e ajustamento de outros aparelhos de prótese externa", + Z449: "Colocação e ajustamento de aparelho de prótese externa não especificado", + Z45: "Ajustamento e manuseio de dispositivo implantado", + Z450: "Ajustamento e manuseio de marca-passo cardíaco", + Z451: "Ajustamento e manuseio de bomba de infusão", + Z452: "Ajustamento e manuseio de dispositivo de acesso vascular", + Z453: "Ajustamento e manuseio de dispositivo implantado de audição", + Z458: "Ajustamento e manuseio de outros dispositivos implantados", + Z459: "Ajustamento e manuseio de dispositivo implantado não especificado", + Z46: "Colocação e ajustamento de outros aparelhos", + Z460: "Colocação e ajustamento de óculos e lentes de contato", + Z461: "Colocação e ajustamento de aparelho auditivo", + Z462: "Colocação e ajustamento de outros aparelhos relacionados com o sistema nervoso e órgãos dos sentidos", + Z463: "Colocação e ajustamento de dispositivo de prótese dentária", + Z464: "Colocação e ajustamento de aparelho ortodôntico", + Z465: "Colocação e ajustamento de ileostomia e de outros dispositivos intestinais", + Z466: "Colocação e ajustamento de prótese urinária", + Z467: "Colocação e ajustamento de aparelho ortopédico", + Z468: "Colocação e ajustamento de outros aparelhos especificados", + Z469: "Colocação e ajustamento de aparelho não especificado", + Z47: "Outros cuidados de seguimento ortopédico", + Z470: "Seguimento envolvendo remoção de placa de fratura e outros dispositivos de fixação interna", + Z478: "Outros seguimentos ortopédicos especificados", + Z479: "Seguimento ortopédico não especificado", + Z48: "Outro seguimento cirúrgico", + Z480: "Cuidados a curativos e suturas cirúrgicas", + Z488: "Outro seguimento cirúrgico especificado", + Z489: "Seguimento cirúrgico não especificado", + Z49: "Cuidados envolvendo diálise", + Z490: "Cuidado preparatório para diálise", + Z491: "Diálise extracorpórea", + Z492: "Outras diálises", + Z50: "Cuidados envolvendo o uso de procedimentos de reabilitação", + Z500: "Reabilitação cardíaca", + Z501: "Outra fisioterapia", + Z502: "Reabilitação de alcoólatra", + Z503: "Reabilitação de toxicodependentes", + Z504: "Psicoterapia, não classificada em outra parte", + Z505: "Reabilitação da linguagem", + Z506: "Treinamento ortóptico", + Z507: "Terapia ocupacional e reabilitação vocacional não classificada em outra parte", + Z508: "Cuidados envolvendo uso de outros procedimentos de reabilitação", + Z509: "Cuidados envolvendo uso de procedimento de reabilitação não especificado", + Z51: "Outros cuidados médicos", + Z510: "Sessão de radioterapia", + Z511: "Sessão de quimioterapia por neoplasia", + Z512: "Outra quimioterapia", + Z513: "Transfusão de sangue, sem diagnóstico registrado", + Z514: "Cuidado preparatório para tratamento subsequente não classificado em outra parte", + Z515: "Cuidado paliativo", + Z516: "Dessensibilização a alérgenos", + Z518: "Outro cuidado médico especificado", + Z519: "Cuidado médico não especificado", + Z52: "Doadores de órgãos e tecidos", + Z520: "Doador de sangue", + Z521: "Doador de pele", + Z522: "Doador de osso", + Z523: "Doador de medula óssea", + Z524: "Doador de rim", + Z525: "Doador de córnea", + Z526: "Doador de fígado", + Z527: "Doador de coração", + Z528: "Doador de outros órgãos ou tecidos", + Z529: "Doador de órgão ou tecido não especificado", + Z53: "Pessoas em contato com serviços de saúde para procedimentos específicos não realizados", + Z530: "Procedimento não realizado devido à contra-indicação", + Z531: "Procedimento não realizado devido à decisão do paciente por razões de crença ou grupo de pressão", + Z532: "Procedimento não realizado devido à decisão do paciente por outras razões e as não especificadas", + Z538: "Procedimento não realizado por outras razões", + Z539: "Procedimento não realizado por razão não especificada", + Z54: "Convalescença", + Z540: "Convalescença após cirurgia", + Z541: "Convalescença após radioterapia", + Z542: "Convalescença após quimioterapia", + Z543: "Convalescença após psicoterapia", + Z544: "Convalescença após tratamento de fratura", + Z547: "Convalescença após tratamento combinado", + Z548: "Convalescença após outro tratamento", + Z549: "Convalescença após tratamento não especificado", + Z55: "Problemas relacionados com a educação e com a alfabetização", + Z550: "Analfabetismo e baixa escolaridade", + Z551: "Escolarização não disponível e impossível", + Z552: "Reprovação em exames", + Z553: "Maus resultados escolares", + Z554: "Má adaptação escolar e dificuldades com professores e colegas", + Z558: "Outros problemas relacionados com a educação e com a alfabetização", + Z559: "Problemas não especificados relacionados com a educação e com a alfabetização", + Z56: "Problemas relacionados com o emprego e com o desemprego", + Z560: "Desemprego não especificado", + Z561: "Mudança de emprego", + Z562: "Ameaça de perda de emprego", + Z563: "Ritmo de trabalho penoso", + Z564: "Desacordo com patrão e colegas de trabalho", + Z565: "Má adaptação ao trabalho", + Z566: "Outras dificuldades físicas e mentais relacionadas ao trabalho", + Z567: "Outros problemas e os não especificados relacionados com o emprego", + Z57: "Exposição ocupacional a fatores de risco", + Z570: "Exposição ocupacional ao ruído", + Z571: "Exposição ocupacional à radiação", + Z572: "Exposição ocupacional à poeira (pó)", + Z573: "Exposição ocupacional a outros contaminantes do ar", + Z574: "Exposição ocupacional a agentes tóxicos na agricultura", + Z575: "Exposição ocupacional a agentes tóxicos em outras indústrias", + Z576: "Exposição ocupacional a temperaturas extremas", + Z577: "Exposição ocupacional à vibração", + Z578: "Exposição ocupacional a outros fatores de risco", + Z579: "Exposição ocupacional a fator de risco não especificado", + Z58: "Problemas relacionados com o ambiente físico", + Z580: "Exposição ao ruído", + Z581: "Exposição à poluição atmosférica", + Z582: "Exposição à poluição da água", + Z583: "Exposição à poluição do solo", + Z584: "Exposição à radiação", + Z585: "Exposição a outras poluições", + Z586: "Água potável insuficiente", + Z587: "Exposição à fumaça de tabaco", + Z588: "Outros problemas relacionados com o ambiente físico", + Z589: "Problema não especificado relacionado com o ambiente físico", + Z59: "Problemas relacionados com a habitação e com as condições econômicas", + Z590: "Falta de domicílio fixo", + Z591: "Habitação inadequada", + Z592: "Desacordo com vizinhos, locatários e proprietários", + Z593: "Problemas relacionados com a vida em instituição residencial", + Z594: "Falta de alimentação adequada", + Z595: "Pobreza extrema", + Z596: "Baixo rendimento", + Z597: "Seguro social e medidas de bem-estar social insuficientes", + Z598: "Outros problemas relacionados com a habitação e com as circunstâncias econômicas", + Z599: "Circunstâncias não especificadas econômicas ou de habitação", + Z60: "Problemas relacionados com o meio social", + Z600: "Problemas de adaptação às transições do ciclo de vida", + Z601: "Situação parental atípica", + Z602: "Viver só", + Z603: "Dificuldade de aculturação", + Z604: "Exclusão e rejeição sociais", + Z605: "Objeto de discriminação e perseguição percebidas", + Z608: "Outros problemas relacionados com o meio social", + Z609: "Problema não especificado relacionado com o meio social", + Z61: "Problemas relacionados com eventos negativos de vida na infância", + Z610: "Perda de relação afetiva na infância", + Z611: "Remoção do lar na infância", + Z612: "Padrão alterado de relações familiares na infância", + Z613: "Eventos que originam a perda de auto-estima na infância", + Z614: "Problemas relacionados com abuso sexual alegado de uma criança por uma pessoa de dentro de seu grupo", + Z615: "Problemas relacionados com abuso sexual alegado de uma criança por pessoa de fora de seu grupo", + Z616: "Problemas relacionados com abuso físico alegado da criança", + Z617: "Experiência pessoal amedrontadora na infância", + Z618: "Outros eventos da vida pessoal negativos na infância", + Z619: "Evento pessoal negativo não especificado na infância", + Z62: "Outros problemas relacionados com a educação da criança", + Z620: "Supervisão e controle inadequado por parte dos pais", + Z621: "Superproteção por parte dos pais", + Z622: "Educação numa instituição", + Z623: "Hostilidade com relação a uma criança, transformada em bode expiatório", + Z624: "Negligência emocional da criança", + Z625: "Outros problemas relacionados com negligência na educação dos filhos", + Z626: "Pressões não apropriadas por parte dos pais e outras falhas de educação", + Z628: "Outros problemas especificados relacionados com a educação dos filhos", + Z629: "Problema não especificado relacionado com a educação dos filhos", + Z63: "Outros problemas relacionados com o grupo primário de apoio, inclusive com a situação familiar", + Z630: "Problemas nas relações com cônjuge ou parceiro", + Z631: "Problemas nas relações com os pais ou com os sogros", + Z632: "Suporte familiar inadequado", + Z633: "Ausência de um dos membros da família", + Z634: "Desaparecimento ou falecimento de um membro da família", + Z635: "Rompimento da família por separação ou divórcio", + Z636: "Parente dependente de cuidados, residente no domicílio", + Z637: "Outros acontecimentos difíceis com incidência na família ou no lar", + Z638: "Outros problemas especificados relacionados com o grupo primário de suporte", + Z639: "Problema não especificado relacionado com o grupo primário de suporte", + Z64: "Problemas relacionados com algumas outras circunstâncias psicossociais", + Z640: "Problemas relacionados com uma gravidez não desejada", + Z641: "Problemas relacionados com multiparidade", + Z642: "Procura e aceitação de intervenções físicas, nutricionais, ou químicas conhecidas como perigosas ou nocivas", + Z643: "Procura e aceitação de intervenções comportamentais ou psicológicas conhecidas como perigosas ou nocivas", + Z644: "Desacordo com conselheiros", + Z65: "Problemas relacionados com outras circunstâncias psicossociais", + Z650: "Condenação, sem prisão, por tribunal civil ou criminal", + Z651: "Prisão ou encarceramento", + Z652: "Problemas ligados à libertação de prisão", + Z653: "Problemas ligados à outras circunstâncias legais", + Z654: "Vítima de crime ou de atos terroristas", + Z655: "Exposição a catástrofe, guerra e outras hostilidades", + Z658: "Outros problemas especificados relacionados com circunstâncias psicossociais", + Z659: "Problemas relacionados com circunstâncias psicossociais não especificadas", + Z70: "Aconselhamento relativo às atitudes, comportamento e orientação em matéria de sexualidade", + Z700: "Acompanhamento relativo às atitudes em matéria de sexualidade", + Z701: "Aconselhamento relativo ao comportamento e à orientação sexual do sujeito", + Z702: "Aconselhamento relativo ao comportamento e à orientação sexual de um terceiro", + Z703: "Aconselhamento relativo a preocupações associadas relacionadas com as atitudes, o comportamento e orientação em matéria de sexualidade", + Z708: "Outros aconselhamentos em matéria de sexualidade", + Z709: "Aconselhamento não especificado em matéria de sexualidade", + Z71: "Pessoas em contato com os serviços de saúde para outros aconselhamentos e conselho médico, não classificados em outra parte", + Z710: "Pessoa que consulta no interesse de um terceiro", + Z711: "Pessoa com medo de uma queixa para a qual não foi feito diagnóstico", + Z712: "Pessoa que consulta para explicação de achados de exame", + Z713: "Aconselhamento e supervisão dietéticos", + Z714: "Aconselhamento e supervisão para abuso de álcool", + Z715: "Aconselhamento e supervisão para abuso de drogas", + Z716: "Aconselhamento para o abuso de fumo", + Z717: "Aconselhamento a propósito do vírus da imunodeficiência humana [HIV]", + Z718: "Outros aconselhamentos especificados", + Z719: "Aconselhamento não especificado", + Z72: "Problemas relacionados com o estilo de vida", + Z720: "Uso do tabaco", + Z721: "Uso de álcool", + Z722: "Uso de droga", + Z723: "Falta de exercício físico", + Z724: "Regime e hábitos alimentares inadequados", + Z725: "Comportamento sexual de alto risco", + Z726: "Mania de jogo e apostas", + Z728: "Outros problemas relacionados com o estilo de vida", + Z729: "Problema não especificado relacionado com o estilo de vida", + Z73: "Problemas relacionados com a organização de seu modo de vida", + Z730: "Esgotamento", + Z731: "Acentuação de traços de personalidade", + Z732: "Falta de repouso e de lazer", + Z733: '"Stress" não classificado em outra parte', + Z734: "Habilidades sociais inadequadas não classificadas em outra parte", + Z735: "Conflito sobre o papel social, não classificado em outra parte", + Z736: "Limites impostos às atividades por invalidez", + Z738: "Outros problemas relacionados com a organização do seu modo de vida", + Z739: "Problema relacionado com a organização de seu modo de vida não especificado", + Z74: "Problemas relacionados com a dependência de uma pessoa que oferece cuidados de saúde", + Z740: "Mobilidade reduzida", + Z741: "Necessidade de assistência com cuidados pessoais", + Z742: "Necessidade de assistência a domicílio, sendo que nenhuma pessoa do lar é capaz de assegurar os cuidados", + Z743: "Necessidade de supervisão contínua", + Z748: "Outros problemas relacionados com a dependência de pessoa que oferece cuidados de saúde", + Z749: "Problema não especificado relacionado com a dependência de pessoa que oferece cuidados de saúde", + Z75: "Problemas relacionados com as facilidades médicas e outros cuidados de saúde", + Z750: "Falta de disponibilidade de serviços médicos no domicílio", + Z751: "Pessoa esperando ser admitida em estabelecimento médico adequado em outra parte", + Z752: "Outro período de espera para investigação e tratamento", + Z753: "Facilidades de saúde não disponíveis ou não acessíveis", + Z754: "Outras organizações de cuidados não disponíveis ou não acessíveis", + Z755: "Cuidados dispensados para ajudar às famílias durante as férias", + Z758: "Outras dificuldades especificadas relacionadas com facilidades médicas e com outros cuidados de saúde", + Z759: "Problema não especificado relacionado com facilidades médicas e com outros cuidados de saúde", + Z76: "Pessoas em contato com os serviços de saúde em outras circunstâncias", + Z760: "Emissão de prescrição de repetição", + Z761: "Supervisão e cuidado de saúde de crianças assistidas", + Z762: "Supervisão de cuidado de saúde de outras crianças ou recém-nascidos sadios", + Z763: "Pessoa em boa saúde acompanhando pessoa doente", + Z764: "Outros pensionistas em estabelecimentos de cuidados de saúde", + Z765: "Pessoa fingindo ser doente [simulação consciente]", + Z768: "Contatos com serviços de saúde por outras circunstâncias especificadas", + Z769: "Pessoa em contato com serviços de saúde em circunstâncias não especificadas", + Z80: "História familiar de neoplasia maligna", + Z800: "História familiar de neoplasia maligna de órgãos digestivos", + Z801: "História familiar de neoplasia maligna de traquéia, brônquio e pulmão", + Z802: "História familiar de neoplasia maligna de outros órgãos respiratórios e intratorácicos", + Z803: "História familiar de neoplasia de mama", + Z804: "História familiar de neoplasia maligna de órgãos genitais", + Z805: "História familiar de neoplasia maligna do trato urinário", + Z806: "História familiar de leucemia", + Z807: "História familiar de outras neoplasias malignas dos tecidos linfático, hematopoético e correlacionados", + Z808: "História familiar de neoplasia maligna de outros órgãos ou aparelhos", + Z809: "História familiar de neoplasia maligna não especificada", + Z81: "História familiar de transtornos mentais e comportamentais", + Z810: "História familiar de retardo mental", + Z811: "História familiar de abuso de álcool", + Z812: "História familiar de abuso de fumo", + Z813: "História familiar de abuso de outra substância psicoativa", + Z814: "História familiar de abuso de outra substância", + Z818: "História familiar de outros transtornos mentais e comportamentais", + Z82: "História familiar de algumas incapacidades e doenças crônicas que conduzem a incapacitação", + Z820: "História familiar de epilepsia e de outras doenças do sistema nervoso", + Z821: "História familiar de cegueira e perda de visão", + Z822: "História familiar de surdez e perda de audição", + Z823: "História familiar de acidente vascular cerebral", + Z824: "História familiar de doença isquêmica do coração e outras doenças do aparelho circulatório", + Z825: "História familiar de asma e outras doenças respiratórias inferiores crônicas", + Z826: "História familiar de artrite e outras doenças do sistema osteomuscular e tecido conjuntivo", + Z827: "História familiar de malformações e deformações congênitas e anomalias cromossômicas", + Z828: "História familiar de outras incapacidades e doenças crônicas que conduzem a incapacitação, não classificadas em outra parte", + Z83: "História familiar de outros transtornos específicos", + Z830: "História familiar de doença pelo vírus da imunodeficiência humana [HIV]", + Z831: "História familiar de outras doenças infecciosas e parasitárias", + Z832: "História familiar de doenças do sangue e dos órgãos hematopoéticos e alguns transtornos imunitários", + Z833: "História familiar de diabetes mellitus", + Z834: "História familiar de outras doenças endócrinas, nutricionais e metabólicas", + Z835: "História familiar de outros transtornos dos olhos e dos ouvidos", + Z836: "História familiar de doenças do aparelho respiratório", + Z837: "História familiar das doenças do aparelho digestivo", + Z84: "História familiar de outras afecções", + Z840: "História familiar de doenças da pele e do tecido subcutâneo", + Z841: "História familiar de transtornos do rim e ureter", + Z842: "História familiar de outras doenças do aparelho geniturinário", + Z843: "História familiar de consangüinidade", + Z848: "História familiar de outras afecções especificadas", + Z85: "História pessoal de neoplasia maligna", + Z850: "História pessoal de neoplasia maligna de órgãos digestivos", + Z851: "História pessoal de neoplasia maligna de traquéia, brônquio e pulmão", + Z852: "História pessoal de neoplasia maligna de outros órgãos respiratórios e intratorácicos", + Z853: "História pessoal de neoplasia maligna de mama", + Z854: "História pessoal de neoplasia maligna de órgãos genitais", + Z855: "História pessoal de neoplasia maligna de trato urinário", + Z856: "História pessoal de leucemia", + Z857: "História pessoal de outras neoplasias malignas do tecido linfático, hematopoético e tecidos correlatos", + Z858: "História pessoal de neoplasias malignas de outros órgãos ou aparelhos", + Z859: "História pessoal de neoplasia maligna não especificada", + Z86: "História pessoal de algumas outras doenças", + Z860: "História pessoal de outras neoplasias", + Z861: "História pessoal de doenças infecciosas e parasitárias", + Z862: "História pessoal de doenças do sangue e dos órgãos hematopoéticos e alguns transtornos imunitários", + Z863: "História pessoal de doenças endócrinas, nutricionais e metabólicas", + Z864: "História pessoal de abuso de substâncias psicoativas", + Z865: "História pessoal de outros transtornos mentais e comportamentais", + Z866: "História pessoal de doenças do sistema nervoso e dos órgãos dos sentidos", + Z867: "História pessoal de doenças do aparelho circulatório", + Z87: "História pessoal de outras doenças e afecções", + Z870: "História pessoal de doenças do aparelho respiratório", + Z871: "História pessoal de doenças do aparelho digestivo", + Z872: "História pessoal de doenças da pele e tecido subcutâneo", + Z873: "História pessoal de doenças do sistema osteomuscular e tecido conjuntivo", + Z874: "História pessoal de doenças do aparelho geniturinário", + Z875: "História pessoal de complicações da gravidez, parto e puerpério", + Z876: "História pessoal de algumas afecções originadas no período perinatal", + Z877: "História pessoal de malformações e deformidades congênitas e anomalias cromossômicas", + Z878: "História pessoal de outras afecções especificadas", + Z88: "História pessoal de alergia a drogas, medicamentos e a substâncias biológicas", + Z880: "História pessoal de alergia à penicilina", + Z881: "História pessoal de alergia a outro agente antibiótico", + Z882: "História pessoal de alergia às sulfonamidas", + Z883: "História pessoal de alergia a outros agentes antiinfecciosos", + Z884: "História pessoal de alergia a agente anestésico", + Z885: "História pessoal de alergia a agente narcótico", + Z886: "História pessoal de alergia a agente analgésico", + Z887: "História pessoal de alergia a soro e à vacina", + Z888: "História pessoal de alergia a outros drogas, medicamentos e substâncias biológicas", + Z889: "História pessoal de alergia a drogas, medicamentos e substâncias biológicas não especificadas", + Z89: "Ausência adquirida de membros", + Z890: "Ausência adquirida de dedo(s) da mão [inclusive polegar] unilateral", + Z891: "Ausência adquirida de mão e punho", + Z892: "Ausência adquirida de braço acima do punho", + Z893: "Ausência adquirida de ambos membros superiores [qualquer nível]", + Z894: "Ausência adquirida de pé e tornozelo", + Z895: "Ausência adquirida da perna ao nível ou abaixo do joelho", + Z896: "Ausência adquirida da perna acima do joelho", + Z897: "Ausência adquirida de ambos membros inferiores [qualquer nível, exceto somente artelhos]", + Z898: "Ausência adquirida dos membros superiores e inferiores [qualquer nível]", + Z899: "Ausência adquirida de membro não especificado", + Z90: "Ausência adquirida de órgãos não classificados em outra parte", + Z900: "Ausência adquirida de parte da cabeça e do pescoço", + Z901: "Ausência adquirida da(s) mama(s)", + Z902: "Ausência adquirida [de parte] do pulmão", + Z903: "Ausência adquirida de parte do estômago", + Z904: "Ausência adquirida de outras partes do trato digestivo", + Z905: "Ausência adquirida do rim", + Z906: "Ausência adquirida de outras partes do trato urinário", + Z907: "Ausência adquirida de órgão(s) genital(is)", + Z908: "Ausência adquirida de outros órgãos", + Z91: "História pessoal de fatores de risco, não classificados em outra parte", + Z910: "História pessoal de alergia exceto a drogas e a substâncias biológicas", + Z911: "História pessoal de não aderência a tratamento ou regime médico", + Z912: "História pessoal de má higiene pessoal", + Z913: "História pessoal de ciclo vigília-sono anormal", + Z914: "História pessoal de trauma psicológico não classificado em outra parte", + Z915: "História pessoal de auto agressão", + Z916: "História pessoal de outros traumas físicos", + Z918: "História pessoal de outros fatores de risco especificados não classificados em outra parte", + Z92: "História pessoal de tratamento médico", + Z920: "História pessoal de anticoncepção", + Z921: "História pessoal de uso de longo prazo (atual) de anticoagulantes", + Z922: "História pessoal de uso de longo prazo (atual) de outros medicamentos", + Z923: "História pessoal de irradiação", + Z924: "História pessoal de cirurgia de grande porte não classificada em outra parte", + Z925: "História pessoal de medidas de reabilitação", + Z926: "História pessoal de quimioterapia para doença neoplásica", + Z928: "História pessoal de outros tratamentos médicos", + Z929: "História pessoal de tratamento médico não especificado", + Z93: "Orifícios artificiais", + Z930: "Traqueostomia", + Z931: "Gastrostomia", + Z932: "Ileostomia", + Z933: "Colostomia", + Z934: "Outros orifícios artificiais do trato gastrointestinal", + Z935: "Cistostomia", + Z936: "Outros orifícios artificiais do aparelho urinário", + Z938: "Outros orifícios artificiais", + Z939: "Orifício artificial não especificado", + Z94: "Órgãos e tecidos transplantados", + Z940: "Rim transplantado", + Z941: "Coração transplantado", + Z942: "Pulmão transplantado", + Z943: "Coração e pulmões transplantados", + Z944: "Fígado transplantado", + Z945: "Pele transplantada", + Z946: "Osso transplantado", + Z947: "Córnea transplantada", + Z948: "Outros órgãos e tecidos transplantados", + Z949: "Órgão e tecido não especificado transplantado", + Z95: "Presença de implantes e enxertos cardíacos e vasculares", + Z950: "Presença de marca-passo cardíaco", + Z951: 'Presença de enxerto de ponte ["bypass"] aortocoronária', + Z952: "Presença de prótese de válvula cardíaca", + Z953: "Presença de valva cardíaca xenógena", + Z954: "Presença de outras substituições valvares cardíacas", + Z955: "Presença de implante e enxerto de angioplastia coronária", + Z958: "Presença de outros implantes e enxertos cardíacos e vasculares", + Z959: "Presença de implante e enxerto cardíaco e vascular não especificado", + Z96: "Presença de outros implantes funcionais", + Z960: "Presença de implantes urogenitais", + Z961: "Presença de lente intra-ocular", + Z962: "Presença de implante otológicos e audiológicos", + Z963: "Presença de laringe artificial", + Z964: "Presença de implantes endócrinos", + Z965: "Presença de raiz dentária e implantes mandibulares", + Z966: "Presença de implantes articulares ortopédicos", + Z967: "Presença de outros implantes de osso e tendão", + Z968: "Presença de outros implantes funcionais especificados", + Z969: "Presença de implante funcional não especificado", + Z97: "Presença de outros dispositivos protéticos", + Z970: "Presença de olho artificial", + Z971: "Presença de membro artificial (completo) (parcial)", + Z972: "Presença de dispositivo protético dentário (completo) (parcial)", + Z973: "Presença de óculos e de lentes de contato", + Z974: "Presença de aparelho externo de surdez", + Z975: "Presença de dispositivo anticoncepcional intra-uterino [DIU]", + Z978: "Presença de outros dispositivos especificados", + Z98: "Outros estados pós-cirúrgicos", + Z980: "Derivação intestinal ou anastomose intestinal", + Z981: "Artrodese", + Z982: "Presença de dispositivo de drenagem do líquor", + Z988: "Outros estados pós-cirúrgicos especificados", + Z99: "Dependência de máquinas e dispositivos capacitantes, não classificados em outra parte", + Z990: "Dependência de aspirador", + Z991: "Dependência de respirador", + Z992: "Dependência de diálise renal", + Z993: "Dependência de cadeira de rodas", + Z998: "Dependência de outras máquinas e aparelhos capacitantes", + Z999: "Dependência de máquina e aparelho capacitante não especificado", +}; diff --git a/src/_internals/constants/cid10.ts b/src/_internals/constants/cid10.ts new file mode 100644 index 000000000..a70be78f8 --- /dev/null +++ b/src/_internals/constants/cid10.ts @@ -0,0 +1,2060 @@ +/** + * Every CID-10 category, with the fourth characters of its subcategories: `A00: "019"` stands + * for `A00.0`, `A00.1` and `A00.9`, and an empty string for a category that is not + * subdivided. It holds the same codes as `CID10_DESCRIPTIONS` without the descriptions, so that + * checking a code does not cost the whole table. + * + * Generated by `node ./scripts/cid10.ts`. Do not edit by hand. + * + * @see Official: http://www2.datasus.gov.br/cid10/V2008/downloads/CID10CSV.zip + * The CID-10 tables in CSV, as published by DATASUS (Ministério da Saúde). + * @see Official: http://www2.datasus.gov.br/cid10/V2008/descrcsv.htm + * The DATASUS page that links the archive and documents its files, columns and encoding. + */ +export const CID10_SUBCATEGORIES: Record = { + A00: "019", + A01: "01234", + A02: "01289", + A03: "012389", + A04: "0123456789", + A05: "0123489", + A06: "0123456789", + A07: "012389", + A08: "012345", + A09: "", + A15: "0123456789", + A16: "012345789", + A17: "0189", + A18: "012345678", + A19: "01289", + A20: "0123789", + A21: "0123789", + A22: "012789", + A23: "012389", + A24: "01234", + A25: "019", + A26: "0789", + A27: "089", + A28: "01289", + A30: "01234589", + A31: "0189", + A32: "01789", + A33: "", + A34: "", + A35: "", + A36: "012389", + A37: "0189", + A38: "", + A39: "01234589", + A40: "012389", + A41: "01234589", + A42: "012789", + A43: "0189", + A44: "0189", + A46: "", + A48: "012348", + A49: "012389", + A50: "012345679", + A51: "0123459", + A52: "0123789", + A53: "09", + A54: "012345689", + A55: "", + A56: "012348", + A57: "", + A58: "", + A59: "089", + A60: "019", + A63: "08", + A64: "", + A65: "", + A66: "0123456789", + A67: "01239", + A68: "019", + A69: "01289", + A70: "", + A71: "019", + A74: "089", + A75: "01239", + A77: "012389", + A78: "", + A79: "0189", + A80: "012349", + A81: "01289", + A82: "019", + A83: "012345689", + A84: "0189", + A85: "0128", + A86: "", + A87: "01289", + A88: "018", + A89: "", + A90: "", + A91: "", + A92: "0123489", + A93: "0128", + A94: "", + A95: "019", + A96: "01289", + A98: "0123458", + A99: "", + B00: "012345789", + B01: "01289", + B02: "0123789", + B03: "", + B04: "", + B05: "0123489", + B06: "089", + B07: "", + B08: "0123458", + B09: "", + B15: "09", + B16: "0129", + B17: "0128", + B18: "01289", + B19: "09", + B20: "0123456789", + B21: "0123789", + B22: "0127", + B23: "0128", + B24: "", + B25: "01289", + B26: "012389", + B27: "0189", + B30: "012389", + B33: "012348", + B34: "0123489", + B35: "012345689", + B36: "012389", + B37: "0123456789", + B38: "01234789", + B39: "0123459", + B40: "0123789", + B41: "0789", + B42: "01789", + B43: "01289", + B44: "012789", + B45: "0123789", + B46: "01234589", + B47: "019", + B48: "0123478", + B49: "", + B50: "089", + B51: "089", + B52: "089", + B53: "018", + B54: "", + B55: "0129", + B56: "019", + B57: "012345", + B58: "012389", + B59: "", + B60: "0128", + B64: "", + B65: "012389", + B66: "01234589", + B67: "0123456789", + B68: "019", + B69: "0189", + B70: "01", + B71: "0189", + B72: "", + B73: "", + B74: "0123489", + B75: "", + B76: "0189", + B77: "089", + B78: "0179", + B79: "", + B80: "", + B81: "012348", + B82: "09", + B83: "0123489", + B85: "01234", + B86: "", + B87: "0123489", + B88: "012389", + B89: "", + B90: "01289", + B91: "", + B92: "", + B94: "01289", + B95: "012345678", + B96: "012345678", + B97: "012345678", + B99: "", + C00: "012345689", + C01: "", + C02: "0123489", + C03: "019", + C04: "0189", + C05: "01289", + C06: "01289", + C07: "", + C08: "0189", + C09: "0189", + C10: "0123489", + C11: "012389", + C12: "", + C13: "01289", + C14: "028", + C15: "01234589", + C16: "012345689", + C17: "012389", + C18: "0123456789", + C19: "", + C20: "", + C21: "0128", + C22: "0123479", + C23: "", + C24: "0189", + C25: "01234789", + C26: "0189", + C30: "01", + C31: "012389", + C32: "012389", + C33: "", + C34: "012389", + C37: "", + C38: "012348", + C39: "089", + C40: "012389", + C41: "0123489", + C43: "0123456789", + C44: "0123456789", + C45: "01279", + C46: "0123789", + C47: "012345689", + C48: "0128", + C49: "012345689", + C50: "012345689", + C51: "01289", + C52: "", + C53: "0189", + C54: "012389", + C55: "", + C56: "", + C57: "01234789", + C58: "", + C60: "01289", + C61: "", + C62: "019", + C63: "012789", + C64: "", + C65: "", + C66: "", + C67: "0123456789", + C68: "0189", + C69: "012345689", + C70: "019", + C71: "0123456789", + C72: "01234589", + C73: "", + C74: "019", + C75: "01234589", + C76: "01234578", + C77: "01234589", + C78: "012345678", + C79: "012345678", + C80: "", + C81: "012379", + C82: "01279", + C83: "0123456789", + C84: "012345", + C85: "0179", + C88: "012379", + C90: "012", + C91: "01234579", + C92: "01234579", + C93: "01279", + C94: "0123457", + C95: "01279", + C96: "012379", + C97: "", + D00: "012", + D01: "01234579", + D02: "01239", + D03: "0123456789", + D04: "0123456789", + D05: "0179", + D06: "0179", + D07: "0123456", + D09: "012379", + D10: "012345679", + D11: "079", + D12: "0123456789", + D13: "012345679", + D14: "01234", + D15: "01279", + D16: "0123456789", + D17: "012345679", + D18: "01", + D19: "0179", + D20: "01", + D21: "01234569", + D22: "012345679", + D23: "012345679", + D24: "", + D25: "0129", + D26: "0179", + D27: "", + D28: "01279", + D29: "0123479", + D30: "0123479", + D31: "01234569", + D32: "019", + D33: "0123479", + D34: "", + D35: "0123456789", + D36: "0179", + D37: "012345679", + D38: "0123456", + D39: "01279", + D40: "0179", + D41: "0123479", + D42: "019", + D43: "0123479", + D44: "0123456789", + D45: "", + D46: "0123479", + D47: "012379", + D48: "012345679", + D50: "0189", + D51: "012389", + D52: "0189", + D53: "01289", + D55: "012389", + D56: "0123489", + D57: "01238", + D58: "01289", + D59: "012345689", + D60: "0189", + D61: "012389", + D62: "", + D63: "08", + D64: "0123489", + D65: "", + D66: "", + D67: "", + D68: "0123489", + D69: "012345689", + D70: "", + D71: "", + D72: "0189", + D73: "01234589", + D74: "089", + D75: "01289", + D76: "0123", + D77: "", + D80: "0123456789", + D81: "0123456789", + D82: "0123489", + D83: "01289", + D84: "0189", + D86: "012389", + D89: "01289", + E00: "0129", + E01: "0128", + E02: "", + E03: "01234589", + E04: "01289", + E05: "01234589", + E06: "0123459", + E07: "0189", + E10: "0123456789", + E11: "0123456789", + E12: "0123456789", + E13: "0123456789", + E14: "0123456789", + E15: "", + E16: "0123489", + E20: "0189", + E21: "012345", + E22: "01289", + E23: "012367", + E24: "0123489", + E25: "089", + E26: "0189", + E27: "01234589", + E28: "012389", + E29: "0189", + E30: "0189", + E31: "0189", + E32: "0189", + E34: "01234589", + E35: "018", + E40: "", + E41: "", + E42: "", + E43: "", + E44: "01", + E45: "", + E46: "", + E50: "0123456789", + E51: "1289", + E52: "", + E53: "0189", + E54: "", + E55: "09", + E56: "0189", + E58: "", + E59: "", + E60: "", + E61: "0123456789", + E63: "0189", + E64: "012389", + E65: "", + E66: "01289", + E67: "01238", + E68: "", + E70: "012389", + E71: "0123", + E72: "01234589", + E73: "0189", + E74: "0123489", + E75: "0123456", + E76: "012389", + E77: "0189", + E78: "012345689", + E79: "0189", + E80: "01234567", + E83: "01234589", + E84: "0189", + E85: "0123489", + E86: "", + E87: "012345678", + E88: "01289", + E89: "012345689", + E90: "", + F00: "0129", + F01: "012389", + F02: "012348", + F03: "", + F04: "", + F05: "0189", + F06: "0123456789", + F07: "01289", + F09: "", + F10: "0123456789", + F11: "0123456789", + F12: "0123456789", + F13: "0123456789", + F14: "0123456789", + F15: "0123456789", + F16: "0123456789", + F17: "0123456789", + F18: "0123456789", + F19: "0123456789", + F20: "012345689", + F21: "", + F22: "089", + F23: "012389", + F24: "", + F25: "01289", + F28: "", + F29: "", + F30: "01289", + F31: "0123456789", + F32: "012389", + F33: "0123489", + F34: "0189", + F38: "018", + F39: "", + F40: "01289", + F41: "012389", + F42: "01289", + F43: "01289", + F44: "0123456789", + F45: "0123489", + F48: "0189", + F50: "01234589", + F51: "01234589", + F52: "0123456789", + F53: "0189", + F54: "", + F55: "", + F59: "", + F60: "0123456789", + F61: "", + F62: "0189", + F63: "012389", + F64: "01289", + F65: "012345689", + F66: "01289", + F68: "018", + F69: "", + F70: "0189", + F71: "0189", + F72: "0189", + F73: "0189", + F78: "0189", + F79: "0189", + F80: "012389", + F81: "012389", + F82: "", + F83: "", + F84: "01234589", + F88: "", + F89: "", + F90: "0189", + F91: "012389", + F92: "089", + F93: "012389", + F94: "01289", + F95: "01289", + F98: "012345689", + F99: "", + G00: "012389", + G01: "", + G02: "018", + G03: "01289", + G04: "01289", + G05: "0128", + G06: "012", + G07: "", + G08: "", + G09: "", + G10: "", + G11: "0123489", + G12: "01289", + G13: "0128", + G20: "", + G21: "012389", + G22: "", + G23: "01289", + G24: "01234589", + G25: "012345689", + G26: "", + G30: "0189", + G31: "01289", + G32: "08", + G35: "", + G36: "0189", + G37: "01234589", + G40: "0123456789", + G41: "01289", + G43: "012389", + G44: "012348", + G45: "0123489", + G46: "012345678", + G47: "0123489", + G50: "0189", + G51: "0123489", + G52: "0123789", + G53: "01238", + G54: "0123456789", + G55: "01238", + G56: "0123489", + G57: "012345689", + G58: "0789", + G59: "08", + G60: "012389", + G61: "0189", + G62: "01289", + G63: "01234568", + G64: "", + G70: "01289", + G71: "012389", + G72: "0123489", + G73: "01234567", + G80: "0123489", + G81: "019", + G82: "012345", + G83: "0123489", + G90: "0123489", + G91: "012389", + G92: "", + G93: "0123456789", + G94: "0128", + G95: "01289", + G96: "0189", + G97: "01289", + G98: "", + G99: "0128", + H00: "01", + H01: "0189", + H02: "0123456789", + H03: "018", + H04: "012345689", + H05: "01234589", + H06: "0123", + H10: "01234589", + H11: "0123489", + H13: "01238", + H15: "0189", + H16: "0123489", + H17: "0189", + H18: "0123456789", + H19: "01238", + H20: "01289", + H21: "01234589", + H22: "018", + H25: "01289", + H26: "0123489", + H27: "0189", + H28: "0128", + H30: "01289", + H31: "0123489", + H32: "08", + H33: "012345", + H34: "01289", + H35: "0123456789", + H36: "08", + H40: "012345689", + H42: "08", + H43: "012389", + H44: "0123456789", + H45: "018", + H46: "", + H47: "01234567", + H48: "018", + H49: "0123489", + H50: "012345689", + H51: "01289", + H52: "01234567", + H53: "012345689", + H54: "01234567", + H55: "", + H57: "0189", + H58: "018", + H59: "089", + H60: "01234589", + H61: "012389", + H62: "012348", + H65: "012349", + H66: "012349", + H67: "018", + H68: "01", + H69: "089", + H70: "01289", + H71: "", + H72: "01289", + H73: "0189", + H74: "0123489", + H75: "08", + H80: "01289", + H81: "0123489", + H82: "", + H83: "012389", + H90: "012345678", + H91: "012389", + H92: "012", + H93: "012389", + H94: "08", + H95: "0189", + I00: "", + I01: "01289", + I02: "09", + I05: "01289", + I06: "01289", + I07: "01289", + I08: "012389", + I09: "01289", + I10: "", + I11: "09", + I12: "09", + I13: "0129", + I15: "01289", + I20: "0189", + I21: "012349", + I22: "0189", + I23: "01234568", + I24: "0189", + I25: "012345689", + I26: "09", + I27: "01289", + I28: "0189", + I30: "0189", + I31: "012389", + I32: "018", + I33: "09", + I34: "01289", + I35: "01289", + I36: "01289", + I37: "01289", + I38: "", + I39: "012348", + I40: "0189", + I41: "0128", + I42: "0123456789", + I43: "0128", + I44: "01234567", + I45: "012345689", + I46: "019", + I47: "0129", + I48: "", + I49: "01234589", + I50: "019", + I51: "0123456789", + I52: "018", + I60: "0123456789", + I61: "012345689", + I62: "019", + I63: "012345689", + I64: "", + I65: "012389", + I66: "0123489", + I67: "0123456789", + I68: "0128", + I69: "012348", + I70: "01289", + I71: "012345689", + I72: "0123489", + I73: "0189", + I74: "01234589", + I77: "012345689", + I78: "0189", + I79: "0128", + I80: "012389", + I81: "", + I82: "012389", + I83: "0129", + I84: "0123456789", + I85: "09", + I86: "012348", + I87: "01289", + I88: "0189", + I89: "0189", + I95: "01289", + I97: "01289", + I98: "0128", + I99: "", + J00: "", + J01: "0123489", + J02: "089", + J03: "089", + J04: "012", + J05: "01", + J06: "089", + J09: "", + J10: "018", + J11: "018", + J12: "01289", + J13: "", + J14: "", + J15: "0123456789", + J16: "08", + J17: "01238", + J18: "01289", + J20: "0123456789", + J21: "089", + J22: "", + J30: "01234", + J31: "012", + J32: "0123489", + J33: "0189", + J34: "01238", + J35: "012389", + J36: "", + J37: "01", + J38: "01234567", + J39: "012389", + J40: "", + J41: "018", + J42: "", + J43: "01289", + J44: "0189", + J45: "0189", + J46: "", + J47: "", + J60: "", + J61: "", + J62: "08", + J63: "0123458", + J64: "", + J65: "", + J66: "0128", + J67: "0123456789", + J68: "0123489", + J69: "018", + J70: "0123489", + J80: "", + J81: "", + J82: "", + J84: "0189", + J85: "0123", + J86: "09", + J90: "", + J91: "", + J92: "09", + J93: "0189", + J94: "01289", + J95: "01234589", + J96: "019", + J98: "012345689", + J99: "018", + K00: "0123456789", + K01: "01", + K02: "0123489", + K03: "0123456789", + K04: "0123456789", + K05: "0123456", + K06: "01289", + K07: "012345689", + K08: "012389", + K09: "01289", + K10: "012389", + K11: "0123456789", + K12: "012", + K13: "01234567", + K14: "012345689", + K20: "", + K21: "09", + K22: "0123456789", + K23: "018", + K25: "012345679", + K26: "012345679", + K27: "012345679", + K28: "012345679", + K29: "0123456789", + K30: "", + K31: "0123456789", + K35: "019", + K36: "", + K37: "", + K38: "012389", + K40: "012349", + K41: "012349", + K42: "019", + K43: "019", + K44: "019", + K45: "018", + K46: "019", + K50: "0189", + K51: "01234589", + K52: "01289", + K55: "01289", + K56: "01234567", + K57: "01234589", + K58: "09", + K59: "0123489", + K60: "012345", + K61: "01234", + K62: "0123456789", + K63: "01234589", + K65: "089", + K66: "0189", + K67: "01238", + K70: "012349", + K71: "0123456789", + K72: "019", + K73: "01289", + K74: "0123456", + K75: "0123489", + K76: "0123456789", + K77: "08", + K80: "0123458", + K81: "0189", + K82: "0123489", + K83: "01234589", + K85: "012389", + K86: "012389", + K87: "01", + K90: "0123489", + K91: "01234589", + K92: "01289", + K93: "018", + L00: "", + L01: "01", + L02: "0123489", + L03: "012389", + L04: "012389", + L05: "09", + L08: "0189", + L10: "01234589", + L11: "0189", + L12: "012389", + L13: "0189", + L14: "", + L20: "089", + L21: "0189", + L22: "", + L23: "0123456789", + L24: "0123456789", + L25: "01234589", + L26: "", + L27: "01289", + L28: "012", + L29: "012389", + L30: "01234589", + L40: "01234589", + L41: "01234589", + L42: "", + L43: "012389", + L44: "0123489", + L45: "", + L50: "012345689", + L51: "01289", + L52: "", + L53: "012389", + L54: "08", + L55: "01289", + L56: "0123489", + L57: "01234589", + L58: "019", + L59: "089", + L60: "01234589", + L62: "08", + L63: "01289", + L64: "089", + L65: "01289", + L66: "0123489", + L67: "0189", + L68: "012389", + L70: "01234589", + L71: "0189", + L72: "01289", + L73: "01289", + L74: "0123489", + L75: "01289", + L80: "", + L81: "0123456789", + L82: "", + L83: "", + L84: "", + L85: "012389", + L86: "", + L87: "01289", + L88: "", + L89: "", + L90: "012345689", + L91: "089", + L92: "012389", + L93: "012", + L94: "012345689", + L95: "0189", + L97: "", + L98: "012345689", + L99: "08", + M00: "01289", + M01: "01234568", + M02: "012389", + M03: "0126", + M05: "012389", + M06: "0123489", + M07: "0123456", + M08: "0123489", + M09: "0128", + M10: "012349", + M11: "01289", + M12: "0123458", + M13: "0189", + M14: "01234568", + M15: "0123489", + M16: "012345679", + M17: "0123459", + M18: "0123459", + M19: "01289", + M20: "0123456", + M21: "0123456789", + M22: "0123489", + M23: "012345689", + M24: "0123456789", + M25: "0123456789", + M30: "01238", + M31: "0123456789", + M32: "0189", + M33: "0129", + M34: "01289", + M35: "0123456789", + M36: "012348", + M40: "012345", + M41: "01234589", + M42: "019", + M43: "012345689", + M45: "", + M46: "01234589", + M47: "01289", + M48: "01234589", + M49: "0123458", + M50: "012389", + M51: "0123489", + M53: "012389", + M54: "012345689", + M60: "01289", + M61: "0123459", + M62: "012345689", + M63: "01238", + M65: "0123489", + M66: "012345", + M67: "0123489", + M68: "08", + M70: "0123456789", + M71: "01234589", + M72: "0124689", + M73: "018", + M75: "01234589", + M76: "0123456789", + M77: "01234589", + M79: "0123456789", + M80: "01234589", + M81: "012345689", + M82: "018", + M83: "01234589", + M84: "0123489", + M85: "012345689", + M86: "012345689", + M87: "012389", + M88: "089", + M89: "012345689", + M90: "012345678", + M91: "012389", + M92: "0123456789", + M93: "01289", + M94: "012389", + M95: "01234589", + M96: "012345689", + M99: "0123456789", + N00: "0123456789", + N01: "0123456789", + N02: "0123456789", + N03: "0123456789", + N04: "0123456789", + N05: "0123456789", + N06: "0123456789", + N07: "0123456789", + N08: "0123458", + N10: "", + N11: "0189", + N12: "", + N13: "0123456789", + N14: "01234", + N15: "0189", + N16: "0123458", + N17: "01289", + N18: "089", + N19: "", + N20: "0129", + N21: "0189", + N22: "08", + N23: "", + N25: "0189", + N26: "", + N27: "019", + N28: "0189", + N29: "018", + N30: "0123489", + N31: "01289", + N32: "0123489", + N33: "08", + N34: "0123", + N35: "0189", + N36: "012389", + N37: "08", + N39: "0123489", + N40: "", + N41: "012389", + N42: "01289", + N43: "01234", + N44: "", + N45: "09", + N46: "", + N47: "", + N48: "012345689", + N49: "01289", + N50: "0189", + N51: "0128", + N60: "0123489", + N61: "", + N62: "", + N63: "", + N64: "01234589", + N70: "019", + N71: "019", + N72: "", + N73: "012345689", + N74: "012348", + N75: "0189", + N76: "01234568", + N77: "018", + N80: "012345689", + N81: "012345689", + N82: "01234589", + N83: "0123456789", + N84: "012389", + N85: "0123456789", + N86: "", + N87: "0129", + N88: "0123489", + N89: "0123456789", + N90: "0123456789", + N91: "012345", + N92: "0123456", + N93: "089", + N94: "012345689", + N95: "012389", + N96: "", + N97: "0123489", + N98: "012389", + N99: "01234589", + O00: "01289", + O01: "019", + O02: "0189", + O03: "0123456789", + O04: "0123456789", + O05: "0123456789", + O06: "0123456789", + O07: "0123456789", + O08: "0123456789", + O10: "012349", + O11: "", + O12: "012", + O13: "", + O14: "019", + O15: "0129", + O16: "", + O20: "089", + O21: "01289", + O22: "01234589", + O23: "0123459", + O24: "012349", + O25: "", + O26: "0123456789", + O28: "01234589", + O29: "012345689", + O30: "01289", + O31: "0128", + O32: "012345689", + O33: "0123456789", + O34: "0123456789", + O35: "0123456789", + O36: "0123456789", + O40: "", + O41: "0189", + O42: "0129", + O43: "0189", + O44: "01", + O45: "089", + O46: "089", + O47: "019", + O48: "", + O60: "012", + O61: "0189", + O62: "0123489", + O63: "0129", + O64: "01234589", + O65: "01234589", + O66: "01234589", + O67: "089", + O68: "012389", + O69: "01234589", + O70: "01239", + O71: "0123456789", + O72: "0123", + O73: "01", + O74: "0123456789", + O75: "0123456789", + O80: "0189", + O81: "012345", + O82: "01289", + O83: "0123489", + O84: "01289", + O85: "", + O86: "012348", + O87: "012389", + O88: "01238", + O89: "012345689", + O90: "01234589", + O91: "012", + O92: "01234567", + O94: "", + O95: "", + O96: "", + O97: "", + O98: "012345689", + O99: "012345678", + P00: "0123456789", + P01: "0123456789", + P02: "0123456789", + P03: "012345689", + P04: "012345689", + P05: "0129", + P07: "0123", + P08: "012", + P10: "0123489", + P11: "0123459", + P12: "0123489", + P13: "0123489", + P14: "012389", + P15: "012345689", + P20: "019", + P21: "019", + P22: "0189", + P23: "012345689", + P24: "012389", + P25: "01238", + P26: "0189", + P27: "0189", + P28: "01234589", + P29: "0123489", + P35: "012389", + P36: "01234589", + P37: "01234589", + P38: "", + P39: "0123489", + P50: "01234589", + P51: "089", + P52: "012345689", + P53: "", + P54: "012345689", + P55: "0189", + P56: "09", + P57: "089", + P58: "01234589", + P59: "012389", + P60: "", + P61: "012345689", + P70: "0123489", + P71: "0123489", + P72: "01289", + P74: "01234589", + P75: "", + P76: "01289", + P77: "", + P78: "012389", + P80: "089", + P81: "089", + P83: "012345689", + P90: "", + P91: "012345689", + P92: "01234589", + P93: "", + P94: "01289", + P95: "", + P96: "01234589", + Q00: "012", + Q01: "01289", + Q02: "", + Q03: "0189", + Q04: "012345689", + Q05: "0123456789", + Q06: "0123489", + Q07: "089", + Q10: "01234567", + Q11: "0123", + Q12: "0123489", + Q13: "01234589", + Q14: "012389", + Q15: "089", + Q16: "0123459", + Q17: "01234589", + Q18: "0123456789", + Q20: "012345689", + Q21: "0123489", + Q22: "012345689", + Q23: "0123489", + Q24: "012345689", + Q25: "0123456789", + Q26: "012345689", + Q27: "0123489", + Q28: "012389", + Q30: "012389", + Q31: "0123589", + Q32: "01234", + Q33: "012345689", + Q34: "0189", + Q35: "13579", + Q36: "019", + Q37: "01234589", + Q38: "012345678", + Q39: "012345689", + Q40: "012389", + Q41: "01289", + Q42: "012389", + Q43: "0123456789", + Q44: "01234567", + Q45: "012389", + Q50: "0123456", + Q51: "0123456789", + Q52: "0123456789", + Q53: "0129", + Q54: "0123489", + Q55: "012345689", + Q56: "01234", + Q60: "0123456", + Q61: "01234589", + Q62: "012345678", + Q63: "012389", + Q64: "0123456789", + Q65: "012345689", + Q66: "0123456789", + Q67: "012345678", + Q68: "0123458", + Q69: "0129", + Q70: "012349", + Q71: "012345689", + Q72: "0123456789", + Q73: "018", + Q74: "012389", + Q75: "01234589", + Q76: "0123456789", + Q77: "0123456789", + Q78: "012345689", + Q79: "012345689", + Q80: "0123489", + Q81: "01289", + Q82: "01234589", + Q83: "012389", + Q84: "012345689", + Q85: "0189", + Q86: "0128", + Q87: "0123458", + Q89: "01234789", + Q90: "0129", + Q91: "01234567", + Q92: "0123456789", + Q93: "0123456789", + Q95: "01234589", + Q96: "0123489", + Q97: "012389", + Q98: "0123456789", + Q99: "01289", + R00: "0128", + R01: "012", + R02: "", + R03: "01", + R04: "01289", + R05: "", + R06: "012345678", + R07: "01234", + R09: "01238", + R10: "01234", + R11: "", + R12: "", + R13: "", + R14: "", + R15: "", + R16: "012", + R17: "", + R18: "", + R19: "01234568", + R20: "01238", + R21: "", + R22: "0123479", + R23: "012348", + R25: "01238", + R26: "0128", + R27: "08", + R29: "0123468", + R30: "019", + R31: "", + R32: "", + R33: "", + R34: "", + R35: "", + R36: "", + R39: "0128", + R40: "012", + R41: "01238", + R42: "", + R43: "0128", + R44: "01238", + R45: "012345678", + R46: "012345678", + R47: "018", + R48: "0128", + R49: "0128", + R50: "289", + R51: "", + R52: "0129", + R53: "", + R54: "", + R55: "", + R56: "08", + R57: "0189", + R58: "", + R59: "019", + R60: "019", + R61: "019", + R62: "089", + R63: "0123458", + R64: "", + R68: "01238", + R69: "", + R70: "01", + R71: "", + R72: "", + R73: "09", + R74: "089", + R75: "", + R76: "01289", + R77: "01289", + R78: "0123456789", + R79: "089", + R80: "", + R81: "", + R82: "0123456789", + R83: "0123456789", + R84: "0123456789", + R85: "0123456789", + R86: "0123456789", + R87: "0123456789", + R89: "0123456789", + R90: "08", + R91: "", + R92: "", + R93: "012345678", + R94: "012345678", + R95: "", + R96: "01", + R98: "", + R99: "", + S00: "012345789", + S01: "012345789", + S02: "0123456789", + S03: "012345", + S04: "0123456789", + S05: "0123456789", + S06: "0123456789", + S07: "0189", + S08: "0189", + S09: "012789", + S10: "01789", + S11: "012789", + S12: "012789", + S13: "0123456", + S14: "0123456", + S15: "0123789", + S16: "", + S17: "089", + S18: "", + S19: "789", + S20: "0123478", + S21: "012789", + S22: "01234589", + S23: "012345", + S24: "0123456", + S25: "012345789", + S26: "089", + S27: "0123456789", + S28: "01", + S29: "0789", + S30: "012789", + S31: "01234578", + S32: "01234578", + S33: "01234567", + S34: "01234568", + S35: "012345789", + S36: "0123456789", + S37: "0123456789", + S38: "0123", + S39: "06789", + S40: "0789", + S41: "0178", + S42: "01234789", + S43: "01234567", + S44: "012345789", + S45: "0123789", + S46: "0123789", + S47: "", + S48: "019", + S49: "789", + S50: "01789", + S51: "0789", + S52: "0123456789", + S53: "01234", + S54: "0123789", + S55: "012789", + S56: "01234578", + S57: "089", + S58: "019", + S59: "789", + S60: "012789", + S61: "01789", + S62: "012345678", + S63: "01234567", + S64: "01234789", + S65: "012345789", + S66: "0123456789", + S67: "08", + S68: "0123489", + S69: "789", + S70: "01789", + S71: "0178", + S72: "01234789", + S73: "01", + S74: "012789", + S75: "012789", + S76: "012347", + S77: "012", + S78: "019", + S79: "789", + S80: "01789", + S81: "0789", + S82: "0123456789", + S83: "01234567", + S84: "012789", + S85: "012345789", + S86: "0123789", + S87: "08", + S88: "019", + S89: "089", + S90: "0123789", + S91: "01237", + S92: "01234579", + S93: "0123456", + S94: "0123789", + S95: "012789", + S96: "012789", + S97: "018", + S98: "01234", + S99: "789", + T00: "0123689", + T01: "0123689", + T02: "0123456789", + T03: "0123489", + T04: "01234789", + T05: "012345689", + T06: "0123458", + T07: "", + T08: "", + T09: "012345689", + T10: "", + T11: "012345689", + T12: "", + T13: "012345689", + T14: "0123456789", + T15: "0189", + T16: "", + T17: "01234589", + T18: "01234589", + T19: "012389", + T20: "01234567", + T21: "01234567", + T22: "01234567", + T23: "01234567", + T24: "01234567", + T25: "01234567", + T26: "0123456789", + T27: "01234567", + T28: "0123456789", + T29: "01234567", + T30: "01234567", + T31: "0123456789", + T32: "0123456789", + T33: "0123456789", + T34: "0123456789", + T35: "01234567", + T36: "0123456789", + T37: "01234589", + T38: "0123456789", + T39: "0123489", + T40: "0123456789", + T41: "012345", + T42: "012345678", + T43: "012345689", + T44: "0123456789", + T45: "0123456789", + T46: "0123456789", + T47: "0123456789", + T48: "01234567", + T49: "0123456789", + T50: "0123456789", + T51: "012389", + T52: "0123489", + T53: "012345679", + T54: "01239", + T55: "", + T56: "0123456789", + T57: "012389", + T58: "", + T59: "0123456789", + T60: "0123489", + T61: "01289", + T62: "01289", + T63: "012345689", + T64: "", + T65: "012345689", + T66: "", + T67: "0123456789", + T68: "", + T69: "0189", + T70: "0123489", + T71: "", + T73: "012389", + T74: "012389", + T75: "012348", + T78: "0123489", + T79: "0123456789", + T80: "012345689", + T81: "0123456789", + T82: "0123456789", + T83: "012345689", + T84: "0123456789", + T85: "0123456789", + T86: "0123489", + T87: "0123456", + T88: "0123456789", + T90: "01234589", + T91: "01234589", + T92: "012345689", + T93: "012345689", + T94: "01", + T95: "0123489", + T96: "", + T97: "", + T98: "0123", + U04: "9", + U80: "018", + U81: "08", + U88: "", + U89: "89", + U99: "", + V01: "019", + V02: "019", + V03: "019", + V04: "019", + V05: "019", + V06: "019", + V09: "01239", + V10: "0123459", + V11: "0123459", + V12: "0123459", + V13: "0123459", + V14: "0123459", + V15: "0123459", + V16: "0123459", + V17: "0123459", + V18: "0123459", + V19: "012345689", + V20: "0123459", + V21: "0123459", + V22: "0123459", + V23: "0123459", + V24: "0123459", + V25: "0123459", + V26: "0123459", + V27: "0123459", + V28: "0123459", + V29: "012345689", + V30: "012345679", + V31: "012345679", + V32: "012345679", + V33: "012345679", + V34: "012345679", + V35: "012345679", + V36: "012345679", + V37: "012345679", + V38: "012345679", + V39: "012345689", + V40: "012345679", + V41: "012345679", + V42: "012345679", + V43: "012345679", + V44: "012345679", + V45: "012345679", + V46: "012345679", + V47: "012345679", + V48: "012345679", + V49: "012345689", + V50: "012345679", + V51: "012345679", + V52: "012345679", + V53: "012345679", + V54: "012345679", + V55: "012345679", + V56: "012345679", + V57: "012345679", + V58: "012345679", + V59: "012345689", + V60: "012345679", + V61: "012345679", + V62: "012345679", + V63: "012345679", + V64: "012345679", + V65: "012345679", + V66: "012345679", + V67: "012345679", + V68: "012345679", + V69: "012345689", + V70: "012345679", + V71: "012345679", + V72: "012345679", + V73: "012345679", + V74: "012345679", + V75: "012345679", + V76: "012345679", + V77: "012345679", + V78: "012345679", + V79: "012345689", + V80: "0123456789", + V81: "0123456789", + V82: "0123456789", + V83: "012345679", + V84: "012345679", + V85: "012345679", + V86: "012345679", + V87: "0123456789", + V88: "0123456789", + V89: "01239", + V90: "0123456789", + V91: "0123456789", + V92: "0123456789", + V93: "0123456789", + V94: "0123456789", + V95: "0123489", + V96: "01289", + V97: "01238", + V98: "", + V99: "", + W00: "0123456789", + W01: "0123456789", + W02: "0123456789", + W03: "0123456789", + W04: "0123456789", + W05: "0123456789", + W06: "0123456789", + W07: "0123456789", + W08: "0123456789", + W09: "0123456789", + W10: "0123456789", + W11: "0123456789", + W12: "0123456789", + W13: "0123456789", + W14: "0123456789", + W15: "0123456789", + W16: "0123456789", + W17: "0123456789", + W18: "0123456789", + W19: "0123456789", + W20: "0123456789", + W21: "0123456789", + W22: "0123456789", + W23: "0123456789", + W24: "0123456789", + W25: "0123456789", + W26: "0123456789", + W27: "0123456789", + W28: "0123456789", + W29: "0123456789", + W30: "0123456789", + W31: "0123456789", + W32: "0123456789", + W33: "0123456789", + W34: "0123456789", + W35: "0123456789", + W36: "0123456789", + W37: "0123456789", + W38: "0123456789", + W39: "0123456789", + W40: "0123456789", + W41: "0123456789", + W42: "0123456789", + W43: "0123456789", + W44: "0123456789", + W45: "0123456789", + W46: "0123456789", + W49: "0123456789", + W50: "0123456789", + W51: "0123456789", + W52: "0123456789", + W53: "0123456789", + W54: "0123456789", + W55: "0123456789", + W56: "0123456789", + W57: "0123456789", + W58: "0123456789", + W59: "0123456789", + W60: "0123456789", + W64: "0123456789", + W65: "0123456789", + W66: "0123456789", + W67: "0123456789", + W68: "0123456789", + W69: "0123456789", + W70: "0123456789", + W73: "0123456789", + W74: "0123456789", + W75: "0123456789", + W76: "0123456789", + W77: "0123456789", + W78: "0123456789", + W79: "0123456789", + W80: "0123456789", + W81: "0123456789", + W83: "0123456789", + W84: "0123456789", + W85: "0123456789", + W86: "0123456789", + W87: "0123456789", + W88: "0123456789", + W89: "0123456789", + W90: "0123456789", + W91: "0123456789", + W92: "0123456789", + W93: "0123456789", + W94: "0123456789", + W99: "0123456789", + X00: "0123456789", + X01: "0123456789", + X02: "0123456789", + X03: "0123456789", + X04: "0123456789", + X05: "0123456789", + X06: "0123456789", + X08: "0123456789", + X09: "0123456789", + X10: "0123456789", + X11: "0123456789", + X12: "0123456789", + X13: "0123456789", + X14: "0123456789", + X15: "0123456789", + X16: "0123456789", + X17: "0123456789", + X18: "0123456789", + X19: "0123456789", + X20: "0123456789", + X21: "0123456789", + X22: "0123456789", + X23: "0123456789", + X24: "0123456789", + X25: "0123456789", + X26: "0123456789", + X27: "0123456789", + X28: "0123456789", + X29: "0123456789", + X30: "0123456789", + X31: "0123456789", + X32: "0123456789", + X33: "0123456789", + X34: "0123456789", + X35: "0123456789", + X36: "0123456789", + X37: "0123456789", + X38: "0123456789", + X39: "0123456789", + X40: "0123456789", + X41: "0123456789", + X42: "0123456789", + X43: "0123456789", + X44: "0123456789", + X45: "0123456789", + X46: "0123456789", + X47: "0123456789", + X48: "0123456789", + X49: "0123456789", + X50: "0123456789", + X51: "0123456789", + X52: "0123456789", + X53: "0123456789", + X54: "0123456789", + X57: "0123456789", + X58: "0123456789", + X59: "09", + X60: "0123456789", + X61: "0123456789", + X62: "0123456789", + X63: "0123456789", + X64: "0123456789", + X65: "0123456789", + X66: "0123456789", + X67: "0123456789", + X68: "0123456789", + X69: "0123456789", + X70: "0123456789", + X71: "0123456789", + X72: "0123456789", + X73: "0123456789", + X74: "0123456789", + X75: "0123456789", + X76: "0123456789", + X77: "0123456789", + X78: "0123456789", + X79: "0123456789", + X80: "0123456789", + X81: "0123456789", + X82: "0123456789", + X83: "0123456789", + X84: "0123456789", + X85: "0123456789", + X86: "0123456789", + X87: "0123456789", + X88: "0123456789", + X89: "0123456789", + X90: "0123456789", + X91: "0123456789", + X92: "0123456789", + X93: "0123456789", + X94: "0123456789", + X95: "0123456789", + X96: "0123456789", + X97: "0123456789", + X98: "0123456789", + X99: "0123456789", + Y00: "0123456789", + Y01: "0123456789", + Y02: "0123456789", + Y03: "0123456789", + Y04: "0123456789", + Y05: "0123456789", + Y06: "01289", + Y07: "012389", + Y08: "0123456789", + Y09: "0123456789", + Y10: "0123456789", + Y11: "0123456789", + Y12: "0123456789", + Y13: "0123456789", + Y14: "0123456789", + Y15: "0123456789", + Y16: "0123456789", + Y17: "0123456789", + Y18: "0123456789", + Y19: "0123456789", + Y20: "0123456789", + Y21: "0123456789", + Y22: "0123456789", + Y23: "0123456789", + Y24: "0123456789", + Y25: "0123456789", + Y26: "0123456789", + Y27: "0123456789", + Y28: "0123456789", + Y29: "0123456789", + Y30: "0123456789", + Y31: "0123456789", + Y32: "0123456789", + Y33: "0123456789", + Y34: "0123456789", + Y35: "01234567", + Y36: "0123456789", + Y40: "0123456789", + Y41: "01234589", + Y42: "0123456789", + Y43: "012345689", + Y44: "012345679", + Y45: "01234589", + Y46: "012345678", + Y47: "01234589", + Y48: "012345", + Y49: "0123456789", + Y50: "01289", + Y51: "0123456789", + Y52: "0123456789", + Y53: "0123456789", + Y54: "0123456789", + Y55: "01234569", + Y56: "0123456789", + Y57: "0123456789", + Y58: "012345689", + Y59: "012389", + Y60: "0123456789", + Y61: "0123456789", + Y62: "012345689", + Y63: "012345689", + Y64: "0189", + Y65: "0123458", + Y66: "", + Y69: "", + Y70: "01238", + Y71: "01238", + Y72: "01238", + Y73: "01238", + Y74: "01238", + Y75: "01238", + Y76: "01238", + Y77: "01238", + Y78: "01238", + Y79: "01238", + Y80: "01238", + Y81: "01238", + Y82: "01238", + Y83: "012345689", + Y84: "0123456789", + Y85: "09", + Y86: "", + Y87: "012", + Y88: "0123", + Y89: "019", + Y90: "0123456789", + Y91: "01239", + Y95: "", + Y96: "", + Y97: "", + Y98: "", + Z00: "01234568", + Z01: "0123456789", + Z02: "0123456789", + Z03: "012345689", + Z04: "012345689", + Z08: "012789", + Z09: "01234789", + Z10: "01238", + Z11: "012345689", + Z12: "012345689", + Z13: "0123456789", + Z20: "0123456789", + Z21: "", + Z22: "012345689", + Z23: "012345678", + Z24: "0123456", + Z25: "018", + Z26: "089", + Z27: "0123489", + Z28: "01289", + Z29: "01289", + Z30: "01234589", + Z31: "012345689", + Z32: "01", + Z33: "", + Z34: "089", + Z35: "0123456789", + Z36: "01234589", + Z37: "012345679", + Z38: "012345678", + Z39: "012", + Z40: "089", + Z41: "012389", + Z42: "0123489", + Z43: "0123456789", + Z44: "012389", + Z45: "012389", + Z46: "0123456789", + Z47: "089", + Z48: "089", + Z49: "012", + Z50: "0123456789", + Z51: "012345689", + Z52: "0123456789", + Z53: "01289", + Z54: "01234789", + Z55: "0123489", + Z56: "01234567", + Z57: "0123456789", + Z58: "0123456789", + Z59: "0123456789", + Z60: "01234589", + Z61: "0123456789", + Z62: "012345689", + Z63: "0123456789", + Z64: "01234", + Z65: "01234589", + Z70: "012389", + Z71: "0123456789", + Z72: "012345689", + Z73: "012345689", + Z74: "012389", + Z75: "01234589", + Z76: "01234589", + Z80: "0123456789", + Z81: "012348", + Z82: "012345678", + Z83: "01234567", + Z84: "01238", + Z85: "0123456789", + Z86: "01234567", + Z87: "012345678", + Z88: "0123456789", + Z89: "0123456789", + Z90: "012345678", + Z91: "01234568", + Z92: "012345689", + Z93: "012345689", + Z94: "0123456789", + Z95: "01234589", + Z96: "0123456789", + Z97: "0123458", + Z98: "0128", + Z99: "012389", +}; diff --git a/src/_internals/constants/cnpj.ts b/src/_internals/constants/cnpj.ts index 3b1de61c4..93818db80 100644 --- a/src/_internals/constants/cnpj.ts +++ b/src/_internals/constants/cnpj.ts @@ -4,3 +4,10 @@ export const CNPJ_LENGTH = 14; export const CNPJ_FIRST_DIGIT_WEIGHTS = [5, 4, 3, 2, 9, 8, 7, 6, 5, 4, 3, 2]; export const CNPJ_SECOND_DIGIT_WEIGHTS = [6, 5, 4, 3, 2, 9, 8, 7, 6, 5, 4, 3, 2]; + +/** + * Whether a sanitized CNPJ carries a letter, which makes it alphanumeric. The root and the branch + * take the digits `0` to `9` and the upper case letters `A` to `Z`, so the sanitized value is + * upper cased before the test. + */ +export const CNPJ_LETTER_REGEX = /[A-Z]/; diff --git a/src/_internals/constants/cpf.ts b/src/_internals/constants/cpf.ts index 1c7a36256..86e43b10a 100644 --- a/src/_internals/constants/cpf.ts +++ b/src/_internals/constants/cpf.ts @@ -1,2 +1,45 @@ +import { type StateCode } from "./states"; + /** Digits of a CPF. */ export const CPF_LENGTH = 11; + +/** Digits of a CPF ahead of the região fiscal digit. */ +export const CPF_BASE_LENGTH = 8; + +/** + * The região fiscal digit (the 9th digit of a CPF) of each state, as listed by the Receita + * Federal in the folheto "Cadastros: CPF e CNPJ": 1 for DF, GO, MT, MS and TO; 2 for PA, AM, AC, + * AP, RO and RR; 3 for CE, MA and PI; 4 for PE, RN, PB and AL; 5 for BA and SE; 6 for MG; 7 for + * RJ and ES; 8 for SP; 9 for PR and SC; 0 for RS. + * + * @see Official: https://www.gov.br/receitafederal/pt-br/assuntos/educacao-fiscal/educacao_fiscal/folhetos-orientativos/cadastros-dig.pdf + */ +export const CPF_FISCAL_REGION_BY_STATE: Record = { + AC: "2", + AL: "4", + AP: "2", + AM: "2", + BA: "5", + CE: "3", + DF: "1", + ES: "7", + GO: "1", + MA: "3", + MT: "1", + MS: "1", + MG: "6", + PR: "9", + PB: "4", + PA: "2", + PE: "4", + PI: "3", + RN: "4", + RS: "0", + RJ: "7", + RO: "2", + RR: "2", + SC: "9", + SE: "5", + SP: "8", + TO: "1", +}; diff --git a/src/_internals/constants/ibs-cbs.ts b/src/_internals/constants/ibs-cbs.ts new file mode 100644 index 000000000..df9b0a6fb --- /dev/null +++ b/src/_internals/constants/ibs-cbs.ts @@ -0,0 +1,876 @@ +/** + * CST-IBS/CBS (Código de Situação Tributária do IBS e da CBS) table, indexed by the 3 digit + * code, with the description the official table gives each one. + * + * Table version: + * "Tabela de Classificação Tributária do IBS e CBS - Publicada em 23/06/2026", + * the workbook of the Portal Nacional da NF-e ("Documentos" > "Diversos"), divulged by Informe + * Técnico 2025.002 v.1.60 (published on 2026-06-23). The generator always reads the + * newest workbook listed and records it here, so a refresh that picks a new version up shows in + * this header. + * + * Generated by `node ./scripts/ibs-cbs.ts`. Do not edit by hand. + * + * @see Official: https://www.nfe.fazenda.gov.br/portal/exibirArquivo.aspx?conteudo=D5b4Ov84WDg= + * Tabela de Classificação Tributária do IBS e CBS - Publicada em 23/06/2026. + * @see Official: https://www.nfe.fazenda.gov.br/portal/exibirArquivo.aspx?conteudo=jxTMMQeEVM8= + * Informe Técnico 2025.002 v.1.60, which defines the columns of both tables. + * @see Official: https://www.nfe.fazenda.gov.br/portal/listaConteudo.aspx?tipoConteudo=/NJarYc9nus= + * "Documentos" > "Diversos" of the Portal Nacional da NF-e, where every table version is listed. + * @see Official: https://www.planalto.gov.br/ccivil_03/leis/lcp/lcp214.htm + * Lei Complementar nº 214/2025, which institutes the IBS and the CBS. + */ +export const CST_IBS_CBS_TABLE: Record = { + "000": "Tributação integral", + "010": "Tributação com alíquotas uniformes", + "011": "Tributação com alíquotas uniformes reduzidas", + "200": "Alíquota reduzida", + "220": "Alíquota fixa", + "221": "Alíquota fixa proporcional", + "222": "Redução de base de cálculo", + "400": "Isenção", + "410": "Imunidade e não incidência", + "510": "Diferimento", + "515": "Diferimento com redução de alíquota", + "550": "Suspensão", + "620": "Tributação monofásica", + "800": "Transferência de crédito", + "810": "Ajuste de IBS na ZFM", + "811": "Ajustes", + "820": "Tributação em documento específico", + "830": "Exclusão de base de cálculo", +}; + +/** + * cClassTrib (Código de Classificação Tributária do IBS e da CBS) codes in force on the + * generation date, sorted ascending. A row of the workbook whose `dFimVig` (end of validity) + * has passed is left out: that is how the Informe Técnico excludes a classification (220001, + * 220002 and 220003 in v.1.60). The first 3 digits of a code are its CST-IBS/CBS. + * + * Kept apart from the descriptions so that validating a code does not bundle them. + */ +export const CLASS_TRIB_CODES: readonly string[] = [ + "000001", + "000002", + "000003", + "000004", + "000005", + "010001", + "010002", + "011001", + "011002", + "011003", + "011004", + "011005", + "200001", + "200002", + "200003", + "200004", + "200005", + "200006", + "200007", + "200008", + "200009", + "200010", + "200011", + "200012", + "200013", + "200014", + "200015", + "200016", + "200017", + "200018", + "200019", + "200020", + "200021", + "200022", + "200023", + "200024", + "200025", + "200026", + "200027", + "200028", + "200029", + "200030", + "200031", + "200032", + "200033", + "200034", + "200035", + "200036", + "200037", + "200038", + "200039", + "200040", + "200041", + "200042", + "200043", + "200044", + "200045", + "200046", + "200047", + "200048", + "200049", + "200050", + "200051", + "200052", + "200053", + "200054", + "221001", + "221002", + "221003", + "221004", + "222001", + "400001", + "400002", + "410001", + "410002", + "410003", + "410004", + "410005", + "410006", + "410007", + "410008", + "410009", + "410010", + "410011", + "410012", + "410013", + "410014", + "410015", + "410016", + "410017", + "410018", + "410019", + "410020", + "410021", + "410022", + "410023", + "410024", + "410025", + "410026", + "410027", + "410028", + "410029", + "410030", + "410031", + "410032", + "410033", + "410034", + "410035", + "410036", + "410037", + "410999", + "510001", + "515001", + "550001", + "550002", + "550003", + "550004", + "550005", + "550006", + "550007", + "550008", + "550009", + "550010", + "550011", + "550012", + "550013", + "550014", + "550015", + "550016", + "550017", + "550018", + "550019", + "550020", + "550021", + "550022", + "550023", + "550024", + "550025", + "620001", + "620002", + "620003", + "620004", + "620005", + "620006", + "620007", + "800001", + "800002", + "810001", + "811001", + "811002", + "811003", + "820001", + "820002", + "820003", + "820004", + "820005", + "820006", + "820007", + "820008", + "820009", + "830001", +]; + +/** + * The `[name, description]` pair of every code of `CLASS_TRIB_CODES`: the columns "Nome + * cClassTrib" (the short name the table gives for display) and "Descrição cClassTrib" (the + * situation the classification refers to). The legal wording columns ("LC Redação", + * "Regulamento CBS", "Regulamento IBS") are not shipped. + */ +export const CLASS_TRIB_TABLE: Record = { + "000001": [ + "Situações tributadas integralmente pelo IBS e CBS.", + "Situações tributadas integralmente pelo IBS e CBS.", + ], + "000002": [ + "Exploração de via", + "Exploração de via, observado o art. 11 da Lei Complementar nº 214, de 2025.", + ], + "000003": [ + "Regime automotivo - projetos incentivados (art. 311)", + "Regime automotivo - projetos incentivados, observado o art. 311 da Lei Complementar nº 214, de 2025.", + ], + "000004": [ + "Regime automotivo - projetos incentivados (art. 312)", + "Regime automotivo - projetos incentivados, observado o art. 312 da Lei Complementar nº 214, de 2025.", + ], + "000005": [ + "Operação com EAC destinado à mistura com gasolina A, mas com saída do biocombustível com destinação diversa", + "Operação com EAC destinado à mistura com gasolina A, mas com saída do biocombustível com destinação diversa, observado o art. 179 da Lei Complementar nº 214, de 2025.", + ], + "010001": [ + "Operações do FGTS não realizadas pela Caixa Econômica Federal", + "Operações do FGTS não realizadas pela Caixa Econômica Federal, observado o art. 212 da Lei Complementar nº 214, de 2025.", + ], + "010002": ["Operações do serviço financeiro", "Operações do serviço financeiro"], + "011001": [ + "Planos de assistência funerária.", + "Planos de assistência funerária, observado o art. 236 da Lei Complementar nº 214, de 2025.", + ], + "011002": [ + "Planos de assistência à saúde", + "Planos de assistência à saúde, observado o art. 237 da Lei Complementar nº 214, de 2025.", + ], + "011003": [ + "Intermediação de planos de assistência à saúde", + "Intermediação de planos de assistência à saúde, observado o art. 240 da Lei Complementar nº 214, de 2025.", + ], + "011004": [ + "Concursos e prognósticos", + "Concursos e prognósticos, observado o art. 246 da Lei Complementar nº 214, de 2025.", + ], + "011005": [ + "Planos de assistência à saúde de animais domésticos", + "Planos de assistência à saúde de animais domésticos, observado o art. 243 da Lei Complementar nº 214, de 2025.", + ], + "200001": [ + "Serviços de transporte de bens até as zonas de processamento de exportação e bens exportados a partir das zonas de processamento de exportação", + "Serviços de transporte de bens até as zonas de processamento de exportação e bens exportados a partir das zonas de processamento de exportação, observado o art. 103 da Lei Complementar nº 214, de 2025.", + ], + "200002": [ + "Fornecimento ou importação para produtor rural não contribuinte ou TAC", + "Fornecimento ou importação de tratores, máquinas e implementos agrícolas, destinados a produtor rural não contribuinte, e de veículos de transporte de carga destinados a transportador autônomo de carga pessoa física não contribuinte, observado o art. 110 da Lei Complementar nº 214, de 2025.", + ], + "200003": [ + "Vendas de produtos destinados à alimentação humana (Anexo I)", + "Vendas de produtos destinados à alimentação humana relacionados no Anexo I da Lei Complementar nº 214, de 2025, com a especificação das respectivas classificações da NCM/SH, que compõem a Cesta Básica Nacional de Alimentos, criada nos termos do art. 8º da Emenda Constitucional nº 132, de 20 de dezembro de 2023, observado o art. 125 da Lei Complementar nº 214, de 2025.", + ], + "200004": [ + "Fornecimento de dispositivos médicos (Anexo XII)", + "Fornecimento de dispositivos médicos com a especificação das respectivas classificações da NCM/SH previstas no Anexo XII da Lei Complementar nº 214, de 2025, observado o art. 144 da Lei Complementar nº 214, de 2025.", + ], + "200005": [ + "Fornecimento de dispositivos médicos para órgãos da administração pública e entidades de saúde imunes (Anexo IV)", + "Fornecimento de dispositivos médicos com a especificação das respectivas classificações da NCM/SH previstas no Anexo IV da Lei Complementar nº 214, de 2025, quando adquiridos por órgãos da administração pública direta, autarquias, fundações públicas e entidades de saúde imunes, observado o art. 144 da Lei Complementar nº 214, de 2025.", + ], + "200006": [ + "Situação de emergência de saúde pública reconhecida pelo Poder público", + "Situação de emergência de saúde pública reconhecida pelo Poder Legislativo federal, estadual, distrital ou municipal competente, ato conjunto do Ministro da Fazenda e do Comitê Gestor do IBS poderá ser editado, a qualquer momento, para incluir dispositivos não listados no Anexo XII da Lei Complementar nº 214, de 2025, limitada a vigência do benefício ao período e à localidade da emergência de saúde pública, observado o art. 144 da Lei Complementar nº 214, de 2025.", + ], + "200007": [ + "Fornecimento dos dispositivos de acessibilidade próprios para pessoas com deficiência (Anexo XIII)", + "Fornecimento dos dispositivos de acessibilidade próprios para pessoas com deficiência relacionados no Anexo XIII da Lei Complementar nº 214, de 2025, com a especificação das respectivas classificações da NCM/SH, observado o art. 145 da Lei Complementar nº 214, de 2025.", + ], + "200008": [ + "Fornecimento dos dispositivos de acessibilidade próprios para pessoas com deficiência adquiridos por órgãos da administração pública (Anexo V)", + "Fornecimento dos dispositivos de acessibilidade próprios para pessoas com deficiência relacionados no Anexo V da Lei Complementar nº 214, de 2025, com a especificação das respectivas classificações da NCM/SH, quando adquiridos por órgãos da administração pública direta, autarquias, fundações públicas e entidades imunes, observado o art. 145 da Lei Complementar nº 214, de 2025.", + ], + "200009": [ + "Fornecimento dos medicamentos registrados na Anvisa", + "Fornecimento dos medicamentos registrados na Anvisa, observado o art. 146 da Lei Complementar nº 214, de 2025.", + ], + "200010": [ + "Fornecimento dos medicamentos registrados na Anvisa, adquiridos por órgãos da administração pública", + "Fornecimento dos medicamentos registrados na Anvisa, quando adquiridos por órgãos da administração pública direta, autarquias, fundações públicas e entidades imunes, observado o art. 146 da Lei Complementar nº 214, de 2025.", + ], + "200011": [ + "Fornecimento das composições para nutrição enteral e parenteral quando adquiridas por órgãos da administração pública (Anexo VI)", + "Fornecimento das composições para nutrição enteral e parenteral, composições especiais e fórmulas nutricionais destinadas às pessoas com erros inatos do metabolismo relacionadas no Anexo VI da Lei Complementar nº 214, de 2025, com a especificação das respectivas classificações da NCM/SH, quando adquiridas por órgãos da administração pública direta, autarquias e fundações públicas, observado o art. 146 da Lei Complementar nº 214, de 2025.", + ], + "200012": [ + "Situação de emergência de saúde pública reconhecida pelo Poder público", + "Situação de emergência de saúde pública reconhecida pelo Poder Legislativo federal, estadual, distrital ou municipal competente, ato conjunto do Ministro da Fazenda e do Comitê Gestor do IBS poderá ser editado, a qualquer momento, limitada a vigência do benefício ao período e à localidade da emergência de saúde pública, observado o art. 146 da Lei Complementar nº 214, de 2025.", + ], + "200013": [ + "Fornecimento de tampões higiênicos, absorventes higiênicos internos ou externos", + "Fornecimento de tampões higiênicos, absorventes higiênicos internos ou externos, descartáveis ou reutilizáveis, calcinhas absorventes e coletores menstruais, observado o art. 147 da Lei Complementar nº 214, de 2025.", + ], + "200014": [ + "Fornecimento dos produtos hortícolas, frutas e ovos (Anexo XV)", + "Fornecimento dos produtos hortícolas, frutas e ovos, relacionados no Anexo XV da Lei Complementar nº 214 , de 2025, com a especificação das respectivas classificações da NCM/SH e desde que não cozidos, observado o art. 148 da Lei Complementar nº 214, de 2025.", + ], + "200015": [ + "Venda de automóveis de passageiros de fabricação nacional adquiridos por motoristas profissionais ou pessoas com deficiência", + "Venda de automóveis de passageiros de fabricação nacional de, no mínimo, 4 (quatro) portas, inclusive a de acesso ao bagageiro, quando adquiridos por motoristas profissionais que exerçam, comprovadamente, em automóvel de sua propriedade, atividade de condutor autônomo de passageiros, na condição de titular de autorização, permissão ou concessão do poder público, e que destinem o automóvel à utilização na categoria de aluguel (táxi), ou por pessoas com deficiência física, visual, auditiva, deficiência mental severa ou profunda, transtorno do espectro autista, com prejuízos na comunicação social e em padrões restritos ou repetitivos de comportamento de nível moderado ou grave, nos termos da legislação relativa à matéria, observado o disposto no art. 149 da Lei Complementar nº 214, de 2025.", + ], + "200016": [ + "Prestação de serviços de pesquisa e desenvolvimento por Instituição Científica, Tecnológica e de Inovação (ICT)", + "Prestação de serviços de pesquisa e desenvolvimento por Instituição Científica, Tecnológica e de Inovação (ICT) sem fins lucrativos para a administração pública direta, autarquias e fundações públicas ou para o contribuinte sujeito ao regime regular do IBS e da CBS, observado o disposto no art. 156 da Lei Complementar nº 214, de 2025.", + ], + "200017": [ + "Operações relacionadas ao FGTS", + "Operações relacionadas ao FGTS, considerando aquelas necessárias à aplicação da Lei nº 8.036, de 1990, realizadas pelo Conselho Curador ou Secretaria Executiva do FGTS, observado o art. 212 da Lei Complementar nº 214, de 2025.", + ], + "200018": [ + "Operações de resseguro e retrocessão", + "Operações de resseguro e retrocessão ficam sujeitas à incidência à alíquota zero, inclusive quando os prêmios de resseguro e retrocessão forem cedidos ao exterior, observado o art. 223 da Lei Complementar nº 214, de 2025.", + ], + "200019": [ + "Importador dos serviços financeiros contribuinte", + "Importador dos serviços financeiros que seja contribuinte e tenha direito de apropriação de créditos na aquisição do mesmo serviço financeiro no País, observado o art. 231 da Lei Complementar nº 214, de 2025.", + ], + "200020": [ + "Operação praticada por sociedades cooperativas optantes por regime específico do IBS e CBS", + "Operação praticada por sociedades cooperativas optantes por regime específico do IBS e CBS, quando o associado destinar bem ou serviço à cooperativa de que participa, e a cooperativa fornecer bem ou serviço ao associado sujeito ao regime regular do IBS e da CBS, observado o art. 271 da Lei Complementar nº 214, de 2025.", + ], + "200021": [ + "Serviços de transporte público coletivo de passageiros ferroviário e hidroviário", + "Serviços de transporte público coletivo de passageiros ferroviário e hidroviário urbanos, semiurbanos e metropolitanos, observado o art. 285 da Lei Complementar nº 214, de 2025.", + ], + "200022": [ + "Operação originada fora da ZFM que destine bem material industrializado a contribuinte estabelecido na ZFM", + "Operação originada fora da Zona Franca de Manaus que destine bem material industrializado de origem nacional a contribuinte estabelecido na Zona Franca de Manaus que seja habilitado nos termos do art. 442 da Lei Complementar nº 214, de 2025, e sujeito ao regime regular do IBS e da CBS ou optante pelo regime do Simples Nacional de que trata o art. 12 da Lei Complementar nº 123, de 2006, observado o art. 445 da Lei Complementar nº 214, de 2025.", + ], + "200023": [ + "Operação realizada por indústria incentivada que destine bem material intermediário para outra indústria incentivada na ZFM", + "Operação realizada por indústria incentivada que destine bem material intermediário para outra indústria incentivada na Zona Franca de Manaus, desde que a entrega ou disponibilização dos bens ocorra dentro da referida área, observado o art. 448 da Lei Complementar nº 214, de 2025.", + ], + "200024": [ + "Operação originada fora das Áreas de Livre Comércio destinadas a contribuinte estabelecido nas Áreas de Livre Comércio", + "Operação originada fora das Áreas de Livre Comércio que destine bem material industrializado de origem nacional a contribuinte estabelecido nas Áreas de Livre Comércio que seja habilitado nos termos do art. 456 da Lei Complementar nº 214, de 2025, e sujeito ao regime regular do IBS e da CBS ou optante pelo regime do Simples Nacional de que trata o art. 12 da Lei Complementar nº 123, de 2006, observado o art. 463 da Lei Complementar nº 214, de 2025.", + ], + "200025": [ + "Fornecimento dos serviços de educação relacionados ao Programa Universidade para Todos (Prouni)", + "Fornecimento dos serviços de educação relacionados ao Programa Universidade para Todos (Prouni), instituído pela Lei nº 11.096, de 13 de janeiro de 2005, observado o art. 308 da Lei Complementar nº 214, de 2025.", + ], + "200026": [ + "Locação de imóveis localizados nas zonas reabilitadas", + "Locação de imóveis localizados nas zonas reabilitadas, pelo prazo de 5 (cinco) anos, contado da data de expedição do habite-se, e relacionados a projetos de reabilitação urbana de zonas históricas e de áreas críticas de recuperação e reconversão urbanística dos Municípios ou do Distrito Federal, a serem delimitadas por lei municipal ou distrital, observado o art. 158 da Lei Complementar nº 214, de 2025.", + ], + "200027": [ + "Operações de locação, cessão onerosa e arrendamento de bens imóveis", + "Operações de locação, cessão onerosa e arrendamento de bens imóveis, observado o art. 261 da Lei Complementar nº 214, de 2025.", + ], + "200028": [ + "Fornecimento dos serviços de educação (Anexo II)", + "Fornecimento dos serviços de educação relacionados no Anexo II da Lei Complementar nº 214, de 2025, com a especificação das respectivas classificações da Nomenclatura Brasileira de Serviços, Intangíveis e Outras Operações que Produzam Variações no Patrimônio (NBS), observado o art. 129 da Lei Complementar nº 214, de 2025.", + ], + "200029": [ + "Fornecimento dos serviços de saúde humana (Anexo III)", + "Fornecimento dos serviços de saúde humana relacionados no Anexo III da Lei Complementar nº 214, de 2025, com a especificação das respectivas classificações da NBS, observado o art. 130 da Lei Complementar nº 214, de 2025.", + ], + "200030": [ + "Venda dos dispositivos médicos (Anexo IV)", + "Venda dos dispositivos médicos relacionados no Anexo IV da Lei Complementar nº 214, de 2025, com a especificação das respectivas classificações da NCM/SH, observado o art. 131 da Lei Complementar nº 214, de 2025.", + ], + "200031": [ + "Fornecimento dos dispositivos de acessibilidade próprios para pessoas com deficiência (Anexo V)", + "Fornecimento dos dispositivos de acessibilidade próprios para pessoas com deficiência relacionados no Anexo V da Lei Complementar nº 214, de 2025, com a especificação das respectivas classificações da NCM/SH, observado o art. 132 da Lei Complementar nº 214, de 2025.", + ], + "200032": [ + "Fornecimento dos medicamentos registrados na Anvisa ou produzidos por farmácias de manipulação, ressalvados os medicamentos sujeitos à alíquota zero", + "Fornecimento dos medicamentos registrados na Anvisa ou produzidos por farmácias de manipulação, ressalvados os medicamentos sujeitos à alíquota zero de que trata o art. 146 da Lei Complementar nº 214, de 2025, observado o art. 133 da Lei Complementar nº 214, de 2025.", + ], + "200033": [ + "Fornecimento das composições para nutrição enteral e parenteral (Anexo VI)", + "Fornecimento das composições para nutrição enteral e parenteral, composições especiais e fórmulas nutricionais destinadas às pessoas com erros inatos do metabolismo relacionadas no Anexo VI da Lei Complementar nº 214, de 2025, com a especificação das respectivas classificações da NCM/SH, observado o art. 133 da Lei Complementar nº 214, de 2025.", + ], + "200034": [ + "Fornecimento dos alimentos destinados ao consumo humano (Anexo VII)", + "Fornecimento dos alimentos destinados ao consumo humano relacionados no Anexo VII da Lei Complementar nº 214, de 2025, com a especificação das respectivas classificações da NCM/SH, observado o art. 135 da Lei Complementar nº 214, de 2025.", + ], + "200035": [ + "Fornecimento dos produtos de higiene pessoal e limpeza (Anexo VIII)", + "Fornecimento dos produtos de higiene pessoal e limpeza relacionados no Anexo VIII da Lei Complementar nº 214, de 2025, com a especificação das respectivas classificações da NCM/SH, observado o art. 136 da Lei Complementar nº 214, de 2025.", + ], + "200036": [ + "Fornecimento de produtos agropecuários, aquícolas, pesqueiros, florestais e extrativistas vegetais in natura", + "Fornecimento de produtos agropecuários, aquícolas, pesqueiros, florestais e extrativistas vegetais in natura, observado o art. 137 da Lei Complementar nº 214, de 2025.", + ], + "200037": [ + "Fornecimento de serviços ambientais de conservação ou recuperação da vegetação nativa", + "Fornecimento de serviços ambientais de conservação ou recuperação da vegetação nativa, mesmo que fornecidos sob a forma de manejo sustentável de sistemas agrícolas, agroflorestais e agrossilvopastoris, em conformidade com as definições e requisitos da legislação específica, observado o art. 137 da Lei Complementar nº 214, de 2025.", + ], + "200038": [ + "Fornecimento dos insumos agropecuários e aquícolas (Anexo IX)", + "Fornecimento dos insumos agropecuários e aquícolas relacionados no Anexo IX da Lei Complementar nº 214, de 2025, com a especificação das respectivas classificações da NCM/SH e da NBS, observado o art. 138 da Lei Complementar nº 214, de 2025.", + ], + "200039": [ + "Fornecimento dos bens e serviços relacionados com produções nacionais artísticas, culturais, de eventos, jornalísticas e audiovisuais (Anexo X)", + "Fornecimento dos bens e serviços listados no Anexo X da Lei Complementar nº 214, de 2025, com a especificação das respectivas classificações da NCM/SH e NBS, nos casos relacionados com produções nacionais artísticas, culturais, de eventos, jornalísticas e audiovisuais, observado o art. 139 da Lei Complementar nº 214, de 2025.", + ], + "200040": [ + "Fornecimento de serviços de comunicação institucional à administração pública", + "Fornecimento dos seguintes serviços de comunicação institucional à administração pública direta, autarquias e fundações públicas: serviços direcionados ao planejamento, criação, programação e manutenção de páginas eletrônicas da administração pública, ao monitoramento e gestão de suas redes sociais e à otimização de páginas e canais digitais para mecanismos de buscas e produção de mensagens, infográficos, painéis interativos e conteúdo institucional, serviços de relações com a imprensa, que reúnem estratégias organizacionais para promover e reforçar a comunicação dos órgãos e das entidades contratantes com seus públicos de interesse, por meio da interação com profissionais da imprensa, e serviços de relações públicas, que compreendem o esforço de comunicação planejado, coeso e contínuo que tem por objetivo estabelecer adequada percepção da atuação e dos objetivos institucionais, a partir do estímulo à compreensão mútua e da manutenção de padrões de relacionamento e fluxos de informação entre os órgãos e as entidades contratantes e seus públicos de interesse, no País e no exterior, observado o art. 140 da Lei Complementar nº 214, de 2025.", + ], + "200041": [ + "Fornecimento de serviço de educação desportiva (art. 141. I)", + "Operações relacionadas às seguintes atividades desportivas: fornecimento de serviço de educação desportiva, classificado no código 1.2205.12.00 da NBS, observado o art. 141 da Lei Complementar nº 214, de 2025.", + ], + "200042": [ + "Fornecimento de serviço de gestão e exploração do desporto (art. 141. II)", + "Operações relacionadas às seguintes atividades desportivas: gestão e exploração do desporto por associações e clubes esportivos filiados ao órgão estadual ou federal responsável pela coordenação dos desportos, observado o art. 141 da Lei Complementar nº 214, de 2025.", + ], + "200043": [ + "Fornecimento à administração pública dos serviços e dos bens relativos à soberania (Anexo XI)", + "Fornecimento à administração pública direta, autarquias e fundações púbicas dos serviços e dos bens relativos à soberania e à segurança nacional, à segurança da informação e à segurança cibernética relacionados no Anexo XI da Lei Complementar nº 214, de 2025, com a especificação das respectivas classificações da NBS e da NCM/SH, observado o art. 142 da Lei Complementar nº 214, de 2025.", + ], + "200044": [ + "Operações e prestações de serviços de segurança da informação e segurança cibernética desenvolvidos por sociedade que tenha sócio brasileiro (Anexo XI)", + "Operações e prestações de serviços de segurança da informação e segurança cibernética desenvolvidos por sociedade que tenha sócio brasileiro com o mínimo de 20% (vinte por cento) do seu capital social, relacionados no Anexo XI da Lei Complementar nº 214, de 2025, com a especificação das respectivas classificações da NBS e da NCM/SH, observado o art. 142 da Lei Complementar nº 214, de 2025.", + ], + "200045": [ + "Operações relacionadas a projetos de reabilitação urbana de zonas históricas e de áreas críticas de recuperação e reconversão urbanística", + "Operações relacionadas a projetos de reabilitação urbana de zonas históricas e de áreas críticas de recuperação e reconversão urbanística dos Municípios ou do Distrito Federal, a serem delimitadas por lei municipal ou distrital, observado o art. 158 da Lei Complementar nº 214, de 2025.", + ], + "200046": [ + "Operações com bens imóveis", + "Operações com bens imóveis, observado o art. 261 da Lei Complementar nº 214, de 2025.", + ], + "200047": [ + "Bares e Restaurantes", + "Bares e Restaurantes, observado o art. 275 da Lei Complementar nº 214, de 2025.", + ], + "200048": [ + "Hotelaria, Parques de Diversão e Parques Temáticos", + "Hotelaria, Parques de Diversão e Parques Temáticos, observado o art. 281 da Lei Complementar nº 214, de 2025.", + ], + "200049": [ + "Transporte coletivo de passageiros rodoviário, ferroviário e hidroviário", + "Transporte coletivo de passageiros rodoviário, ferroviário e hidroviário intermunicipais e interestaduais, observado o art. 286 da Lei Complementar nº 214, de 2025.", + ], + "200050": [ + "Serviços de transporte aéreo regional coletivo de passageiros ou de carga", + "Serviços de transporte aéreo regional coletivo de passageiros ou de carga, observado o art. 287 da Lei Complementar nº 214, de 2025.", + ], + "200051": [ + "Agências de Turismo", + "Agências de Turismo, observado o art. 289 da Lei Complementar nº 214, de 2025.", + ], + "200052": [ + "Prestação de serviços de profissões intelectuais", + "Prestação de serviços das seguintes profissões intelectuais de natureza científica, literária ou artística, submetidas à fiscalização por conselho profissional: administradores, advogados, arquitetos e urbanistas, assistentes sociais, bibliotecários, biólogos, contabilistas, economistas, economistas domésticos, profissionais de educação física, engenheiros e agrônomos, estatísticos, médicos veterinários e zootecnistas, museólogos, químicos, profissionais de relações públicas, técnicos industriais e técnicos agrícolas, observado o art. 127 da Lei Complementar nº 214, de 2025.", + ], + "200053": [ + "Fornecimento de medicamentos registrados na Anvisa, quando classificados como soros ou vacinas", + "Fornecimento de medicamentos registrados na Anvisa, quando classificados como soros ou vacinas, observado o art. 146 da Lei Complementar nº 214, de 2025.", + ], + "200054": [ + "Fornecimento de bem material pela cooperativa de produção agropecuária a associado não sujeito ao regime regular do IBS e da CBS", + "Fornecimento de bem material pela cooperativa de produção agropecuária a associado não sujeito ao regime regular do IBS e da CBS com anulação de créditos referentes ao bem fornecido, observado o art. 271 da Lei Complementar nº 214, de 2025.", + ], + "221001": [ + "Locação, cessão onerosa ou arrendamento de bem imóvel com alíquota sobre a receita bruta", + "Locação, cessão onerosa ou arrendamento de bem imóvel com alíquota sobre a receita bruta, observado o art. 487 da Lei Complementar nº 214, de 2025.", + ], + "221002": [ + "Incorporação imobiliária submetida ao regime especial de tributação", + "Incorporação imobiliária submetida ao regime especial de tributação, observado o art. 485 da Lei Complementar nº 214, de 2025.", + ], + "221003": [ + "Incorporação imobiliária submetida ao regime especial de tributação", + "Incorporação imobiliária submetida ao regime especial de tributação, observado o art. 485 da Lei Complementar nº 214, de 2025.", + ], + "221004": [ + "Alienação de imóvel decorrente de parcelamento do solo", + "Alienação de imóvel decorrente de parcelamento do solo, observado o art. 486 da Lei Complementar nº 214, de 2025.", + ], + "222001": [ + "Transporte internacional de passageiros, caso os trechos de ida e volta sejam vendidos em conjunto", + "Transporte internacional de passageiros, caso os trechos de ida e volta sejam vendidos em conjunto, a base de cálculo será a metade do valor cobrado, observado o Art. 12 § 8º da Lei Complementar nº 214, de 2025.", + ], + "400001": [ + "Fornecimento de serviços de transporte público coletivo de passageiros rodoviário e metroviário", + "Fornecimento de serviços de transporte público coletivo de passageiros rodoviário e metroviário de caráter urbano, semiurbano e metropolitano, sob regime de autorização, permissão ou concessão pública, observado o art. 157 da Lei Complementar nº 214, de 2025.", + ], + "400002": [ + "Fornecimento de serviços de transporte público coletivo de passageiros rodoviário e metroviário com medição por quilômetro rodado", + "Fornecimento de serviços de transporte público coletivo de passageiros rodoviário e metroviário de caráter urbano, semiurbano e metropolitano, sob regime de autorização, permissão ou concessão pública, com medição por quilômetro rodado, observado o art. 157 da Lei Complementar nº 214, de 2025.", + ], + "410001": [ + "Fornecimento de bonificações quando constem no documento fiscal e que não dependam de evento posterior", + "Fornecimento de bonificações quando constem do respectivo documento fiscal e que não dependam de evento posterior, observado o art. 5º da Lei Complementar nº 214, de 2025.", + ], + "410002": [ + "Transferências entre estabelecimentos pertencentes ao mesmo contribuinte", + "Transferências entre estabelecimentos pertencentes ao mesmo contribuinte, observado o art. 6º da Lei Complementar nº 214, de 2025.", + ], + "410003": [ + "Doações sem contraprestação em benefício do doador", + "Doações que não tenham por objeto bens ou serviços que tenham permitido a apropriação de créditos pelo doador, observado o art. 6º da Lei Complementar nº 214, de 2025.", + ], + "410004": [ + "Exportações de bens e serviços", + "Exportações de bens e serviços, observado o art. 8º da Lei Complementar nº 214, de 2025.", + ], + "410005": [ + "Fornecimentos realizados pela União, pelos Estados, pelo Distrito Federal e pelos Municípios", + "Fornecimentos realizados pela União, pelos Estados, pelo Distrito Federal e pelos Municípios, observado o art. 9º da Lei Complementar nº 214, de 2025.", + ], + "410006": [ + "Fornecimentos realizados por entidades religiosas e templos de qualquer culto", + "Fornecimentos realizados por entidades religiosas e templos de qualquer culto, inclusive suas organizações assistenciais e beneficentes, observado o art. 9º da Lei Complementar nº 214, de 2025.", + ], + "410007": [ + "Fornecimentos realizados por partidos políticos, entidades sindicais e instituições de educação e de assistência social", + "Fornecimentos realizados por partidos políticos, inclusive suas fundações, entidades sindicais dos trabalhadores e instituições de educação e de assistência social, sem fins lucrativos, observado o art. 9º da Lei Complementar nº 214, de 2025.", + ], + "410008": [ + "Fornecimentos de livros, jornais, periódicos e do papel destinado a sua impressão", + "Fornecimentos de livros, jornais, periódicos e do papel destinado a sua impressão, observado o art. 9º da Lei Complementar nº 214, de 2025.", + ], + "410009": [ + "Fornecimentos de fonogramas e videofonogramas musicais produzidos no Brasil", + "Fornecimentos de 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, observado o art. 9º da Lei Complementar nº 214, de 2025.", + ], + "410010": [ + "Fornecimentos de serviço de comunicação nas modalidades de radiodifusão sonora e de sons e imagens de recepção livre e gratuita", + "Fornecimentos de serviço de comunicação nas modalidades de radiodifusão sonora e de sons e imagens de recepção livre e gratuita, observado o art. 9º da Lei Complementar nº 214, de 2025.", + ], + "410011": [ + "Fornecimentos de ouro, quando definido em lei como ativo financeiro ou instrumento cambial", + "Fornecimentos de ouro, quando definido em lei como ativo financeiro ou instrumento cambial, observado o art. 9º da Lei Complementar nº 214, de 2025.", + ], + "410012": [ + "Fornecimento de condomínio edilício não optante pelo regime regular", + "Fornecimento de condomínio edilício não optante pelo regime regular, observado o art. 26 da Lei Complementar nº 214, de 2025.", + ], + "410013": [ + "Exportações de combustíveis", + "Exportações de combustíveis, observado o art. 98 da Lei Complementar nº 214, de 2025.", + ], + "410014": [ + "Fornecimento de produtor rural não contribuinte", + "Fornecimento de produtor rural não contribuinte, observado o art. 164 da Lei Complementar nº 214, de 2025.", + ], + "410015": [ + "Fornecimento por transportador autônomo não contribuinte", + "Fornecimento por transportador autônomo não contribuinte, observado o art. 169 da Lei Complementar nº 214, de 2025.", + ], + "410016": [ + "Fornecimento ou aquisição de resíduos sólidos", + "Fornecimento ou aquisição de resíduos sólidos, observado o art. 170 da Lei Complementar nº 214, de 2025.", + ], + "410017": [ + "Aquisição de bem móvel com crédito presumido sob condição de revenda realizada", + "Aquisição de bem móvel com crédito presumido sob condição de revenda realizada, observado o art. 171 da Lei Complementar nº 214, de 2025.", + ], + "410018": [ + "Operações relacionadas aos fundos garantidores e executores de políticas públicas", + "Operações relacionadas aos fundos garantidores e executores de políticas públicas, inclusive de habitação, previstos em lei, assim entendidas os serviços prestados ao fundo pelo seu agente operador e por entidade encarregada da sua administração, observado o art. 213 da Lei Complementar nº 214, de 2025.", + ], + "410019": [ + "Exclusão da gorjeta na base de cálculo no fornecimento de alimentação", + "Exclusão da gorjeta na base de cálculo no fornecimento de alimentação, observado o art. 274 da Lei Complementar nº 214, de 2025.", + ], + "410020": [ + "Exclusão do valor de intermediação na base de cálculo no fornecimento de alimentação", + "Exclusão do valor de intermediação na base de cálculo no fornecimento de alimentação, observado o art. 274 da Lei Complementar nº 214, de 2025.", + ], + "410021": [ + "Contribuição de que trata o art. 149-A da Constituição Federal", + "Contribuição de que trata o art. 149-A da Constituição Federal, observado o art. 12 da Lei Complementar nº 214, de 2025.", + ], + "410022": [ + "Consolidação da propriedade do bem pelo credor", + "Consolidação da propriedade pelo credor de bens móveis ou imóveis que tenham sido objeto de garantia, observado o art. 200 da Lei Complementar nº 214, de 2025.", + ], + "410023": [ + "Alienação de bens móveis ou imóveis que tenham sido objeto de garantia em que o prestador da garantia não seja contribuinte", + "Alienação de bens móveis ou imóveis que tenham sido objeto de garantia constituída em favor de credor em que o prestador da garantia não seja contribuinte, observado o art. 200 da Lei Complementar nº 214, de 2025.", + ], + "410024": [ + "Consolidação da propriedade do bem pelo grupo de consórcio", + "Consolidação da propriedade pelo grupo de consórcio de bem que tenha sido objeto de garantia, observado o art. 204 da Lei Complementar nº 214, de 2025.", + ], + "410025": [ + "Alienação de bem que tenha sido objeto de garantia em que o prestador da garantia não seja contribuinte", + "Alienação de bem que tenha sido objeto de garantia constituída em favor do grupo de consórcio em que o prestador da garantia não seja contribuinte, observado o art. 204 da Lei Complementar nº 214, de 2025.", + ], + "410026": [ + "Doação com anulação de crédito", + "Doações sem contraprestação em benefício do doador, com anulação de crédito apropriados pelo doador referente ao fornecimento doado, observado o art. 6º da Lei Complementar nº 214, de 2025.", + ], + "410027": [ + "Exportação de serviço ou de bem imaterial", + "Fornecimento de bens e serviços, desde que vinculados direta e exclusivamente à exportação de bens materiais ou associados à entrega no exterior de bens materiais, observado o art. 6º da Lei Complementar nº 214, de 2025.", + ], + "410028": [ + "Operações com bens imóveis realizadas por pessoas físicas não consideradas contribuintes", + "Operações com bens imóveis realizadas por pessoas físicas não consideradas contribuintes do regime regular do IBS e da CBS, observado o art. 251 da Lei Complementar nº 214, de 2025.", + ], + "410029": [ + "Operações acobertadas somente pelo ICMS", + "Operações não sujeitas à incidência de IBS e de CBS, alcançadas apenas por obrigação acessória do ICMS, observado o art. 4º da Lei Complementar nº 214, de 2025.", + ], + "410030": [ + "Estorno de crédito por perecimento, deteriorização, roubo, furto ou extravio.", + "Estorno de crédito apropriado de bens adquiridos e venham a perecer, deteriorar-se ou ser objeto de roubo, furto ou extravio, observado o art. 47 da Lei Complementar nº 214, de 2025.", + ], + "410031": [ + "Fornecimento em período anterior ao início de vigência de incidências de CBS e IBS", + "Fornecimento em período anterior ao início de vigência de incidências de CBS e IBS, observado o art. 544 da Lei Complementar nº 214, de 2025.", + ], + "410032": [ + "Tributos incidentes na operação que não integram a base de cálculo do IBS e da CBS", + "Tributos incidentes na operação que não integram a base de cálculo do IBS e da CBS, observado o art. 12 da Lei Complementar nº 214, de 2025.", + ], + "410033": [ + "Operações de Fundos de Investimento Imobiliário (FII) e Fundos de Investimento nas Cadeias Produtivas do Agronegócio (Fiagro)", + "Operações com bens imóveis, inclusive operações com direitos reais sobre bens imóveis, realizadas por Fundos de Investimento Imobiliário (FII) e Fundos de Investimento nas Cadeias Produtivas do Agronegócio (Fiagro), observado o art. 26 da Lei Complementar nº 214, de 2025.", + ], + "410034": [ + "Operações de fundos de investimento", + "Fundos de investimento cujo patrimônio seja constituído exclusivamente por aplicações em participações societárias, certificados, direitos, títulos, valores mobiliários e demais ativos financeiros permitidos pela Comissão de Valores Mobiliários, observado o art. 26 da Lei Complementar nº 214, de 2025.", + ], + "410035": [ + "Fornecimento realizado por nanoempreendedor", + "Fornecimento realizado por nanoempreendedor, observado o art. 26 da Lei Complementar nº 214, de 2025.", + ], + "410036": [ + "Descontos incondicionais", + "Descontos incondicionais, observado o art. 12 da Lei Complementar nº 214, de 2025.", + ], + "410037": [ + "Importação os bens materiais sem incidência de IBS e CBS", + "Importação os bens materiais sem incidência de IBS e CBS, observado o art. 66 da Lei Complementar nº 214, de 2025.", + ], + "410999": [ + "Operações não onerosas sem previsão de tributação, não especificadas anteriormente", + "Operações não onerosas sem previsão de tributação, não especificadas anteriormente, observado o art. 4º da Lei Complementar nº 214, de 2025.", + ], + "510001": [ + "Operações, sujeitas a diferimento, com energia elétrica, relativas à importação, geração, comercialização, distribuição e transmissão", + "Operações, sujeitas a diferimento, com energia elétrica ou com direitos a ela relacionados, relativas à importação, geração, comercialização, distribuição e transmissão, observado o art. 28 da Lei Complementar nº 214, de 2025.", + ], + "515001": [ + "Operações, sujeitas a diferimento, com insumos agropecuários e aquícolas (Anexo IX)", + "Operações, sujeitas a diferimento, com insumos agropecuários e aquícolas, observado o art. 138 da Lei Complementar nº 214, de 2025.", + ], + "550001": [ + "Exportações de bens materiais", + "Exportações de bens materiais, observado o art. 82 da Lei Complementar nº 214, de 2025.", + ], + "550002": [ + "Regime de Trânsito", + "Regime de Trânsito, observado o art. 84 da Lei Complementar nº 214, de 2025.", + ], + "550003": [ + "Regimes de Depósito (art. 85)", + "Regimes de Depósito, observado o art. 85 da Lei Complementar nº 214, de 2025.", + ], + "550004": [ + "Regimes de Depósito (art. 87)", + "Regimes de Depósito, observado o art. 87 da Lei Complementar nº 214, de 2025.", + ], + "550005": [ + "Regimes de Depósito (art. 87, Parágrafo único)", + "Regimes de Depósito, observado o art. 87 da Lei Complementar nº 214, de 2025.", + ], + "550006": [ + "Regimes de Permanência Temporária", + "Regimes de Permanência Temporária, observado o art. 88 da Lei Complementar nº 214, de 2025.", + ], + "550007": [ + "Regimes de Aperfeiçoamento", + "Regimes de Aperfeiçoamento, observado o art. 90 da Lei Complementar nº 214, de 2025.", + ], + "550008": [ + "Importação de bens para o Regime de Repetro-Temporário", + "Importação de bens para o Regime de Repetro-Temporário, de que tratam o inciso I do art. 93 da Lei Complementar nº 214, de 2025.", + ], + "550009": [ + "GNL-Temporário", + "GNL-Temporário, de que trata o inciso II do art. 93 da Lei Complementar nº 214, de 2025.", + ], + "550010": [ + "Repetro-Permanente", + "Repetro-Permanente, de que trata o inciso III do art. 93 da Lei Complementar nº 214, de 2025.", + ], + "550011": [ + "Repetro-Industrialização", + "Repetro-Industrialização, de que trata o inciso IV do art. 93 da Lei Complementar nº 214, de 2025.", + ], + "550012": [ + "Repetro-Nacional", + "Repetro-Nacional, de que trata o inciso V do art. 93 da Lei Complementar nº 214, de 2025.", + ], + "550013": [ + "Repetro-Entreposto", + "Repetro-Entreposto, de que trata o inciso VI do art. 93 da Lei Complementar nº 214, de 2025.", + ], + "550014": [ + "Zona de Processamento de Exportação", + "Zona de Processamento de Exportação, observado os arts. 99, 100 e 102 da Lei Complementar nº 214, de 2025.", + ], + "550015": [ + "Regime Tributário para Incentivo à Modernização e à Ampliação da Estrutura Portuária", + "Regime Tributário para Incentivo à Modernização e à Ampliação da Estrutura Portuária - Reporto, observado o art. 105 da Lei Complementar nº 214, de 2025.", + ], + "550016": [ + "Regime Especial de Incentivos para o Desenvolvimento da Infraestrutura", + "Regime Especial de Incentivos para o Desenvolvimento da Infraestrutura - Reidi, observado o art. 106 da Lei Complementar nº 214, de 2025.", + ], + "550017": [ + "Regime Tributário para Incentivo à Atividade Naval - Renaval (Art. 107, I)", + "Fornecimentos de embarcações registradas ou pré-registradas no Registro Especial Brasileiro - REB para incorporação ao ativo imobilizado de adquirente sujeito ao regime regular do IBS e da CBS, observado o art. 107 da Lei Complementar nº 214, de 2025.", + ], + "550018": [ + "Desoneração da aquisição de bens de capital", + "Desoneração da aquisição de bens de capital, observado o art. 109 da Lei Complementar nº 214, de 2025.", + ], + "550019": [ + "Importação de bem material por indústria incentivada para utilização na ZFM", + "Importação de bem material por indústria incentivada para utilização na Zona Franca de Manaus, observado o art. 443 da Lei Complementar nº 214, de 2025.", + ], + "550020": [ + "Áreas de livre comércio", + "Áreas de livre comércio, observado o art. 461 da Lei Complementar nº 214, de 2025.", + ], + "550021": [ + "Industrialização destinada a exportações", + "Fornecimento de produtos agropecuários in natura para contribuinte do regime regular que promova industrialização destinada a exportação, observado o art. 82 da Lei Complementar nº 214, de 2025.", + ], + "550022": [ + "Regime Especial de Incentivos para a Produção de Hidrogênio de Baixa Emissão de Carbono (Rehidro)", + "Regime Especial de Incentivos para a Produção de Hidrogênio de Baixa Emissão de Carbono (Rehidro), observado o art. 106 da Lei Complementar nº 214, de 2025.", + ], + "550023": [ + "Operações com hidrocarbonetos líquidos derivados de petróleo não combustíveis ou de gás natural, inclusive nafta", + "Operações com hidrocarbonetos líquidos derivados de petróleo não combustíveis ou de gás natural, inclusive nafta, observado o art. 172 da Lei Complementar nº 214, de 2025.", + ], + "550024": [ + "Regime Tributário para Incentivo à Atividade Naval - Renaval (Art. 107, II)", + "Importações e nas aquisições no mercado interno de máquinas, equipamentos e veículos destinados a utilização nas atividades de que trata o inciso IIIdo art. 107 efetuadas para incorporação a seu ativo imobilizado, observado o art. 107 da Lei Complementar nº 214, de 2025.", + ], + "550025": [ + "Regime Tributário para Incentivo à Atividade Naval - Renaval (Art. 107, III)", + "Importações e nas aquisições no mercado interno de matérias-primas, produtos intermediários, partes, peças e componentes para utilização na construção, conservação, modernização e reparo de embarcações pré-registradas ou registradas no REB, observado o art. 107 da Lei Complementar nº 214, de 2025.", + ], + "620001": [ + "Tributação monofásica sobre combustíveis", + "Tributação monofásica sobre combustíveis, observados os art. 172 da Lei Complementar nº 214, de 2025.", + ], + "620002": [ + "Tributação monofásica com responsabilidade pela retenção sobre combustíveis", + "Tributação monofásica com responsabilidade pela retenção sobre combustíveis, observado o art. 178 da Lei Complementar nº 214, de 2025.", + ], + "620003": [ + "Tributação monofásica com responsabilidade de retenção de tributos por terceiros", + "Tributação monofásica com responsabilidade de retenção de tributos por terceiros, observado o art. 178 da Lei Complementar nº 214, de 2025.", + ], + "620004": [ + "Tributação monofásica sobre mistura de EAC com gasolina A em percentual superior ao obrigatório", + "Tributação monofásica sobre mistura de EAC com gasolina A em percentual superior ou inferior ao obrigatório, observado o art. 179 da Lei Complementar nº 214, de 2025.", + ], + "620005": [ + "Tributação monofásica sobre mistura de EAC com gasolina A em percentual inferior ao obrigatório", + "Tributação monofásica sobre mistura de EAC com gasolina A em percentual superior ou inferior ao obrigatório, observado o art. 179 da Lei Complementar nº 214, de 2025.", + ], + "620006": [ + "Tributação monofásica sobre combustíveis cobrada anteriormente", + "Tributação monofásica sobre combustíveis cobrada anteriormente, observador o art. 180 da Lei Complementar nº 214, de 2025.", + ], + "620007": [ + "Perecimento, deteriorização, roubo, furto ou extravio no regime monofásico", + "Perecimento, deteriorização, roubo, furto ou extravio no regime monofásico sem estorno de crédito, observado o art. 47 da Lei Complementar nº 214, de 2025.", + ], + "800001": [ + "Fusão, cisão ou incorporação", + "Fusão, cisão ou incorporação, observado o art. 55 da Lei Complementar nº 214, de 2025.", + ], + "800002": [ + "Transferência de crédito do associado, inclusive as cooperativas singulares", + "Transferência de crédito do associado, inclusive as cooperativas singulares, para cooperativa de que participa das operações antecedentes às operações em que fornece bens e serviços e os créditos presumidos, observado o art. 272 da Lei Complementar nº 214, de 2025.", + ], + "810001": [ + "Crédito presumido de IBS sobre o valor apurado nos fornecimentos a partir da ZFM", + "Crédito presumido de IBS sobre o valor apurado nos fornecimentos a partir da Zona Franca de Manaus, observado o art. 450 da Lei Complementar nº 214, de 2025.", + ], + "811001": [ + "Anulação de Crédito por Saídas Imunes/Isentas", + "Anulação de crédito proporcional ao valor das operações imunes e isentas, observado o art. 51 da Lei Complementar nº 214, de 2025.", + ], + "811002": [ + "Débitos de notas fiscais não processadas na apuração", + "Débitos de notas fiscais não processadas na apuração, observado o art. 45 da Lei Complementar nº 214, de 2025.", + ], + "811003": [ + "Desenquadramento do Simples Nacional", + "Débitos apurados após o desenquadramento do regime Simples Nacional, observado o art. 41 da Lei Complementar nº 214, de 2025.", + ], + "820001": [ + "Documento com informações de fornecimento de serviços de planos de assistência à saúde elencados no art. 234 da Lei Complementar nº214, de 2025", + "Documento com informações de fornecimento de serviços de planos de assistência à saúde elencados no art. 234 da Lei Complementar nº 214, de 2025, mas com tributação realizada por outro meio", + ], + "820002": [ + "Documento com informações de fornecimento de serviços de planos de assistência funerária", + "Documento com informações de fornecimento de serviços de planos de assinstência funerária, mas com tributação realizada por outro meio, observado o art. 236 da Lei Complementar nº 214, de 2025.", + ], + "820003": [ + "Documento com informações de fornecimento de serviços de planos de assistência à saúde de animais domésticos", + "Documento com informações de fornecimento de serviços de planos de assinstência à saúde de animais domésticos, mas com tributação realizada por outro meio, observado o art. 243 da Lei Complementar nº 214, de 2025.", + ], + "820004": [ + "Documento com informações de prestação de serviços de consursos de prognósticos", + "Documento com informações de prestação de serviços de consursos de prognósticos, mas com tributação realizada por outro meio, observado o art. 248 da Lei Complementar nº 214, de 2025.", + ], + "820005": [ + "Documento com informações de alienação de bens imóveis", + "Documento com informações de alienação de bens imóveis, mas com tributação realizada por outro meio, observado o art. 254 da Lei Complementar nº 214, de 2025.", + ], + "820006": [ + "Documento com informações de fornecimento de serviços de exploração de via", + "Documento com informações de fornecimento de serviços de exploração de via, mas com tributação realizada por outro meio, observado o art. 11 da Lei Complementar nº 214, de 2025.", + ], + "820007": [ + "Documento com informações de fornecimento de serviços financeiros", + "Documento com informações de fornecimento de serviços financeiros, mas com tributação realizada por outro meio, observado o art. 181 da Lei Complementar nº 214, de 2025.", + ], + "820008": [ + "Documento com informações de fornecimento de serviço continuado, mas com tributação realizada em fatura anterior", + "Documento com informações de fornecimento de serviço continuado, mas com tributação realizada em fatura anterior, observado o art. 10 da Lei Complementar nº 214, de 2025.", + ], + "820009": [ + "Cobrança relativa a fornecimentos declarados em outro documento", + "Cobrança relativa a fornecimentos declarados em outro documento, observado o art. 60 da Lei Complementar nº 214, de 2025.", + ], + "830001": [ + "Documento com exclusão da BC da CBS e do IBS de energia elétrica fornecida pela distribuidora à UC", + "Documento com exclusão da base de cálculo da CBS e do IBS refrente à energia elétrica fornecida pela distribuidora à unidade consumidora, conforme Art 28, parágrafos 3° e 4°.", + ], +}; + +/** Shape a CST-IBS/CBS has to be written in: the 3 digits of the field `CST` (UB13, N 3). */ +export const CST_IBS_CBS_FORMAT_REGEX = /^\d{3}$/; + +/** Shape a cClassTrib has to be written in: the 6 digits of the field `cClassTrib` (UB14, N 6). */ +export const CLASS_TRIB_FORMAT_REGEX = /^\d{6}$/; + +/** Width of a CST-IBS/CBS, which is also the prefix a cClassTrib shares with its CST. */ +export const CST_IBS_CBS_LENGTH = 3; + +/** Width of a cClassTrib. */ +export const CLASS_TRIB_LENGTH = 6; diff --git a/src/_internals/constants/nbs.ts b/src/_internals/constants/nbs.ts new file mode 100644 index 000000000..7390645fd --- /dev/null +++ b/src/_internals/constants/nbs.ts @@ -0,0 +1,1207 @@ +/** + * NBS 2.0 (Nomenclatura Brasileira de Serviços, Intangíveis e Outras Operações que Produzam + * Variações no Patrimônio) descriptions, indexed by the raw 9 digit code. + * + * Built from the official `NBSa_2-0.csv` the MDIC publishes on gov.br, a plain + * `NBS 2.0;DESCRIÇÃO` CSV in ISO-8859-1, the version 2.0 as amended by the Portaria Conjunta + * RFB/SCS 2.000 of 18 December 2018. Only the complete codes are kept: the chapter, position and + * subposition headings of the CSV classify nothing by themselves. + * + * Generated by `node ./scripts/nbs.ts`. Do not edit by hand. + * + * @see Official: https://www.gov.br/mdic/pt-br/assuntos/sdic/comercio-e-servicos/nbs-nomenclatura-brasileira-de-servicos + * The NBS page of the MDIC, which links the CSV and the Anexo I of the Portaria. + * @see Official: https://www.gov.br/mdic/pt-br/images/REPOSITORIO/scs/decos/NBS/NBSa_2-0.csv + * The NBS 2.0 table in CSV. + */ +export const NBS_DESCRIPTIONS: Record = { + "101011100": "Serviços de construção de edificações residenciais de um e dois pavimentos", + "101011200": "Serviços de construção de edificações residenciais com mais de dois pavimentos", + "101012100": "Serviços de construção de edificações industriais", + "101012200": "Serviços de construção de edificações comerciais", + "101012900": + "Serviços de construção de edificações não residenciais não classificados em subposições anteriores", + "101013000": "Serviços de construção de edificações de uso misto (residencial e não residencial)", + "101021100": + "Serviços de construção de autoestradas (exceto autoestradas elevadas), ruas e estradas", + "101021200": "Serviços de construção de ferrovias", + "101021300": + "Serviços de construção de pistas de pouso e decolagem em aeroportos e de infraestrutura aeroportuária", + "101022000": "Serviços de construção de pontes, autoestradas elevadas e túneis", + "101023100": "Serviços de construção de infraestrutura de proteção e acesso aquaviário", + "101023200": "Serviços de construção de infraestrutura de acostagem aquaviária", + "101023300": + "Serviços de construção de infraestrutura terrestre e de obras de engenharia afins nos portos", + "101023400": "Serviços de construção de barragens", + "101023510": "Serviços de construção de adutoras em conduto livre", + "101023520": "Serviços de construção de sistemas de irrigação", + "101023530": + "Serviços de construção relacionada ao controle dos cursos de água, inclusive canalização", + "101024110": + "Serviços de construção de dutos de longo curso para o transporte de petróleo, seus derivados, e gás", + "101024120": + "Serviços de construção de dutos de longo curso para o transporte e escoamento de águas", + "101024190": + "Serviços de construção de dutos de longo curso não classificados em subposições anteriores", + "101024210": "Serviços de construção de linhas de comunicação de longo curso", + "101024220": "Serviços de construção de linhas de transmissão de alta tensão", + "101025100": "Serviços de construção de dutos locais", + "101025210": "Serviços de construção de linhas locais de comunicação", + "101025220": "Serviços de construção de linhas locais de transmissão de baixa e média tensão", + "101025310": "Serviços de construção de sistemas de esgotos", + "101025320": + "Serviços de construção de sistemas de estações para elevação, tratamento e purificação de água", + "101026100": "Serviços de construção de usinas de geração de energia", + "101026900": + "Serviços de construção de instalações industriais não classificados em subposições anteriores", + "101027000": "Serviços de construção de minas e suas unidades industriais", + "101028000": + "Serviços de construção de instalações para recreação e atividades desportivas ao ar livre", + "101029000": + "Serviços de construção de obras de engenharia civil não classificados em subposições anteriores", + "101031000": "Serviços de demolição", + "101032000": "Serviços de preparação de terrenos e de canteiros de obras", + "101033000": "Serviços de escavação e remoção de terra", + "101034100": "Serviços de perfuração de poços de água", + "101034200": "Serviços de instalação de sistemas sépticos", + "101040000": "Serviços de montagem e de edificação de construções pré-fabricadas", + "101051100": "Serviços de estaqueamento", + "101051200": "Serviços de fundação", + "101052100": "Serviços de construção de estruturas de edificações", + "101052200": "Serviços de construção de estruturas de telhados e coberturas", + "101053000": "Serviços de construção de telhados e coberturas e serviços de impermeabilização", + "101054000": "Serviços de concretagem", + "101055000": "Serviços de montagem de estruturas de aço", + "101056000": "Serviços de alvenaria", + "101057000": "Serviços de andaimes", + "101059000": "Serviços especializados de construção não classificados em subposições anteriores", + "101061100": "Serviços de instalação de fiação elétrica e componentes", + "101061200": "Serviços de instalação de alarmes contra incêndio", + "101061300": "Serviços de instalação de sistemas de alarmes antifurto", + "101061400": "Serviços de instalação de antenas residenciais", + "101061900": "Serviços de instalação elétrica não classificados em subposições anteriores", + "101062100": "Serviços de instalação de tubulação para fornecimento de água", + "101062200": "Serviços de instalação de tubulação para escoamento de água", + "101063100": "Serviços de instalação de equipamentos de aquecimento", + "101063200": "Serviços de instalação de equipamentos de ventilação e de ar condicionado", + "101064000": "Serviços de instalação de gás", + "101065000": "Serviços de instalação de isolamentos", + "101066000": "Serviços de instalação de elevadores, esteiras e escadas rolantes", + "101069000": "Serviços de instalação não classificados em subposições anteriores", + "101071000": "Serviços de vidraçaria", + "101072000": "Serviços de gesso e de estuque", + "101073000": "Serviços de pintura", + "101074000": "Serviços de revestimento de pisos e de paredes", + "101075000": "Serviços de carpintaria e de serralharia", + "101076000": "Serviços de instalação de cercas e grades", + "101079000": "Serviços de acabamento não classificados em subposições anteriores", + "102010000": "Serviços de intermediação na distribuição de mercadorias", + "102020000": "Comércio atacadista", + "102030000": "Comércio varejista", + "102040000": "Serviços de despacho aduaneiro", + "102050000": "Serviços de intermediação na comercialização de energia elétrica", + "103011000": "Fornecimento de refeições acompanhado de serviços de restaurante", + "103012100": "Fornecimento de refeições pelo sistema de autosserviço (self-service)", + "103012200": "Fornecimento de comidas rápidas (fast-food)", + "103012900": + "Fornecimento de refeições com serviços limitados de restaurante não classificado em subposições anteriores", + "103013100": "Fornecimento de alimentação para eventos", + "103013200": + "Fornecimento de alimentação para operadores de transportes (comissaria ou catering)", + "103013900": + "Fornecimento de alimentação, incluindo refeições, sob contrato não classificado em subposições anteriores", + "103019000": "Fornecimento de alimentação não classificado em subposições anteriores", + "103020000": "Fornecimento de bebidas em bares, cervejarias e outros", + "103031100": + "Serviços de hospedagem em quartos ou unidades de hospedagem para visitantes, com serviços diários de faxina", + "103031200": + "Serviços de hospedagem em quartos ou unidades de hospedagem para visitantes, sem serviços diários de faxina", + "103031300": + "Serviços de hospedagem em quartos ou unidades de hospedagem para visitantes, em propriedades partilhadas", + "103031400": + "Serviços de hospedagem em quartos ou unidades de hospedagem para visitantes, em quartos de múltipla ocupação", + "103032000": "Serviços de acampamentos turísticos (camping)", + "103039000": "Serviços de hospedagem para visitantes não classificados em subposições anteriores", + "103041000": + "Serviços de hospedagem em quartos ou unidades de hospedagem para estudantes em residências estudantis", + "103042000": + "Serviços de hospedagem em quartos ou unidades de hospedagem para trabalhadores em hotéis ou campos", + "103049000": + "Serviços de hospedagem, exceto para visitantes não classificados em subposições anteriores", + "104011111": + "Serviços de transporte rodoviário local prestados exclusivamente por meio de ônibus", + "104011119": + "Serviços de transporte rodoviário local regular de passageiros, exceto em áreas metropolitanas não classificados em subitens anteriores", + "104011120": + "Serviços de transporte rodoviário local regular de passageiros, em áreas metropolitanas", + "104011210": "Serviços de transporte escolar", + "104011220": "Serviços de transporte para aeroportos (shuttle)", + "104011290": + "Serviços especiais de transporte rodoviário local regular de passageiros não classificados em itens anteriores", + "104011300": "Serviços de táxi", + "104011400": "Serviços de carro com motorista, exceto táxi", + "104011510": "Serviços de fretamento contínuo, local", + "104011520": "Serviços de fretamento eventual ou turístico, local", + "104011610": "Serviços de transporte ferroviário local de passageiros", + "104011620": "Serviços de transporte metroviário (metrô) local de passageiros", + "104011690": + "Serviços de transporte local de passageiros por veículos sobre trilhos não classificados em itens anteriores", + "104011710": "Serviços de transporte rodoviário para passeios turísticos (sightseeing)", + "104011720": "Serviços de transporte ferroviário para passeios turísticos (sightseeing)", + "104011790": + "Serviços de transporte terrestre para passeios turísticos (sightseeing) não classificados em itens anteriores", + "104011900": + "Serviços de transporte terrestre local de passageiros não classificados em subposições anteriores", + "104012110": + "Serviços de transporte aquaviário local de passageiros, por navegação interior, em embarcações para travessia", + "104012120": + "Serviços de transporte aquaviário local de passageiros, por navegação interior, em embarcações para cruzeiros", + "104012190": + "Serviços de transporte aquaviário local de passageiros, por navegação interior não classificados em itens anteriores", + "104012200": "Serviços de transporte aquaviário local de passageiros por fretamento", + "104012300": "Serviços de transporte aquaviário para passeios turísticos (sightseeing)", + "104012900": + "Serviços de transporte aquaviário local de passageiros não classificados em subposições anteriores", + "104013000": "Serviços de transporte integrado local de passageiros", + "104014100": "Serviços de táxi aéreo local", + "104014200": "Serviços de transporte aéreo local de passageiros por fretamento", + "104014300": "Serviços de transporte aéreo para passeios turísticos (sightseeing)", + "104014900": + "Serviços de transporte aéreo local de passageiros não classificados em subposições anteriores", + "104019000": + "Serviços de transporte local de passageiros não classificados não classificados em subposições anteriores", + "104021110": + "Serviços de transporte rodoviário nacional, exceto local, prestados exclusivamente por meio de ônibus", + "104021190": + "Serviços de transporte rodoviário nacional, exceto local, de passageiros, não classificados não classificados em subitens anteriores", + "104021200": + "Serviços especiais de transporte rodoviário nacional, exceto local, regular de passageiros", + "104021310": "Serviços de fretamento contínuo, nacional, exceto local", + "104021320": "Serviços de fretamento eventual ou turístico, nacional, exceto local", + "104021400": "Serviços de transporte ferroviário nacional, exceto local, de passageiros", + "104021900": + "Serviços de transporte terrestre nacional, exceto local, de passageiros não classificados não classificados em subposições anteriores", + "104022110": + "Serviços de transporte aquaviário de passageiros, por navegação interior, em embarcações para travessia", + "104022120": + "Serviços de transporte aquaviário de passageiros, por navegação interior, em embarcações para cruzeiros", + "104022190": + "Serviços de transporte aquaviário nacional, exceto local, de passageiros, por navegação interior não classificados em itens anteriores", + "104022200": "Serviços de transporte aquaviário nacional costeiro de passageiros", + "104022300": + "Serviços de transporte aquaviário nacional, exceto local, de passageiros por fretamento", + "104022900": + "Serviços de transporte aquaviário nacional, exceto local, de passageiros não classificados em subposições anteriores", + "104023100": "Serviços de transporte aéreo nacional, exceto local, regular de passageiros", + "104023200": "Serviços de táxi aéreo nacional, exceto local", + "104023300": + "Serviços de transporte aéreo nacional, exceto local, de passageiros, por fretamento", + "104023900": + "Serviços de transporte aéreo nacional, exceto local, de passageiros não classificados em subposições anteriores", + "104029000": + "Serviços de transporte nacional, exceto local, de passageiros não classificados em subposições anteriores", + "104031110": "Serviços de transporte de passageiros prestados exclusivamente por meio de ônibus", + "104031190": + "Serviços de transporte rodoviário internacional de passageiros não classificados em itens anteriores", + "104031200": "Serviços de transporte rodoviário internacional de passageiros por fretamento", + "104031310": "Serviços de transporte internacional ferroviário de passageiros", + "104031390": + "Serviços de transporte internacional de passageiros por veículos sobre trilhos não classificados em itens anteriores", + "104031900": + "Serviços de transporte terrestre internacional de passageiros não classificados em subposições anteriores", + "104032110": + "Serviços de transporte aquaviário internacional de passageiros, por navegação interior, em embarcações para travessia", + "104032120": + "Serviços de transporte aquaviário internacional de passageiros, por navegação interior, em embarcações para cruzeiros", + "104032190": + "Serviços de transporte aquaviário internacional de passageiros, por navegação interior não classificados em itens anteriores", + "104032200": "Serviços de transporte aquaviário internacional costeiro de passageiros", + "104032300": "Serviços de transporte aquaviário internacional transoceânico de passageiros", + "104032400": "Serviços de transporte aquaviário internacional de passageiros por fretamento", + "104032900": + "Serviços de transporte aquaviário internacional de passageiros não classificados em subposições anteriores", + "104033100": "Serviços de transporte aéreo internacional regular de passageiros", + "104033200": "Serviços de táxi aéreo internacional", + "104033300": "Serviços de transporte aéreo internacional de passageiros por fretamento", + "104033900": + "Serviços de transporte aéreo internacional de passageiros não classificados em subposições anteriores", + "104039000": + "Serviços de transporte internacional de passageiros não classificados em subposições anteriores", + "104041000": "Locação de veículos rodoviários de passageiros com motorista", + "104042000": "Locação de embarcações de passageiros com tripulação", + "104043000": "Locação de aeronaves de passageiros com tripulação", + "104050000": "Afretamento de embarcações de passageiros por tempo", + "105011110": "Serviços de transporte rodoviário de cargas sólidas a granel", + "105011120": "Serviços de transporte rodoviário de cargas líquidas, ou liquefeitas, a granel", + "105011130": "Serviços de transporte rodoviário de cargas gasosas a granel", + "105011210": "Serviços de transporte rodoviário de carga solta, não unitizada", + "105011220": "Serviços de transporte rodoviário de carga unitizada", + "105011230": "Serviços de transporte rodoviário de carga frigorificada ou climatizada", + "105011310": + "Serviços de transporte rodoviário de cargas em contêineres frigorificados ou climatizados", + "105011320": + "Serviços de transporte rodoviário de cargas em contêineres não frigorificados ou climatizados", + "105011410": "Serviços de transporte rodoviário de cargas vivas", + "105011420": + "Serviços de transporte rodoviário de mudanças domésticas e de mobília e outros objetos de escritório", + "105011430": "Serviços de transporte rodoviário de cargas de grande porte", + "105011440": "Serviços de transporte rodoviário de veículos", + "105011451": + "Serviços de transporte rodoviário de combustíveis, lubrificantes e GLP, inclusive apresentados em botijões metálicos", + "105011452": + "Serviços de transporte rodoviário de produtos químicos perigosos, exceto lubrificantes e GLP", + "105011459": + "Serviços de transporte rodoviário de produtos perigosos não classificados em subitens anteriores", + "105011500": "Serviços de transporte rodoviário de cargas postais e malotes", + "105011900": + "Serviços de transporte rodoviário de cargas não classificados em subposições anteriores", + "105012110": "Serviços de transporte ferroviário de cargas sólidas a granel", + "105012120": "Serviços de transporte ferroviário de cargas líquidas, ou liquefeitas, a granel", + "105012130": "Serviços de transporte ferroviário de cargas gasosas a granel", + "105012210": "Serviços de transporte ferroviário de carga solta, não unitizada", + "105012220": "Serviços de transporte ferroviário de carga unitizada", + "105012230": "Serviços de transporte ferroviário de carga frigorificada ou climatizada", + "105012310": + "Serviços de transporte ferroviário de cargas em contêineres frigorificados ou climatizados", + "105012320": + "Serviços de transporte ferroviário de cargas em contêineres não frigorificados ou climatizados", + "105012410": "Serviços de transporte ferroviário de cargas vivas", + "105012421": + "Serviços de transporte ferroviário de combustíveis, lubrificantes e GLP, inclusive apresentados em botijões metálicos", + "105012422": + "Serviços de transporte ferroviário de produtos químicos perigosos, exceto lubrificantes e GLP", + "105012429": + "Serviços de transporte ferroviário de produtos perigosos não classificados em subposições anteriores", + "105012500": "Serviços de transporte ferroviário de bens e valores", + "105012900": + "Serviços de transporte ferroviário de cargas não classificados em subposições anteriores", + "105013100": "Serviços de transporte de petróleo, gás natural e combustível por meio de dutos", + "105013200": "Serviços de transporte de minérios por meio de dutos", + "105013900": + "Serviços de transporte de cargas por meio de dutos não classificados em subposições anteriores", + "105021110": + "Serviços de transporte aquaviário por navegação interior de cargas sólidas, a granel", + "105021120": + "Serviços de transporte aquaviário por navegação interior de cargas líquidas, ou liquefeitas, a granel", + "105021130": + "Serviços de transporte aquaviário por navegação interior de cargas gasosas a granel", + "105021210": + "Serviços de transporte aquaviário por navegação interior de carga solta, não unitizada", + "105021220": "Serviços de transporte aquaviário por navegação interior de carga unitizada", + "105021230": + "Serviços de transporte aquaviário por navegação interior de carga frigorificada ou climatizada", + "105021310": + "Serviços de transporte aquaviário por navegação interior de cargas em contêineres frigorificados ou climatizados", + "105021320": + "Serviços de transporte aquaviário por navegação interior de cargas em contêineres não frigorificados ou climatizados", + "105021410": "Serviços de transporte aquaviário por navegação interior de cargas vivas", + "105021420": + "Serviços de transporte aquaviário por navegação interior de mudanças domésticas e de mobília e outros objetos de escritório", + "105021430": "Serviços de transporte aquaviário por navegação interior de cargas de grande porte", + "105021440": "Serviços de transporte aquaviário por navegação interior de veículos", + "105021451": + "Serviços de transporte aquaviário por navegação interior de combustíveis, lubrificantes e GLP, inclusive apresentado em botijões metálicos", + "105021452": + "Serviços de transporte aquaviário por navegação interior de produtos químicos perigosos, exceto lubrificantes e GLP", + "105021459": + "Serviços de transporte aquaviário por navegação interior de produtos perigosos não classificados em subposições anteriores", + "105021490": + "Serviços de transporte aquaviário por navegação interior de cargas especiais não classificados em subposições anteriores", + "105021900": + "Serviços de transporte aquaviário por navegação interior de cargas não classificados em subposições anteriores", + "105022110": "Serviços de transporte aquaviário costeiro de cargas sólidas a granel", + "105022120": + "Serviços de transporte aquaviário costeiro de cargas líquidas ou liquefeitas, a granel", + "105022130": "Serviços de transporte aquaviário costeiro de cargas gasosas a granel", + "105022210": "Serviços de transporte aquaviário costeiro de carga solta, não unitizada", + "105022220": "Serviços de transporte aquaviário costeiro de carga unitizada", + "105022230": "Serviços de transporte aquaviário costeiro de carga frigorificada ou climatizada", + "105022310": + "Serviços de transporte aquaviário costeiro de cargas em contêineres frigorificados ou climatizados", + "105022320": + "Serviços de transporte aquaviário costeiro de cargas em contêineres não classificados em subposições anteriores", + "105022410": "Serviços de transporte aquaviário costeiro de cargas vivas", + "105022420": + "Serviços de transporte aquaviário costeiro de mudanças domésticas e de mobília e outros objetos de escritório", + "105022430": "Serviços de transporte aquaviário costeiro de cargas de grande porte", + "105022440": "Serviços de transporte aquaviário costeiro de veículos", + "105022451": + "Serviços de transporte aquaviário costeiro de combustíveis, lubrificantes e GLP, inclusive apresentado em botijões metálicos", + "105022452": + "Serviços de transporte aquaviário costeiro de produtos químicos perigosos, exceto lubrificantes e GLP", + "105022459": + "Serviços de transporte aquaviário costeiro de produtos perigosos não classificados em subposições anteriores", + "105022900": + "Serviços de transportes aquaviário costeiro de cargas não classificados em subposições anteriores", + "105023110": "Serviços de transporte aquaviário transoceânico de cargas sólidas a granel", + "105023120": + "Serviços de transporte aquaviário transoceânico de cargas líquidas, ou liquefeitas, a granel", + "105023130": "Serviços de transporte aquaviário transoceânico de cargas gasosas a granel", + "105023210": "Serviços de transporte aquaviário transoceânico de carga solta, não unitizada", + "105023220": "Serviços de transporte aquaviário transoceânico de carga unitizada", + "105023230": + "Serviços de transporte aquaviário transoceânico de carga frigorificada ou climatizada", + "105023310": + "Serviços de transporte aquaviário transoceânico de cargas em contêineres frigorificados ou climatizados", + "105023320": + "Serviços de transporte aquaviário transoceânico de cargas em contêineres não frigorificados ou climatizados", + "105023410": "Serviços de transporte aquaviário transoceânico de cargas vivas", + "105023420": + "Serviços de transporte aquaviário transoceânico de mudanças domésticas e de mobília e outros objetos de escritório", + "105023430": "Serviços de transporte aquaviário transoceânico de cargas de grande porte", + "105023440": "Serviços de transporte aquaviário transoceânico de veículos", + "105023451": + "Serviços de transporte aquaviário transoceânico de combustíveis, lubrificantes e GLP, inclusive apresentado em botijões metálicos", + "105023452": + "Serviços de transporte aquaviário transoceânico de produtos químicos perigosos, exceto lubrificantes e GLP", + "105023459": + "Serviços de transporte aquaviário transoceânico de produtos perigosos não classificados em subposições anteriores", + "105023900": + "Serviços de transporte aquaviário transoceânico de cargas não classificados em subposições anteriores", + "105031100": + "Serviços de transporte aéreo de cargas em contêineres frigorificados ou climatizados", + "105031200": + "Serviços de transporte aéreo de cargas em contêineres não frigorificados ou climatizados", + "105032100": "Serviços de transporte aéreo de produtos perigosos", + "105032200": "Serviços de transporte aéreo de cargas vivas", + "105032300": "Serviços de transporte aéreo de máquinas e veículos", + "105032400": "Serviços de transporte aéreo de produtos perecíveis", + "105032500": "Serviços de transporte aéreo de cargas frágeis", + "105032600": "Serviços de transporte aéreo de cargas controladas", + "105032700": "Serviços de transporte aéreo de valores", + "105032800": + "Serviços de transporte aéreo de cargas postais, remessas expressas e cargas congêneres", + "105032900": + "Serviços de transporte aéreo de cargas especiais não classificados em subposições anteriores", + "105039000": "Serviços de transporte aéreo de cargas não classificados em subposições anteriores", + "105041100": "Serviços de transporte multimodal de cargas sólidas a granel", + "105041200": "Serviços de transporte multimodal de cargas líquidas, ou liquefeitas, a granel", + "105041300": "Serviços de transporte multimodal de cargas gasosas a granel", + "105042100": "Serviços de transporte multimodal de carga solta, não unitizada", + "105042200": "Serviços de transporte multimodal de carga unitizada", + "105042300": "Serviços de transporte multimodal de carga frigorificada ou climatizada", + "105043100": + "Serviços de transporte multimodal de cargas em contêineres frigorificados ou climatizados", + "105043200": + "Serviços de transporte multimodal de cargas em contêineres não frigorificados ou climatizados", + "105044100": "Serviços de transporte multimodal de cargas vivas", + "105044200": + "Serviços de transporte multimodal de mudanças domésticas e de mobília e outros objetos de escritório", + "105044300": "Serviços de transporte multimodal de cargas de grande porte", + "105044400": "Serviços de transporte multimodal de veículos", + "105044510": + "Serviços de transporte multimodal de combustíveis, lubrificantes e GLP, inclusive apresentado em botijões metálicos", + "105044520": + "Serviços de transporte multimodal de produtos químicos perigosos, exceto lubrificantes e GLP", + "105044590": + "Serviços de transporte multimodal de produtos perigosos não classificados em subposições anteriores", + "105044900": + "Serviços de transporte multimodal de cargas especiais não classificados em subposições anteriores", + "105049000": + "Serviços de transporte multimodal de cargas não classificados em subposições anteriores", + "105051000": "Locação de veículos rodoviários de carga com operador", + "105052000": "Locação de embarcações de carga com tripulação", + "105053000": "Locação de aeronaves de carga com tripulação", + "105060000": "Afretamento de embarcações de carga por tempo", + "106011000": "Serviços de manuseio de contêineres", + "106019000": "Serviços de manuseio de cargas não classificados em subposições anteriores", + "106021000": "Serviços de armazenagem frigorificada", + "106022100": "Serviços de armazenagem de petróleo e seus derivados", + "106022200": + "Serviços de armazenagem de combustíveis, lubrificantes e GLP, inclusive apresentado em botijões metálicos", + "106022300": "Serviços de armazenagem de produtos químicos perigosos", + "106022900": + "Serviços de armazenagem de produtos perigosos não classificados em subposições anteriores", + "106023100": "Serviços de armazenagem de granéis sólidos", + "106023200": "Serviços de armazenagem de granéis líquidos ou liquefeitos", + "106023300": "Serviços de armazenagem de granéis gasosos", + "106029000": "Serviços de armazenagem não classificados em subposições anteriores", + "106030000": "Serviços de apoio ao transporte ferroviário", + "106041000": "Serviços de estações rodoviárias", + "106042100": "Serviços de operação de rodovias", + "106042200": "Serviços de operação de pontes e túneis", + "106043000": "Serviços de estacionamento", + "106044000": "Serviços de reboque para veículos particulares e comerciais", + "106049000": + "Serviços de apoio ao transporte rodoviário não classificados em subposições anteriores", + "106051000": "Serviços de operação de portos e canais, exceto manuseio de cargas", + "106052000": "Serviços de praticagem e de atracação", + "106053000": "Serviços de salvamento de embarcações", + "106054000": "Serviços de navegação de apoio", + "106059000": + "Serviços de apoio ao transporte aquaviário não classificados em subposições anteriores", + "106061100": "Serviços de operação aeroportuária, exceto manuseio de cargas", + "106061200": "Serviços de controle de tráfego aéreo", + "106061900": "Serviços de apoio ao transporte aéreo não classificados em subposições anteriores", + "106062000": "Serviços de apoio ao transporte aeroespacial", + "106070000": "Serviços de agenciamento de transporte de cargas", + "106081000": "Serviços de coleta e entrega de cargas no transporte multimodal", + "106082000": "Serviços de unitização ou desunitização de cargas no transporte multimodal", + "106083000": "Serviços de movimentação de cargas no transporte multimodal", + "106084000": + "Serviços de consolidação ou desconsolidação documental de cargas no transporte multimodal", + "106089000": + "Serviços de apoio ao transporte multimodal de cargas não classificados em subposições anteriores", + "106090000": "Serviços de apoio aos transportes não classificados em posições anteriores", + "107010000": "Serviços postais e de telegrama", + "107020000": + "Serviços de coleta, transporte, remessa ou entrega de documentos ou encomendas, exceto remessas expressas", + "107030000": "Serviços de remessas expressas", + "108011000": "Serviços de transmissão de eletricidade", + "108012000": "Serviços de distribuição de eletricidade", + "108021000": + "Serviços de distribuição de água por meio de tubulações, exceto vapor de água e água quente", + "108022000": + "Serviços de distribuição de vapor de água, água quente e ar condicionado por meio de tubulações", + "108023000": "Serviços de distribuição de água, exceto por meio de tubulações", + "108030000": "Serviços de distribuição de gás canalizado", + "109011000": "Serviços de banco central", + "109012100": "Serviços de depósito para pessoas jurídicas", + "109012200": "Serviços de depósito para pessoas físicas", + "109012900": "Serviços de depósito para outros depositantes", + "109013100": "Serviços de financiamentos imobiliários residenciais", + "109013200": "Serviços de financiamentos imobiliários não residenciais", + "109013300": "Serviços de empréstimos e financiamentos pessoais", + "109013400": "Serviços de empréstimos e financiamentos comerciais", + "109013500": "Serviços de empréstimos e financiamentos industriais", + "109013600": "Serviços de empréstimos e financiamentos agropecuários", + "109013900": "Serviços de concessão de crédito não classificados em subposições anteriores", + "109014000": "Serviços de cartão de crédito", + "109015111": + "Arrendamento mercantil financeiro de veículos rodoviários automotores para o transporte de passageiros", + "109015112": + "Arrendamento mercantil financeiro de veículos rodoviários automotores para o transporte de mercadorias", + "109015113": "Arrendamento mercantil financeiro de veículos e equipamentos ferroviários", + "109015114": + "Arrendamento mercantil financeiro de outros equipamentos de transporte terrestre, inclusive de veículos de uso misto", + "109015115": "Arrendamento mercantil financeiro de navios e outras embarcações", + "109015116": "Arrendamento mercantil financeiro de aeronaves", + "109015117": "Arrendamento mercantil financeiro de contêineres", + "109015121": "Arrendamento mercantil financeiro de máquinas e equipamentos agrícolas", + "109015122": "Arrendamento mercantil financeiro de máquinas e equipamentos de construção", + "109015123": + "Arrendamento mercantil financeiro de máquinas e equipamentos para escritórios, exceto computadores", + "109015124": "Arrendamento mercantil financeiro de computadores", + "109015125": "Arrendamento mercantil financeiro de equipamentos de telecomunicação", + "109015129": + "Arrendamento mercantil financeiro de outras máquinas e equipamentos não classificado em subposições anteriores", + "109015210": + "Arrendamento mercantil financeiro de televisões e outros eletroeletrônicos domésticos, bem como seus acessórios", + "109015220": "Arrendamento mercantil financeiro de mídias gravadas", + "109015230": "Arrendamento mercantil financeiro de móveis e eletrodomésticos", + "109015240": "Arrendamento mercantil financeiro de equipamentos para diversão e lazer", + "109015250": "Arrendamento mercantil financeiro de artigos de cama, mesa e banho", + "109015290": + "Arrendamento mercantil financeiro de outras mercadorias não classificado em subposições anteriores", + "109019000": + "Serviços financeiros, exceto bancos de investimento, serviços de seguros e previdência complementar não classificados em subposições anteriores", + "109021000": "Serviços de valoração de ativos", + "109022000": "Serviços de subscrição de valores mobiliários", + "109023000": "Serviços de fusões e aquisições", + "109024000": "Serviços de capital de risco e finanças corporativas", + "109029000": "Serviços de banco de investimento não classificados em subposições anteriores", + "109031100": "Serviços de seguro de vida", + "109031200": "Serviços de previdência complementar aberta", + "109031300": "Serviços de previdência complementar fechada", + "109032100": "Serviços de seguro saúde", + "109032200": "Serviços de seguro de acidentes", + "109033100": "Serviços de seguro de veículos rodoviários", + "109033200": + "Serviços de seguro de veículos e equipamentos para transporte ferroviário, aquaviário e aéreo", + "109033300": "Serviços de seguro de cargas", + "109033400": "Serviços de seguro de outras propriedades", + "109033500": "Serviços de seguro por responsabilidade civil", + "109033600": "Serviços de seguro de crédito e de caução", + "109033700": "Serviços de seguro de viagem", + "109033800": "Serviços de seguro rural", + "109033900": + "Serviços de outros seguros, excluídos os serviços de resseguro não classificados em subposições anteriores", + "109041000": "Serviços de resseguro de vida", + "109042100": "Serviços de resseguro saúde", + "109042200": "Serviços de resseguro de acidentes", + "109043100": "Serviços de resseguro de veículos rodoviários", + "109043200": + "Serviços de resseguro de veículos e equipamentos para transporte ferroviário, aquaviário e aéreo", + "109043300": "Serviços de resseguro de cargas", + "109043400": "Serviços de resseguro de outras propriedades", + "109043500": "Serviços de resseguro de responsabilidade civil", + "109043600": "Serviços de resseguro de crédito e caução", + "109043700": "Serviços de resseguro rural", + "109043900": "Serviços de outros resseguros não classificados em subposições anteriores", + "109044000": "Serviços de retrocessão", + "109051100": "Serviços de corretagem de títulos", + "109051200": "Serviços de corretagem de derivativos e commodities", + "109051300": + "Serviços de compensação de transações financeiras, inclusive com ativos financeiros (clearinghouse)", + "109052100": "Serviços de gestão e administração de carteiras de ativos, exceto fundos de pensão", + "109052200": "Serviços de administração fundos de investimento e fundos de pensão", + "109052300": "Serviços de gestão e administração de trust", + "109053000": "Serviços de guarda e custódia", + "109054000": "Serviços relacionados à administração de mercados financeiros", + "109055000": "Serviços de consultoria financeira", + "109056000": "Serviços de câmbio", + "109057000": "Serviços de classificação de risco (rating)", + "109058000": "Serviços fiduciários", + "109059000": + "Serviços auxiliares aos serviços financeiros não classificados em subposições anteriores", + "109061100": + "Serviços de agenciamento e corretagem de seguros, resseguros e previdência complementar, exceto de seguros saúde", + "109061200": "Serviços de corretagem de seguros saúde", + "109062000": "Serviços de perícia e avaliação de seguros e resseguros", + "109063000": "Serviços atuariais", + "109064000": "Serviços de gestão de fundos de previdência complementar", + "109069000": + "Serviços auxiliares a seguros, resseguros e previdência complementar não classificados em subposições anteriores", + "109070000": "Serviços de seguro de recebíveis", + "109080000": "Fomento comercial (factoring)", + "109091000": "Serviços de holding de patrimônio de empresas subsidiárias", + "109092000": + "Serviços de holding de valores mobiliários e outros ativos financeiros e de fundos e entidades financeiras similares", + "109101000": "Serviços de planos privados de assistência à saúde", + "109102000": "Serviços de corretagem de planos privados de assistência à saúde", + "109109000": + "Serviços de planos privados de assistência à saúde e serviços relacionados não classificados em subposições anteriores", + "109110000": + "Serviços financeiros e serviços relacionados não classificados em posições anteriores", + "110011100": "Serviços de administração e locação de imóveis residenciais", + "110011210": + "Serviços de administração e locação, sublocação, arrendamento, direito de passagem ou permissão de uso, compartilhado ou não, de ferrovia, rodovia, postes, cabos, dutos e condutos de qualquer natureza", + "110011290": "Serviços de administração e locação de outros imóveis não residenciais", + "110012100": "Serviços de intermediação na compra e venda de imóveis residenciais", + "110012200": "Serviços de intermediação na compra e venda de imóveis não residenciais", + "110013000": "Serviços de avaliação de imóveis", + "110014000": "Serviços de consultoria imobiliária", + "110015000": "Serviços de assessoria de gestão condominial", + "110019000": "Serviços imobiliários não classificados em subposições anteriores", + "110021000": "Locação de imóveis residenciais", + "110022000": "Locação de imóveis não residenciais", + "111011100": + "Arrendamento mercantil operacional ou locação de veículos rodoviários automotores para o transporte de até oito passageiros, sem operador", + "111011200": + "Arrendamento mercantil operacional ou locação de veículos rodoviários automotores para o transporte de cargas, sem operador", + "111011300": + "Arrendamento mercantil operacional ou locação de veículos e equipamentos de transporte ferroviário, sem operador", + "111011400": + "Arrendamento mercantil operacional ou locação de outros equipamentos de transporte terrestre, inclusive de veículos de uso misto, sem operador", + "111011500": + "Arrendamento mercantil operacional ou locação de navios e outras embarcações, sem tripulação", + "111011600": "Arrendamento mercantil operacional ou locação de aeronaves, sem tripulação", + "111011700": "Arrendamento mercantil operacional ou locação de contêineres", + "111012000": + "Arrendamento mercantil operacional ou locação de máquinas e equipamentos agrícolas, sem operador", + "111013000": + "Arrendamento mercantil operacional ou locação de máquinas e equipamentos de construção, sem operador", + "111014000": + "Arrendamento mercantil operacional ou locação de máquinas e equipamentos para escritórios, exceto computadores, sem operador", + "111015000": "Arrendamento mercantil operacional ou locação de computadores, sem operador", + "111016000": + "Arrendamento mercantil operacional ou locação de equipamentos de telecomunicação, sem operador", + "111019000": + "Arrendamento mercantil operacional ou locação de máquinas e equipamentos, sem operador, não classificado em subposições anteriores", + "111021000": + "Arrendamento mercantil operacional ou locação de televisão e outros eletroeletrônicos, bem como seus acessórios", + "111022000": "Arrendamento mercantil operacional ou locação de mídias gravadas", + "111023000": "Arrendamento mercantil operacional ou locação de móveis e eletrodomésticos", + "111024000": + "Arrendamento mercantil operacional ou locação de equipamentos para diversão e lazer", + "111025000": "Arrendamento mercantil operacional ou locação de artigos de cama, mesa e banho", + "111026000": "Arrendamento mercantil operacional ou locação de roupas e calçados", + "111029000": + "Arrendamento mercantil operacional ou locação de outras mercadorias não classificado em subposições anteriores", + "111031000": "Licenciamento de direitos de obras literárias", + "111032100": + "Licenciamento de direitos de produção, distribuição ou comercialização de programas de computador (software)", + "111032200": "Licenciamento de direitos de uso de programas de computador (software)", + "111032300": "Licenciamento de direitos sobre bancos de dados", + "111032900": + "Licenciamento de direitos sobre programas de computador (software) e bancos de dados não classificado em subposições anteriores", + "111033100": "Licenciamento de direitos de autor de obras cinematográficas", + "111033200": "Licenciamento de direitos de autor de obras jornalísticas", + "111033300": "Licenciamento de direitos de autor de obras publicitárias", + "111033400": + "Licenciamento de direitos conexos de artistas intérpretes ou executantes em obras audiovisuais", + "111033500": "Licenciamento de direitos conexos de produtores de obras audiovisuais", + "111033610": + "Licenciamento de direitos de obras audiovisuais sobre transmissões de eventos esportivos", + "111033620": + "Licenciamento de direitos de obras audiovisuais sobre transmissões de programas televisivos", + "111033690": + "Licenciamento de direitos de obras audiovisuais sobre outras transmissões televisivas", + "111033900": + "Licenciamento de direitos de obras audiovisuais não classificado em subposições anteriores", + "111034100": "Licenciamento de direitos de autor de obras musicais ou literomusicais", + "111034200": "Licenciamento de direitos conexos de artistas intérpretes ou executantes", + "111034300": "Licenciamento de direitos conexos de produtores de fonogramas", + "111035000": "Licenciamento de direitos relacionados à radiodifusão", + "111039000": + "Licenciamento de direitos de autor e de direitos conexos não classificado em subposições anteriores", + "111041000": "Licenciamento de direitos sobre patentes", + "111042000": "Licenciamento de direitos sobre marcas", + "111043000": "Licenciamento de direitos sobre desenho industrial", + "111049000": + "Licenciamento de direitos sobre a propriedade industrial não classificado em subposições anteriores", + "111051000": "Licenciamento de direitos sobre cultivares", + "111052000": "Licenciamento de direitos sobre topografias de circuitos integrados", + "111053000": "Licenciamento de direitos relativos à informação não divulgada", + "111054100": "Exploração de recursos vegetais, inclusive florestais", + "111054200": "Exploração de recursos minerais", + "111055100": + "Licenciamento de direitos sobre conhecimento tradicional associado a recursos genéticos", + "111055900": + "Licenciamento de direitos sobre conhecimento tradicional não classificado em subposições anteriores", + "111056000": + "Licenciamento de direitos relativos ao acesso a recursos genéticos, exceto os decorrentes do conhecimento tradicional", + "111057000": + "Licenciamento de direitos sobre informações relativas à experiência adquirida no setor industrial, comercial ou científico (know-how)", + "111059000": "Licenciamento de outros direitos não classificado em subposições anteriores", + "111061000": "Cessão temporária de direitos de obras literárias", + "111062000": "Cessão temporária de direitos sobre programas de computador (software)", + "111063100": "Cessão temporária de direitos de autor de obras cinematográficas", + "111063200": "Cessão temporária de direitos de autor de obras jornalísticas", + "111063300": "Cessão temporária de direitos de autor de obras publicitárias", + "111063400": + "Cessão temporária de direitos conexos de artistas intérpretes ou executantes em obras audiovisuais", + "111063500": "Cessão temporária de direitos conexos de produtores de obras audiovisuais", + "111063610": + "Cessão temporária de direitos de obras audiovisuais sobre transmissões de eventos esportivos", + "111063620": + "Cessão temporária de direitos de obras audiovisuais sobre transmissões de programas televisivos", + "111063690": + "Cessão temporária de direitos de obras audiovisuais sobre outras transmissões televisivas", + "111063900": + "Cessão temporária de direitos de obras audiovisuais não classificada em subposições anteriores", + "111064100": "Cessão temporária de direitos de autor de obras musicais e literomusicais", + "111064200": "Cessão temporária de direitos conexos de artistas intérpretes ou executantes", + "111064300": "Cessão temporária de direitos conexos de produtores de fonogramas", + "111065000": "Cessão temporária de direitos relacionados à radiodifusão", + "111069000": + "Cessão temporária de direitos de autor e de direitos conexos não classificada em subposições anteriores", + "111071000": "Cessão definitiva de direitos de obras literárias", + "111072000": "Cessão definitiva de direitos sobre programas de computador (software)", + "111073100": "Cessão definitiva de direitos de obras cinematográficas", + "111073200": "Cessão definitiva de direitos de obras jornalísticas", + "111073300": "Cessão definitiva de direitos de obras publicitárias", + "111073900": + "Cessão definitiva de direitos de obras audiovisuais não classificada em subposições anteriores", + "111074000": "Cessão definitiva de direitos de obras musicais e fonogramas", + "111075000": "Cessão definitiva de direitos relacionados à radiodifusão", + "111079000": + "Cessão definitiva de direitos de autor e de direitos conexos não classificada em subposições anteriores", + "111081000": "Cessão definitiva de direitos sobre patentes", + "111082000": "Cessão definitiva de direitos sobre marcas", + "111083000": "Cessão definitiva de direitos sobre desenho industrial", + "111089000": + "Cessão definitiva de direitos sobre a propriedade industrial não classificada em subposições anteriores", + "111091000": "Cessão definitiva de direitos sobre cultivares", + "111092000": "Cessão definitiva de direitos sobre topografias de circuitos integrados", + "111093000": "Cessão definitiva de direitos relativos à informação não divulgada", + "111099000": "Cessão definitiva de outros direitos não classificada em subposições anteriores", + "111100000": "Franquia", + "112011100": "Serviços de pesquisa e desenvolvimento em ciências físicas", + "112011200": "Serviços de pesquisa e desenvolvimento em química e biologia", + "112011900": + "Serviços de pesquisa e desenvolvimento em ciências não classificadas em subposições anteriores", + "112012000": "Serviços de pesquisa e desenvolvimento em biotecnologia", + "112013100": + "Serviços de pesquisa e desenvolvimento em Tecnologia da Informação e Comunicação (TIC)", + "112013200": "Serviços de pesquisa e desenvolvimento em nanotecnologia", + "112013300": "Serviços de pesquisa e desenvolvimento em engenharia e tecnologia nucleares", + "112013400": + "Serviços de pesquisa e desenvolvimento em engenharia e tecnologia em micro-ondas de potência", + "112013900": + "Serviços de pesquisa e desenvolvimento em engenharia e tecnologia não classificados em subposições anteriores", + "112014000": + "Serviços de pesquisa e desenvolvimento em ciências médicas, odontológicas e farmacêuticas", + "112015000": "Serviços de pesquisa e desenvolvimento em ciências agrárias", + "112019000": + "Serviços de pesquisa e desenvolvimento em ciências, engenharia e tecnologia não classificados em subposições anteriores", + "112021000": "Serviços de pesquisa e desenvolvimento em psicologia", + "112022000": "Serviços de pesquisa e desenvolvimento em ciências econômicas", + "112023000": "Serviços de pesquisa e desenvolvimento em direito", + "112024000": "Serviços de pesquisa e desenvolvimento em línguas e literatura", + "112029000": + "Serviços de pesquisa e desenvolvimento em ciências sociais e humanidades não classificadas em subposições anteriores", + "112030000": "Serviços de pesquisa e desenvolvimento interdisciplinar", + "113011000": "Serviços de representação e consultoria jurídica criminal", + "113012000": + "Serviços de representação e consultoria jurídica em outras áreas do direito, exceto consultoria tributária", + "113013000": + "Serviços de documentação e certificação, exceto os serviços notariais e de registro", + "113014000": "Serviços de arbitragem, conciliação e mediação", + "113019000": "Serviços jurídicos não classificados em subposições anteriores", + "113021100": "Serviços de auditoria contábil", + "113021900": "Serviços de auditoria não classificados em subposições anteriores", + "113022100": "Serviços de contabilidade", + "113022200": "Serviços de escrituração mercantil", + "113022300": "Serviços de folha de pagamento", + "113031000": "Serviços de consultoria tributária para pessoas jurídicas", + "113032000": "Serviços de consultoria tributária para pessoas físicas", + "113040000": "Serviços notariais e de registro", + "114011100": "Serviços de consultoria em gestão estratégica", + "114011200": "Serviços de consultoria em gestão financeira", + "114011300": "Serviços de consultoria em gestão de recursos humanos", + "114011400": "Serviços de consultoria em gestão de marketing", + "114011500": "Serviços de consultoria em gestão operacional", + "114011600": "Serviços de consultoria em gestão energética", + "114011700": "Serviços de consultoria em gestão de cadeia logística", + "114011800": "Serviços de consultoria em gestão hospitalar", + "114011900": + "Serviços de consultoria em gestão empresarial não classificados em subposições anteriores", + "114012100": "Serviços de gestão em processos de negócios", + "114012200": "Serviços de gestão hospitalar", + "114012900": "Serviços de gestão não classificados em subposições anteriores", + "114013100": "Serviços de assessoria de imprensa", + "114013200": "Serviços de relações públicas", + "114013900": "Serviços de assessoria empresarial não classificados em subposições anteriores", + "114021100": "Serviços de consultoria em arquitetura", + "114021200": "Serviços de arquitetura para projetos de construções residenciais", + "114021300": "Serviços de arquitetura para projetos de construções não residenciais", + "114021400": "Serviços de arquitetura para restauração de prédios históricos", + "114021500": + "Serviços de arquitetura relativos ao acompanhamento e fiscalização da execução de projetos arquitetônicos e urbanísticos", + "114022100": "Serviços de planejamento urbano", + "114022200": "Serviços de planejamento de áreas rurais", + "114023100": "Serviços de consultoria em paisagismo", + "114023200": "Serviços de paisagismo, exceto consultoria", + "114029000": + "Serviços de arquitetura, de planejamento urbano e de áreas rurais e de paisagismo não classificados em subposições anteriores", + "114031000": "Serviços de consultoria em engenharia", + "114032110": "Serviços de engenharia para projetos de construção residencial", + "114032120": "Serviços de engenharia para projetos de construção não residencial", + "114032211": "Serviços de engenharia para projetos de exploração de minerais", + "114032212": "Serviços de engenharia para projetos de exploração de petróleo e gás", + "114032213": "Serviços de engenharia para projetos de refino de petróleo e petroquímica", + "114032214": "Serviços de engenharia para projetos de unidades de produção de biocombustíveis", + "114032221": "Serviços de engenharia para projetos de veículos terrestres", + "114032222": "Serviços de engenharia para projetos de embarcações", + "114032223": "Serviços de engenharia para projetos de veículos aéreos e aeroespaciais", + "114032290": + "Serviços de engenharia para outros projetos industriais e de fabricação, exceto para projetos de energia", + "114032300": "Serviços de engenharia para projetos de infraestrutura de transportes", + "114032400": "Serviços de engenharia para projetos de energia", + "114032500": "Serviços de engenharia para projetos de telecomunicações, radiodifusão e televisão", + "114032600": + "Serviços de engenharia para projetos de gerenciamento de resíduos (perigosos e não perigosos)", + "114032700": "Serviços de engenharia para projetos de distribuição de água e rede de esgoto", + "114032900": "Serviços de engenharia para outros projetos", + "114033000": "Serviços de gerenciamento de projetos de construção", + "114039000": "Serviços de engenharia não classificados em subposições anteriores", + "114041100": "Serviços de consultoria geológica e geofísica", + "114041200": "Serviços geofísicos", + "114041300": "Serviços geoquímicos", + "114041400": "Serviços de informações para avaliação e exploração de recursos naturais", + "114041900": + "Serviços geológicos, geofísicos e outros de prospecção não classificados em subposições anteriores", + "114042100": "Serviços topográficos", + "114042200": "Serviços cartográficos", + "114043000": "Serviços meteorológicos e de previsão do tempo", + "114044100": "Serviços de análise e de exames técnicos sobre pureza e composição", + "114044200": "Serviços de análise e de exames técnicos de propriedades físicas", + "114044300": "Serviços de análise e de exames técnicos de sistemas elétricos e mecânicos", + "114044400": "Serviços de inspeção técnica de veículos de transporte rodoviário", + "114044900": + "Serviços de análise e de exames técnicos não classificados em subposições anteriores", + "114051100": "Serviços hospitalares, com ou sem internação, para animais domésticos", + "114051200": "Serviços de atendimento, assistência ou tratamento para animais domésticos", + "114052100": "Serviços hospitalares, com ou sem internação, para animais de corte", + "114052200": "Serviços de atendimento, assistência ou tratamento para animais de corte", + "114053000": "Serviços funerários, de cremação e de embalsamamento de animais", + "114054000": + "Serviços de bancos de órgãos, sangue, sêmen, tecidos, óvulos e outros materiais biológicos", + "114055000": "Planos de atendimento e assistência médico-veterinária", + "114056000": "Serviços de guarda, adestramento, embelezamento e alojamento", + "114059000": "Serviços veterinários não classificados em subposições anteriores", + "114061100": "Serviços de campanhas publicitárias", + "114061200": "Serviços de marketing direto e mala direta", + "114061900": "Serviços de propaganda não classificados em subposições anteriores", + "114062000": "Aquisição ou venda de espaço ou tempo para propaganda, sob comissão", + "114063100": "Venda de espaço para propaganda em mídia impressa, exceto sob comissão", + "114063200": "Venda de tempo para propaganda em rádio e televisão, exceto sob comissão", + "114063300": + "Venda de espaço para propaganda na rede mundial de computadores, exceto sob comissão", + "114063400": "Venda de espaço para propaganda em mídia exterior, exceto sob comissão", + "114063900": + "Venda de espaço ou tempo para propaganda, exceto sob comissão não classificados em subposições anteriores", + "114070000": "Pesquisas de mercado e serviços de pesquisa de opinião pública", + "114081100": "Serviços fotográficos de retratos", + "114081200": "Serviços fotográficos e videográficos para propaganda", + "114081300": "Serviços fotográficos e videográficos de eventos", + "114081400": "Serviços fotográficos especiais", + "114081500": "Serviços de restauração e retoque de fotografias", + "114081900": "Serviços fotográficos e videográficos não classificados em subposições anteriores", + "114082000": "Serviços de processamento de fotografias", + "114091100": "Serviços de design de interiores para espaços comerciais e públicos", + "114091200": "Serviços de design de interiores para espaços residenciais", + "114092100": + "Serviços de desenho industrial de embalagens, expositores de loja e objetos promocionais para comunicação e vendas", + "114092200": + "Serviços de desenho industrial de produtos, utensílios, equipamentos, vestuário, calçados, ornamentos, joias e objetos pessoais", + "114092300": + "Serviços de desenho industrial de máquinas, equipamentos, acessórios e objetos de uso industrial de qualquer natureza", + "114092400": "Serviços de desenho industrial de mobiliários e itens de decoração", + "114092500": + "Serviços de desenho industrial de utensílios e equipamentos eletrodomésticos e eletroeletrônicos", + "114092900": "Serviços de desenho industrial não classificados em subposições anteriores", + "114093000": "Serviços de design de marcas, imagens, objetos gráficos e digitais", + "114099000": "Serviços especializados de design não classificados em subposições anteriores", + "114101000": "Serviços de consultoria ambiental", + "114109000": + "Serviços de consultoria técnica e científica não classificados em subposições anteriores", + "114110000": "Serviços de tradução e de intérpretes", + "114120000": + "Serviços para registros de marcas comerciais e de franquias empresariais, exceto as licenças de uso de direito", + "114130000": "Serviços de prospecção de clientes", + "114140000": "Serviços de prospecção de fornecedores", + "114150000": + "Serviços profissionais, técnicos e gerenciais não classificados em posições anteriores", + "115011000": "Serviços de consultoria em tecnologia da informação (TI)", + "115012000": "Serviços de segurança em tecnologia da informação (TI)", + "115013000": "Serviços de suporte em tecnologia da informação (TI)", + "115021000": + "Serviços de projeto, desenvolvimento e instalação de aplicativos e programas não personalizados (não customizados)", + "115022000": + "Serviços de projeto e desenvolvimento, adaptação e instalação de aplicativos e programas personalizados (customizados)", + "115023000": + "Serviços de projeto e desenvolvimento de estruturas e conteúdo de páginas eletrônicas", + "115024000": "Serviços de projeto e desenvolvimento de estruturas e conteúdo de bancos de dados", + "115025000": "Serviços de integração de sistemas em tecnologia da informação (TI)", + "115029000": + "Serviços de projeto e desenvolvimento de aplicativos e programas em tecnologia da informação (TI) não classificados em subposições anteriores", + "115030000": "Serviços de projeto e desenvolvimento de redes em tecnologia da informação (TI)", + "115040000": "Serviços de projeto e desenvolvimento de topografias de circuitos integrados", + "115050000": "Serviços de projeto de circuitos integrados", + "115061000": "Serviços de hospedagem de sítios eletrônicos na rede mundial de computadores", + "115062100": "Serviços de hospedagem de aplicativos e programas software como serviço (SaaS)", + "115062200": "Serviços de fornecimento de infraestrutura como serviço (IaaS)", + "115062300": "Serviços de fornecimento de plataformas como serviço (PaaS)", + "115062900": + "Serviços de hospedagem de aplicativos e programas não classificados em subposições anteriores", + "115069000": + "Serviços de hospedagem e de disponibilização de infraestrutura em tecnologia da informação (TI) não classificados em subposições anteriores", + "115071000": "Serviços de gerenciamento de redes em tecnologia da informação (TI)", + "115072000": "Serviços de gerenciamento de sistemas computacionais", + "115079000": + "Serviços de gerenciamento de infraestrutura em tecnologia da informação (TI) não classificados em subposições anteriores", + "115080000": "Serviços de manutenção de aplicativos e programas", + "115090000": "Serviços de processamento de dados", + "115100000": + "Serviços de tecnologia da informação (TI) não classificados em subposições anteriores", + "117011100": "Serviços de interconexão pelo uso da rede fixa", + "117011200": "Serviços de interconexão pelo uso de rede móvel", + "117011900": "Serviços de operadoras não classificados em subposições anteriores", + "117012100": "Serviços de chamadas de telecomunicações fixas comutadas", + "117012900": "Serviços de telecomunicações fixas não classificados em subposições anteriores", + "117013100": "Serviços de voz nas telecomunicações móveis", + "117013200": "Serviços de texto nas telecomunicações móveis", + "117013300": + "Serviços de transmissão de dados nas telecomunicações móveis, exceto serviços de texto", + "117013400": "Serviços de telecomunicações móveis para usuários visitantes (roaming)", + "117014000": "Serviços de redes privadas", + "117015100": "Serviços de transmissão de dados local, nacional ou internacional", + "117015200": "Serviços de exploração de linha dedicada local, nacional ou internacional", + "117019000": + "Serviços de telecomunicações, exceto pela rede mundial de computadores, não classificados em subposições anteriores", + "117021000": + "Serviços de fornecimento de infraestrutura de acesso (backbone) à rede mundial de computadores", + "117022100": "Serviços de acesso à rede mundial de computadores por banda estreita", + "117022200": "Serviços de acesso à rede mundial de computadores por banda larga", + "117029000": + "Serviços de telecomunicações pela rede mundial de computadores não classificados em subposições anteriores", + "117031000": + "Serviços de oferta de livros, jornais, periódicos, diretórios e malas diretas de acesso imediato (on-line)", + "117032100": "Serviços de oferta de áudio para download", + "117032200": "Serviços de oferta de áudio de conteúdo contínuo (streaming)", + "117033100": "Serviços de oferta de arquivos contendo filmes e vídeos para download", + "117033200": "Serviços de oferta de filmes e vídeos de conteúdo contínuo (streaming)", + "117039100": "Serviços de oferta de jogos de acesso imediato (on-line)", + "117039200": "Serviços de oferta de conteúdo de portais de busca na rede mundial de computadores", + "117039900": + "Serviços de oferta de outros conteúdos de acesso imediato (on-line) não classificados em subposições anteriores", + "117041000": "Serviços de agências de notícias para jornais e periódicos", + "117042000": "Serviços de agências de notícias para mídia audiovisual", + "117051000": "Serviços de biblioteca", + "117052000": "Serviços de arquivo", + "117061100": "Serviços de programação dos canais de rádio", + "117061200": "Serviços de programação dos canais de televisão", + "117062100": + "Serviços de transmissão de sinais, sons e imagens de rádio e televisão, aberta ou por assinatura", + "117062200": + "Serviços de distribuição de pacotes básicos de programação de televisão por assinatura", + "117062300": + "Serviços de distribuição de pacotes de programação adicional de televisão por assinatura", + "117062400": + 'Serviços de distribuição de programas de televisão por assinatura, na modalidade "pague por exibição" (pay-per-view)', + "117069000": + "Serviços de difusão, programação e distribuição de programas de rádio e televisão não classificados em subposições anteriores", + "118011100": "Serviço de recrutamento e seleção de profissionais executivos", + "118011200": "Serviço de recrutamento e seleção de profissionais, exceto executivos", + "118012100": "Serviços de fornecimento de mão de obra terceirizada, exceto temporária", + "118012200": "Serviços de fornecimento de mão de obra temporária", + "118012900": + "Serviços de fornecimento de mão de obra não classificados em subposições anteriores", + "118021000": "Serviços de investigação", + "118022000": "Serviços de consultoria em segurança", + "118023000": "Serviços de sistemas de segurança", + "118024000": "Serviços de carro-forte", + "118025000": "Serviços de guarda e escolta armada", + "118029000": "Serviços de segurança não classificados em subposições anteriores", + "118031000": "Serviços gerais de limpeza", + "118032100": "Serviços de desinfecção e extermínio de pragas", + "118032200": "Serviços de limpeza de janelas", + "118032900": "Serviços especializados de limpeza não classificados em subposições anteriores", + "118040000": "Serviços de acondicionamento e empacotamento", + "118051100": "Serviços de reservas para transporte aéreo de passageiros", + "118051200": "Serviços de reservas para transporte ferroviário de passageiros", + "118051300": "Serviços de reservas para transporte rodoviário de passageiros", + "118051400": "Serviços de reservas de carros de aluguel", + "118051900": + "Serviços de reservas para transporte de passageiros não classificados em subposições anteriores", + "118052100": "Serviços de reservas de hospedagem, exceto em unidades compartilhadas", + "118052200": "Serviços de reservas e intercâmbio de unidades compartilhadas (time-share)", + "118052300": "Serviços de reservas em cruzeiros", + "118052400": "Serviços de reservas de pacotes turísticos", + "118053100": "Serviços de reservas para centros de convenções, auditórios e salas de exposições", + "118053200": "Serviços de reservas de ingressos para eventos de entretenimento e recreativos", + "118053900": "Serviços de reservas não classificados em subposições anteriores", + "118054000": "Serviços de operadoras de turismo", + "118055000": "Serviços de guias turísticos", + "118056100": "Serviços de promoção turística", + "118056200": "Serviços de informação a visitantes", + "118061000": "Serviços de informação cadastral e análise de crédito", + "118062000": "Serviços de cobrança", + "118063100": "Serviços de call center", + "118063900": + "Serviços de apoio às atividades empresariais por meio de telefone não classificados em subposições anteriores", + "118064000": "Serviços combinados de escritório e apoio administrativo", + "118065100": "Serviços de fotocópias e outros serviços de reprodução de documentos", + "118065200": "Serviços de execução e envio de mala direta e de elaboração de listas de endereços", + "118065300": "Serviços de preparação de documentos", + "118065900": + "Serviços especializados de apoio a escritório não classificados em subposições anteriores", + "118066100": "Serviços de assistência e organização de convenções", + "118066200": "Serviços de assistência e organização de feiras de negócios", + "118066300": "Serviços de assistência e organização de exposições e outros eventos", + "118067000": "Serviços de jardinagem", + "118068100": "Serviços de agenciamento de modelos", + "118068200": "Serviços de agenciamento de artistas", + "118068300": "Serviços de agenciamento de atletas", + "118069000": "Serviços de apoio não classificados em subposições anteriores", + "119011000": "Serviços de apoio à agricultura", + "119012000": "Serviços de apoio à pecuária", + "119013000": "Serviços de apoio à produção florestal (silvicultura)", + "119014000": "Serviços de apoio à pesca", + "119015000": "Serviços de apoio à aquicultura", + "119021000": "Serviços de apoio à extração de petróleo e gás", + "119029000": "Serviços de apoio à mineração não classificados em subposições anteriores", + "119031100": "Serviços de apoio à transmissão de eletricidade", + "119031200": "Serviços de apoio à distribuição de eletricidade", + "119032000": "Serviços de apoio à distribuição de gás por meio de tubulações", + "119033000": + "Serviços de apoio à distribuição de água por meio de tubulações, exceto vapor de água e água quente", + "119034000": + "Serviços de apoio à distribuição de vapor de água, água quente e ar condicionado por meio de tubulações", + "119035000": "Serviços de apoio à distribuição de água, exceto por meio de tubulações", + "120011000": + "Serviços de manutenção e reparação de produtos metálicos, exceto maquinários e equipamentos", + "120012000": + "Serviços de manutenção e reparação de computadores e seus periféricos e de maquinário para escritório", + "120013110": "Serviços de manutenção e reparação de veículos rodoviários motorizados", + "120013120": "Serviços de manutenção e reparação de veículos rodoviários não motorizados", + "120013200": "Serviços de manutenção e reparação de veículos sobre trilhos", + "120013300": "Serviços de manutenção e reparação de veículos aquaviários", + "120013410": + "Serviços de manutenção e reparação de aeronaves, exceto de motores, turborreatores e turbopropulsores aeronáuticos", + "120013420": + "Serviços de manutenção e reparação de motores, turborreatores e turbopropulsores aeronáuticos", + "120013430": "Serviços de manutenção e reparação de foguetes e equipamentos aeroespaciais", + "120013500": "Serviços de manutenção e reparação de veículos militares", + "120013900": + "Serviços de manutenção e reparação de maquinários e equipamentos de transporte não classificados em subposições anteriores", + "120014000": + "Serviços de manutenção e reparação de plataformas, inclusive navios-plataforma, para extração de petróleo e gás", + "120015000": "Serviços de manutenção e reparação de maquinários e equipamentos de uso industrial", + "120016000": "Serviços de manutenção e reparação de maquinários e equipamentos de uso comercial", + "120017000": "Serviços de manutenção e reparação de equipamentos e aparelhos de telecomunicações", + "120018100": "Serviços de manutenção e reparação de aparelhos eletroeletrônicos domésticos", + "120018200": + "Serviços de manutenção e reparação de instrumentos e equipamentos médico-hospitalares, odontológicos, óticos e de precisão", + "120018300": "Serviços de manutenção e reparação de equipamentos militares", + "120018900": + "Serviços de manutenção e reparação de outros maquinários e equipamentos não classificados em subposições anteriores", + "120021000": "Serviços de manutenção e reparação de produtos de couro, calçados, malas e bolsas", + "120022000": "Serviços de manutenção e reparação de relógios e joias", + "120023000": "Serviços de manutenção e reparação de móveis", + "120024000": "Serviços de manutenção de roupas e outros produtos têxteis", + "120029000": + "Serviços de manutenção e reparação de outros bens de consumo não classificados em subposições anteriores", + "120031000": "Serviços de instalação de produtos metálicos, exceto maquinário e equipamentos", + "120032110": "Serviços de montagem sob encomenda de turbinas industriais", + "120032190": + "Serviços de instalação de maquinários, aparelhos e equipamentos industriais não classificados em itens anteriores", + "120032200": + "Serviços de instalação de computadores e seus periféricos e maquinário de escritório", + "120032300": + "Serviços de instalação de equipamentos e aparelhos de comunicação, incluindo de rádio e de televisão", + "120032400": + "Serviços de instalação de maquinários, equipamentos, instrumentos e aparelhos médico-hospitalares, óticos e de precisão", + "120032510": "Serviços de instalação de sensores e sistemas de armas", + "120032520": "Serviços de instalação de maquinários, aparelhos e equipamentos de emprego militar", + "120032610": + "Serviços de montagem sob encomenda de motores, turborreatores e turbopropulsores aeronáuticos", + "120032690": + "Serviços de instalação de maquinários e equipamentos de transporte não classificados em itens anteriores", + "120032900": + "Serviços de instalação de maquinários, aparelhos e equipamentos não classificados em subposições anteriores", + "121011000": "Serviços de editoração", + "121012100": "Serviços de impressão", + "121012200": "Serviços relacionados à impressão", + "121012300": "Serviços de reprodução de mídia gravada", + "121013000": "Serviços de publicação", + "122011100": "Serviços de creche ou entidade equivalente", + "122011200": "Serviços de pré-escola", + "122011900": "Serviços de educação infantil não classificados em subposições anteriores", + "122012000": "Serviços de ensino fundamental", + "122013000": "Serviços de ensino médio", + "122020000": "Serviços de educação técnica de nível médio", + "122031000": "Serviços de ensino fundamental de jovens e adultos", + "122032000": "Serviços de ensino médio de jovens e adultos", + "122041000": "Serviços educacionais de graduação", + "122042000": "Serviços educacionais de pós-graduação", + "122043000": "Serviços educacionais de extensão", + "122044000": "Serviços educacionais de cursos sequenciais", + "122051100": "Serviços de educação com enfoque cultural", + "122051200": "Serviços de educação desportiva e recreacional", + "122051300": "Serviços de educação em línguas estrangeiras e de sinais", + "122051400": "Serviços de palestras e conferências", + "122051900": + "Serviços de educação, inclusive treinamento não classificados em subposições anteriores", + "122052000": "Serviços de apoio aos serviços educacionais", + "123011100": "Serviços cirúrgicos", + "123011200": "Serviços ginecológicos e obstétricos", + "123011300": "Serviços psiquiátricos", + "123011400": "Serviços prestados em Unidades de Terapia Intensiva", + "123011500": "Serviços de atendimento de urgência", + "123011900": "Serviços hospitalares não classificados em subposições anteriores", + "123012100": "Serviços de clínica médica", + "123012200": "Serviços médicos especializados", + "123012300": "Serviços odontológicos", + "123019100": "Serviços de enfermagem", + "123019200": "Serviços de fisioterapia", + "123019300": "Serviços laboratoriais", + "123019400": "Serviços de diagnóstico por imagem", + "123019500": "Serviços de bancos de material biológico humano", + "123019600": "Serviços de ambulância", + "123019700": "Serviços de assistência ao parto e pós-parto", + "123019800": "Serviços de psicologia", + "123019900": "Outros serviços de saúde humana não classificados em subposições anteriores", + "123021000": "Serviços de cuidado em saúde em unidades de acolhimento", + "123022100": "Serviços de assistência a idosos em unidades de acolhimento", + "123022200": + "Serviços de assistência a crianças e adolescentes com deficiência em unidades de acolhimento", + "123022300": "Serviços de assistência a adultos com deficiência em unidades de acolhimento", + "123030000": "Serviços de assistência social com acomodação", + "123041100": "Serviços de reabilitação vocacional para pessoas com deficiência", + "123041200": "Serviços de reabilitação vocacional para desempregados", + "123041900": "Serviço de reabilitação vocacional não classificados nas subposições anteriores", + "123042000": "Serviços de orientação e aconselhamento relacionados a crianças e adolescentes", + "123049000": + "Serviços de assistência social sem acomodação não classificados em subposições anteriores", + "124010000": "Serviços de tratamento de água", + "124021000": "Serviços de esgoto e tratamento de esgotos", + "124022000": "Serviços de esvaziamento e limpeza de fossas sépticas", + "124031100": "Serviços de coleta de resíduos de serviços de saúde e outros resíduos biológicos", + "124031200": + "Serviços de coleta de resíduos perigosos industriais, exceto resíduos de serviços de saúde e outros resíduos biológicos", + "124031900": + "Serviços de coleta de outros resíduos perigosos não classificados em subposições anteriores", + "124032100": "Serviços de coleta de resíduos recicláveis, não perigosos, de origem doméstica", + "124032200": + "Serviços de coleta de resíduos recicláveis, não perigosos, exceto de origem doméstica", + "124033100": "Serviços de coleta de resíduos gerais de origem doméstica", + "124033200": "Serviços de coleta de resíduos gerais, exceto de origem doméstica", + "124041100": "Serviços de triagem, preparação, consolidação e estocagem de resíduos perigosos", + "124041200": "Serviços de demolição e desmantelamento de embarcações, veículos e outros bens", + "124041300": + "Serviços de triagem, preparação, consolidação e estocagem de resíduos recicláveis não perigosos", + "124041900": + "Serviços de triagem, preparação, consolidação e estocagem de resíduos não perigosos, exceto os recicláveis", + "124042100": "Serviços de tratamento de resíduos perigosos", + "124042200": "Serviços de eliminação de resíduos perigosos", + "124043100": + "Serviços de tratamento e eliminação de resíduos não perigosos em aterros sanitários", + "124043200": + "Serviços de tratamento e eliminação de resíduos não perigosos em aterros, exceto os sanitários", + "124043300": "Serviços de incineração de resíduos não perigosos", + "124043900": + "Serviços de tratamento e eliminação de resíduos não perigosos não classificados em subposições anteriores", + "124051100": "Serviços de remediação e limpeza do ar", + "124051200": "Serviços de remediação e limpeza de águas de superfície", + "124051300": "Serviços de remediação e limpeza do solo e de águas subterrâneas", + "124051400": "Serviços de remediação em edificações", + "124052000": "Serviços de contenção, controle e monitoramento de áreas contaminadas", + "124059000": "Serviços de remediação não classificados em subposições anteriores", + "124061000": "Serviços de varrição de vias e áreas públicas", + "124069000": "Serviços de limpeza urbana e similares não classificados em subposições anteriores", + "124070000": "Serviços de proteção ambiental não classificados em posições anteriores", + "125011100": "Serviços de gravação de som em estúdio", + "125011200": "Serviços de gravação de som ao vivo", + "125012100": "Serviços de produção de programas de televisão, videoteipes e filmes", + "125012200": "Serviços de produção de programas de rádio", + "125013100": "Serviços de edição de obras audiovisuais", + "125013200": "Serviços de duplicação e transferência de obras audiovisuais", + "125013300": "Serviços de correção de cor e restauração digital de obras audiovisuais", + "125013400": "Serviços de efeitos visuais em obras audiovisuais", + "125013500": "Serviços de animação", + "125013600": "Serviços de legendas, títulos e dublagem em obras audiovisuais", + "125013700": "Serviços de projeto e edição de som em obras audiovisuais", + "125013900": + "Serviços de pós-produção de obras audiovisuais não classificados em subposições anteriores", + "125014000": "Serviços de agenciamento para a comercialização de obras audiovisuais", + "125015000": "Serviços de projeção de filmes", + "125019000": + "Serviços de produção audiovisual, de apoio e relacionados não classificados em subposições anteriores", + "125021000": "Serviços de organização e promoção de atuações artísticas ao vivo", + "125022000": "Serviços de produção e apresentação de atuações artísticas ao vivo", + "125023000": "Serviços de apoio para atuações artísticas ao vivo", + "125029000": + "Serviços de apresentação e promoção de atuações artísticas e outros serviços de entretenimento ao vivo não classificados em subposições anteriores", + "125031000": "Serviços de atuação artística", + "125032000": + "Serviços de autores, compositores, escultores, pintores e outros artistas, exceto os de atuação artística", + "125041100": "Serviços de museus", + "125041200": "Serviços de preservação e operação de locais e construções históricas", + "125042100": "Serviços de jardins botânico e zoológico", + "125042200": "Serviços de reserva natural, incluindo preservação de vida selvagem", + "125051000": + "Serviços de organização e promoção de eventos desportivos e recreacionais desportivos", + "125052000": "Serviços de clubes desportivos", + "125059000": + "Serviços desportivos e recreacionais desportivos não classificados em subposições anteriores", + "125060000": + "Serviços fornecidos por atletas e desportistas, por conta própria, e serviços de apoio relacionados com desportes e recreação desportiva", + "125071000": "Serviços de parques temáticos de diversão", + "125079000": + "Serviços de parques de diversão e atrações similares não classificados em subposições anteriores", + "125080000": + "Serviços recreativos, culturais e desportivos não classificados em posições anteriores", + "126011000": "Serviços de limpeza de têxteis, exceto quando realizados a seco", + "126012000": "Serviços de limpeza a seco", + "126013000": "Serviços de tinturaria", + "126014000": "Serviços de passadoria de roupas e outros artigos têxteis", + "126019000": "Serviços de lavanderia não classificados em subposições anteriores", + "126021000": "Serviços de cabeleireiros e barbeiros", + "126022000": "Serviços de manicure, pedicure e tratamento cosmético", + "126023000": "Serviços de bem-estar físico", + "126029000": + "Serviços de tratamento de beleza e bem-estar físico não classificados em subposições anteriores", + "126030000": "Serviços funerários, de cremação e de embalsamamento", + "126040000": "Serviços de confecção de roupas e outros artigos têxteis", + "126050000": "Serviços domésticos", + "126060000": "Serviços pessoais não classificados em posições anteriores", +}; + +/** + * Shape an NBS code has to be written in: the 9 digits, optionally split into the printed + * groups of 1, 4, 2 and 2 by a single whitespace or mask character. + */ +export const NBS_FORMAT_REGEX = /^\d[\s.\-/]?\d{4}[\s.\-/]?\d{2}[\s.\-/]?\d{2}$/; diff --git a/src/_internals/constants/service-items.ts b/src/_internals/constants/service-items.ts new file mode 100644 index 000000000..d4c0d861a --- /dev/null +++ b/src/_internals/constants/service-items.ts @@ -0,0 +1,315 @@ +/** + * The subitems in force of the service list annexed to the Lei Complementar 116/2003, indexed by + * the raw 4 digits of the subitem (`0101` for `1.01`), the first four digits of the national + * `cTribNac` code. + * + * Built from the sheet `LISTA.SERV.NAC.` of the `ANEXO_B-NBS2-LISTA_SERVICO_NACIONAL` workbook + * of the Sistema Nacional NFS-e, which prints the list in force, vetoed subitems left out and + * the amendments of later leis complementares applied. The item headings, the national codes a + * subitem is split into and item 99, an addition of the national list, are not part of the law + * and are left out. + * + * Generated by `node ./scripts/service-items.ts` from `anexo_b-nbs2-lista_servico_nacional-snnfse-v1-01-20260122.xlsx`. + * Do not edit by hand. + * + * @see Official: https://www.planalto.gov.br/ccivil_03/leis/lcp/lcp116.htm + * Lei Complementar 116/2003, "Lista de serviços anexa". + * @see Official: https://www.gov.br/nfse/pt-br/biblioteca/documentacao-tecnica/documentacao-atual + * Sistema Nacional NFS-e, current technical documentation, ANEXO B. + */ +export const SERVICE_ITEM_DESCRIPTIONS: Record = { + "0101": "Análise e desenvolvimento de sistemas.", + "0102": "Programação.", + "0103": + "Processamento, armazenamento ou hospedagem de dados, textos, imagens, vídeos, páginas eletrônicas, aplicativos e sistemas de informação, entre outros formatos, e congêneres.", + "0104": + "Elaboração de programas de computadores, inclusive de jogos eletrônicos, independentemente da arquitetura construtiva da máquina em que o programa será executado, incluindo tablets, smartphones e congêneres.", + "0105": "Licenciamento ou cessão de direito de uso de programas de computação.", + "0106": "Assessoria e consultoria em informática.", + "0107": + "Suporte técnico em informática, inclusive instalação, configuração e manutenção de programas de computação e bancos de dados.", + "0108": "Planejamento, confecção, manutenção e atualização de páginas eletrônicas.", + "0109": + "Disponibilização, sem cessão definitiva, de conteúdos de áudio, vídeo, imagem e texto por meio da internet, respeitada a imunidade de livros, jornais e periódicos (exceto a distribuição de conteúdos pelas prestadoras de Serviço de Acesso Condicionado, de que trata a Lei nº 12.485, de 12 de setembro de 2011, sujeita ao ICMS).", + "0201": "Serviços de pesquisas e desenvolvimento de qualquer natureza.", + "0302": "Cessão de direito de uso de marcas e de sinais de propaganda.", + "0303": + "Exploração de salões de festas, centro de convenções, escritórios virtuais, stands, quadras esportivas, estádios, ginásios, auditórios, casas de espetáculos, parques de diversões, canchas e congêneres, para realização de eventos ou negócios de qualquer natureza.", + "0304": + "Locação, sublocação, arrendamento, direito de passagem ou permissão de uso, compartilhado ou não, de ferrovia, rodovia, postes, cabos, dutos e condutos de qualquer natureza.", + "0305": "Cessão de andaimes, palcos, coberturas e outras estruturas de uso temporário.", + "0401": "Medicina e biomedicina.", + "0402": + "Análises clínicas, patologia, eletricidade médica, radioterapia, quimioterapia, ultra-sonografia, ressonância magnética, radiologia, tomografia e congêneres.", + "0403": + "Hospitais, clínicas, laboratórios, sanatórios, manicômios, casas de saúde, prontos-socorros, ambulatórios e congêneres.", + "0404": "Instrumentação cirúrgica.", + "0405": "Acupuntura.", + "0406": "Enfermagem, inclusive serviços auxiliares.", + "0407": "Serviços farmacêuticos.", + "0408": "Terapia ocupacional, fisioterapia e fonoaudiologia.", + "0409": "Terapias de qualquer espécie destinadas ao tratamento físico, orgânico e mental.", + "0410": "Nutrição.", + "0411": "Obstetrícia.", + "0412": "Odontologia.", + "0413": "Ortóptica.", + "0414": "Próteses sob encomenda.", + "0415": "Psicanálise.", + "0416": "Psicologia.", + "0417": "Casas de repouso e de recuperação, creches, asilos e congêneres.", + "0418": "Inseminação artificial, fertilização in vitro e congêneres.", + "0419": "Bancos de sangue, leite, pele, olhos, óvulos, sêmen e congêneres.", + "0420": + "Coleta de sangue, leite, tecidos, sêmen, órgãos e materiais biológicos de qualquer espécie.", + "0421": "Unidade de atendimento, assistência ou tratamento móvel e congêneres.", + "0422": + "Planos de medicina de grupo ou individual e convênios para prestação de assistência médica, hospitalar, odontológica e congêneres.", + "0423": + "Outros planos de saúde que se cumpram através de serviços de terceiros contratados, credenciados, cooperados ou apenas pagos pelo operador do plano mediante indicação do beneficiário.", + "0501": "Medicina veterinária e zootecnia.", + "0502": "Hospitais, clínicas, ambulatórios, prontos-socorros e congêneres, na área veterinária.", + "0503": "Laboratórios de análise na área veterinária.", + "0504": "Inseminação artificial, fertilização in vitro e congêneres.", + "0505": "Bancos de sangue e de órgãos e congêneres.", + "0506": + "Coleta de sangue, leite, tecidos, sêmen, órgãos e materiais biológicos de qualquer espécie.", + "0507": "Unidade de atendimento, assistência ou tratamento móvel e congêneres.", + "0508": "Guarda, tratamento, amestramento, embelezamento, alojamento e congêneres.", + "0509": "Planos de atendimento e assistência médico-veterinária.", + "0601": "Barbearia, cabeleireiros, manicuros, pedicuros e congêneres.", + "0602": "Esteticistas, tratamento de pele, depilação e congêneres.", + "0603": "Banhos, duchas, sauna, massagens e congêneres.", + "0604": "Ginástica, dança, esportes, natação, artes marciais e demais atividades físicas.", + "0605": "Centros de emagrecimento, spa e congêneres.", + "0606": "Aplicação de tatuagens, piercings e congêneres.", + "0701": + "Engenharia, agronomia, agrimensura, arquitetura, geologia, urbanismo, paisagismo e congêneres.", + "0702": + "Execução, por administração, empreitada ou subempreitada, de obras de construção civil, hidráulica ou elétrica e de outras obras semelhantes, inclusive sondagem, perfuração de poços, escavação, drenagem e irrigação, terraplanagem, pavimentação, concretagem e a instalação e montagem de produtos, peças e equipamentos (exceto o fornecimento de mercadorias produzidas pelo prestador de serviços fora do local da prestação dos serviços, que fica sujeito ao ICMS).", + "0703": + "Elaboração de planos diretores, estudos de viabilidade, estudos organizacionais e outros, relacionados com obras e serviços de engenharia; elaboração de anteprojetos, projetos básicos e projetos executivos para trabalhos de engenharia.", + "0704": "Demolição.", + "0705": + "Reparação, conservação e reforma de edifícios, estradas, pontes, portos e congêneres (exceto o fornecimento de mercadorias produzidas pelo prestador dos serviços, fora do local da prestação dos serviços, que fica sujeito ao ICMS).", + "0706": + "Colocação e instalação de tapetes, carpetes, assoalhos, cortinas, revestimentos de parede, vidros, divisórias, placas de gesso e congêneres, com material fornecido pelo tomador do serviço.", + "0707": "Recuperação, raspagem, polimento e lustração de pisos e congêneres.", + "0708": "Calafetação.", + "0709": + "Varrição, coleta, remoção, incineração, tratamento, reciclagem, separação e destinação final de lixo, rejeitos e outros resíduos quaisquer.", + "0710": + "Limpeza, manutenção e conservação de vias e logradouros públicos, imóveis, chaminés, piscinas, parques, jardins e congêneres.", + "0711": "Decoração e jardinagem, inclusive corte e poda de árvores.", + "0712": + "Controle e tratamento de efluentes de qualquer natureza e de agentes físicos, químicos e biológicos.", + "0713": + "Dedetização, desinfecção, desinsetização, imunização, higienização, desratização, pulverização e congêneres.", + "0716": + "Florestamento, reflorestamento, semeadura, adubação, reparação de solo, plantio, silagem, colheita, corte e descascamento de árvores, silvicultura, exploração florestal e dos serviços congêneres indissociáveis da formação, manutenção e colheita de florestas, para quaisquer fins e por quaisquer meios.", + "0717": "Escoramento, contenção de encostas e serviços congêneres.", + "0718": + "Limpeza e dragagem de rios, portos, canais, baías, lagos, lagoas, represas, açudes e congêneres.", + "0719": + "Acompanhamento e fiscalização da execução de obras de engenharia, arquitetura e urbanismo.", + "0720": + "Aerofotogrametria (inclusive interpretação), cartografia, mapeamento, levantamentos topográficos, batimétricos, geográficos, geodésicos, geológicos, geofísicos e congêneres.", + "0721": + "Pesquisa, perfuração, cimentação, mergulho, perfilagem, concretação, testemunhagem, pescaria, estimulação e outros serviços relacionados com a exploração e explotação de petróleo, gás natural e de outros recursos minerais.", + "0722": "Nucleação e bombardeamento de nuvens e congêneres.", + "0801": "Ensino regular pré-escolar, fundamental, médio e superior.", + "0802": + "Instrução, treinamento, orientação pedagógica e educacional, avaliação de conhecimentos de qualquer natureza.", + "0901": + "Hospedagem de qualquer natureza em hotéis, apart-service condominiais, flat, apart-hotéis, hotéis residência, residence-service, suite service, hotelaria marítima, motéis, pensões e congêneres; ocupação por temporada com fornecimento de serviço (o valor da alimentação e gorjeta, quando incluído no preço da diária, fica sujeito ao Imposto Sobre Serviços).", + "0902": + "Agenciamento, organização, promoção, intermediação e execução de programas de turismo, passeios, viagens, excursões, hospedagens e congêneres.", + "0903": "Guias de turismo.", + "1001": + "Agenciamento, corretagem ou intermediação de câmbio, de seguros, de cartões de crédito, de planos de saúde e de planos de previdência privada.", + "1002": + "Agenciamento, corretagem ou intermediação de títulos em geral, valores mobiliários e contratos quaisquer.", + "1003": + "Agenciamento, corretagem ou intermediação de direitos de propriedade industrial, artística ou literária.", + "1004": + "Agenciamento, corretagem ou intermediação de contratos de arrendamento mercantil (leasing), de franquia (franchising) e de faturização (factoring).", + "1005": + "Agenciamento, corretagem ou intermediação de bens móveis ou imóveis, não abrangidos em outros itens ou subitens, inclusive aqueles realizados no âmbito de Bolsas de Mercadorias e Futuros, por quaisquer meios.", + "1006": "Agenciamento marítimo.", + "1007": "Agenciamento de notícias.", + "1008": + "Agenciamento de publicidade e propaganda, inclusive o agenciamento de veiculação por quaisquer meios.", + "1009": "Representação de qualquer natureza, inclusive comercial.", + "1010": "Distribuição de bens de terceiros.", + "1101": + "Guarda e estacionamento de veículos terrestres automotores, de aeronaves e de embarcações.", + "1102": "Vigilância, segurança ou monitoramento de bens, pessoas e semoventes.", + "1103": "Escolta, inclusive de veículos e cargas.", + "1104": + "Armazenamento, depósito, carga, descarga, arrumação e guarda de bens de qualquer espécie.", + "1105": + "Serviços relacionados ao monitoramento e rastreamento a distância, em qualquer via ou local, de veículos, cargas, pessoas e semoventes em circulação ou movimento, realizados por meio de telefonia móvel, transmissão de satélites, rádio ou qualquer outro meio, inclusive pelas empresas de Tecnologia da Informação Veicular, independentemente de o prestador de serviços ser proprietário ou não da infraestrutura de telecomunicações que utiliza.", + "1201": "Espetáculos teatrais.", + "1202": "Exibições cinematográficas.", + "1203": "Espetáculos circenses.", + "1204": "Programas de auditório.", + "1205": "Parques de diversões, centros de lazer e congêneres.", + "1206": "Boates, taxi-dancing e congêneres.", + "1207": + "Shows, ballet, danças, desfiles, bailes, óperas, concertos, recitais, festivais e congêneres.", + "1208": "Feiras, exposições, congressos e congêneres.", + "1209": "Bilhares, boliches e diversões eletrônicas ou não.", + "1210": "Corridas e competições de animais.", + "1211": + "Competições esportivas ou de destreza física ou intelectual, com ou sem a participação do espectador.", + "1212": "Execução de música.", + "1213": + "Produção, mediante ou sem encomenda prévia, de eventos, espetáculos, entrevistas, shows, ballet, danças, desfiles, bailes, teatros, óperas, concertos, recitais, festivais e congêneres.", + "1214": + "Fornecimento de música para ambientes fechados ou não, mediante transmissão por qualquer processo.", + "1215": "Desfiles de blocos carnavalescos ou folclóricos, trios elétricos e congêneres.", + "1216": + "Exibição de filmes, entrevistas, musicais, espetáculos, shows, concertos, desfiles, óperas, competições esportivas, de destreza intelectual ou congêneres.", + "1217": "Recreação e animação, inclusive em festas e eventos de qualquer natureza.", + "1302": "Fonografia ou gravação de sons, inclusive trucagem, dublagem, mixagem e congêneres.", + "1303": + "Fotografia e cinematografia, inclusive revelação, ampliação, cópia, reprodução, trucagem e congêneres.", + "1304": "Reprografia, microfilmagem e digitalização.", + "1305": + "Composição gráfica, inclusive confecção de impressos gráficos, fotocomposição, clicheria, zincografia, litografia e fotolitografia, exceto se destinados a posterior operação de comercialização ou industrialização, ainda que incorporados, de qualquer forma, a outra mercadoria que deva ser objeto de posterior circulação, tais como bulas, rótulos, etiquetas, caixas, cartuchos, embalagens e manuais técnicos e de instrução, quando ficarão sujeitos ao ICMS.", + "1401": + "Lubrificação, limpeza, lustração, revisão, carga e recarga, conserto, restauração, blindagem, manutenção e conservação de máquinas, veículos, aparelhos, equipamentos, motores, elevadores ou de qualquer objeto (exceto peças e partes empregadas, que ficam sujeitas ao ICMS).", + "1402": "Assistência técnica.", + "1403": + "Recondicionamento de motores (exceto peças e partes empregadas, que ficam sujeitas ao ICMS).", + "1404": "Recauchutagem ou regeneração de pneus.", + "1405": + "Restauração, recondicionamento, acondicionamento, pintura, beneficiamento, lavagem, secagem, tingimento, galvanoplastia, anodização, corte, recorte, plastificação, costura, acabamento, polimento e congêneres de objetos quaisquer.", + "1406": + "Instalação e montagem de aparelhos, máquinas e equipamentos, inclusive montagem industrial, prestados ao usuário final, exclusivamente com material por ele fornecido.", + "1407": "Colocação de molduras e congêneres.", + "1408": "Encadernação, gravação e douração de livros, revistas e congêneres.", + "1409": + "Alfaiataria e costura, quando o material for fornecido pelo usuário final, exceto aviamento.", + "1410": "Tinturaria e lavanderia.", + "1411": "Tapeçaria e reforma de estofamentos em geral.", + "1412": "Funilaria e lanternagem.", + "1413": "Carpintaria e serralheria.", + "1414": "Guincho intramunicipal, guindaste e içamento.", + "1501": + "Administração de fundos quaisquer, de consórcio, de cartão de crédito ou débito e congêneres, de carteira de clientes, de cheques pré-datados e congêneres.", + "1502": + "Abertura de contas em geral, inclusive conta-corrente, conta de investimentos e aplicação e caderneta de poupança, no País e no exterior, bem como a manutenção das referidas contas ativas e inativas.", + "1503": + "Locação e manutenção de cofres particulares, de terminais eletrônicos, de terminais de atendimento e de bens e equipamentos em geral.", + "1504": + "Fornecimento ou emissão de atestados em geral, inclusive atestado de idoneidade, atestado de capacidade financeira e congêneres.", + "1505": + "Cadastro, elaboração de ficha cadastral, renovação cadastral e congêneres, inclusão ou exclusão no Cadastro de Emitentes de Cheques sem Fundos - CCF ou em quaisquer outros bancos cadastrais.", + "1506": + "Emissão, reemissão e fornecimento de avisos, comprovantes e documentos em geral; abono de firmas; coleta e entrega de documentos, bens e valores; comunicação com outra agência ou com a administração central; licenciamento eletrônico de veículos; transferência de veículos; agenciamento fiduciário ou depositário; devolução de bens em custódia.", + "1507": + "Acesso, movimentação, atendimento e consulta a contas em geral, por qualquer meio ou processo, inclusive por telefone, fac-símile, internet e telex, acesso a terminais de atendimento, inclusive vinte e quatro horas; acesso a outro banco e à rede compartilhada; fornecimento de saldo, extrato e demais informações relativas a contas em geral, por qualquer meio ou processo.", + "1508": + "Emissão, reemissão, alteração, cessão, substituição, cancelamento e registro de contrato de crédito; estudo, análise e avaliação de operações de crédito; emissão, concessão, alteração ou contratação de aval, fiança, anuência e congêneres; serviços relativos à abertura de crédito, para quaisquer fins.", + "1509": + "Arrendamento mercantil (leasing) de quaisquer bens, inclusive cessão de direitos e obrigações, substituição de garantia, alteração, cancelamento e registro de contrato, e demais serviços relacionados ao arrendamento mercantil (leasing).", + "1510": + "Serviços relacionados a cobranças, recebimentos ou pagamentos em geral, de títulos quaisquer, de contas ou carnês, de câmbio, de tributos e por conta de terceiros, inclusive os efetuados por meio eletrônico, automático ou por máquinas de atendimento; fornecimento de posição de cobrança, recebimento ou pagamento; emissão de carnês, fichas de compensação, impressos e documentos em geral.", + "1511": + "Devolução de títulos, protesto de títulos, sustação de protesto, manutenção de títulos, reapresentação de títulos, e demais serviços a eles relacionados.", + "1512": "Custódia em geral, inclusive de títulos e valores mobiliários.", + "1513": + "Serviços relacionados a operações de câmbio em geral, edição, alteração, prorrogação, cancelamento e baixa de contrato de câmbio; emissão de registro de exportação ou de crédito; cobrança ou depósito no exterior; emissão, fornecimento e cancelamento de cheques de viagem; fornecimento, transferência, cancelamento e demais serviços relativos a carta de crédito de importação, exportação e garantias recebidas; envio e recebimento de mensagens em geral relacionadas a operações de câmbio.", + "1514": + "Fornecimento, emissão, reemissão, renovação e manutenção de cartão magnético, cartão de crédito, cartão de débito, cartão salário e congêneres.", + "1515": + "Compensação de cheques e títulos quaisquer; serviços relacionados a depósito, inclusive depósito identificado, a saque de contas quaisquer, por qualquer meio ou processo, inclusive em terminais eletrônicos e de atendimento.", + "1516": + "Emissão, reemissão, liquidação, alteração, cancelamento e baixa de ordens de pagamento, ordens de crédito e similares, por qualquer meio ou processo; serviços relacionados à transferência de valores, dados, fundos, pagamentos e similares, inclusive entre contas em geral.", + "1517": + "Emissão, fornecimento, devolução, sustação, cancelamento e oposição de cheques quaisquer, avulso ou por talão.", + "1518": + "Serviços relacionados a crédito imobiliário, avaliação e vistoria de imóvel ou obra, análise técnica e jurídica, emissão, reemissão, alteração, transferência e renegociação de contrato, emissão e reemissão do termo de quitação e demais serviços relacionados a crédito imobiliário.", + "1601": + "Serviços de transporte coletivo municipal rodoviário, metroviário, ferroviário e aquaviário de passageiros.", + "1602": "Outros serviços de transporte de natureza municipal.", + "1701": + "Assessoria ou consultoria de qualquer natureza, não contida em outros itens desta lista; análise, exame, pesquisa, coleta, compilação e fornecimento de dados e informações de qualquer natureza, inclusive cadastro e similares.", + "1702": + "Datilografia, digitação, estenografia, expediente, secretaria em geral, resposta audível, redação, edição, interpretação, revisão, tradução, apoio e infra-estrutura administrativa e congêneres.", + "1703": + "Planejamento, coordenação, programação ou organização técnica, financeira ou administrativa.", + "1704": "Recrutamento, agenciamento, seleção e colocação de mão-de-obra.", + "1705": + "Fornecimento de mão-de-obra, mesmo em caráter temporário, inclusive de empregados ou trabalhadores, avulsos ou temporários, contratados pelo prestador de serviço.", + "1706": + "Propaganda e publicidade, inclusive promoção de vendas, planejamento de campanhas ou sistemas de publicidade, elaboração de desenhos, textos e demais materiais publicitários.", + "1708": "Franquia (franchising).", + "1709": "Perícias, laudos, exames técnicos e análises técnicas.", + "1710": + "Planejamento, organização e administração de feiras, exposições, congressos e congêneres.", + "1711": + "Organização de festas e recepções; bufê (exceto o fornecimento de alimentação e bebidas, que fica sujeito ao ICMS).", + "1712": "Administração em geral, inclusive de bens e negócios de terceiros.", + "1713": "Leilão e congêneres.", + "1714": "Advocacia", + "1715": "Arbitragem de qualquer espécie, inclusive jurídica.", + "1716": "Auditoria.", + "1717": "Análise de Organização e Métodos.", + "1718": "Atuária e cálculos técnicos de qualquer natureza.", + "1719": "Contabilidade, inclusive serviços técnicos e auxiliares.", + "1720": "Consultoria e assessoria econômica ou financeira.", + "1721": "Estatística.", + "1722": "Cobrança em geral.", + "1723": + "Assessoria, análise, avaliação, atendimento, consulta, cadastro, seleção, gerenciamento de informações, administração de contas a receber ou a pagar e em geral, relacionados a operações de faturização (factoring).", + "1724": "Apresentação de palestras, conferências, seminários e congêneres.", + "1725": + "Inserção de textos, desenhos e outros materiais de propaganda e publicidade, em qualquer meio (exceto em livros, jornais, periódicos e nas modalidades de serviços de radiodifusão sonora e de sons e imagens de recepção livre e gratuita).", + "1801": + "Serviços de regulação de sinistros vinculados a contratos de seguros; inspeção e avaliação de riscos para cobertura de contratos de seguros; prevenção e gerência de riscos seguráveis e congêneres.", + "1901": + "Serviços de distribuição e venda de bilhetes e demais produtos de loteria, bingos, cartões, pules ou cupons de apostas, sorteios, prêmios, inclusive os decorrentes de títulos de capitalização e congêneres.", + "2001": + "Serviços portuários, ferroportuários, utilização de porto, movimentação de passageiros, reboque de embarcações, rebocador escoteiro, atracação, desatracação, serviços de praticagem, capatazia, armazenagem de qualquer natureza, serviços acessórios, movimentação de mercadorias, serviços de apoio marítimo, de movimentação ao largo, serviços de armadores, estiva, conferência, logística e congêneres.", + "2002": + "Serviços aeroportuários, utilização de aeroporto, movimentação de passageiros, armazenagem de qualquer natureza, capatazia, movimentação de aeronaves, serviços de apoio aeroportuários, serviços acessórios, movimentação de mercadorias, logística e congêneres.", + "2003": + "Serviços de terminais rodoviários, ferroviários, metroviários, movimentação de passageiros, mercadorias, inclusive suas operações, logística e congêneres.", + "2101": "Serviços de registros públicos, cartorários e notariais.", + "2201": + "Serviços de exploração de rodovia mediante cobrança de preço ou pedágio dos usuários, envolvendo execução de serviços de conservação, manutenção, melhoramentos para adequação de capacidade e segurança de trânsito, operação, monitoração, assistência aos usuários e outros serviços definidos em contratos, atos de concessão ou de permissão ou em normas oficiais.", + "2301": "Serviços de programação e comunicação visual, desenho industrial e congêneres.", + "2401": + "Serviços de chaveiros, confecção de carimbos, placas, sinalização visual, banners, adesivos e congêneres.", + "2501": + "Funerais, inclusive fornecimento de caixão, urna ou esquifes; aluguel de capela; transporte do corpo cadavérico; fornecimento de flores, coroas e outros paramentos; desembaraço de certidão de óbito; fornecimento de véu, essa e outros adornos; embalsamento, embelezamento, conservação ou restauração de cadáveres.", + "2502": "Translado intramunicipal e cremação de corpos e partes de corpos cadavéricos.", + "2503": "Planos ou convênio funerários.", + "2504": "Manutenção e conservação de jazigos e cemitérios.", + "2505": "Cessão de uso de espaços em cemitérios para sepultamento.", + "2601": + "Serviços de coleta, remessa ou entrega de correspondências, documentos, objetos, bens ou valores, inclusive pelos correios e suas agências franqueadas; courrier e congêneres.", + "2701": "Serviços de assistência social.", + "2801": "Serviços de avaliação de bens e serviços de qualquer natureza.", + "2901": "Serviços de biblioteconomia.", + "3001": "Serviços de biologia, biotecnologia e química.", + "3101": + "Serviços técnicos em edificações, eletrônica, eletrotécnica, mecânica, telecomunicações e congêneres.", + "3201": "Serviços de desenhos técnicos.", + "3301": "Serviços de desembaraço aduaneiro, comissários, despachantes e congêneres.", + "3401": "Serviços de investigações particulares, detetives e congêneres.", + "3501": "Serviços de reportagem, assessoria de imprensa, jornalismo e relações públicas.", + "3601": "Serviços de meteorologia.", + "3701": "Serviços de artistas, atletas, modelos e manequins.", + "3801": "Serviços de museologia.", + "3901": + "Serviços de ourivesaria e lapidação (quando o material for fornecido pelo tomador do serviço).", + "4001": "Obras de arte sob encomenda.", +}; + +/** + * Shape a subitem has to be written in: one or two digits of the item and the two of the + * subitem, with the dot the law prints between them or without it. + */ +export const SERVICE_ITEM_FORMAT_REGEX = /^\d{1,2}\.?\d{2}$/; diff --git a/src/_internals/constants/suframa.ts b/src/_internals/constants/suframa.ts new file mode 100644 index 000000000..3dec53b8a --- /dev/null +++ b/src/_internals/constants/suframa.ts @@ -0,0 +1,2 @@ +/** Digits of an Inscrição SUFRAMA written in full, sector code with its leading zero included. */ +export const SUFRAMA_LENGTH = 9; diff --git a/src/_internals/each-local-day/each-local-day.test.ts b/src/_internals/each-local-day/each-local-day.test.ts new file mode 100644 index 000000000..3310131cb --- /dev/null +++ b/src/_internals/each-local-day/each-local-day.test.ts @@ -0,0 +1,70 @@ +import { describe, expect, inTimeZone, test } from "../test/runtime"; +import { eachLocalDay } from "./each-local-day"; + +const daysOfMonth = (from: number, until: number): number[] => + [...eachLocalDay({ from, until })].map((day) => day.getDate()); + +describe("eachLocalDay", () => { + test("should yield every day of March 2024 forwards, the day it stops at excluded", () => { + expect(daysOfMonth(Date.UTC(2024, 2, 1), Date.UTC(2024, 3, 1))).toEqual([ + 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, + 27, 28, 29, 30, 31, + ]); + }); + + test("should yield every day of March 2024 backwards when until comes before from", () => { + expect(daysOfMonth(Date.UTC(2024, 2, 31), Date.UTC(2024, 1, 29))).toEqual([ + 31, 30, 29, 28, 27, 26, 25, 24, 23, 22, 21, 20, 19, 18, 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, + 7, 6, 5, 4, 3, 2, 1, + ]); + }); + + test("should yield nothing when from and until are the same day", () => { + expect(daysOfMonth(Date.UTC(2024, 2, 1), Date.UTC(2024, 2, 1))).toEqual([]); + }); + + test("should yield a single day when until is its neighbour", () => { + expect(daysOfMonth(Date.UTC(2024, 2, 1), Date.UTC(2024, 2, 2))).toEqual([1]); + expect(daysOfMonth(Date.UTC(2024, 2, 1), Date.UTC(2024, 1, 29))).toEqual([1]); + }); + + test("should cross the end of a year, a leap day and a month boundary", () => { + expect(daysOfMonth(Date.UTC(2023, 11, 30), Date.UTC(2024, 0, 3))).toEqual([30, 31, 1, 2]); + expect(daysOfMonth(Date.UTC(2024, 1, 28), Date.UTC(2024, 2, 2))).toEqual([28, 29, 1]); + }); + + test("should yield every day at noon local time", () => { + const [first] = [...eachLocalDay({ from: Date.UTC(2024, 2, 1), until: Date.UTC(2024, 2, 2) })]; + + expect(first?.getHours()).toBe(12); + expect(first?.getMinutes()).toBe(0); + expect(first?.getSeconds()).toBe(0); + expect(first?.getMilliseconds()).toBe(0); + }); + + inTimeZone("Pacific/Apia", () => { + test("should skip 30 December 2011, the day Samoa dropped to cross the date line", () => { + expect(daysOfMonth(Date.UTC(2011, 11, 1), Date.UTC(2012, 0, 1))).toEqual([ + 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, + 26, 27, 28, 29, 31, + ]); + }); + }); + + inTimeZone("Pacific/Kiritimati", () => { + test("should skip 31 December 1994, walking backwards too", () => { + expect(daysOfMonth(Date.UTC(1994, 11, 28), Date.UTC(1995, 0, 1))).toEqual([28, 29, 30]); + expect(daysOfMonth(Date.UTC(1994, 11, 31), Date.UTC(1994, 11, 27))).toEqual([30, 29, 28]); + }); + }); + + inTimeZone("America/Sao_Paulo", () => { + test("should yield 4 November 2018, whose local midnight does not exist", () => { + expect(daysOfMonth(Date.UTC(2018, 10, 3), Date.UTC(2018, 10, 6))).toEqual([3, 4, 5]); + }); + + test("should yield the days either side of the backward transition of 18 February 2018", () => { + expect(daysOfMonth(Date.UTC(2018, 1, 16), Date.UTC(2018, 1, 19))).toEqual([16, 17, 18]); + }); + }); +}); diff --git a/src/_internals/each-local-day/each-local-day.ts b/src/_internals/each-local-day/each-local-day.ts new file mode 100644 index 000000000..e9fa08bb3 --- /dev/null +++ b/src/_internals/each-local-day/each-local-day.ts @@ -0,0 +1,65 @@ +/** The two ends of a walk over local calendar days. */ +export type EachLocalDayParams = { + /** The first local calendar day to visit, as `Date.UTC(year, month, day)` maps it to a number. */ + from: number; + /** The local calendar day to stop at, the same way, never visited: it only bounds the walk and gives it its direction. */ + until: number; +}; + +const DAY_IN_MS = 86_400_000; + +const NOON = 12; + +/** + * Walks the local calendar days from `from` to `until`, `until` itself excluded, and yields each + * one as a new `Date` at noon local time. + * + * Both ends are local calendar days written as the number `Date.UTC(year, month, day)` returns + * for them, so the walk is plain integer arithmetic on days: it always advances, it always stops + * after `Math.abs(until - from)` days, and no `Date` is ever mutated. That is what makes it safe + * in every time zone. A walk driven by `date.setDate(date.getDate() + 1)` is not: when the + * neighbouring local day does not exist (`Pacific/Apia` skipped 30 December 2011, `Pacific/Kiritimati` + * and `Pacific/Enderbury` 31 December 1994, `Pacific/Kwajalein` 21 August 1993, all of them crossing + * the date line) the runtime re-normalizes onto the same local day, the walk stops advancing and + * the loop never ends. + * + * Each day is yielded at **noon**, not at midnight, because noon is a time of day every existing + * local calendar day has: a transition that moves the clock forward (Brazilian summer time always + * started at local midnight, so there was no `00:00` on 4 November 2018 in São Paulo) leaves + * midnight of that day unrepresentable, and a `Date` built at it silently belongs to the day + * before or carries a shifted hour. A caller that only reads the local year, month, day and + * weekday of the yielded value, which is all `isBusinessDay` reads, therefore always sees the day + * it asked for. + * + * The five local days listed above do not exist in their zones at all, so no `Date` can carry + * them. They are skipped rather than yielded as the neighbouring day the runtime resolves them + * to, which would otherwise be visited twice. + * + * @param {EachLocalDayParams} params - The first local calendar day of the walk and the one to stop at. + * @yields {Date} Each existing local calendar day of the range, in order, at 12:00 local time. + * + * @example + * ```typescript + * // The business days of March 2024, forwards: + * for (const day of eachLocalDay({ from: Date.UTC(2024, 2, 1), until: Date.UTC(2024, 3, 1) })) { + * if (isBusinessDay(day)) console.log(day.getDate()); + * } + * ``` + */ +export function* eachLocalDay({ from, until }: EachLocalDayParams): Generator { + const step = Math.sign(until - from) * DAY_IN_MS; + const length = Math.abs(until - from) / DAY_IN_MS; + + for (let index = 0; index < length; index += 1) { + const target = new Date(from + index * step); + const candidate = new Date( + target.getUTCFullYear(), + target.getUTCMonth(), + target.getUTCDate(), + NOON, + ); + + // Stryker disable next-line ConditionalExpression: the five local days listed above are the only input that tells this branch from an unconditional yield, and the tests pinning them need the process time zone set, which the mutation runner's worker threads cannot do; `npm run test -- --run` does kill this mutant + if (candidate.getDate() === target.getUTCDate()) yield candidate; + } +} diff --git a/src/_internals/mod10/mod10.test.ts b/src/_internals/mod10/mod10.test.ts index 45a2d715b..7bc2f6252 100644 --- a/src/_internals/mod10/mod10.test.ts +++ b/src/_internals/mod10/mod10.test.ts @@ -17,4 +17,30 @@ describe("mod10", () => { test("should return 0 when mod is 0", () => { expect(mod10("000000000")).toBe(0); }); + + describe("with the gs1 variant", () => { + test("should calculate the 18 digit example of the GS1 General Specifications, table 7-9", () => { + expect(mod10("37610425002123456", { variant: "gs1" })).toBe(9); + }); + + test("should calculate the check digit of the GTIN examples of the GS1 General Specifications", () => { + expect(mod10("952123450001", { variant: "gs1" })).toBe(8); + expect(mod10("0952414123456", { variant: "gs1" })).toBe(4); + expect(mod10("06141411234", { variant: "gs1" })).toBe(5); + }); + + test("should return 0 when the sum is a multiple of ten", () => { + expect(mod10("0000000", { variant: "gs1" })).toBe(0); + expect(mod10("1234567", { variant: "gs1" })).toBe(0); + }); + + test("should differ from the luhn variant for the same digits", () => { + expect(mod10("952123450001")).toBe(1); + expect(mod10("952123450001", { variant: "gs1" })).toBe(8); + }); + }); + + test("should apply the luhn variant when it is named", () => { + expect(mod10("001900000", { variant: "luhn" })).toBe(9); + }); }); diff --git a/src/_internals/mod10/mod10.ts b/src/_internals/mod10/mod10.ts index 02256a033..f2de0fa0a 100644 --- a/src/_internals/mod10/mod10.ts +++ b/src/_internals/mod10/mod10.ts @@ -1,21 +1,38 @@ +type Mod10Variant = "luhn" | "gs1"; + +export type Mod10Options = { + /** Which modulo 10 rule to apply (default: `"luhn"`). */ + variant?: Mod10Variant; +}; + /** * Calculates the modulus 10 check digit for a given string. * + * Both variants weigh the digits from the right, alternating with 1. `"luhn"` uses the weight 2 + * and adds the digits of each product (the boleto, credit card and bank account rule). `"gs1"` + * uses the weight 3 and adds the products as they are (the rule of the GS1 General + * Specifications, section 7.9.1, for GTIN and the other fixed length GS1 keys). + * * @param {string} str - The string to calculate the check digit for. + * @param {Mod10Options} [options] - Optional options. + * @param {Mod10Variant} [options.variant] - The weighting rule to apply. Defaults to `"luhn"`. * @returns {number} The calculated check digit (0-9). * * @example * ```typescript * mod10("001900000"); // 9 + * mod10("37610425002123456", { variant: "gs1" }); // 9 * ``` */ -export const mod10 = (str: string): number => { +export const mod10 = (str: string, options?: Mod10Options): number => { + const isGs1 = options?.variant === "gs1"; + const weight = isGs1 ? 3 : 2; let sum = 0; const len = str.length; for (let i = 0; i < len; i++) { const digit = str.charCodeAt(len - 1 - i) - 48; - const result = digit * (i % 2 === 0 ? 2 : 1); - sum += result > 9 ? result - 9 : result; + const result = digit * (i % 2 === 0 ? weight : 1); + sum += !isGs1 && result > 9 ? result - 9 : result; } const mod = sum % 10; return mod > 0 ? 10 - mod : 0; diff --git a/src/_internals/normalize-cid10/normalize-cid10.test.ts b/src/_internals/normalize-cid10/normalize-cid10.test.ts new file mode 100644 index 000000000..83517e989 --- /dev/null +++ b/src/_internals/normalize-cid10/normalize-cid10.test.ts @@ -0,0 +1,83 @@ +import { describe, expect, expectTypeOf, test } from "../test/runtime"; +import { normalizeCid10 } from "./normalize-cid10"; + +describe("normalizeCid10", () => { + test("should keep a category as it is", () => { + expect(normalizeCid10("A00")).toBe("A00"); + }); + + test("should keep a subcategory written without the dot", () => { + expect(normalizeCid10("A000")).toBe("A000"); + }); + + test("should drop the dot of a subcategory", () => { + expect(normalizeCid10("A00.0")).toBe("A000"); + }); + + test("should upper case the letter", () => { + expect(normalizeCid10("f32")).toBe("F32"); + expect(normalizeCid10("f32.2")).toBe("F322"); + }); + + test("should ignore surrounding whitespace", () => { + expect(normalizeCid10(" A00.0 ")).toBe("A000"); + expect(normalizeCid10("\tA00\n")).toBe("A00"); + }); + + test("should reject whitespace inside the code", () => { + expect(normalizeCid10("A00 0")).toBe(""); + expect(normalizeCid10("A 00")).toBe(""); + }); + + test("should reject a value shorter than a category", () => { + expect(normalizeCid10("")).toBe(""); + expect(normalizeCid10("A")).toBe(""); + expect(normalizeCid10("A0")).toBe(""); + }); + + test("should reject a value longer than a subcategory", () => { + expect(normalizeCid10("A0000")).toBe(""); + expect(normalizeCid10("A00.00")).toBe(""); + expect(normalizeCid10("XA000")).toBe(""); + expect(normalizeCid10("XA00")).toBe(""); + }); + + test("should reject a dot with no subcategory after it and a doubled dot", () => { + expect(normalizeCid10("A00.")).toBe(""); + expect(normalizeCid10("A00..0")).toBe(""); + }); + + test("should reject any separator other than the dot", () => { + expect(normalizeCid10("A00-0")).toBe(""); + expect(normalizeCid10("A00/0")).toBe(""); + expect(normalizeCid10("A00,0")).toBe(""); + }); + + test("should reject a letter or a digit out of place", () => { + expect(normalizeCid10("000")).toBe(""); + expect(normalizeCid10("0000")).toBe(""); + expect(normalizeCid10("AA0")).toBe(""); + expect(normalizeCid10("A0A")).toBe(""); + expect(normalizeCid10("A00A")).toBe(""); + expect(normalizeCid10("A00.A")).toBe(""); + expect(normalizeCid10("Á00")).toBe(""); + }); + + test("should reject the dagger and asterisk suffixes", () => { + expect(normalizeCid10("A17.0+")).toBe(""); + expect(normalizeCid10("G01*")).toBe(""); + }); + + test("should reject a value that is not a string", () => { + expect(normalizeCid10(100)).toBe(""); + expect(normalizeCid10(null)).toBe(""); + expect(normalizeCid10(true)).toBe(""); + expect(normalizeCid10(["A00"])).toBe(""); + expect(normalizeCid10({ toString: () => "A00" })).toBe(""); + }); + + test("types", () => { + expectTypeOf(normalizeCid10).parameter(0).toEqualTypeOf(); + expectTypeOf(normalizeCid10).returns.toEqualTypeOf(); + }); +}); diff --git a/src/_internals/normalize-cid10/normalize-cid10.ts b/src/_internals/normalize-cid10/normalize-cid10.ts new file mode 100644 index 000000000..ab0ad6590 --- /dev/null +++ b/src/_internals/normalize-cid10/normalize-cid10.ts @@ -0,0 +1,32 @@ +import { sanitizeToAlphanumeric } from "../sanitize-to-alphanumeric/sanitize-to-alphanumeric"; + +const CID10_FORMAT_REGEX = /^[A-Za-z]\d{2}(?:\.?\d)?$/; + +/** + * Reads a CID-10 code written in one of its documented forms and returns the key the CID-10 + * tables are indexed by: upper case, without the dot. + * + * The documented forms are the 3 character category (`A00`) and the 4 character subcategory, + * with the dot (`A00.0`) or without it (`A000`), in any letter case and with optional + * surrounding whitespace. Anything else, a value that is not a string included, gives an empty + * string, which is not a key of any table. + * + * @param {unknown} value - The value to read. + * @returns {string} The 3 or 4 character code, or an empty string when the value is not written + * in a documented form. + * + * @example + * ```typescript + * normalizeCid10("A00.0"); // "A000" + * normalizeCid10(" f32 "); // "F32" + * normalizeCid10("A00-0"); // "" + * normalizeCid10(100); // "" + * ``` + */ +export const normalizeCid10 = (value: unknown): string => { + if (typeof value !== "string") return ""; + + const code = value.trim(); + + return CID10_FORMAT_REGEX.test(code) ? sanitizeToAlphanumeric(code) : ""; +}; diff --git a/src/_internals/test/arbitraries.ts b/src/_internals/test/arbitraries.ts index b5c9a94aa..bcefa0f7b 100644 --- a/src/_internals/test/arbitraries.ts +++ b/src/_internals/test/arbitraries.ts @@ -195,11 +195,16 @@ export const anyBusinessDayAmount: fc.Arbitrary = fc.oneof( const anyStateCode = fc.oneof(fc.constantFrom(...PROTOTYPE_KEYS, "SP", "xx"), fc.anything()); const anyIncludeOptional = fc.oneof(fc.boolean(), fc.anything()); +const anyIncludeSaturday = fc.oneof(fc.boolean(), fc.anything()); /** Business day options, or anything at all, prototype chain keys as the state code included. */ export const anyBusinessDayOptions: fc.Arbitrary = fc.oneof( fc.anything(), - fc.record({ stateCode: anyStateCode, includeOptional: anyIncludeOptional }), + fc.record({ + stateCode: anyStateCode, + includeOptional: anyIncludeOptional, + includeSaturday: anyIncludeSaturday, + }), ); /** An amount with at most two decimals, the precision currency formatting round-trips. */ diff --git a/src/_internals/test/runtime.ts b/src/_internals/test/runtime.ts index 8e3717516..90de61d01 100644 --- a/src/_internals/test/runtime.ts +++ b/src/_internals/test/runtime.ts @@ -1,5 +1,7 @@ import { type bench as vitestBench, type expectTypeOf as vitestExpectTypeOf } from "vite-plus/test"; +import { createTimeZoneSuite } from "./timezones"; + type RuntimeModule = { afterEach: (callback: () => void | Promise) => void; bench: typeof vitestBench; @@ -24,3 +26,5 @@ const runtimeModule = await loadRuntime(); export const { afterEach, bench, beforeEach, describe, expect, expectTypeOf, it, test, vi } = runtimeModule; + +export const inTimeZone = createTimeZoneSuite(runtimeModule); diff --git a/src/_internals/test/timezones.ts b/src/_internals/test/timezones.ts new file mode 100644 index 000000000..01d550a89 --- /dev/null +++ b/src/_internals/test/timezones.ts @@ -0,0 +1,106 @@ +type Environment = Record; + +type ProcessLike = { + env?: Environment; +}; + +type Hook = (callback: () => void) => void; + +type Describe = ((name: string, callback: () => void) => void) & { + skip: (name: string, callback: () => void) => void; +}; + +type TimeZoneRuntime = { + afterEach: Hook; + beforeEach: Hook; + describe: Describe; +}; + +/** Declares a suite whose every test runs with the process time zone pinned to a given zone. */ +export type TimeZoneSuite = (timeZone: string, suite: () => void) => void; + +const KIRITIMATI_OFFSET_IN_MINUTES = -840; + +const getEnvironment = (): Environment | undefined => { + const globalWithProcess = globalThis as typeof globalThis & { process?: ProcessLike }; + + try { + return globalWithProcess.process?.env; + } catch { + return undefined; + } +}; + +const environment = getEnvironment(); + +/** + * The zone to go back to, resolved before anything below changes `TZ`. Restoring means assigning + * this name again, never `delete process.env.TZ`: Bun stops applying any later `TZ` once the + * variable has been deleted once, which would silently run the rest of the suite in the wrong + * zone. + */ +const ambientTimeZone = Intl.DateTimeFormat().resolvedOptions().timeZone; + +const setTimeZone = (timeZone: string): void => { + if (environment === undefined) return; + + environment["TZ"] = timeZone; +}; + +/** + * Node, Bun and Deno all apply a new `process.env.TZ` to the `Date` objects built after it, which + * is what lets a test pin a time zone. A browser has no such switch, so the two zones below both + * report the ambient offset and the time zone suites are skipped there. + */ +const canSetTimeZone = (): boolean => { + if (environment === undefined) return false; + + try { + setTimeZone("UTC"); + + const utcOffset = new Date(2024, 0, 1).getTimezoneOffset(); + + setTimeZone("Pacific/Kiritimati"); + + const kiritimatiOffset = new Date(2024, 0, 1).getTimezoneOffset(); + + setTimeZone(ambientTimeZone); + + return utcOffset === 0 && kiritimatiOffset === KIRITIMATI_OFFSET_IN_MINUTES; + } catch { + return false; + } +}; + +/** + * Builds the `inTimeZone` helper `src/_internals/test/runtime` exports, around the `describe` and + * the hooks of whichever runtime the tests run on. It takes them as an argument rather than + * importing them so that the runtime module can export the helper without the two modules + * importing each other. + * + * @param {TimeZoneRuntime} runtime - The `describe`, `beforeEach` and `afterEach` of the runtime in use. + * @returns {TimeZoneSuite} A `describe` that pins the process time zone around every test inside it. + */ +export const createTimeZoneSuite = ({ + afterEach, + beforeEach, + describe, +}: TimeZoneRuntime): TimeZoneSuite => { + const supported = canSetTimeZone(); + + return (timeZone, suite) => { + const describeTimeZone = supported ? describe : describe.skip; + + describeTimeZone(`in ${timeZone}`, () => { + beforeEach(() => { + setTimeZone(timeZone); + }); + + afterEach(() => { + setTimeZone(ambientTimeZone); + }); + + suite(); + }); + }; +}; diff --git a/src/add-business-days/add-business-days.test.ts b/src/add-business-days/add-business-days.test.ts index 65513c766..09628839b 100644 --- a/src/add-business-days/add-business-days.test.ts +++ b/src/add-business-days/add-business-days.test.ts @@ -8,7 +8,7 @@ import { PROTOTYPE_KEYS, } from "../_internals/test/arbitraries"; import { expectNeverThrowsWithArguments } from "../_internals/test/properties"; -import { describe, expect, expectTypeOf, it, test } from "../_internals/test/runtime"; +import { describe, expect, expectTypeOf, inTimeZone, it, test } from "../_internals/test/runtime"; import { type BusinessDayOptions, isBusinessDay } from "../is-business-day/is-business-day"; import { addBusinessDays } from "./add-business-days"; @@ -97,6 +97,51 @@ describe("addBusinessDays", () => { }); }); + describe("includeSaturday", () => { + it("should land on Saturday when it counts (Fri 2024-01-05 + 1 -> Sat 2024-01-06)", () => { + const result = addBusinessDays(new Date(2024, 0, 5, 12), 1, { includeSaturday: true }); + + expect(result).toEqual(new Date(2024, 0, 6, 12)); + }); + + it("should keep skipping the whole weekend without the option (Fri 2024-01-05 + 1 -> Mon 2024-01-08)", () => { + const result = addBusinessDays(new Date(2024, 0, 5, 12), 1); + + expect(result).toEqual(new Date(2024, 0, 8, 12)); + }); + + it("should never land on a Sunday (Sat 2024-01-06 + 1 -> Mon 2024-01-08)", () => { + const result = addBusinessDays(new Date(2024, 0, 6, 12), 1, { includeSaturday: true }); + + expect(result).toEqual(new Date(2024, 0, 8, 12)); + }); + + it("should still skip a holiday that falls on a Saturday (Fri 2024-11-01 + 1 -> Mon 2024-11-04, Finados)", () => { + const result = addBusinessDays(new Date(2024, 10, 1, 12), 1, { includeSaturday: true }); + + expect(result).toEqual(new Date(2024, 10, 4, 12)); + }); + + it("should count a full week as six business days (Mon 2024-01-08 + 6 -> Mon 2024-01-15, with Sat 2024-01-13)", () => { + expect(addBusinessDays(new Date(2024, 0, 8, 12), 6, { includeSaturday: true })).toEqual( + new Date(2024, 0, 15, 12), + ); + expect(addBusinessDays(new Date(2024, 0, 8, 12), 6)).toEqual(new Date(2024, 0, 16, 12)); + }); + + it("should walk backwards over Saturday too (Mon 2024-01-08 - 1 -> Sat 2024-01-06)", () => { + const result = addBusinessDays(new Date(2024, 0, 8, 12), -1, { includeSaturday: true }); + + expect(result).toEqual(new Date(2024, 0, 6, 12)); + }); + + it("should give the same result as no options when includeSaturday is false", () => { + expect(addBusinessDays(new Date(2024, 0, 5, 12), 1, { includeSaturday: false })).toEqual( + new Date(2024, 0, 8, 12), + ); + }); + }); + describe("negative amounts", () => { it("should walk backwards, skipping weekends (Fri 2024-01-05 - 1 -> Thu 2024-01-04)", () => { const result = addBusinessDays(new Date(2024, 0, 5, 12), -1); @@ -215,6 +260,30 @@ describe("addBusinessDays", () => { expect(result?.getMilliseconds()).toBe(500); }); + inTimeZone("Pacific/Apia", () => { + it("should walk back over 30 December 2011, the local day Samoa skipped to cross the date line", () => { + expect(addBusinessDays(new Date(2012, 0, 5, 12), -4)).toEqual(new Date(2011, 11, 29, 12)); + }); + }); + + inTimeZone("America/Sao_Paulo", () => { + it("should keep the time-of-day across the summer time start of 4 November 2018", () => { + const result = addBusinessDays(new Date(2018, 10, 1, 9, 30, 15, 500), 5); + + expect(result).toEqual(new Date(2018, 10, 9, 9, 30, 15, 500)); + expect(result?.getHours()).toBe(9); + }); + }); + + inTimeZone("Australia/Lord_Howe", () => { + it("should keep the minutes across the half hour transition of 6 October 2024", () => { + const result = addBusinessDays(new Date(2024, 9, 3, 2, 15), 2); + + expect(result).toEqual(new Date(2024, 9, 7, 2, 15)); + expect(result?.getMinutes()).toBe(15); + }); + }); + describe("properties", () => { const amounts = fc.integer({ min: -200, max: 200 }); diff --git a/src/add-business-days/add-business-days.ts b/src/add-business-days/add-business-days.ts index 8696a6c51..57f9c3a1b 100644 --- a/src/add-business-days/add-business-days.ts +++ b/src/add-business-days/add-business-days.ts @@ -1,3 +1,5 @@ +import { HOLIDAYS_MAX_YEAR, HOLIDAYS_MIN_YEAR } from "../_internals/constants/holidays"; +import { eachLocalDay } from "../_internals/each-local-day/each-local-day"; import { isSupportedHolidayYear } from "../_internals/is-supported-holiday-year/is-supported-holiday-year"; import { isValidDate } from "../_internals/is-valid-date/is-valid-date"; import { type BusinessDayOptions, isBusinessDay } from "../is-business-day/is-business-day"; @@ -8,7 +10,8 @@ export type { BusinessDayOptions } from "../is-business-day/is-business-day"; * Adds a number of Brazilian business days (dias úteis) to a date. * * A business day is a day for which `isBusinessDay` returns `true` (not a Saturday, a - * Sunday, or a Brazilian holiday), evaluated with the same `options`. The function walks one + * Sunday, or a Brazilian holiday; `options.includeSaturday` keeps Saturday), evaluated with + * the same `options`. The function walks one * calendar day at a time, in the direction of `amount`, counting only business days, so it is * exact regardless of the arrangement of holidays around `date` (cheap in practice: * `getHolidays` is memoized per year). @@ -21,7 +24,16 @@ export type { BusinessDayOptions } from "../is-business-day/is-business-day"; * positively. * * The time-of-day (hours, minutes, seconds, milliseconds) of `date` is preserved in the - * result, and `date` itself is never mutated. + * result, daylight saving transitions along the way included, and `date` itself is never + * mutated. The one case that cannot be honoured is a time of day the resulting local day does + * not have, such as `00:30` on a day whose clocks jump from `00:00` to `01:00`: the result is + * then the nearest instant of that day, `01:30`. + * + * `options.includeSaturday` defaults to `false`, the Monday to Friday banking count. Pass `true` + * for the labour law count of Instrução Normativa MTP nº 2/2021, art. 14, I, which includes + * Saturday and still excludes Sunday and holidays, so a holiday that falls on a Saturday is never + * counted. See `isBusinessDay` for the law behind it and for what it does not cover: municipal + * holidays, which `getHolidays` does not carry. * * If `options.stateCode` is provided but is not a valid/known state code, it is ignored and * only national holidays are considered (same behavior as `getHolidays`/`isBusinessDay`), so a @@ -33,9 +45,10 @@ export type { BusinessDayOptions } from "../is-business-day/is-business-day"; * * @param {Date} date - The date to count from. Never mutated: a new `Date` is returned. * @param {number} amount - The number of business days to add; a negative value walks backwards. - * @param {BusinessDayOptions} [options] - Which holidays count as non-business days. + * @param {BusinessDayOptions} [options] - Which days count as business days. * @param {StateCode} [options.stateCode] - Brazilian state code whose state holidays are also considered. * @param {boolean} [options.includeOptional] - Whether optional holidays count as non-business days (default: `true`). + * @param {boolean} [options.includeSaturday] - Whether Saturday counts as a business day (default: `false`). * @returns {Date | null} A new `Date`, `amount` business days after `date`. `null` on bad * input: a `date` that is not a valid `Date` or is outside 1900-2099, an `amount` that is not a * finite integer, a `stateCode` that is not a string, or a walk that leaves the supported years. @@ -46,6 +59,8 @@ export type { BusinessDayOptions } from "../is-business-day/is-business-day"; * addBusinessDays(new Date(2024, 11, 31, 12), 1); // Thu 2025-01-02, 12:00 (Jan 1 is Ano novo, skipped) * addBusinessDays(new Date(2024, 0, 5, 12), -1); // Thu 2024-01-04, 12:00 (walks backwards) * addBusinessDays(new Date(2024, 0, 6, 12), 0); // Sat 2024-01-06, 12:00 (unchanged, even though Saturday is not a business day) + * addBusinessDays(new Date(2024, 0, 5, 12), 1, { includeSaturday: true }); // Sat 2024-01-06, 12:00 (labour count) + * addBusinessDays(new Date(2024, 10, 1, 12), 1, { includeSaturday: true }); // Mon 2024-11-04, 12:00 (Nov 2 is Finados, a holiday on a Saturday) * addBusinessDays(new Date(2024, 6, 8, 12), 1, { stateCode: "SP" }); // Wed 2024-07-10, 12:00 (Jul 9 is a state holiday in SP) * addBusinessDays(new Date("not a date"), 1); // null * addBusinessDays(new Date(2024, 0, 2), 1.5); // null (not an integer) @@ -74,24 +89,35 @@ export const addBusinessDays = ( if (!isSupportedHolidayYear(date.getFullYear())) return null; - const result = new Date(date); + if (amount === 0) return new Date(date); - const hours = result.getHours(); - // Stryker disable next-line EqualityOperator: when amount is 0, remaining is 0 below and the loop never reads step, so > vs >= here is unobservable + // Stryker disable next-line EqualityOperator: amount is never 0 here, so > vs >= is unobservable const step = amount > 0 ? 1 : -1; let remaining = Math.abs(amount); - while (remaining > 0) { - result.setDate(result.getDate() + step); - - if (!isSupportedHolidayYear(result.getFullYear())) return null; + const walk = eachLocalDay({ + from: Date.UTC(date.getFullYear(), date.getMonth(), date.getDate() + step), + until: + step === 1 ? Date.UTC(HOLIDAYS_MAX_YEAR + 1, 0, 1) : Date.UTC(HOLIDAYS_MIN_YEAR - 1, 11, 31), + }); - if (isBusinessDay(result, options)) { + for (const candidate of walk) { + if (isBusinessDay(candidate, options)) { remaining -= 1; + + if (remaining === 0) { + return new Date( + candidate.getFullYear(), + candidate.getMonth(), + candidate.getDate(), + date.getHours(), + date.getMinutes(), + date.getSeconds(), + date.getMilliseconds(), + ); + } } } - result.setHours(hours); - - return result; + return null; }; diff --git a/src/difference-in-business-days/difference-in-business-days.test.ts b/src/difference-in-business-days/difference-in-business-days.test.ts index 5669113d6..c5cd34fe0 100644 --- a/src/difference-in-business-days/difference-in-business-days.test.ts +++ b/src/difference-in-business-days/difference-in-business-days.test.ts @@ -6,7 +6,7 @@ import { PROTOTYPE_KEYS, } from "../_internals/test/arbitraries"; import { expectNeverThrowsWithArguments } from "../_internals/test/properties"; -import { describe, expect, expectTypeOf, it, test } from "../_internals/test/runtime"; +import { describe, expect, expectTypeOf, inTimeZone, it, test } from "../_internals/test/runtime"; import { addBusinessDays } from "../add-business-days/add-business-days"; import { type BusinessDayOptions, isBusinessDay } from "../is-business-day/is-business-day"; import { differenceInBusinessDays } from "./difference-in-business-days"; @@ -100,6 +100,51 @@ describe("differenceInBusinessDays", () => { }); }); + describe("includeSaturday", () => { + it("should count the Saturday of the first week of 2024 (Mon 2024-01-01 to Mon 2024-01-08: 4 without the option, 5 with it)", () => { + expect(differenceInBusinessDays(new Date(2024, 0, 8), new Date(2024, 0, 1))).toBe(4); + expect( + differenceInBusinessDays(new Date(2024, 0, 8), new Date(2024, 0, 1), { + includeSaturday: true, + }), + ).toBe(5); + }); + + it("should skip Finados on Saturday 2024-11-02 and count the plain Saturday 2024-11-09 (Nov 1 to Nov 11: 6 without the option, 7 with it)", () => { + expect(differenceInBusinessDays(new Date(2024, 10, 11), new Date(2024, 10, 1))).toBe(6); + expect( + differenceInBusinessDays(new Date(2024, 10, 11), new Date(2024, 10, 1), { + includeSaturday: true, + }), + ).toBe(7); + }); + + it("should count only Friday 2024-11-01 over a Saturday holiday and a Sunday (Nov 1 to Nov 4)", () => { + const result = differenceInBusinessDays(new Date(2024, 10, 4), new Date(2024, 10, 1), { + includeSaturday: true, + }); + + expect(result).toBe(1); + }); + + it("should keep the sign convention when the later date comes first (Mon 2024-01-08 down to Tue 2024-01-02: -5 without the option, -6 with it)", () => { + expect(differenceInBusinessDays(new Date(2024, 0, 1), new Date(2024, 0, 8))).toBe(-5); + expect( + differenceInBusinessDays(new Date(2024, 0, 1), new Date(2024, 0, 8), { + includeSaturday: true, + }), + ).toBe(-6); + }); + + it("should give the same count as no options when includeSaturday is false", () => { + const result = differenceInBusinessDays(new Date(2024, 0, 8), new Date(2024, 0, 1), { + includeSaturday: false, + }); + + expect(result).toBe(4); + }); + }); + describe("invalid input", () => { it("should return null when called without arguments", () => { // @ts-expect-error: intentionally invalid input @@ -164,6 +209,40 @@ describe("differenceInBusinessDays", () => { }); }); + inTimeZone("Pacific/Apia", () => { + it("should count the 20 business days December 2011 has there, the missing 30th excluded", () => { + expect(differenceInBusinessDays(new Date(2011, 11, 1), new Date(2011, 11, 31))).toBe(-20); + }); + + it("should add the five Saturdays of 2 to 31 December 2011 with includeSaturday, still without the 30th (-25)", () => { + const result = differenceInBusinessDays(new Date(2011, 11, 1), new Date(2011, 11, 31), { + includeSaturday: true, + }); + + expect(result).toBe(-25); + }); + }); + + inTimeZone("UTC", () => { + it("should count 21 for the same December, where the 30th is an ordinary Friday", () => { + expect(differenceInBusinessDays(new Date(2011, 11, 1), new Date(2011, 11, 31))).toBe(-21); + }); + + it("should count 26 for the same December with includeSaturday", () => { + const result = differenceInBusinessDays(new Date(2011, 11, 1), new Date(2011, 11, 31), { + includeSaturday: true, + }); + + expect(result).toBe(-26); + }); + }); + + inTimeZone("America/Sao_Paulo", () => { + it("should count November 2018 across the summer time start of the 4th", () => { + expect(differenceInBusinessDays(new Date(2018, 10, 30), new Date(2018, 10, 1))).toBe(19); + }); + }); + describe("properties", () => { const amounts = fc.integer({ min: -100, max: 100 }); diff --git a/src/difference-in-business-days/difference-in-business-days.ts b/src/difference-in-business-days/difference-in-business-days.ts index 6b24db617..383c3034e 100644 --- a/src/difference-in-business-days/difference-in-business-days.ts +++ b/src/difference-in-business-days/difference-in-business-days.ts @@ -1,3 +1,4 @@ +import { eachLocalDay } from "../_internals/each-local-day/each-local-day"; import { isSupportedHolidayYear } from "../_internals/is-supported-holiday-year/is-supported-holiday-year"; import { isValidDate } from "../_internals/is-valid-date/is-valid-date"; import { type BusinessDayOptions, isBusinessDay } from "../is-business-day/is-business-day"; @@ -22,7 +23,13 @@ const toLocalDayTimestamp = (date: Date): number => * zero, never `-0`). * * A business day is a day for which `isBusinessDay` returns `true` (not a Saturday, a Sunday, - * or a Brazilian holiday), evaluated with the same `options`. + * or a Brazilian holiday; `options.includeSaturday` keeps Saturday), evaluated with the same `options`. + * + * `options.includeSaturday` defaults to `false`, the Monday to Friday banking count. Pass `true` + * for the labour law count of Instrução Normativa MTP nº 2/2021, art. 14, I, which includes + * Saturday and still excludes Sunday and holidays, so a holiday that falls on a Saturday is never + * counted. See `isBusinessDay` for the law behind it and for what it does not cover: municipal + * holidays, which `getHolidays` does not carry. * * If `options.stateCode` is provided but is not a valid/known state code, it is ignored and only * national holidays are considered (same behavior as `getHolidays`/`isBusinessDay`), so a @@ -34,9 +41,10 @@ const toLocalDayTimestamp = (date: Date): number => * * @param {Date} laterDate - The date to count to. Never counted itself, regardless of whether it is a business day. * @param {Date} earlierDate - The date to count from. Counted as a business day when it is one; never mutated. - * @param {BusinessDayOptions} [options] - Which holidays count as non-business days. + * @param {BusinessDayOptions} [options] - Which days count as business days. * @param {StateCode} [options.stateCode] - Brazilian state code whose state holidays are also considered. * @param {boolean} [options.includeOptional] - Whether optional holidays count as non-business days (default: `true`). + * @param {boolean} [options.includeSaturday] - Whether Saturday counts as a business day (default: `false`). * @returns {number | null} The number of business days between the two dates, or `null` on bad * input: a `laterDate`/`earlierDate` that is not a valid `Date` or is outside 1900-2099, or a * `stateCode` that is not a string. @@ -47,6 +55,9 @@ const toLocalDayTimestamp = (date: Date): number => * differenceInBusinessDays(new Date(2024, 0, 3), new Date(2024, 0, 2)); // 1 (Jan 2 counted, a Tuesday; Jan 3 is not) * differenceInBusinessDays(new Date(2024, 0, 2), new Date(2024, 0, 3)); // -1 (the later date comes first, so the count is negative) * differenceInBusinessDays(new Date(2024, 0, 2), new Date(2024, 0, 2)); // 0 (same day) + * differenceInBusinessDays(new Date(2024, 0, 8), new Date(2024, 0, 1)); // 4 (Jan 2 to Jan 5, banking count) + * differenceInBusinessDays(new Date(2024, 0, 8), new Date(2024, 0, 1), { includeSaturday: true }); // 5 (Jan 6, a Saturday, also counts) + * differenceInBusinessDays(new Date(2024, 10, 4), new Date(2024, 10, 1), { includeSaturday: true }); // 1 (Nov 2 is Finados, a holiday on a Saturday) * differenceInBusinessDays(new Date(2024, 6, 10), new Date(2024, 6, 8), { stateCode: "SP" }); // 1 (Jul 9 is a state holiday in SP) * differenceInBusinessDays(new Date(), new Date("not a date")); // null * differenceInBusinessDays(new Date(2100, 0, 5), new Date(2100, 0, 4)); // null (outside the supported years) @@ -78,20 +89,12 @@ export const differenceInBusinessDays = ( const laterDay = toLocalDayTimestamp(laterDate); const earlierDay = toLocalDayTimestamp(earlierDate); - - // Stryker disable next-line EqualityOperator: when the two days are equal, the loop below never runs (movingDate already equals laterDay), so < vs <= here is unobservable - const step = earlierDay < laterDay ? 1 : -1; - const movingDate = new Date( - earlierDate.getFullYear(), - earlierDate.getMonth(), - earlierDate.getDate(), - ); + const step = Math.sign(laterDay - earlierDay); let result = 0; - while (toLocalDayTimestamp(movingDate) !== laterDay) { - if (isBusinessDay(movingDate, options)) result += step; - movingDate.setDate(movingDate.getDate() + step); + for (const candidate of eachLocalDay({ from: earlierDay, until: laterDay })) { + if (isBusinessDay(candidate, options)) result += step; } return result; diff --git a/src/format-cest/format-cest.test.ts b/src/format-cest/format-cest.test.ts new file mode 100644 index 000000000..9b4f65013 --- /dev/null +++ b/src/format-cest/format-cest.test.ts @@ -0,0 +1,113 @@ +import { anyGarbage, digits, digitsUpTo } from "../_internals/test/arbitraries"; +import { + expectIdempotent, + expectMatchesPattern, + expectNeverThrows, + expectPadsToLength, +} from "../_internals/test/properties"; +import { describe, expect, expectTypeOf, it, test } from "../_internals/test/runtime"; +import { parseCest } from "../parse-cest/parse-cest"; +import { formatCest, type FormatCestOptions } from "./format-cest"; + +describe("formatCest", () => { + it("should format a CEST given as digits", () => { + expect(formatCest("0100100")).toBe("01.001.00"); + }); + + it("should format a CEST given as a number", () => { + expect(formatCest(2_899_900)).toBe("28.999.00"); + }); + + it("should leave a CEST that already has the mask as it is", () => { + expect(formatCest("17.024.05")).toBe("17.024.05"); + }); + + it("should mask a partial value progressively by default", () => { + expect(formatCest("0")).toBe("0"); + expect(formatCest("01")).toBe("01"); + expect(formatCest("010")).toBe("01.0"); + expect(formatCest("01001")).toBe("01.001"); + expect(formatCest("010010")).toBe("01.001.0"); + }); + + it("should not pad a number by default, so a lost leading zero shifts the mask", () => { + expect(formatCest(100_100)).toBe("10.010.0"); + }); + + it("should not check the code against the annexes", () => { + expect(formatCest("0000000")).toBe("00.000.00"); + }); + + it("should not add digits after the CEST length", () => { + expect(formatCest("01001009999")).toBe("01.001.00"); + }); + + describe("pad option", () => { + it("should left pad a short value with zeros up to the 7 digits", () => { + expect(formatCest("", { pad: true })).toBe("00.000.00"); + expect(formatCest("1", { pad: true })).toBe("00.000.01"); + expect(formatCest("100100", { pad: true })).toBe("01.001.00"); + expect(formatCest("2899900", { pad: true })).toBe("28.999.00"); + }); + + it("should left pad a number the same way as its digits", () => { + expect(formatCest(100_100, { pad: true })).toBe("01.001.00"); + }); + + it("should mask progressively for an explicit false", () => { + expect(formatCest("01001", { pad: false })).toBe("01.001"); + }); + }); + + it("should return an empty string for an empty value, and for null and undefined even under pad", () => { + expect(formatCest("")).toBe(""); + // @ts-expect-error not a string or number + expect(formatCest(null)).toBe(""); + // @ts-expect-error not a string or number + expect(formatCest()).toBe(""); + // @ts-expect-error not a string or number + expect(formatCest(null, { pad: true })).toBe(""); + }); + + it("should read only the digits of a value with other characters, like formatCpf", () => { + expect(formatCest("abc0100100")).toBe("01.001.00"); + expect(formatCest("01-001/00")).toBe("01.001.00"); + expect(formatCest(-2_899_900)).toBe("28.999.00"); + }); + + it("should return an empty string for a null-prototype object", () => { + expect(formatCest(Object.create(null))).toBe(""); + }); + + describe("properties", () => { + const sevenDigitArbitrary = digits(7); + + test("should never throw, regardless of the input", () => { + expectNeverThrows(formatCest, anyGarbage); + }); + + test("should format every 7 digit value in the NN.NNN.NN pattern", () => { + expectMatchesPattern(formatCest, /^\d{2}\.\d{3}\.\d{2}$/, sevenDigitArbitrary); + }); + + test("should left pad every shorter value to a complete code when padding", () => { + expectPadsToLength(formatCest, parseCest, digitsUpTo(7), 7); + }); + + test("should be idempotent on a full 7 digit code", () => { + expectIdempotent(formatCest, sevenDigitArbitrary); + }); + }); +}); + +describe("formatCest types", () => { + test("should take a string or number value and options and return a string", () => { + expectTypeOf(formatCest).parameter(0).toEqualTypeOf(); + expectTypeOf(formatCest).parameter(1).toEqualTypeOf(); + expectTypeOf(formatCest).returns.toEqualTypeOf(); + }); + + test("should type the pad option as an optional boolean", () => { + expectTypeOf().toEqualTypeOf(); + }); +}); diff --git a/src/format-cest/format-cest.ts b/src/format-cest/format-cest.ts new file mode 100644 index 000000000..509060adf --- /dev/null +++ b/src/format-cest/format-cest.ts @@ -0,0 +1,59 @@ +import { format } from "../_internals/format/format"; +import { isNullish } from "../_internals/is-nullish/is-nullish"; +import { sanitizeToDigits } from "../_internals/sanitize-to-digits/sanitize-to-digits"; + +/** Options of `formatCest`. */ +export type FormatCestOptions = { + /** Whether to left pad the value with zeros up to the 7 digits of a complete CEST (default: `false`). */ + pad?: boolean; +}; + +/** + * Formats a CEST (Código Especificador da Substituição Tributária) in the `NN.NNN.NN` form the + * annexes of Convênio ICMS 142/18 print: segment, item of the segment and specification of the + * item. + * + * This is a purely structural transformation, it does not check the code against the annexes, + * use `isValidCest` for that. + * + * With the default `pad: false` the mask is applied progressively, as far as the value goes, + * which is what an input being typed into needs (`"01"` stays `"01"`, `"01001"` becomes + * `"01.001"`). With `pad: true` the value is first left padded with zeros to the 7 digits of a + * complete code, so it always comes back fully masked (`"100100"` gives `"01.001.00"`). A number + * is treated exactly like the string of its digits: it is only padded under `pad: true`, so + * `formatCest(100100)` gives `"10.010.0"` and `formatCest(100100, { pad: true })` gives + * `"01.001.00"`. + * + * Like every formatter of this package, the value is read for its digits and masked as far as + * they go: characters outside the mask are dropped (`formatCest("abc0100100")` gives + * `"01.001.00"`) and a number is read as the string of its digits, sign and decimal point + * included. This is the input-mask contract of `formatCpf`; use `isValidCest` to check a code. + * + * @param {string|number} value - The CEST to be formatted. + * @param {FormatCestOptions} [options] - Optional formatting options. + * @param {boolean} [options.pad] - Whether to pad the value with leading zeros. Defaults to `false`. + * @returns {string} The formatted code in the `NN.NNN.NN` pattern, or an empty string when + * there is nothing to format. + * + * @example + * ```typescript + * formatCest("0100100"); // "01.001.00" + * formatCest(2899900); // "28.999.00" + * formatCest("01001"); // "01.001" (partial values are masked as far as they go) + * formatCest(100100, { pad: true }); // "01.001.00" (padded to 7 digits first) + * formatCest("abc0100100"); // "01.001.00" (only the digits are read) + * ``` + * + * @see Official: https://www.confaz.fazenda.gov.br/legislacao/convenios/2018/CV142_18 + * Convênio ICMS 142/18, cláusula sexta, IV (the 7 digits and their three groups) and Anexos II + * to XXVI, which print the codes in the "NN.NNN.NN" form. + */ +export const formatCest = (value: string | number, options?: FormatCestOptions): string => { + if (isNullish(value)) return ""; + + return format({ + pad: options?.pad, + value: sanitizeToDigits(value), + pattern: "00.000.00", + }); +}; diff --git a/src/format-cid10/format-cid10.test.ts b/src/format-cid10/format-cid10.test.ts new file mode 100644 index 000000000..306b5fc18 --- /dev/null +++ b/src/format-cid10/format-cid10.test.ts @@ -0,0 +1,94 @@ +import * as fc from "fast-check"; + +import { anyGarbage, anyText } from "../_internals/test/arbitraries"; +import { + expectIdempotent, + expectMatchesPattern, + expectNeverThrows, + expectRoundTrip, +} from "../_internals/test/properties"; +import { describe, expect, expectTypeOf, it, test } from "../_internals/test/runtime"; +import { parseCid10 } from "../parse-cid10/parse-cid10"; +import { formatCid10 } from "./format-cid10"; + +describe("formatCid10", () => { + it("should add the dot to a subcategory", () => { + expect(formatCid10("A000")).toBe("A00.0"); + expect(formatCid10("M545")).toBe("M54.5"); + }); + + it("should keep a subcategory that already has the dot", () => { + expect(formatCid10("A00.0")).toBe("A00.0"); + }); + + it("should leave a category without a dot", () => { + expect(formatCid10("A00")).toBe("A00"); + expect(formatCid10("A00.")).toBe("A00"); + }); + + it("should upper case the letter", () => { + expect(formatCid10("f322")).toBe("F32.2"); + }); + + it("should mask a partial value progressively", () => { + expect(formatCid10("A")).toBe("A"); + expect(formatCid10("A0")).toBe("A0"); + expect(formatCid10("A00")).toBe("A00"); + expect(formatCid10("A000")).toBe("A00.0"); + }); + + it("should drop the characters outside the mask", () => { + expect(formatCid10(" A-00/0 ")).toBe("A00.0"); + }); + + it("should not add characters after the subcategory length", () => { + expect(formatCid10("A00.01")).toBe("A00.0"); + expect(formatCid10("A00012345")).toBe("A00.0"); + }); + + it("should not validate whether the code exists in the official table", () => { + expect(formatCid10("Z999")).toBe("Z99.9"); + expect(formatCid10("0A9Z")).toBe("0A9.Z"); + }); + + it("should return an empty string for an empty value", () => { + expect(formatCid10("")).toBe(""); + expect(formatCid10(" . ")).toBe(""); + }); + + it("should return an empty string for a value that is not a string", () => { + // @ts-expect-error not a string + expect(formatCid10(null)).toBe(""); + // @ts-expect-error not a string + expect(formatCid10()).toBe(""); + // @ts-expect-error not a string + expect(formatCid10(1000)).toBe(""); + // @ts-expect-error not a string + expect(formatCid10(["A000"])).toBe(""); + }); + + describe("properties", () => { + test("should never throw, regardless of the input", () => { + expectNeverThrows(formatCid10, anyGarbage); + }); + + test("should always return a value shaped like the mask, as far as it goes", () => { + expectMatchesPattern(formatCid10, /^(?:[A-Z0-9]{0,3}|[A-Z0-9]{3}\.[A-Z0-9])$/, anyText); + }); + + test("should be idempotent", () => { + expectIdempotent(formatCid10, anyText); + }); + + test("should round trip with parseCid10", () => { + expectRoundTrip(formatCid10, parseCid10, fc.stringMatching(/^[A-Z]\d{2,3}$/)); + }); + }); +}); + +describe("formatCid10 types", () => { + test("should take a string and return a string", () => { + expectTypeOf(formatCid10).parameter(0).toEqualTypeOf(); + expectTypeOf(formatCid10).returns.toEqualTypeOf(); + }); +}); diff --git a/src/format-cid10/format-cid10.ts b/src/format-cid10/format-cid10.ts new file mode 100644 index 000000000..15568f046 --- /dev/null +++ b/src/format-cid10/format-cid10.ts @@ -0,0 +1,32 @@ +import { format } from "../_internals/format/format"; +import { parseCid10 } from "../parse-cid10/parse-cid10"; + +/** + * Formats a CID-10 (Classificação Internacional de Doenças, 10th revision) code the way it is + * printed: upper case, with a dot between the 3 character category and the fourth character of + * the subcategory. + * + * This is a purely structural transformation, it does not check the code against the official + * table, use `isValidCid10` for that. The mask is applied progressively, as far as the value + * goes, which is what an input being typed into needs: a category stays as it is (`"A00"`) and + * the dot only shows up with the fourth character. Characters outside the mask are dropped and + * the value is capped at the 4 characters of a subcategory. + * + * @param {string} value - The CID-10 code to be formatted. + * @returns {string} The formatted code in the `A00.0` pattern, or an empty string when there is + * nothing to format or the value is not a string. + * + * @example + * ```typescript + * formatCid10("A000"); // "A00.0" + * formatCid10("f322"); // "F32.2" + * formatCid10("A00"); // "A00" (a category has no dot) + * formatCid10("A00.0"); // "A00.0" + * ``` + * + * @see Official: http://www2.datasus.gov.br/cid10/V2008/descrcsv.htm + * The DATASUS description of the CID-10 tables: `SUBCAT` is the subcategory code without the dot + * and `DESCRABREV` prints it with the dot (`A00.0`). + */ +export const formatCid10 = (value: string): string => + format({ value: parseCid10(value), pattern: "000.0" }); diff --git a/src/format-cnh/constants.ts b/src/format-cnh/constants.ts new file mode 100644 index 000000000..7bef84033 --- /dev/null +++ b/src/format-cnh/constants.ts @@ -0,0 +1,9 @@ +export const PATTERN = "000000000-00"; + +/** + * No authority publishes a masking rule for the CNH registry number, so this applies the rule + * Lei nº 12.309/2010, art. 87, § 5º, sets for the CPF ("ocultar os três primeiros dígitos e os + * dois dígitos verificadores") to a number with the same structure: the first 3 digits and the + * 2 check digits are hidden, e.g. "***456789-**". + */ +export const OBFUSCATED_PATTERN = "***000000-**"; diff --git a/src/format-cnh/format-cnh.test.ts b/src/format-cnh/format-cnh.test.ts index 51e0c9e5d..728495434 100644 --- a/src/format-cnh/format-cnh.test.ts +++ b/src/format-cnh/format-cnh.test.ts @@ -36,6 +36,21 @@ describe("formatCnh", () => { expect(formatCnh()).toBe(""); }); + it("should hide the first 3 digits and the 2 check digits when obfuscate is truthy", () => { + expect(formatCnh("98765432119", { obfuscate: true })).toBe("***654321-**"); + expect(formatCnh(98_765_432_119, { obfuscate: true })).toBe("***654321-**"); + expect(formatCnh("9876", { obfuscate: true })).toBe("***6"); + expect(formatCnh("9876", { pad: true, obfuscate: true })).toBe("***000098-**"); + // @ts-expect-error: intentionally not a boolean + expect(formatCnh("98765432119", { obfuscate: "yes" })).toBe("***654321-**"); + }); + + it("should behave exactly as without the option when obfuscate is falsy", () => { + expect(formatCnh("98765432119", { obfuscate: false })).toBe("987654321-19"); + // @ts-expect-error: intentionally not a boolean + expect(formatCnh("9876", { pad: true, obfuscate: "" })).toBe("000000098-76"); + }); + describe("properties", () => { const upToACnh = digitsUpTo(11); @@ -47,6 +62,14 @@ describe("formatCnh", () => { expectMatchesPattern(formatCnh, /^\d{9}-\d{2}$/, digits(11)); }); + test("should produce the documented obfuscated shape for a full CNH", () => { + expectMatchesPattern( + (value: string) => formatCnh(value, { obfuscate: true }), + /^\*{3}\d{6}-\*{2}$/, + digits(11), + ); + }); + test("should left pad a shorter value up to the CNH length", () => { expectPadsToLength(formatCnh, parseCnh, upToACnh, 11); }); @@ -64,7 +87,8 @@ describe("formatCnh types", () => { expectTypeOf(formatCnh).returns.toEqualTypeOf(); }); - test("should type the pad option as an optional boolean", () => { + test("should type the pad and obfuscate options as optional booleans", () => { expectTypeOf().toEqualTypeOf(); + expectTypeOf().toEqualTypeOf(); }); }); diff --git a/src/format-cnh/format-cnh.ts b/src/format-cnh/format-cnh.ts index 2086a9f8c..188cddd6c 100644 --- a/src/format-cnh/format-cnh.ts +++ b/src/format-cnh/format-cnh.ts @@ -1,11 +1,14 @@ import { format } from "../_internals/format/format"; import { isNullish } from "../_internals/is-nullish/is-nullish"; import { sanitizeToDigits } from "../_internals/sanitize-to-digits/sanitize-to-digits"; +import { OBFUSCATED_PATTERN, PATTERN } from "./constants"; /** Options of `formatCnh`. */ export type FormatCnhOptions = { /** Whether to left pad the value with zeros up to the number of slots in the pattern (default: `false`). */ pad?: boolean; + /** Whether to hide the first 3 digits and the 2 check digits with `*` (default: `false`, read for truthiness like `pad`). */ + obfuscate?: boolean; }; /** @@ -14,19 +17,29 @@ export type FormatCnhOptions = { * @param {string|number} value - The CNH number to be formatted. * @param {FormatCnhOptions} [options] - Optional options. * @param {boolean} [options.pad] - Whether to pad the value with leading zeros. + * @param {boolean} [options.obfuscate] - If truthy, hides the first 3 digits and the 2 check + * digits. Read for truthiness, the way `pad` is, so a non-boolean such as `1` obfuscates too. * @returns {string} The formatted CNH, or an empty string when there is nothing to format. * * @example * ```typescript * formatCnh("12345678900"); // "123456789-00" * formatCnh("8900", { pad: true }); // "000000089-00" + * formatCnh("12345678900", { obfuscate: true }); // "***456789-**" * ``` * * Resolução CONTRAN nº 886/2021, art. 4º I, defines the CNH registry number as 9 characters plus * 2 security check digits, which is the layout this mask reproduces; no official text publishes * the check-digit weights used to compute them. * + * No authority publishes a masking rule for the CNH either, so `obfuscate` applies the one Lei nº + * 12.309/2010, art. 87, § 5º, sets for the CPF, a number with the same structure: the first 3 + * digits and the 2 check digits are hidden. + * * @see Official: https://www.gov.br/transportes/pt-br/assuntos/transito/conteudo-contran/resolucoes/Resolucao8862021F.pdf + * @see Official: https://www.planalto.gov.br/ccivil_03/_ato2007-2010/2010/lei/l12309.htm + * Lei nº 12.309/2010, art. 87, § 5º: "ocultar os três primeiros dígitos e os dois dígitos + * verificadores do CPF", the rule `obfuscate` borrows. */ export const formatCnh = (value: string | number, options?: FormatCnhOptions): string => isNullish(value) @@ -34,5 +47,5 @@ export const formatCnh = (value: string | number, options?: FormatCnhOptions): s : format({ pad: options?.pad, value: sanitizeToDigits(value), - pattern: "000000000-00", + pattern: (options?.obfuscate ?? false) ? OBFUSCATED_PATTERN : PATTERN, }); diff --git a/src/format-nbs/format-nbs.test.ts b/src/format-nbs/format-nbs.test.ts new file mode 100644 index 000000000..20dcf0cf7 --- /dev/null +++ b/src/format-nbs/format-nbs.test.ts @@ -0,0 +1,80 @@ +import { anyGarbage, anyValue, digits } from "../_internals/test/arbitraries"; +import { + expectAlwaysReturnsType, + expectIdempotent, + expectMatchesPattern, + expectNeverThrows, +} from "../_internals/test/properties"; +import { describe, expect, expectTypeOf, it, test } from "../_internals/test/runtime"; +import { formatNbs } from "./format-nbs"; + +describe("formatNbs", () => { + it("should format an NBS code given as digits", () => { + expect(formatNbs("101011100")).toBe("1.0101.11.00"); + }); + + it("should format an NBS code given as a number", () => { + expect(formatNbs(126_050_000)).toBe("1.2605.00.00"); + }); + + it("should keep a code that already has the mask", () => { + expect(formatNbs("1.0101.11.00")).toBe("1.0101.11.00"); + }); + + it("should not validate whether the code exists in the official table", () => { + expect(formatNbs("999999999")).toBe("9.9999.99.99"); + }); + + it("should mask a partial value progressively", () => { + expect(formatNbs("1")).toBe("1"); + expect(formatNbs("10")).toBe("1.0"); + expect(formatNbs("10101")).toBe("1.0101"); + expect(formatNbs("101011")).toBe("1.0101.1"); + expect(formatNbs("1010111")).toBe("1.0101.11"); + expect(formatNbs("10101110")).toBe("1.0101.11.0"); + }); + + it("should drop the characters outside the mask and the digits after the ninth", () => { + expect(formatNbs("abc101011100")).toBe("1.0101.11.00"); + expect(formatNbs("1010111009")).toBe("1.0101.11.00"); + }); + + it("should return an empty string when there is no digit", () => { + expect(formatNbs("")).toBe(""); + expect(formatNbs("abc")).toBe(""); + }); + + it("should return an empty string for null and undefined", () => { + // @ts-expect-error not a string or number + expect(formatNbs(null)).toBe(""); + // @ts-expect-error not a string or number + expect(formatNbs()).toBe(""); + }); + + describe("properties", () => { + const nineDigits = digits(9); + + test("should never throw, regardless of the input", () => { + expectNeverThrows(formatNbs, anyGarbage); + }); + + test("should always return a string", () => { + expectAlwaysReturnsType(formatNbs, "string", anyValue); + }); + + test("should format every 9 digit value in the N.NNNN.NN.NN pattern", () => { + expectMatchesPattern(formatNbs, /^\d\.\d{4}\.\d{2}\.\d{2}$/, nineDigits); + }); + + test("should be idempotent on a full 9 digit code", () => { + expectIdempotent(formatNbs, nineDigits); + }); + }); +}); + +describe("formatNbs types", () => { + test("should take a string or number value and return a string", () => { + expectTypeOf(formatNbs).parameters.toEqualTypeOf<[value: string | number]>(); + expectTypeOf(formatNbs).returns.toEqualTypeOf(); + }); +}); diff --git a/src/format-nbs/format-nbs.ts b/src/format-nbs/format-nbs.ts new file mode 100644 index 000000000..075b037f6 --- /dev/null +++ b/src/format-nbs/format-nbs.ts @@ -0,0 +1,31 @@ +import { format } from "../_internals/format/format"; +import { isNullish } from "../_internals/is-nullish/is-nullish"; +import { sanitizeToDigits } from "../_internals/sanitize-to-digits/sanitize-to-digits"; + +/** + * Formats an NBS (Nomenclatura Brasileira de Serviços, Intangíveis e Outras Operações que + * Produzam Variações no Patrimônio) code into the `N.NNNN.NN.NN` mask the nomenclature prints. + * + * This is a purely structural transformation, it does not check the code against the official + * table, use `isValidNbs` for that. Like every formatter of this package, the value is read for + * its digits and masked as far as they go, so a partial code still being typed is masked + * progressively, characters outside the mask are dropped and anything without a digit gives + * `""` instead of throwing. Every NBS code starts with 1, so there is no zero padding to offer. + * + * @param {string|number} value - The NBS code to be formatted. + * @returns {string} The formatted code in the `N.NNNN.NN.NN` pattern, or an empty string when + * there is nothing to format. + * + * @example + * ```typescript + * formatNbs("101011100"); // "1.0101.11.00" + * formatNbs(101011100); // "1.0101.11.00" + * formatNbs("10101"); // "1.0101" (partial values are masked as far as they go) + * ``` + * + * @see Official: https://www.gov.br/mdic/pt-br/images/REPOSITORIO/scs/decos/NBS/Anexoa_Ia_NBSa_2.0a_coma_alteraa_esa_6.12.18.pdf + * Anexo I of the Portaria Conjunta RFB/SCS 2.000/2018, NBS 2.0: "Formação do código da NBS" and + * the `N.NNNN.NN.NN` form every code of the nomenclature is printed in. + */ +export const formatNbs = (value: string | number): string => + isNullish(value) ? "" : format({ value: sanitizeToDigits(value), pattern: "0.0000.00.00" }); diff --git a/src/format-phone/constants.ts b/src/format-phone/constants.ts index c332d91a1..b6a339330 100644 --- a/src/format-phone/constants.ts +++ b/src/format-phone/constants.ts @@ -20,21 +20,76 @@ export const DEFAULT_MASK = "sn"; /** Length of a bare Brazilian subscriber number, the boundary the `"auto"` mask reads. */ export const SN_LENGTH = 9; -export const MASK: Record = { - sn: "00000-0000", - nanp: "(00) 00000-0000", +/** The patterns `formatPhone` reads, one set for the plain output and one for the obfuscated. */ +export type PhoneMasks = { + /** The patterns of the `"sn"` and `"nanp"` masks. */ + national: Record; + /** The `"nanp"` pattern of a 10 digit landline. */ + nanpLandline: string; + /** The patterns of the `"international"` mask, without the `+55` prefix. */ + international: PhoneLineMasks; + /** The patterns of the `"service"` mask. */ + service: PhoneServiceMasks; }; -export const NANP_LANDLINE_MASK = "(00) 0000-0000"; +/** One pattern per kind of line, picked by the number of digits. */ +export type PhoneLineMasks = { + /** DDD + 8 digits. */ + landline: string; + /** DDD + 9 digits. */ + mobile: string; +}; -export const INTERNATIONAL_PREFIX = "+55"; +/** One pattern per family of service number. */ +export type PhoneServiceMasks = { + /** The `300X`/`400X` numbers. */ + abbreviated: string; + /** The Códigos Não Geográficos (`0300`, `0303`, `0500`, `0800`, `0900`). */ + nonGeographic: string; +}; -export const INTERNATIONAL_MASK = { - landline: "00 0000-0000", - mobile: "00 00000-0000", +export const MASKS: PhoneMasks = { + national: { + sn: "00000-0000", + nanp: "(00) 00000-0000", + }, + nanpLandline: "(00) 0000-0000", + international: { + landline: "00 0000-0000", + mobile: "00 00000-0000", + }, + service: { + abbreviated: "0000-0000", + nonGeographic: "0000 000 0000", + }, }; -export const SERVICE_MASK = { - abbreviated: "0000-0000", - nonGeographic: "0000 000 0000", +/** + * The gov.br account (acesso.gov.br) shows the registered mobile as "*********00": only the last + * 2 digits stay visible. These patterns keep that count and also keep the prefix that names a + * region or a service instead of a subscriber, the DDD, the `0800`-like code or the `300X`/`400X` + * root, e.g. "(11) *****-**21", "+55 11 ****-**00", "0800 *** **67" and "4004-**34". + */ +export const OBFUSCATED_MASKS: PhoneMasks = { + national: { + sn: "*****-**00", + nanp: "(00) *****-**00", + }, + nanpLandline: "(00) ****-**00", + international: { + landline: "00 ****-**00", + mobile: "00 *****-**00", + }, + service: { + abbreviated: "0000-**00", + nonGeographic: "0000 *** **00", + }, }; + +/** The obfuscated `"e164"` patterns, without the `+55` prefix: the plain output has no pattern. */ +export const OBFUSCATED_E164_MASK: PhoneLineMasks = { + landline: "00******00", + mobile: "00*******00", +}; + +export const INTERNATIONAL_PREFIX = "+55"; diff --git a/src/format-phone/format-phone.test.ts b/src/format-phone/format-phone.test.ts index 2f42af556..dd437c68e 100644 --- a/src/format-phone/format-phone.test.ts +++ b/src/format-phone/format-phone.test.ts @@ -167,6 +167,91 @@ describe("formatPhone", () => { expect(formatPhone("11988887777", { mask: "bogus" })).toBe("11988-8877"); }); + it("should hide the subscriber number except its last 2 digits under the national masks", () => { + expect(formatPhone("988887766", { obfuscate: true })).toBe("*****-**66"); + expect(formatPhone(988_887_766, { obfuscate: true })).toBe("*****-**66"); + expect(formatPhone("11988887766", { mask: "nanp", obfuscate: true })).toBe("(11) *****-**66"); + expect(formatPhone("1130001234", { mask: "nanp", obfuscate: true })).toBe("(11) ****-**34"); + expect(formatPhone("11988887766", { mask: "auto", obfuscate: true })).toBe("(11) *****-**66"); + expect(formatPhone("1130001234", { mask: "auto", obfuscate: true })).toBe("(11) ****-**34"); + expect(formatPhone("988887766", { mask: "auto", obfuscate: true })).toBe("*****-**66"); + }); + + it("should truncate a DDD-prefixed value under the default mask before obfuscating it", () => { + expect(formatPhone("11988887766", { obfuscate: true })).toBe("*****-**77"); + expect(formatPhone("11988887766", { mask: "sn", obfuscate: true })).toBe("*****-**77"); + expect(formatPhone("1130001234", { mask: "sn", obfuscate: true })).toBe("*****-**23"); + }); + + it("should keep the country code and the DDD when obfuscating the international masks", () => { + expect(formatPhone("11988887766", { mask: "international", obfuscate: true })).toBe( + "+55 11 *****-**66", + ); + expect(formatPhone("+55 11 3000-1234", { mask: "international", obfuscate: true })).toBe( + "+55 11 ****-**34", + ); + expect(formatPhone("5511988887766", { mask: "auto", obfuscate: true })).toBe( + "+55 11 *****-**66", + ); + expect(formatPhone("11988887766", { mask: "e164", obfuscate: true })).toBe("+5511*******66"); + expect(formatPhone("1130001234", { mask: "e164", obfuscate: true })).toBe("+5511******34"); + }); + + it("should keep the service prefix and the last 2 digits when obfuscating a service number", () => { + expect(formatPhone("08001234567", { mask: "service", obfuscate: true })).toBe("0800 *** **67"); + expect(formatPhone("03031234567", { mask: "auto", obfuscate: true })).toBe("0303 *** **67"); + expect(formatPhone("40041234", { mask: "service", obfuscate: true })).toBe("4004-**34"); + expect(formatPhone("30031234", { mask: "auto", obfuscate: true })).toBe("3003-**34"); + expect(formatPhone("08001234567", { mask: "e164", obfuscate: true })).toBe("0800 *** **67"); + expect(formatPhone("40041234", { mask: "international", obfuscate: true })).toBe("4004-**34"); + }); + + it("should return a public utility code whole when obfuscating", () => { + expect(formatPhone("190", { mask: "service", obfuscate: true })).toBe("190"); + expect(formatPhone("190", { mask: "auto", obfuscate: true })).toBe("190"); + }); + + it("should hide entirely a value the service mask does not recognize when obfuscating", () => { + expect(formatPhone("11988887766", { mask: "service", obfuscate: true })).toBe("***********"); + expect(formatPhone("08", { mask: "service", obfuscate: true })).toBe("**"); + expect(formatPhone("11988887766", { mask: "service" })).toBe("11988887766"); + }); + + it("should obfuscate a partial value as far as it goes", () => { + expect(formatPhone("1198", { mask: "nanp", obfuscate: true })).toBe("(11) **"); + expect(formatPhone("11988", { mask: "international", obfuscate: true })).toBe("+55 11 ***"); + expect(formatPhone("0800123", { mask: "service", obfuscate: true })).toBe("0800 ***"); + expect(formatPhone("", { mask: "e164", obfuscate: true })).toBe(""); + expect(formatPhone("", { mask: "international", obfuscate: true })).toBe(""); + expect(formatPhone("", { mask: "service", obfuscate: true })).toBe(""); + }); + + it("should drop what does not fit the 11 national digits when obfuscating the e164 mask", () => { + expect(formatPhone("119888877660000", { mask: "e164", obfuscate: true })).toBe( + "+5511*******66", + ); + expect(formatPhone("119888877660000", { mask: "e164" })).toBe("+55119888877660000"); + }); + + it("should obfuscate on any truthy obfuscate value", () => { + // @ts-expect-error: intentionally not a boolean + expect(formatPhone("11988887766", { mask: "nanp", obfuscate: 1 })).toBe("(11) *****-**66"); + // @ts-expect-error: intentionally not a boolean + expect(formatPhone("11988887766", { mask: "e164", obfuscate: "yes" })).toBe("+5511*******66"); + }); + + it("should behave exactly as without the option when obfuscate is falsy or absent", () => { + expect(formatPhone("11988887766", { mask: "nanp", obfuscate: false })).toBe("(11) 98888-7766"); + expect(formatPhone("11988887766", { mask: "e164", obfuscate: false })).toBe("+5511988887766"); + expect(formatPhone("08001234567", { mask: "service", obfuscate: false })).toBe("0800 123 4567"); + // @ts-expect-error: intentionally not a boolean + expect(formatPhone("11988887766", { mask: "international", obfuscate: 0 })).toBe( + "+55 11 98888-7766", + ); + // @ts-expect-error: intentionally not a boolean + expect(formatPhone("988887766", { obfuscate: null })).toBe("98888-7766"); + }); + it("should return an empty string for nullish values", () => { // @ts-expect-error: intentionally invalid input expect(formatPhone(null)).toBe(""); @@ -219,14 +304,39 @@ describe("formatPhone", () => { ); }); - test("should never throw and always return the phone number as a string", () => { + test("should show only the DDD and the last 2 digits of a generated number when obfuscating", () => { fc.assert( - fc.property(fc.string({ unit: "grapheme" }), fc.integer(), (text, number) => { - expect(typeof formatPhone(text)).toBe("string"); - expect(typeof formatPhone(number)).toBe("string"); + fc.property(fc.gen(), fc.constantFrom(...geographic), (g, type) => { + const phone = g(phones, type); + const visible = `${phone.slice(0, 2)}${phone.slice(-2)}`; + const obfuscated = formatPhone(phone, { mask: "auto", obfuscate: true }); + + expect(obfuscated).toMatch(/^\(\d{2}\) \*{4,5}-\*{2}\d{2}$/); + expect(obfuscated.replaceAll(/\D/g, "")).toBe(visible); + expect(obfuscated).toHaveLength(formatPhone(phone, { mask: "auto" }).length); + expect(formatPhone(phone, { mask: "e164", obfuscate: true })).toMatch( + /^\+55\d{2}\*{6,7}\d{2}$/, + ); }), ); }); + + test("should never throw and always return the phone number as a string", () => { + fc.assert( + fc.property( + fc.string({ unit: "grapheme" }), + fc.integer(), + fc.anything(), + (text, number, options) => { + expect(typeof formatPhone(text)).toBe("string"); + expect(typeof formatPhone(number)).toBe("string"); + expect(typeof formatPhone(text, { mask: "auto", obfuscate: true })).toBe("string"); + // @ts-expect-error: intentionally invalid options + expect(typeof formatPhone(text, options)).toBe("string"); + }, + ), + ); + }); }); }); @@ -243,4 +353,8 @@ describe("formatPhone types", () => { "auto" | "e164" | "international" | "service" | "sn" | "nanp" >(); }); + + test("should type the obfuscate option as an optional boolean", () => { + expectTypeOf().toEqualTypeOf(); + }); }); diff --git a/src/format-phone/format-phone.ts b/src/format-phone/format-phone.ts index 92bf9ac1b..121b7282f 100644 --- a/src/format-phone/format-phone.ts +++ b/src/format-phone/format-phone.ts @@ -10,13 +10,14 @@ import { sanitizeToDigits } from "../_internals/sanitize-to-digits/sanitize-to-d import { isValidServicePhone } from "../is-valid-service-phone/is-valid-service-phone"; import { DEFAULT_MASK, - INTERNATIONAL_MASK, INTERNATIONAL_PREFIX, - MASK, - NANP_LANDLINE_MASK, + MASKS, type NationalMask, + OBFUSCATED_E164_MASK, + OBFUSCATED_MASKS, PHONE_MASKS, - SERVICE_MASK, + type PhoneLineMasks, + type PhoneMasks, SN_LENGTH, } from "./constants"; @@ -27,6 +28,8 @@ export type PhoneMask = "auto" | "e164" | "international" | "service" | "sn" | " export type FormatPhoneOptions = { /** Which mask to apply, or `"auto"` to pick one from the value (default: `"sn"`). */ mask?: PhoneMask; + /** Whether to hide the subscriber number with `*`, except the last 2 digits the mask has room for (default: `false`, read for truthiness). */ + obfuscate?: boolean; }; const matchesPrefix = (digits: string, prefixes: readonly string[]): boolean => @@ -37,37 +40,53 @@ const matchesPrefix = (digits: string, prefixes: readonly string[]): boolean => * below, so it matches none of them and is returned as it came, which is exactly what both * masks would print for it anyway (their first separator only appears once the value is longer * than the prefix that selects the mask). + * + * Under `obfuscate` such a value has no prefix that tells which digits are safe to show, so + * every one of its digits becomes a `*` and only how many there were stays visible, unless it + * is one of the 3 digit public utility codes (`190`), which identify no subscriber. * @param {string} digits - The digits of a service number. + * @param {boolean} obfuscate - Whether to hide the digits after the prefix, except the last 2. * @returns {string} The digits under the mask of their service number family. */ -const formatService = (digits: string): string => { +const formatService = (digits: string, obfuscate: boolean): string => { + const masks = obfuscate ? OBFUSCATED_MASKS.service : MASKS.service; + if (matchesPrefix(digits, SERVICE_PHONE_NON_GEOGRAPHIC_PREFIXES)) { - return format({ value: digits, pattern: SERVICE_MASK.nonGeographic }); + return format({ value: digits, pattern: masks.nonGeographic }); } if (matchesPrefix(digits, SERVICE_PHONE_ABBREVIATED_ROOTS)) { - return format({ value: digits, pattern: SERVICE_MASK.abbreviated }); + return format({ value: digits, pattern: masks.abbreviated }); } - return digits; + return obfuscate && !isValidServicePhone(digits) ? "*".repeat(digits.length) : digits; }; -const formatInternational = (national: string): string => { +const resolveLinePattern = (national: string, masks: PhoneLineMasks): string => + national.length > PHONE_NATIONAL_MIN_LENGTH ? masks.mobile : masks.landline; + +const formatInternational = (national: string, masks: PhoneMasks): string => { if (!national) return ""; - const pattern = - national.length > PHONE_NATIONAL_MIN_LENGTH - ? INTERNATIONAL_MASK.mobile - : INTERNATIONAL_MASK.landline; + const pattern = resolveLinePattern(national, masks.international); return `${INTERNATIONAL_PREFIX} ${format({ value: national, pattern })}`; }; -const formatE164 = (national: string): string => - national ? `${INTERNATIONAL_PREFIX}${national}` : ""; +const formatE164 = (national: string, obfuscate: boolean): string => { + if (!national) return ""; + + if (!obfuscate) return `${INTERNATIONAL_PREFIX}${national}`; -const resolveNationalPattern = (digits: string, mask: NationalMask): string => - mask === "nanp" && digits.length === PHONE_NATIONAL_MIN_LENGTH ? NANP_LANDLINE_MASK : MASK[mask]; + const pattern = resolveLinePattern(national, OBFUSCATED_E164_MASK); + + return `${INTERNATIONAL_PREFIX}${format({ value: national, pattern })}`; +}; + +const resolveNationalPattern = (digits: string, mask: NationalMask, masks: PhoneMasks): string => + mask === "nanp" && digits.length === PHONE_NATIONAL_MIN_LENGTH + ? masks.nanpLandline + : masks.national[mask]; const resolveAutoMask = (digits: string, serviceDigits: string): Exclude => { if (isValidServicePhone(serviceDigits)) return "service"; @@ -112,9 +131,24 @@ const isPhoneMask = (value: unknown): value is PhoneMask => PHONE_MASKS.has(valu * do not rely on the default, since the default `"sn"` mask assumes no DDD is present. A `mask` * outside the union falls back to the default `"sn"` instead of throwing. * + * `options.obfuscate` hides the subscriber number under every mask, for the places where a + * number is shown to someone who should only recognize it (LGPD, art. 6º III, necessidade). The + * gov.br account shows the registered mobile as `"*********00"`, only the last 2 digits, and + * this keeps that count. The 2 digits are the last ones the mask itself has room for, so under + * the default `"sn"` a DDD-prefixed value is truncated first, exactly as it is without + * `obfuscate`, and the visible pair is the 8th and 9th digit rather than the last 2 of `value`. + * The prefix that names a region or a service instead of a subscriber also stays: the DDD, the + * `0800`-like code and the `300X`/`400X` root. A 3 digit public utility code (`190`) identifies + * no one and is returned as it is, and a value the `"service"` mask does not recognize has + * every digit replaced by a `*`, which hides the digits but not how many there were. The + * patterns have a fixed number of slots, so under `"e164"` anything past the 11th national + * digit is dropped. + * * @param {string|number} value - The phone number to format, either as a string or a number. * @param {FormatPhoneOptions} [options] - Optional formatting options. * @param {"auto"|"sn"|"nanp"|"e164"|"international"|"service"} options.mask - The mask to apply for formatting the phone number (default: `"sn"`). + * @param {boolean} options.obfuscate - If truthy, hides the subscriber number except the last 2 + * digits the mask has room for. Read for truthiness, so a non-boolean such as `1` obfuscates too. * @returns {string} The formatted phone number as a string. * * @example @@ -128,11 +162,23 @@ const isPhoneMask = (value: unknown): value is PhoneMask => PHONE_MASKS.has(valu * formatPhone("11987654321", { mask: "e164" }); // "+5511987654321" * formatPhone("11987654321", { mask: "international" }); // "+55 11 98765-4321" * formatPhone("40041234", { mask: "service" }); // "4004-1234" + * formatPhone("987654321", { obfuscate: true }); // "*****-**21" + * formatPhone("11987654321", { mask: "auto", obfuscate: true }); // "(11) *****-**21" + * formatPhone("1130000000", { mask: "auto", obfuscate: true }); // "(11) ****-**00" + * formatPhone("5511987654321", { mask: "auto", obfuscate: true }); // "+55 11 *****-**21" + * formatPhone("11987654321", { mask: "e164", obfuscate: true }); // "+5511*******21" + * formatPhone("08001234567", { mask: "auto", obfuscate: true }); // "0800 *** **67" + * formatPhone("40041234", { mask: "service", obfuscate: true }); // "4004-**34" + * formatPhone("11988887766", { mask: "service", obfuscate: true }); // "***********" (not a service number) * formatPhone("11987654321"); // "11987-6543" (BEWARE: default "sn" truncates a DDD-prefixed number) + * formatPhone("11987654321", { obfuscate: true }); // "*****-**43" (BEWARE: truncated too, so "43", not "21") * ``` * * @see Official: https://www.itu.int/rec/T-REC-E.164 * @see Official: https://informacoes.anatel.gov.br/legislacao/resolucoes/2022/1641-resolucao-749 + * @see Official: https://acesso.gov.br/faq/_perguntasdafaq/formarrecuperarconta.html + * The gov.br account FAQ, whose "Recuperar senha com celular" screen shows the registered mobile + * as `"*********00"`, the convention `obfuscate` follows for the number of visible digits. */ export const formatPhone = (value: string | number, options?: FormatPhoneOptions): string => { const enhancedValue = sanitizeToDigits(value); @@ -142,18 +188,21 @@ export const formatPhone = (value: string | number, options?: FormatPhoneOptions const requested: PhoneMask = isPhoneMask(givenMask) ? givenMask : DEFAULT_MASK; const mask = requested === "auto" ? resolveAutoMask(enhancedValue, serviceDigits) : requested; - if (mask === "service") return formatService(serviceDigits); + const obfuscate = Boolean(options?.obfuscate); + const masks = obfuscate ? OBFUSCATED_MASKS : MASKS; + + if (mask === "service") return formatService(serviceDigits, obfuscate); if (mask === "e164" || mask === "international") { - if (isValidServicePhone(serviceDigits)) return formatService(serviceDigits); + if (isValidServicePhone(serviceDigits)) return formatService(serviceDigits, obfuscate); const national = normalizePhone(enhancedValue); - return mask === "e164" ? formatE164(national) : formatInternational(national); + return mask === "e164" ? formatE164(national, obfuscate) : formatInternational(national, masks); } return format({ value: enhancedValue, - pattern: resolveNationalPattern(enhancedValue, mask), + pattern: resolveNationalPattern(enhancedValue, mask, masks), }); }; diff --git a/src/format-pis/constants.ts b/src/format-pis/constants.ts new file mode 100644 index 000000000..8dcfcca4b --- /dev/null +++ b/src/format-pis/constants.ts @@ -0,0 +1,9 @@ +export const PATTERN = "000.00000.00-0"; + +/** + * No authority publishes a masking rule for the PIS/PASEP/NIS, so this applies the rule Lei + * nº 12.309/2010, art. 87, § 5º, sets for the CPF ("ocultar os três primeiros dígitos e os dois + * dígitos verificadores") to a number with the same structure: the first 3 digits and the + * single check digit are hidden, e.g. "***.45678.90-*". + */ +export const OBFUSCATED_PATTERN = "***.00000.00-*"; diff --git a/src/format-pis/format-pis.test.ts b/src/format-pis/format-pis.test.ts index 188b3d52c..261b7238e 100644 --- a/src/format-pis/format-pis.test.ts +++ b/src/format-pis/format-pis.test.ts @@ -91,6 +91,21 @@ describe("formatPis", () => { expect(formatPis()).toBe(""); }); + it("should hide the first 3 digits and the check digit when obfuscate is truthy", () => { + expect(formatPis("12056412547", { obfuscate: true })).toBe("***.56412.54-*"); + expect(formatPis(12_056_412_547, { obfuscate: true })).toBe("***.56412.54-*"); + expect(formatPis("1205", { obfuscate: true })).toBe("***.5"); + expect(formatPis("1205", { pad: true, obfuscate: true })).toBe("***.00001.20-*"); + // @ts-expect-error: intentionally not a boolean + expect(formatPis("12056412547", { obfuscate: 1 })).toBe("***.56412.54-*"); + }); + + it("should behave exactly as without the option when obfuscate is falsy", () => { + expect(formatPis("12056412547", { obfuscate: false })).toBe("120.56412.54-7"); + // @ts-expect-error: intentionally not a boolean + expect(formatPis("1205", { pad: true, obfuscate: 0 })).toBe("000.00001.20-5"); + }); + describe("properties", () => { const upToAPis = digitsUpTo(11); @@ -102,6 +117,14 @@ describe("formatPis", () => { expectMatchesPattern(formatPis, /^\d{3}\.\d{5}\.\d{2}-\d$/, digits(11)); }); + test("should produce the documented obfuscated shape for a full PIS", () => { + expectMatchesPattern( + (value: string) => formatPis(value, { obfuscate: true }), + /^\*{3}\.\d{5}\.\d{2}-\*$/, + digits(11), + ); + }); + test("should left pad a shorter value up to the PIS length", () => { expectPadsToLength(formatPis, parsePis, upToAPis, PIS_LENGTH); }); @@ -119,7 +142,8 @@ describe("formatPis types", () => { expectTypeOf(formatPis).returns.toEqualTypeOf(); }); - test("should type the pad option as an optional boolean", () => { + test("should type the pad and obfuscate options as optional booleans", () => { expectTypeOf().toEqualTypeOf(); + expectTypeOf().toEqualTypeOf(); }); }); diff --git a/src/format-pis/format-pis.ts b/src/format-pis/format-pis.ts index 822241d6f..1d7026695 100644 --- a/src/format-pis/format-pis.ts +++ b/src/format-pis/format-pis.ts @@ -1,11 +1,14 @@ import { format } from "../_internals/format/format"; import { isNullish } from "../_internals/is-nullish/is-nullish"; import { sanitizeToDigits } from "../_internals/sanitize-to-digits/sanitize-to-digits"; +import { OBFUSCATED_PATTERN, PATTERN } from "./constants"; /** Options of `formatPis`. */ export type FormatPisOptions = { /** Whether to left pad the value with zeros up to the number of slots in the pattern (default: `false`). */ pad?: boolean; + /** Whether to hide the first 3 digits and the check digit with `*` (default: `false`, read for truthiness like `pad`). */ + obfuscate?: boolean; }; /** @@ -14,6 +17,8 @@ export type FormatPisOptions = { * @param {string|number} value - The PIS number to be formatted. It can be a string or a number. * @param {FormatPisOptions} [options] - Optional formatting options. * @param {boolean} options.pad - If true, pads the value with leading zeros if necessary. + * @param {boolean} options.obfuscate - If truthy, hides the first 3 digits and the check digit. + * Read for truthiness, the way `pad` is, so a non-boolean such as `1` obfuscates too. * @returns {string} The formatted PIS number as a string. * * @example @@ -21,11 +26,19 @@ export type FormatPisOptions = { * formatPis("12345678901"); // "123.45678.90-1" * formatPis(12345678901); // "123.45678.90-1" * formatPis("123456789", { pad: true }); // "001.23456.78-9" + * formatPis("12345678901", { obfuscate: true }); // "***.45678.90-*" * ``` * + * No authority publishes a masking rule for the PIS, so `obfuscate` applies the one Lei nº + * 12.309/2010, art. 87, § 5º, sets for the CPF, a number with the same structure: the first 3 + * digits and the check digit are hidden. + * * @see Official: https://www.gov.br/inss/pt-br/direitos-e-deveres/inscricao-e-contribuicao/inscricao * @see Official: https://www.gov.br/esocial/pt-br/documentacao-tecnica/manuais/mos-manual-de-orientacao-do-esocial-vs-2-4.pdf * @see Official: https://www.sirc.gov.br/wp-content/uploads/manual_sirc_recomendacoes_tecnicas_v7.pdf + * @see Official: https://www.planalto.gov.br/ccivil_03/_ato2007-2010/2010/lei/l12309.htm + * Lei nº 12.309/2010, art. 87, § 5º: "ocultar os três primeiros dígitos e os dois dígitos + * verificadores do CPF", the rule `obfuscate` borrows. * @see Based on: https://github.com/brazilian-utils/python/blob/main/brutils/pis.py */ export const formatPis = (value: string | number, options?: FormatPisOptions): string => @@ -34,5 +47,5 @@ export const formatPis = (value: string | number, options?: FormatPisOptions): s : format({ pad: options?.pad, value: sanitizeToDigits(value), - pattern: "000.00000.00-0", + pattern: (options?.obfuscate ?? false) ? OBFUSCATED_PATTERN : PATTERN, }); diff --git a/src/format-suframa/format-suframa.test.ts b/src/format-suframa/format-suframa.test.ts new file mode 100644 index 000000000..4ac5a800c --- /dev/null +++ b/src/format-suframa/format-suframa.test.ts @@ -0,0 +1,105 @@ +import { SUFRAMA_LENGTH } from "../_internals/constants/suframa"; +import { anyValue, digits, digitsUpTo } from "../_internals/test/arbitraries"; +import { + expectAlwaysReturnsType, + expectMatchesPattern, + expectPadsToLength, + expectRoundTrip, +} from "../_internals/test/properties"; +import { describe, expect, expectTypeOf, it, test } from "../_internals/test/runtime"; +import { parseSuframa } from "../parse-suframa/parse-suframa"; +import { formatSuframa, type FormatSuframaOptions } from "./format-suframa"; + +describe("formatSuframa", () => { + it("should format the example of the NF-e manual", () => { + expect(formatSuframa("123456789")).toBe("12.3456.789"); + }); + + it("when it is a no formatted string", () => { + expect(formatSuframa("")).toBe(""); + expect(formatSuframa("2")).toBe("2"); + expect(formatSuframa("20")).toBe("20"); + expect(formatSuframa("205")).toBe("20.5"); + expect(formatSuframa("2056")).toBe("20.56"); + expect(formatSuframa("20567")).toBe("20.567"); + expect(formatSuframa("205678")).toBe("20.5678"); + expect(formatSuframa("2056781")).toBe("20.5678.1"); + expect(formatSuframa("20567810")).toBe("20.5678.10"); + expect(formatSuframa("205678106")).toBe("20.5678.106"); + }); + + it("when it is a formatted string", () => { + expect(formatSuframa("20.5")).toBe("20.5"); + expect(formatSuframa("20.5678")).toBe("20.5678"); + expect(formatSuframa("20.56781")).toBe("20.5678.1"); + expect(formatSuframa("20.5678.106")).toBe("20.5678.106"); + expect(formatSuframa("20.5678.10-6")).toBe("20.5678.106"); + }); + + it("when it is a malformed string", () => { + expect(formatSuframa("20#Error*&@#5678#Char!106")).toBe("20.5678.106"); + expect(formatSuframa("#-+Error#205678106#Char!")).toBe("20.5678.106"); + }); + + it("when it is a number", () => { + expect(formatSuframa(1)).toBe("1"); + expect(formatSuframa(205)).toBe("20.5"); + expect(formatSuframa(205_678_106)).toBe("20.5678.106"); + expect(formatSuframa(10_001_018)).toBe("10.0010.18"); + }); + + it("should left pad with zeros when the pad option is set", () => { + expect(formatSuframa("10001018", { pad: true })).toBe("01.0001.018"); + expect(formatSuframa(10_001_018, { pad: true })).toBe("01.0001.018"); + expect(formatSuframa("1", { pad: true })).toBe("00.0000.001"); + expect(formatSuframa("205678106", { pad: true })).toBe("20.5678.106"); + }); + + it("should not pad when the pad option is false", () => { + expect(formatSuframa("10001018", { pad: false })).toBe("10.0010.18"); + }); + + it(`should NOT add digits after the Inscrição SUFRAMA length (${SUFRAMA_LENGTH})`, () => { + expect(formatSuframa("2056781069")).toBe("20.5678.106"); + expect(formatSuframa("205678106999")).toBe("20.5678.106"); + }); + + it("should return an empty string for null or undefined", () => { + // @ts-expect-error: intentionally invalid input + expect(formatSuframa(null)).toBe(""); + // @ts-expect-error: intentionally invalid input + expect(formatSuframa()).toBe(""); + }); + + describe("properties", () => { + const upToASuframa = digitsUpTo(9); + + test("should only add the mask, never change the digits", () => { + expectRoundTrip(formatSuframa, parseSuframa, upToASuframa); + }); + + test("should produce the documented mask shape for a full Inscrição SUFRAMA", () => { + expectMatchesPattern(formatSuframa, /^\d{2}\.\d{4}\.\d{3}$/, digits(9)); + }); + + test("should left pad a shorter value up to the Inscrição SUFRAMA length", () => { + expectPadsToLength(formatSuframa, parseSuframa, upToASuframa, SUFRAMA_LENGTH); + }); + + test("should never throw and always return a string", () => { + expectAlwaysReturnsType(formatSuframa, "string", anyValue); + }); + }); +}); + +describe("formatSuframa types", () => { + test("should take a string or number value and options and return a string", () => { + expectTypeOf(formatSuframa).parameter(0).toEqualTypeOf(); + expectTypeOf(formatSuframa).parameter(1).toEqualTypeOf(); + expectTypeOf(formatSuframa).returns.toEqualTypeOf(); + }); + + test("should type the pad option as an optional boolean", () => { + expectTypeOf().toEqualTypeOf(); + }); +}); diff --git a/src/format-suframa/format-suframa.ts b/src/format-suframa/format-suframa.ts new file mode 100644 index 000000000..de1fa0ab9 --- /dev/null +++ b/src/format-suframa/format-suframa.ts @@ -0,0 +1,43 @@ +import { format } from "../_internals/format/format"; +import { isNullish } from "../_internals/is-nullish/is-nullish"; +import { sanitizeToDigits } from "../_internals/sanitize-to-digits/sanitize-to-digits"; + +/** Options of `formatSuframa`. */ +export type FormatSuframaOptions = { + /** Whether to left pad the value with zeros up to the number of slots in the pattern (default: `false`). */ + pad?: boolean; +}; + +/** + * Formats an Inscrição SUFRAMA with the `SS.NNNN.LLD` mask: sector of activity, sequential + * number, locality and check digit. + * + * An 8 digit value is a number whose sector code lost its leading zero, so format it with + * `pad: true` to get the zero back. The mask is progressive, as in the other `format` utilities, + * so an 8 digit value without `pad` is grouped one position early. + * + * @param {string|number} value - The Inscrição SUFRAMA to be formatted. It can be a string or a number. + * @param {FormatSuframaOptions} [options] - Optional formatting options. + * @param {boolean} options.pad - If true, pads the value with leading zeros if necessary. + * @returns {string} The formatted Inscrição SUFRAMA as a string. + * + * @example + * ```typescript + * formatSuframa("123456789"); // "12.3456.789" + * formatSuframa(123456789); // "12.3456.789" + * formatSuframa("10001018"); // "10.0010.18" (8 digits, the mask groups one position early) + * formatSuframa("10001018", { pad: true }); // "01.0001.018" + * ``` + * + * @see Official: https://www.confaz.fazenda.gov.br/legislacao/arquivo-manuais/moc7-visao-geral.pdf + * Manual de Orientação do Contribuinte (MOC) NF-e 7.0, Visão Geral, section 8.4, which gives the + * composition as `SS.NNNN.LLD`. + */ +export const formatSuframa = (value: string | number, options?: FormatSuframaOptions): string => + isNullish(value) + ? "" + : format({ + pad: options?.pad, + value: sanitizeToDigits(value), + pattern: "00.0000.000", + }); diff --git a/src/format-voter-id/constants.ts b/src/format-voter-id/constants.ts new file mode 100644 index 000000000..8e3519d0b --- /dev/null +++ b/src/format-voter-id/constants.ts @@ -0,0 +1,16 @@ +export const PATTERNS = { + standard: "0000 0000 00 00", + extended: "0000 0000 0 00 00", +}; + +/** + * No authority publishes a masking rule for the título de eleitor, so this applies the rule Lei + * nº 12.309/2010, art. 87, § 5º, sets for the CPF ("ocultar os três primeiros dígitos e os dois + * dígitos verificadores") to a number with the same structure: the first 3 digits of the + * sequential number and the 2 check digits are hidden, e.g. "***4 5678 01 **". The federative + * union code stays visible. + */ +export const OBFUSCATED_PATTERNS = { + standard: "***0 0000 00 **", + extended: "***0 0000 0 00 **", +}; diff --git a/src/format-voter-id/format-voter-id.test.ts b/src/format-voter-id/format-voter-id.test.ts index b7e6ae193..11d9a9d45 100644 --- a/src/format-voter-id/format-voter-id.test.ts +++ b/src/format-voter-id/format-voter-id.test.ts @@ -3,7 +3,7 @@ import * as fc from "fast-check"; import { anyValue, digits, digitsUpTo } from "../_internals/test/arbitraries"; import { expectAlwaysReturnsType } from "../_internals/test/properties"; import { describe, expect, expectTypeOf, it, test } from "../_internals/test/runtime"; -import { formatVoterId } from "./format-voter-id"; +import { type FormatVoterIdOptions, formatVoterId } from "./format-voter-id"; describe("formatVoterId", () => { it("should format voter ids", () => { @@ -43,6 +43,23 @@ describe("formatVoterId", () => { expect(formatVoterId("123456788019")).toBe("1234 5678 80 19"); }); + it("should hide the first 3 digits and the 2 check digits when obfuscate is truthy", () => { + expect(formatVoterId("123456780124", { obfuscate: true })).toBe("***4 5678 01 **"); + expect(formatVoterId(123_456_780_124, { obfuscate: true })).toBe("***4 5678 01 **"); + expect(formatVoterId("1234567880191", { obfuscate: true })).toBe("***4 5678 8 01 **"); + expect(formatVoterId("1234567880399", { obfuscate: true })).toBe("***4 5678 80 **"); + expect(formatVoterId("12345", { obfuscate: true })).toBe("***4 5"); + // @ts-expect-error: intentionally not a boolean + expect(formatVoterId("123456780124", { obfuscate: 1 })).toBe("***4 5678 01 **"); + }); + + it("should behave exactly as without the option when obfuscate is falsy", () => { + expect(formatVoterId("123456780124", { obfuscate: false })).toBe("1234 5678 01 24"); + expect(formatVoterId("1234567880191", {})).toBe("1234 5678 8 01 91"); + // @ts-expect-error: intentionally not a boolean + expect(formatVoterId("1234567880191", { obfuscate: 0 })).toBe("1234 5678 8 01 91"); + }); + it("should return an empty string for null or undefined", () => { // @ts-expect-error: intentionally invalid input expect(formatVoterId(null)).toBe(""); @@ -64,8 +81,14 @@ describe("formatVoterId", () => { test("should use the grouping documented for each of the two lengths", () => { fc.assert( fc.property(digits(12), digits(9), fc.constantFrom("01", "02"), (short, sequential, uf) => { + const extended = `${sequential}${uf}00`; + expect(formatVoterId(short)).toMatch(/^\d{4} \d{4} \d{2} \d{2}$/); - expect(formatVoterId(`${sequential}${uf}00`)).toMatch(/^\d{4} \d{4} \d \d{2} \d{2}$/); + expect(formatVoterId(extended)).toMatch(/^\d{4} \d{4} \d \d{2} \d{2}$/); + expect(formatVoterId(short, { obfuscate: true })).toMatch(/^\*{3}\d \d{4} \d{2} \*{2}$/); + expect(formatVoterId(extended, { obfuscate: true })).toMatch( + /^\*{3}\d \d{4} \d \d{2} \*{2}$/, + ); }), ); }); @@ -85,8 +108,13 @@ describe("formatVoterId", () => { }); describe("formatVoterId types", () => { - test("should take a string or number value and return a string", () => { + test("should take a string or number value and options and return a string", () => { expectTypeOf(formatVoterId).parameter(0).toEqualTypeOf(); + expectTypeOf(formatVoterId).parameter(1).toEqualTypeOf(); expectTypeOf(formatVoterId).returns.toEqualTypeOf(); }); + + test("should type the obfuscate option as an optional boolean", () => { + expectTypeOf().toEqualTypeOf(); + }); }); diff --git a/src/format-voter-id/format-voter-id.ts b/src/format-voter-id/format-voter-id.ts index e6054adb3..7ab0ce13a 100644 --- a/src/format-voter-id/format-voter-id.ts +++ b/src/format-voter-id/format-voter-id.ts @@ -1,13 +1,16 @@ import { NINE_DIGIT_FEDERATIVE_UNION_CODES } from "../_internals/constants/voter-id"; import { format } from "../_internals/format/format"; import { sanitizeToDigits } from "../_internals/sanitize-to-digits/sanitize-to-digits"; - -const PATTERN = "0000 0000 00 00"; - -const EXTENDED_PATTERN = "0000 0000 0 00 00"; +import { OBFUSCATED_PATTERNS, PATTERNS } from "./constants"; const LENGTH = 12; +/** Options of `formatVoterId`. */ +export type FormatVoterIdOptions = { + /** Whether to hide the first 3 digits and the 2 check digits with `*` (default: `false`, read for truthiness). */ + obfuscate?: boolean; +}; + /** * Formats a Brazilian voter id (título de eleitor) for display. * @@ -17,14 +20,23 @@ const LENGTH = 12; * the two states whose voter ids may carry a 9-digit sequential number. * * @param {string|number} value - The voter id value to be formatted. + * @param {FormatVoterIdOptions} [options] - Optional formatting options. + * @param {boolean} [options.obfuscate] - If truthy, hides the first 3 digits and the 2 check + * digits. Read for truthiness, so a non-boolean such as `1` obfuscates too. * @returns {string} The formatted voter id string. * * @example * ```typescript * formatVoterId("123456780124"); // "1234 5678 01 24" * formatVoterId("1234567880191"); // "1234 5678 8 01 91" + * formatVoterId("123456780124", { obfuscate: true }); // "***4 5678 01 **" + * formatVoterId("1234567880191", { obfuscate: true }); // "***4 5678 8 01 **" * ``` * + * No authority publishes a masking rule for the voter id, so `obfuscate` applies the one Lei nº + * 12.309/2010, art. 87, § 5º, sets for the CPF, a number with the same structure: the first 3 + * digits and the 2 check digits are hidden, and the federative union code stays visible. + * * The 13-digit São Paulo/Minas Gerais grouping is brutils parity, not published by the TSE. A * 14-or-more-digit input is read the same way as a 13-digit one: it is grouped as a São Paulo or * Minas Gerais id whenever its 10th and 11th digits are "01"/"02". Both patterns have a fixed @@ -36,14 +48,17 @@ const LENGTH = 12; * client, so it has to be opened in a browser. * * @see Official: https://www.tse.jus.br/legislacao/compilada/res/2021/resolucao-no-23-659-de-26-de-outubro-de-2021 + * @see Official: https://www.planalto.gov.br/ccivil_03/_ato2007-2010/2010/lei/l12309.htm + * Lei nº 12.309/2010, art. 87, § 5º: "ocultar os três primeiros dígitos e os dois dígitos + * verificadores do CPF", the rule `obfuscate` borrows. * @see Based on: https://github.com/brazilian-utils/python/blob/main/brutils/voter_id.py */ -export const formatVoterId = (value: string | number): string => { +export const formatVoterId = (value: string | number, options?: FormatVoterIdOptions): string => { const digits = sanitizeToDigits(value); const federativeUnion = digits.slice(9, 11); const isExtended = digits.length > LENGTH && NINE_DIGIT_FEDERATIVE_UNION_CODES.includes(federativeUnion); - const pattern = isExtended ? EXTENDED_PATTERN : PATTERN; + const patterns = (options?.obfuscate ?? false) ? OBFUSCATED_PATTERNS : PATTERNS; - return format({ value: digits, pattern }); + return format({ value: digits, pattern: isExtended ? patterns.extended : patterns.standard }); }; diff --git a/src/generate-cpf/constants.ts b/src/generate-cpf/constants.ts deleted file mode 100644 index 758b1f5f1..000000000 --- a/src/generate-cpf/constants.ts +++ /dev/null @@ -1,33 +0,0 @@ -import { type StateCode } from "../_internals/constants/states"; - -export const BASE_LENGTH = 8; - -export const STATE_CODES: Record = { - AC: "2", - AL: "4", - AP: "2", - AM: "2", - BA: "5", - CE: "3", - DF: "1", - ES: "7", - GO: "1", - MA: "3", - MT: "1", - MS: "1", - MG: "6", - PR: "9", - PB: "4", - PA: "2", - PE: "4", - PI: "3", - RN: "4", - RS: "0", - RJ: "7", - RO: "2", - RR: "2", - SC: "9", - SE: "5", - SP: "8", - TO: "1", -} as const; diff --git a/src/generate-cpf/generate-cpf.test.ts b/src/generate-cpf/generate-cpf.test.ts index 63beca5b9..fa44665d0 100644 --- a/src/generate-cpf/generate-cpf.test.ts +++ b/src/generate-cpf/generate-cpf.test.ts @@ -1,11 +1,10 @@ import * as fc from "fast-check"; -import { CPF_LENGTH } from "../_internals/constants/cpf"; +import { CPF_FISCAL_REGION_BY_STATE, CPF_LENGTH } from "../_internals/constants/cpf"; import { DATA, type StateCode } from "../_internals/constants/states"; import { PROTOTYPE_KEYS } from "../_internals/test/arbitraries"; import { describe, expect, expectTypeOf, test } from "../_internals/test/runtime"; import { isValidCpf } from "../is-valid-cpf/is-valid-cpf"; -import { STATE_CODES } from "./constants"; import { generateCpf } from "./generate-cpf"; describe("generateCpf", () => { @@ -50,15 +49,15 @@ describe("generateCpf", () => { } }); - test("should embed the literal STATE_CODES digit at the 9th position, not a random one", () => { + test("should embed the literal CPF_FISCAL_REGION_BY_STATE digit at the 9th position, not a random one", () => { for (let i = 0; i < 20; i++) { - expect(generateCpf("SP")[8]).toBe(STATE_CODES.SP); + expect(generateCpf("SP")[8]).toBe(CPF_FISCAL_REGION_BY_STATE.SP); } }); test("should embed the 1st região fiscal digit for the states the Receita Federal groups there", () => { - expect(STATE_CODES.MS).toBe("1"); - expect(STATE_CODES.MT).toBe("1"); + expect(CPF_FISCAL_REGION_BY_STATE.MS).toBe("1"); + expect(CPF_FISCAL_REGION_BY_STATE.MT).toBe("1"); expect(generateCpf("MS")[8]).toBe("1"); expect(generateCpf("MT")[8]).toBe("1"); }); @@ -102,7 +101,7 @@ describe("generateCpf", () => { const cpf = generateCpf(state); expect(cpf).toHaveLength(CPF_LENGTH); - expect(cpf[8]).toBe(STATE_CODES[state]); + expect(cpf[8]).toBe(CPF_FISCAL_REGION_BY_STATE[state]); expect(isValidCpf(cpf)).toBe(true); }), ); diff --git a/src/generate-cpf/generate-cpf.ts b/src/generate-cpf/generate-cpf.ts index 2d9b8798a..525362a25 100644 --- a/src/generate-cpf/generate-cpf.ts +++ b/src/generate-cpf/generate-cpf.ts @@ -1,8 +1,8 @@ import { calculateCpfCheckDigit } from "../_internals/calculate-cpf-check-digit/calculate-cpf-check-digit"; +import { CPF_BASE_LENGTH, CPF_FISCAL_REGION_BY_STATE } from "../_internals/constants/cpf"; import { type StateCode } from "../_internals/constants/states"; import { generateRandomNumber } from "../_internals/generate-random-number/generate-random-number"; import { isRepeatedDigits } from "../_internals/is-repeated-digits/is-repeated-digits"; -import { BASE_LENGTH, STATE_CODES } from "./constants"; export type { StateCode } from "../_internals/constants/states"; @@ -16,7 +16,10 @@ export type { StateCode } from "../_internals/constants/states"; * @returns {string} The região fiscal digit of that state, or a random digit. */ const getStateCode = (state?: StateCode): string => { - if (typeof state === "string" && Object.hasOwn(STATE_CODES, state)) return STATE_CODES[state]; + if (typeof state === "string" && Object.hasOwn(CPF_FISCAL_REGION_BY_STATE, state)) { + return CPF_FISCAL_REGION_BY_STATE[state]; + } + return generateRandomNumber(1); }; @@ -52,10 +55,10 @@ const getStateCode = (state?: StateCode): string => { * @see Based on: https://github.com/brazilian-utils/python/blob/main/brutils/cpf.py */ export const generateCpf = (state?: StateCode): string => { - let base = generateRandomNumber(BASE_LENGTH) + getStateCode(state); + let base = generateRandomNumber(CPF_BASE_LENGTH) + getStateCode(state); while (isRepeatedDigits(base)) { - base = generateRandomNumber(BASE_LENGTH) + getStateCode(state); + base = generateRandomNumber(CPF_BASE_LENGTH) + getStateCode(state); } const firstCheckDigit = String(calculateCpfCheckDigit(base)); diff --git a/src/generate-suframa/generate-suframa.test.ts b/src/generate-suframa/generate-suframa.test.ts new file mode 100644 index 000000000..edcbb6015 --- /dev/null +++ b/src/generate-suframa/generate-suframa.test.ts @@ -0,0 +1,81 @@ +import * as fc from "fast-check"; + +import { describe, expect, expectTypeOf, test } from "../_internals/test/runtime"; +import { isValidSuframa } from "../is-valid-suframa/is-valid-suframa"; +import { generateSuframa } from "./generate-suframa"; + +const withRandomDigits = (digits: number[], run: () => void): void => { + const originalRandom = Math.random; + let call = 0; + + Math.random = () => { + const digit = digits[call]; + call += 1; + return (digit + 0.5) / 10; + }; + + try { + run(); + } finally { + Math.random = originalRandom; + } +}; + +describe("generateSuframa", () => { + test("should have the right length without mask (9)", () => { + expect(generateSuframa()).toHaveLength(9); + expect(/^\d{9}$/.test(generateSuframa())).toBe(true); + }); + + test("should always generate a valid Inscrição SUFRAMA", () => { + for (let i = 0; i < 1000; i++) { + expect(isValidSuframa(generateSuframa())).toBe(true); + } + }); + + test("should append the check digit of the NF-e manual example", () => { + withRandomDigits([1, 2, 3, 4, 5, 6, 7, 8], () => { + expect(generateSuframa()).toBe("123456789"); + }); + }); + + test("should append 0 when the remainder is 0 or 1", () => { + withRandomDigits([1, 0, 0, 0, 0, 0, 0, 1], () => { + expect(generateSuframa()).toBe("100000010"); + }); + withRandomDigits([6, 0, 0, 0, 0, 1, 3, 0], () => { + expect(generateSuframa()).toBe("600001300"); + }); + }); + + test("should regenerate the base when the sector code comes out as 00", () => { + withRandomDigits([0, 0, 1, 2, 3, 4, 5, 6, 0, 1, 0, 0, 0, 1, 0, 1], () => { + expect(generateSuframa()).toBe("010001018"); + }); + }); + + describe("properties", () => { + const batchSize = fc.integer({ min: 1, max: 20 }); + + test("should generate 9 digit numbers its own validator accepts, never with sector code 00", () => { + fc.assert( + fc.property(batchSize, (size) => { + for (let index = 0; index < size; index++) { + const suframa = generateSuframa(); + + expect(suframa).toMatch(/^\d{9}$/); + expect(suframa.startsWith("00")).toBe(false); + expect(isValidSuframa(suframa)).toBe(true); + } + }), + ); + }); + }); +}); + +describe("generateSuframa types", () => { + test("should take no parameters and return a string", () => { + expectTypeOf(generateSuframa).parameters.toEqualTypeOf<[]>(); + expectTypeOf(generateSuframa).returns.toEqualTypeOf(); + }); +}); diff --git a/src/generate-suframa/generate-suframa.ts b/src/generate-suframa/generate-suframa.ts new file mode 100644 index 000000000..411282541 --- /dev/null +++ b/src/generate-suframa/generate-suframa.ts @@ -0,0 +1,33 @@ +import { SUFRAMA_LENGTH } from "../_internals/constants/suframa"; +import { generateRandomNumber } from "../_internals/generate-random-number/generate-random-number"; +import { mod11 } from "../_internals/mod11/mod11"; + +/** + * Generates a random Inscrição SUFRAMA with a valid check digit, for tests and fixtures. + * + * The sector code is never `00`, the only structural rule the NF-e manual states. The manual lists + * sector and locality codes only as examples, so the generated ones are random and need not match + * a code SUFRAMA uses. + * + * Uses `Math.random()` internally, so it is not cryptographically secure, do not use for security purposes. + * + * @returns {string} A valid 9-digit Inscrição SUFRAMA string without formatting. + * + * @example + * ```typescript + * generateSuframa(); // "123456789" + * ``` + * + * @see Official: https://www.confaz.fazenda.gov.br/legislacao/arquivo-manuais/moc7-visao-geral.pdf + * Manual de Orientação do Contribuinte (MOC) NF-e 7.0, Visão Geral, section 8.4: the composition + * `SS.NNNN.LLD` with `SS` never `00`, and the módulo 11 check digit with weights 2 to 9. + */ +export const generateSuframa = (): string => { + let base = generateRandomNumber(SUFRAMA_LENGTH - 1); + + while (base.startsWith("00")) { + base = generateRandomNumber(SUFRAMA_LENGTH - 1); + } + + return `${base}${mod11(base, { variant: "arrecadacao" })}`; +}; diff --git a/src/get-cest/get-cest.test.ts b/src/get-cest/get-cest.test.ts new file mode 100644 index 000000000..d8d0f8f98 --- /dev/null +++ b/src/get-cest/get-cest.test.ts @@ -0,0 +1,154 @@ +import * as fc from "fast-check"; + +import { CEST_SEGMENTS, CEST_TABLE } from "../_internals/constants/cest"; +import { anyGarbage, PROTOTYPE_KEYS } from "../_internals/test/arbitraries"; +import { expectNeverThrows } from "../_internals/test/properties"; +import { describe, expect, expectTypeOf, it, test } from "../_internals/test/runtime"; +import { isValidCest } from "../is-valid-cest/is-valid-cest"; +import { getCest, type Cest } from "./get-cest"; + +describe("getCest", () => { + it("should return the entry for a known code written as 7 digits", () => { + expect(getCest("0500100")).toEqual({ + code: "0500100", + description: "Cimento", + segment: "Cimentos", + }); + }); + + it("should return the entry for a code in the NN.NNN.NN form the annexes print", () => { + expect(getCest("01.001.00")).toEqual({ + code: "0100100", + description: + "Catalisadores em colmeia cerâmica ou metálica para conversão catalítica de gases de escape de veículos e outros catalisadores", + segment: "Autopeças", + }); + }); + + it("should left pad a bare code to 7 digits, as a number or as a string", () => { + expect(getCest(500_100)?.code).toBe("0500100"); + expect(getCest("500100")?.code).toBe("0500100"); + expect(getCest(2_899_900)?.code).toBe("2899900"); + }); + + it("should not pad a masked code", () => { + expect(getCest("5.001.00")).toBeNull(); + }); + + it("should accept any single documented separator and the whitespace around a code", () => { + expect(getCest(" 05.001.00 ")?.code).toBe("0500100"); + expect(getCest("\t05 001-00\n")?.code).toBe("0500100"); + expect(getCest("05/00100")?.code).toBe("0500100"); + }); + + it("should name the segment by its code, not by its item number in Anexo I (segments 16 and 28)", () => { + expect(getCest("16.001.00")?.segment).toBe( + "Pneumáticos, câmaras de ar e protetores de borracha", + ); + expect(getCest("28.999.00")).toEqual({ + code: "2899900", + description: + "Outros produtos comercializados pelo sistema de marketing direto porta-a-porta a consumidor final não relacionados em outros itens deste anexo", + segment: "Venda de mercadorias pelo sistema porta a porta", + }); + }); + + it("should keep only the wording in force of a re-worded item (17.024.00, Convênio ICMS 108/22)", () => { + expect(getCest("17.024.00")?.description).toBe( + "Queijos, exceto os dos CEST 17.024.01, 17.024.02, 17.024.03, 17.024.04 e 17.024.05", + ); + expect(getCest("17.002.01")?.description).toBe( + "Chocolates, em tabletes, barras ou paus, recheados, em recipientes ou embalagens de conteúdo superior a 1 kg e inferior ou igual a 2 kg", + ); + }); + + it("should keep the annex punctuation, without the trailing one (09.004.00 and 13.009.00)", () => { + expect(getCest("09.004.00")?.description).toBe("“Starter”"); + expect(getCest("13.009.00")?.description).toBe( + "Vacinas e produtos semelhantes, exceto para uso veterinário - positiva", + ); + }); + + it("should return null for a revoked item (03.001.00, 17.049.08 and 20.035.01)", () => { + expect(getCest("03.001.00")).toBeNull(); + expect(getCest("17.049.08")).toBeNull(); + expect(getCest("20.035.01")).toBeNull(); + }); + + it("should return null for an unknown code and for a segment that does not exist (15 and 18)", () => { + expect(getCest("0000000")).toBeNull(); + expect(getCest("15.001.00")).toBeNull(); + expect(getCest("18.001.00")).toBeNull(); + }); + + it("should return a fresh object on every call", () => { + expect(getCest("0500100")).not.toBe(getCest("0500100")); + }); + + it("should return null for a code longer than 7 digits", () => { + expect(getCest("05001000")).toBeNull(); + expect(getCest(50_010_000)).toBeNull(); + }); + + it("should return null for a string that is not a documented form", () => { + expect(getCest("")).toBeNull(); + expect(getCest("abc0500100")).toBeNull(); + expect(getCest("05..001.00")).toBeNull(); + expect(getCest("050.01.00")).toBeNull(); + }); + + it("should return null for a number that is not a non-negative safe integer", () => { + expect(getCest(-500_100)).toBeNull(); + expect(getCest(50_010.5)).toBeNull(); + expect(getCest(2 ** 53)).toBeNull(); + }); + + it("should return null for values that are not a string or a number", () => { + // @ts-expect-error not a string or number + expect(getCest(null)).toBeNull(); + // @ts-expect-error not a string or number + expect(getCest()).toBeNull(); + expect(getCest(Object.create(null))).toBeNull(); + }); + + it("should return null for the keys of Object.prototype", () => { + for (const key of PROTOTYPE_KEYS) { + expect(getCest(key)).toBeNull(); + } + }); + + describe("properties", () => { + const codeArbitrary = fc.constantFrom(...Object.keys(CEST_TABLE)); + + test("should never throw, regardless of the input", () => { + expectNeverThrows(getCest, anyGarbage); + }); + + test("should resolve every known code, bare, masked or as a number, and agree with isValidCest", () => { + fc.assert( + fc.property(codeArbitrary, (code) => { + const masked = `${code.slice(0, 2)}.${code.slice(2, 5)}.${code.slice(5)}`; + const expected = { + code, + description: CEST_TABLE[code], + segment: CEST_SEGMENTS[code.slice(0, 2)], + }; + + expect(getCest(code)).toEqual(expected); + expect(getCest(masked)).toEqual(expected); + expect(getCest(Number(code))).toEqual(expected); + expect(typeof expected.segment).toBe("string"); + expect(isValidCest(code)).toBe(true); + }), + ); + }); + }); +}); + +describe("getCest types", () => { + test("should take a string or number and return a Cest or null", () => { + expectTypeOf(getCest).parameter(0).toEqualTypeOf(); + expectTypeOf(getCest).returns.toEqualTypeOf(); + expectTypeOf().toEqualTypeOf<{ code: string; description: string; segment: string }>(); + }); +}); diff --git a/src/get-cest/get-cest.ts b/src/get-cest/get-cest.ts new file mode 100644 index 000000000..1b43869e2 --- /dev/null +++ b/src/get-cest/get-cest.ts @@ -0,0 +1,74 @@ +import { CEST_FORMAT_REGEX, CEST_SEGMENTS, CEST_TABLE } from "../_internals/constants/cest"; +import { isLookupCode } from "../_internals/is-lookup-code/is-lookup-code"; +import { padLookupCode } from "../_internals/pad-lookup-code/pad-lookup-code"; +import { sanitizeToDigits } from "../_internals/sanitize-to-digits/sanitize-to-digits"; + +const CEST_LENGTH = 7; +const SEGMENT_LENGTH = 2; + +/** + * A CEST (Código Especificador da Substituição Tributária). + */ +export type Cest = { + /** The 7 digit code, without the mask. Use `formatCest` for the `NN.NNN.NN` form. */ + code: string; + /** The description of the goods, as the annex of Convênio ICMS 142/18 words it. */ + description: string; + /** The name of the segment the first two digits stand for, from Anexo I of Convênio ICMS 142/18. */ + segment: string; +}; + +/** + * Looks a CEST (Código Especificador da Substituição Tributária) up in the annexes of Convênio + * ICMS 142/18. + * + * The table is Anexos II to XXVI of the consolidated text in force (last amended by Convênio + * ICMS 180/24), and the segment names come from Anexo I. Only the wording in force of each item + * is kept: a revoked item (`"03.001.00"`) gives `null`. + * + * A CEST has 7 digits: the first two are the segment, the third to the fifth the item of the + * segment and the last two the specification of the item (cláusula sexta, IV). A string is only + * read as a code when it is written in one of the documented forms: the 7 digits, or the + * `NN.NNN.NN` form the annexes print, with a single separator between the groups and optional + * surrounding whitespace. Anything else (`"abc0500100"`) is rejected instead of having its + * digits picked out. A number is only read as a code when it is a non-negative safe integer, + * since a sign, a decimal point or a rounded magnitude would otherwise be read as a code the + * caller never wrote. + * + * The leading zero of segments 01 to 09 is part of the code, so a value written as bare digits + * is left padded with zeros to 7 whether it comes as a string or as a number: `500100`, + * `"500100"` and `"0500100"` are the same code. A masked value already carries its separators + * and is read as written. + * + * @param {string|number} value - The CEST to look up, with or without the `NN.NNN.NN` mask, + * e.g. `"05.001.00"`, `"0500100"` or `500100`. + * @returns {Cest|null} The matching entry, or null when the code is unknown or invalid. + * + * @example + * ```typescript + * getCest("05.001.00"); // { code: "0500100", description: "Cimento", segment: "Cimentos" } + * getCest("0500100"); // { code: "0500100", description: "Cimento", segment: "Cimentos" } + * getCest(500100); // { code: "0500100", description: "Cimento", segment: "Cimentos" } + * getCest("03.001.00"); // null (a revoked item) + * getCest("0000000"); // null + * getCest("abc0500100"); // null (not a documented form) + * ``` + * + * @see Official: https://www.confaz.fazenda.gov.br/legislacao/convenios/2018/CV142_18 + * Convênio ICMS 142/18, the consolidated text: cláusula sexta, IV (the 7 digits), Anexo I (the + * segments) and Anexos II to XXVI (the codes and their descriptions). + */ +export const getCest = (value: string | number): Cest | null => { + if (!isLookupCode(value)) return null; + + const cest = padLookupCode(value, CEST_LENGTH); + + if (!CEST_FORMAT_REGEX.test(cest)) return null; + + const code = sanitizeToDigits(cest); + const description = CEST_TABLE[code]; + + if (description === undefined) return null; + + return { code, description, segment: CEST_SEGMENTS[code.slice(0, SEGMENT_LENGTH)] }; +}; diff --git a/src/get-cid10/get-cid10.test.ts b/src/get-cid10/get-cid10.test.ts new file mode 100644 index 000000000..61ba5ab6a --- /dev/null +++ b/src/get-cid10/get-cid10.test.ts @@ -0,0 +1,144 @@ +import * as fc from "fast-check"; + +import { CID10_DESCRIPTIONS } from "../_internals/constants/cid10-descriptions"; +import { anyGarbage, PROTOTYPE_KEYS } from "../_internals/test/arbitraries"; +import { expectNeverThrows } from "../_internals/test/properties"; +import { describe, expect, expectTypeOf, it, test } from "../_internals/test/runtime"; +import { isValidCid10 } from "../is-valid-cid10/is-valid-cid10"; +import { getCid10, type Cid10 } from "./get-cid10"; + +describe("getCid10", () => { + it("should return a subcategory written with the dot", () => { + expect(getCid10("A00.0")).toEqual({ + code: "A000", + description: "Cólera devida a Vibrio cholerae 01, biótipo cholerae", + }); + }); + + it("should return a subcategory written without the dot", () => { + expect(getCid10("F322")).toEqual({ + code: "F322", + description: "Episódio depressivo grave sem sintomas psicóticos", + }); + }); + + it("should return a category", () => { + expect(getCid10("A00")).toEqual({ code: "A00", description: "Cólera" }); + expect(getCid10("F32")).toEqual({ code: "F32", description: "Episódios depressivos" }); + }); + + it("should return a category that has no subcategory (I10)", () => { + expect(getCid10("I10")).toEqual({ + code: "I10", + description: "Hipertensão essencial (primária)", + }); + }); + + it("should return the first and the last code of the table", () => { + expect(getCid10("A00")).toEqual({ code: "A00", description: "Cólera" }); + expect(getCid10("Z99.9")).toEqual({ + code: "Z999", + description: "Dependência de máquina e aparelho capacitante não especificado", + }); + }); + + it("should keep the quotes and brackets a description carries", () => { + expect(getCid10("F43.0")).toEqual({ code: "F430", description: 'Reação aguda ao "stress"' }); + expect(getCid10("Z76.5")).toEqual({ + code: "Z765", + description: "Pessoa fingindo ser doente [simulação consciente]", + }); + }); + + it("should ignore the letter case and surrounding whitespace", () => { + expect(getCid10(" m54.5 ")).toEqual({ code: "M545", description: "Dor lombar baixa" }); + }); + + it("should return a fresh object that does not leak the internal table", () => { + expect(getCid10("A000")).not.toBe(getCid10("A000")); + }); + + it("should return null for a subcategory its category does not have", () => { + expect(getCid10("A00.5")).toBeNull(); + expect(getCid10("I10.0")).toBeNull(); + }); + + it("should return null for a category the table does not have", () => { + expect(getCid10("A10")).toBeNull(); + expect(getCid10("U07.1")).toBeNull(); + }); + + it("should return null for a value that is not written in a documented form", () => { + expect(getCid10("")).toBeNull(); + expect(getCid10(" ")).toBeNull(); + expect(getCid10("A00-0")).toBeNull(); + expect(getCid10("A00.00")).toBeNull(); + expect(getCid10("A00.0 Cólera")).toBeNull(); + }); + + it("should return null for the keys of Object.prototype", () => { + for (const key of PROTOTYPE_KEYS) { + expect(getCid10(key)).toBeNull(); + } + }); + + it("should return null for a value that is not a string", () => { + // @ts-expect-error not a string + expect(getCid10(null)).toBeNull(); + // @ts-expect-error not a string + expect(getCid10()).toBeNull(); + // @ts-expect-error not a string + expect(getCid10(100)).toBeNull(); + // @ts-expect-error not a string + expect(getCid10(["A00"])).toBeNull(); + }); + + describe("properties", () => { + const codeArbitrary = fc.constantFrom(...Object.keys(CID10_DESCRIPTIONS)); + + test("should never throw, regardless of the input", () => { + expectNeverThrows(getCid10, anyGarbage); + }); + + test("should resolve every known code, in either case, and agree with isValidCid10", () => { + fc.assert( + fc.property(codeArbitrary, (code) => { + const expected = { code, description: CID10_DESCRIPTIONS[code] }; + + expect(getCid10(code)).toEqual(expected); + expect(getCid10(code.toLowerCase())).toEqual(expected); + expect(isValidCid10(code)).toBe(true); + }), + ); + }); + + test("should resolve every known subcategory with the dot", () => { + fc.assert( + fc.property( + codeArbitrary.filter((code) => code.length === 4), + (code) => { + const masked = `${code.slice(0, 3)}.${code.slice(3)}`; + + expect(getCid10(masked)).toEqual({ code, description: CID10_DESCRIPTIONS[code] }); + }, + ), + ); + }); + + test("should agree with isValidCid10 for any code shaped value", () => { + fc.assert( + fc.property(fc.stringMatching(/^[A-Z]\d{2}\.?\d?$/), (value) => { + expect(getCid10(value) !== null).toBe(isValidCid10(value)); + }), + ); + }); + }); +}); + +describe("getCid10 types", () => { + test("should take a string and return a Cid10 or null", () => { + expectTypeOf(getCid10).parameter(0).toEqualTypeOf(); + expectTypeOf(getCid10).returns.toEqualTypeOf(); + expectTypeOf().toEqualTypeOf<{ code: string; description: string }>(); + }); +}); diff --git a/src/get-cid10/get-cid10.ts b/src/get-cid10/get-cid10.ts new file mode 100644 index 000000000..90a508dbd --- /dev/null +++ b/src/get-cid10/get-cid10.ts @@ -0,0 +1,52 @@ +import { CID10_DESCRIPTIONS } from "../_internals/constants/cid10-descriptions"; +import { normalizeCid10 } from "../_internals/normalize-cid10/normalize-cid10"; + +/** + * A CID-10 (Classificação Internacional de Doenças, 10th revision) category or subcategory. + */ +export type Cid10 = { + /** The 3 character category or 4 character subcategory code, upper case and without the dot. */ + code: string; + /** The official Brazilian Portuguese description, as the DATASUS table prints it. */ + description: string; +}; + +/** + * Looks a CID-10 (Classificação Estatística Internacional de Doenças e Problemas Relacionados à + * Saúde, 10th revision) code up in the Brazilian Portuguese tables DATASUS publishes. + * + * Both levels of the classification are found: the 3 character categories (`A00`) and the 4 + * character subcategories, written with the dot medical certificates print (`A00.0`) or without + * it, the form the DATASUS tables store (`A000`). Letter case and surrounding whitespace are + * ignored. Anything else (`"A00-0"`, `"A00.00"`, a dagger or asterisk suffix, a value that is + * not a string) is rejected instead of having a code picked out of it. + * + * The tables are the CID-10 V2008 files, the revision DATASUS publishes as CSV: a code that is + * not in those files, such as `U07.1` (COVID-19), is not found. + * + * @param {string} value - The CID-10 code to look up, e.g. `"A00.0"`, `"A000"` or `"A00"`. + * @returns {Cid10|null} The matching category or subcategory, or null when the code is unknown + * or invalid. + * + * @example + * ```typescript + * getCid10("A00.0"); // { code: "A000", description: "Cólera devida a Vibrio cholerae 01, biótipo cholerae" } + * getCid10("a000"); // { code: "A000", description: "Cólera devida a Vibrio cholerae 01, biótipo cholerae" } + * getCid10("A00"); // { code: "A00", description: "Cólera" } + * getCid10("A00.5"); // null (A00 has no subcategory 5) + * getCid10("A00-0"); // null (not a documented form) + * ``` + * + * @see Official: http://www2.datasus.gov.br/cid10/V2008/downloads/CID10CSV.zip + * The CID-10 tables in CSV (`CID-10-CATEGORIAS.CSV` and `CID-10-SUBCATEGORIAS.CSV`), as + * published by DATASUS (Ministério da Saúde). + * @see Official: http://www2.datasus.gov.br/cid10/V2008/descrcsv.htm + * The DATASUS page that links the archive and documents its files, columns and encoding. + */ +export const getCid10 = (value: string): Cid10 | null => { + const code = normalizeCid10(value); + + if (!Object.hasOwn(CID10_DESCRIPTIONS, code)) return null; + + return { code, description: CID10_DESCRIPTIONS[code] }; +}; diff --git a/src/get-class-trib/get-class-trib.test.ts b/src/get-class-trib/get-class-trib.test.ts new file mode 100644 index 000000000..275a87256 --- /dev/null +++ b/src/get-class-trib/get-class-trib.test.ts @@ -0,0 +1,148 @@ +import * as fc from "fast-check"; + +import { CLASS_TRIB_CODES, CLASS_TRIB_TABLE } from "../_internals/constants/ibs-cbs"; +import { anyGarbage } from "../_internals/test/arbitraries"; +import { expectNeverThrows } from "../_internals/test/properties"; +import { describe, expect, expectTypeOf, it, test } from "../_internals/test/runtime"; +import { getCstIbsCbs } from "../get-cst-ibs-cbs/get-cst-ibs-cbs"; +import { isValidClassTrib } from "../is-valid-class-trib/is-valid-class-trib"; +import { getClassTrib, type ClassTrib } from "./get-class-trib"; + +describe("getClassTrib", () => { + it("should return the entry of a known code, with its CST, its name and its description", () => { + expect(getClassTrib("000002")).toEqual({ + code: "000002", + cst: "000", + name: "Exploração de via", + description: "Exploração de via, observado o art. 11 da Lei Complementar nº 214, de 2025.", + }); + expect(getClassTrib("410999")).toEqual({ + code: "410999", + cst: "410", + name: "Operações não onerosas sem previsão de tributação, não especificadas anteriormente", + description: + "Operações não onerosas sem previsão de tributação, não especificadas anteriormente, observado o art. 4º da Lei Complementar nº 214, de 2025.", + }); + }); + + it("should return the entry of a code given as a number", () => { + expect(getClassTrib(811_001)).toEqual({ + code: "811001", + cst: "811", + name: "Anulação de Crédito por Saídas Imunes/Isentas", + description: + "Anulação de crédito proporcional ao valor das operações imunes e isentas, observado o art. 51 da Lei Complementar nº 214, de 2025.", + }); + }); + + it("should pad a value with leading zeros, as a number or as a string", () => { + const expected = { + code: "000001", + cst: "000", + name: "Situações tributadas integralmente pelo IBS e CBS.", + description: "Situações tributadas integralmente pelo IBS e CBS.", + }; + + expect(getClassTrib(1)).toEqual(expected); + expect(getClassTrib("1")).toEqual(expected); + expect(getClassTrib(" 000001 ")).toEqual(expected); + expect(getClassTrib(10_002)?.cst).toBe("010"); + }); + + it("should carry a code Informe Técnico 2025.002 v.1.60 created (620007)", () => { + expect(getClassTrib("620007")).toEqual({ + code: "620007", + cst: "620", + name: "Perecimento, deteriorização, roubo, furto ou extravio no regime monofásico", + description: + "Perecimento, deteriorização, roubo, furto ou extravio no regime monofásico sem estorno de crédito, observado o art. 47 da Lei Complementar nº 214, de 2025.", + }); + }); + + it("should keep the workbook text on one line, without the line breaks of its cells", () => { + expect(getClassTrib("830001")?.name).toBe( + "Documento com exclusão da BC da CBS e do IBS de energia elétrica fornecida pela distribuidora à UC", + ); + }); + + it("should return a fresh object on every call", () => { + expect(getClassTrib("200001")).not.toBe(getClassTrib("200001")); + }); + + it("should return null for the classifications of CST 220 Informe Técnico 2025.002 v.1.60 excluded", () => { + expect(getClassTrib("220001")).toBeNull(); + expect(getClassTrib("220002")).toBeNull(); + expect(getClassTrib("220003")).toBeNull(); + }); + + it("should return null for a code the table does not carry", () => { + expect(getClassTrib("999999")).toBeNull(); + expect(getClassTrib("000000")).toBeNull(); + expect(getClassTrib("2000010")).toBeNull(); + expect(getClassTrib("200")).toBeNull(); + }); + + it("should return null for a string that is not bare digits", () => { + expect(getClassTrib("c200001")).toBeNull(); + expect(getClassTrib("200.001")).toBeNull(); + expect(getClassTrib("")).toBeNull(); + expect(getClassTrib("__proto__")).toBeNull(); + }); + + it("should return null for a number that is not a non-negative safe integer", () => { + expect(getClassTrib(-200_001)).toBeNull(); + expect(getClassTrib(200_001.5)).toBeNull(); + expect(getClassTrib(2 ** 53)).toBeNull(); + }); + + it("should return null for a value that is not a string or a number", () => { + // @ts-expect-error not a string or number + expect(getClassTrib(null)).toBeNull(); + // @ts-expect-error not a string or number + expect(getClassTrib()).toBeNull(); + expect(getClassTrib(Object.create(null))).toBeNull(); + }); + + describe("properties", () => { + test("should never throw, regardless of the input", () => { + expectNeverThrows(getClassTrib, anyGarbage); + }); + + test("should resolve every code isValidClassTrib knows, under a CST getCstIbsCbs knows", () => { + fc.assert( + fc.property(fc.constantFrom(...CLASS_TRIB_CODES), (code) => { + const entry = getClassTrib(code); + + expect(entry?.code).toBe(code); + expect(getCstIbsCbs(entry?.cst ?? "")).not.toBeNull(); + expect(isValidClassTrib(code, { cst: entry?.cst })).toBe(true); + }), + ); + }); + + test("should describe exactly the codes isValidClassTrib accepts", () => { + expect(Object.keys(CLASS_TRIB_TABLE).sort()).toEqual([...CLASS_TRIB_CODES]); + }); + + test("should resolve a value exactly when isValidClassTrib accepts it", () => { + fc.assert( + fc.property(fc.integer({ min: 0, max: 999_999 }), (value) => { + expect(getClassTrib(value) !== null).toBe(isValidClassTrib(value)); + }), + ); + }); + }); +}); + +describe("getClassTrib types", () => { + test("should take a string or number and return a ClassTrib or null", () => { + expectTypeOf(getClassTrib).parameter(0).toEqualTypeOf(); + expectTypeOf(getClassTrib).returns.toEqualTypeOf(); + expectTypeOf().toEqualTypeOf<{ + code: string; + cst: string; + name: string; + description: string; + }>(); + }); +}); diff --git a/src/get-class-trib/get-class-trib.ts b/src/get-class-trib/get-class-trib.ts new file mode 100644 index 000000000..6a28e8d56 --- /dev/null +++ b/src/get-class-trib/get-class-trib.ts @@ -0,0 +1,89 @@ +import { + CLASS_TRIB_FORMAT_REGEX, + CLASS_TRIB_LENGTH, + CLASS_TRIB_TABLE, + CST_IBS_CBS_LENGTH, +} from "../_internals/constants/ibs-cbs"; +import { isLookupCode } from "../_internals/is-lookup-code/is-lookup-code"; +import { padLookupCode } from "../_internals/pad-lookup-code/pad-lookup-code"; + +/** + * A cClassTrib (Código de Classificação Tributária do IBS e da CBS) code. + */ +export type ClassTrib = { + /** The 6 digit cClassTrib code. */ + code: string; + /** The 3 digit CST-IBS/CBS the classification belongs to, the first 3 digits of the code. */ + cst: string; + /** The short name the official table gives for display ("Nome cClassTrib"). */ + name: string; + /** The situation the classification refers to ("Descrição cClassTrib"). */ + description: string; +}; + +/** + * Looks a cClassTrib (Código de Classificação Tributária do IBS e da CBS) up in the official + * table, the code the field `cClassTrib` of the group `IBSCBS` carries next to the CST-IBS/CBS + * in the electronic fiscal documents of the tax reform (Lei Complementar nº 214/2025). + * + * Every classification belongs to exactly one CST-IBS/CBS, the first 3 digits of its code, so + * the entry carries it as `cst` and the lookup needs no CST to narrow it. The table holds the + * classifications in force: one the Informe Técnico excluded by closing its validity (220001, + * 220002 and 220003 in v.1.60) gives `null`. The legal wording the workbook also prints for + * each row (the article of the law and of both regulations) is not shipped. + * + * A string is only read as a code when it is written as bare digits, with optional surrounding + * whitespace: the field has no mask, so anything else (`"c200001"`) is rejected instead of + * having its digits picked out. A number is only read as a code when it is a non-negative safe + * integer. A value narrower than 6 digits is left padded with zeros, as a string or as a number, + * since the codes start with zeros a numeric field drops: `1`, `"1"` and `"000001"` are all the + * code `000001`. + * + * @param {string|number} value - The cClassTrib to look up, e.g. `"200001"` or `200001`. + * @returns {ClassTrib|null} The matching entry, or null when the code is unknown or invalid. + * + * @example + * ```typescript + * getClassTrib("000002"); + * // { + * // code: "000002", + * // cst: "000", + * // name: "Exploração de via", + * // description: "Exploração de via, observado o art. 11 da Lei Complementar nº 214, de 2025.", + * // } + * getClassTrib(2)?.code; // "000002" + * getClassTrib("999999"); // null + * getClassTrib("220001"); // null (excluded by Informe Técnico 2025.002 v.1.60) + * getClassTrib("c200001"); // null (not a documented form) + * ``` + * + * @see Official: https://www.nfe.fazenda.gov.br/portal/listaConteudo.aspx?tipoConteudo=/NJarYc9nus= + * "Documentos" > "Diversos" of the Portal Nacional da NF-e, which publishes every version of the + * "Tabela de Classificação Tributária do IBS e CBS" workbook (sheets CST and cClassTrib). + * @see Official: https://www.nfe.fazenda.gov.br/portal/listaConteudo.aspx?tipoConteudo=hXzemuyNHW4= + * Informe Técnico 2025.002 (v.1.60 of 22/06/2026), which divulges both tables, defines their + * columns and states that the first three digits of a cClassTrib are its CST-IBS/CBS. + * @see Official: https://www.nfe.fazenda.gov.br/portal/listaConteudo.aspx?tipoConteudo=04BIflQt1aY= + * Nota Técnica 2025.002-RTC (v.1.51), fields UB13 `CST` (N, 3 digits) and UB14 `cClassTrib` (N, + * 6 digits) and the rejections 1020 (unknown CST), 1023 (unknown cClassTrib) and 1024 + * (cClassTrib incompatible with the CST). + * @see Official: https://dfe-portal.svrs.rs.gov.br/DFE/TabelaClassificacaoTributaria + * The same tables online, on the Portal dos Documentos Fiscais Eletrônicos (SVRS). + * @see Official: https://www.planalto.gov.br/ccivil_03/leis/lcp/lcp214.htm + * Lei Complementar nº 214/2025, which institutes the IBS and the CBS. + */ +export const getClassTrib = (value: string | number): ClassTrib | null => { + if (!isLookupCode(value)) return null; + + const code = padLookupCode(value, CLASS_TRIB_LENGTH); + + if (!CLASS_TRIB_FORMAT_REGEX.test(code)) return null; + + const entry = CLASS_TRIB_TABLE[code]; + + if (entry === undefined) return null; + + const [name, description] = entry; + + return { code, cst: code.slice(0, CST_IBS_CBS_LENGTH), name, description }; +}; diff --git a/src/get-cnpj-info/get-cnpj-info.test.ts b/src/get-cnpj-info/get-cnpj-info.test.ts new file mode 100644 index 000000000..c330c67a9 --- /dev/null +++ b/src/get-cnpj-info/get-cnpj-info.test.ts @@ -0,0 +1,242 @@ +import * as fc from "fast-check"; + +import { anyText, anyValue } from "../_internals/test/arbitraries"; +import { describe, expect, expectTypeOf, test } from "../_internals/test/runtime"; +import { formatCnpj } from "../format-cnpj/format-cnpj"; +import { generateCnpj } from "../generate-cnpj/generate-cnpj"; +import { isValidCnpj } from "../is-valid-cnpj/is-valid-cnpj"; +import { type CnpjInfo, getCnpjInfo, type GetCnpjInfoOptions } from "./get-cnpj-info"; + +describe("getCnpjInfo", () => { + describe("should return the parsed numeric CNPJ", () => { + test("for the headquarters branch", () => { + expect(getCnpjInfo("12345678000195")).toEqual({ + root: "12345678", + branch: "0001", + checkDigits: "95", + isInitialHeadquarters: true, + }); + }); + + test("for another branch", () => { + expect(getCnpjInfo("12345678000276")).toEqual({ + root: "12345678", + branch: "0002", + checkDigits: "76", + isInitialHeadquarters: false, + }); + }); + + test("for a root with leading zeros", () => { + expect(getCnpjInfo("00000001000136")).toEqual({ + root: "00000001", + branch: "0001", + checkDigits: "36", + isInitialHeadquarters: true, + }); + }); + + test("for a masked value", () => { + expect(getCnpjInfo("12.345.678/0001-95")).toEqual({ + root: "12345678", + branch: "0001", + checkDigits: "95", + isInitialHeadquarters: true, + }); + }); + + test("for a value with a whitespace mask and surrounding whitespace", () => { + expect(getCnpjInfo(" 12 345 678 0002 76 ")).toEqual({ + root: "12345678", + branch: "0002", + checkDigits: "76", + isInitialHeadquarters: false, + }); + }); + + test("under version 2, which reads both formats", () => { + expect(getCnpjInfo("12.345.678/0001-95", { version: 2 })).toEqual({ + root: "12345678", + branch: "0001", + checkDigits: "95", + isInitialHeadquarters: true, + }); + }); + + test("under an unknown version, read as version 1", () => { + // @ts-expect-error: intentionally invalid option + expect(getCnpjInfo("12345678000195", { version: 3 })).toEqual({ + root: "12345678", + branch: "0001", + checkDigits: "95", + isInitialHeadquarters: true, + }); + }); + }); + + describe("should return the parsed alphanumeric CNPJ under version 2", () => { + test("for the example of the Receita Federal check digit manual", () => { + expect(getCnpjInfo("12.ABC.345/01DE-35", { version: 2 })).toEqual({ + root: "12ABC345", + branch: "01DE", + checkDigits: "35", + isInitialHeadquarters: false, + }); + }); + + test("for a lowercase value, upper casing the fields", () => { + expect(getCnpjInfo("12abc34501de35", { version: 2 })).toEqual({ + root: "12ABC345", + branch: "01DE", + checkDigits: "35", + isInitialHeadquarters: false, + }); + }); + + test("for an alphanumeric root with the headquarters branch", () => { + expect(getCnpjInfo("AB.12C.D34/0001-84", { version: 2 })).toEqual({ + root: "AB12CD34", + branch: "0001", + checkDigits: "84", + isInitialHeadquarters: true, + }); + }); + + test("for an alphanumeric root and branch (Receita Federal Q&A, question 23)", () => { + expect(getCnpjInfo("AA345678/000A-29", { version: 2 })).toEqual({ + root: "AA345678", + branch: "000A", + checkDigits: "29", + isInitialHeadquarters: false, + }); + }); + + test("for a numeric root with an alphanumeric branch (Receita Federal Q&A, question 23)", () => { + expect(getCnpjInfo("12.345.678/000A-08", { version: 2 })).toEqual({ + root: "12345678", + branch: "000A", + checkDigits: "08", + isInitialHeadquarters: false, + }); + }); + }); + + describe("should return null", () => { + test("when an alphanumeric CNPJ is read under the default version", () => { + expect(getCnpjInfo("12.ABC.345/01DE-35")).toBeNull(); + expect(getCnpjInfo("12.ABC.345/01DE-35", {})).toBeNull(); + expect(getCnpjInfo("12.ABC.345/01DE-35", { version: 1 })).toBeNull(); + }); + + test("when the check digits do not match", () => { + expect(getCnpjInfo("12345678000190")).toBeNull(); + expect(getCnpjInfo("12ABC34501DE34", { version: 2 })).toBeNull(); + }); + + test("when a check digit is a letter", () => { + expect(getCnpjInfo("12ABC34501DE3A", { version: 2 })).toBeNull(); + }); + + test("when it is a reserved repeated digits number", () => { + expect(getCnpjInfo("00000000000000")).toBeNull(); + expect(getCnpjInfo("11111111111111", { version: 2 })).toBeNull(); + }); + + test("when it is shorter or longer than 14 characters", () => { + expect(getCnpjInfo("1234567800019")).toBeNull(); + expect(getCnpjInfo("123456780001955")).toBeNull(); + }); + + test("when it carries a character outside the mask", () => { + expect(getCnpjInfo("12.345.678/0001-95x")).toBeNull(); + expect(getCnpjInfo("12_345_678_0001_95")).toBeNull(); + }); + + test("when it is an empty string", () => { + expect(getCnpjInfo("")).toBeNull(); + }); + + test("when it is not a string", () => { + // @ts-expect-error: intentionally invalid input + expect(getCnpjInfo(null)).toBeNull(); + // @ts-expect-error: intentionally invalid input + expect(getCnpjInfo()).toBeNull(); + // @ts-expect-error: intentionally invalid input + expect(getCnpjInfo(12_345_678_000_195)).toBeNull(); + // @ts-expect-error: intentionally invalid input + expect(getCnpjInfo({})).toBeNull(); + // @ts-expect-error: intentionally invalid input + expect(getCnpjInfo(["12345678000195"])).toBeNull(); + }); + + test("when the options are null", () => { + // @ts-expect-error: intentionally invalid options + expect(getCnpjInfo("12.ABC.345/01DE-35", null)).toBeNull(); + }); + }); + + describe("properties", () => { + const version = fc.constantFrom(1 as const, 2 as const); + + test("should split a generated CNPJ into fields that spell it back, masked or not", () => { + fc.assert( + fc.property(version, fc.boolean(), (currentVersion, masked) => { + const cnpj = generateCnpj(currentVersion); + const written = masked ? formatCnpj(cnpj, { version: 2 }) : cnpj; + const parsed = getCnpjInfo(written.toLowerCase(), { version: 2 }); + + expect(`${parsed?.root}${parsed?.branch}${parsed?.checkDigits}`).toBe(cnpj); + }), + ); + }); + + test("should flag the branch 0001 of a generated CNPJ and no other", () => { + fc.assert( + fc.property(version, fc.integer({ min: 1, max: 9999 }), (currentVersion, branch) => { + const cnpj = generateCnpj({ version: currentVersion, branch }); + const parsed = getCnpjInfo(cnpj, { version: currentVersion }); + + expect(parsed?.branch).toBe(String(branch).padStart(4, "0")); + expect(parsed?.isInitialHeadquarters).toBe(branch === 1); + }), + ); + }); + + test("should return a value exactly when the CNPJ is valid", () => { + fc.assert( + fc.property(fc.oneof(anyText, anyValue), version, (value, currentVersion) => { + const options = { version: currentVersion }; + + expect(getCnpjInfo(value as string, options) !== null).toBe( + isValidCnpj(value as string, options), + ); + }), + ); + }); + + test("should never throw and always return a CNPJ or null", () => { + fc.assert( + fc.property(anyValue, fc.anything(), (value, options) => { + const parsed = getCnpjInfo(value as string, options as GetCnpjInfoOptions); + + expect(parsed === null || parsed.root.length === 8).toBe(true); + }), + ); + }); + }); +}); + +describe("getCnpjInfo types", () => { + test("should take a string and options and return a CnpjInfo or null", () => { + expectTypeOf(getCnpjInfo).parameter(0).toEqualTypeOf(); + expectTypeOf(getCnpjInfo).parameter(1).toEqualTypeOf(); + expectTypeOf(getCnpjInfo).returns.toEqualTypeOf(); + expectTypeOf().toEqualTypeOf<{ version?: 1 | 2 }>(); + expectTypeOf().toEqualTypeOf<{ + root: string; + branch: string; + checkDigits: string; + isInitialHeadquarters: boolean; + }>(); + }); +}); diff --git a/src/get-cnpj-info/get-cnpj-info.ts b/src/get-cnpj-info/get-cnpj-info.ts new file mode 100644 index 000000000..520a65d69 --- /dev/null +++ b/src/get-cnpj-info/get-cnpj-info.ts @@ -0,0 +1,101 @@ +import { sanitizeToAlphanumeric } from "../_internals/sanitize-to-alphanumeric/sanitize-to-alphanumeric"; +import { isValidCnpj, type IsValidCnpjOptions } from "../is-valid-cnpj/is-valid-cnpj"; + +/** Options of `getCnpjInfo`. */ +export type GetCnpjInfoOptions = Pick; + +/** The fields `getCnpjInfo` reads out of a CNPJ. */ +export type CnpjInfo = { + /** The 8 character root (raiz), positions 1 to 8, shared by every establishment of the entity. */ + root: string; + /** The 4 character branch of the establishment, positions 9 to 12, called "número de ordem" by the Receita Federal. */ + branch: string; + /** The 2 numeric check digits (dígitos verificadores), positions 13 and 14. */ + checkDigits: string; + /** + * Whether the branch is `0001`, the one the Receita Federal gives the headquarters (matriz) + * when the root is registered. A filial that later becomes the headquarters keeps its + * number, so only the Receita Federal registry tells the current headquarters. + */ + isInitialHeadquarters: boolean; +}; + +const ROOT_END = 8; + +const BRANCH_END = 12; + +const INITIAL_HEADQUARTERS_BRANCH = "0001"; + +/** + * Parses a CNPJ (Cadastro Nacional da Pessoa Jurídica) into the fields the number encodes. + * + * Anexo XV of Instrução Normativa RFB nº 2.119/2022, added by Instrução Normativa RFB + * nº 2.229/2024, lays the 14 positions out as 8 (root, raiz, the entity) + 4 (branch, número de + * ordem, the establishment) + 2 (check digits, always numeric). In the alphanumeric format, + * assigned to new registrations from July 2026, the root and the branch take the digits `0` to + * `9` and the upper case letters `A` to `Z`, and either of them may still come out all numeric. + * + * Accepts the same input forms and reads `options.version` the same way as `isValidCnpj`: `1` + * (the default) recognizes the numeric format only, `2` recognizes both, and any other value is + * read as `1`. Returns `null` whenever `isValidCnpj` would return `false` for the same + * arguments, so an alphanumeric CNPJ read under version `1` is `null`. The fields of an + * alphanumeric CNPJ are returned upper cased. + * + * The branch `0001` marks the headquarters (matriz) only at registration: the Receita Federal + * Q&A (question 25) states that a filial can become the headquarters while keeping its + * número de ordem, hence `isInitialHeadquarters` instead of a definitive headquarters flag. + * + * @param {string} value - The CNPJ to be parsed. + * @param {GetCnpjInfoOptions} [options] - Optional options. + * @param {1|2} [options.version] - `1` reads the numeric-only format (the default), `2` reads + * both the numeric and the alphanumeric formats. + * @returns {CnpjInfo|null} The parsed CNPJ, or `null` when it is not valid. + * + * @example + * ```typescript + * getCnpjInfo("12.345.678/0001-95"); + * // { + * // root: "12345678", + * // branch: "0001", + * // checkDigits: "95", + * // isInitialHeadquarters: true, + * // } + * + * getCnpjInfo("12.abc.345/01de-35", { version: 2 }); + * // { + * // root: "12ABC345", + * // branch: "01DE", + * // checkDigits: "35", + * // isInitialHeadquarters: false, + * // } + * + * getCnpjInfo("12.ABC.345/01DE-35"); // null (alphanumeric, read under version 1) + * getCnpjInfo("12.345.678/0001-90"); // null (bad check digits) + * ``` + * + * @see Official: http://normas.receita.fazenda.gov.br/sijut2consulta/link.action?idAto=141102 + * Instrução Normativa RFB nº 2.229/2024, whose Anexo Único is the Anexo XV of IN RFB + * nº 2.119/2022: positions 1 to 8 root, 9 to 12 número de ordem (branch), 13 and 14 check digits. + * @see Official: https://www.gov.br/receitafederal/pt-br/centrais-de-conteudo/publicacoes/perguntas-e-respostas/cnpj/cnpj-alfanumerico.pdf + * Receita Federal Q&A on the alphanumeric CNPJ: questions 21 and 23 (root and branch), 25 (the + * branch `0001` and the headquarters) and the `AA345678/000A-29` and `12.345.678/000A-08` + * examples. + * @see Official: https://www.gov.br/receitafederal/pt-br/centrais-de-conteudo/publicacoes/documentos-tecnicos/cnpj/manual-dv-cnpj.pdf + * Check digit manual, source of the `12.ABC.345/01DE-35` example. + * @see Official: https://www.gov.br/receitafederal/pt-br/acesso-a-informacao/acoes-e-programas/programas-e-atividades/cnpj-alfanumerico + * @see Based on: https://anvisalegis.datalegis.net/action/ActionDatalegis.php?acao=detalharAto&tipo=INM&numeroAto=00002229&seqAto=000&valorAno=2024&orgao=RFB/MF + * Mirror of IN RFB nº 2.229/2024 where the Anexo Único was read. + */ +export const getCnpjInfo = (value: string, options?: GetCnpjInfoOptions): CnpjInfo | null => { + if (!isValidCnpj(value, options)) return null; + + const cnpj = sanitizeToAlphanumeric(value); + const branch = cnpj.slice(ROOT_END, BRANCH_END); + + return { + root: cnpj.slice(0, ROOT_END), + branch, + checkDigits: cnpj.slice(BRANCH_END), + isInitialHeadquarters: branch === INITIAL_HEADQUARTERS_BRANCH, + }; +}; diff --git a/src/get-cpf-info/get-cpf-info.test.ts b/src/get-cpf-info/get-cpf-info.test.ts new file mode 100644 index 000000000..7e79b0c29 --- /dev/null +++ b/src/get-cpf-info/get-cpf-info.test.ts @@ -0,0 +1,193 @@ +import * as fc from "fast-check"; + +import { type StateCode } from "../_internals/constants/states"; +import { anyGarbage, anyText, anyValue, stateCodes } from "../_internals/test/arbitraries"; +import { expectNeverThrows } from "../_internals/test/properties"; +import { describe, expect, expectTypeOf, test } from "../_internals/test/runtime"; +import { formatCpf } from "../format-cpf/format-cpf"; +import { generateCpf } from "../generate-cpf/generate-cpf"; +import { isValidCpf } from "../is-valid-cpf/is-valid-cpf"; +import { type CpfInfo, getCpfInfo } from "./get-cpf-info"; + +const REGIONS: [string, CpfInfo][] = [ + [ + "40152673113", + { + base: "40152673", + fiscalRegion: "1", + states: ["DF", "GO", "MT", "MS", "TO"], + checkDigits: "13", + }, + ], + [ + "73091462200", + { + base: "73091462", + fiscalRegion: "2", + states: ["AC", "AP", "AM", "PA", "RO", "RR"], + checkDigits: "00", + }, + ], + [ + "20581746317", + { base: "20581746", fiscalRegion: "3", states: ["CE", "MA", "PI"], checkDigits: "17" }, + ], + [ + "91827364483", + { base: "91827364", fiscalRegion: "4", states: ["AL", "PB", "PE", "RN"], checkDigits: "83" }, + ], + ["56473829598", { base: "56473829", fiscalRegion: "5", states: ["BA", "SE"], checkDigits: "98" }], + ["37192048631", { base: "37192048", fiscalRegion: "6", states: ["MG"], checkDigits: "31" }], + ["84620513717", { base: "84620513", fiscalRegion: "7", states: ["ES", "RJ"], checkDigits: "17" }], + ["15937264819", { base: "15937264", fiscalRegion: "8", states: ["SP"], checkDigits: "19" }], + ["60248175920", { base: "60248175", fiscalRegion: "9", states: ["PR", "SC"], checkDigits: "20" }], + ["48301692065", { base: "48301692", fiscalRegion: "0", states: ["RS"], checkDigits: "65" }], +]; + +describe("getCpfInfo", () => { + describe("should return the fields of the CPF", () => { + for (const [cpf, expected] of REGIONS) { + test(`for ${cpf}, of the região fiscal ${expected.fiscalRegion}`, () => { + expect(getCpfInfo(cpf)).toEqual(expected); + }); + } + + test("for the worked example of the e-Financeira manual (280012389-38)", () => { + expect(getCpfInfo("280012389-38")).toEqual({ + base: "28001238", + fiscalRegion: "9", + states: ["PR", "SC"], + checkDigits: "38", + }); + }); + + test("for a masked value", () => { + expect(getCpfInfo("123.456.789-09")).toEqual({ + base: "12345678", + fiscalRegion: "9", + states: ["PR", "SC"], + checkDigits: "09", + }); + }); + + test("for a value with whitespace around and between the groups", () => { + expect(getCpfInfo(" 111 444 777 35\n")).toEqual({ + base: "11144477", + fiscalRegion: "7", + states: ["ES", "RJ"], + checkDigits: "35", + }); + }); + + test("with a states list of its own on every call", () => { + const first = getCpfInfo("12345678909"); + + first?.states.push("SP"); + + expect(getCpfInfo("12345678909")?.states).toEqual(["PR", "SC"]); + }); + }); + + describe("should return null", () => { + test("when the check digits do not match", () => { + expect(getCpfInfo("12345678900")).toBeNull(); + }); + + test("when every digit is the same", () => { + expect(getCpfInfo("00000000000")).toBeNull(); + expect(getCpfInfo("111.111.111-11")).toBeNull(); + }); + + test("when it is shorter than 11 digits", () => { + expect(getCpfInfo("1234567890")).toBeNull(); + }); + + test("when it is longer than 11 digits", () => { + expect(getCpfInfo("123456789090")).toBeNull(); + }); + + test("when it carries a character outside the mask", () => { + expect(getCpfInfo("123.456.789-09a")).toBeNull(); + expect(getCpfInfo("123_456_789_09")).toBeNull(); + }); + + test("when it is an empty string", () => { + expect(getCpfInfo("")).toBeNull(); + }); + + test("when it is null", () => { + // @ts-expect-error: intentionally invalid input + expect(getCpfInfo(null)).toBeNull(); + }); + + test("when it is undefined", () => { + // @ts-expect-error: intentionally invalid input + expect(getCpfInfo()).toBeNull(); + }); + + test("when it is a number", () => { + // @ts-expect-error: intentionally invalid input + expect(getCpfInfo(12_345_678_909)).toBeNull(); + }); + + test("when it is an object, a null prototype one included", () => { + // @ts-expect-error: intentionally invalid input + expect(getCpfInfo({})).toBeNull(); + expect(getCpfInfo(Object.create(null))).toBeNull(); + // @ts-expect-error: intentionally invalid input + expect(getCpfInfo(["12345678909"])).toBeNull(); + }); + + test("when it is a key of the prototype chain", () => { + expect(getCpfInfo("__proto__")).toBeNull(); + expect(getCpfInfo("constructor")).toBeNull(); + }); + }); + + describe("properties", () => { + test("should split a CPF into fields that spell it back, masked or not", () => { + fc.assert( + fc.property(fc.boolean(), (masked) => { + const cpf = generateCpf(); + const parsed = getCpfInfo(masked ? formatCpf(cpf) : cpf); + + expect(`${parsed?.base}${parsed?.fiscalRegion}${parsed?.checkDigits}`).toBe(cpf); + }), + ); + }); + + test("should list the state a CPF was generated for", () => { + fc.assert( + fc.property(stateCodes, (state) => { + expect(getCpfInfo(generateCpf(state))?.states).toContain(state); + }), + ); + }); + + test("should return a value exactly when the CPF is valid", () => { + fc.assert( + fc.property(anyText, (value) => { + expect(getCpfInfo(value) !== null).toBe(isValidCpf(value)); + }), + ); + }); + + test("should never throw", () => { + expectNeverThrows(getCpfInfo, anyValue); + expectNeverThrows(getCpfInfo, anyGarbage); + }); + }); +}); + +describe("getCpfInfo types", () => { + test("should take a string and return a CpfInfo or null", () => { + expectTypeOf(getCpfInfo).parameter(0).toEqualTypeOf(); + expectTypeOf(getCpfInfo).returns.toEqualTypeOf(); + expectTypeOf().toEqualTypeOf<{ + base: string; + fiscalRegion: string; + states: StateCode[]; + checkDigits: string; + }>(); + }); +}); diff --git a/src/get-cpf-info/get-cpf-info.ts b/src/get-cpf-info/get-cpf-info.ts new file mode 100644 index 000000000..eacd0a20e --- /dev/null +++ b/src/get-cpf-info/get-cpf-info.ts @@ -0,0 +1,76 @@ +import { CPF_BASE_LENGTH, CPF_FISCAL_REGION_BY_STATE } from "../_internals/constants/cpf"; +import { STATE_CODES } from "../_internals/constants/state-codes"; +import { type StateCode } from "../_internals/constants/states"; +import { sanitizeToDigits } from "../_internals/sanitize-to-digits/sanitize-to-digits"; +import { isValidCpf } from "../is-valid-cpf/is-valid-cpf"; + +export type { StateCode } from "../_internals/constants/states"; + +/** The fields `getCpfInfo` reads out of a CPF. */ +export type CpfInfo = { + /** The first 8 digits, the ones ahead of the Região Fiscal digit. */ + base: string; + /** + * The 9th digit, the Região Fiscal of the Receita Federal the CPF was registered in: `"1"` to + * `"9"` for the 1ª to the 9ª Região Fiscal and `"0"` for the 10ª. + */ + fiscalRegion: string; + /** The two letter codes of the states of that Região Fiscal, sorted by state name. */ + states: StateCode[]; + /** The 2 check digits. */ + checkDigits: string; +}; + +const CHECK_DIGITS_START = CPF_BASE_LENGTH + 1; + +/** + * Reads the fields a CPF (Cadastro de Pessoas Físicas) encodes: the 8 digit base, the Região + * Fiscal digit with the states it covers, and the 2 check digits. + * + * The Receita Federal is split into ten Regiões Fiscais, and the 9th digit of a CPF is the one of + * the address given when the number was first registered. It says nothing about where its holder + * was born, lives today or asked for the number, and a region with more than one state does not + * tell which of them it was. + * + * Accepts the same input forms as `isValidCpf`, masked or not, with whitespace around and between + * the groups, and returns `null` whenever `isValidCpf` would return `false`. + * + * @param {string} value - The CPF to be read. + * @returns {CpfInfo|null} The fields of the CPF, or `null` when it is not a valid CPF. + * + * @example + * ```typescript + * getCpfInfo("123.456.789-09"); + * // { + * // base: "12345678", + * // fiscalRegion: "9", + * // states: ["PR", "SC"], + * // checkDigits: "09", + * // } + * + * getCpfInfo("12345678909"); // same result (no mask) + * getCpfInfo("12345678900"); // null (invalid check digits) + * getCpfInfo("00000000000"); // null (reserved number) + * ``` + * + * @see Official: https://www.gov.br/receitafederal/pt-br/assuntos/educacao-fiscal/educacao_fiscal/folhetos-orientativos/cadastros-dig.pdf + * Folheto "Cadastros: CPF e CNPJ" of the Receita Federal: the 9th digit is the Região Fiscal, and + * the states of each of the ten regions. + * @see Official: https://www.gov.br/receitafederal/pt-br/composicao/srrf + * Superintendências Regionais da Receita Federal: the states under each of the 1ª to the 10ª + * Região Fiscal, the 10ª (Rio Grande do Sul) being the digit 0. + * @see Official: https://www.gov.br/receitafederal/pt-br/assuntos/meu-cpf + */ +export const getCpfInfo = (value: string): CpfInfo | null => { + if (!isValidCpf(value)) return null; + + const digits = sanitizeToDigits(value); + const fiscalRegion = digits.charAt(CPF_BASE_LENGTH); + + return { + base: digits.slice(0, CPF_BASE_LENGTH), + fiscalRegion, + states: STATE_CODES.filter((state) => CPF_FISCAL_REGION_BY_STATE[state] === fiscalRegion), + checkDigits: digits.slice(CHECK_DIGITS_START), + }; +}; diff --git a/src/get-cst-ibs-cbs/get-cst-ibs-cbs.test.ts b/src/get-cst-ibs-cbs/get-cst-ibs-cbs.test.ts new file mode 100644 index 000000000..b1243b3df --- /dev/null +++ b/src/get-cst-ibs-cbs/get-cst-ibs-cbs.test.ts @@ -0,0 +1,107 @@ +import * as fc from "fast-check"; + +import { CST_IBS_CBS_TABLE } from "../_internals/constants/ibs-cbs"; +import { anyGarbage } from "../_internals/test/arbitraries"; +import { expectNeverThrows } from "../_internals/test/properties"; +import { describe, expect, expectTypeOf, it, test } from "../_internals/test/runtime"; +import { isValidCstIbsCbs } from "../is-valid-cst-ibs-cbs/is-valid-cst-ibs-cbs"; +import { getCstIbsCbs, type CstIbsCbs } from "./get-cst-ibs-cbs"; + +describe("getCstIbsCbs", () => { + it("should return the entry of a known code", () => { + expect(getCstIbsCbs("000")).toEqual({ code: "000", description: "Tributação integral" }); + expect(getCstIbsCbs("410")).toEqual({ + code: "410", + description: "Imunidade e não incidência", + }); + expect(getCstIbsCbs(620)).toEqual({ code: "620", description: "Tributação monofásica" }); + }); + + it("should take the description from the CST sheet, not the per classification wording of the cClassTrib sheet", () => { + expect(getCstIbsCbs("200")?.description).toBe("Alíquota reduzida"); + expect(getCstIbsCbs("011")?.description).toBe("Tributação com alíquotas uniformes reduzidas"); + }); + + it("should carry the wording Informe Técnico 2025.002 v.1.40 gave CST 820", () => { + expect(getCstIbsCbs("820")?.description).toBe("Tributação em documento específico"); + }); + + it("should carry the codes later versions of the table added (222, 515 and 811)", () => { + expect(getCstIbsCbs("222")?.description).toBe("Redução de base de cálculo"); + expect(getCstIbsCbs("515")?.description).toBe("Diferimento com redução de alíquota"); + expect(getCstIbsCbs("811")?.description).toBe("Ajustes"); + }); + + it("should pad a value with leading zeros, as a number or as a string", () => { + const expected = { code: "010", description: "Tributação com alíquotas uniformes" }; + + expect(getCstIbsCbs(10)).toEqual(expected); + expect(getCstIbsCbs("10")).toEqual(expected); + expect(getCstIbsCbs(" 010 ")).toEqual(expected); + expect(getCstIbsCbs(0)?.code).toBe("000"); + }); + + it("should return a fresh object on every call", () => { + expect(getCstIbsCbs("000")).not.toBe(getCstIbsCbs("000")); + }); + + it("should return null for a code the table does not carry", () => { + expect(getCstIbsCbs("100")).toBeNull(); + expect(getCstIbsCbs("060")).toBeNull(); + expect(getCstIbsCbs("0000")).toBeNull(); + expect(getCstIbsCbs("200001")).toBeNull(); + }); + + it("should return null for a string that is not bare digits", () => { + expect(getCstIbsCbs("cst200")).toBeNull(); + expect(getCstIbsCbs("2-00")).toBeNull(); + expect(getCstIbsCbs("")).toBeNull(); + expect(getCstIbsCbs("__proto__")).toBeNull(); + }); + + it("should return null for a number that is not a non-negative safe integer", () => { + expect(getCstIbsCbs(-200)).toBeNull(); + expect(getCstIbsCbs(20.5)).toBeNull(); + expect(getCstIbsCbs(2 ** 53)).toBeNull(); + }); + + it("should return null for a value that is not a string or a number", () => { + // @ts-expect-error not a string or number + expect(getCstIbsCbs(null)).toBeNull(); + // @ts-expect-error not a string or number + expect(getCstIbsCbs()).toBeNull(); + expect(getCstIbsCbs(Object.create(null))).toBeNull(); + }); + + describe("properties", () => { + const codeArbitrary = fc.constantFrom(...Object.keys(CST_IBS_CBS_TABLE)); + + test("should never throw, regardless of the input", () => { + expectNeverThrows(getCstIbsCbs, anyGarbage); + }); + + test("should resolve a value exactly when isValidCstIbsCbs accepts it", () => { + fc.assert( + fc.property(fc.integer({ min: 0, max: 1200 }), (value) => { + expect(getCstIbsCbs(value) !== null).toBe(isValidCstIbsCbs(value)); + }), + ); + }); + + test("should hand every code of the table back under its own code", () => { + fc.assert( + fc.property(codeArbitrary, (code) => { + expect(getCstIbsCbs(code)?.code).toBe(code); + }), + ); + }); + }); +}); + +describe("getCstIbsCbs types", () => { + test("should take a string or number and return a CstIbsCbs or null", () => { + expectTypeOf(getCstIbsCbs).parameter(0).toEqualTypeOf(); + expectTypeOf(getCstIbsCbs).returns.toEqualTypeOf(); + expectTypeOf().toEqualTypeOf<{ code: string; description: string }>(); + }); +}); diff --git a/src/get-cst-ibs-cbs/get-cst-ibs-cbs.ts b/src/get-cst-ibs-cbs/get-cst-ibs-cbs.ts new file mode 100644 index 000000000..eeda7b440 --- /dev/null +++ b/src/get-cst-ibs-cbs/get-cst-ibs-cbs.ts @@ -0,0 +1,72 @@ +import { + CST_IBS_CBS_FORMAT_REGEX, + CST_IBS_CBS_LENGTH, + CST_IBS_CBS_TABLE, +} from "../_internals/constants/ibs-cbs"; +import { isLookupCode } from "../_internals/is-lookup-code/is-lookup-code"; +import { padLookupCode } from "../_internals/pad-lookup-code/pad-lookup-code"; + +/** + * A CST-IBS/CBS (Código de Situação Tributária do IBS e da CBS) code. + */ +export type CstIbsCbs = { + /** The 3 digit CST-IBS/CBS code. */ + code: string; + /** The description the official CST table gives the code. */ + description: string; +}; + +/** + * Looks a CST-IBS/CBS (Código de Situação Tributária do IBS e da CBS) up in the official table, + * the code the field `CST` of the group `IBSCBS` carries in the NF-e, NFC-e, CT-e, NFS-e and the + * other electronic fiscal documents of the tax reform (Lei Complementar nº 214/2025). + * + * It is a table of its own, not one more tax of `isValidCst`: IBS and CBS share it, and its 3 + * digit codes (`000`, `200`, `410`, ...) would be misread as the ICMS origin plus Tabela B form. + * + * A string is only read as a code when it is written as bare digits, with optional surrounding + * whitespace: the field has no mask, so anything else (`"cst200"`) is rejected instead of having + * its digits picked out. A number is only read as a code when it is a non-negative safe integer. + * A value narrower than 3 digits is left padded with zeros, as a string or as a number, since + * the codes start with zeros a numeric field drops: `0`, `"0"` and `"000"` are all the code `000`. + * + * @param {string|number} value - The CST-IBS/CBS to look up, e.g. `"200"`, `"000"` or `200`. + * @returns {CstIbsCbs|null} The matching entry, or null when the code is unknown or invalid. + * + * @example + * ```typescript + * getCstIbsCbs("000"); // { code: "000", description: "Tributação integral" } + * getCstIbsCbs(410); // { code: "410", description: "Imunidade e não incidência" } + * getCstIbsCbs(10); // { code: "010", description: "Tributação com alíquotas uniformes" } + * getCstIbsCbs("100"); // null + * getCstIbsCbs("cst200"); // null (not a documented form) + * ``` + * + * @see Official: https://www.nfe.fazenda.gov.br/portal/listaConteudo.aspx?tipoConteudo=/NJarYc9nus= + * "Documentos" > "Diversos" of the Portal Nacional da NF-e, which publishes every version of the + * "Tabela de Classificação Tributária do IBS e CBS" workbook (sheets CST and cClassTrib). + * @see Official: https://www.nfe.fazenda.gov.br/portal/listaConteudo.aspx?tipoConteudo=hXzemuyNHW4= + * Informe Técnico 2025.002 (v.1.60 of 22/06/2026), which divulges both tables, defines their + * columns and states that the first three digits of a cClassTrib are its CST-IBS/CBS. + * @see Official: https://www.nfe.fazenda.gov.br/portal/listaConteudo.aspx?tipoConteudo=04BIflQt1aY= + * Nota Técnica 2025.002-RTC (v.1.51), fields UB13 `CST` (N, 3 digits) and UB14 `cClassTrib` (N, + * 6 digits) and the rejections 1020 (unknown CST), 1023 (unknown cClassTrib) and 1024 + * (cClassTrib incompatible with the CST). + * @see Official: https://dfe-portal.svrs.rs.gov.br/DFE/TabelaClassificacaoTributaria + * The same tables online, on the Portal dos Documentos Fiscais Eletrônicos (SVRS). + * @see Official: https://www.planalto.gov.br/ccivil_03/leis/lcp/lcp214.htm + * Lei Complementar nº 214/2025, which institutes the IBS and the CBS. + */ +export const getCstIbsCbs = (value: string | number): CstIbsCbs | null => { + if (!isLookupCode(value)) return null; + + const code = padLookupCode(value, CST_IBS_CBS_LENGTH); + + if (!CST_IBS_CBS_FORMAT_REGEX.test(code)) return null; + + const description = CST_IBS_CBS_TABLE[code]; + + if (description === undefined) return null; + + return { code, description }; +}; diff --git a/src/get-gtin-info/constants.ts b/src/get-gtin-info/constants.ts new file mode 100644 index 000000000..ccf17f6a2 --- /dev/null +++ b/src/get-gtin-info/constants.ts @@ -0,0 +1,46 @@ +import { type GtinLength, type GtinType } from "./get-gtin-info"; + +/** A GTIN is written with digits only, so anything else is turned down before it is measured. */ +export const DIGITS_REGEX = /^\d+$/; + +/** + * The four GTIN structures of the GS1 General Specifications, the same four the NF-e leiaute + * accepts in `cEAN` and `cEANTrib` (NT 2021.003, chapter 3, fields I03 and I12: "GTIN-8, GTIN-12, + * GTIN-13 ou GTIN-14"). + */ +export const GTIN_LENGTHS: readonly GtinLength[] = [8, 12, 13, 14]; + +/** The name GS1 gives to the structure of each length. */ +export const GTIN_TYPES: Record = { + 8: "GTIN-8", + 12: "GTIN-12", + 13: "GTIN-13", + 14: "GTIN-14", +}; + +/** Every GTIN is compared in its 14 digit form, left padded with zeros. */ +export const NORMALIZED_LENGTH = 14; + +/** + * The six zeros a GTIN-8 gets in the 14 digit form. GS1 leaves the prefixes 0000001 to 0000099 + * unused so that no longer GTIN collides with one (General Specifications, table 1-4), and the + * "Tabela Prefixo GS1" of the Portal da NF-e reads the prefix the same way: from positions 7 to 9 + * when the first six are zeros, from positions 2 to 4 otherwise. + */ +export const GS1_8_PADDING = "000000"; + +/** The GS1 Prefixes of GS1 Brasil, the ones NT 2021.003 calls "prefixo do Brasil". */ +export const BRAZILIAN_PREFIXES: readonly string[] = ["789", "790"]; + +/** + * The GS1 Prefix ranges table 1-4 of the General Specifications sets aside for Restricted + * Circulation Numbers: 02 and 20 to 29 (within a geographic region) and 04 (within a company). + * The range 0000000 falls under the GS1-8 reading below. + */ +export const RESTRICTED_PREFIX_REGEX = /^(?:02|04|2)/; + +/** + * The GS1-8 Prefix ranges table 1-5 of the General Specifications sets aside for Restricted + * Circulation Numbers within a company: 000 to 099 and 200 to 299. + */ +export const RESTRICTED_GS1_8_PREFIX_REGEX = /^[02]/; diff --git a/src/get-gtin-info/get-gtin-info.test.ts b/src/get-gtin-info/get-gtin-info.test.ts new file mode 100644 index 000000000..e26fd8e86 --- /dev/null +++ b/src/get-gtin-info/get-gtin-info.test.ts @@ -0,0 +1,300 @@ +import * as fc from "fast-check"; + +import { anyGarbage, digits, PROTOTYPE_KEYS } from "../_internals/test/arbitraries"; +import { expectNeverThrows } from "../_internals/test/properties"; +import { describe, expect, expectTypeOf, test } from "../_internals/test/runtime"; +import { type GtinInfo, type GtinLength, type GtinType, getGtinInfo } from "./get-gtin-info"; + +const withCheckDigit = (body: string): string => { + let sum = 0; + + for (let index = 0; index < body.length; index++) { + sum += Number(body.at(-1 - index)) * (index % 2 === 0 ? 3 : 1); + } + + return `${body}${(10 - (sum % 10)) % 10}`; +}; + +describe("getGtinInfo", () => { + describe("should return null", () => { + test("when the value is not a string", () => { + expect(getGtinInfo(7_890_000_000_017 as unknown as string)).toBeNull(); + expect(getGtinInfo(null as unknown as string)).toBeNull(); + expect(getGtinInfo(undefined as unknown as string)).toBeNull(); + expect(getGtinInfo({} as unknown as string)).toBeNull(); + expect(getGtinInfo(["7890000000017"] as unknown as string)).toBeNull(); + }); + + test("when the value is empty or blank", () => { + expect(getGtinInfo("")).toBeNull(); + expect(getGtinInfo(" ")).toBeNull(); + }); + + test("when the value is the literal the NF-e uses for a product without a GTIN", () => { + expect(getGtinInfo("SEM GTIN")).toBeNull(); + }); + + test("when the value is a prototype key", () => { + expect(getGtinInfo("__proto__")).toBeNull(); + expect(getGtinInfo("constructor")).toBeNull(); + }); + + test("when the value carries anything but digits", () => { + expect(getGtinInfo("789000000001a")).toBeNull(); + expect(getGtinInfo("7 890000 000017")).toBeNull(); + expect(getGtinInfo("789-0000-000017")).toBeNull(); + expect(getGtinInfo("+7890000000017")).toBeNull(); + expect(getGtinInfo("7890000000017\n1")).toBeNull(); + }); + + test("when a character next to the digits in the ASCII table would add up to the check digit", () => { + expect(getGtinInfo("78900000000:0")).toBeNull(); + }); + + test("when the length is not 8, 12, 13 or 14", () => { + expect(getGtinInfo("7")).toBeNull(); + expect(getGtinInfo("7891231")).toBeNull(); + expect(getGtinInfo("789123457")).toBeNull(); + expect(getGtinInfo("78900000017")).toBeNull(); + expect(getGtinInfo("178900000000143")).toBeNull(); + expect(getGtinInfo("376104250021234569")).toBeNull(); + }); + + test("when the check digit is wrong", () => { + expect(getGtinInfo("7890000000018")).toBeNull(); + expect(getGtinInfo("7890000000010")).toBeNull(); + expect(getGtinInfo("78912343")).toBeNull(); + expect(getGtinInfo("061414112344")).toBeNull(); + expect(getGtinInfo("17890000000013")).toBeNull(); + }); + + test("when the check digit is the Luhn one instead of the GS1 one", () => { + expect(getGtinInfo("9521234500011")).toBeNull(); + }); + + test("when two digits are swapped", () => { + expect(getGtinInfo("7890000000071")).toBeNull(); + }); + }); + + describe("should return the parsed GTIN", () => { + test("for a GTIN-13 of GS1 Brasil with the 789 prefix", () => { + expect(getGtinInfo("7890000000017")).toEqual({ + type: "GTIN-13", + length: 13, + prefix: "789", + isBrazilian: true, + isRestrictedCirculation: false, + checkDigit: 7, + }); + }); + + test("for a GTIN-13 of GS1 Brasil with the 790 prefix", () => { + expect(getGtinInfo("7901234567891")).toEqual({ + type: "GTIN-13", + length: 13, + prefix: "790", + isBrazilian: true, + isRestrictedCirculation: false, + checkDigit: 1, + }); + }); + + test("for the GTIN-13 example of the GS1 check digit page", () => { + expect(getGtinInfo("6291041500213")).toEqual({ + type: "GTIN-13", + length: 13, + prefix: "629", + isBrazilian: false, + isRestrictedCirculation: false, + checkDigit: 3, + }); + }); + + test("for the 13 digit example of the GS1 General Specifications, a GLN under the same check digit rule (demonstration prefix 952)", () => { + expect(getGtinInfo("9521234500018")).toEqual({ + type: "GTIN-13", + length: 13, + prefix: "952", + isBrazilian: false, + isRestrictedCirculation: false, + checkDigit: 8, + }); + }); + + test("for a GTIN-8, reading the GS1-8 Prefix", () => { + expect(getGtinInfo("78912342")).toEqual({ + type: "GTIN-8", + length: 8, + prefix: "789", + isBrazilian: true, + isRestrictedCirculation: false, + checkDigit: 2, + }); + }); + + test("for a GTIN-12, whose GS1 Prefix carries the implied leading zero", () => { + expect(getGtinInfo("061414112345")).toEqual({ + type: "GTIN-12", + length: 12, + prefix: "006", + isBrazilian: false, + isRestrictedCirculation: false, + checkDigit: 5, + }); + }); + + test("for a GTIN-14, reading the prefix after the indicator digit", () => { + expect(getGtinInfo("17890000000014")).toEqual({ + type: "GTIN-14", + length: 14, + prefix: "789", + isBrazilian: true, + isRestrictedCirculation: false, + checkDigit: 4, + }); + }); + + test("for the 14 digit example of the GS1 General Specifications, a GRAI read here as a GTIN-14", () => { + expect(getGtinInfo("09524141234564")).toEqual({ + type: "GTIN-14", + length: 14, + prefix: "952", + isBrazilian: false, + isRestrictedCirculation: false, + checkDigit: 4, + }); + }); + + test("for a GTIN-8 written in the 14 digit form, reading the GS1-8 Prefix", () => { + expect(getGtinInfo("00000078912342")).toEqual({ + type: "GTIN-14", + length: 14, + prefix: "789", + isBrazilian: true, + isRestrictedCirculation: false, + checkDigit: 2, + }); + }); + + test("with surrounding whitespace", () => { + expect(getGtinInfo(" 7890000000017\n")?.prefix).toBe("789"); + }); + + test("with a check digit of zero", () => { + expect(getGtinInfo("12345670")?.checkDigit).toBe(0); + }); + + test("telling the neighbours of the Brazilian prefixes apart", () => { + expect(getGtinInfo("7880000000018")?.isBrazilian).toBe(false); + expect(getGtinInfo("7910000000012")?.isBrazilian).toBe(false); + expect(getGtinInfo("17890000000014")?.isBrazilian).toBe(true); + expect(getGtinInfo("0789000000004")?.isBrazilian).toBe(false); + }); + }); + + describe("should flag the Restricted Circulation Number ranges", () => { + test("for the GS1 Prefixes 02, 04 and 20 to 29", () => { + expect(getGtinInfo("0200000000011")?.isRestrictedCirculation).toBe(true); + expect(getGtinInfo("0400000000015")?.isRestrictedCirculation).toBe(true); + expect(getGtinInfo("2000000000015")?.isRestrictedCirculation).toBe(true); + expect(getGtinInfo("2000000000015")?.prefix).toBe("200"); + expect(getGtinInfo("12000000000012")?.isRestrictedCirculation).toBe(true); + }); + + test("for the U.P.C. Prefixes 2 and 4 of a GTIN-12", () => { + expect(getGtinInfo("200000000004")?.isRestrictedCirculation).toBe(true); + expect(getGtinInfo("400000000008")?.isRestrictedCirculation).toBe(true); + }); + + test("for the GS1-8 Prefixes 000 to 099 and 200 to 299", () => { + expect(getGtinInfo("01234565")?.isRestrictedCirculation).toBe(true); + expect(getGtinInfo("20000004")?.isRestrictedCirculation).toBe(true); + }); + + test("for the GS1 Prefix 0000000, which reads as a GS1-8 Prefix that starts with zero", () => { + expect(getGtinInfo("0000000123457")?.isRestrictedCirculation).toBe(true); + expect(getGtinInfo("0000000123457")?.prefix).toBe("001"); + }); + + test("but not for the ranges that only look alike", () => { + expect(getGtinInfo("030000000014")?.isRestrictedCirculation).toBe(false); + expect(getGtinInfo("050000000012")?.isRestrictedCirculation).toBe(false); + expect(getGtinInfo("11200000000000")?.isRestrictedCirculation).toBe(false); + expect(getGtinInfo("9020000000009")?.isRestrictedCirculation).toBe(false); + expect(getGtinInfo("40000008")?.isRestrictedCirculation).toBe(false); + expect(getGtinInfo("30000001")?.isRestrictedCirculation).toBe(false); + expect(getGtinInfo("12345670")?.isRestrictedCirculation).toBe(false); + }); + + test("and not for the ISSN and ISBN ranges", () => { + expect(getGtinInfo("9771234567003")?.isRestrictedCirculation).toBe(false); + expect(getGtinInfo("9780000000019")?.prefix).toBe("978"); + }); + }); + + describe("properties", () => { + const lengths = fc.constantFrom(8, 12, 13, 14); + const gtins = lengths.chain((length) => digits(length - 1).map((body) => withCheckDigit(body))); + + test("should give back the length and the check digit of every well-formed GTIN", () => { + fc.assert( + fc.property(gtins, (gtin) => { + const parsed = getGtinInfo(gtin); + + expect(parsed?.length).toBe(gtin.length); + expect(parsed?.type).toBe(`GTIN-${gtin.length}`); + expect(parsed?.checkDigit).toBe(Number(gtin.at(-1))); + expect(parsed?.prefix).toMatch(/^\d{3}$/); + }), + ); + }); + + test("should turn down every other check digit", () => { + fc.assert( + fc.property(gtins, fc.integer({ min: 1, max: 9 }), (gtin, shift) => { + const wrong = (Number(gtin.at(-1)) + shift) % 10; + + expect(getGtinInfo(`${gtin.slice(0, -1)}${wrong}`)).toBeNull(); + }), + ); + }); + + test("should call Brazilian exactly the 13 digit values that start with 789 or 790", () => { + fc.assert( + fc.property( + digits(12).map((body) => withCheckDigit(body)), + (gtin) => { + const expected = gtin.startsWith("789") || gtin.startsWith("790"); + + fc.pre(!gtin.startsWith("00000")); + + expect(getGtinInfo(gtin)?.isBrazilian).toBe(expected); + }, + ), + ); + }); + + test("should never throw", () => { + expectNeverThrows(getGtinInfo, fc.oneof(fc.anything(), anyGarbage)); + expectNeverThrows(getGtinInfo, fc.constantFrom(...PROTOTYPE_KEYS)); + }); + }); +}); + +describe("getGtinInfo types", () => { + test("should take a string and return a GtinInfo or null", () => { + expectTypeOf(getGtinInfo).parameter(0).toEqualTypeOf(); + expectTypeOf(getGtinInfo).returns.toEqualTypeOf(); + expectTypeOf().toEqualTypeOf<{ + type: GtinType; + length: GtinLength; + prefix: string; + isBrazilian: boolean; + isRestrictedCirculation: boolean; + checkDigit: number; + }>(); + expectTypeOf().toEqualTypeOf<8 | 12 | 13 | 14>(); + expectTypeOf().toEqualTypeOf<"GTIN-8" | "GTIN-12" | "GTIN-13" | "GTIN-14">(); + }); +}); diff --git a/src/get-gtin-info/get-gtin-info.ts b/src/get-gtin-info/get-gtin-info.ts new file mode 100644 index 000000000..882ba6617 --- /dev/null +++ b/src/get-gtin-info/get-gtin-info.ts @@ -0,0 +1,132 @@ +import { mod10 } from "../_internals/mod10/mod10"; +import { + BRAZILIAN_PREFIXES, + DIGITS_REGEX, + GS1_8_PADDING, + GTIN_LENGTHS, + GTIN_TYPES, + NORMALIZED_LENGTH, + RESTRICTED_GS1_8_PREFIX_REGEX, + RESTRICTED_PREFIX_REGEX, +} from "./constants"; + +/** How many digits a GTIN may be written with. */ +export type GtinLength = 8 | 12 | 13 | 14; + +/** The GS1 name of each GTIN structure. */ +export type GtinType = "GTIN-8" | "GTIN-12" | "GTIN-13" | "GTIN-14"; + +/** The fields `getGtinInfo` reads out of a GTIN (Global Trade Item Number). */ +export type GtinInfo = { + /** GS1 name of the structure the value was written in. */ + type: GtinType; + /** How many digits the value was written with. */ + length: GtinLength; + /** + * The three digit GS1 Prefix, or a GS1-8 Prefix when the first six digits of the 14 digit form + * are zeros, which covers every GTIN-8 and the GS1 Prefix 0000000. It names the GS1 Member + * Organisation that licensed the number, not the country of origin. + */ + prefix: string; + /** True when the prefix is one of GS1 Brasil (789 or 790). */ + isBrazilian: boolean; + /** + * True when the prefix is in a range GS1 sets aside for Restricted Circulation Numbers, so the + * number is only unique inside a company or region and is not a globally unique GTIN. + */ + isRestrictedCirculation: boolean; + /** The modulo 10 check digit, the last digit of the value. */ + checkDigit: number; +}; + +const GS1_8_PREFIX_START = 6; + +const PREFIX_START = 1; + +const PREFIX_LENGTH = 3; + +/** + * Parses a GTIN (Global Trade Item Number, the number under an EAN/UPC barcode) into its fields. + * + * Covers the four structures of the GS1 General Specifications, the same four the NF-e accepts + * in `cEAN` and `cEANTrib`: GTIN-8, GTIN-12 (UPC), GTIN-13 (EAN) and GTIN-14 (DUN-14). The value + * must be a string of 8, 12, 13 or 14 digits, surrounding whitespace aside, whose last digit is + * the GS1 modulo 10 check digit: weights 3 and 1 alternating from the right, the sum subtracted + * from the nearest equal or higher multiple of ten. Anything else returns `null`, including the + * `"SEM GTIN"` literal the NF-e uses for a product without one. Leading zeros count, so the value + * is never read from a number. + * + * `type` and `length` describe the value as it was written. The prefix is read the way the + * "Tabela Prefixo GS1" of the Portal da NF-e tells: the value is left padded with zeros to 14 + * digits, and the prefix is positions 7 to 9 when the first six are zeros (a GTIN-8) and + * positions 2 to 4 otherwise. A GTIN-12 therefore has a prefix that starts with `0`, and a + * GTIN-14 has the prefix of the GTIN-13 it packs, after the indicator digit. + * + * Only the prefixes of GS1 Brasil (789 and 790) and the Restricted Circulation Number ranges of + * the General Specifications are told apart, since both are fixed by a standard or a rule. The + * prefix is not checked against the list of Member Organisations: GS1 keeps assigning ranges, so + * a copy of that list would turn down valid numbers as it ages. SEFAZ does run that check + * (rules I03-20 and I12-20 of NT 2021.003, against its own "Tabela Prefixo GS1", which lists the + * restricted and special ranges as valid) and, for the 789 and 790 prefixes, looks the number up + * in the Cadastro Centralizado de GTIN, which no offline check can stand in for. + * + * @param {string} value - The GTIN to be parsed, digits only. + * @returns {GtinInfo | null} The parsed GTIN, or `null` when it is not valid. + * + * @see Official: https://ref.gs1.org/standards/genspecs/ + * GS1 General Specifications, release 26.0: section 7.9.1 (check digit, tables 7-8 and 7-9), + * tables 1-4 and 1-5 (GS1 Prefix and GS1-8 Prefix ranges, Restricted Circulation Numbers). + * @see Official: https://www.gs1.org/services/how-calculate-check-digit-manually + * GS1, "How to calculate a check digit manually". + * @see Official: https://www.nfe.fazenda.gov.br/portal/exibirArquivo.aspx?conteudo=SrQT9ys8ODo%3D + * SEFAZ Nota Técnica 2021.003 (Validação GTIN, replaces NT 2017.001): fields I03 `cEAN` and I12 + * `cEANTrib`, rules I03-10, I03-20, I12-10, I12-20, 9I03-10 and 9I12-10 ("prefixo do Brasil + * (iniciado em 789 ou 790)"). + * @see Official: https://www.nfe.fazenda.gov.br/portal/exibirArquivo.aspx?conteudo=Oc+fygAxwmc%3D + * "Tabela Prefixo GS1" of the Portal da NF-e: how to read the prefix from the 14 digit form, and + * the range 789 to 790 for GS1 Brasil. + * + * @example + * ```typescript + * getGtinInfo("7890000000017"); + * // { type: "GTIN-13", length: 13, prefix: "789", isBrazilian: true, + * // isRestrictedCirculation: false, checkDigit: 7 } + * + * getGtinInfo("17890000000014"); + * // { type: "GTIN-14", length: 14, prefix: "789", isBrazilian: true, + * // isRestrictedCirculation: false, checkDigit: 4 } + * + * getGtinInfo("7890000000018"); // null (wrong check digit) + * getGtinInfo("SEM GTIN"); // null + * ``` + */ +export const getGtinInfo = (value: string): GtinInfo | null => { + if (typeof value !== "string") return null; + + const digits = value.trim(); + + if (!DIGITS_REGEX.test(digits)) return null; + + const length = GTIN_LENGTHS.find((candidate) => candidate === digits.length); + + if (length === undefined) return null; + + const checkDigit = Number(digits.at(-1)); + + if (mod10(digits.slice(0, -1), { variant: "gs1" }) !== checkDigit) return null; + + const normalized = digits.padStart(NORMALIZED_LENGTH, "0"); + const isGs1Eight = normalized.startsWith(GS1_8_PADDING); + const start = isGs1Eight ? GS1_8_PREFIX_START : PREFIX_START; + const prefix = normalized.slice(start, start + PREFIX_LENGTH); + const restrictedRegex = isGs1Eight ? RESTRICTED_GS1_8_PREFIX_REGEX : RESTRICTED_PREFIX_REGEX; + + return { + type: GTIN_TYPES[length], + length, + prefix, + isBrazilian: BRAZILIAN_PREFIXES.includes(prefix), + isRestrictedCirculation: restrictedRegex.test(prefix), + checkDigit, + }; +}; diff --git a/src/get-holidays/get-holidays.test.ts b/src/get-holidays/get-holidays.test.ts index 5a8b7a0ad..59ad8266a 100644 --- a/src/get-holidays/get-holidays.test.ts +++ b/src/get-holidays/get-holidays.test.ts @@ -2,7 +2,14 @@ import * as fc from "fast-check"; import { HOLIDAYS_MAX_YEAR, HOLIDAYS_MIN_YEAR } from "../_internals/constants/holidays"; import { DATA as STATES, type StateCode } from "../_internals/constants/states"; -import { bench, describe, expect, expectTypeOf, test } from "../_internals/test/runtime"; +import { + bench, + describe, + expect, + expectTypeOf, + inTimeZone, + test, +} from "../_internals/test/runtime"; import { isBusinessDay } from "../is-business-day/is-business-day"; import { STATE_HOLIDAYS } from "./constants"; import { getHolidays, type GetHolidaysParams, type Holiday } from "./get-holidays"; @@ -663,6 +670,17 @@ describe("getHolidays", () => { expect(rjHolidays.some((h) => h.name === "São Sebastião")).toBe(false); }); + inTimeZone("America/Sao_Paulo", () => { + test("should answer for the local days of the current time zone, not of the memoized one", () => { + const finados = getHolidays(2018).find((holiday) => holiday.name === "Finados"); + + expect(finados?.date.getMonth()).toBe(10); + expect(finados?.date.getDate()).toBe(2); + expect(finados?.date.getHours()).toBe(0); + expect(isBusinessDay(new Date(2018, 10, 2))).toBe(false); + }); + }); + describe("properties", () => { const yearArbitrary = fc.integer({ min: HOLIDAYS_MIN_YEAR, max: HOLIDAYS_MAX_YEAR }); const stateCodeArbitrary = fc.constantFrom(...STATES.map((state) => state.code)); diff --git a/src/get-holidays/get-holidays.ts b/src/get-holidays/get-holidays.ts index 32a51cb13..60a2ae5c1 100644 --- a/src/get-holidays/get-holidays.ts +++ b/src/get-holidays/get-holidays.ts @@ -39,10 +39,34 @@ export type GetHolidaysParams = { */ export type GetHolidaysOptions = GetHolidaysParams; -const cache = new Map(); +// A holiday is a local calendar day, so the memo keeps the year, month and day rather than the +// `Date` built from them: a `Date` is an instant, and the same instant falls on another local day +// once the process time zone changes, which would make a memoized year answer for the wrong days. +type MemoizedHoliday = { + name: string; + type: HolidayType; + year: number; + month: number; + day: number; +}; -const cloneHolidays = (holidays: Holiday[]): Holiday[] => - holidays.map((holiday) => ({ ...holiday, date: new Date(holiday.date) })); +const cache = new Map(); + +const memoizeHolidays = (holidays: Holiday[]): MemoizedHoliday[] => + holidays.map(({ name, type, date }) => ({ + name, + type, + year: date.getFullYear(), + month: date.getMonth(), + day: date.getDate(), + })); + +const buildHolidays = (holidays: MemoizedHoliday[]): Holiday[] => + holidays.map(({ name, type, year, month, day }) => ({ + name, + date: new Date(year, month, day), + type, + })); const computeHolidays = (year: number, stateCode: StateCode | undefined): Holiday[] => { const holidays: Holiday[] = []; @@ -247,11 +271,11 @@ export function getHolidays(yearOrOptions: number | GetHolidaysParams): Holiday[ const cached = cache.get(cacheKey); if (cached) { - return cloneHolidays(cached); + return buildHolidays(cached); } const holidays = computeHolidays(year, normalizedStateCode); - cache.set(cacheKey, holidays); + cache.set(cacheKey, memoizeHolidays(holidays)); - return cloneHolidays(holidays); + return holidays; } diff --git a/src/get-last-business-day-of-month/get-last-business-day-of-month.test.ts b/src/get-last-business-day-of-month/get-last-business-day-of-month.test.ts new file mode 100644 index 000000000..aafc86525 --- /dev/null +++ b/src/get-last-business-day-of-month/get-last-business-day-of-month.test.ts @@ -0,0 +1,179 @@ +import * as fc from "fast-check"; + +import { + anyBusinessDayDate, + anyBusinessDayOptions, + businessDayDates, + PROTOTYPE_KEYS, +} from "../_internals/test/arbitraries"; +import { expectNeverThrowsWithOptions } from "../_internals/test/properties"; +import { describe, expect, expectTypeOf, inTimeZone, it, test } from "../_internals/test/runtime"; +import { addBusinessDays } from "../add-business-days/add-business-days"; +import { type BusinessDayOptions, isBusinessDay } from "../is-business-day/is-business-day"; +import { getLastBusinessDayOfMonth } from "./get-last-business-day-of-month"; + +describe("getLastBusinessDayOfMonth", () => { + it("should return the last day of the month when it is a business day (Wed 2024-01-31)", () => { + expect(getLastBusinessDayOfMonth(new Date(2024, 0, 15))).toEqual(new Date(2024, 0, 31)); + }); + + it("should walk back over a weekend (August 2024 ends on a Saturday -> Fri 2024-08-30)", () => { + expect(getLastBusinessDayOfMonth(new Date(2024, 7, 1))).toEqual(new Date(2024, 7, 30)); + }); + + it("should walk back over Sexta-feira Santa and the weekend after it (March 2024 -> Thu 2024-03-28)", () => { + expect(getLastBusinessDayOfMonth(new Date(2024, 2, 1))).toEqual(new Date(2024, 2, 28)); + }); + + it("should handle February in a leap year (Thu 2024-02-29) and in a common one (Tue 2023-02-28)", () => { + expect(getLastBusinessDayOfMonth(new Date(2024, 1, 1))).toEqual(new Date(2024, 1, 29)); + expect(getLastBusinessDayOfMonth(new Date(2023, 1, 1))).toEqual(new Date(2023, 1, 28)); + }); + + it("should return the start of the local day and leave the input untouched", () => { + const input = new Date(2024, 7, 31, 18, 30, 15, 500); + const result = getLastBusinessDayOfMonth(input); + + expect(result).toEqual(new Date(2024, 7, 30, 0, 0, 0, 0)); + expect(input).toEqual(new Date(2024, 7, 31, 18, 30, 15, 500)); + }); + + describe("state holidays", () => { + it("should walk back over a state holiday when stateCode is given (DF, Dia do Evangélico 2023-11-30)", () => { + const result = getLastBusinessDayOfMonth(new Date(2023, 10, 1), { stateCode: "DF" }); + + expect(result).toEqual(new Date(2023, 10, 29)); + }); + + it("should land on that same holiday without a stateCode", () => { + expect(getLastBusinessDayOfMonth(new Date(2023, 10, 1))).toEqual(new Date(2023, 10, 30)); + }); + + it("should treat a prototype chain key as an unknown stateCode instead of throwing", () => { + for (const stateCode of PROTOTYPE_KEYS) { + // @ts-expect-error: intentionally invalid input + expect(getLastBusinessDayOfMonth(new Date(2023, 10, 1), { stateCode })).toEqual( + new Date(2023, 10, 30), + ); + } + }); + }); + + describe("includeOptional", () => { + it("should walk back over Corpus Christi 2018-05-31 by default (-> Wed 2018-05-30)", () => { + expect(getLastBusinessDayOfMonth(new Date(2018, 4, 1))).toEqual(new Date(2018, 4, 30)); + }); + + it("should land on Corpus Christi 2018-05-31 when includeOptional is false", () => { + const result = getLastBusinessDayOfMonth(new Date(2018, 4, 1), { includeOptional: false }); + + expect(result).toEqual(new Date(2018, 4, 31)); + }); + }); + + describe("includeSaturday", () => { + it("should return the Saturday August 2024 ends on when it counts (Sat 2024-08-31, Fri 2024-08-30 without the option)", () => { + expect(getLastBusinessDayOfMonth(new Date(2024, 7, 1), { includeSaturday: true })).toEqual( + new Date(2024, 7, 31), + ); + expect(getLastBusinessDayOfMonth(new Date(2024, 7, 1), { includeSaturday: false })).toEqual( + new Date(2024, 7, 30), + ); + }); + + it("should return Sat 2024-11-30 nationally, and Fri 2024-11-29 in the DF, where that Saturday is Dia do Evangélico", () => { + expect(getLastBusinessDayOfMonth(new Date(2024, 10, 1), { includeSaturday: true })).toEqual( + new Date(2024, 10, 30), + ); + expect( + getLastBusinessDayOfMonth(new Date(2024, 10, 1), { + stateCode: "DF", + includeSaturday: true, + }), + ).toEqual(new Date(2024, 10, 29)); + }); + }); + + describe("invalid input", () => { + it("should return null for a date that is not a valid Date", () => { + // @ts-expect-error: intentionally invalid input + expect(getLastBusinessDayOfMonth()).toBeNull(); + // @ts-expect-error: intentionally invalid input + expect(getLastBusinessDayOfMonth(null)).toBeNull(); + // @ts-expect-error: intentionally invalid input + expect(getLastBusinessDayOfMonth("2024-01-15")).toBeNull(); + expect(getLastBusinessDayOfMonth(new Date("not a date"))).toBeNull(); + }); + + it("should return null for a stateCode that is not a string", () => { + // @ts-expect-error: intentionally invalid input + expect(getLastBusinessDayOfMonth(new Date(2024, 0, 15), { stateCode: 7 })).toBeNull(); + }); + + it("should return null outside the supported years (1899 and 2100)", () => { + expect(getLastBusinessDayOfMonth(new Date(1899, 11, 15))).toBeNull(); + expect(getLastBusinessDayOfMonth(new Date(2100, 0, 15))).toBeNull(); + }); + }); + + inTimeZone("Pacific/Apia", () => { + it("should answer for December 2011, whose 30th does not exist there (Thu 2011-12-29)", () => { + expect(getLastBusinessDayOfMonth(new Date(2011, 11, 5))).toEqual(new Date(2011, 11, 29)); + }); + }); + + inTimeZone("Asia/Beirut", () => { + it("should start the day at 00:00 walking back over 31 March 2024, which has no midnight there (Thu 2024-03-28)", () => { + const result = getLastBusinessDayOfMonth(new Date(2024, 2, 1)); + + expect(result).toEqual(new Date(2024, 2, 28)); + expect(result?.getHours()).toBe(0); + }); + }); + + inTimeZone("America/Sao_Paulo", () => { + it("should start the day at 00:00 during the summer time era (Fri 2018-11-30)", () => { + const result = getLastBusinessDayOfMonth(new Date(2018, 10, 1)); + + expect(result).toEqual(new Date(2018, 10, 30)); + expect(result?.getHours()).toBe(0); + }); + }); + + describe("properties", () => { + test("should never throw, regardless of the input, prototype chain state codes included", () => { + expectNeverThrowsWithOptions( + getLastBusinessDayOfMonth, + anyBusinessDayDate, + anyBusinessDayOptions, + ); + }); + + test("should return a business day of the same month whose next business day is in another month", () => { + fc.assert( + fc.property(businessDayDates, (date) => { + const result = getLastBusinessDayOfMonth(date); + + expect(result !== null && isBusinessDay(result)).toBe(true); + expect([result?.getFullYear(), result?.getMonth()]).toEqual([ + date.getFullYear(), + date.getMonth(), + ]); + expect(result === null ? null : addBusinessDays(result, 1)?.getMonth()).toBe( + (date.getMonth() + 1) % 12, + ); + }), + ); + }); + }); +}); + +describe("getLastBusinessDayOfMonth types", () => { + test("should take a Date and optional BusinessDayOptions, and return a Date or null", () => { + expectTypeOf(getLastBusinessDayOfMonth).parameter(0).toEqualTypeOf(); + expectTypeOf(getLastBusinessDayOfMonth) + .parameter(1) + .toEqualTypeOf(); + expectTypeOf(getLastBusinessDayOfMonth).returns.toEqualTypeOf(); + }); +}); diff --git a/src/get-last-business-day-of-month/get-last-business-day-of-month.ts b/src/get-last-business-day-of-month/get-last-business-day-of-month.ts new file mode 100644 index 000000000..05adca8ac --- /dev/null +++ b/src/get-last-business-day-of-month/get-last-business-day-of-month.ts @@ -0,0 +1,63 @@ +import { getNthBusinessDay } from "../get-nth-business-day/get-nth-business-day"; +import { type BusinessDayOptions } from "../is-business-day/is-business-day"; + +export type { BusinessDayOptions } from "../is-business-day/is-business-day"; + +/** + * Gets the last Brazilian business day (dia útil) of the month a date falls in. + * + * It is `getNthBusinessDay(date, -1, options)`, which it delegates to, down to the last detail. A + * business day is a day for which `isBusinessDay` returns `true` (not a Saturday, a Sunday, or a + * Brazilian holiday; `options.includeSaturday` keeps Saturday), evaluated with the same + * `options`, and the month is the one of `date`'s + * **local calendar day**; the day of the month and the time of day of `date` are ignored. + * + * The name and the result follow date-fns' `lastDayOfMonth`: a new `Date` at the start of that + * local day (00:00:00.000), with `date` itself never mutated. In a time zone whose clocks jump + * over that local midnight, the nearest representable instant of the day is returned instead, + * exactly as in `getNthBusinessDay`. + * + * `options.includeSaturday` defaults to `false`, the Monday to Friday banking count. Pass `true` + * for the labour law count of Instrução Normativa MTP nº 2/2021, art. 14, I, which includes + * Saturday and still excludes Sunday and holidays, so a holiday that falls on a Saturday is never + * counted. See `isBusinessDay` for the law behind it and for what it does not cover: municipal + * holidays, which `getHolidays` does not carry. + * + * If `options.stateCode` is provided but is not a valid/known state code, it is ignored and only + * national holidays are considered (same behavior as `getHolidays`/`isBusinessDay`), so a + * prototype-chain key such as `"__proto__"` is an unknown state code like any other. An `options` + * that is not an object at all is ignored, exactly as `isBusinessDay` ignores it. + * + * Only years from 1900 through 2099 are supported, the range `getHolidays` computes; a `date` + * outside it returns `null`. + * + * @param {Date} date - Any date inside the month to look at. Never mutated: a new `Date` is returned. + * @param {BusinessDayOptions} [options] - Which days count as business days. + * @param {StateCode} [options.stateCode] - Brazilian state code whose state holidays are also considered. + * @param {boolean} [options.includeOptional] - Whether optional holidays count as non-business days (default: `true`). + * @param {boolean} [options.includeSaturday] - Whether Saturday counts as a business day (default: `false`). + * @returns {Date | null} A new `Date` at 00:00 local time of the last business day of the month. + * `null` on bad input: a `date` that is not a valid `Date` or is outside 1900-2099, or a + * `stateCode` that is not a string. + * + * @example + * ```typescript + * getLastBusinessDayOfMonth(new Date(2024, 0, 15)); // Wed 2024-01-31, 00:00 + * getLastBusinessDayOfMonth(new Date(2024, 2, 1)); // Thu 2024-03-28, 00:00 (Mar 29 is Sexta-feira Santa, then a weekend) + * getLastBusinessDayOfMonth(new Date(2024, 7, 31, 18, 30)); // Fri 2024-08-30, 00:00 (Aug 31 is a Saturday) + * getLastBusinessDayOfMonth(new Date(2018, 4, 1)); // Wed 2018-05-30, 00:00 (May 31 is Corpus Christi, optional, counted by default) + * getLastBusinessDayOfMonth(new Date(2018, 4, 1), { includeOptional: false }); // Thu 2018-05-31, 00:00 + * getLastBusinessDayOfMonth(new Date(2024, 7, 1), { includeSaturday: true }); // Sat 2024-08-31, 00:00 (labour count) + * getLastBusinessDayOfMonth(new Date(2024, 10, 1), { stateCode: "DF", includeSaturday: true }); // Fri 2024-11-29, 00:00 (Sat Nov 30 is Dia do Evangélico in DF) + * getLastBusinessDayOfMonth(new Date(2023, 10, 1), { stateCode: "DF" }); // Wed 2023-11-29, 00:00 (Nov 30 is Dia do Evangélico in DF) + * getLastBusinessDayOfMonth(new Date("not a date")); // null + * getLastBusinessDayOfMonth(new Date(2100, 0, 15)); // null (outside the supported years) + * ``` + * + * @see Based on: https://unpkg.com/date-fns@4.1.0/lastDayOfMonth.js + * Reference for the name, for returning the start of the local day and for never mutating the + * input. The underlying holiday determination's official sources are cited in + * `isBusinessDay`/`getHolidays`. + */ +export const getLastBusinessDayOfMonth = (date: Date, options?: BusinessDayOptions): Date | null => + getNthBusinessDay(date, -1, options); diff --git a/src/get-nbs/get-nbs.test.ts b/src/get-nbs/get-nbs.test.ts new file mode 100644 index 000000000..9a48f9dc8 --- /dev/null +++ b/src/get-nbs/get-nbs.test.ts @@ -0,0 +1,165 @@ +import * as fc from "fast-check"; + +import { NBS_DESCRIPTIONS } from "../_internals/constants/nbs"; +import { anyGarbage, PROTOTYPE_KEYS } from "../_internals/test/arbitraries"; +import { expectNeverThrows } from "../_internals/test/properties"; +import { describe, expect, expectTypeOf, it, test } from "../_internals/test/runtime"; +import { formatNbs } from "../format-nbs/format-nbs"; +import { isValidNbs } from "../is-valid-nbs/is-valid-nbs"; +import { getNbs, type Nbs } from "./get-nbs"; + +const RESIDENTIAL = { + code: "101011100", + description: "Serviços de construção de edificações residenciais de um e dois pavimentos", +}; + +describe("getNbs", () => { + it("should return the code for the 9 digits without a mask", () => { + expect(getNbs("101011100")).toEqual(RESIDENTIAL); + }); + + it("should return the code for the N.NNNN.NN.NN mask", () => { + expect(getNbs("1.0101.11.00")).toEqual(RESIDENTIAL); + }); + + it("should return the code for a number", () => { + expect(getNbs(101_011_100)).toEqual(RESIDENTIAL); + expect(getNbs(126_050_000)).toEqual({ code: "126050000", description: "Serviços domésticos" }); + }); + + it("should ignore surrounding whitespace", () => { + expect(getNbs(" 1.0101.11.00\n")).toEqual(RESIDENTIAL); + }); + + it("should accept any single mask character between the groups", () => { + expect(getNbs("1 0101 11 00")).toEqual(RESIDENTIAL); + expect(getNbs("1-0101-11-00")).toEqual(RESIDENTIAL); + expect(getNbs("1/0101/11/00")).toEqual(RESIDENTIAL); + expect(getNbs("1.010111.00")).toEqual(RESIDENTIAL); + }); + + it("should resolve the three codes of the NBS 2.0 the ANEXO B of the NFS-e leaves out", () => { + expect(getNbs("1.0904.40.00")).toEqual({ + code: "109044000", + description: "Serviços de retrocessão", + }); + expect(getNbs("1.0402.29.00")?.code).toBe("104022900"); + expect(getNbs("1.0403.29.00")?.code).toBe("104032900"); + }); + + it("should resolve the codes the Portaria 2.000/2018 renumbered and not the ones it replaced", () => { + expect(getNbs("1.0402.11.10")?.code).toBe("104021110"); + expect(getNbs("1.0402.11.90")?.code).toBe("104021190"); + expect(getNbs("1.0402.11.11")).toBeNull(); + expect(getNbs("1.0402.11.19")).toBeNull(); + }); + + it("should return the only description the official CSV quotes, without its CSV quoting", () => { + expect(getNbs("1.1706.24.00")).toEqual({ + code: "117062400", + description: + 'Serviços de distribuição de programas de televisão por assinatura, na modalidade "pague por exibição" (pay-per-view)', + }); + }); + + it("should return a fresh object that does not leak the internal table", () => { + expect(getNbs("101011100")).not.toBe(getNbs("101011100")); + }); + + it("should return null for the chapter, position and subposition headings", () => { + expect(getNbs("1.01")).toBeNull(); + expect(getNbs("1.0101")).toBeNull(); + expect(getNbs("1.0101.1")).toBeNull(); + expect(getNbs("10101")).toBeNull(); + }); + + it("should return null for a 9 digit code the table does not carry", () => { + expect(getNbs("1.9999.99.99")).toBeNull(); + expect(getNbs("9.9999.99.99")).toBeNull(); + expect(getNbs("000000000")).toBeNull(); + }); + + it("should return null for a group boundary written with more than one separator", () => { + expect(getNbs("1..0101.11.00")).toBeNull(); + expect(getNbs("1.0101..11.00")).toBeNull(); + expect(getNbs("1.0101.11..00")).toBeNull(); + }); + + it("should return null for a string that is not written in a documented form", () => { + expect(getNbs("1.0101abc11.00")).toBeNull(); + expect(getNbs("10.101.11.00")).toBeNull(); + expect(getNbs("x101011100")).toBeNull(); + expect(getNbs("101011100x")).toBeNull(); + expect(getNbs("1010111000")).toBeNull(); + expect(getNbs("1,0101,11,00")).toBeNull(); + }); + + it("should return null for an empty string and for whitespace only", () => { + expect(getNbs("")).toBeNull(); + expect(getNbs(" ")).toBeNull(); + }); + + it("should return null for null and undefined", () => { + // @ts-expect-error not a string or number + expect(getNbs(null)).toBeNull(); + // @ts-expect-error not a string or number + expect(getNbs()).toBeNull(); + }); + + it("should return null for a number that is not a non-negative safe integer", () => { + expect(getNbs(-101_011_100)).toBeNull(); + expect(getNbs(101_011_100.5)).toBeNull(); + expect(getNbs(2 ** 53)).toBeNull(); + }); + + it("should return null for the keys of Object.prototype", () => { + for (const key of PROTOTYPE_KEYS) expect(getNbs(key)).toBeNull(); + }); + + describe("properties", () => { + const codeArbitrary = fc.constantFrom(...Object.keys(NBS_DESCRIPTIONS)); + + test("should never throw, regardless of the input", () => { + expectNeverThrows(getNbs, anyGarbage); + }); + + test("should resolve every known code, bare, masked or as a number, and agree with isValidNbs", () => { + fc.assert( + fc.property(codeArbitrary, (code) => { + const expected = { code, description: NBS_DESCRIPTIONS[code] }; + + expect(getNbs(code)).toEqual(expected); + expect(getNbs(Number(code))).toEqual(expected); + expect(getNbs(formatNbs(code))).toEqual(expected); + expect(isValidNbs(code)).toBe(true); + }), + ); + }); + + test("should only carry 9 digit codes starting with 1 and non-empty descriptions", () => { + fc.assert( + fc.property(codeArbitrary, (code) => { + expect(code).toMatch(/^1\d{8}$/); + expect(NBS_DESCRIPTIONS[code].trim()).not.toBe(""); + }), + ); + }); + + test("should carry no description with the quoting of the CSV left on it", () => { + fc.assert( + fc.property(codeArbitrary, (code) => { + expect(NBS_DESCRIPTIONS[code].startsWith('"')).toBe(false); + expect(NBS_DESCRIPTIONS[code]).not.toContain('""'); + }), + ); + }); + }); +}); + +describe("getNbs types", () => { + test("should take a string or number and return an Nbs or null", () => { + expectTypeOf(getNbs).parameter(0).toEqualTypeOf(); + expectTypeOf(getNbs).returns.toEqualTypeOf(); + expectTypeOf().toEqualTypeOf<{ code: string; description: string }>(); + }); +}); diff --git a/src/get-nbs/get-nbs.ts b/src/get-nbs/get-nbs.ts new file mode 100644 index 000000000..a2327a5e3 --- /dev/null +++ b/src/get-nbs/get-nbs.ts @@ -0,0 +1,67 @@ +import { NBS_DESCRIPTIONS, NBS_FORMAT_REGEX } from "../_internals/constants/nbs"; +import { isLookupCode } from "../_internals/is-lookup-code/is-lookup-code"; +import { sanitizeToDigits } from "../_internals/sanitize-to-digits/sanitize-to-digits"; + +/** + * A code of the NBS (Nomenclatura Brasileira de Serviços, Intangíveis e Outras Operações que + * Produzam Variações no Patrimônio). + */ +export type Nbs = { + /** The 9 digit code, without the `N.NNNN.NN.NN` mask. */ + code: string; + /** The official description, as the NBS 2.0 table prints it. */ + description: string; +}; + +/** + * Looks an NBS (Nomenclatura Brasileira de Serviços, Intangíveis e Outras Operações que + * Produzam Variações no Patrimônio) code up in the official NBS 2.0 table, the code the national + * NFS-e carries in `cNBS`. + * + * An NBS code has 9 digits: the digit 1, two of the chapter, two of the position, the two + * subposition levels, the item and the subitem, printed as `N.NNNN.NN.NN`. Only complete codes + * are in the table; the chapter (`1.01`), position (`1.0101`) and subposition (`1.0101.1`) + * headings classify nothing by themselves and give `null`. + * + * A string is only read as a code when it is written in one of the documented forms: the 9 + * digits, or the `N.NNNN.NN.NN` mask, with a single separator between the groups and optional + * surrounding whitespace. Anything else (`"1.0101abc11.00"`) is rejected instead of having its + * digits picked out. A number is only read as a code when it is a non-negative safe integer. + * Every code starts with 1, so nothing is padded. + * + * @param {string|number} value - The NBS code to look up, with or without the mask, e.g. + * `"1.0101.11.00"`, `"101011100"` or `101011100`. + * @returns {Nbs|null} The matching code, or null when it is unknown or invalid. + * + * @example + * ```typescript + * getNbs("1.0101.11.00"); + * // { code: "101011100", description: "Serviços de construção de edificações residenciais de um e dois pavimentos" } + * getNbs(126050000); // { code: "126050000", description: "Serviços domésticos" } + * getNbs("1.0101"); // null (a position heading, not a complete code) + * getNbs("1.9999.99.99"); // null + * ``` + * + * @see Official: https://www.gov.br/mdic/pt-br/assuntos/sdic/comercio-e-servicos/nbs-nomenclatura-brasileira-de-servicos + * The NBS page of the MDIC: NBS 2.0, approved by the Portaria Conjunta RFB/SCS 1.429/2018 and + * amended by the Portaria Conjunta RFB/SCS 2.000/2018, whose Anexo I states how the code is + * formed ("Formação do código da NBS"). + * @see Official: https://www.gov.br/mdic/pt-br/images/REPOSITORIO/scs/decos/NBS/NBSa_2-0.csv + * The NBS 2.0 table in CSV, the file `NBS_DESCRIPTIONS` is generated from. + * @see Official: https://www.gov.br/nfse/pt-br/biblioteca/documentacao-tecnica/documentacao-atual + * Sistema Nacional NFS-e, `tiposSimples_v1.01.xsd`: `TSCodNBS` is `[0-9]{9}`. + */ +export const getNbs = (value: string | number): Nbs | null => { + if (!isLookupCode(value)) return null; + + const code = String(value).trim(); + + if (!NBS_FORMAT_REGEX.test(code)) return null; + + const digits = sanitizeToDigits(code); + const description = NBS_DESCRIPTIONS[digits]; + + if (description === undefined) return null; + + return { code: digits, description }; +}; diff --git a/src/get-next-business-day/get-next-business-day.test.ts b/src/get-next-business-day/get-next-business-day.test.ts new file mode 100644 index 000000000..a4bcd5761 --- /dev/null +++ b/src/get-next-business-day/get-next-business-day.test.ts @@ -0,0 +1,165 @@ +import * as fc from "fast-check"; + +import { + anyBusinessDayDate, + anyBusinessDayOptions, + businessDayDates, + PROTOTYPE_KEYS, +} from "../_internals/test/arbitraries"; +import { expectNeverThrowsWithOptions } from "../_internals/test/properties"; +import { describe, expect, expectTypeOf, inTimeZone, it, test } from "../_internals/test/runtime"; +import { differenceInBusinessDays } from "../difference-in-business-days/difference-in-business-days"; +import { type BusinessDayOptions, isBusinessDay } from "../is-business-day/is-business-day"; +import { getNextBusinessDay } from "./get-next-business-day"; + +describe("getNextBusinessDay", () => { + it("should be strictly after a date that is itself a business day (Tue 2024-01-02 -> Wed 2024-01-03, noon)", () => { + expect(getNextBusinessDay(new Date(2024, 0, 2, 12))).toEqual(new Date(2024, 0, 3, 12)); + }); + + it("should keep the time-of-day of the input and leave the input untouched", () => { + const input = new Date(2024, 0, 5, 9, 30, 15, 500); + const result = getNextBusinessDay(input); + + expect(result).toEqual(new Date(2024, 0, 8, 9, 30, 15, 500)); + expect(input).toEqual(new Date(2024, 0, 5, 9, 30, 15, 500)); + }); + + it("should skip Saturday and Sunday from a Friday (Fri 2024-01-05 -> Mon 2024-01-08)", () => { + expect(getNextBusinessDay(new Date(2024, 0, 5, 12))).toEqual(new Date(2024, 0, 8, 12)); + }); + + it("should land on the same Monday from a Saturday and from a Sunday", () => { + expect(getNextBusinessDay(new Date(2024, 0, 6, 12))).toEqual(new Date(2024, 0, 8, 12)); + expect(getNextBusinessDay(new Date(2024, 0, 7, 12))).toEqual(new Date(2024, 0, 8, 12)); + }); + + it("should skip Ano novo across a year boundary (Tue 2024-12-31 -> Thu 2025-01-02)", () => { + expect(getNextBusinessDay(new Date(2024, 11, 31, 12))).toEqual(new Date(2025, 0, 2, 12)); + }); + + it("should start from a holiday like from any other day (Mon 2024-01-01 -> Tue 2024-01-02)", () => { + expect(getNextBusinessDay(new Date(2024, 0, 1, 12))).toEqual(new Date(2024, 0, 2, 12)); + }); + + describe("state holidays", () => { + it("should skip a state holiday when stateCode is given (SP, Revolução Constitucionalista 2024-07-09)", () => { + const result = getNextBusinessDay(new Date(2024, 6, 8, 12), { stateCode: "SP" }); + + expect(result).toEqual(new Date(2024, 6, 10, 12)); + }); + + it("should treat a prototype chain key as an unknown stateCode instead of throwing", () => { + for (const stateCode of PROTOTYPE_KEYS) { + // @ts-expect-error: intentionally invalid input + const result = getNextBusinessDay(new Date(2024, 6, 8, 12), { stateCode }); + + expect(result).toEqual(new Date(2024, 6, 9, 12)); + } + }); + + it("should land on that same holiday without a stateCode", () => { + expect(getNextBusinessDay(new Date(2024, 6, 8, 12))).toEqual(new Date(2024, 6, 9, 12)); + }); + }); + + describe("includeOptional", () => { + it("should skip Carnaval 2024-02-13 by default (Mon 2024-02-12 -> Wed 2024-02-14)", () => { + expect(getNextBusinessDay(new Date(2024, 1, 12, 12))).toEqual(new Date(2024, 1, 14, 12)); + }); + + it("should land on Carnaval 2024-02-13 when includeOptional is false", () => { + const result = getNextBusinessDay(new Date(2024, 1, 12, 12), { includeOptional: false }); + + expect(result).toEqual(new Date(2024, 1, 13, 12)); + }); + }); + + describe("includeSaturday", () => { + it("should return the Saturday when it counts (Fri 2024-01-05 -> Sat 2024-01-06)", () => { + const result = getNextBusinessDay(new Date(2024, 0, 5, 12), { includeSaturday: true }); + + expect(result).toEqual(new Date(2024, 0, 6, 12)); + }); + + it("should return the Monday without the option (Fri 2024-01-05 -> Mon 2024-01-08)", () => { + expect(getNextBusinessDay(new Date(2024, 0, 5, 12), { includeSaturday: false })).toEqual( + new Date(2024, 0, 8, 12), + ); + }); + + it("should never return a Sunday (Sat 2024-01-06 -> Mon 2024-01-08)", () => { + const result = getNextBusinessDay(new Date(2024, 0, 6, 12), { includeSaturday: true }); + + expect(result).toEqual(new Date(2024, 0, 8, 12)); + }); + + it("should skip a holiday that falls on a Saturday (Fri 2024-11-01 -> Mon 2024-11-04, Finados)", () => { + const result = getNextBusinessDay(new Date(2024, 10, 1, 12), { includeSaturday: true }); + + expect(result).toEqual(new Date(2024, 10, 4, 12)); + }); + }); + + describe("invalid input", () => { + it("should return null for a date that is not a valid Date", () => { + // @ts-expect-error: intentionally invalid input + expect(getNextBusinessDay()).toBeNull(); + // @ts-expect-error: intentionally invalid input + expect(getNextBusinessDay(null)).toBeNull(); + // @ts-expect-error: intentionally invalid input + expect(getNextBusinessDay("2024-01-05")).toBeNull(); + expect(getNextBusinessDay(new Date("not a date"))).toBeNull(); + }); + + it("should return null for a stateCode that is not a string", () => { + // @ts-expect-error: intentionally invalid input + expect(getNextBusinessDay(new Date(2024, 0, 5), { stateCode: 7 })).toBeNull(); + }); + + it("should return null outside the supported years, or when the walk leaves them (Thu 2099-12-31)", () => { + expect(getNextBusinessDay(new Date(1899, 11, 29))).toBeNull(); + expect(getNextBusinessDay(new Date(2100, 0, 4))).toBeNull(); + expect(getNextBusinessDay(new Date(2099, 11, 31, 12))).toBeNull(); + }); + }); + + inTimeZone("Pacific/Apia", () => { + it("should skip 30 December 2011, the local day Samoa never had (-> Mon 2012-01-02)", () => { + expect(getNextBusinessDay(new Date(2011, 11, 29, 12))).toEqual(new Date(2012, 0, 2, 12)); + }); + }); + + inTimeZone("UTC", () => { + it("should reach 30 December 2011, where it is an ordinary Friday", () => { + expect(getNextBusinessDay(new Date(2011, 11, 29, 12))).toEqual(new Date(2011, 11, 30, 12)); + }); + }); + + describe("properties", () => { + test("should never throw, regardless of the input, prototype chain state codes included", () => { + expectNeverThrowsWithOptions(getNextBusinessDay, anyBusinessDayDate, anyBusinessDayOptions); + }); + + test("should return a business day after the date with no business day strictly in between", () => { + fc.assert( + fc.property(businessDayDates, (date) => { + const result = getNextBusinessDay(date); + const dayAfter = new Date(date.getFullYear(), date.getMonth(), date.getDate() + 1); + + expect(result !== null && isBusinessDay(result)).toBe(true); + expect(result !== null && result.getTime() > date.getTime()).toBe(true); + expect(result === null ? null : differenceInBusinessDays(result, dayAfter)).toBe(0); + }), + ); + }); + }); +}); + +describe("getNextBusinessDay types", () => { + test("should take a Date and optional BusinessDayOptions, and return a Date or null", () => { + expectTypeOf(getNextBusinessDay).parameter(0).toEqualTypeOf(); + expectTypeOf(getNextBusinessDay).parameter(1).toEqualTypeOf(); + expectTypeOf(getNextBusinessDay).returns.toEqualTypeOf(); + }); +}); diff --git a/src/get-next-business-day/get-next-business-day.ts b/src/get-next-business-day/get-next-business-day.ts new file mode 100644 index 000000000..ed64ade00 --- /dev/null +++ b/src/get-next-business-day/get-next-business-day.ts @@ -0,0 +1,64 @@ +import { addBusinessDays } from "../add-business-days/add-business-days"; +import { type BusinessDayOptions } from "../is-business-day/is-business-day"; + +export type { BusinessDayOptions } from "../is-business-day/is-business-day"; + +/** + * Gets the first Brazilian business day (dia útil) strictly after a date. + * + * It is `addBusinessDays(date, 1, options)`, which it delegates to, down to the last detail. A + * business day is a day for which `isBusinessDay` returns `true` (not a Saturday, a Sunday, or a + * Brazilian holiday; `options.includeSaturday` keeps Saturday), evaluated with the same `options`. + * + * "Next" is **strictly after**, the meaning date-fns gives it in `nextDay`, `nextMonday` and + * their siblings, verified against its source: `nextDay(date, day)` on a date that already is + * that day of the week returns the one a week later, never `date` itself. So a `date` that is a + * business day is never returned; when "on or after" is what you need, check `isBusinessDay` + * first and keep `date` when it answers `true`. + * + * The time-of-day (hours, minutes, seconds, milliseconds) of `date` is preserved in the result, + * as date-fns' `nextDay` and `addBusinessDays` do, and `date` itself is never mutated. + * + * `options.includeSaturday` defaults to `false`, the Monday to Friday banking count. Pass `true` + * for the labour law count of Instrução Normativa MTP nº 2/2021, art. 14, I, which includes + * Saturday and still excludes Sunday and holidays, so a holiday that falls on a Saturday is never + * counted. See `isBusinessDay` for the law behind it and for what it does not cover: municipal + * holidays, which `getHolidays` does not carry. + * + * If `options.stateCode` is provided but is not a valid/known state code, it is ignored and only + * national holidays are considered (same behavior as `getHolidays`/`isBusinessDay`), so a + * prototype-chain key such as `"__proto__"` is an unknown state code like any other. An `options` + * that is not an object at all is ignored, exactly as `isBusinessDay` ignores it. + * + * Only years from 1900 through 2099 are supported, the range `getHolidays` computes. A `date` + * outside it, or a walk that leaves it, returns `null`. + * + * @param {Date} date - The date to look after. Never mutated: a new `Date` is returned. + * @param {BusinessDayOptions} [options] - Which days count as business days. + * @param {StateCode} [options.stateCode] - Brazilian state code whose state holidays are also considered. + * @param {boolean} [options.includeOptional] - Whether optional holidays count as non-business days (default: `true`). + * @param {boolean} [options.includeSaturday] - Whether Saturday counts as a business day (default: `false`). + * @returns {Date | null} A new `Date`, the first business day after `date`. `null` on bad input: + * a `date` that is not a valid `Date` or is outside 1900-2099, a `stateCode` that is not a + * string, or a walk that leaves the supported years. + * + * @example + * ```typescript + * getNextBusinessDay(new Date(2024, 0, 2, 12)); // Wed 2024-01-03, 12:00 (strictly after, even though Jan 2 is a business day) + * getNextBusinessDay(new Date(2024, 0, 5, 12)); // Mon 2024-01-08, 12:00 (skips the weekend) + * getNextBusinessDay(new Date(2024, 0, 6, 12)); // Mon 2024-01-08, 12:00 (from a Saturday) + * getNextBusinessDay(new Date(2024, 11, 31, 12)); // Thu 2025-01-02, 12:00 (Jan 1 is Ano novo, skipped) + * getNextBusinessDay(new Date(2024, 0, 5, 12), { includeSaturday: true }); // Sat 2024-01-06, 12:00 (labour count) + * getNextBusinessDay(new Date(2024, 10, 1, 12), { includeSaturday: true }); // Mon 2024-11-04, 12:00 (Nov 2 is Finados, a holiday on a Saturday) + * getNextBusinessDay(new Date(2024, 6, 8, 12), { stateCode: "SP" }); // Wed 2024-07-10, 12:00 (Jul 9 is a state holiday in SP) + * getNextBusinessDay(new Date("not a date")); // null + * getNextBusinessDay(new Date(2099, 11, 31)); // null (the walk leaves the supported years) + * ``` + * + * @see Based on: https://unpkg.com/date-fns@4.1.0/nextDay.js + * Source used to verify that "next" excludes the date itself and that the time-of-day is kept. + * The underlying holiday determination's official sources are cited in + * `isBusinessDay`/`getHolidays`. + */ +export const getNextBusinessDay = (date: Date, options?: BusinessDayOptions): Date | null => + addBusinessDays(date, 1, options); diff --git a/src/get-nfse-key-info/constants.ts b/src/get-nfse-key-info/constants.ts new file mode 100644 index 000000000..96075c86e --- /dev/null +++ b/src/get-nfse-key-info/constants.ts @@ -0,0 +1,53 @@ +/** + * Shape of the key: one block of 50 digits, the pattern of `TSChaveNFSe` in + * `tiposSimples_v1.01.xsd`, optionally behind the `NFS` literal the `Id` attribute of `infNFSe` + * puts in front of it (`TSIdNFSe`). The DANFSe prints the key the same way ("em único bloco + * contendo 50 dígitos", Nota Técnica SE/CGNFS-e 008, item 2.1.1), so there is no mask to accept. + * The digits are the first capture group. + */ +export const FORMAT_REGEX = /^(?:nfs)?(\d{50})$/i; + +/** + * The `ambGer` (ambiente gerador) codes of `TSAmbGeradorNFSe`: 1 for the system of the + * municipality (Prefeitura), 2 for the Sistema Nacional NFS-e (Sefin Nacional). + */ +export const GENERATOR_ENVIRONMENTS = [1, 2] as const; + +/** + * The "Tipo de Inscrição Federal" codes of the key, as rule E1263 of the ANEXO I states them: + * 1 for a CPF and 2 for a CNPJ. + */ +export const TAX_ID_TYPES: Readonly> = { "1": "cpf", "2": "cnpj" }; + +/** The zeros that pad an 11 digit CPF to the 14 positions of the "Inscrição Federal" field. */ +export const CPF_PADDING = "000"; + +/** + * A number of all zeros is not a valid `nNFSe`: the leiaute types it `TSNNFSe`, whose pattern is + * `[1-9]{1}[0-9]{0,12}`. + */ +export const ABSENT_NUMBER = "0000000000000"; + +/** Position of `ambGer` inside the 50 digit key. */ +export const GENERATOR_ENVIRONMENT_INDEX = 7; + +/** Position of the "Tipo de Inscrição Federal" inside the 50 digit key. */ +export const TAX_ID_TYPE_INDEX = 8; + +/** Start of the "Inscrição Federal" inside the 50 digit key. */ +export const TAX_ID_START = 9; + +/** Start of the NFS-e number (`nNFSe`), which is also the end of the "Inscrição Federal". */ +export const NUMBER_START = 23; + +/** Start of the issue year and month (AAMM), which is also the end of the NFS-e number. */ +export const YEAR_START = 36; + +/** Start of the issue month, which is also the end of the issue year. */ +export const MONTH_START = 38; + +/** Start of the numeric code (Cód.Num.), which is also the end of the issue month. */ +export const CODE_START = 40; + +/** Position of the check digit (DV), which is also the end of the numeric code. */ +export const CHECK_DIGIT_INDEX = 49; diff --git a/src/get-nfse-key-info/get-nfse-key-info.test.ts b/src/get-nfse-key-info/get-nfse-key-info.test.ts new file mode 100644 index 000000000..f613d93c4 --- /dev/null +++ b/src/get-nfse-key-info/get-nfse-key-info.test.ts @@ -0,0 +1,298 @@ +import * as fc from "fast-check"; + +import { IBGE_UF_CODES } from "../_internals/constants/ibge-uf-codes"; +import { type StateCode } from "../_internals/constants/states"; +import { describe, expect, expectTypeOf, test } from "../_internals/test/runtime"; +import { type GENERATOR_ENVIRONMENTS } from "./constants"; +import { + getNfseKeyInfo, + type NfseKeyGeneratorEnvironment, + type NfseKeyInfo, + type NfseKeyTaxIdType, +} from "./get-nfse-key-info"; + +const KEY_SP = "35503082258716523000119000000000001226011357924683"; +const KEY_RS = "43149021100040364478829000000000105725120484407255"; + +const CHECK_DIGITS = Array.from({ length: 10 }, (_, digit) => String(digit)); + +const ISSUERS: { type: string; registration: string; taxIdType: string; taxId: string }[] = [ + { type: "1", registration: "00040364478829", taxIdType: "cpf", taxId: "40364478829" }, + { type: "2", registration: "58716523000119", taxIdType: "cnpj", taxId: "58716523000119" }, + { type: "2", registration: "00000000000191", taxIdType: "cnpj", taxId: "00000000000191" }, +]; + +const expectedCheckDigit = (body: string): number => { + let sum = 0; + let weight = 2; + + for (let index = body.length - 1; index >= 0; index -= 1) { + sum += Number(body.charAt(index)) * weight; + weight = weight === 9 ? 2 : weight + 1; + } + + const remainder = sum % 11; + + return remainder < 2 ? 0 : 11 - remainder; +}; + +describe("getNfseKeyInfo", () => { + describe("should return null", () => { + test("when it is null", () => { + // @ts-expect-error: intentionally invalid input + expect(getNfseKeyInfo(null)).toBeNull(); + }); + + test("when it is undefined", () => { + // @ts-expect-error: intentionally invalid input + expect(getNfseKeyInfo()).toBeNull(); + }); + + test("when it is a number", () => { + // @ts-expect-error: intentionally invalid input + expect(getNfseKeyInfo(123)).toBeNull(); + }); + + test("when it is an empty string", () => { + expect(getNfseKeyInfo("")).toBeNull(); + }); + + test("when it is otherwise not a key", () => { + expect(getNfseKeyInfo("not-a-key")).toBeNull(); + }); + + test("when it does not have 50 digits", () => { + expect(getNfseKeyInfo(KEY_SP.slice(0, 49))).toBeNull(); + expect(getNfseKeyInfo(`${KEY_SP}3`)).toBeNull(); + }); + + test("when there is anything before or after the 50 digits", () => { + expect(getNfseKeyInfo(`x${KEY_SP}`)).toBeNull(); + expect(getNfseKeyInfo(`${KEY_SP}x`)).toBeNull(); + expect(getNfseKeyInfo(`NFSe${KEY_SP}`)).toBeNull(); + }); + + test("when it is split by separators, since the key has no mask", () => { + expect( + getNfseKeyInfo("3550308 2 2 58716523000119 0000000000012 2601 135792468 3"), + ).toBeNull(); + expect(getNfseKeyInfo(`NFS ${KEY_SP}`)).toBeNull(); + }); + + test("when the check digit does not match", () => { + expect(getNfseKeyInfo("35503082258716523000119000000000001226011357924684")).toBeNull(); + }); + + test("when the municipality code does not start with an IBGE UF code, even with a matching check digit", () => { + expect(getNfseKeyInfo("99503082258716523000119000000000001226011357924680")).toBeNull(); + expect(getNfseKeyInfo("00503082258716523000119000000000001226011357924680")).toBeNull(); + }); + + test("when ambGer is 0 or 3, even with a matching check digit", () => { + expect(getNfseKeyInfo("35503080258716523000119000000000001226011357924689")).toBeNull(); + expect(getNfseKeyInfo("35503083258716523000119000000000001226011357924680")).toBeNull(); + }); + + test("when the registration type is 0 or 3, even with a matching check digit", () => { + expect(getNfseKeyInfo("35503082058716523000119000000000001226011357924687")).toBeNull(); + expect(getNfseKeyInfo("35503082358716523000119000000000001226011357924681")).toBeNull(); + }); + + test("when the registration type is 0 or 3 and the registration is a well padded CPF", () => { + expect(getNfseKeyInfo("35503082000040364478829000000000001226011357924689")).toBeNull(); + expect(getNfseKeyInfo("35503082300040364478829000000000001226011357924683")).toBeNull(); + }); + + test("when the registration type says CPF and the registration is a CNPJ", () => { + expect(getNfseKeyInfo("35503082158716523000119000000000001226011357924685")).toBeNull(); + }); + + test("when the registration type says CNPJ and the registration is a padded CPF", () => { + expect(getNfseKeyInfo("35503082200040364478829000000000001226011357924685")).toBeNull(); + }); + + test("when a valid CPF is not left padded with 000", () => { + expect(getNfseKeyInfo("35503082110040364478829000000000001226011357924689")).toBeNull(); + expect(getNfseKeyInfo("35503082101040364478829000000000001226011357924680")).toBeNull(); + expect(getNfseKeyInfo("35503082100140364478829000000000001226011357924680")).toBeNull(); + }); + + test("when the check digits of the CPF or of the CNPJ do not match, even with a matching key check digit", () => { + expect(getNfseKeyInfo("43149021100040364478820000000000105725120484407258")).toBeNull(); + expect(getNfseKeyInfo("35503082258716523000110000000000001226011357924686")).toBeNull(); + }); + + test("when nNFSe is all zeros, even with a matching check digit", () => { + expect(getNfseKeyInfo("35503082258716523000119000000000000026011357924683")).toBeNull(); + }); + + test("when the month is 00 or 13, even with a matching check digit", () => { + expect(getNfseKeyInfo("35503082258716523000119000000000001226001357924686")).toBeNull(); + expect(getNfseKeyInfo("35503082258716523000119000000000001226131357924684")).toBeNull(); + }); + + test("when the CNPJ is alphanumeric, which no official document gives a check digit rule for", () => { + expect(getNfseKeyInfo("355030822AB716523000119000000000001226011357924683")).toBeNull(); + }); + }); + + describe("should return the parsed access key", () => { + test("for a synthetic key of a CNPJ issuer generated by the Sistema Nacional NFS-e (São Paulo)", () => { + expect(getNfseKeyInfo(KEY_SP)).toEqual({ + municipalityCode: "3550308", + stateCode: "SP", + generatorEnvironment: 2, + taxIdType: "cnpj", + taxId: "58716523000119", + number: 12, + year: 2026, + month: 1, + code: "135792468", + checkDigit: 3, + }); + }); + + test("for a synthetic key of a CPF issuer generated by the municipality (Porto Alegre), dropping the 000 padding", () => { + expect(getNfseKeyInfo(KEY_RS)).toEqual({ + municipalityCode: "4314902", + stateCode: "RS", + generatorEnvironment: 1, + taxIdType: "cpf", + taxId: "40364478829", + number: 1057, + year: 2025, + month: 12, + code: "048440725", + checkDigit: 5, + }); + }); + + test("accepting the NFS prefix of the XML Id attribute, in any case, and surrounding whitespace", () => { + expect(getNfseKeyInfo(`NFS${KEY_SP}`)?.number).toBe(12); + expect(getNfseKeyInfo(`nfs${KEY_SP}`)?.number).toBe(12); + expect(getNfseKeyInfo(` NFS${KEY_SP}\n`)?.number).toBe(12); + expect(getNfseKeyInfo(` ${KEY_SP} `)?.number).toBe(12); + }); + + test("for ambGer 1 on the São Paulo key, with the check digit recalculated", () => { + expect( + getNfseKeyInfo("35503081258716523000119000000000001226011357924686")?.generatorEnvironment, + ).toBe(1); + }); + + test("for month 12, the upper boundary", () => { + expect(getNfseKeyInfo("35503082258716523000119000000000001226121357924687")?.month).toBe(12); + }); + + test("for the largest nNFSe, which a JavaScript number still holds exactly", () => { + expect(getNfseKeyInfo("35503082258716523000119999999999999926011357924686")?.number).toBe( + 9_999_999_999_999, + ); + }); + + test("for years 00 and 99 of the two digit year", () => { + expect(getNfseKeyInfo("35503082258716523000119000000000001200011357924681")?.year).toBe(2000); + expect(getNfseKeyInfo("35503082258716523000119000000000001299011357924681")?.year).toBe(2099); + }); + + test("keeping the leading zeros of a numeric code of all zeros", () => { + expect(getNfseKeyInfo("35503082258716523000119000000000001226010000000004")?.code).toBe( + "000000000", + ); + }); + + test("for check digit 0 out of remainders 0 and 1, and check digit 1 out of remainder 10", () => { + expect(getNfseKeyInfo("35503082258716523000119000000000001226011234567890")?.checkDigit).toBe( + 0, + ); + expect(getNfseKeyInfo("35503082258716523000119000000000001226011234567840")?.checkDigit).toBe( + 0, + ); + expect(getNfseKeyInfo("35503082258716523000119000000000001226011234567831")?.checkDigit).toBe( + 1, + ); + }); + }); + + describe("properties", () => { + const parts = fc.tuple( + fc.constantFrom(...Object.keys(IBGE_UF_CODES)), + fc.stringMatching(/^[0-9]{5}$/), + fc.constantFrom(1, 2), + fc.constantFrom(...ISSUERS), + fc.integer({ min: 1, max: 9_999_999_999_999 }), + fc.stringMatching(/^[0-9]{2}$/), + fc.integer({ min: 1, max: 12 }), + fc.stringMatching(/^[0-9]{9}$/), + ); + + test("should give back every field of a well-formed access key", () => { + fc.assert( + fc.property(parts, (fields) => { + const [uf, municipality, ambGer, issuer, number, year, month, code] = fields; + const head = `${uf}${municipality}${ambGer}${issuer.type}${issuer.registration}`; + const issue = `${year}${String(month).padStart(2, "0")}`; + const body = `${head}${String(number).padStart(13, "0")}${issue}${code}`; + const checkDigit = expectedCheckDigit(body); + const parsed = getNfseKeyInfo(`${body}${checkDigit}`); + + expect(parsed?.municipalityCode).toBe(`${uf}${municipality}`); + expect(parsed?.stateCode).toBe(IBGE_UF_CODES[uf]); + expect(parsed?.generatorEnvironment).toBe(ambGer); + expect(parsed?.taxIdType).toBe(issuer.taxIdType); + expect(parsed?.taxId).toBe(issuer.taxId); + expect(parsed?.number).toBe(number); + expect(parsed?.year).toBe(2000 + Number(year)); + expect(parsed?.month).toBe(month); + expect(parsed?.code).toBe(code); + expect(parsed?.checkDigit).toBe(checkDigit); + }), + ); + }); + + test("should accept exactly one check digit for a well-formed body", () => { + fc.assert( + fc.property(fc.stringMatching(/^[0-9]{9}$/), (code) => { + const base = `${KEY_SP.slice(0, 40)}${code}`; + const accepted = CHECK_DIGITS.filter((digit) => getNfseKeyInfo(`${base}${digit}`)); + + expect(accepted).toHaveLength(1); + }), + ); + }); + + test("should never throw and always return an access key or null", () => { + fc.assert( + fc.property(fc.anything(), (value) => { + const parsed = getNfseKeyInfo(value as string); + + expect(parsed === null || typeof parsed.taxId === "string").toBe(true); + }), + ); + }); + }); +}); + +describe("getNfseKeyInfo types", () => { + test("should take a string and return an NfseKeyInfo or null", () => { + expectTypeOf(getNfseKeyInfo).parameter(0).toEqualTypeOf(); + expectTypeOf(getNfseKeyInfo).returns.toEqualTypeOf(); + expectTypeOf().toEqualTypeOf<{ + municipalityCode: string; + stateCode: StateCode; + generatorEnvironment: NfseKeyGeneratorEnvironment; + taxIdType: NfseKeyTaxIdType; + taxId: string; + number: number; + year: number; + month: number; + code: string; + checkDigit: number; + }>(); + expectTypeOf().toEqualTypeOf<1 | 2>(); + expectTypeOf().toEqualTypeOf< + (typeof GENERATOR_ENVIRONMENTS)[number] + >(); + expectTypeOf().toEqualTypeOf<"cpf" | "cnpj">(); + }); +}); diff --git a/src/get-nfse-key-info/get-nfse-key-info.ts b/src/get-nfse-key-info/get-nfse-key-info.ts new file mode 100644 index 000000000..7e2cc6f24 --- /dev/null +++ b/src/get-nfse-key-info/get-nfse-key-info.ts @@ -0,0 +1,165 @@ +import { IBGE_UF_CODES } from "../_internals/constants/ibge-uf-codes"; +import { type StateCode } from "../_internals/constants/states"; +import { mod11 } from "../_internals/mod11/mod11"; +import { isValidCnpj } from "../is-valid-cnpj/is-valid-cnpj"; +import { isValidCpf } from "../is-valid-cpf/is-valid-cpf"; +import { + ABSENT_NUMBER, + CHECK_DIGIT_INDEX, + CODE_START, + CPF_PADDING, + FORMAT_REGEX, + GENERATOR_ENVIRONMENTS, + GENERATOR_ENVIRONMENT_INDEX, + MONTH_START, + NUMBER_START, + TAX_ID_START, + TAX_ID_TYPES, + TAX_ID_TYPE_INDEX, + YEAR_START, +} from "./constants"; + +export type { StateCode } from "../_internals/constants/states"; + +/** + * The system that generated the NFS-e (`ambGer`): `1` the system of the municipality + * (Prefeitura), `2` the Sistema Nacional NFS-e (Sefin Nacional). Spelled out instead of derived + * from `GENERATOR_ENVIRONMENTS` because the allowlist is internal and API Extractor cannot name + * it in the public report; the type test of `get-nfse-key-info.test.ts` pins the two together. + */ +export type NfseKeyGeneratorEnvironment = 1 | 2; + +/** The kind of federal registration ("Tipo de Inscrição Federal") the key carries. */ +export type NfseKeyTaxIdType = "cpf" | "cnpj"; + +/** The fields `getNfseKeyInfo` reads out of a national NFS-e access key (chave de acesso). */ +export type NfseKeyInfo = { + /** Seven digit IBGE code of the municipality of the issuer's address. */ + municipalityCode: string; + /** Two letter code of the state (UF) of that municipality, read from its first two digits. */ + stateCode: StateCode; + /** The system that generated the NFS-e (`ambGer`): 1 municipality, 2 Sistema Nacional NFS-e. */ + generatorEnvironment: NfseKeyGeneratorEnvironment; + /** Whether the issuer is identified by a CPF or by a CNPJ. */ + taxIdType: NfseKeyTaxIdType; + /** The 11 digit CPF (without the `000` padding of the key) or the 14 digit CNPJ of the issuer. */ + taxId: string; + /** NFS-e number (`nNFSe`), sequential by issuer, 1 to 9999999999999. */ + number: number; + /** Four digit issue year. */ + year: number; + /** Issue month, 1 to 12. */ + month: number; + /** The 9 digit random numeric code drawn by the system that generated the NFS-e. */ + code: string; + /** The modulo 11 check digit of the key. */ + checkDigit: number; +}; + +const readTaxId = (taxIdType: NfseKeyTaxIdType, registration: string): string | null => { + if (taxIdType === "cnpj") return isValidCnpj(registration) ? registration : null; + + const cpf = registration.slice(CPF_PADDING.length); + + return registration.startsWith(CPF_PADDING) && isValidCpf(cpf) ? cpf : null; +}; + +/** + * Parses the access key (chave de acesso) of a national NFS-e, the Nota Fiscal de Serviço + * eletrônica of the Sistema Nacional NFS-e, into its fields. + * + * The key is one block of 50 digits: + * `Cód.Mun.(7) Amb.Ger.(1) Tipo de Inscrição Federal(1) Inscrição Federal(14) nNFSe(13) AAMM(4) + * Cód.Num.(9) DV(1)`. It is accepted as it is written in the documents (`chNFSe`, `chSubstda`, + * the DANFSe, which prints it as a single block) or with the `NFS` literal the `Id` attribute + * of `infNFSe` puts in front of it, surrounding whitespace aside. The key has no printed mask, + * so a separator anywhere in it is rejected instead of being stripped. The keys of the + * municipal NFS-e models that are not the national standard are out of scope. + * + * What is checked: the first two digits of the municipality code are an IBGE UF code, `ambGer` + * is 1 or 2, the registration type is 1 (CPF, the 11 digits left padded with `000`) or 2 + * (CNPJ) and the CPF or CNPJ has valid check digits of its own (rules E1280 and E1284 of the + * ANEXO I reject an NFS-e whose issuer fails them), `nNFSe` is not all zeros, the month is 01 + * to 12 and the check digit matches. The municipality code is not looked up in the IBGE table. + * + * The check digit is a modulus 11 over the first 49 digits, weights 2 to 9 cycling from the + * right, where a remainder of 0 or 1 gives 0. The official text only says "algoritmo do módulo + * 11"; the weights and the remainder rule are the ones of the DF-e access key and were + * confirmed against more than a hundred NFS-e keys found in public repositories, generated by + * both environments, remainders 0, 1 and 10 included. + * + * Keys carrying an alphanumeric CNPJ are not accepted yet: the schema package published for the + * restricted production environment on 2026-07-27 widens `TSIdNFSe` to letters in the + * registration, but no official document states how a letter enters the check digit of the key. + * + * @param {string} value - The access key value to be parsed. + * @returns {NfseKeyInfo | null} The parsed access key, or `null` when it is not valid. + * + * @see Official: https://www.gov.br/nfse/pt-br/biblioteca/documentacao-tecnica/documentacao-atual + * Sistema Nacional NFS-e, current technical documentation: `NFSe-ESQUEMAS_XSD-v1.01` + * (`tiposSimples_v1.01.xsd`: `TSIdNFSe`, `TSChaveNFSe`, `TSAmbGeradorNFSe`, `TSNNFSe`) and + * `ANEXO_I-SEFIN_ADN-DPS_NFSe-SNNFSe` v1.01 (field `NFSe/infNFSe/id`, rules E1263, E1280, E1284 + * and E0042). + * @see Official: https://www.gov.br/nfse/pt-br/biblioteca/documentacao-tecnica/documentacao-atual/manual-contribuintes-emissor-publico-api-emissao-decisao-administrativa-e-judicial.pdf + * Manual de Contribuintes, Emissão por Decisão Administrativa ou Judicial, field `id`: "O dígito + * verificador deve ser calculado segundo o algoritmo do módulo 11". + * @see Official: https://www.gov.br/nfse/pt-br/biblioteca/documentacao-tecnica/rtc/nt-008-se-cgnfse-danfse-20260714-v1-02.pdf + * Nota Técnica SE/CGNFS-e 008 (DANFSe), item 2.1.1: the key is printed as a single block of 50 + * digits. + * @see Based on: https://github.com/nfse-nacional/nfse-php + * Test fixtures with NFS-e keys used to confirm the check digit rule; none of them is reproduced + * in the tests of this package, whose keys are synthetic. + * @see Based on: https://github.com/Unimake/DFe + * Example and test XMLs of the NACIONAL standard, second source of keys for the same check. + * + * @example + * ```typescript + * getNfseKeyInfo("35503082258716523000119000000000001226011357924683"); + * // { municipalityCode: "3550308", stateCode: "SP", generatorEnvironment: 2, taxIdType: "cnpj", + * // taxId: "58716523000119", number: 12, year: 2026, month: 1, code: "135792468", checkDigit: 3 } + * + * getNfseKeyInfo("invalid"); // null + * ``` + */ +export const getNfseKeyInfo = (value: string): NfseKeyInfo | null => { + if (typeof value !== "string") return null; + + const match = FORMAT_REGEX.exec(value.trim()); + + if (match === null) return null; + + const [, digits] = match; + const stateCode = IBGE_UF_CODES[digits.slice(0, 2)]; + const ambGer = Number(digits[GENERATOR_ENVIRONMENT_INDEX]); + const generatorEnvironment = GENERATOR_ENVIRONMENTS.find((candidate) => candidate === ambGer); + const taxIdType = TAX_ID_TYPES[digits[TAX_ID_TYPE_INDEX]]; + + if (stateCode === undefined || generatorEnvironment === undefined || taxIdType === undefined) { + return null; + } + + const taxId = readTaxId(taxIdType, digits.slice(TAX_ID_START, NUMBER_START)); + const numberDigits = digits.slice(NUMBER_START, YEAR_START); + const month = Number(digits.slice(MONTH_START, CODE_START)); + + if (taxId === null || numberDigits === ABSENT_NUMBER || month < 1 || month > 12) return null; + + const checkDigit = Number(digits[CHECK_DIGIT_INDEX]); + + if (mod11(digits.slice(0, CHECK_DIGIT_INDEX), { variant: "arrecadacao" }) !== checkDigit) { + return null; + } + + return { + municipalityCode: digits.slice(0, GENERATOR_ENVIRONMENT_INDEX), + stateCode, + generatorEnvironment, + taxIdType, + taxId, + number: Number(numberDigits), + year: 2000 + Number(digits.slice(YEAR_START, MONTH_START)), + month, + code: digits.slice(CODE_START, CHECK_DIGIT_INDEX), + checkDigit, + }; +}; diff --git a/src/get-nth-business-day/get-nth-business-day.test.ts b/src/get-nth-business-day/get-nth-business-day.test.ts new file mode 100644 index 000000000..7f417b5c5 --- /dev/null +++ b/src/get-nth-business-day/get-nth-business-day.test.ts @@ -0,0 +1,323 @@ +import * as fc from "fast-check"; + +import { + anyBusinessDayAmount, + anyBusinessDayDate, + anyBusinessDayOptions, + businessDayDates, + PROTOTYPE_KEYS, +} from "../_internals/test/arbitraries"; +import { expectNeverThrowsWithArguments } from "../_internals/test/properties"; +import { describe, expect, expectTypeOf, inTimeZone, it, test } from "../_internals/test/runtime"; +import { differenceInBusinessDays } from "../difference-in-business-days/difference-in-business-days"; +import { type BusinessDayOptions, isBusinessDay } from "../is-business-day/is-business-day"; +import { getNthBusinessDay } from "./get-nth-business-day"; + +const yearFifty = new Date(2024, 0, 15); +yearFifty.setFullYear(50); + +const NULL_CALLS: [string, () => Date | null][] = [ + // @ts-expect-error: intentionally invalid input + ["no arguments at all", () => getNthBusinessDay()], + // @ts-expect-error: intentionally invalid input + ["a null date", () => getNthBusinessDay(null, 1)], + ["an invalid Date", () => getNthBusinessDay(new Date("not a date"), 1)], + // @ts-expect-error: intentionally invalid input + ["a date given as a string", () => getNthBusinessDay("2024-01-15", 1)], + ["an n of 0", () => getNthBusinessDay(new Date(2024, 0, 15), 0)], + ["an n with a fractional part", () => getNthBusinessDay(new Date(2024, 0, 15), 1.5)], + ["an n of NaN", () => getNthBusinessDay(new Date(2024, 0, 15), Number.NaN)], + ["an n of Infinity", () => getNthBusinessDay(new Date(2024, 0, 15), Number.POSITIVE_INFINITY)], + // @ts-expect-error: intentionally invalid input + ["an n given as a numeric string", () => getNthBusinessDay(new Date(2024, 0, 15), "1")], + // @ts-expect-error: intentionally invalid input + ["an n given as null", () => getNthBusinessDay(new Date(2024, 0, 15), null)], + [ + "a stateCode that is not a string", + // @ts-expect-error: intentionally invalid input + () => getNthBusinessDay(new Date(2024, 0, 15), 1, { stateCode: 7 }), + ], + ["a date before the supported years", () => getNthBusinessDay(new Date(1899, 11, 15), 1)], + ["a date after the supported years", () => getNthBusinessDay(new Date(2100, 0, 15), 1)], + [ + "a date in the year 50, which the Date constructor would read as 1950", + () => getNthBusinessDay(yearFifty, 1), + ], +]; + +describe("getNthBusinessDay", () => { + it("should skip Ano novo to find the first business day of January 2024 (Tue 2024-01-02)", () => { + expect(getNthBusinessDay(new Date(2024, 0, 15), 1)).toEqual(new Date(2024, 0, 2)); + }); + + it("should return the first day of the month when it is a business day (Thu 2024-02-01)", () => { + expect(getNthBusinessDay(new Date(2024, 1, 20), 1)).toEqual(new Date(2024, 1, 1)); + }); + + it("should skip a weekend to find the 5th business day of January 2024 (Mon 2024-01-08)", () => { + expect(getNthBusinessDay(new Date(2024, 0, 15), 5)).toEqual(new Date(2024, 0, 8)); + }); + + it("should find the 5th business day of November 2024, after Finados on a Saturday (Thu 2024-11-07)", () => { + expect(getNthBusinessDay(new Date(2024, 10, 1), 5)).toEqual(new Date(2024, 10, 7)); + }); + + it("should reach the last business day of the month going forwards (22nd of January 2024 -> Wed 2024-01-31)", () => { + expect(getNthBusinessDay(new Date(2024, 0, 15), 22)).toEqual(new Date(2024, 0, 31)); + }); + + it("should return null when the month has fewer business days than n (January 2024 has 22)", () => { + expect(getNthBusinessDay(new Date(2024, 0, 15), 23)).toBeNull(); + expect(getNthBusinessDay(new Date(2024, 0, 15), 1000)).toBeNull(); + }); + + it("should look at the month of the date whatever its day, first and last included", () => { + expect(getNthBusinessDay(new Date(2024, 0, 1), 5)).toEqual(new Date(2024, 0, 8)); + expect(getNthBusinessDay(new Date(2024, 0, 31, 23, 59, 59, 999), 5)).toEqual( + new Date(2024, 0, 8), + ); + }); + + it("should return the start of the local day and leave the input untouched", () => { + const input = new Date(2024, 0, 15, 9, 30, 15, 500); + const result = getNthBusinessDay(input, 5); + + expect(result).toEqual(new Date(2024, 0, 8, 0, 0, 0, 0)); + expect(input).toEqual(new Date(2024, 0, 15, 9, 30, 15, 500)); + }); + + it("should return a new Date even when the answer is the input day", () => { + const input = new Date(2024, 0, 8); + const result = getNthBusinessDay(input, 5); + + expect(result).toEqual(new Date(2024, 0, 8)); + expect(result).not.toBe(input); + }); + + it("should work at both ends of the supported years (Tue 1900-01-02 and Thu 2099-12-31)", () => { + expect(getNthBusinessDay(new Date(1900, 0, 15), 1)).toEqual(new Date(1900, 0, 2)); + expect(getNthBusinessDay(new Date(2099, 11, 15), -1)).toEqual(new Date(2099, 11, 31)); + }); + + it("should return null for every kind of invalid input", () => { + for (const [label, call] of NULL_CALLS) { + expect([label, call()]).toEqual([label, null]); + } + }); + + describe("negative n", () => { + it("should count from the end of the month (-1 -> Wed 2024-01-31, -2 -> Tue 2024-01-30)", () => { + expect(getNthBusinessDay(new Date(2024, 0, 15), -1)).toEqual(new Date(2024, 0, 31)); + expect(getNthBusinessDay(new Date(2024, 0, 15), -2)).toEqual(new Date(2024, 0, 30)); + }); + + it("should skip a weekend at the end of the month (-1 of August 2024 -> Fri 2024-08-30)", () => { + expect(getNthBusinessDay(new Date(2024, 7, 1), -1)).toEqual(new Date(2024, 7, 30)); + }); + + it("should handle December, whose last day borders the next year (-1 of December 2024 -> Tue 2024-12-31)", () => { + expect(getNthBusinessDay(new Date(2024, 11, 1), -1)).toEqual(new Date(2024, 11, 31)); + }); + + it("should reach the first business day of the month going backwards (-22 of January 2024 -> Tue 2024-01-02)", () => { + expect(getNthBusinessDay(new Date(2024, 0, 15), -22)).toEqual(new Date(2024, 0, 2)); + }); + + it("should return null instead of spilling into the previous month (-23 of January 2024)", () => { + expect(getNthBusinessDay(new Date(2024, 0, 15), -23)).toBeNull(); + }); + }); + + describe("state holidays", () => { + it("should skip a state holiday when stateCode is given (SP, Revolução Constitucionalista 2024-07-09)", () => { + const result = getNthBusinessDay(new Date(2024, 6, 1), 7, { stateCode: "SP" }); + + expect(result).toEqual(new Date(2024, 6, 10)); + }); + + it("should count that same holiday without a stateCode", () => { + expect(getNthBusinessDay(new Date(2024, 6, 1), 7)).toEqual(new Date(2024, 6, 9)); + }); + + it("should treat a prototype chain key as an unknown stateCode instead of throwing", () => { + for (const stateCode of PROTOTYPE_KEYS) { + // @ts-expect-error: intentionally invalid input + expect(getNthBusinessDay(new Date(2024, 6, 1), 7, { stateCode })).toEqual( + new Date(2024, 6, 9), + ); + } + }); + + it("should ignore options that are not an object", () => { + // @ts-expect-error: intentionally invalid input + expect(getNthBusinessDay(new Date(2024, 6, 1), 7, "SP")).toEqual(new Date(2024, 6, 9)); + }); + }); + + describe("includeOptional", () => { + it("should skip Carnaval 2024-02-13 by default (10th of February 2024 -> Thu 2024-02-15)", () => { + expect(getNthBusinessDay(new Date(2024, 1, 1), 10)).toEqual(new Date(2024, 1, 15)); + }); + + it("should count Carnaval 2024-02-13 when includeOptional is false (-> Wed 2024-02-14)", () => { + const result = getNthBusinessDay(new Date(2024, 1, 1), 10, { includeOptional: false }); + + expect(result).toEqual(new Date(2024, 1, 14)); + }); + }); + + inTimeZone("Pacific/Apia", () => { + it("should count the 21 business days December 2011 has there, the missing 30th excluded", () => { + expect(getNthBusinessDay(new Date(2011, 11, 15), 21)).toEqual(new Date(2011, 11, 29)); + expect(getNthBusinessDay(new Date(2011, 11, 15), 22)).toBeNull(); + expect(getNthBusinessDay(new Date(2011, 11, 15), -1)).toEqual(new Date(2011, 11, 29)); + }); + + it("should step over the missing Friday 30th with includeSaturday too (-1 is Sat 2011-12-31, -2 is Thu 2011-12-29)", () => { + const options = { includeSaturday: true }; + + expect(getNthBusinessDay(new Date(2011, 11, 15), -1, options)).toEqual( + new Date(2011, 11, 31), + ); + expect(getNthBusinessDay(new Date(2011, 11, 15), -2, options)).toEqual( + new Date(2011, 11, 29), + ); + expect(getNthBusinessDay(new Date(2011, 11, 15), 26, options)).toEqual( + new Date(2011, 11, 31), + ); + expect(getNthBusinessDay(new Date(2011, 11, 15), 27, options)).toBeNull(); + }); + }); + + inTimeZone("UTC", () => { + it("should count the 22 the same December has, the 30th included", () => { + expect(getNthBusinessDay(new Date(2011, 11, 15), 22)).toEqual(new Date(2011, 11, 30)); + expect(getNthBusinessDay(new Date(2011, 11, 15), 23)).toBeNull(); + }); + + it("should count the 27 the same December has with includeSaturday (-2 is Fri 2011-12-30)", () => { + const options = { includeSaturday: true }; + + expect(getNthBusinessDay(new Date(2011, 11, 15), -2, options)).toEqual( + new Date(2011, 11, 30), + ); + expect(getNthBusinessDay(new Date(2011, 11, 15), 27, options)).toEqual( + new Date(2011, 11, 31), + ); + }); + }); + + inTimeZone("America/Havana", () => { + it("should start the day at 00:00 walking back over 10 March 2024, which has no midnight there (Tue 2024-03-05)", () => { + const result = getNthBusinessDay(new Date(2024, 2, 15), -18); + + expect(result).toEqual(new Date(2024, 2, 5)); + expect(result?.getHours()).toBe(0); + }); + }); + + inTimeZone("America/Sao_Paulo", () => { + it("should start the day at 00:00 during the summer time era (Thu 2018-11-08)", () => { + const result = getNthBusinessDay(new Date(2018, 10, 1), 5); + + expect(result).toEqual(new Date(2018, 10, 8)); + expect(result?.getHours()).toBe(0); + }); + + it("should fall back to 01:00 on Monday 6 October 1997, whose local midnight does not exist", () => { + const result = getNthBusinessDay(new Date(1997, 9, 15), 4); + + expect(result).toEqual(new Date(1997, 9, 6)); + expect(result?.getDate()).toBe(6); + expect(result?.getHours()).toBe(1); + }); + }); + + describe("includeSaturday", () => { + it("should give the labour law fifth business day of March 2024 (Wed 2024-03-06, Sat 2024-03-02 counted) against the banking one (Thu 2024-03-07)", () => { + expect(getNthBusinessDay(new Date(2024, 2, 1), 5, { includeSaturday: true })).toEqual( + new Date(2024, 2, 6), + ); + expect(getNthBusinessDay(new Date(2024, 2, 1), 5)).toEqual(new Date(2024, 2, 7)); + }); + + it("should give the labour law fifth business day of February 2024 (Tue 2024-02-06, Sat 2024-02-03 counted) against the banking one (Wed 2024-02-07)", () => { + expect(getNthBusinessDay(new Date(2024, 1, 1), 5, { includeSaturday: true })).toEqual( + new Date(2024, 1, 6), + ); + expect(getNthBusinessDay(new Date(2024, 1, 1), 5)).toEqual(new Date(2024, 1, 7)); + }); + + it("should give the same fifth business day of November 2024 either way (Thu 2024-11-07), since Sat 2024-11-02 is Finados", () => { + expect(getNthBusinessDay(new Date(2024, 10, 1), 5, { includeSaturday: true })).toEqual( + new Date(2024, 10, 7), + ); + expect(getNthBusinessDay(new Date(2024, 10, 1), 5)).toEqual(new Date(2024, 10, 7)); + }); + + it("should skip Independência on Saturday 2024-09-07 and count Sat 2024-09-14 as the 11th (Mon 2024-09-16 without the option)", () => { + expect(getNthBusinessDay(new Date(2024, 8, 1), 11, { includeSaturday: true })).toEqual( + new Date(2024, 8, 14), + ); + expect(getNthBusinessDay(new Date(2024, 8, 1), 11)).toEqual(new Date(2024, 8, 16)); + }); + + it("should give January 2024 its 26 business days (22 plus the Saturdays 6, 13, 20 and 27), the 26th being Wed 2024-01-31", () => { + expect(getNthBusinessDay(new Date(2024, 0, 15), 26, { includeSaturday: true })).toEqual( + new Date(2024, 0, 31), + ); + expect(getNthBusinessDay(new Date(2024, 0, 15), 27, { includeSaturday: true })).toBeNull(); + expect(getNthBusinessDay(new Date(2024, 0, 15), 23)).toBeNull(); + }); + + it("should count backwards from a Saturday at the end of the month (-1 of November 2024 -> Sat 2024-11-30, Fri 2024-11-29 without the option)", () => { + expect(getNthBusinessDay(new Date(2024, 10, 15), -1, { includeSaturday: true })).toEqual( + new Date(2024, 10, 30), + ); + expect(getNthBusinessDay(new Date(2024, 10, 15), -1)).toEqual(new Date(2024, 10, 29)); + }); + + it("should still exclude that Saturday when it is a state holiday (DF, Dia do Evangélico 2024-11-30)", () => { + const result = getNthBusinessDay(new Date(2024, 10, 15), -1, { + stateCode: "DF", + includeSaturday: true, + }); + + expect(result).toEqual(new Date(2024, 10, 29)); + }); + }); + + describe("properties", () => { + test("should never throw, regardless of the input, prototype chain state codes included", () => { + expectNeverThrowsWithArguments( + getNthBusinessDay, + fc.tuple(anyBusinessDayDate, anyBusinessDayAmount, anyBusinessDayOptions), + ); + }); + + test("should return a business day of the same month with n - 1 business days before it", () => { + fc.assert( + fc.property(businessDayDates, fc.integer({ min: 1, max: 15 }), (date, n) => { + const result = getNthBusinessDay(date, n); + const firstOfMonth = new Date(date.getFullYear(), date.getMonth(), 1); + + expect(result?.getFullYear()).toBe(date.getFullYear()); + expect(result?.getMonth()).toBe(date.getMonth()); + expect(result !== null && isBusinessDay(result)).toBe(true); + expect(result === null ? null : differenceInBusinessDays(result, firstOfMonth)).toBe( + n - 1, + ); + }), + ); + }); + }); +}); + +describe("getNthBusinessDay types", () => { + test("should take a Date, a number and optional BusinessDayOptions, and return a Date or null", () => { + expectTypeOf(getNthBusinessDay).parameter(0).toEqualTypeOf(); + expectTypeOf(getNthBusinessDay).parameter(1).toEqualTypeOf(); + expectTypeOf(getNthBusinessDay).parameter(2).toEqualTypeOf(); + expectTypeOf(getNthBusinessDay).returns.toEqualTypeOf(); + }); +}); diff --git a/src/get-nth-business-day/get-nth-business-day.ts b/src/get-nth-business-day/get-nth-business-day.ts new file mode 100644 index 000000000..54846e551 --- /dev/null +++ b/src/get-nth-business-day/get-nth-business-day.ts @@ -0,0 +1,129 @@ +import { eachLocalDay } from "../_internals/each-local-day/each-local-day"; +import { isSupportedHolidayYear } from "../_internals/is-supported-holiday-year/is-supported-holiday-year"; +import { isValidDate } from "../_internals/is-valid-date/is-valid-date"; +import { type BusinessDayOptions, isBusinessDay } from "../is-business-day/is-business-day"; + +export type { BusinessDayOptions } from "../is-business-day/is-business-day"; + +/** + * Gets the n-th Brazilian business day (dia útil) of the month a date falls in. + * + * A business day is a day for which `isBusinessDay` returns `true` (not a Saturday, a Sunday, + * or a Brazilian holiday; `options.includeSaturday` keeps Saturday), evaluated with the same + * `options`. The month is the one of `date`'s + * **local calendar day** (its local year and month, as read by `Date#getFullYear`/`getMonth`), + * the convention every business day util shares; the day of the month and the time of day of + * `date` are ignored. + * + * A positive `n` counts from the first day of the month (`1` is the first business day) and a + * negative `n` counts from the last one (`-1` is the last business day, `-2` the one before + * it), the way `Array#at` reads an index. `getLastBusinessDayOfMonth` is this function with an + * `n` of `-1`. An `n` of `0`, or one beyond the number of business days the month has, returns + * `null`: the answer never spills into a neighbouring month. + * + * The result is a new `Date` at the start of that local day (00:00:00.000), the same shape + * date-fns' `lastDayOfMonth` returns, and `date` itself is never mutated. In a time zone whose + * clocks jump over that local midnight (Brazilian summer time always started at 00:00, so + * 4 November 2018 has no 00:00 in São Paulo) the nearest representable instant of the day is + * returned instead, 01:00 in that example, which is what date-fns' `startOfDay` gives there too. + * A local calendar day a zone does not have at all, such as 30 December 2011 in `Pacific/Apia`, + * is never returned and never counted. + * + * The signature follows the sibling business day utils, which follow date-fns: + * `(date, n, options?)`, like `addBusinessDays(date, amount, options?)`. + * + * Mind the payroll deadline of CLT art. 459 § 1º ("até o quinto dia útil do mês subsequente ao + * vencido"): labour inspection counts **Saturday as a business day** for that deadline + * (Instrução Normativa MTP nº 2/2021, art. 14, I: "na contagem dos dias será incluído o sábado, + * excluindo-se o domingo e o feriado, inclusive o municipal"). By default this function gives + * the banking count, Monday to Friday, which can fall after the labour one; pass + * `options.includeSaturday: true` for the labour count, as in + * `getNthBusinessDay(date, 5, { includeSaturday: true })`. A holiday that falls on a Saturday is + * still not counted, exactly as the article says. The one part of the article the option cannot + * cover is "inclusive o municipal": `getHolidays` carries national and state holidays only, so a + * municipal holiday is counted here as an ordinary business day. + * + * If `options.stateCode` is provided but is not a valid/known state code, it is ignored and only + * national holidays are considered (same behavior as `getHolidays`/`isBusinessDay`), so a + * prototype-chain key such as `"__proto__"` is an unknown state code like any other. An `options` + * that is not an object at all is ignored, exactly as `isBusinessDay` ignores it. + * + * Only years from 1900 through 2099 are supported, the range `getHolidays` computes; a `date` + * outside it returns `null`. + * + * @param {Date} date - Any date inside the month to look at. Never mutated: a new `Date` is returned. + * @param {number} n - Which business day to get: `1` is the first of the month, `-1` the last. + * @param {BusinessDayOptions} [options] - Which days count as business days. + * @param {StateCode} [options.stateCode] - Brazilian state code whose state holidays are also considered. + * @param {boolean} [options.includeOptional] - Whether optional holidays count as non-business days (default: `true`). + * @param {boolean} [options.includeSaturday] - Whether Saturday counts as a business day (default: `false`). + * @returns {Date | null} A new `Date` at 00:00 local time of the n-th business day of the month. + * `null` on bad input: a `date` that is not a valid `Date` or is outside 1900-2099, an `n` that is + * not a finite integer, is `0` or goes beyond the business days of the month, or a `stateCode` + * that is not a string. + * + * @example + * ```typescript + * getNthBusinessDay(new Date(2024, 0, 15), 1); // Tue 2024-01-02, 00:00 (Jan 1 is Ano novo) + * getNthBusinessDay(new Date(2024, 0, 15), 5); // Mon 2024-01-08, 00:00 + * getNthBusinessDay(new Date(2024, 1, 1), 10); // Thu 2024-02-15, 00:00 (Carnaval, Feb 13, skipped) + * getNthBusinessDay(new Date(2024, 1, 1), 10, { includeOptional: false }); // Wed 2024-02-14, 00:00 + * getNthBusinessDay(new Date(2024, 2, 1), 5); // Thu 2024-03-07, 00:00 (banking count) + * getNthBusinessDay(new Date(2024, 2, 1), 5, { includeSaturday: true }); // Wed 2024-03-06, 00:00 (labour count, Mar 2 is a Saturday) + * getNthBusinessDay(new Date(2024, 10, 1), 5, { includeSaturday: true }); // Thu 2024-11-07, 00:00 (Nov 2 is Finados, a holiday on a Saturday) + * getNthBusinessDay(new Date(2024, 6, 1), 7, { stateCode: "SP" }); // Wed 2024-07-10, 00:00 (Jul 9 is a state holiday in SP) + * getNthBusinessDay(new Date(2024, 0, 15), -1); // Wed 2024-01-31, 00:00 (the last business day) + * getNthBusinessDay(new Date(2024, 0, 15), -2); // Tue 2024-01-30, 00:00 + * getNthBusinessDay(new Date(2024, 0, 15), 23); // null (January 2024 has 22 business days) + * getNthBusinessDay(new Date(2024, 0, 15), 0); // null + * getNthBusinessDay(new Date("not a date"), 1); // null + * getNthBusinessDay(new Date(2100, 0, 15), 1); // null (outside the supported years) + * ``` + * + * @see Official: https://www.planalto.gov.br/ccivil_03/decreto-lei/del5452.htm + * CLT art. 459 § 1º, the "quinto dia útil" payroll deadline that motivates the util. + * @see Official: https://www.gov.br/trabalho-e-emprego/pt-br/assuntos/inspecao-do-trabalho/areas-de-atuacao/in-2-de-8-denovembro-de-2021.pdf + * Instrução Normativa MTP nº 2/2021, art. 14, I: Saturday counts towards that labour deadline, + * which is what `options.includeSaturday` switches on. + * @see Based on: https://unpkg.com/date-fns@4.1.0/lastDayOfMonth.js + * Reference for returning the start of the local day and for never mutating the input. The + * underlying holiday determination's official sources are cited in `isBusinessDay`/`getHolidays`. + */ +export const getNthBusinessDay = ( + date: Date, + n: number, + options?: BusinessDayOptions, +): Date | null => { + if (!isValidDate(date)) return null; + + if (!Number.isInteger(n)) return null; + + const stateCode = options?.stateCode; + + // Stryker disable next-line ConditionalExpression: isBusinessDay rejects the same non-string stateCode for every day of the month, so the walk below already returns null without this early exit; it is here to fail fast and to read like the sibling utils + if (stateCode !== undefined && typeof stateCode !== "string") return null; + + const year = date.getFullYear(); + + if (!isSupportedHolidayYear(year)) return null; + + const month = date.getMonth(); + // Stryker disable next-line EqualityOperator: when n is 0, remaining never reaches 0 below and the walk returns null from either end of the month, so > vs >= here is unobservable + const step = n > 0 ? 1 : -1; + const walk = + step === 1 + ? { from: Date.UTC(year, month, 1), until: Date.UTC(year, month + 1, 1) } + : { from: Date.UTC(year, month + 1, 0), until: Date.UTC(year, month, 0) }; + + let remaining = Math.abs(n); + + for (const candidate of eachLocalDay(walk)) { + if (isBusinessDay(candidate, options)) { + remaining -= 1; + + if (remaining === 0) return new Date(year, month, candidate.getDate()); + } + } + + return null; +}; diff --git a/src/get-service-item/get-service-item.test.ts b/src/get-service-item/get-service-item.test.ts new file mode 100644 index 000000000..e7328effb --- /dev/null +++ b/src/get-service-item/get-service-item.test.ts @@ -0,0 +1,154 @@ +import * as fc from "fast-check"; + +import { SERVICE_ITEM_DESCRIPTIONS } from "../_internals/constants/service-items"; +import { anyGarbage, PROTOTYPE_KEYS } from "../_internals/test/arbitraries"; +import { expectNeverThrows } from "../_internals/test/properties"; +import { describe, expect, expectTypeOf, it, test } from "../_internals/test/runtime"; +import { isValidServiceItem } from "../is-valid-service-item/is-valid-service-item"; +import { getServiceItem, type ServiceItem } from "./get-service-item"; + +const SYSTEMS = { code: "1.01", description: "Análise e desenvolvimento de sistemas." }; + +describe("getServiceItem", () => { + it("should return the subitem for the form the law prints", () => { + expect(getServiceItem("1.01")).toEqual(SYSTEMS); + expect(getServiceItem("1.02")).toEqual({ code: "1.02", description: "Programação." }); + }); + + it("should return the subitem for a zero padded item", () => { + expect(getServiceItem("01.01")).toEqual(SYSTEMS); + }); + + it("should return the subitem for the bare digits, the first four of a cTribNac", () => { + expect(getServiceItem("0101")).toEqual(SYSTEMS); + expect(getServiceItem("101")).toEqual(SYSTEMS); + expect(getServiceItem(101)).toEqual(SYSTEMS); + }); + + it("should return a two digit item without a leading zero in the code", () => { + expect(getServiceItem("40.01")).toEqual({ + code: "40.01", + description: "Obras de arte sob encomenda.", + }); + expect(getServiceItem(4001)).toEqual({ + code: "40.01", + description: "Obras de arte sob encomenda.", + }); + expect(getServiceItem("10.04")?.code).toBe("10.04"); + }); + + it("should return the subitem 11.05, added by the Lei Complementar 183/2021", () => { + expect(getServiceItem("11.05")?.code).toBe("11.05"); + }); + + it("should ignore surrounding whitespace", () => { + expect(getServiceItem(" 1.01\n")).toEqual(SYSTEMS); + }); + + it("should return the subitem 17.14 as the official sheet prints it, without a final period", () => { + expect(getServiceItem("17.14")).toEqual({ code: "17.14", description: "Advocacia" }); + }); + + it("should return a fresh object that does not leak the internal table", () => { + expect(getServiceItem("1.01")).not.toBe(getServiceItem("1.01")); + }); + + it("should return null for the vetoed subitems", () => { + expect(getServiceItem("3.01")).toBeNull(); + expect(getServiceItem("7.14")).toBeNull(); + expect(getServiceItem("7.15")).toBeNull(); + expect(getServiceItem("13.01")).toBeNull(); + expect(getServiceItem("17.07")).toBeNull(); + }); + + it("should return null for item 99 of the national list, which is not part of the law", () => { + expect(getServiceItem("99.01")).toBeNull(); + }); + + it("should return null for an item heading and for a 6 digit national code", () => { + expect(getServiceItem("1")).toBeNull(); + expect(getServiceItem("01")).toBeNull(); + expect(getServiceItem("010101")).toBeNull(); + expect(getServiceItem("1.01.01")).toBeNull(); + }); + + it("should return null for a subitem the list does not carry", () => { + expect(getServiceItem("1.10")).toBeNull(); + expect(getServiceItem("41.01")).toBeNull(); + expect(getServiceItem("0.01")).toBeNull(); + }); + + it("should return null for a string that is not written in a documented form", () => { + expect(getServiceItem("1.1")).toBeNull(); + expect(getServiceItem("1..01")).toBeNull(); + expect(getServiceItem("1-01")).toBeNull(); + expect(getServiceItem("1,01")).toBeNull(); + expect(getServiceItem("x1.01")).toBeNull(); + expect(getServiceItem("1.01x")).toBeNull(); + expect(getServiceItem("001.01")).toBeNull(); + }); + + it("should return null for an empty string and for whitespace only", () => { + expect(getServiceItem("")).toBeNull(); + expect(getServiceItem(" ")).toBeNull(); + }); + + it("should return null for null and undefined", () => { + // @ts-expect-error not a string or number + expect(getServiceItem(null)).toBeNull(); + // @ts-expect-error not a string or number + expect(getServiceItem()).toBeNull(); + }); + + it("should return null for a number that is not a non-negative safe integer", () => { + expect(getServiceItem(1.01)).toBeNull(); + expect(getServiceItem(-101)).toBeNull(); + expect(getServiceItem(2 ** 53)).toBeNull(); + }); + + it("should return null for the keys of Object.prototype", () => { + for (const key of PROTOTYPE_KEYS) expect(getServiceItem(key)).toBeNull(); + }); + + describe("properties", () => { + const keyArbitrary = fc.constantFrom(...Object.keys(SERVICE_ITEM_DESCRIPTIONS)); + + test("should never throw, regardless of the input", () => { + expectNeverThrows(getServiceItem, anyGarbage); + }); + + test("should resolve every subitem of the table in every documented form and agree with isValidServiceItem", () => { + fc.assert( + fc.property(keyArbitrary, (key) => { + const description = SERVICE_ITEM_DESCRIPTIONS[key]; + const padded = `${key.slice(0, 2)}.${key.slice(2)}`; + const found = getServiceItem(key); + + expect(found?.description).toBe(description); + expect(found?.code).toMatch(/^[1-9]\d?\.\d{2}$/); + expect(getServiceItem(padded)).toEqual(found); + expect(getServiceItem(Number(key))).toEqual(found); + expect(getServiceItem(found?.code ?? "")).toEqual(found); + expect(isValidServiceItem(key)).toBe(true); + }), + ); + }); + + test("should only carry items 01 to 40 and non-empty descriptions", () => { + fc.assert( + fc.property(keyArbitrary, (key) => { + expect(key).toMatch(/^(?:0[1-9]|[1-3]\d|40)\d{2}$/); + expect(SERVICE_ITEM_DESCRIPTIONS[key].trim()).not.toBe(""); + }), + ); + }); + }); +}); + +describe("getServiceItem types", () => { + test("should take a string or number and return a ServiceItem or null", () => { + expectTypeOf(getServiceItem).parameter(0).toEqualTypeOf(); + expectTypeOf(getServiceItem).returns.toEqualTypeOf(); + expectTypeOf().toEqualTypeOf<{ code: string; description: string }>(); + }); +}); diff --git a/src/get-service-item/get-service-item.ts b/src/get-service-item/get-service-item.ts new file mode 100644 index 000000000..6a3d86ed7 --- /dev/null +++ b/src/get-service-item/get-service-item.ts @@ -0,0 +1,75 @@ +import { + SERVICE_ITEM_DESCRIPTIONS, + SERVICE_ITEM_FORMAT_REGEX, +} from "../_internals/constants/service-items"; +import { isLookupCode } from "../_internals/is-lookup-code/is-lookup-code"; +import { sanitizeToDigits } from "../_internals/sanitize-to-digits/sanitize-to-digits"; + +const SUBITEM_LENGTH = 4; + +const ITEM_LENGTH = 2; + +/** A subitem of the service list annexed to the Lei Complementar 116/2003. */ +export type ServiceItem = { + /** The subitem as the law numbers it, e.g. `"1.01"` or `"17.25"`. */ + code: string; + /** The description of the subitem, as the list in force prints it. */ + description: string; +}; + +/** + * Looks a subitem up in the service list annexed to the Lei Complementar 116/2003, the list of + * the services the ISS is levied on. + * + * The law numbers a subitem as the item, a dot and two digits, `1.01` to `40.01`. It is accepted + * in that form, with a zero padded item (`"01.01"`) or as the bare digits (`"0101"`, `"101"`), + * which are the first four digits of the `cTribNac` code of the national NFS-e, and optional + * surrounding whitespace. The dot is the only separator the law ever prints between the item and + * the subitem, so unlike the codes with a printed grouping mask (`getCfop`, `getNbs`) nothing + * else is accepted in its place and `"1-01"` gives `null`. A number is only read when it is a + * non-negative safe integer, so `101` is `1.01` while the float `1.01` gives `null`: write the + * dotted form as a string. + * + * Only the subitems in force are in the table. The vetoed ones (`3.01`, `7.14`, `7.15`, `13.01` + * and `17.07`) give `null`, and so do the item headings (`"1"`), the national codes a subitem is + * split into (`"010101"`) and item 99 of the national list, which is not part of the law. + * Municipal service codes are out of scope. + * + * @param {string|number} value - The subitem to look up, e.g. `"1.01"`, `"01.01"`, `"0101"` or + * `101`. + * @returns {ServiceItem|null} The matching subitem, or null when it is unknown or invalid. + * + * @example + * ```typescript + * getServiceItem("1.01"); // { code: "1.01", description: "Análise e desenvolvimento de sistemas." } + * getServiceItem("0101"); // { code: "1.01", description: "Análise e desenvolvimento de sistemas." } + * getServiceItem("40.01"); // { code: "40.01", description: "Obras de arte sob encomenda." } + * getServiceItem("3.01"); // null (vetoed) + * getServiceItem(1.01); // null (not a non-negative safe integer) + * ``` + * + * @see Official: https://www.planalto.gov.br/ccivil_03/leis/lcp/lcp116.htm + * Lei Complementar 116/2003, "Lista de serviços anexa". + * @see Official: https://www.gov.br/nfse/pt-br/biblioteca/documentacao-tecnica/documentacao-atual + * Sistema Nacional NFS-e, `ANEXO_B-NBS2-LISTA_SERVICO_NACIONAL`, sheet `LISTA.SERV.NAC.`: the + * list in force in machine readable form, which `SERVICE_ITEM_DESCRIPTIONS` is generated from, + * and `TSCodTribNac` of `tiposSimples_v1.01.xsd`, "2 para Item (LC 116/2003), 2 para Subitem (LC + * 116/2003) e 2 para Desdobro Nacional". + */ +export const getServiceItem = (value: string | number): ServiceItem | null => { + if (!isLookupCode(value)) return null; + + const written = String(value).trim(); + + if (!SERVICE_ITEM_FORMAT_REGEX.test(written)) return null; + + const digits = sanitizeToDigits(written).padStart(SUBITEM_LENGTH, "0"); + const description = SERVICE_ITEM_DESCRIPTIONS[digits]; + + if (description === undefined) return null; + + return { + code: `${Number(digits.slice(0, ITEM_LENGTH))}.${digits.slice(ITEM_LENGTH)}`, + description, + }; +}; diff --git a/src/get-state-by-cep/constants.ts b/src/get-state-by-cep/constants.ts new file mode 100644 index 000000000..a88b89092 --- /dev/null +++ b/src/get-state-by-cep/constants.ts @@ -0,0 +1,56 @@ +import { type StateCode } from "../_internals/constants/states"; + +/** One range of CEPs assigned by the Correios to a state. */ +type CepRange = { + /** Two letter code of the state that owns the range. */ + readonly state: StateCode; + /** First CEP of the range, as a number. */ + readonly start: number; + /** Last CEP of the range, as a number. */ + readonly end: number; +}; + +/** + * CEP ranges of each state ("Faixa de CEP" per UF), as answered by the Correios "Busca Faixa de + * CEP" search when only the UF is given, in ascending order. Amazonas, Distrito Federal and Goiás + * have two ranges each: Roraima sits inside the Amazonas block and the Goiás municipalities + * around Brasília sit inside the Distrito Federal block. No range covers `00000-000` to + * `00999-999` nor `78900-000` to `78999-999`. A range is the block the state owns, not a promise + * that every CEP in it is in use: `10000-000` to `10999-999` sits unused inside the São Paulo one. + * + * @see Official: https://buscacepinter.correios.com.br/app/faixa_cep_uf_localidade/index.php + * @see Based on: https://gist.github.com/tamnil/792a6a66f6df9fc028041587cfca0c3d + * Copy of the answers of the Correios search, the rows with an empty city are the state ranges. + */ +export const CEP_RANGES: readonly CepRange[] = [ + { state: "SP", start: 1_000_000, end: 19_999_999 }, + { state: "RJ", start: 20_000_000, end: 28_999_999 }, + { state: "ES", start: 29_000_000, end: 29_999_999 }, + { state: "MG", start: 30_000_000, end: 39_999_999 }, + { state: "BA", start: 40_000_000, end: 48_999_999 }, + { state: "SE", start: 49_000_000, end: 49_999_999 }, + { state: "PE", start: 50_000_000, end: 56_999_999 }, + { state: "AL", start: 57_000_000, end: 57_999_999 }, + { state: "PB", start: 58_000_000, end: 58_999_999 }, + { state: "RN", start: 59_000_000, end: 59_999_999 }, + { state: "CE", start: 60_000_000, end: 63_999_999 }, + { state: "PI", start: 64_000_000, end: 64_999_999 }, + { state: "MA", start: 65_000_000, end: 65_999_999 }, + { state: "PA", start: 66_000_000, end: 68_899_999 }, + { state: "AP", start: 68_900_000, end: 68_999_999 }, + { state: "AM", start: 69_000_000, end: 69_299_999 }, + { state: "RR", start: 69_300_000, end: 69_399_999 }, + { state: "AM", start: 69_400_000, end: 69_899_999 }, + { state: "AC", start: 69_900_000, end: 69_999_999 }, + { state: "DF", start: 70_000_000, end: 72_799_999 }, + { state: "GO", start: 72_800_000, end: 72_999_999 }, + { state: "DF", start: 73_000_000, end: 73_699_999 }, + { state: "GO", start: 73_700_000, end: 76_799_999 }, + { state: "RO", start: 76_800_000, end: 76_999_999 }, + { state: "TO", start: 77_000_000, end: 77_999_999 }, + { state: "MT", start: 78_000_000, end: 78_899_999 }, + { state: "MS", start: 79_000_000, end: 79_999_999 }, + { state: "PR", start: 80_000_000, end: 87_999_999 }, + { state: "SC", start: 88_000_000, end: 89_999_999 }, + { state: "RS", start: 90_000_000, end: 99_999_999 }, +]; diff --git a/src/get-state-by-cep/get-state-by-cep.test.ts b/src/get-state-by-cep/get-state-by-cep.test.ts new file mode 100644 index 000000000..5c79f868f --- /dev/null +++ b/src/get-state-by-cep/get-state-by-cep.test.ts @@ -0,0 +1,188 @@ +import * as fc from "fast-check"; + +import { type State } from "../_internals/constants/states"; +import { anyGarbage, digits, digitsOfOtherLength } from "../_internals/test/arbitraries"; +import { expectNeverThrows } from "../_internals/test/properties"; +import { describe, expect, expectTypeOf, it, test } from "../_internals/test/runtime"; +import { CEP_RANGES } from "./constants"; +import { getStateByCep } from "./get-state-by-cep"; + +const RANGE_BOUNDARIES: [string, string, string][] = [ + ["SP", "01000000", "19999999"], + ["RJ", "20000000", "28999999"], + ["ES", "29000000", "29999999"], + ["MG", "30000000", "39999999"], + ["BA", "40000000", "48999999"], + ["SE", "49000000", "49999999"], + ["PE", "50000000", "56999999"], + ["AL", "57000000", "57999999"], + ["PB", "58000000", "58999999"], + ["RN", "59000000", "59999999"], + ["CE", "60000000", "63999999"], + ["PI", "64000000", "64999999"], + ["MA", "65000000", "65999999"], + ["PA", "66000000", "68899999"], + ["AP", "68900000", "68999999"], + ["AM", "69000000", "69299999"], + ["RR", "69300000", "69399999"], + ["AM", "69400000", "69899999"], + ["AC", "69900000", "69999999"], + ["DF", "70000000", "72799999"], + ["GO", "72800000", "72999999"], + ["DF", "73000000", "73699999"], + ["GO", "73700000", "76799999"], + ["RO", "76800000", "76999999"], + ["TO", "77000000", "77999999"], + ["MT", "78000000", "78899999"], + ["MS", "79000000", "79999999"], + ["PR", "80000000", "87999999"], + ["SC", "88000000", "89999999"], + ["RS", "90000000", "99999999"], +]; + +describe("getStateByCep", () => { + it("should return São Paulo for a formatted CEP of Avenida Paulista", () => { + expect(getStateByCep("01310-100")).toEqual({ + code: "SP", + name: "São Paulo", + regionCode: "SE", + regionName: "Sudeste", + ibgeCode: 35, + }); + }); + + it("should return Rio de Janeiro for a CEP given as a number", () => { + expect(getStateByCep(20_040_020)).toEqual({ + code: "RJ", + name: "Rio de Janeiro", + regionCode: "SE", + regionName: "Sudeste", + ibgeCode: 33, + }); + }); + + it("should accept the punctuated forms isValidCep accepts", () => { + expect(getStateByCep("92.500-000")?.code).toBe("RS"); + expect(getStateByCep("70 040 010")?.code).toBe("DF"); + }); + + it("should return the owner of the first and of the last CEP of every range", () => { + for (const [code, first, last] of RANGE_BOUNDARIES) { + expect(getStateByCep(first)?.code).toBe(code); + expect(getStateByCep(last)?.code).toBe(code); + } + }); + + it("should return a CEP in the middle of a range", () => { + expect(getStateByCep("69050000")?.code).toBe("AM"); + expect(getStateByCep("69650000")?.code).toBe("AM"); + expect(getStateByCep("71000000")?.code).toBe("DF"); + expect(getStateByCep("73350000")?.code).toBe("DF"); + expect(getStateByCep("72900000")?.code).toBe("GO"); + expect(getStateByCep("74000000")?.code).toBe("GO"); + }); + + it("should return the owner of the range for a CEP block no city uses", () => { + expect(getStateByCep("10000000")?.code).toBe("SP"); + expect(getStateByCep("10999999")?.code).toBe("SP"); + }); + + it("should return null for the CEPs below the first range", () => { + expect(getStateByCep("00000000")).toBeNull(); + expect(getStateByCep("00999999")).toBeNull(); + }); + + it("should return null for the gap between Mato Grosso and Mato Grosso do Sul", () => { + expect(getStateByCep("78900000")).toBeNull(); + expect(getStateByCep("78950000")).toBeNull(); + expect(getStateByCep("78999999")).toBeNull(); + }); + + it("should hold a table in ascending order whose only inner gap is the one between Mato Grosso and Mato Grosso do Sul", () => { + const steps: string[] = []; + + for (const [index, range] of CEP_RANGES.slice(1).entries()) { + const previous = CEP_RANGES[index]; + + if (range.start !== previous.end + 1) steps.push(`${previous.end}|${range.start}`); + } + + expect(steps).toEqual(["78899999|79000000"]); + expect(CEP_RANGES).toHaveLength(30); + expect(CEP_RANGES[0].start).toBe(1_000_000); + expect(CEP_RANGES.at(-1)?.end).toBe(99_999_999); + }); + + it("should return a fresh copy that does not mutate the underlying constant", () => { + const state = getStateByCep("01310100"); + if (state) Object.assign(state, { name: "X" }); + + expect(getStateByCep("01310100")?.name).toBe("São Paulo"); + }); + + it("should return null for a CEP with the wrong length", () => { + expect(getStateByCep("12345")).toBeNull(); + expect(getStateByCep("013101000")).toBeNull(); + expect(getStateByCep(1_310_100)).toBeNull(); + expect(getStateByCep("")).toBeNull(); + }); + + it("should return null for a value with a letter, not read its digits alone", () => { + expect(getStateByCep("abc01310100")).toBeNull(); + expect(getStateByCep("01310-10a")).toBeNull(); + }); + + it("should return null for a negative or a fractional number", () => { + expect(getStateByCep(-20_040_020)).toBeNull(); + expect(getStateByCep(2_004_002.5)).toBeNull(); + }); + + it("should return null for values that are not a string or a number", () => { + // @ts-expect-error: intentionally invalid input + expect(getStateByCep(null)).toBeNull(); + // @ts-expect-error: intentionally invalid input + expect(getStateByCep()).toBeNull(); + // @ts-expect-error: intentionally invalid input + expect(getStateByCep(["01310100"])).toBeNull(); + // @ts-expect-error: intentionally invalid input + expect(getStateByCep({ toString: () => "01310100" })).toBeNull(); + expect(getStateByCep("__proto__")).toBeNull(); + }); + + describe("properties", () => { + test("should never throw, regardless of the input", () => { + expectNeverThrows(getStateByCep, anyGarbage); + }); + + test("should return null for digits of any length other than 8", () => { + fc.assert( + fc.property(digitsOfOtherLength(12, [8]), (value) => { + expect(getStateByCep(value)).toBeNull(); + }), + ); + }); + + test("should answer the same for a CEP with and without its hyphen", () => { + fc.assert( + fc.property(digits(8), (cep) => { + expect(getStateByCep(`${cep.slice(0, 5)}-${cep.slice(5)}`)).toEqual(getStateByCep(cep)); + }), + ); + }); + + test("should place every CEP from 80000-000 up in the Sul region", () => { + fc.assert( + fc.property(fc.integer({ min: 80_000_000, max: 99_999_999 }), (cep) => { + expect(getStateByCep(cep)?.regionCode).toBe("S"); + }), + ); + }); + }); +}); + +describe("getStateByCep types", () => { + test("should take a string or number and return a State or null", () => { + expectTypeOf(getStateByCep).parameter(0).toEqualTypeOf(); + expectTypeOf(getStateByCep).returns.toEqualTypeOf(); + }); +}); diff --git a/src/get-state-by-cep/get-state-by-cep.ts b/src/get-state-by-cep/get-state-by-cep.ts new file mode 100644 index 000000000..9839b407f --- /dev/null +++ b/src/get-state-by-cep/get-state-by-cep.ts @@ -0,0 +1,54 @@ +import { DATA, type State } from "../_internals/constants/states"; +import { isLookupCode } from "../_internals/is-lookup-code/is-lookup-code"; +import { isValidCep } from "../is-valid-cep/is-valid-cep"; +import { parseCep } from "../parse-cep/parse-cep"; +import { CEP_RANGES } from "./constants"; + +export type { State } from "../_internals/constants/states"; + +/** + * Retrieves the Brazilian state a CEP (postal code) belongs to, from the CEP ranges the Correios + * assign to each state. It runs offline: the answer comes from the range table, not from a CEP + * API, so it says which state owns the range and not whether the CEP is in use. + * + * The value is accepted under the same rules as `isValidCep`: 8 digits, as a string or a number, + * with spaces, dots and hyphens ignored. A number cannot carry a leading zero, so a CEP of São + * Paulo that starts with `0` has to be given as a string. A number must also be a non-negative + * integer: a sign and a decimal point are not digits, so `-20040020` and `2004002.5` are rejected + * instead of being read as a CEP. + * + * Amazonas, Distrito Federal and Goiás have two ranges each. No state range covers `00000-000` to + * `00999-999` nor `78900-000` to `78999-999`, so a CEP in one of them returns `null`. Inside a + * range the answer is the owner of the range even for a CEP no city uses, such as `10000-000`. + * + * @param {string|number} value - The CEP, with or without formatting. + * @returns {State|null} The matching `State` object, or `null` when the value is not a valid CEP + * or falls outside every range. + * + * @see Official: https://buscacepinter.correios.com.br/app/faixa_cep_uf_localidade/index.php + * Correios "Busca Faixa de CEP": a search by UF alone answers the ranges of the state. + * @see Official: https://www.correios.com.br/enviar/precisa-de-ajuda/tudo-sobre-cep + * @see Based on: https://gist.github.com/tamnil/792a6a66f6df9fc028041587cfca0c3d + * Copy of the answers of the Correios search, the rows with an empty city are the state ranges. + * + * @example + * ```typescript + * getStateByCep("01310-100"); // { code: "SP", name: "São Paulo", regionCode: "SE", regionName: "Sudeste", ibgeCode: 35 } + * getStateByCep(20040020); // { code: "RJ", name: "Rio de Janeiro", regionCode: "SE", regionName: "Sudeste", ibgeCode: 33 } + * getStateByCep("69300-000")?.code; // "RR" + * getStateByCep("72800-000")?.code; // "GO" + * getStateByCep("00999-999"); // null + * getStateByCep("12345"); // null + * getStateByCep(-20040020); // null + * ``` + */ +export const getStateByCep = (value: string | number): State | null => { + if (!isLookupCode(value) || !isValidCep(value)) return null; + + const cep = Number(parseCep(value)); + + const range = CEP_RANGES.find((entry) => cep >= entry.start && cep <= entry.end); + const state = range && DATA.find((entry) => entry.code === range.state); + + return state ? { ...state } : null; +}; diff --git a/src/index.test.ts b/src/index.test.ts index 877a4bdfd..c5e3458b9 100644 --- a/src/index.test.ts +++ b/src/index.test.ts @@ -11,15 +11,22 @@ import { type CepProvider, type CertidaoInfo, type CertidaoType, + type Cest, type Cfop, + type Cid10, + type ClassTrib, type Cnae, + type CnpjInfo, type ConvertDateToWordsOptions, type ConvertNumberToWordsOptions, + type CpfInfo, + type CstIbsCbs, type FormatBoletoOptions, type FormatCaepfOptions, type FormatCeiOptions, type FormatCepOptions, type FormatCertidaoOptions, + type FormatCestOptions, type FormatCnaeOptions, type FormatLegalNatureOptions, type FormatCnhOptions, @@ -33,6 +40,8 @@ import { type FormatPhoneOptions, type FormatPisOptions, type FormatProcessoJuridicoOptions, + type FormatSuframaOptions, + type FormatVoterIdOptions, type GenerateBoletoParams, type GenerateCnpjParams, type GenerateLicensePlateFormat, @@ -44,6 +53,7 @@ import { type GetBoletoInfoOptions, type GetCepInfoByAddressOptions, type GetCepInfoByAddressParams, + type GetCnpjInfoOptions, type GetHolidaysOptions, type GetHolidaysParams, type GetLegalNaturesByCategoryOptions, @@ -54,6 +64,9 @@ import { type GetMunicipalityByNameParams, type GetMunicipalityOptions, type GetMunicipalityParams, + type GtinInfo, + type GtinLength, + type GtinType, type Holiday, type HolidayType, type IbanInfo, @@ -62,8 +75,10 @@ import { type IsValidBankAccountOptions, type IsValidBankAccountParams, type IsValidCertidaoOptions, + type IsValidClassTribOptions, type IsValidCnpjOptions, type IsValidCstOptions, + type IsValidGtinOptions, type IsValidIeParams, type IsValidMobilePhoneOptions, type IsValidPhoneOptions, @@ -73,8 +88,12 @@ import { type LegalNatureCategory, type LicensePlateFormat, type Municipality, + type Nbs, type NfeKeyInfo, type NfeKeyModel, + type NfseKeyGeneratorEnvironment, + type NfseKeyInfo, + type NfseKeyTaxIdType, type NumberToWordsGender, type ParseCnpjOptions, type ParseCurrencyOptions, @@ -86,6 +105,7 @@ import { type PixPayloadInfo, type PixPointOfInitiation, type RegistroProfissionalCouncil, + type ServiceItem, type State, type StateCode, type StandardSchemaV1, @@ -125,6 +145,8 @@ const PUBLIC = [ "formatCei", "formatCep", "formatCertidao", + "formatCest", + "formatCid10", "formatCnae", "formatCnh", "formatCno", @@ -135,12 +157,14 @@ const PUBLIC = [ "formatIban", "formatLegalNature", "formatLicensePlate", + "formatNbs", "formatNcm", "formatNfeKey", "formatPassport", "formatPhone", "formatPis", "formatProcessoJuridico", + "formatSuframa", "formatVoterId", "generateBoleto", "generateCNPJ", @@ -157,6 +181,7 @@ const PUBLIC = [ "generatePixPayload", "generateProcessoJuridico", "generateRenavam", + "generateSuframa", "generateVoterId", "getAddressInfoByCep", "getAreaCodeInfo", @@ -168,21 +193,35 @@ const PUBLIC = [ "getCbo", "getCepInfoByAddress", "getCertidaoInfo", + "getCest", "getCfop", + "getCid10", "getCities", + "getClassTrib", "getCnae", + "getCnpjInfo", + "getCpfInfo", + "getCstIbsCbs", "getFormatLicensePlate", + "getGtinInfo", "getHolidays", "getIbanInfo", + "getLastBusinessDayOfMonth", "getLegalNature", "getLegalNatures", "getLegalNaturesByCategory", "getMunicipalities", "getMunicipality", "getMunicipalityByCode", + "getNbs", + "getNextBusinessDay", "getNfeKeyInfo", + "getNfseKeyInfo", + "getNthBusinessDay", "getPixKeyInfo", "getPixPayloadInfo", + "getServiceItem", + "getStateByCep", "getStateByIbgeCode", "getStateCodeByName", "getStateNameByCode", @@ -200,7 +239,10 @@ const PUBLIC = [ "isValidCei", "isValidCep", "isValidCertidao", + "isValidCest", "isValidCfop", + "isValidCid10", + "isValidClassTrib", "isValidCnae", "isValidCnh", "isValidCno", @@ -210,7 +252,9 @@ const PUBLIC = [ "isValidCreditCard", "isValidCsosn", "isValidCst", + "isValidCstIbsCbs", "isValidEmail", + "isValidGtin", "isValidIE", "isValidIban", "isValidIe", @@ -218,8 +262,10 @@ const PUBLIC = [ "isValidLegalNature", "isValidLicensePlate", "isValidMobilePhone", + "isValidNbs", "isValidNcm", "isValidNfeKey", + "isValidNfseKey", "isValidPIS", "isValidPassport", "isValidPhone", @@ -229,16 +275,22 @@ const PUBLIC = [ "isValidProcessoJuridico", "isValidRegistroProfissional", "isValidRenavam", + "isValidServiceItem", "isValidServicePhone", + "isValidSuframa", "isValidVin", "isValidVoterId", + "obfuscateEmail", + "obfuscatePixKey", "parseBoleto", "parseCaepf", "parseCbo", "parseCei", "parseCep", "parseCertidao", + "parseCest", "parseCfop", + "parseCid10", "parseCnae", "parseCnh", "parseCno", @@ -251,10 +303,12 @@ const PUBLIC = [ "parseLicensePlate", "parseNcm", "parseNfeKey", + "parseNfseKey", "parsePassport", "parsePhone", "parsePis", "parseProcessoJuridico", + "parseSuframa", "parseVoterId", "removeAccents", "subBusinessDays", @@ -299,15 +353,22 @@ describe("Public API", () => { CepProvider: CepProvider; CertidaoInfo: CertidaoInfo; CertidaoType: CertidaoType; + Cest: Cest; Cfop: Cfop; + Cid10: Cid10; + ClassTrib: ClassTrib; Cnae: Cnae; + CnpjInfo: CnpjInfo; ConvertDateToWordsOptions: ConvertDateToWordsOptions; ConvertNumberToWordsOptions: ConvertNumberToWordsOptions; + CpfInfo: CpfInfo; + CstIbsCbs: CstIbsCbs; FormatBoletoOptions: FormatBoletoOptions; FormatCaepfOptions: FormatCaepfOptions; FormatCeiOptions: FormatCeiOptions; FormatCepOptions: FormatCepOptions; FormatCertidaoOptions: FormatCertidaoOptions; + FormatCestOptions: FormatCestOptions; FormatCnaeOptions: FormatCnaeOptions; FormatLegalNatureOptions: FormatLegalNatureOptions; FormatCnhOptions: FormatCnhOptions; @@ -321,6 +382,8 @@ describe("Public API", () => { FormatPhoneOptions: FormatPhoneOptions; FormatPisOptions: FormatPisOptions; FormatProcessoJuridicoOptions: FormatProcessoJuridicoOptions; + FormatSuframaOptions: FormatSuframaOptions; + FormatVoterIdOptions: FormatVoterIdOptions; GenerateBoletoParams: GenerateBoletoParams; GenerateCnpjParams: GenerateCnpjParams; GenerateLicensePlateFormat: GenerateLicensePlateFormat; @@ -332,6 +395,7 @@ describe("Public API", () => { GetBoletoInfoOptions: GetBoletoInfoOptions; GetCepInfoByAddressOptions: GetCepInfoByAddressOptions; GetCepInfoByAddressParams: GetCepInfoByAddressParams; + GetCnpjInfoOptions: GetCnpjInfoOptions; GetHolidaysOptions: GetHolidaysOptions; GetHolidaysParams: GetHolidaysParams; GetLegalNaturesByCategoryOptions: GetLegalNaturesByCategoryOptions; @@ -342,6 +406,9 @@ describe("Public API", () => { GetMunicipalityByNameParams: GetMunicipalityByNameParams; GetMunicipalityOptions: GetMunicipalityOptions; GetMunicipalityParams: GetMunicipalityParams; + GtinInfo: GtinInfo; + GtinLength: GtinLength; + GtinType: GtinType; Holiday: Holiday; HolidayType: HolidayType; IbanInfo: IbanInfo; @@ -350,8 +417,10 @@ describe("Public API", () => { IsValidBankAccountOptions: IsValidBankAccountOptions; IsValidBankAccountParams: IsValidBankAccountParams; IsValidCertidaoOptions: IsValidCertidaoOptions; + IsValidClassTribOptions: IsValidClassTribOptions; IsValidCnpjOptions: IsValidCnpjOptions; IsValidCstOptions: IsValidCstOptions; + IsValidGtinOptions: IsValidGtinOptions; IsValidIeParams: IsValidIeParams; IsValidMobilePhoneOptions: IsValidMobilePhoneOptions; IsValidPhoneOptions: IsValidPhoneOptions; @@ -361,8 +430,12 @@ describe("Public API", () => { LegalNatureCategory: LegalNatureCategory; LicensePlateFormat: LicensePlateFormat; Municipality: Municipality; + Nbs: Nbs; NfeKeyInfo: NfeKeyInfo; NfeKeyModel: NfeKeyModel; + NfseKeyGeneratorEnvironment: NfseKeyGeneratorEnvironment; + NfseKeyInfo: NfseKeyInfo; + NfseKeyTaxIdType: NfseKeyTaxIdType; NumberToWordsGender: NumberToWordsGender; ParseCnpjOptions: ParseCnpjOptions; ParseCurrencyOptions: ParseCurrencyOptions; @@ -374,6 +447,7 @@ describe("Public API", () => { PixPayloadInfo: PixPayloadInfo; PixPointOfInitiation: PixPointOfInitiation; RegistroProfissionalCouncil: RegistroProfissionalCouncil; + ServiceItem: ServiceItem; State: State; StateCode: StateCode; StandardSchemaV1: StandardSchemaV1; diff --git a/src/index.ts b/src/index.ts index a9e85d45f..d38cf4d55 100644 --- a/src/index.ts +++ b/src/index.ts @@ -31,6 +31,8 @@ export { type FormatCaepfOptions, formatCaepf } from "./format-caepf/format-caep export { type FormatCeiOptions, formatCei } from "./format-cei/format-cei"; export { type FormatCepOptions, formatCep } from "./format-cep/format-cep"; export { type FormatCertidaoOptions, formatCertidao } from "./format-certidao/format-certidao"; +export { type FormatCestOptions, formatCest } from "./format-cest/format-cest"; +export { formatCid10 } from "./format-cid10/format-cid10"; export { type FormatCnaeOptions, formatCnae } from "./format-cnae/format-cnae"; export { type FormatCnhOptions, formatCnh } from "./format-cnh/format-cnh"; export { type FormatCnoOptions, formatCno } from "./format-cno/format-cno"; @@ -44,6 +46,7 @@ export { formatLegalNature, } from "./format-legal-nature/format-legal-nature"; export { formatLicensePlate } from "./format-license-plate/format-license-plate"; +export { formatNbs } from "./format-nbs/format-nbs"; export { type FormatNcmOptions, formatNcm } from "./format-ncm/format-ncm"; export { type FormatNfeKeyOptions, formatNfeKey } from "./format-nfe-key/format-nfe-key"; export { formatPassport } from "./format-passport/format-passport"; @@ -53,7 +56,8 @@ export { type FormatProcessoJuridicoOptions, formatProcessoJuridico, } from "./format-processo-juridico/format-processo-juridico"; -export { formatVoterId } from "./format-voter-id/format-voter-id"; +export { type FormatSuframaOptions, formatSuframa } from "./format-suframa/format-suframa"; +export { type FormatVoterIdOptions, formatVoterId } from "./format-voter-id/format-voter-id"; export { type GenerateBoletoParams, generateBoleto } from "./generate-boleto/generate-boleto"; export { generateCep } from "./generate-cep/generate-cep"; export { generateCnh } from "./generate-cnh/generate-cnh"; @@ -76,6 +80,7 @@ export { generateProcessoJuridico, } from "./generate-processo-juridico/generate-processo-juridico"; export { generateRenavam } from "./generate-renavam/generate-renavam"; +export { generateSuframa } from "./generate-suframa/generate-suframa"; export { generateVoterId } from "./generate-voter-id/generate-voter-id"; export { type AddressInfo, @@ -111,13 +116,25 @@ export { type CertidaoType, getCertidaoInfo, } from "./get-certidao-info/get-certidao-info"; +export { type Cest, getCest } from "./get-cest/get-cest"; export { type Cfop, getCfop } from "./get-cfop/get-cfop"; +export { type Cid10, getCid10 } from "./get-cid10/get-cid10"; export { getCities } from "./get-cities/get-cities"; +export { type ClassTrib, getClassTrib } from "./get-class-trib/get-class-trib"; export { type Cnae, getCnae } from "./get-cnae/get-cnae"; +export { type CnpjInfo, getCnpjInfo, type GetCnpjInfoOptions } from "./get-cnpj-info/get-cnpj-info"; +export { type CpfInfo, getCpfInfo } from "./get-cpf-info/get-cpf-info"; +export { type CstIbsCbs, getCstIbsCbs } from "./get-cst-ibs-cbs/get-cst-ibs-cbs"; export { getFormatLicensePlate, type LicensePlateFormat, } from "./get-format-license-plate/get-format-license-plate"; +export { + type GtinInfo, + type GtinLength, + type GtinType, + getGtinInfo, +} from "./get-gtin-info/get-gtin-info"; export { type GetHolidaysParams, type Holiday, @@ -125,6 +142,7 @@ export { getHolidays, } from "./get-holidays/get-holidays"; export { type IbanInfo, getIbanInfo } from "./get-iban-info/get-iban-info"; +export { getLastBusinessDayOfMonth } from "./get-last-business-day-of-month/get-last-business-day-of-month"; export { type LegalNature, type LegalNatureCategory, @@ -143,11 +161,20 @@ export { getMunicipality, } from "./get-municipality/get-municipality"; export { getMunicipalityByCode } from "./get-municipality-by-code/get-municipality-by-code"; +export { type Nbs, getNbs } from "./get-nbs/get-nbs"; +export { getNextBusinessDay } from "./get-next-business-day/get-next-business-day"; export { type NfeKeyInfo, type NfeKeyModel, getNfeKeyInfo, } from "./get-nfe-key-info/get-nfe-key-info"; +export { getNthBusinessDay } from "./get-nth-business-day/get-nth-business-day"; +export { + type NfseKeyGeneratorEnvironment, + type NfseKeyInfo, + type NfseKeyTaxIdType, + getNfseKeyInfo, +} from "./get-nfse-key-info/get-nfse-key-info"; export { type PixKeyInfo, type PixKeyType, @@ -158,6 +185,8 @@ export { type PixPointOfInitiation, getPixPayloadInfo, } from "./get-pix-payload-info/get-pix-payload-info"; +export { type ServiceItem, getServiceItem } from "./get-service-item/get-service-item"; +export { getStateByCep } from "./get-state-by-cep/get-state-by-cep"; export { getStateByIbgeCode } from "./get-state-by-ibge-code/get-state-by-ibge-code"; export { getStateCodeByName } from "./get-state-code-by-name/get-state-code-by-name"; export { getStateNameByCode } from "./get-state-name-by-code/get-state-name-by-code"; @@ -178,7 +207,13 @@ export { type IsValidCertidaoOptions, isValidCertidao, } from "./is-valid-certidao/is-valid-certidao"; +export { isValidCest } from "./is-valid-cest/is-valid-cest"; export { isValidCfop } from "./is-valid-cfop/is-valid-cfop"; +export { isValidCid10 } from "./is-valid-cid10/is-valid-cid10"; +export { + type IsValidClassTribOptions, + isValidClassTrib, +} from "./is-valid-class-trib/is-valid-class-trib"; export { isValidCnae } from "./is-valid-cnae/is-valid-cnae"; export { isValidCnh } from "./is-valid-cnh/is-valid-cnh"; export { isValidCno } from "./is-valid-cno/is-valid-cno"; @@ -188,7 +223,9 @@ export { isValidCpf } from "./is-valid-cpf/is-valid-cpf"; export { isValidCreditCard } from "./is-valid-credit-card/is-valid-credit-card"; export { isValidCsosn } from "./is-valid-csosn/is-valid-csosn"; export { type IsValidCstOptions, isValidCst } from "./is-valid-cst/is-valid-cst"; +export { isValidCstIbsCbs } from "./is-valid-cst-ibs-cbs/is-valid-cst-ibs-cbs"; export { isValidEmail } from "./is-valid-email/is-valid-email"; +export { type IsValidGtinOptions, isValidGtin } from "./is-valid-gtin/is-valid-gtin"; export { isValidIban } from "./is-valid-iban/is-valid-iban"; export { type IsValidIeParams, isValidIe } from "./is-valid-ie/is-valid-ie"; export { isValidLandlinePhone } from "./is-valid-landline-phone/is-valid-landline-phone"; @@ -198,8 +235,10 @@ export { type IsValidMobilePhoneOptions, isValidMobilePhone, } from "./is-valid-mobile-phone/is-valid-mobile-phone"; +export { isValidNbs } from "./is-valid-nbs/is-valid-nbs"; export { isValidNcm } from "./is-valid-ncm/is-valid-ncm"; export { isValidNfeKey } from "./is-valid-nfe-key/is-valid-nfe-key"; +export { isValidNfseKey } from "./is-valid-nfse-key/is-valid-nfse-key"; export { isValidPassport } from "./is-valid-passport/is-valid-passport"; export { type IsValidPhoneOptions, @@ -217,16 +256,22 @@ export { isValidRegistroProfissional, } from "./is-valid-registro-profissional/is-valid-registro-profissional"; export { isValidRenavam } from "./is-valid-renavam/is-valid-renavam"; +export { isValidServiceItem } from "./is-valid-service-item/is-valid-service-item"; export { isValidServicePhone } from "./is-valid-service-phone/is-valid-service-phone"; +export { isValidSuframa } from "./is-valid-suframa/is-valid-suframa"; export { isValidVin } from "./is-valid-vin/is-valid-vin"; export { isValidVoterId } from "./is-valid-voter-id/is-valid-voter-id"; +export { obfuscateEmail } from "./obfuscate-email/obfuscate-email"; +export { obfuscatePixKey } from "./obfuscate-pix-key/obfuscate-pix-key"; export { parseBoleto } from "./parse-boleto/parse-boleto"; export { parseCaepf } from "./parse-caepf/parse-caepf"; export { parseCbo } from "./parse-cbo/parse-cbo"; export { parseCei } from "./parse-cei/parse-cei"; export { parseCep } from "./parse-cep/parse-cep"; export { parseCertidao } from "./parse-certidao/parse-certidao"; +export { parseCest } from "./parse-cest/parse-cest"; export { parseCfop } from "./parse-cfop/parse-cfop"; +export { parseCid10 } from "./parse-cid10/parse-cid10"; export { parseCnae } from "./parse-cnae/parse-cnae"; export { parseCnh } from "./parse-cnh/parse-cnh"; export { parseCno } from "./parse-cno/parse-cno"; @@ -239,10 +284,12 @@ export { parseLegalNature } from "./parse-legal-nature/parse-legal-nature"; export { parseLicensePlate } from "./parse-license-plate/parse-license-plate"; export { parseNcm } from "./parse-ncm/parse-ncm"; export { parseNfeKey } from "./parse-nfe-key/parse-nfe-key"; +export { parseNfseKey } from "./parse-nfse-key/parse-nfse-key"; export { parsePassport } from "./parse-passport/parse-passport"; export { parsePhone } from "./parse-phone/parse-phone"; export { parsePis } from "./parse-pis/parse-pis"; export { parseProcessoJuridico } from "./parse-processo-juridico/parse-processo-juridico"; +export { parseSuframa } from "./parse-suframa/parse-suframa"; export { parseVoterId } from "./parse-voter-id/parse-voter-id"; export { removeAccents } from "./remove-accents/remove-accents"; export { subBusinessDays } from "./sub-business-days/sub-business-days"; diff --git a/src/is-business-day/is-business-day.test.ts b/src/is-business-day/is-business-day.test.ts index 314b179c2..aab4eda88 100644 --- a/src/is-business-day/is-business-day.test.ts +++ b/src/is-business-day/is-business-day.test.ts @@ -2,7 +2,8 @@ import * as fc from "fast-check"; import { type StateCode } from "../_internals/constants/states"; import { - businessDayDates, + anyBusinessDayDate, + anyBusinessDayOptions, holidayYears, monthDays, monthIndexes, @@ -19,15 +20,6 @@ function getHolidaysFor(year: number, stateCode: StateCode | null): Holiday[] { return stateCode === null ? getHolidays(year) : getHolidays({ year, stateCode }); } -const anyStateCode = fc.oneof(fc.constantFrom(...PROTOTYPE_KEYS, "SP", "xx"), fc.anything()); -const anyIncludeOptional = fc.oneof(fc.boolean(), fc.anything()); -const hostileOptions = fc.record({ - stateCode: anyStateCode, - includeOptional: anyIncludeOptional, -}); -const anyValueInput = fc.oneof(fc.anything(), businessDayDates); -const anyOptionsInput = fc.oneof(fc.anything(), hostileOptions); - describe("isBusinessDay", () => { it("should return true for a plain weekday that is not a holiday (noon, DST-safe)", () => { expect(isBusinessDay(new Date(2024, 0, 2, 12))).toBe(true); @@ -123,6 +115,54 @@ describe("isBusinessDay", () => { }); }); + describe("includeSaturday", () => { + it("should return true for a plain Saturday when includeSaturday is true (Sat 2024-01-06, IN MTP nº 2/2021 art. 14, I)", () => { + expect(isBusinessDay(new Date(2024, 0, 6, 12), { includeSaturday: true })).toBe(true); + }); + + it("should still return false for a Sunday when includeSaturday is true (Sun 2024-01-07, the article excludes it)", () => { + expect(isBusinessDay(new Date(2024, 0, 7, 12), { includeSaturday: true })).toBe(false); + }); + + it("should still return false for a national holiday that falls on a Saturday (Sat 2024-09-07, Independência)", () => { + expect(isBusinessDay(new Date(2024, 8, 7, 12), { includeSaturday: true })).toBe(false); + }); + + it("should still return false for Finados on Saturday 2024-11-02, and true for the plain Saturday a week later", () => { + expect(isBusinessDay(new Date(2024, 10, 2, 12), { includeSaturday: true })).toBe(false); + expect(isBusinessDay(new Date(2024, 10, 9, 12), { includeSaturday: true })).toBe(true); + }); + + it("should still return false for a state holiday that falls on a Saturday (Sat 2024-11-30, Dia do Evangélico in DF)", () => { + expect( + isBusinessDay(new Date(2024, 10, 30, 12), { stateCode: "DF", includeSaturday: true }), + ).toBe(false); + expect(isBusinessDay(new Date(2024, 10, 30, 12), { includeSaturday: true })).toBe(true); + }); + + it("should leave Monday to Friday untouched (Tue 2024-01-02 is a business day, Mon 2024-01-01 is Ano novo)", () => { + expect(isBusinessDay(new Date(2024, 0, 2, 12), { includeSaturday: true })).toBe(true); + expect(isBusinessDay(new Date(2024, 0, 1, 12), { includeSaturday: true })).toBe(false); + }); + }); + + describe("no breaking change", () => { + it("should keep the Monday to Friday count when includeSaturday is absent, false or undefined (Sat 2024-01-06)", () => { + expect(isBusinessDay(new Date(2024, 0, 6, 12))).toBe(false); + expect(isBusinessDay(new Date(2024, 0, 6, 12), {})).toBe(false); + expect(isBusinessDay(new Date(2024, 0, 6, 12), { includeSaturday: false })).toBe(false); + expect(isBusinessDay(new Date(2024, 0, 6, 12), { includeSaturday: undefined })).toBe(false); + expect(isBusinessDay(new Date(2024, 0, 6, 12), { stateCode: "SP" })).toBe(false); + expect(isBusinessDay(new Date(2024, 0, 6, 12), { includeOptional: false })).toBe(false); + }); + + it("should keep the Monday to Friday count for every Saturday of January 2024 without the option (6, 13, 20 and 27)", () => { + for (const day of [6, 13, 20, 27]) { + expect(isBusinessDay(new Date(2024, 0, day, 12))).toBe(false); + } + }); + }); + describe("year boundaries", () => { it("should return false for 2024-12-31 only if it were a holiday, but treat it as a business day (Tuesday, no holiday)", () => { expect(isBusinessDay(new Date(2024, 11, 31, 12))).toBe(true); @@ -168,9 +208,9 @@ describe("isBusinessDay", () => { }); describe("properties", () => { - const stateAndOptionalArbitrary = fc.tuple(fc.option(stateCodes), fc.boolean()); + const optionsArbitrary = fc.tuple(fc.option(stateCodes), fc.boolean(), fc.boolean()); - test("should return false for every Saturday and Sunday", () => { + test("should return false for every Saturday and Sunday, and still for every Sunday when includeSaturday is true", () => { fc.assert( fc.property(holidayYears, monthIndexes, monthDays, (year, month, day) => { const date = new Date(year, month, day); @@ -178,6 +218,10 @@ describe("isBusinessDay", () => { if (date.getDay() === 0 || date.getDay() === 6) { expect(isBusinessDay(date)).toBe(false); } + + if (date.getDay() === 0) { + expect(isBusinessDay(date, { includeSaturday: true })).toBe(false); + } }), ); }); @@ -188,8 +232,8 @@ describe("isBusinessDay", () => { holidayYears, monthIndexes, monthDays, - stateAndOptionalArbitrary, - (year, month, day, [stateCode, includeOptional]) => { + optionsArbitrary, + (year, month, day, [stateCode, includeOptional, includeSaturday]) => { const date = new Date(year, month, day); const holidays = getHolidaysFor(year, stateCode); const isHolidayMatch = holidays.some( @@ -198,8 +242,12 @@ describe("isBusinessDay", () => { holiday.date.getMonth() === month && holiday.date.getDate() === day, ); - const isWeekend = date.getDay() === 0 || date.getDay() === 6; - const options = { stateCode: stateCode ?? undefined, includeOptional }; + const isWeekend = date.getDay() === 0 || (date.getDay() === 6 && !includeSaturday); + const options = { + stateCode: stateCode ?? undefined, + includeOptional, + includeSaturday, + }; expect(isBusinessDay(date, options)).toBe(!isWeekend && !isHolidayMatch); }, @@ -208,7 +256,7 @@ describe("isBusinessDay", () => { }); test("should never throw, regardless of the input, prototype chain state codes included", () => { - expectNeverThrowsWithOptions(isBusinessDay, anyValueInput, anyOptionsInput); + expectNeverThrowsWithOptions(isBusinessDay, anyBusinessDayDate, anyBusinessDayOptions); }); }); }); @@ -219,6 +267,7 @@ describe("isBusinessDay types", () => { expectTypeOf(isBusinessDay).parameter(1).toEqualTypeOf(); expectTypeOf().toEqualTypeOf(); expectTypeOf().toEqualTypeOf(); + expectTypeOf().toEqualTypeOf(); expectTypeOf(isBusinessDay).returns.toEqualTypeOf(); }); }); diff --git a/src/is-business-day/is-business-day.ts b/src/is-business-day/is-business-day.ts index a918a57d3..5a210aeec 100644 --- a/src/is-business-day/is-business-day.ts +++ b/src/is-business-day/is-business-day.ts @@ -7,21 +7,26 @@ export type { StateCode } from "../_internals/constants/states"; /** * Options shared by every business day util (`isBusinessDay`, `addBusinessDays`, - * `subBusinessDays` and `differenceInBusinessDays`): which holidays count as non-business days. + * `subBusinessDays`, `differenceInBusinessDays`, `getNextBusinessDay`, `getNthBusinessDay` and + * `getLastBusinessDayOfMonth`): which days count as business days. */ export type BusinessDayOptions = { /** Two letter state code whose state holidays are also treated as non-business days (default: national holidays only). */ stateCode?: StateCode; /** Whether optional-type holidays (`Holiday.type === "optional"`, e.g. Carnaval, Corpus Christi) count as non-business days (default: `true`). */ includeOptional?: boolean; + /** Whether Saturday counts as a business day, the labour law count of Instrução Normativa MTP nº 2/2021, art. 14, I (default: `false`, the Monday to Friday banking count). */ + includeSaturday?: boolean; }; -const WEEKEND_DAYS = new Set([0, 6]); +const SUNDAY = 0; +const SATURDAY = 6; /** * Checks whether a given date is a Brazilian business day (dia útil). * - * A day is not a business day when it falls on Saturday or Sunday, or when it is a + * A day is not a business day when it falls on Saturday or Sunday (`options.includeSaturday` + * keeps Saturday, the labour law count), or when it is a * Brazilian holiday returned by `getHolidays({ year, stateCode })` for `value`'s **local * calendar day** (its local year/month/day, as read by `Date#getFullYear`/`getMonth`/`getDate`), * the same convention used by `isHoliday`. Build `value` from local components @@ -33,6 +38,19 @@ const WEEKEND_DAYS = new Set([0, 6]); * they are not statutory holidays. Pass `false` to only treat statutory (`"national"` and * `"state"`) holidays as non-business days. * + * `options.includeSaturday` defaults to `false`, the Monday to Friday count banks and courts + * use. Pass `true` for the labour law count of the payroll deadline of CLT art. 459 § 1º ("até o + * quinto dia útil do mês subsequente ao vencido"), which the labour inspection reads through + * Instrução Normativa MTP nº 2/2021, art. 14, I: "na contagem dos dias será incluído o sábado, + * excluindo-se o domingo e o feriado, inclusive o municipal". Sunday and holidays are still + * non-business days with the option on, so a holiday that falls on a Saturday stays a + * non-business day. + * + * What `includeSaturday: true` does **not** cover: the "inclusive o municipal" part of that + * rule. `getHolidays` has national and state holidays only, so a municipal holiday is counted as + * a business day here while the labour inspection would exclude it. A count that must be exact + * for a municipality has to remove its municipal holidays on top of this option. + * * An invalid `options.stateCode` is treated in two different ways, depending on its type, the * same split `isHoliday` makes: * @@ -56,9 +74,10 @@ const WEEKEND_DAYS = new Set([0, 6]); * outside it returns `false` rather than silently treating every weekday as a business day. * * @param {Date} value - The date to check. - * @param {BusinessDayOptions} [options] - Which holidays count as non-business days. + * @param {BusinessDayOptions} [options] - Which days count as business days. * @param {StateCode} [options.stateCode] - Brazilian state code whose state holidays are also considered. * @param {boolean} [options.includeOptional] - Whether optional holidays count as non-business days (default: `true`). + * @param {boolean} [options.includeSaturday] - Whether Saturday counts as a business day (default: `false`). * @returns {boolean} True when `value` is a business day, false otherwise. Bad input also * returns false: a `value` that is not a valid `Date` (including non-`Date` values), a * `value` outside the supported 1900-2099 range, or a `stateCode` that is present and is not a @@ -69,6 +88,9 @@ const WEEKEND_DAYS = new Set([0, 6]); * isBusinessDay(new Date(2024, 0, 2)); // true (Tuesday, not a holiday) * isBusinessDay(new Date(2024, 0, 1)); // false (Ano novo) * isBusinessDay(new Date(2024, 0, 6)); // false (Saturday) + * isBusinessDay(new Date(2024, 0, 6), { includeSaturday: true }); // true (labour law count) + * isBusinessDay(new Date(2024, 8, 7), { includeSaturday: true }); // false (Independência, a holiday on a Saturday) + * isBusinessDay(new Date(2024, 0, 7), { includeSaturday: true }); // false (Sunday is never included) * isBusinessDay(new Date(2024, 1, 13)); // false (Carnaval, optional holiday, counted by default) * isBusinessDay(new Date(2024, 1, 13), { includeOptional: false }); // true * isBusinessDay(new Date(2024, 6, 9), { stateCode: "SP" }); // false (Revolução Constitucionalista) @@ -91,7 +113,17 @@ const WEEKEND_DAYS = new Set([0, 6]); * @see Official: https://www.planalto.gov.br/ccivil_03/_ato2023-2026/2023/lei/l14759.htm * Lei 14.759/2023, nationalized Dia da Consciência Negra from 2024. * @see Official: https://www.planalto.gov.br/ccivil_03/leis/l9093.htm - * Lei 9.093/1995, the framework law authorizing state and municipal holidays. + * Lei 9.093/1995, the framework law authorizing state and municipal holidays. Its art. 2º leaves + * the up to four feriados religiosos to each municipality's own law, which is why + * `includeSaturday` cannot cover the municipal part of the labour law count: `getHolidays` does + * not carry them. + * @see Official: https://www.planalto.gov.br/ccivil_03/decreto-lei/del5452.htm + * CLT art. 459 § 1º (wording given by Lei 7.855/1989), the "quinto dia útil do mês subsequente ao + * vencido" payroll deadline that `includeSaturday` exists for. + * @see Official: https://www.gov.br/trabalho-e-emprego/pt-br/assuntos/inspecao-do-trabalho/areas-de-atuacao/in-2-de-8-denovembro-de-2021.pdf + * Instrução Normativa MTP nº 2, de 8 de novembro de 2021, art. 14, I: the rule `includeSaturday` + * implements, verbatim "na contagem dos dias será incluído o sábado, excluindo-se o domingo e o + * feriado, inclusive o municipal". * @see Official: https://www.in.gov.br/web/dou/-/portaria-mgi-n-11.460-de-29-de-dezembro-de-2025-678388627 * Portaria MGI nº 11.460/2025, the federal executive's annual calendar of feriados nacionais and * pontos facultativos: the source of three of the four Easter-derived entries, namely @@ -111,7 +143,13 @@ export const isBusinessDay = (value: Date, options?: BusinessDayOptions): boolea if (!isSupportedHolidayYear(year)) return false; - if (WEEKEND_DAYS.has(value.getDay())) return false; + const day = value.getDay(); + + if (day === SUNDAY) return false; + + const includeSaturday = options?.includeSaturday ?? false; + + if (day === SATURDAY && !includeSaturday) return false; const includeOptional = options?.includeOptional ?? true; diff --git a/src/is-valid-cest/is-valid-cest.test.ts b/src/is-valid-cest/is-valid-cest.test.ts new file mode 100644 index 000000000..ec972beb8 --- /dev/null +++ b/src/is-valid-cest/is-valid-cest.test.ts @@ -0,0 +1,91 @@ +import * as fc from "fast-check"; + +import { CEST_TABLE } from "../_internals/constants/cest"; +import { anyGarbage, digitsOfOtherLength } from "../_internals/test/arbitraries"; +import { expectNeverThrows, expectRejected } from "../_internals/test/properties"; +import { describe, expect, expectTypeOf, it, test } from "../_internals/test/runtime"; +import { isValidCest } from "./is-valid-cest"; + +describe("isValidCest", () => { + it("should validate a CEST without a mask", () => { + expect(isValidCest("0100100")).toBe(true); + }); + + it("should validate a CEST in the NN.NNN.NN form", () => { + expect(isValidCest("01.001.00")).toBe(true); + expect(isValidCest("28.999.00")).toBe(true); + }); + + it("should validate a bare code that lost its leading zero, as a number or as a string", () => { + expect(isValidCest(100_100)).toBe(true); + expect(isValidCest("100100")).toBe(true); + }); + + it("should validate the specifications of an item (03.021.00 to 03.021.06)", () => { + expect(isValidCest("03.021.00")).toBe(true); + expect(isValidCest("03.021.06")).toBe(true); + expect(isValidCest("03.021.07")).toBe(false); + }); + + it("should reject a revoked item", () => { + expect(isValidCest("03.001.00")).toBe(false); + expect(isValidCest("01.110.00")).toBe(false); + expect(isValidCest("10.023.00")).toBe(false); + }); + + it("should reject an unknown code", () => { + expect(isValidCest("0000000")).toBe(false); + expect(isValidCest("9999999")).toBe(false); + }); + + it("should reject a value that is not a documented form", () => { + expect(isValidCest("")).toBe(false); + expect(isValidCest("abc0100100")).toBe(false); + expect(isValidCest("01.001.00.")).toBe(false); + expect(isValidCest("1.001.00")).toBe(false); + }); + + it("should reject a number that is not a non-negative safe integer", () => { + expect(isValidCest(-100_100)).toBe(false); + expect(isValidCest(10_010.5)).toBe(false); + }); + + it("should reject values that are not a string or a number", () => { + // @ts-expect-error not a string or number + expect(isValidCest(null)).toBe(false); + // @ts-expect-error not a string or number + expect(isValidCest()).toBe(false); + // @ts-expect-error not a string or number + expect(isValidCest({ toString: () => "0100100" })).toBe(false); + }); + + describe("properties", () => { + const codeArbitrary = fc.constantFrom(...Object.keys(CEST_TABLE)); + + test("should never throw, regardless of the input", () => { + expectNeverThrows(isValidCest, anyGarbage); + }); + + test("should validate every known code, with or without the mask", () => { + fc.assert( + fc.property(codeArbitrary, (code) => { + const masked = `${code.slice(0, 2)}.${code.slice(2, 5)}.${code.slice(5)}`; + + expect(isValidCest(code)).toBe(true); + expect(isValidCest(masked)).toBe(true); + }), + ); + }); + + test("should reject every digit string longer than a CEST", () => { + expectRejected(isValidCest, digitsOfOtherLength(12, [0, 1, 2, 3, 4, 5, 6, 7])); + }); + }); +}); + +describe("isValidCest types", () => { + test("should take a string or number and return a boolean", () => { + expectTypeOf(isValidCest).parameter(0).toEqualTypeOf(); + expectTypeOf(isValidCest).returns.toEqualTypeOf(); + }); +}); diff --git a/src/is-valid-cest/is-valid-cest.ts b/src/is-valid-cest/is-valid-cest.ts new file mode 100644 index 000000000..b74208836 --- /dev/null +++ b/src/is-valid-cest/is-valid-cest.ts @@ -0,0 +1,40 @@ +import { getCest } from "../get-cest/get-cest"; + +/** + * Validates if a CEST (Código Especificador da Substituição Tributária) is listed in the annexes + * of Convênio ICMS 142/18. + * + * The table is Anexos II to XXVI of the consolidated text in force (last amended by Convênio + * ICMS 180/24). Only the items in force count: a revoked item (`"03.001.00"`) is rejected. The + * check is about the code alone, it does not tell whether the code suits a given NCM or whether + * a state applies the regime to it. + * + * A string is only read as a code when it is written in one of the documented forms: the 7 + * digits, or the `NN.NNN.NN` form the annexes print, with a single separator (space, `.`, `-` + * or `/`) between the groups and optional surrounding whitespace. A number is only read as a + * code when it is a non-negative safe integer. + * + * The leading zero of segments 01 to 09 is part of the code, so a value written as bare digits + * is left padded with zeros to 7 whether it comes as a string or as a number: `100100`, + * `"100100"` and `"0100100"` are the same code. + * + * @param {string|number} value - The CEST to be validated, with or without the `NN.NNN.NN` + * mask, e.g. `"01.001.00"`, `"0100100"` or `100100`. + * @returns {boolean} True when the code is a 7 digit CEST in force, false otherwise. + * + * @example + * ```typescript + * isValidCest("01.001.00"); // true + * isValidCest("0100100"); // true + * isValidCest(100100); // true (padded to 7 digits, so this is "0100100") + * isValidCest("03.001.00"); // false (a revoked item) + * isValidCest("0000000"); // false + * isValidCest("abc0100100"); // false (not a documented form) + * isValidCest(-100100); // false (not a non-negative safe integer) + * ``` + * + * @see Official: https://www.confaz.fazenda.gov.br/legislacao/convenios/2018/CV142_18 + * Convênio ICMS 142/18, the consolidated text: cláusula sexta, IV (the 7 digits) and Anexos II + * to XXVI (the codes). + */ +export const isValidCest = (value: string | number): boolean => getCest(value) !== null; diff --git a/src/is-valid-cid10/is-valid-cid10.test.ts b/src/is-valid-cid10/is-valid-cid10.test.ts new file mode 100644 index 000000000..bd36ccb5b --- /dev/null +++ b/src/is-valid-cid10/is-valid-cid10.test.ts @@ -0,0 +1,135 @@ +import * as fc from "fast-check"; + +import { CID10_SUBCATEGORIES } from "../_internals/constants/cid10"; +import { CID10_DESCRIPTIONS } from "../_internals/constants/cid10-descriptions"; +import { anyGarbage, PROTOTYPE_KEYS } from "../_internals/test/arbitraries"; +import { expectNeverThrows } from "../_internals/test/properties"; +import { describe, expect, expectTypeOf, it, test } from "../_internals/test/runtime"; +import { isValidCid10 } from "./is-valid-cid10"; + +describe("isValidCid10", () => { + it("should validate a subcategory written with the dot", () => { + expect(isValidCid10("A00.0")).toBe(true); + expect(isValidCid10("A00.1")).toBe(true); + expect(isValidCid10("A00.9")).toBe(true); + }); + + it("should validate a subcategory written without the dot", () => { + expect(isValidCid10("A000")).toBe(true); + expect(isValidCid10("F322")).toBe(true); + }); + + it("should validate a category, subdivided or not", () => { + expect(isValidCid10("A00")).toBe(true); + expect(isValidCid10("I10")).toBe(true); + }); + + it("should validate the first and the last code of the table", () => { + expect(isValidCid10("A00")).toBe(true); + expect(isValidCid10("Z99.9")).toBe(true); + }); + + it("should ignore the letter case and surrounding whitespace", () => { + expect(isValidCid10("m54.5")).toBe(true); + expect(isValidCid10(" M545 ")).toBe(true); + }); + + it("should reject a subcategory its category does not have", () => { + expect(isValidCid10("A00.2")).toBe(false); + expect(isValidCid10("A00.5")).toBe(false); + expect(isValidCid10("A008")).toBe(false); + }); + + it("should reject any subcategory of a category that is not subdivided", () => { + expect(isValidCid10("I10.0")).toBe(false); + expect(isValidCid10("I109")).toBe(false); + }); + + it("should reject a category the table does not have", () => { + expect(isValidCid10("A10")).toBe(false); + expect(isValidCid10("A10.0")).toBe(false); + expect(isValidCid10("U07.1")).toBe(false); + }); + + it("should reject a value that is not written in a documented form", () => { + expect(isValidCid10("")).toBe(false); + expect(isValidCid10(" ")).toBe(false); + expect(isValidCid10("A0")).toBe(false); + expect(isValidCid10("A00-0")).toBe(false); + expect(isValidCid10("A00.00")).toBe(false); + expect(isValidCid10("A00.0 Cólera")).toBe(false); + }); + + it("should reject the keys of Object.prototype", () => { + for (const key of PROTOTYPE_KEYS) { + expect(isValidCid10(key)).toBe(false); + } + }); + + it("should reject a value that is not a string", () => { + // @ts-expect-error not a string + expect(isValidCid10(null)).toBe(false); + // @ts-expect-error not a string + expect(isValidCid10()).toBe(false); + // @ts-expect-error not a string + expect(isValidCid10(100)).toBe(false); + // @ts-expect-error not a string + expect(isValidCid10(["A00"])).toBe(false); + }); + + describe("the code table", () => { + it("should hold exactly the codes the description table holds", () => { + const codes: string[] = []; + + for (const [category, subcategories] of Object.entries(CID10_SUBCATEGORIES)) { + codes.push(category); + + for (const subcategory of subcategories) codes.push(category + subcategory); + } + + expect(codes.toSorted()).toEqual(Object.keys(CID10_DESCRIPTIONS).toSorted()); + }); + + it("should hold the 2045 categories and 12188 subcategories of CID-10 V2008", () => { + const codes = Object.keys(CID10_DESCRIPTIONS); + + expect(codes.filter((code) => code.length === 3)).toHaveLength(2045); + expect(codes.filter((code) => code.length === 4)).toHaveLength(12_188); + }); + }); + + describe("properties", () => { + const codeArbitrary = fc.constantFrom(...Object.keys(CID10_DESCRIPTIONS)); + + test("should never throw, regardless of the input", () => { + expectNeverThrows(isValidCid10, anyGarbage); + }); + + test("should validate every known code, in either case", () => { + fc.assert( + fc.property(codeArbitrary, (code) => { + expect(isValidCid10(code)).toBe(true); + expect(isValidCid10(code.toLowerCase())).toBe(true); + }), + ); + }); + + test("should validate every known subcategory with the dot", () => { + fc.assert( + fc.property( + codeArbitrary.filter((code) => code.length === 4), + (code) => { + expect(isValidCid10(`${code.slice(0, 3)}.${code.slice(3)}`)).toBe(true); + }, + ), + ); + }); + }); +}); + +describe("isValidCid10 types", () => { + test("should take a string and return a boolean", () => { + expectTypeOf(isValidCid10).parameter(0).toEqualTypeOf(); + expectTypeOf(isValidCid10).returns.toEqualTypeOf(); + }); +}); diff --git a/src/is-valid-cid10/is-valid-cid10.ts b/src/is-valid-cid10/is-valid-cid10.ts new file mode 100644 index 000000000..d6c7969fa --- /dev/null +++ b/src/is-valid-cid10/is-valid-cid10.ts @@ -0,0 +1,46 @@ +import { CID10_SUBCATEGORIES } from "../_internals/constants/cid10"; +import { normalizeCid10 } from "../_internals/normalize-cid10/normalize-cid10"; + +const CATEGORY_LENGTH = 3; + +/** + * Validates if a CID-10 (Classificação Internacional de Doenças, 10th revision) code exists in + * the Brazilian Portuguese tables DATASUS publishes. + * + * Both levels of the classification are valid: the 3 character categories (`A00`) and the 4 + * character subcategories, written with the dot medical certificates print (`A00.0`) or without + * it, the form the DATASUS tables store (`A000`). Letter case and surrounding whitespace are + * ignored. Anything else (`"A00-0"`, `"A00.00"`, a dagger or asterisk suffix, a value that is + * not a string) is rejected. + * + * The check reads a table of codes only, so it does not cost the descriptions `getCid10` + * carries. The tables are the CID-10 V2008 files, the revision DATASUS publishes as CSV: a code + * that is not in those files, such as `U07.1` (COVID-19), is not valid here. + * + * @param {string} value - The CID-10 code to be validated, e.g. `"A00.0"`, `"A000"` or `"A00"`. + * @returns {boolean} True when the code is a known category or subcategory, false otherwise. + * + * @example + * ```typescript + * isValidCid10("A00.0"); // true + * isValidCid10("a000"); // true + * isValidCid10("A00"); // true + * isValidCid10("A00.5"); // false (A00 has no subcategory 5) + * isValidCid10("A00-0"); // false (not a documented form) + * ``` + * + * @see Official: http://www2.datasus.gov.br/cid10/V2008/downloads/CID10CSV.zip + * The CID-10 tables in CSV (`CID-10-CATEGORIAS.CSV` and `CID-10-SUBCATEGORIAS.CSV`), as + * published by DATASUS (Ministério da Saúde). + * @see Official: http://www2.datasus.gov.br/cid10/V2008/descrcsv.htm + * The DATASUS page that links the archive and documents its files, columns and encoding. + */ +export const isValidCid10 = (value: string): boolean => { + const code = normalizeCid10(value); + const category = code.slice(0, CATEGORY_LENGTH); + + return ( + Object.hasOwn(CID10_SUBCATEGORIES, category) && + CID10_SUBCATEGORIES[category].includes(code.slice(CATEGORY_LENGTH)) + ); +}; diff --git a/src/is-valid-class-trib/is-valid-class-trib.test.ts b/src/is-valid-class-trib/is-valid-class-trib.test.ts new file mode 100644 index 000000000..8cb7adbb3 --- /dev/null +++ b/src/is-valid-class-trib/is-valid-class-trib.test.ts @@ -0,0 +1,179 @@ +import * as fc from "fast-check"; + +import { CLASS_TRIB_CODES } from "../_internals/constants/ibs-cbs"; +import { anyGarbage, digitsOfOtherLength } from "../_internals/test/arbitraries"; +import { expectNeverThrowsWithOptions } from "../_internals/test/properties"; +import { describe, expect, expectTypeOf, it, test } from "../_internals/test/runtime"; +import { isValidClassTrib, type IsValidClassTribOptions } from "./is-valid-class-trib"; + +describe("isValidClassTrib", () => { + it("should validate a known code, the first and the last of the table included", () => { + expect(isValidClassTrib("000001")).toBe(true); + expect(isValidClassTrib("200001")).toBe(true); + expect(isValidClassTrib("410999")).toBe(true); + expect(isValidClassTrib("830001")).toBe(true); + }); + + it("should validate a code given as a number", () => { + expect(isValidClassTrib(200_001)).toBe(true); + }); + + it("should pad a value with leading zeros, as a number or as a string", () => { + expect(isValidClassTrib(1)).toBe(true); + expect(isValidClassTrib("1")).toBe(true); + expect(isValidClassTrib(10_001)).toBe(true); + expect(isValidClassTrib("11001")).toBe(true); + }); + + it("should validate a code with surrounding whitespace", () => { + expect(isValidClassTrib(" 200001 ")).toBe(true); + }); + + it("should validate the codes Informe Técnico 2025.002 v.1.50 and v.1.60 created", () => { + expect(isValidClassTrib("000005")).toBe(true); + expect(isValidClassTrib("200054")).toBe(true); + expect(isValidClassTrib("410036")).toBe(true); + expect(isValidClassTrib("410037")).toBe(true); + expect(isValidClassTrib("550024")).toBe(true); + expect(isValidClassTrib("550025")).toBe(true); + expect(isValidClassTrib("620007")).toBe(true); + expect(isValidClassTrib("221002")).toBe(true); + expect(isValidClassTrib("221003")).toBe(true); + expect(isValidClassTrib("221004")).toBe(true); + }); + + it("should reject the classifications of CST 220 Informe Técnico 2025.002 v.1.60 excluded", () => { + expect(isValidClassTrib("220001")).toBe(false); + expect(isValidClassTrib("220002")).toBe(false); + expect(isValidClassTrib("220003")).toBe(false); + }); + + it("should return false for a 6 digit code the table does not carry", () => { + expect(isValidClassTrib("999999")).toBe(false); + expect(isValidClassTrib("200000")).toBe(false); + expect(isValidClassTrib("000000")).toBe(false); + expect(isValidClassTrib(0)).toBe(false); + }); + + it("should return false for a value wider than 6 digits and for a CST alone", () => { + expect(isValidClassTrib("2000010")).toBe(false); + expect(isValidClassTrib("0200001")).toBe(false); + expect(isValidClassTrib("200")).toBe(false); + }); + + it("should return false for a string that is not bare digits", () => { + expect(isValidClassTrib("c200001")).toBe(false); + expect(isValidClassTrib("200.001")).toBe(false); + expect(isValidClassTrib("200 001")).toBe(false); + expect(isValidClassTrib("")).toBe(false); + expect(isValidClassTrib(" ")).toBe(false); + }); + + it("should return false for a number that is not a non-negative safe integer", () => { + expect(isValidClassTrib(-200_001)).toBe(false); + expect(isValidClassTrib(200_001.5)).toBe(false); + expect(isValidClassTrib(2 ** 53)).toBe(false); + }); + + it("should return false for a value that is not a string or a number", () => { + // @ts-expect-error not a string or number + expect(isValidClassTrib(null)).toBe(false); + // @ts-expect-error not a string or number + expect(isValidClassTrib()).toBe(false); + // @ts-expect-error not a string or number + expect(isValidClassTrib(["200001"])).toBe(false); + }); + + describe("options.cst", () => { + it("should accept a classification together with the CST it belongs to", () => { + expect(isValidClassTrib("200001", { cst: "200" })).toBe(true); + expect(isValidClassTrib("410999", { cst: 410 })).toBe(true); + expect(isValidClassTrib("620007", { cst: " 620 " })).toBe(true); + }); + + it("should pad the CST the way the code is padded", () => { + expect(isValidClassTrib(1, { cst: 0 })).toBe(true); + expect(isValidClassTrib("010001", { cst: 10 })).toBe(true); + expect(isValidClassTrib("011001", { cst: "11" })).toBe(true); + }); + + it("should reject a classification together with another CST (rejection 1024)", () => { + expect(isValidClassTrib("200001", { cst: "000" })).toBe(false); + expect(isValidClassTrib("000001", { cst: "200" })).toBe(false); + expect(isValidClassTrib("010001", { cst: "011" })).toBe(false); + }); + + it("should reject an unknown classification even when its first digits are the CST", () => { + expect(isValidClassTrib("200999", { cst: "200" })).toBe(false); + expect(isValidClassTrib("220001", { cst: "220" })).toBe(false); + }); + + it("should reject a CST that is not written as a code", () => { + expect(isValidClassTrib("200001", { cst: "" })).toBe(false); + expect(isValidClassTrib("200001", { cst: "2" })).toBe(false); + expect(isValidClassTrib("200001", { cst: "200001" })).toBe(false); + expect(isValidClassTrib("200001", { cst: "cst200" })).toBe(false); + expect(isValidClassTrib("200001", { cst: -200 })).toBe(false); + }); + + it("should reject a CST that is not a string or a number", () => { + // @ts-expect-error not a string or number + expect(isValidClassTrib("200001", { cst: null })).toBe(false); + // @ts-expect-error not a string or number + expect(isValidClassTrib("200001", { cst: ["200"] })).toBe(false); + // @ts-expect-error not a string or number + expect(isValidClassTrib("200001", { cst: true })).toBe(false); + }); + + it("should check the cClassTrib alone when the CST is omitted", () => { + expect(isValidClassTrib("200001", {})).toBe(true); + expect(isValidClassTrib("200001", { cst: undefined })).toBe(true); + expect(isValidClassTrib("999999", {})).toBe(false); + }); + }); + + it("should return false when options is not an object", () => { + // @ts-expect-error not an options object + expect(isValidClassTrib("200001", null)).toBe(false); + // @ts-expect-error not an options object + expect(isValidClassTrib("200001", "200")).toBe(false); + }); + + describe("properties", () => { + const codeArbitrary = fc.constantFrom(...CLASS_TRIB_CODES); + + test("should never throw, regardless of the input and the options", () => { + expectNeverThrowsWithOptions(isValidClassTrib, anyGarbage, anyGarbage); + expectNeverThrowsWithOptions(isValidClassTrib, codeArbitrary, fc.record({ cst: anyGarbage })); + }); + + test("should validate every code of the table, alone and with its first 3 digits as the CST", () => { + fc.assert( + fc.property(codeArbitrary, (code) => { + expect(isValidClassTrib(code)).toBe(true); + expect(isValidClassTrib(Number(code))).toBe(true); + expect(isValidClassTrib(code, { cst: code.slice(0, 3) })).toBe(true); + }), + ); + }); + + test("should reject every digit string that is empty or wider than 6 digits", () => { + fc.assert( + fc.property(digitsOfOtherLength(12, [1, 2, 3, 4, 5, 6]), (value) => { + expect(isValidClassTrib(value)).toBe(false); + }), + ); + }); + }); +}); + +describe("isValidClassTrib types", () => { + test("should take a string or number plus options and return a boolean", () => { + expectTypeOf(isValidClassTrib).parameter(0).toEqualTypeOf(); + expectTypeOf(isValidClassTrib) + .parameter(1) + .toEqualTypeOf(); + expectTypeOf(isValidClassTrib).returns.toEqualTypeOf(); + expectTypeOf().toEqualTypeOf<{ cst?: string | number }>(); + }); +}); diff --git a/src/is-valid-class-trib/is-valid-class-trib.ts b/src/is-valid-class-trib/is-valid-class-trib.ts new file mode 100644 index 000000000..977c3faf1 --- /dev/null +++ b/src/is-valid-class-trib/is-valid-class-trib.ts @@ -0,0 +1,91 @@ +import { + CLASS_TRIB_CODES, + CLASS_TRIB_FORMAT_REGEX, + CLASS_TRIB_LENGTH, + CST_IBS_CBS_LENGTH, +} from "../_internals/constants/ibs-cbs"; +import { isLookupCode } from "../_internals/is-lookup-code/is-lookup-code"; +import { padLookupCode } from "../_internals/pad-lookup-code/pad-lookup-code"; + +/** + * Options for `isValidClassTrib`. + */ +export type IsValidClassTribOptions = { + /** + * The CST-IBS/CBS the document carries next to the cClassTrib. When given, the classification + * also has to belong to it (its first 3 digits); omit it to check the cClassTrib alone. + */ + cst?: string | number; +}; + +/** + * Validates if a cClassTrib (Código de Classificação Tributária do IBS e da CBS) exists in the + * official table, the check behind the rejection 1023 "Classificação Tributária do IBS/CBS + * informada inexistente" of the NF-e. + * + * A document carries the cClassTrib next to a CST-IBS/CBS and the pair has to match: every + * classification belongs to one CST, the first 3 digits of its code. Pass that CST as + * `options.cst` to check the pair too, the rejection 1024 "Classificação Tributária do IBS e da + * CBS incompatível com o CST informado". A `cst` that is given and is not the CST of the + * classification, whatever it is, makes the result false. + * + * Only the classifications in force count: one the Informe Técnico excluded by closing its + * validity (220001, 220002 and 220003 in v.1.60) is rejected. Only the code list is bundled with + * this function, not the descriptions `getClassTrib` returns. + * + * A string is only read as a code when it is written as bare digits, with optional surrounding + * whitespace: the field has no mask, so anything else (`"c200001"`) is rejected instead of + * having its digits picked out. A number is only read as a code when it is a non-negative safe + * integer. A value narrower than 6 digits is left padded with zeros, as a string or as a number, + * since the codes start with zeros a numeric field drops: `1`, `"1"` and `"000001"` are all the + * code `000001`. `options.cst` is read the same way, padded to 3 digits. + * + * @param {string|number} value - The cClassTrib to be validated, e.g. `"200001"` or `200001`. + * @param {IsValidClassTribOptions} [options] - The CST-IBS/CBS the code has to belong to. + * @returns {boolean} True when the code is in the cClassTrib table and, when `options.cst` is + * given, belongs to that CST; false otherwise. + * + * @example + * ```typescript + * isValidClassTrib("200001"); // true + * isValidClassTrib(1); // true (padded to "000001") + * isValidClassTrib("200001", { cst: "200" }); // true + * isValidClassTrib("200001", { cst: "000" }); // false (the classification belongs to CST 200) + * isValidClassTrib("999999"); // false + * isValidClassTrib("220001"); // false (excluded by Informe Técnico 2025.002 v.1.60) + * isValidClassTrib("c200001"); // false (not a documented form) + * ``` + * + * @see Official: https://www.nfe.fazenda.gov.br/portal/listaConteudo.aspx?tipoConteudo=/NJarYc9nus= + * "Documentos" > "Diversos" of the Portal Nacional da NF-e, which publishes every version of the + * "Tabela de Classificação Tributária do IBS e CBS" workbook (sheets CST and cClassTrib). + * @see Official: https://www.nfe.fazenda.gov.br/portal/listaConteudo.aspx?tipoConteudo=hXzemuyNHW4= + * Informe Técnico 2025.002 (v.1.60 of 22/06/2026), which divulges both tables, defines their + * columns and states that the first three digits of a cClassTrib are its CST-IBS/CBS. + * @see Official: https://www.nfe.fazenda.gov.br/portal/listaConteudo.aspx?tipoConteudo=04BIflQt1aY= + * Nota Técnica 2025.002-RTC (v.1.51), fields UB13 `CST` (N, 3 digits) and UB14 `cClassTrib` (N, + * 6 digits) and the rejections 1020 (unknown CST), 1023 (unknown cClassTrib) and 1024 + * (cClassTrib incompatible with the CST). + * @see Official: https://dfe-portal.svrs.rs.gov.br/DFE/TabelaClassificacaoTributaria + * The same tables online, on the Portal dos Documentos Fiscais Eletrônicos (SVRS). + * @see Official: https://www.planalto.gov.br/ccivil_03/leis/lcp/lcp214.htm + * Lei Complementar nº 214/2025, which institutes the IBS and the CBS. + */ +export const isValidClassTrib = ( + value: string | number, + options?: IsValidClassTribOptions, +): boolean => { + if (!isLookupCode(value)) return false; + if (options !== undefined && (options === null || typeof options !== "object")) return false; + + const code = padLookupCode(value, CLASS_TRIB_LENGTH); + + if (!CLASS_TRIB_FORMAT_REGEX.test(code) || !CLASS_TRIB_CODES.includes(code)) return false; + + const cst = options?.cst; + + if (cst === undefined) return true; + if (!isLookupCode(cst)) return false; + + return code.slice(0, CST_IBS_CBS_LENGTH) === padLookupCode(cst, CST_IBS_CBS_LENGTH); +}; diff --git a/src/is-valid-cnpj/is-valid-cnpj.ts b/src/is-valid-cnpj/is-valid-cnpj.ts index 8709c8312..34730ed78 100644 --- a/src/is-valid-cnpj/is-valid-cnpj.ts +++ b/src/is-valid-cnpj/is-valid-cnpj.ts @@ -1,5 +1,9 @@ import { calculateCnpjCheckDigit } from "../_internals/calculate-cnpj-check-digit/calculate-cnpj-check-digit"; -import { CNPJ_FIRST_DIGIT_WEIGHTS, CNPJ_SECOND_DIGIT_WEIGHTS } from "../_internals/constants/cnpj"; +import { + CNPJ_FIRST_DIGIT_WEIGHTS, + CNPJ_LETTER_REGEX, + CNPJ_SECOND_DIGIT_WEIGHTS, +} from "../_internals/constants/cnpj"; import { isRepeatedDigits } from "../_internals/is-repeated-digits/is-repeated-digits"; import { sanitizeToAlphanumeric } from "../_internals/sanitize-to-alphanumeric/sanitize-to-alphanumeric"; import { sanitizeToDigits } from "../_internals/sanitize-to-digits/sanitize-to-digits"; @@ -15,8 +19,6 @@ const FORMAT_REGEX = const NUMERIC_FORMAT_REGEX = /^\d{2}[\s.\-/]*\d{3}[\s.\-/]*\d{3}[\s.\-/]*\d{4}[\s.\-/]*\d{2}$/; -const LETTER_REGEX = /[A-Z]/; - const isValidChecksum = (cnpj: string): boolean => cnpj.charCodeAt(12) - 48 === calculateCnpjCheckDigit(cnpj, CNPJ_FIRST_DIGIT_WEIGHTS) && cnpj.charCodeAt(13) - 48 === calculateCnpjCheckDigit(cnpj, CNPJ_SECOND_DIGIT_WEIGHTS); @@ -64,7 +66,7 @@ export const isValidCnpj = (cnpj: string, options?: IsValidCnpjOptions): boolean if (options?.version === 2) { const cleaned = sanitizeToAlphanumeric(cnpj); - if (LETTER_REGEX.test(cleaned)) { + if (CNPJ_LETTER_REGEX.test(cleaned)) { return FORMAT_REGEX.test(trimmed.toUpperCase()) && isValidChecksum(cleaned); } } diff --git a/src/is-valid-cst-ibs-cbs/is-valid-cst-ibs-cbs.test.ts b/src/is-valid-cst-ibs-cbs/is-valid-cst-ibs-cbs.test.ts new file mode 100644 index 000000000..4fa44ef95 --- /dev/null +++ b/src/is-valid-cst-ibs-cbs/is-valid-cst-ibs-cbs.test.ts @@ -0,0 +1,130 @@ +import * as fc from "fast-check"; + +import { CST_IBS_CBS_TABLE } from "../_internals/constants/ibs-cbs"; +import { anyGarbage, digitsOfOtherLength } from "../_internals/test/arbitraries"; +import { expectNeverThrows } from "../_internals/test/properties"; +import { describe, expect, expectTypeOf, it, test } from "../_internals/test/runtime"; +import { isValidCstIbsCbs } from "./is-valid-cst-ibs-cbs"; + +describe("isValidCstIbsCbs", () => { + it("should validate the 18 codes of the CST table published on 23/06/2026", () => { + const codes = [ + "000", + "010", + "011", + "200", + "220", + "221", + "222", + "400", + "410", + "510", + "515", + "550", + "620", + "800", + "810", + "811", + "820", + "830", + ]; + + expect(codes.filter((code) => isValidCstIbsCbs(code))).toEqual(codes); + }); + + it("should validate a code given as a number", () => { + expect(isValidCstIbsCbs(200)).toBe(true); + expect(isValidCstIbsCbs(830)).toBe(true); + }); + + it("should pad a value with leading zeros, as a number or as a string", () => { + expect(isValidCstIbsCbs(0)).toBe(true); + expect(isValidCstIbsCbs("0")).toBe(true); + expect(isValidCstIbsCbs(10)).toBe(true); + expect(isValidCstIbsCbs("11")).toBe(true); + }); + + it("should validate a code with surrounding whitespace", () => { + expect(isValidCstIbsCbs(" 410 ")).toBe(true); + }); + + it("should keep CST 220 valid, which the CST table still lists after its classifications were excluded", () => { + expect(isValidCstIbsCbs("220")).toBe(true); + }); + + it("should return false for a 3 digit code the table does not carry", () => { + expect(isValidCstIbsCbs("100")).toBe(false); + expect(isValidCstIbsCbs("999")).toBe(false); + expect(isValidCstIbsCbs(20)).toBe(false); + }); + + it("should return false for an ICMS, IPI, PIS or COFINS CST", () => { + expect(isValidCstIbsCbs("060")).toBe(false); + expect(isValidCstIbsCbs("49")).toBe(false); + }); + + it("should return false for a wider value, a cClassTrib included", () => { + expect(isValidCstIbsCbs("0000")).toBe(false); + expect(isValidCstIbsCbs("200001")).toBe(false); + }); + + it("should return false for a string that is not bare digits", () => { + expect(isValidCstIbsCbs("cst200")).toBe(false); + expect(isValidCstIbsCbs("2.00")).toBe(false); + expect(isValidCstIbsCbs("200\n1")).toBe(false); + expect(isValidCstIbsCbs("")).toBe(false); + expect(isValidCstIbsCbs(" ")).toBe(false); + }); + + it("should return false for a number that is not a non-negative safe integer", () => { + expect(isValidCstIbsCbs(-200)).toBe(false); + expect(isValidCstIbsCbs(20.5)).toBe(false); + expect(isValidCstIbsCbs(2 ** 53)).toBe(false); + }); + + it("should return false for a value that is not a string or a number", () => { + // @ts-expect-error not a string or number + expect(isValidCstIbsCbs(null)).toBe(false); + // @ts-expect-error not a string or number + expect(isValidCstIbsCbs()).toBe(false); + // @ts-expect-error not a string or number + expect(isValidCstIbsCbs(["200"])).toBe(false); + }); + + it("should return false for a key of the prototype chain", () => { + expect(isValidCstIbsCbs("__proto__")).toBe(false); + expect(isValidCstIbsCbs("constructor")).toBe(false); + }); + + describe("properties", () => { + const codeArbitrary = fc.constantFrom(...Object.keys(CST_IBS_CBS_TABLE)); + + test("should never throw, regardless of the input", () => { + expectNeverThrows(isValidCstIbsCbs, anyGarbage); + }); + + test("should validate every code of the table, as a string or a number", () => { + fc.assert( + fc.property(codeArbitrary, (code) => { + expect(isValidCstIbsCbs(code)).toBe(true); + expect(isValidCstIbsCbs(Number(code))).toBe(true); + }), + ); + }); + + test("should reject every digit string that is empty or wider than 3 digits", () => { + fc.assert( + fc.property(digitsOfOtherLength(12, [1, 2, 3]), (value) => { + expect(isValidCstIbsCbs(value)).toBe(false); + }), + ); + }); + }); +}); + +describe("isValidCstIbsCbs types", () => { + test("should take a string or number and return a boolean", () => { + expectTypeOf(isValidCstIbsCbs).parameter(0).toEqualTypeOf(); + expectTypeOf(isValidCstIbsCbs).returns.toEqualTypeOf(); + }); +}); diff --git a/src/is-valid-cst-ibs-cbs/is-valid-cst-ibs-cbs.ts b/src/is-valid-cst-ibs-cbs/is-valid-cst-ibs-cbs.ts new file mode 100644 index 000000000..777257b98 --- /dev/null +++ b/src/is-valid-cst-ibs-cbs/is-valid-cst-ibs-cbs.ts @@ -0,0 +1,59 @@ +import { + CST_IBS_CBS_FORMAT_REGEX, + CST_IBS_CBS_LENGTH, + CST_IBS_CBS_TABLE, +} from "../_internals/constants/ibs-cbs"; +import { isLookupCode } from "../_internals/is-lookup-code/is-lookup-code"; +import { padLookupCode } from "../_internals/pad-lookup-code/pad-lookup-code"; + +/** + * Validates if a CST-IBS/CBS (Código de Situação Tributária do IBS e da CBS) exists in the + * official table, the check behind the rejection 1020 "CST do IBS/CBS informado inexistente" of + * the NF-e. + * + * It is a function of its own, not a `tax` of `isValidCst`: IBS and CBS share one table, its 3 + * digit codes (`000`, `200`, `410`, ...) collide with the ICMS origin plus Tabela B form, and + * `isValidCst` without a `tax` accepts a code of any table, so adding this one to it would change + * what that default accepts. + * + * A string is only read as a code when it is written as bare digits, with optional surrounding + * whitespace: the field has no mask, so anything else (`"cst200"`) is rejected instead of having + * its digits picked out. A number is only read as a code when it is a non-negative safe integer. + * A value narrower than 3 digits is left padded with zeros, as a string or as a number, since + * the codes start with zeros a numeric field drops: `0`, `"0"` and `"000"` are all the code `000`. + * + * @param {string|number} value - The CST-IBS/CBS to be validated, e.g. `"200"`, `"000"` or `200`. + * @returns {boolean} True when the code is in the CST-IBS/CBS table, false otherwise. + * + * @example + * ```typescript + * isValidCstIbsCbs("000"); // true + * isValidCstIbsCbs(410); // true + * isValidCstIbsCbs(10); // true (padded to "010") + * isValidCstIbsCbs("100"); // false + * isValidCstIbsCbs("cst200"); // false (not a documented form) + * isValidCstIbsCbs(-200); // false (not a non-negative safe integer) + * ``` + * + * @see Official: https://www.nfe.fazenda.gov.br/portal/listaConteudo.aspx?tipoConteudo=/NJarYc9nus= + * "Documentos" > "Diversos" of the Portal Nacional da NF-e, which publishes every version of the + * "Tabela de Classificação Tributária do IBS e CBS" workbook (sheets CST and cClassTrib). + * @see Official: https://www.nfe.fazenda.gov.br/portal/listaConteudo.aspx?tipoConteudo=hXzemuyNHW4= + * Informe Técnico 2025.002 (v.1.60 of 22/06/2026), which divulges both tables, defines their + * columns and states that the first three digits of a cClassTrib are its CST-IBS/CBS. + * @see Official: https://www.nfe.fazenda.gov.br/portal/listaConteudo.aspx?tipoConteudo=04BIflQt1aY= + * Nota Técnica 2025.002-RTC (v.1.51), fields UB13 `CST` (N, 3 digits) and UB14 `cClassTrib` (N, + * 6 digits) and the rejections 1020 (unknown CST), 1023 (unknown cClassTrib) and 1024 + * (cClassTrib incompatible with the CST). + * @see Official: https://dfe-portal.svrs.rs.gov.br/DFE/TabelaClassificacaoTributaria + * The same tables online, on the Portal dos Documentos Fiscais Eletrônicos (SVRS). + * @see Official: https://www.planalto.gov.br/ccivil_03/leis/lcp/lcp214.htm + * Lei Complementar nº 214/2025, which institutes the IBS and the CBS. + */ +export const isValidCstIbsCbs = (value: string | number): boolean => { + if (!isLookupCode(value)) return false; + + const code = padLookupCode(value, CST_IBS_CBS_LENGTH); + + return CST_IBS_CBS_FORMAT_REGEX.test(code) && code in CST_IBS_CBS_TABLE; +}; diff --git a/src/is-valid-gtin/is-valid-gtin.test.ts b/src/is-valid-gtin/is-valid-gtin.test.ts new file mode 100644 index 000000000..fcd879449 --- /dev/null +++ b/src/is-valid-gtin/is-valid-gtin.test.ts @@ -0,0 +1,171 @@ +import * as fc from "fast-check"; + +import { + anyGarbage, + anyText, + digitsOfOtherLength, + PROTOTYPE_KEYS, +} from "../_internals/test/arbitraries"; +import { + expectAlwaysReturnsType, + expectNeverThrowsWithOptions, + expectRejected, +} from "../_internals/test/properties"; +import { describe, expect, expectTypeOf, test } from "../_internals/test/runtime"; +import { type GtinLength, type IsValidGtinOptions, isValidGtin } from "./is-valid-gtin"; + +const GTIN_8 = "78912342"; +const GTIN_12 = "061414112345"; +const GTIN_13 = "7890000000017"; +const GTIN_14 = "17890000000014"; + +describe("isValidGtin", () => { + describe("should return true", () => { + test("for a GTIN-8", () => { + expect(isValidGtin(GTIN_8)).toBe(true); + }); + + test("for a GTIN-12 built from the U.P.C. Company Prefix 614141 of the GS1 General Specifications", () => { + expect(isValidGtin(GTIN_12)).toBe(true); + }); + + test("for a GTIN-13 with each prefix of GS1 Brasil", () => { + expect(isValidGtin(GTIN_13)).toBe(true); + expect(isValidGtin("7901234567891")).toBe(true); + }); + + test("for a GTIN-14", () => { + expect(isValidGtin(GTIN_14)).toBe(true); + }); + + test("for the numbers GS1 publishes as examples: a GTIN-13, a GLN and a GRAI", () => { + expect(isValidGtin("6291041500213")).toBe(true); + expect(isValidGtin("9521234500018")).toBe(true); + expect(isValidGtin("09524141234564")).toBe(true); + }); + + test("for a prefix that is not Brazilian", () => { + expect(isValidGtin("7880000000018")).toBe(true); + }); + + test("for a Restricted Circulation Number and for an ISSN or ISBN, which share the structure", () => { + expect(isValidGtin("2000000000015")).toBe(true); + expect(isValidGtin("0400000000015")).toBe(true); + expect(isValidGtin("9771234567003")).toBe(true); + expect(isValidGtin("9780000000019")).toBe(true); + }); + + test("with surrounding whitespace", () => { + expect(isValidGtin(` ${GTIN_13}\t`)).toBe(true); + }); + }); + + describe("should return false", () => { + test("when the value is not a string", () => { + expect(isValidGtin(7_890_000_000_017 as unknown as string)).toBe(false); + expect(isValidGtin(null as unknown as string)).toBe(false); + expect(isValidGtin(undefined as unknown as string)).toBe(false); + expect(isValidGtin({} as unknown as string)).toBe(false); + expect(isValidGtin([GTIN_13] as unknown as string)).toBe(false); + }); + + test("when the value is empty", () => { + expect(isValidGtin("")).toBe(false); + }); + + test("when the value is the literal the NF-e uses for a product without a GTIN", () => { + expect(isValidGtin("SEM GTIN")).toBe(false); + }); + + test("when the check digit is wrong", () => { + expect(isValidGtin("78912343")).toBe(false); + expect(isValidGtin("061414112346")).toBe(false); + expect(isValidGtin("7890000000018")).toBe(false); + expect(isValidGtin("17890000000015")).toBe(false); + }); + + test("when the length is not 8, 12, 13 or 14", () => { + expect(isValidGtin("789000017")).toBe(false); + expect(isValidGtin("78900000017")).toBe(false); + expect(isValidGtin("376104250021234569")).toBe(false); + }); + + test("when the value carries a mask or a letter", () => { + expect(isValidGtin("7 890000 000017")).toBe(false); + expect(isValidGtin("789000000001X")).toBe(false); + }); + }); + + describe("with the lengths option", () => { + test("should accept only the lengths it lists", () => { + expect(isValidGtin(GTIN_13, { lengths: [13] })).toBe(true); + expect(isValidGtin(GTIN_8, { lengths: [13] })).toBe(false); + expect(isValidGtin(GTIN_12, { lengths: [13] })).toBe(false); + expect(isValidGtin(GTIN_14, { lengths: [13] })).toBe(false); + expect(isValidGtin(GTIN_14, { lengths: [8, 12, 13] })).toBe(false); + expect(isValidGtin(GTIN_8, { lengths: [8, 14] })).toBe(true); + expect(isValidGtin(GTIN_14, { lengths: [8, 14] })).toBe(true); + }); + + test("should accept nothing when the list is empty", () => { + expect(isValidGtin(GTIN_13, { lengths: [] })).toBe(false); + }); + + test("should still turn down a wrong check digit of a listed length", () => { + expect(isValidGtin("7890000000018", { lengths: [13] })).toBe(false); + }); + + test("should accept the four lengths when it is left out or is not a list", () => { + expect(isValidGtin(GTIN_8, {})).toBe(true); + expect(isValidGtin(GTIN_14, { lengths: undefined })).toBe(true); + expect(isValidGtin(GTIN_13, null as unknown as IsValidGtinOptions)).toBe(true); + expect(isValidGtin(GTIN_13, { lengths: "8" } as unknown as IsValidGtinOptions)).toBe(true); + expect(isValidGtin(GTIN_13, { lengths: 8 } as unknown as IsValidGtinOptions)).toBe(true); + }); + }); + + describe("properties", () => { + test("should reject every digit string of another length", () => { + expectRejected(isValidGtin, digitsOfOtherLength(20, [8, 12, 13, 14])); + }); + + test("should accept exactly one check digit for any 12 digit body", () => { + fc.assert( + fc.property(fc.stringMatching(/^[0-9]{12}$/), (body) => { + const accepted = Array.from({ length: 10 }, (_, digit) => `${body}${digit}`).filter( + (candidate) => isValidGtin(candidate), + ); + + expect(accepted).toHaveLength(1); + }), + ); + }); + + test("should never accept with a list of lengths what it turns down without one", () => { + fc.assert( + fc.property( + fc.stringMatching(/^[0-9]{8,14}$/), + fc.subarray([8, 12, 13, 14]), + (value, lengths) => { + expect(isValidGtin(value, { lengths }) && !isValidGtin(value)).toBe(false); + }, + ), + ); + }); + + test("should always return a boolean and never throw", () => { + expectAlwaysReturnsType(isValidGtin, "boolean", fc.oneof(anyText, fc.anything())); + expectAlwaysReturnsType(isValidGtin, "boolean", fc.constantFrom(...PROTOTYPE_KEYS)); + expectNeverThrowsWithOptions(isValidGtin, fc.oneof(anyText, anyGarbage), anyGarbage); + }); + }); +}); + +describe("isValidGtin types", () => { + test("should take a string and optional options and return a boolean", () => { + expectTypeOf(isValidGtin).parameter(0).toEqualTypeOf(); + expectTypeOf(isValidGtin).parameter(1).toEqualTypeOf(); + expectTypeOf(isValidGtin).returns.toEqualTypeOf(); + expectTypeOf().toEqualTypeOf<{ lengths?: GtinLength[] }>(); + }); +}); diff --git a/src/is-valid-gtin/is-valid-gtin.ts b/src/is-valid-gtin/is-valid-gtin.ts new file mode 100644 index 000000000..f2239515c --- /dev/null +++ b/src/is-valid-gtin/is-valid-gtin.ts @@ -0,0 +1,65 @@ +import { type GtinLength, getGtinInfo } from "../get-gtin-info/get-gtin-info"; + +export type { GtinLength } from "../get-gtin-info/get-gtin-info"; + +/** Options of `isValidGtin`. */ +export type IsValidGtinOptions = { + /** The lengths to accept (default: all four, 8, 12, 13 and 14). */ + lengths?: GtinLength[]; +}; + +/** + * Validates a GTIN (Global Trade Item Number, the number under an EAN/UPC barcode). + * + * Covers the four structures of the GS1 General Specifications, the same four the NF-e accepts + * in `cEAN` and `cEANTrib`: GTIN-8, GTIN-12 (UPC), GTIN-13 (EAN) and GTIN-14 (DUN-14). The value + * must be a string of 8, 12, 13 or 14 digits, surrounding whitespace aside, whose last digit is + * the GS1 modulo 10 check digit: weights 3 and 1 alternating from the right, the sum subtracted + * from the nearest equal or higher multiple of ten. This is what rules I03-10 and I12-10 of the + * NF-e check (rejections 611 and 612). The `"SEM GTIN"` literal the NF-e uses for a product + * without a GTIN is not a GTIN, so it is not valid here. Leading zeros count, so a number is + * never accepted. + * + * The prefix does not change the verdict: Restricted Circulation Numbers (prefixes 02, 04 and 20 + * to 29, the codes a shop prints on its own scale labels) and the ISSN, ISBN and coupon ranges + * share the structure and the check digit, and the "Tabela Prefixo GS1" SEFAZ validates `cEAN` + * against lists them as valid. `getGtinInfo` tells the restricted and the Brazilian prefixes + * apart for the caller that needs to. Whether the number is registered with GS1 (the Cadastro + * Centralizado de GTIN lookup of rules 9I03-10 and 9I12-10) cannot be checked offline. + * + * @param {string} value - The GTIN to be validated, digits only. + * @param {IsValidGtinOptions} [options] - Optional options. + * @param {GtinLength[]} [options.lengths] - The lengths to accept. Defaults to all four. + * @returns {boolean} True if the GTIN is valid, false otherwise. + * + * @see Official: https://ref.gs1.org/standards/genspecs/ + * GS1 General Specifications, release 26.0: section 7.9.1 (check digit, tables 7-8 and 7-9). + * @see Official: https://www.gs1.org/services/how-calculate-check-digit-manually + * GS1, "How to calculate a check digit manually", source of the 6291041500213 example. + * @see Official: https://www.nfe.fazenda.gov.br/portal/exibirArquivo.aspx?conteudo=SrQT9ys8ODo%3D + * SEFAZ Nota Técnica 2021.003 (Validação GTIN, replaces NT 2017.001): fields I03 `cEAN` and I12 + * `cEANTrib`, rules I03-10 and I12-10. + * @see Official: https://www.nfe.fazenda.gov.br/portal/exibirArquivo.aspx?conteudo=Oc+fygAxwmc%3D + * "Tabela Prefixo GS1" of the Portal da NF-e, the prefix ranges rules I03-20 and I12-20 accept. + * + * @example + * ```typescript + * isValidGtin("7890000000017"); // true (GTIN-13, GS1 Brasil prefix) + * isValidGtin("6291041500213"); // true (the GS1 example) + * isValidGtin("78912342"); // true (GTIN-8) + * isValidGtin("061414112345"); // true (GTIN-12) + * isValidGtin("17890000000014"); // true (GTIN-14) + * isValidGtin("7890000000018"); // false (wrong check digit) + * isValidGtin("17890000000014", { lengths: [8, 12, 13] }); // false (GTIN-14 not accepted) + * isValidGtin("SEM GTIN"); // false + * ``` + */ +export const isValidGtin = (value: string, options?: IsValidGtinOptions): boolean => { + const info = getGtinInfo(value); + + if (info === null) return false; + + const lengths = options?.lengths; + + return Array.isArray(lengths) ? lengths.includes(info.length) : true; +}; diff --git a/src/is-valid-nbs/is-valid-nbs.test.ts b/src/is-valid-nbs/is-valid-nbs.test.ts new file mode 100644 index 000000000..90cf28d87 --- /dev/null +++ b/src/is-valid-nbs/is-valid-nbs.test.ts @@ -0,0 +1,63 @@ +import { anyGarbage, anyValue } from "../_internals/test/arbitraries"; +import { expectAlwaysReturnsType, expectNeverThrows } from "../_internals/test/properties"; +import { describe, expect, expectTypeOf, it, test } from "../_internals/test/runtime"; +import { isValidNbs } from "./is-valid-nbs"; + +describe("isValidNbs", () => { + it("should validate an NBS code without a mask", () => { + expect(isValidNbs("101011100")).toBe(true); + }); + + it("should validate an NBS code with the N.NNNN.NN.NN mask", () => { + expect(isValidNbs("1.0101.11.00")).toBe(true); + expect(isValidNbs("1.2606.00.00")).toBe(true); + }); + + it("should validate an NBS code given as a number", () => { + expect(isValidNbs(101_011_100)).toBe(true); + }); + + it("should reject the headings of the nomenclature", () => { + expect(isValidNbs("1.01")).toBe(false); + expect(isValidNbs("1.0101")).toBe(false); + expect(isValidNbs("1.0101.1")).toBe(false); + }); + + it("should reject a well formed code the table does not carry", () => { + expect(isValidNbs("1.9999.99.99")).toBe(false); + expect(isValidNbs("1.0101.11.01")).toBe(false); + }); + + it("should reject a malformed value", () => { + expect(isValidNbs("1.0101abc11.00")).toBe(false); + expect(isValidNbs("1..0101.11.00")).toBe(false); + expect(isValidNbs("")).toBe(false); + }); + + it("should reject null, undefined and non lookup values", () => { + // @ts-expect-error not a string or number + expect(isValidNbs(null)).toBe(false); + // @ts-expect-error not a string or number + expect(isValidNbs()).toBe(false); + // @ts-expect-error not a string or number + expect(isValidNbs(["101011100"])).toBe(false); + expect(isValidNbs(-101_011_100)).toBe(false); + }); + + describe("properties", () => { + test("should never throw, regardless of the input", () => { + expectNeverThrows(isValidNbs, anyGarbage); + }); + + test("should always return a boolean", () => { + expectAlwaysReturnsType(isValidNbs, "boolean", anyValue); + }); + }); +}); + +describe("isValidNbs types", () => { + test("should take a string or number and return a boolean", () => { + expectTypeOf(isValidNbs).parameter(0).toEqualTypeOf(); + expectTypeOf(isValidNbs).returns.toEqualTypeOf(); + }); +}); diff --git a/src/is-valid-nbs/is-valid-nbs.ts b/src/is-valid-nbs/is-valid-nbs.ts new file mode 100644 index 000000000..d8f8f8286 --- /dev/null +++ b/src/is-valid-nbs/is-valid-nbs.ts @@ -0,0 +1,35 @@ +import { getNbs } from "../get-nbs/get-nbs"; + +/** + * Checks if a value is a code of the official NBS 2.0 table (Nomenclatura Brasileira de + * Serviços, Intangíveis e Outras Operações que Produzam Variações no Patrimônio), the code the + * national NFS-e carries in `cNBS`. + * + * Accepts what `getNbs` accepts: the 9 digits or the `N.NNNN.NN.NN` mask, with a single + * separator between the groups and optional surrounding whitespace, or a non-negative safe + * integer. Only complete codes are valid; the chapter, position and subposition headings of the + * nomenclature are not. + * + * The table is the NBS 2.0 the MDIC publishes. The ANEXO B of the Sistema Nacional NFS-e lists + * the same codes except three (`1.0402.29.00`, `1.0403.29.00` and `1.0904.40.00`), so a code + * valid here can still be refused by the NFS-e. + * + * @param {string|number} value - The NBS code to be validated. + * @returns {boolean} True if the code is in the table, false otherwise. + * + * @example + * ```typescript + * isValidNbs("1.0101.11.00"); // true + * isValidNbs("101011100"); // true + * isValidNbs(101011100); // true + * isValidNbs("1.0101"); // false (a position heading, not a complete code) + * isValidNbs("1.9999.99.99"); // false + * ``` + * + * @see Official: https://www.gov.br/mdic/pt-br/assuntos/sdic/comercio-e-servicos/nbs-nomenclatura-brasileira-de-servicos + * The NBS page of the MDIC: NBS 2.0, approved by the Portaria Conjunta RFB/SCS 1.429/2018 and + * amended by the Portaria Conjunta RFB/SCS 2.000/2018. + * @see Official: https://www.gov.br/mdic/pt-br/images/REPOSITORIO/scs/decos/NBS/NBSa_2-0.csv + * The NBS 2.0 table in CSV. + */ +export const isValidNbs = (value: string | number): boolean => getNbs(value) !== null; diff --git a/src/is-valid-nfse-key/is-valid-nfse-key.test.ts b/src/is-valid-nfse-key/is-valid-nfse-key.test.ts new file mode 100644 index 000000000..94c6c3fc6 --- /dev/null +++ b/src/is-valid-nfse-key/is-valid-nfse-key.test.ts @@ -0,0 +1,110 @@ +import { anyText, anyValue, digits } from "../_internals/test/arbitraries"; +import { expectAlwaysReturnsType, expectRejected } from "../_internals/test/properties"; +import { describe, expect, expectTypeOf, test } from "../_internals/test/runtime"; +import { isValidNfseKey } from "./is-valid-nfse-key"; + +const KEY_CNPJ = "35503082258716523000119000000000001226011357924683"; +const KEY_CPF = "43149021100040364478829000000000105725120484407255"; + +describe("isValidNfseKey", () => { + describe("should return true", () => { + test("for a synthetic key of a CNPJ issuer generated by the Sistema Nacional NFS-e", () => { + expect(isValidNfseKey(KEY_CNPJ)).toBe(true); + }); + + test("for a synthetic key of a CPF issuer generated by the municipality", () => { + expect(isValidNfseKey(KEY_CPF)).toBe(true); + }); + + test("when it has the NFS prefix found in the XML Id attribute, in any case", () => { + expect(isValidNfseKey(`NFS${KEY_CNPJ}`)).toBe(true); + expect(isValidNfseKey(`nfs${KEY_CPF}`)).toBe(true); + }); + + test("when it has surrounding whitespace", () => { + expect(isValidNfseKey(` ${KEY_CNPJ}\n`)).toBe(true); + }); + }); + + describe("should return false", () => { + test("when it is null", () => { + // @ts-expect-error: intentionally invalid input + expect(isValidNfseKey(null)).toBe(false); + }); + + test("when it is undefined", () => { + // @ts-expect-error: intentionally invalid input + expect(isValidNfseKey()).toBe(false); + }); + + test("when it is a number, a boolean, an object or an array", () => { + // @ts-expect-error: intentionally invalid input + expect(isValidNfseKey(123)).toBe(false); + // @ts-expect-error: intentionally invalid input + expect(isValidNfseKey(true)).toBe(false); + // @ts-expect-error: intentionally invalid input + expect(isValidNfseKey({})).toBe(false); + // @ts-expect-error: intentionally invalid input + expect(isValidNfseKey([KEY_CNPJ])).toBe(false); + }); + + test("when it is an empty string", () => { + expect(isValidNfseKey("")).toBe(false); + }); + + test("when the check digit does not match", () => { + expect(isValidNfseKey("35503082258716523000119000000000001226011357924684")).toBe(false); + }); + + test("when it does not have 50 digits", () => { + expect(isValidNfseKey(KEY_CNPJ.slice(0, 49))).toBe(false); + expect(isValidNfseKey(`${KEY_CNPJ}3`)).toBe(false); + }); + + test("when it is split by separators, since the key has no mask", () => { + expect(isValidNfseKey("3550308 2 2 58716523000119 0000000000012 2601 135792468 3")).toBe( + false, + ); + expect(isValidNfseKey("3550308.2.2.58716523000119.0000000000012.2601.135792468-3")).toBe( + false, + ); + }); + + test("for the 44 digit key of an NF-e", () => { + expect(isValidNfseKey("35170458716523000119550010000000121000123458")).toBe(false); + }); + + test("for the example of the Guia do Emissor Público Nacional Web v1.2, item 9.1, an illustrative key whose check digit does not match and whose issuer CNPJ 51235800000112 is not valid either", () => { + expect(isValidNfseKey("31062001251235800000112230000000173023019580208160")).toBe(false); + }); + + test("when the month is 13, even with a matching check digit", () => { + expect(isValidNfseKey("35503082258716523000119000000000001226131357924684")).toBe(false); + }); + + test("when the issuer CNPJ has wrong check digits, even with a matching key check digit", () => { + expect(isValidNfseKey("35503082258716523000110000000000001226011357924686")).toBe(false); + }); + }); + + describe("properties", () => { + test("should reject any text that is not a key", () => { + expectRejected(isValidNfseKey, anyText); + }); + + test("should reject digits of the NF-e key length", () => { + expectRejected(isValidNfseKey, digits(44)); + }); + + test("should never throw and always return a boolean", () => { + expectAlwaysReturnsType(isValidNfseKey, "boolean", anyValue); + }); + }); +}); + +describe("isValidNfseKey types", () => { + test("should take a string and return a boolean", () => { + expectTypeOf(isValidNfseKey).parameter(0).toEqualTypeOf(); + expectTypeOf(isValidNfseKey).returns.toEqualTypeOf(); + }); +}); diff --git a/src/is-valid-nfse-key/is-valid-nfse-key.ts b/src/is-valid-nfse-key/is-valid-nfse-key.ts new file mode 100644 index 000000000..eb7c5e423 --- /dev/null +++ b/src/is-valid-nfse-key/is-valid-nfse-key.ts @@ -0,0 +1,45 @@ +import { getNfseKeyInfo } from "../get-nfse-key-info/get-nfse-key-info"; + +/** + * Validates the access key (chave de acesso) of a national NFS-e, the Nota Fiscal de Serviço + * eletrônica of the Sistema Nacional NFS-e. + * + * The key is one block of 50 digits: + * `Cód.Mun.(7) Amb.Ger.(1) Tipo de Inscrição Federal(1) Inscrição Federal(14) nNFSe(13) AAMM(4) + * Cód.Num.(9) DV(1)`. The `NFS` literal the `Id` attribute of `infNFSe` puts in front of it is + * stripped, with surrounding whitespace. The key has no printed mask (the DANFSe prints it as a + * single block), so a separator anywhere in it is rejected instead of being stripped. The keys + * of the municipal NFS-e models that are not the national standard are out of scope, and so is + * the 44 digit DF-e key, which `isValidNfeKey` covers. + * + * The municipality code must start with an IBGE UF code, `ambGer` must be 1 (municipality) or 2 + * (Sistema Nacional NFS-e), the registration type 1 (CPF, left padded with `000`) or 2 (CNPJ) + * with a CPF or CNPJ whose own check digits are valid, `nNFSe` must not be all zeros and the + * month must be 01 to 12. The check digit (DV) is a modulus 11 over the first 49 digits, weights + * 2 to 9 cycling from the right, where a remainder of 0 or 1 gives 0. `getNfseKeyInfo` states + * what each rule is taken from. + * + * Keys carrying an alphanumeric CNPJ are not accepted yet, since no official document states how + * a letter enters the check digit of the key. + * + * @param {string} value - The access key value to be validated. + * @returns {boolean} True if the access key is valid, false otherwise. + * + * @see Official: https://www.gov.br/nfse/pt-br/biblioteca/documentacao-tecnica/documentacao-atual + * Sistema Nacional NFS-e, current technical documentation: `NFSe-ESQUEMAS_XSD-v1.01` + * (`tiposSimples_v1.01.xsd`: `TSIdNFSe`, `TSChaveNFSe`) and `ANEXO_I-SEFIN_ADN-DPS_NFSe-SNNFSe` + * v1.01 (field `NFSe/infNFSe/id`, rules E1263, E1280, E1284 and E0042). + * @see Official: https://www.gov.br/nfse/pt-br/biblioteca/documentacao-tecnica/documentacao-atual/manual-contribuintes-emissor-publico-api-emissao-decisao-administrativa-e-judicial.pdf + * Manual de Contribuintes, Emissão por Decisão Administrativa ou Judicial, field `id`: "O dígito + * verificador deve ser calculado segundo o algoritmo do módulo 11". + * + * @example + * ```typescript + * isValidNfseKey("35503082258716523000119000000000001226011357924683"); // true (CNPJ issuer, SP) + * isValidNfseKey("NFS35503082258716523000119000000000001226011357924683"); // true (XML Id prefix) + * isValidNfseKey("43149021100040364478829000000000105725120484407255"); // true (CPF issuer, RS) + * isValidNfseKey("35503082258716523000119000000000001226011357924684"); // false (check digit) + * isValidNfseKey("3550308 2 2 58716523000119 0000000000012 2601 135792468 3"); // false (no mask) + * ``` + */ +export const isValidNfseKey = (value: string): boolean => getNfseKeyInfo(value) !== null; diff --git a/src/is-valid-service-item/is-valid-service-item.test.ts b/src/is-valid-service-item/is-valid-service-item.test.ts new file mode 100644 index 000000000..1405eb690 --- /dev/null +++ b/src/is-valid-service-item/is-valid-service-item.test.ts @@ -0,0 +1,61 @@ +import { anyGarbage, anyValue } from "../_internals/test/arbitraries"; +import { expectAlwaysReturnsType, expectNeverThrows } from "../_internals/test/properties"; +import { describe, expect, expectTypeOf, it, test } from "../_internals/test/runtime"; +import { isValidServiceItem } from "./is-valid-service-item"; + +describe("isValidServiceItem", () => { + it("should validate a subitem in the form the law prints", () => { + expect(isValidServiceItem("1.01")).toBe(true); + expect(isValidServiceItem("17.25")).toBe(true); + expect(isValidServiceItem("40.01")).toBe(true); + }); + + it("should validate a zero padded item and the bare digits", () => { + expect(isValidServiceItem("01.01")).toBe(true); + expect(isValidServiceItem("0101")).toBe(true); + expect(isValidServiceItem(101)).toBe(true); + }); + + it("should reject the vetoed subitems", () => { + expect(isValidServiceItem("3.01")).toBe(false); + expect(isValidServiceItem("17.07")).toBe(false); + }); + + it("should reject item 99 of the national list and the 6 digit national codes", () => { + expect(isValidServiceItem("99.01")).toBe(false); + expect(isValidServiceItem("010101")).toBe(false); + }); + + it("should reject a malformed value", () => { + expect(isValidServiceItem("1.1")).toBe(false); + expect(isValidServiceItem("1-01")).toBe(false); + expect(isValidServiceItem("")).toBe(false); + }); + + it("should reject null, undefined and non lookup values", () => { + // @ts-expect-error not a string or number + expect(isValidServiceItem(null)).toBe(false); + // @ts-expect-error not a string or number + expect(isValidServiceItem()).toBe(false); + // @ts-expect-error not a string or number + expect(isValidServiceItem(["1.01"])).toBe(false); + expect(isValidServiceItem(1.01)).toBe(false); + }); + + describe("properties", () => { + test("should never throw, regardless of the input", () => { + expectNeverThrows(isValidServiceItem, anyGarbage); + }); + + test("should always return a boolean", () => { + expectAlwaysReturnsType(isValidServiceItem, "boolean", anyValue); + }); + }); +}); + +describe("isValidServiceItem types", () => { + test("should take a string or number and return a boolean", () => { + expectTypeOf(isValidServiceItem).parameter(0).toEqualTypeOf(); + expectTypeOf(isValidServiceItem).returns.toEqualTypeOf(); + }); +}); diff --git a/src/is-valid-service-item/is-valid-service-item.ts b/src/is-valid-service-item/is-valid-service-item.ts new file mode 100644 index 000000000..6b6c8917e --- /dev/null +++ b/src/is-valid-service-item/is-valid-service-item.ts @@ -0,0 +1,32 @@ +import { getServiceItem } from "../get-service-item/get-service-item"; + +/** + * Checks if a value is a subitem in force of the service list annexed to the Lei Complementar + * 116/2003, the list of the services the ISS is levied on. + * + * Accepts what `getServiceItem` accepts: the form the law prints (`"1.01"`), a zero padded item + * (`"01.01"`), the bare digits (`"0101"`, `"101"` or the integer `101`), with optional + * surrounding whitespace. The dot is the only separator the law ever prints, so `"1-01"` is not + * valid. Vetoed subitems, item headings, the 6 digit national codes of the NFS-e and item 99 of + * the national list are not valid. + * + * @param {string|number} value - The subitem to be validated. + * @returns {boolean} True if the subitem is in the list in force, false otherwise. + * + * @example + * ```typescript + * isValidServiceItem("1.01"); // true + * isValidServiceItem("0101"); // true + * isValidServiceItem("17.25"); // true + * isValidServiceItem("3.01"); // false (vetoed) + * isValidServiceItem("99.01"); // false (national list only, not the law) + * ``` + * + * @see Official: https://www.planalto.gov.br/ccivil_03/leis/lcp/lcp116.htm + * Lei Complementar 116/2003, "Lista de serviços anexa". + * @see Official: https://www.gov.br/nfse/pt-br/biblioteca/documentacao-tecnica/documentacao-atual + * Sistema Nacional NFS-e, `ANEXO_B-NBS2-LISTA_SERVICO_NACIONAL`, sheet `LISTA.SERV.NAC.`: the + * list in force in machine readable form. + */ +export const isValidServiceItem = (value: string | number): boolean => + getServiceItem(value) !== null; diff --git a/src/is-valid-suframa/is-valid-suframa.test.ts b/src/is-valid-suframa/is-valid-suframa.test.ts new file mode 100644 index 000000000..6ffc60f5d --- /dev/null +++ b/src/is-valid-suframa/is-valid-suframa.test.ts @@ -0,0 +1,157 @@ +import * as fc from "fast-check"; + +import { anyValue, digitsOfOtherLength, maskSeparators } from "../_internals/test/arbitraries"; +import { expectAlwaysReturnsType, expectRejected } from "../_internals/test/properties"; +import { describe, expect, expectTypeOf, test } from "../_internals/test/runtime"; +import { generateSuframa } from "../generate-suframa/generate-suframa"; +import { isValidSuframa } from "./is-valid-suframa"; + +describe("isValidSuframa", () => { + describe("should return false", () => { + test("when it is an empty string", () => { + expect(isValidSuframa("")).toBe(false); + }); + + test("when it is null", () => { + // @ts-expect-error: intentionally invalid input + expect(isValidSuframa(null)).toBe(false); + }); + + test("when it is undefined", () => { + // @ts-expect-error: intentionally invalid input + expect(isValidSuframa()).toBe(false); + }); + + test("when it is a boolean", () => { + // @ts-expect-error: intentionally invalid input + expect(isValidSuframa(true)).toBe(false); + // @ts-expect-error: intentionally invalid input + expect(isValidSuframa(false)).toBe(false); + }); + + test("when it is an object", () => { + // @ts-expect-error: intentionally invalid input + expect(isValidSuframa({})).toBe(false); + }); + + test("when it is an array", () => { + // @ts-expect-error: intentionally invalid input + expect(isValidSuframa([])).toBe(false); + }); + + test("when it is a non-string that stringifies to a valid Inscrição SUFRAMA", () => { + // @ts-expect-error: intentionally invalid input + expect(isValidSuframa(123_456_789)).toBe(false); + // @ts-expect-error: intentionally invalid input + expect(isValidSuframa([123_456_789])).toBe(false); + }); + + test("when it has fewer than 8 digits", () => { + expect(isValidSuframa("1234567")).toBe(false); + expect(isValidSuframa("0001018")).toBe(false); + }); + + test("when it has more than 9 digits, even if the first 9 are valid", () => { + expect(isValidSuframa("1234567899")).toBe(false); + }); + + test("when it has more than 9 digits, even if the last 9 are valid", () => { + expect(isValidSuframa("1234567090")).toBe(false); + }); + + test("when it contains letters or special characters", () => { + expect(isValidSuframa("12345678A9")).toBe(false); + expect(isValidSuframa("12#3456#789")).toBe(false); + expect(isValidSuframa("abcdefghi")).toBe(false); + }); + + test("when the check digit is wrong", () => { + expect(isValidSuframa("123456780")).toBe(false); + expect(isValidSuframa("123456788")).toBe(false); + expect(isValidSuframa("205678105")).toBe(false); + expect(isValidSuframa("10001019")).toBe(false); + }); + + test("when the remainder is 0 or 1 and the check digit is not 0", () => { + expect(isValidSuframa("100000011")).toBe(false); + expect(isValidSuframa("600001301")).toBe(false); + }); + + test("when the sector code is 00", () => { + expect(isValidSuframa("001234560")).toBe(false); + expect(isValidSuframa("000000000")).toBe(false); + expect(isValidSuframa("000000019")).toBe(false); + }); + + test("when an 8 digit value starts with 0, which reads as sector code 00", () => { + expect(isValidSuframa("01234560")).toBe(false); + }); + }); + + describe("should return true", () => { + test("when it is the example of the NF-e manual", () => { + expect(isValidSuframa("123456789")).toBe(true); + }); + + test("when it is a valid Inscrição SUFRAMA without mask", () => { + expect(isValidSuframa("010001018")).toBe(true); + expect(isValidSuframa("101234015")).toBe(true); + expect(isValidSuframa("205678106")).toBe(true); + expect(isValidSuframa("601234308")).toBe(true); + }); + + test("when it is a valid Inscrição SUFRAMA with mask", () => { + expect(isValidSuframa("12.3456.789")).toBe(true); + expect(isValidSuframa("20.5678.10-6")).toBe(true); + expect(isValidSuframa("20 5678 10 6")).toBe(true); + }); + + test("when it has 8 digits because the sector code lost its leading zero", () => { + expect(isValidSuframa("10001018")).toBe(true); + expect(isValidSuframa("1.0001.018")).toBe(true); + }); + + test("when the remainder is 0 and the check digit is 0", () => { + expect(isValidSuframa("100000010")).toBe(true); + }); + + test("when the remainder is 1 and the check digit is 0", () => { + expect(isValidSuframa("600001300")).toBe(true); + }); + + test("when the remainder is 10 and the check digit is 1", () => { + expect(isValidSuframa("100000061")).toBe(true); + }); + }); + + describe("properties", () => { + test("should accept a generated Inscrição SUFRAMA written with any of the accepted mask characters", () => { + const masks = maskSeparators([".", "-", "/", " ", "(", ")", ",", "*"], 4, 3); + + fc.assert( + fc.property(masks, (separators) => { + const suframa = generateSuframa(); + const head = `${separators[0]}${suframa.slice(0, 2)}${separators[1]}`; + const tail = `${suframa.slice(2, 6)}${separators[2]}${suframa.slice(6)}`; + + expect(isValidSuframa(`${head}${tail}${separators[3]}`)).toBe(true); + }), + ); + }); + + test("should reject any digits only value that is not 8 or 9 digits long", () => { + expectRejected(isValidSuframa, digitsOfOtherLength(22, [8, 9])); + }); + + test("should never throw and always return a boolean", () => { + expectAlwaysReturnsType(isValidSuframa, "boolean", anyValue); + }); + }); +}); + +describe("isValidSuframa types", () => { + test("should take a string and return a boolean", () => { + expectTypeOf(isValidSuframa).parameter(0).toEqualTypeOf(); + expectTypeOf(isValidSuframa).returns.toEqualTypeOf(); + }); +}); diff --git a/src/is-valid-suframa/is-valid-suframa.ts b/src/is-valid-suframa/is-valid-suframa.ts new file mode 100644 index 000000000..6e63a3c5f --- /dev/null +++ b/src/is-valid-suframa/is-valid-suframa.ts @@ -0,0 +1,57 @@ +import { SUFRAMA_LENGTH } from "../_internals/constants/suframa"; +import { mod11 } from "../_internals/mod11/mod11"; +import { sanitizeToDigits } from "../_internals/sanitize-to-digits/sanitize-to-digits"; + +/** + * Validates an Inscrição SUFRAMA, the registration number the Superintendência da Zona Franca de + * Manaus gives to companies with tax incentives, carried by the `ISUF` field of the NF-e. + * Accepts the usual mask characters (`.`, `-`, `/`, `(`, `)`, `,`, `*`) and whitespace. + * + * The number is `SS.NNNN.LLD`: sector of activity, sequential number, locality of the SUFRAMA + * unit that registered the company and check digit. The NF-e field is numeric with 8 or 9 + * positions, because a sector code such as `01` loses its leading zero, so an 8 digit value is + * read with that zero back in place. The sector code can never be `00`. The check digit is módulo + * 11 with weights 2 to 9 from right to left, and is 0 when the remainder is 0 or 1. + * + * The manual lists sector and locality codes only as examples, so they are not checked against a + * table. + * + * @param {string} suframa - The Inscrição SUFRAMA to validate. + * @returns {boolean} True if the Inscrição SUFRAMA is valid, false otherwise. + * + * @example + * ```typescript + * isValidSuframa("123456789"); // true + * isValidSuframa("12.3456.789"); // true + * isValidSuframa("10001018"); // true (same as "010001018") + * isValidSuframa("123456780"); // false (wrong check digit) + * isValidSuframa("001234560"); // false (sector 00) + * ``` + * + * @see Official: https://www.confaz.fazenda.gov.br/legislacao/arquivo-manuais/moc7-visao-geral.pdf + * Manual de Orientação do Contribuinte (MOC) NF-e 7.0, Visão Geral, section 8.4: the composition + * `SS.NNNN.LLD`, the numeric field with 8 or 9 positions whose `SS` may start with 0 but never be + * `00`, and the módulo 11 check digit with weights 2 to 9 and 0 for a remainder of 0 or 1. + * @see Official: https://www.confaz.fazenda.gov.br/legislacao/arquivo-manuais/moc7-anexo-i-leiaute-e-rv.pdf + * MOC 7.0, Anexo I: field 79 (`E18`, `ISUF`) is numeric with 8 to 9 positions, and validation + * rule E18-20 turns down an Inscrição SUFRAMA with an invalid check digit (rejection 235). + */ +export const isValidSuframa = (suframa: string): boolean => { + if (typeof suframa !== "string") return false; + + const hasInvalidChars = /[^0-9\s().,*/-]/.test(suframa); + + if (hasInvalidChars) return false; + + const digits = sanitizeToDigits(suframa); + + if (digits.length !== SUFRAMA_LENGTH && digits.length !== SUFRAMA_LENGTH - 1) return false; + + const full = digits.padStart(SUFRAMA_LENGTH, "0"); + + if (full.startsWith("00")) return false; + + const checkDigit = mod11(full.slice(0, -1), { variant: "arrecadacao" }); + + return full.charCodeAt(SUFRAMA_LENGTH - 1) - 48 === checkDigit; +}; diff --git a/src/obfuscate-email/constants.ts b/src/obfuscate-email/constants.ts new file mode 100644 index 000000000..990afd942 --- /dev/null +++ b/src/obfuscate-email/constants.ts @@ -0,0 +1,6 @@ +/** + * How many leading characters of the local part and of the domain stay visible. The gov.br + * account (acesso.gov.br) shows the registered address as "li***********@gm*******", 2 on each + * side of the `@`. + */ +export const VISIBLE_LENGTH = 2; diff --git a/src/obfuscate-email/obfuscate-email.test.ts b/src/obfuscate-email/obfuscate-email.test.ts new file mode 100644 index 000000000..3dfa2f3fc --- /dev/null +++ b/src/obfuscate-email/obfuscate-email.test.ts @@ -0,0 +1,91 @@ +import * as fc from "fast-check"; + +import { anyGarbage, anyText } from "../_internals/test/arbitraries"; +import { expectAlwaysReturnsType } from "../_internals/test/properties"; +import { describe, expect, expectTypeOf, test } from "../_internals/test/runtime"; +import { obfuscateEmail } from "./obfuscate-email"; + +describe("obfuscateEmail", () => { + test("should keep the first 2 characters of the local part and of the domain", () => { + expect(obfuscateEmail("fulano.silva@example.com")).toBe("fu**********@ex*********"); + expect(obfuscateEmail("lindalva.souza@gmail.com")).toBe("li************@gm*******"); + expect(obfuscateEmail("abc@example.com.br")).toBe("ab*@ex************"); + }); + + test("should hide the dots that fall outside the 2 visible characters and preserve the length", () => { + expect(obfuscateEmail("maria@ab.cd.ef")).toBe("ma***@ab******"); + expect(obfuscateEmail("maria@a.bc")).toBe("ma***@a.**"); + expect(obfuscateEmail("a.b@a.co")).toBe("a.*@a.**"); + }); + + test("should always hide the last character of a short local part", () => { + expect(obfuscateEmail("ab@example.com")).toBe("a*@ex*********"); + expect(obfuscateEmail("a@example.com")).toBe("*@ex*********"); + }); + + test("should keep the letter case and the symbols it shows", () => { + expect(obfuscateEmail("Fulano@Example.COM")).toBe("Fu****@Ex*********"); + expect(obfuscateEmail("_+tag@example.com")).toBe("_+***@ex*********"); + }); + + test("should return an empty string for an invalid e-mail address", () => { + expect(obfuscateEmail("")).toBe(""); + expect(obfuscateEmail("not an e-mail")).toBe(""); + expect(obfuscateEmail("fulano@example")).toBe(""); + expect(obfuscateEmail("fulano@@example.com")).toBe(""); + expect(obfuscateEmail(" fulano@example.com ")).toBe(""); + expect(obfuscateEmail("@example.com")).toBe(""); + }); + + test("should return an empty string for a value that is not a string", () => { + // @ts-expect-error: intentionally invalid input + expect(obfuscateEmail(null)).toBe(""); + // @ts-expect-error: intentionally invalid input + expect(obfuscateEmail()).toBe(""); + // @ts-expect-error: intentionally invalid input + expect(obfuscateEmail(123)).toBe(""); + // @ts-expect-error: intentionally invalid input + expect(obfuscateEmail({ toString: () => "fulano@example.com" })).toBe(""); + // @ts-expect-error: intentionally invalid input + expect(obfuscateEmail(["fulano@example.com"])).toBe(""); + }); + + describe("properties", () => { + const emails = fc.stringMatching(/^[a-z0-9]{1,10}@[a-z0-9]{1,10}\.com$/); + + test("should preserve the length and show at most 2 characters on each side", () => { + fc.assert( + fc.property(emails, (email) => { + const obfuscated = obfuscateEmail(email); + + expect(obfuscated).toHaveLength(email.length); + expect(obfuscated).toMatch(/^[a-z0-9]{0,2}\*+@[a-z0-9.]{2}\*+$/); + expect(obfuscated.indexOf("@")).toBe(email.indexOf("@")); + }), + ); + }); + + test("should only show characters that sit at the same place in the address", () => { + fc.assert( + fc.property(emails, (email) => { + const obfuscated = obfuscateEmail(email); + + for (let index = 0; index < obfuscated.length; index++) { + expect(["*", email[index]]).toContain(obfuscated[index]); + } + }), + ); + }); + + test("should never throw and always return a string", () => { + expectAlwaysReturnsType(obfuscateEmail, "string", fc.oneof(anyText, anyGarbage)); + }); + }); +}); + +describe("obfuscateEmail types", () => { + test("should take a string and return a string", () => { + expectTypeOf(obfuscateEmail).parameters.toEqualTypeOf<[value: string]>(); + expectTypeOf(obfuscateEmail).returns.toEqualTypeOf(); + }); +}); diff --git a/src/obfuscate-email/obfuscate-email.ts b/src/obfuscate-email/obfuscate-email.ts new file mode 100644 index 000000000..b282801be --- /dev/null +++ b/src/obfuscate-email/obfuscate-email.ts @@ -0,0 +1,49 @@ +import { isValidEmail } from "../is-valid-email/is-valid-email"; +import { VISIBLE_LENGTH } from "./constants"; + +const hideAfter = (text: string, visible: number): string => + `${text.slice(0, visible)}${"*".repeat(text.length - visible)}`; + +/** + * Hides most of an e-mail address with `*`, for the places where an address is shown to someone + * who should only recognize it (LGPD, art. 6º III, necessidade). + * + * It follows the way the gov.br account shows the registered address, `"li***********@gm*******"`: + * the first 2 characters of the local part and the first 2 of the domain stay, whatever they + * are, a dot included, the `@` stays, and every other character, the remaining dots included, + * becomes one `*`, so the length of the address is preserved. A first label of a single + * character therefore keeps the dot that follows it visible, `"maria@a.bc"` becoming + * `"ma***@a.**"`. The gov.br sample does not cover a local part of 1 or 2 characters, + * which that rule would show whole; here such a local part always loses its last character + * (`"ab@example.com"` becomes `"a*@ex*********"`, `"a@example.com"` becomes `"*@ex*********"`). + * + * The value is judged by `isValidEmail` as it comes, with no trimming, and keeps its letter case. + * + * @param {string} value - The e-mail address to obfuscate. + * @returns {string} The obfuscated address, or an empty string when the value is not a valid + * e-mail address. + * + * @example + * ```typescript + * obfuscateEmail("fulano.silva@example.com"); // "fu**********@ex*********" + * obfuscateEmail("ab@example.com.br"); // "a*@ex************" + * obfuscateEmail("maria@a.bc"); // "ma***@a.**" (a 1 character label leaves its dot visible) + * obfuscateEmail("not an e-mail"); // "" + * ``` + * + * @see Official: https://acesso.gov.br/faq/_perguntasdafaq/formarrecuperarconta.html + * The gov.br account FAQ, whose "Recuperar senha com e-mail" screen shows the registered address + * as `"li***********@gm*******"`. + * @see Official: https://www.planalto.gov.br/ccivil_03/_ato2015-2018/2018/lei/l13709.htm + * Lei nº 13.709/2018 (LGPD), art. 6º III: processing limited to the minimum the purpose needs. + */ +export const obfuscateEmail = (value: string): string => { + if (!isValidEmail(value)) return ""; + + const separatorIndex = value.indexOf("@"); + const local = value.slice(0, separatorIndex); + const domain = value.slice(separatorIndex + 1); + const visibleLocal = Math.min(VISIBLE_LENGTH, local.length - 1); + + return `${hideAfter(local, visibleLocal)}@${hideAfter(domain, VISIBLE_LENGTH)}`; +}; diff --git a/src/obfuscate-pix-key/obfuscate-pix-key.test.ts b/src/obfuscate-pix-key/obfuscate-pix-key.test.ts new file mode 100644 index 000000000..9b1f44ec5 --- /dev/null +++ b/src/obfuscate-pix-key/obfuscate-pix-key.test.ts @@ -0,0 +1,106 @@ +import * as fc from "fast-check"; + +import { anyGarbage, anyText } from "../_internals/test/arbitraries"; +import { expectAlwaysReturnsType } from "../_internals/test/properties"; +import { describe, expect, expectTypeOf, test } from "../_internals/test/runtime"; +import { generateCnpj } from "../generate-cnpj/generate-cnpj"; +import { generateCpf } from "../generate-cpf/generate-cpf"; +import { generatePhone } from "../generate-phone/generate-phone"; +import { getPixKeyInfo } from "../get-pix-key-info/get-pix-key-info"; +import { obfuscatePixKey } from "./obfuscate-pix-key"; + +describe("obfuscatePixKey", () => { + test("should hide the first 3 digits and the check digits of a CPF key", () => { + expect(obfuscatePixKey("12345678909")).toBe("***.456.789-**"); + expect(obfuscatePixKey("123.456.789-09")).toBe("***.456.789-**"); + expect(obfuscatePixKey(" 123.456.789-09 ")).toBe("***.456.789-**"); + }); + + test("should hide the first 2 characters and the check digits of a CNPJ key", () => { + expect(obfuscatePixKey("12345678000195")).toBe("**.345.678/0001-**"); + expect(obfuscatePixKey("12.345.678/0001-95")).toBe("**.345.678/0001-**"); + expect(obfuscatePixKey("q0SLFMBD7VX439")).toBe("**.SLF.MBD/7VX4-**"); + }); + + test("should keep the country code, the DDD and the last 2 digits of a phone key", () => { + expect(obfuscatePixKey("+5511987654321")).toBe("+55 11 *****-**21"); + expect(obfuscatePixKey("(11) 98765-4321")).toBe("+55 11 *****-**21"); + expect(obfuscatePixKey("11987654321")).toBe("+55 11 *****-**21"); + }); + + test("should lowercase and hide an e-mail key", () => { + expect(obfuscatePixKey("fulano@example.com")).toBe("fu****@ex*********"); + expect(obfuscatePixKey(" Fulano@Example.COM ")).toBe("fu****@ex*********"); + }); + + test("should return a random key whole, lowercased", () => { + expect(obfuscatePixKey("71c7d9be-4b85-4e43-9f1c-1f3b8b4e9a2d")).toBe( + "71c7d9be-4b85-4e43-9f1c-1f3b8b4e9a2d", + ); + expect(obfuscatePixKey("71C7D9BE-4B85-4E43-9F1C-1F3B8B4E9A2D")).toBe( + "71c7d9be-4b85-4e43-9f1c-1f3b8b4e9a2d", + ); + }); + + test("should read an 11 digit value valid as a CPF and as a phone the way getPixKeyInfo does", () => { + expect(obfuscatePixKey("51998259765")).toBe("***.982.597-**"); + expect(obfuscatePixKey("+5551998259765")).toBe("+55 51 *****-**65"); + }); + + test("should return an empty string for a value that is not a Pix key", () => { + expect(obfuscatePixKey("")).toBe(""); + expect(obfuscatePixKey("not a key")).toBe(""); + expect(obfuscatePixKey("12345678900")).toBe(""); + expect(obfuscatePixKey("(11) 3000-0000")).toBe(""); + expect(obfuscatePixKey("fulano@example")).toBe(""); + expect(obfuscatePixKey("__proto__")).toBe(""); + }); + + test("should return an empty string for a value that is not a string", () => { + // @ts-expect-error: intentionally invalid input + expect(obfuscatePixKey(null)).toBe(""); + // @ts-expect-error: intentionally invalid input + expect(obfuscatePixKey()).toBe(""); + // @ts-expect-error: intentionally invalid input + expect(obfuscatePixKey(12_345_678_909)).toBe(""); + // @ts-expect-error: intentionally invalid input + expect(obfuscatePixKey({ toString: () => "12345678909" })).toBe(""); + }); + + describe("properties", () => { + const emails = fc.stringMatching(/^[a-z0-9]{1,10}@[a-z0-9]{1,10}\.com$/); + + test("should print every kind of key in its documented shape", () => { + fc.assert( + fc.property(emails, fc.uuid(), (email, evp) => { + const phone = `+55${generatePhone("mobile")}`; + + expect(obfuscatePixKey(generateCpf())).toMatch(/^\*{3}\.\d{3}\.\d{3}-\*{2}$/); + expect(obfuscatePixKey(generateCnpj())).toMatch(/^\*{2}\.\d{3}\.\d{3}\/\d{4}-\*{2}$/); + expect(obfuscatePixKey(phone)).toMatch(/^\+55 \d{2} \*{5}-\*{2}\d{2}$/); + expect(obfuscatePixKey(email)).toMatch(/^[a-z0-9]{0,2}\*+@[a-z0-9.]{2}\*+$/); + expect(obfuscatePixKey(evp)).toBe(evp); + }), + ); + }); + + test("should return an empty string exactly when getPixKeyInfo rejects the value", () => { + fc.assert( + fc.property(anyText, (value) => { + expect(obfuscatePixKey(value) === "").toBe(getPixKeyInfo(value) === null); + }), + ); + }); + + test("should never throw and always return a string", () => { + expectAlwaysReturnsType(obfuscatePixKey, "string", fc.oneof(anyText, anyGarbage)); + }); + }); +}); + +describe("obfuscatePixKey types", () => { + test("should take a string and return a string", () => { + expectTypeOf(obfuscatePixKey).parameters.toEqualTypeOf<[value: string]>(); + expectTypeOf(obfuscatePixKey).returns.toEqualTypeOf(); + }); +}); diff --git a/src/obfuscate-pix-key/obfuscate-pix-key.ts b/src/obfuscate-pix-key/obfuscate-pix-key.ts new file mode 100644 index 000000000..297b3c780 --- /dev/null +++ b/src/obfuscate-pix-key/obfuscate-pix-key.ts @@ -0,0 +1,60 @@ +import { formatCnpj } from "../format-cnpj/format-cnpj"; +import { formatCpf } from "../format-cpf/format-cpf"; +import { formatPhone } from "../format-phone/format-phone"; +import { getPixKeyInfo } from "../get-pix-key-info/get-pix-key-info"; +import { obfuscateEmail } from "../obfuscate-email/obfuscate-email"; + +/** + * Hides most of a Pix key with `*`, for the places where a key is shown to someone who should + * only recognize it (LGPD, art. 6º III, necessidade), such as a list of registered keys. + * + * The key is identified by `getPixKeyInfo`, under the rules documented there, and each kind is + * hidden by the utility that already knows how: + * - `cpf`: `formatCpf` with `obfuscate`, `"***.456.789-**"`, the form the Banco Central itself + * prints for a "CPF mascarado" in the Pix user experience manual; + * - `cnpj`: `formatCnpj` with `obfuscate`, `"**.345.678/0001-**"`; + * - `phone`: `formatPhone` with the `"international"` mask and `obfuscate`, + * `"+55 11 *****-**21"`; + * - `email`: `obfuscateEmail` over the lowercased address, `"fu****@ex*********"`; + * - `evp`: returned whole, lowercased. The DICT manual defines the random key as a sequence + * "que não possui qualquer significado, a não ser o de servir como uma chave Pix", so it + * carries no personal data to hide. + * + * The user experience manual forbids masking the key on the screen where a payer confirms the + * recipient ("Não deverá haver qualquer mascaramento de chave Pix no retorno da consulta ao + * DICT"), so this is not meant for that screen. + * + * @param {string} value - The Pix key to obfuscate. + * @returns {string} The obfuscated key, or an empty string when the value is not a valid Pix key. + * + * @example + * ```typescript + * obfuscatePixKey("123.456.789-09"); // "***.456.789-**" + * obfuscatePixKey("12345678000195"); // "**.345.678/0001-**" + * obfuscatePixKey("(11) 98765-4321"); // "+55 11 *****-**21" + * obfuscatePixKey("Fulano@Example.com"); // "fu****@ex*********" + * obfuscatePixKey("71C7D9BE-4B85-4E43-9F1C-1F3B8B4E9A2D"); // "71c7d9be-4b85-4e43-9f1c-1f3b8b4e9a2d" + * obfuscatePixKey("not a key"); // "" + * ``` + * + * @see Official: https://www.bcb.gov.br/content/estabilidadefinanceira/pix/Regulamento_Pix/IV_RequisitosMinimosparaExperienciadoUsuario.pdf + * Requisitos Mínimos para a Experiência do Usuário: "CPF mascarado (ex: ***.777.888-**)" and the + * rule against masking the key on the confirmation screen. + * @see Official: https://www.bcb.gov.br/content/estabilidadefinanceira/pix/Regulamento_Pix/X_ManualOperacionaldoDICT.pdf + * Manual Operacional do DICT: the five kinds of key and the definition of the random key. + */ +export const obfuscatePixKey = (value: string): string => { + const key = getPixKeyInfo(value); + + if (!key) return ""; + + if (key.type === "cpf") return formatCpf(key.value, { obfuscate: true }); + + if (key.type === "cnpj") return formatCnpj(key.value, { version: 2, obfuscate: true }); + + if (key.type === "phone") { + return formatPhone(key.value, { mask: "international", obfuscate: true }); + } + + return key.type === "email" ? obfuscateEmail(key.value) : key.value; +}; diff --git a/src/parse-cest/constants.ts b/src/parse-cest/constants.ts new file mode 100644 index 000000000..eb25746c7 --- /dev/null +++ b/src/parse-cest/constants.ts @@ -0,0 +1,2 @@ +/** Digits of a CEST (Código Especificador da Substituição Tributária), printed as "00.000.00". */ +export const LENGTH = 7; diff --git a/src/parse-cest/parse-cest.test.ts b/src/parse-cest/parse-cest.test.ts new file mode 100644 index 000000000..d4ac9c789 --- /dev/null +++ b/src/parse-cest/parse-cest.test.ts @@ -0,0 +1,66 @@ +import { anyText, anyValue, digitsUpTo } from "../_internals/test/arbitraries"; +import { + expectAlwaysReturnsType, + expectIdempotent, + expectMatchesPattern, + expectRoundTrip, +} from "../_internals/test/properties"; +import { describe, expect, expectTypeOf, it, test } from "../_internals/test/runtime"; +import { formatCest } from "../format-cest/format-cest"; +import { parseCest } from "./parse-cest"; + +describe("parseCest", () => { + it("should remove the CEST mask characters", () => { + expect(parseCest("01.001.00")).toBe("0100100"); + }); + + it("should remove every character that is not a digit", () => { + expect(parseCest("CEST 28-999/00 ")).toBe("2899900"); + }); + + it("should ignore the digits after the CEST length", () => { + expect(parseCest("01001009876")).toBe("0100100"); + }); + + it("should read a number as the string of its digits, without padding it", () => { + expect(parseCest(2_899_900)).toBe("2899900"); + expect(parseCest(100_100)).toBe("100100"); + }); + + it("should keep a partial code as written", () => { + expect(parseCest("28.999")).toBe("28999"); + expect(parseCest("")).toBe(""); + }); + + it("should return an empty string for null and undefined", () => { + // @ts-expect-error not a string or number + expect(parseCest(null)).toBe(""); + // @ts-expect-error not a string or number + expect(parseCest()).toBe(""); + }); + + describe("properties", () => { + test("should return at most the digits of a CEST", () => { + expectMatchesPattern(parseCest, /^\d{0,7}$/, anyText); + }); + + test("should undo formatCest", () => { + expectRoundTrip(formatCest, parseCest, digitsUpTo(7)); + }); + + test("should be idempotent", () => { + expectIdempotent(parseCest, anyText); + }); + + test("should never throw and always return a string", () => { + expectAlwaysReturnsType(parseCest, "string", anyValue); + }); + }); +}); + +describe("parseCest types", () => { + test("should take a string or number value and return a string", () => { + expectTypeOf(parseCest).parameter(0).toEqualTypeOf(); + expectTypeOf(parseCest).returns.toEqualTypeOf(); + }); +}); diff --git a/src/parse-cest/parse-cest.ts b/src/parse-cest/parse-cest.ts new file mode 100644 index 000000000..8a3c48637 --- /dev/null +++ b/src/parse-cest/parse-cest.ts @@ -0,0 +1,29 @@ +import { isNullish } from "../_internals/is-nullish/is-nullish"; +import { sanitizeToDigits } from "../_internals/sanitize-to-digits/sanitize-to-digits"; +import { LENGTH } from "./constants"; + +/** + * Removes CEST (Código Especificador da Substituição Tributária) formatting characters and + * returns only digits. + * + * A complete code has 7 digits (2 of segment, 3 of item, 2 of specification), which is the + * length the result is capped at; a shorter value (a code still being typed) passes through as + * far as it goes and is never left padded, so the leading zero of segments 01 to 09 has to be + * written out. Use `isValidCest` or `getCest`, which do pad a bare numeric code, to check a code + * against the official annexes. + * + * @param {string|number} value - The CEST to be parsed. + * @returns {string} Up to 7 digits, or an empty string when there is no digit at all. + * + * @example + * ```typescript + * parseCest("01.001.00"); // "0100100" + * parseCest("28.999"); // "28999" + * ``` + * + * @see Official: https://www.confaz.fazenda.gov.br/legislacao/convenios/2018/CV142_18 + * Convênio ICMS 142/18, cláusula sexta, IV (the 7 digits) and Anexos II to XXVI, which print the + * codes in the "NN.NNN.NN" form. + */ +export const parseCest = (value: string | number): string => + isNullish(value) ? "" : sanitizeToDigits(value).slice(0, LENGTH); diff --git a/src/parse-cid10/constants.ts b/src/parse-cid10/constants.ts new file mode 100644 index 000000000..b980ecb05 --- /dev/null +++ b/src/parse-cid10/constants.ts @@ -0,0 +1,2 @@ +/** Characters of a complete CID-10 subcategory code, printed as "A00.0". */ +export const LENGTH = 4; diff --git a/src/parse-cid10/parse-cid10.test.ts b/src/parse-cid10/parse-cid10.test.ts new file mode 100644 index 000000000..433071150 --- /dev/null +++ b/src/parse-cid10/parse-cid10.test.ts @@ -0,0 +1,84 @@ +import { anyGarbage, anyText, asciiAlphanumericText } from "../_internals/test/arbitraries"; +import { + expectCaseInsensitive, + expectIdempotent, + expectMatchesPattern, + expectNeverThrows, +} from "../_internals/test/properties"; +import { describe, expect, expectTypeOf, it, test } from "../_internals/test/runtime"; +import { parseCid10 } from "./parse-cid10"; + +describe("parseCid10", () => { + it("should remove the dot of a subcategory", () => { + expect(parseCid10("A00.0")).toBe("A000"); + }); + + it("should keep a code that has no dot", () => { + expect(parseCid10("A000")).toBe("A000"); + expect(parseCid10("A00")).toBe("A00"); + }); + + it("should upper case the letter", () => { + expect(parseCid10("f32.2")).toBe("F322"); + }); + + it("should drop every character that is not a letter or a digit", () => { + expect(parseCid10(" A-0/0.0 ")).toBe("A000"); + }); + + it("should pass a partial value through", () => { + expect(parseCid10("A")).toBe("A"); + expect(parseCid10("A0")).toBe("A0"); + expect(parseCid10("A00.")).toBe("A00"); + }); + + it("should cap the result at the 4 characters of a subcategory", () => { + expect(parseCid10("A00.01")).toBe("A000"); + expect(parseCid10("A00012345")).toBe("A000"); + }); + + it("should not validate whether the code exists in the official table", () => { + expect(parseCid10("0A.9Z")).toBe("0A9Z"); + }); + + it("should return an empty string for an empty value", () => { + expect(parseCid10("")).toBe(""); + expect(parseCid10(" . ")).toBe(""); + }); + + it("should return an empty string for a value that is not a string", () => { + // @ts-expect-error not a string + expect(parseCid10(null)).toBe(""); + // @ts-expect-error not a string + expect(parseCid10()).toBe(""); + // @ts-expect-error not a string + expect(parseCid10(1000)).toBe(""); + // @ts-expect-error not a string + expect(parseCid10(["A000"])).toBe(""); + }); + + describe("properties", () => { + test("should never throw, regardless of the input", () => { + expectNeverThrows(parseCid10, anyGarbage); + }); + + test("should always return up to 4 upper case letters and digits", () => { + expectMatchesPattern(parseCid10, /^[A-Z0-9]{0,4}$/, anyText); + }); + + test("should be idempotent", () => { + expectIdempotent(parseCid10, anyText); + }); + + test("should ignore the case of an ascii alphanumeric value", () => { + expectCaseInsensitive(parseCid10, asciiAlphanumericText); + }); + }); +}); + +describe("parseCid10 types", () => { + test("should take a string and return a string", () => { + expectTypeOf(parseCid10).parameter(0).toEqualTypeOf(); + expectTypeOf(parseCid10).returns.toEqualTypeOf(); + }); +}); diff --git a/src/parse-cid10/parse-cid10.ts b/src/parse-cid10/parse-cid10.ts new file mode 100644 index 000000000..0a405fc4e --- /dev/null +++ b/src/parse-cid10/parse-cid10.ts @@ -0,0 +1,29 @@ +import { sanitizeToAlphanumeric } from "../_internals/sanitize-to-alphanumeric/sanitize-to-alphanumeric"; +import { LENGTH } from "./constants"; + +/** + * Removes CID-10 (Classificação Internacional de Doenças, 10th revision) formatting characters + * and returns the upper case code without the dot, the form the DATASUS tables store. + * + * This is a purely structural transformation: a subcategory has 4 characters, which is the + * length the result is capped at, and a shorter value (a category, or a code still being typed) + * passes through as far as it goes. It does not check the code against the official table, use + * `isValidCid10` for that. + * + * @param {string} value - The CID-10 code to be parsed. + * @returns {string} Up to 4 upper case letters and digits, or an empty string when there is none + * or the value is not a string. + * + * @example + * ```typescript + * parseCid10("A00.0"); // "A000" + * parseCid10("f32.2"); // "F322" + * parseCid10("A00"); // "A00" + * ``` + * + * @see Official: http://www2.datasus.gov.br/cid10/V2008/descrcsv.htm + * The DATASUS description of the CID-10 tables: `SUBCAT` is the subcategory code "sem incluir + * ponto". + */ +export const parseCid10 = (value: string): string => + typeof value === "string" ? sanitizeToAlphanumeric(value).slice(0, LENGTH) : ""; diff --git a/src/parse-nfse-key/constants.ts b/src/parse-nfse-key/constants.ts new file mode 100644 index 000000000..c1e4ac265 --- /dev/null +++ b/src/parse-nfse-key/constants.ts @@ -0,0 +1,2 @@ +/** Digits of a national NFS-e access key (chave de acesso), type `TSChaveNFSe` of the leiaute. */ +export const LENGTH = 50; diff --git a/src/parse-nfse-key/parse-nfse-key.test.ts b/src/parse-nfse-key/parse-nfse-key.test.ts new file mode 100644 index 000000000..6fef0845b --- /dev/null +++ b/src/parse-nfse-key/parse-nfse-key.test.ts @@ -0,0 +1,71 @@ +import { anyText, anyValue } from "../_internals/test/arbitraries"; +import { + expectAlwaysReturnsType, + expectIdempotent, + expectMatchesPattern, +} from "../_internals/test/properties"; +import { describe, expect, expectTypeOf, it, test } from "../_internals/test/runtime"; +import { parseNfseKey } from "./parse-nfse-key"; + +const KEY = "35503082258716523000119000000000001226011357924683"; + +describe("parseNfseKey", () => { + it("should keep a bare access key as it is", () => { + expect(parseNfseKey(KEY)).toBe(KEY); + }); + + it("should strip the NFS prefix of the XML Id attribute", () => { + expect(parseNfseKey(`NFS${KEY}`)).toBe(KEY); + expect(parseNfseKey(` nfs${KEY}`)).toBe(KEY); + }); + + it("should remove non numeric characters", () => { + expect(parseNfseKey("3550308 2 2 58716523000119 0000000000012 2601 135792468 3")).toBe(KEY); + expect(parseNfseKey("3550308.2.2.58716523000119/0000000000012-2601-135792468-3")).toBe(KEY); + }); + + it("should ignore digits after the 50 of an access key", () => { + expect(parseNfseKey(`${KEY}999`)).toBe(KEY); + }); + + it("should keep a partial access key as written", () => { + expect(parseNfseKey("3550308 2 2")).toBe("355030822"); + }); + + it("should read a number as the string of its digits", () => { + expect(parseNfseKey(355_030_822)).toBe("355030822"); + }); + + it("should return an empty string when there is no digit", () => { + expect(parseNfseKey("NFS")).toBe(""); + expect(parseNfseKey("")).toBe(""); + }); + + it("should return an empty string for null and undefined", () => { + // @ts-expect-error not a string or number + expect(parseNfseKey(null)).toBe(""); + // @ts-expect-error not a string or number + expect(parseNfseKey()).toBe(""); + }); + + describe("properties", () => { + test("should return at most the digits of an access key", () => { + expectMatchesPattern(parseNfseKey, /^\d{0,50}$/, anyText); + }); + + test("should be idempotent", () => { + expectIdempotent(parseNfseKey, anyText); + }); + + test("should never throw and always return a string", () => { + expectAlwaysReturnsType(parseNfseKey, "string", anyValue); + }); + }); +}); + +describe("parseNfseKey types", () => { + test("should take a string or number value and return a string", () => { + expectTypeOf(parseNfseKey).parameter(0).toEqualTypeOf(); + expectTypeOf(parseNfseKey).returns.toEqualTypeOf(); + }); +}); diff --git a/src/parse-nfse-key/parse-nfse-key.ts b/src/parse-nfse-key/parse-nfse-key.ts new file mode 100644 index 000000000..262b46d74 --- /dev/null +++ b/src/parse-nfse-key/parse-nfse-key.ts @@ -0,0 +1,36 @@ +import { isNullish } from "../_internals/is-nullish/is-nullish"; +import { sanitizeToDigits } from "../_internals/sanitize-to-digits/sanitize-to-digits"; +import { LENGTH } from "./constants"; + +/** + * Removes everything but the digits from the access key (chave de acesso) of a national NFS-e. + * + * The `NFS` literal the `Id` attribute of `infNFSe` puts in front of the key goes away with + * every other character that is not a digit. The result is + * the form the leiaute stores the key in (`TSChaveNFSe`) and the one the DANFSe prints, a + * single block of digits, so this package has no `formatNfseKey`. + * + * The result is capped at the 50 digits of an access key; a shorter value passes through as far + * as it goes. Use `isValidNfseKey` to check the key and `getNfseKeyInfo` to read its fields. + * + * @param {string|number} value - The access key value to be parsed. + * @returns {string} Up to 50 digits, or an empty string when there is no digit at all. + * + * @example + * ```typescript + * parseNfseKey("NFS35503082258716523000119000000000001226011357924683"); + * // "35503082258716523000119000000000001226011357924683" + * + * parseNfseKey("3550308 2 2 58716523000119 0000000000012 2601 135792468 3"); + * // "35503082258716523000119000000000001226011357924683" + * ``` + * + * @see Official: https://www.gov.br/nfse/pt-br/biblioteca/documentacao-tecnica/documentacao-atual + * Sistema Nacional NFS-e, current technical documentation: `NFSe-ESQUEMAS_XSD-v1.01` + * (`tiposSimples_v1.01.xsd`), types `TSChaveNFSe` (50 digits) and `TSIdNFSe` (the `NFS` prefix). + * @see Official: https://www.gov.br/nfse/pt-br/biblioteca/documentacao-tecnica/rtc/nt-008-se-cgnfse-danfse-20260714-v1-02.pdf + * Nota Técnica SE/CGNFS-e 008 (DANFSe), item 2.1.1: the key is printed as a single block of 50 + * digits. + */ +export const parseNfseKey = (value: string | number): string => + isNullish(value) ? "" : sanitizeToDigits(value).slice(0, LENGTH); diff --git a/src/parse-suframa/parse-suframa.test.ts b/src/parse-suframa/parse-suframa.test.ts new file mode 100644 index 000000000..cfd744696 --- /dev/null +++ b/src/parse-suframa/parse-suframa.test.ts @@ -0,0 +1,60 @@ +import { anyText, anyValue } from "../_internals/test/arbitraries"; +import { + expectAlwaysReturnsType, + expectIdempotent, + expectMatchesPattern, +} from "../_internals/test/properties"; +import { describe, expect, expectTypeOf, it, test } from "../_internals/test/runtime"; +import { parseSuframa } from "./parse-suframa"; + +describe("parseSuframa", () => { + it("should remove Inscrição SUFRAMA mask characters", () => { + expect(parseSuframa("12.3456.789")).toBe("123456789"); + expect(parseSuframa("20.5678.10-6")).toBe("205678106"); + }); + + it("should keep an unmasked value as it is", () => { + expect(parseSuframa("123456789")).toBe("123456789"); + expect(parseSuframa("10001018")).toBe("10001018"); + }); + + it("should accept a number", () => { + expect(parseSuframa(123_456_789)).toBe("123456789"); + }); + + it("should remove non numeric characters", () => { + expect(parseSuframa("12#Error*&@#3456#Char!789")).toBe("123456789"); + }); + + it("should ignore digits after the Inscrição SUFRAMA length", () => { + expect(parseSuframa("123456789123")).toBe("123456789"); + }); + + it("should return an empty string for null or undefined", () => { + // @ts-expect-error: intentionally invalid input + expect(parseSuframa(null)).toBe(""); + // @ts-expect-error: intentionally invalid input + expect(parseSuframa()).toBe(""); + }); + + describe("properties", () => { + test("should return at most the digits of an Inscrição SUFRAMA", () => { + expectMatchesPattern(parseSuframa, /^\d{0,9}$/, anyText); + }); + + test("should be idempotent", () => { + expectIdempotent(parseSuframa, anyText); + }); + + test("should never throw and always return a string", () => { + expectAlwaysReturnsType(parseSuframa, "string", anyValue); + }); + }); +}); + +describe("parseSuframa types", () => { + test("should take a string or number value and return a string", () => { + expectTypeOf(parseSuframa).parameter(0).toEqualTypeOf(); + expectTypeOf(parseSuframa).returns.toEqualTypeOf(); + }); +}); diff --git a/src/parse-suframa/parse-suframa.ts b/src/parse-suframa/parse-suframa.ts new file mode 100644 index 000000000..40336f18b --- /dev/null +++ b/src/parse-suframa/parse-suframa.ts @@ -0,0 +1,24 @@ +import { SUFRAMA_LENGTH } from "../_internals/constants/suframa"; +import { isNullish } from "../_internals/is-nullish/is-nullish"; +import { sanitizeToDigits } from "../_internals/sanitize-to-digits/sanitize-to-digits"; + +/** + * Removes Inscrição SUFRAMA formatting characters and returns only digits, the way the `ISUF` + * field of the NF-e expects them. + * + * @param {string|number} value - The Inscrição SUFRAMA to be parsed. + * @returns {string} The Inscrição SUFRAMA without formatting. + * + * @example + * ```typescript + * parseSuframa("12.3456.789"); // "123456789" + * ``` + * + * @see Official: https://www.confaz.fazenda.gov.br/legislacao/arquivo-manuais/moc7-visao-geral.pdf + * Manual de Orientação do Contribuinte (MOC) NF-e 7.0, Visão Geral, section 8.4, which gives the + * composition as `SS.NNNN.LLD`. + * @see Official: https://www.confaz.fazenda.gov.br/legislacao/arquivo-manuais/moc7-anexo-i-leiaute-e-rv.pdf + * MOC 7.0, Anexo I: field 79 (`E18`, `ISUF`) is numeric with 8 to 9 positions. + */ +export const parseSuframa = (value: string | number): string => + isNullish(value) ? "" : sanitizeToDigits(value).slice(0, SUFRAMA_LENGTH); diff --git a/src/sub-business-days/sub-business-days.test.ts b/src/sub-business-days/sub-business-days.test.ts index f428e7a84..783ff7a13 100644 --- a/src/sub-business-days/sub-business-days.test.ts +++ b/src/sub-business-days/sub-business-days.test.ts @@ -8,7 +8,7 @@ import { PROTOTYPE_KEYS, } from "../_internals/test/arbitraries"; import { expectNeverThrowsWithArguments } from "../_internals/test/properties"; -import { describe, expect, expectTypeOf, it, test } from "../_internals/test/runtime"; +import { describe, expect, expectTypeOf, inTimeZone, it, test } from "../_internals/test/runtime"; import { addBusinessDays } from "../add-business-days/add-business-days"; import { type BusinessDayOptions } from "../is-business-day/is-business-day"; import { subBusinessDays } from "./sub-business-days"; @@ -113,6 +113,32 @@ describe("subBusinessDays", () => { }); }); + describe("includeSaturday", () => { + it("should stop on Saturday when it counts (Mon 2024-01-08 - 1 -> Sat 2024-01-06)", () => { + const result = subBusinessDays(new Date(2024, 0, 8, 12), 1, { includeSaturday: true }); + + expect(result).toEqual(new Date(2024, 0, 6, 12)); + }); + + it("should keep walking back to Friday without the option (Mon 2024-01-08 - 1 -> Fri 2024-01-05)", () => { + expect(subBusinessDays(new Date(2024, 0, 8, 12), 1, { includeSaturday: false })).toEqual( + new Date(2024, 0, 5, 12), + ); + }); + + it("should still walk back over a holiday that falls on a Saturday (Mon 2024-11-04 - 1 -> Fri 2024-11-01, Finados)", () => { + const result = subBusinessDays(new Date(2024, 10, 4, 12), 1, { includeSaturday: true }); + + expect(result).toEqual(new Date(2024, 10, 1, 12)); + }); + + it("should walk forwards onto Saturday for a negative amount (Fri 2024-01-05 - -1 -> Sat 2024-01-06)", () => { + const result = subBusinessDays(new Date(2024, 0, 5, 12), -1, { includeSaturday: true }); + + expect(result).toEqual(new Date(2024, 0, 6, 12)); + }); + }); + describe("invalid input", () => { for (const [label, call] of NULL_CALLS) { it(`should return null for ${label}`, () => { @@ -121,6 +147,26 @@ describe("subBusinessDays", () => { } }); + inTimeZone("Pacific/Apia", () => { + it("should walk back over 30 December 2011, the local day Samoa skipped to cross the date line", () => { + expect(subBusinessDays(new Date(2012, 0, 5, 12), 4)).toEqual(new Date(2011, 11, 29, 12)); + }); + + it("should walk back over it with includeSaturday too, counting Sat 2011-12-31 and landing on Thu 2011-12-29", () => { + expect(subBusinessDays(new Date(2012, 0, 2, 12), 2, { includeSaturday: true })).toEqual( + new Date(2011, 11, 29, 12), + ); + }); + }); + + inTimeZone("America/Sao_Paulo", () => { + it("should keep the time-of-day across the summer time start of 4 November 2018", () => { + expect(subBusinessDays(new Date(2018, 10, 9, 9, 30), 5)).toEqual( + new Date(2018, 10, 1, 9, 30), + ); + }); + }); + describe("properties", () => { test("should never throw, regardless of the input, prototype chain state codes included", () => { expectNeverThrowsWithArguments( diff --git a/src/sub-business-days/sub-business-days.ts b/src/sub-business-days/sub-business-days.ts index 664c6fbde..e3449218a 100644 --- a/src/sub-business-days/sub-business-days.ts +++ b/src/sub-business-days/sub-business-days.ts @@ -8,9 +8,9 @@ export type { BusinessDayOptions } from "../is-business-day/is-business-day"; * * The mirror image of `addBusinessDays`, which it delegates to: `subBusinessDays(date, amount)` * is `addBusinessDays(date, -amount)`, down to the last detail. A business day is a day for - * which `isBusinessDay` returns `true` (not a Saturday, a Sunday, or a Brazilian holiday), - * evaluated with the same `options`, and the walk goes one calendar day at a time, counting only - * business days. + * which `isBusinessDay` returns `true` (not a Saturday, a Sunday, or a Brazilian holiday; + * `options.includeSaturday` keeps Saturday), evaluated with the same `options`, and the walk goes + * one calendar day at a time, counting only business days. * * `amount: 0` returns a **new `Date` equal to `date`, unchanged**, even when `date` itself falls * on a weekend or holiday, and a negative `amount` walks *forwards*, exactly like date-fns' @@ -19,6 +19,12 @@ export type { BusinessDayOptions } from "../is-business-day/is-business-day"; * The time-of-day (hours, minutes, seconds, milliseconds) of `date` is preserved in the result, * and `date` itself is never mutated. * + * `options.includeSaturday` defaults to `false`, the Monday to Friday banking count. Pass `true` + * for the labour law count of Instrução Normativa MTP nº 2/2021, art. 14, I, which includes + * Saturday and still excludes Sunday and holidays, so a holiday that falls on a Saturday is never + * counted. See `isBusinessDay` for the law behind it and for what it does not cover: municipal + * holidays, which `getHolidays` does not carry. + * * If `options.stateCode` is provided but is not a valid/known state code, it is ignored and only * national holidays are considered (same behavior as `getHolidays`/`isBusinessDay`), so a * prototype-chain key such as `"__proto__"` is an unknown state code like any other. An `options` @@ -29,9 +35,10 @@ export type { BusinessDayOptions } from "../is-business-day/is-business-day"; * * @param {Date} date - The date to count from. Never mutated: a new `Date` is returned. * @param {number} amount - The number of business days to subtract; a negative value walks forwards. - * @param {BusinessDayOptions} [options] - Which holidays count as non-business days. + * @param {BusinessDayOptions} [options] - Which days count as business days. * @param {StateCode} [options.stateCode] - Brazilian state code whose state holidays are also considered. * @param {boolean} [options.includeOptional] - Whether optional holidays count as non-business days (default: `true`). + * @param {boolean} [options.includeSaturday] - Whether Saturday counts as a business day (default: `false`). * @returns {Date | null} A new `Date`, `amount` business days before `date`. `null` on bad input: * a `date` that is not a valid `Date` or is outside 1900-2099, an `amount` that is not a finite * integer, a `stateCode` that is not a string, or a walk that leaves the supported years. @@ -43,6 +50,8 @@ export type { BusinessDayOptions } from "../is-business-day/is-business-day"; * subBusinessDays(new Date(2025, 0, 2, 12), 1); // Tue 2024-12-31, 12:00 (Jan 1 is Ano novo, skipped) * subBusinessDays(new Date(2024, 0, 5, 12), -1); // Mon 2024-01-08, 12:00 (walks forwards) * subBusinessDays(new Date(2024, 0, 6, 12), 0); // Sat 2024-01-06, 12:00 (unchanged, even though Saturday is not a business day) + * subBusinessDays(new Date(2024, 0, 8, 12), 1, { includeSaturday: true }); // Sat 2024-01-06, 12:00 (labour count) + * subBusinessDays(new Date(2024, 10, 4, 12), 1, { includeSaturday: true }); // Fri 2024-11-01, 12:00 (Nov 2 is Finados, a holiday on a Saturday) * subBusinessDays(new Date(2024, 6, 10, 12), 1, { stateCode: "SP" }); // Mon 2024-07-08, 12:00 (Jul 9 is a state holiday in SP) * subBusinessDays(new Date("not a date"), 1); // null * subBusinessDays(new Date(2024, 0, 2), 1.5); // null (not an integer) diff --git a/tsconfig.json b/tsconfig.json index dba30ea21..01499eb0a 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -19,7 +19,9 @@ "noImplicitOverride": true }, // The documentation site is not part of the library: its examples are written for React, - // Angular and Vue, and the templates they are generated from are not valid TypeScript on their - // own. `npm run build:docs` and the type-check of each example live in the docs workflow. - "exclude": ["docs", "dist", "coverage", "reports", ".stryker-tmp"] + // Angular and Vue. `npm run build:docs` and the type-check of each example live in the docs + // workflow. `base` is the second checkout the Tree-shaking job of the build workflow writes + // there, a whole copy of the repository at the base revision of the pull request: the build + // running here compiles the head, never it. + "exclude": ["base", "docs", "dist", "coverage", "reports", ".stryker-tmp"] } diff --git a/vite.config.ts b/vite.config.ts index f5c52e475..1d423dc54 100644 --- a/vite.config.ts +++ b/vite.config.ts @@ -145,8 +145,7 @@ const sharedPack = { export default defineConfig({ fmt: { - // `reports` holds generated output only, the committed API Extractor baseline included: - // reformatting its code block would make every `check:api` run report a changed API. + // `reports` holds generated output only (the Stryker mutation reports). // `CHANGELOG.md` is written by release-please (`* ` bullets); formatting it would fail the // Check workflow on every release PR. ignorePatterns: [