diff --git a/odex25_ensan/odex_benefit/i18n/ar_001.po b/odex25_ensan/odex_benefit/i18n/ar_001.po index b53c96120..d54b03391 100644 --- a/odex25_ensan/odex_benefit/i18n/ar_001.po +++ b/odex25_ensan/odex_benefit/i18n/ar_001.po @@ -4206,7 +4206,6 @@ msgstr "" #: model:ir.model.fields,field_description:odex_benefit.field_receive_food_basket__description #: model:ir.model.fields,field_description:odex_benefit.field_rooms_categories__description #: model:ir.model.fields,field_description:odex_benefit.field_rooms_items__description -#: model:ir.model.fields,field_description:odex_benefit.field_service_request__description #: model:ir.model.fields,field_description:odex_benefit.field_specialization_specialization__description #: model:ir.model.fields,field_description:odex_benefit.field_sport_type__description #: model_terms:ir.ui.view,arch_db:odex_benefit.view_confirm_benefit_expense_form @@ -4214,6 +4213,11 @@ msgstr "" msgid "Description" msgstr "الوصف" +#. module: odex_benefit +#: model:ir.model.fields,field_description:odex_benefit.field_service_request__description +msgid "Description" +msgstr "ملاحظات إضافية" + #. module: odex_benefit #: model:ir.model.fields,field_description:odex_benefit.field_visit_location__description msgid "Description" @@ -11582,15 +11586,14 @@ msgstr "إجمالي مصروف الغذاء للأسر" #. module: odex_benefit #: model:ir.model.fields,field_description:odex_benefit.field_confirm_benefit_expense__total_move_lines -#: model:ir.model.fields,field_description:odex_benefit.field_confirm_benefit_expense__total_moves #: model:ir.model.fields,field_description:odex_benefit.field_grant_benefit__total_move_lines msgid "Total Move Lines" msgstr "القيود اليومية" #. module: odex_benefit -#: model:ir.model.fields,field_description:odex_benefit.field_confirm_benefit_expense__total_invoices -msgid "Total Moves" -msgstr "الحركات" +#: model:ir.model.fields,field_description:odex_benefit.field_confirm_benefit_expense__total_moves +msgid "Total Move" +msgstr "القيود اليومية" #. module: odex_benefit #: model:ir.model.fields,field_description:odex_benefit.field_benefit_housing__total_net @@ -14875,12 +14878,6 @@ msgstr "اسم الأب" msgid "Account Number is required." msgstr "رقم آيبان مطلوب." -#. module: odex_benefit -#: code:addons/odex_benefit/models/benefit.py:0 -#, python-format -msgid "IBAN Document is required." -msgstr "مرفق الآيبان مطلوب." - #. module: odex_benefit #: code:addons/odex_benefit/models/benefit.py:0 #, python-format diff --git a/odex25_ensan/odex_benefit/models/benefit.py b/odex25_ensan/odex_benefit/models/benefit.py index b97e5e63c..19fb5161f 100644 --- a/odex25_ensan/odex_benefit/models/benefit.py +++ b/odex25_ensan/odex_benefit/models/benefit.py @@ -1,6 +1,8 @@ # -*- coding: utf-8 -*- import logging from datetime import datetime, date +from email.policy import default + from dateutil.relativedelta import relativedelta as rd from odoo import models, fields, api, _ from odoo.exceptions import UserError, ValidationError @@ -104,7 +106,7 @@ class GrantBenefitProfile(models.Model): password = fields.Char('Password') # Category And Family benefit_category_id = fields.Many2one('benefit.category', string='Benefit Category', compute="get_benefit_category",store=True) - benefit_category_old = fields.Many2one('benefit.category', string='Benefit Category') + benefit_category_old = fields.Many2one('benefit.category', string='Family category in the old system') family_id = fields.Many2one('benefit.family', string='Benefit Family') # address housing_id = fields.Many2one('benefit.housing', string='Benefit Housing') @@ -587,7 +589,7 @@ class GrantBenefitProfile(models.Model): replacement_mother_disabilities_attachment_ids = fields.One2many('ir.attachment', 'replacement_mother_grant_benefit_id',string='Disabilities Attachments',domain=[('disabilities_id', '!=', False)]) sponsorship_id = fields.Many2one('takaful.sponsorship',string='Sponsorship') #check if Account Holder is Family memeber of not - is_family_member = fields.Boolean(string='Is Family member?' , help="check if Account Holder is Family memeber") + is_family_member = fields.Boolean(string='Is Family member?' , help="check if Account Holder is Family memeber",default=True) family_member_id = fields.Many2one('family.member', string='Account Holder Name', domain="[('id','in',member_ids)]") owner_identity_attachment_ids = fields.Many2many('ir.attachment', 'rel_identity_attachment','benefit_id','attachment_id',string='Account holder identity') family_approval_attachment_ids = fields.Many2many('ir.attachment', 'rel_approval_attachment','benefit_id','attachment_id',string='Family approval of transfer') @@ -1450,20 +1452,18 @@ class GrantBenefitProfile(models.Model): """Accept registration""" for rec in self: messages = [] + if rec.total_family_expenses: + if not rec.acc_number: + messages.append(_("Account Number is required.")) + if not rec.bank_id: + messages.append(_("Bank is required.")) + if not rec.is_family_member and not rec.acc_holder_name: + messages.append(_("Account Holder Name is required for non-family members.")) + if rec.is_family_member and not rec.family_member_id: + messages.append(_("Family Member must be selected.")) - if not rec.acc_number: - messages.append(_("Account Number is required.")) - if not rec.iban_document: - messages.append(_("IBAN Document is required.")) - if not rec.bank_id: - messages.append(_("Bank is required.")) - if not rec.is_family_member and not rec.acc_holder_name: - messages.append(_("Account Holder Name is required for non-family members.")) - if rec.is_family_member and not rec.family_member_id: - messages.append(_("Family Member must be selected.")) - - if messages: - raise UserError("\n".join(messages)) + if messages: + raise UserError("\n".join(messages)) if not rec.user_id: self.sudo().create_user() diff --git a/odex25_ensan/odex_benefit/models/family_expense.py b/odex25_ensan/odex_benefit/models/family_expense.py index 49b0b1370..8ee5af3ee 100644 --- a/odex25_ensan/odex_benefit/models/family_expense.py +++ b/odex25_ensan/odex_benefit/models/family_expense.py @@ -56,22 +56,9 @@ class ConfirmBenefitExpense(models.Model): cloth_expense = fields.Boolean(string='Include Clothing Expense', states={'confirm': [('readonly', True)]}) payment_order_id = fields.Many2one('payment.orders', string='Payment Order', ondelete="set null", copy=False) move_id = fields.Many2one('account.move', ondelete='cascade') - # payment_method_id = fields.Many2one(comodel_name='account.payment.method.line', string='Payment Method', - # readonly=False, store=True, copy=False, - # states={'confirm': [('readonly', True)]}, - # compute='_compute_payment_method_line_id', - # domain="[('id', 'in', available_payment_method_line_ids)]", - # help="Manual: Pay or Get paid by any method outside of Odoo.\n" - # "Payment Providers: Each payment provider has its own Payment Method. Request a transaction on/to a card thanks to a payment token saved by the partner when buying or subscribing online.\n" - # "Check: Pay bills by check and print it from Odoo.\n" - # "Batch Deposit: Collect several customer checks at once generating and submitting a batch deposit to your bank. Module account_batch_payment is necessary.\n" - # "SEPA Credit Transfer: Pay in the SEPA zone by submitting a SEPA Credit Transfer file to your bank. Module account_sepa is necessary.\n" - # "SEPA Direct Debit: Get paid in the SEPA zone thanks to a mandate your partner will have granted to you. Module account_sepa is necessary.\n") available_payment_method_line_ids = fields.Many2many(comodel_name='account.payment.method.line') - total_moves = fields.Integer(string="Total Move Lines", compute='_get_total_move_lines') + total_moves = fields.Integer(string="Total Move", compute='_get_total_move_lines') total_move_lines = fields.Integer(string="Total Move Lines", compute='_get_total_move_lines') - total_invoices = fields.Integer(string="Total Moves", compute='_get_total_move_lines') - family_monthly_income = fields.Float(string="Total Monthly Income", compute='_get_family_monthly_values') family_monthly_meals = fields.Float(string="Total Monthly Meals", compute='_get_family_monthly_values') family_monthly_clotting = fields.Float(string="Total Monthly Clotting", compute='_get_family_monthly_values') @@ -208,6 +195,7 @@ class ConfirmBenefitExpense(models.Model): # Search for conflicting records of the same expense type within the past month conflicting_records = self.search([ + ('id', '!=', rec._origin.id), ('start_date', '<=', rec.end_date), ('end_date', '>=', rec.start_date), ('expense_type', '=', rec.expense_type), @@ -220,6 +208,11 @@ class ConfirmBenefitExpense(models.Model): rec.family_domain_ids = self.env['grant.benefit'].search(base_domain) + @api.onchange('branch_custom_id') + def _onchange_branch_custom_id(self): + if self.branch_custom_id: + self.family_ids = [(5, 0, 0)] + def unlink(self): for rec in self: if rec.state not in ['draft']: @@ -270,74 +263,29 @@ class ConfirmBenefitExpense(models.Model): def _get_total_move_lines(self): for rec in self: - rec.total_moves = self.env['account.move'].search_count([ - ('family_confirm_id', '=', rec.id), ('move_type', '!=', 'in_invoice') - ]) - rec.total_invoices = self.env['account.move'].search_count([ - ('family_confirm_id', '=', rec.id), ('move_type', '=', 'in_invoice') - ]) - rec.total_move_lines = len(self.env['account.move'].search([ - ('family_confirm_id', '=', rec.id), ('move_type', '!=', 'in_invoice') - ]).mapped('line_ids').ids) + if self.expense_type == 'family_expense': + moves = self.payment_order_id.move_id + else: + moves = self.move_id + + rec.total_moves = len(moves) + rec.total_move_lines = len(moves.mapped('line_ids')) def action_open_related_move_records(self): """ Opens a tree view with related records filtered by a dynamic domain """ - moves = self.env['account.move'].search([ - ('family_confirm_id', '=', self.id), ('move_type', '!=', 'in_invoice') - ]).ids - - return { - 'name': _('Moves'), - 'type': 'ir.actions.act_window', - 'res_model': 'account.move', - 'view_mode': 'tree,form', - 'domain': [('id', 'in', moves)], - } - - def action_open_related_move_line_records(self): - """ Opens a tree view with related records filtered by a dynamic domain """ - move_lines = self.env['account.move'].search([ - ('family_confirm_id', '=', self.id), ('move_type', '!=', 'in_invoice') - ]).mapped('line_ids').ids - - return { - 'name': _('Moves'), - 'type': 'ir.actions.act_window', - 'res_model': 'account.move.line', - 'view_mode': 'tree,form', - 'domain': [('id', 'in', move_lines)], - } - - def action_open_related_invoice_records(self): - """ Opens a tree view with related records filtered by a dynamic domain """ - invoices = self.env['account.move'].search([ - ('family_confirm_id', '=', self.id), ('move_type', '=', 'in_invoice') - ]).ids + if self.expense_type == 'family_expense': + moves = self.payment_order_id.move_id.ids + else: + moves = self.move_id.ids return { 'name': _('Vendor Bills'), 'type': 'ir.actions.act_window', 'res_model': 'account.move', 'view_mode': 'tree,form', - 'domain': [('id', 'in', invoices)], + 'domain': [('id', 'in', moves)], } - # @api.depends('available_payment_method_line_ids') - # def _compute_payment_method_line_id(self): - # ''' Compute the 'payment_method_line_id' field. - # This field is not computed in '_compute_payment_method_line_fields' because it's a stored editable one. - # ''' - # for pay in self: - # available_payment_method_lines = pay.available_payment_method_line_ids - # - # # Select the first available one by default. - # if pay.payment_method_id in available_payment_method_lines: - # pay.payment_method_id = pay.payment_method_id - # elif available_payment_method_lines: - # pay.payment_method_id = available_payment_method_lines[0]._origin - # else: - # pay.payment_method_id = False - def action_accounting_transfer(self): for rec in self: validation_setting = self.env["family.validation.setting"].search([], limit=1) diff --git a/odex25_ensan/odex_benefit/models/payment_order.py b/odex25_ensan/odex_benefit/models/payment_order.py index 09366a088..50d73013c 100644 --- a/odex25_ensan/odex_benefit/models/payment_order.py +++ b/odex25_ensan/odex_benefit/models/payment_order.py @@ -78,6 +78,7 @@ class PaymentOrders(models.Model): rec.state = 'waiting_gm' def create_entry(self): + #todo add invoice type to the move for rec in self: if not rec.journal_id: raise UserError(_("Please select a journal before creating the entry.")) @@ -103,10 +104,6 @@ class PaymentOrders(models.Model): def action_deposit(self): for rec in self: - if rec.type == "seasonal_services": - rec.seasonal_requests_ids.action_accounting_approve() - elif rec.type == "services": - rec.service_requests_ids.write({'state': 'action_accounting_approve'}) rec.state = 'done' def action_gm_approval(self): diff --git a/odex25_ensan/odex_benefit/models/service_request.py b/odex25_ensan/odex_benefit/models/service_request.py index 72e7c7e70..66b122e87 100644 --- a/odex25_ensan/odex_benefit/models/service_request.py +++ b/odex25_ensan/odex_benefit/models/service_request.py @@ -163,6 +163,7 @@ class ServiceRequest(models.Model): required_attach = fields.Boolean(string='Required Attach', related='service_cat.required_attach') state = fields.Selection(selection=[ ('draft', 'Draft'), + ('waiting_family', 'Waiting Family'), ('researcher', 'Researcher'), ('waiting_approve', 'Waiting for Operation Manager'), ('first_approve', 'Waiting for Branch Manager'), @@ -218,6 +219,7 @@ class ServiceRequest(models.Model): ('none', 'None'), ('waiting', 'Waiting Payment'), ('done', 'Done Payment'), ], copy=False, compute="_compute_payment_order_state", store=True) + total_moves = fields.Integer(string="Total Move", compute='_get_total_move_lines') @api.depends('payment_order_id', 'payment_order_id.state', 'vendor_bill', 'vendor_bill.state') def _compute_payment_order_state(self): @@ -489,6 +491,10 @@ class ServiceRequest(models.Model): for rec in self: rec.state = 'researcher' + def action_return_to_family(self): + for rec in self: + rec.state = 'waiting_family' + def action_researcher_send_request(self): for rec in self: if not rec.requested_service_amount or rec.requested_service_amount <= 0: @@ -967,7 +973,8 @@ class ServiceRequest(models.Model): @api.depends('family_category') def _compute_available_service_cats(self): for rec in self: - domain = [('service_type', '!=', 'main_service'), ('benefit_category_ids', 'in', [rec.family_category.id])] + domain = [('is_seasonal_service', '=', False), ('service_type', '!=', 'main_service'), + ('benefit_category_ids', 'in', [rec.family_category.id])] if rec.family_id.property_type not in ['ownership', 'ownership_shared', 'charitable']: domain.append(('service_type', '!=', 'home_restoration')) else: @@ -1049,3 +1056,26 @@ class ServiceRequest(models.Model): 'invoice_line_ids': line_ids, }) self.vendor_bill = vendor_bill + + def _get_total_move_lines(self): + for rec in self: + if self.service_cat.payment_method == "payment_order": + moves = self.payment_order_id.move_id + elif self.service_cat.payment_method == "invoice": + moves = self.vendor_bill + + rec.total_moves = len(moves) + + def action_open_related_move_records(self): + if self.service_cat.payment_method == "payment_order": + moves = self.payment_order_id.move_id.ids + elif self.service_cat.payment_method == "invoice": + moves = self.vendor_bill.ids + + return { + 'name': _('Vendor Bills'), + 'type': 'ir.actions.act_window', + 'res_model': 'account.move', + 'view_mode': 'tree,form', + 'domain': [('id', 'in', moves)], + } diff --git a/odex25_ensan/odex_benefit/views/benefit_view.xml b/odex25_ensan/odex_benefit/views/benefit_view.xml index 5c88d55d6..bb901a2ec 100644 --- a/odex25_ensan/odex_benefit/views/benefit_view.xml +++ b/odex25_ensan/odex_benefit/views/benefit_view.xml @@ -530,7 +530,7 @@ - + + + diff --git a/odex25_ensan/odex_benefit/views/family_expense_view.xml b/odex25_ensan/odex_benefit/views/family_expense_view.xml index 22c33e0ba..49494cffe 100644 --- a/odex25_ensan/odex_benefit/views/family_expense_view.xml +++ b/odex25_ensan/odex_benefit/views/family_expense_view.xml @@ -66,11 +66,11 @@
-
@@ -106,8 +106,7 @@ - +
@@ -163,7 +162,8 @@
- + diff --git a/odex25_ensan/odex_benefit/views/family_members.xml b/odex25_ensan/odex_benefit/views/family_members.xml index 791778b34..2b401b16e 100644 --- a/odex25_ensan/odex_benefit/views/family_members.xml +++ b/odex25_ensan/odex_benefit/views/family_members.xml @@ -315,16 +315,17 @@ - + - + -
- +
+
- +
- +
- + @@ -358,19 +360,22 @@
- + غير مستفيد
- + مستفيد
- + غير محدد
@@ -378,32 +383,37 @@
- +
- + - + - + + + غير محدد
- العمر: + العمر: - سنة + + + سنة + --
@@ -411,7 +421,7 @@
- +

