From 68ca9465771d6c22136a05849465afcb543ff8bc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fr=C3=A9d=C3=A9ric=20van=20der=20Essen?= Date: Sun, 21 Dec 2014 21:39:24 +0100 Subject: [PATCH] [WIP] point_of_sale, pos_discount: adapt pos_discount after pos refactor - openerp.point_of_sale.load_models([...]) allow to add models to be loaded at the start of te pos - openerp.point_of_sale.load_fields(model,fields) allow to add fields to be loaded for the models. --- addons/point_of_sale/static/src/js/models.js | 43 +++++ addons/pos_loyalty/static/src/js/loyalty.js | 173 +++++++++---------- 2 files changed, 123 insertions(+), 93 deletions(-) diff --git a/addons/point_of_sale/static/src/js/models.js b/addons/point_of_sale/static/src/js/models.js index b1634927392..972f7385e7d 100644 --- a/addons/point_of_sale/static/src/js/models.js +++ b/addons/point_of_sale/static/src/js/models.js @@ -753,6 +753,49 @@ openerp.point_of_sale.load_models = function load_models(instance, module){ //mo }, }); + module.load_fields = function(model_name, fields) { + if (!(fields instanceof Array)) { + fields = [fields]; + } + + var models = module.PosModel.prototype.models; + for (var i = 0; i < models.length; i++) { + var model = models[i]; + if (model.model === model_name) { + if ((model.fields instanceof Array) && model.fields.length > 0) { + model.fields = model.fields.concat(fields || []); + } + } + } + }; + + module.load_models = function(models,options) { + options = options || {}; + if (!(models instanceof Array)) { + models = [models]; + } + + var pmodels = module.PosModel.prototype.models; + var index = pmodels.length; + if (options.before) { + for (var i = 0; i < pmodels.length; i++) { + if ( pmodels[i].model === options.before || + pmodels[i].label === options.before ){ + index = i; + break; + } + } + } else if (options.after) { + for (var i = 0; i < pmodels.length; i++) { + if ( pmodels[i].model === options.after || + pmodels[i].label === options.after ){ + index = i + 1; + } + } + } + pmodels.splice.apply(pmodels,[index,0].concat(models)); + }; + var orderline_id = 1; // An orderline represent one element of the content of a client's shopping cart. diff --git a/addons/pos_loyalty/static/src/js/loyalty.js b/addons/pos_loyalty/static/src/js/loyalty.js index 9e92653e35a..4ec8e24fa6c 100644 --- a/addons/pos_loyalty/static/src/js/loyalty.js +++ b/addons/pos_loyalty/static/src/js/loyalty.js @@ -4,67 +4,65 @@ openerp.pos_loyalty = function(instance){ var round_pr = instance.web.round_precision var QWeb = instance.web.qweb; - var models = module.PosModel.prototype.models; - for (var i = 0; i < models.length; i++) { - var model = models[i]; - if (model.model === 'res.partner') { - model.fields.push('loyalty_points'); - } else if (model.model === 'product.product') { - // load loyalty after products - models.push(i+1,0,{ - model: 'loyalty.program', - condition: function(self){ return !!self.config.loyalty_id[0]; }, - fields: ['name','pp_currency','pp_product','pp_order','rounding'], - domain: function(self){ return [['id','=',self.config.loyalty_id[0]]]; }, - loaded: function(self,loyalties){ self.loyalty = loyalties[0]; }, - },{ - model: 'loyalty.rule', - condition: function(self){ return !!self.loyalty; }, - fields: ['name','type','product_id','category_id','cumulative','pp_product','pp_currency'], - domain: function(self){ return [['loyalty_program_id','=',self.loyalty.id]]; }, - loaded: function(self,rules){ + module.load_fields('res.partner','loyalty_points'); - self.loyalty.rules = rules; - self.loyalty.rules_by_product_id = {}; - self.loyalty.rules_by_category_id = {}; + module.load_models([ + { + model: 'loyalty.program', + condition: function(self){ return !!self.config.loyalty_id[0]; }, + fields: ['name','pp_currency','pp_product','pp_order','rounding'], + domain: function(self){ return [['id','=',self.config.loyalty_id[0]]]; }, + loaded: function(self,loyalties){ + self.loyalty = loyalties[0]; + console.log('loyalty',self.loyalty); + }, + },{ + model: 'loyalty.rule', + condition: function(self){ return !!self.loyalty; }, + fields: ['name','type','product_id','category_id','cumulative','pp_product','pp_currency'], + domain: function(self){ return [['loyalty_program_id','=',self.loyalty.id]]; }, + loaded: function(self,rules){ - for (var i = 0; i < rules.length; i++){ - var rule = rules[i]; - if (rule.type === 'product') { - if (!self.loyalty.rules_by_product_id[rule.product_id[0]]) { - self.loyalty.rules_by_product_id[rule.product_id[0]] = [rule]; - } else if (rule.cumulative) { - self.loyalty.rules_by_product_id[rule.product_id[0]].unshift(rule); - } else { - self.loyalty.rules_by_product_id[rule.product_id[0]].push(rule); - } - } else if (rule.type === 'category') { - var category = self.db.get_category_by_id(rule.category_id[0]); - if (!self.loyalty.rules_by_category_id[category.id]) { - self.loyalty.rules_by_category_id[category.id] = [rule]; - } else if (rule.cumulative) { - self.loyalty.rules_by_category_id[category.id].unshift(rule); - } else { - self.loyalty.rules_by_category_id[category.id].push(rule); - } + self.loyalty.rules = rules; + self.loyalty.rules_by_product_id = {}; + self.loyalty.rules_by_category_id = {}; + + for (var i = 0; i < rules.length; i++){ + var rule = rules[i]; + if (rule.type === 'product') { + if (!self.loyalty.rules_by_product_id[rule.product_id[0]]) { + self.loyalty.rules_by_product_id[rule.product_id[0]] = [rule]; + } else if (rule.cumulative) { + self.loyalty.rules_by_product_id[rule.product_id[0]].unshift(rule); + } else { + self.loyalty.rules_by_product_id[rule.product_id[0]].push(rule); + } + } else if (rule.type === 'category') { + var category = self.db.get_category_by_id(rule.category_id[0]); + if (!self.loyalty.rules_by_category_id[category.id]) { + self.loyalty.rules_by_category_id[category.id] = [rule]; + } else if (rule.cumulative) { + self.loyalty.rules_by_category_id[category.id].unshift(rule); + } else { + self.loyalty.rules_by_category_id[category.id].push(rule); } } - }, - },{ - model: 'loyalty.reward', - condition: function(self){ return !!self.loyalty; }, - fields: ['name','type','minimum_points','gift_product_id','point_cost','discount_product_id','discount','point_value','point_product_id'], - domain: function(self){ return [['loyalty_program_id','=',self.loyalty.id]]; }, - loaded: function(self,rewards){ - self.loyalty.rewards = rewards; - self.loyalty.rewards_by_id = {}; - for (var i = 0; i < rewards.length;i++) { - self.loyalty.rewards_by_id[rewards[i].id] = rewards[i]; - } - }, - }); - } - } + } + }, + },{ + model: 'loyalty.reward', + condition: function(self){ return !!self.loyalty; }, + fields: ['name','type','minimum_points','gift_product_id','point_cost','discount_product_id','discount','point_value','point_product_id'], + domain: function(self){ return [['loyalty_program_id','=',self.loyalty.id]]; }, + loaded: function(self,rewards){ + self.loyalty.rewards = rewards; + self.loyalty.rewards_by_id = {}; + for (var i = 0; i < rewards.length;i++) { + self.loyalty.rewards_by_id[rewards[i].id] = rewards[i]; + } + }, + }, + ],{'after': 'product.product'}); var _super_orderline = module.Orderline; module.Orderline = module.Orderline.extend({ @@ -243,14 +241,11 @@ openerp.pos_loyalty = function(instance){ return; } else if (reward.type === 'gift') { var product = this.pos.db.get_product_by_id(reward.gift_product_id[0]); + if (!product) { - this.pos.pos_widget.screen_selector.show_popup('error',{ - 'message':'Configuration Error', - 'comment':'The product associated with the reward "'+reward.name+'" could not be found. Make sure it is available for sale in the point of sale.', - }); return; } - + var line = this.add_product(product, { price: 0, quantity: 1, @@ -271,11 +266,8 @@ openerp.pos_loyalty = function(instance){ } var product = this.pos.db.get_product_by_id(reward.discount_product_id[0]); - if (!product) { //FIXME, move this as a server side constraint - this.pos.pos_widget.screen_selector.show_popup('error',{ - 'message':'Configuration Error', - 'comment':'The product associated with the reward "'+reward.name+'" could not be found. Make sure it is available for sale in the point of sale.', - }); + + if (!product) { return; } @@ -294,11 +286,7 @@ openerp.pos_loyalty = function(instance){ var order_total = this.get_total_with_tax(); var product = this.pos.db.get_product_by_id(reward.point_product_id[0]); - if (!product) { //FIXME, move this as a server side constraint - this.pos.pos_widget.screen_selector.show_popup('error',{ - 'message':'Configuration Error', - 'comment':'The product associated with the reward "'+reward.name+'" could not be found. Make sure it is available for sale in the point of sale.', - }); + if (!product) { return; } @@ -309,6 +297,7 @@ openerp.pos_loyalty = function(instance){ if ( spendable < 0.00001 ) { return; } + var line = this.add_product(product, { quantity: -spendable, merge: false, @@ -324,6 +313,7 @@ openerp.pos_loyalty = function(instance){ } _super.prototype.validate.apply(this,arguments); }, + export_for_printing: function(){ var json = _super.prototype.export_for_printing.apply(this,arguments); if (this.pos.loyalty && this.get_client()) { @@ -338,6 +328,7 @@ openerp.pos_loyalty = function(instance){ } return json; }, + export_as_JSON: function(){ var json = _super.prototype.export_as_JSON.apply(this,arguments); json.loyalty_points = this.get_new_points(); @@ -345,21 +336,22 @@ openerp.pos_loyalty = function(instance){ }, }); - module.PosWidget.include({ - loyalty_reward_click: function(){ + module.LoyaltyButton = module.ActionButtonWidget.extend({ + template: 'LoyaltyButton', + button_click: function(){ var self = this; var order = this.pos.get_order(); var client = order.get_client(); if (!client) { - this.screen_selector.set_current_screen('clientlist'); + this.gui.show_screen('clientlist'); return; } var rewards = order.get_available_rewards(); if (rewards.length === 0) { - this.screen_selector.show_popup('error',{ - 'message': 'No Rewards Available', - 'comment': 'There are no rewards available for this customer as part of the loyalty program', + this.gui.show_popup('error',{ + 'title': 'No Rewards Available', + 'body': 'There are no rewards available for this customer as part of the loyalty program', }); return; } else if (rewards.length === 1 && this.pos.loyalty.rewards.length === 1) { @@ -373,8 +365,8 @@ openerp.pos_loyalty = function(instance){ item: rewards[i], }); } - this.screen_selector.show_popup('selection',{ - 'message': 'Please select a reward', + this.gui.show_popup('selection',{ + 'title': 'Please select a reward', 'list': list, 'confirm': function(reward){ order.apply_reward(reward); @@ -382,21 +374,16 @@ openerp.pos_loyalty = function(instance){ }); } }, - - build_widgets: function(){ - var self = this; - this._super(); - - if(this.pos.loyalty && this.pos.loyalty.rewards.length ){ - var button = $(QWeb.render('LoyaltyButton')); - button.click(function(){ self.loyalty_reward_click(); }); - button.appendTo(this.$('.control-buttons')); - this.$('.control-buttons').removeClass('oe_hidden'); - } - - }, }); + module.define_action_button({ + 'name': 'loyalty', + 'widget': module.LoyaltyButton, + 'condition': function(){ + return this.pos.loyalty && this.pos.loyalty.rewards.length; + }, + }); + module.OrderWidget.include({ update_summary: function(){ this._super();