Páginas filhas
  • DSERTSS3-2479 - [F.B.E] - Transmissão de documento

01. DADOS GERAIS

Produto:

TOTVS Transmite

Linha de Produto:

Linha Protheus

Segmento:

Backoffice

Módulo:TOTVS Transmite
Função:Não Há
País:Brasil
Ticket:Não Há
Requisito/Story/Issue (informe o requisito relacionado) :DSERTSS3-2479

02. SITUAÇÃO/REQUISITO

Desenvolver mecanismo que possibilite ao TOTVS Transmite receber e realizar a transmissão (apenas em regime normal, contingência e EPEC serão realizadas a posteriori) de NF-e's. Essa construção deverá respeitar a seguinte arquitetura:

Simulação de ERP

  • Montar mensagem de envio para o Transmite (o XML deverá ser enviado sem assinatura):


Modelo Mensagem Transmissão
{
    "codigoFilial": "00ABDF58597BD69632540F3B0471F52E1838D7AD",
    "modelo": "NFe",
    "tipoTransmissao": "Emissao",
    "dados":  [
            "PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4NCjxORmUgeG1sbnM9Imh0dHA6Ly93d3cucG9ydGFsZmlzY2FsLmluZi5ici9uZmUiPg0KCTxpbmZORmUgdmVyc2FvPSI0LjAwIiBJZD0iTkZlMzUyMjA0NTMxMTM3OTEwMDAxMjI1NTcwMTAwMDAwMjAyNzEwMDQ1NDU1NTUiPg0KCQk8aWRlPg0KCQkJPGNVRj4zNTwvY1VGPg0KCQkJPGNORj4wMDQ1NDU1NTwvY05GPg0KCQkJPG5hdE9wPklDTVM8L25hdE9wPg0KCQkJPG1vZD41NTwvbW9kPg0KCQkJPHNlcmllPjcwMTwvc2VyaWU+DQoJCQk8bk5GPjIwMjc8L25ORj4NCgkJCTxkaEVtaT4yMDIyLTA0LTA0VDExOjMyOjAwLTAzOjAwPC9kaEVtaT4NCgkJCTx0cE5GPjE8L3RwTkY+DQoJCQk8aWREZXN0PjI8L2lkRGVzdD4NCgkJCTxjTXVuRkc+MzU1MDMwODwvY011bkZHPg0KCQkJPHRwSW1wPjE8L3RwSW1wPg0KCQkJPHRwRW1pcz4xPC90cEVtaXM+DQoJCQk8Y0RWPjU8L2NEVj4NCgkJCTx0cEFtYj4yPC90cEFtYj4NCgkJCTxmaW5ORmU+MTwvZmluTkZlPg0KCQkJPGluZEZpbmFsPjA8L2luZEZpbmFsPg0KCQkJPGluZFByZXM+MTwvaW5kUHJlcz4NCgkJCTxwcm9jRW1pPjA8L3Byb2NFbWk+DQoJCQk8dmVyUHJvYz4xMi4xLjAyNSB8IDMuMDwvdmVyUHJvYz4NCgkJPC9pZGU+DQoJCTxlbWl0Pg0KCQkJPENOUEo+NTMxMTM3OTEwMDAxMjI8L0NOUEo+DQoJCQk8eE5vbWU+VE9UVlMgUy5BPC94Tm9tZT4NCgkJCTx4RmFudD5URVNURTwveEZhbnQ+DQoJCQk8ZW5kZXJFbWl0Pg0KCQkJCTx4TGdyPkF2ZW5pZGEgQnJheiBMZW1lPC94TGdyPg0KCQkJCTxucm8+MTcxNzwvbnJvPg0KCQkJCTx4Q3BsPmZ1bmRvczwveENwbD4NCgkJCQk8eEJhaXJybz5TYW50YW5hPC94QmFpcnJvPg0KCQkJCTxjTXVuPjM1NTAzMDg8L2NNdW4+DQoJCQkJPHhNdW4+U0FPIFBBVUxPPC94TXVuPg0KCQkJCTxVRj5TUDwvVUY+DQoJCQkJPENFUD4wMTI1MDAwMDwvQ0VQPg0KCQkJCTxjUGFpcz4xMDU4PC9jUGFpcz4NCgkJCQk8eFBhaXM+QlJBU0lMPC94UGFpcz4NCgkJCQk8Zm9uZT41NTExMjM0NTY3ODk8L2ZvbmU+DQoJCQk8L2VuZGVyRW1pdD4NCgkJCTxJRT4xMTEwMTA5NDUxMTE8L0lFPg0KCQkJPENSVD4zPC9DUlQ+DQoJCTwvZW1pdD4NCgkJPGRlc3Q+DQoJCQk8Q05QSj4wMTEwNTQ4MTAwMDE2MjwvQ05QSj4NCgkJCTx4Tm9tZT5ORi1FIEVNSVRJREEgRU0gQU1CSUVOVEUgREUgSE9NT0xPR0FDQU8gLSBTRU0gVkFMT1IgRklTQ0FMPC94Tm9tZT4NCgkJCTxlbmRlckRlc3Q+DQoJCQkJPHhMZ3I+UlVBIFBFRFJPIERFIFRPTEVETzwveExncj4NCgkJCQk8bnJvPjE1NTwvbnJvPg0KCQkJCTx4QmFpcnJvPkNFTlRSTzwveEJhaXJybz4NCgkJCQk8Y011bj4zMTAwNjA5PC9jTXVuPg0KCQkJCTx4TXVuPkFHVUEgQk9BPC94TXVuPg0KCQkJCTxVRj5NRzwvVUY+DQoJCQkJPENFUD4wMjE0MDAwMDwvQ0VQPg0KCQkJCTxjUGFpcz4xMDU4PC9jUGFpcz4NCgkJCQk8eFBhaXM+QlJBU0lMPC94UGFpcz4NCgkJCQk8Zm9uZT4xMTI1OTAxMDEwPC9mb25lPg0KCQkJPC9lbmRlckRlc3Q+DQoJCQk8aW5kSUVEZXN0PjE8L2luZElFRGVzdD4NCgkJCTxJRT40ODA5NjM0MjUwMDM4PC9JRT4NCgkJCTxlbWFpbD5jbGlwanNwY29udEB0ZXN0ZXMuY29tLmJyPC9lbWFpbD4NCgkJPC9kZXN0Pg0KCQk8ZGV0IG5JdGVtPSIxIj4NCgkJCTxwcm9kPg0KCQkJCTxjUHJvZD45MDAwMDAwMDAwMDAwMTwvY1Byb2Q+DQoJCQkJPGNFQU4+MzUzNDU2MTIzNDU2OTwvY0VBTj4NCgkJCQk8eFByb2Q+UE5FVSAxMzAgVFJBU0VJUk88L3hQcm9kPg0KCQkJCTxOQ00+NDQxNzAwMTA8L05DTT4NCgkJCQk8Q0VTVD4wMTAwNzAwPC9DRVNUPg0KCQkJCTxjQmVuZWYvPg0KCQkJCTxDRk9QPjYxMDE8L0NGT1A+DQoJCQkJPHVDb20+UEM8L3VDb20+DQoJCQkJPHFDb20+MS4wMDAwPC9xQ29tPg0KCQkJCTx2VW5Db20+MTAwLjAwMDAwMDAwPC92VW5Db20+DQoJCQkJPHZQcm9kPjEwMC4wMDwvdlByb2Q+DQoJCQkJPGNFQU5UcmliPjM1MzQ1NjEyMzQ1Njk8L2NFQU5UcmliPg0KCQkJCTx1VHJpYj5QQzwvdVRyaWI+DQoJCQkJPHFUcmliPjEuMDAwMDwvcVRyaWI+DQoJCQkJPHZVblRyaWI+MTAwLjAwMDAwMDAwPC92VW5UcmliPg0KCQkJCTxpbmRUb3Q+MTwvaW5kVG90Pg0KCQkJPC9wcm9kPg0KCQkJPGltcG9zdG8+DQoJCQkJPElDTVM+DQoJCQkJCTxJQ01TMDA+DQoJCQkJCQk8b3JpZz4wPC9vcmlnPg0KCQkJCQkJPENTVD4wMDwvQ1NUPg0KCQkJCQkJPG1vZEJDPjM8L21vZEJDPg0KCQkJCQkJPHZCQz4wPC92QkM+DQoJCQkJCQk8cElDTVM+MDwvcElDTVM+DQoJCQkJCQk8dklDTVM+MDwvdklDTVM+DQoJCQkJCTwvSUNNUzAwPg0KCQkJCTwvSUNNUz4NCgkJCQk8SVBJPg0KCQkJCQk8Y0VucT45OTk8L2NFbnE+DQoJCQkJCTxJUElOVD4NCgkJCQkJCTxDU1Q+NTM8L0NTVD4NCgkJCQkJPC9JUElOVD4NCgkJCQk8L0lQST4NCgkJCQk8UElTPg0KCQkJCQk8UElTTlQ+DQoJCQkJCQk8Q1NUPjA4PC9DU1Q+DQoJCQkJCTwvUElTTlQ+DQoJCQkJPC9QSVM+DQoJCQkJPENPRklOUz4NCgkJCQkJPENPRklOU05UPg0KCQkJCQkJPENTVD4wODwvQ1NUPg0KCQkJCQk8L0NPRklOU05UPg0KCQkJCTwvQ09GSU5TPg0KCQkJPC9pbXBvc3RvPg0KCQk8L2RldD4NCgkJPHRvdGFsPg0KCQkJPElDTVNUb3Q+DQoJCQkJPHZCQz4wPC92QkM+DQoJCQkJPHZJQ01TPjA8L3ZJQ01TPg0KCQkJCTx2SUNNU0Rlc29uPjA8L3ZJQ01TRGVzb24+DQoJCQkJPHZGQ1BVRkRlc3Q+MDwvdkZDUFVGRGVzdD4NCgkJCQk8dklDTVNVRkRlc3Q+MDwvdklDTVNVRkRlc3Q+DQoJCQkJPHZJQ01TVUZSZW1ldD4wPC92SUNNU1VGUmVtZXQ+DQoJCQkJPHZGQ1A+MDwvdkZDUD4NCgkJCQk8dkJDU1Q+MDwvdkJDU1Q+DQoJCQkJPHZTVD4wPC92U1Q+DQoJCQkJPHZGQ1BTVD4wPC92RkNQU1Q+DQoJCQkJPHZGQ1BTVFJldD4wPC92RkNQU1RSZXQ+DQoJCQkJPHZQcm9kPjEwMC4wMDwvdlByb2Q+DQoJCQkJPHZGcmV0ZT4wPC92RnJldGU+DQoJCQkJPHZTZWc+MDwvdlNlZz4NCgkJCQk8dkRlc2M+MDwvdkRlc2M+DQoJCQkJPHZJST4wPC92SUk+DQoJCQkJPHZJUEk+MDwvdklQST4NCgkJCQk8dklQSURldm9sPjA8L3ZJUElEZXZvbD4NCgkJCQk8dlBJUz4wPC92UElTPg0KCQkJCTx2Q09GSU5TPjA8L3ZDT0ZJTlM+DQoJCQkJPHZPdXRybz4wPC92T3V0cm8+DQoJCQkJPHZORj4xMDAuMDA8L3ZORj4NCgkJCTwvSUNNU1RvdD4NCgkJPC90b3RhbD4NCgkJPHRyYW5zcD4NCgkJCTxtb2RGcmV0ZT4xPC9tb2RGcmV0ZT4NCgkJPC90cmFuc3A+DQoJCTxjb2JyPg0KCQkJPGZhdD4NCgkJCQk8bkZhdD43MDEwMDAwMDIwMjc8L25GYXQ+DQoJCQkJPHZPcmlnPjEwMC4wMDwvdk9yaWc+DQoJCQkJPHZEZXNjPjA8L3ZEZXNjPg0KCQkJCTx2TGlxPjEwMC4wMDwvdkxpcT4NCgkJCTwvZmF0Pg0KCQkJPGR1cD4NCgkJCQk8bkR1cD4wMDE8L25EdXA+DQoJCQkJPGRWZW5jPjIwMjItMDQtMDQ8L2RWZW5jPg0KCQkJCTx2RHVwPjEwMC4wMDwvdkR1cD4NCgkJCTwvZHVwPg0KCQk8L2NvYnI+DQoJCTxwYWc+DQoJCQk8ZGV0UGFnPg0KCQkJCTxpbmRQYWc+MDwvaW5kUGFnPg0KCQkJCTx0UGFnPjE1PC90UGFnPg0KCQkJCTx2UGFnPjEwMC4wMDwvdlBhZz4NCgkJCTwvZGV0UGFnPg0KCQk8L3BhZz4NCgkJPGluZkFkaWM+DQoJCQk8aW5mQ3BsPlRFU1RFIENPTVBMRU1FTlRBUjwvaW5mQ3BsPg0KCQk8L2luZkFkaWM+DQoJCTxpbmZSZXNwVGVjPg0KCQkJPENOUEo+NTMxMTM3OTEwMDAxMjI8L0NOUEo+DQoJCQk8eENvbnRhdG8+Um9kcmlnbyBkZSBBbG1laWRhIFNhcnRvcmlvPC94Q29udGF0bz4NCgkJCTxlbWFpbD5yZXNwX3RlY25pY29fZGZlX3Byb3RoZXVzQHRvdHZzLmNvbS5icjwvZW1haWw+DQoJCQk8Zm9uZT4xMTI4NTkzOTA0PC9mb25lPg0KCQk8L2luZlJlc3BUZWM+DQoJPC9pbmZORmU+DQo8L05GZT4="
        ]
}

 

  • Utilizar a ferramenta Postman (ou similares), com a mensagem para simular um ERP encaminhando documento(s) para transmissão;
  • Encaminhar a mensagem para o Endpoint: '{urlBase}/api/v2.0/edi' (POST), localizado no serviço edi-api;
  • Utilizar o Token do RAC/TNF para autenticação das requisições.
     

