From 8ac5e95a63901065fbeff2ec2adc1a34f0afb4d1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?V=C3=ADctor=20Mart=C3=ADnez?= Date: Wed, 27 Nov 2024 09:47:41 +0100 Subject: [PATCH] [FIX] hr_expense_advance_clearing: Fix + improve tests Related to https://github.com/odoo/odoo/commit/063e224c17c0e0194e5ade6acbe82ff38a669b54 --- hr_expense_advance_clearing/README.rst | 39 +++--- .../static/description/index.html | 7 +- .../tests/test_hr_expense_advance_clearing.py | 120 ++++++++---------- 3 files changed, 74 insertions(+), 92 deletions(-) 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)