Merge pull request #5709 from expsa/test_benefit

[IMP] odex_benefit: IMP benefit
This commit is contained in:
kchyounes19 2025-12-11 14:58:21 +01:00 committed by GitHub
commit 0d93b32322
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
5 changed files with 135 additions and 13 deletions

View File

@ -212,7 +212,7 @@
- `_get_estimated_rent_amount()`: حساب المبلغ المقدر للإيجار
- `_get_aid_amount()`: حساب مبلغ المساعدة
- `_compute_attachment_lines()`: حساب المرفقات المطلوبة
- `action_create_payment_order()`: إنشاء أمر دفع
- `action_accounting_transfer()`: إنشاء أمر دفع
- `create_vendor_bill()`: إنشاء فاتورة مورد
#### 1.4 `visit.location` - الزيارات

View File

@ -18,7 +18,7 @@
<field name="binding_model_id" ref="odex_benefit.model_seasonal_service"/>
<field name="state">code</field>
<field name="code">
action = records.action_create_payment_order()
action = records.action_accounting_transfer()
</field>
</record>

View File

@ -37,6 +37,9 @@ class SeasonalService(models.Model):
family_disbursement_total_amount = fields.Float(string="Total Family Disbursement Amount",
compute="_compute_family_disbursement", store=True)
payment_order_id = fields.Many2one('payment.orders', string='Payment Order', copy=False, ondelete="set null")
payment_order_count = fields.Integer(compute='_compute_payment_order', string='Number of Payment Orders')
vendor_bill = fields.Many2one('account.move', copy=False)
total_moves = fields.Integer(string="Total Move", compute='_get_total_move_lines')
state = fields.Selection(selection=[
('draft', 'Draft'),
('calculated', 'Calculated'),
@ -69,19 +72,42 @@ class SeasonalService(models.Model):
company_id = fields.Many2one('res.company', string="Company", default=lambda self: self.env.user.company_id)
currency_id = fields.Many2one('res.currency', string="Currency", related='company_id.currency_id')
@api.depends('payment_order_id', 'payment_order_id.state')
@api.depends('payment_order_id', 'payment_order_id.state', 'vendor_bill', 'vendor_bill.state')
def _compute_payment_order_state(self):
for rec in self:
payment_order_state = 'none'
if rec.payment_order_state:
if rec.payment_order_id:
if rec.payment_order_id.state == "done":
payment_order_state = "done"
rec.service_requests_ids.write({'state': 'send_request_to_supplier'})
rec.state = 'waiting_receive'
else:
payment_order_state = "waiting"
elif rec.vendor_bill:
if rec.vendor_bill.state == "posted":
payment_order_state = "done"
rec.state = 'waiting_receive'
else:
payment_order_state = "waiting"
rec.payment_order_state = payment_order_state
@api.depends('payment_order_id')
def _compute_payment_order(self):
for rec in self:
if rec.payment_order_id:
rec.payment_order_count = 1
else:
rec.payment_order_count = 0
@api.depends('vendor_bill', 'payment_order_id')
def _get_total_move_lines(self):
for rec in self:
if rec.service_type_id.payment_method == "payment_order":
moves = rec.payment_order_id.mapped('move_id')
elif rec.service_type_id.payment_method == "invoice":
moves = rec.vendor_bill
rec.total_moves = len(moves)
@api.depends('benefit_ids', 'service_type_id')
def _compute_allowed_member_ids(self):
for rec in self:
@ -185,6 +211,55 @@ class SeasonalService(models.Model):
# rec.payment_order_id = payment_order.id
rec.is_payment_order_done = True
def action_accounting_transfer(self):
validation_setting = self.env["family.validation.setting"].search([], limit=1)
line_ids = []
for rec in self:
if rec.state != 'accounting_approve':
raise UserError(_(
"All selected requests must be in 'Accounting Approve' state."
))
if rec.service_type_id.payment_method == "payment_order":
if rec.payment_order_id:
raise UserError(_(
"A payment order is already linked to this request: %s"
) % rec.name)
payment_order = self.env['payment.orders'].create({
'state': 'draft',
'accountant_id': rec.service_type_id.accountant_id.id,
'seasonal_requests_ids': rec.ids,
'service_requests_ids': rec.service_requests_ids.ids,
'is_seasonal': True,
'type': 'seasonal_services',
})
rec.payment_order_id = payment_order.id
elif rec.service_type_id.payment_method == "invoice":
if rec.vendor_bill:
raise UserError(_(
"A vendor bill is already linked to this request: %s"
) % rec.name)
if not rec.service_requests_ids:
raise UserError(_(
"No service requests found to generate a vendor bill for: %s"
) % rec.name)
for request in rec.service_requests_ids:
invoice_line = (0, 0, {
'name': f'{request.family_id.name}/{request.description}-{request.name}',
'benefit_family_id': request.family_id.id,
'account_id': request.account_id.id,
'analytic_account_id': request.family_id.branch_family_id.branch.analytic_account_id.id,
'quantity': request.requested_quantity or 1, # todo check
'price_unit': request.requested_service_amount,
})
line_ids.append(invoice_line)
vendor_bill = self.env['account.move'].create({
'move_type': 'in_invoice',
'partner_id': rec.service_type_id.service_producer_id.id,
'journal_id': validation_setting.journal_id.id,
'invoice_line_ids': line_ids,
})
rec.vendor_bill = vendor_bill
@api.depends('service_requests_ids')
def compute_family_benefit(self):
for record in self:
@ -223,7 +298,7 @@ class SeasonalService(models.Model):
rec.state = 'gm_assistant'
rec.service_requests_ids.write({'state': 'gm_assistant'})
elif rec.service_delivery_method == "cash":
# rec.action_create_payment_order()
# rec.action_accounting_transfer()
rec.state = "accounting_approve"
rec.service_requests_ids.write({'state': 'accounting_approve'})
elif rec.service_delivery_method == "in_kind":
@ -233,7 +308,7 @@ class SeasonalService(models.Model):
def action_approval_of_gm_assistant(self):
for rec in self:
if rec.service_delivery_method == "cash":
# rec.action_create_payment_order()
# rec.action_accounting_transfer()
rec.state = "accounting_approve"
rec.service_requests_ids.write({'state': 'accounting_approve'})
elif rec.service_delivery_method == "in_kind":
@ -317,3 +392,31 @@ class SeasonalService(models.Model):
for rec in self:
rec.service_requests_ids.write({'state': 'draft'})
rec.state = 'calculated'
def action_open_related_move_records(self):
if self.service_type_id.payment_method == "payment_order":
moves = self.payment_order_id.mapped('move_id')
elif self.service_type_id.payment_method == "invoice":
moves = self.vendor_bill
return {
'name': _('Vendor Bills'),
'type': 'ir.actions.act_window',
'res_model': 'account.move',
'view_mode': 'tree,form',
'domain': [('id', 'in', moves.ids)],
}
def action_open_payment_orders(self):
self.ensure_one()
if not self.payment_order_id:
raise UserError(_("No payment order are linked to this request."))
return {
'name': _('Payment Orders'),
'type': 'ir.actions.act_window',
'res_model': 'payment.orders',
'view_mode': 'tree,form',
'domain': [('id', 'in', self.payment_order_id.ids)],
'context': {'create': False},
}

View File

@ -956,7 +956,7 @@ class ServiceRequest(models.Model):
if self.service_cat.payment_method == "payment_order":
moves = self.payment_order_ids.mapped('move_id')
elif self.service_cat.payment_method == "invoice":
moves = self.vendor_bill.ids
moves = self.vendor_bill
return {
'name': _('Vendor Bills'),

View File

@ -28,7 +28,7 @@
groups="odex_benefit.group_benefit_manager"
attrs="{'invisible': [('state', '!=', 'gm_assistant')]}"/>
<button name="action_create_payment_order"
<button name="action_accounting_transfer"
type="object"
string="امر الصرف"
class="oe_highlight"
@ -53,7 +53,21 @@
statusbar_visible="draft,calculated,accounting_approve,waiting_receive,done"/>
</header>
<sheet>
<div class="oe_button_box" name="button_box">
<button name="action_open_payment_orders"
type="object"
class="oe_stat_button"
icon="fa-money"
attrs="{'invisible': [('payment_order_count', '=', 0)]}">
<field name="payment_order_count" widget="statinfo" string="Payment Orders"/>
</button>
<button name="action_open_related_move_records"
class="oe_stat_button"
icon="fa-file-text-o"
type="object" attrs="{'invisible': [('total_moves', '=', 0)]}">
<field name="total_moves" widget="statinfo" string="Total Moves"/>
</button>
</div>
<field name="is_payment_order_done" invisible="1"/>
<field name="payment_order_state" invisible="1"/>
<widget name="web_ribbon" title="Payment Done" bg_color="bg-success"
@ -79,9 +93,14 @@
<field name="payment_order_id" readonly="1"
groups="odex_benefit.group_benefit_accounting_accept"
attrs="{
'invisible': [('payment_order_id', '=', False)],
'readonly': [('state', '!=', 'draft')]
}"/>
'invisible': [('payment_order_id', '=', False)],
'readonly': [('state', '!=', 'draft')]}"/>
<field name="vendor_bill"
groups="odex_benefit.group_benefit_accounting_accept"
attrs="{
'invisible': [('vendor_bill', '=', False)],
'readonly': [('state', '!=', 'draft')]}"
/>
</group>
<group>