Skip to content

[18.0][MIG] purchase_request_substate #2697

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Open
wants to merge 10 commits into
base: 18.0
Choose a base branch
from
Open
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
92 changes: 92 additions & 0 deletions purchase_request_substate/README.rst
Original file line number Diff line number Diff line change
@@ -0,0 +1,92 @@
==========================
Purchase Request Sub State
==========================

..
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
!! This file is generated by oca-gen-addon-readme !!
!! changes will be overwritten. !!
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
!! source digest: sha256:1463f70c7b2f51db2e677dd12fbaf3ac9befd47fa94872d847a439003d7d0225
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
.. |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/18.0/purchase_request_substate
: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_substate
: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
:alt: Try me on Runboat

|badge1| |badge2| |badge3| |badge4| |badge5|

This module allows to add a substate to purchase request. For each
purchase request state you can define a substate. We this module you can
define substate which allow you to extend purchase request workflow. For
example, you can add substate "To Verify" if the order can not be
approved without document checked and verified

**Table of contents**

.. contents::
:local:

Usage
=====

1. | Go to \*\* Settings > Technical > Database Structure \*\* and Add
"Base substate".
| If necessery you can add "target State values" (ex define a
substate for "cancel" state). Substate sequence is very important.
2. Create a purchae request and check if the substate are displayed on
the header of form view. Check if you can't set substate defined for
purchase request if sate is a To be approved.

Bug Tracker
===========

Bugs are tracked on `GitHub Issues <https://github.com/OCA/purchase-workflow/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 <https://github.com/OCA/purchase-workflow/issues/new?body=module:%20purchase_request_substate%0Aversion:%2018.0%0A%0A**Steps%20to%20reproduce**%0A-%20...%0A%0A**Current%20behavior**%0A%0A**Expected%20behavior**>`_.

Do not contact contributors directly about support or help with technical issues.

Credits
=======

Authors
-------

* Ecosoft

Contributors
------------

- Kitti U. <[email protected]>

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 <https://github.com/OCA/purchase-workflow/tree/18.0/purchase_request_substate>`_ project on GitHub.

You are welcome to contribute. To learn how please visit https://odoo-community.org/page/Contribute.
1 change: 1 addition & 0 deletions purchase_request_substate/__init__.py
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
from . import models
19 changes: 19 additions & 0 deletions purchase_request_substate/__manifest__.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
# Copyright 2021 Ecosoft (<http://ecosoft.co.th>)
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).

{
"name": "Purchase Request Sub State",
"version": "18.0.1.0.0",
"category": "Tools",
"author": "Ecosoft,Odoo Community Association (OCA)",
"website": "https://github.com/OCA/purchase-workflow",
"license": "AGPL-3",
"depends": ["base_substate", "purchase_request"],
"data": [
"views/purchase_request_views.xml",
"data/purchase_substate_mail_template_data.xml",
"data/purchase_request_substate_data.xml",
],
"demo": ["demo/purchase_request_substate_demo.xml"],
"installable": True,
}
19 changes: 19 additions & 0 deletions purchase_request_substate/data/purchase_request_substate_data.xml
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
<?xml version="1.0" encoding="utf-8" ?>
<odoo>
<record id="base_substate_type_purchase_request" model="base.substate.type">
<field name="name">Purchase Request Substate</field>
<field name="model">purchase.request</field>
<field name="target_state_field">state</field>
</record>
<!-- Purchase request related substate to state (to_approve, approved) -->
<record id="target_state_value_to_approve" model="target.state.value">
<field name="name">To be approved</field>
<field name="base_substate_type_id" ref="base_substate_type_purchase_request" />
<field name="target_state_value">to_approve</field>
</record>
<record id="target_state_value_approved" model="target.state.value">
<field name="name">Approved</field>
<field name="base_substate_type_id" ref="base_substate_type_purchase_request" />
<field name="target_state_value">approved</field>
</record>
</odoo>
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
<?xml version="1.0" encoding="utf-8" ?>
<odoo noupdate="1">
<record
id="mail_template_data_purchase_request_substate_verified"
model="mail.template"
>
<field name="name">Verified</field>
<field name="model_id" ref="purchase_request.model_purchase_request" />
<field name="subject">Your purchase request ${object.name} is verified</field>
<field name="use_default_to" eval="True" />
<field name="body_html" type="html">
<div>
Dear ${object.requested_by.name or 'requester'},<br />
This email is to inform that your purchase request ${object.name} was verified by procurement team.
<br /><br />
Thank you,
<br />
</div>
</field>
<field name="auto_delete" eval="True" />
</record>
</odoo>
26 changes: 26 additions & 0 deletions purchase_request_substate/demo/purchase_request_substate_demo.xml
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
<?xml version="1.0" encoding="utf-8" ?>
<odoo noupdate="1">
<!-- to_approve -->
<record id="base_substate_to_verify" model="base.substate">
<field name="name">To Verify</field>
<field name="sequence">1</field>
<field name="target_state_value_id" ref="target_state_value_to_approve" />
<field name="active" eval="False" />
</record>
<record id="base_substate_checked" model="base.substate">
<field name="name">Checked</field>
<field name="sequence">2</field>
<field name="target_state_value_id" ref="target_state_value_to_approve" />
<field name="active" eval="False" />
</record>
<record id="base_substate_verified" model="base.substate">
<field name="name">Verified</field>
<field name="sequence">3</field>
<field name="target_state_value_id" ref="target_state_value_to_approve" />
<field
name="mail_template_id"
ref="purchase_request_substate.mail_template_data_purchase_request_substate_verified"
/>
<field name="active" eval="False" />
</record>
</odoo>
88 changes: 88 additions & 0 deletions purchase_request_substate/i18n/purchase_request_substate.pot
Original file line number Diff line number Diff line change
@@ -0,0 +1,88 @@
# Translation of Odoo Server.
# This file contains the translation of the following modules:
# * purchase_request_substate
#
msgid ""
msgstr ""
"Project-Id-Version: Odoo Server 15.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_substate
#: model:mail.template,body_html:purchase_request_substate.mail_template_data_purchase_request_substate_verified
msgid ""
"<div>\n"
" Dear ${object.requested_by.name or 'requester'},<br/>\n"
" This email is to inform that your purchase request ${object.name} was verified by procurement team.\n"
" <br/><br/>\n"
" Thank you,\n"
" <br/>\n"
"</div>\n"
" "
msgstr ""