EDI-API

  • Criar e expor o Endpoint: '{urlBase}/api/v2.0/edi' para recebimento das mensagens de transmissão (POST):
    • Decorar a API com o [TNFAuthorize], de forma que a autenticação seja gerenciada pelo RAC/TNF;
    • Encaminhar mensagem para Fila de Recebimento de acordo com o modelo de documento (exemplo: eTransmissaoNFeRecebimento-Queue).
  • Criar e expor o Endpoint: '{urlBase}/api/v2.0/edi/{recibo}' para consulta do andamento do processo de transmissão:
    • Devolver a resposta para o ERP, utilizando o serviço TaskServiceResponse (método Publish), presente no transmit-framework.
       

NFE-WORKER

1-Fila de recebimento:

  • Criar estrutura do novo projeto na Azure Devops;
  • Fluxo de recepção e transmissão irá realizar as seguintes etapas:
    • Validar os documentos de acordo com o esquema XSD (fornecido pela SEFAZ);
    • Assinar os documentos validados (rejeitados na validação já ficarão salvos em base de dados com este status);
    • Transmitir os documentos validados e assinados para SEFAZ;
    • Encaminhar recibo de transmissão para fila de consulta (em caso de rejeição, lote inteiro será atualizado em base de dados com este status);
  • A cada etapa, atualizar o andamento, utilizando o serviço TaskServiceResponse (método Update), a ser criado no transmit-framework.

