From 24f54a41a3624029f618dade8c991daa540c0423 Mon Sep 17 00:00:00 2001 From: zainab2097 <149927291+zainab2097@users.noreply.github.com> Date: Mon, 30 Sep 2024 13:39:31 +0300 Subject: [PATCH] Update dev_membership.py --- .../dev_membership/models/dev_membership.py | 201 ++++++++++-------- 1 file changed, 107 insertions(+), 94 deletions(-) diff --git a/odex25_sales/dev_membership/models/dev_membership.py b/odex25_sales/dev_membership/models/dev_membership.py index 18d608f3e..4c140e9a5 100644 --- a/odex25_sales/dev_membership/models/dev_membership.py +++ b/odex25_sales/dev_membership/models/dev_membership.py @@ -20,39 +20,42 @@ class DevMembership(models.Model): _description = 'Dev Membership' _order = 'name desc' - name = fields.Char(string='Name') date = fields.Date(string="Request Date", tracking=3, required=1, default=lambda self: datetime.now().date()) - from_date = fields.Date(string="Membership From Date", tracking=3, required=1, default=lambda *a: (datetime.now().date())) + from_date = fields.Date(string="Membership From Date", tracking=3, required=1, + default=lambda *a: (datetime.now().date())) to_date = fields.Date(string="Membership To Date", tracking=3) - request_date = fields.Date(string="Cancell Date", tracking=3,readonly=1) - partner_id = fields.Many2one('res.partner', string="Partner", domain="[('is_member', '=', True)]", tracking=2, required=1) - id_no = fields.Char(string='Identification Number',related='partner_id.identification_number',store=True) - phone = fields.Char(string='Phone',related='partner_id.phone',store=True) - email = fields.Char(string='Email',related='partner_id.email',store=True) - product_id = fields.Many2one('product.product', string="Membership Product", domain="[('is_membership', '=', True)]", tracking=2, required=1) + request_date = fields.Date(string="Cancell Date", tracking=3, readonly=1) + partner_id = fields.Many2one('res.partner', string="Partner", domain="[('is_member', '=', True)]", tracking=2, + required=1) + id_no = fields.Char(string='Identification Number', related='partner_id.identification_number', store=True) + phone = fields.Char(string='Phone', related='partner_id.phone', store=True) + email = fields.Char(string='Email', related='partner_id.email', store=True) + product_id = fields.Many2one('product.product', string="Membership Product", + domain="[('is_membership', '=', True)]", tracking=2, required=1) membership_fees = fields.Float(string="Membership Fees") - is_free = fields.Boolean(string="Is Free",related="product_id.is_free",) - company_id = fields.Many2one('res.company', string="Company", default=lambda self: self.env.company, required=1, tracking=3) - duration = fields.Integer(string="Duration",) + is_free = fields.Boolean(string="Is Free", related="product_id.is_free", ) + company_id = fields.Many2one('res.company', string="Company", default=lambda self: self.env.company, required=1, + tracking=3) + duration = fields.Integer(string="Duration", ) description = fields.Text(string="Description", related="product_id.description", readonly=False) interval = fields.Selection(string="Interval", selection=([ - ('days', 'Days'), - ('month', 'Month'), - ('year', 'Year')]), default='year',required=1) - payment_state = fields.Selection(string='Payment State',related='invoice_id.payment_state') + ('days', 'Days'), + ('month', 'Month'), + ('year', 'Year')]), default='year', required=1) + payment_state = fields.Selection(string='Payment State', related='invoice_id.payment_state') state = fields.Selection(string="State", selection=([ ('draft', 'Draft'), ('confirm', 'Confirm'), - ('active', 'Active'), - ('expire', 'Expire'), - ('cancel', 'Cancel')]), default='draft', tracking=1) + ('active', 'Active'), + ('expire', 'Expire'), + ('cancel', 'Cancel')]), default='draft', tracking=1) membership_id = fields.Many2one('dev.membership', string='Renew Membership') invoice_id = fields.Many2one('account.move', string='Invoice') - user_id = fields.Many2one('res.users', string='Resposible', default=lambda self:self.env.user) - cancel_reasone = fields.Many2one('cancellation.reason',string='Cancel Membership Reason') - membrship_level = fields.Many2one('membership.level', string='Membrship level',store=True,required=False,compute='_compute_membership_level') - + user_id = fields.Many2one('res.users', string='Resposible', default=lambda self: self.env.user) + cancel_reasone = fields.Many2one('cancellation.reason', string='Cancel Membership Reason') + membrship_level = fields.Many2one('membership.level', string='Membrship level', store=True, required=False, + compute='_compute_membership_level') @api.onchange('product_id') def _onchange_membership_type(self): @@ -64,15 +67,10 @@ class DevMembership(models.Model): self.duration = self.product_id.duration self.interval = self.product_id.interval - @api.onchange('duration') def _onchange_duration(self): if self.duration and self.interval and self.membership_fees: self.membership_fees = self.duration * self.product_id.list_price - - - - @api.constrains('from_date') def _check_from_date(self): @@ -85,7 +83,7 @@ class DevMembership(models.Model): # templet_id = self.env.ref('dev_membership.template_membership_cancell') # templet2_id = self.env.ref('dev_membership.template_membership_cancell2') date_deadline = fields.Date.today() - note=_('Membership %s is Cancelled') % self.name + note = _('Membership %s is Cancelled') % self.name summary = _("Membership Cancellation") self.sudo().activity_schedule( @@ -105,15 +103,18 @@ class DevMembership(models.Model): @api.constrains('partner_id', 'from_date') def _check_if_membership_exists(self): - membership_obj = self.env['dev.membership'].search([('partner_id.id', '=', self.partner_id.id), ('state', 'in', ['draft', 'active', 'confirm']), ('id', '!=', self.id)]) + membership_obj = self.env['dev.membership'].search( + [('partner_id.id', '=', self.partner_id.id), ('state', 'in', ['draft', 'active', 'confirm']), + ('id', '!=', self.id)]) if membership_obj: for rec in self: for membership in membership_obj: if rec.from_date < membership.to_date: raise ValidationError( - _("You already have a membership from '%s' to '%s' !!!!") % (membership.from_date, membership.to_date)) - - @api.onchange('from_date', 'product_id', 'duration','interval') + _("You already have a membership from '%s' to '%s' !!!!") % ( + membership.from_date, membership.to_date)) + + @api.onchange('from_date', 'product_id', 'duration', 'interval') def onchange_from_date(self): if self.from_date and self.product_id: if self.interval == 'year': @@ -122,6 +123,7 @@ class DevMembership(models.Model): self.to_date = self.from_date + relativedelta(months=+self.duration) - relativedelta(days=1) elif self.interval == 'days': self.to_date = self.from_date + relativedelta(days=+self.duration) + def action_confirm_membership(self): if self.product_id.nationality_ids: if self.partner_id.nationality_id not in self.product_id.nationality_ids: @@ -140,7 +142,7 @@ class DevMembership(models.Model): raise ValidationError( _("Duration cannot be less than the default value in Setting of membrship type.%s'") % self.product_id.duration) self.state = 'confirm' - + def action_active_membership(self): # Search for the last membership of the partner last_membership = self.env['dev.membership'].search([ @@ -151,8 +153,9 @@ class DevMembership(models.Model): sequence_code = 'membership.no.sequence' if not self.invoice_id and not self.is_free: raise ValidationError(_('Please Create Membership Invoice')) - if self.invoice_id.payment_state not in ['paid','in_payment'] and not self.is_free: - raise ValidationError(_('Membership Invoice is not paid.\nPlease pay the membership invoice and activate the membership.')) + if self.invoice_id.payment_state not in ['paid', 'in_payment'] and not self.is_free: + raise ValidationError( + _('Membership Invoice is not paid.\nPlease pay the membership invoice and activate the membership.')) else: # Assuming you have a field to track payment state self.payment_state = self.invoice_id.payment_state @@ -171,7 +174,6 @@ class DevMembership(models.Model): if not self.partner_id.memebership_end_date: self.partner_id.memebership_end_date = self.to_date - def action_cancel_membership(self): self.state = 'cancel' @@ -193,7 +195,8 @@ class DevMembership(models.Model): def membership_send_by_mail(self): self.ensure_one() - template_id = self.env['ir.model.data'].xmlid_to_res_id('dev_membership.template_membership', raise_if_not_found=False) + template_id = self.env['ir.model.data'].xmlid_to_res_id('dev_membership.template_membership', + raise_if_not_found=False) ctx = { 'default_model': 'dev.membership', 'default_res_id': self.ids[0], @@ -219,16 +222,16 @@ class DevMembership(models.Model): template_id = self.env.ref('dev_membership.dev_membership_expired_mail_template') for membership in membership_ids: membership.state = 'expire' - #template_id.send_mail(membership.id, force_send=True) + # template_id.send_mail(membership.id, force_send=True) if membership.user_id: - membership.message_post( - body=_("The Membership %s was expired on %s") % (membership.name,membership.to_date), - subject=_("Auto Expire Membership") , - partner_ids=[membership.user_id.partner_id.id], - message_type='notification', # - author_id=self.env.user.partner_id.id, - ) - + membership.message_post( + body=_("The Membership %s was expired on %s") % (membership.name, membership.to_date), + subject=_("Auto Expire Membership"), + partner_ids=[membership.user_id.partner_id.id], + message_type='notification', # + author_id=self.env.user.partner_id.id, + ) + def membership_reminder_email_cron(self): membership_pool = self.env['dev.membership'] tmpl_id = self.env.ref('dev_membership.dev_membership_expire_reminder_mail_template') @@ -237,19 +240,19 @@ class DevMembership(models.Model): date = datetime.now().date() + relativedelta(days=int(days_before)) membership_ids = membership_pool.search([('state', '=', 'active'), ('to_date', '=', date)]) - + for membership in membership_ids: - - #tmpl_id.send_mail(membership.id, force_send=True) + + # tmpl_id.send_mail(membership.id, force_send=True) if membership.user_id: membership.message_post( - body=_("The Membership %s is about to expire on %s") % (membership.name,membership.to_date), - subject=_("Membership Expire Reminder") , - partner_ids=[membership.user_id.partner_id.id], - message_type='notification', - author_id=self.env.user.partner_id.id, - ) + body=_("The Membership %s is about to expire on %s") % (membership.name, membership.to_date), + subject=_("Membership Expire Reminder"), + partner_ids=[membership.user_id.partner_id.id], + message_type='notification', + author_id=self.env.user.partner_id.id, + ) def cancell2_membership_reminder_email_cron(self): membership_pool = self.env['dev.membership'] @@ -259,12 +262,12 @@ class DevMembership(models.Model): try: post_expiry_period = int(post_expiry_period) except ValueError: - post_expiry_period = 0 + post_expiry_period = 0 date = fields.Date.today() - relativedelta(days=int(post_expiry_period)) membership_ids = membership_pool.search([ ('state', '=', 'expire'), - ('to_date', '=', date),('membership_id','=',False) + ('to_date', '=', date), ('membership_id', '=', False) ]) for membership in membership_ids: existing_cancel_request = self.env['membership.cancellation.request'].search([ @@ -279,9 +282,9 @@ class DevMembership(models.Model): 'state': 'draft', 'cancel_reason': cancel_reason }) - + return True - + def membership_secand_reminder_email_cron(self): membership_pool = self.env['dev.membership'] tmpl_id = self.env.ref('dev_membership.dev_membership_expire_second_reminder_mail_template') @@ -290,23 +293,23 @@ class DevMembership(models.Model): try: days_before_second = int(days_before_second) except ValueError: - days_before_second = 0 + days_before_second = 0 date = datetime.now().date() + relativedelta(days=days_before_second) membership_ids = membership_pool.search([ ('state', '=', 'active'), - ('to_date', '=', date) + ('to_date', '=', date) ]) for membership in membership_ids: - #tmpl_id.send_mail(membership.id, force_send=True) + # tmpl_id.send_mail(membership.id, force_send=True) if membership.user_id: membership.message_post( - body=_("The Membership %s is about to expire on %s") % (membership.name,membership.to_date), - subject=_("Membership Expire Reminder") , - partner_ids=[membership.user_id.partner_id.id], - message_type='notification', - author_id=self.env.user.partner_id.id, - ) + body=_("The Membership %s is about to expire on %s") % (membership.name, membership.to_date), + subject=_("Membership Expire Reminder"), + partner_ids=[membership.user_id.partner_id.id], + message_type='notification', + author_id=self.env.user.partner_id.id, + ) return True def datetime_convert(self): @@ -314,34 +317,17 @@ class DevMembership(models.Model): return convert_date def create_membership_invoice(self): - vals= {'move_type': 'out_invoice', - 'partner_id': self.partner_id.id, - 'ref':self.name, - 'invoice_line_ids': [ - (0, None, {'product_id': self.product_id.id, 'quantity': 1, 'price_unit': self.membership_fees, 'tax_ids': [(6, 0, self.product_id.taxes_id.ids)]}) - ] - } + vals = {'move_type': 'out_invoice', + 'partner_id': self.partner_id.id, + 'ref': self.name, + 'invoice_line_ids': [ + (0, None, {'product_id': self.product_id.id, 'quantity': 1, 'price_unit': self.membership_fees, + 'tax_ids': [(6, 0, self.product_id.taxes_id.ids)]}) + ] + } invoice_id = self.env['account.move'].create(vals) self.invoice_id = invoice_id and invoice_id.id or False - - @api.depends('membership_fees','duration') - def _compute_membership_level(self): - for record in self: - total_fees = record.membership_fees - total_duration = record.duration - memberships = self.env['dev.membership'].search([ - ('id', '!=', record.id), - ('partner_id', '=', record.partner_id.id), - ('to_date', '<', record.from_date), - ('state', 'in', [['expire','active','cancel']])]) - for membership in memberships: - total_fees += membership.membership_fees - total_duration += membership.duration - level_by_fees = self.env['membership.level'].search([ ('min', '<=', total_fees),('years', '<=', total_duration)], limit=1, order='sequence desc') - if level_by_fees: - record.membrship_level = level_by_fees - def view_invoice(self): if self.invoice_id: ctx = dict(create=False) @@ -355,7 +341,6 @@ class DevMembership(models.Model): 'context': ctx, } - def view_membership(self): if self.membership_id: ctx = dict(create=False) @@ -369,4 +354,32 @@ class DevMembership(models.Model): 'context': ctx, } + @api.depends('membership_fees', 'duration') + def _compute_membership_level(self): + for record in self: + total_fees = record.membership_fees + total_duration = record.duration + + # Search for memberships to sum fees and duration + memberships = self.env['dev.membership'].search([ + ('id', '!=', record.id), + ('partner_id', '=', record.partner_id.id), + ('to_date', '<', record.from_date), + ('state', 'in', ['expire', 'active', 'cancel']) + ]) + + for membership in memberships: + total_fees += membership.membership_fees + total_duration += membership.duration + + # Search for membership level based on the total fees and duration + level_by_fees = self.env['membership.level'].search([ + ('min', '<=', total_fees), + ('years', '<=', total_duration) + ], limit=1, order='sequence desc') + + # Update the membership level + record.membership_level = level_by_fees + +