from odoo import fields, models class CommunityBenefit(models.Model): _name = 'community.benefit' _description = 'Membership Benefit' _order = 'name' name = fields.Char(required=True) benefit_partner_id = fields.Many2one('community.benefit.partner', string='Benefit Centre', required=True) description = fields.Html() tier_ids = fields.Many2many('community.membership.tier', string='Eligible Tiers') discount_type = fields.Selection( [('percent', 'Percentage'), ('amount', 'Fixed Amount'), ('perk', 'Perk (non-monetary)')], default='percent', required=True, ) value = fields.Float(help="Percentage or fixed amount, depending on Discount Type. Ignored for 'Perk'.") valid_from = fields.Date() valid_to = fields.Date() active = fields.Boolean(default=True) def _is_valid_today(self): self.ensure_one() today = fields.Date.context_today(self) if self.valid_from and today < self.valid_from: return False if self.valid_to and today > self.valid_to: return False return True def is_entitled(self, partner): """Whether the given res.partner is entitled to this benefit right now.""" self.ensure_one() if not self.active or not self._is_valid_today(): return False if partner.membership_state not in ('active', 'renewal_due'): return False return partner.membership_tier_id in self.tier_ids @staticmethod def _entitled_domain_for_partner(partner): return [ ('tier_ids', 'in', [partner.membership_tier_id.id]), ('active', '=', True), ]