2-Fila de consulta:

  • Fluxo de consulta de resultado de transmissão irá realizar as seguintes etapas:
    • Realizar a consulta na SEFAZ pelo recibo recebido no ato da transmissão;
    • Persistir a resposta no andamento, utilizando o serviço TaskServiceResponse (método Update), a ser criado no transmit-framework;
    • Se o lote foi processado com sucesso na SEFAZ, atualiza os documentos na coleção 'nfe';
      • Reaproveitar o código referente aos índices das coleções;
    • Enquanto a SEFAZ não disponibiliza o resultado da consulta, enfileirar a mensagem para nova tentativa.

03. SOLUÇÃO

A solução proposta segue a arquitetura descrita acima, tendo sido realizado os passos a seguir:

1-SIMULADOR DE ERP

  • Criação de requisição no Postman, para envio de transmissão, com mensagem acordada (POST);
  • Criação de requisição no Postman, para consulta do recibo retornado pela requisição anterior (GET);
  • Criação de requisição no Postman, para validar se API (v2.0) está no ar (GET).

2-EDI-API

  • Criação de EdiController (v2.0), onde foram inseridos os novos endpoints;
  • Criação de endpoint '{urlBase}/api/v2.0/edi' (que atende o método POST), que recebe a requisição de transmissão e insere a mesma na fila de transmissão (eTransmissaoNFeRecebimento-Queue);
  • Criação de endpoint '{urlBase}/api/v2.0/edi/{recibo}' (que atende o método GET), que retorna andamento da transmissão, dado o recibo;
  • Criação de endpoint '{urlBase}/api/v2.0/edi' (que atende o método GET), que valida se API está disponível e funcional.

3-NFE-WORKER

  • Criação de estrutura inicial do projeto e disponibilização dele na Azure Devops, inclusive com a inclusão deste nos pipelines de CI/CD;
  • Criação de coleção 'controlelote', hospedada na base do cliente solicitante da transmissão, para controle de ID enviado para a SEFAZ, como identificador deste;
  • Criação da coleção 'sefazservice', hospedada na base 'transmite', para hospedar URLs, templates e schemas utilizados pelos serviços de 'Autorizacao' e 'RetAutorizacao';
  • Criação de fluxo de recepção de requisição de transmissão (Background Service), que realiza os seguintes passos:
    • Obtenção de registro da coleção de 'sefazservice', referente a 'Autorizacao'; 
    • Validação de esquema XSD de todos os documentos que compõem o lote enviado, utilizando schemas do registro obtido da 'sefazservice':
      • Se documento validado, ele é inserido como recebido na base de dados;
      • Se documento não passa pela validação, ele é inserido como falha de schema;
      • Apenas documentos validados seguirão para a próxima etapa.
    • Assinatura de documentos validados (atualização de registros da base de dados para assinado);
    • Montagem de conteúdo compactado de envelope SOAP para envio a SEFAZ, com documentos assinados;
    • Envio de requisição a SEFAZ (URL do registro da 'sefazservice') e captura de retorno:
      • Se requisição foi rejeitada, atualiza documentos enviados para status rejeitado;
      • Se requisição foi recebida, atualiza documentos enviados para status transmitido;
        • Envia recibo para fila de consulta.
    • Todas as manipulações de envio e retorno de comunicação com a SEFAZ são tratadas com os templates presentes no registro da 'sefazservice';
    • Em todos os passos, acontece a atualização do andamento geral da requisição na coleção 'respostaAssincrona'.
  • Criação de fluxo de consulta de status da requisição de transmissão (Background Service), que realiza os seguintes passos:
    • Obtenção de registro da coleção de 'sefazservice', referente a 'RetAutorizacao';  
    • Montagem de requisição de consulta SOAP para envio a SEFAZ (URL do registro da 'sefazservice'), com recibo recebido pela atividade anterior (recepção e transmissão);
      • Se requisição retornar que solicitação ainda não foi processada, a mesma tarefa em andamento é adicionada novamente na fila de consulta com um intervalo de espera;
      • Se requisição retornar que solicitação foi processada:
        • Tratar retorno para separar status por documento que compõem o lote;
        • Atualizar documentos em coleção 'nfe' com status individual retornado da SEFAZ.
    • Todas as manipulações de envio e retorno de comunicação com a SEFAZ são tratadas com os templates presentes no registro da 'sefazservice';
    • Em todos os passos, acontece a atualização do andamento geral da requisição na coleção 'respostaAssincrona'.

04. DEMAIS INFORMAÇÕES

  • Não Há.

05. ASSUNTOS RELACIONADOS

  • Não Há.