pix-utils
Version:
Set of tools to parse, generate and validate payments of Brazil Instant Payment System (Pix)
103 lines • 11.2 kB
JavaScript
;
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.createEmv = createEmv;
exports.parseEmv = parseEmv;
const crc_1 = require("./crc");
const pixElements_1 = require("./types/pixElements");
const pixEmvSchema_1 = require("./types/pixEmvSchema");
const textParser_1 = require("./utils/textParser");
const zeroPad_1 = __importDefault(require("./utils/zeroPad"));
function generateEmvElement(elementId, value) {
if (!value)
return '';
const parsedElementId = (0, zeroPad_1.default)(elementId, 2);
const parsedLength = (0, zeroPad_1.default)(value.length, 2);
return `${parsedElementId}${parsedLength}${value}`;
}
function generateMAI(elements) {
if (elements.type === pixElements_1.PixElementType.STATIC) {
return [
generateEmvElement(pixEmvSchema_1.EmvMaiSchema.TAG_MAI_GUI, pixEmvSchema_1.EmvMaiSchema.BC_GUI),
generateEmvElement(pixEmvSchema_1.EmvMaiSchema.TAG_MAI_PIXKEY, elements.pixKey),
generateEmvElement(pixEmvSchema_1.EmvMaiSchema.TAG_MAI_INFO_ADD, elements.infoAdicional),
generateEmvElement(pixEmvSchema_1.EmvMaiSchema.TAG_MAI_FSS, elements.fss),
].join('');
}
else if (elements.type === pixElements_1.PixElementType.DYNAMIC ||
elements.type === pixElements_1.PixElementType.RECURRENCE) {
return [
generateEmvElement(pixEmvSchema_1.EmvMaiSchema.TAG_MAI_GUI, pixEmvSchema_1.EmvMaiSchema.BC_GUI),
generateEmvElement(pixEmvSchema_1.EmvMaiSchema.TAG_MAI_URL, elements.url),
].join('');
}
return undefined;
}
function generateAdditionalData(txid) {
return generateEmvElement(pixEmvSchema_1.EmvAdditionalDataSchema.TAG_TXID, txid || '***');
}
function createEmv(elements) {
if (![
pixElements_1.PixElementType.STATIC,
pixElements_1.PixElementType.DYNAMIC,
pixElements_1.PixElementType.RECURRENCE,
].includes(elements.type))
return 'INVALID';
const emvElements = [
generateEmvElement(pixEmvSchema_1.EmvSchema.TAG_INIT, '01'),
generateEmvElement(pixEmvSchema_1.EmvSchema.TAG_ONETIME, elements.oneTime ? '12' : ''),
generateEmvElement(pixEmvSchema_1.EmvSchema.TAG_MAI, generateMAI(elements)),
generateEmvElement(pixEmvSchema_1.EmvSchema.TAG_MCC, elements.merchantCategoryCode),
generateEmvElement(pixEmvSchema_1.EmvSchema.TAG_TRANSACTION_CURRENCY, elements.transactionCurrency),
elements.type === pixElements_1.PixElementType.STATIC
? generateEmvElement(pixEmvSchema_1.EmvSchema.TAG_TRANSACTION_AMOUNT, elements.transactionAmount > 0
? elements.transactionAmount.toFixed(2)
: '')
: '',
generateEmvElement(pixEmvSchema_1.EmvSchema.TAG_COUNTRY_CODE, elements.countryCode),
generateEmvElement(pixEmvSchema_1.EmvSchema.TAG_MERCHANT_NAME, (0, textParser_1.normalizeName)(elements.merchantName)),
generateEmvElement(pixEmvSchema_1.EmvSchema.TAG_MERCHANT_CITY, (0, textParser_1.normalizeCity)(elements.merchantCity)),
generateEmvElement(pixEmvSchema_1.EmvSchema.TAG_ADDITIONAL_DATA, generateAdditionalData(elements.type === pixElements_1.PixElementType.STATIC ? elements.txid : '')),
elements.urlRec
? generateEmvElement(pixEmvSchema_1.EmvSchema.TAG_UNRESERVED_TEMPLATE, [
generateEmvElement(pixEmvSchema_1.EmvMaiSchema.TAG_MAI_GUI, pixEmvSchema_1.EmvMaiSchema.BC_GUI),
generateEmvElement(pixEmvSchema_1.EmvMaiSchema.TAG_MAI_URL, elements.urlRec),
].join(''))
: '',
generateEmvElement(pixEmvSchema_1.EmvSchema.TAG_CRC, '0000'),
];
const generatedEmv = emvElements.join('');
return generatedEmv.replace(/\w{4}$/, (0, crc_1.computeCRC)(generatedEmv));
}
function parseEmv({ emvCode, currentIndex = 0, currentData = {}, }) {
const tag = +emvCode.substring(currentIndex, currentIndex + 2);
const length = Number(emvCode.substring(currentIndex + 2, currentIndex + 4));
const value = emvCode.substring(currentIndex + 4, currentIndex + 4 + length);
if (!length || !value.length || length !== value.length) {
return {
isValid: false,
rawTags: currentData,
};
}
const newData = Object.assign(Object.assign({}, currentData), { [tag]: Object.assign({ tag: tag, length: length, value: value }, (Object.values(pixEmvSchema_1.TagsWithSubTags).includes(tag)
? { subTags: parseEmv({ emvCode: value }) }
: {})) });
if (currentIndex + 4 + length === emvCode.length) {
return {
isValid: true,
rawTags: newData,
getTag: (tag) => { var _a; return (_a = newData === null || newData === void 0 ? void 0 : newData[Number(tag)]) === null || _a === void 0 ? void 0 : _a.value; },
getSubTag: (tag, mainTag) => { var _a, _b; return (_b = (_a = newData === null || newData === void 0 ? void 0 : newData[Number(mainTag)]) === null || _a === void 0 ? void 0 : _a.subTags) === null || _b === void 0 ? void 0 : _b.getTag(Number(tag)); },
};
}
else {
return parseEmv({
emvCode,
currentIndex: currentIndex + 4 + length,
currentData: newData,
});
}
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZW12SGFuZGxlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9lbXZIYW5kbGVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7O0FBMkNBLDhCQXdEQztBQUVELDRCQTJDQztBQWhKRCwrQkFBbUM7QUFDbkMscURBQWtFO0FBQ2xFLHVEQU04QjtBQUM5QixtREFBa0U7QUFDbEUsOERBQXNDO0FBRXRDLFNBQVMsa0JBQWtCLENBQUMsU0FBaUIsRUFBRSxLQUFhO0lBQzFELElBQUksQ0FBQyxLQUFLO1FBQUUsT0FBTyxFQUFFLENBQUM7SUFDdEIsTUFBTSxlQUFlLEdBQUcsSUFBQSxpQkFBTyxFQUFDLFNBQVMsRUFBRSxDQUFDLENBQUMsQ0FBQztJQUM5QyxNQUFNLFlBQVksR0FBRyxJQUFBLGlCQUFPLEVBQUMsS0FBSyxDQUFDLE1BQU0sRUFBRSxDQUFDLENBQUMsQ0FBQztJQUM5QyxPQUFPLEdBQUcsZUFBZSxHQUFHLFlBQVksR0FBRyxLQUFLLEVBQUUsQ0FBQztBQUNyRCxDQUFDO0FBRUQsU0FBUyxXQUFXLENBQUMsUUFBcUI7SUFDeEMsSUFBSSxRQUFRLENBQUMsSUFBSSxLQUFLLDRCQUFjLENBQUMsTUFBTSxFQUFFLENBQUM7UUFDNUMsT0FBTztZQUNMLGtCQUFrQixDQUFDLDJCQUFZLENBQUMsV0FBVyxFQUFFLDJCQUFZLENBQUMsTUFBTSxDQUFDO1lBQ2pFLGtCQUFrQixDQUFDLDJCQUFZLENBQUMsY0FBYyxFQUFFLFFBQVEsQ0FBQyxNQUFNLENBQUM7WUFDaEUsa0JBQWtCLENBQUMsMkJBQVksQ0FBQyxnQkFBZ0IsRUFBRSxRQUFRLENBQUMsYUFBYSxDQUFDO1lBQ3pFLGtCQUFrQixDQUFDLDJCQUFZLENBQUMsV0FBVyxFQUFFLFFBQVEsQ0FBQyxHQUFHLENBQUM7U0FDM0QsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUM7SUFDYixDQUFDO1NBQU0sSUFDTCxRQUFRLENBQUMsSUFBSSxLQUFLLDRCQUFjLENB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