@openade/pem
Version:
Punto di Emissione (Emission Point) - Device library for fiscal receipts
89 lines • 2.86 kB
JavaScript
;
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