[IMP] odex_benefit: IMP benefit

This commit is contained in:
younes 2025-12-02 13:20:52 +01:00
parent 5bd2b229c4
commit dfbf6d886b
3 changed files with 161 additions and 23 deletions

View File

@ -17302,3 +17302,34 @@ msgstr "مجال سطر الرجيع"
msgid "Eligible Members"
msgstr "الأفراد المستحقون"
#. module: odex_benefit
#: model:ir.model.fields,field_description:odex_benefit.field_seasonal_service__allowed_service_categories
msgid "Allowed Categories"
msgstr "الفئات المسموح بها"
#. module: odex_benefit
#: model_terms:ir.ui.view,arch_db:odex_benefit.seasonal_service_form_view
msgid ""
"<i class=\"fa fa-home text-primary\" style=\"font-size: 20px; margin-bottom: 4px;\"/>\n"
" <span style=\"font-size: 12px; color: #555;\">Family Count</span>"
msgstr ""
"<i class=\"fa fa-home text-primary\" style=\"font-size: 20px; margin-bottom: 4px;\"/>\n"
" <span style=\"font-size: 12px; color: #555;\">عدد الأسر</span>"
#. module: odex_benefit
#: model_terms:ir.ui.view,arch_db:odex_benefit.seasonal_service_form_view
msgid ""
"<i class=\"fa fa-users text-info\" style=\"font-size: 20px; margin-bottom: 4px;\"/>\n"
" <span style=\"font-size: 12px; color: #555;\">Benefit Member Count</span>"
msgstr ""
"<i class=\"fa fa-users text-info\" style=\"font-size: 20px; margin-bottom: 4px;\"/>\n"
" <span style=\"font-size: 12px; color: #555;\">عدد الأفراد المستفيدين</span>"
#. module: odex_benefit
#: model_terms:ir.ui.view,arch_db:odex_benefit.seasonal_service_form_view
msgid ""
"<i class=\"fa fa-money text-success\" style=\"font-size: 20px; margin-bottom: 4px;\"/>\n"
" <span style=\"font-size: 12px; color: #555;\">Total Disbursement</span>"
msgstr ""
"<i class=\"fa fa-money text-success\" style=\"font-size: 20px; margin-bottom: 4px;\"/>\n"
" <span style=\"font-size: 12px; color: #555;\">الإجمالي</span>"

View File

