Modification : gère point_of_sale.patch dans ce module.
[burette/pos_membership.git] / static / src / js / models.js
diff --git a/static/src/js/models.js b/static/src/js/models.js
new file mode 100644 (file)
index 0000000..93f8271
--- /dev/null
@@ -0,0 +1,254 @@
+function openerp_pos_membership_models(instance, module){
+       //module.PosModel = instance.point_of_sale.PosModel.extend({})
+       module.PosModel = module.PosModel.extend({
+               initialize: function(session, attributes) {
+                       //console.log("[pos_membership] [PosModel] [initialize]");
+                       //PosModel.prototype.initialize.apply(this, arguments);
+                       module.PosModel.__super__.initialize.call(this, session, attributes);
+                       this.partner_search_string = '';
+                       this.partner_by_id = {};
+                       this.partner_list = [];
+                       this.db.clear('partners');
+                       this.set({
+                               'partners': new module.PartnerCollection(),
+                               'selectedPartner': null,
+                        });
+                },
+               load_server_data: function(){
+                       var self = this;
+                       //console.log("[point_of_sale] [PosModel] [load_server_data]", "this.session=", this.session);
+                       
+                       var loaded = self.fetch('res.users',['name','company_id'],[['id','=',this.session.uid]]) 
+                               .then(function(users){
+                                       //console.log("[point_of_sale] [PosModel] [load_server_data]", "users=", users);
+                                       self.set('user',users[0]);
+                                       
+                                       return self.fetch('res.company',
+                                       [
+                                               'currency_id',
+                                               'email',
+                                               'website',
+                                               'company_registry',
+                                               'vat',
+                                               'name',
+                                               'phone',
+                                               'partner_id',
+                                       ],
+                                       [['id','=',users[0].company_id[0]]]);
+                               }).then(function(companies){
+                                       self.set('company',companies[0]);
+                                       
+                                       return self.fetch('res.partner',['contact_address'],[['id','=',companies[0].partner_id[0]]]);
+                               }).then(function(company_partners){
+                                       self.get('company').contact_address = company_partners[0].contact_address;
+                                       
+                                       return self.fetch('res.currency',['symbol','position','rounding','accuracy'],[['id','=',self.get('company').currency_id[0]]]);
+                               }).then(function(currencies){
+                                       self.set('currency',currencies[0]);
+                                       
+                                       return self.fetch('product.uom', null, null);
+                               }).then(function(units){
+                                       self.set('units',units);
+                                       var units_by_id = {};
+                                       for(var i = 0, len = units.length; i < len; i++){
+                                               units_by_id[units[i].id] = units[i];
+                                        }
+                                       self.set('units_by_id',units_by_id);
+                                       
+                                       return self.fetch('product.packaging', null, null);
+                               }).then(function(packagings){
+                                       self.set('product.packaging',packagings);
+                                       
+                                       return self.fetch('res.users', ['name','ean13'], [['ean13', '!=', false]]);
+                               }).then(function(users){
+                                       self.set('user_list',users);
+                                       
+                                       return self.fetch('res.partner', ['name','ean13'], [['ean13', '!=', false]]);
+                               }).then(function(partners){
+                                       self.set('partner_list',partners);
+                                       
+                                       // NOTE: le moment du chargement des partners est important
+                                       //       et doit être effectué vers ici,
+                                       //       c'est pourquoi load_server_data() est recopiée en entier.
+                                       // BEGIN pos_membership
+                                       return self.fetch('res.partner', ['name']);
+                               }).then(function(partners){
+                                       self.db.add_partners(partners);
+                                       // END pos_membership
+                                       
+                                       return self.fetch('account.tax', ['amount', 'price_include', 'type']);
+                               }).then(function(taxes){
+                                       self.set('taxes', taxes);
+                                       
+                                       return self.fetch(
+                                               'pos.session', 
+                                               ['id', 'journal_ids','name','user_id','config_id','start_at','stop_at'],
+                                               [['state', '=', 'opened'], ['user_id', '=', self.session.uid]]
+                                        );
+                               }).then(function(sessions){
+                                       self.set('pos_session', sessions[0]);
+                                       
+                                       return self.fetch(
+                                               'pos.config',
+                                               ['name','journal_ids','shop_id','journal_id',
+                                                'iface_self_checkout', 'iface_led', 'iface_cashdrawer',
+                                                'iface_payment_terminal', 'iface_electronic_scale', 'iface_barscan', 'iface_vkeyboard',
+                                                'iface_print_via_proxy','iface_cashdrawer','state','sequence_id','session_ids'],
+                                               [['id','=', self.get('pos_session').config_id[0]]]
+                                       );
+                               }).then(function(configs){
+                                       var pos_config = configs[0];
+                                       //console.log("[pos_membership] config=", pos_config);
+                                       self.set('pos_config', pos_config);
+                                       self.iface_electronic_scale    =  !!pos_config.iface_electronic_scale;
+                                       self.iface_print_via_proxy     =  !!pos_config.iface_print_via_proxy;
+                                       self.iface_vkeyboard           =  !!pos_config.iface_vkeyboard;
+                                       self.iface_self_checkout       =  !!pos_config.iface_self_checkout;
+                                       self.iface_cashdrawer          =  !!pos_config.iface_cashdrawer;
+                                       
+                                       return self.fetch('sale.shop',[],[['id','=',pos_config.shop_id[0]]]);
+                               }).then(function(shops){
+                                       self.set('shop',shops[0]);
+                                       
+                                       return self.fetch('product.packaging',['ean','product_id']);
+                               }).then(function(packagings){
+                                       self.db.add_packagings(packagings);
+                                       
+                                       return self.fetch('pos.category', ['id','name','parent_id','child_id','image'])
+                               }).then(function(categories){
+                                       self.db.add_categories(categories);
+                                       
+                                       return self.fetch(
+                                               'product.product', 
+                                               ['name', 'list_price','price','pos_categ_id', 'taxes_id', 'ean13', 
+                                                'to_weight', 'uom_id', 'uos_id', 'uos_coeff', 'mes_type', 'description_sale', 'description'],
+                                               [['sale_ok','=',true],['available_in_pos','=',true]],
+                                               {pricelist: self.get('shop').pricelist_id[0]} // context for price
+                                       );
+                               }).then(function(products){
+                                       self.db.add_products(products);
+                                       
+                                       return self.fetch(
+                                               'account.bank.statement',
+                                               ['account_id','currency','journal_id','state','name','user_id','pos_session_id'],
+                                               [['state','=','open'],['pos_session_id', '=', self.get('pos_session').id]]
+                                        );
+                               }).then(function(bank_statements){
+                                       var journals = new Array();
+                                       _.each(bank_statements,function(statement) {
+                                           journals.push(statement.journal_id[0])
+                                       });
+                                       self.set('bank_statements', bank_statements);
+                                       return self.fetch('account.journal', undefined, [['id','in', journals]]);
+                               }).then(function(journals){
+                                       self.set('journals',journals);
+                                       
+                                       // associate the bank statements with their journals.
+                                       var bank_statements = self.get('bank_statements');
+                                       for(var i = 0, ilen = bank_statements.length; i < ilen; i++){
+                                               for(var j = 0, jlen = journals.length; j < jlen; j++){
+                                                       if(bank_statements[i].journal_id[0] === journals[j].id){
+                                                               bank_statements[i].journal = journals[j];
+                                                               bank_statements[i].self_checkout_payment_method = journals[j].self_checkout_payment_method;
+                                                       }
+                                               }
+                                       }
+                                       self.set({'cashRegisters' : new module.CashRegisterCollection(self.get('bank_statements'))});
+                               });
+                       return loaded;
+                },
+               push_partner: function(partner) {
+                       //console.log("[pos_membership] [PosModel] [push_partner] partner=", partner.name);
+                       this.db.add_partner(partner);
+                       this.flush_partner();
+                },
+               add_new_partner: function(attr){
+                       var partner = new module.PartnerCreate({pos:this, name:attr.name});
+                       //console.log("[pos_membership] [PosModel] [add_new_partner] partner=", partner.get('name'));
+                       this.get('partners').add(partner);
+                       this.set('selectedPartner', partner);
+                },
+               flush_partner: function() {
+                       //TODO make the mutex work 
+                       //this makes sure only one _int_flush is called at the same time
+                       //return this.flush_mutex.exec(_.bind(function() {
+                       //    return this._flush_partner(0);
+                       //}, this));
+                       this._flush_partner(0);
+                },
+               _flush_partner: function(index){
+                       var self = this;
+                       var partners = this.db.get_partners();
+                       self.set('nbr_pending_operations',partners.length);
+                       
+                       var partner = partners[index];
+                       var selectedOrder = self.get('selectedOrder');
+                       //console.log("[pos_membership] [PosModel] [_flush_partner] index=", index);
+                       if(!partner){
+                               return;
+                        }
+                       //console.log("[pos_membership] [PosModel] [_flush_partner] partner=", partner.data.name);
+                       //try to push a partner to the server
+                       return (new instance.web.Model('pos.order')).get_func('create_partner_from_ui')([partner])
+                               .fail(function(unused, event){
+                                       //don't show error popup if it fails
+                                       event.preventDefault();
+                                       console.error('Failed to send partner:',partner);
+                                       self._flush_partner(index+1);
+                                })
+                               .done(function(args){
+                                       //remove from db if success
+                                       //console.log("[pos_membership] [PosModel] [_flush_partner] [.done] args=", args);
+                                       self.db.remove_partner(partner.id);
+                                       var name = partner.data.name;
+                                       p = {name:name, id:args[0]};
+                                       //console.log("[pos_membership] [PosModel] [_flush_partner] [.done] partner=", p);
+                                       self.db.add_partners([p]);
+                                       //self.set('selectedPartner', p);
+                                       //console.log("[pos_membership] [PosModel] [_flush_partner] [.done] selectedPartner=", self.get('selectedPartner').name);
+                                       //console.log("[pos_membership] [PosModel] [_flush_partner] [.done] selectedPartner.id=", self.get('selectedPartner').id);
+                                       selectedOrder.addPartner(p); // NOTE: set .id asynchronously..
+                                       self._flush_partner(index);
+                                });
+                },
+        });
+       module.Partner = Backbone.Model.extend({
+               initialize: function(attr, options) {
+                       this.name = attr.name;
+                       this.id   = attr.id;
+                },
+               get_image_url: function(){
+                       return instance.session.url('/web/binary/image', {model: 'res.partner', field: 'image', id: this.get('id')});
+                },
+        });
+       module.PartnerCollection = Backbone.Collection.extend({
+               model: module.Partner,
+        });
+       module.PartnerCreate = Backbone.Model.extend({
+               initialize: function(attr){
+                       Backbone.Model.prototype.initialize.apply(this, arguments);
+                       this.pos = attr.pos;
+                       this.name = attr.name;
+                       return this;
+                },
+               exportAsJSON: function() {
+                       //console.log("[PartnerCreate] [exportAsJSON] name=",this.name);
+                       return {
+                               name: this.name,
+                        };
+                },
+        });
+       module.Order = module.Order.extend({
+               addPartner: function(partner, options){
+                       options = options || {};
+                       //console.log("[Order] [addPartner] partner=", partner.name, " partner_id=", partner.id);
+                       this.set_client(partner);
+                },
+               exportAsJSON: function() {
+                       var json = module.Order.__super__.exportAsJSON.call(this);
+                       json['partner_id'] = this.get('client') ? this.get('client').id : undefined;
+                       //console.log("[Order] [exportAsJSON] json=", json);
+                       return json;
+                },
+        });
+ }