diff --git a/odex25_ensan/odex_benefit/i18n/ar_001.po b/odex25_ensan/odex_benefit/i18n/ar_001.po index 6a2ecdff3..da85a865e 100644 --- a/odex25_ensan/odex_benefit/i18n/ar_001.po +++ b/odex25_ensan/odex_benefit/i18n/ar_001.po @@ -1140,6 +1140,7 @@ msgstr "نموذج الأنشطة" #: model:ir.model.fields,field_description:odex_benefit.field_services_settings__active #: model:ir.model.fields,field_description:odex_benefit.field_grant_benefit__active #: model:ir.model.fields,field_description:odex_benefit.field_visits_types__active +#: model:ir.model.fields,field_description:odex_benefit.field_return_reason__active msgid "Active" msgstr "نشط" @@ -2741,6 +2742,7 @@ msgstr "بإمكانه النشر " #: model_terms:ir.ui.view,arch_db:odex_benefit.benefit_zkat_form #: model_terms:ir.ui.view,arch_db:odex_benefit.generate_reports_view_form #: model_terms:ir.ui.view,arch_db:odex_benefit.receive_food_basket_form +#: model_terms:ir.ui.view,arch_db:odex_benefit.return_reason_wizard_form #: model_terms:ir.ui.view,arch_db:odex_benefit.view_confirm_benefit_expense_form #: model_terms:ir.ui.view,arch_db:odex_benefit.view_confirm_benefit_expense_search #: model_terms:ir.ui.view,arch_db:odex_benefit.view_family_bank_report_wizard_form @@ -3187,6 +3189,7 @@ msgid "Configuration" msgstr "إعدادات ملف الأسرة" #. module: odex_benefit +#: model_terms:ir.ui.view,arch_db:odex_benefit.return_reason_wizard_form #: model_terms:ir.ui.view,arch_db:odex_benefit.view_confirm_benefit_expense_form #: model_terms:ir.ui.view,arch_db:odex_benefit.view_confirm_benefit_expense_search #: model_terms:ir.ui.view,arch_db:odex_benefit.view_exchange_order_wizard_form @@ -8418,6 +8421,7 @@ msgstr "نهاية الوقت المعين للنشاط" #: model:ir.model.fields,field_description:odex_benefit.field_visit_location__benefit_name #: model:ir.model.fields,field_description:odex_benefit.field_visits_types__name #: model_terms:ir.ui.view,arch_db:odex_benefit.benefits_representative_view_form +#: model:ir.model.fields,field_description:odex_benefit.field_return_reason__name #: model_terms:ir.ui.view,arch_db:odex_benefit.external_benefit_view_form #: model_terms:ir.ui.view,arch_db:odex_benefit.family_member_form #: model_terms:ir.ui.view,arch_db:odex_benefit.grant_benefit_form @@ -14419,6 +14423,11 @@ msgstr "أمر الصرف" msgid "Payment Order" msgstr "أمر الصرف" +#. module: odex_benefit +#: model:ir.model.fields,field_description:odex_benefit.field_service_request__payment_order_count +msgid "Number of Payment Orders" +msgstr "عدد أوامر الصرف" + #. module: odex_benefit #: model_terms:ir.ui.view,arch_db:odex_benefit.seasonal_service_form_view #: model:ir.model.fields,field_description:odex_benefit.field_seasonal_service__benefit_ids @@ -14694,6 +14703,7 @@ msgstr "هل أنت متأكد أنك تريد الإرجاع للاخصائي؟ #. module: odex_benefit #: code:addons/odex_benefit/models/benefit.py:0 #: model:ir.model,name:odex_benefit.model_entity_return_reason_wizard +#: model:ir.model,name:odex_benefit.model_return_reason_wizard #, python-format msgid "Return Reason Wizard" msgstr "سبب الإرجاع" @@ -14701,9 +14711,16 @@ msgstr "سبب الإرجاع" #. module: odex_benefit #: model:ir.model.fields,field_description:odex_benefit.field_entity_return_reason_wizard__suspend_reason_id #: model:ir.model.fields,field_description:odex_benefit.field_suspend_reason__is_return_reason +#: model:ir.model.fields,field_description:odex_benefit.field_return_reason_wizard__return_reason_id msgid "Return Reason" msgstr "سبب الإرجاع" +#. module: odex_benefit +#: model:ir.model.fields,field_description:odex_benefit.field_benefit_expense_line__return_reason_id +#: model:ir.model.fields,field_description:odex_benefit.field_service_request__return_reason_id +msgid "Return Reason" +msgstr "سبب إرجاع البنك" + #. module: odex_benefit #: model_terms:ir.ui.view,arch_db:odex_benefit.view_entity_return_reason_wizard_form msgid "Retrun" @@ -17051,6 +17068,8 @@ msgstr "يرجى اختيار دفتر اليومية قبل إنشاء القي #: model_terms:ir.ui.view,arch_db:odex_benefit.payment_orders_tree #: model_terms:ir.ui.view,arch_db:odex_benefit.view_family_bank_report_wizard_form #: model:ir.model.fields,field_description:odex_benefit.field_family_bank_report_wizard__payment_order_ids +#: model:ir.model.fields,field_description:odex_benefit.field_service_request__payment_order_ids +#: model_terms:ir.ui.view,arch_db:odex_benefit.service_request_form #, python-format msgid "Payment Orders" msgstr "أوامر صرف الخدمات" @@ -17255,3 +17274,92 @@ msgid "" msgstr "" "\n" " الإجمالي" + +#. module: odex_benefit +#: model:ir.ui.menu,name:odex_benefit.menu_accounting_others +msgid "Others" +msgstr "اخرى" + +#. module: odex_benefit +#: model:ir.actions.act_window,name:odex_benefit.return_reason_action +#: model:ir.model,name:odex_benefit.model_return_reason +#: model:ir.ui.menu,name:odex_benefit.menu_return_reason +msgid "Return Reasons" +msgstr "أسباب الإرجاع" + +#. module: odex_benefit +#: model_terms:ir.actions.act_window,help:odex_benefit.return_reason_action +msgid "Create New Return Reason" +msgstr "إنشاء سبب إرجاع جديد" + +#. module: odex_benefit +#: code:addons/odex_benefit/models/family_expense_line.py:0 +#: code:addons/odex_benefit/models/service_request.py:0 +#: model_terms:ir.ui.view,arch_db:odex_benefit.payment_orders_form +#: model_terms:ir.ui.view,arch_db:odex_benefit.return_reason_wizard_form +#, python-format +msgid "Bank Return" +msgstr "رجيع البنك" + +#. module: odex_benefit +#: model:ir.model.fields,field_description:odex_benefit.field_benefit_expense_line__is_return +msgid "Is Returned?" +msgstr "هل هو رجيع؟" + +#. module: odex_benefit +#: model:ir.model.fields,field_description:odex_benefit.field_return_reason_wizard__line_id +msgid "Line ID" +msgstr "رقم" + +#. module: odex_benefit +#: model:ir.model.fields,field_description:odex_benefit.field_return_reason_wizard__line_model +msgid "Line Model" +msgstr "النموذج" + +#. module: odex_benefit +#: model:ir.model.fields.selection,name:odex_benefit.selection__service_request__state__return_to_bank +msgid "Return to Bank" +msgstr "رجيع البنك" + +#. module: odex_benefit +#: model_terms:ir.ui.view,arch_db:odex_benefit.service_request_form +msgid "Processed" +msgstr "تمت المعالجة" + +#. module: odex_benefit +#: model:ir.model.fields,field_description:odex_benefit.field_confirm_benefit_expense__is_return_calculation +msgid "Return Calculation Mode" +msgstr "حساب الرجيع" + +#. module: odex_benefit +#: model:ir.model.fields,field_description:odex_benefit.field_confirm_benefit_expense__return_expense_line_ids +msgid "Selected Return Lines" +msgstr "سطور الرجيع" + +#. module: odex_benefit +#: code:addons/odex_benefit/models/family_expense.py:0 +#, python-format +msgid "Please select at least one return line to calculate." +msgstr "يرجى اختيار سطر رجيع واحد على الأقل للحساب." + +#. module: odex_benefit +#: model:ir.model.fields,field_description:odex_benefit.field_benefit_expense_line__return_confirm_id +msgid "Return Confirm" +msgstr "تأكيد الرجيع" + +#. module: odex_benefit +#: model:ir.model.fields,help:odex_benefit.field_confirm_benefit_expense__is_return_calculation +msgid "" +"Enable to calculate returned amounts instead of regular monthly expense." +msgstr "تمكين لحساب المبالغ المرجعة بدلاً من المصروف الشهري العادي." + +#. module: odex_benefit +#: model_terms:ir.ui.view,arch_db:odex_benefit.view_confirm_benefit_expense_form +msgid "Return Lines" +msgstr "سطور الرجيع" + +#. module: odex_benefit +#: model:ir.model.fields,field_description:odex_benefit.field_confirm_benefit_expense__line_domain_ids +msgid "Return Line Domain" +msgstr "مجال سطر الرجيع" + diff --git a/odex25_ensan/odex_benefit/models/benefit_config.py b/odex25_ensan/odex_benefit/models/benefit_config.py index d134e5353..d8d76ee97 100644 --- a/odex25_ensan/odex_benefit/models/benefit_config.py +++ b/odex25_ensan/odex_benefit/models/benefit_config.py @@ -707,7 +707,7 @@ class SuspendReason(models.Model): _name = 'suspend.reason' _description = "Suspend - Reason" - name = fields.Char(string="Name") + name = fields.Char(string="Name", required=True) is_stop_reason = fields.Boolean(string="Stop Reason",default=False) is_reject_reason = fields.Boolean(string="Reject Reason",default=False) is_return_reason = fields.Boolean(string="Return Reason",default=False) @@ -715,6 +715,13 @@ class SuspendReason(models.Model): is_incomplete_visit_reason = fields.Boolean(string="Incomplete Visit Reason",default=False) active = fields.Boolean(default=True) +class ReturnReason(models.Model): + _name = "return.reason" + _description = "Return Reasons" + + name = fields.Char(string="Name", required=True) + active = fields.Boolean(string="Active", default=True) + class BranchSettings(models.Model): _name = 'branch.settings' _description = "Branch Settings" diff --git a/odex25_ensan/odex_benefit/models/family_expense.py b/odex25_ensan/odex_benefit/models/family_expense.py index bffb50cc2..51ddcc36b 100644 --- a/odex25_ensan/odex_benefit/models/family_expense.py +++ b/odex25_ensan/odex_benefit/models/family_expense.py @@ -88,6 +88,15 @@ class ConfirmBenefitExpense(models.Model): member_count_othaim = fields.Integer(string="Member Count (Othaim)", compute='_get_family_monthly_values', store=True, ) + is_return_calculation = fields.Boolean(string="Return Calculation Mode", default=False, + help="Enable to calculate returned amounts instead of regular monthly expense." + ) + return_expense_line_ids = fields.One2many(comodel_name='benefit.expense.line', inverse_name='return_confirm_id', + string="Selected Return Lines", + domain="[('is_return', '=', True)]", ) + line_domain_ids = fields.Many2many(comodel_name='benefit.expense.line', compute='_compute_domain_ids', + string="Return Line Domain", + ) @api.depends('payment_order_id', 'payment_order_id.state', 'move_id', 'move_id.state') def _compute_payment_move_state(self): @@ -148,6 +157,29 @@ class ConfirmBenefitExpense(models.Model): } line.write(vals) + def _calculate_return_lines(self): + self.ensure_one() + return_lines = self.return_expense_line_ids + if not return_lines: + raise UserError(_("Please select at least one return line to calculate.")) + + lines = [] + for line in return_lines: + lines.append((0, 0, { + 'family_id': line.family_id.id, + 'branch_id': line.branch_id.id, + 'family_category_id': line.family_category_id.id, + 'meal_card': line.meal_card, + 'benefit_member_count': line.benefit_member_count, + 'start_date': self.start_date, + 'end_date': self.end_date, + 'family_monthly_income': line.family_monthly_income, + 'family_monthly_meals': line.family_monthly_meals, + 'family_monthly_clotting': line.family_monthly_clotting, + 'family_monthly_othaime': 0, + })) + self.benefit_expense_line_ids = lines + def action_calculate(self): for rec in self: if rec.state != 'draft': @@ -160,19 +192,22 @@ class ConfirmBenefitExpense(models.Model): if not rec.cash_expense and not rec.meal_expense and not rec.cloth_expense: raise UserError(_("At least one expense type should be selected.")) - rec.benefit_expense_line_ids.unlink() - lines = [] - for fam in families: - vals = { - 'confirm_expense_id': rec.id, - 'family_id': fam.id, - 'start_date': rec.start_date, - 'end_date': rec.end_date, - } - lines.append((0, 0, vals)) + if rec.is_return_calculation: + rec._calculate_return_lines() + else: + rec.benefit_expense_line_ids.unlink() + lines = [] + for fam in families: + vals = { + 'confirm_expense_id': rec.id, + 'family_id': fam.id, + 'start_date': rec.start_date, + 'end_date': rec.end_date, + } + lines.append((0, 0, vals)) - rec.write({'benefit_expense_line_ids': lines}) - rec._update_benefit_expense_lines() + rec.write({'benefit_expense_line_ids': lines}) + rec._update_benefit_expense_lines() rec.state = 'calculated' def action_recalculate(self): @@ -181,31 +216,49 @@ class ConfirmBenefitExpense(models.Model): raise UserError(_("You can only recalculate when status is 'Calculated'.")) rec._update_benefit_expense_lines() - @api.depends('branch_custom_ids', 'start_date', 'end_date') + @api.depends('is_return_calculation', 'branch_custom_ids', 'start_date', 'end_date') def _compute_domain_ids(self): for rec in self: - # Define base domain for family selection + Line = self.env['benefit.expense.line'] validation_setting = self.env["family.validation.setting"].search([], limit=1) - base_domain = ['|', ('state', '=', 'second_approve'), '&', - ('state', 'in', ('waiting_approve', 'first_approve')), ('action_type', '=', 'suspended')] - if rec.branch_custom_ids: - base_domain.append(('branch_custom_id', 'in', rec.branch_custom_ids.ids)) - min_income = validation_setting.benefit_category_ids.mapped('mini_income_amount') - max_income = validation_setting.benefit_category_ids.mapped('max_income_amount') - base_domain.extend([('member_income', '>=', min(min_income)), ('member_income', '<=', max(max_income))]) - base_domain.extend([('benefit_category_id', '!=', False)]) - if rec.start_date and rec.end_date: - conflicting_records = self.search([ - ('id', '!=', rec._origin.id), + if rec.is_return_calculation: + domain = [ ('start_date', '<=', rec.end_date), ('end_date', '>=', rec.start_date), - ]) + ('is_return', '=', True), + ('return_reason_id', '!=', False), + ('return_confirm_id', '=', False), + ] + if rec.branch_custom_ids: + domain.append(('branch_id', 'in', rec.branch_custom_ids.ids)) - if conflicting_records: - conflicting_family_ids = conflicting_records.mapped('family_ids').ids - base_domain.append(('id', 'not in', conflicting_family_ids)) + return_lines = Line.search(domain) + rec.line_domain_ids = return_lines + rec.family_domain_ids = return_lines.mapped('family_id') + else: + # Define base domain for family selection - rec.family_domain_ids = self.env['grant.benefit'].search(base_domain) + base_domain = ['|', ('state', '=', 'second_approve'), '&', + ('state', 'in', ('waiting_approve', 'first_approve')), ('action_type', '=', 'suspended')] + if rec.branch_custom_ids: + base_domain.append(('branch_custom_id', 'in', rec.branch_custom_ids.ids)) + min_income = validation_setting.benefit_category_ids.mapped('mini_income_amount') + max_income = validation_setting.benefit_category_ids.mapped('max_income_amount') + base_domain.extend([('member_income', '>=', min(min_income)), ('member_income', '<=', max(max_income))]) + base_domain.extend([('benefit_category_id', '!=', False)]) + if rec.start_date and rec.end_date: + conflicting_records = self.search([ + ('id', '!=', rec._origin.id), + ('start_date', '<=', rec.end_date), + ('end_date', '>=', rec.start_date), + ]) + + if conflicting_records: + conflicting_family_ids = conflicting_records.mapped('family_ids').ids + base_domain.append(('id', 'not in', conflicting_family_ids)) + + rec.family_domain_ids = self.env['grant.benefit'].search(base_domain) + rec.line_domain_ids = self.env['benefit.expense.line'].browse([]) @api.onchange('branch_custom_ids') def _onchange_branch_custom_ids(self): @@ -320,31 +373,32 @@ class ConfirmBenefitExpense(models.Model): }) rec.payment_order_id = payment_order - # Create Vendor Bill for Meal Card Invoice(othaime) - account_id = validation_setting.meal_expense_account_id - invoice_lines = [] - for line in lines.filtered(lambda l: l.meal_card): - family = line.family_id - invoice_lines.append((0, 0, { - 'name': f'{family.name}/{family.code}', - 'account_id': account_id.id, - 'quantity': 1, - 'benefit_family_id': family.id, - 'price_unit': line.family_monthly_othaime, - 'analytic_account_id': family.branch_family_id.branch.analytic_account_id.id - })) - invoice_vals = { - 'move_type': 'in_invoice', - 'partner_id': validation_setting.meal_partner_id.id, - 'invoice_date': rec.date, - 'family_confirm_id': rec.id, - 'benefit_family_ids': [(6, 0, rec.benefit_expense_line_ids.mapped('family_id').ids)], - 'journal_id': validation_setting.journal_id.id, - 'invoice_line_ids': invoice_lines, - 'ref': rec.name, - } + if not rec.is_return_calculation: + # Create Vendor Bill for Meal Card Invoice(othaime) + account_id = validation_setting.meal_expense_account_id + invoice_lines = [] + for line in lines.filtered(lambda l: l.meal_card): + family = line.family_id + invoice_lines.append((0, 0, { + 'name': f'{family.name}/{family.code}', + 'account_id': account_id.id, + 'quantity': 1, + 'benefit_family_id': family.id, + 'price_unit': line.family_monthly_othaime, + 'analytic_account_id': family.branch_family_id.branch.analytic_account_id.id + })) + invoice_vals = { + 'move_type': 'in_invoice', + 'partner_id': validation_setting.meal_partner_id.id, + 'invoice_date': rec.date, + 'family_confirm_id': rec.id, + 'benefit_family_ids': [(6, 0, rec.benefit_expense_line_ids.mapped('family_id').ids)], + 'journal_id': validation_setting.journal_id.id, + 'invoice_line_ids': invoice_lines, + 'ref': rec.name, + } - invoice = self.env['account.move'].create(invoice_vals) - rec.move_id = invoice + invoice = self.env['account.move'].create(invoice_vals) + rec.move_id = invoice return True diff --git a/odex25_ensan/odex_benefit/models/family_expense_line.py b/odex25_ensan/odex_benefit/models/family_expense_line.py index fb0d28df1..2c533b0f3 100644 --- a/odex25_ensan/odex_benefit/models/family_expense_line.py +++ b/odex25_ensan/odex_benefit/models/family_expense_line.py @@ -12,6 +12,7 @@ class BenefitExpenseLine(models.Model): confirm_expense_id = fields.Many2one(comodel_name='confirm.benefit.expense', string='Confirm Benefit Expense', ondelete='cascade') + return_confirm_id = fields.Many2one('confirm.benefit.expense', string="Return Confirm", ondelete="set null", ) family_id = fields.Many2one(comodel_name='grant.benefit', string='Family', required=True) branch_id = fields.Many2one(comodel_name='branch.settings', string='Branch') family_category_id = fields.Many2one(comodel_name='benefit.category', string='Family Category') @@ -25,8 +26,24 @@ class BenefitExpenseLine(models.Model): start_date = fields.Date(string='Start Date', ) end_date = fields.Date(string='End Date', ) payment_order_id = fields.Many2one('payment.orders', string='Payment Order', ondelete="set null", copy=False) + return_reason_id = fields.Many2one("return.reason", string="Return Reason") + is_return = fields.Boolean(string="Is Returned?", default=False) @api.depends('family_monthly_income', 'family_monthly_clotting', 'family_monthly_meals') def _compute_total_family_expenses(self): for rec in self: rec.total_family_expenses = rec.family_monthly_income + rec.family_monthly_meals + rec.family_monthly_clotting + + def action_return_bank(self): + self.ensure_one() + return { + 'name': _("Bank Return"), + 'type': 'ir.actions.act_window', + 'res_model': 'return.reason.wizard', + 'view_mode': 'form', + 'target': 'new', + 'context': { + 'default_line_id': self.id, + 'default_line_model': 'benefit.expense.line', + } + } diff --git a/odex25_ensan/odex_benefit/models/payment_order.py b/odex25_ensan/odex_benefit/models/payment_order.py index 50d73013c..ee02c51cf 100644 --- a/odex25_ensan/odex_benefit/models/payment_order.py +++ b/odex25_ensan/odex_benefit/models/payment_order.py @@ -1,6 +1,6 @@ from odoo import fields, models, api, _ from stdnum.au.acn import to_abn -from odoo.exceptions import ValidationError,UserError +from odoo.exceptions import ValidationError, UserError class PaymentOrders(models.Model): @@ -22,7 +22,10 @@ class PaymentOrders(models.Model): compute='_compute_service_type_id', inverse='_inverse_service_type_id', store=True) - service_requests_ids = fields.One2many('service.request', 'payment_order_id', string='Service Requests') + service_requests_ids = fields.Many2many(comodel_name='service.request', + relation='service_request_payment_order_rel', + column1='payment_order_id', column2='service_request_id', + string='Service Requests', ) benefit_expense_line_ids = fields.One2many('benefit.expense.line', 'payment_order_id', string='Benefit Expense Lines') seasonal_requests_ids = fields.One2many('seasonal.service', 'payment_order_id', string='Seasonal Requests') @@ -78,7 +81,6 @@ 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.")) @@ -233,7 +235,7 @@ class PaymentOrders(models.Model): 'credit': 0.0, } ) - total_credit += request.aid_amount + total_credit += request.requested_service_amount elif self.type == 'benefit_expense': validation_setting = self.env["family.validation.setting"].search([], limit=1) for line in self.benefit_expense_line_ids: diff --git a/odex25_ensan/odex_benefit/models/service_request.py b/odex25_ensan/odex_benefit/models/service_request.py index b5e618822..3c3b406f4 100644 --- a/odex25_ensan/odex_benefit/models/service_request.py +++ b/odex25_ensan/odex_benefit/models/service_request.py @@ -121,7 +121,11 @@ class ServiceRequest(models.Model): # maintenance_items_id = fields.Many2one('home.maintenance.lines', string="Maintenance Items") maintenance_items_ids = fields.One2many('home.maintenance.items', 'service_request_id', string="Maintenance Items", ) - payment_order_id = fields.Many2one('payment.orders', string='Payment Order', ondelete="set null", copy=False) + payment_order_ids = fields.Many2many(comodel_name='payment.orders', relation='service_request_payment_order_rel', + column1='service_request_id', + column2='payment_order_id', string='Payment Orders', copy=False, ) + payment_order_id = fields.Many2one('payment.orders', string='Payment Order', copy=False) + payment_order_count = fields.Integer(compute='_compute_payment_order', string='Number of Payment Orders') is_payment_order_done = fields.Boolean(string='Is Payment Order Done?') aid_amount = fields.Float(string='Aid Amount', compute='_get_aid_amount') # Fields for alternative house @@ -172,6 +176,7 @@ class ServiceRequest(models.Model): ('projects_department', 'Waiting Projects Department'), ('gm_assistant', 'Waiting Assistant General Manager'), ('accounting_approve', 'Accounting Approve'), + ('return_to_bank', 'Return to Bank'), ('approval_of_beneficiary_services', 'Approval of beneficiary services'), ('send_request_to_supplier', 'Send Request To Supplier'), ('family_received_device', 'Family Received Device'), @@ -220,6 +225,15 @@ class ServiceRequest(models.Model): ('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') + return_reason_id = fields.Many2one("return.reason", string="Return Reason") + + @api.depends('payment_order_ids') + def _compute_payment_order(self): + for rec in self: + if rec.payment_order_ids: + rec.payment_order_count = len(rec.payment_order_ids) + else: + rec.payment_order_count = 0 @api.depends('payment_order_id', 'payment_order_id.state', 'vendor_bill', 'vendor_bill.state') def _compute_payment_order_state(self): @@ -229,7 +243,8 @@ class ServiceRequest(models.Model): if rec.payment_order_id.state == "done": payment_order_state = "done" rec.service_approval_date = fields.Datetime.now() - rec.state = 'send_request_to_supplier' + if rec.state == 'accounting_approve': + rec.state = 'send_request_to_supplier' rec.is_payment_order_done = True else: payment_order_state = "waiting" @@ -241,6 +256,24 @@ class ServiceRequest(models.Model): payment_order_state = "waiting" rec.payment_order_state = payment_order_state + def action_return_bank(self): + self.ensure_one() + return { + 'name': _("Bank Return"), + 'type': 'ir.actions.act_window', + 'res_model': 'return.reason.wizard', + 'view_mode': 'form', + 'target': 'new', + 'context': { + 'default_line_id': self.id, + 'default_line_model': 'service.request', + } + } + + def action_processed(self): + for record in self: + record.state = 'accounting_approve' + @api.depends('requested_service_amount', 'service_max_amount') def _get_money_for_payment_is_appearance(self): for rec in self: @@ -1016,12 +1049,17 @@ class ServiceRequest(models.Model): "• Not be linked to any payment order" ) % names) - self.env['payment.orders'].create({ + payment_order = self.env['payment.orders'].create({ 'state': 'draft', 'accountant_id': service_cats.accountant_id.id, 'service_requests_ids': [(6, 0, self.ids)], 'type': 'services', }) + self.write({ + 'payment_order_ids': [(4, payment_order.id)], + 'payment_order_id': payment_order.id, + }) + elif service_cats.payment_method == "invoice": invalid_records = self.filtered( lambda r: r.state != 'accounting_approve' @@ -1061,7 +1099,7 @@ class ServiceRequest(models.Model): 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 + moves = rec.payment_order_ids.mapped('move_id') elif self.service_cat.payment_method == "invoice": moves = self.vendor_bill @@ -1069,7 +1107,7 @@ class ServiceRequest(models.Model): def action_open_related_move_records(self): if self.service_cat.payment_method == "payment_order": - moves = self.payment_order_id.move_id.ids + moves = self.payment_order_ids.mapped('move_id') elif self.service_cat.payment_method == "invoice": moves = self.vendor_bill.ids @@ -1078,5 +1116,19 @@ class ServiceRequest(models.Model): 'type': 'ir.actions.act_window', 'res_model': 'account.move', 'view_mode': 'tree,form', - 'domain': [('id', 'in', moves)], + 'domain': [('id', 'in', moves.ids)], + } + + def action_open_payment_orders(self): + self.ensure_one() + if not self.payment_order_ids: + raise UserError(_("No payment orders are linked to this request.")) + + return { + 'name': _('Payment Orders'), + 'type': 'ir.actions.act_window', + 'res_model': 'payment.orders', + 'view_mode': 'tree,form', + 'domain': [('id', 'in', self.payment_order_ids.ids)], + 'context': {'create': False}, } diff --git a/odex25_ensan/odex_benefit/security/ir.model.access.csv b/odex25_ensan/odex_benefit/security/ir.model.access.csv index 2f7af5c5b..d055990d6 100644 --- a/odex25_ensan/odex_benefit/security/ir.model.access.csv +++ b/odex25_ensan/odex_benefit/security/ir.model.access.csv @@ -167,4 +167,6 @@ access_survey_user_input_line_group_benefit_info,survey.user_input.line.group_be access_grant_benefit_account_move_line,access_grant_benefit_account_move_line,model_account_move_line,odex_benefit.group_benefit_info,1,0,0,0 access_grant_benefit_account_move,access_grant_benefit_account_move,model_account_move,odex_benefit.group_benefit_info,1,0,0,0 access_benefit_expense_line,access_benefit_expense_line,model_benefit_expense_line,base.group_user,1,1,1,1 -access_family_bank_report_wizard,access_family_bank_report_wizard,model_family_bank_report_wizard,base.group_user,1,1,1,1 \ No newline at end of file +access_family_bank_report_wizard,access_family_bank_report_wizard,model_family_bank_report_wizard,base.group_user,1,1,1,1 +access_return_reason,access_return_reason,model_return_reason,base.group_user,1,1,1,1 +access_return_reason_wizard,access_return_reason_wizard,model_return_reason_wizard,base.group_user,1,1,1,1 \ No newline at end of file diff --git a/odex25_ensan/odex_benefit/views/actions_and_menus.xml b/odex25_ensan/odex_benefit/views/actions_and_menus.xml index 143271655..391a2d059 100644 --- a/odex25_ensan/odex_benefit/views/actions_and_menus.xml +++ b/odex25_ensan/odex_benefit/views/actions_and_menus.xml @@ -295,6 +295,15 @@

