barcodes.js 4.6 KB
Newer Older
Administrator committed
1 2 3 4 5 6 7
IFCBarcodes = {
    'codes': {},
    'patterns': [],
    'errors': [],
    init : async function() {
        // as it is a long time response task, restrict it
        if (is_time_to('load_barcodes', 5000)) {
8
            openWaiting('Récupération des informations code-barres....');
Administrator committed
9
            try {
10 11 12 13
                let response = await fetch('/products/barcodes');
                let bc_data = await response.json();

                closeModal();
Administrator committed
14
                if (typeof bc_data.res.error == "undefined") {
15
                    this.patterns = bc_data.res.patterns;
16
                    this.aliases = bc_data.res.aliases;
17 18 19
                    this.codes = bc_data.res.list.pdts;
                    this.uoms = bc_data.res.list.uoms;
                    this.keys = bc_data.res.keys;
Administrator committed
20
                } else {
21
                    this.errors.push(bc_data.res.error);
Administrator committed
22
                }
23 24 25 26 27 28
            } catch (e) {
                err = {msg: e.name + ' : ' + e.message, ctx: 'retrieve barcodes'};
                console.error(err);
                report_JS_error(err, 'products');
                closeModal();
                this.errors.push(JSON.stringify(err));
Administrator committed
29 30 31 32
            }
        }
    },
    display_last_error: function() {
33
        alert(this.errors[this.errors.length - 1]);
Administrator committed
34 35 36 37 38
    },
    get_corresponding_odoo_product: function(bc) {
        //console.log('To analyze :' + bc)
        var index = 0,
            pattern_found = false,
39 40 41 42 43
            is_alias = false,
            encoded_value = '',
            pattern_type = '',
            odoo_product = null,
            product_data = null;
Administrator committed
44
        // Let's find out if it matches a pattern
45

Administrator committed
46
        while (index < this.patterns.length -1 && pattern_found === false) {
47
            var pattern = this.patterns[index].pattern;
48 49
            var significant_prefix = pattern.replace(/[^0-9]/g, ''); //remove all but figures

Administrator committed
50
            if (bc.indexOf(significant_prefix) === 0) {
51 52 53 54 55 56
                /*
                    For example,
                    bc = 0493213018809
                    pattern = 0493...{NNDDD}
                */
                //console.log(pattern)
Administrator committed
57
                // console.log(bc)
58
                odoo_bc = '';
59
                pattern_found = true;
60
                pattern_type = this.patterns[index].type;
61
                pattern = pattern.replace(/[^0-9.ND]/, '');
62
                bc = bc.slice(0, -1); // remove original check figure
63

Administrator committed
64 65 66
                // Read pattern character by character
                for (var i = 0; i < pattern.length; i++) {
                    if (/[0-9]/.exec(pattern[i])) {
67
                        odoo_bc += pattern[i];
Administrator committed
68
                    } else if (pattern[i].indexOf('.') === 0) {
69
                        odoo_bc += bc[i];
Administrator committed
70
                    } else if (/[ND]/.exec(pattern[i])) {
71
                        odoo_bc += '0';
Administrator committed
72
                        if (pattern[i] === 'D' && encoded_value.indexOf('.') < 0)
73 74
                            encoded_value += '.';
                        encoded_value += bc[i];
Administrator committed
75 76 77
                    }
                }
                // Add check digit at the end of odoo_bc to find out "normalized" code
78
                bc = odoo_bc + eanCheckDigit(odoo_bc);
Administrator committed
79
            }
80
            index++;
Administrator committed
81 82
        }

83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109
        // let's seek "normalized" bc in codes array or alias map
        for (alias in this.aliases) {
            if (bc == alias) {
                is_alias = true;
                for (barcode in this.codes) {
                    if (barcode == this.aliases[alias]) {
                        product_data = this.codes[barcode];
                    }
                }
            }
        }
        if (is_alias === false) {
            for (code in this.codes) {
                if (code == bc) {
                    product_data = this.codes[code];
                }
            }
        }

        if (product_data !== null) {
            p_uom = (this.uoms)[product_data[this.keys.uom_id]];
            if (encoded_value.length > 0 && !isNaN(encoded_value)) {
                if (p_uom == 'Unit(s)' || p_uom == 'unité') {
                    encoded_value = parseInt(encoded_value, 10);
                } else {
                    encoded_value = parseFloat(encoded_value);
                }
Administrator committed
110
            }
111 112 113

            odoo_product = {barcode: bc, data: product_data, rule: pattern_type, value: encoded_value};

Administrator committed
114
        }
115

116
        return odoo_product;
Administrator committed
117
    }
118
};
Administrator committed
119 120

init_barcodes = async function() {
121 122 123 124 125 126 127 128 129
    var result = null;
    var ifcb = Object.create(IFCBarcodes);

    await ifcb.init();
    if (ifcb.errors.length > 0)
        ifcb.display_last_error();
    else
        result = ifcb;
    // console.log(result.patterns)
130

131 132
    return result;
};