From 49aa1500edb3a0fab49445c4c48f4a67985d1841 Mon Sep 17 00:00:00 2001
From: Kitti U
Date: Wed, 4 Aug 2021 21:28:40 +0700
Subject: [PATCH 01/16] [14.0][ADD] hr_expense_pay_to_vendor
---
hr_expense_pay_to_vendor/__init__.py | 3 +
hr_expense_pay_to_vendor/__manifest__.py | 15 +++
hr_expense_pay_to_vendor/models/__init__.py | 3 +
hr_expense_pay_to_vendor/models/hr_expense.py | 96 ++++++++++++++++++
.../readme/CONTRIBUTORS.rst | 1 +
.../readme/DESCRIPTION.rst | 7 ++
hr_expense_pay_to_vendor/readme/USAGE.rst | 11 ++
.../static/description/icon.png | Bin 0 -> 9455 bytes
hr_expense_pay_to_vendor/tests/__init__.py | 3 +
.../tests/test_hr_expense_pay_to_vendor.py | 96 ++++++++++++++++++
.../views/hr_expense_views.xml | 32 ++++++
11 files changed, 267 insertions(+)
create mode 100644 hr_expense_pay_to_vendor/__init__.py
create mode 100644 hr_expense_pay_to_vendor/__manifest__.py
create mode 100644 hr_expense_pay_to_vendor/models/__init__.py
create mode 100644 hr_expense_pay_to_vendor/models/hr_expense.py
create mode 100644 hr_expense_pay_to_vendor/readme/CONTRIBUTORS.rst
create mode 100644 hr_expense_pay_to_vendor/readme/DESCRIPTION.rst
create mode 100644 hr_expense_pay_to_vendor/readme/USAGE.rst
create mode 100644 hr_expense_pay_to_vendor/static/description/icon.png
create mode 100644 hr_expense_pay_to_vendor/tests/__init__.py
create mode 100644 hr_expense_pay_to_vendor/tests/test_hr_expense_pay_to_vendor.py
create mode 100644 hr_expense_pay_to_vendor/views/hr_expense_views.xml
diff --git a/hr_expense_pay_to_vendor/__init__.py b/hr_expense_pay_to_vendor/__init__.py
new file mode 100644
index 000000000..4b76c7b2d
--- /dev/null
+++ b/hr_expense_pay_to_vendor/__init__.py
@@ -0,0 +1,3 @@
+# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl.html).
+
+from . import models
diff --git a/hr_expense_pay_to_vendor/__manifest__.py b/hr_expense_pay_to_vendor/__manifest__.py
new file mode 100644
index 000000000..6b2f64ee9
--- /dev/null
+++ b/hr_expense_pay_to_vendor/__manifest__.py
@@ -0,0 +1,15 @@
+# Copyright 2021 Ecosoft
+# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl.html).
+
+{
+ "name": "HR Expense - Pay To Vendor",
+ "version": "14.0.1.0.0",
+ "author": "Ecosoft, Odoo Community Association (OCA)",
+ "website": "https://github.com/OCA/hr-expense",
+ "license": "AGPL-3",
+ "category": "Human Resources",
+ "depends": ["hr_expense"],
+ "data": ["views/hr_expense_views.xml"],
+ "installable": True,
+ "maintainers": ["kittiu"],
+}
diff --git a/hr_expense_pay_to_vendor/models/__init__.py b/hr_expense_pay_to_vendor/models/__init__.py
new file mode 100644
index 000000000..5faa7f9c8
--- /dev/null
+++ b/hr_expense_pay_to_vendor/models/__init__.py
@@ -0,0 +1,3 @@
+# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl.html).
+
+from . import hr_expense
diff --git a/hr_expense_pay_to_vendor/models/hr_expense.py b/hr_expense_pay_to_vendor/models/hr_expense.py
new file mode 100644
index 000000000..6c4733e1d
--- /dev/null
+++ b/hr_expense_pay_to_vendor/models/hr_expense.py
@@ -0,0 +1,96 @@
+# Copyright 2021 Ecosoft
+# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl.html).
+
+from odoo import _, api, fields, models
+from odoo.exceptions import ValidationError
+
+
+class HrExpense(models.Model):
+ _inherit = "hr.expense"
+
+ vendor_id = fields.Many2one(
+ comodel_name="res.partner",
+ string="To Vendor",
+ help="Paid by company direct to this vendor",
+ )
+
+ def _get_account_move_line_values(self):
+ move_line_values_by_expense = super()._get_account_move_line_values()
+ # If pay from company to vendor, change partner_id = vendor_id
+ if move_line_values_by_expense:
+ sheet = self[0].sheet_id
+ payment_mode = sheet.payment_mode
+ vendor_id = sheet.vendor_id.id
+ if payment_mode == "company_account" and vendor_id:
+ for expense_id, vals in move_line_values_by_expense.items():
+ expense = self.env["hr.expense"].browse(expense_id)
+ move_line_name = (
+ expense.vendor_id.name + ": " + expense.name.split("\n")[0][:64]
+ )
+ account_src = expense._get_expense_account_source()
+ account_dst = expense._get_expense_account_destination()
+ account_ids = [account_src.id, account_dst]
+ for val in vals:
+ val["partner_id"] = vendor_id
+ if val["account_id"] in account_ids:
+ val["name"] = move_line_name
+ return move_line_values_by_expense
+
+ def _get_expense_account_destination(self):
+ self.ensure_one()
+ if not (self.payment_mode == "company_account" and self.vendor_id):
+ return super()._get_expense_account_destination()
+ # Use vendor's account
+ account_dest = (
+ self.vendor_id.property_account_payable_id.id
+ or self.vendor_id.parent_id.property_account_payable_id.id
+ )
+ return account_dest
+
+ def _prepare_move_values(self):
+ move_values = super()._prepare_move_values()
+ if self.payment_mode == "company_account" and self.vendor_id:
+ move_values["journal_id"] = self.sheet_id.journal_id.id
+ return move_values
+
+
+class HrExpenseSheet(models.Model):
+ _inherit = "hr.expense.sheet"
+
+ vendor_id = fields.Many2one(
+ comodel_name="res.partner",
+ related="expense_line_ids.vendor_id",
+ string="To Vendor",
+ readonly=True,
+ )
+
+ @api.constrains("expense_line_ids")
+ def _check_payment_mode(self):
+ super()._check_payment_mode()
+ for sheet in self:
+ payment_mode = sheet.expense_line_ids.mapped("payment_mode")
+ if payment_mode and payment_mode[0] == "company_account":
+ expense_lines = sheet.mapped("expense_line_ids")
+ if expense_lines and any(
+ expense.vendor_id != expense_lines[0].vendor_id
+ for expense in expense_lines
+ ):
+ raise ValidationError(
+ _("Expenses must be paying to the same vendor.")
+ )
+
+ def paid_expense_sheets(self):
+ """ For expense paid direct to vendor, do not set done """
+ self = self.filtered(
+ lambda l: l.payment_mode == "company_account" and not l.vendor_id
+ )
+ super(HrExpenseSheet, self).paid_expense_sheets()
+
+ def action_sheet_move_create(self):
+ # For expense paid by copany to vendor, only set state to post
+ res = super().action_sheet_move_create()
+ to_post = self.filtered(
+ lambda l: l.payment_mode == "company_account" and l.vendor_id
+ )
+ to_post.write({"state": "post"})
+ return res
diff --git a/hr_expense_pay_to_vendor/readme/CONTRIBUTORS.rst b/hr_expense_pay_to_vendor/readme/CONTRIBUTORS.rst
new file mode 100644
index 000000000..6ce956d96
--- /dev/null
+++ b/hr_expense_pay_to_vendor/readme/CONTRIBUTORS.rst
@@ -0,0 +1 @@
+* Kitti U.
diff --git a/hr_expense_pay_to_vendor/readme/DESCRIPTION.rst b/hr_expense_pay_to_vendor/readme/DESCRIPTION.rst
new file mode 100644
index 000000000..39a87df7a
--- /dev/null
+++ b/hr_expense_pay_to_vendor/readme/DESCRIPTION.rst
@@ -0,0 +1,7 @@
+This module allow expense "Pay to Vendor" as option when user select, Paid By Company.
+
+**Pay to Vendor** is suitable for cases when user wanted to buy something, i.e., Plane Ticket,
+but do not want to pay money him/herself and use expense as the way to make payment order to accounting department.
+
+When expense has posted journal entry, the AR will be set to Vendor (and not the Employee).
+Then, register the payment will be clearing the AR to Bank.
diff --git a/hr_expense_pay_to_vendor/readme/USAGE.rst b/hr_expense_pay_to_vendor/readme/USAGE.rst
new file mode 100644
index 000000000..38d5f6c5c
--- /dev/null
+++ b/hr_expense_pay_to_vendor/readme/USAGE.rst
@@ -0,0 +1,11 @@
+To use this module, you need to:
+
+#. Go to *Expenses -> My Expenses -> Expenses to Submit* and create a new
+ *Expense* with *Company* as Paid By, and a Vendor as Pay to Vendor
+#. Click on *Submit to Manager* button
+#. Click on *Approve* button
+#. Click on *Post Journal Entries* button, the Receivable will be on Vendor
+#. Click on *Register Payment* button, fill in the data of the wizard and
+ click on *Validate* button
+
+You can now check that the partner in journal entries are on Vendor, and not on Employee.
diff --git a/hr_expense_pay_to_vendor/static/description/icon.png b/hr_expense_pay_to_vendor/static/description/icon.png
new file mode 100644
index 0000000000000000000000000000000000000000..3a0328b516c4980e8e44cdb63fd945757ddd132d
GIT binary patch
literal 9455
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
z
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
Xviia!U7SGha1wx#SCgwmn*{w2TRX*I
literal 0
HcmV?d00001
diff --git a/hr_expense_pay_to_vendor/tests/__init__.py b/hr_expense_pay_to_vendor/tests/__init__.py
new file mode 100644
index 000000000..99cce1cfa
--- /dev/null
+++ b/hr_expense_pay_to_vendor/tests/__init__.py
@@ -0,0 +1,3 @@
+# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl.html).
+
+from . import test_hr_expense_pay_to_vendor
diff --git a/hr_expense_pay_to_vendor/tests/test_hr_expense_pay_to_vendor.py b/hr_expense_pay_to_vendor/tests/test_hr_expense_pay_to_vendor.py
new file mode 100644
index 000000000..ec2107014
--- /dev/null
+++ b/hr_expense_pay_to_vendor/tests/test_hr_expense_pay_to_vendor.py
@@ -0,0 +1,96 @@
+# Copyright 2021 Ecosoft
+# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl).
+
+from odoo.tests.common import Form, TransactionCase
+
+
+class TestHrExpensePayToVendor(TransactionCase):
+ def setUp(self):
+ super(TestHrExpensePayToVendor, self).setUp()
+ self.vendor = self.env["res.partner"].create({"name": "Test Vendor"})
+ self.payment_obj = self.env["account.payment"]
+ self.account_payment_register = self.env["account.payment.register"]
+ self.payment_journal = self.env["account.journal"].search(
+ [("type", "in", ["cash", "bank"])], limit=1
+ )
+
+ self.main_company = company = self.env.ref("base.main_company")
+ self.expense_journal = self.env["account.journal"].create(
+ {
+ "name": "Purchase Journal - Test",
+ "code": "HRTPJ",
+ "type": "purchase",
+ "company_id": company.id,
+ }
+ )
+
+ def _get_payment_wizard(self, expense_sheet):
+ action = expense_sheet.action_register_payment()
+ ctx = action.get("context")
+ with Form(
+ self.account_payment_register.with_context(ctx),
+ view="account.view_account_payment_register_form",
+ ) as f:
+ f.journal_id = self.payment_journal
+ f.amount = self.expense_sheet.total_amount
+ register_payment = f.save()
+ return register_payment
+
+ def test_expense_pay_to_vendor(self):
+ """When expense is set to pay to vendor, I expect,
+ - After post journal entries, all journal items will use partner_id = vendor
+ - After make payment, all journal items will use partner_id = vendor
+ """
+ self.expense_sheet = self.env["hr.expense.sheet"].create(
+ {
+ "employee_id": self.ref("hr.employee_admin"),
+ "name": "Expense test",
+ "journal_id": self.expense_journal.id,
+ }
+ )
+ self.expenses = self.env["hr.expense"].create(
+ [
+ {
+ "name": "Expense Line 1",
+ "employee_id": self.ref("hr.employee_admin"),
+ "product_id": self.ref("hr_expense.air_ticket"),
+ "unit_amount": 1,
+ "quantity": 10,
+ "sheet_id": self.expense_sheet.id,
+ "payment_mode": "company_account",
+ "vendor_id": self.vendor.id,
+ },
+ {
+ "name": "Expense Line 1",
+ "employee_id": self.ref("hr.employee_admin"),
+ "product_id": self.ref("hr_expense.air_ticket"),
+ "unit_amount": 1,
+ "quantity": 20,
+ "sheet_id": self.expense_sheet.id,
+ "payment_mode": "company_account",
+ "vendor_id": self.vendor.id,
+ },
+ ]
+ )
+ self.assertEqual(self.expense_sheet.payment_mode, "company_account")
+ self.assertEqual(
+ list(set(self.expense_sheet.expense_line_ids.mapped("payment_mode"))),
+ ["company_account"],
+ )
+ # Post Journl Entry
+ self.expense_sheet.action_submit_sheet()
+ self.expense_sheet.approve_expense_sheets()
+ self.expense_sheet.action_sheet_move_create()
+ expense_move = self.expense_sheet.account_move_id
+ vendor_name = expense_move.line_ids.mapped("partner_id.name")[0]
+ self.assertEqual(vendor_name, "Test Vendor")
+ # Make payment
+ payment_wizard = self._get_payment_wizard(self.expense_sheet)
+ payment_wizard.action_create_payments()
+ # Payment move, should also use partner_id = vendor
+ reconcile_moves = self.expense_sheet.account_move_id.line_ids.mapped(
+ "full_reconcile_id.reconciled_line_ids.move_id"
+ )
+ payment_move = reconcile_moves - expense_move
+ vendor_name = payment_move.line_ids.mapped("partner_id.name")[0]
+ self.assertEqual(vendor_name, "Test Vendor")
diff --git a/hr_expense_pay_to_vendor/views/hr_expense_views.xml b/hr_expense_pay_to_vendor/views/hr_expense_views.xml
new file mode 100644
index 000000000..c1a78b5a8
--- /dev/null
+++ b/hr_expense_pay_to_vendor/views/hr_expense_views.xml
@@ -0,0 +1,32 @@
+
+
+ hr.expense.sheet.form.inherit
+ hr.expense.sheet
+
+
+
+
+
+
+
+
+
+ hr.expense.view.form
+ hr.expense
+
+
+
+
+
+
+
+
+
+
+
From 7279b869071fc93fd37035a876460c08d031c78b Mon Sep 17 00:00:00 2001
From: Saran440
Date: Fri, 26 Nov 2021 12:51:44 +0700
Subject: [PATCH 02/16] [FIX] send context skip create payment, if you install
module hr_expense_payment
---
hr_expense_pay_to_vendor/models/hr_expense.py | 5 ++++-
1 file changed, 4 insertions(+), 1 deletion(-)
diff --git a/hr_expense_pay_to_vendor/models/hr_expense.py b/hr_expense_pay_to_vendor/models/hr_expense.py
index 6c4733e1d..6746dcaac 100644
--- a/hr_expense_pay_to_vendor/models/hr_expense.py
+++ b/hr_expense_pay_to_vendor/models/hr_expense.py
@@ -88,7 +88,10 @@ def paid_expense_sheets(self):
def action_sheet_move_create(self):
# For expense paid by copany to vendor, only set state to post
- res = super().action_sheet_move_create()
+ # Skip create payment (if you install module hr_expense_payment)
+ res = super(
+ HrExpenseSheet, self.with_context(skip_create_payment_company_account=True)
+ ).action_sheet_move_create()
to_post = self.filtered(
lambda l: l.payment_mode == "company_account" and l.vendor_id
)
From 376c54bf82977ddec1877bd6a3ff890d0ae7e242 Mon Sep 17 00:00:00 2001
From: Saran440
Date: Thu, 19 May 2022 13:37:19 +0700
Subject: [PATCH 03/16] [FIX] no send context
---
hr_expense_pay_to_vendor/models/hr_expense.py | 9 +++------
1 file changed, 3 insertions(+), 6 deletions(-)
diff --git a/hr_expense_pay_to_vendor/models/hr_expense.py b/hr_expense_pay_to_vendor/models/hr_expense.py
index 6746dcaac..fefdf8e37 100644
--- a/hr_expense_pay_to_vendor/models/hr_expense.py
+++ b/hr_expense_pay_to_vendor/models/hr_expense.py
@@ -80,18 +80,15 @@ def _check_payment_mode(self):
)
def paid_expense_sheets(self):
- """ For expense paid direct to vendor, do not set done """
+ """For expense paid direct to vendor, do not set done"""
self = self.filtered(
lambda l: l.payment_mode == "company_account" and not l.vendor_id
)
- super(HrExpenseSheet, self).paid_expense_sheets()
+ return super(HrExpenseSheet, self).paid_expense_sheets()
def action_sheet_move_create(self):
# For expense paid by copany to vendor, only set state to post
- # Skip create payment (if you install module hr_expense_payment)
- res = super(
- HrExpenseSheet, self.with_context(skip_create_payment_company_account=True)
- ).action_sheet_move_create()
+ res = super().action_sheet_move_create()
to_post = self.filtered(
lambda l: l.payment_mode == "company_account" and l.vendor_id
)
From 32feda2e3c4c3c8fa0b778d42f817e1c32fe9cef Mon Sep 17 00:00:00 2001
From: oca-ci
Date: Thu, 6 Oct 2022 16:50:40 +0000
Subject: [PATCH 04/16] [UPD] Update hr_expense_pay_to_vendor.pot
---
.../i18n/hr_expense_pay_to_vendor.pot | 60 +++++++++++++++++++
1 file changed, 60 insertions(+)
create mode 100644 hr_expense_pay_to_vendor/i18n/hr_expense_pay_to_vendor.pot
diff --git a/hr_expense_pay_to_vendor/i18n/hr_expense_pay_to_vendor.pot b/hr_expense_pay_to_vendor/i18n/hr_expense_pay_to_vendor.pot
new file mode 100644
index 000000000..4511ba094
--- /dev/null
+++ b/hr_expense_pay_to_vendor/i18n/hr_expense_pay_to_vendor.pot
@@ -0,0 +1,60 @@
+# Translation of Odoo Server.
+# This file contains the translation of the following modules:
+# * hr_expense_pay_to_vendor
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: Odoo Server 14.0\n"
+"Report-Msgid-Bugs-To: \n"
+"Last-Translator: \n"
+"Language-Team: \n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: \n"
+"Plural-Forms: \n"
+
+#. module: hr_expense_pay_to_vendor
+#: model:ir.model.fields,field_description:hr_expense_pay_to_vendor.field_hr_expense__display_name
+#: model:ir.model.fields,field_description:hr_expense_pay_to_vendor.field_hr_expense_sheet__display_name
+msgid "Display Name"
+msgstr ""
+
+#. module: hr_expense_pay_to_vendor
+#: model:ir.model,name:hr_expense_pay_to_vendor.model_hr_expense
+msgid "Expense"
+msgstr ""
+
+#. module: hr_expense_pay_to_vendor
+#: model:ir.model,name:hr_expense_pay_to_vendor.model_hr_expense_sheet
+msgid "Expense Report"
+msgstr ""
+
+#. module: hr_expense_pay_to_vendor
+#: code:addons/hr_expense_pay_to_vendor/models/hr_expense.py:0
+#, python-format
+msgid "Expenses must be paying to the same vendor."
+msgstr ""
+
+#. module: hr_expense_pay_to_vendor
+#: model:ir.model.fields,field_description:hr_expense_pay_to_vendor.field_hr_expense__id
+#: model:ir.model.fields,field_description:hr_expense_pay_to_vendor.field_hr_expense_sheet__id
+msgid "ID"
+msgstr ""
+
+#. module: hr_expense_pay_to_vendor
+#: model:ir.model.fields,field_description:hr_expense_pay_to_vendor.field_hr_expense____last_update
+#: model:ir.model.fields,field_description:hr_expense_pay_to_vendor.field_hr_expense_sheet____last_update
+msgid "Last Modified on"
+msgstr ""
+
+#. module: hr_expense_pay_to_vendor
+#: model:ir.model.fields,help:hr_expense_pay_to_vendor.field_hr_expense__vendor_id
+#: model:ir.model.fields,help:hr_expense_pay_to_vendor.field_hr_expense_sheet__vendor_id
+msgid "Paid by company direct to this vendor"
+msgstr ""
+
+#. module: hr_expense_pay_to_vendor
+#: model:ir.model.fields,field_description:hr_expense_pay_to_vendor.field_hr_expense__vendor_id
+#: model:ir.model.fields,field_description:hr_expense_pay_to_vendor.field_hr_expense_sheet__vendor_id
+msgid "To Vendor"
+msgstr ""
From 44db8fd46ccdca696f8979aa9ffd81fec1e2bdfb Mon Sep 17 00:00:00 2001
From: OCA-git-bot
Date: Thu, 6 Oct 2022 16:54:23 +0000
Subject: [PATCH 05/16] [UPD] README.rst
---
hr_expense_pay_to_vendor/README.rst | 102 ++++
.../static/description/index.html | 440 ++++++++++++++++++
2 files changed, 542 insertions(+)
create mode 100644 hr_expense_pay_to_vendor/README.rst
create mode 100644 hr_expense_pay_to_vendor/static/description/index.html
diff --git a/hr_expense_pay_to_vendor/README.rst b/hr_expense_pay_to_vendor/README.rst
new file mode 100644
index 000000000..b1ed7051e
--- /dev/null
+++ b/hr_expense_pay_to_vendor/README.rst
@@ -0,0 +1,102 @@
+==========================
+HR Expense - Pay To Vendor
+==========================
+
+.. !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+ !! This file is generated by oca-gen-addon-readme !!
+ !! changes will be overwritten. !!
+ !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+
+.. |badge1| image:: https://img.shields.io/badge/maturity-Beta-yellow.png
+ :target: https://odoo-community.org/page/development-status
+ :alt: Beta
+.. |badge2| image:: https://img.shields.io/badge/licence-AGPL--3-blue.png
+ :target: http://www.gnu.org/licenses/agpl-3.0-standalone.html
+ :alt: License: AGPL-3
+.. |badge3| image:: https://img.shields.io/badge/github-OCA%2Fhr--expense-lightgray.png?logo=github
+ :target: https://github.com/OCA/hr-expense/tree/14.0/hr_expense_pay_to_vendor
+ :alt: OCA/hr-expense
+.. |badge4| image:: https://img.shields.io/badge/weblate-Translate%20me-F47D42.png
+ :target: https://translation.odoo-community.org/projects/hr-expense-14-0/hr-expense-14-0-hr_expense_pay_to_vendor
+ :alt: Translate me on Weblate
+.. |badge5| image:: https://img.shields.io/badge/runbot-Try%20me-875A7B.png
+ :target: https://runbot.odoo-community.org/runbot/289/14.0
+ :alt: Try me on Runbot
+
+|badge1| |badge2| |badge3| |badge4| |badge5|
+
+This module allow expense "Pay to Vendor" as option when user select, Paid By Company.
+
+**Pay to Vendor** is suitable for cases when user wanted to buy something, i.e., Plane Ticket,
+but do not want to pay money him/herself and use expense as the way to make payment order to accounting department.
+
+When expense has posted journal entry, the AR will be set to Vendor (and not the Employee).
+Then, register the payment will be clearing the AR to Bank.
+
+**Table of contents**
+
+.. contents::
+ :local:
+
+Usage
+=====
+
+To use this module, you need to:
+
+#. Go to *Expenses -> My Expenses -> Expenses to Submit* and create a new
+ *Expense* with *Company* as Paid By, and a Vendor as Pay to Vendor
+#. Click on *Submit to Manager* button
+#. Click on *Approve* button
+#. Click on *Post Journal Entries* button, the Receivable will be on Vendor
+#. Click on *Register Payment* button, fill in the data of the wizard and
+ click on *Validate* button
+
+You can now check that the partner in journal entries are on Vendor, and not on Employee.
+
+Bug Tracker
+===========
+
+Bugs are tracked on `GitHub Issues `_.
+In case of trouble, please check there if your issue has already been reported.
+If you spotted it first, help us smashing it by providing a detailed and welcomed
+`feedback `_.
+
+Do not contact contributors directly about support or help with technical issues.
+
+Credits
+=======
+
+Authors
+~~~~~~~
+
+* Ecosoft
+
+Contributors
+~~~~~~~~~~~~
+
+* Kitti U.
+
+Maintainers
+~~~~~~~~~~~
+
+This module is maintained by the OCA.
+
+.. image:: https://odoo-community.org/logo.png
+ :alt: Odoo Community Association
+ :target: https://odoo-community.org
+
+OCA, or the Odoo Community Association, is a nonprofit organization whose
+mission is to support the collaborative development of Odoo features and
+promote its widespread use.
+
+.. |maintainer-kittiu| image:: https://github.com/kittiu.png?size=40px
+ :target: https://github.com/kittiu
+ :alt: kittiu
+
+Current `maintainer `__:
+
+|maintainer-kittiu|
+
+This module is part of the `OCA/hr-expense `_ project on GitHub.
+
+You are welcome to contribute. To learn how please visit https://odoo-community.org/page/Contribute.
diff --git a/hr_expense_pay_to_vendor/static/description/index.html b/hr_expense_pay_to_vendor/static/description/index.html
new file mode 100644
index 000000000..258bceb89
--- /dev/null
+++ b/hr_expense_pay_to_vendor/static/description/index.html
@@ -0,0 +1,440 @@
+
+
+
+
+
+
+HR Expense - Pay To Vendor
+
+
+
+
+
HR Expense - Pay To Vendor
+
+
+
+
This module allow expense “Pay to Vendor” as option when user select, Paid By Company.
+
Pay to Vendor is suitable for cases when user wanted to buy something, i.e., Plane Ticket,
+but do not want to pay money him/herself and use expense as the way to make payment order to accounting department.
+
When expense has posted journal entry, the AR will be set to Vendor (and not the Employee).
+Then, register the payment will be clearing the AR to Bank.
Bugs are tracked on GitHub Issues.
+In case of trouble, please check there if your issue has already been reported.
+If you spotted it first, help us smashing it by providing a detailed and welcomed
+feedback.
+
Do not contact contributors directly about support or help with technical issues.
OCA, or the Odoo Community Association, is a nonprofit organization whose
+mission is to support the collaborative development of Odoo features and
+promote its widespread use.
+
+
From 8e97fdf2538ba319da816362719332a7c66c9ee9 Mon Sep 17 00:00:00 2001
From: Saran440
Date: Tue, 22 Nov 2022 10:05:07 +0700
Subject: [PATCH 06/16] [15.0][MIG] hr_expense_pay_to_vendor
---
hr_expense_pay_to_vendor/__manifest__.py | 2 +-
hr_expense_pay_to_vendor/models/hr_expense.py | 12 ++++-----
.../tests/test_hr_expense_pay_to_vendor.py | 26 ++++++++++++++++---
.../views/hr_expense_views.xml | 9 +++++--
4 files changed, 36 insertions(+), 13 deletions(-)
diff --git a/hr_expense_pay_to_vendor/__manifest__.py b/hr_expense_pay_to_vendor/__manifest__.py
index 6b2f64ee9..4685975a0 100644
--- a/hr_expense_pay_to_vendor/__manifest__.py
+++ b/hr_expense_pay_to_vendor/__manifest__.py
@@ -3,7 +3,7 @@
{
"name": "HR Expense - Pay To Vendor",
- "version": "14.0.1.0.0",
+ "version": "15.0.1.0.0",
"author": "Ecosoft, Odoo Community Association (OCA)",
"website": "https://github.com/OCA/hr-expense",
"license": "AGPL-3",
diff --git a/hr_expense_pay_to_vendor/models/hr_expense.py b/hr_expense_pay_to_vendor/models/hr_expense.py
index fefdf8e37..dc50a4d87 100644
--- a/hr_expense_pay_to_vendor/models/hr_expense.py
+++ b/hr_expense_pay_to_vendor/models/hr_expense.py
@@ -66,18 +66,18 @@ class HrExpenseSheet(models.Model):
@api.constrains("expense_line_ids")
def _check_payment_mode(self):
- super()._check_payment_mode()
+ res = super()._check_payment_mode()
for sheet in self:
- payment_mode = sheet.expense_line_ids.mapped("payment_mode")
+ expenses = sheet.expense_line_ids
+ payment_mode = expenses.mapped("payment_mode")
if payment_mode and payment_mode[0] == "company_account":
- expense_lines = sheet.mapped("expense_line_ids")
- if expense_lines and any(
- expense.vendor_id != expense_lines[0].vendor_id
- for expense in expense_lines
+ if expenses and any(
+ expense.vendor_id != expenses[0].vendor_id for expense in expenses
):
raise ValidationError(
_("Expenses must be paying to the same vendor.")
)
+ return res
def paid_expense_sheets(self):
"""For expense paid direct to vendor, do not set done"""
diff --git a/hr_expense_pay_to_vendor/tests/test_hr_expense_pay_to_vendor.py b/hr_expense_pay_to_vendor/tests/test_hr_expense_pay_to_vendor.py
index ec2107014..a4253dfa7 100644
--- a/hr_expense_pay_to_vendor/tests/test_hr_expense_pay_to_vendor.py
+++ b/hr_expense_pay_to_vendor/tests/test_hr_expense_pay_to_vendor.py
@@ -1,13 +1,15 @@
# Copyright 2021 Ecosoft
# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl).
+from odoo.exceptions import UserError
from odoo.tests.common import Form, TransactionCase
class TestHrExpensePayToVendor(TransactionCase):
def setUp(self):
- super(TestHrExpensePayToVendor, self).setUp()
+ super().setUp()
self.vendor = self.env["res.partner"].create({"name": "Test Vendor"})
+ self.vendor2 = self.env["res.partner"].create({"name": "Test Vendor2"})
self.payment_obj = self.env["account.payment"]
self.account_payment_register = self.env["account.payment.register"]
self.payment_journal = self.env["account.journal"].search(
@@ -28,7 +30,7 @@ def _get_payment_wizard(self, expense_sheet):
action = expense_sheet.action_register_payment()
ctx = action.get("context")
with Form(
- self.account_payment_register.with_context(ctx),
+ self.account_payment_register.with_context(**ctx),
view="account.view_account_payment_register_form",
) as f:
f.journal_id = self.payment_journal
@@ -53,7 +55,7 @@ def test_expense_pay_to_vendor(self):
{
"name": "Expense Line 1",
"employee_id": self.ref("hr.employee_admin"),
- "product_id": self.ref("hr_expense.air_ticket"),
+ "product_id": self.ref("hr_expense.product_product_zero_cost"),
"unit_amount": 1,
"quantity": 10,
"sheet_id": self.expense_sheet.id,
@@ -63,7 +65,7 @@ def test_expense_pay_to_vendor(self):
{
"name": "Expense Line 1",
"employee_id": self.ref("hr.employee_admin"),
- "product_id": self.ref("hr_expense.air_ticket"),
+ "product_id": self.ref("hr_expense.product_product_zero_cost"),
"unit_amount": 1,
"quantity": 20,
"sheet_id": self.expense_sheet.id,
@@ -77,6 +79,22 @@ def test_expense_pay_to_vendor(self):
list(set(self.expense_sheet.expense_line_ids.mapped("payment_mode"))),
["company_account"],
)
+ # Test create new expense diff vendor
+ with self.assertRaises(UserError):
+ self.env["hr.expense"].create(
+ [
+ {
+ "name": "Expense Line 1",
+ "employee_id": self.ref("hr.employee_admin"),
+ "product_id": self.ref("hr_expense.product_product_zero_cost"),
+ "unit_amount": 1,
+ "quantity": 10,
+ "sheet_id": self.expense_sheet.id,
+ "payment_mode": "company_account",
+ "vendor_id": self.vendor2.id,
+ },
+ ]
+ )
# Post Journl Entry
self.expense_sheet.action_submit_sheet()
self.expense_sheet.approve_expense_sheets()
diff --git a/hr_expense_pay_to_vendor/views/hr_expense_views.xml b/hr_expense_pay_to_vendor/views/hr_expense_views.xml
index c1a78b5a8..28030e50a 100644
--- a/hr_expense_pay_to_vendor/views/hr_expense_views.xml
+++ b/hr_expense_pay_to_vendor/views/hr_expense_views.xml
@@ -7,7 +7,7 @@
@@ -24,7 +24,12 @@
attrs="{'invisible': [('payment_mode', '!=', 'company_account')]}"
>
-
+
From 42227392bc98d3f1db0a37796209346fae643c61 Mon Sep 17 00:00:00 2001
From: oca-ci
Date: Fri, 19 May 2023 10:22:12 +0000
Subject: [PATCH 07/16] [UPD] Update hr_expense_pay_to_vendor.pot
---
.../i18n/hr_expense_pay_to_vendor.pot | 20 +------------------
1 file changed, 1 insertion(+), 19 deletions(-)
diff --git a/hr_expense_pay_to_vendor/i18n/hr_expense_pay_to_vendor.pot b/hr_expense_pay_to_vendor/i18n/hr_expense_pay_to_vendor.pot
index 4511ba094..8a0eacd8a 100644
--- a/hr_expense_pay_to_vendor/i18n/hr_expense_pay_to_vendor.pot
+++ b/hr_expense_pay_to_vendor/i18n/hr_expense_pay_to_vendor.pot
@@ -4,7 +4,7 @@
#
msgid ""
msgstr ""
-"Project-Id-Version: Odoo Server 14.0\n"
+"Project-Id-Version: Odoo Server 15.0\n"
"Report-Msgid-Bugs-To: \n"
"Last-Translator: \n"
"Language-Team: \n"
@@ -13,12 +13,6 @@ msgstr ""
"Content-Transfer-Encoding: \n"
"Plural-Forms: \n"
-#. module: hr_expense_pay_to_vendor
-#: model:ir.model.fields,field_description:hr_expense_pay_to_vendor.field_hr_expense__display_name
-#: model:ir.model.fields,field_description:hr_expense_pay_to_vendor.field_hr_expense_sheet__display_name
-msgid "Display Name"
-msgstr ""
-
#. module: hr_expense_pay_to_vendor
#: model:ir.model,name:hr_expense_pay_to_vendor.model_hr_expense
msgid "Expense"
@@ -35,18 +29,6 @@ msgstr ""
msgid "Expenses must be paying to the same vendor."
msgstr ""
-#. module: hr_expense_pay_to_vendor
-#: model:ir.model.fields,field_description:hr_expense_pay_to_vendor.field_hr_expense__id
-#: model:ir.model.fields,field_description:hr_expense_pay_to_vendor.field_hr_expense_sheet__id
-msgid "ID"
-msgstr ""
-
-#. module: hr_expense_pay_to_vendor
-#: model:ir.model.fields,field_description:hr_expense_pay_to_vendor.field_hr_expense____last_update
-#: model:ir.model.fields,field_description:hr_expense_pay_to_vendor.field_hr_expense_sheet____last_update
-msgid "Last Modified on"
-msgstr ""
-
#. module: hr_expense_pay_to_vendor
#: model:ir.model.fields,help:hr_expense_pay_to_vendor.field_hr_expense__vendor_id
#: model:ir.model.fields,help:hr_expense_pay_to_vendor.field_hr_expense_sheet__vendor_id
From e10dff8bb04b14c4af6d08984c65120d27774aff Mon Sep 17 00:00:00 2001
From: OCA-git-bot
Date: Fri, 19 May 2023 10:26:16 +0000
Subject: [PATCH 08/16] [UPD] README.rst
---
hr_expense_pay_to_vendor/README.rst | 10 +++++-----
hr_expense_pay_to_vendor/static/description/index.html | 6 +++---
2 files changed, 8 insertions(+), 8 deletions(-)
diff --git a/hr_expense_pay_to_vendor/README.rst b/hr_expense_pay_to_vendor/README.rst
index b1ed7051e..ea5a98808 100644
--- a/hr_expense_pay_to_vendor/README.rst
+++ b/hr_expense_pay_to_vendor/README.rst
@@ -14,13 +14,13 @@ HR Expense - Pay To Vendor
:target: http://www.gnu.org/licenses/agpl-3.0-standalone.html
:alt: License: AGPL-3
.. |badge3| image:: https://img.shields.io/badge/github-OCA%2Fhr--expense-lightgray.png?logo=github
- :target: https://github.com/OCA/hr-expense/tree/14.0/hr_expense_pay_to_vendor
+ :target: https://github.com/OCA/hr-expense/tree/15.0/hr_expense_pay_to_vendor
:alt: OCA/hr-expense
.. |badge4| image:: https://img.shields.io/badge/weblate-Translate%20me-F47D42.png
- :target: https://translation.odoo-community.org/projects/hr-expense-14-0/hr-expense-14-0-hr_expense_pay_to_vendor
+ :target: https://translation.odoo-community.org/projects/hr-expense-15-0/hr-expense-15-0-hr_expense_pay_to_vendor
:alt: Translate me on Weblate
.. |badge5| image:: https://img.shields.io/badge/runbot-Try%20me-875A7B.png
- :target: https://runbot.odoo-community.org/runbot/289/14.0
+ :target: https://runbot.odoo-community.org/runbot/289/15.0
:alt: Try me on Runbot
|badge1| |badge2| |badge3| |badge4| |badge5|
@@ -59,7 +59,7 @@ Bug Tracker
Bugs are tracked on `GitHub Issues `_.
In case of trouble, please check there if your issue has already been reported.
If you spotted it first, help us smashing it by providing a detailed and welcomed
-`feedback `_.
+`feedback `_.
Do not contact contributors directly about support or help with technical issues.
@@ -97,6 +97,6 @@ Current `maintainer `__:
|maintainer-kittiu|
-This module is part of the `OCA/hr-expense `_ project on GitHub.
+This module is part of the `OCA/hr-expense `_ project on GitHub.
You are welcome to contribute. To learn how please visit https://odoo-community.org/page/Contribute.
diff --git a/hr_expense_pay_to_vendor/static/description/index.html b/hr_expense_pay_to_vendor/static/description/index.html
index 258bceb89..c9cb04588 100644
--- a/hr_expense_pay_to_vendor/static/description/index.html
+++ b/hr_expense_pay_to_vendor/static/description/index.html
@@ -367,7 +367,7 @@
HR Expense - Pay To Vendor
!! This file is generated by oca-gen-addon-readme !!
!! changes will be overwritten. !!
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! -->
-
+
This module allow expense “Pay to Vendor” as option when user select, Paid By Company.
Pay to Vendor is suitable for cases when user wanted to buy something, i.e., Plane Ticket,
but do not want to pay money him/herself and use expense as the way to make payment order to accounting department.
Bugs are tracked on GitHub Issues.
In case of trouble, please check there if your issue has already been reported.
If you spotted it first, help us smashing it by providing a detailed and welcomed
-feedback.