@ -19,13 +19,18 @@ class SeasonalService(models.Model):
benefit_type = fields.Selection(string='Benefit Type', related='service_type_id.benefit_type')
branch_ids = fields.Many2many('branch.settings', 'service_branch_rel', 'service_id', 'branch_id', string='Branches',
required=True, domain="[('has_employees', '=', True)]")
allowed_service_categories = fields.Many2many(
comodel_name='benefit.category',
related='service_type_id.benefit_category_ids',
string="Allowed Categories",
readonly=True
)
family_category_ids = fields.Many2many(
'benefit.category',
'service_category_rel',
'service_id',
'category_id',
string='Family Category',
compute='_compute_family_category_ids', )
string='Family Category', domain="[('id', 'in', allowed_service_categories)]")
aid_amount = fields.Float(string="Aid Amount", compute="_compute_amounts", store=True, readonly=False)
benefit_member_count = fields.Integer(string="Benefit Member count", compute="compute_family_benefit", store=True)
family_count = fields.Integer(string="Family count", compute="compute_family_benefit", store=True)
@ -75,6 +80,15 @@ class SeasonalService(models.Model):
payment_order_state = "waiting"
rec.payment_order_state = payment_order_state
@api.onchange('service_type_id')
def _onchange_service_type_id(self):
if self.benefit_ids:
self.benefit_ids = [(5, 0, 0)]
self.family_category_ids = [(5, 0, 0)]
if self.service_type_id and self.service_type_id.benefit_category_ids:
self.family_category_ids = [(6, 0, self.service_type_id.benefit_category_ids.ids)]
@api.depends('branch_ids', 'family_category_ids')
def _compute_domain_ids(self):
for rec in self:
@ -88,13 +102,36 @@ class SeasonalService(models.Model):
families = self.env['grant.benefit'].sudo().search(domain)
rec.family_domain_ids = families
@api.depends('service_type_id', 'service_type_id.benefit_category_ids')
def _compute_family_category_ids(self):
for record in self:
if record.service_type_id and record.service_type_id.benefit_category_ids:
record.family_category_ids = record.service_type_id.benefit_category_ids
else:
record.family_category_ids = []
@api.onchange('branch_ids', 'family_category_ids')
def _onchange_cleanup_families_members(self):
if not self.branch_ids or not self.family_category_ids:
self.benefit_ids = [(5, 0, 0)]
return
allowed_branch_ids = set(self.branch_ids.ids)
allowed_category_ids = set(self.family_category_ids.ids)
families_to_keep = self.benefit_ids.filtered(
lambda b: bool(b.branch_custom_id and b.branch_custom_id.id in allowed_branch_ids)
and bool(b.benefit_category_id and b.benefit_category_id.id in allowed_category_ids)
)
# apply families kept (replace whole m2m)
if len(families_to_keep) != len(self.benefit_ids):
self.benefit_ids = [(6, 0, families_to_keep.ids)]
@api.onchange('benefit_ids')
def _onchange_benefit_ids_cleanup_members(self):
if not self.benefit_ids:
self.member_ids = [(5, 0, 0)]
return
current_family_ids = set(self.benefit_ids.ids)
members_to_keep = self.member_ids.filtered(
lambda m: m.benefit_id and m.benefit_id.id in current_family_ids
)
if len(members_to_keep) != len(self.member_ids):
self.member_ids = [(6, 0, members_to_keep.ids)]
@api.model
def create(self, vals):
@ -109,13 +146,6 @@ class SeasonalService(models.Model):
raise UserError(_('You cannot delete this record'))
return super(SeasonalService, self).unlink()
@api.onchange('service_type_id')
def _onchange_service_type_id(self):
if self.benefit_ids:
self.benefit_ids = [(5, 0, 0)]
if self.member_ids:
self.member_ids = [(5, 0, 0)]
def action_create_payment_order(self):
for rec in self:
if rec.state != 'accounting_approve':

View File

