cie-calculator-flap
Version:
Easily generate CIE References
150 lines (114 loc) • 4.64 kB
JavaScript
;
var CIEStrategy = require('./cie_strategy.js').CIEStrategy;
var CIEUtils = require('./cie_utils.js').CIEUtils;
var cieUtils = new CIEUtils();
var Alg45 = function() {};
Alg45.prototype = new CIEStrategy();
Alg45.prototype = {
execute: function(input) {
var validationRules = {
reference: {length: {min: 1,max: 10}},
date: {length: {min: 8,max: 8}},
amount: {length: {min: 1,max: 12}}
};
if (!cieUtils.validateInput(input, validationRules)) {
var error = new Error('Longitud invalida');
error.status = '422';
throw error;
}
return applyAlgorithm45(input.date, input.amount, input.reference);
}
};
module.exports.Alg45 = Alg45;
let base36Encoder = {
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",
}
let referenceEncoder = {
"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, "0": 0, "1": 1, "2": 2, "3": 3,
"4": 4, "5": 5, "6": 6, "7": 7, "8": 8, "9": 9,
}
function generateRemainingList(number) {
let remainingList = [];
let quotient = number;
while(Math.trunc(quotient) != 0) {
remainingList.push(quotient % 36);
quotient = Math.trunc(quotient / 36);
}
return remainingList;
}
function generateCode(remainingList) {
let code = "";
for(let number of remainingList)
code += base36Encoder[number];
return code;
}
function addZeros(number, limit) {
while(number.length < limit) {
number = `0${number}`;
}
return number;
}
/*function isValid () {
let dateValidator = new RegExp(/^[0-9]{8}$/)
let amountValidator = new RegExp(/^[0-9]+.[0-9]{2}$/)
let referenceValidator = new RegExp(/^[0-9A-Z]{10,20}$/g)
if (dateValidator.test(document.getElementById('date').value),
amountValidator.test(document.getElementById('amount').value),
referenceValidator.test(document.getElementById('reference').value)) {
applyAlgorithm45(document.getElementById('date').value, document.getElementById('amount').value, document.getElementById('reference').value)
} else {
alert("invalid")
}
}*/
//document.getElementById("btn").addEventListener("click", isValid);
function applyAlgorithm45(date, amount, reference) {
console.log(date, amount, reference)
reference = reference.toUpperCase();
let dateCode = generateCode(generateRemainingList(`${date.substring(0, 4)}${date.substring(date.length-2, date.length)}`));
let reverseDateCode = (dateCode.length < 4) ? addZeros(dateCode.split("").reverse().join(""), 4) : dateCode.split("").reverse().join("");
///////////////
let fullAmount = null;
if(amount.includes('.'))
fullAmount = amount.split('.').join("");
else
fullAmount = amount;
let amountCode = generateCode(generateRemainingList(fullAmount));
let reverseAmountCode = (amountCode.length < 4) ? addZeros(amountCode.split("").reverse().join(""), 5) : amountCode.split("").reverse().join("");
///////////////
let fullReference = `${reference}${reverseDateCode}${reverseAmountCode}`
let encodedReference = "";
for(let item of fullReference)
encodedReference += referenceEncoder[item];
let serie = [1, 2];
let results = [];
let serieIndex = 1;
for(let number of encodedReference.split("").reverse().join("")) {
results.push(new String(number * serie[serieIndex]))
serieIndex = (serieIndex != 0) ? serieIndex - 1 : 1;
}
let singleNumbers = [];
for(let number of results) {
if(number.length > 1)
singleNumbers.push(number.split("").reduce((previous, current) => { return (new Number(previous) + new Number(current)) }, 0))
else
singleNumbers.push(new Number(number));
}
let sum = singleNumbers.reduce((previous, current) => { return previous + current }, 0);
let digit = (10 - new Number( (new String(sum % 10).length > 1) ? new String(sum % 10).split("").reverse().join("")[0] : sum % 10) );
if(digit === 10)
digit = 0;
console.log(fullReference, digit)
//document.getElementById("response").innerHTML = `${fullReference}${digit}`;
return `${fullReference}${digit}`;
}