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 zcmW++2RxMjAAjx~&dlBk9S+%}OXg)AGE&Cb*&}d0jUxM@u(PQx^-s)697TX`ehR4?GS^qbkof1cslKgkU)h65qZ9Oc=ml_0temigYLJfnz{IDzUf>bGs4N!v3=Z3jMq&A#7%rM5eQ#dc?k~! zVpnB`o+K7|Al`Q_U;eD$B zfJtP*jH`siUq~{KE)`jP2|#TUEFGRryE2`i0**z#*^6~AI|YzIWy$Cu#CSLW3q=GA z6`?GZymC;dCPk~rBS%eCb`5OLr;RUZ;D`}um=H)BfVIq%7VhiMr)_#G0N#zrNH|__ zc+blN2UAB0=617@>_u;MPHN;P;N#YoE=)R#i$k_`UAA>WWCcEVMh~L_ zj--gtp&|K1#58Yz*AHCTMziU1Jzt_jG0I@qAOHsk$2}yTmVkBp_eHuY$A9)>P6o~I z%aQ?!(GqeQ-Y+b0I(m9pwgi(IIZZzsbMv+9w{PFtd_<_(LA~0H(xz{=FhLB@(1&qHA5EJw1>>=%q2f&^X>IQ{!GJ4e9U z&KlB)z(84HmNgm2hg2C0>WM{E(DdPr+EeU_N@57;PC2&DmGFW_9kP&%?X4}+xWi)( z;)z%wI5>D4a*5XwD)P--sPkoY(a~WBw;E~AW`Yue4kFa^LM3X`8x|}ZUeMnqr}>kH zG%WWW>3ml$Yez?i%)2pbKPI7?5o?hydokgQyZsNEr{a|mLdt;X2TX(#B1j35xPnPW z*bMSSOauW>o;*=kO8ojw91VX!qoOQb)zHJ!odWB}d+*K?#sY_jqPdg{Sm2HdYzdEx zOGVPhVRTGPtv0o}RfVP;Nd(|CB)I;*t&QO8h zFfekr30S!-LHmV_Su-W+rEwYXJ^;6&3|L$mMC8*bQptyOo9;>Qb9Q9`ySe3%V$A*9 zeKEe+b0{#KWGp$F+tga)0RtI)nhMa-K@JS}2krK~n8vJ=Ngm?R!9G<~RyuU0d?nz# z-5EK$o(!F?hmX*2Yt6+coY`6jGbb7tF#6nHA zuKk=GGJ;ZwON1iAfG$E#Y7MnZVmrY|j0eVI(DN_MNFJmyZ|;w4tf@=CCDZ#5N_0K= z$;R~bbk?}TpfDjfB&aiQ$VA}s?P}xPERJG{kxk5~R`iRS(SK5d+Xs9swCozZISbnS zk!)I0>t=A<-^z(cmSFz3=jZ23u13X><0b)P)^1T_))Kr`e!-pb#q&J*Q`p+B6la%C zuVl&0duN<;uOsB3%T9Fp8t{ED108<+W(nOZd?gDnfNBC3>M8WE61$So|P zVvqH0SNtDTcsUdzaMDpT=Ty0pDHHNL@Z0w$Y`XO z2M-_r1S+GaH%pz#Uy0*w$Vdl=X=rQXEzO}d6J^R6zjM1u&c9vYLvLp?W7w(?np9x1 zE_0JSAJCPB%i7p*Wvg)pn5T`8k3-uR?*NT|J`eS#_#54p>!p(mLDvmc-3o0mX*mp_ zN*AeS<>#^-{S%W<*mz^!X$w_2dHWpcJ6^j64qFBft-o}o_Vx80o0>}Du;>kLts;$8 zC`7q$QI(dKYG`Wa8#wl@V4jVWBRGQ@1dr-hstpQL)Tl+aqVpGpbSfN>5i&QMXfiZ> zaA?T1VGe?rpQ@;+pkrVdd{klI&jVS@I5_iz!=UMpTsa~mBga?1r}aRBm1WS;TT*s0f0lY=JBl66Upy)-k4J}lh=P^8(SXk~0xW=T9v*B|gzIhN z>qsO7dFd~mgxAy4V?&)=5ieYq?zi?ZEoj)&2o)RLy=@hbCRcfT5jigwtQGE{L*8<@Yd{zg;CsL5mvzfDY}P-wos_6PfprFVaeqNE%h zKZhLtcQld;ZD+>=nqN~>GvROfueSzJD&BE*}XfU|H&(FssBqY=hPCt`d zH?@s2>I(|;fcW&YM6#V#!kUIP8$Nkdh0A(bEVj``-AAyYgwY~jB zT|I7Bf@%;7aL7Wf4dZ%VqF$eiaC38OV6oy3Z#TER2G+fOCd9Iaoy6aLYbPTN{XRPz z;U!V|vBf%H!}52L2gH_+j;`bTcQRXB+y9onc^wLm5wi3-Be}U>k_u>2Eg$=k!(l@I zcCg+flakT2Nej3i0yn+g+}%NYb?ta;R?(g5SnwsQ49U8Wng8d|{B+lyRcEDvR3+`O{zfmrmvFrL6acVP%yG98X zo&+VBg@px@i)%o?dG(`T;n*$S5*rnyiR#=wW}}GsAcfyQpE|>a{=$Hjg=-*_K;UtD z#z-)AXwSRY?OPefw^iI+ z)AXz#PfEjlwTes|_{sB?4(O@fg0AJ^g8gP}ex9Ucf*@_^J(s_5jJV}c)s$`Myn|Kd z$6>}#q^n{4vN@+Os$m7KV+`}c%4)4pv@06af4-x5#wj!KKb%caK{A&Y#Rfs z-po?Dcb1({W=6FKIUirH&(yg=*6aLCekcKwyfK^JN5{wcA3nhO(o}SK#!CINhI`-I z1)6&n7O&ZmyFMuNwvEic#IiOAwNkR=u5it{B9n2sAJV5pNhar=j5`*N!Na;c7g!l$ z3aYBqUkqqTJ=Re-;)s!EOeij=7SQZ3Hq}ZRds%IM*PtM$wV z@;rlc*NRK7i3y5BETSKuumEN`Xu_8GP1Ri=OKQ$@I^ko8>H6)4rjiG5{VBM>B|%`&&s^)jS|-_95&yc=GqjNo{zFkw%%HHhS~e=s zD#sfS+-?*t|J!+ozP6KvtOl!R)@@-z24}`9{QaVLD^9VCSR2b`b!KC#o;Ki<+wXB6 zx3&O0LOWcg4&rv4QG0)4yb}7BFSEg~=IR5#ZRj8kg}dS7_V&^%#Do==#`u zpy6{ox?jWuR(;pg+f@mT>#HGWHAJRRDDDv~@(IDw&R>9643kK#HN`!1vBJHnC+RM&yIh8{gG2q zA%e*U3|N0XSRa~oX-3EAneep)@{h2vvd3Xvy$7og(sayr@95+e6~Xvi1tUqnIxoIH zVWo*OwYElb#uyW{Imam6f2rGbjR!Y3`#gPqkv57dB6K^wRGxc9B(t|aYDGS=m$&S!NmCtrMMaUg(c zc2qC=2Z`EEFMW-me5B)24AqF*bV5Dr-M5ig(l-WPS%CgaPzs6p_gnCIvTJ=Y<6!gT zVt@AfYCzjjsMEGi=rDQHo0yc;HqoRNnNFeWZgcm?f;cp(6CNylj36DoL(?TS7eU#+ z7&mfr#y))+CJOXQKUMZ7QIdS9@#-}7y2K1{8)cCt0~-X0O!O?Qx#E4Og+;A2SjalQ zs7r?qn0H044=sDN$SRG$arw~n=+T_DNdSrarmu)V6@|?1-ZB#hRn`uilTGPJ@fqEy zGt(f0B+^JDP&f=r{#Y_wi#AVDf-y!RIXU^0jXsFpf>=Ji*TeqSY!H~AMbJdCGLhC) zn7Rx+sXw6uYj;WRYrLd^5IZq@6JI1C^YkgnedZEYy<&4(z%Q$5yv#Boo{AH8n$a zhb4Y3PWdr269&?V%uI$xMcUrMzl=;w<_nm*qr=c3Rl@i5wWB;e-`t7D&c-mcQl7x! zZWB`UGcw=Y2=}~wzrfLx=uet<;m3~=8I~ZRuzvMQUQdr+yTV|ATf1Uuomr__nDf=X zZ3WYJtHp_ri(}SQAPjv+Y+0=fH4krOP@S&=zZ-t1jW1o@}z;xk8 z(Nz1co&El^HK^NrhVHa-_;&88vTU>_J33=%{if;BEY*J#1n59=07jrGQ#IP>@u#3A z;!q+E1Rj3ZJ+!4bq9F8PXJ@yMgZL;>&gYA0%_Kbi8?S=XGM~dnQZQ!yBSgcZhY96H zrWnU;k)qy`rX&&xlDyA%(a1Hhi5CWkmg(`Gb%m(HKi-7Z!LKGRP_B8@`7&hdDy5n= z`OIxqxiVfX@OX1p(mQu>0Ai*v_cTMiw4qRt3~NBvr9oBy0)r>w3p~V0SCm=An6@3n)>@z!|o-$HvDK z|3D2ZMJkLE5loMKl6R^ez@Zz%S$&mbeoqH5`Bb){Ei21q&VP)hWS2tjShfFtGE+$z zzCR$P#uktu+#!w)cX!lWN1XU%K-r=s{|j?)Akf@q#3b#{6cZCuJ~gCxuMXRmI$nGtnH+-h z+GEi!*X=AP<|fG`1>MBdTb?28JYc=fGvAi2I<$B(rs$;eoJCyR6_bc~p!XR@O-+sD z=eH`-ye})I5ic1eL~TDmtfJ|8`0VJ*Yr=hNCd)G1p2MMz4C3^Mj?7;!w|Ly%JqmuW zlIEW^Ft%z?*|fpXda>Jr^1noFZEwFgVV%|*XhH@acv8rdGxeEX{M$(vG{Zw+x(ei@ zmfXb22}8-?Fi`vo-YVrTH*C?a8%M=Hv9MqVH7H^J$KsD?>!SFZ;ZsvnHr_gn=7acz z#W?0eCdVhVMWN12VV^$>WlQ?f;P^{(&pYTops|btm6aj>_Uz+hqpGwB)vWp0Cf5y< zft8-je~nn?W11plq}N)4A{l8I7$!ks_x$PXW-2XaRFswX_BnF{R#6YIwMhAgd5F9X zGmwdadS6(a^fjHtXg8=l?Rc0Sm%hk6E9!5cLVloEy4eh(=FwgP`)~I^5~pBEWo+F6 zSf2ncyMurJN91#cJTy_u8Y}@%!bq1RkGC~-bV@SXRd4F{R-*V`bS+6;W5vZ(&+I<9$;-V|eNfLa5n-6% z2(}&uGRF;p92eS*sE*oR$@pexaqr*meB)VhmIg@h{uzkk$9~qh#cHhw#>O%)b@+(| z^IQgqzuj~Sk(J;swEM-3TrJAPCq9k^^^`q{IItKBRXYe}e0Tdr=Huf7da3$l4PdpwWDop%^}n;dD#K4s#DYA8SHZ z&1!riV4W4R7R#C))JH1~axJ)RYnM$$lIR%6fIVA@zV{XVyx}C+a-Dt8Y9M)^KU0+H zR4IUb2CJ{Hg>CuaXtD50jB(_Tcx=Z$^WYu2u5kubqmwp%drJ6 z?Fo40g!Qd<-l=TQxqHEOuPX0;^z7iX?Ke^a%XT<13TA^5`4Xcw6D@Ur&VT&CUe0d} z1GjOVF1^L@>O)l@?bD~$wzgf(nxX1OGD8fEV?TdJcZc2KoUe|oP1#=$$7ee|xbY)A zDZq+cuTpc(fFdj^=!;{k03C69lMQ(|>uhRfRu%+!k&YOi-3|1QKB 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

