diff --git a/odex25_sales/dev_membership/i18n/ar_001.po b/odex25_sales/dev_membership/i18n/ar_001.po index 8eb53be2c..9c4eeb965 100644 --- a/odex25_sales/dev_membership/i18n/ar_001.po +++ b/odex25_sales/dev_membership/i18n/ar_001.po @@ -6,8 +6,8 @@ msgid "" msgstr "" "Project-Id-Version: Odoo Server 14.0\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2024-07-29 11:27+0000\n" -"PO-Revision-Date: 2024-07-29 11:27+0000\n" +"POT-Creation-Date: 2024-07-31 12:13+0000\n" +"PO-Revision-Date: 2024-07-31 12:13+0000\n" "Last-Translator: \n" "Language-Team: \n" "MIME-Version: 1.0\n" @@ -126,9 +126,9 @@ msgstr "" #. module: dev_membership #: model_terms:ir.ui.view,arch_db:dev_membership.res_dev_membership_config_settings_view_form msgid "" -"Membership Cancellation\".\n" +"Membership Auto Cancellation\".\n" " " -msgstr "إلغاء العضوية" +msgstr "إلغاء تلقائي للعضويات المنتهية بعد تجاوز المدة المحدده وعدم التجديد" #. module: dev_membership #: model_terms:ir.ui.view,arch_db:dev_membership.res_dev_membership_config_settings_view_form @@ -664,14 +664,10 @@ msgstr "" #. module: dev_membership #: model:ir.model.fields,field_description:dev_membership.field_membership_level__max +#: model:ir.model.fields,field_description:dev_membership.field_membership_level__min msgid "Maximum" msgstr "الحد الاعلي" -#. module: dev_membership -#: model:ir.model.fields,field_description:dev_membership.field_membership_level__min -msgid "Minimum" -msgstr "الحد الادني" - #. module: dev_membership #: model:ir.actions.act_window,name:dev_membership.action_members #: model:ir.model.fields,field_description:dev_membership.field_membership_cancellation_request__member_id @@ -703,6 +699,12 @@ msgstr "العضوية" msgid "Membership %s is Cancelled" msgstr "تم إلغاء العضوية %s" +#. module: dev_membership +#: model_terms:ir.ui.view,arch_db:dev_membership.res_dev_membership_config_settings_view_form +msgid "Membership Auto Cancellation\"." +msgstr "إلغاء تلقائي للعضويات المنتهية بعد تجاوز المدة المحدده وعدم التجديد" + + #. module: dev_membership #: model:ir.model.fields,field_description:dev_membership.field_product_product__membership_benefits #: model:ir.model.fields,field_description:dev_membership.field_product_template__membership_benefits @@ -734,11 +736,6 @@ msgstr "" msgid "Membership Cancellation Requests" msgstr "طلبات إلغاء العضوية" -#. module: dev_membership -#: model_terms:ir.ui.view,arch_db:dev_membership.res_dev_membership_config_settings_view_form -msgid "Membership Cancellation\"." -msgstr "إلغاء العضوية" - #. module: dev_membership #: model:ir.model.fields,field_description:dev_membership.field_membership_level__color msgid "Membership Card Color" @@ -927,7 +924,7 @@ msgstr "" #: code:addons/dev_membership/models/dev_membership.py:0 #, python-format msgid "Membership is only allowed for %s" -msgstr "" +msgstr "العضوية مسموحة فقط لـ" #. module: dev_membership #: model:ir.model,name:dev_membership.model_membership_request_cancel_wizard @@ -965,9 +962,9 @@ msgid "Messages" msgstr "" #. module: dev_membership -#: model:ir.model.fields,field_description:dev_membership.field_membership_level__years -msgid "NO Of Years Subscription." -msgstr "عدد سنوات الاشتراك" +#: model:ir.model.fields,field_description:dev_membership.field_dev_membership__mmembrship_level +msgid "Mmembrship level" +msgstr "" #. module: dev_membership #: model:ir.model.fields.selection,name:dev_membership.selection__product_template__interval__month @@ -982,6 +979,11 @@ msgstr "شهر" msgid "My Activity Deadline" msgstr "" +#. module: dev_membership +#: model:ir.model.fields,field_description:dev_membership.field_membership_level__years +msgid "NO Of Years Subscription." +msgstr "عدد سنوات الاشتراك" + #. module: dev_membership #: model:ir.model.fields,field_description:dev_membership.field_dev_membership__name #: model:ir.model.fields,field_description:dev_membership.field_membership_level__name @@ -1149,6 +1151,12 @@ msgstr "" msgid "Request Date" msgstr "تاريخ الطلب" +#. module: dev_membership +#: code:addons/dev_membership/models/membership_cancel_request.py:0 +#, python-format +msgid "Requests can only be deleted if they are in the draft state." +msgstr يمكن حذف الطلبات فقط إذا كانت في حالة المسودة." + #. module: dev_membership #: model_terms:ir.ui.view,arch_db:dev_membership.view_search_res_partner msgid "Res Partner Search" @@ -1222,13 +1230,13 @@ msgstr "الضرائب" #: code:addons/dev_membership/models/dev_membership.py:0 #, python-format msgid "The member must be at least 18 years old." -msgstr "" +msgstr "يجب أن يكون عمر العضو 18 عامًا على الأقل" #. module: dev_membership #: code:addons/dev_membership/models/dev_membership.py:0 #, python-format msgid "The member's nationality does not meet the membership requirements" -msgstr "" +msgstr "جنسية العضو لا تفي بمتطلبات العضوية" #. module: dev_membership #: model:ir.model.fields,help:dev_membership.field_dev_membership__activity_exception_decoration diff --git a/odex25_sales/dev_membership/models/__pycache__/__init__.cpython-38.pyc b/odex25_sales/dev_membership/models/__pycache__/__init__.cpython-38.pyc deleted file mode 100644 index 5e2ef618a..000000000 Binary files a/odex25_sales/dev_membership/models/__pycache__/__init__.cpython-38.pyc and /dev/null differ diff --git a/odex25_sales/dev_membership/models/__pycache__/dev_membership.cpython-38.pyc b/odex25_sales/dev_membership/models/__pycache__/dev_membership.cpython-38.pyc deleted file mode 100644 index f571d4944..000000000 Binary files a/odex25_sales/dev_membership/models/__pycache__/dev_membership.cpython-38.pyc and /dev/null differ diff --git a/odex25_sales/dev_membership/models/__pycache__/membershib_level.cpython-38.pyc b/odex25_sales/dev_membership/models/__pycache__/membershib_level.cpython-38.pyc deleted file mode 100644 index d55b6f2f8..000000000 Binary files a/odex25_sales/dev_membership/models/__pycache__/membershib_level.cpython-38.pyc and /dev/null differ diff --git a/odex25_sales/dev_membership/models/__pycache__/membership_cancel_request.cpython-38.pyc b/odex25_sales/dev_membership/models/__pycache__/membership_cancel_request.cpython-38.pyc deleted file mode 100644 index 690f8eba3..000000000 Binary files a/odex25_sales/dev_membership/models/__pycache__/membership_cancel_request.cpython-38.pyc and /dev/null differ diff --git a/odex25_sales/dev_membership/models/__pycache__/product_template.cpython-38.pyc b/odex25_sales/dev_membership/models/__pycache__/product_template.cpython-38.pyc deleted file mode 100644 index 24dcbbf9f..000000000 Binary files a/odex25_sales/dev_membership/models/__pycache__/product_template.cpython-38.pyc and /dev/null differ diff --git a/odex25_sales/dev_membership/models/__pycache__/res_config_settings.cpython-38.pyc b/odex25_sales/dev_membership/models/__pycache__/res_config_settings.cpython-38.pyc deleted file mode 100644 index b43336c3c..000000000 Binary files a/odex25_sales/dev_membership/models/__pycache__/res_config_settings.cpython-38.pyc and /dev/null differ diff --git a/odex25_sales/dev_membership/models/__pycache__/res_partner.cpython-38.pyc b/odex25_sales/dev_membership/models/__pycache__/res_partner.cpython-38.pyc deleted file mode 100644 index d81b4458e..000000000 Binary files a/odex25_sales/dev_membership/models/__pycache__/res_partner.cpython-38.pyc and /dev/null differ diff --git a/odex25_sales/dev_membership/models/dev_membership.py b/odex25_sales/dev_membership/models/dev_membership.py index 2ec9dc2f0..9b283c164 100644 --- a/odex25_sales/dev_membership/models/dev_membership.py +++ b/odex25_sales/dev_membership/models/dev_membership.py @@ -20,7 +20,7 @@ class DevMembership(models.Model): _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())) @@ -49,6 +49,24 @@ class DevMembership(models.Model): user_id = fields.Many2one('res.users', string='Resposible', default=lambda self:self.env.user) cancel_reasone = fields.Char(string='Cancel Membership Reason') + # subscription_years = fields.Integer(string='Subscription Years', compute='_compute_subscription_years', store=True) + + # @api.depends('partner_id') + # def _compute_subscription_years(self): + # for record in self: + # total_years = 0 + # memberships = self.env['dev.membership'].search([ + # ('partner_id', '=', record.partner_id.id), + # ('state', '=', 'active') + # ]) + # for membership in memberships: + # if membership.from_date and membership.to_date: + # from_date = fields.Date.from_string(membership.from_date) + # to_date = fields.Date.from_string(membership.to_date) + # years_difference = (to_date - from_date).days / 365.25 # حساب الفرق بالسنوات + # total_years += years_difference + # + # record.subscription_years = total_years @api.onchange('product_id') def _onchange_membership_type(self): if self.product_id: @@ -127,11 +145,11 @@ class DevMembership(models.Model): self.to_date = self.from_date + relativedelta(days=+self.duration) def action_confirm_membership(self): - if self.product_id.nationality_ids and self.product_id.age: + 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.partner_id.age <18: raise ValidationError(_('The member must be at least 18 years old.')) - if self.partner_id.gender != self.product_id.gender: + if self.partner_id.gender != self.product_id.gender and self.product_id.gender!=False: raise ValidationError(_('Membership is only allowed for %s') % self.product_id.gender) self.state = 'confirm' @@ -270,7 +288,7 @@ class DevMembership(models.Model): def datetime_convert(self): convert_date = self.to_date.strftime("%d-%m-%Y") return convert_date - + def create_membership_invoice(self): vals= {'move_type': 'out_invoice', 'partner_id': self.partner_id.id, @@ -280,8 +298,49 @@ class DevMembership(models.Model): } invoice_id = self.env['account.move'].create(vals) self.invoice_id = invoice_id and invoice_id.id or False - - + + @api.depends('membership_fees') + def _compute_membership_level(self): + for record in self: + total_fees = 0 + memberships = self.env['dev.membership'].search([ + ('partner_id', '=', record.partner_id.id), + ('state', '=', 'active') + ]) + total_fees = sum(membership.membership_fees for membership in memberships) + + # البحث عن مستوى العضوية بناءً على إجمالي الرسوم + level_by_fees = self.env['membership.level'].search([ + ('min', '<=', total_fees), + ('max', '>=', total_fees) + ], limit=1) + + # البحث عن مستوى العضوية بناءً على عدد السنوات (≥ 3 سنوات) + level_by_years = self.env['membership.level'].search([ + ('years', '>=', 3) + ], limit=1) + total_duration = sum(membership.duration for membership in memberships) + # تعيين مستوى العضوية + # if level_by_years: + # + # record.membrship_level_id = level_by_years.id + if level_by_fees: + record.membrship_level = level_by_fees.id + if total_duration>=level_by_years.years and total_fees<=level_by_years.min: + record.membrship_level = level_by_fees.id + + # level = self.env['membership.level'].search( + # ['|', + # '&', ('min', '<=', total_fees), ('max', '>=', total_fees), + # ('years', '<=', total_duration)], + # limit=1 + # ) + # + # if level: + # record.membrship_level = level.id + # else: + # record.membrship_level = False + def view_invoice(self): if self.invoice_id: ctx = dict(create=False) diff --git a/odex25_sales/dev_membership/models/membership_cancel_request.py b/odex25_sales/dev_membership/models/membership_cancel_request.py index e08457250..48c61ac68 100644 --- a/odex25_sales/dev_membership/models/membership_cancel_request.py +++ b/odex25_sales/dev_membership/models/membership_cancel_request.py @@ -1,4 +1,5 @@ from odoo import models, fields, api,_ +from odoo.exceptions import UserError, ValidationError class MembershipCancellationRequest(models.Model): _name = 'membership.cancellation.request' @@ -6,9 +7,9 @@ class MembershipCancellationRequest(models.Model): _inherit = ['mail.thread', 'mail.activity.mixin'] _rec_name = 'member_id' - member_id = fields.Many2one('res.partner', string='Member', required=True) - membership_type_id = fields.Many2one('product.template', string='Membership Type', required=True) - membership_id = fields.Many2one('dev.membership', string='Membership', required=True) + membership_id = fields.Many2one('dev.membership', string='Membership',required=True) + member_id = fields.Many2one('res.partner', string='Member',related='membership_id.partner_id',store=True, required=True) + membership_type_id = fields.Many2one('product.product',related='membership_id.product_id',store=True, string='Membership Type', required=True) cancel_reason = fields.Char(string='Cancellation Reason', required=True) request_date = fields.Datetime(string='Request Date', default=fields.Datetime.now) state = fields.Selection([ @@ -25,3 +26,8 @@ class MembershipCancellationRequest(models.Model): def action_reject(self): for rec in self: rec.state = 'rejected' + def unlink(self): + for record in self: + if record.state != 'draft': + raise UserError(_("Requests can only be deleted if they are in the draft state.")) + return super(MembershipCancellationRequest, self).unlink() \ No newline at end of file diff --git a/odex25_sales/dev_membership/models/res_partner.py b/odex25_sales/dev_membership/models/res_partner.py index 1ad938823..0ccff0170 100644 --- a/odex25_sales/dev_membership/models/res_partner.py +++ b/odex25_sales/dev_membership/models/res_partner.py @@ -18,6 +18,7 @@ class PartnerExtended(models.Model): is_member = fields.Boolean(string='Is Member') membership_count = fields.Integer(string="Membership Count", compute="_get_membership_count") active_membership_id = fields.Many2one('dev.membership', string='Membership', compute='check_active_membership') + membrship_level = fields.Many2one(string='Mmembrship level', required=False,related='active_membership_id.membrship_level') nationality_id = fields.Many2one('res.country', string="Nationality") is_membership_expire = fields.Boolean('Expire Membership',store=True, compute='check_active_membership') @@ -49,12 +50,32 @@ class PartnerExtended(models.Model): partner.memebership_status = '' if partner.membership_count == 0: partner.memebership_status = 'No Membership' + else: - if partner.is_membership_expire: - partner.memebership_status = 'Membership Expire' + if partner.active_membership_id: + partner.memebership_status = 'Membership : ' + partner.active_membership_id.name else: - if partner.active_membership_id: - partner.memebership_status = 'Membership : ' + partner.active_membership_id.name + # البحث عن حالة الاشتراك الأخيرة + last_membership = self.env['dev.membership'].search([('partner_id', '=', partner.id)], order='to_date desc', limit=1) + print('last_membership = ',last_membership) + if last_membership: + if last_membership.state=='draft': + partner.memebership_status = 'Membership Waitting' + elif last_membership.state=='cancel': + partner.memebership_status = 'Membership Cancelled' + elif last_membership.state=='confirm': + if not last_membership.invoice_id and not last_membership.is_free: + partner.memebership_status = 'Membership Waitting invoice' + elif last_membership.invoice_id.payment_state in ['paid','in_payment']: + partner.memebership_status = 'Membership Paid' + elif last_membership.invoice_id.payment_state not in ['paid','in_payment']: + partner.memebership_status = 'Membership Waitting Paid' +############################################################################################################################################## + # if partner.is_membership_expire: + # partner.memebership_status = 'Membership Expire' + # else: + if partner.active_membership_id: + partner.memebership_status = 'Membership : ' + partner.active_membership_id.name def check_active_membership(self): for partner in self: @@ -86,4 +107,4 @@ class PartnerExtended(models.Model): 'view_mode': 'tree,form', 'target': 'current', 'context': ctx, - } + } \ No newline at end of file diff --git a/odex25_sales/dev_membership/views/dev_membership.xml b/odex25_sales/dev_membership/views/dev_membership.xml index 041473d58..7d3777f00 100644 --- a/odex25_sales/dev_membership/views/dev_membership.xml +++ b/odex25_sales/dev_membership/views/dev_membership.xml @@ -8,6 +8,7 @@ + @@ -65,12 +66,21 @@ + + + + + + +

