Files
odoo_source/addons/hr_expense/models/account_move_line.py
T
MerlinGuillaume a3d4d2dd7f [FIX] hr_expense: post expense paid by company
It is not possible to post the journal entries related to an expense
paid by the company

Steps to reproduce:
1. Install Expense
2. Create an expense payable to company
3. Set an amount
4. Create report
5. Submit report
6. Approve report
7. Attempt to post
8. An error is thrown

Solution:
Relax the constraint on account.move.line linked to an expense paid by
the company

Problem:
The constraint `_check_payable_receivable` in the account module forbids
to post the journal entries even though they are correct

opw-3038648

closes odoo/odoo#106266

X-original-commit: 09274db12a25c178974dc20c4d669134e21cddbe
Signed-off-by: William André (wan) <wan@odoo.com>
Signed-off-by: Guillaume Merlin (megu) <megu@odoo.com>
2022-11-22 17:09:27 +01:00

66 lines
3.0 KiB
Python

# -*- coding: utf-8 -*-
# Part of Odoo. See LICENSE file for full copyright and licensing details.
from odoo import api, fields, models
from odoo.tools.misc import frozendict
class AccountMoveLine(models.Model):
_inherit = "account.move.line"
expense_id = fields.Many2one('hr.expense', string='Expense', copy=False)
@api.constrains('account_id', 'display_type')
def _check_payable_receivable(self):
super(AccountMoveLine, self.filtered(lambda line: not line.expense_id or line.expense_id.payment_mode != 'company_account'))._check_payable_receivable()
def reconcile(self):
# OVERRIDE
not_paid_expenses = self.expense_id.filtered(lambda expense: expense.state != 'done')
res = super().reconcile()
# Do not update expense or expense sheet states when reversing journal entries
not_paid_expense_sheets = not_paid_expenses.sheet_id.filtered(lambda sheet: sheet.account_move_id.payment_state != 'reversed')
paid_expenses = not_paid_expenses.filtered(lambda expense: expense.currency_id.is_zero(expense.amount_residual))
paid_expenses.write({'state': 'done'})
not_paid_expense_sheets.filtered(lambda sheet: all(expense.state == 'done' for expense in sheet.expense_line_ids)).set_to_paid()
return res
def _get_attachment_domains(self):
attachment_domains = super(AccountMoveLine, self)._get_attachment_domains()
if self.expense_id:
attachment_domains.append([('res_model', '=', 'hr.expense'), ('res_id', '=', self.expense_id.id)])
return attachment_domains
def _compute_tax_key(self):
super()._compute_tax_key()
for line in self:
if line.expense_id:
line.tax_key = frozendict(**line.tax_key, expense_id=line.expense_id.id)
def _compute_all_tax(self):
expense_lines = self.filtered('expense_id')
super(AccountMoveLine, expense_lines.with_context(force_price_include=True))._compute_all_tax()
super(AccountMoveLine, self - expense_lines)._compute_all_tax()
for line in expense_lines:
for key in list(line.compute_all_tax.keys()):
new_key = frozendict(**key, expense_id=line.expense_id.id)
line.compute_all_tax[new_key] = line.compute_all_tax.pop(key)
def _compute_totals(self):
expenses = self.filtered('expense_id')
super(AccountMoveLine, expenses.with_context(force_price_include=True))._compute_totals()
super(AccountMoveLine, self - expenses)._compute_totals()
def _compute_term_key(self):
super()._compute_term_key()
for line in self:
if line.expense_id:
line.term_key = line.term_key and frozendict(**line.term_key, expense_id=line.expense_id.id)
def _convert_to_tax_base_line_dict(self):
result = super()._convert_to_tax_base_line_dict()
if self.move_id.expense_sheet_id:
result.setdefault('extra_context', {})
result['extra_context']['force_price_include'] = True
return result