[RESOLVIDO] Integração com STM de Caxias/MA acusa XML inválido para recepção de NFS-e

Estou em processo de estudo de integração de uma solução de emissão de NFSe via STM da cidade de Caxias/MA. Recebi o manual de integração mas não conseguí encontrar nenhuma referência que pudesse sanar minha dúvida. Ao que consta o padrão é D2TI. Segue POC de requisição de RecepcaoNFSe, segundo o modelo fornecido pela prefeitura, em JavaScript/Node.js:

    const soap = require('soap');
    const url = 'http://stm.caxias.d2ti.com.br/wsnfselote/RecepcaoNFSePort?wsdl';

    const xmlBody = `
  <nfseLote xmlns="http://www.ctaconsult.com/nfse" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
    <codigoMunicipio>849</codigoMunicipio>
    <dtEmissao>2021-03-10T16:19:30</dtEmissao>
    <notaIntermediada>1</notaIntermediada>

    <!-- Código que o emissor da nota precisa colocar para validar o envio -->
    <autenticacao>
      <token>C36D17ABC320D2054E91AD97A46B6BBB</token>
    </autenticacao>

    <!-- Dados do prestador -->
    <prestador>
      <tipoPessoa>2</tipoPessoa>
      <cpf>00393189317</cpf>
      <cnpj>01696763000181</cnpj>
      <inscricaoMunicipal>30479</inscricaoMunicipal>
      <razaoSocial>PADARIA RETORNO DO CARVALHO LTDA.-ME</razaoSocial>
      <endereco>
        <logradouro>PCA DA MATRIZ 10 A</logradouro>
        <complemento></complemento>
        <bairro>CENTRO</bairro>
        <cep>65137000</cep>
        <codigoMunipio>849</codigoMunipio>
        <descricaoMunicipio>PACO DO LUMIAR</descricaoMunicipio>
        <codigoEstado>MA</codigoEstado>
        <descricaoEstado>MA</descricaoEstado>
      </endereco>
      <email>thais@ctaconsult.com</email>
      <telefoneDdd>99</telefoneDdd>
      <telefoneNumero>22222222</telefoneNumero>
    </prestador>

    <!-- Dados do tomador -->
    <tomador>
      <tomadorIdentificado>1</tomadorIdentificado>
      <tipoPessoa>1</tipoPessoa>
      <cpf>00393189317</cpf>
      <cnpj></cnpj>
      <inscricaoMunicipal>123</inscricaoMunicipal>
      <razaoSocial>ALVARO ROGERIO GOMES DE BRITO</razaoSocial>
      <exterior>2</exterior>
      <endereco>
        <logradouro>DAS LETRAS</logradouro>
        <complemento></complemento>
        <bairro>COHAFUMA</bairro>
        <cep>65074780</cep>
        <codigoMunipio>849</codigoMunipio>
        <descricaoMunicipio>PACO DO LUMIAR</descricaoMunicipio>
        <codigoEstado>MA</codigoEstado>
        <descricaoEstado>MARANHAO</descricaoEstado>

      </endereco>
      <email>alvaro@ctaconsult.com</email>
      <telefoneDdd>98</telefoneDdd>
      <telefoneNumero>91196907</telefoneNumero>
      <apelido>ALVARO</apelido>
    </tomador>

    <!-- Dados do intermediador (Opcional) -->

    <intermediador>
      <tipoPessoa></tipoPessoa>
      <cpf></cpf>
      <cnpj></cnpj>
      <inscricaoMunicipal></inscricaoMunicipal>
      <razaoSocial></razaoSocial>
      <endereco>
        <logradouro>DAS LETRAS</logradouro>
        <complemento></complemento>
        <bairro>COHAFUMA</bairro>
        <cep>65074780</cep>
        <codigoMunipio>849</codigoMunipio>
        <descricaoMunicipio>PACO DO LUMIAR</descricaoMunicipio>
        <codigoEstado>MA</codigoEstado>
        <descricaoEstado>MARANHAO</descricaoEstado>
      </endereco>
      <email></email>
      <telefoneDdd></telefoneDdd>
      <telefoneNumero></telefoneNumero>
    </intermediador>

    <atividadeExecutada>
      <codigoServico>1710</codigoServico>
      <descricaoServico>PLANEJAMENTO, ORGANIZAÇÃO E ADMINISTRAÇÃO DE FEIRAS, EXPOSIÇÕES, CONGRESSOS E CONGÊNERES</descricaoServico>
      <codigoAtividade>561010200</codigoAtividade>
      <descricaoAtividade>SERVICOSA DE ALIMENTACAO PARA EVENTOS E RECEPCOES - BUFE</descricaoAtividade>
      <localPrestacao>
        <codigoEstado>MA</codigoEstado>
        <descricaoEstado>MARANHAO</descricaoEstado>
        <codigoMunipio>849</codigoMunipio>
        <descricaoMunicipio>PACO DO LUMIAR</descricaoMunicipio>
      </localPrestacao>
      <tipoTributacao>1</tipoTributacao>
      <tipoRecolhimento>1</tipoRecolhimento>
      <aliquota>5</aliquota>
    </atividadeExecutada>

    <!-- Deduções -->
    <deducoes>
      <tipo>1</tipo>
      <!-- Mapa de deducao(Opcional) -->
      <mapa>
        <itemMapa nItem="1">
          <tipoPessoa></tipoPessoa>
          <cpf></cpf>
          <cnpj></cnpj>
          <numeroNota></numeroNota>
          <codigoTipo></codigoTipo>
          <descricaoTipo></descricaoTipo>
          <tipoValor></tipoValor>
          <valorNota></valorNota>
          <valorDecucao></valorDecucao>
        </itemMapa>
      </mapa>
      <!-- Percentual dedução(Opcional) -->
      <percentual></percentual>
      <!-- Valor dedução(Opcional) -->
      <valor></valor>
    </deducoes>

    <!-- Itens da nota -->
    <detalhamentoNota>
      <descricaoNota>BUFE PARA EVENTO DE ESTREIA DA NFSE DE PACO DO LUMIAR</descricaoNota>
      <itensServico>
        <item nItem="1">
          <tributavel>1</tributavel>
          <descricao>BUFE PARA EVENTO DE ESTREIA</descricao>
          <quantidade>1</quantidade>
          <valorUnitario>8000.00</valorUnitario>
          <valorTotal>8000.00</valorTotal>
        </item>
      </itensServico>
      <totais>
        <valotTotalNota>8000.00</valotTotalNota>
        <valorTotalServico>8000.00</valorTotalServico>
        <valorTotalDeducao>0.00</valorTotalDeducao>
        <valorTotalISS>400.00</valorTotalISS>
        <valorReducaoBC>0.00</valorReducaoBC>
      </totais>

      <!-- Dados dos impostos federais (Opcional) -->
      <impostosFederais>
        <imposto nItem="1">
          <codigoImposto>1</codigoImposto>
          <descricaoImposto>INSS</descricaoImposto>
          <aliquota>4.5</aliquota>
          <valorImposto></valorImposto>
        </imposto>
      </impostosFederais>
    </detalhamentoNota>
  </nfseLote>
    `;

    soap.createClient(url, (err, client) => {
      if (err) return console.error(err);
      client.executar(xmlBody, (err, result) => {
        if (err) return console.error(err);
        console.log(result);
      });
    });

Mas sempre recebo como resposta isso:

{
  return: '<retornoNfseLote xmlns="http://www.ctaconsult.com/nfse">  <codigoStatus>101</codigoStatus>  <erros>    <erro>      <codigo>999</codigo>      <descricao>XML invalido para recepcao da NFS-e</descricao>    </erro>  </erros></retornoNfseLote>'
}

Já vasculhei a internet até chegar aqui, mas não consigo identificar onde há inconsistência no XML de requisição.

Documentações e modelos:
Manual: 375.9 KB file on MEGA
Modelos: 12.7 KB file on MEGA

Será que alguém pode me ajudar?

Sinésio,

Realmente é difícil descobrir como fazer a validação do XML.

A D2TI não segue o padrão ABRASF propriamente dito.
Geralmente o desenvolvedor acha que a implementação do Webservice é apenas um detalhe.
Se não for idêntico ao fornecido pela ABRASF, não pode ser considerado que segue o padrão.

Eu sempre recorro ao ACBR para descobrir como é montado o XML dessas cidades.

Eu desenvolvi para Imperatriz/MA, mas em PHP.

Verifiquei e segue o mesmo padrão.

Abaixo é um VBscript que uso para validar o XML de acordo com o Schema:

Abaixo os XML’s em sequencia de envio e recebimento:

  1. 2630348.xml (3,5,KB) - XML Báisco
  2. 2630348.soap.txt (4,9,KB) - Envio via SOAP
  3. 2630348.xml.ret.xml (851,Bytes) - XML Retorno
  4. 210001349.xml (553,Bytes) - XML de Resposta

OBSERVAÇÕES:
Não é usado o código IBGE, mas o Código TOM.
Tabelas de Cidade com código TOM (PostgreSQL)
Esse provedor, não exige a Assinatura Digital.

1 curtida

@luizvaz cara, muitíssimo grato por tantos detalhes e informações. Eu vou ficar um tempo estudando em como fazer isso com TypeScript/Node.js. Assim que tiver uma resposta (positiva ou negativa) sobre a implementação, eu retorno aqui passando todas as orientações ou tirar dúvidas. Mas acredito que vai ajudar muito já.

Se não for pedir muito, disponibilizaria a implementação para Imperatriz em PHP que tu fizestes? De qualquer forma, agradeço desde já.

@snio.dev Não sei se vai ajudar o código em PHP.
Eu escrevi de uma forma diferente do que o pessoal está acostumado.
Segue o GIST: Geração e Envio de XML padrão D2TI (Imperatriz/MA)

Seu código está quase certo.
Basta substituir o cabeçalho %CabMsg% e os dados %DadMsg% no template abaixo antes de enviar:

        <soapenv:Envelope xmlns:soapenv=\"http://schemas.xmlsoap.org/soap/envelope/\" xmlns:wsn=\"http://wsnfselote.ctaconsult.com.br/\">
			<soapenv:Header/>
           <soapenv:Body>
               <wsn:executar>
                   <arg0>%CabMsg%</arg0>
                   <arg1>%DadMsg%</arg1>
               </wsn:executar>
           </soapenv:Body>
        </soapenv:Envelope>

O cabeçalho é fixo.

Onde %amb% pode ser 1 ou 2, para produção ou homologação:

<cabecalhoNfseLote xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns="http://www.ctaconsult.com/nfse">
    <versao>1.00</versao>
    <ambiente>%amb%</ambiente>
</cabecalhoNfseLote>

O header do POST é simples também:

        $headers = array(
            "Content-type: text/xml;charset=UTF-8",
			"Accept-Encoding: gzip,deflate",
			"SOAPAction: \"\"",
            "Content-length: ".strlen($envelope),
        );
1 curtida

Fiz vários teste seguindo as orientações, mas a mensagem XML invalido para recepcao de NFS-e persiste. Validei inclusive o Schema em um validador online. Mas não tive sucesso.

Segue o código refatorado em TypeScript:

import * as fs from "fs";
import * as soap from "soap";
import axios from "axios";

const url = "http://stm.caxias.d2ti.com.br/wsnfselote/RecepcaoNFSePort?wsdl";
const baseurl = "http://stm.caxias.d2ti.com.br/wsnfselote/RecepcaoNFSePort";

const configSoap = {
  disableCache: true,
};

const axiosConfig = {
  headers: {
    "Cache-Control": "no-cache",
    "Accept-Encoding": "gzip,deflate",
    "Content-Type": "text/xml;charset=UTF-8",
    SOAPAction: "",
  },
};

