UNPKG

@openade/pem

Version:

Punto di Emissione (Emission Point) - Device library for fiscal receipts

89 lines 2.86 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.LotteryGenerator = void 0; const crypto_1 = require("crypto"); class LotteryGenerator { constructor(config = {}) { this.sequenceCounter = 0; this.config = { enableInstant: true, enableDeferred: true, minimumAmount: 1.0, ...config, }; } generateInstantCode(documentNumber, amount, timestamp) { if (!this.config.enableInstant) { return null; } if (amount < (this.config.minimumAmount || 1.0)) { return null; } const code = this.generateCode('I', documentNumber); return { type: 'INSTANT', code, generatedAt: (timestamp || new Date()).toISOString(), documentNumber, }; } generateDeferredCode(documentNumber, amount, customerFiscalCode, timestamp) { if (!this.config.enableDeferred) { return null; } if (amount < (this.config.minimumAmount || 1.0)) { return null; } if (!customerFiscalCode || customerFiscalCode.length === 0) { return null; } const code = this.generateCode('D', documentNumber, customerFiscalCode); return { type: 'DEFERRED', code, generatedAt: (timestamp || new Date()).toISOString(), documentNumber, customerFiscalCode, }; } generateCode(prefix, documentNumber, fiscalCode) { this.sequenceCounter = (this.sequenceCounter + 1) % 1000000; const hash = (0, crypto_1.createHash)('sha256') .update(prefix) .update(documentNumber) .update(this.sequenceCounter.toString()) .update(Date.now().toString()) .update((0, crypto_1.randomBytes)(8)) .update(fiscalCode || '') .digest('hex'); const alphanumeric = hash .substring(0, 10) .toUpperCase() .replace(/[^A-Z0-9]/g, ''); const padded = (alphanumeric + '0000000000').substring(0, 10); return `${prefix}-${padded}`; } generateQRCodeData(lotteryCode) { return [ lotteryCode.type, lotteryCode.code, lotteryCode.generatedAt, lotteryCode.documentNumber, ].join('|'); } static validateCode(code) { const regex = /^[ID]-[A-Z0-9]{10}$/; return regex.test(code); } static getTypeFromCode(code) { if (code.startsWith('I-')) { return 'INSTANT'; } if (code.startsWith('D-')) { return 'DEFERRED'; } return null; } } exports.LotteryGenerator = LotteryGenerator; //# sourceMappingURL=lottery.generator.js.map