@@ -424,8 +434,9 @@

- - السكن: + + السكن: @@ -437,8 +448,9 @@
- - التعليم: + + التعليم: @@ -451,8 +463,9 @@
- - يعمل: + + يعمل: @@ -464,10 +477,11 @@
- +
- - الدخل: + + الدخل: @@ -483,11 +497,13 @@
- - الجوال: + + الجوال: - 0 + 0 + @@ -497,19 +513,21 @@
- +
- - الأسرة: + + الأسرة: - + - + - + @@ -530,7 +548,7 @@
+ onmouseover="this.style.transform='translateY(-4px)'; this.style.boxShadow='0 10px 20px rgba(0,0,0,0.12)'" + onmouseout="this.style.transform='translateY(0)'; this.style.boxShadow='0 2px 6px rgba(0,0,0,0.06)';">
- +
-
طلبات الخدمة
+
طلبات + الخدمة +
عرض التفاصيل @@ -596,7 +617,8 @@ - +
@@ -618,7 +640,8 @@ - + diff --git a/odex25_ensan/odex_benefit/views/payment_order.xml b/odex25_ensan/odex_benefit/views/payment_order.xml index 6cc0f1b7d..2bd5e331b 100644 --- a/odex25_ensan/odex_benefit/views/payment_order.xml +++ b/odex25_ensan/odex_benefit/views/payment_order.xml @@ -63,7 +63,8 @@ - + diff --git a/odex25_ensan/odex_benefit/views/service_request.xml b/odex25_ensan/odex_benefit/views/service_request.xml index 318fc78a9..6db9b3718 100644 --- a/odex25_ensan/odex_benefit/views/service_request.xml +++ b/odex25_ensan/odex_benefit/views/service_request.xml @@ -7,12 +7,17 @@
-
+
+ +
- + attrs="{'invisible':[('payment_order_id','=',False)]}" + groups="odex_benefit.group_benefit_accounting_accept"/> +