+ + +

Beta License: AGPL-3 OCA/purchase-workflow Translate me on Weblate Try me on Runbot

+

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

+ +
+

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

+ +
+
+

Maintainers

+

This module is maintained by the OCA.

+Odoo Community Association +

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 + + + + + + + + + + + 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

+
+ + +Odoo Community Association + +
+

Purchase Request Type

-

Beta License: AGPL-3 OCA/purchase-workflow Translate me on Weblate Try me on Runboat

+

Beta License: AGPL-3 OCA/purchase-workflow Translate me on Weblate Try me on Runboat

This module adds the following functions:

    @@ -394,7 +399,7 @@

    Purchase Request Type

-

Configuration

+

Configuration

To configure this module, you need to:

  • Go to Purchases > Configuration > Purchase Request types
  • @@ -402,20 +407,20 @@

    Configuration

-

Usage

+

Usage

To use this module, you need to:

  • Attribute a type when editing purchase requests
-

Known issues / Roadmap

+

Known issues / Roadmap

  • Suggestion: add a default configuration attached to the types
-

Bug Tracker

+

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 @@ -423,21 +428,21 @@

Bug Tracker

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 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! --> -

Beta License: AGPL-3 OCA/purchase-workflow Translate me on Weblate Try me on Runboat

+

Beta License: AGPL-3 OCA/purchase-workflow Translate me on Weblate Try me on Runboat

This module adds the following functions:

    @@ -424,7 +424,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.

    @@ -439,6 +439,10 @@

    Authors

    Contributors

    @@ -450,7 +454,7 @@

    Maintainers

    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)]" /> - +