cie-calculator-flap
Version:
Easily generate CIE References
248 lines (194 loc) • 5.63 kB
JavaScript
;
var _ = require('underscore');
var CIEStrategy = require('./cie_strategy.js').CIEStrategy;
var CIEUtils = require('./cie_utils.js').CIEUtils;
var cieUtils = new CIEUtils();
var Alg72 = function() {};
Alg72.prototype = new CIEStrategy();
Alg72.prototype = {
execute: function(input) {
var validationRules = {
reference: {length: {min: 1,max: 40}},
date: {length: {min: 8,max: 8}},
amount: {length: {min: 1,max: 12}}
};
if (!cieUtils.validateInput(input,validationRules )) {
throw new Error('Longitud invalida');
}
return algorithm72(input.reference, input.date, input.amount);
}
};
module.exports.Alg72 = Alg72;
/*************************************************************************
****************************** Algorithm 72 ******************************
**************************************************************************/
/**
* Add check digits to create a final reference
* @param {string} reference
* @param {string} expirationDate
* @param {string} amount
* @returns {string} finalReference
*/
function algorithm72(reference, expirationDate, amount) {
var condensedDateCheckDigit = processExpirationDate(expirationDate);
var amountCheckDigit = processAmount(amount);
var referenceCheckDigit = processReference(reference, condensedDateCheckDigit, amountCheckDigit);
console.log('condensedDateCheckDigit: ', condensedDateCheckDigit, 'amountCheckDigit: ', amountCheckDigit, 'referenceCheckDigit: ', referenceCheckDigit);
var finalReference = reference + condensedDateCheckDigit + amountCheckDigit + referenceCheckDigit;
console.log('finalReference: ', finalReference);
return finalReference;
}
function processExpirationDate(expirationDate){
var day = expirationDate.substring(0,2);
var month = expirationDate.substring(2,4);
var year = expirationDate.substring(6,8);
var dateInt = parseInt(day + '' + month + '' + year);
var remainderArray = new Array();
var quotientBoolean= true;
do {
var quotient = Math.floor(dateInt / 36);
var remainder = dateInt % 36;
remainderArray.push(remainder);
dateInt = quotient;
if(quotient == 0)
quotientBoolean = false;
} while (quotientBoolean);
var checkDigit = '';
for (var i = remainderArray.length - 1; i > -1; i--) {
checkDigit += remainderMap.get(remainderArray[i]);
}
if(checkDigit.length < 4){
do{
checkDigit = '0' + checkDigit;
}while(checkDigit.length < 4);
}
return checkDigit;
}
function processAmount(amountStr){
var amount = parseInt(amountStr.replace('.', ''));
var remainderArray = new Array();
var quotientBoolean= true;
do {
var quotient = Math.floor(amount / 36);
var remainder = amount % 36;
remainderArray.push(remainder);
amount = quotient;
if(quotient == 0)
quotientBoolean = false;
} while (quotientBoolean);
var checkDigit = '';
for (var i = remainderArray.length - 1; i > -1; i--) {
checkDigit += remainderMap.get(remainderArray[i]);
}
if(checkDigit.length < 5){
do{
checkDigit = '0' + checkDigit;
}while(checkDigit.length < 5);
}
return checkDigit;
}
function processReference(reference, expirationDate, amount){
var fullReference = reference + expirationDate + amount;
var resultReference = '';
for(var i = 0; i < fullReference.length; i++){
if(!isNumeric(fullReference[i]))
resultReference += referenceMap.get(fullReference[i]);
else
resultReference += fullReference[i];
}
var multiplier = 2;
var digits = new Array();
var multiplierBoolean = true;
for (var i = resultReference.length - 1; i > -1; i--) {
var digit = resultReference[i] * multiplier;
if (digit > 9) {
var subDigits = digit.toString().split('');
digit = 0;
subDigits.forEach(function (number) {
digit += parseInt(number);
});
}
digits.push(digit);
multiplier = multiplierBoolean ? 1 : 2;
multiplierBoolean = !multiplierBoolean;
}
var sum = 0;
digits.forEach(function (number) {
sum += parseInt(number);
});
var remainder = sum % 10;
var checkDigit = (remainder != 0) ? (10 - remainder) : remainder;
return checkDigit;
}
/*************************************************************************
********************************* Utils **********************************
**************************************************************************/
function isNumeric(value) {
return /^-?\d+$/.test(value);
}
const remainderMap = new Map([
[0, '0'],
[1, '1'],
[2, '2'],
[3, '3'],
[4, '4'],
[5, '5'],
[6, '6'],
[7, '7'],
[8, '8'],
[9, '9'],
[10, 'A'],
[11, 'B'],
[12, 'C'],
[13, 'D'],
[14, 'E'],
[15, 'F'],
[16, 'G'],
[17, 'H'],
[18, 'I'],
[19, 'J'],
[20, 'K'],
[21, 'L'],
[22, 'M'],
[23, 'N'],
[24, 'O'],
[25, 'P'],
[26, 'Q'],
[27, 'R'],
[28, 'S'],
[29, 'T'],
[30, 'U'],
[31, 'V'],
[32, 'W'],
[33, 'X'],
[34, 'Y'],
[35, 'Z']
]);
const referenceMap = new Map([
['A', 1],
['B', 2],
['C', 3],
['D', 4],
['E', 5],
['F', 6],
['G', 7],
['H', 8],
['I', 9],
['J', 1],
['K', 2],
['L', 3],
['M', 4],
['N', 5],
['O', 6],
['P', 7],
['Q', 8],
['R', 9],
['S', 1],
['T', 2],
['U', 3],
['V', 4],
['W', 5],
['X', 6],
['Y', 7],
['Z', 8]
]);