#. module: purchase_request_substate
#: model:ir.model.fields,field_description:purchase_request_substate.field_base_substate_type__model
msgid "Apply on"
msgstr ""

#. module: purchase_request_substate
#: model:target.state.value,name:purchase_request_substate.target_state_value_approved
msgid "Approved"
msgstr ""

#. module: purchase_request_substate
#: model:ir.model,name:purchase_request_substate.model_base_substate_type
msgid "Base Substate Type"
msgstr ""

#. module: purchase_request_substate
#: model:base.substate,name:purchase_request_substate.base_substate_checked
msgid "Checked"
msgstr ""

#. module: purchase_request_substate
#: model:ir.model,name:purchase_request_substate.model_purchase_request
msgid "Purchase Request"
msgstr ""

#. module: purchase_request_substate
#: model:base.substate.type,name:purchase_request_substate.base_substate_type_purchase_request
msgid "Purchase Request Substate"
msgstr ""

#. module: purchase_request_substate
#: model:ir.model.fields.selection,name:purchase_request_substate.selection__base_substate_type__model__purchase_request
msgid "Purchase request"
msgstr ""

#. module: purchase_request_substate
#: model:ir.model.fields,field_description:purchase_request_substate.field_purchase_request__substate_id
msgid "Sub State"
msgstr ""

#. module: purchase_request_substate
#: model:base.substate,name:purchase_request_substate.base_substate_to_verify
msgid "To Verify"
msgstr ""

#. module: purchase_request_substate
#: model:target.state.value,name:purchase_request_substate.target_state_value_to_approve
msgid "To be approved"
msgstr ""

#. module: purchase_request_substate
#: model:base.substate,name:purchase_request_substate.base_substate_verified
#: model:mail.template,name:purchase_request_substate.mail_template_data_purchase_request_substate_verified
msgid "Verified"
msgstr ""

#. module: purchase_request_substate
#: model:mail.template,subject:purchase_request_substate.mail_template_data_purchase_request_substate_verified
msgid "Your purchase request ${object.name} is verified"
msgstr ""
1 change: 1 addition & 0 deletions purchase_request_substate/models/__init__.py
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
from . import purchase_request
19 changes: 19 additions & 0 deletions purchase_request_substate/models/purchase_request.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
# Copyright 2021 Ecosoft (<http://ecosoft.co.th>)
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).

from odoo import fields, models


class BaseSubstateType(models.Model):
_inherit = "base.substate.type"

model = fields.Selection(
selection_add=[("purchase.request", "Purchase Request")],
ondelete={"purchase.request": "cascade"},
)


