summaryrefslogtreecommitdiff
path: root/addons/coupon/models/coupon_reward.py
diff options
context:
space:
mode:
authorstephanchrst <stephanchrst@gmail.com>2022-05-10 21:51:50 +0700
committerstephanchrst <stephanchrst@gmail.com>2022-05-10 21:51:50 +0700
commit3751379f1e9a4c215fb6eb898b4ccc67659b9ace (patch)
treea44932296ef4a9b71d5f010906253d8c53727726 /addons/coupon/models/coupon_reward.py
parent0a15094050bfde69a06d6eff798e9a8ddf2b8c21 (diff)
initial commit 2
Diffstat (limited to 'addons/coupon/models/coupon_reward.py')
-rw-r--r--addons/coupon/models/coupon_reward.py92
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