Modification : gère point_of_sale.patch dans ce module.
[burette/pos_membership.git] / static / src / js / models.js
1 function openerp_pos_membership_models(instance, module){
2 //module.PosModel = instance.point_of_sale.PosModel.extend({})
3 module.PosModel = module.PosModel.extend({
4 initialize: function(session, attributes) {
5 //console.log("[pos_membership] [PosModel] [initialize]");
6 //PosModel.prototype.initialize.apply(this, arguments);
7 module.PosModel.__super__.initialize.call(this, session, attributes);
8 this.partner_search_string = '';
9 this.partner_by_id = {};
10 this.partner_list = [];
11 this.db.clear('partners');
12 this.set({
13 'partners': new module.PartnerCollection(),
14 'selectedPartner': null,
15 });
16 },
17 load_server_data: function(){
18 var self = this;
19 //console.log("[point_of_sale] [PosModel] [load_server_data]", "this.session=", this.session);
20
21 var loaded = self.fetch('res.users',['name','company_id'],[['id','=',this.session.uid]])
22 .then(function(users){
23 //console.log("[point_of_sale] [PosModel] [load_server_data]", "users=", users);
24 self.set('user',users[0]);
25
26 return self.fetch('res.company',
27 [
28 'currency_id',
29 'email',
30 'website',
31 'company_registry',
32 'vat',
33 'name',
34 'phone',
35 'partner_id',
36 ],
37 [['id','=',users[0].company_id[0]]]);
38 }).then(function(companies){
39 self.set('company',companies[0]);
40
41 return self.fetch('res.partner',['contact_address'],[['id','=',companies[0].partner_id[0]]]);
42 }).then(function(company_partners){
43 self.get('company').contact_address = company_partners[0].contact_address;
44
45 return self.fetch('res.currency',['symbol','position','rounding','accuracy'],[['id','=',self.get('company').currency_id[0]]]);
46 }).then(function(currencies){
47 self.set('currency',currencies[0]);
48
49 return self.fetch('product.uom', null, null);
50 }).then(function(units){
51 self.set('units',units);
52 var units_by_id = {};
53 for(var i = 0, len = units.length; i < len; i++){
54 units_by_id[units[i].id] = units[i];
55 }
56 self.set('units_by_id',units_by_id);
57
58 return self.fetch('product.packaging', null, null);
59 }).then(function(packagings){
60 self.set('product.packaging',packagings);
61
62 return self.fetch('res.users', ['name','ean13'], [['ean13', '!=', false]]);
63 }).then(function(users){
64 self.set('user_list',users);
65
66 return self.fetch('res.partner', ['name','ean13'], [['ean13', '!=', false]]);
67 }).then(function(partners){
68 self.set('partner_list',partners);
69
70 // NOTE: le moment du chargement des partners est important
71 // et doit être effectué vers ici,
72 // c'est pourquoi load_server_data() est recopiée en entier.
73 // BEGIN pos_membership
74 return self.fetch('res.partner', ['name']);
75 }).then(function(partners){
76 self.db.add_partners(partners);
77 // END pos_membership
78
79 return self.fetch('account.tax', ['amount', 'price_include', 'type']);
80 }).then(function(taxes){
81 self.set('taxes', taxes);
82
83 return self.fetch(
84 'pos.session',
85 ['id', 'journal_ids','name','user_id','config_id','start_at','stop_at'],
86 [['state', '=', 'opened'], ['user_id', '=', self.session.uid]]
87 );
88 }).then(function(sessions){
89 self.set('pos_session', sessions[0]);
90
91 return self.fetch(
92 'pos.config',
93 ['name','journal_ids','shop_id','journal_id',
94 'iface_self_checkout', 'iface_led', 'iface_cashdrawer',
95 'iface_payment_terminal', 'iface_electronic_scale', 'iface_barscan', 'iface_vkeyboard',
96 'iface_print_via_proxy','iface_cashdrawer','state','sequence_id','session_ids'],
97 [['id','=', self.get('pos_session').config_id[0]]]
98 );
99 }).then(function(configs){
100 var pos_config = configs[0];
101 //console.log("[pos_membership] config=", pos_config);
102 self.set('pos_config', pos_config);
103 self.iface_electronic_scale = !!pos_config.iface_electronic_scale;
104 self.iface_print_via_proxy = !!pos_config.iface_print_via_proxy;
105 self.iface_vkeyboard = !!pos_config.iface_vkeyboard;
106 self.iface_self_checkout = !!pos_config.iface_self_checkout;
107 self.iface_cashdrawer = !!pos_config.iface_cashdrawer;
108
109 return self.fetch('sale.shop',[],[['id','=',pos_config.shop_id[0]]]);
110 }).then(function(shops){
111 self.set('shop',shops[0]);
112
113 return self.fetch('product.packaging',['ean','product_id']);
114 }).then(function(packagings){
115 self.db.add_packagings(packagings);
116
117 return self.fetch('pos.category', ['id','name','parent_id','child_id','image'])
118 }).then(function(categories){
119 self.db.add_categories(categories);
120
121 return self.fetch(
122 'product.product',
123 ['name', 'list_price','price','pos_categ_id', 'taxes_id', 'ean13',
124 'to_weight', 'uom_id', 'uos_id', 'uos_coeff', 'mes_type', 'description_sale', 'description'],
125 [['sale_ok','=',true],['available_in_pos','=',true]],
126 {pricelist: self.get('shop').pricelist_id[0]} // context for price
127 );
128 }).then(function(products){
129 self.db.add_products(products);
130
131 return self.fetch(
132 'account.bank.statement',
133 ['account_id','currency','journal_id','state','name','user_id','pos_session_id'],
134 [['state','=','open'],['pos_session_id', '=', self.get('pos_session').id]]
135 );
136 }).then(function(bank_statements){
137 var journals = new Array();
138 _.each(bank_statements,function(statement) {
139 journals.push(statement.journal_id[0])
140 });
141 self.set('bank_statements', bank_statements);
142 return self.fetch('account.journal', undefined, [['id','in', journals]]);
143 }).then(function(journals){
144 self.set('journals',journals);
145
146 // associate the bank statements with their journals.
147 var bank_statements = self.get('bank_statements');
148 for(var i = 0, ilen = bank_statements.length; i < ilen; i++){
149 for(var j = 0, jlen = journals.length; j < jlen; j++){
150 if(bank_statements[i].journal_id[0] === journals[j].id){
151 bank_statements[i].journal = journals[j];
152 bank_statements[i].self_checkout_payment_method = journals[j].self_checkout_payment_method;
153 }
154 }
155 }
156 self.set({'cashRegisters' : new module.CashRegisterCollection(self.get('bank_statements'))});
157 });
158 return loaded;
159 },
160 push_partner: function(partner) {
161 //console.log("[pos_membership] [PosModel] [push_partner] partner=", partner.name);
162 this.db.add_partner(partner);
163 this.flush_partner();
164 },
165 add_new_partner: function(attr){
166 var partner = new module.PartnerCreate({pos:this, name:attr.name});
167 //console.log("[pos_membership] [PosModel] [add_new_partner] partner=", partner.get('name'));
168 this.get('partners').add(partner);
169 this.set('selectedPartner', partner);
170 },
171 flush_partner: function() {
172 //TODO make the mutex work
173 //this makes sure only one _int_flush is called at the same time
174 //return this.flush_mutex.exec(_.bind(function() {
175 // return this._flush_partner(0);
176 //}, this));
177 this._flush_partner(0);
178 },
179 _flush_partner: function(index){
180 var self = this;
181 var partners = this.db.get_partners();
182 self.set('nbr_pending_operations',partners.length);
183
184 var partner = partners[index];
185 var selectedOrder = self.get('selectedOrder');
186 //console.log("[pos_membership] [PosModel] [_flush_partner] index=", index);
187 if(!partner){
188 return;
189 }
190 //console.log("[pos_membership] [PosModel] [_flush_partner] partner=", partner.data.name);
191 //try to push a partner to the server
192 return (new instance.web.Model('pos.order')).get_func('create_partner_from_ui')([partner])
193 .fail(function(unused, event){
194 //don't show error popup if it fails
195 event.preventDefault();
196 console.error('Failed to send partner:',partner);
197 self._flush_partner(index+1);
198 })
199 .done(function(args){
200 //remove from db if success
201 //console.log("[pos_membership] [PosModel] [_flush_partner] [.done] args=", args);
202 self.db.remove_partner(partner.id);
203 var name = partner.data.name;
204 p = {name:name, id:args[0]};
205 //console.log("[pos_membership] [PosModel] [_flush_partner] [.done] partner=", p);
206 self.db.add_partners([p]);
207 //self.set('selectedPartner', p);
208 //console.log("[pos_membership] [PosModel] [_flush_partner] [.done] selectedPartner=", self.get('selectedPartner').name);
209 //console.log("[pos_membership] [PosModel] [_flush_partner] [.done] selectedPartner.id=", self.get('selectedPartner').id);
210 selectedOrder.addPartner(p); // NOTE: set .id asynchronously..
211 self._flush_partner(index);
212 });
213 },
214 });
215 module.Partner = Backbone.Model.extend({
216 initialize: function(attr, options) {
217 this.name = attr.name;
218 this.id = attr.id;
219 },
220 get_image_url: function(){
221 return instance.session.url('/web/binary/image', {model: 'res.partner', field: 'image', id: this.get('id')});
222 },
223 });
224 module.PartnerCollection = Backbone.Collection.extend({
225 model: module.Partner,
226 });
227 module.PartnerCreate = Backbone.Model.extend({
228 initialize: function(attr){
229 Backbone.Model.prototype.initialize.apply(this, arguments);
230 this.pos = attr.pos;
231 this.name = attr.name;
232 return this;
233 },
234 exportAsJSON: function() {
235 //console.log("[PartnerCreate] [exportAsJSON] name=",this.name);
236 return {
237 name: this.name,
238 };
239 },
240 });
241 module.Order = module.Order.extend({
242 addPartner: function(partner, options){
243 options = options || {};
244 //console.log("[Order] [addPartner] partner=", partner.name, " partner_id=", partner.id);
245 this.set_client(partner);
246 },
247 exportAsJSON: function() {
248 var json = module.Order.__super__.exportAsJSON.call(this);
249 json['partner_id'] = this.get('client') ? this.get('client').id : undefined;
250 //console.log("[Order] [exportAsJSON] json=", json);
251 return json;
252 },
253 });
254 }