+ + Return Reasons + return.reason + tree,form + +

Create New Return Reason +

+
+
The Domestic Labor domestic.labor @@ -1048,48 +1057,16 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + diff --git a/odex25_ensan/odex_benefit/views/benefit_config_view.xml b/odex25_ensan/odex_benefit/views/benefit_config_view.xml index c725bd792..b79270e4e 100644 --- a/odex25_ensan/odex_benefit/views/benefit_config_view.xml +++ b/odex25_ensan/odex_benefit/views/benefit_config_view.xml @@ -1417,5 +1417,30 @@ + + + return.reason.form.view + return.reason + +
+ +
+

+ +

+
+
+
+
+
+ + return.reason.tree.view + return.reason + + + + + + diff --git a/odex25_ensan/odex_benefit/views/family_expense_line_view.xml b/odex25_ensan/odex_benefit/views/family_expense_line_view.xml index 1e2a0051e..c800ec7b1 100644 --- a/odex25_ensan/odex_benefit/views/family_expense_line_view.xml +++ b/odex25_ensan/odex_benefit/views/family_expense_line_view.xml @@ -18,6 +18,8 @@ + + @@ -38,6 +40,8 @@ + + diff --git a/odex25_ensan/odex_benefit/views/family_expense_view.xml b/odex25_ensan/odex_benefit/views/family_expense_view.xml index be9a0a598..87a566fd8 100644 --- a/odex25_ensan/odex_benefit/views/family_expense_view.xml +++ b/odex25_ensan/odex_benefit/views/family_expense_view.xml @@ -121,6 +121,8 @@ + @@ -138,6 +140,7 @@ + @@ -257,11 +260,13 @@ attrs="{'column_invisible': [('parent.cloth_expense', '!=', True)]}"/> + + + attrs="{'invisible': ['|','|',('is_return_calculation', '=', True),('state', '=', 'draft'),('meal_expense', '=', False)]}">
@@ -348,6 +353,27 @@ + + + + + + + + + + + + + + + + +
diff --git a/odex25_ensan/odex_benefit/views/payment_order.xml b/odex25_ensan/odex_benefit/views/payment_order.xml index 2bd5e331b..0c64a0390 100644 --- a/odex25_ensan/odex_benefit/views/payment_order.xml +++ b/odex25_ensan/odex_benefit/views/payment_order.xml @@ -80,8 +80,7 @@ - + @@ -98,6 +97,13 @@ decoration-danger="state in ['refused']" decoration-info="state in ['first_approve','waiting_approve']" decoration-warning="state in ['researcher']"/> + +
+ + diff --git a/odex25_ensan/odex_benefit/wizards/reason_for_return_wizard.py b/odex25_ensan/odex_benefit/wizards/reason_for_return_wizard.py index 660e1d546..ab309f447 100644 --- a/odex25_ensan/odex_benefit/wizards/reason_for_return_wizard.py +++ b/odex25_ensan/odex_benefit/wizards/reason_for_return_wizard.py @@ -14,3 +14,24 @@ class ReasonForReturnWizard(models.TransientModel): 'return_reason': record.reason, 'state': 'researcher', }) + +class ReturnReasonWizard(models.TransientModel): + _name = "return.reason.wizard" + _description = "Return Reason Wizard" + + line_id = fields.Integer("Line ID") + line_model = fields.Char("Line Model") + return_reason_id = fields.Many2one("return.reason", string="Return Reason", required=True) + + def action_confirm(self): + self.ensure_one() + + record = self.env[self.line_model].browse(self.line_id) + record.return_reason_id = self.return_reason_id.id + if hasattr(record, "is_return"): + record.is_return = True + if self.line_model == "service.request" and hasattr(record, "state"): + record.state = "return_to_bank" + record.payment_order_id = False + + return {'type': 'ir.actions.act_window_close'} \ No newline at end of file diff --git a/odex25_ensan/odex_benefit/wizards/reason_for_return_wizard.xml b/odex25_ensan/odex_benefit/wizards/reason_for_return_wizard.xml index fd4fc9ebd..d90560c25 100644 --- a/odex25_ensan/odex_benefit/wizards/reason_for_return_wizard.xml +++ b/odex25_ensan/odex_benefit/wizards/reason_for_return_wizard.xml @@ -14,4 +14,21 @@ + + return.reason.wizard.form + return.reason.wizard + +
+ + + + + +
+
+
+
+
diff --git a/odex25_ensan/odex_takaful/i18n/ar_001.po b/odex25_ensan/odex_takaful/i18n/ar_001.po index 41ac53d32..3582cee76 100644 --- a/odex25_ensan/odex_takaful/i18n/ar_001.po +++ b/odex25_ensan/odex_takaful/i18n/ar_001.po @@ -243,6 +243,11 @@ msgstr "تاريخ الدفع:" msgid "Payment Method:" msgstr "طريقة الدفع:" +#. module: enasan_geidea_sponsorship +#: model_terms:ir.ui.view,arch_db:enasan_geidea_sponsorship.view_account_payment_register_form_geidea +msgid "Process on Terminal" +msgstr "الدفع على المنصة" + #. module: odex_takaful #: model_terms:ir.ui.view,arch_db:odex_takaful.report_transfer_deduction_document msgid "Payment Method" diff --git a/odex25_ensan/odex_takaful/models/donation_details_lines.py b/odex25_ensan/odex_takaful/models/donation_details_lines.py index 87527145b..4c4410522 100644 --- a/odex25_ensan/odex_takaful/models/donation_details_lines.py +++ b/odex25_ensan/odex_takaful/models/donation_details_lines.py @@ -99,6 +99,34 @@ class DonationsDetailsLines(models.Model): journal_id = fields.Many2one('account.journal', string="Journal",domain="[('type','=','bank')]",default=_default_journal_id) benefit_status = fields.Selection(related='benefit_id.member_status') ages = fields.Integer(compute='_compute_get_age_range' , store=True) + waiting_date = fields.Date( + string="تاريخ الانتظار", + compute="_compute_dates", + store=True + ) + + replace_date = fields.Date( + string="تاريخ الاستبدال", + compute="_compute_dates", + store=True + ) + + @api.depends('state') + def _compute_dates(self): + """Automatically set waiting_date or replace_date based on state.""" + for rec in self: + if rec.state == 'waiting': + print(date.today()) + rec.waiting_date = date.today() + rec.replace_date = False + elif rec.state == 'replace': + rec.replace_date = date.today() + rec.waiting_date = False + else: + rec.waiting_date = False + rec.replace_date = False + + # cheque_number = fields.Integer(string="Cheque Number") # cheque_due_date = fields.Date(string="Cheque Due Date") # cheque_file_attachment = fields.Binary(string='Cheque Attachment', attachment=True) @@ -881,6 +909,20 @@ class DonationsDetailsLines(models.Model): if sponsorship and len(sponsorship) == 1: message = _("Benefit IDs changed in a donation item:
%s") % "
".join(changes) sponsorship.message_post(body=message) + + # if 'state' in vals: + # print('In Vals') + # print("vals['state'] >>> " , vals['state']) + # if vals['state'] == 'waiting': + # vals['waiting_date'] = date.today() + # print("vals['waiting_date'] >>> " , vals['waiting_date']) + # vals['replace_date'] = False + # elif vals['state'] == 'replace': + # vals['replace_date'] = date.today() + # vals['waiting_date'] = False + # else: + # vals['waiting_date'] = False + # vals['replace_date'] = False self.onset_benefit_id() return res diff --git a/odex25_ensan/odex_takaful/models/res_partner.py b/odex25_ensan/odex_takaful/models/res_partner.py index dddf7dc1a..4167b994d 100644 --- a/odex25_ensan/odex_takaful/models/res_partner.py +++ b/odex25_ensan/odex_takaful/models/res_partner.py @@ -281,6 +281,14 @@ class ResPartner(models.Model): if 'mobile' in vals: self._check_phone_numbers(vals['mobile']) vals['mobile'] = self.phone_format(vals['mobile']) + if 'name' in vals : + if self.kafel_id: + self.kafel_id.name = vals['name'] + + if 'mobile' in vals : + if self.kafel_id: + self.kafel_id.login = vals['mobile'] + res = super(ResPartner, self).write(vals) return res diff --git a/odex25_ensan/odex_takaful/views/donations_details_lines.xml b/odex25_ensan/odex_takaful/views/donations_details_lines.xml index 5582f6347..1268e2518 100644 --- a/odex25_ensan/odex_takaful/views/donations_details_lines.xml +++ b/odex25_ensan/odex_takaful/views/donations_details_lines.xml @@ -61,11 +61,12 @@ donations.details.lines.view.tree donations.details.lines - + + @@ -84,6 +85,8 @@ + + + @@ -362,16 +366,18 @@ Donations Details Lines waiting donations.details.lines tree,form + [('state', '=', 'waiting')] - {'create': False, 'delete': False, 'search_default_filter_waiting': 1} + {'create': False, 'delete': False} Donations Details Lines Replacement donations.details.lines tree,form + [('state', '=', 'replace')] - {'create': False, 'delete': False, 'search_default_filter_replace': 1} + {'create': False, 'delete': False} diff --git a/odex25_ensan/odex_takaful/views/takaful_menus_actions.xml b/odex25_ensan/odex_takaful/views/takaful_menus_actions.xml index 79ff0230d..705849407 100644 --- a/odex25_ensan/odex_takaful/views/takaful_menus_actions.xml +++ b/odex25_ensan/odex_takaful/views/takaful_menus_actions.xml @@ -13,11 +13,13 @@ - - + name="Donations Details Lines To Replace Benefit" action="donations_details_lines_replace_action" sequence="3"/> + + + + @@ -27,7 +29,7 @@ - - \ No newline at end of file + diff --git a/odex25_ensan/odex_takaful/views/takaful_sponorship_view.xml b/odex25_ensan/odex_takaful/views/takaful_sponorship_view.xml index 56a65fc41..0a48459e1 100644 --- a/odex25_ensan/odex_takaful/views/takaful_sponorship_view.xml +++ b/odex25_ensan/odex_takaful/views/takaful_sponorship_view.xml @@ -514,6 +514,7 @@ + + - + diff --git a/odex25_ensan/odex_takaful/wizards/account_payment_register.py b/odex25_ensan/odex_takaful/wizards/account_payment_register.py index ec09ec848..f3dab7a0f 100644 --- a/odex25_ensan/odex_takaful/wizards/account_payment_register.py +++ b/odex25_ensan/odex_takaful/wizards/account_payment_register.py @@ -30,11 +30,17 @@ class AccountRegisterPayment(models.TransientModel): transaction_file_attachment = fields.Binary(string='Transaction Attachment', attachment=False) transaction_attachment_file_name = fields.Char('Transaction File Name', required=False) payment_method = fields.Selection(selection=[("cash", "Cash"), ("bank", "Bank Transfer"), ("check", "Check")], string="Payment Method", required=True, default="cash") - + machine_id = fields.Many2one('geidea.terminals' , 'الماكينة') check_number = fields.Char(string='Check Number') check_due_date = fields.Date(string='Check Due Date') sponsorship_payment = fields.Boolean(string='Sponsorship Payment', default=False) + + @api.onchange("machine_id") + def onchange_machine_id(self): + for rec in self: + if rec.machine_id: + rec.journal_id = rec.machine_id.journal_id @api.onchange("takaful_payment_method_id") def onchange_takaful_payment_method_id(self): for rec in self: @@ -48,6 +54,7 @@ class AccountRegisterPayment(models.TransientModel): j_type = "bank" if j_type: return {"domain": {"journal_id": [("type", "=", j_type)]}} + @api.depends('source_amount', 'source_amount_currency', 'source_currency_id', 'company_id', 'currency_id', 'payment_date') def _compute_amount(self): @@ -66,6 +73,7 @@ class AccountRegisterPayment(models.TransientModel): rec.takaful_payment_method = "bank" else: rec.takaful_payment_method = "cash" + def _create_payments(self): sponsorship_line_ids = self.env.context.get('sponsorship_line_ids') diff --git a/odex25_ensan/odex_takaful/wizards/account_payment_register.xml b/odex25_ensan/odex_takaful/wizards/account_payment_register.xml index 8b838ea26..1c8d4870a 100644 --- a/odex25_ensan/odex_takaful/wizards/account_payment_register.xml +++ b/odex25_ensan/odex_takaful/wizards/account_payment_register.xml @@ -51,6 +51,71 @@ attrs="{'invisible': ['|', ('sponsorship_payment', '=', False), ('takaful_payment_method','not in',['bank', 'check'])], 'required': [('sponsorship_payment', '=', True), ('takaful_payment_method','=','bank')]}"/> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +