[FIX] pos_barcodes: do not crash the point of sale when there's no barcode nomenclature
[odoo/odoo.git] / addons / pos_barcodes / static / src / js / barcodes.js
1 openerp.pos_barcodes = function(instance){
2     var module = instance.point_of_sale;
3     var _t     = instance.web._t;
4
5     // At POS Startup, load the barcode nomenclature and add it to the pos model
6     module.PosModel.prototype.models.push({
7         model: 'barcode.nomenclature',
8         fields: ['name','rule_ids'],
9         domain: function(self){ return [] },
10         loaded: function(self,nomenclatures){
11             if (self.config.barcode_nomenclature_id) {
12                 for (var i = 0; i < nomenclatures.length; i++) {
13                     if (nomenclatures[i].id === self.config.barcode_nomenclature_id[0]) {
14                         self.nomenclature = nomenclatures[i];
15                     }
16                 }
17             }
18             self.nomenclature = self.nomenclature || null;
19         },
20     });
21
22     module.PosModel.prototype.models.push({
23         model: 'barcode.rule',
24         fields: ['name','priority','type','pattern'],
25         domain: function(self){ return [['barcode_nomenclature_id','=',self.nomenclature ? self.nomenclature.id : 0]]; },
26         loaded: function(self,rules){
27             if (self.nomenclature) {
28                 rules = rules.sort(function(a,b){ return b.priority - a.priority; });
29                 self.nomenclature.rules = rules;
30                 for (var i = 0; i < rules.length; i++) {
31                     var pattern = rules[i].pattern;
32                     pattern = pattern.replace(/[x\*]/gi,'x');
33                     
34                     while (pattern.length < 12) {
35                         pattern += 'x';
36                     }
37                  
38                     rules[i].pattern = pattern;
39                 }
40             }
41         },
42     });
43
44     module.BarcodeReader.include({
45         parse_ean: function(ean) {
46             var self = this;
47             var parse_result = {
48                 encoding: 'ean13',
49                 type: 'error',
50                 code: ean,
51                 base_code: ean,
52                 value: 0,
53             };
54
55             if (!this.pos.nomenclature) {
56                 return this._super(ean);
57             }
58
59             if (!this.check_ean(ean)) {
60                 return parse_result;
61             }
62
63             function is_number(char) {
64                 n = char.charCodeAt(0);
65                 return n >= 48 && n <= 57;
66             }
67
68             function match_pattern(ean,pattern) {
69                 for (var i = 0; i < pattern.length; i++) {
70                     var p = pattern[i];
71                     var e = ean[i];
72                     if( is_number(p) && p !== e ){
73                         return false;
74                     }
75                 }
76                 return true;
77             }
78
79             function get_value(ean,pattern){
80                 var value = 0;
81                 var decimals = 0;
82                 for(var i = 0; i < pattern.length; i++){
83                     var p = pattern[i];
84                     var v = parseInt(ean[i]);
85                     if( p === 'N'){
86                         value *= 10;
87                         value += v;
88                     }else if( p === 'D'){   // FIXME precision ...
89                         decimals += 1;
90                         value += v * Math.pow(10,-decimals);
91                     }
92                 }
93                 return value;
94             }
95
96             function get_basecode(ean,pattern){
97                 var base = '';
98                 for(var i = 0; i < pattern.length; i++){
99                     var p = pattern[i];
100                     var v = ean[i];
101                     if( p === 'x'  || is_number(p)){
102                         base += v;
103                     }else{
104                         base += '0';
105                     }
106                 }
107                 return self.sanitize_ean(base);
108             }
109
110             var rules = this.pos.nomenclature.rules;
111
112             for (var i = 0; i < rules.length; i++) {
113                 if (match_pattern(ean,rules[i].pattern)) {
114                     parse_result.type      = rules[i].type;
115                     parse_result.value     = get_value(ean,rules[i].pattern);
116                     parse_result.base_code = get_basecode(ean,rules[i].pattern);
117                     return parse_result;
118                 }
119             }
120
121             return parse_result;
122         },
123     });
124
125 };