diff options
| author | stephanchrst <stephanchrst@gmail.com> | 2022-05-10 21:51:50 +0700 |
|---|---|---|
| committer | stephanchrst <stephanchrst@gmail.com> | 2022-05-10 21:51:50 +0700 |
| commit | 3751379f1e9a4c215fb6eb898b4ccc67659b9ace (patch) | |
| tree | a44932296ef4a9b71d5f010906253d8c53727726 /addons/coupon/models/coupon_reward.py | |
| parent | 0a15094050bfde69a06d6eff798e9a8ddf2b8c21 (diff) | |
initial commit 2
Diffstat (limited to 'addons/coupon/models/coupon_reward.py')
| -rw-r--r-- | addons/coupon/models/coupon_reward.py | 92 |
1 files changed, 92 insertions, 0 deletions
diff --git a/addons/coupon/models/coupon_reward.py b/addons/coupon/models/coupon_reward.py new file mode 100644 index 00000000..d5ad92a9 --- /dev/null +++ b/addons/coupon/models/coupon_reward.py @@ -0,0 +1,92 @@ +# -*- coding: utf-8 -*- +# Part of Odoo. See LICENSE file for full copyright and licensing details. + +from odoo import api, fields, models, _ +from odoo.exceptions import ValidationError + + +class CouponReward(models.Model): + _name = 'coupon.reward' + _description = "Coupon Reward" + _rec_name = 'reward_description' + + # VFE FIXME multi company + """Rewards are not restricted to a company... + You could have a reward_product_id limited to a specific company A. + But still use this reward as reward of a program of company B... + """ + reward_description = fields.Char('Reward Description') + reward_type = fields.Selection([ + ('discount', 'Discount'), + ('product', 'Free Product'), + ], string='Reward Type', default='discount', + help="Discount - Reward will be provided as discount.\n" + + "Free Product - Free product will be provide as reward \n" + + "Free Shipping - Free shipping will be provided as reward (Need delivery module)") + # Product Reward + reward_product_id = fields.Many2one('product.product', string="Free Product", + help="Reward Product") + reward_product_quantity = fields.Integer(string="Quantity", default=1, help="Reward product quantity") + # Discount Reward + discount_type = fields.Selection([ + ('percentage', 'Percentage'), + ('fixed_amount', 'Fixed Amount')], default="percentage", + help="Percentage - Entered percentage discount will be provided\n" + + "Amount - Entered fixed amount discount will be provided") + discount_percentage = fields.Float(string="Discount", default=10, + help='The discount in percentage, between 1 and 100') + discount_apply_on = fields.Selection([ + ('on_order', 'On Order'), + ('cheapest_product', 'On Cheapest Product'), + ('specific_products', 'On Specific Products')], default="on_order", + help="On Order - Discount on whole order\n" + + "Cheapest product - Discount on cheapest product of the order\n" + + "Specific products - Discount on selected specific products") + discount_specific_product_ids = fields.Many2many('product.product', string="Products", + help="Products that will be discounted if the discount is applied on specific products") + discount_max_amount = fields.Float(default=0, + help="Maximum amount of discount that can be provided") + discount_fixed_amount = fields.Float(string="Fixed Amount", help='The discount in fixed amount') + reward_product_uom_id = fields.Many2one(related='reward_product_id.product_tmpl_id.uom_id', string='Unit of Measure', readonly=True) + discount_line_product_id = fields.Many2one('product.product', string='Reward Line Product', copy=False, + help="Product used in the sales order to apply the discount. Each coupon program has its own reward product for reporting purpose") + + @api.constrains('discount_percentage') + def _check_discount_percentage(self): + if self.filtered(lambda reward: reward.discount_type == 'percentage' and (reward.discount_percentage < 0 or reward.discount_percentage > 100)): + raise ValidationError(_('Discount percentage should be between 1-100')) + + def name_get(self): + """ + Returns a complete description of the reward + """ + result = [] + for reward in self: + reward_string = "" + if reward.reward_type == 'product': + reward_string = _("Free Product - %s", reward.reward_product_id.name) + elif reward.reward_type == 'discount': + if reward.discount_type == 'percentage': + reward_percentage = str(reward.discount_percentage) + if reward.discount_apply_on == 'on_order': + reward_string = _("%s%% discount on total amount", reward_percentage) + elif reward.discount_apply_on == 'specific_products': + if len(reward.discount_specific_product_ids) > 1: + reward_string = _("%s%% discount on products", reward_percentage) + else: + reward_string = _( + "%(percentage)s%% discount on %(product_name)s", + percentage=reward_percentage, + product_name=reward.discount_specific_product_ids.name + ) + elif reward.discount_apply_on == 'cheapest_product': + reward_string = _("%s%% discount on cheapest product", reward_percentage) + elif reward.discount_type == 'fixed_amount': + program = self.env['coupon.program'].search([('reward_id', '=', reward.id)]) + reward_string = _( + "%(amount)s %(currency)s discount on total amount", + amount=reward.discount_fixed_amount, + currency=program.currency_id.name + ) + result.append((reward.id, reward_string)) + return result |