@ -9,19 +9,23 @@
<form string="Seasonal Service">
<header>
<button name="action_calculate" type="object"
string="Calculate" class="btn btn-info"
string="Calculate" class="btn btn-info" groups="odex_benefit.group_family_services_manager"
attrs="{'invisible': [('state', '!=', 'draft')]}"/>
<button name="action_first_approval" type="object"
string="Approve" class="oe_highlight"
groups="odex_benefit.group_family_services_manager"
attrs="{'invisible': [('state', '!=', 'calculated')]}"/>
<button string="Withdraw" type="object" name="action_reset_to_draft" class="btn btn-danger"
groups="odex_benefit.group_family_services_manager"
states="calculated"/>
<button name="action_recalculate" string="Recalculate" class="btn btn-info"
groups="odex_benefit.group_family_services_manager"
type="object" states="calculated"/>
<button name="action_approval_of_gm_assistant" type="object"
string="Approve" class="oe_highlight"
groups="odex_benefit.group_benefit_manager"
attrs="{'invisible': [('state', '!=', 'gm_assistant')]}"/>
<button name="action_create_payment_order"
@ -29,17 +33,19 @@
string="امر الصرف"
class="oe_highlight"
attrs="{'invisible': ['|', ('state', '!=', 'accounting_approve'), ('payment_order_id', '!=', False)]}"
groups="odex_benefit.group_benefit_accounting_accept"/>
groups="odex_benefit.group_family_services_manager"/>
<button name="action_reset_to_calculated" type="object"
string="Reset"
class="oe_highlight"
groups="odex_benefit.group_family_services_manager"
attrs="{'invisible': [('state', '!=', 'accounting_approve')]}"
/>
<button name="action_done" type="object"
string="Done"
class="oe_highlight"
groups="odex_benefit.group_family_services_manager"
attrs="{'invisible': [('state', '!=', 'waiting_receive')]}"
/>
@ -65,7 +71,9 @@
<field name="is_in_kind" invisible="1"/>
<field name="branch_ids" widget="many2many_tags"
attrs="{'readonly': [('state', '!=', 'draft')]}"/>
<field name="family_category_ids" widget="many2many_tags" readonly="1"/>
<field name="family_category_ids" widget="many2many_tags"/>
<field name="allowed_service_categories" invisible="1" widget="many2many_tags"
readonly="1"/>
<field name="family_domain_ids" widget="many2many_tags" invisible="1"/>
<field name="payment_order_id" readonly="1"
groups="odex_benefit.group_benefit_accounting_accept"
@ -77,14 +85,57 @@
</group>
<group>
<field name="aid_amount" attrs="{'readonly': [('service_delivery_method', '=', 'cash')]}"/>
<field name="family_count" readonly="1"/>
<field name="benefit_member_count" readonly="1"/>
<field name="family_disbursement_total_amount" readonly="1"/>
<field name="benefit_type" invisible="1"/>
<field name="currency_id" invisible="1"/>
<field name="company_id" invisible="1"/>
</group>
</group>
<notebook>
<page string="Services Requests" attrs="{'invisible': [('state', '=', 'draft')]}">
<div class="row mb-2">
<!-- Family Count -->
<div class="col-4">
<div class="d-flex flex-column align-items-center"
style="background-color: #e3f2fd; padding: 8px; border-radius: 8px;">
<i class="fa fa-home text-primary"
style="font-size: 20px; margin-bottom: 4px;"/>
<span style="font-size: 12px; color: #555;">Family Count</span>
<span class="badge badge-primary"
style="font-size: 14px; padding: 4px 8px; margin-top: 3px; border-radius: 8px;">
<field name="family_count" readonly="1"/>
</span>
</div>
</div>
<!-- Benefit Member Count -->
<div class="col-4">
<div class="d-flex flex-column align-items-center"
style="background-color: #e0f7fa; padding: 8px; border-radius: 8px;">
<i class="fa fa-users text-info" style="font-size: 20px; margin-bottom: 4px;"/>
<span style="font-size: 12px; color: #555;">Benefit Member Count</span>
<span class="badge badge-info"
style="font-size: 14px; padding: 4px 8px; margin-top: 3px; border-radius: 8px;">
<field name="benefit_member_count" readonly="1"/>
</span>
</div>
</div>
<!-- Total Disbursement -->
<div class="col-4">
<div class="d-flex flex-column align-items-center"
style="background-color: #e8f5e9; padding: 8px; border-radius: 8px;">
<i class="fa fa-money text-success"
style="font-size: 20px; margin-bottom: 4px;"/>
<span style="font-size: 12px; color: #555;">Total Disbursement</span>
<span class="badge badge-success"
style="font-size: 14px; padding: 4px 8px; margin-top: 3px; border-radius: 8px;">
<field name="family_disbursement_total_amount" readonly="1"
widget="monetary"
options="{'currency_field': 'currency_id'}"/>
</span>
</div>
</div>
</div>
<field name="service_requests_ids" readonly="1">
<tree>
<field name="family_id"/>
@ -108,7 +159,33 @@
</field>
</page>
<page string="Families">
<field name="benefit_ids" domain="[('id', 'in', family_domain_ids)]"/>
<field name="benefit_ids" attrs="{'readonly': [('state', '!=', 'draft')]}"
domain="[('id', 'in', family_domain_ids)]">
<tree>
<field name="code" decoration-bf="1"/>
<field name="benefit_partner_name"/>
<field name="benefit_category_id"/>
<field name="create_date" optional="hide"/>
<field name="meal_card"/>
<field name="father_id_number" optional="hide"/>
<field name="sms_phone"/>
<field name="benefit_member_count"/>
<field name="non_member_count" optional="hide"/>
<field name="researcher_id"/>
<field name="branch_custom_id"/>
<field name="district_id"/>
<field name="last_visit_date" optional="hide"/>
<field name="acc_number" optional="hide"/>
<field name="family_member_id" optional="hide"/>
<field name="acc_holder_name" optional="hide"/>
<field name="state" widget="badge"
decoration-success="state in ['first_approve', 'second_approve']"
decoration-muted="state in ['draft','new']"
decoration-danger="state in ['refused','suspended_second_approve']"
decoration-warning="state in ['first_refusal','waiting_approve']"
decoration-info="state not in ('waiting_approve','draft','new','first_approve', 'second_approve','first_refusal','refused','suspended_second_approve')"/>
</tree>
</field>
</page>
<page string="Members" attrs="{'invisible': [('benefit_type', '!=', 'member')]}">
<field name="member_ids" attrs="{'readonly': [('state', '!=', 'draft')]}"