class PurchaseRequest(models.Model):
_name = "purchase.request"
_inherit = ["purchase.request", "base.substate.mixin"]
_state_field = "state"
3 changes: 3 additions & 0 deletions purchase_request_substate/pyproject.toml
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
[build-system]
requires = ["whool"]
build-backend = "whool.buildapi"
1 change: 1 addition & 0 deletions purchase_request_substate/readme/CONTRIBUTORS.md
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
- Kitti U. \<<[email protected]>\>
5 changes: 5 additions & 0 deletions purchase_request_substate/readme/DESCRIPTION.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
This module allows to add a substate to purchase request. For each
purchase request state you can define a substate. We this module you can
define substate which allow you to extend purchase request workflow. For
example, you can add substate "To Verify" if the order can not be
approved without document checked and verified
7 changes: 7 additions & 0 deletions purchase_request_substate/readme/USAGE.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
1. Go to \*\* Settings \> Technical \> Database Structure \*\* and Add "Base substate".
If necessery you can add "target State values" (ex define a substate
for "cancel" state). Substate sequence is very important.

2. Create a purchae request and check if the substate are displayed on
the header of form view. Check if you can't set substate defined for
purchase request if sate is a To be approved.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
444 changes: 444 additions & 0 deletions purchase_request_substate/static/description/index.html

Large diffs are not rendered by default.

1 change: 1 addition & 0 deletions purchase_request_substate/tests/__init__.py
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
from . import test_purchase_request_substate
60 changes: 60 additions & 0 deletions purchase_request_substate/tests/test_purchase_request_substate.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,60 @@
# Copyright 2021 Ecosoft (<http://ecosoft.co.th>)
# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl.html).
from odoo import SUPERUSER_ID
from odoo.exceptions import ValidationError
from odoo.tests.common import TransactionCase


class TestPurchaseRequestSubstate(TransactionCase):
@classmethod
def setUpClass(cls):
super().setUpClass()
# Prepare PR
cls.purchase_request_obj = cls.env["purchase.request"]
cls.purchase_request_line_obj = cls.env["purchase.request.line"]
cls.wiz = cls.env["purchase.request.line.make.purchase.order"]
vals = {
"picking_type_id": cls.env.ref("stock.picking_type_in").id,
"requested_by": SUPERUSER_ID,
}
cls.pr_test = cls.purchase_request_obj.create(vals)
vals = {
"request_id": cls.pr_test.id,
"product_id": cls.env.ref("product.product_product_13").id,
"product_uom_id": cls.env.ref("uom.product_uom_unit").id,
"product_qty": 5.0,
}
cls.purchase_request_line_obj.create(vals)

# Prepare states
cls.substate_to_verify = cls.env.ref(
"purchase_request_substate.base_substate_to_verify"
)
cls.substate_checked = cls.env.ref(
"purchase_request_substate.base_substate_checked"
)
cls.substate_verified = cls.env.ref(
"purchase_request_substate.base_substate_verified"
)
# Active substate
(
cls.substate_to_verify + cls.substate_checked + cls.substate_verified
).active = True

def test_purchase_request_order_substate(self):
self.assertTrue(self.pr_test.state == "draft")
self.assertTrue(not self.pr_test.substate_id)

# Block substate not corresponding to draft state
with self.assertRaises(ValidationError):
self.pr_test.substate_id = self.substate_to_verify
# Test that validation of purchase_request order change substate_id
self.pr_test.button_to_approve()
self.assertTrue(self.pr_test.state == "to_approve")
self.assertTrue(self.pr_test.substate_id == self.substate_to_verify)

# Test that substate_id is set to false if
# there is not substate corresponding to state
self.pr_test.button_approved()
self.assertTrue(self.pr_test.state == "approved")
self.assertTrue(not self.pr_test.substate_id)
17 changes: 17 additions & 0 deletions purchase_request_substate/views/purchase_request_views.xml
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
<?xml version="1.0" encoding="utf-8" ?>
<!-- Copyright 2021 Ecosoft License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). -->
<odoo>
<record id="view_purchase_request_form" model="ir.ui.view">
<field name="model">purchase.request</field>
<field name="inherit_id" ref="purchase_request.view_purchase_request_form" />
<field name="arch" type="xml">
<xpath expr="//header/field[@name='state']" position="before">
<field
name="substate_id"
widget="statusbar"
options="{'clickable': '1',}"
/>
</xpath>
</field>
</record>
</odoo>