UNPKG

cie-calculator-flap

Version:

Easily generate CIE References

133 lines (106 loc) 3.93 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 Alg94 = function() {}; Alg94.prototype = new CIEStrategy(); Alg94.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 alg94(input.date, input.amount, input.reference); } }; module.exports.Alg94 = Alg94; var contantLeft = 0; var yearBase = 2013; var yearMultiply = 372; var unitSubtraction = 1; var monthMultiply = 31; var digitVerifyConstant = 2; function alg94(dateExpired, amount, reference){ var digitVerifyDate = algorithmDate(dateExpired); var amountFormat = convertToPounds(amount); var digitVerifyAmount = algorithmAmount(amountFormat); var reference94 = reference + digitVerifyDate + digitVerifyAmount + digitVerifyConstant; var digitVerifyReference = algorithmReference(reference94.toUpperCase()); reference94 = reference94 + digitVerifyReference; return reference94; } function convertToPounds(str) { var n = Number.parseFloat(str); if(!str || isNaN(n) || n < 0) return 0; return n.toFixed(2); } 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 algorithmReference(data){ var dataReplace = 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 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; }