Merge pull request #5795 from expsa/kjh

[IMP] odex_benefit: IMP benefit
This commit is contained in:
kchyounes19 2025-12-23 14:43:08 +01:00 committed by GitHub
commit a04a9ec11b
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
4 changed files with 61 additions and 58 deletions

View File

@ -5050,7 +5050,6 @@ msgstr ""
#: model:ir.actions.act_window,name:odex_benefit.expenses_type_action #: model:ir.actions.act_window,name:odex_benefit.expenses_type_action
#: model:ir.model.fields,field_description:odex_benefit.field_benefit_expenses__expenses_type #: model:ir.model.fields,field_description:odex_benefit.field_benefit_expenses__expenses_type
#: model:ir.model.fields,field_description:odex_benefit.field_expenses_line__expenses_type #: model:ir.model.fields,field_description:odex_benefit.field_expenses_line__expenses_type
#: model:ir.ui.menu,name:odex_benefit.expenses_type_menu
msgid "Expenses Type" msgid "Expenses Type"
msgstr "أنواع الالتزامات" msgstr "أنواع الالتزامات"
@ -6563,7 +6562,6 @@ msgstr "ملفات الدخل المطلوبة"
#: model:ir.actions.act_window,name:odex_benefit.income_type_action #: model:ir.actions.act_window,name:odex_benefit.income_type_action
#: model:ir.model,name:odex_benefit.model_income_type #: model:ir.model,name:odex_benefit.model_income_type
#: model:ir.model.fields,field_description:odex_benefit.field_salary_line__income_type #: model:ir.model.fields,field_description:odex_benefit.field_salary_line__income_type
#: model:ir.ui.menu,name:odex_benefit.income_type_menu
msgid "Income Type" msgid "Income Type"
msgstr "نوع الدخل" msgstr "نوع الدخل"
@ -7953,7 +7951,6 @@ msgstr "متوسط دخل الفرد"
#: model:ir.actions.act_window,name:odex_benefit.member_location_action #: model:ir.actions.act_window,name:odex_benefit.member_location_action
#: model:ir.model.fields,field_description:odex_benefit.field_family_member__member_location #: model:ir.model.fields,field_description:odex_benefit.field_family_member__member_location
#: model:ir.model.fields,field_description:odex_benefit.field_family_member__member_location_conf #: model:ir.model.fields,field_description:odex_benefit.field_family_member__member_location_conf
#: model:ir.ui.menu,name:odex_benefit.menu_member_location
#: model_terms:ir.ui.view,arch_db:odex_benefit.member_location_form #: model_terms:ir.ui.view,arch_db:odex_benefit.member_location_form
#: model_terms:ir.ui.view,arch_db:odex_benefit.member_location_tree #: model_terms:ir.ui.view,arch_db:odex_benefit.member_location_tree
msgid "Member Location" msgid "Member Location"
@ -12537,11 +12534,15 @@ msgid "benefit.zkat.line"
msgstr "" msgstr ""
#. module: odex_benefit #. module: odex_benefit
#: model:ir.ui.menu,name:odex_benefit.menu_benefits_config_benefits
#: model_terms:ir.ui.view,arch_db:odex_benefit.benefit_club_form #: model_terms:ir.ui.view,arch_db:odex_benefit.benefit_club_form
msgid "benefits" msgid "benefits"
msgstr "المستفيدين" msgstr "المستفيدين"
#. module: odex_benefit
#: model:ir.ui.menu,name:odex_benefit.menu_benefits_config_benefits
msgid "Contacts"
msgstr "الجهات"
#. module: odex_benefit #. module: odex_benefit
#: model_terms:ir.ui.view,arch_db:odex_benefit.view_benefits_needs_tree #: model_terms:ir.ui.view,arch_db:odex_benefit.view_benefits_needs_tree
msgid "benefits Needs" msgid "benefits Needs"
@ -13355,8 +13356,8 @@ msgstr ""
#. module: odex_benefit #. module: odex_benefit
#: model:ir.ui.menu,name:odex_benefit.menu_benefits_config_others #: model:ir.ui.menu,name:odex_benefit.menu_benefits_config_others
msgid "others" msgid "Reasons Settings"
msgstr "اخرى" msgstr "أسباب"
#. module: odex_benefit #. module: odex_benefit
#: model:ir.model.fields.selection,name:odex_benefit.selection__benefit_zkat__donation_method__outside #: model:ir.model.fields.selection,name:odex_benefit.selection__benefit_zkat__donation_method__outside
@ -15179,8 +15180,8 @@ msgstr "إنشاء أول نوع للسيارات"
#. module: odex_benefit #. module: odex_benefit
#: model:ir.ui.menu,name:odex_benefit.benefit_vehicle_model_settings_menu #: model:ir.ui.menu,name:odex_benefit.benefit_vehicle_model_settings_menu
msgid "Vehicle Settings" msgid "General Settings"
msgstr "إعدادات المركبات" msgstr "إعدادات عامة"
#. module: odex_benefit #. module: odex_benefit
#: model:ir.model.fields,field_description:odex_benefit.field_cars_line__application_form #: model:ir.model.fields,field_description:odex_benefit.field_cars_line__application_form
@ -16222,8 +16223,6 @@ msgstr "لا يمكنك طلب هذه الخدمة أكثر من مرة."
#: code:addons/odex_benefit/models/service_request.py:0 #: code:addons/odex_benefit/models/service_request.py:0
#: code:addons/odex_benefit/models/service_request.py:0 #: code:addons/odex_benefit/models/service_request.py:0
#: code:addons/odex_benefit/models/service_request.py:0 #: code:addons/odex_benefit/models/service_request.py:0
#: code:addons/odex_benefit/models/service_request.py:0
#: code:addons/odex_benefit/models/service_request.py:0
#, python-format #, python-format
msgid "You cannot request more than %s" msgid "You cannot request more than %s"
msgstr "لا يمكنك طلب أكثر من %s" msgstr "لا يمكنك طلب أكثر من %s"

