diff --git a/odex25_ensan/odex_benefit/i18n/ar_001.po b/odex25_ensan/odex_benefit/i18n/ar_001.po index 6a2ecdff3..b97edafed 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,91 @@ 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,field_description:odex_benefit.field_benefit_expense_line__return_calculated +msgid "Return Already Calculated" +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 "سطور الرجيع" \ No newline at end of file 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..3e1c56350 100644 --- a/odex25_ensan/odex_benefit/models/family_expense.py +++ b/odex25_ensan/odex_benefit/models/family_expense.py @@ -88,6 +88,12 @@ 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), ('return_calculated', '=', False)]", ) @api.depends('payment_order_id', 'payment_order_id.state', 'move_id', 'move_id.state') def _compute_payment_move_state(self): @@ -148,6 +154,30 @@ 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 + return_lines.write({'return_calculated': True}) + def action_calculate(self): for rec in self: if rec.state != 'draft': @@ -160,19 +190,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 +214,48 @@ 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), - ('start_date', '<=', rec.end_date), - ('end_date', '>=', rec.start_date), - ]) + if rec.is_return_calculation: + domain = [ + ('is_return', '=', True), + ('return_reason_id', '!=', False), + ('return_calculated', '=', False), + '|', + ('return_confirm_id', '=', False), + ('return_confirm_id', '=', rec.id), + ('start_date', '>=', rec.start_date), + ('end_date', '<=', rec.end_date), + ] + if rec.branch_custom_ids: + domain.append(('branch_id', 'in', rec.branch_custom_ids.ids)) + rec.family_domain_ids = Line.search(domain).mapped('family_id') + else: + # Define base domain for family selection - if conflicting_records: - conflicting_family_ids = conflicting_records.mapped('family_ids').ids - base_domain.append(('id', 'not in', conflicting_family_ids)) + 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), + ]) - rec.family_domain_ids = self.env['grant.benefit'].search(base_domain) + 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) @api.onchange('branch_custom_ids') def _onchange_branch_custom_ids(self): @@ -262,6 +312,7 @@ class ConfirmBenefitExpense(models.Model): self.payment_order_id.unlink() self.move_id.unlink() self.benefit_expense_line_ids.unlink() + self.return_expense_line_ids.write({'return_calculated': False}) self.state = 'draft' def action_open_related_move_records(self): @@ -320,31 +371,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..8ee406463 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,25 @@ 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) + return_calculated = fields.Boolean("Return Already Calculated", default=False, copy=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..9d9254d9a 100644 --- a/odex25_ensan/odex_benefit/models/service_request.py +++ b/odex25_ensan/odex_benefit/models/service_request.py @@ -121,7 +121,12 @@ 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', compute='_compute_payment_order', string='Payment Order', + copy=False, store=True) + 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 +177,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 +226,17 @@ 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_id = rec.payment_order_ids.sorted('payment_order_date', reverse=True)[0] + rec.payment_order_count = len(rec.payment_order_ids) + else: + rec.payment_order_id = False + 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): @@ -241,6 +258,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: @@ -1000,11 +1035,9 @@ class ServiceRequest(models.Model): ) % cat_names) if service_cats.payment_method == "payment_order": + # todo ask about this condition and seasonal services invalid_records = self.filtered( - lambda r: r.state != 'accounting_approve' - or r.payment_order_state != 'none' - or r.payment_order_id - ) + lambda r: r.state != 'accounting_approve') if invalid_records: names = ", ".join(invalid_records.mapped('name')) @@ -1016,12 +1049,16 @@ 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)], + }) + elif service_cats.payment_method == "invoice": invalid_records = self.filtered( lambda r: r.state != 'accounting_approve' @@ -1061,7 +1098,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 +1106,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 +1115,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..6d22fd4f5 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 @@ + @@ -257,11 +259,13 @@ attrs="{'column_invisible': [('parent.cloth_expense', '!=', True)]}"/> + + + attrs="{'invisible': ['|','|',('is_return_calculation', '=', True),('state', '=', 'draft'),('meal_expense', '=', False)]}">
@@ -348,6 +352,27 @@ + + + + + + + + + + + + + + + + +
diff --git a/odex25_ensan/odex_benefit/views/payment_order.xml b/odex25_ensan/odex_benefit/views/payment_order.xml index 2bd5e331b..79fa47dad 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..ce459a2ea 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,23 @@ 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" + + 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 + +
+ + + + + + +
+
+