diff --git a/odex25_benefit/odex_benefit/i18n/ar_001.po b/odex25_benefit/odex_benefit/i18n/ar_001.po
index 247e92f45..5dd6806b3 100644
--- a/odex25_benefit/odex_benefit/i18n/ar_001.po
+++ b/odex25_benefit/odex_benefit/i18n/ar_001.po
@@ -18644,18 +18644,3 @@ msgid ""
"requests: %s, Current request: %s, Total: %s)"
msgstr "الجهاز '%s': لا يمكنك طلب أكثر من %s وحدة خلال %s %s. (الطلبات السابقة: %s، الطلب الحالي: %s، المجموع: %s)"
-#. module: odex_benefit
-#: code:addons/odex_benefit/models/service_request.py:0
-#, python-format
-msgid ""
-"Cannot create invoice: the following requests have no electrical device lines:\n"
-"%s\n"
-"All selected requests must contain at least one device line."
-msgstr "لا يمكن إنشاء الفاتورة: الطلبات التالية لا تحتوي على أجهزة كهربائية:\n"
-
-#. module: odex_benefit
-#: code:addons/odex_benefit/models/service_request.py:0
-#, python-format
-msgid "No invoice lines could be created."
-msgstr "لم يتم إنشاء أي بنود في الفاتورة."
-
diff --git a/odex25_benefit/odex_benefit/models/service_request.py b/odex25_benefit/odex_benefit/models/service_request.py
index 3bca6d480..ff2b9856c 100644
--- a/odex25_benefit/odex_benefit/models/service_request.py
+++ b/odex25_benefit/odex_benefit/models/service_request.py
@@ -1276,47 +1276,70 @@ class ServiceRequest(models.Model):
"• Not be linked to any invoice"
) % names)
- empty_requests = self.filtered(lambda r: not r.electrical_device_line_ids)
- if empty_requests:
- names = ", ".join(empty_requests.mapped('name'))
- raise UserError(_(
- "Cannot create invoice: the following requests have no electrical device lines:\n%s\n"
- "All selected requests must contain at least one device line."
- ) % names)
for rec in self:
- line_ids = []
- for line in rec.electrical_device_line_ids:
- invoice_line_vals = {
- 'name': rec.name or _('Electrical Device Line'),
- 'product_id': line.product_id.id or False,
- 'account_id': line.device_id.account_id.id or False,
- 'analytic_account_id': (
- rec.family_id.branch_family_id.branch.analytic_account_id.id
- if rec.family_id.branch_family_id
- and rec.family_id.branch_family_id.branch
- and rec.family_id.branch_family_id.branch.analytic_account_id
- else False
- ),
- 'quantity': line.quantity,
- 'price_unit': line.unit_price,
- 'benefit_family_id': rec.family_id.id,
- }
- line_ids.append((0, 0, invoice_line_vals))
-
- if not line_ids:
- raise UserError(_("No invoice lines could be created."))
+ invoice_lines = rec._prepare_invoice_lines()
+ if not invoice_lines:
+ raise UserError(_(
+ "Cannot create invoice for request '%s': No invoice lines could be created."
+ ) % rec.name)
vendor_bill = self.env['account.move'].create({
'move_type': 'in_invoice',
'partner_id': rec.service_producer_id.id,
'partner_shipping_id': rec.family_id.partner_id.id,
'journal_id': validation_setting.journal_id.id,
# 'accountant_id': self.accountant_id.id,
- 'invoice_line_ids': line_ids,
+ 'invoice_line_ids': invoice_lines,
'ref': rec.name or False,
})
rec.vendor_bill = vendor_bill
+ def _prepare_invoice_lines(self):
+ self.ensure_one()
+ line_ids = []
+ if self.service_type == 'electrical_devices':
+ if not self.electrical_device_line_ids:
+ return line_ids
+
+ for line in self.electrical_device_line_ids:
+ line_ids.append((0, 0, {
+ 'name': self.name or _('Electrical Device Line'),
+ 'product_id': line.product_id.id or False,
+ 'account_id': line.device_id.account_id.id or False,
+ 'analytic_account_id': self._get_analytic_account_id(),
+ 'quantity': line.quantity,
+ 'price_unit': line.unit_price,
+ 'benefit_family_id': self.family_id.id,
+ }))
+ else:
+ description_parts = []
+ if self.family_id and self.family_id.name:
+ description_parts.append(self.family_id.name)
+ if self.description:
+ description_parts.append(self.description)
+ if self.name:
+ description_parts.append(self.name)
+
+ line_name = '/'.join(description_parts) if description_parts else _('Service')
+ line_ids.append((0, 0, {
+ 'name': line_name,
+ 'account_id': self.account_id.id or False,
+ 'analytic_account_id': self._get_analytic_account_id(),
+ 'quantity': self.service_qty or 1,
+ 'price_unit': self.requested_service_amount,
+ 'benefit_family_id': self.family_id.id,
+ }))
+
+ return line_ids
+
+ def _get_analytic_account_id(self):
+ self.ensure_one()
+ if (self.family_id.branch_family_id and
+ self.family_id.branch_family_id.branch and
+ self.family_id.branch_family_id.branch.analytic_account_id):
+ return self.family_id.branch_family_id.branch.analytic_account_id.id
+ return False
+
def _get_total_move_lines(self):
for rec in self:
if self.service_cat.payment_method == "payment_order":
diff --git a/odex25_benefit/odex_benefit/security/ir.model.access.csv b/odex25_benefit/odex_benefit/security/ir.model.access.csv
index 11cf3b686..5476cb3d2 100644
--- a/odex25_benefit/odex_benefit/security/ir.model.access.csv
+++ b/odex25_benefit/odex_benefit/security/ir.model.access.csv
@@ -4,6 +4,7 @@ access_benefit_woman_commitee_record,access_benefit_record,model_grant_benefit,o
access_benefit_branch_manager_record,access_benefit_branch_manager_record,model_grant_benefit,odex_benefit.group_benefit_branch_manager,1,1,0,1
access_benefit_manager_record,access_benefit_manager_record,model_grant_benefit,odex_benefit.group_benefit_manager,1,1,1,1
access_benefit_family_services_manager,access_benefit_family_services_manager,model_grant_benefit,odex_benefit.group_family_services_manager,1,1,1,1
+access_benefit_family_services_department_manager,access_benefit_family_services_department_manager,model_grant_benefit,odex_benefit.group_family_services_department_manager,1,1,1,1
access_education_status_all,education_status,model_education_status,odex_benefit.group_benefit_info,1,1,1,1
access_education_status_all_users,education_status_all_users,model_education_status,,1,0,0,0
access_weak_course_all,weak_course,model_weak_course,odex_benefit.group_benefit_info,1,1,1,1
@@ -126,6 +127,8 @@ access_suspend_reason,access_suspend_reason,model_suspend_reason,,1,0,0,0
access_suspend_reason_settings,access_suspend_reason_settings,model_suspend_reason,odex_benefit.group_benefit_settings,1,1,1,1
access_suspend_reason_wizard,access_suspend_reason_wizard,model_suspend_reason_wizard,,1,1,1,1
access_expense_family_services_manager,access_expense_family_services_manager,model_confirm_benefit_expense,odex_benefit.group_family_services_manager,1,1,1,1
+access_expense_family_services_department_manager,access_expense_family_services_department_manager,model_confirm_benefit_expense,odex_benefit.group_family_services_department_manager,1,1,1,1
+
access_expense_benefit_manager,access_expense_benefit_manager,model_confirm_benefit_expense,odex_benefit.group_benefit_manager,1,1,1,1
access_expense_researcher,access_expense_researcher,model_confirm_benefit_expense,odex_benefit.group_benefit_info,1,0,0,0
access_branch_settings,access_branch_settings,model_branch_settings,base.group_user,1,0,0,0
@@ -154,6 +157,7 @@ access_exception_reason,access_exception_reason,model_exception_reason,base.grou
access_exception_reason_settings,access_exception_reason_settings,model_exception_reason,odex_benefit.group_benefit_settings,1,1,1,1
access_service_request,access_service_request,model_service_request,base.group_user,1,1,1,1
access_seasonal_service_family_services_manager,access_seasonal_service_family_services_manager,model_seasonal_service,odex_benefit.group_family_services_manager,1,1,1,1
+access_seasonal_service_family_services_department_manager,access_seasonal_service_family_services_department_manager,model_seasonal_service,odex_benefit.group_family_services_department_manager,1,1,1,1
access_seasonal_service_benefit_manager,access_seasonal_service_benefit_manager,model_seasonal_service,odex_benefit.group_benefit_manager,1,1,1,1
access_seasonal_service_researcher,access_seasonal_service_researcher,model_seasonal_service,odex_benefit.group_benefit_info,1,0,0,0
access_marital_status,access_marital_status,model_marital_status,base.group_user,1,0,0,0
@@ -192,6 +196,7 @@ 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_expense_line_family_services_manager,access_expense_line_family_services_manager,model_benefit_expense_line,odex_benefit.group_family_services_manager,1,1,1,1
+access_expense_line_family_services_department_manager,access_expense_line_family_services_department_manager,model_benefit_expense_line,odex_benefit.group_family_services_department_manager,1,1,1,1
access_expense_line_benefit_manager,access_expense_line_benefit_manager,model_benefit_expense_line,odex_benefit.group_benefit_manager,1,1,1,1
access_expense_researcher,access_expense_researcher,model_benefit_expense_line,odex_benefit.group_benefit_info,1,1,0,0
access_expense_line_payment_accountant_accept,access_expense_line_payment_accountant_accept,model_benefit_expense_line,odex_benefit.group_benefit_payment_accountant_accept,1,1,0,0
diff --git a/odex25_benefit/odex_benefit/security/security_view.xml b/odex25_benefit/odex_benefit/security/security_view.xml
index 6ce2284f4..e4d43313e 100644
--- a/odex25_benefit/odex_benefit/security/security_view.xml
+++ b/odex25_benefit/odex_benefit/security/security_view.xml
@@ -115,6 +115,12 @@
+
+ Family Services Department Manager
+
+
+
+
Services - Legal Department
@@ -138,7 +144,7 @@
Show All Benefits Profiles
[(1, '=', 1)]
-
+
@@ -171,7 +177,7 @@
Show All Visit Location
[(1, '=', 1)]
-
+
@@ -220,7 +226,7 @@
Show All Family Complaints
[(1, '=', 1)]
-
+
@@ -300,7 +306,7 @@
Show All Family Members
[(1, '=', 1)]
-
+
@@ -344,7 +350,7 @@
Show All Bank Return Line
[(1, '=', 1)]
-
+