From bfddd12e651c8b9a16e9f7dd207ab298b2b81a25 Mon Sep 17 00:00:00 2001
From: Prapassorn Sornkaew
Date: Mon, 18 Jan 2021 07:25:51 +0000
Subject: [PATCH 01/23] [14.0][ADD] purchase_request_type
[UPD] Update purchase_request_type.pot
[UPD] README.rst
---
purchase_request_type/README.rst | 97 ++++
purchase_request_type/__init__.py | 1 +
purchase_request_type/__manifest__.py | 22 +
.../data/purchase_request_type.xml | 14 +
.../i18n/purchase_request_type.pot | 146 ++++++
purchase_request_type/models/__init__.py | 2 +
.../models/purchase_request.py | 69 +++
.../models/purchase_request_type.py | 45 ++
purchase_request_type/readme/CONFIGURE.rst | 4 +
purchase_request_type/readme/CONTRIBUTORS.rst | 1 +
purchase_request_type/readme/DESCRIPTION.rst | 5 +
purchase_request_type/readme/ROADMAP.rst | 1 +
purchase_request_type/readme/USAGE.rst | 3 +
.../security/ir.model.access.csv | 3 +
purchase_request_type/security/security.xml | 12 +
.../static/description/icon.png | Bin 0 -> 9455 bytes
.../static/description/index.html | 450 ++++++++++++++++++
purchase_request_type/tests/__init__.py | 4 +
.../tests/test_purchase_request_type.py | 78 +++
.../views/purchase_request_type_view.xml | 117 +++++
.../views/purchase_request_view.xml | 54 +++
21 files changed, 1128 insertions(+)
create mode 100644 purchase_request_type/README.rst
create mode 100644 purchase_request_type/__init__.py
create mode 100644 purchase_request_type/__manifest__.py
create mode 100644 purchase_request_type/data/purchase_request_type.xml
create mode 100644 purchase_request_type/i18n/purchase_request_type.pot
create mode 100644 purchase_request_type/models/__init__.py
create mode 100644 purchase_request_type/models/purchase_request.py
create mode 100644 purchase_request_type/models/purchase_request_type.py
create mode 100644 purchase_request_type/readme/CONFIGURE.rst
create mode 100644 purchase_request_type/readme/CONTRIBUTORS.rst
create mode 100644 purchase_request_type/readme/DESCRIPTION.rst
create mode 100644 purchase_request_type/readme/ROADMAP.rst
create mode 100644 purchase_request_type/readme/USAGE.rst
create mode 100644 purchase_request_type/security/ir.model.access.csv
create mode 100644 purchase_request_type/security/security.xml
create mode 100644 purchase_request_type/static/description/icon.png
create mode 100644 purchase_request_type/static/description/index.html
create mode 100644 purchase_request_type/tests/__init__.py
create mode 100644 purchase_request_type/tests/test_purchase_request_type.py
create mode 100644 purchase_request_type/views/purchase_request_type_view.xml
create mode 100644 purchase_request_type/views/purchase_request_view.xml
diff --git a/purchase_request_type/README.rst b/purchase_request_type/README.rst
new file mode 100644
index 00000000000..b9da2b22236
--- /dev/null
+++ b/purchase_request_type/README.rst
@@ -0,0 +1,97 @@
+=====================
+Purchase Request Type
+=====================
+
+.. !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+ !! 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%2Fpurchase--workflow-lightgray.png?logo=github
+ :target: https://github.com/OCA/purchase-workflow/tree/14.0/purchase_request_type
+ :alt: OCA/purchase-workflow
+.. |badge4| image:: https://img.shields.io/badge/weblate-Translate%20me-F47D42.png
+ :target: https://translation.odoo-community.org/projects/purchase-workflow-14-0/purchase-workflow-14-0-purchase_request_type
+ :alt: Translate me on Weblate
+.. |badge5| image:: https://img.shields.io/badge/runbot-Try%20me-875A7B.png
+ :target: https://runbot.odoo-community.org/runbot/142/14.0
+ :alt: Try me on Runbot
+
+|badge1| |badge2| |badge3| |badge4| |badge5|
+
+This module adds the following functions:
+
+ - Adds a configurable *type* on the purchase requests.
+ - Choose reduce step not to create rfq.
+ - This type can be used in filters and groupbys.
+
+**Table of contents**
+
+.. contents::
+ :local:
+
+Configuration
+=============
+
+To configure this module, you need to:
+
+* Go to **Purchases > Configuration > Purchase Request types**
+* Modify / create the purchase request types
+
+Usage
+=====
+
+To use this module, you need to:
+
+* Attribute a type when editing purchase requests
+
+Known issues / Roadmap
+======================
+
+* Suggestion: add a default configuration attached to the types
+
+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
+~~~~~~~
+
+* ProThai
+
+Contributors
+~~~~~~~~~~~~
+
+* Prapassorn Sornkaew
+
+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.
+
+This module is part of the `OCA/purchase-workflow `_ project on GitHub.
+
+You are welcome to contribute. To learn how please visit https://odoo-community.org/page/Contribute.
diff --git a/purchase_request_type/__init__.py b/purchase_request_type/__init__.py
new file mode 100644
index 00000000000..0650744f6bc
--- /dev/null
+++ b/purchase_request_type/__init__.py
@@ -0,0 +1 @@
+from . import models
diff --git a/purchase_request_type/__manifest__.py b/purchase_request_type/__manifest__.py
new file mode 100644
index 00000000000..25eaaca69de
--- /dev/null
+++ b/purchase_request_type/__manifest__.py
@@ -0,0 +1,22 @@
+# Copyright 2021 ProThai Technology Co.,Ltd. (http://prothaitechnology.com)
+# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl.html).
+
+{
+ "name": "Purchase Request Type",
+ "version": "14.0.1.0.0",
+ "author": "ProThai, Odoo Community Association (OCA)",
+ "license": "AGPL-3",
+ "category": "Purchase Management",
+ "depends": ["purchase_request"],
+ "website": "https://github.com/OCA/purchase-workflow",
+ "data": [
+ "security/ir.model.access.csv",
+ "security/security.xml",
+ "views/purchase_request_type_view.xml",
+ "views/purchase_request_view.xml",
+ "data/purchase_request_type.xml",
+ ],
+ "maintainer": ["prapassornS"],
+ "installable": True,
+ "auto_install": False,
+}
diff --git a/purchase_request_type/data/purchase_request_type.xml b/purchase_request_type/data/purchase_request_type.xml
new file mode 100644
index 00000000000..809f358ce25
--- /dev/null
+++ b/purchase_request_type/data/purchase_request_type.xml
@@ -0,0 +1,14 @@
+
+
+
+ Regular
+ 5
+
+
+ Contract
+
+
+ Reduce Step
+ 1
+
+
diff --git a/purchase_request_type/i18n/purchase_request_type.pot b/purchase_request_type/i18n/purchase_request_type.pot
new file mode 100644
index 00000000000..2bbaaa4120c
--- /dev/null
+++ b/purchase_request_type/i18n/purchase_request_type.pot
@@ -0,0 +1,146 @@
+# Translation of Odoo Server.
+# This file contains the translation of the following modules:
+# * purchase_request_type
+#
+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: purchase_request_type
+#: model:ir.model.fields,field_description:purchase_request_type.field_purchase_request_type__active
+msgid "Active"
+msgstr ""
+
+#. module: purchase_request_type
+#: model_terms:ir.actions.act_window,help:purchase_request_type.action_purchase_request_type_view
+msgid "Click to set a new type for purchase request."
+msgstr ""
+
+#. module: purchase_request_type
+#: model:ir.model.fields,field_description:purchase_request_type.field_purchase_request_type__company_id
+#: model_terms:ir.ui.view,arch_db:purchase_request_type.view_purchase_request_type_search
+msgid "Company"
+msgstr ""
+
+#. module: purchase_request_type
+#: model:ir.model.fields,field_description:purchase_request_type.field_purchase_request_type__create_uid
+msgid "Created by"
+msgstr ""
+
+#. module: purchase_request_type
+#: model:ir.model.fields,field_description:purchase_request_type.field_purchase_request_type__create_date
+msgid "Created on"
+msgstr ""
+
+#. module: purchase_request_type
+#: model:ir.model.fields,field_description:purchase_request_type.field_purchase_request_type__description
+msgid "Description"
+msgstr ""
+
+#. module: purchase_request_type
+#: model:ir.model.fields,field_description:purchase_request_type.field_purchase_request__display_name
+#: model:ir.model.fields,field_description:purchase_request_type.field_purchase_request_type__display_name
+msgid "Display Name"
+msgstr ""
+
+#. module: purchase_request_type
+#: code:addons/purchase_request_type/models/purchase_request.py:0
+#, python-format
+msgid "Document's company and type's company mismatch"
+msgstr ""
+
+#. module: purchase_request_type
+#: model:ir.model.fields,field_description:purchase_request_type.field_purchase_request_type__sequence_id
+#: model_terms:ir.ui.view,arch_db:purchase_request_type.view_purchase_request_type_search
+msgid "Entry Sequence"
+msgstr ""
+
+#. module: purchase_request_type
+#: model_terms:ir.ui.view,arch_db:purchase_request_type.view_purchase_request_type_search
+msgid "Group By"
+msgstr ""
+
+#. module: purchase_request_type
+#: model:ir.model.fields,field_description:purchase_request_type.field_purchase_request__id
+#: model:ir.model.fields,field_description:purchase_request_type.field_purchase_request_type__id
+msgid "ID"
+msgstr ""
+
+#. module: purchase_request_type
+#: model:ir.model.fields,field_description:purchase_request_type.field_purchase_request____last_update
+#: model:ir.model.fields,field_description:purchase_request_type.field_purchase_request_type____last_update
+msgid "Last Modified on"
+msgstr ""
+
+#. module: purchase_request_type
+#: model:ir.model.fields,field_description:purchase_request_type.field_purchase_request_type__write_uid
+msgid "Last Updated by"
+msgstr ""
+
+#. module: purchase_request_type
+#: model:ir.model.fields,field_description:purchase_request_type.field_purchase_request_type__write_date
+msgid "Last Updated on"
+msgstr ""
+
+#. module: purchase_request_type
+#: model:ir.model.fields,field_description:purchase_request_type.field_purchase_request_type__name
+msgid "Name"
+msgstr ""
+
+#. module: purchase_request_type
+#: model:ir.model.fields,field_description:purchase_request_type.field_purchase_request__request_type
+#: model_terms:ir.ui.view,arch_db:purchase_request_type.view_purchase_request_search
+msgid "PR Type"
+msgstr ""
+
+#. module: purchase_request_type
+#: model:ir.model.fields,field_description:purchase_request_type.field_purchase_request_type__picking_type_id
+#: model_terms:ir.ui.view,arch_db:purchase_request_type.view_purchase_request_type_search
+msgid "Picking Type"
+msgstr ""
+
+#. module: purchase_request_type
+#: model:ir.model,name:purchase_request_type.model_purchase_request
+msgid "Purchase Request"
+msgstr ""
+
+#. module: purchase_request_type
+#: model:ir.actions.act_window,name:purchase_request_type.action_purchase_request_type_view
+#: model:ir.ui.menu,name:purchase_request_type.menu_purchase_request_type
+#: model_terms:ir.ui.view,arch_db:purchase_request_type.view_purchase_request_type_search
+#: model_terms:ir.ui.view,arch_db:purchase_request_type.view_purchase_request_type_tree
+msgid "Purchase Request Types"
+msgstr ""
+
+#. module: purchase_request_type
+#: model:ir.model.fields,field_description:purchase_request_type.field_purchase_request__reduce_step
+#: model:ir.model.fields,field_description:purchase_request_type.field_purchase_request_type__reduce_step
+msgid "Reduce Step"
+msgstr ""
+
+#. module: purchase_request_type
+#: model:ir.model.fields,field_description:purchase_request_type.field_purchase_request__name
+msgid "Request Reference"
+msgstr ""
+
+#. module: purchase_request_type
+#: model:ir.model.fields,field_description:purchase_request_type.field_purchase_request_type__sequence
+msgid "Sequence"
+msgstr ""
+
+#. module: purchase_request_type
+#: model_terms:ir.ui.view,arch_db:purchase_request_type.view_purchase_request_type_form
+msgid "Type"
+msgstr ""
+
+#. module: purchase_request_type
+#: model:ir.model,name:purchase_request_type.model_purchase_request_type
+msgid "Type of purchase request"
+msgstr ""
diff --git a/purchase_request_type/models/__init__.py b/purchase_request_type/models/__init__.py
new file mode 100644
index 00000000000..7710fd0a8f8
--- /dev/null
+++ b/purchase_request_type/models/__init__.py
@@ -0,0 +1,2 @@
+from . import purchase_request_type
+from . import purchase_request
diff --git a/purchase_request_type/models/purchase_request.py b/purchase_request_type/models/purchase_request.py
new file mode 100644
index 00000000000..1c14ccfa3b2
--- /dev/null
+++ b/purchase_request_type/models/purchase_request.py
@@ -0,0 +1,69 @@
+# Copyright 2021 ProThai Technology Co.,Ltd. (http://prothaitechnology.com)
+# 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 PurchaseRequest(models.Model):
+ _inherit = "purchase.request"
+
+ def _default_request_type(self):
+ return self.env["purchase.request.type"].search(
+ [("company_id", "in", [False, self.env.company.id])],
+ limit=1,
+ )
+
+ name = fields.Char(
+ string="Request Reference",
+ required=True,
+ default="/",
+ track_visibility="onchange",
+ )
+ request_type = fields.Many2one(
+ comodel_name="purchase.request.type",
+ string="PR Type",
+ ondelete="restrict",
+ domain="[('company_id', 'in', [False, company_id])]",
+ default=lambda self: self._default_request_type(),
+ )
+ reduce_step = fields.Boolean(compute="_compute_request_type")
+
+ @api.depends("request_type")
+ def _compute_request_type(self):
+ for obj in self:
+ if obj.request_type:
+ obj.reduce_step = obj.request_type.reduce_step
+ else:
+ obj.reduce_step = False
+
+ @api.onchange("request_type")
+ def onchange_request_type(self):
+ for request in self:
+ if request.request_type.picking_type_id:
+ request.picking_type_id = request.request_type.picking_type_id.id
+
+ @api.model
+ def create(self, vals):
+ if vals.get("name", "/") == "/" and vals.get("request_type"):
+ purchase_type = self.env["purchase.request.type"].browse(
+ vals["request_type"]
+ )
+ if purchase_type and purchase_type.sequence_id:
+ vals["name"] = purchase_type.sequence_id.next_by_id()
+ else:
+ vals["name"] = self.env["ir.sequence"].next_by_code("purchase.request")
+ return super().create(vals)
+
+ @api.constrains("company_id")
+ def _check_pr_type_company(self):
+ if self.filtered(
+ lambda r: r.request_type.company_id
+ and r.company_id
+ and r.request_type.company_id != r.company_id
+ ):
+ raise ValidationError(_("Document's company and type's company mismatch"))
+
+ @api.onchange("company_id")
+ def _onchange_company(self):
+ self.request_type = False
diff --git a/purchase_request_type/models/purchase_request_type.py b/purchase_request_type/models/purchase_request_type.py
new file mode 100644
index 00000000000..48a635b6bdf
--- /dev/null
+++ b/purchase_request_type/models/purchase_request_type.py
@@ -0,0 +1,45 @@
+# Copyright 2021 ProThai Technology Co.,Ltd. (http://prothaitechnology.com)
+# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl.html).
+
+from odoo import api, fields, models
+
+
+class PurchaseRequestType(models.Model):
+ _name = "purchase.request.type"
+ _description = "Type of purchase request"
+ _order = "sequence"
+
+ @api.model
+ def _get_domain_sequence_id(self):
+ seq_type = self.env.ref("purchase_request.seq_purchase_request")
+ return [
+ ("code", "=", seq_type.code),
+ ("company_id", "in", [False, self.env.company.id]),
+ ]
+
+ @api.model
+ def _default_sequence_id(self):
+ seq_type = self.env.ref("purchase_request.seq_purchase_request")
+ return seq_type.id
+
+ name = fields.Char(required=True)
+ active = fields.Boolean(default=True)
+ description = fields.Text(string="Description", translate=True)
+ sequence_id = fields.Many2one(
+ comodel_name="ir.sequence",
+ string="Entry Sequence",
+ copy=False,
+ domain=lambda self: self._get_domain_sequence_id(),
+ default=lambda self: self._default_sequence_id(),
+ required=True,
+ )
+ picking_type_id = fields.Many2one(
+ comodel_name="stock.picking.type", string="Picking Type"
+ )
+ sequence = fields.Integer(default=10)
+ company_id = fields.Many2one(
+ comodel_name="res.company",
+ string="Company",
+ default=lambda self: self.env.company,
+ )
+ reduce_step = fields.Boolean(string="Reduce Step", default=False)
diff --git a/purchase_request_type/readme/CONFIGURE.rst b/purchase_request_type/readme/CONFIGURE.rst
new file mode 100644
index 00000000000..8cb6adb5b30
--- /dev/null
+++ b/purchase_request_type/readme/CONFIGURE.rst
@@ -0,0 +1,4 @@
+To configure this module, you need to:
+
+* Go to **Purchases > Configuration > Purchase Request types**
+* Modify / create the purchase request types
diff --git a/purchase_request_type/readme/CONTRIBUTORS.rst b/purchase_request_type/readme/CONTRIBUTORS.rst
new file mode 100644
index 00000000000..1802e4ddfe5
--- /dev/null
+++ b/purchase_request_type/readme/CONTRIBUTORS.rst
@@ -0,0 +1 @@
+* Prapassorn Sornkaew
diff --git a/purchase_request_type/readme/DESCRIPTION.rst b/purchase_request_type/readme/DESCRIPTION.rst
new file mode 100644
index 00000000000..e9ff4e099eb
--- /dev/null
+++ b/purchase_request_type/readme/DESCRIPTION.rst
@@ -0,0 +1,5 @@
+This module adds the following functions:
+
+ - Adds a configurable *type* on the purchase requests.
+ - Choose reduce step not to create rfq.
+ - This type can be used in filters and groupbys.
diff --git a/purchase_request_type/readme/ROADMAP.rst b/purchase_request_type/readme/ROADMAP.rst
new file mode 100644
index 00000000000..a5955e0a01a
--- /dev/null
+++ b/purchase_request_type/readme/ROADMAP.rst
@@ -0,0 +1 @@
+* Suggestion: add a default configuration attached to the types
diff --git a/purchase_request_type/readme/USAGE.rst b/purchase_request_type/readme/USAGE.rst
new file mode 100644
index 00000000000..52da5f720b9
--- /dev/null
+++ b/purchase_request_type/readme/USAGE.rst
@@ -0,0 +1,3 @@
+To use this module, you need to:
+
+* Attribute a type when editing purchase requests
diff --git a/purchase_request_type/security/ir.model.access.csv b/purchase_request_type/security/ir.model.access.csv
new file mode 100644
index 00000000000..8ea7e61af8c
--- /dev/null
+++ b/purchase_request_type/security/ir.model.access.csv
@@ -0,0 +1,3 @@
+id,name,model_id:id,group_id:id,perm_read,perm_write,perm_create,perm_unlink
+access_purchase_request_type,purchase.request.type,model_purchase_request_type,purchase_request.group_purchase_request_user,1,0,0,0
+access_purchase_request_type_manager,purchase.request.type manager,model_purchase_request_type,purchase_request.group_purchase_request_manager,1,1,1,1
diff --git a/purchase_request_type/security/security.xml b/purchase_request_type/security/security.xml
new file mode 100644
index 00000000000..dba385cd0e7
--- /dev/null
+++ b/purchase_request_type/security/security.xml
@@ -0,0 +1,12 @@
+
+
+ Purchase Request Type multi-company
+
+
+ ['|', ('company_id','=',False), ('company_id','in',company_ids)]
+
+
+
diff --git a/purchase_request_type/static/description/icon.png b/purchase_request_type/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/purchase_request_type/static/description/index.html b/purchase_request_type/static/description/index.html
new file mode 100644
index 00000000000..04e4ec1a1bc
--- /dev/null
+++ b/purchase_request_type/static/description/index.html
@@ -0,0 +1,450 @@
+
+
+
+
+
+
+Purchase Request Type
+
+
+
+
+
Purchase Request Type
+
+
+
+
This module adds the following functions:
+
+
+Adds a configurable type on the purchase requests.
+Choose reduce step not to create rfq.
+This type can be used in filters and groupbys.
+
+
+
Table of contents
+
+
+
+
To configure this module, you need to:
+
+Go to Purchases > Configuration > Purchase Request types
+Modify / create the purchase request types
+
+
+
+
+
To use this module, you need to:
+
+Attribute a type when editing purchase requests
+
+
+
+
+
+Suggestion: add a default configuration attached to the types
+
+
+
+
+
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.
+
+
+
+
+
+
+
+
This module is maintained by the OCA.
+
+
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.
+
This module is part of the OCA/purchase-workflow project on GitHub.
+
You are welcome to contribute. To learn how please visit https://odoo-community.org/page/Contribute .
+
+
+
+
+
diff --git a/purchase_request_type/tests/__init__.py b/purchase_request_type/tests/__init__.py
new file mode 100644
index 00000000000..ce8d2ded6ed
--- /dev/null
+++ b/purchase_request_type/tests/__init__.py
@@ -0,0 +1,4 @@
+# Copyright 2021 ProThai Technology Co.,Ltd. (http://prothaitechnology.com)
+# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl.html).
+
+from . import test_purchase_request_type
diff --git a/purchase_request_type/tests/test_purchase_request_type.py b/purchase_request_type/tests/test_purchase_request_type.py
new file mode 100644
index 00000000000..2eec56bb73d
--- /dev/null
+++ b/purchase_request_type/tests/test_purchase_request_type.py
@@ -0,0 +1,78 @@
+# Copyright 2021 ProThai Technology Co.,Ltd. (http://prothaitechnology.com)
+# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl.html).
+
+import time
+
+from odoo import SUPERUSER_ID
+from odoo.exceptions import ValidationError
+from odoo.tests import common, tagged
+from odoo.tools import DEFAULT_SERVER_DATETIME_FORMAT
+
+
+@tagged("post_install", "-at_install")
+class TestPurchaseRequestType(common.SavepointCase):
+ @classmethod
+ def setUpClass(cls):
+ super().setUpClass()
+ cls.pr_obj = cls.env["purchase.request"]
+ cls.company_obj = cls.env["res.company"]
+ # Products
+ cls.product1 = cls.env.ref("product.product_product_7")
+ cls.product2 = cls.env.ref("product.product_product_9")
+ cls.product3 = cls.env.ref("product.product_product_11")
+ # Purchase Request Type
+ cls.type1 = cls.env.ref("purchase_request_type.pr_type_regular")
+ cls.type2 = cls.env.ref("purchase_request_type.pr_type_reduce_step")
+ # Picking Type
+ cls.picking_type = cls.env.ref("stock.picking_type_in")
+ cls.type2.picking_type_id = cls.picking_type
+ cls.company2 = cls.company_obj.create({"name": "company2"})
+
+ def test_purchase_request_type(self):
+ purchase_request = self._create_purchase_request(
+ [(self.product1, 1), (self.product2, 5), (self.product3, 8)]
+ )
+ self.assertEqual(purchase_request.request_type, self.type1)
+ purchase_request.onchange_request_type()
+ self.assertEqual(purchase_request.picking_type_id, self.picking_type)
+
+ def _create_purchase_request(self, line_products):
+ """Create a purchase request.
+ ``line_products`` is a list of tuple [(product, qty)]
+ """
+ lines = []
+ for product, qty in line_products:
+ line_values = {
+ "name": product.name,
+ "product_id": product.id,
+ "product_qty": qty,
+ "product_uom_id": product.uom_id.id,
+ "estimated_cost": 100,
+ "date_required": time.strftime(DEFAULT_SERVER_DATETIME_FORMAT),
+ }
+ lines.append((0, 0, line_values))
+ purchase_request = self.pr_obj.create(
+ {
+ "request_type": self.type1.id,
+ "line_ids": lines,
+ }
+ )
+ return purchase_request
+
+ def test_purchase_request_change_company(self):
+ request = self.pr_obj.new({"requested_by": SUPERUSER_ID})
+ self.assertEqual(request.request_type, self.type1)
+ request._onchange_company()
+ self.assertFalse(request.request_type)
+
+ def test_compute_purchase_request_type(self):
+ request1 = self.pr_obj.new({"request_type": self.type1.id})
+ request2 = self.pr_obj.new({"request_type": self.type2.id})
+ self.assertFalse(request1.reduce_step)
+ self.assertEqual(request2.reduce_step, self.type2.reduce_step)
+
+ def test_purchase_request_type_company_error(self):
+ request = self.pr_obj.create({"picking_type_id": self.picking_type.id})
+ self.assertEqual(request.company_id, self.type1.company_id)
+ with self.assertRaises(ValidationError):
+ request.write({"company_id": self.company2.id})
diff --git a/purchase_request_type/views/purchase_request_type_view.xml b/purchase_request_type/views/purchase_request_type_view.xml
new file mode 100644
index 00000000000..c35ab1faeee
--- /dev/null
+++ b/purchase_request_type/views/purchase_request_type_view.xml
@@ -0,0 +1,117 @@
+
+
+
+ purchase.request.type
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ purchase.request.type
+
+
+
+
+
+ purchase.request.type
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Purchase Request Types
+ ir.actions.act_window
+ purchase.request.type
+ form,tree
+
+
+
+
+ Click to set a new type for purchase request.
+
+
+
+
+
+
+
diff --git a/purchase_request_type/views/purchase_request_view.xml b/purchase_request_type/views/purchase_request_view.xml
new file mode 100644
index 00000000000..f2bd88ee5e5
--- /dev/null
+++ b/purchase_request_type/views/purchase_request_view.xml
@@ -0,0 +1,54 @@
+
+
+
+ purchase.request
+
+
+
+ {'invisible': ['|',('reduce_step', '=', True)]}
+
+
+
+
+
+
+
+
+ purchase.request
+
+
+
+
+
+
+
+
+ purchase.request
+
+
+
+
+
+
+
+
+
+
+
From 85cd8156fa319ddc905519fcdbaa651bb5c51360 Mon Sep 17 00:00:00 2001
From: Kitti U
Date: Thu, 19 Aug 2021 11:20:53 +0700
Subject: [PATCH 02/23] [14.0][FIX] purchase_request_type, use tracking=True
purchase_request_type 14.0.1.0.1
---
purchase_request_type/__manifest__.py | 2 +-
purchase_request_type/models/purchase_request.py | 2 +-
2 files changed, 2 insertions(+), 2 deletions(-)
diff --git a/purchase_request_type/__manifest__.py b/purchase_request_type/__manifest__.py
index 25eaaca69de..db7f0de023d 100644
--- a/purchase_request_type/__manifest__.py
+++ b/purchase_request_type/__manifest__.py
@@ -3,7 +3,7 @@
{
"name": "Purchase Request Type",
- "version": "14.0.1.0.0",
+ "version": "14.0.1.0.1",
"author": "ProThai, Odoo Community Association (OCA)",
"license": "AGPL-3",
"category": "Purchase Management",
diff --git a/purchase_request_type/models/purchase_request.py b/purchase_request_type/models/purchase_request.py
index 1c14ccfa3b2..b21ed835a29 100644
--- a/purchase_request_type/models/purchase_request.py
+++ b/purchase_request_type/models/purchase_request.py
@@ -18,7 +18,7 @@ def _default_request_type(self):
string="Request Reference",
required=True,
default="/",
- track_visibility="onchange",
+ tracking=True,
)
request_type = fields.Many2one(
comodel_name="purchase.request.type",
From 39be8a952190a15cf81382612c7dbf53cb5d1555 Mon Sep 17 00:00:00 2001
From: Vandan Pandeji
Date: Fri, 24 Mar 2023 11:08:10 +0530
Subject: [PATCH 03/23] [MIG]purchase_request_type: Migration to V16
[UPD] Update purchase_request_type.pot
[BOT] post-merge updates
---
purchase_request_type/README.rst | 23 +++++----
purchase_request_type/__manifest__.py | 2 +-
.../i18n/purchase_request_type.pot | 7 +--
.../models/purchase_request.py | 27 +++++-----
.../models/purchase_request_type.py | 4 +-
.../static/description/index.html | 49 ++++++++++---------
.../tests/test_purchase_request_type.py | 6 ++-
.../views/purchase_request_type_view.xml | 4 +-
.../views/purchase_request_view.xml | 1 +
9 files changed, 62 insertions(+), 61 deletions(-)
diff --git a/purchase_request_type/README.rst b/purchase_request_type/README.rst
index b9da2b22236..8c5f9e4bcd3 100644
--- a/purchase_request_type/README.rst
+++ b/purchase_request_type/README.rst
@@ -2,10 +2,13 @@
Purchase Request Type
=====================
-.. !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+..
+ !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
!! This file is generated by oca-gen-addon-readme !!
!! changes will be overwritten. !!
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+ !! source digest: sha256:3e1eb7b60cf1fc6d9a8c94a8ffe509ec0d628ddd5ec5e5613ebb6fe974968534
+ !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
.. |badge1| image:: https://img.shields.io/badge/maturity-Beta-yellow.png
:target: https://odoo-community.org/page/development-status
@@ -14,16 +17,16 @@ Purchase Request Type
:target: http://www.gnu.org/licenses/agpl-3.0-standalone.html
:alt: License: AGPL-3
.. |badge3| image:: https://img.shields.io/badge/github-OCA%2Fpurchase--workflow-lightgray.png?logo=github
- :target: https://github.com/OCA/purchase-workflow/tree/14.0/purchase_request_type
+ :target: https://github.com/OCA/purchase-workflow/tree/16.0/purchase_request_type
:alt: OCA/purchase-workflow
.. |badge4| image:: https://img.shields.io/badge/weblate-Translate%20me-F47D42.png
- :target: https://translation.odoo-community.org/projects/purchase-workflow-14-0/purchase-workflow-14-0-purchase_request_type
+ :target: https://translation.odoo-community.org/projects/purchase-workflow-16-0/purchase-workflow-16-0-purchase_request_type
:alt: Translate me on Weblate
-.. |badge5| image:: https://img.shields.io/badge/runbot-Try%20me-875A7B.png
- :target: https://runbot.odoo-community.org/runbot/142/14.0
- :alt: Try me on Runbot
+.. |badge5| image:: https://img.shields.io/badge/runboat-Try%20me-875A7B.png
+ :target: https://runboat.odoo-community.org/builds?repo=OCA/purchase-workflow&target_branch=16.0
+ :alt: Try me on Runboat
-|badge1| |badge2| |badge3| |badge4| |badge5|
+|badge1| |badge2| |badge3| |badge4| |badge5|
This module adds the following functions:
@@ -61,8 +64,8 @@ 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 `_.
+If you spotted it first, help us to smash it by providing a detailed and welcomed
+`feedback `_.
Do not contact contributors directly about support or help with technical issues.
@@ -92,6 +95,6 @@ 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.
-This module is part of the `OCA/purchase-workflow `_ project on GitHub.
+This module is part of the `OCA/purchase-workflow `_ project on GitHub.
You are welcome to contribute. To learn how please visit https://odoo-community.org/page/Contribute.
diff --git a/purchase_request_type/__manifest__.py b/purchase_request_type/__manifest__.py
index db7f0de023d..6c178b9b8cf 100644
--- a/purchase_request_type/__manifest__.py
+++ b/purchase_request_type/__manifest__.py
@@ -3,7 +3,7 @@
{
"name": "Purchase Request Type",
- "version": "14.0.1.0.1",
+ "version": "16.0.1.0.0",
"author": "ProThai, Odoo Community Association (OCA)",
"license": "AGPL-3",
"category": "Purchase Management",
diff --git a/purchase_request_type/i18n/purchase_request_type.pot b/purchase_request_type/i18n/purchase_request_type.pot
index 2bbaaa4120c..a031be42f49 100644
--- a/purchase_request_type/i18n/purchase_request_type.pot
+++ b/purchase_request_type/i18n/purchase_request_type.pot
@@ -4,7 +4,7 @@
#
msgid ""
msgstr ""
-"Project-Id-Version: Odoo Server 14.0\n"
+"Project-Id-Version: Odoo Server 16.0\n"
"Report-Msgid-Bugs-To: \n"
"Last-Translator: \n"
"Language-Team: \n"
@@ -45,12 +45,12 @@ msgid "Description"
msgstr ""
#. module: purchase_request_type
-#: model:ir.model.fields,field_description:purchase_request_type.field_purchase_request__display_name
#: model:ir.model.fields,field_description:purchase_request_type.field_purchase_request_type__display_name
msgid "Display Name"
msgstr ""
#. module: purchase_request_type
+#. odoo-python
#: code:addons/purchase_request_type/models/purchase_request.py:0
#, python-format
msgid "Document's company and type's company mismatch"
@@ -68,13 +68,11 @@ msgid "Group By"
msgstr ""
#. module: purchase_request_type
-#: model:ir.model.fields,field_description:purchase_request_type.field_purchase_request__id
#: model:ir.model.fields,field_description:purchase_request_type.field_purchase_request_type__id
msgid "ID"
msgstr ""
#. module: purchase_request_type
-#: model:ir.model.fields,field_description:purchase_request_type.field_purchase_request____last_update
#: model:ir.model.fields,field_description:purchase_request_type.field_purchase_request_type____last_update
msgid "Last Modified on"
msgstr ""
@@ -115,7 +113,6 @@ msgstr ""
#: model:ir.actions.act_window,name:purchase_request_type.action_purchase_request_type_view
#: model:ir.ui.menu,name:purchase_request_type.menu_purchase_request_type
#: model_terms:ir.ui.view,arch_db:purchase_request_type.view_purchase_request_type_search
-#: model_terms:ir.ui.view,arch_db:purchase_request_type.view_purchase_request_type_tree
msgid "Purchase Request Types"
msgstr ""
diff --git a/purchase_request_type/models/purchase_request.py b/purchase_request_type/models/purchase_request.py
index b21ed835a29..0b12cf8b334 100644
--- a/purchase_request_type/models/purchase_request.py
+++ b/purchase_request_type/models/purchase_request.py
@@ -32,10 +32,10 @@ def _default_request_type(self):
@api.depends("request_type")
def _compute_request_type(self):
for obj in self:
+ reduce_step = False
if obj.request_type:
- obj.reduce_step = obj.request_type.reduce_step
- else:
- obj.reduce_step = False
+ reduce_step = obj.request_type.reduce_step
+ obj.reduce_step = reduce_step
@api.onchange("request_type")
def onchange_request_type(self):
@@ -43,17 +43,16 @@ def onchange_request_type(self):
if request.request_type.picking_type_id:
request.picking_type_id = request.request_type.picking_type_id.id
- @api.model
- def create(self, vals):
- if vals.get("name", "/") == "/" and vals.get("request_type"):
- purchase_type = self.env["purchase.request.type"].browse(
- vals["request_type"]
- )
- if purchase_type and purchase_type.sequence_id:
- vals["name"] = purchase_type.sequence_id.next_by_id()
- else:
- vals["name"] = self.env["ir.sequence"].next_by_code("purchase.request")
- return super().create(vals)
+ @api.model_create_multi
+ def create(self, vals_list):
+ for vals in vals_list:
+ if vals.get("name", "/") == "/" and vals.get("request_type"):
+ purchase_type = self.env["purchase.request.type"].browse(
+ vals["request_type"]
+ )
+ if purchase_type and purchase_type.sequence_id:
+ vals["name"] = purchase_type.sequence_id.next_by_id()
+ return super().create(vals_list)
@api.constrains("company_id")
def _check_pr_type_company(self):
diff --git a/purchase_request_type/models/purchase_request_type.py b/purchase_request_type/models/purchase_request_type.py
index 48a635b6bdf..63cd2eee47a 100644
--- a/purchase_request_type/models/purchase_request_type.py
+++ b/purchase_request_type/models/purchase_request_type.py
@@ -24,7 +24,7 @@ def _default_sequence_id(self):
name = fields.Char(required=True)
active = fields.Boolean(default=True)
- description = fields.Text(string="Description", translate=True)
+ description = fields.Text(translate=True)
sequence_id = fields.Many2one(
comodel_name="ir.sequence",
string="Entry Sequence",
@@ -42,4 +42,4 @@ def _default_sequence_id(self):
string="Company",
default=lambda self: self.env.company,
)
- reduce_step = fields.Boolean(string="Reduce Step", default=False)
+ reduce_step = fields.Boolean(default=False)
diff --git a/purchase_request_type/static/description/index.html b/purchase_request_type/static/description/index.html
index 04e4ec1a1bc..9a9f75d5190 100644
--- a/purchase_request_type/static/description/index.html
+++ b/purchase_request_type/static/description/index.html
@@ -1,20 +1,19 @@
-
-
+
Purchase Request Type
-
-
Purchase Request Type
+
+
+
+
+
+
-
+
To configure this module, you need to:
Go to Purchases > Configuration > Purchase Request types
@@ -402,20 +407,20 @@
-
+
To use this module, you need to:
Attribute a type when editing purchase requests
-
+
Suggestion: add a default configuration attached to the types
-
+
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 to smash it by providing a detailed and welcomed
@@ -423,21 +428,21 @@
Do not contact contributors directly about support or help with technical issues.
+
From 3fe896aab4b2dc65275d48283caed74988799588 Mon Sep 17 00:00:00 2001
From: Ed-Spain
Date: Sun, 19 Apr 2026 09:20:54 +0000
Subject: [PATCH 22/23] Translated using Weblate (Spanish)
Currently translated at 100.0% (25 of 25 strings)
Translation: purchase-workflow-18.0/purchase-workflow-18.0-purchase_request_type
Translate-URL: https://translation.odoo-community.org/projects/purchase-workflow-18-0/purchase-workflow-18-0-purchase_request_type/es/
---
purchase_request_type/i18n/es.po | 8 ++++----
1 file changed, 4 insertions(+), 4 deletions(-)
diff --git a/purchase_request_type/i18n/es.po b/purchase_request_type/i18n/es.po
index 58ea016bd84..ccf5d61b8d9 100644
--- a/purchase_request_type/i18n/es.po
+++ b/purchase_request_type/i18n/es.po
@@ -6,15 +6,15 @@ msgid ""
msgstr ""
"Project-Id-Version: Odoo Server 16.0\n"
"Report-Msgid-Bugs-To: \n"
-"PO-Revision-Date: 2025-03-05 19:06+0000\n"
-"Last-Translator: Víctor Martínez \n"
+"PO-Revision-Date: 2026-04-19 09:31+0000\n"
+"Last-Translator: Ed-Spain \n"
"Language-Team: none\n"
"Language: es\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: \n"
"Plural-Forms: nplurals=2; plural=n != 1;\n"
-"X-Generator: Weblate 5.10.2\n"
+"X-Generator: Weblate 5.15.2\n"
#. module: purchase_request_type
#: model:ir.model.fields,field_description:purchase_request_type.field_purchase_request_type__active
@@ -25,7 +25,7 @@ msgstr "Activo"
#: model_terms:ir.ui.view,arch_db:purchase_request_type.view_purchase_request_type_form
#: model_terms:ir.ui.view,arch_db:purchase_request_type.view_purchase_request_type_search
msgid "Archived"
-msgstr ""
+msgstr "Archivado"
#. module: purchase_request_type
#: model_terms:ir.actions.act_window,help:purchase_request_type.action_purchase_request_type_view
From 3a27519dd8a31c081bc11dc6d885c9f0d4cb64e8 Mon Sep 17 00:00:00 2001
From: Bhavesh Heliconia
Date: Fri, 1 May 2026 15:42:51 +0530
Subject: [PATCH 23/23] [MIG] purchase_request_type: Migration to 19.0
---
purchase_request_type/README.rst | 13 +--
purchase_request_type/__manifest__.py | 2 +-
.../models/purchase_request.py | 6 +-
purchase_request_type/readme/CONTRIBUTORS.md | 2 +
.../static/description/index.html | 10 ++-
.../tests/test_purchase_request_type.py | 81 +++++++++++++++----
.../views/purchase_request_type_view.xml | 2 +-
7 files changed, 87 insertions(+), 29 deletions(-)
diff --git a/purchase_request_type/README.rst b/purchase_request_type/README.rst
index ed5be284156..7a609658f9d 100644
--- a/purchase_request_type/README.rst
+++ b/purchase_request_type/README.rst
@@ -21,13 +21,13 @@ Purchase Request Type
:target: http://www.gnu.org/licenses/agpl-3.0-standalone.html
:alt: License: AGPL-3
.. |badge3| image:: https://img.shields.io/badge/github-OCA%2Fpurchase--workflow-lightgray.png?logo=github
- :target: https://github.com/OCA/purchase-workflow/tree/18.0/purchase_request_type
+ :target: https://github.com/OCA/purchase-workflow/tree/19.0/purchase_request_type
:alt: OCA/purchase-workflow
.. |badge4| image:: https://img.shields.io/badge/weblate-Translate%20me-F47D42.png
- :target: https://translation.odoo-community.org/projects/purchase-workflow-18-0/purchase-workflow-18-0-purchase_request_type
+ :target: https://translation.odoo-community.org/projects/purchase-workflow-19-0/purchase-workflow-19-0-purchase_request_type
:alt: Translate me on Weblate
.. |badge5| image:: https://img.shields.io/badge/runboat-Try%20me-875A7B.png
- :target: https://runboat.odoo-community.org/builds?repo=OCA/purchase-workflow&target_branch=18.0
+ :target: https://runboat.odoo-community.org/builds?repo=OCA/purchase-workflow&target_branch=19.0
:alt: Try me on Runboat
|badge1| |badge2| |badge3| |badge4| |badge5|
@@ -69,7 +69,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 to smash it by providing a detailed and welcomed
-`feedback `_.
+`feedback `_.
Do not contact contributors directly about support or help with technical issues.
@@ -85,6 +85,9 @@ Contributors
------------
- Prapassorn Sornkaew
+- `Heliconia Solutions Pvt. Ltd. `__
+
+ - Bhavesh Heliconia
Maintainers
-----------
@@ -99,6 +102,6 @@ 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.
-This module is part of the `OCA/purchase-workflow `_ project on GitHub.
+This module is part of the `OCA/purchase-workflow `_ project on GitHub.
You are welcome to contribute. To learn how please visit https://odoo-community.org/page/Contribute.
diff --git a/purchase_request_type/__manifest__.py b/purchase_request_type/__manifest__.py
index fefbc68bb7b..09cf000320e 100644
--- a/purchase_request_type/__manifest__.py
+++ b/purchase_request_type/__manifest__.py
@@ -3,7 +3,7 @@
{
"name": "Purchase Request Type",
- "version": "18.0.1.0.1",
+ "version": "19.0.1.0.0",
"author": "ProThai, Odoo Community Association (OCA)",
"license": "AGPL-3",
"category": "Purchase Management",
diff --git a/purchase_request_type/models/purchase_request.py b/purchase_request_type/models/purchase_request.py
index a9c2a9a4cd9..58c319e435d 100644
--- a/purchase_request_type/models/purchase_request.py
+++ b/purchase_request_type/models/purchase_request.py
@@ -1,7 +1,7 @@
# Copyright 2021 ProThai Technology Co.,Ltd. (http://prothaitechnology.com)
# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl.html).
-from odoo import _, api, fields, models
+from odoo import api, fields, models
from odoo.exceptions import ValidationError
@@ -66,7 +66,9 @@ def _check_pr_type_company(self):
and r.company_id
and r.request_type.company_id != r.company_id
):
- raise ValidationError(_("Document's company and type's company mismatch"))
+ raise ValidationError(
+ self.env._("Document's company and type's company mismatch")
+ )
@api.onchange("company_id")
def _onchange_company(self):
diff --git a/purchase_request_type/readme/CONTRIBUTORS.md b/purchase_request_type/readme/CONTRIBUTORS.md
index 1cb561e9c60..2955581f2bb 100644
--- a/purchase_request_type/readme/CONTRIBUTORS.md
+++ b/purchase_request_type/readme/CONTRIBUTORS.md
@@ -1 +1,3 @@
- Prapassorn Sornkaew \<\>
+- [Heliconia Solutions Pvt. Ltd.](https://www.heliconia.io)
+ - Bhavesh Heliconia
diff --git a/purchase_request_type/static/description/index.html b/purchase_request_type/static/description/index.html
index 9c2b5f61fa6..d96e7b2a65c 100644
--- a/purchase_request_type/static/description/index.html
+++ b/purchase_request_type/static/description/index.html
@@ -374,7 +374,7 @@ Purchase Request Type
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
!! source digest: sha256:40a34b8718bb69a843608b778de2da3aa4861d0f75fb3a062c0d2dd4daabb4b1
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! -->
-
+
This module adds the following functions:
@@ -424,7 +424,7 @@
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 to smash it by providing a detailed and welcomed
-feedback .
+feedback .
Do not contact contributors directly about support or help with technical issues.
@@ -450,7 +454,7 @@
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.
-
This module is part of the OCA/purchase-workflow project on GitHub.
+
This module is part of the OCA/purchase-workflow project on GitHub.
You are welcome to contribute. To learn how please visit https://odoo-community.org/page/Contribute .
diff --git a/purchase_request_type/tests/test_purchase_request_type.py b/purchase_request_type/tests/test_purchase_request_type.py
index 001aad8817a..b4b08aa9bb5 100644
--- a/purchase_request_type/tests/test_purchase_request_type.py
+++ b/purchase_request_type/tests/test_purchase_request_type.py
@@ -1,12 +1,9 @@
# Copyright 2021 ProThai Technology Co.,Ltd. (http://prothaitechnology.com)
# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl.html).
-import time
-
-from odoo import SUPERUSER_ID
+from odoo import SUPERUSER_ID, fields
from odoo.exceptions import ValidationError
from odoo.tests import tagged
-from odoo.tools import DEFAULT_SERVER_DATETIME_FORMAT
from odoo.addons.base.tests.common import BaseCommon
@@ -18,20 +15,53 @@ def setUpClass(cls):
super().setUpClass()
cls.pr_obj = cls.env["purchase.request"]
cls.company_obj = cls.env["res.company"]
+ cls.type_obj = cls.env["purchase.request.type"]
# Products
- cls.product1 = cls.env.ref("product.product_product_7")
- cls.product2 = cls.env.ref("product.product_product_9")
- cls.product3 = cls.env.ref("product.product_product_11")
- # Purchase Request Type
- cls.type1 = cls.env.ref("purchase_request_type.pr_type_regular")
- cls.type2 = cls.env.ref("purchase_request_type.pr_type_reduce_step")
+ cls.product1 = cls.env["product.product"].create(
+ {
+ "name": "Product 1",
+ "is_storable": True,
+ }
+ )
+ cls.product2 = cls.env["product.product"].create(
+ {
+ "name": "Product 2",
+ "is_storable": True,
+ }
+ )
+ cls.product3 = cls.env["product.product"].create(
+ {
+ "name": "Product 3",
+ "is_storable": True,
+ }
+ )
# Picking Type
cls.picking_type = cls.env.ref("stock.picking_type_in")
cls.picking_type2 = cls.env.ref("stock.picking_type_internal")
- # Add company in purchase type
- cls.type2.company_id = cls.picking_type.company_id
- cls.type2.picking_type_id = cls.picking_type
+ cls.sequence1 = cls.env["ir.sequence"].create(
+ {
+ "name": "Sequence 1",
+ "code": "purchase.request.type.1",
+ "prefix": "PR1/",
+ "padding": 5,
+ }
+ )
+ cls.type1 = cls.type_obj.create(
+ {
+ "name": "Regular",
+ "sequence_id": cls.sequence1.id,
+ "picking_type_id": cls.picking_type2.id,
+ }
+ )
+ cls.type2 = cls.type_obj.create(
+ {
+ "name": "Reduce Step",
+ "reduce_step": True,
+ "picking_type_id": cls.picking_type.id,
+ "company_id": cls.picking_type.company_id.id,
+ }
+ )
cls.company2 = cls.company_obj.create({"name": "company2"})
def test_purchase_request_type(self):
@@ -39,6 +69,7 @@ def test_purchase_request_type(self):
[(self.product1, 1), (self.product2, 5), (self.product3, 8)]
)
self.assertEqual(purchase_request.request_type, self.type1)
+ self.assertTrue(purchase_request.name.startswith("PR1/"))
purchase_request.onchange_request_type()
self.assertEqual(purchase_request.picking_type_id, self.picking_type2)
@@ -54,7 +85,7 @@ def _create_purchase_request(self, line_products):
"product_qty": qty,
"product_uom_id": product.uom_id.id,
"estimated_cost": 100,
- "date_required": time.strftime(DEFAULT_SERVER_DATETIME_FORMAT),
+ "date_required": fields.Date.context_today(self.env.user),
}
lines.append((0, 0, line_values))
purchase_request = self.pr_obj.create(
@@ -67,14 +98,30 @@ def _create_purchase_request(self, line_products):
return purchase_request
def test_purchase_request_change_company(self):
- request = self.pr_obj.new({"requested_by": SUPERUSER_ID})
+ request = self.pr_obj.create(
+ {
+ "requested_by": SUPERUSER_ID,
+ "request_type": self.type1.id,
+ "picking_type_id": self.picking_type2.id,
+ }
+ )
self.assertEqual(request.request_type, self.type1)
request._onchange_company()
self.assertFalse(request.request_type)
def test_compute_purchase_request_type(self):
- request1 = self.pr_obj.new({"request_type": self.type1.id})
- request2 = self.pr_obj.new({"request_type": self.type2.id})
+ request1 = self.pr_obj.create(
+ {
+ "request_type": self.type1.id,
+ "picking_type_id": self.picking_type2.id,
+ }
+ )
+ request2 = self.pr_obj.create(
+ {
+ "request_type": self.type2.id,
+ "picking_type_id": self.picking_type.id,
+ }
+ )
self.assertFalse(request1.reduce_step)
self.assertEqual(request2.reduce_step, self.type2.reduce_step)
diff --git a/purchase_request_type/views/purchase_request_type_view.xml b/purchase_request_type/views/purchase_request_type_view.xml
index a53411a6179..5a8e97f9dd2 100644
--- a/purchase_request_type/views/purchase_request_type_view.xml
+++ b/purchase_request_type/views/purchase_request_type_view.xml
@@ -67,7 +67,7 @@
domain="[('active', '=', False)]"
/>
-
+