UNPKG

cie-calculator-flap

Version:

Easily generate CIE References

150 lines (114 loc) 4.64 kB
'use strict'; 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}`; }