nfse
Version:
Geração de nota fiscal de serviço
756 lines (669 loc) • 49.5 kB
JavaScript
// Vendors
const fs = require('fs');
const pem = require('pem');
const validator = require('xsd-schema-validator');
// Libs
const XmlSignatureController = require('../../../lib/xml-signature');
const xmlSignatureController = new XmlSignatureController();
// Controllers
const settingsController = require('../settings');
//Global contants
const d = new Date();
const timestamp = Date.now();
const numeroLote = timestamp.toString().substring(4, 13) + (d.getYear() - 100);
const setRequirements = (object, city) => {
return new Promise((resolve, reject) => {
try {
const particularitiesObject = settingsControllerAsync(object, city);
createXml(object, particularitiesObject)
.then(res => {
resolve(res);
})
.catch(rej => {
reject(rej);
})
} catch (error) {
reject(error);
}
})
}
const createXml = (object, particularitiesObject) => {
return new Promise((resolve, reject) => {
const pfx = fs.readFileSync(object.config.diretorioDoCertificado);
switch (object.config.acao) {
case 'enviarLoteRps':
try {
pem.readPkcs12(pfx, {
p12Password: object.config.senhaDoCertificado
}, (err, cert) => {
if (err) {
resolve({
error: err
});
}
let uniqueValue = numeroLote;
let regexUnique = new RegExp('_uniqueValue', 'g');
let xml = `<${particularitiesObject['tags']['pedidoEnvioLoteRpsAlterada'] ? particularitiesObject['tags']['pedidoEnvioLoteRpsAlterada'] : particularitiesObject['tags']['pedidoEnvioLoteRps']}>`;
xml += `<${particularitiesObject['tags']['cabecalhoAlterada'] ? particularitiesObject['tags']['cabecalhoAlterada'] : particularitiesObject['tags']['cabecalho']}>`;
if (object.emissor.cpfCnpj) {
xml += `<${particularitiesObject['tags']['cpfCnpjRemetenteAlterada'] ? particularitiesObject['tags']['cpfCnpjRemetenteAlterada'] : particularitiesObject['tags']['cpfCnpjRemetente']}>`;
if (object.emissor.cpfCnpj.replace(/[^\d]+/g, '').length === 11) {
xml += `<CPF>${object.emissor.cpfCnpj.replace(/\.|\/|\-|\s/g, '')}</CPF>`;
}
if (object.emissor.cpfCnpj.replace(/[^\d]+/g, '').length === 14) {
xml += `<CNPJ>${object.emissor.cpfCnpj.replace(/\.|\/|\-|\s/g, '')}</CNPJ>`;
}
xml += `</${particularitiesObject['tags']['cpfCnpjRemetente']}>`;
}
if (object.transacao) {
xml += `<${particularitiesObject['tags']['transacaoAlterada'] ? particularitiesObject['tags']['transacaoAlterada'] : particularitiesObject['tags']['transacao']}>${object.transacao}</${particularitiesObject['tags']['transacao']}>`;
}
if (object.dtInicio) {
xml += `<${particularitiesObject['tags']['dtInicioAlterada'] ? particularitiesObject['tags']['dtInicioAlterada'] : particularitiesObject['tags']['dtInicio']}>${object.dtInicio}</${particularitiesObject['tags']['dtInicio']}>`;
}
if (object.dtFim) {
xml += `<${particularitiesObject['tags']['dtFimAlterada'] ? particularitiesObject['tags']['dtFimAlterada'] : particularitiesObject['tags']['dtFim']}>${object.dtFim}</${particularitiesObject['tags']['dtFim']}>`;
}
if (object.rps) {
xml += `<${particularitiesObject['tags']['qtdRpsAlterada'] ? particularitiesObject['tags']['qtdRpsAlterada'] : particularitiesObject['tags']['qtdRps']}>${object.rps.length}</${particularitiesObject['tags']['qtdRps']}>`;
}
if (object.valorTotalServicos) {
xml += `<${particularitiesObject['tags']['valorTotalServicosAlterada'] ? particularitiesObject['tags']['valorTotalServicosAlterada'] : particularitiesObject['tags']['valorTotalServicos']}>${object.valorTotalServicos}</${particularitiesObject['tags']['valorTotalServicos']}>`;
}
if (object.valorTotalDeducoes) {
xml += `<${particularitiesObject['tags']['valorTotalDeducoesAlterada'] ? particularitiesObject['tags']['valorTotalDeducoesAlterada'] : particularitiesObject['tags']['valorTotalDeducoes']}>${object.valorTotalDeducoes}</${particularitiesObject['tags']['valorTotalDeducoes']}>`;
}
xml += `</${particularitiesObject['tags']['cabecalho']}>`;
xml = xml.replace(regexUnique, uniqueValue);
addSignedXml(object, cert, particularitiesObject)
.then(signedXmlRes => {
signedXmlRes.forEach(element => {
xml += element;
});
xml += `</${particularitiesObject['tags']['pedidoEnvioLoteRps']}>`;
createSignature(xml, cert, 'PedidoEnvioLoteRPS').then(xmlSignature => {
if (particularitiesObject['xsds']['enviarLoteRps']) {
validator.validateXML(xmlSignature, __dirname + particularitiesObject['xsds']['enviarLoteRps'], function (err, validatorResult) {
if (err) {
console.error(err);
resolve(err);
}
let xml = particularitiesObject['envelopment'].replace('__xml__', xmlSignature);
if (!validatorResult.valid) {
console.error(validatorResult);
resolve(validatorResult);
}
const result = {
url: particularitiesObject['webserviceUrl'],
soapEnvelop: xml
}
if (particularitiesObject['soapActions'] && particularitiesObject['soapActions']['enviarLoteRps']) {
result['soapAction'] = particularitiesObject['soapActions']['enviarLoteRps'];
}
resolve(result);
});
}
}).catch(err => {
console.error(err);
});
})
});
} catch (error) {
reject(error);
}
break;
case 'cancelarNfse':
try {
const pfx = fs.readFileSync(object.config.diretorioDoCertificado);
pem.readPkcs12(pfx, {
p12Password: object.config.senhaDoCertificado
}, (err, cert) => {
if (err) {
return res.send({
error: err
});
}
let xmlNotSigned = `<${particularitiesObject['tags']['cancelarNfseEnvioAlterada'] ? particularitiesObject['tags']['cancelarNfseEnvioAlterada'] : particularitiesObject['tags']['cancelarNfseEnvio']}>`;
xmlNotSigned += `<${particularitiesObject['tags']['prestadorAlterada'] ? particularitiesObject['tags']['prestadorAlterada'] : particularitiesObject['tags']['prestador']}>`;
xmlNotSigned += `<${particularitiesObject['tags']['cnpjAlterada'] ? particularitiesObject['tags']['cnpjAlterada'] : particularitiesObject['tags']['cnpj']}>${object.prestador.cpfCnpj}</${particularitiesObject['tags']['cnpj']}>`;
if (object.prestador.inscricaoMunicipal || object.prestador.inscricaoMunicipal != '') {
xmlNotSigned += `<${particularitiesObject['tags']['inscricaoMunicipalAlterada'] ? particularitiesObject['tags']['inscricaoMunicipalAlterada'] : particularitiesObject['tags']['inscricaoMunicipal']}>${object.prestador.inscricaoMunicipal}</${particularitiesObject['tags']['inscricaoMunicipal']}>`;
}
xmlNotSigned += `</${particularitiesObject['tags']['prestador']}>`;
xmlNotSigned += `<${particularitiesObject['tags']['numeroNfseAlterada'] ? particularitiesObject['tags']['numeroNfseAlterada'] : particularitiesObject['tags']['numeroNfse']}>${object.numeroNfse}</${particularitiesObject['tags']['numeroNfse']}>`;
xmlNotSigned += `</${particularitiesObject['tags']['cancelarNfseEnvio']}>`;
createSignature(xmlNotSigned, cert, 'CancelarNfseEnvio', true).then(xmlSignature => {
if (particularitiesObject['xsds']['cancelarNfse']) {
validator.validateXML(xmlSignature, __dirname + particularitiesObject['xsds']['cancelarNfse'], function (err, validatorResult) {
if (err) {
console.error(err);
resolve(err);
}
if (!validatorResult.valid) {
console.error(validatorResult);
resolve(validatorResult);
}
})
}
try {
let xml = particularitiesObject['envelopment'].replace('__xml__', xmlSignature);
const result = {
url: particularitiesObject['webserviceUrl'],
soapEnvelop: xml
}
if (particularitiesObject['soapActions'] && particularitiesObject['soapActions']['cancelarNfse']) {
result['soapAction'] = particularitiesObject['soapActions']['cancelarNfse'];
}
resolve(result);
} catch (error) {
console.error(error);
}
}).catch(err => {
console.error(err);
});
});
} catch (error) {
reject(error);
}
break;
case 'consultarLoteRps':
try {
const pfx = fs.readFileSync(object.config.diretorioDoCertificado);
pem.readPkcs12(pfx, {
p12Password: object.config.senhaDoCertificado
}, (err, cert) => {
if (err) {
resolve({
error: err
});
}
let xmlNotSigned = `<${particularitiesObject['tags']['consultarLoteRpsEnvioAlterada'] ? particularitiesObject['tags']['consultarLoteRpsEnvioAlterada'] : particularitiesObject['tags']['consultarLoteRpsEnvio']}>`;
xmlNotSigned += `<${particularitiesObject['tags']['prestadorAlterada'] ? particularitiesObject['tags']['prestadorAlterada'] : particularitiesObject['tags']['prestador']}>`;
xmlNotSigned += `<${particularitiesObject['tags']['cnpjAlterada'] ? particularitiesObject['tags']['cnpjAlterada'] : particularitiesObject['tags']['cnpj']}>${object.prestador.cpfCnpj.replace(/\.|\/|\-|\s/g, '')}</${particularitiesObject['tags']['cnpj']}>`;
if (object.prestador.inscricaoMunicipal || object.prestador.inscricaoMunicipal != '') {
xmlNotSigned += `<${particularitiesObject['tags']['inscricaoMunicipalAlterada'] ? particularitiesObject['tags']['inscricaoMunicipalAlterada'] : particularitiesObject['tags']['inscricaoMunicipal']}>${object.prestador.inscricaoMunicipal}</${particularitiesObject['tags']['inscricaoMunicipal']}>`;
}
xmlNotSigned += `</${particularitiesObject['tags']['prestador']}>`;
xmlNotSigned += `<${particularitiesObject['tags']['protocoloAlterada'] ? particularitiesObject['tags']['protocoloAlterada'] : particularitiesObject['tags']['protocolo']}>${object.protocolo}</${particularitiesObject['tags']['protocolo']}>`;
xmlNotSigned += `</${particularitiesObject['tags']['consultarLoteRpsEnvio']}>`;
createSignature(xmlNotSigned, cert, 'ConsultarLoteRpsEnvio')
.then(xmlSignature => {
if (particularitiesObject['xsds']['consultarLoteRps']) {
validator.validateXML(xmlSignature, __dirname + particularitiesObject['xsds']['cancelarNfse'], function (err, validatorResult) {
if (err) {
console.error(err);
resolve(err);
}
if (!validatorResult.valid) {
console.error(validatorResult);
resolve(validatorResult);
}
})
}
let xml = particularitiesObject['envelopment'].replace('__xml__', xmlNotSigned);
if (particularitiesObject['isSigned']['consultarLoteRps']) {
xml = particularitiesObject['envelopment'].replace('__xml__', xmlSignature);
}
const result = {
url: particularitiesObject['webserviceUrl'],
soapEnvelop: xml
}
if (particularitiesObject['soapActions'] && particularitiesObject['soapActions']['consultarLoteRps']) {
result['soapAction'] = particularitiesObject['soapActions']['consultarLoteRps'];
}
resolve(result);
}).catch(err => {
console.error(err);
});
});
} catch (error) {
reject(error);
}
break;
case 'consultarNfsePorRps':
try {
const pfx = fs.readFileSync(object.config.diretorioDoCertificado);
pem.readPkcs12(pfx, {
p12Password: object.config.senhaDoCertificado
}, (err, cert) => {
if (err) {
resolve({
error: err
});
}
let xml = '<ConsultarNfseRpsEnvio xmlns:ns3="http://www.ginfes.com.br/servico_consultar_nfse_rps_envio_v03.xsd" xmlns:ns4="http://www.ginfes.com.br/tipos_v03.xsd">';
xml += '<IdentificacaoRps>';
xml += '<Numero>' + object.identificacaoRps.numero + '</Numero>';
xml += '<Serie>' + object.identificacaoRps.serie + '</Serie>';
xml += '<Tipo>' + object.identificacaoRps.tipo + '</Tipo>';
xml += '</IdentificacaoRps>';
xml += '<Prestador>';
xml += '<Cnpj>' + object.prestador.cpfCnpj.replace(/\.|\/|\-|\s/g, '') + '</Cnpj>';
if (object.prestador.inscricaoMunicipal || object.prestador.inscricaoMunicipal != '') {
xml += '<InscricaoMunicipal>' + object.prestador.inscricaoMunicipal + '</InscricaoMunicipal>';
}
xml += '</Prestador>';
xml += '</ConsultarNfseRpsEnvio>';
createSignature(xml, cert, 'ConsultarNfseRpsEnvio', true).then(xmlSignature => {
validator.validateXML(xmlSignature, __dirname + '/../../../resources/xsd/ginfes/servico_consultar_nfse_rps_envio_v03.xsd', function (err, validatorResult) {
if (err) {
console.error(err);
resolve(err);
}
if (!validatorResult.valid) {
console.error(validatorResult);
resolve(validatorResult);
}
let xml = '<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">';
xml += '<soap:Body>';
xml += '<ns1:ConsultarNfsePorRpsV3 xmlns:ns1="' + particularitiesObject['urlXmlns'] + '">';
xml += '<arg0>';
xml += '<ns2:cabecalho versao="3" xmlns:ns2="http://www.ginfes.com.br/cabecalho_v03.xsd">';
xml += '<versaoDados>3</versaoDados>';
xml += '</ns2:cabecalho>';
xml += '</arg0>';
xml += '<arg1>';
xml += xmlSignature;
xml += '</arg1>';
xml += '</ns1:ConsultarNfsePorRpsV3>';
xml += '</soap:Body>';
xml += '</soap:Envelope>';
const result = {
url: particularitiesObject['webserviceUrl'],
soapEnvelop: xml
}
resolve(result);
});
}).catch(err => {
console.error(err);
});
});
} catch (error) {
reject(error);
}
break;
case 'consultarSituacaoLoteRps':
try {
const pfx = fs.readFileSync(object.config.diretorioDoCertificado);
pem.readPkcs12(pfx, {
p12Password: object.config.senhaDoCertificado
}, (err, cert) => {
if (err) {
return res.send({
error: err
});
}
let xml = '<ConsultarSituacaoLoteRpsEnvio xmlns:ns3="http://www.ginfes.com.br/servico_consultar_situacao_lote_rps_envio_v03.xsd" xmlns:ns4="http://www.ginfes.com.br/tipos_v03.xsd">';
xml += '<Prestador>';
xml += '<Cnpj>' + object.prestador.cpfCnpj.replace(/\.|\/|\-|\s/g, '') + '</Cnpj>';
if (object.prestador.inscricaoMunicipal || object.prestador.inscricaoMunicipal != '') {
xml += '<InscricaoMunicipal>' + object.prestador.inscricaoMunicipal + '</InscricaoMunicipal>';
}
xml += '</Prestador>';
xml += '<Protocolo>' + object.protocolo + '</Protocolo>';
xml += '</ConsultarSituacaoLoteRpsEnvio>';
createSignature(xml, cert, 'ConsultarSituacaoLoteRpsEnvio').then(xmlSignature => {
validator.validateXML(xmlSignature, __dirname + '/../../../resources/xsd/ginfes/servico_consultar_situacao_lote_rps_envio_v03.xsd', function (err, validatorResult) {
if (err) {
console.error(err);
resolve(err);
}
if (!validatorResult.valid) {
console.error(validatorResult);
resolve(validatorResult);
}
let xml = '<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">';
xml += '<soap:Body>';
xml += '<ns1:ConsultarSituacaoLoteRpsV3 xmlns:ns1="' + particularitiesObject['urlXmlns'] + '">';
xml += '<arg0>';
xml += '<ns2:cabecalho versao="3" xmlns:ns2="http://www.ginfes.com.br/cabecalho_v03.xsd">';
xml += '<versaoDados>3</versaoDados>';
xml += '</ns2:cabecalho>';
xml += '</arg0>';
xml += '<arg1>';
xml += xmlSignature;
xml += '</arg1>';
xml += '</ns1:ConsultarSituacaoLoteRpsV3>';
xml += '</soap:Body>';
xml += '</soap:Envelope>';
const result = {
url: particularitiesObject['webserviceUrl'],
soapEnvelop: xml
}
resolve(result);
});
}).catch(err => {
console.error(err);
});
});
} catch (error) {
reject(error);
}
break;
case 'consultarNfse':
try {
const pfx = fs.readFileSync(object.config.diretorioDoCertificado);
pem.readPkcs12(pfx, {
p12Password: object.config.senhaDoCertificado
}, (err, cert) => {
if (err) {
return res.send({
error: err
});
}
let xml = '<ConsultarNfseEnvio xmlns:ns3="http://www.ginfes.com.br/servico_consultar_nfse_envio_v03.xsd" xmlns:ns4="http://www.ginfes.com.br/tipos_v03.xsd">';
xml += '<Prestador>';
xml += '<Cnpj>' + object.prestador.cpfCnpj.replace(/\.|\/|\-|\s/g, '') + '</Cnpj>';
if (object.prestador.inscricaoMunicipal || object.prestador.inscricaoMunicipal != '') {
xml += '<InscricaoMunicipal>' + object.prestador.inscricaoMunicipal + '</InscricaoMunicipal>';
}
xml += '</Prestador>';
xml += '<PeriodoEmissao>';
xml += '<DataInicial>' + object.periodoEmissao.dataInicial + '</DataInicial>';
xml += '<DataFinal>' + object.periodoEmissao.dataFinal + '</DataFinal>';
xml += '</PeriodoEmissao>';
// xml += '<Tomador>';
// xml += '<CpfCnpj>';
// if (object.tomador.cpfCnpj.replace(/\.|\/|\-|\s/g, '').length === 11) {
// xml += '<Cpf>' + object.tomador.cpfCnpj.replace(/\.|\/|\-|\s/g, '') + '<Cpf>';
// }
// if (object.tomador.cpfCnpj.replace(/\.|\/|\-|\s/g, '').length === 14) {
// xml += '<Cnpj>' + object.tomador.cpfCnpj.replace(/\.|\/|\-|\s/g, '') + '<Cnpj>';
// }
// xml += '</CpfCnpj>';
// xml += '</Tomador>';
xml += '</ConsultarNfseEnvio>';
createSignature(xml, cert, 'ConsultarNfseEnvio').then(xmlSignature => {
validator.validateXML(xmlSignature, __dirname + '/../../../resources/xsd/ginfes/servico_consultar_nfse_envio_v03.xsd', function (err, validatorResult) {
if (err) {
console.error(err);
resolve(err);
}
if (!validatorResult.valid) {
console.error(validatorResult);
resolve(validatorResult);
}
let xml = '<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">';
xml += '<soap:Body>';
xml += '<ns1:ConsultarSituacaoLoteRpsV3 xmlns:ns1="' + particularitiesObject['urlXmlns'] + '">';
xml += '<arg0>';
xml += '<ns2:cabecalho versao="3" xmlns:ns2="http://www.ginfes.com.br/cabecalho_v03.xsd">';
xml += '<versaoDados>3</versaoDados>';
xml += '</ns2:cabecalho>';
xml += '</arg0>';
xml += '<arg1>';
xml += xmlSignature;
xml += '</arg1>';
xml += '</ns1:ConsultarSituacaoLoteRpsV3>';
xml += '</soap:Body>';
xml += '</soap:Envelope>';
const result = {
url: particularitiesObject['webserviceUrl'],
soapEnvelop: xml
}
resolve(result);
});
}).catch(err => {
console.error(err);
});
});
} catch (error) {
reject(error);
}
break;
default:
break;
}
})
}
module.exports = {
createXml
}
function addSignedXml(object, cert, particularitiesObject) {
return new Promise((resolve, reject) => {
let uniqueValue = numeroLote;
let regexUnique = new RegExp('_uniqueValue', 'g');
let xmlToBeSigned = '';
let xmlToBeSignedArray = [];
let xmlSignedArray = [];
object.rps.forEach((r, index) => {
let numeroRps = r.numero ? r.numero : timestamp + index;
let serieRps = r.serie ? r.serie : 'RPS';
let prestadorCpfCnpj;
let prestadorInscricaoMunicipal;
let prestadorCodigoMunicipio;
let tomadorCpfCnpj;
let tomadorInscricaoMunicipal;
if (r.prestador) {
if (r.prestador.cpfCnpj) {
prestadorCpfCnpj = r.prestador.cpfCnpj.replace(/[^\d]+/g, '');
}
if (r.prestador.inscricaoMunicipal) {
prestadorInscricaoMunicipal = r.prestador.inscricaoMunicipal;
}
if (r.prestador.codigoMunicipio) {
prestadorCodigoMunicipio = r.prestador.codigoMunicipio;
}
}
if (r.tomador) {
if (r.tomador.cpfCnpj) {
tomadorCpfCnpj = r.tomador.cpfCnpj.replace(/[^\d]+/g, '');
}
if (r.tomador.inscricaoMunicipal) {
tomadorInscricaoMunicipal = r.tomador.inscricaoMunicipal;
}
}
if (r.intermediario) {
if (r.intermediario.cpfCnpj) {
intermediarioCpfCnpj = r.intermediario.cpfCnpj.replace(/[^\d]+/g, '');
}
if (r.intermediario.inscricaoMunicipal) {
intermediarioInscricaoMunicipal = r.intermediario.inscricaoMunicipal;
}
}
xmlToBeSigned += `<${particularitiesObject['tags']['rpsAlterada'] ? particularitiesObject['tags']['rpsAlterada'] : particularitiesObject['tags']['rps']}>`;
xmlToBeSigned += `<${particularitiesObject['tags']['assinaturaAlterada'] ? particularitiesObject['tags']['assinaturaAlterada'] : particularitiesObject['tags']['assinatura']}></${particularitiesObject['tags']['assinatura']}>`;
xmlToBeSigned += `<${particularitiesObject['tags']['chaveRpsAlterada'] ? particularitiesObject['tags']['chaveRpsAlterada'] : particularitiesObject['tags']['chaveRps']}>`;
if (prestadorInscricaoMunicipal) {
xmlToBeSigned += `<${particularitiesObject['tags']['inscricaoPrestadorAlterada'] ? particularitiesObject['tags']['inscricaoPrestadorAlterada'] : particularitiesObject['tags']['inscricaoPrestador']}>${prestadorInscricaoMunicipal}</${particularitiesObject['tags']['inscricaoPrestador']}>`;
}
xmlToBeSigned += `<${particularitiesObject['tags']['serieRpsAlterada'] ? particularitiesObject['tags']['serieRpsAlterada'] : particularitiesObject['tags']['serieRps']}>` + serieRps + `</${particularitiesObject['tags']['serieRps']}>`;
xmlToBeSigned += `<${particularitiesObject['tags']['numeroRpsAlterada'] ? particularitiesObject['tags']['numeroRpsAlterada'] : particularitiesObject['tags']['numeroRps']}>` + numeroRps + `</${particularitiesObject['tags']['numeroRps']}>`;
xmlToBeSigned += `</${particularitiesObject['tags']['chaveRps']}>`;
if (r.tipo) {
xmlToBeSigned += `<${particularitiesObject['tags']['tipoAlterada'] ? particularitiesObject['tags']['tipoAlterada'] : particularitiesObject['tags']['tipo']}>` + r.tipo + `</${particularitiesObject['tags']['tipo']}>`;
}
if (r.dataEmissao) {
xmlToBeSigned += `<${particularitiesObject['tags']['dataEmissaoAlterada'] ? particularitiesObject['tags']['dataEmissaoAlterada'] : particularitiesObject['tags']['dataEmissao']}>` + r.dataEmissao.replace(/\s/g, 'T') + `</${particularitiesObject['tags']['dataEmissao']}>`;
}
if (r.status) {
xmlToBeSigned += `<${particularitiesObject['tags']['statusRpsAlterada'] ? particularitiesObject['tags']['statusRpsAlterada'] : particularitiesObject['tags']['statusRps']}>` + r.status + `</${particularitiesObject['tags']['statusRps']}>`;
}
if (r.servico) {
if (r.servico.codigoTributacaoMunicipio || r.servico.codigoTributacaoMunicipio != '') {
xmlToBeSigned += `<${particularitiesObject['tags']['tributacaoRpsAlterada'] ? particularitiesObject['tags']['tributacaoRpsAlterada'] : particularitiesObject['tags']['tributacaoRps']}>` + r.servico.codigoTributacaoMunicipio + `</${particularitiesObject['tags']['tributacaoRps']}>`;
}
if (r.servico.valorServicos) {
xmlToBeSigned += `<${particularitiesObject['tags']['valorServicosAlterada'] ? particularitiesObject['tags']['valorServicosAlterada'] : particularitiesObject['tags']['valorServicos']}>` + r.servico.valorServicos + `</${particularitiesObject['tags']['valorServicos']}>`;
}
if (r.servico.valorDeducoes) {
xmlToBeSigned += `<${particularitiesObject['tags']['valorDeducoesAlterada'] ? particularitiesObject['tags']['valorDeducoesAlterada'] : particularitiesObject['tags']['valorDeducoes']}>` + r.servico.valorDeducoes + `</${particularitiesObject['tags']['valorDeducoes']}>`;
}
if (r.servico.valorPis) {
xmlToBeSigned += `<${particularitiesObject['tags']['valorPisAlterada'] ? particularitiesObject['tags']['valorPisAlterada'] : particularitiesObject['tags']['valorPis']}>` + r.servico.valorPis + `</${particularitiesObject['tags']['valorPis']}>`;
}
if (r.servico.valorCofins) {
xmlToBeSigned += `<${particularitiesObject['tags']['valorCofinsAlterada'] ? particularitiesObject['tags']['valorCofinsAlterada'] : particularitiesObject['tags']['valorCofins']}>` + r.servico.valorCofins + `</${particularitiesObject['tags']['valorCofins']}>`;
}
if (r.servico.valorInss) {
xmlToBeSigned += `<${particularitiesObject['tags']['valorInssAlterada'] ? particularitiesObject['tags']['valorInssAlterada'] : particularitiesObject['tags']['valorInss']}>` + r.servico.valorInss + `</${particularitiesObject['tags']['valorInss']}>`;
}
if (r.servico.valorIr) {
xmlToBeSigned += `<${particularitiesObject['tags']['valorIrAlterada'] ? particularitiesObject['tags']['valorIrAlterada'] : particularitiesObject['tags']['valorIr']}>` + r.servico.valorIr + `</${particularitiesObject['tags']['valorIr']}>`;
}
if (r.servico.valorCsll) {
xmlToBeSigned += `<${particularitiesObject['tags']['valorCsllAlterada'] ? particularitiesObject['tags']['valorCsllAlterada'] : particularitiesObject['tags']['valorCsll']}>` + r.servico.valorCsll + `</${particularitiesObject['tags']['valorCsll']}>`;
}
if (r.servico.codigoCnae) {
xmlToBeSigned += `<${particularitiesObject['tags']['codigoServico'] ? particularitiesObject['tags']['codigoServico'] : particularitiesObject['tags']['codigoServico']}>` + r.servico.codigoCnae.replace(/[^\d]+/g, '') + `</${particularitiesObject['tags']['codigoServico']}>`;
}
if (r.servico.aliquota) {
xmlToBeSigned += `<${particularitiesObject['tags']['aliquotaServicosAlterada'] ? particularitiesObject['tags']['aliquotaServicosAlterada'] : particularitiesObject['tags']['aliquotaServicos']}>` + r.servico.aliquota + `</${particularitiesObject['tags']['aliquotaServicos']}>`;
}
if (r.servico.issRetido) {
xmlToBeSigned += `<${particularitiesObject['tags']['issRetidoAlterada'] ? particularitiesObject['tags']['issRetidoAlterada'] : particularitiesObject['tags']['issRetido']}>` + r.servico.issRetido + `</${particularitiesObject['tags']['issRetido']}>`;
}
if (r.tomador) {
if (tomadorCpfCnpj) {
xmlToBeSigned += `<${particularitiesObject['tags']['cpfCnpjTomadorAlterada'] ? particularitiesObject['tags']['cpfCnpjTomadorAlterada'] : particularitiesObject['tags']['cpfCnpjTomador']}>`;
if (tomadorCpfCnpj.replace(/[^\d]+/g, '').length === 11) {
xmlToBeSigned += `<CPF>${tomadorCpfCnpj.replace(/\.|\/|\-|\s/g, '')}</CPF>`;
}
if (tomadorCpfCnpj.replace(/[^\d]+/g, '').length === 14) {
xmlToBeSigned += `<CNPJ>${tomadorCpfCnpj.replace(/\.|\/|\-|\s/g, '')}</CNPJ>`;
}
xmlToBeSigned += `</${particularitiesObject['tags']['cpfCnpjTomador']}>`;
}
if (r.tomador.inscricaoMunicipal) {
xmlToBeSigned += `<${particularitiesObject['tags']['inscricaoMunicipalTomadorAlterada'] ? particularitiesObject['tags']['inscricaoMunicipalTomadorAlterada'] : particularitiesObject['tags']['inscricaoMunicipalTomador']}>` + r.tomador.inscricaoMunicipal + `</${particularitiesObject['tags']['inscricaoMunicipalTomador']}>`;
}
if (r.tomador.inscricaoEstadual) {
xmlToBeSigned += `<${particularitiesObject['tags']['inscricaoEstadualTomadorAlterada'] ? particularitiesObject['tags']['inscricaoEstadualTomadorAlterada'] : particularitiesObject['tags']['inscricaoEstadualTomador']}>` + r.tomador.inscricaoEstadual + `</${particularitiesObject['tags']['inscricaoEstadualTomador']}>`;
}
if (r.tomador.razaoSocial) {
xmlToBeSigned += `<${particularitiesObject['tags']['razaoSocialTomadorAlterada'] ? particularitiesObject['tags']['razaoSocialTomadorAlterada'] : particularitiesObject['tags']['razaoSocialTomador']}>` + r.tomador.razaoSocial + `</${particularitiesObject['tags']['razaoSocialTomador']}>`;
}
if (r.tomador.endereco) {
xmlToBeSigned += `<${particularitiesObject['tags']['enderecoTomadorAlterada'] ? particularitiesObject['tags']['enderecoTomadorAlterada'] : particularitiesObject['tags']['enderecoTomador']}>`;
if (r.tomador.endereco.tipoLogradouro) {
xmlToBeSigned += `<${particularitiesObject['tags']['tipoLogradouroAlterada'] ? particularitiesObject['tags']['tipoLogradouroAlterada'] : particularitiesObject['tags']['tipoLogradouro']}>` + r.tomador.endereco.endereco + `</${particularitiesObject['tags']['tipoLogradouro']}>`;
}
if (r.tomador.endereco.endereco) {
xmlToBeSigned += `<${particularitiesObject['tags']['logradouroAlterada'] ? particularitiesObject['tags']['logradouroAlterada'] : particularitiesObject['tags']['logradouro']}>` + r.tomador.endereco.endereco + `</${particularitiesObject['tags']['logradouro']}>`;
}
if (r.tomador.endereco.numero) {
xmlToBeSigned += `<${particularitiesObject['tags']['numeroEnderecoAlterada'] ? particularitiesObject['tags']['numeroEnderecoAlterada'] : particularitiesObject['tags']['numeroEndereco']}>` + r.tomador.endereco.numero + `</${particularitiesObject['tags']['numeroEndereco']}>`;
}
if (r.tomador.endereco.complemento) {
xmlToBeSigned += `<${particularitiesObject['tags']['complementoEnderecoAlterada'] ? particularitiesObject['tags']['complementoEnderecoAlterada'] : particularitiesObject['tags']['complementoEndereco']}>` + r.tomador.endereco.complemento + `</${particularitiesObject['tags']['complementoEndereco']}>`;
}
if (r.tomador.endereco.bairro) {
xmlToBeSigned += `<${particularitiesObject['tags']['bairroAlterada'] ? particularitiesObject['tags']['bairroAlterada'] : particularitiesObject['tags']['bairro']}>` + r.tomador.endereco.bairro + `</${particularitiesObject['tags']['bairro']}>`;
}
if (r.tomador.endereco.codigoMunicipio) {
xmlToBeSigned += `<${particularitiesObject['tags']['cidadeAlterada'] ? particularitiesObject['tags']['cidadeAlterada'] : particularitiesObject['tags']['cidade']}>` + r.tomador.endereco.codigoMunicipio + `</${particularitiesObject['tags']['cidade']}>`;
}
if (r.tomador.endereco.uf) {
xmlToBeSigned += `<${particularitiesObject['tags']['ufAlterada'] ? particularitiesObject['tags']['ufAlterada'] : particularitiesObject['tags']['uf']}>` + r.tomador.endereco.uf + `</${particularitiesObject['tags']['uf']}>`;
}
if (r.tomador.endereco.cep) {
xmlToBeSigned += `<${particularitiesObject['tags']['cepAlterada'] ? particularitiesObject['tags']['cepAlterada'] : particularitiesObject['tags']['cep']}>` + r.tomador.endereco.cep + `</${particularitiesObject['tags']['cep']}>`;
}
xmlToBeSigned += `</${particularitiesObject['tags']['endereco']}>`;
}
if (r.tomador.contato) {
if (r.tomador.contato.email && r.tomador.contato.email != '') {
xmlToBeSigned += `<${particularitiesObject['tags']['emailTomadorAlterada'] ? particularitiesObject['tags']['emailTomadorAlterada'] : particularitiesObject['tags']['emailTomador']}>` + r.tomador.contato.email + `</${particularitiesObject['tags']['emailTomador']}>`;
}
}
}
if (r.intermediario) {
if (intermediarioCpfCnpj) {
xmlToBeSigned += `<${particularitiesObject['tags']['cpfCnpjIntermediario'] ? particularitiesObject['tags']['cpfCnpjIntermediario'] : particularitiesObject['tags']['cpfCnpjIntermediario']}>`;
if (intermediarioCpfCnpj.replace(/[^\d]+/g, '').length === 11) {
xmlToBeSigned += `<CPF>${intermediarioCpfCnpj.replace(/\.|\/|\-|\s/g, '')}</CPF>`;
}
if (intermediarioCpfCnpj.replace(/[^\d]+/g, '').length === 14) {
xmlToBeSigned += `<CNPJ>${intermediarioCpfCnpj.replace(/\.|\/|\-|\s/g, '')}</CNPJ>`;
}
xmlToBeSigned += `</${particularitiesObject['tags']['cpfCnpjIntermediario']}>`;
}
if (r.intermediario.inscricaoMunicipal) {
xmlToBeSigned += `<${particularitiesObject['tags']['inscricaoMunicipalTomadorAlterada'] ? particularitiesObject['tags']['inscricaoMunicipalTomadorAlterada'] : particularitiesObject['tags']['inscricaoMunicipalTomador']}>` + r.intermediario.inscricaoMunicipal + `</${particularitiesObject['tags']['inscricaoMunicipalTomador']}>`;
}
if (r.intermediario.issRetido) {
xmlToBeSigned += `<${particularitiesObject['tags']['issRetidoIntermediarioAlterada'] ? particularitiesObject['tags']['issRetidoIntermediarioAlterada'] : particularitiesObject['tags']['issRetidoIntermediario']}>` + r.intermediario.issRetido + `</${particularitiesObject['tags']['issRetidoIntermediario']}>`;
}
if (r.intermediario.contato) {
if (r.intermediario.contato.email && r.intermediario.contato.email != '') {
xmlToBeSigned += `<${particularitiesObject['tags']['emailTomadorAlterada'] ? particularitiesObject['tags']['emailTomadorAlterada'] : particularitiesObject['tags']['emailTomador']}>` + r.tomador.contato.email + `</${particularitiesObject['tags']['emailTomador']}>`;
}
}
}
if (r.servico.discriminacao) {
xmlToBeSigned += `<${particularitiesObject['tags']['discriminacaoAlterada'] ? particularitiesObject['tags']['discriminacaoAlterada'] : particularitiesObject['tags']['discriminacao']}>` + r.servico.discriminacao + `</${particularitiesObject['tags']['discriminacao']}>`;
}
if (r.servico.valorCargaTributaria) {
xmlToBeSigned += `<${particularitiesObject['tags']['valorCargaTributariaAlterada'] ? particularitiesObject['tags']['valorCargaTributariaAlterada'] : particularitiesObject['tags']['valorCargaTributaria']}>` + r.servico.valorCargaTributaria + `</${particularitiesObject['tags']['valorCargaTributaria']}>`;
}
if (r.servico.percentualCargaTributaria) {
xmlToBeSigned += `<${particularitiesObject['tags']['percentualCargaTributariaAlterada'] ? particularitiesObject['tags']['percentualCargaTributariaAlterada'] : particularitiesObject['tags']['percentualCargaTributaria']}>` + r.servico.percentualCargaTributaria + `</${particularitiesObject['tags']['percentualCargaTributaria']}>`;
}
if (r.servico.fonteCargaTributaria) {
xmlToBeSigned += `<${particularitiesObject['tags']['fonteCargaTributariaAlterada'] ? particularitiesObject['tags']['fonteCargaTributariaAlterada'] : particularitiesObject['tags']['fonteCargaTributaria']}>` + r.servico.fonteCargaTributaria + `</${particularitiesObject['tags']['fonteCargaTributaria']}>`;
}
if (r.construcaoCivil) {
if (r.construcaoCivil.codigoCei) {
xmlToBeSigned += `<${particularitiesObject['tags']['codigoCeiAlterada'] ? particularitiesObject['tags']['codigoCeiAlterada'] : particularitiesObject['tags']['codigoCei']}>` + r.construcaoCivil.codigoCei + `</${particularitiesObject['tags']['codigoCei']}>`;
}
if (r.construcaoCivil.codigoObra) {
xmlToBeSigned += `<${particularitiesObject['tags']['matriculaAlteradaObra'] ? particularitiesObject['tags']['matriculaAlteradaObra'] : particularitiesObject['tags']['matriculaObra']}>` + r.construcaoCivil.codigoObra + `</${particularitiesObject['tags']['matriculaObra']}>`;
}
}
if (prestadorCodigoMunicipio) {
xmlToBeSigned += `<${particularitiesObject['tags']['municipioPrestacaoAlterada'] ? particularitiesObject['tags']['municipioPrestacaoAlterada'] : particularitiesObject['tags']['municipioPrestacao']}>${prestadorCodigoMunicipio}</${particularitiesObject['tags']['municipioPrestacao']}>`;
}
if (r.numeroEncapsulamento) {
xmlToBeSigned += `<${particularitiesObject['tags']['numeroEncapsulamentoAlterada'] ? particularitiesObject['tags']['numeroEncapsulamentoAlterada'] : particularitiesObject['tags']['numeroEncapsulamento']}>` + r.numeroEncapsulamento + `</${particularitiesObject['tags']['numeroEncapsulamento']}>`;
}
if (r.servico.valorTotalRecebido) {
xmlToBeSigned += `<${particularitiesObject['tags']['valorTotalRecebidoAlterada'] ? particularitiesObject['tags']['valorTotalRecebidoAlterada'] : particularitiesObject['tags']['valorTotalRecebido']}>${r.servico.valorTotalRecebido}</${particularitiesObject['tags']['valorTotalRecebido']}>`;
}
}
xmlToBeSigned += `</${particularitiesObject['tags']['rps']}>`;
// São Paulo: end
xmlToBeSigned = xmlToBeSigned.replace(regexUnique, uniqueValue + index);
xmlToBeSignedArray.push(xmlToBeSigned);
});
if (particularitiesObject['nfseKeyword'] === 'catalao') {
xmlToBeSignedArray.map((rps, index) => {
createSignature(rps, cert, 'InfDeclaracaoPrestacaoServico')
.then(createdSignatureXml => {
xmlSignedArray.push(createdSignatureXml);
if ((xmlToBeSignedArray.length - 1) === index) {
resolve(xmlSignedArray);
}
}).catch(error => {
const result = {
message: 'Erro no map de createSignature',
error: error
}
reject(result);
})
})
} else {
resolve(xmlToBeSignedArray);
}
})
}
function createSignature(xmlToBeSigned, cert, xmlElement, isEmptyUri = null) {
return new Promise((resolve, reject) => {
xmlSignatureController.addSignatureToXml(xmlToBeSigned, cert, xmlElement, null, isEmptyUri)
.then(xmlSigned => {
resolve(xmlSigned);
})
.catch(xmlSignedError => {
const result = {
message: 'Erro na assinatura de nota',
error: xmlSignedError
}
reject(result);
});
})
}
const settingsControllerAsync = (object, city) => {
return settingsController.setParticularities(object, city);
}
module.exports = {
setRequirements
}