diff --git a/__init__.py b/__init__.py
new file mode 100644
index 0000000..dc5e6b6
--- /dev/null
+++ b/__init__.py
@@ -0,0 +1,4 @@
+# -*- coding: utf-8 -*-
+# Part of Odoo. See LICENSE file for full copyright and licensing details.
+
+from . import models
diff --git a/__manifest__.py b/__manifest__.py
new file mode 100644
index 0000000..08fbd5c
--- /dev/null
+++ b/__manifest__.py
@@ -0,0 +1,18 @@
+# -*- coding: utf-8 -*-
+# Part of Odoo. See LICENSE file for full copyright and licensing details.
+
+
+{
+ 'name': 'Project Expenses',
+ 'version': '1.0',
+ 'category': 'Services/expenses',
+ 'summary': 'Project expenses',
+ 'description': 'Bridge created to add the number of expenses linked to an AA to a project form',
+ 'depends': ['project_account', 'hr_expense'],
+ 'demo': [
+ 'data/project_hr_expense_demo.xml',
+ ],
+ 'installable': True,
+ 'auto_install': True,
+ 'license': 'LGPL-3',
+}
diff --git a/data/project_hr_expense_demo.xml b/data/project_hr_expense_demo.xml
new file mode 100644
index 0000000..d75d58d
--- /dev/null
+++ b/data/project_hr_expense_demo.xml
@@ -0,0 +1,11 @@
+
+
+
+
+
+
+
+
+
+
+
diff --git a/i18n/ar.po b/i18n/ar.po
new file mode 100644
index 0000000..3ab74e4
--- /dev/null
+++ b/i18n/ar.po
@@ -0,0 +1,38 @@
+# Translation of Odoo Server.
+# This file contains the translation of the following modules:
+# * project_hr_expense
+#
+# Translators:
+# Wil Odoo, 2023
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: Odoo Server 17.0\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2023-10-26 21:55+0000\n"
+"PO-Revision-Date: 2023-10-26 23:09+0000\n"
+"Last-Translator: Wil Odoo, 2023\n"
+"Language-Team: Arabic (https://app.transifex.com/odoo/teams/41243/ar/)\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: \n"
+"Language: ar\n"
+"Plural-Forms: nplurals=6; plural=n==0 ? 0 : n==1 ? 1 : n==2 ? 2 : n%100>=3 && n%100<=10 ? 3 : n%100>=11 && n%100<=99 ? 4 : 5;\n"
+
+#. module: project_hr_expense
+#: model:ir.model.fields,field_description:project_hr_expense.field_project_project__expenses_count
+msgid "# Expenses"
+msgstr "عدد النفقات "
+
+#. module: project_hr_expense
+#. odoo-python
+#: code:addons/project_hr_expense/models/project_project.py:0
+#: code:addons/project_hr_expense/models/project_project.py:0
+#, python-format
+msgid "Expenses"
+msgstr "النفقات "
+
+#. module: project_hr_expense
+#: model:ir.model,name:project_hr_expense.model_project_project
+msgid "Project"
+msgstr "المشروع"
diff --git a/i18n/bg.po b/i18n/bg.po
new file mode 100644
index 0000000..17ea045
--- /dev/null
+++ b/i18n/bg.po
@@ -0,0 +1,38 @@
+# Translation of Odoo Server.
+# This file contains the translation of the following modules:
+# * project_hr_expense
+#
+# Translators:
+# aleksandar ivanov, 2023
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: Odoo Server 17.0\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2023-10-26 21:55+0000\n"
+"PO-Revision-Date: 2023-10-26 23:09+0000\n"
+"Last-Translator: aleksandar ivanov, 2023\n"
+"Language-Team: Bulgarian (https://app.transifex.com/odoo/teams/41243/bg/)\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: \n"
+"Language: bg\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+
+#. module: project_hr_expense
+#: model:ir.model.fields,field_description:project_hr_expense.field_project_project__expenses_count
+msgid "# Expenses"
+msgstr ""
+
+#. module: project_hr_expense
+#. odoo-python
+#: code:addons/project_hr_expense/models/project_project.py:0
+#: code:addons/project_hr_expense/models/project_project.py:0
+#, python-format
+msgid "Expenses"
+msgstr "Разходи"
+
+#. module: project_hr_expense
+#: model:ir.model,name:project_hr_expense.model_project_project
+msgid "Project"
+msgstr "Проект"
diff --git a/i18n/ca.po b/i18n/ca.po
new file mode 100644
index 0000000..b653200
--- /dev/null
+++ b/i18n/ca.po
@@ -0,0 +1,39 @@
+# Translation of Odoo Server.
+# This file contains the translation of the following modules:
+# * project_hr_expense
+#
+# Translators:
+# marcescu, 2023
+# Martin Trigaux, 2023
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: Odoo Server 17.0\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2023-10-26 21:55+0000\n"
+"PO-Revision-Date: 2023-10-26 23:09+0000\n"
+"Last-Translator: Martin Trigaux, 2023\n"
+"Language-Team: Catalan (https://app.transifex.com/odoo/teams/41243/ca/)\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: \n"
+"Language: ca\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+
+#. module: project_hr_expense
+#: model:ir.model.fields,field_description:project_hr_expense.field_project_project__expenses_count
+msgid "# Expenses"
+msgstr "# Despeses"
+
+#. module: project_hr_expense
+#. odoo-python
+#: code:addons/project_hr_expense/models/project_project.py:0
+#: code:addons/project_hr_expense/models/project_project.py:0
+#, python-format
+msgid "Expenses"
+msgstr "Despeses"
+
+#. module: project_hr_expense
+#: model:ir.model,name:project_hr_expense.model_project_project
+msgid "Project"
+msgstr "Projecte"
diff --git a/i18n/cs.po b/i18n/cs.po
new file mode 100644
index 0000000..1087664
--- /dev/null
+++ b/i18n/cs.po
@@ -0,0 +1,39 @@
+# Translation of Odoo Server.
+# This file contains the translation of the following modules:
+# * project_hr_expense
+#
+# Translators:
+# Ivana Bartonkova, 2023
+# Jakub Smolka, 2023
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: Odoo Server 17.0\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2023-10-26 21:55+0000\n"
+"PO-Revision-Date: 2023-10-26 23:09+0000\n"
+"Last-Translator: Jakub Smolka, 2023\n"
+"Language-Team: Czech (https://app.transifex.com/odoo/teams/41243/cs/)\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: \n"
+"Language: cs\n"
+"Plural-Forms: nplurals=4; plural=(n == 1 && n % 1 == 0) ? 0 : (n >= 2 && n <= 4 && n % 1 == 0) ? 1: (n % 1 != 0 ) ? 2 : 3;\n"
+
+#. module: project_hr_expense
+#: model:ir.model.fields,field_description:project_hr_expense.field_project_project__expenses_count
+msgid "# Expenses"
+msgstr ""
+
+#. module: project_hr_expense
+#. odoo-python
+#: code:addons/project_hr_expense/models/project_project.py:0
+#: code:addons/project_hr_expense/models/project_project.py:0
+#, python-format
+msgid "Expenses"
+msgstr "Náklady"
+
+#. module: project_hr_expense
+#: model:ir.model,name:project_hr_expense.model_project_project
+msgid "Project"
+msgstr "Projekty"
diff --git a/i18n/da.po b/i18n/da.po
new file mode 100644
index 0000000..42fcdbd
--- /dev/null
+++ b/i18n/da.po
@@ -0,0 +1,38 @@
+# Translation of Odoo Server.
+# This file contains the translation of the following modules:
+# * project_hr_expense
+#
+# Translators:
+# Martin Trigaux, 2023
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: Odoo Server 17.0\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2023-10-26 21:55+0000\n"
+"PO-Revision-Date: 2023-10-26 23:09+0000\n"
+"Last-Translator: Martin Trigaux, 2023\n"
+"Language-Team: Danish (https://app.transifex.com/odoo/teams/41243/da/)\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: \n"
+"Language: da\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+
+#. module: project_hr_expense
+#: model:ir.model.fields,field_description:project_hr_expense.field_project_project__expenses_count
+msgid "# Expenses"
+msgstr ""
+
+#. module: project_hr_expense
+#. odoo-python
+#: code:addons/project_hr_expense/models/project_project.py:0
+#: code:addons/project_hr_expense/models/project_project.py:0
+#, python-format
+msgid "Expenses"
+msgstr "Øvrige omkostninger"
+
+#. module: project_hr_expense
+#: model:ir.model,name:project_hr_expense.model_project_project
+msgid "Project"
+msgstr "Projekt"
diff --git a/i18n/de.po b/i18n/de.po
new file mode 100644
index 0000000..11d01dd
--- /dev/null
+++ b/i18n/de.po
@@ -0,0 +1,38 @@
+# Translation of Odoo Server.
+# This file contains the translation of the following modules:
+# * project_hr_expense
+#
+# Translators:
+# Wil Odoo, 2023
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: Odoo Server 17.0\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2023-10-26 21:55+0000\n"
+"PO-Revision-Date: 2023-10-26 23:09+0000\n"
+"Last-Translator: Wil Odoo, 2023\n"
+"Language-Team: German (https://app.transifex.com/odoo/teams/41243/de/)\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: \n"
+"Language: de\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+
+#. module: project_hr_expense
+#: model:ir.model.fields,field_description:project_hr_expense.field_project_project__expenses_count
+msgid "# Expenses"
+msgstr "# Ausgaben"
+
+#. module: project_hr_expense
+#. odoo-python
+#: code:addons/project_hr_expense/models/project_project.py:0
+#: code:addons/project_hr_expense/models/project_project.py:0
+#, python-format
+msgid "Expenses"
+msgstr "Ausgaben"
+
+#. module: project_hr_expense
+#: model:ir.model,name:project_hr_expense.model_project_project
+msgid "Project"
+msgstr "Projekt"
diff --git a/i18n/es.po b/i18n/es.po
new file mode 100644
index 0000000..3c8793e
--- /dev/null
+++ b/i18n/es.po
@@ -0,0 +1,38 @@
+# Translation of Odoo Server.
+# This file contains the translation of the following modules:
+# * project_hr_expense
+#
+# Translators:
+# Wil Odoo, 2023
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: Odoo Server 17.0\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2023-10-26 21:55+0000\n"
+"PO-Revision-Date: 2023-10-26 23:09+0000\n"
+"Last-Translator: Wil Odoo, 2023\n"
+"Language-Team: Spanish (https://app.transifex.com/odoo/teams/41243/es/)\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: \n"
+"Language: es\n"
+"Plural-Forms: nplurals=3; plural=n == 1 ? 0 : n != 0 && n % 1000000 == 0 ? 1 : 2;\n"
+
+#. module: project_hr_expense
+#: model:ir.model.fields,field_description:project_hr_expense.field_project_project__expenses_count
+msgid "# Expenses"
+msgstr "# Gastos"
+
+#. module: project_hr_expense
+#. odoo-python
+#: code:addons/project_hr_expense/models/project_project.py:0
+#: code:addons/project_hr_expense/models/project_project.py:0
+#, python-format
+msgid "Expenses"
+msgstr "Gastos"
+
+#. module: project_hr_expense
+#: model:ir.model,name:project_hr_expense.model_project_project
+msgid "Project"
+msgstr "Proyecto"
diff --git a/i18n/es_419.po b/i18n/es_419.po
new file mode 100644
index 0000000..fceb515
--- /dev/null
+++ b/i18n/es_419.po
@@ -0,0 +1,38 @@
+# Translation of Odoo Server.
+# This file contains the translation of the following modules:
+# * project_hr_expense
+#
+# Translators:
+# Wil Odoo, 2023
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: Odoo Server 17.0\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2023-10-26 21:55+0000\n"
+"PO-Revision-Date: 2023-10-26 23:09+0000\n"
+"Last-Translator: Wil Odoo, 2023\n"
+"Language-Team: Spanish (Latin America) (https://app.transifex.com/odoo/teams/41243/es_419/)\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: \n"
+"Language: es_419\n"
+"Plural-Forms: nplurals=3; plural=n == 1 ? 0 : n != 0 && n % 1000000 == 0 ? 1 : 2;\n"
+
+#. module: project_hr_expense
+#: model:ir.model.fields,field_description:project_hr_expense.field_project_project__expenses_count
+msgid "# Expenses"
+msgstr "# Gastos"
+
+#. module: project_hr_expense
+#. odoo-python
+#: code:addons/project_hr_expense/models/project_project.py:0
+#: code:addons/project_hr_expense/models/project_project.py:0
+#, python-format
+msgid "Expenses"
+msgstr "Gastos"
+
+#. module: project_hr_expense
+#: model:ir.model,name:project_hr_expense.model_project_project
+msgid "Project"
+msgstr "Proyecto"
diff --git a/i18n/et.po b/i18n/et.po
new file mode 100644
index 0000000..6c45d3a
--- /dev/null
+++ b/i18n/et.po
@@ -0,0 +1,40 @@
+# Translation of Odoo Server.
+# This file contains the translation of the following modules:
+# * project_hr_expense
+#
+# Translators:
+# Marek Pontus, 2023
+# JanaAvalah, 2023
+# Patrick-Jordan Kiudorv, 2023
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: Odoo Server 17.0\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2023-10-26 21:55+0000\n"
+"PO-Revision-Date: 2023-10-26 23:09+0000\n"
+"Last-Translator: Patrick-Jordan Kiudorv, 2023\n"
+"Language-Team: Estonian (https://app.transifex.com/odoo/teams/41243/et/)\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: \n"
+"Language: et\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+
+#. module: project_hr_expense
+#: model:ir.model.fields,field_description:project_hr_expense.field_project_project__expenses_count
+msgid "# Expenses"
+msgstr "# Kulud"
+
+#. module: project_hr_expense
+#. odoo-python
+#: code:addons/project_hr_expense/models/project_project.py:0
+#: code:addons/project_hr_expense/models/project_project.py:0
+#, python-format
+msgid "Expenses"
+msgstr "Kulud"
+
+#. module: project_hr_expense
+#: model:ir.model,name:project_hr_expense.model_project_project
+msgid "Project"
+msgstr "Projektid"
diff --git a/i18n/fa.po b/i18n/fa.po
new file mode 100644
index 0000000..674ff9f
--- /dev/null
+++ b/i18n/fa.po
@@ -0,0 +1,40 @@
+# Translation of Odoo Server.
+# This file contains the translation of the following modules:
+# * project_hr_expense
+#
+# Translators:
+# Hanna Kheradroosta, 2023
+# M.Hossein S.Farvashani , 2023
+# Hamid Darabi, 2023
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: Odoo Server 17.0\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2023-10-26 21:55+0000\n"
+"PO-Revision-Date: 2023-10-26 23:09+0000\n"
+"Last-Translator: Hamid Darabi, 2023\n"
+"Language-Team: Persian (https://app.transifex.com/odoo/teams/41243/fa/)\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: \n"
+"Language: fa\n"
+"Plural-Forms: nplurals=2; plural=(n > 1);\n"
+
+#. module: project_hr_expense
+#: model:ir.model.fields,field_description:project_hr_expense.field_project_project__expenses_count
+msgid "# Expenses"
+msgstr "# هزینه ها"
+
+#. module: project_hr_expense
+#. odoo-python
+#: code:addons/project_hr_expense/models/project_project.py:0
+#: code:addons/project_hr_expense/models/project_project.py:0
+#, python-format
+msgid "Expenses"
+msgstr "هزینه ها"
+
+#. module: project_hr_expense
+#: model:ir.model,name:project_hr_expense.model_project_project
+msgid "Project"
+msgstr "پروژه"
diff --git a/i18n/fi.po b/i18n/fi.po
new file mode 100644
index 0000000..001afdf
--- /dev/null
+++ b/i18n/fi.po
@@ -0,0 +1,40 @@
+# Translation of Odoo Server.
+# This file contains the translation of the following modules:
+# * project_hr_expense
+#
+# Translators:
+# Jarmo Kortetjärvi , 2023
+# Ossi Mantylahti , 2023
+# Svante Suominen , 2023
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: Odoo Server 17.0\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2023-10-26 21:55+0000\n"
+"PO-Revision-Date: 2023-10-26 23:09+0000\n"
+"Last-Translator: Svante Suominen , 2023\n"
+"Language-Team: Finnish (https://app.transifex.com/odoo/teams/41243/fi/)\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: \n"
+"Language: fi\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+
+#. module: project_hr_expense
+#: model:ir.model.fields,field_description:project_hr_expense.field_project_project__expenses_count
+msgid "# Expenses"
+msgstr "# Kulut"
+
+#. module: project_hr_expense
+#. odoo-python
+#: code:addons/project_hr_expense/models/project_project.py:0
+#: code:addons/project_hr_expense/models/project_project.py:0
+#, python-format
+msgid "Expenses"
+msgstr "Kulut"
+
+#. module: project_hr_expense
+#: model:ir.model,name:project_hr_expense.model_project_project
+msgid "Project"
+msgstr "Projektit"
diff --git a/i18n/fr.po b/i18n/fr.po
new file mode 100644
index 0000000..bcc14c6
--- /dev/null
+++ b/i18n/fr.po
@@ -0,0 +1,38 @@
+# Translation of Odoo Server.
+# This file contains the translation of the following modules:
+# * project_hr_expense
+#
+# Translators:
+# Wil Odoo, 2023
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: Odoo Server 17.0\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2023-10-26 21:55+0000\n"
+"PO-Revision-Date: 2023-10-26 23:09+0000\n"
+"Last-Translator: Wil Odoo, 2023\n"
+"Language-Team: French (https://app.transifex.com/odoo/teams/41243/fr/)\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: \n"
+"Language: fr\n"
+"Plural-Forms: nplurals=3; plural=(n == 0 || n == 1) ? 0 : n != 0 && n % 1000000 == 0 ? 1 : 2;\n"
+
+#. module: project_hr_expense
+#: model:ir.model.fields,field_description:project_hr_expense.field_project_project__expenses_count
+msgid "# Expenses"
+msgstr "# Notes de frais"
+
+#. module: project_hr_expense
+#. odoo-python
+#: code:addons/project_hr_expense/models/project_project.py:0
+#: code:addons/project_hr_expense/models/project_project.py:0
+#, python-format
+msgid "Expenses"
+msgstr "Notes de frais"
+
+#. module: project_hr_expense
+#: model:ir.model,name:project_hr_expense.model_project_project
+msgid "Project"
+msgstr "Projet"
diff --git a/i18n/fr_BE.po b/i18n/fr_BE.po
new file mode 100644
index 0000000..64e2d4c
--- /dev/null
+++ b/i18n/fr_BE.po
@@ -0,0 +1,33 @@
+# Translation of Odoo Server.
+# This file contains the translation of the following modules:
+# * project_hr_expense
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: Odoo Server saas~14.5\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2022-09-23 08:02+0000\n"
+"PO-Revision-Date: 2021-09-14 10:29+0000\n"
+"Last-Translator: \n"
+"Language-Team: \n"
+"Language: \n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: \n"
+"Plural-Forms: \n"
+
+#. module: project_hr_expense
+#: model:ir.model.fields,field_description:project_hr_expense.field_project_project__expenses_count
+msgid "# Expenses"
+msgstr ""
+
+#. module: project_hr_expense
+#: code:addons/project_hr_expense/models/project.py:0
+#, python-format
+msgid "Expenses"
+msgstr ""
+
+#. module: project_hr_expense
+#: model:ir.model,name:project_hr_expense.model_project_project
+msgid "Project"
+msgstr ""
diff --git a/i18n/he.po b/i18n/he.po
new file mode 100644
index 0000000..d84df4b
--- /dev/null
+++ b/i18n/he.po
@@ -0,0 +1,40 @@
+# Translation of Odoo Server.
+# This file contains the translation of the following modules:
+# * project_hr_expense
+#
+# Translators:
+# Yihya Hugirat , 2023
+# Lilach Gilliam , 2023
+# ZVI BLONDER , 2023
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: Odoo Server 17.0\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2023-10-26 21:55+0000\n"
+"PO-Revision-Date: 2023-10-26 23:09+0000\n"
+"Last-Translator: ZVI BLONDER , 2023\n"
+"Language-Team: Hebrew (https://app.transifex.com/odoo/teams/41243/he/)\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: \n"
+"Language: he\n"
+"Plural-Forms: nplurals=4; plural=(n == 1 && n % 1 == 0) ? 0 : (n == 2 && n % 1 == 0) ? 1: (n % 10 == 0 && n % 1 == 0 && n > 10) ? 2 : 3;\n"
+
+#. module: project_hr_expense
+#: model:ir.model.fields,field_description:project_hr_expense.field_project_project__expenses_count
+msgid "# Expenses"
+msgstr "# הוצאות"
+
+#. module: project_hr_expense
+#. odoo-python
+#: code:addons/project_hr_expense/models/project_project.py:0
+#: code:addons/project_hr_expense/models/project_project.py:0
+#, python-format
+msgid "Expenses"
+msgstr "הוצאות"
+
+#. module: project_hr_expense
+#: model:ir.model,name:project_hr_expense.model_project_project
+msgid "Project"
+msgstr "פרויקט"
diff --git a/i18n/hu.po b/i18n/hu.po
new file mode 100644
index 0000000..bdd7d47
--- /dev/null
+++ b/i18n/hu.po
@@ -0,0 +1,39 @@
+# Translation of Odoo Server.
+# This file contains the translation of the following modules:
+# * project_hr_expense
+#
+# Translators:
+# Tamás Németh , 2023
+# Ákos Nagy , 2023
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: Odoo Server 17.0\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2023-10-26 21:55+0000\n"
+"PO-Revision-Date: 2023-10-26 23:09+0000\n"
+"Last-Translator: Ákos Nagy , 2023\n"
+"Language-Team: Hungarian (https://app.transifex.com/odoo/teams/41243/hu/)\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: \n"
+"Language: hu\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+
+#. module: project_hr_expense
+#: model:ir.model.fields,field_description:project_hr_expense.field_project_project__expenses_count
+msgid "# Expenses"
+msgstr ""
+
+#. module: project_hr_expense
+#. odoo-python
+#: code:addons/project_hr_expense/models/project_project.py:0
+#: code:addons/project_hr_expense/models/project_project.py:0
+#, python-format
+msgid "Expenses"
+msgstr "Költségek"
+
+#. module: project_hr_expense
+#: model:ir.model,name:project_hr_expense.model_project_project
+msgid "Project"
+msgstr "Projekt"
diff --git a/i18n/id.po b/i18n/id.po
new file mode 100644
index 0000000..7dc50d0
--- /dev/null
+++ b/i18n/id.po
@@ -0,0 +1,38 @@
+# Translation of Odoo Server.
+# This file contains the translation of the following modules:
+# * project_hr_expense
+#
+# Translators:
+# Wil Odoo, 2023
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: Odoo Server 17.0\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2023-10-26 21:55+0000\n"
+"PO-Revision-Date: 2023-10-26 23:09+0000\n"
+"Last-Translator: Wil Odoo, 2023\n"
+"Language-Team: Indonesian (https://app.transifex.com/odoo/teams/41243/id/)\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: \n"
+"Language: id\n"
+"Plural-Forms: nplurals=1; plural=0;\n"
+
+#. module: project_hr_expense
+#: model:ir.model.fields,field_description:project_hr_expense.field_project_project__expenses_count
+msgid "# Expenses"
+msgstr "# Pengeluaran"
+
+#. module: project_hr_expense
+#. odoo-python
+#: code:addons/project_hr_expense/models/project_project.py:0
+#: code:addons/project_hr_expense/models/project_project.py:0
+#, python-format
+msgid "Expenses"
+msgstr "Pengeluaran"
+
+#. module: project_hr_expense
+#: model:ir.model,name:project_hr_expense.model_project_project
+msgid "Project"
+msgstr "Proyek"
diff --git a/i18n/it.po b/i18n/it.po
new file mode 100644
index 0000000..9959bee
--- /dev/null
+++ b/i18n/it.po
@@ -0,0 +1,38 @@
+# Translation of Odoo Server.
+# This file contains the translation of the following modules:
+# * project_hr_expense
+#
+# Translators:
+# Wil Odoo, 2023
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: Odoo Server 17.0\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2023-10-26 21:55+0000\n"
+"PO-Revision-Date: 2023-10-26 23:09+0000\n"
+"Last-Translator: Wil Odoo, 2023\n"
+"Language-Team: Italian (https://app.transifex.com/odoo/teams/41243/it/)\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: \n"
+"Language: it\n"
+"Plural-Forms: nplurals=3; plural=n == 1 ? 0 : n != 0 && n % 1000000 == 0 ? 1 : 2;\n"
+
+#. module: project_hr_expense
+#: model:ir.model.fields,field_description:project_hr_expense.field_project_project__expenses_count
+msgid "# Expenses"
+msgstr "N. spese"
+
+#. module: project_hr_expense
+#. odoo-python
+#: code:addons/project_hr_expense/models/project_project.py:0
+#: code:addons/project_hr_expense/models/project_project.py:0
+#, python-format
+msgid "Expenses"
+msgstr "Spese"
+
+#. module: project_hr_expense
+#: model:ir.model,name:project_hr_expense.model_project_project
+msgid "Project"
+msgstr "Progetto"
diff --git a/i18n/ja.po b/i18n/ja.po
new file mode 100644
index 0000000..d4c5159
--- /dev/null
+++ b/i18n/ja.po
@@ -0,0 +1,38 @@
+# Translation of Odoo Server.
+# This file contains the translation of the following modules:
+# * project_hr_expense
+#
+# Translators:
+# Wil Odoo, 2023
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: Odoo Server 17.0\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2023-10-26 21:55+0000\n"
+"PO-Revision-Date: 2023-10-26 23:09+0000\n"
+"Last-Translator: Wil Odoo, 2023\n"
+"Language-Team: Japanese (https://app.transifex.com/odoo/teams/41243/ja/)\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: \n"
+"Language: ja\n"
+"Plural-Forms: nplurals=1; plural=0;\n"
+
+#. module: project_hr_expense
+#: model:ir.model.fields,field_description:project_hr_expense.field_project_project__expenses_count
+msgid "# Expenses"
+msgstr "経費数"
+
+#. module: project_hr_expense
+#. odoo-python
+#: code:addons/project_hr_expense/models/project_project.py:0
+#: code:addons/project_hr_expense/models/project_project.py:0
+#, python-format
+msgid "Expenses"
+msgstr "費用"
+
+#. module: project_hr_expense
+#: model:ir.model,name:project_hr_expense.model_project_project
+msgid "Project"
+msgstr "プロジェクト"
diff --git a/i18n/ko.po b/i18n/ko.po
new file mode 100644
index 0000000..93cf0fd
--- /dev/null
+++ b/i18n/ko.po
@@ -0,0 +1,38 @@
+# Translation of Odoo Server.
+# This file contains the translation of the following modules:
+# * project_hr_expense
+#
+# Translators:
+# Wil Odoo, 2023
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: Odoo Server 17.0\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2023-10-26 21:55+0000\n"
+"PO-Revision-Date: 2023-10-26 23:09+0000\n"
+"Last-Translator: Wil Odoo, 2023\n"
+"Language-Team: Korean (https://app.transifex.com/odoo/teams/41243/ko/)\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: \n"
+"Language: ko\n"
+"Plural-Forms: nplurals=1; plural=0;\n"
+
+#. module: project_hr_expense
+#: model:ir.model.fields,field_description:project_hr_expense.field_project_project__expenses_count
+msgid "# Expenses"
+msgstr "# 비용"
+
+#. module: project_hr_expense
+#. odoo-python
+#: code:addons/project_hr_expense/models/project_project.py:0
+#: code:addons/project_hr_expense/models/project_project.py:0
+#, python-format
+msgid "Expenses"
+msgstr "경비"
+
+#. module: project_hr_expense
+#: model:ir.model,name:project_hr_expense.model_project_project
+msgid "Project"
+msgstr "프로젝트"
diff --git a/i18n/lt.po b/i18n/lt.po
new file mode 100644
index 0000000..e00745a
--- /dev/null
+++ b/i18n/lt.po
@@ -0,0 +1,38 @@
+# Translation of Odoo Server.
+# This file contains the translation of the following modules:
+# * project_hr_expense
+#
+# Translators:
+# Martin Trigaux, 2023
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: Odoo Server 17.0\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2023-10-26 21:55+0000\n"
+"PO-Revision-Date: 2023-10-26 23:09+0000\n"
+"Last-Translator: Martin Trigaux, 2023\n"
+"Language-Team: Lithuanian (https://app.transifex.com/odoo/teams/41243/lt/)\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: \n"
+"Language: lt\n"
+"Plural-Forms: nplurals=4; plural=(n % 10 == 1 && (n % 100 > 19 || n % 100 < 11) ? 0 : (n % 10 >= 2 && n % 10 <=9) && (n % 100 > 19 || n % 100 < 11) ? 1 : n % 1 != 0 ? 2: 3);\n"
+
+#. module: project_hr_expense
+#: model:ir.model.fields,field_description:project_hr_expense.field_project_project__expenses_count
+msgid "# Expenses"
+msgstr ""
+
+#. module: project_hr_expense
+#. odoo-python
+#: code:addons/project_hr_expense/models/project_project.py:0
+#: code:addons/project_hr_expense/models/project_project.py:0
+#, python-format
+msgid "Expenses"
+msgstr "Išlaidos"
+
+#. module: project_hr_expense
+#: model:ir.model,name:project_hr_expense.model_project_project
+msgid "Project"
+msgstr "Projektas"
diff --git a/i18n/lv.po b/i18n/lv.po
new file mode 100644
index 0000000..6a2a7f7
--- /dev/null
+++ b/i18n/lv.po
@@ -0,0 +1,39 @@
+# Translation of Odoo Server.
+# This file contains the translation of the following modules:
+# * project_hr_expense
+#
+# Translators:
+# Arnis Putniņš , 2023
+# ievaputnina , 2023
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: Odoo Server 17.0\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2023-10-26 21:55+0000\n"
+"PO-Revision-Date: 2023-10-26 23:09+0000\n"
+"Last-Translator: ievaputnina , 2023\n"
+"Language-Team: Latvian (https://app.transifex.com/odoo/teams/41243/lv/)\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: \n"
+"Language: lv\n"
+"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n != 0 ? 1 : 2);\n"
+
+#. module: project_hr_expense
+#: model:ir.model.fields,field_description:project_hr_expense.field_project_project__expenses_count
+msgid "# Expenses"
+msgstr ""
+
+#. module: project_hr_expense
+#. odoo-python
+#: code:addons/project_hr_expense/models/project_project.py:0
+#: code:addons/project_hr_expense/models/project_project.py:0
+#, python-format
+msgid "Expenses"
+msgstr "Izdevumi"
+
+#. module: project_hr_expense
+#: model:ir.model,name:project_hr_expense.model_project_project
+msgid "Project"
+msgstr "Projekti"
diff --git a/i18n/nl.po b/i18n/nl.po
new file mode 100644
index 0000000..95528e6
--- /dev/null
+++ b/i18n/nl.po
@@ -0,0 +1,38 @@
+# Translation of Odoo Server.
+# This file contains the translation of the following modules:
+# * project_hr_expense
+#
+# Translators:
+# Wil Odoo, 2023
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: Odoo Server 17.0\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2023-10-26 21:55+0000\n"
+"PO-Revision-Date: 2023-10-26 23:09+0000\n"
+"Last-Translator: Wil Odoo, 2023\n"
+"Language-Team: Dutch (https://app.transifex.com/odoo/teams/41243/nl/)\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: \n"
+"Language: nl\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+
+#. module: project_hr_expense
+#: model:ir.model.fields,field_description:project_hr_expense.field_project_project__expenses_count
+msgid "# Expenses"
+msgstr "# Declaraties"
+
+#. module: project_hr_expense
+#. odoo-python
+#: code:addons/project_hr_expense/models/project_project.py:0
+#: code:addons/project_hr_expense/models/project_project.py:0
+#, python-format
+msgid "Expenses"
+msgstr "Declaraties"
+
+#. module: project_hr_expense
+#: model:ir.model,name:project_hr_expense.model_project_project
+msgid "Project"
+msgstr "Project"
diff --git a/i18n/pl.po b/i18n/pl.po
new file mode 100644
index 0000000..6a6f459
--- /dev/null
+++ b/i18n/pl.po
@@ -0,0 +1,38 @@
+# Translation of Odoo Server.
+# This file contains the translation of the following modules:
+# * project_hr_expense
+#
+# Translators:
+# Wil Odoo, 2023
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: Odoo Server 17.0\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2023-10-26 21:55+0000\n"
+"PO-Revision-Date: 2023-10-26 23:09+0000\n"
+"Last-Translator: Wil Odoo, 2023\n"
+"Language-Team: Polish (https://app.transifex.com/odoo/teams/41243/pl/)\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: \n"
+"Language: pl\n"
+"Plural-Forms: nplurals=4; plural=(n==1 ? 0 : (n%10>=2 && n%10<=4) && (n%100<12 || n%100>14) ? 1 : n!=1 && (n%10>=0 && n%10<=1) || (n%10>=5 && n%10<=9) || (n%100>=12 && n%100<=14) ? 2 : 3);\n"
+
+#. module: project_hr_expense
+#: model:ir.model.fields,field_description:project_hr_expense.field_project_project__expenses_count
+msgid "# Expenses"
+msgstr "# Wydatki"
+
+#. module: project_hr_expense
+#. odoo-python
+#: code:addons/project_hr_expense/models/project_project.py:0
+#: code:addons/project_hr_expense/models/project_project.py:0
+#, python-format
+msgid "Expenses"
+msgstr "Wydatki"
+
+#. module: project_hr_expense
+#: model:ir.model,name:project_hr_expense.model_project_project
+msgid "Project"
+msgstr "Projekt"
diff --git a/i18n/project_hr_expense.pot b/i18n/project_hr_expense.pot
new file mode 100644
index 0000000..579ed3a
--- /dev/null
+++ b/i18n/project_hr_expense.pot
@@ -0,0 +1,34 @@
+# Translation of Odoo Server.
+# This file contains the translation of the following modules:
+# * project_hr_expense
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: Odoo Server 17.0\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2023-10-26 21:55+0000\n"
+"PO-Revision-Date: 2023-10-26 21:55+0000\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: project_hr_expense
+#: model:ir.model.fields,field_description:project_hr_expense.field_project_project__expenses_count
+msgid "# Expenses"
+msgstr ""
+
+#. module: project_hr_expense
+#. odoo-python
+#: code:addons/project_hr_expense/models/project_project.py:0
+#: code:addons/project_hr_expense/models/project_project.py:0
+#, python-format
+msgid "Expenses"
+msgstr ""
+
+#. module: project_hr_expense
+#: model:ir.model,name:project_hr_expense.model_project_project
+msgid "Project"
+msgstr ""
diff --git a/i18n/pt.po b/i18n/pt.po
new file mode 100644
index 0000000..7223cf8
--- /dev/null
+++ b/i18n/pt.po
@@ -0,0 +1,38 @@
+# Translation of Odoo Server.
+# This file contains the translation of the following modules:
+# * project_hr_expense
+#
+# Translators:
+# Wil Odoo, 2023
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: Odoo Server 17.0\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2023-10-26 21:55+0000\n"
+"PO-Revision-Date: 2023-10-26 23:09+0000\n"
+"Last-Translator: Wil Odoo, 2023\n"
+"Language-Team: Portuguese (https://app.transifex.com/odoo/teams/41243/pt/)\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: \n"
+"Language: pt\n"
+"Plural-Forms: nplurals=3; plural=(n == 0 || n == 1) ? 0 : n != 0 && n % 1000000 == 0 ? 1 : 2;\n"
+
+#. module: project_hr_expense
+#: model:ir.model.fields,field_description:project_hr_expense.field_project_project__expenses_count
+msgid "# Expenses"
+msgstr "# Despesas"
+
+#. module: project_hr_expense
+#. odoo-python
+#: code:addons/project_hr_expense/models/project_project.py:0
+#: code:addons/project_hr_expense/models/project_project.py:0
+#, python-format
+msgid "Expenses"
+msgstr "Despesas"
+
+#. module: project_hr_expense
+#: model:ir.model,name:project_hr_expense.model_project_project
+msgid "Project"
+msgstr "Projeto"
diff --git a/i18n/pt_BR.po b/i18n/pt_BR.po
new file mode 100644
index 0000000..e09f184
--- /dev/null
+++ b/i18n/pt_BR.po
@@ -0,0 +1,38 @@
+# Translation of Odoo Server.
+# This file contains the translation of the following modules:
+# * project_hr_expense
+#
+# Translators:
+# Wil Odoo, 2023
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: Odoo Server 17.0\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2023-10-26 21:55+0000\n"
+"PO-Revision-Date: 2023-10-26 23:09+0000\n"
+"Last-Translator: Wil Odoo, 2023\n"
+"Language-Team: Portuguese (Brazil) (https://app.transifex.com/odoo/teams/41243/pt_BR/)\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: \n"
+"Language: pt_BR\n"
+"Plural-Forms: nplurals=3; plural=(n == 0 || n == 1) ? 0 : n != 0 && n % 1000000 == 0 ? 1 : 2;\n"
+
+#. module: project_hr_expense
+#: model:ir.model.fields,field_description:project_hr_expense.field_project_project__expenses_count
+msgid "# Expenses"
+msgstr "Nº de despesas"
+
+#. module: project_hr_expense
+#. odoo-python
+#: code:addons/project_hr_expense/models/project_project.py:0
+#: code:addons/project_hr_expense/models/project_project.py:0
+#, python-format
+msgid "Expenses"
+msgstr "Despesas"
+
+#. module: project_hr_expense
+#: model:ir.model,name:project_hr_expense.model_project_project
+msgid "Project"
+msgstr "Projeto"
diff --git a/i18n/ru.po b/i18n/ru.po
new file mode 100644
index 0000000..17249ae
--- /dev/null
+++ b/i18n/ru.po
@@ -0,0 +1,35 @@
+# Translation of Odoo Server.
+# This file contains the translation of the following modules:
+# * project_hr_expense
+#
+# Translators:
+msgid ""
+msgstr ""
+"Project-Id-Version: Odoo Server 17.0\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2023-10-26 21:55+0000\n"
+"PO-Revision-Date: 2024-01-30 15:14+0400\n"
+"Last-Translator: \n"
+"Language-Team: Russian (https://app.transifex.com/odoo/teams/41243/ru/)\n"
+"Language: ru\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: \n"
+"Plural-Forms: nplurals=4; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<12 || n%100>14) ? 1 : n%10==0 || (n%10>=5 && n%10<=9) || (n%100>=11 && n%100<=14)? 2 : 3);\n"
+
+#. module: project_hr_expense
+#: model:ir.model.fields,field_description:project_hr_expense.field_project_project__expenses_count
+msgid "# Expenses"
+msgstr "# Расходы"
+
+#. module: project_hr_expense
+#. odoo-python
+#: code:addons/project_hr_expense/models/project_project.py:0
+#, python-format
+msgid "Expenses"
+msgstr "Расходы"
+
+#. module: project_hr_expense
+#: model:ir.model,name:project_hr_expense.model_project_project
+msgid "Project"
+msgstr "Проект"
diff --git a/i18n/sk.po b/i18n/sk.po
new file mode 100644
index 0000000..d9564e7
--- /dev/null
+++ b/i18n/sk.po
@@ -0,0 +1,38 @@
+# Translation of Odoo Server.
+# This file contains the translation of the following modules:
+# * project_hr_expense
+#
+# Translators:
+# Wil Odoo, 2023
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: Odoo Server 17.0\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2023-10-26 21:55+0000\n"
+"PO-Revision-Date: 2023-10-26 23:09+0000\n"
+"Last-Translator: Wil Odoo, 2023\n"
+"Language-Team: Slovak (https://app.transifex.com/odoo/teams/41243/sk/)\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: \n"
+"Language: sk\n"
+"Plural-Forms: nplurals=4; plural=(n % 1 == 0 && n == 1 ? 0 : n % 1 == 0 && n >= 2 && n <= 4 ? 1 : n % 1 != 0 ? 2: 3);\n"
+
+#. module: project_hr_expense
+#: model:ir.model.fields,field_description:project_hr_expense.field_project_project__expenses_count
+msgid "# Expenses"
+msgstr ""
+
+#. module: project_hr_expense
+#. odoo-python
+#: code:addons/project_hr_expense/models/project_project.py:0
+#: code:addons/project_hr_expense/models/project_project.py:0
+#, python-format
+msgid "Expenses"
+msgstr "Výdavky"
+
+#. module: project_hr_expense
+#: model:ir.model,name:project_hr_expense.model_project_project
+msgid "Project"
+msgstr "Projekt"
diff --git a/i18n/sl.po b/i18n/sl.po
new file mode 100644
index 0000000..bbd726c
--- /dev/null
+++ b/i18n/sl.po
@@ -0,0 +1,38 @@
+# Translation of Odoo Server.
+# This file contains the translation of the following modules:
+# * project_hr_expense
+#
+# Translators:
+# Martin Trigaux, 2023
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: Odoo Server 17.0\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2023-10-26 21:55+0000\n"
+"PO-Revision-Date: 2023-10-26 23:09+0000\n"
+"Last-Translator: Martin Trigaux, 2023\n"
+"Language-Team: Slovenian (https://app.transifex.com/odoo/teams/41243/sl/)\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: \n"
+"Language: sl\n"
+"Plural-Forms: nplurals=4; plural=(n%100==1 ? 0 : n%100==2 ? 1 : n%100==3 || n%100==4 ? 2 : 3);\n"
+
+#. module: project_hr_expense
+#: model:ir.model.fields,field_description:project_hr_expense.field_project_project__expenses_count
+msgid "# Expenses"
+msgstr ""
+
+#. module: project_hr_expense
+#. odoo-python
+#: code:addons/project_hr_expense/models/project_project.py:0
+#: code:addons/project_hr_expense/models/project_project.py:0
+#, python-format
+msgid "Expenses"
+msgstr "Stroški"
+
+#. module: project_hr_expense
+#: model:ir.model,name:project_hr_expense.model_project_project
+msgid "Project"
+msgstr "Projekt"
diff --git a/i18n/sr.po b/i18n/sr.po
new file mode 100644
index 0000000..2173486
--- /dev/null
+++ b/i18n/sr.po
@@ -0,0 +1,38 @@
+# Translation of Odoo Server.
+# This file contains the translation of the following modules:
+# * project_hr_expense
+#
+# Translators:
+# Milan Bojovic, 2023
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: Odoo Server 17.0\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2023-10-26 21:55+0000\n"
+"PO-Revision-Date: 2023-10-26 23:09+0000\n"
+"Last-Translator: Milan Bojovic, 2023\n"
+"Language-Team: Serbian (https://app.transifex.com/odoo/teams/41243/sr/)\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: \n"
+"Language: sr\n"
+"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n"
+
+#. module: project_hr_expense
+#: model:ir.model.fields,field_description:project_hr_expense.field_project_project__expenses_count
+msgid "# Expenses"
+msgstr "# Troškovi"
+
+#. module: project_hr_expense
+#. odoo-python
+#: code:addons/project_hr_expense/models/project_project.py:0
+#: code:addons/project_hr_expense/models/project_project.py:0
+#, python-format
+msgid "Expenses"
+msgstr "Troškovi"
+
+#. module: project_hr_expense
+#: model:ir.model,name:project_hr_expense.model_project_project
+msgid "Project"
+msgstr "Projekat"
diff --git a/i18n/sv.po b/i18n/sv.po
new file mode 100644
index 0000000..1d91eb7
--- /dev/null
+++ b/i18n/sv.po
@@ -0,0 +1,40 @@
+# Translation of Odoo Server.
+# This file contains the translation of the following modules:
+# * project_hr_expense
+#
+# Translators:
+# Kim Asplund , 2023
+# Simon S, 2023
+# Martin Trigaux, 2023
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: Odoo Server 17.0\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2023-10-26 21:55+0000\n"
+"PO-Revision-Date: 2023-10-26 23:09+0000\n"
+"Last-Translator: Martin Trigaux, 2023\n"
+"Language-Team: Swedish (https://app.transifex.com/odoo/teams/41243/sv/)\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: \n"
+"Language: sv\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+
+#. module: project_hr_expense
+#: model:ir.model.fields,field_description:project_hr_expense.field_project_project__expenses_count
+msgid "# Expenses"
+msgstr "# Utgifter"
+
+#. module: project_hr_expense
+#. odoo-python
+#: code:addons/project_hr_expense/models/project_project.py:0
+#: code:addons/project_hr_expense/models/project_project.py:0
+#, python-format
+msgid "Expenses"
+msgstr "Utlägg"
+
+#. module: project_hr_expense
+#: model:ir.model,name:project_hr_expense.model_project_project
+msgid "Project"
+msgstr "Projekt"
diff --git a/i18n/th.po b/i18n/th.po
new file mode 100644
index 0000000..165e96d
--- /dev/null
+++ b/i18n/th.po
@@ -0,0 +1,39 @@
+# Translation of Odoo Server.
+# This file contains the translation of the following modules:
+# * project_hr_expense
+#
+# Translators:
+# Wil Odoo, 2023
+# Rasareeyar Lappiam, 2023
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: Odoo Server 17.0\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2023-10-26 21:55+0000\n"
+"PO-Revision-Date: 2023-10-26 23:09+0000\n"
+"Last-Translator: Rasareeyar Lappiam, 2023\n"
+"Language-Team: Thai (https://app.transifex.com/odoo/teams/41243/th/)\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: \n"
+"Language: th\n"
+"Plural-Forms: nplurals=1; plural=0;\n"
+
+#. module: project_hr_expense
+#: model:ir.model.fields,field_description:project_hr_expense.field_project_project__expenses_count
+msgid "# Expenses"
+msgstr "# ค่าใช้จ่าย"
+
+#. module: project_hr_expense
+#. odoo-python
+#: code:addons/project_hr_expense/models/project_project.py:0
+#: code:addons/project_hr_expense/models/project_project.py:0
+#, python-format
+msgid "Expenses"
+msgstr "ค่าใช้จ่าย"
+
+#. module: project_hr_expense
+#: model:ir.model,name:project_hr_expense.model_project_project
+msgid "Project"
+msgstr "โปรเจ็กต์"
diff --git a/i18n/tr.po b/i18n/tr.po
new file mode 100644
index 0000000..fa2cfe5
--- /dev/null
+++ b/i18n/tr.po
@@ -0,0 +1,40 @@
+# Translation of Odoo Server.
+# This file contains the translation of the following modules:
+# * project_hr_expense
+#
+# Translators:
+# Tugay Hatıl , 2023
+# Özlem Atalay , 2023
+# Murat Kaplan , 2023
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: Odoo Server 17.0\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2023-10-26 21:55+0000\n"
+"PO-Revision-Date: 2023-10-26 23:09+0000\n"
+"Last-Translator: Murat Kaplan , 2023\n"
+"Language-Team: Turkish (https://app.transifex.com/odoo/teams/41243/tr/)\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: \n"
+"Language: tr\n"
+"Plural-Forms: nplurals=2; plural=(n > 1);\n"
+
+#. module: project_hr_expense
+#: model:ir.model.fields,field_description:project_hr_expense.field_project_project__expenses_count
+msgid "# Expenses"
+msgstr "# Masraflar"
+
+#. module: project_hr_expense
+#. odoo-python
+#: code:addons/project_hr_expense/models/project_project.py:0
+#: code:addons/project_hr_expense/models/project_project.py:0
+#, python-format
+msgid "Expenses"
+msgstr "Masraflar"
+
+#. module: project_hr_expense
+#: model:ir.model,name:project_hr_expense.model_project_project
+msgid "Project"
+msgstr "Proje"
diff --git a/i18n/uk.po b/i18n/uk.po
new file mode 100644
index 0000000..fcd8660
--- /dev/null
+++ b/i18n/uk.po
@@ -0,0 +1,38 @@
+# Translation of Odoo Server.
+# This file contains the translation of the following modules:
+# * project_hr_expense
+#
+# Translators:
+# Wil Odoo, 2023
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: Odoo Server 17.0\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2023-10-26 21:55+0000\n"
+"PO-Revision-Date: 2023-10-26 23:09+0000\n"
+"Last-Translator: Wil Odoo, 2023\n"
+"Language-Team: Ukrainian (https://app.transifex.com/odoo/teams/41243/uk/)\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: \n"
+"Language: uk\n"
+"Plural-Forms: nplurals=4; plural=(n % 1 == 0 && n % 10 == 1 && n % 100 != 11 ? 0 : n % 1 == 0 && n % 10 >= 2 && n % 10 <= 4 && (n % 100 < 12 || n % 100 > 14) ? 1 : n % 1 == 0 && (n % 10 ==0 || (n % 10 >=5 && n % 10 <=9) || (n % 100 >=11 && n % 100 <=14 )) ? 2: 3);\n"
+
+#. module: project_hr_expense
+#: model:ir.model.fields,field_description:project_hr_expense.field_project_project__expenses_count
+msgid "# Expenses"
+msgstr "К-сть витрат"
+
+#. module: project_hr_expense
+#. odoo-python
+#: code:addons/project_hr_expense/models/project_project.py:0
+#: code:addons/project_hr_expense/models/project_project.py:0
+#, python-format
+msgid "Expenses"
+msgstr "Витрати"
+
+#. module: project_hr_expense
+#: model:ir.model,name:project_hr_expense.model_project_project
+msgid "Project"
+msgstr "Проект"
diff --git a/i18n/vi.po b/i18n/vi.po
new file mode 100644
index 0000000..d7d04e6
--- /dev/null
+++ b/i18n/vi.po
@@ -0,0 +1,38 @@
+# Translation of Odoo Server.
+# This file contains the translation of the following modules:
+# * project_hr_expense
+#
+# Translators:
+# Wil Odoo, 2023
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: Odoo Server 17.0\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2023-10-26 21:55+0000\n"
+"PO-Revision-Date: 2023-10-26 23:09+0000\n"
+"Last-Translator: Wil Odoo, 2023\n"
+"Language-Team: Vietnamese (https://app.transifex.com/odoo/teams/41243/vi/)\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: \n"
+"Language: vi\n"
+"Plural-Forms: nplurals=1; plural=0;\n"
+
+#. module: project_hr_expense
+#: model:ir.model.fields,field_description:project_hr_expense.field_project_project__expenses_count
+msgid "# Expenses"
+msgstr "# Chi phí"
+
+#. module: project_hr_expense
+#. odoo-python
+#: code:addons/project_hr_expense/models/project_project.py:0
+#: code:addons/project_hr_expense/models/project_project.py:0
+#, python-format
+msgid "Expenses"
+msgstr "Chi phí"
+
+#. module: project_hr_expense
+#: model:ir.model,name:project_hr_expense.model_project_project
+msgid "Project"
+msgstr "Dự án"
diff --git a/i18n/zh_CN.po b/i18n/zh_CN.po
new file mode 100644
index 0000000..2345e29
--- /dev/null
+++ b/i18n/zh_CN.po
@@ -0,0 +1,38 @@
+# Translation of Odoo Server.
+# This file contains the translation of the following modules:
+# * project_hr_expense
+#
+# Translators:
+# Wil Odoo, 2023
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: Odoo Server 17.0\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2023-10-26 21:55+0000\n"
+"PO-Revision-Date: 2023-10-26 23:09+0000\n"
+"Last-Translator: Wil Odoo, 2023\n"
+"Language-Team: Chinese (China) (https://app.transifex.com/odoo/teams/41243/zh_CN/)\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: \n"
+"Language: zh_CN\n"
+"Plural-Forms: nplurals=1; plural=0;\n"
+
+#. module: project_hr_expense
+#: model:ir.model.fields,field_description:project_hr_expense.field_project_project__expenses_count
+msgid "# Expenses"
+msgstr "# 费用"
+
+#. module: project_hr_expense
+#. odoo-python
+#: code:addons/project_hr_expense/models/project_project.py:0
+#: code:addons/project_hr_expense/models/project_project.py:0
+#, python-format
+msgid "Expenses"
+msgstr "费用"
+
+#. module: project_hr_expense
+#: model:ir.model,name:project_hr_expense.model_project_project
+msgid "Project"
+msgstr "项目"
diff --git a/i18n/zh_TW.po b/i18n/zh_TW.po
new file mode 100644
index 0000000..cfeb4b4
--- /dev/null
+++ b/i18n/zh_TW.po
@@ -0,0 +1,38 @@
+# Translation of Odoo Server.
+# This file contains the translation of the following modules:
+# * project_hr_expense
+#
+# Translators:
+# Wil Odoo, 2023
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: Odoo Server 17.0\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2023-10-26 21:55+0000\n"
+"PO-Revision-Date: 2023-10-26 23:09+0000\n"
+"Last-Translator: Wil Odoo, 2023\n"
+"Language-Team: Chinese (Taiwan) (https://app.transifex.com/odoo/teams/41243/zh_TW/)\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: \n"
+"Language: zh_TW\n"
+"Plural-Forms: nplurals=1; plural=0;\n"
+
+#. module: project_hr_expense
+#: model:ir.model.fields,field_description:project_hr_expense.field_project_project__expenses_count
+msgid "# Expenses"
+msgstr "開支數目"
+
+#. module: project_hr_expense
+#. odoo-python
+#: code:addons/project_hr_expense/models/project_project.py:0
+#: code:addons/project_hr_expense/models/project_project.py:0
+#, python-format
+msgid "Expenses"
+msgstr "開支"
+
+#. module: project_hr_expense
+#: model:ir.model,name:project_hr_expense.model_project_project
+msgid "Project"
+msgstr "專案"
diff --git a/models/__init__.py b/models/__init__.py
new file mode 100644
index 0000000..5de26c1
--- /dev/null
+++ b/models/__init__.py
@@ -0,0 +1,3 @@
+# -*- coding: utf-8 -*-
+
+from . import project_project
diff --git a/models/project_project.py b/models/project_project.py
new file mode 100644
index 0000000..58ca379
--- /dev/null
+++ b/models/project_project.py
@@ -0,0 +1,139 @@
+# Part of Odoo. See LICENSE file for full copyright and licensing details.
+
+import json
+
+from odoo import api, fields, models, _, _lt
+from odoo.osv import expression
+from collections import defaultdict
+
+class Project(models.Model):
+ _inherit = 'project.project'
+
+ expenses_count = fields.Integer('# Expenses', compute='_compute_expenses_count', groups='hr_expense.group_hr_expense_team_approver')
+
+ @api.depends('analytic_account_id')
+ def _compute_expenses_count(self):
+ if not self.analytic_account_id:
+ self.expenses_count = 0
+ return
+ query = self.env['hr.expense']._search([])
+ query.add_where('hr_expense.analytic_distribution ?| %s', [[str(account_id) for account_id in self.analytic_account_id.ids]])
+
+ query_string, query_param = query.select(
+ 'jsonb_object_keys(analytic_distribution) as account_id',
+ 'COUNT(DISTINCT(id)) as expense_count',
+ )
+ query_string = f'{query_string} GROUP BY jsonb_object_keys(analytic_distribution)'
+ self._cr.execute(query_string, query_param)
+ data = {int(record.get('account_id')): record.get('expense_count') for record in self._cr.dictfetchall()}
+ for project in self:
+ project.expenses_count = data.get(project.analytic_account_id.id, 0)
+
+ # ----------------------------
+ # Actions
+ # ----------------------------
+
+ def _get_expense_action(self, domain=None, expense_ids=None):
+ if not domain and not expense_ids:
+ return {}
+ action = self.env["ir.actions.actions"]._for_xml_id("hr_expense.hr_expense_actions_all")
+ action.update({
+ 'display_name': _('Expenses'),
+ 'views': [[False, 'tree'], [False, 'form'], [False, 'kanban'], [False, 'graph'], [False, 'pivot']],
+ 'context': {'default_analytic_distribution': {self.analytic_account_id.id: 100}},
+ 'domain': domain or [('id', 'in', expense_ids)],
+ })
+ if len(expense_ids) == 1:
+ action["views"] = [[False, 'form']]
+ action["res_id"] = expense_ids[0]
+ return action
+
+ def _get_add_purchase_items_domain(self):
+ return expression.AND([
+ super()._get_add_purchase_items_domain(),
+ [('expense_id', '=', False)],
+ ])
+
+ def action_profitability_items(self, section_name, domain=None, res_id=False):
+ if section_name == 'expenses':
+ return self._get_expense_action(domain, [res_id] if res_id else [])
+ return super().action_profitability_items(section_name, domain, res_id)
+
+ # ----------------------------
+ # Project Update
+ # ----------------------------
+
+ def _get_profitability_labels(self):
+ labels = super()._get_profitability_labels()
+ labels['expenses'] = _lt('Expenses')
+ return labels
+
+ def _get_profitability_sequence_per_invoice_type(self):
+ sequence_per_invoice_type = super()._get_profitability_sequence_per_invoice_type()
+ sequence_per_invoice_type['expenses'] = 13
+ return sequence_per_invoice_type
+
+ def _get_already_included_profitability_invoice_line_ids(self):
+ # As both purchase orders and expenses (paid by employee) create vendor bills,
+ # we need to make sure they are exclusive in the profitability report.
+ move_line_ids = super()._get_already_included_profitability_invoice_line_ids()
+ query = self.env['account.move.line']._search([
+ ('move_id.expense_sheet_id', '!=', False),
+ ('id', 'not in', move_line_ids),
+ ])
+ return move_line_ids + list(query)
+
+ def _get_expenses_profitability_items(self, with_action=True):
+ if not self.analytic_account_id:
+ return {}
+ can_see_expense = with_action and self.user_has_groups('hr_expense.group_hr_expense_team_approver')
+ query = self.env['hr.expense']._search([('state', 'in', ['approved', 'done'])])
+ query.add_where('hr_expense.analytic_distribution ? %s', [str(self.analytic_account_id.id)])
+ query_string, query_param = query.select('currency_id', 'array_agg(id) as ids', 'SUM(untaxed_amount_currency) as untaxed_amount')
+ query_string = f"{query_string} GROUP BY currency_id"
+ self._cr.execute(query_string, query_param)
+ expenses_read_group = [expense for expense in self._cr.dictfetchall()]
+ if not expenses_read_group or not expenses_read_group[0].get('ids'):
+ return {}
+ expense_ids = []
+ amount_billed = 0.0
+ all_currencies = {res['currency_id'] for res in expenses_read_group}
+ for res in expenses_read_group:
+ if can_see_expense:
+ expense_ids.extend(res['ids'])
+ amount_billed += self.env['res.currency'].browse(res['currency_id']).with_prefetch(all_currencies)._convert(
+ from_amount=res['untaxed_amount'],
+ to_currency=self.currency_id,
+ company=self.company_id,
+ )
+
+ section_id = 'expenses'
+ expense_profitability_items = {
+ 'costs': {'id': section_id, 'sequence': self._get_profitability_sequence_per_invoice_type()[section_id], 'billed': -amount_billed, 'to_bill': 0.0},
+ }
+ if can_see_expense:
+ args = [section_id, [('id', 'in', expense_ids)]]
+ if expense_ids:
+ args.append(expense_ids)
+ action = {'name': 'action_profitability_items', 'type': 'object', 'args': json.dumps(args)}
+ expense_profitability_items['action'] = action
+ return expense_profitability_items
+
+ def _get_profitability_aal_domain(self):
+ return expression.AND([
+ super()._get_profitability_aal_domain(),
+ ['|', ('move_line_id', '=', False), ('move_line_id.expense_id', '=', False)],
+ ])
+
+ def _get_profitability_items(self, with_action=True):
+ profitability_data = super()._get_profitability_items(with_action)
+ expenses_data = self._get_expenses_profitability_items(with_action)
+ if expenses_data:
+ if 'revenues' in expenses_data:
+ revenues = profitability_data['revenues']
+ revenues['data'].append(expenses_data['revenues'])
+ revenues['total'] = {k: revenues['total'][k] + expenses_data['revenues'][k] for k in ['invoiced', 'to_invoice']}
+ costs = profitability_data['costs']
+ costs['data'].append(expenses_data['costs'])
+ costs['total'] = {k: costs['total'][k] + expenses_data['costs'][k] for k in ['billed', 'to_bill']}
+ return profitability_data
diff --git a/tests/__init__.py b/tests/__init__.py
new file mode 100644
index 0000000..4fa67e8
--- /dev/null
+++ b/tests/__init__.py
@@ -0,0 +1,4 @@
+# -*- coding: utf-8 -*-
+# Part of Odoo. See LICENSE file for full copyright and licensing details.
+
+from . import test_project_profitability
diff --git a/tests/test_project_profitability.py b/tests/test_project_profitability.py
new file mode 100644
index 0000000..bba32c6
--- /dev/null
+++ b/tests/test_project_profitability.py
@@ -0,0 +1,165 @@
+# Part of Odoo. See LICENSE file for full copyright and licensing details.
+
+from odoo.addons.hr_expense.tests.common import TestExpenseCommon
+from odoo.addons.project.tests.test_project_profitability import TestProjectProfitabilityCommon
+from odoo.addons.account.tests.common import AccountTestInvoicingCommon
+from odoo.tests.common import tagged
+
+
+class TestProjectHrExpenseProfitabilityCommon(TestExpenseCommon, AccountTestInvoicingCommon):
+ def check_project_profitability_before_creating_and_approving_expense_sheet(self, expense, project, project_profitability_items_empty):
+ self.assertDictEqual(
+ project._get_profitability_items(False),
+ project_profitability_items_empty,
+ 'No data should be found since the expense is not approved yet.',
+ )
+
+ expense_sheet_vals_list = expense._get_default_expense_sheet_values()
+ expense_sheet = self.env['hr.expense.sheet'].create(expense_sheet_vals_list)
+ self.assertEqual(len(expense_sheet), 1, '1 expense sheet should be created.')
+
+ expense_sheet.action_submit_sheet()
+ self.assertEqual(expense_sheet.state, 'submit')
+
+ self.assertDictEqual(
+ project._get_profitability_items(False),
+ project_profitability_items_empty,
+ 'No data should be found since the sheet is not approved yet.',
+ )
+
+ expense_sheet.action_approve_expense_sheets()
+ self.assertEqual(expense_sheet.state, 'approve')
+ return expense_sheet
+
+
+@tagged('post_install', '-at_install')
+class TestProjectHrExpenseProfitability(TestProjectProfitabilityCommon, TestProjectHrExpenseProfitabilityCommon):
+
+ def test_project_profitability(self):
+ self.project.company_id = False
+ # Create a new company with the foreign currency.
+ foreign_company = self.company_data_2['company']
+ foreign_company.currency_id = self.foreign_currency
+ foreign_employee = self.env['hr.employee'].create({'name': 'Foreign employee', 'company_id': foreign_company.id})
+
+ expense = self.env['hr.expense'].create({
+ 'name': 'Car Travel Expenses',
+ 'employee_id': self.expense_employee.id,
+ 'product_id': self.product_c.id,
+ 'total_amount_currency': 350.00,
+ 'company_id': self.env.company.id,
+ 'analytic_distribution': {self.project.analytic_account_id.id: 100},
+ })
+
+ expense_sheet = self.check_project_profitability_before_creating_and_approving_expense_sheet(
+ expense,
+ self.project,
+ self.project_profitability_items_empty)
+
+ sequence_per_invoice_type = self.project._get_profitability_sequence_per_invoice_type()
+ self.assertIn('expenses', sequence_per_invoice_type)
+ expense_sequence = sequence_per_invoice_type['expenses']
+
+ self.assertDictEqual(
+ self.project._get_profitability_items(False),
+ {
+ 'costs': {
+ 'data': [{'id': 'expenses', 'sequence': expense_sequence, 'to_bill': 0.0, 'billed': -expense.untaxed_amount_currency}],
+ 'total': {'to_bill': 0.0, 'billed': -expense.untaxed_amount_currency},
+ },
+ 'revenues': {'data': [], 'total': {'to_invoice': 0.0, 'invoiced': 0.0}},
+ },
+ )
+
+ # Create an expense in a foreign company, the expense is linked to the AA of the project.
+ expense_foreign = self.env['hr.expense'].create({
+ 'name': 'Car Travel Expenses foreign',
+ 'employee_id': foreign_employee.id,
+ 'product_id': self.product_c.id,
+ 'total_amount_currency': 350.00,
+ 'company_id': foreign_company.id,
+ 'analytic_distribution': {self.project.analytic_account_id.id: 100},
+ 'currency_id': self.foreign_currency.id,
+ })
+ expense_sheet_vals_list = expense_foreign._get_default_expense_sheet_values()
+ expense_sheet_vals_list[0]['employee_journal_id'] = self.company_data_2['default_journal_purchase'].id
+ expense_sheet_foreign = self.env['hr.expense.sheet'].create(expense_sheet_vals_list)
+ expense_sheet_foreign.action_submit_sheet()
+ self.assertEqual(expense_sheet_foreign.state, 'submit')
+ expense_sheet_foreign.action_approve_expense_sheets()
+ self.assertEqual(expense_sheet_foreign.state, 'approve')
+
+ # The cost of the foreign expense sheet should now be computed in the project profitability, since it is now approved
+ self.assertDictEqual(
+ self.project._get_profitability_items(False),
+ {
+ 'costs': {
+ 'data': [{
+ 'id': 'expenses',
+ 'sequence': expense_sequence,
+ 'to_bill': 0.0,
+ 'billed': -expense.untaxed_amount_currency - expense_foreign.untaxed_amount_currency * 0.2
+ }],
+ 'total': {'to_bill': 0.0, 'billed': -expense.untaxed_amount_currency - expense_foreign.untaxed_amount_currency * 0.2},
+ },
+ 'revenues': {'data': [], 'total': {'to_invoice': 0.0, 'invoiced': 0.0}},
+ },
+ )
+
+ # Cancel the expense sheet of the main company. Only the total from the foreign company should be computed
+ expense_sheet._do_refuse('Test cancel expense')
+ self.assertDictEqual(
+ self.project._get_profitability_items(False),
+ {
+ 'costs': {
+ 'data': [{'id': 'expenses', 'sequence': expense_sequence, 'to_bill': 0.0, 'billed': -expense_foreign.untaxed_amount_currency * 0.2}],
+ 'total': {'to_bill': 0.0, 'billed': -expense_foreign.untaxed_amount_currency * 0.2},
+ },
+ 'revenues': {'data': [], 'total': {'to_invoice': 0.0, 'invoiced': 0.0}},
+ },
+ )
+
+ expense_sheet_foreign._do_refuse('Test cancel foreign expense')
+ self.assertDictEqual(
+ self.project._get_profitability_items(False),
+ self.project_profitability_items_empty,
+ 'No data should be found since the sheets are not approved yet.',
+ )
+
+ def test_project_profitability_after_expense_sheet_actions(self):
+ expense = self.env["hr.expense"].create(
+ {
+ "name": "Car Travel Expenses",
+ "employee_id": self.expense_employee.id,
+ "product_id": self.product_c.id,
+ "total_amount": 50.00,
+ "company_id": self.project.company_id.id,
+ "analytic_distribution": {self.project.analytic_account_id.id: 100},
+ }
+ )
+ expense_sheet = self.env["hr.expense.sheet"].create(
+ {
+ "name": "Expense for Jannette",
+ "employee_id": self.expense_employee.id,
+ "expense_line_ids": expense,
+ }
+ )
+
+ sequence_per_invoice_type = self.project._get_profitability_sequence_per_invoice_type()
+ self.assertIn('expenses', sequence_per_invoice_type)
+ expense_sequence = sequence_per_invoice_type['expenses']
+
+ expense_sheet.action_submit_sheet()
+ expense_sheet.action_approve_expense_sheets()
+ expense_sheet.action_sheet_move_create()
+
+ self.assertDictEqual(
+ self.project._get_profitability_items(False),
+ {
+ 'costs': {
+ 'data': [{'id': 'expenses', 'sequence': expense_sequence, 'to_bill': 0.0, 'billed': -expense.untaxed_amount_currency}],
+ 'total': {'to_bill': 0.0, 'billed': -expense.untaxed_amount_currency},
+ },
+ 'revenues': {'data': [], 'total': {'to_invoice': 0.0, 'invoiced': 0.0}},
+ },
+ )