cie-calculator-flap
Version:
Easily generate CIE References
157 lines (132 loc) • 4.91 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 Alg89 = function() {};
Alg89.prototype = new CIEStrategy();
Alg89.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 alg89(input.date, input.amount, input.reference);
}
};
module.exports.Alg89 = Alg89;
var contantLeft = 0;
var yearBase = 2013;
var yearMultiply = 372;
var unitSubtraction = 1;
var monthMultiply = 31;
var digitVerifyConstant = 2;
var mapAlphanumeric = new Map([["A", 2], ["B", 2], ["C", 2], ["D", 3], ["E", 3], ["F", 3], ["G", 4], ["H", 4], ["I", 4], ["J", 5], ["K", 5], ["L", 5], ["M", 6], ["N", 6], ["O", 6], ["P", 7], ["Q", 7], ["R", 7], ["S", 8], ["T", 8], ["U", 8], ["V", 9], ["W", 9], ["X", 9], ["Y", 0], ["Z", 0]]);
function alg89(dateExpired, amount, reference){
var digitVerifyDate = algorithmDate(dateExpired);
var amountFormat = convertToPounds(amount);
var digitVerifyAmount = algorithmAmount(amountFormat);
console.log(digitVerifyDate);
console.log(digitVerifyAmount);
console.log(reference);
var reference89 = reference + digitVerifyDate + digitVerifyAmount + digitVerifyConstant;
var digitVerifyReference = algorithmReference(reference89.toUpperCase());
console.log(digitVerifyReference);
reference89 = reference89 + digitVerifyReference;
return reference89;
}
function convertToPounds(str) {
var n = Number.parseFloat(str);
if(!str || isNaN(n) || n < 0) return 0;
return n.toFixed(2);
}
function algorithmReference(data){
console.log(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;
}
console.log(sumData);
var numberAux = 97;
var residue = ((sumData % numberAux) + numberAux) % numberAux;
return missingData(2, (residue + 1).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){
console.log(data);
var dataTransform = data.split('.').join("");
console.log(dataTransform);
var isPosition = 1
var mapMultiply = new Map([[1, 7], [2, 3], [3, 1]]);
//var isThree = true;
//var isSecond = false;
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;
}
console.log(sumData);
var numberAux = 10;
var residue = ((sumData % numberAux) + numberAux) % numberAux;
return residue.toString().charAt(residue.toString().length-1);
}
function algorithmDate(data){
console.log(data);
var dayData = data.substring(0, 2);
var monthData = data.substring(2, 4);
var yearData = data.substring(4, 8);
var yearSubtraction = yearData - yearBase;
console.log(yearSubtraction);
var yearresultMultiply = yearSubtraction * yearMultiply;
console.log(yearresultMultiply);
var monthResultSubtraction = Number(monthData) - unitSubtraction;
console.log(monthResultSubtraction);
var monthResultMultiply = monthResultSubtraction * monthMultiply;
console.log(monthResultMultiply);
var dayResultSubtraction = Number(dayData) - unitSubtraction;
console.log(dayResultSubtraction);
return missingData(4, yearresultMultiply + monthResultMultiply + dayResultSubtraction);
}
function missingData(minLengthMissing, data){
var missingLeft = minLengthMissing - data.length;
for (var i = 0; i < missingLeft; i++) {
data = contantLeft + data;
}
return data;
}