# -*- coding: utf-8 -*- ############################################################################## # # OpenERP, Open Source Management Solution # Copyright (C) 2015 DevIntelle Consulting Service Pvt.Ltd (). # # For Module Support : devintelle@gmail.com or Skype : devintelle # ############################################################################## from odoo import fields, models, api, _ from datetime import datetime from dateutil.relativedelta import relativedelta from odoo.exceptions import UserError, ValidationError class DevMembership(models.Model): _name = 'dev.membership' _inherit = ['mail.thread', 'mail.activity.mixin'] _description = 'Dev Membership' _order = 'name desc' membrship_level = fields.Many2one('membership.level',string='Membrship level',store=True,required=False,compute='_compute_membership_level') name = fields.Char(string='Name', readonly=1) 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())) to_date = fields.Date(string="Membership To Date", tracking=3) request_date = fields.Date(string="Membership Cancell Request 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",) description = fields.Text(string="Description", related="product_id.description", readonly=False) interval = fields.Selection(string="Interval", related="product_id.interval") 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) 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') @api.onchange('product_id') def _onchange_membership_type(self): if self.product_id: if self.product_id.is_free: self.membership_fees = 0 else: self.membership_fees = self.product_id.list_price self.duration = (self.product_id.duration) @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('membership_fees') def _check_subscription_fee(self): for record in self: if record.product_id.duration and record.membership_fees < record.product_id.list_price : raise ValidationError(_('Membership fees cannot be less than the default value in Setting of membrship type.')) # elif record.product_id.duration>1 and record.membership_fees*record.duration < record.product_id.list_price*record.duration : # raise ValidationError(_('Membership fees cannot be less than the default value in Setting of membrship type.')) @api.constrains('duration') def _check_duration(self): for record in self: if record.duration < record.product_id.duration: raise ValidationError(_('Duration cannot be less than the default value in Setting of membrship type.')) @api.constrains('from_date') def _check_from_date(self): for rec in self: if not rec.from_date >= datetime.now().date(): pass # raise ValidationError("Membership date should be greater than or equal to today's date!!") def make_activity_group(self): # 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 summary = _("Membership Cancellation") self.sudo().activity_schedule( 'mail.mail_activity_data_todo', date_deadline, note=note, user_id=self.partner_id.user_id.id, res_id=self.id, summary=summary ) self.sudo().activity_schedule( 'mail.mail_activity_data_todo', date_deadline, note=note, user_id=self.user_id.id, res_id=self.id, summary=summary ) @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)]) 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') def onchange_from_date(self): if self.from_date and self.product_id: if self.interval == 'year': self.to_date = self.from_date + relativedelta(years=+self.duration) - relativedelta(days=1) elif self.interval == 'month': 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: raise ValidationError(_("The member's nationality does not meet the membership requirements")) if self.product_id.age!=0 and self.partner_id.age