diff --git a/hr_expense_advance_clearing/README.rst b/hr_expense_advance_clearing/README.rst
index f6c2ef55e..a6b207475 100644
--- a/hr_expense_advance_clearing/README.rst
+++ b/hr_expense_advance_clearing/README.rst
@@ -38,12 +38,11 @@ first, then back to company and do the clearing.
There can be 3 scenarios for advance and clearing
-- When clearing amount = advance amount, no other operation is
- required.
-- When clearing amount > advance amount, company will pay the extra to
- employee.
-- When clearing amount < advance amount, employee will return the
- remain to company.
+- When clearing amount = advance amount, no other operation is required.
+- When clearing amount > advance amount, company will pay the extra to
+ employee.
+- When clearing amount < advance amount, employee will return the remain
+ to company.
**Table of contents**
@@ -57,16 +56,16 @@ This module will create a new product "Employee Advance" automatically.
You will need to setup the Expense Account of this product to your
Employee Advance account manually.
-- Open Product window and search for "Employee Advance"
-- On Accounting tab, select appropriate employee advance account from
- your chart of account
+- Open Product window and search for "Employee Advance"
+- On Accounting tab, select appropriate employee advance account from
+ your chart of account
Note:
-- You will need the "Show Full Accounting Features" to see accounting
- data
-- Employee Advance account code, if not already exists, you can create
- one. Use type = Current Asset and check Allow Reconciliation.
+- You will need the "Show Full Accounting Features" to see accounting
+ data
+- Employee Advance account code, if not already exists, you can create
+ one. Use type = Current Asset and check Allow Reconciliation.
Usage
=====
@@ -114,10 +113,10 @@ you can do 2 ways,
Note:
-- If the total expense amount less than or equal to the advance amount,
- the status will be set to Paid right after post journal entries.
-- If the total expense amount more than the advance amount, Register
- Payment will pay the extra amount then set state to Paid.
+- If the total expense amount less than or equal to the advance amount,
+ the status will be set to Paid right after post journal entries.
+- If the total expense amount more than the advance amount, Register
+ Payment will pay the extra amount then set state to Paid.
**Return Advance**
@@ -152,9 +151,9 @@ Authors
Contributors
------------
-- Kitti Upariphutthiphong
-- Tharathip Chaweewongphan
-- Saran Lim.
+- Kitti Upariphutthiphong
+- Tharathip Chaweewongphan
+- Saran Lim.
Maintainers
-----------
diff --git a/hr_expense_advance_clearing/static/description/index.html b/hr_expense_advance_clearing/static/description/index.html
index b652f4a45..2e406e9f3 100644
--- a/hr_expense_advance_clearing/static/description/index.html
+++ b/hr_expense_advance_clearing/static/description/index.html
@@ -378,12 +378,11 @@ Employee Advance and Clearing
first, then back to company and do the clearing.
There can be 3 scenarios for advance and clearing
-- When clearing amount = advance amount, no other operation is
-required.
+- When clearing amount = advance amount, no other operation is required.
- When clearing amount > advance amount, company will pay the extra to
employee.
-- When clearing amount < advance amount, employee will return the
-remain to company.
+- When clearing amount < advance amount, employee will return the remain
+to company.
Table of contents
diff --git a/hr_expense_advance_clearing/tests/test_hr_expense_advance_clearing.py b/hr_expense_advance_clearing/tests/test_hr_expense_advance_clearing.py
index c343d863a..61cfa96f1 100644
--- a/hr_expense_advance_clearing/tests/test_hr_expense_advance_clearing.py
+++ b/hr_expense_advance_clearing/tests/test_hr_expense_advance_clearing.py
@@ -1,76 +1,45 @@
# Copyright 2019 Kitti Upariphutthiphong
+# Copyright 2024 Tecnativa - Víctor Martínez
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).
from odoo import fields
from odoo.exceptions import UserError, ValidationError
-from odoo.tests import common
-from odoo.tests.common import Form
+from odoo.tests.common import Form, tagged
+from odoo.tools import mute_logger
+from odoo.addons.hr_expense.tests.common import TestExpenseCommon
-class TestHrExpenseAdvanceClearing(common.TransactionCase):
+
+@tagged("-at_install", "post_install")
+class TestHrExpenseAdvanceClearing(TestExpenseCommon):
@classmethod
- def setUpClass(cls):
- super().setUpClass()
- company = cls.env.ref("base.main_company")
- cls.company_2 = cls.env["res.company"].create({"name": "Company 2"})
- cls.journal_bank = cls.env["account.journal"].search(
- [("type", "=", "bank")], limit=1
- )
- cls.product = cls.env["product.product"].create(
- {"name": "Service 1", "type": "service"}
- )
- tax_group = cls.env["account.tax.group"].create(
- {"name": "Tax Group 1", "sequence": 1}
- )
- cls.tax = cls.env["account.tax"].create(
- {
- "name": "Tax 10.0%",
- "amount": 10.0,
- "amount_type": "percent",
- "type_tax_use": "purchase",
- "company_id": company.id,
- "tax_group_id": tax_group.id,
- "price_include": True,
- }
- )
- employee_home = cls.env["res.partner"].create(
- {"name": "Employee Home Address", "email": "test_email@email.com"}
- )
- cls.employee = cls.env["hr.employee"].create(
- {"name": "Employee A", "work_contact_id": employee_home.id}
- )
- advance_account = cls.env["account.account"].create(
- {
- "code": "154000",
- "name": "Employee Advance",
- "account_type": "asset_current",
- "reconcile": True,
- }
- )
- cls.account_sales = cls.env["account.account"].create(
- {
- "code": "X1020",
- "name": "Product Sales - (test)",
- "account_type": "asset_current",
- }
- )
+ def setUpClass(cls, chart_template_ref=None):
+ super().setUpClass(chart_template_ref=chart_template_ref)
+ advance_account = cls.company_data["default_account_deferred_expense"]
+ advance_account.reconcile = True
cls.emp_advance = cls.env.ref("hr_expense_advance_clearing.product_emp_advance")
cls.emp_advance.property_account_expense_id = advance_account
+ cls.product_a.standard_price = 0
# Create advance expense 1,000
cls.advance = cls._create_expense_sheet(
- cls, "Advance 1,000", cls.employee, cls.emp_advance, 1000.0, advance=True
+ cls,
+ "Advance 1,000",
+ cls.expense_employee,
+ cls.emp_advance,
+ 1000.0,
+ advance=True,
)
# Create clearing expense 1,000
cls.clearing_equal = cls._create_expense_sheet(
- cls, "Buy service 1,000", cls.employee, cls.product, 1000.0
+ cls, "Buy service 1,000", cls.expense_employee, cls.product_a, 1000.0
)
# Create clearing expense 1,200
cls.clearing_more = cls._create_expense_sheet(
- cls, "Buy service 1,200", cls.employee, cls.product, 1200.0
+ cls, "Buy service 1,200", cls.expense_employee, cls.product_a, 1200.0
)
# Create clearing expense 800
cls.clearing_less = cls._create_expense_sheet(
- cls, "Buy service 800", cls.employee, cls.product, 800.0
+ cls, "Buy service 800", cls.expense_employee, cls.product_a, 800.0
)
def _create_expense(
@@ -122,7 +91,7 @@ def _register_payment(self, move_id, amount, ctx=False, hr_return_advance=False)
ctx["hr_return_advance"] = hr_return_advance
PaymentWizard = self.env["account.payment.register"]
with Form(PaymentWizard.with_context(**ctx)) as f:
- f.journal_id = self.journal_bank
+ f.journal_id = self.company_data["default_journal_bank"]
f.payment_date = fields.Date.today()
f.amount = amount
payment_wizard = f.save()
@@ -138,31 +107,37 @@ def test_0_test_constraints(self):
with self.assertRaises(ValidationError):
expense = self._create_expense(
"Advance 1,000",
- self.employee,
+ self.expense_employee,
self.emp_advance,
1.0,
advance=True,
)
- expense.account_id = self.account_sales.id
+ expense.account_id = self.company_data["default_account_payable"]
expense._check_advance()
# Advance Sheet should not have > 1 expense lines
with self.assertRaises(ValidationError):
expense = self._create_expense(
- "Buy service 1,000", self.employee, self.product, 1.0
+ "Buy service 1,000", self.expense_employee, self.product_a, 1.0
)
self.advance.write({"expense_line_ids": [(4, expense.id)]})
# Advance Expense's product, must not has tax involved
with self.assertRaises(ValidationError):
- self.emp_advance.supplier_taxes_id |= self.tax
+ self.emp_advance.supplier_taxes_id |= self.company_data[
+ "default_tax_purchase"
+ ]
expense = self._create_expense(
- "Advance 1,000", self.employee, self.emp_advance, 1.0, advance=True
+ "Advance 1,000",
+ self.expense_employee,
+ self.emp_advance,
+ 1.0,
+ advance=True,
)
self.emp_advance.supplier_taxes_id = False # Remove tax bf proceed
# Advance Expense, must not paid by company
with self.assertRaises(ValidationError):
expense = self._create_expense(
"Advance 1,000",
- self.employee,
+ self.expense_employee,
self.emp_advance,
1.0,
advance=True,
@@ -172,20 +147,25 @@ def test_0_test_constraints(self):
with self.assertRaises(ValidationError):
expense = self._create_expense(
"Advance 1,000",
- self.employee,
+ self.expense_employee,
self.emp_advance,
1.0,
advance=True,
)
- expense.product_id = self.product.id
+ expense.product_id = self.product_a
expense._check_advance()
# Advance Expense's product must have account configured
with self.assertRaises(ValidationError):
self.emp_advance.property_account_expense_id = False
expense = self._create_expense(
- "Advance 1,000", self.employee, self.emp_advance, 1.0, advance=True
+ "Advance 1,000",
+ self.expense_employee,
+ self.emp_advance,
+ 1.0,
+ advance=True,
)
+ @mute_logger("odoo.models.unlink")
def test_1_clear_equal_advance(self):
"""When clear equal advance, all set"""
# ------------------ Advance --------------------------
@@ -222,10 +202,10 @@ def test_1_clear_equal_advance(self):
len(clearing_dict["domain"][0][2]), self.advance.clearing_count
)
# Check advance from employee
- self.assertEqual(self.employee.advance_count, 1)
- clearing_document = self.employee.action_open_advance_clearing()
+ self.assertEqual(self.expense_employee.advance_count, 1)
+ clearing_document = self.expense_employee.action_open_advance_clearing()
self.assertEqual(
- len(clearing_document["domain"][0][2]), self.employee.advance_count
+ len(clearing_document["domain"][0][2]), self.expense_employee.advance_count
)
# Check back state move in advance after create clearing
with self.assertRaises(UserError):
@@ -235,6 +215,7 @@ def test_1_clear_equal_advance(self):
with self.assertRaises(UserError):
self.advance.account_move_ids._reverse_moves()
+ @mute_logger("odoo.models.unlink")
def test_2_clear_more_than_advance(self):
"""When clear more than advance, do pay more"""
# ------------------ Advance --------------------------
@@ -257,19 +238,21 @@ def test_2_clear_more_than_advance(self):
self._register_payment(self.clearing_more.account_move_ids, 200.0)
self.assertEqual(self.clearing_more.state, "done")
+ @mute_logger("odoo.models.unlink")
def test_3_clear_less_than_advance(self):
"""When clear less than advance, do return advance"""
# ------------------ Advance --------------------------
self.advance.action_submit_sheet()
self.advance.action_approve_expense_sheets()
self.advance.action_sheet_move_create()
+ self.assertEqual(self.advance.clearing_residual, 1000.0)
# Test return advance register payment with move state draft
with self.assertRaises(UserError):
self.advance.account_move_ids.button_draft()
self._register_payment(
self.advance.account_move_ids, 200.0, hr_return_advance=True
)
- self.assertEqual(self.advance.clearing_residual, 1000.0)
+ # self.assertEqual(self.advance.clearing_residual, 1000.0)
self._register_payment(self.advance.account_move_ids, 1000.0)
self.assertEqual(self.advance.state, "done")
# ------------------ Clearing, Return Advance --------------------------
@@ -312,10 +295,11 @@ def test_3_clear_less_than_advance(self):
)
self.assertEqual(len(payment), 1)
+ @mute_logger("odoo.models.unlink")
def test_4_clearing_product_advance(self):
"""When select clearing product on advance"""
# ------------------ Advance --------------------------
- self.advance.expense_line_ids.clearing_product_id = self.product
+ self.advance.expense_line_ids.clearing_product_id = self.product_a
self.advance.action_submit_sheet()
self.advance.action_approve_expense_sheets()
self.advance.action_sheet_move_create()
@@ -325,7 +309,7 @@ def test_4_clearing_product_advance(self):
# ------------------ Clearing --------------------------
with Form(self.env["hr.expense.sheet"]) as sheet:
sheet.name = "Test Clearing"
- sheet.employee_id = self.employee
+ sheet.employee_id = self.expense_employee
ex_sheet = sheet.save()
ex_sheet.advance_sheet_id = self.advance
self.assertEqual(len(ex_sheet.expense_line_ids), 0)