@dueheads/citi-bank-boleto-sdk
Version:
SDK para registro de boletos na API do Citibank via mTLS.
150 lines (149 loc) • 6.96 kB
JavaScript
;
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
if (k2 === undefined) k2 = k;
var desc = Object.getOwnPropertyDescriptor(m, k);
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
desc = { enumerable: true, get: function() { return m[k]; } };
}
Object.defineProperty(o, k2, desc);
}) : (function(o, m, k, k2) {
if (k2 === undefined) k2 = k;
o[k2] = m[k];
}));
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
Object.defineProperty(o, "default", { enumerable: true, value: v });
}) : function(o, v) {
o["default"] = v;
});
var __importStar = (this && this.__importStar) || (function () {
var ownKeys = function(o) {
ownKeys = Object.getOwnPropertyNames || function (o) {
var ar = [];
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
return ar;
};
return ownKeys(o);
};
return function (mod) {
if (mod && mod.__esModule) return mod;
var result = {};
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
__setModuleDefault(result, mod);
return result;
};
})();
Object.defineProperty(exports, "__esModule", { value: true });
exports.XMLBuilder = void 0;
const xmljs = __importStar(require("xml-js"));
class XMLBuilder {
formatAmount(value, decimals) {
if (value === undefined || value === 0) {
// Documentação exige zeros se não for usar [cite: 15, 16, 17]
return '0'.repeat(13);
}
return (value * Math.pow(10, decimals)).toFixed(0).padStart(13, '0');
}
// Função auxiliar para criar um grupo de desconto padrão/vazio
createDefaultDiscountGroup() {
return {
TitlDscntAmtOrPrct: this.formatAmount(0, 4),
TitlDscntEndDt: ' ',
TitlDscntTp: ' ',
};
}
build(data) {
const jsObject = {
_declaration: {
_attributes: {
version: '1.0',
encoding: 'utf-8',
},
},
'soapenv:Envelope': {
_attributes: {
'xmlns:soapenv': 'http://schemas.xmlsoap.org/soap/envelope/',
},
'soapenv:Header': {},
'soapenv:Body': {
GrpREMColTit: {
// ... (todos os outros campos de GrpBenf até TitlYourNb permanecem iguais)
GrpBenf: {
CdClrSys: '745',
CdIspb: '33479023',
CdtrId: data.GrpBenf.CdtrId,
CdtrNm: data.GrpBenf.CdtrNm,
CdtrTaxId: data.GrpBenf.CdtrTaxId,
CdtrTaxTp: data.GrpBenf.CdtrTaxTp,
},
GrpClPgd: {
DbtrNm: data.GrpClPgd.DbtrNm,
DbtrTaxId: data.GrpClPgd.DbtrTaxId,
DbtrTaxTp: data.GrpClPgd.DbtrTaxTp,
GrpClPgdAdr: {
DbtrAdrTp: data.GrpClPgd.GrpClPgdAdr.DbtrAdrTp,
DbtrCtrySubDvsn: data.GrpClPgd.GrpClPgdAdr.DbtrCtrySubDvsn,
DbtrPstCd: data.GrpClPgd.GrpClPgdAdr.DbtrPstCd,
DbtrTwnNm: data.GrpClPgd.GrpClPgdAdr.DbtrTwnNm,
},
},
CdOccTp: '01',
DbtrGrntNm: data.DbtrGrntNm || ' ',
DbtrMsg: data.DbtrMsg || ' ',
TitlAmt: this.formatAmount(data.TitlAmt, 2),
TitlBarCdInd: data.TitlBarCdInd,
TitlCcyCd: data.TitlCcyCd,
TitlCiaCdId: data.TitlCiaCdId,
TitlDueDt: data.TitlDueDt,
TitlInstrNmDtExec: data.TitlInstrNmDtExec || '00',
TitlInstrProtInd: data.TitlInstrProtInd || ' ',
TitlInstrWrtOffInd: data.TitlInstrWrtOffInd,
TitlIOFAmt: this.formatAmount(data.TitlIOFAmt, 2),
TitlIssDt: data.TitlIssDt,
TitlOurNb: data.TitlOurNb,
TitlPortCd: data.TitlPortCd,
TitlRbtAmt: this.formatAmount(data.TitlRbtAmt, 2),
TitlTpCd: data.TitlTpCd,
TitlYourNb: data.TitlYourNb,
// ---> INÍCIO DA CORREÇÃO LÓGICA <---
// Garante que os grupos sempre existam no XML final.
// Grupo de Desconto
GrpDscnt: data.GrpDscnt?.length
? data.GrpDscnt.map(d => ({
TitlDscntAmtOrPrct: this.formatAmount(d.TitlDscntAmtOrPrct, 4),
TitlDscntEndDt: d.TitlDscntEndDt || ' ',
TitlDscntTp: d.TitlDscntTp,
}))
: this.createDefaultDiscountGroup(), // Envia um grupo padrão se não houver dados
// Grupo de Juros
GrpItrs: data.GrpItrs
? {
TitlItrsAmtOrPrct: this.formatAmount(data.GrpItrs.TitlItrsAmtOrPrct, 4),
TitlItrsStrDt: data.GrpItrs.TitlItrsStrDt || ' ',
TitlItrsTp: data.GrpItrs.TitlItrsTp,
}
: {
TitlItrsAmtOrPrct: this.formatAmount(0, 4),
TitlItrsStrDt: ' ',
TitlItrsTp: ' ',
},
// Grupo de Multa
GrpFn: data.GrpFn
? {
TitlFnAmtOrPrct: this.formatAmount(data.GrpFn.TitlFnAmtOrPrct, 5),
TitlFnStrDt: data.GrpFn.TitlFnStrDt || ' ',
TitlFnTp: data.GrpFn.TitlFnTp,
}
: {
TitlFnAmtOrPrct: this.formatAmount(0, 5),
TitlFnStrDt: ' ',
TitlFnTp: ' ',
},
// ---> FIM DA CORREÇÃO LÓGICA <---
},
},
},
};
return xmljs.js2xml(jsObject, { compact: true, spaces: 4 });
}
}
exports.XMLBuilder = XMLBuilder;