diff --git a/odex25_benefit/odex_benefit/i18n/ar_001.po b/odex25_benefit/odex_benefit/i18n/ar_001.po
index f1956665a..5e62a85f8 100644
--- a/odex25_benefit/odex_benefit/i18n/ar_001.po
+++ b/odex25_benefit/odex_benefit/i18n/ar_001.po
@@ -10057,6 +10057,7 @@ msgstr "إعادة جدولة"
#. module: odex_benefit
#: model:ir.model.fields,field_description:odex_benefit.field_changes_requests__researcher_ids
+#: model:ir.model.fields,field_description:odex_benefit.field_benefit_expense_line__researcher_id
#: model:ir.model.fields,field_description:odex_benefit.field_family_complaints__researcher_id
#: model:ir.model.fields,field_description:odex_benefit.field_grant_benefit__researcher_id
#: model:ir.model.fields,field_description:odex_benefit.field_service_request__researcher_id
@@ -17365,6 +17366,7 @@ msgid "Third Approve"
msgstr "اعتماد مديرة خدمات المستفيدين الإيقاف"
#. module: odex_benefit
+#: code:addons/odex_benefit/models/seasonal_service.py:0
#: code:addons/odex_benefit/models/family_expense.py:0
#, python-format
msgid "Reason for Return"
@@ -17614,4 +17616,67 @@ msgstr "رقم الجوال"
#: code:addons/odex_benefit/models/benefit_config.py:0
#, python-format
msgid "Please enter a valid Saudi mobile number (example: 05xxxxxxxx)."
-msgstr "رجاءً أدخل رقم جوال سعودي صالح (مثال: 05xxxxxxxx)."
\ No newline at end of file
+msgstr "رجاءً أدخل رقم جوال سعودي صالح (مثال: 05xxxxxxxx)."
+
+#. module: odex_benefit
+#: model:ir.model.fields,field_description:odex_benefit.field_confirm_benefit_expense__has_draft_return_lines
+msgid "Has Draft Return Lines"
+msgstr "هل يحتوي على سطور رجيع مسودة"
+
+#. module: odex_benefit
+#: code:addons/odex_benefit/models/family_expense.py:0
+#, python-format
+msgid "This action is only available for return calculations."
+msgstr "هذا الإجراء متاح فقط لحسابات الرجيع."
+
+#. module: odex_benefit
+#: code:addons/odex_benefit/models/family_expense.py:0
+#, python-format
+msgid "No return lines in draft state to send to specialist."
+msgstr "لا توجد سطور رجيع في حالة المسودة لإرسالها إلى الأخصائي."
+
+#. module: odex_benefit
+#: code:addons/odex_benefit/models/family_expense.py:0
+#, python-format
+msgid ""
+"The following families do not have an assigned researcher:\n"
+"%s\n"
+"\n"
+"Please assign researchers to these families before sending."
+msgstr "الأسر التالية ليس لديها أخصائي:\n"
+"%s\n"
+"\n"
+"يرجى إسناد أخصائيين إلى هذه الأسر قبل الإرسال."
+
+#. module: odex_benefit
+#: model:ir.model.fields,field_description:odex_benefit.field_service_request__researcher_opinion
+msgid "Specialist Opinion"
+msgstr "رأي الأخصائي"
+
+#. module: odex_benefit
+#: code:addons/odex_benefit/models/service_request.py:0
+#, python-format
+msgid "Please write the specialist opinion before completing the action."
+msgstr "يرجى كتابة رأي الأخصائي قبل إكمال الإجراء."
+
+#. module: odex_benefit
+#: model_terms:ir.ui.view,arch_db:odex_benefit.view_confirm_benefit_expense_form
+msgid "Send to Researchers"
+msgstr "إرسال إلى الأخصائيين"
+
+#. module: odex_benefit
+#: model_terms:ir.ui.view,arch_db:odex_benefit.service_request_form
+msgid "Researcher Opinion"
+msgstr "رأي الأخصائي"
+
+#. module: odex_benefit
+#: code:addons/odex_benefit/wizards/reason_for_return_wizard.py:0
+#, python-format
+msgid ""
+"State Changed: %s → Calculated
Returned By: "
+"%s
Reason: %s"
+msgstr "تم تغيير الحالة: %s → تم الحساب
تم الإرجاع بواسطة: "
+"%s
السبب: %s"
+
+
+
diff --git a/odex25_benefit/odex_benefit/models/family_expense.py b/odex25_benefit/odex_benefit/models/family_expense.py
index 9d3d0afb6..e2431ade1 100644
--- a/odex25_benefit/odex_benefit/models/family_expense.py
+++ b/odex25_benefit/odex_benefit/models/family_expense.py
@@ -98,7 +98,7 @@ class ConfirmBenefitExpense(models.Model):
line_domain_ids = fields.Many2many(comodel_name='benefit.expense.line', compute='_compute_domain_ids',
string="Return Line Domain",
)
- has_draft_return_lines = fields.Boolean(string="Has Pending Return Lines",
+ has_draft_return_lines = fields.Boolean(string="Has Draft Return Lines",
compute='_compute_has_draft_return_lines', )
@api.depends('return_expense_line_ids')
@@ -321,10 +321,9 @@ class ConfirmBenefitExpense(models.Model):
rec.family_monthly_othaime = sum(lines.mapped('family_monthly_othaime'))
rec.family_monthly_total = rec.family_monthly_income + rec.family_monthly_meals + rec.family_monthly_clotting
- expense_lines = lines.filtered(lambda l: not l.meal_card)
othaim_lines = lines.filtered('meal_card')
- rec.family_count_expense = len(expense_lines.mapped('family_id'))
- rec.member_count_expense = sum(expense_lines.mapped('benefit_member_count'))
+ rec.family_count_expense = len(lines.mapped('family_id'))
+ rec.member_count_expense = sum(lines.mapped('benefit_member_count'))
rec.family_count_othaim = len(othaim_lines.mapped('family_id'))
rec.member_count_othaim = sum(othaim_lines.mapped('benefit_member_count'))
@@ -352,21 +351,21 @@ class ConfirmBenefitExpense(models.Model):
if not return_lines:
raise UserError(_("No return lines in draft state to send to specialist."))
- lines_without_specialist = self.env['benefit.expense.line']
+ lines_without_researcher = self.env['benefit.expense.line']
for line in return_lines:
family = line.family_id
researcher = family.researcher_id if hasattr(family, 'researcher_id') else False
if not researcher:
- lines_without_specialist |= line
+ lines_without_researcher |= line
continue
line.write({
'researcher_id': researcher.id,
'state': 'waiting_processing'
})
- if lines_without_specialist:
- families_without_specialist = lines_without_specialist.mapped('family_id.name')
+ if lines_without_researcher:
+ families_without_specialist = lines_without_researcher.mapped('family_id.name')
raise UserError(_(
"The following families do not have an assigned researcher:\n%s\n\n"
"Please assign researchers to these families before sending."
diff --git a/odex25_benefit/odex_benefit/models/family_expense_line.py b/odex25_benefit/odex_benefit/models/family_expense_line.py
index 964a71c73..e7254e2de 100644
--- a/odex25_benefit/odex_benefit/models/family_expense_line.py
+++ b/odex25_benefit/odex_benefit/models/family_expense_line.py
@@ -34,7 +34,7 @@ class BenefitExpenseLine(models.Model):
('waiting_processing', 'Waiting Processing'),
('processing_done', 'Processing Done'),
], string="Status", default='draft', tracking=True)
- researcher_id = fields.Many2one("committees.line", string="Researcher")
+ researcher_id = fields.Many2one("committees.line", string="Researcher", tracking=True, copy=False)
@api.depends('family_monthly_income', 'family_monthly_clotting', 'family_monthly_meals')
def _compute_total_family_expenses(self):
diff --git a/odex25_benefit/odex_benefit/models/seasonal_service.py b/odex25_benefit/odex_benefit/models/seasonal_service.py
index c5be0c2b1..f36fdd84b 100644
--- a/odex25_benefit/odex_benefit/models/seasonal_service.py
+++ b/odex25_benefit/odex_benefit/models/seasonal_service.py
@@ -384,11 +384,14 @@ class SeasonalService(models.Model):
rec.state = 'draft'
def action_reset_to_calculated(self):
- for rec in self:
- rec.service_requests_ids.write({'state': 'draft'})
- rec.payment_order_id.unlink()
- rec.vendor_bill.unlink()
- rec.state = 'calculated'
+ self.ensure_one()
+ return {
+ 'name': _('Reason for Return'),
+ 'type': 'ir.actions.act_window',
+ 'res_model': 'reason.for.return.wizard',
+ 'view_mode': 'form',
+ 'target': 'new',
+ }
def action_open_related_move_records(self):
return {
diff --git a/odex25_benefit/odex_benefit/views/family_expense_view.xml b/odex25_benefit/odex_benefit/views/family_expense_view.xml
index 73b33e3db..e9bb6d0f8 100644
--- a/odex25_benefit/odex_benefit/views/family_expense_view.xml
+++ b/odex25_benefit/odex_benefit/views/family_expense_view.xml
@@ -49,7 +49,7 @@
groups="odex_benefit.group_family_services_manager"
type="object" states="draft" class="btn btn-info"/>
-
diff --git a/odex25_benefit/odex_benefit/views/seasonal_service_view.xml b/odex25_benefit/odex_benefit/views/seasonal_service_view.xml
index 8799f2e38..ee70b4a80 100644
--- a/odex25_benefit/odex_benefit/views/seasonal_service_view.xml
+++ b/odex25_benefit/odex_benefit/views/seasonal_service_view.xml
@@ -30,9 +30,9 @@