try {
  const cabecalho = `
        <cabecalhoNfseLote xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns="http://www.ctaconsult.com/nfse">
          <versao>1.00</versao>
          <ambiente>2</ambiente>
        </cabecalhoNfseLote>
  `;

  const dados = `
        <nfseLote xmlns="http://www.ctaconsult.com/nfse" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
          <codigoMunicipio>803</codigoMunicipio>
          <dtEmissao>2021-03-07T00:00:00</dtEmissao>
          <notaIntermediada>1</notaIntermediada>
          <autenticacao>
            <token>1xxxxxxxxx990567D3348120D993A58F</token>
          </autenticacao>
          <prestador>
            <tipoPessoa>2</tipoPessoa>
            <cnpj>23999999999999</cnpj>
            <inscricaoMunicipal>999999</inscricaoMunicipal>
            <razaoSocial>EMPRESA XXX LTDA</razaoSocial>
            <endereco>
              <logradouro>RUA ALAGOAS </logradouro>
              <complemento>LETRA</complemento>
              <bairro>JUCARA</bairro>
              <cep>65919170</cep>
              <codigoMunipio>803</codigoMunipio>
              <descricaoMunicipio>IMPERATRIZ</descricaoMunicipio>
              <codigoEstado>MA</codigoEstado>
              <descricaoEstado>MA</descricaoEstado>
            </endereco>
            <email>email@exemplo.com.br</email>
            <telefoneDdd>98</telefoneDdd>
            <telefoneNumero>91991234</telefoneNumero>
          </prestador>
          <tomador>
            <tomadorIdentificado>1</tomadorIdentificado>
            <tipoPessoa>2</tipoPessoa>
            <cnpj>12345639000183</cnpj>
            <razaoSocial>ENGENHARIA LTDA</razaoSocial>
            <endereco>
              <logradouro>R SILVIA</logradouro>
              <complemento>01</complemento>
              <bairro>PIEDADE</bairro>
              <cep>54400220</cep>
              <codigoMunipio>2457</codigoMunipio>
              <descricaoMunicipio>JABOATAO DOS GUARARAPES</descricaoMunicipio>
              <codigoEstado>26</codigoEstado>
              <descricaoEstado>PERNAMBUCO</descricaoEstado>
            </endereco>
          </tomador>
          <atividadeExecutada>
            <codigoServico>0901</codigoServico>
            <descricaoServico>HOSPEDAGEM DE QUALQUER NATUREZA EM HOTEIS APART SERVICE CONDOMINIAIS FLAT APART HOTEIS HOTEIS RESIDENCIA RESIDENCE SERVICE SUITE SERVICE HOTELARIA MARITIMA MOTEIS PENSOES E CONGENERES; OCUPACAO POR TEMPORADA COM FORNECIMENTO DE SERVICO (O VALOR DA ALIMENTACAO E GORJETA QUANDO INCLUIDO NO PRECO DA DIARIA FICA SUJEITO AO IMPOSTO SOBRE SERVICOS)</descricaoServico>
            <codigoAtividade>551080100</codigoAtividade>
            <descricaoAtividade>HOTEIS</descricaoAtividade>
            <localPrestacao>
              <codigoEstado>MA</codigoEstado>
              <descricaoEstado>MA</descricaoEstado>
              <codigoMunipio>803</codigoMunipio>
              <descricaoMunicipio>IMPERATRIZ</descricaoMunicipio>
            </localPrestacao>
            <tipoTributacao>4</tipoTributacao>
            <tipoRecolhimento>1</tipoRecolhimento>
            <aliquota>5</aliquota>
          </atividadeExecutada>
          <deducoes>
            <tipo>1</tipo>
          </deducoes>
          <detalhamentoNota>
            <descricaoNota>DIARIAS -R$ 2.474,08 &#13;
         VISA R$ 2.474,08
        HOSPEDE: SANTOS, DOC: 12345678902 &#13;
         da União, 35, CEP: 65068300, São Luís, MA, BRASIL &#13;
         &#13;
         RPS: 2630348 &#13;
         NOTA CM: 9777 &#13;
         RESERVA: 23993650 &#13;
         CHECKIN: 21/02/2021 &#13;
         CHECKOUT: 07/03/2021 &#13;
         &#13;
         Trib aprox R$:332,76 Fed, 0,00 Est e 123,70 Mun&#13;
        Fonte: IBPT/FECOMERCIO MA 02C353</descricaoNota>
            <itensServico>
              <item nItem="1">
                <tributavel>1</tributavel>
                <descricao>SERVIÇOS PRESTADOS</descricao>
                <quantidade>1</quantidade>
                <valorUnitario>2474.08</valorUnitario>
                <valorTotal>2474.08</valorTotal>
              </item>
            </itensServico>
            <totais>
              <valotTotalNota>2474.08</valotTotalNota>
              <valorTotalServico>2474.08</valorTotalServico>
              <valorTotalDeducao>0</valorTotalDeducao>
              <valorTotalISS>123.704</valorTotalISS>
              <valorReducaoBC>0</valorReducaoBC>
            </totais>
          </detalhamentoNota>
        </nfseLote>
  `;

  const envelope = `
  <soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:wsn="http://wsnfselote.ctaconsult.com.br/">
    <soapenv:Header/>
    <soapenv:Body>
      <wsn:executar>
        <arg0>${cabecalho}</arg0>
        <arg1>${dados}</arg1>
      </wsn:executar>
    </soapenv:Body>
  </soapenv:Envelope>
  `;

  // usando biblioteca 'node-soap'
  soap.createClient(url, configSoap, function (err, client) {
    if (err) return console.error(err);
    client.executar(envelope, function (err, result) {
      if (err) return console.error(err);
      console.log(result);
    });
  });

  // usando biblioteca 'axios'
  const postCall = async () => {
    const res = await axios.post(baseurl, envelope, axiosConfig);
    console.log(res);
  };

  postCall();
} catch (error) {
  console.error(error);
}

Não sei pra onde correr :smile: .Deve ter algum detalhe que estou deixando passar… Consegues enxergar, @luizvaz ?

Não pode enviar o XML dentro do OUTRO.
Antes de substituir a variável ${cabecalho}, você precisa converter ela em String.

Exemplo: how to escape xml entities in javascript? - Stack Overflow

1 curtida

Putz, @luizvaz!!
Cara, tu ajudou MUITO. Agora posso proseguir com meus planos. Obrigado de mais!

Eu vou deixar registrado aqui algumas considerações e também anexar o código de exemplo que usei para o sucesso da implementação do POC.

  • :warning: IMPORTANTE: Segui todas as orientações que @luizvaz apontou neste tópico.
  • Para essa cidade, Caxias/MA, a requisição não aceita um token diferente do que é discriminado no manual de integração.
  • Ficar atento também ao código do município de acordo com o TOM citado por @luizvaz aqui.
  • Aparentemente o WebServer da cidade possui ambiente de homologação.

Referência:
Código POC: POC de envio de RecepcaoNFSe para STM de Caxias/MA

1 curtida

Adicionando validador de schema XSD usando TypeScript/Node.js:
xml-xsd-validator.ts

Este tópico foi fechado automaticamente 30 dias depois da úlima resposta. Novas respostas não são mais permitidas.