UNPKG

cie-calculator-flap

Version:

Easily generate CIE References

284 lines (218 loc) 6.08 kB
'use strict'; var CIEStrategy = require('./cie_strategy.js').CIEStrategy; var CIEUtils = require('./cie_utils.js').CIEUtils; var cieUtils = new CIEUtils(); var Alg80 = function() {}; Alg80.prototype = new CIEStrategy(); Alg80.prototype = { execute: function(input) { var validationRules = { reference: {length: {min: 21,max: 49}} }; if (!cieUtils.validateInput(input, validationRules)) { var error = new Error('Longitud invalida'); error.status = '422'; throw error; } return algorithm80(input.reference); } }; module.exports.Alg80 = Alg80; /************************************************************************* ****************************** Algorithm 80 ****************************** **************************************************************************/ /** * Add a check digit to the reference * @param {string} reference * @returns {number} resultReference */ function algorithm80(reference) { if(!isNumeric(reference)){ console.error('La referencia debe ser Númerica'); return; } var multiplier = 2; var digits = new Array(); var multiplierBoolean = true; for (var i = reference.length - 1; i > -1; i--) { var digit = reference[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; console.log('checkDigit: ', checkDigit); var resultReference = reference + checkDigit; console.log('resultReference: ', resultReference); if (resultReference.length < 21) console.warn('La longitud mínima de la referencia resultante deber ser de 21'); if (resultReference.length > 50) console.warn('La longitud máxima de la referencia resultante deber ser de 50'); return resultReference; } 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 = 10 - 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] ]);