UNPKG

cie-calculator-flap

Version:

Easily generate CIE References

146 lines (118 loc) 4.56 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 Alg91 = function() {}; Alg91.prototype = new CIEStrategy(); Alg91.prototype = { execute: function(input) { var validationRules = { reference: {length: {min: 1,max: 42}}, date: {length: {min: 8,max: 8}}, amount: {length: {min: 1,max: 12}} }; if (!cieUtils.validateInput(input,validationRules )) { throw new Error('Longitud invalida'); } return alg91(input.date, input.amount, input.reference); } }; module.exports.Alg91 = Alg91; var contantLeft = 0; var yearBase = 2013; var yearMultiply = 372; var unitSubtraction = 1; var monthMultiply = 31; var digitVerifyConstant = 2; var mapAlphanumeric = 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", 2], ["T", 3], ["U", 4], ["V", 5], ["W", 6], ["X", 7], ["Y", 8], ["Z", 9]]); function alg91(dateExpired, amount, reference){ var digitVerifyDate = algorithmDate(dateExpired); var amountFormat = convertToPounds(amount); var digitVerifyAmount = algorithmAmount(amountFormat); var reference91 = reference + digitVerifyDate + digitVerifyAmount + digitVerifyConstant; var digitVerifyReference = algorithmReference(reference91.toUpperCase()); reference91 = reference91 + digitVerifyReference; return reference91; } function convertToPounds(str) { var n = Number.parseFloat(str); if(!str || isNaN(n) || n < 0) return 0; return n.toFixed(2); } function algorithmReference(data){ var dataReplace = replaceAlphanumeric(data); var isPosition = 1 var mapMultiply = new Map([[1, 11], [2, 13], [3, 17], [4, 19], [5, 23]]); var sumData = 0; for(var i = dataReplace.length-1; i >= 0; i--) { var dataNumber = Number(dataReplace.charAt(i)); var numberMultiply = 0; if(mapMultiply.has(isPosition)){ numberMultiply = mapMultiply.get(isPosition); }else{ isPosition = 1; numberMultiply = mapMultiply.get(isPosition); } isPosition++; var resultMultiply = (numberMultiply * dataNumber); sumData += resultMultiply; } var numberAux = 97; var residue = ((sumData % numberAux) + numberAux) % numberAux; var digitVerifyReference = residue + 1; digitVerifyReference = digitVerifyReference.toString(); return missingData(2, digitVerifyReference.toString()); } function replaceAlphanumeric(data){ var transform = ""; for (let characterData of data) { var infoCharacter = characterData; if(mapAlphanumeric.has(characterData)){ infoCharacter = mapAlphanumeric.get(characterData); } transform += infoCharacter; } return transform; } function algorithmAmount(data){ var dataTransform = data.split('.').join(""); var isPosition = 1 var mapMultiply = new Map([[1, 7], [2, 3], [3, 1]]); var sumData = 0; for(var i = dataTransform.length-1; i >= 0; i--) { var dataNumber = Number(dataTransform.charAt(i)); var numberMultiply = 0; if(mapMultiply.has(isPosition)){ numberMultiply = mapMultiply.get(isPosition); }else{ isPosition = 1; numberMultiply = mapMultiply.get(isPosition); } isPosition++; var resultMultiply = (numberMultiply * dataNumber); sumData += resultMultiply; } var numberAux = 10; var residue = ((sumData % numberAux) + numberAux) % numberAux; return residue.toString().charAt(residue.toString().length-1); } function algorithmDate(data){ var dayData = data.substring(0, 2); var monthData = data.substring(2, 4); var yearData = data.substring(4, 8); var yearSubtraction = yearData - yearBase; var yearresultMultiply = yearSubtraction * yearMultiply; var monthResultSubtraction = Number(monthData) - unitSubtraction; var monthResultMultiply = monthResultSubtraction * monthMultiply; var dayResultSubtraction = Number(dayData) - unitSubtraction; var digitVerifyDate = yearresultMultiply + monthResultMultiply + dayResultSubtraction; return missingData(4, digitVerifyDate.toString()); } function missingData(minLengthMissing, data){ var missingLeft = minLengthMissing - data.length; for (var i = 0; i < missingLeft; i++) { data = contantLeft + data; } return data; }