refactor: migrate Odoo 19 view components, update payment reference fields, and simplify account domain constraints

This commit is contained in:
Suherdy Yacob 2026-04-21 10:59:47 +07:00
parent 4a64d2b73c
commit bfaacbfe7c
6 changed files with 20 additions and 42 deletions

View File

@ -90,7 +90,7 @@ class AccountPayment(models.Model):
if hr_expense_class and self._context.get('skip_expense_lock'): if hr_expense_class and self._context.get('skip_expense_lock'):
return super(hr_expense_class, self).write(vals) return super(hr_expense_class, self).write(vals)
if self.expense_sheet_id and self.state == 'draft': if self.expense_ids and self.state == 'draft':
return super(AccountPayment, self.with_context(skip_expense_lock=True)).write(vals) return super(AccountPayment, self.with_context(skip_expense_lock=True)).write(vals)
return super().write(vals) return super().write(vals)
@ -103,10 +103,10 @@ class AccountPayment(models.Model):
res = super().action_cancel() res = super().action_cancel()
for payment in self: for payment in self:
if payment.expense_sheet_id: if payment.expense_ids:
payment.expense_sheet_id.invalidate_recordset(['state']) payment.expense_ids.invalidate_recordset(['state'])
if payment.realization_id and payment.realization_id.expense_sheet_id: if payment.realization_id and payment.realization_id.expense_id:
payment.realization_id.expense_sheet_id.invalidate_recordset(['state']) payment.realization_id.expense_id.invalidate_recordset(['state'])
return res return res
def action_draft(self): def action_draft(self):
@ -118,10 +118,10 @@ class AccountPayment(models.Model):
res = super().action_draft() res = super().action_draft()
for payment in self: for payment in self:
if payment.expense_sheet_id: if payment.expense_ids:
payment.expense_sheet_id.invalidate_recordset(['state']) payment.expense_ids.invalidate_recordset(['state'])
if payment.realization_id and payment.realization_id.expense_sheet_id: if payment.realization_id and payment.realization_id.expense_id:
payment.realization_id.expense_sheet_id.invalidate_recordset(['state']) payment.realization_id.expense_id.invalidate_recordset(['state'])
return res return res
def _seek_for_lines(self): def _seek_for_lines(self):

View File

@ -207,7 +207,7 @@ class HrExpense(models.Model):
for expense in self: for expense in self:
if expense.account_move_id: if expense.account_move_id:
move = expense.sudo().account_move_id move = expense.sudo().account_move_id
payment = move.payment_id payment = move.origin_payment_id
if payment: if payment:
if payment.state in ('posted', 'draft'): if payment.state in ('posted', 'draft'):
payment.action_cancel() payment.action_cancel()

View File

