d3e0717e4315a3c3ecd9b2ae53c43d0ac3e2a4c0
[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             rules = rules.sort(function(a,b){ return b.priority - a.priority; });
28             self.nomenclature.rules = rules;
29             for (var i = 0; i < rules.length; i++) {
30                 var pattern = rules[i].pattern;
31                 pattern = pattern.replace(/[x\*]/gi,'x');
32                 
33                 while (pattern.length < 12) {
34                     pattern += 'x';
35                 }
36              
37                 rules[i].pattern = pattern;
38             }
39         },
40     });
41
42     module.BarcodeReader.include({
43         parse_ean: function(ean) {
44             var self = this;
45             var parse_result = {
46                 encoding: 'ean13',
47                 type: 'error',
48                 code: ean,
49                 base_code: ean,
50                 value: 0,
51             };
52
53             if (!this.pos.nomenclature) {
54                 return this._super(ean);
55             }
56
57             if (!this.check_ean(ean)) {
58                 return parse_result;
59             }
60
61             function is_number(char) {
62                 n = char.charCodeAt(0);
63                 return n >= 48 && n <= 57;
64             }
65
66             function match_pattern(ean,pattern) {
67                 for (var i = 0; i < pattern.length; i++) {
68                     var p = pattern[i];
69                     var e = ean[i];
70                     if( is_number(p) && p !== e ){
71                         return false;
72                     }
73                 }
74                 return true;
75             }
76
77             function get_value(ean,pattern){
78                 var value = 0;
79                 var decimals = 0;
80                 for(var i = 0; i < pattern.length; i++){
81                     var p = pattern[i];
82                     var v = parseInt(ean[i]);
83                     if( p === 'N'){
84                         value *= 10;
85                         value += v;
86                     }else if( p === 'D'){   // FIXME precision ...
87                         decimals += 1;
88                         value += v * Math.pow(10,-decimals);
89                     }
90                 }
91                 return value;
92             }
93
94             function get_basecode(ean,pattern){
95                 var base = '';
96                 for(var i = 0; i < pattern.length; i++){
97                     var p = pattern[i];
98                     var v = ean[i];
99                     if( p === 'x'  || is_number(p)){
100                         base += v;
101                     }else{
102                         base += '0';
103                     }
104                 }
105                 return self.sanitize_ean(base);
106             }
107
108             var rules = this.pos.nomenclature.rules;
109
110             for (var i = 0; i < rules.length; i++) {
111                 if (match_pattern(ean,rules[i].pattern)) {
112                     parse_result.type      = rules[i].type;
113                     parse_result.value     = get_value(ean,rules[i].pattern);
114                     parse_result.base_code = get_basecode(ean,rules[i].pattern);
115                     return parse_result;
116                 }
117             }
118
119             return parse_result;
120         },
121     });
122
123 };