Merge pull request #5727 from expsa/younes_dev_odex25_benefittt

[IMP] odex_benefit: IMP benefit
This commit is contained in:
kchyounes19 2025-12-14 19:51:25 +01:00 committed by GitHub
commit b08ccfca7b
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
3 changed files with 106 additions and 37 deletions

View File

@ -6681,6 +6681,7 @@ msgstr "تاريخ الانقطاع"
#: model:ir.model.fields,field_description:odex_benefit.field_external_benefits__invoice_warn
#: model:ir.model.fields,field_description:odex_benefit.field_grant_benefit__invoice_warn
#: model:ir.model.fields,field_description:odex_benefit.field_needs_payment_line__invoice_id
#: model:ir.model.fields.selection,name:odex_benefit.selection__service_request__payment_method__invoice
#: model:ir.model.fields.selection,name:odex_benefit.selection__services_settings__payment_method__invoice
msgid "Invoice"
msgstr "فاتورة"
@ -9792,6 +9793,7 @@ msgstr "صلة القرابة"
#. module: odex_benefit
#: model:ir.model.fields,field_description:odex_benefit.field_benefits_needs__remaining_amount
#: model:ir.model.fields,field_description:odex_benefit.field_service_request__car_remaining_amount
msgid "Remaining Amount"
msgstr "المبلغ المتبقي"
@ -10493,7 +10495,7 @@ msgstr "اسم الخدمة"
#: model:ir.model.fields,field_description:odex_benefit.field_service_request__service_producer_id
#: model:ir.model.fields,field_description:odex_benefit.field_services_settings__service_producer_id
msgid "Service Producer"
msgstr ""
msgstr "جهة الدفع"
#. module: odex_benefit
#: model:ir.model.fields,field_description:odex_benefit.field_home_furnishing_items__service_request_id
@ -14331,6 +14333,7 @@ msgstr "حساب المصروف"
#: model:ir.model.fields,field_description:odex_benefit.field_confirm_benefit_expense__payment_order_id
#: model:ir.model.fields,field_description:odex_benefit.field_seasonal_service__payment_order_id
#: model:ir.model.fields,field_description:odex_benefit.field_service_request__payment_order_id
#: model:ir.model.fields.selection,name:odex_benefit.selection__service_request__payment_method__payment_order
#: model:ir.model.fields.selection,name:odex_benefit.selection__services_settings__payment_method__payment_order
msgid "Payment Order"
msgstr "أمر الصرف"
@ -16150,12 +16153,6 @@ msgstr "لا يمكنك طلب هذه الخدمة لأنك أقل من الحد
msgid "You cannot request this service because you do not have a car"
msgstr "لا يمكنك طلب هذه الخدمة لأنك لا تملك سيارة"
#. module: odex_benefit
#: code:addons/odex_benefit/models/service_request.py:0
#, python-format
msgid "You cannot request this service because children above 18 years"
msgstr "لا يمكنك طلب هذه الخدمة لأن الأطفال أكبر من 18 عامًا"
#. module: odex_benefit
#: code:addons/odex_benefit/models/service_request.py:0
#: code:addons/odex_benefit/models/service_request.py:0
@ -16572,12 +16569,6 @@ msgid ""
"service between %s and %s."
msgstr "يتداخل هذا الطلب مع طلبات أخرى لنفس الخدمة [%s] خلال الفترة من %s إلى %s."
#. module: odex_benefit
#: code:addons/odex_benefit/models/service_request.py:0
#, python-format
msgid "This service is not eligible because the son is not working."
msgstr "هذه الخدمة غير مستحقة لأن الفرد لا يعمل."
#. module: odex_benefit
#: code:addons/odex_benefit/models/benefit.py:0
#: model:ir.model.fields,field_description:odex_benefit.field_grant_benefit__total_father_families
@ -16783,6 +16774,7 @@ msgstr "حالة أمر الدفع"
#: model:ir.model.fields.selection,name:odex_benefit.selection__confirm_benefit_expense__move_state__none
#: model:ir.model.fields.selection,name:odex_benefit.selection__confirm_benefit_expense__payment_state__none
#: model:ir.model.fields.selection,name:odex_benefit.selection__seasonal_service__payment_order_state__none
#: model:ir.model.fields.selection,name:odex_benefit.selection__service_request__payment_method__none
#: model:ir.model.fields.selection,name:odex_benefit.selection__service_request__payment_order_state__none
#: model:ir.model.fields.selection,name:odex_benefit.selection__services_settings__payment_method__none
msgid "None"
@ -16918,6 +16910,7 @@ msgid "Waiting for Deposit"
msgstr "بانتظار الايداع"
#. module: odex_benefit
#: model:ir.model.fields,field_description:odex_benefit.field_service_request__payment_method
#: model:ir.model.fields,field_description:odex_benefit.field_services_settings__payment_method
msgid "Payment Method"
msgstr "طريقة الدفع"
@ -17521,3 +17514,30 @@ msgstr "الجهة الداعمة"
msgid "Supporter Entities"
msgstr "الجهات الداعمة"
#. module: odex_benefit
#: model:ir.model.fields,field_description:odex_benefit.field_service_request__car_price
msgid "Car Price"
msgstr "قيمة السيارة"
#. module: odex_benefit
#: model:ir.model.fields,field_description:odex_benefit.field_service_request__show_car_remaining_amount
msgid "Show Car Remaining Amount"
msgstr "إظهار المبلغ المتبقي للسيارة"
#. module: odex_benefit
#: code:addons/odex_benefit/models/service_request.py:0
#, python-format
msgid ""
"You cannot request this service because there is at least one child over 18 "
"years old living with the family."
msgstr "لا يمكنك طلب هذه الخدمة لأنه يوجد طفل واحد على الأقل يزيد عمره عن 18 عامًا يعيش مع الأسرة."
#. module: odex_benefit
#: code:addons/odex_benefit/models/service_request.py:0
#, python-format
msgid ""
"The following service requests do not have a Service Producer defined:\n"
"%s"
msgstr ""
"طلبات الخدمة التالية ليس لديها جهة الدفع محددة:\n"
"%s"