@ -7,14 +7,14 @@ class ProductTemplate(models.Model):
'account.account', 'account.account',
string="Expense Account (Employee)", string="Expense Account (Employee)",
company_dependent=True, company_dependent=True,
domain="[('account_type', 'not in', ('asset_receivable', 'liability_payable', 'asset_cash', 'liability_credit_card')), ('deprecated', '=', False)]", domain="[('account_type', 'not in', ('asset_receivable', 'liability_payable', 'asset_cash', 'liability_credit_card'))]",
help="Account used for expenses paid by the employee (to be reimbursed)." help="Account used for expenses paid by the employee (to be reimbursed)."
) )
property_account_expense_company_id = fields.Many2one( property_account_expense_company_id = fields.Many2one(
'account.account', 'account.account',
string="Expense Account (Company)", string="Expense Account (Company)",
company_dependent=True, company_dependent=True,
domain="[('account_type', 'not in', ('asset_receivable', 'liability_payable', 'asset_cash', 'liability_credit_card')), ('deprecated', '=', False)]", domain="[('account_type', 'not in', ('asset_receivable', 'liability_payable', 'asset_cash', 'liability_credit_card'))]",
help="Account used for expenses paid by the company." help="Account used for expenses paid by the company."
) )
receipt_due_days = fields.Integer( receipt_due_days = fields.Integer(

View File

@ -5,14 +5,14 @@
<field name="name">hr.expense.realization.view.tree</field> <field name="name">hr.expense.realization.view.tree</field>
<field name="model">hr.expense.realization</field> <field name="model">hr.expense.realization</field>
<field name="arch" type="xml"> <field name="arch" type="xml">
<tree string="Expense Realization"> <list string="Expense Realization">
<field name="name"/> <field name="name"/>
<field name="date"/> <field name="date"/>
<field name="employee_id"/> <field name="employee_id"/>
<field name="expense_id"/> <field name="expense_id"/>
<field name="total_amount" sum="Total Amount"/> <field name="total_amount" sum="Total Amount"/>
<field name="state" widget="badge" decoration-info="state == 'draft'" decoration-warning="state == 'confirmed'" decoration-success="state == 'posted'"/> <field name="state" widget="badge" decoration-info="state == 'draft'" decoration-warning="state == 'confirmed'" decoration-success="state == 'posted'"/>
</tree> </list>
</field> </field>
</record> </record>
@ -90,14 +90,14 @@
<notebook> <notebook>
<page string="Receipts" name="receipt_lines"> <page string="Receipts" name="receipt_lines">
<field name="line_ids" readonly="state == 'posted'"> <field name="line_ids" readonly="state == 'posted'">
<tree editable="bottom"> <list editable="bottom">
<field name="description"/> <field name="description"/>
<field name="amount" sum="Total"/> <field name="amount" sum="Total"/>
<field name="attachment_id" filename="attachment_name" widget="binary"/> <field name="attachment_id" filename="attachment_name" widget="binary"/>
<field name="attachment_name" column_invisible="1"/> <field name="attachment_name" column_invisible="1"/>
<field name="counterpart_account_id" groups="account.group_account_invoice" required="parent.state == 'confirmed'"/> <field name="counterpart_account_id" groups="account.group_account_invoice" required="parent.state == 'confirmed'"/>
<field name="move_id" groups="account.group_account_invoice" widget="many2one_clickable" readonly="1" invisible="not move_id"/> <field name="move_id" groups="account.group_account_invoice" widget="many2one_clickable" readonly="1" invisible="not move_id"/>
</tree> </list>
</field> </field>
</page> </page>
<page string="Notes" name="notes"> <page string="Notes" name="notes">
@ -114,33 +114,11 @@
</field> </field>
</record> </record>
<!-- Realization Search View -->
<record id="hr_expense_realization_view_search" model="ir.ui.view">
<field name="name">hr.expense.realization.view.search</field>
<field name="model">hr.expense.realization</field>
<field name="arch" type="xml">
<search string="Search Realization">
<field name="name"/>
<field name="employee_id"/>
<field name="expense_id"/>
<filter string="Draft" name="draft" domain="[('state', '=', 'draft')]"/>
<filter string="Confirmed" name="confirmed" domain="[('state', '=', 'confirmed')]"/>
<filter string="Posted" name="posted" domain="[('state', '=', 'posted')]"/>
<group expand="0" string="Group By">
<filter string="Employee" name="group_employee" context="{'group_by': 'employee_id'}"/>
<filter string="Status" name="group_state" context="{'group_by': 'state'}"/>
<filter string="Date" name="group_date" context="{'group_by': 'date'}"/>
</group>
</search>
</field>
</record>
<!-- Realization Action --> <!-- Realization Action -->
<record id="action_hr_expense_realization" model="ir.actions.act_window"> <record id="action_hr_expense_realization" model="ir.actions.act_window">
<field name="name">Realization Report</field> <field name="name">Realization Report</field>
<field name="res_model">hr.expense.realization</field> <field name="res_model">hr.expense.realization</field>
<field name="view_mode">tree,form</field> <field name="view_mode">list,form</field>
<field name="search_view_id" ref="hr_expense_realization_view_search"/>
<field name="help" type="html"> <field name="help" type="html">
<p class="o_view_nocontent_smiling_face"> <p class="o_view_nocontent_smiling_face">
Create a new Realization Report Create a new Realization Report

View File

@ -106,7 +106,7 @@
<field name="model">hr.expense</field> <field name="model">hr.expense</field>
<field name="inherit_id" ref="hr_expense.hr_expense_view_search"/> <field name="inherit_id" ref="hr_expense.hr_expense_view_search"/>
<field name="arch" type="xml"> <field name="arch" type="xml">
<xpath expr="//filter[@name='my_expenses']" position="after"> <xpath expr="//filter[@name='my_open_expenses']" position="after">
<separator/> <separator/>
<filter string="Wait Post" name="filter_wait_post" domain="[('state', '=', 'wait_post')]"/> <filter string="Wait Post" name="filter_wait_post" domain="[('state', '=', 'wait_post')]"/>
<filter string="Overdue Receipts" name="filter_receipt_overdue" domain="[('receipt_overdue', '=', True), ('receipt_received', '=', False)]"/> <filter string="Overdue Receipts" name="filter_receipt_overdue" domain="[('receipt_overdue', '=', True), ('receipt_received', '=', False)]"/>
@ -145,7 +145,7 @@
<!-- Update Actions to include Wait Post in SearchPanel --> <!-- Update Actions to include Wait Post in SearchPanel -->
<record id="hr_expense.hr_expense_actions_my_all" model="ir.actions.act_window"> <record id="hr_expense.hr_expense_actions_my_all" model="ir.actions.act_window">
<field name="context">{ 'searchpanel_default_state': ["draft", "submitted", "approved", "posted", "wait_post", "paid"], 'search_default_my_expenses': 1 }</field> <field name="context">{ 'searchpanel_default_state': ["draft", "submitted", "approved", "posted", "wait_post", "paid"], 'search_default_my_open_expenses': 1 }</field>
</record> </record>
<record id="hr_expense.hr_expense_actions_all" model="ir.actions.act_window"> <record id="hr_expense.hr_expense_actions_all" model="ir.actions.act_window">

View File

@ -23,7 +23,7 @@
<field name="model">product.template</field> <field name="model">product.template</field>
<field name="inherit_id" ref="account.product_template_form_view"/> <field name="inherit_id" ref="account.product_template_form_view"/>
<field name="arch" type="xml"> <field name="arch" type="xml">
<xpath expr="//group[@name='payables']" position="inside"> <xpath expr="//field[@name='property_account_expense_id']" position="after">
<field name="property_account_expense_employee_id" invisible="not can_be_expensed"/> <field name="property_account_expense_employee_id" invisible="not can_be_expensed"/>
<field name="property_account_expense_company_id" invisible="not can_be_expensed"/> <field name="property_account_expense_company_id" invisible="not can_be_expensed"/>
<field name="receipt_due_days" invisible="not can_be_expensed"/> <field name="receipt_due_days" invisible="not can_be_expensed"/>