--- /dev/null
+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;
+ },
+ });
+ }