@vexta-systems/node-mde
v0.15.4
Published
Biblioteca para consultar notas destinadas e enviar evento de manifestação do destinatário
Downloads
27
Maintainers
Readme
Node MD-e
Biblioteca para consumo dos Web Services da SEFAZ de Distribuição de DF-e e Evento de Manifestação do Destinatário.
Essa biblioteca faz o consumo do Web Service NFeDistribuicaoDFe
da SEFAZ e assim 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.
Também permite o consumo do Web Service CTeDistribuicaoDFe
que disponibiliza para os atores do CT-e/ CT-eOS/GTV-e informações e documentos fiscais eletrônicos de seu interesse, quer seja como emitentes, remetentes, destinatários, expedidores, recebedores, tomadores ou terceiros relacionado ao serviço.
Índice
- Instação
- Pré-Requisitos
- Funcionalidades
- Distribuição de NF-e
- Distribuição de CT-e
- Manifestação do Destinatário
- Tabelas
Instalação
$ npm i @vexta-systems/node-mde
Pré-Requisitos
- Possuir um Certificado A1 válido emitido por uma Autoridade Certificadora credenciada pela Infraestrutura de Chaves Públicas Brasileira – ICP-Brasil.
- O certificado pode ser usando no formato PFX e Senha OU cert.pem e key.pem
Funcionalidades
- Consultar por último NSU
- Retorna a relação dos Documentos Fiscais (
Resumo da NF-e
,NF-e
,Resumo do Evento
ouEvento
)
- Retorna a relação dos Documentos Fiscais (
- Consultar por chave de acesso
- Retorna o
XML da NF-e
ou oResumo da NF-e
- Retorna o
- Consultar por NSU
- Retorna o Documento Fiscal referente ao NSU informado, podendo ser um
Resumo
, umaNF-e
ou umEvento
- Retorna o Documento Fiscal referente ao NSU informado, podendo ser um
- Envio de evento
- Registra o evento de manifestação na nota informada (
Confirmação da Operação
,Ciência da Operação
,Desconhecimento da Operação
ouOperação não Realizada
)
- Registra o evento de manifestação na nota informada (
Distribuição de NF-e
Construtor
new DistribuicaoNFe(config)
config
<Object>
pfx
<Buffer>
- [OPCIONAL] - Arquivo .pfx. Se opfx
não for informado, as propriedadescert
ekey
passam a ser obrigatórias.passphrase
<String>
- [OPCIONAL] - Senha do arquivo .pfx.cert
<Buffer | String>
- [OPCIONAL] - Conteúdo do cert.pem. Essa propriedade fica obrigatória se opfx
não for informado.key
<Buffer | String>
- [OPCIONAL] - Conteúdo do key.pem. Essa propriedade fica obrigatória se opfx
não for informado.cUFAutor
<String>
- [OBRIGATÓRIO] - Código da UF do autor. Consulte a tabela códigos UF.cnpj
<String>
- [OPCIONAL] - CNPJ do interessado no DF-e. Se não informado um CNPJ, será obrigatório informar um CPF.cpf
<String>
- [OPCIONAL] - CPF do interessado no DF-e. Se não informado um CPF, será obrigatório informar um CNPJ.tpAmb
<String>
- [OBRIGATÓRIO] - Identificação de Ambiente. Informar'1'
para Produção ou'2'
para Homologação.options
<Object>
- [OPCIONAL]requestOptions
<AxiosRequestConfig>
- [OPCIONAL]httpsOptions
<AgentOptions>
- [OPCIONAL]
Consulta por ultNSU
| Campo | Tipo | Tamanho | Descrição |
| :------- | :------: | :-----: | :----------------------------- |
| ultNSU
| string | 1-15 | Último NSU recebido pelo ator. |
Exemplo
const { DistribuicaoNFe } = require('@vexta-systems/node-mde')
const fs = require('fs')
const distribuicao = new DistribuicaoNFe({
pfx: fs.readFileSync('./certificado.pfx'),
passphrase: 'senha',
cnpj: '12345678901234',
cUFAutor: '41',
tpAmb: '2',
})
const consulta = await distribuicao.consultaUltNSU('000000000000000')
if (consulta.error) {
throw new Error(consulta.error)
}
console.log(consulta)
// {
// data: {
// tpAmb: '2',
// verAplic: '1.5.11',
// cStat: '138',
// xMotivo: 'Documento(s) localizado(s)',
// dhResp: '2022-06-21T10:48:14-03:00',
// ultNSU: '000000000000050',
// maxNSU: '000000000000212',
// docZip: [
// {
// xml: '<resNFe xmlns:xsd="http://www.w3.org/2001/XMLSchema" ... </resNFe>',
// json: { resNFe: { ... } },
// nsu: '000000000000049',
// schema: 'resNFe_v1.01.xsd',
// },
// {
// xml: '<nfeProc versao="4.00" xmlns="http://www.portalfiscal.inf.br/nfe"> ... </nfeProc>',
// json: { nfeProc: { ... } },
// nsu: '000000000000050',
// schema: 'procNFe_v4.00.xsd',
// },
// ],
// },
// reqXml: '<?xml version="1.0" encoding="utf-8"?> ... </soap12:Body></soap12:Envelope>',
// resXml: '<?xml version="1.0" encoding="utf-8"?> ... </soap:Body></soap:Envelope>',
// status: 200,
// }
Consulta por chNFe
| Campo | Tipo | Tamanho | Descrição |
| :------ | :------: | :-----: | :-------------------------- |
| chNFe
| string | 44 | Chave de acesso específica. |
Exemplo
const { DistribuicaoNFe } = require('@vexta-systems/node-mde')
const fs = require('fs')
const distribuicao = new DistribuicaoNFe({
pfx: fs.readFileSync('./certificado.pfx'),
passphrase: 'senha',
cnpj: '12345678901234',
cUFAutor: '41',
tpAmb: '2',
})
const consulta = await distribuicao.consultaChNFe(
'41000000000000000000000000000000000000000039'
)
if (consulta.error) {
throw new Error(consulta.error)
}
console.log(consulta)
// {
// data: {
// tpAmb: '2',
// verAplic: '1.5.11',
// cStat: '138',
// xMotivo: 'Documento localizado',
// dhResp: '2022-06-21T10:49:21-03:00',
// ultNSU: '',
// maxNSU: '',
// docZip: [
// {
// xml: '<nfeProc versao="4.00" xmlns="http://www.portalfiscal.inf.br/nfe"> ... </nfeProc>',
// json: { nfeProc: { ... } },
// nsu: '000000000000050',
// schema: 'procNFe_v4.00.xsd',
// },
// ],
// },
// reqXml: '<?xml version="1.0" encoding="utf-8"?> ... </soap12:Body></soap12:Envelope>',
// resXml: '<?xml version="1.0" encoding="utf-8"?> ... </soap:Body></soap:Envelope>',
// status: 200,
// }
Consulta por NSU
| Campo | Tipo | Tamanho | Descrição |
| :---- | :------: | :-----: | :---------------------------------- |
| NSU
| string | 1-15 | Número Sequencial Único específico. |
Exemplo
const { DistribuicaoNFe } = require('@vexta-systems/node-mde')
const fs = require('fs')
const distribuicao = new DistribuicaoNFe({
pfx: fs.readFileSync('./certificado.pfx'),
passphrase: 'senha',
cnpj: '12345678901234',
cUFAutor: '41',
tpAmb: '2',
})
const consulta = await distribuicao.consultaNSU('000000000000049')
if (consulta.error) {
throw new Error(consulta.error)
}
console.log(consulta)
// {
// data: {
// tpAmb: '2',
// verAplic: '1.5.11',
// cStat: '138',
// xMotivo: 'Documento localizado',
// dhResp: '2022-06-21T10:50:46-03:00',
// ultNSU: '000000000000049',
// maxNSU: '000000000000212',
// docZip: [
// {
// xml: '<resNFe xmlns:xsd="http://www.w3.org/2001/XMLSchema" ... </resNFe>',
// json: { resNFe: { ... } },
// nsu: '000000000000049',
// schema: 'resNFe_v1.01.xsd',
// },
// ],
// },
// reqXml: '<?xml version="1.0" encoding="utf-8"?> ... </soap12:Body></soap12:Envelope>',
// resXml: '<?xml version="1.0" encoding="utf-8"?> ... </soap:Body></soap:Envelope>',
// status: 200,
// }
Distribuição de CT-e
Construtor
new DistribuicaoCTe(config)
config
<Object>
pfx
<Buffer>
- [OPCIONAL] - Arquivo .pfx. Se opfx
não for informado, as propriedadescert
ekey
passam a ser obrigatórias.passphrase
<String>
- [OPCIONAL] - Senha do arquivo .pfx.cert
<Buffer | String>
- [OPCIONAL] - Conteúdo do cert.pem. Essa propriedade fica obrigatória se opfx
não for informado.key
<Buffer | String>
- [OPCIONAL] - Conteúdo do key.pem. Essa propriedade fica obrigatória se opfx
não for informado.cUFAutor
<String>
- [OBRIGATÓRIO] - Código da UF do autor. Consulte a tabela códigos UF.cnpj
<String>
- [OPCIONAL] - CNPJ do interessado no DF-e. Se não informado um CNPJ, será obrigatório informar um CPF.cpf
<String>
- [OPCIONAL] - CPF do interessado no DF-e. Se não informado um CPF, será obrigatório informar um CNPJ.tpAmb
<String>
- [OBRIGATÓRIO] - Identificação de Ambiente. Informar'1'
para Produção ou'2'
para Homologação.options
<Object>
- [OPCIONAL]requestOptions
<AxiosRequestConfig>
- [OPCIONAL]httpsOptions
<AgentOptions>
- [OPCIONAL]
Consulta por ultNSU
| Campo | Tipo | Tamanho | Descrição |
| :------- | :------: | :-----: | :----------------------------- |
| ultNSU
| string | 1-15 | Último NSU recebido pelo ator. |
Exemplo
const { DistribuicaoCTe } = require('@vexta-systems/node-mde')
const fs = require('fs')
const distribuicao = new DistribuicaoCTe({
pfx: fs.readFileSync('./certificado.pfx'),
passphrase: 'senha',
cnpj: '12345678901234',
cUFAutor: '41',
tpAmb: '2',
})
const consulta = await distribuicao.consultaUltNSU('000000000000000')
if (consulta.error) {
throw new Error(consulta.error)
}
console.log(consulta)
// {
// "data": {
// "tpAmb": "1",
// "verAplic": "2.0.5_2408061805",
// "cStat": "138",
// "xMotivo": "documento localizado.",
// "dhResp": "2024-08-06T18:05:09",
// "ultNSU": "000000000002211",
// "maxNSU": "000000000002244",
// "docZip": [
// {
// "xml": "<cteProc versao=\"4.00\" ... </cteProc>",
// "json": { "cteProc": { ... }},
// "nsu": "000000000000001",
// "schema": "procCTe_v4.00.xsd"
// },
// {
// "xml": "<procEventoCTe versao=\"4.00\" ... </procEventoCTe>",
// "json": { "procEventoCTe": { ... }},
// "nsu": "00000000000002",
// "schema": "procEventoCTe_v4.00.xsd"
// }
// ]
// },
// "status": 200,
// "reqXml": "<soap:Envelope ... </soap:Envelope>",
// "resXml": "<?xml version=\"1.0\" encoding=\"utf-8\"?><soap:Envelope ... </soap:Envelope>"
// }
Consulta por chCTe
| Campo | Tipo | Tamanho | Descrição |
| :------ | :------: | :-----: | :-------------------------- |
| chCTe
| string | 44 | Chave de acesso específica. |
Exemplo
const { DistribuicaoCTe } = require('@vexta-systems/node-mde')
const fs = require('fs')
const distribuicao = new DistribuicaoCTe({
pfx: fs.readFileSync('./certificado.pfx'),
passphrase: 'senha',
cnpj: '12345678901234',
cUFAutor: '41',
tpAmb: '2',
})
const consulta = await distribuicao.consultaChCTe(
'41000000000000000000000000000000000000000039'
)
if (consulta.error) {
throw new Error(consulta.error)
}
console.log(consulta)
// {
// "data": {
// "tpAmb": "1",
// "verAplic": "2.0.5_2408061805",
// "cStat": "138",
// "xMotivo": "documento localizado.",
// "dhResp": "2024-08-06T18:05:09",
// "ultNSU": "000000000002211",
// "maxNSU": "000000000002244",
// "docZip": [
// {
// "xml": "<cteProc versao=\"4.00\" ... </cteProc>",
// "json": { "cteProc": { ... }},
// "nsu": "000000000000001",
// "schema": "procCTe_v4.00.xsd"
// }
// ]
// },
// "status": 200,
// "reqXml": "<soap:Envelope ... </soap:Envelope>",
// "resXml": "<?xml version=\"1.0\" encoding=\"utf-8\"?><soap:Envelope ... </soap:Envelope>"
// }
Consulta por NSU
| Campo | Tipo | Tamanho | Descrição |
| :---- | :------: | :-----: | :---------------------------------- |
| NSU
| string | 1-15 | Número Sequencial Único específico. |
Exemplo
const { DistribuicaoCTe } = require('@vexta-systems/node-mde')
const fs = require('fs')
const distribuicao = new DistribuicaoCTe({
pfx: fs.readFileSync('./certificado.pfx'),
passphrase: 'senha',
cnpj: '12345678901234',
cUFAutor: '41',
tpAmb: '2',
})
const consulta = await distribuicao.consultaNSU('000000000000001')
if (consulta.error) {
throw new Error(consulta.error)
}
console.log(consulta)
// {
// "data": {
// "tpAmb": "1",
// "verAplic": "2.0.5_2408061805",
// "cStat": "138",
// "xMotivo": "documento localizado.",
// "dhResp": "2024-08-06T18:05:09",
// "ultNSU": "000000000002211",
// "maxNSU": "000000000002244",
// "docZip": [
// {
// "xml": "<cteProc versao=\"4.00\" ... </cteProc>",
// "json": { "cteProc": { ... }},
// "nsu": "000000000000001",
// "schema": "procCTe_v4.00.xsd"
// }
// ]
// },
// "status": 200,
// "reqXml": "<soap:Envelope ... </soap:Envelope>",
// "resXml": "<?xml version=\"1.0\" encoding=\"utf-8\"?><soap:Envelope ... </soap:Envelope>"
// }
Manifestação do Destinatário (NF-e)
Construtor
new RecepcaoEvento(config)
config
<Object>
pfx
<Buffer>
- [OPCIONAL] - Arquivo .pfx. Se opfx
não for informado, as propriedadescert
ekey
passam a ser obrigatórias.passphrase
<String>
- [OPCIONAL] - Senha do arquivo .pfx.cert
<Buffer | String>
- [OPCIONAL] - Conteúdo do cert.pem. Essa propriedade fica obrigatória se opfx
não for informado.key
<Buffer | String>
- [OPCIONAL] - Conteúdo do key.pem. Essa propriedade fica obrigatória se opfx
não for informado.cnpj
<String>
- [OPCIONAL] - CNPJ do interessado no DF-e. Se não informado um CNPJ, será obrigatório informar um CPF.cpf
<String>
- [OPCIONAL] - CPF do interessado no DF-e. Se não informado um CPF, será obrigatório informar um CNPJ.tpAmb
<String>
- [OBRIGATÓRIO] - Identificação de Ambiente. Informar'1'
para Produção ou'2'
para Homologação.timezone
<String>
- [OPCIONAL] - Fuso horário do autor. É utilizado'America/Sao_Paulo'
como valor padrão. Consulte a tabela lista de timezones válidos para o Brasil.options
<Object>
- [OPCIONAL]requestOptions
<AxiosRequestConfig>
- [OPCIONAL]httpsOptions
<AgentOptions>
- [OPCIONAL]
Enviar Lote de Eventos
| Campo | Tipo | Tamanho | Descrição |
| :------------------- | :------: | :-----: | :------------------------------------------------------------------------------------------------------------------------------------------------------- |
| idLote
| string | 1-15 | Identificador de controle do Lote de envio do Evento. |
| lote
| array | 1-20 | Lista de eventos para manifestação. |
| lote.chNFe
| string | 44 | Chave de Acesso da NF-e vinculada ao Evento. |
| lote.tpEvento
| number | 6 | Código do evento: 210200 - Confirmacao da Operacao; 210210 - Ciencia da Operacao; 210220 - Desconhecimento da Operacao; 210240 - Operacao nao Realizada. |
| 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. |
Exemplo
const { RecepcaoEvento } = require('@vexta-systems/node-mde')
const fs = require('fs')
const recepcao = new RecepcaoEvento({
pfx: fs.readFileSync('./certificado.pfx'),
passphrase: 'senha',
cnpj: '12345678901234',
tpAmb: '2',
})
const lote = [
{
chNFe: '41000000000000000000000000000000000000000040',
tipoEvento: 210210,
},
{
chNFe: '41000000000000000000000000000000000000000041',
tipoEvento: 210240,
justificativa: 'Não foi realizado a entrega correta dos itens da nota.',
},
]
const manifestacao = await recepcao.enviarEvento({
idLote: '1337',
lote: lote,
})
if (manifestacao.error) {
throw new Error(manifestacao.error)
}
console.log(manifestacao)
// {
// data: {
// idLote: '1337',
// tpAmb: '2',
// verAplic: 'AN_1.4.3',
// cOrgao: '91',
// cStat: '128',
// xMotivo: 'Lote de evento processado',
// infEvento: [
// {
// tpAmb: '2',
// verAplic: 'AN_1.4.3',
// cOrgao: '91',
// cStat: '596',
// xMotivo: 'Rejeicao: Evento apresentado apos o prazo permitido para o evento: [10 dias]',
// chNFe: '41000000000000000000000000000000000000000040',
// tpEvento: '210210',
// xEvento: 'Ciencia da Operacao',
// nSeqEvento: '1',
// CNPJDest: '',
// dhRegEvento: '2022-06-21T11:20:10-03:00',
// nProt: ''
// },
// {
// tpAmb: '2',
// verAplic: 'AN_1.4.3',
// cOrgao: '91',
// cStat: '135',
// xMotivo: 'Evento registrado e vinculado a NF-e',
// chNFe: '41000000000000000000000000000000000000000041',
// tpEvento: '210240',
// xEvento: 'Operacao nao Realizada',
// nSeqEvento: '1',
// CNPJDest: '12345678901234',
// dhRegEvento: '2022-06-21T11:20:10-03:00',
// nProt: '891220000003301'
// },
// ],
// },
// reqXml: '<?xml version="1.0" encoding="utf-8"?> ... </soap12:Body></soap12:Envelope>',
// resXml: '<?xml version="1.0" encoding="utf-8"?> ... </soap:Body></soap:Envelope>',
// status: 200,
// }
Tabelas
Códigos UF
| UF | cUF | Estado |
| :--: | :--: | :---------------------- |
| RO
| 11 | Rondônia |
| AC
| 12 | Acre |
| AM
| 13 | Amazonas |
| RR
| 14 | Roraima |
| PA
| 15 | Pará |
| AP
| 16 | Amapá |
| TO
| 17 | Tocantins |
| MA
| 21 | Maranhão |
| PI
| 22 | Piauí |
| CE
| 23 | Ceará |
| RN
| 24 | Rio Grande do Norte |
| PB
| 25 | Paraíba |
| PE
| 26 | Pernambuco |
| AL
| 27 | Alagoas |
| SE
| 28 | Sergipe |
| BA
| 29 | Bahia |
| MG
| 31 | Minas Gerais |
| ES
| 32 | Espírito Santo |
| RJ
| 33 | Rio de Janeiro |
| SP
| 35 | São Paulo |
| PR
| 41 | Paraná |
| SC
| 42 | Santa Catarina |
| RS
| 43 | Rio Grande do Sul |
| MS
| 50 | Mato Grosso do Sul |
| MT
| 51 | Mato Grosso |
| GO
| 52 | Goiás |
| DF
| 53 | Distrito Federal |
Lista de Timezones
| timezone | Estado | UTC |
| :--------------------: | :------------------------------------- | :------: |
| America/Noronha
| Fernando de Noronha | −02:00 |
| America/Araguaina
| TO | −03:00 |
| America/Bahia
| BA | −03:00 |
| America/Belem
| AP, PA (leste) | −03:00 |
| America/Fortaleza
| CE, MA, PB, PI, RN | −03:00 |
| America/Maceio
| AL, SE | −03:00 |
| America/Recife
| PE | −03:00 |
| America/Santarem
| PA (oeste) | −03:00 |
| America/Sao_Paulo
| DF, ES, GO, MG, PR, RJ, RS, SC, SP | −03:00 |
| America/Boa_Vista
| RR | −04:00 |
| America/Campo_Grande
| MS | −04:00 |
| America/Cuiaba
| MT | −04:00 |
| America/Manaus
| AM (leste) | −04:00 |
| America/Porto_Velho
| RO | −04:00 |
| America/Eirunepe
| AM (oeste) | −05:00 |
| America/Rio_Branco
| AC | −05:00 |