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>[email protected]</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>[email protected]</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.
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.
@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á.
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 protected]</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
VISA R$ 2.474,08
HOSPEDE: SANTOS, DOC: 12345678902
da União, 35, CEP: 65068300, São Luís, MA, BRASIL
RPS: 2630348
NOTA CM: 9777
RESERVA: 23993650
CHECKIN: 21/02/2021
CHECKOUT: 07/03/2021
Trib aprox R$:332,76 Fed, 0,00 Est e 123,70 Mun
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 .Deve ter algum detalhe que estou deixando passar… Consegues enxergar, @luizvaz ?