cie-calculator-flap
Version:
Easily generate CIE References
146 lines (118 loc) • 4.56 kB
JavaScript
'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;
}