{"id":23508632,"url":"https://github.com/lucashpmelo/node-mde","last_synced_at":"2025-04-05T15:04:07.045Z","repository":{"id":37506759,"uuid":"483338374","full_name":"lucashpmelo/node-mde","owner":"lucashpmelo","description":"Biblioteca em Node.js para consultar NF-e destinadas e registrar evento de manifestação do destinatário no WebService da Sefaz","archived":false,"fork":false,"pushed_at":"2025-03-18T17:46:20.000Z","size":130,"stargazers_count":53,"open_issues_count":2,"forks_count":21,"subscribers_count":5,"default_branch":"main","last_synced_at":"2025-03-29T14:08:04.671Z","etag":null,"topics":["dfe","javascript","mde","nfe","nodejs","sefaz","soap"],"latest_commit_sha":null,"homepage":"https://npmjs.com/node-mde","language":"JavaScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/lucashpmelo.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","contributing":"CONTRIBUTING.md","funding":null,"license":"LICENSE","code_of_conduct":"CODE_OF_CONDUCT.md","threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2022-04-19T17:10:14.000Z","updated_at":"2025-03-18T17:44:55.000Z","dependencies_parsed_at":"2023-02-09T20:46:29.884Z","dependency_job_id":"e28c7f6b-d0c3-4856-92db-e3a091e3d4e5","html_url":"https://github.com/lucashpmelo/node-mde","commit_stats":{"total_commits":112,"total_committers":2,"mean_commits":56.0,"dds":0.0714285714285714,"last_synced_commit":"985ec7a0caf5489c13475ada8425fa04d5dd49f4"},"previous_names":[],"tags_count":33,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/lucashpmelo%2Fnode-mde","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/lucashpmelo%2Fnode-mde/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/lucashpmelo%2Fnode-mde/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/lucashpmelo%2Fnode-mde/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/lucashpmelo","download_url":"https://codeload.github.com/lucashpmelo/node-mde/tar.gz/refs/heads/main","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":247353729,"owners_count":20925329,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["dfe","javascript","mde","nfe","nodejs","sefaz","soap"],"created_at":"2024-12-25T11:24:54.201Z","updated_at":"2025-04-05T15:04:07.010Z","avatar_url":"https://github.com/lucashpmelo.png","language":"JavaScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Node MD-e\n\n[![npm version](https://img.shields.io/npm/v/node-mde.svg)](https://www.npmjs.com/package/node-mde)\n[![npm downloads](https://img.shields.io/npm/dt/node-mde.svg)](https://npm-stat.com/charts.html?package=node-mde)\n[![MIT License](https://img.shields.io/badge/license-MIT-blue.svg)](https://github.com/lucashpmelo/node-mde/blob/main/LICENSE)\n[![Package Quality](https://packagequality.com/shield/node-mde.svg)](https://packagequality.com/#?package=node-mde)\n[![Quality Gate Status](https://sonarcloud.io/api/project_badges/measure?project=lucashpmelo_node-mde\u0026metric=alert_status)](https://sonarcloud.io/dashboard?id=lucashpmelo_node-mde)\n[![Known Vulnerabilities](https://snyk.io/test/npm/node-mde/badge.svg)](https://snyk.io/test/npm/node-mde)\n\nBiblioteca para consumo dos Web Services da Sefaz de Distribuição de DF-e e Evento de Manifestação do Destinatário.\n\nEssa biblioteca permite consultar a relação das notas fiscais emitidas contra um determinado CNPJ/CPF e realizar o envio do evento de manifestação, podendo assim, baixar o XML da NF-e.\n\n## Instalação\n\n```sh\n$ npm i node-mde\n```\n\n## Pré-Requisitos\n\n- Possuir um **Certificado A1** válido emitido por uma Autoridade Certificadora credenciada pela Infraestrutura de Chaves Públicas Brasileira – **ICP-Brasil**.\n- O certificado pode ser usando no formato **PFX** e **Senha** _OU_ **cert.pem** e **key.pem**\n\n## Funcionalidades\n\n- Consultar por último NSU\n  - Retorna a relação dos Documentos Fiscais (`Resumo da NF-e`, `NF-e`, `Resumo do Evento` ou `Evento`)\n- Consultar por chave de acesso\n  - Retorna o `XML da NF-e` ou o `Resumo da NF-e`\n- Consultar por NSU\n  - Retorna o Documento Fiscal referente ao NSU informado, podendo ser um `Resumo`, uma `NF-e` ou um `Evento`\n- Envio de evento\n  - Registra o evento de manifestação na nota informada (`Confirmação da Operação`, `Ciência da Operação`, `Desconhecimento da Operação` ou `Operação não Realizada`)\n\n## Distribuição de DF-e\n\n### Construtor\n\n```js\nnew DistribuicaoDFe(config)\n```\n\n- `config` `\u003cObject\u003e`\n  - `pfx` `\u003cBuffer\u003e` - [OPCIONAL] - Arquivo **.pfx**. Se o `pfx` não for informado, as propriedades `cert` e `key` passam a ser obrigatórias.\n  - `passphrase` `\u003cString\u003e` - [OPCIONAL] - Senha do arquivo **.pfx**.\n  - `cert` `\u003cBuffer | String\u003e` - [OPCIONAL] - Conteúdo do _cert.pem_. Essa propriedade fica obrigatória se o `pfx` não for informado.\n  - `key` `\u003cBuffer | String\u003e` - [OPCIONAL] - Conteúdo do _key.pem_. Essa propriedade fica obrigatória se o `pfx` não for informado.\n  - `cUFAutor` `\u003cString\u003e` - [OBRIGATÓRIO] - Código da UF do autor. Consulte a tabela [códigos UF](#códigos-uf).\n  - `cnpj` `\u003cString\u003e` - [OPCIONAL] - CNPJ do interessado no DF-e. Se não informado um CNPJ, será obrigatório informar um CPF.\n  - `cpf` `\u003cString\u003e` - [OPCIONAL] - CPF do interessado no DF-e. Se não informado um CPF, será obrigatório informar um CNPJ.\n  - `tpAmb` `\u003cString\u003e` - [OBRIGATÓRIO] - Identificação de Ambiente. Informar `'1'` para **Produção** ou `'2'` para **Homologação**.\n  - `options` `\u003cObject\u003e` - [OPCIONAL]\n    - `requestOptions` `\u003cAxiosRequestConfig\u003e` - [OPCIONAL]\n    - `httpsOptions` `\u003cAgentOptions\u003e` - [OPCIONAL]\n\n### Consulta por ultNSU\n\n| Campo    |   Tipo   | Tamanho | Descrição                      |\n| :------- | :------: | :-----: | :----------------------------- |\n| `ultNSU` | _string_ |  1-15   | Último NSU recebido pelo ator. |\n\n#### Exemplo\n\n```js\nconst { DistribuicaoDFe } = require('node-mde')\nconst fs = require('fs')\n\nconst distribuicao = new DistribuicaoDFe({\n  pfx: fs.readFileSync('./certificado.pfx'),\n  passphrase: 'senha',\n  cnpj: '12345678901234',\n  cUFAutor: '41',\n  tpAmb: '2',\n})\n\nconst consulta = await distribuicao.consultaUltNSU('000000000000000')\n\nif (consulta.error) {\n  throw new Error(consulta.error)\n}\n\nconsole.log(consulta)\n// {\n//   data: {\n//     tpAmb: '2',\n//     verAplic: '1.5.11',\n//     cStat: '138',\n//     xMotivo: 'Documento(s) localizado(s)',\n//     dhResp: '2022-06-21T10:48:14-03:00',\n//     ultNSU: '000000000000050',\n//     maxNSU: '000000000000212',\n//     docZip: [\n//       {\n//         xml: '\u003cresNFe xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" ... \u003c/resNFe\u003e',\n//         json: { resNFe: { ... } },\n//         nsu: '000000000000049',\n//         schema: 'resNFe_v1.01.xsd',\n//       },\n//       {\n//         xml: '\u003cnfeProc versao=\"4.00\" xmlns=\"http://www.portalfiscal.inf.br/nfe\"\u003e ... \u003c/nfeProc\u003e',\n//         json: { nfeProc: { ... } },\n//         nsu: '000000000000050',\n//         schema: 'procNFe_v4.00.xsd',\n//       },\n//     ],\n//   },\n//   reqXml: '\u003c?xml version=\"1.0\" encoding=\"utf-8\"?\u003e ... \u003c/soap12:Body\u003e\u003c/soap12:Envelope\u003e',\n//   resXml: '\u003c?xml version=\"1.0\" encoding=\"utf-8\"?\u003e ... \u003c/soap:Body\u003e\u003c/soap:Envelope\u003e',\n//   status: 200,\n// }\n```\n\n### Consulta por chNFe\n\n| Campo   |   Tipo   | Tamanho | Descrição                   |\n| :------ | :------: | :-----: | :-------------------------- |\n| `chNFe` | _string_ |   44    | Chave de acesso específica. |\n\n#### Exemplo\n\n```js\nconst { DistribuicaoDFe } = require('node-mde')\nconst fs = require('fs')\n\nconst distribuicao = new DistribuicaoDFe({\n  pfx: fs.readFileSync('./certificado.pfx'),\n  passphrase: 'senha',\n  cnpj: '12345678901234',\n  cUFAutor: '41',\n  tpAmb: '2',\n})\n\nconst consulta = await distribuicao.consultaChNFe(\n  '41000000000000000000000000000000000000000039'\n)\n\nif (consulta.error) {\n  throw new Error(consulta.error)\n}\n\nconsole.log(consulta)\n// {\n//   data: {\n//     tpAmb: '2',\n//     verAplic: '1.5.11',\n//     cStat: '138',\n//     xMotivo: 'Documento localizado',\n//     dhResp: '2022-06-21T10:49:21-03:00',\n//     ultNSU: '',\n//     maxNSU: '',\n//     docZip: [\n//       {\n//         xml: '\u003cnfeProc versao=\"4.00\" xmlns=\"http://www.portalfiscal.inf.br/nfe\"\u003e ... \u003c/nfeProc\u003e',\n//         json: { nfeProc: { ... } },\n//         nsu: '000000000000050',\n//         schema: 'procNFe_v4.00.xsd',\n//       },\n//     ],\n//   },\n//   reqXml: '\u003c?xml version=\"1.0\" encoding=\"utf-8\"?\u003e ... \u003c/soap12:Body\u003e\u003c/soap12:Envelope\u003e',\n//   resXml: '\u003c?xml version=\"1.0\" encoding=\"utf-8\"?\u003e ... \u003c/soap:Body\u003e\u003c/soap:Envelope\u003e',\n//   status: 200,\n// }\n```\n\n### Consulta por NSU\n\n| Campo |   Tipo   | Tamanho | Descrição                           |\n| :---- | :------: | :-----: | :---------------------------------- |\n| `NSU` | _string_ |  1-15   | Número Sequencial Único específico. |\n\n#### Exemplo\n\n```js\nconst { DistribuicaoDFe } = require('node-mde')\nconst fs = require('fs')\n\nconst distribuicao = new DistribuicaoDFe({\n  pfx: fs.readFileSync('./certificado.pfx'),\n  passphrase: 'senha',\n  cnpj: '12345678901234',\n  cUFAutor: '41',\n  tpAmb: '2',\n})\n\nconst consulta = await distribuicao.consultaNSU('000000000000049')\n\nif (consulta.error) {\n  throw new Error(consulta.error)\n}\n\nconsole.log(consulta)\n// {\n//   data: {\n//     tpAmb: '2',\n//     verAplic: '1.5.11',\n//     cStat: '138',\n//     xMotivo: 'Documento localizado',\n//     dhResp: '2022-06-21T10:50:46-03:00',\n//     ultNSU: '000000000000049',\n//     maxNSU: '000000000000212',\n//     docZip: [\n//       {\n//         xml: '\u003cresNFe xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" ... \u003c/resNFe\u003e',\n//         json: { resNFe: { ... } },\n//         nsu: '000000000000049',\n//         schema: 'resNFe_v1.01.xsd',\n//       },\n//     ],\n//   },\n//   reqXml: '\u003c?xml version=\"1.0\" encoding=\"utf-8\"?\u003e ... \u003c/soap12:Body\u003e\u003c/soap12:Envelope\u003e',\n//   resXml: '\u003c?xml version=\"1.0\" encoding=\"utf-8\"?\u003e ... \u003c/soap:Body\u003e\u003c/soap:Envelope\u003e',\n//   status: 200,\n// }\n```\n\n## Manifestação do Destinatário\n\n### Construtor\n\n```js\nnew RecepcaoEvento(config)\n```\n\n- `config` `\u003cObject\u003e`\n  - `pfx` `\u003cBuffer\u003e` - [OPCIONAL] - Arquivo **.pfx**. Se o `pfx` não for informado, as propriedades `cert` e `key` passam a ser obrigatórias.\n  - `passphrase` `\u003cString\u003e` - [OPCIONAL] - Senha do arquivo **.pfx**.\n  - `cert` `\u003cBuffer | String\u003e` - [OPCIONAL] - Conteúdo do _cert.pem_. Essa propriedade fica obrigatória se o `pfx` não for informado.\n  - `key` `\u003cBuffer | String\u003e` - [OPCIONAL] - Conteúdo do _key.pem_. Essa propriedade fica obrigatória se o `pfx` não for informado.\n  - `cnpj` `\u003cString\u003e` - [OPCIONAL] - CNPJ do interessado no DF-e. Se não informado um CNPJ, será obrigatório informar um CPF.\n  - `cpf` `\u003cString\u003e` - [OPCIONAL] - CPF do interessado no DF-e. Se não informado um CPF, será obrigatório informar um CNPJ.\n  - `tpAmb` `\u003cString\u003e` - [OBRIGATÓRIO] - Identificação de Ambiente. Informar `'1'` para **Produção** ou `'2'` para **Homologação**.\n  - `timezone` `\u003cString\u003e` - [OPCIONAL] - Fuso horário do autor. É utilizado `'America/Sao_Paulo'` como valor padrão. Consulte a tabela [lista de timezones](#lista-de-timezones) válidos para o Brasil.\n  - `options` `\u003cObject\u003e` - [OPCIONAL]\n    - `requestOptions` `\u003cAxiosRequestConfig\u003e` - [OPCIONAL]\n    - `httpsOptions` `\u003cAgentOptions\u003e` - [OPCIONAL]\n\n### Enviar Lote de Eventos\n\n| Campo                |   Tipo   | Tamanho | Descrição                                                                                                                                                |\n| :------------------- | :------: | :-----: | :------------------------------------------------------------------------------------------------------------------------------------------------------- |\n| `idLote`             | _string_ |  1-15   | Identificador de controle do Lote de envio do Evento.                                                                                                    |\n| `lote`               | _array_  |  1-20   | Lista de eventos para manifestação.                                                                                                                      |\n| `lote.chNFe`         | _string_ |   44    | Chave de Acesso da NF-e vinculada ao Evento.                                                                                                             |\n| `lote.tpEvento`      | _number_ |    6    | Código do evento: 210200 - Confirmacao da Operacao; 210210 - Ciencia da Operacao; 210220 - Desconhecimento da Operacao; 210240 - Operacao nao Realizada. |\n| `lote.justificativa` | _string_ | 15-255  | Informar a justificativa do porque a operação não foi realizada, este campo deve ser informado somente no evento de Operação não Realizada.              |\n\n#### Exemplo\n\n```js\nconst { RecepcaoEvento } = require('node-mde')\nconst fs = require('fs')\n\nconst recepcao = new RecepcaoEvento({\n  pfx: fs.readFileSync('./certificado.pfx'),\n  passphrase: 'senha',\n  cnpj: '12345678901234',\n  tpAmb: '2',\n})\n\nconst lote = [\n  {\n    chNFe: '41000000000000000000000000000000000000000040',\n    tipoEvento: 210210,\n  },\n  {\n    chNFe: '41000000000000000000000000000000000000000041',\n    tipoEvento: 210240,\n    justificativa: 'Não foi realizado a entrega correta dos itens da nota.',\n  },\n]\n\nconst manifestacao = await recepcao.enviarEvento({\n  idLote: '1337',\n  lote: lote,\n})\n\nif (manifestacao.error) {\n  throw new Error(manifestacao.error)\n}\n\nconsole.log(manifestacao)\n// {\n//   data: {\n//     idLote: '1337',\n//     tpAmb: '2',\n//     verAplic: 'AN_1.4.3',\n//     cOrgao: '91',\n//     cStat: '128',\n//     xMotivo: 'Lote de evento processado',\n//     infEvento: [\n//       {\n//         tpAmb: '2',\n//         verAplic: 'AN_1.4.3',\n//         cOrgao: '91',\n//         cStat: '596',\n//         xMotivo: 'Rejeicao: Evento apresentado apos o prazo permitido para o evento: [10 dias]',\n//         chNFe: '41000000000000000000000000000000000000000040',\n//         tpEvento: '210210',\n//         xEvento: 'Ciencia da Operacao',\n//         nSeqEvento: '1',\n//         CNPJDest: '',\n//         dhRegEvento: '2022-06-21T11:20:10-03:00',\n//         nProt: ''\n//       },\n//       {\n//         tpAmb: '2',\n//         verAplic: 'AN_1.4.3',\n//         cOrgao: '91',\n//         cStat: '135',\n//         xMotivo: 'Evento registrado e vinculado a NF-e',\n//         chNFe: '41000000000000000000000000000000000000000041',\n//         tpEvento: '210240',\n//         xEvento: 'Operacao nao Realizada',\n//         nSeqEvento: '1',\n//         CNPJDest: '12345678901234',\n//         dhRegEvento: '2022-06-21T11:20:10-03:00',\n//         nProt: '891220000003301'\n//       },\n//     ],\n//   },\n//   reqXml: '\u003c?xml version=\"1.0\" encoding=\"utf-8\"?\u003e ... \u003c/soap12:Body\u003e\u003c/soap12:Envelope\u003e',\n//   resXml: '\u003c?xml version=\"1.0\" encoding=\"utf-8\"?\u003e ... \u003c/soap:Body\u003e\u003c/soap:Envelope\u003e',\n//   status: 200,\n// }\n```\n\n## Tabelas\n\n### Códigos UF\n\n|  UF  | cUF  | Estado                  |\n| :--: | :--: | :---------------------- |\n| `RO` | _11_ | **Rondônia**            |\n| `AC` | _12_ | **Acre**                |\n| `AM` | _13_ | **Amazonas**            |\n| `RR` | _14_ | **Roraima**             |\n| `PA` | _15_ | **Pará**                |\n| `AP` | _16_ | **Amapá**               |\n| `TO` | _17_ | **Tocantins**           |\n| `MA` | _21_ | **Maranhão**            |\n| `PI` | _22_ | **Piauí**               |\n| `CE` | _23_ | **Ceará**               |\n| `RN` | _24_ | **Rio Grande do Norte** |\n| `PB` | _25_ | **Paraíba**             |\n| `PE` | _26_ | **Pernambuco**          |\n| `AL` | _27_ | **Alagoas**             |\n| `SE` | _28_ | **Sergipe**             |\n| `BA` | _29_ | **Bahia**               |\n| `MG` | _31_ | **Minas Gerais**        |\n| `ES` | _32_ | **Espírito Santo**      |\n| `RJ` | _33_ | **Rio de Janeiro**      |\n| `SP` | _35_ | **São Paulo**           |\n| `PR` | _41_ | **Paraná**              |\n| `SC` | _42_ | **Santa Catarina**      |\n| `RS` | _43_ | **Rio Grande do Sul**   |\n| `MS` | _50_ | **Mato Grosso do Sul**  |\n| `MT` | _51_ | **Mato Grosso**         |\n| `GO` | _52_ | **Goiás**               |\n| `DF` | _53_ | **Distrito Federal**    |\n\n### Lista de Timezones\n\n|        timezone        | Estado                                 |   UTC    |\n| :--------------------: | :------------------------------------- | :------: |\n|   `America/Noronha`    | **Fernando de Noronha**                | _−02:00_ |\n|  `America/Araguaina`   | **TO**                                 | _−03:00_ |\n|    `America/Bahia`     | **BA**                                 | _−03:00_ |\n|    `America/Belem`     | **AP, PA (leste)**                     | _−03:00_ |\n|  `America/Fortaleza`   | **CE, MA, PB, PI, RN**                 | _−03:00_ |\n|    `America/Maceio`    | **AL, SE**                             | _−03:00_ |\n|    `America/Recife`    | **PE**                                 | _−03:00_ |\n|   `America/Santarem`   | **PA (oeste)**                         | _−03:00_ |\n|  `America/Sao_Paulo`   | **DF, ES, GO, MG, PR, RJ, RS, SC, SP** | _−03:00_ |\n|  `America/Boa_Vista`   | **RR**                                 | _−04:00_ |\n| `America/Campo_Grande` | **MS**                                 | _−04:00_ |\n|    `America/Cuiaba`    | **MT**                                 | _−04:00_ |\n|    `America/Manaus`    | **AM (leste)**                         | _−04:00_ |\n| `America/Porto_Velho`  | **RO**                                 | _−04:00_ |\n|   `America/Eirunepe`   | **AM (oeste)**                         | _−05:00_ |\n|  `America/Rio_Branco`  | **AC**                                 | _−05:00_ |\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Flucashpmelo%2Fnode-mde","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Flucashpmelo%2Fnode-mde","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Flucashpmelo%2Fnode-mde/lists"}