+ + @@ -136,6 +146,7 @@ + @@ -167,6 +178,8 @@
+
diff --git a/odex25_sales/dev_membership/views/membership_cancel_request.xml b/odex25_sales/dev_membership/views/membership_cancel_request.xml index c7677e338..3fefed33e 100644 --- a/odex25_sales/dev_membership/views/membership_cancel_request.xml +++ b/odex25_sales/dev_membership/views/membership_cancel_request.xml @@ -13,14 +13,27 @@ - - - - - + + + + + + + + - +
+

+

+ +
+ + + +
@@ -31,9 +44,9 @@ membership.cancellation.request + - diff --git a/odex25_sales/dev_membership/views/partner_extended.xml b/odex25_sales/dev_membership/views/partner_extended.xml index d3276b845..439dc2e0d 100644 --- a/odex25_sales/dev_membership/views/partner_extended.xml +++ b/odex25_sales/dev_membership/views/partner_extended.xml @@ -13,7 +13,9 @@ + + @@ -46,6 +48,7 @@ + @@ -117,6 +120,8 @@ +
+
@@ -156,7 +161,7 @@ - + diff --git a/odex25_sales/dev_membership/views/res_config_settings.xml b/odex25_sales/dev_membership/views/res_config_settings.xml index 08b3f2f87..b513226f3 100644 --- a/odex25_sales/dev_membership/views/res_config_settings.xml +++ b/odex25_sales/dev_membership/views/res_config_settings.xml @@ -84,10 +84,10 @@
- Membership Cancellation". + Membership Auto Cancellation".
- Membership Cancellation". + Membership Auto Cancellation".
diff --git a/odex25_sales/dev_membership/wizard/cancel_membership.py b/odex25_sales/dev_membership/wizard/cancel_membership.py index 7f5de7c6a..b1c1c7abf 100644 --- a/odex25_sales/dev_membership/wizard/cancel_membership.py +++ b/odex25_sales/dev_membership/wizard/cancel_membership.py @@ -8,6 +8,8 @@ class MembershipRefues(models.TransientModel): _name = "membership.request.cancel.wizard" _description = "Membership refuse Reason wizard" + + reason_id = fields.Many2one('cancellation.reason',string='Cancel Membership Reason' ,required=True) request_id = fields.Many2one('dev.membership') user_id = fields.Many2one('res.users', string='User', default=lambda self: self.env.user,) @@ -50,5 +52,13 @@ class MembershipRefues(models.TransientModel): 'cancel_reason': self.reason_id.name, 'state': 'draft' }) - return {'type': 'ir.actions.act_window_close'} + # return {'type': 'ir.actions.act_window_close'} + return { + 'type': 'ir.actions.act_window', + 'name': 'Membership Cancellation Requests', + 'view_mode': 'tree,form', + 'res_model': 'membership.cancellation.request', + 'context': dict(self.env.context, create=False) + } + diff --git a/odex25_sales/dev_membership/wizard/cancel_membership.xml b/odex25_sales/dev_membership/wizard/cancel_membership.xml index fc8436334..832b82269 100644 --- a/odex25_sales/dev_membership/wizard/cancel_membership.xml +++ b/odex25_sales/dev_membership/wizard/cancel_membership.xml @@ -14,6 +14,7 @@