View File

@ -476,7 +476,9 @@ class ExpensesLine(models.Model):
benefit_id = fields.Many2one('grant.benefit') benefit_id = fields.Many2one('grant.benefit')
mother_benefit_id = fields.Many2one('grant.benefit',string="Mother Benefit",ondelete='cascade') mother_benefit_id = fields.Many2one('grant.benefit',string="Mother Benefit",ondelete='cascade')
currency_id = fields.Many2one('res.currency', related='benefit_id.currency_id') currency_id = fields.Many2one('res.currency', related='benefit_id.currency_id')
expenses_type_custom = fields.Many2one('expenses.type') #expenses_type_custom = fields.Many2one('expenses.type')
expenses_type_custom = fields.Many2one('attachments.settings', string='Expenses Type Custom',
domain="[('attach_type','=','expenses_attach')]")
expenses_type = fields.Selection( expenses_type = fields.Selection(
string='', string='',
selection=[('governmental', 'Governmental Expenses'), selection=[('governmental', 'Governmental Expenses'),
@ -809,7 +811,7 @@ class AttachmentsSettings(models.Model):
disabilities_id = fields.Many2one('disabilities.settings',string='Disabilities') disabilities_id = fields.Many2one('disabilities.settings',string='Disabilities')
attach_type = fields.Selection( attach_type = fields.Selection(
[('family_attach', _('Family Attach')), ('member_attach', _('Member Attach')), ('hobbies_attach', _('Hobbies Attach')), [('family_attach', _('Family Attach')), ('member_attach', _('Member Attach')), ('hobbies_attach', _('Hobbies Attach')),
('diseases_attach', _('Diseases Attach')), ('disabilities_attach', _('Disabilities Attach')), ('income_attach', _('Income Attach')), ('exams_attach', _('Exams Attach'))]) ('diseases_attach', _('Diseases Attach')), ('disabilities_attach', _('Disabilities Attach')), ('income_attach', _('Income Attach')), ('expense_attach', _('Expense Attach')), ('exams_attach', _('Exams Attach'))])
is_required = fields.Boolean(string='Is Required?') is_required = fields.Boolean(string='Is Required?')
is_default = fields.Boolean(string='Is Default?') is_default = fields.Boolean(string='Is Default?')
show_in_portal = fields.Boolean(default=True) show_in_portal = fields.Boolean(default=True)

View File

@ -555,6 +555,31 @@ class ServiceRequest(models.Model):
def action_send_to_researcher(self): def action_send_to_researcher(self):
for rec in self: for rec in self:
if rec.service_cat and rec.service_cat.service_type == 'home_furnishing':
for item in rec.furnishing_items_ids:
max_amount = item.home_furnishing_items.max_furnishing_amount or 0.0
if 0 < max_amount < item.furnishing_cost:
if not item.price_first_attach:
raise ValidationError(
_("Cannot send to researcher!\n\n"
"Item '%(item)s': Cost (%(cost).2f) exceeds max limit (%(max).2f).\n"
"→ First price attachment is mandatory.") % {
'item': item.home_furnishing_items.name,
'cost': item.furnishing_cost,
'max': max_amount
}
)
if not item.price_second_attach:
raise ValidationError(
_("Cannot send to researcher!\n\n"
"Item '%(item)s': Cost (%(cost).2f) exceeds max limit (%(max).2f).\n"
"→ Second price attachment is mandatory.") % {
'item': item.home_furnishing_items.name,
'cost': item.furnishing_cost,
'max': max_amount
}
)
rec.state = 'researcher' rec.state = 'researcher'
def action_return_to_family(self): def action_return_to_family(self):
@ -911,23 +936,6 @@ class ServiceRequest(models.Model):
raise ValidationError(_("You cannot request this service more than once.")) raise ValidationError(_("You cannot request this service more than once."))
else: else:
if service_type in special_services: if service_type in special_services:
if service_type == 'home_furnishing':
delta_kwargs = {period: interval}
date_before = rec.date - relativedelta(**delta_kwargs)
domain = base_domain + [('date', '>', date_before)]
existing_requests = Service.search(domain)
total_amount = sum(existing_requests.mapped('requested_service_amount')) + sum(
rec.furnishing_items_ids.mapped('furnishing_cost'))
if not rec.home_furnishing_exception:
rec.service_max_amount = rec.service_cat.max_amount
if total_amount > rec.service_cat.max_amount:
raise ValidationError(
_("You cannot request more than %s") % rec.service_max_amount)
if rec.home_furnishing_exception:
rec.service_max_amount = rec.service_cat.max_furnishing_amount_if_exception
if total_amount > rec.service_cat.max_furnishing_amount_if_exception:
raise ValidationError(
_("You cannot request more than %s") % rec.service_max_amount)
if service_type == 'electrical_devices': if service_type == 'electrical_devices':
rec.service_max_amount = rec.device_id.price_unit if rec.device_id else 0.0 rec.service_max_amount = rec.device_id.price_unit if rec.device_id else 0.0
if rec.device_id: if rec.device_id:
@ -948,7 +956,6 @@ class ServiceRequest(models.Model):
raise ValidationError(_( raise ValidationError(_(
"You cannot request this device more than %s times within %s %s." "You cannot request this device more than %s times within %s %s."
) % (allowed_qty, interval, period)) ) % (allowed_qty, interval, period))
else: else:
last_request = Service.search(base_domain, order='date desc', limit=1) last_request = Service.search(base_domain, order='date desc', limit=1)
if last_request and last_request.date: if last_request and last_request.date:
@ -996,6 +1003,9 @@ class ServiceRequest(models.Model):
rec.service_max_amount = rec.estimated_rent_amount_payment rec.service_max_amount = rec.estimated_rent_amount_payment
if rec.max_limit_period: if rec.max_limit_period:
period_domain = base_domain.copy()
if service_type == 'home_furnishing' and not rec.home_furnishing_exception:
period_domain += [('home_furnishing_exception', '=', False)]
if rec.max_limit_period == "month": if rec.max_limit_period == "month":
if rec.start and rec.end: if rec.start and rec.end:
start_date = rec.start.date() if isinstance(rec.start, datetime) else rec.start start_date = rec.start.date() if isinstance(rec.start, datetime) else rec.start
@ -1016,12 +1026,12 @@ class ServiceRequest(models.Model):
year_start = date(start_year, 1, 1) year_start = date(start_year, 1, 1)
year_end = date(end_year, 12, 31) year_end = date(end_year, 12, 31)
calendar_year_domain = base_domain + [ period_domain += [
('date', '>=', datetime.combine(year_start, datetime.min.time())), ('date', '>=', datetime.combine(year_start, datetime.min.time())),
('date', '<=', datetime.combine(year_end, datetime.max.time())), ('date', '<=', datetime.combine(year_end, datetime.max.time())),
] ]
existing_requests = Service.search(calendar_year_domain) existing_requests = Service.search(period_domain)
total_spent = sum(existing_requests.mapped('requested_service_amount')) total_spent = sum(existing_requests.mapped('requested_service_amount'))
rec.service_max_amount = rec.service_cat.max_amount - total_spent rec.service_max_amount = rec.service_cat.max_amount - total_spent
@ -1031,12 +1041,12 @@ class ServiceRequest(models.Model):
period_start_date = current_date - relativedelta(years=allowed_years) period_start_date = current_date - relativedelta(years=allowed_years)
period_end_date = current_date period_end_date = current_date
year_from_request_domain = base_domain + [ period_domain += [
('date', '>=', datetime.combine(period_start_date, datetime.min.time())), ('date', '>=', datetime.combine(period_start_date, datetime.min.time())),
('date', '<=', datetime.combine(period_end_date, datetime.max.time())), ('date', '<=', datetime.combine(period_end_date, datetime.max.time())),
] ]
existing_requests = Service.search(year_from_request_domain) existing_requests = Service.search(period_domain)
total_spent = sum(existing_requests.mapped('requested_service_amount')) total_spent = sum(existing_requests.mapped('requested_service_amount'))
rec.service_max_amount = rec.service_cat.max_amount - total_spent rec.service_max_amount = rec.service_cat.max_amount - total_spent
elif rec.max_limit_period == "individual": elif rec.max_limit_period == "individual":
@ -1065,6 +1075,9 @@ class ServiceRequest(models.Model):
if rec.has_marriage_course == 'no': if rec.has_marriage_course == 'no':
raise UserError(_("You Should take a course")) raise UserError(_("You Should take a course"))
continue continue
if service_type == 'home_furnishing':
if rec.home_furnishing_exception:
rec.service_max_amount = rec.service_cat.max_furnishing_amount_if_exception
if rec.requested_service_amount > rec.service_max_amount and service_type not in special_services and not max_limit_type == 'none': if rec.requested_service_amount > rec.service_max_amount and service_type not in special_services and not max_limit_type == 'none':
raise ValidationError( raise ValidationError(

View File

@ -849,7 +849,7 @@
sequence="8" groups="odex_benefit.group_benefit_manager"/> sequence="8" groups="odex_benefit.group_benefit_manager"/>
<!--benefit vehicle model--> <!--benefit vehicle model-->
<menuitem id="benefit_vehicle_model_settings_menu" name="Vehicle Settings" parent="odex_benefit.benefit_tools" sequence="4"/> <menuitem id="benefit_vehicle_model_settings_menu" name="General Settings" parent="odex_benefit.benefit_tools" sequence="4"/>
<menuitem id='benefit_vehicle_model_menu' name='Vehicle Model' parent='benefit_vehicle_model_settings_menu' action="benefit_vehicle_model_action" sequence="1"/> <menuitem id='benefit_vehicle_model_menu' name='Vehicle Model' parent='benefit_vehicle_model_settings_menu' action="benefit_vehicle_model_action" sequence="1"/>
<!--social search--> <!--social search-->
<!--اللجان--> <!--اللجان-->
@ -871,14 +871,14 @@
<menuitem <menuitem
id="menu_visits_types" id="menu_visits_types"
name="Visits Types" name="Visits Types"
parent="benefit_tools" parent="benefit_vehicle_model_settings_menu"
action="visits_types_action" action="visits_types_action"
sequence="9" sequence="9"
/> />
<menuitem <menuitem
id="menu_survey_setting" id="menu_survey_setting"
name="Survey Setting" name="Survey Setting"
parent="benefit_tools" parent="benefit_vehicle_model_settings_menu"
action="survey_setting_action" action="survey_setting_action"
sequence="100" sequence="100"
/> />
@ -892,35 +892,28 @@
<menuitem <menuitem
id="menu_jobs_settings" id="menu_jobs_settings"
name="Jobs Settings" name="Jobs Settings"
parent="benefit_tools" parent="menu_benefits_config_organizing"
action="odex_benefit.action_job_settings_act_window" action="odex_benefit.action_job_settings_act_window"
sequence="110" sequence="110"
/> />
<menuitem <menuitem
id="menu_death_reasons_settings" id="menu_death_reasons_settings"
name="Death Reason Settings" name="Death Reason Settings"
parent="benefit_tools" parent="menu_benefits_config_organizing"
action="odex_benefit.action_death_reason_settings_act_window" action="odex_benefit.action_death_reason_settings_act_window"
sequence="115" sequence="115"
/> />
<menuitem
id="menu_member_location"
name="Member Location"
parent="benefit_tools"
action="member_location_action"
sequence="10"
/>
<menuitem <menuitem
id="menu_property_type_settings" id="menu_property_type_settings"
name="Property Type Settings" name="Property Type Settings"
parent="benefit_tools" parent="benefit_vehicle_model_settings_menu"
action="action_property_type_settings" action="action_property_type_settings"
sequence="11" sequence="11"
/> />
<menuitem <menuitem
id="family_validation_location" id="family_validation_location"
name="Family Validation Setting" name="Family Validation Setting"
parent="benefit_tools" parent="menu_benefits_config_organizing"
action="family_validation_action" action="family_validation_action"
sequence="12" sequence="12"
/> />
@ -939,7 +932,7 @@
<menuitem id="age_category_menu" name="فئة العمر" parent="menu_benefits_config_organizing" <menuitem id="age_category_menu" name="فئة العمر" parent="menu_benefits_config_organizing"
action="age_category_action" action="age_category_action"
sequence="6"/> sequence="6"/>
<menuitem id="complaints_category_menu" name="تصنيف الشكوى" parent="menu_benefits_config_organizing" <menuitem id="complaints_category_menu" name="تصنيف الشكوى" parent="benefit_vehicle_model_settings_menu"
action="complaints_category_action" action="complaints_category_action"
sequence="7"/> sequence="7"/>
<!-- <menuitem id="hobbies_settings_menu" name="Hobbies Settings" parent="menu_benefits_config_organizing"--> <!-- <menuitem id="hobbies_settings_menu" name="Hobbies Settings" parent="menu_benefits_config_organizing"-->
@ -1002,7 +995,7 @@
<!-- parent="menu_benefits_config_housing" action="item_status_action" sequence="4"/>--> <!-- parent="menu_benefits_config_housing" action="item_status_action" sequence="4"/>-->
<menuitem <menuitem
id="menu_benefits_config_benefits" id="menu_benefits_config_benefits"
name="benefits" name="Contacts"
parent="benefit_tools" parent="benefit_tools"
sequence="6"/> sequence="6"/>
<menuitem id="res_bank_menu" name="Banks" parent="menu_benefits_config_benefits" action="res_bank_list_action" <menuitem id="res_bank_menu" name="Banks" parent="menu_benefits_config_benefits" action="res_bank_list_action"
@ -1011,10 +1004,6 @@
<!-- sequence="2"/>--> <!-- sequence="2"/>-->
<!-- <menuitem id="insurance_company_menu" name="Insurance Company" parent="menu_benefits_config_benefits"--> <!-- <menuitem id="insurance_company_menu" name="Insurance Company" parent="menu_benefits_config_benefits"-->
<!-- action="insurance_company_action" sequence="3"/>--> <!-- action="insurance_company_action" sequence="3"/>-->
<menuitem id="income_type_menu" name="Income Type"
parent="menu_benefits_config_benefits" action="income_type_action" sequence="7"/>
<menuitem id="expenses_type_menu" name="Expenses Type"
parent="menu_benefits_config_benefits" action="expenses_type_action" sequence="8"/>
<menuitem id="loan_giver_menu" name="Loan Giver" <menuitem id="loan_giver_menu" name="Loan Giver"
parent="menu_benefits_config_benefits" action="loan_giver_action" sequence="9"/> parent="menu_benefits_config_benefits" action="loan_giver_action" sequence="9"/>
<menuitem id="loan_reason_menu" name="Loan Reason" <menuitem id="loan_reason_menu" name="Loan Reason"
@ -1034,7 +1023,7 @@
parent="menu_benefits_config_contact" action="email_list_action"/> parent="menu_benefits_config_contact" action="email_list_action"/>
<menuitem <menuitem
id="menu_benefits_config_others" id="menu_benefits_config_others"
name="others" name="Reasons Settings"
parent="benefit_tools" parent="benefit_tools"
sequence="8" sequence="8"
/> />
@ -1064,11 +1053,11 @@
<menuitem id="family_member_menu" name="Family Members" <menuitem id="family_member_menu" name="Family Members"
parent="benefit_main_menu" action="family_member_action" sequence="0"/> parent="benefit_main_menu" action="family_member_action" sequence="0"/>
<menuitem id="education_main_menu" name="Education Settings" <menuitem id="education_main_menu" name="Education Settings"
parent="odex_benefit.benefit_tools" sequence="3"/> parent="odex_benefit.benefit_tools" sequence="120"/>
<menuitem id="education_entities_menu" name="Education Entities" <menuitem id="education_entities_menu" name="Education Entities"
parent="education_main_menu" action="education_entities_action" sequence="0"/> parent="education_main_menu" action="education_entities_action" sequence="0"/>
<menuitem id="supporter_partners_menu" name="Supporter Entities" <menuitem id="supporter_partners_menu" name="Supporter Entities"
parent="menu_benefits_config_others" action="action_supporter_partners" sequence="10"/> parent="menu_benefits_config_benefits" action="action_supporter_partners" sequence="19"/>
<menuitem id="education_level_menu" name="Education Level" <menuitem id="education_level_menu" name="Education Level"
parent="education_main_menu" action="education_level_action" sequence="1"/> parent="education_main_menu" action="education_level_action" sequence="1"/>
<menuitem id="education_period_menu" <menuitem id="education_period_menu"
@ -1104,7 +1093,7 @@
action="action_payment_orders" sequence="10" /> action="action_payment_orders" sequence="10" />
<menuitem id="seasonal_service_menu" name="Seasonal Services" groups="odex_benefit.group_family_services_manager,odex_benefit.group_benefit_manager" <menuitem id="seasonal_service_menu" name="Seasonal Services" groups="odex_benefit.group_family_services_manager,odex_benefit.group_benefit_manager"
parent="odex_benefit.benefit_services" sequence="3" action="seasonal_service_action" /> parent="odex_benefit.benefit_services" sequence="3" action="seasonal_service_action" />
<menuitem id="menu_refuse_reason" name="Service Refuse Reasons" parent="menu_benefits_config_others" action="action_refuse_reason"/> <menuitem id="menu_refuse_reason" name="Service Refuse Reasons" parent="odex_benefit.benefit_tools_services_settings_menu" action="action_refuse_reason"/>
<menuitem name="Others" <menuitem name="Others"
id="menu_accounting_others" id="menu_accounting_others"
parent="account.menu_finance_configuration" parent="account.menu_finance_configuration"