View File

@ -46,6 +46,11 @@ class ServiceRequest(models.Model):
compute="_get_estimated_rent_amount_payment")
service_type = fields.Selection([('rent', 'Rent')], string='Service Type', related='service_cat.service_type')
max_limit_period = fields.Selection(string='Maximum Limit Period', related='service_cat.max_limit_period')
payment_method = fields.Selection([
('none', 'None'),
('payment_order', 'Payment Order'),
('invoice', 'Invoice'),
], string='Payment Method', default="payment_order")
# is_alternative_housing = fields.Boolean(string='Is Alternative Housing?')
rent_contract_number = fields.Char(string="Rent Contract Number", compute='_compute_rent_details', store=True)
rent_start_date = fields.Date(string='Rent Start Date', compute='_compute_rent_details', store=True)
@ -95,8 +100,7 @@ class ServiceRequest(models.Model):
device_account_id = fields.Many2one('account.account', string='Expenses Account', related='device_id.account_id')
accountant_id = fields.Many2one('res.users', string='Accountant', related='service_cat.accountant_id',
readonly=False)
service_producer_id = fields.Many2one('res.partner', string='Service Producer',
related='service_cat.service_producer_id')
service_producer_id = fields.Many2one('res.partner', string='Service Producer', )
is_service_producer = fields.Boolean(string='Is Service Producer?', related='service_cat.is_service_producer')
# maintenance_items_id = fields.Many2one('home.maintenance.lines', string="Maintenance Items")
maintenance_items_ids = fields.One2many('home.maintenance.items', 'service_request_id',
@ -180,6 +184,9 @@ class ServiceRequest(models.Model):
car_name = fields.Char(string='Car Name')
car_owner_id = fields.Many2one('family.member', domain="[('benefit_id','=',family_id)]", string="Car Owner")
car_model_id = fields.Many2one('benefit.vehicle.model', string='Car model')
car_price = fields.Float(string='Car Price')
car_remaining_amount = fields.Float(string='Remaining Amount',compute='_compute_remaining_amount',store=True,)
show_car_remaining_amount = fields.Boolean(string='Show Car Remaining Amount',compute='_compute_remaining_amount')
application_form = fields.Many2many('ir.attachment', 'request_application_form_rel', 'request_id', 'attachment_id',
string="Application Form")
driving_license = fields.Many2many('ir.attachment', 'request_driving_license_rel', 'request_id', 'attachment_id',
@ -227,6 +234,20 @@ class ServiceRequest(models.Model):
payment_order_state = "waiting"
rec.payment_order_state = payment_order_state
@api.depends('car_price', 'requested_service_amount', 'service_cat')
def _compute_remaining_amount(self):
for rec in self:
if rec.service_cat and rec.service_cat.service_type == 'buy_car':
if rec.car_price and rec.requested_service_amount:
rec.car_remaining_amount = rec.car_price - rec.requested_service_amount
rec.show_car_remaining_amount = rec.car_price > rec.requested_service_amount
else:
rec.car_remaining_amount = 0.0
rec.show_car_remaining_amount = False
else:
rec.car_remaining_amount = 0.0
rec.show_car_remaining_amount = False
def action_return_bank(self):
self.ensure_one()
return {
@ -523,7 +544,15 @@ class ServiceRequest(models.Model):
@api.onchange('family_id', 'service_cat')
def _onchange_member(self):
for rec in self:
if rec.service_cat:
rec.benefit_type = rec.service_cat.benefit_type
rec.service_producer_id = rec.service_cat.service_producer_id
rec.payment_method = rec.service_cat.payment_method
else:
rec.benefit_type = False
rec.service_producer_id = False
rec.payment_method = 'payment_order'
if not rec.family_id:
rec.member_id = False
rec.service_cat = False
@ -610,24 +639,35 @@ class ServiceRequest(models.Model):
raise ValidationError(
_("You cannot request this service because you are less than %s") % rec.service_cat.min_count_member)
if rec.service_cat.service_type == 'recruiting_driver':
son_members_above_age = rec.family_id.mapped('member_ids').filtered(
lambda x: x.relationn.relation_type == 'son' and x.age > 18)
daughter_members_above_age = rec.family_id.mapped('member_ids').filtered(
lambda x: x.relationn.relation_type == 'daughter' and x.age > 18)
disable_mother = rec.family_id.mapped('member_ids').filtered(
lambda x: x.relationn.relation_type == 'mother')
work_mother = rec.family_id.mapped('member_ids').filtered(
lambda x: x.relationn.relation_type == 'mother' and x.benefit_id.is_mother_work)
disable_replacement_mother = rec.family_id.mapped('member_ids').filtered(
lambda x: x.relationn.relation_type == 'replacement_mother')
work_replacement_mother = rec.family_id.mapped('member_ids').filtered(
lambda
x: x.relationn.relation_type == 'replacement_mother' and x.replacement_is_mother_work)
if not rec.family_id.has_car:
raise ValidationError(_("You cannot request this service because you do not have a car"))
if son_members_above_age or daughter_members_above_age:
#son_members_above_age = rec.family_id.member_ids.filtered(
# lambda x: x.relationn.relation_type == 'son' and x.age > 18)
#daughter_members_above_age = rec.family_id.member_ids.filtered(
# lambda x: x.relationn.relation_type == 'daughter' and x.age > 18)
children_above_18_living_with_family = rec.family_id.member_ids.filtered(
lambda m: m.relationn.relation_type in ('son', 'daughter')
and m.age > 18
and not m.member_location_conf.is_far_from_family
)
if children_above_18_living_with_family:
raise ValidationError(
_("You cannot request this service because children above 18 years"))
_("You cannot request this service because there is at least one child over 18 years old living with the family.")
)
disable_mother = rec.family_id.member_ids.filtered(
lambda x: x.relationn.relation_type == 'mother' and bool(x.disabilities_attachment_ids))
work_mother = rec.family_id.member_ids.filtered(
lambda x: x.relationn.relation_type == 'mother' and x.is_work)
disable_replacement_mother = rec.family_id.member_ids.filtered(
lambda x: x.relationn.relation_type == 'replacement_mother' and bool(x.disabilities_attachment_ids))
work_replacement_mother = rec.family_id.member_ids.filtered(
lambda x: x.relationn.relation_type == 'replacement_mother' and x.is_work)
#if son_members_above_age or daughter_members_above_age:
# raise ValidationError(
# _("You cannot request this service because children above 18 years"))
if rec.family_id.add_replacement_mother and not disable_replacement_mother and not work_replacement_mother:
raise ValidationError(
_("You cannot request this service because mother should be worked or has disability"))
@ -807,9 +847,6 @@ class ServiceRequest(models.Model):
remaining = 0
rec.service_max_amount = remaining
if rec.service_cat.service_type == 'marriage':
if rec.member_id.relationn.relation_type == 'son' and not rec.member_id.is_work:
raise ValidationError(_("This service is not eligible because the son is not working."))
if rec.marriage_contract_date and rec.date:
request_date = rec.date.date() if isinstance(rec.date, datetime) else rec.date
contract_date = rec.marriage_contract_date
@ -823,7 +860,7 @@ class ServiceRequest(models.Model):
rec.requested_service_amount = rec.service_max_amount
if rec.member_age > rec.service_cat.max_age:
raise ValidationError(_("Member Age should be less than %s ") % rec.service_cat.max_age)
if rec.member_payroll > rec.service_cat.member_max_payroll:
if rec.member_id.is_work and rec.member_payroll > rec.service_cat.member_max_payroll:
raise ValidationError(
_("Member Payroll should be less than %s ") % rec.service_cat.member_max_payroll)
if not rec.is_orphan and rec.requested_service_amount > rec.service_max_amount:
@ -908,6 +945,12 @@ class ServiceRequest(models.Model):
})
elif service_cats.payment_method == "invoice":
missing_producer = self.filtered(lambda r: not r.service_producer_id)
if missing_producer:
names = ", ".join(missing_producer.mapped('name'))
raise UserError(_(
"The following service requests do not have a Service Producer defined:\n%s"
) % names)
invalid_records = self.filtered(
lambda r: r.state != 'accounting_approve'
or r.payment_order_state != 'none'

View File

@ -224,14 +224,15 @@
groups="odex_benefit.group_benefit_accounting_accept"/>
<field name="vendor_bill" invisible="1"/>
<field name="is_service_producer" invisible="1"/>
<field name="service_producer_id"
attrs="{'invisible':[('is_service_producer','=',False)],'readonly':[('state','not in',['draft','researcher','waiting_approve'])]}"/>
<field name="service_producer_id" force_save="1"
attrs="{'invisible':[('payment_method','!=','invoice')],'readonly':[('state','in',['family_received_device','send_request_to_supplier'])],'required': [('payment_method','=','invoice'), ('state','=','accounting_approve')]}"/>
<field name="currency_id" groups="base.group_multi_currency"/>
<field name="company_id" groups="base.group_multi_company"/>
</group>
<group>
<field name="available_service_cats" invisible="1"/>
<field name="max_limit_period" invisible="1"/>
<field name="payment_method" force_save="1" invisible="1"/>
<field name="service_cat"
attrs="{'readonly':[('state','not in',['draft','researcher','waiting_approve'])]}"
domain="[('id','in',available_service_cats)]" required="1"/>
@ -265,6 +266,9 @@
<field name="sub_service_category"
attrs="{'readonly':[('state','not in',['draft','researcher','waiting_approve'])]}"
invisible="1"/>
<field name="show_car_remaining_amount" invisible="1"/>
<field name="car_price"
attrs="{'readonly':[('state','not in',['draft','researcher','waiting_approve'])],'invisible': [('service_type', '!=', 'buy_car')]}"/>
<field name="requested_service_amount" attrs="{'readonly': [
'|',
'&amp;',
@ -272,6 +276,8 @@
('service_type', 'in', ['marriage', 'eid_gift', 'winter_clothing', 'ramadan_basket']),
('service_type', 'in', ['electrical_devices', 'home_furnishing'])
]}" force_save="1" required="1"/>
<field name="car_remaining_amount" readonly="1"
attrs="{'invisible': [('show_car_remaining_amount', '=', False)]}"/>
<field name="service_max_amount" force_save="1" readonly="1"/>
<field name="exception"
attrs="{'readonly':[('state','not in',['draft','researcher','waiting_approve'])]}"/>