UNPKG

cie-calculator-flap

Version:

Easily generate CIE References

248 lines (194 loc) 5.63 kB
'use strict'; 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] ]);