From cbb9f15c8317d8b8d987cdc50a9f652624276ed1 Mon Sep 17 00:00:00 2001 From: Jordi Ballester Alomar Date: Wed, 22 Jun 2016 19:11:34 -0400 Subject: [PATCH 01/21] [ADD] 8.0 purchase request modules (#189) * [ADD] test that cancel an existing demo PO and create a new revision * [ADD] fill_unrevisioned_name post init hook * [ADD] purchase request modules * [IMP] Add try me on runbot * [FIX] Use suspend_security on search on purchase order for users that have no access right on purchases. * [ADD] addons table in README.md * [IMP][purchase_partial_invoicing] Add dependencies informations in readme file * [FIX] Various fixes * [FIX] fixed travis errors * FIX: properly propagate _run() method of procurement.order accross the class hierarchy * [FIX] travis errors * [FIX] openerp.models: ir.values.create() with unknown fields: object * [IMP] Added message notifications on change of the status of the purchase request. * [IMP] purchase_request_to_requisition. We don't allow to set call for bids and purchase request at the same time in the product form. * [UPD] prefix versions with 8.0 * [FIX] fixed group by error * [IMP] extend purchase request line search * [FIX] fixed search filter * [MOV] move addons out of __unported__ (they remain not installable) * [TEST][purchase_partial_invoicing] Call ir.rule register hook * [FIX] do not display product_tmpl_id on product_supplier_info form if opened from product form * [FIX][product_supplierinfo_discount] Fail when same products has multiple records of same supplier Odoo does not restrict entering mulltiple product.supplierinfo records for the same product and same partner. * [FIX][product_supplierinfo_discount] Less code to select first element * [UPD] addons table in README.md * [IMP] split from purchase_request_to_requisition the module purchase_request_procurement * [FIX] pep8 issues * FIX 1.create purchase order ..maybe: PO00001 2.confirm purchase order 3. cancle this purchase order .name: PO00001 4.new revision ....then create new purhcase order name i s PO00001-1 5.cancel this purchase order name PO00001-1 6.more->duplicate 7.new purchase order create...name is PO00002 8. confirm this order PO00002 9.cancel this order PO00002 10. new revision.....then error Order Reference must be unique per Company * [FIX] fix error when create PO/Bid from PR line w/o product_id * [FIX] adjustments to make the purchase request compatible with v8 * [FIX] fix related to picking type and warehouse for v8 Minimum fix just to continue on purchase_requistion_operating_unit Otherwise, it just give me errors. Please review and make fix to your branch and I will follow. * [FIX] recover what has fixed from previous PR (was removed) https://github.com/Eficent/purchase-workflow/pull/2 * [FIX] purchase_request_to_rfq, assign date_planned if none. If no product_id, date_planned won't be prepare. But we need it or error. * [ENH] purchase_request, PR Line only filtered with non-Draft state * [IMP] .travis.yml: Coveralls+Transifex activation * add purchase_picking_state module * add french translate * OCA Transbot updated translations from Transifex * [IMP] purchase_discount: load price with discount in stock_move when confirm a purchase order * fix README.rst and fix openerp.py and refactor _compute_picking_state method and add tests and add invisible attribut for picking_state field in views * add icon.png * fix tests * [ADD] Module to split purchase receptions by dates * [MIGR] purchase_delivery_split_date Use v8 API Follow the OCA guidelines for manifest and README PEP8 Extend _create_stock_move because the method we used to extend in v7 doesn't exist anymore. * [IMP] Unit test for purchase_delivery_split_date * [FIX] manifest conventions * Conform to OCA standards * [UPD] addons table in README.md * OCA Transbot updated translations from Transifex * [UPD] addons table in README.md * [ADD]purchase_rfq_number * [UPD]Changing url for issue on README.rst * [FIX]Fix errors in writing * [UPD]Creating Unittest * Change Block Comment from '#' into '# ' * [ADD] setup.py * OCA Transbot updated translations from Transifex * [FIX] a line with a bigger invoiced quantity than the quantity ordered should be considered as invoiced. * [FIX] Error raised if no procurement during the creation of the purchase order form the purchase request * [UPD] addons table in README.md * [ADD] setup.py * OCA Transbot updated translations from Transifex * [ADD] translation files .pot * OCA Transbot updated translations from Transifex * [FIX] messages to the purchase request generated in purchase order, stock picking and purchase requisition should notify to followers of the purchase request. * [ADD] purchase_requisition_type (#231) * [ADD] purchase_requisition_type * Delete duplicate usage on README.rst * Fix error when encode BID * [UPD] Add invoice_method on _prepare_purchase_order function * [UPD] Add invoice_method on unittest prepare_purchase_order * Fixing flake error E501 * [UPD] addons table in README.md * [ADD] setup.py * [CHG] greenify travis * Move yml into python test * Pep8/Flake8 * [CHG] greenify travis and port ymal tests to python * OCA Transbot updated translations from Transifex * [CHG] add dependency on purchase_request_to_rfq see also https://github.com/Eficent/purchase-workflow/pull/9#issuecomment-222669079 * [FIX] travis * [CHG] restart build * [REV]test_prepare_purchase_order.py (#235) * [ADD] purchase request modules * [IMP] Add try me on runbot * [FIX] Various fixes * [FIX] fixed travis errors * FIX: properly propagate _run() method of procurement.order accross the class hierarchy * [FIX] travis errors * [FIX] openerp.models: ir.values.create() with unknown fields: object * [IMP] Added message notifications on change of the status of the purchase request. * [IMP] purchase_request_to_requisition. We don't allow to set call for bids and purchase request at the same time in the product form. * [FIX] fixed group by error * [IMP] extend purchase request line search * [FIX] fixed search filter * [IMP] split from purchase_request_to_requisition the module purchase_request_procurement * [FIX] pep8 issues * [FIX] fix error when create PO/Bid from PR line w/o product_id * [FIX] adjustments to make the purchase request compatible with v8 * [FIX] fix related to picking type and warehouse for v8 Minimum fix just to continue on purchase_requistion_operating_unit Otherwise, it just give me errors. Please review and make fix to your branch and I will follow. * [FIX] recover what has fixed from previous PR (was removed) https://github.com/Eficent/purchase-workflow/pull/2 * [ENH] purchase_request, PR Line only filtered with non-Draft state * [FIX] Error raised if no procurement during the creation of the purchase order form the purchase request * [ADD] translation files .pot * [FIX] messages to the purchase request generated in purchase order, stock picking and purchase requisition should notify to followers of the purchase request. * [CHG] greenify travis * Move yml into python test * Pep8/Flake8 * [CHG] greenify travis and port ymal tests to python * [CHG] add dependency on purchase_request_to_rfq see also https://github.com/Eficent/purchase-workflow/pull/9#issuecomment-222669079 * [FIX] travis * [CHG] restart build * [FIX] pull189#issuecomment-225476547 * [FIX] pull189 flake8 issues * [FIX] pull189 flake8 issues * [FIX] pull189 discussion_r68006610 * [FIX] pull189 discussion_r68008046 --- purchase_request_to_requisition/README.rst | 60 ++++ purchase_request_to_requisition/__init__.py | 7 + .../__openerp__.py | 25 ++ .../i18n/purchase_request_to_requisition.pot | 287 ++++++++++++++++++ .../models/__init__.py | 8 + .../models/product.py | 22 ++ .../models/purchase_request.py | 82 +++++ .../models/purchase_requisition.py | 111 +++++++ .../static/description/icon.png | Bin 0 -> 4857 bytes .../tests/__init__.py | 5 + .../test_purchase_request_to_requisition.py | 74 +++++ .../views/procurement_view.xml | 17 ++ .../views/product_view.xml | 18 ++ .../views/purchase_request_view.xml | 118 +++++++ .../views/purchase_requisition_view.xml | 24 ++ .../wizard/__init__.py | 6 + ..._request_line_make_purchase_requisition.py | 184 +++++++++++ ...st_line_make_purchase_requisition_view.xml | 68 +++++ 18 files changed, 1116 insertions(+) create mode 100644 purchase_request_to_requisition/README.rst create mode 100644 purchase_request_to_requisition/__init__.py create mode 100644 purchase_request_to_requisition/__openerp__.py create mode 100644 purchase_request_to_requisition/i18n/purchase_request_to_requisition.pot create mode 100644 purchase_request_to_requisition/models/__init__.py create mode 100644 purchase_request_to_requisition/models/product.py create mode 100644 purchase_request_to_requisition/models/purchase_request.py create mode 100644 purchase_request_to_requisition/models/purchase_requisition.py create mode 100644 purchase_request_to_requisition/static/description/icon.png create mode 100644 purchase_request_to_requisition/tests/__init__.py create mode 100644 purchase_request_to_requisition/tests/test_purchase_request_to_requisition.py create mode 100644 purchase_request_to_requisition/views/procurement_view.xml create mode 100644 purchase_request_to_requisition/views/product_view.xml create mode 100644 purchase_request_to_requisition/views/purchase_request_view.xml create mode 100644 purchase_request_to_requisition/views/purchase_requisition_view.xml create mode 100644 purchase_request_to_requisition/wizard/__init__.py create mode 100644 purchase_request_to_requisition/wizard/purchase_request_line_make_purchase_requisition.py create mode 100644 purchase_request_to_requisition/wizard/purchase_request_line_make_purchase_requisition_view.xml diff --git a/purchase_request_to_requisition/README.rst b/purchase_request_to_requisition/README.rst new file mode 100644 index 00000000000..3fa0d683b95 --- /dev/null +++ b/purchase_request_to_requisition/README.rst @@ -0,0 +1,60 @@ +.. image:: https://img.shields.io/badge/licence-AGPL--3-blue.svg + :alt: License AGPL-3 + +Purchase Request to Call for Bids +================================= +This module introduces the following features: + +* The possibility to create new Call for Bids or update existing Bids from + Purchase Request Lines. + + +Usage +===== + +* Go to the Purchase Request Lines from the menu entry 'Purchase Requests', + and also from the 'Purchase' menu. + +* Select the lines that you wish to initiate the RFQ for, then go to 'More' + and press 'Create Purchase Bid'. You can choose to select an existing + Draft Bid or create a new one. + +* In case that you chose to select an existing Bid, the application will search + for existing lines matching the request line, and will add the extra + quantity to them. + +* In case that you create a new RFQ, the request lines will also be + consolidated into as few as possible lines in the RFQ. + +.. image:: https://odoo-community.org/website/image/ir.attachment/5784_f2813bd/datas + :alt: Try me on Runbot + :target: https://runbot.odoo-community.org/runbot/142/8.0 + +For further information, please visit: + +* http://www.eficent.com/blog_en/streamline-your-purchasing-process-in-odoo-using-purchase-requests/ + + +Credits +======= + +Contributors +------------ + +* Eficent Business and IT Consulting Services, S.L. + + +Maintainer +---------- + +.. image:: http://odoo-community.org/logo.png + :alt: Odoo Community Association + :target: http://odoo-community.org + +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. + +To contribute to this module, please visit http://odoo-community.org. \ No newline at end of file diff --git a/purchase_request_to_requisition/__init__.py b/purchase_request_to_requisition/__init__.py new file mode 100644 index 00000000000..8290053c085 --- /dev/null +++ b/purchase_request_to_requisition/__init__.py @@ -0,0 +1,7 @@ +# -*- coding: utf-8 -*- +# © 2015 Eficent Business and IT Consulting Services S.L. +# - Jordi Ballester Alomar +# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl.html). + +from . import models +from . import wizard diff --git a/purchase_request_to_requisition/__openerp__.py b/purchase_request_to_requisition/__openerp__.py new file mode 100644 index 00000000000..f2171a8777c --- /dev/null +++ b/purchase_request_to_requisition/__openerp__.py @@ -0,0 +1,25 @@ +# -*- coding: utf-8 -*- +# © 2015 Eficent Business and IT Consulting Services S.L. +# - Jordi Ballester Alomar +# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl.html). + +{ + "name": "Purchase Request to Call for Bids", + "version": "8.0.1.0.0", + "author": "Eficent, " + "Odoo Community Association (OCA)", + "website": "www.eficent.com", + "category": "Purchase Management", + "depends": [ + "purchase_request_procurement", + "purchase_requisition", + "purchase_request_to_rfq", + ], + "data": [ + "wizard/purchase_request_line_make_purchase_requisition_view.xml", + "views/purchase_request_view.xml", + "views/purchase_requisition_view.xml", + ], + "license": 'AGPL-3', + "installable": True +} diff --git a/purchase_request_to_requisition/i18n/purchase_request_to_requisition.pot b/purchase_request_to_requisition/i18n/purchase_request_to_requisition.pot new file mode 100644 index 00000000000..2d1907bbb13 --- /dev/null +++ b/purchase_request_to_requisition/i18n/purchase_request_to_requisition.pot @@ -0,0 +1,287 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * purchase_request_to_requisition +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 8.0\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2016-05-17 14:59+0000\n" +"PO-Revision-Date: 2016-05-17 14:59+0000\n" +"Last-Translator: <>\n" +"Language-Team: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: \n" +"Plural-Forms: \n" + +#. module: purchase_request_to_requisition +#: code:addons/purchase_request_to_requisition/models/purchase_requisition.py:26 +#, python-format +msgid "
  • %s: Total bid quantity %s %s
  • " +msgstr "" + +#. module: purchase_request_to_requisition +#: view:purchase.request.line:purchase_request_to_requisition.purchase_request_line_search +msgid "At least a Draft Bid has been created" +msgstr "" + +#. module: purchase_request_to_requisition +#: view:purchase.request.line:purchase_request_to_requisition.purchase_request_line_search +msgid "At least a PO has been confirmed" +msgstr "" + +#. module: purchase_request_to_requisition +#: view:purchase.request.line:purchase_request_to_requisition.purchase_request_line_search +msgid "At least one of the Bids has been completed" +msgstr "" + +#. module: purchase_request_to_requisition +#: selection:purchase.request.line,requisition_state:0 +msgid "Bid Selection" +msgstr "" + +#. module: purchase_request_to_requisition +#: view:purchase.request.line:purchase_request_to_requisition.purchase_request_line_search +msgid "Bid Sent to Suppliers" +msgstr "" + +#. module: purchase_request_to_requisition +#: field:purchase.request.line,requisition_state:0 +msgid "Bid Status" +msgstr "" + +#. module: purchase_request_to_requisition +#: view:purchase.request.line:purchase_request_to_requisition.purchase_request_line_search +msgid "Bid completed" +msgstr "" + +#. module: purchase_request_to_requisition +#: code:addons/purchase_request_to_requisition/models/purchase_requisition.py:17 +#, python-format +msgid "Bid confirmation %s for your Request %s" +msgstr "" + +#. module: purchase_request_to_requisition +#: view:purchase.request.line.make.purchase.requisition:purchase_request_to_requisition.view_purchase_request_line_make_purchase_requisition +msgid "Cancel" +msgstr "" + +#. module: purchase_request_to_requisition +#: selection:purchase.request.line,requisition_state:0 +msgid "Cancelled" +msgstr "" + +#. module: purchase_request_to_requisition +#: selection:purchase.request.line,requisition_state:0 +msgid "Confirmed" +msgstr "" + +#. module: purchase_request_to_requisition +#: model:ir.actions.act_window,name:purchase_request_to_requisition.action_purchase_request_line_make_purchase_requisition +#: view:purchase.request.line.make.purchase.requisition:purchase_request_to_requisition.view_purchase_request_line_make_purchase_requisition +msgid "Create Call for Bids" +msgstr "" + +#. module: purchase_request_to_requisition +#: field:purchase.request.line.make.purchase.requisition,create_uid:0 +#: field:purchase.request.line.make.purchase.requisition.item,create_uid:0 +msgid "Created by" +msgstr "" + +#. module: purchase_request_to_requisition +#: field:purchase.request.line.make.purchase.requisition,create_date:0 +#: field:purchase.request.line.make.purchase.requisition.item,create_date:0 +msgid "Created on" +msgstr "" + +#. module: purchase_request_to_requisition +#: field:purchase.request.line.make.purchase.requisition.item,name:0 +msgid "Description" +msgstr "" + +#. module: purchase_request_to_requisition +#: view:purchase.request.line.make.purchase.requisition:purchase_request_to_requisition.view_purchase_request_line_make_purchase_requisition +msgid "Details" +msgstr "" + +#. module: purchase_request_to_requisition +#: selection:purchase.request.line,requisition_state:0 +msgid "Draft" +msgstr "" + +#. module: purchase_request_to_requisition +#: code:addons/purchase_request_to_requisition/wizard/purchase_request_line_make_purchase_requisition.py:95 +#, python-format +msgid "Enter a positive quantity." +msgstr "" + +#. module: purchase_request_to_requisition +#: view:purchase.request.line.make.purchase.requisition:purchase_request_to_requisition.view_purchase_request_line_make_purchase_requisition +msgid "Existing draft Call for Bid to update:" +msgstr "" + +#. module: purchase_request_to_requisition +#: field:purchase.request.line.make.purchase.requisition,id:0 +#: field:purchase.request.line.make.purchase.requisition.item,id:0 +msgid "ID" +msgstr "" + +#. module: purchase_request_to_requisition +#: field:purchase.request.line.make.purchase.requisition,item_ids:0 +msgid "Items" +msgstr "" + +#. module: purchase_request_to_requisition +#: field:purchase.request.line.make.purchase.requisition,write_uid:0 +#: field:purchase.request.line.make.purchase.requisition.item,write_uid:0 +msgid "Last Updated by" +msgstr "" + +#. module: purchase_request_to_requisition +#: field:purchase.request.line.make.purchase.requisition,write_date:0 +#: field:purchase.request.line.make.purchase.requisition.item,write_date:0 +msgid "Last Updated on" +msgstr "" + +#. module: purchase_request_to_requisition +#: view:purchase.request.line:purchase_request_to_requisition.purchase_request_line_search +msgid "New Bid" +msgstr "" + +#. module: purchase_request_to_requisition +#: view:purchase.request.line:purchase_request_to_requisition.purchase_request_line_search +#: selection:purchase.request.line,requisition_state:0 +msgid "No Bid" +msgstr "" + +#. module: purchase_request_to_requisition +#: view:purchase.request.line:purchase_request_to_requisition.purchase_request_line_search +msgid "No Bid has been created" +msgstr "" + +#. module: purchase_request_to_requisition +#: constraint:product.template:0 +msgid "Only one selection of Purchase Request or Call for Bids allowed" +msgstr "" + +#. module: purchase_request_to_requisition +#: selection:purchase.request.line,requisition_state:0 +msgid "PO Created" +msgstr "" + +#. module: purchase_request_to_requisition +#: field:purchase.request.line.make.purchase.requisition.item,product_id:0 +msgid "Product" +msgstr "" + +#. module: purchase_request_to_requisition +#: model:ir.model,name:purchase_request_to_requisition.model_product_template +msgid "Product Template" +msgstr "" + +#. module: purchase_request_to_requisition +#: model:ir.model,name:purchase_request_to_requisition.model_purchase_request_line +#: field:purchase.request.line.make.purchase.requisition.item,line_id:0 +msgid "Purchase Request Line" +msgstr "" + +#. module: purchase_request_to_requisition +#: model:ir.model,name:purchase_request_to_requisition.model_purchase_request_line_make_purchase_requisition +msgid "Purchase Request Line Make Purchase Requisition" +msgstr "" + +#. module: purchase_request_to_requisition +#: model:ir.model,name:purchase_request_to_requisition.model_purchase_request_line_make_purchase_requisition_item +msgid "Purchase Request Line Make Purchase Requisition Item" +msgstr "" + +#. module: purchase_request_to_requisition +#: code:addons/purchase_request_to_requisition/models/purchase_requisition.py:117 +#: field:purchase.requisition.line,purchase_request_lines:0 +#, python-format +msgid "Purchase Request Lines" +msgstr "" + +#. module: purchase_request_to_requisition +#: view:purchase.requisition:purchase_request_to_requisition.view_purchase_requisition_form +msgid "Purchase Request lines" +msgstr "" + +#. module: purchase_request_to_requisition +#: model:ir.model,name:purchase_request_to_requisition.model_purchase_requisition +#: field:purchase.request.line.make.purchase.requisition,purchase_requisition_id:0 +msgid "Purchase Requisition" +msgstr "" + +#. module: purchase_request_to_requisition +#: model:ir.model,name:purchase_request_to_requisition.model_purchase_requisition_line +msgid "Purchase Requisition Line" +msgstr "" + +#. module: purchase_request_to_requisition +#: view:purchase.request.line:purchase_request_to_requisition.purchase_request_line_form +#: field:purchase.request.line,requisition_lines:0 +msgid "Purchase Requisition Lines" +msgstr "" + +#. module: purchase_request_to_requisition +#: code:addons/purchase_request_to_requisition/wizard/purchase_request_line_make_purchase_requisition.py:141 +#, python-format +msgid "Purchase requisition" +msgstr "" + +#. module: purchase_request_to_requisition +#: field:purchase.request.line.make.purchase.requisition.item,product_qty:0 +msgid "Quantity to Bid" +msgstr "" + +#. module: purchase_request_to_requisition +#: view:purchase.request.line:purchase_request_to_requisition.purchase_request_line_search +msgid "Request" +msgstr "" + +#. module: purchase_request_to_requisition +#: view:purchase.request:purchase_request_to_requisition.view_purchase_request_form +msgid "Requisition Lines" +msgstr "" + +#. module: purchase_request_to_requisition +#: view:purchase.request.line:purchase_request_to_requisition.purchase_request_line_search +msgid "Requisition Status" +msgstr "" + +#. module: purchase_request_to_requisition +#: code:addons/purchase_request_to_requisition/models/purchase_requisition.py:20 +#, python-format +msgid "The following requested items from Purchase Request %s have now being sent to Suppliers using Purchase Bid %s:" +msgstr "" + +#. module: purchase_request_to_requisition +#: field:purchase.request.line.make.purchase.requisition.item,product_uom_id:0 +msgid "UoM" +msgstr "" + +#. module: purchase_request_to_requisition +#: field:purchase.request.line.make.purchase.requisition.item,wiz_id:0 +msgid "Wizard" +msgstr "" + +#. module: purchase_request_to_requisition +#: code:addons/purchase_request_to_requisition/models/purchase_request.py:85 +#, python-format +msgid "You cannot delete a record that refers to purchase lines!" +msgstr "" + +#. module: purchase_request_to_requisition +#: code:addons/purchase_request_to_requisition/wizard/purchase_request_line_make_purchase_requisition.py:101 +#, python-format +msgid "You have to select lines from the same company." +msgstr "" + +#. module: purchase_request_to_requisition +#: code:addons/purchase_request_to_requisition/wizard/purchase_request_line_make_purchase_requisition.py:110 +#, python-format +msgid "You have to select lines from the same picking type." +msgstr "" + diff --git a/purchase_request_to_requisition/models/__init__.py b/purchase_request_to_requisition/models/__init__.py new file mode 100644 index 00000000000..e248e942fb9 --- /dev/null +++ b/purchase_request_to_requisition/models/__init__.py @@ -0,0 +1,8 @@ +# -*- coding: utf-8 -*- +# © 2015 Eficent Business and IT Consulting Services S.L. +# - Jordi Ballester Alomar +# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl.html). + +from . import purchase_request +from . import purchase_requisition +from . import product diff --git a/purchase_request_to_requisition/models/product.py b/purchase_request_to_requisition/models/product.py new file mode 100644 index 00000000000..66b20ed1415 --- /dev/null +++ b/purchase_request_to_requisition/models/product.py @@ -0,0 +1,22 @@ +# -*- coding: utf-8 -*- +# © 2015 Eficent Business and IT Consulting Services S.L. +# - Jordi Ballester Alomar +# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl.html). + +from openerp import api, models + + +class ProductTemplate(models.Model): + _inherit = "product.template" + + @api.multi + def _check_request_requisition(self): + for product in self: + if product.purchase_request and product.purchase_requisition: + return False + return True + + _constraints = [ + (_check_request_requisition, + 'Only one selection of Purchase Request or Call for Bids allowed', + ['purchase_request', 'purchase_requisition'])] diff --git a/purchase_request_to_requisition/models/purchase_request.py b/purchase_request_to_requisition/models/purchase_request.py new file mode 100644 index 00000000000..8fe5d71fdec --- /dev/null +++ b/purchase_request_to_requisition/models/purchase_request.py @@ -0,0 +1,82 @@ +# -*- coding: utf-8 -*- +# © 2015 Eficent Business and IT Consulting Services S.L. +# - Jordi Ballester Alomar +# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl.html). + +from openerp import _, api, exceptions, fields, models + +_PURCHASE_REQUISITION_STATE = [ + ('none', 'No Bid'), + ('draft', 'Draft'), + ('in_progress', 'Confirmed'), + ('open', 'Bid Selection'), + ('done', 'PO Created'), + ('cancel', 'Cancelled')] + + +class PurchaseRequestLine(models.Model): + _inherit = "purchase.request.line" + + @api.multi + @api.depends('requisition_lines') + def _compute_is_editable(self): + super(PurchaseRequestLine, self)._compute_is_editable() + for rec in self: + if rec.requisition_lines: + rec.is_editable = False + + @api.multi + def _compute_requisition_qty(self): + for rec in self: + requisition_qty = 0.0 + for requisition_line in rec.requisition_lines: + if requisition_line.requisition_id.state != 'cancel': + requisition_qty += requisition_line.product_qty + rec.requisition_qty = requisition_qty + + @api.multi + @api.depends('requisition_lines.requisition_id.state') + def _compute_requisition_state(self): + for rec in self: + temp_req_state = 'none' + if rec.requisition_lines: + if any([pr_line.requisition_id.state == 'done' for + pr_line in + rec.requisition_lines]): + temp_req_state = 'done' + elif all([pr_line.requisition_id.state == 'cancel' + for pr_line in rec.requisition_lines]): + temp_req_state = 'cancel' + elif any([pr_line.requisition_id.state == 'in_progress' + for pr_line in rec.requisition_lines]): + temp_req_state = 'in_progress' + elif all([pr_line.requisition_id.state in ('draft', 'cancel') + for pr_line in rec.requisition_lines]): + temp_req_state = 'draft' + rec.requisition_state = temp_req_state + + requisition_lines = fields.Many2many( + 'purchase.requisition.line', + 'purchase_request_purchase_requisition_line_rel', + 'purchase_request_line_id', + 'purchase_requisition_line_id', + string='Purchase Requisition Lines', readonly=True, copy=False) + + requisition_qty = fields.Float(compute='_compute_requisition_qty', + string='Quantity in a Bid') + requisition_state = fields.Selection( + compute='_compute_requisition_state', string="Bid Status", + type='selection', selection=_PURCHASE_REQUISITION_STATE, store=True, + default='none') + + is_editable = fields.Boolean(compute='_compute_is_editable', + string="Is editable") + + @api.multi + def unlink(self): + for line in self: + if line.requisition_lines: + raise exceptions.Warning( + _('You cannot delete a record that refers to purchase ' + 'lines!')) + return super(PurchaseRequestLine, self).unlink() diff --git a/purchase_request_to_requisition/models/purchase_requisition.py b/purchase_request_to_requisition/models/purchase_requisition.py new file mode 100644 index 00000000000..1564b432ce3 --- /dev/null +++ b/purchase_request_to_requisition/models/purchase_requisition.py @@ -0,0 +1,111 @@ +# -*- coding: utf-8 -*- +# © 2015 Eficent Business and IT Consulting Services S.L. +# - Jordi Ballester Alomar +# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl.html). + +from openerp import _, api, fields, models + + +class PurchaseRequisition(models.Model): + _inherit = "purchase.requisition" + + @api.model + def _purchase_request_confirm_message_content(self, pr, request, + request_dict): + if not request_dict: + request_dict = {} + title = _('Bid confirmation %s for your Request %s') % ( + pr.name, request.name) + message = '

    %s

    ' + return message + + @api.multi + def _purchase_request_confirm_message(self): + request_obj = self.env['purchase.request'] + for pr in self: + requests_dict = {} + for line in pr.line_ids: + for request_line in line.purchase_request_lines: + request_id = request_line.request_id.id + if request_id not in requests_dict: + requests_dict[request_id] = {} + data = { + 'name': request_line.name, + 'product_qty': line.product_qty, + 'product_uom_id': line.product_uom_id.name, + } + requests_dict[request_id][request_line.id] = data + for request_id in requests_dict.keys(): + request = request_obj.browse(request_id) + message = self._purchase_request_confirm_message_content( + pr, request, requests_dict[request_id]) + request.message_post(body=message, subtype='mail.mt_comment') + return True + + @api.multi + def tender_in_progress(self): + res = super(PurchaseRequisition, self).tender_in_progress() + self._purchase_request_confirm_message() + return res + + @api.model + def _prepare_purchase_order_line(self, requisition, requisition_line, + purchase_id, supplier): + vals = super(PurchaseRequisition, self)._prepare_purchase_order_line( + requisition, requisition_line, purchase_id, supplier) + vals.update({ + 'purchase_request_lines': + [(4, line.id) for line + in requisition_line.purchase_request_lines], + }) + return vals + + +class PurchaseRequisitionLine(models.Model): + _inherit = "purchase.requisition.line" + + @api.multi + def _compute_has_purchase_request_lines(self): + for rec in self: + rec.has_purchase_request_lines = bool(rec.purchase_request_lines) + + purchase_request_lines = fields.Many2many( + 'purchase.request.line', + 'purchase_request_purchase_requisition_line_rel', + 'purchase_requisition_line_id', + 'purchase_request_line_id', + string='Purchase Request Lines', readonly=True, copy=False) + has_purchase_request_lines = fields.Boolean( + compute="_compute_has_purchase_request_lines", + string="Has Purchase Request Lines") + + @api.multi + def action_openRequestLineTreeView(self): + """ + :return dict: dictionary value for created view + """ + request_line_ids = [] + for line in self: + request_line_ids = [request_line.id for request_line + in line.purchase_request_lines] + domain = [('id', 'in', request_line_ids)] + + return {'name': _('Purchase Request Lines'), + 'type': 'ir.actions.act_window', + 'res_model': 'purchase.request.line', + 'view_type': 'form', + 'view_mode': 'tree,form', + 'domain': domain} diff --git a/purchase_request_to_requisition/static/description/icon.png b/purchase_request_to_requisition/static/description/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..a7c11c7a1e3df3654b45284d5b92ca7c86e56b4e GIT binary patch literal 4857 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 +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html). + +from . import test_purchase_request_to_requisition diff --git a/purchase_request_to_requisition/tests/test_purchase_request_to_requisition.py b/purchase_request_to_requisition/tests/test_purchase_request_to_requisition.py new file mode 100644 index 00000000000..1ec48c9ad57 --- /dev/null +++ b/purchase_request_to_requisition/tests/test_purchase_request_to_requisition.py @@ -0,0 +1,74 @@ +# -*- coding: utf-8 -*- +# Copyright 2016 ACSONE SA/NV () +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html). +from openerp.tests import common +from openerp.tools import SUPERUSER_ID + + +class TestPurchaseRequestToRequisition(common.TransactionCase): + + def setUp(self): + super(TestPurchaseRequestToRequisition, self).setUp() + self.purchase_request = self.env['purchase.request'] + self.purchase_request_line = self.env['purchase.request.line'] + self.wiz =\ + self.env['purchase.request.line.make.purchase.requisition'] + self.purchase_requisition_partner_model =\ + self.env['purchase.requisition.partner'] + self.purchase_order = self.env['purchase.order'] + + def test_purchase_request_to_purchase_requisition(self): + vals = { + 'picking_type_id': self.env.ref('stock.picking_type_in').id, + 'requested_by': SUPERUSER_ID, + } + purchase_request = self.purchase_request.create(vals) + vals = { + 'request_id': purchase_request.id, + 'product_id': self.env.ref('product.product_product_13').id, + 'product_uom_id': self.env.ref('product.product_uom_unit').id, + 'product_qty': 5.0, + } + purchase_request_line = self.purchase_request_line.create(vals) + wiz_id = self.wiz.with_context( + active_model="purchase.request.line", + active_ids=[purchase_request_line.id], + active_id=purchase_request_line.id,).create({}) + wiz_id.make_purchase_requisition() + self.assertTrue( + len(purchase_request_line.requisition_lines.ids) == 1, + 'Should have one purchase requisition line created') + requisition_id = purchase_request_line.requisition_lines.requisition_id + self.assertEquals( + len(purchase_request.line_ids), + len(requisition_id.line_ids), 'Should have the same lines') + requisition_line = requisition_id.line_ids + self.assertEquals( + requisition_line.product_id.id, + purchase_request_line.product_id.id, + 'Should have the same products') + self.assertEquals( + purchase_request.state, + requisition_id.state, + 'Should have the same state') + requisition_id.tender_in_progress() + requisition_id.tender_open() + vals = { + 'partner_id': self.env.ref('base.res_partner_12').id, + } + requisition_partner_id =\ + self.purchase_requisition_partner_model.with_context( + active_model='purchase.requisition', + active_ids=[requisition_id.id], + active_id=requisition_id.id,).create(vals) + requisition_partner_id.create_order() + domain = [ + ('requisition_id', '=', requisition_id.id), + ] + purchase_id = self.purchase_order.search(domain) + self.assertTrue(purchase_id, 'Should find purchase order') + purchase_id.signal_workflow('purchase_confirm') + self.assertEquals( + len( + purchase_id.order_line.purchase_request_lines + ), 1, 'Should have a link between order lines and request lines') diff --git a/purchase_request_to_requisition/views/procurement_view.xml b/purchase_request_to_requisition/views/procurement_view.xml new file mode 100644 index 00000000000..2bf88c02bce --- /dev/null +++ b/purchase_request_to_requisition/views/procurement_view.xml @@ -0,0 +1,17 @@ + + + + + + procurement.form.inherit + procurement.order + + + + + + + + + + diff --git a/purchase_request_to_requisition/views/product_view.xml b/purchase_request_to_requisition/views/product_view.xml new file mode 100644 index 00000000000..e209ac1959f --- /dev/null +++ b/purchase_request_to_requisition/views/product_view.xml @@ -0,0 +1,18 @@ + + + + + + product.template.form.inherit + product.template + + + + + + + + + + diff --git a/purchase_request_to_requisition/views/purchase_request_view.xml b/purchase_request_to_requisition/views/purchase_request_view.xml new file mode 100644 index 00000000000..64337fd1943 --- /dev/null +++ b/purchase_request_to_requisition/views/purchase_request_view.xml @@ -0,0 +1,118 @@ + + + + + + purchase.request.form + purchase.request + + + + + + + + + + + + + + + + + + + + + + + purchase.request.line.tree + purchase.request.line + + + + + + + + + + + purchase.request.line.form + purchase.request.line + + + + + + + + + + + + + + + + + +
    + + + + + + +
    +
    +
    +
    +
    +
    + + + + purchase.request.line.search + purchase.request.line + + + + + + + + + + + + + + + +
    +
    diff --git a/purchase_request_to_requisition/views/purchase_requisition_view.xml b/purchase_request_to_requisition/views/purchase_requisition_view.xml new file mode 100644 index 00000000000..5d32b05ff4e --- /dev/null +++ b/purchase_request_to_requisition/views/purchase_requisition_view.xml @@ -0,0 +1,24 @@ + + + + + + purchase.requisition.form + purchase.requisition + + + + + + @@ -38,9 +52,9 @@ purchase.request.line.tree purchase.request.line + name="inherit_id" + ref="purchase_request.purchase_request_line_tree" + /> @@ -53,15 +67,15 @@ purchase.request.line.form purchase.request.line + name="inherit_id" + ref="purchase_request.purchase_request_line_form" + /> + name="purchase_requisition_lines" + string="Purchase Agreement Lines" + > @@ -69,23 +83,23 @@ - + + name="product_uom_id" + groups="uom.group_uom" + /> -
    + + name="product_uom_id" + groups="uom.group_uom" + />
    @@ -100,50 +114,51 @@ purchase.request.line.search purchase.request.line + name="inherit_id" + ref="purchase_request.purchase_request_line_search" + /> + name="requisition_state_none" + string="No Bid" + domain="[('requisition_state','=','none')]" + help="No Bid has been created" + /> + name="requisition_state_draft" + string="New Bid" + domain="[('requisition_state','=','draft')]" + help="At least a Draft Bid has been created" + /> + name="requisition_state_in_progress" + string="Bid Sent to Suppliers" + domain="[('requisition_state','=','in_progress')]" + help="At least a PO has been confirmed" + /> + name="requisition_state_done" + string="Bid completed" + domain="[('requisition_state','=','done')]" + help="At least one of the Bids has been completed" + /> + name="requisition_status" + string="Requisition Status" + domain="[]" + context="{'group_by':'requisition_state'}" + /> + name="request" + string="Request" + domain="[]" + context="{'group_by':'request_id'}" + /> -
    -
    + diff --git a/purchase_request_to_requisition/views/purchase_requisition_view.xml b/purchase_request_to_requisition/views/purchase_requisition_view.xml index 18650302655..5c5397366e1 100644 --- a/purchase_request_to_requisition/views/purchase_requisition_view.xml +++ b/purchase_request_to_requisition/views/purchase_requisition_view.xml @@ -1,29 +1,55 @@ - - + + + + Purchase Requests + ir.actions.act_window + purchase.request + tree,form + [('requisition_id','=',active_id)] + { + "default_requisition_id":active_id, + "default_user_id": False, + } + + purchase.requisition.form purchase.requisition + name="inherit_id" + ref="purchase_requisition.view_purchase_requisition_form" + /> + - - + diff --git a/purchase_request_to_requisition/wizard/purchase_request_line_make_purchase_requisition.py b/purchase_request_to_requisition/wizard/purchase_request_line_make_purchase_requisition.py index af31ed75af4..201e019740a 100644 --- a/purchase_request_to_requisition/wizard/purchase_request_line_make_purchase_requisition.py +++ b/purchase_request_to_requisition/wizard/purchase_request_line_make_purchase_requisition.py @@ -1,21 +1,19 @@ # Copyright 2016 Eficent Business and IT Consulting Services S.L. # License LGPL-3.0 or later (http://www.gnu.org/licenses/lgpl-3.0). -import openerp.addons.decimal_precision as dp -from openerp import api, exceptions, fields, models -from openerp.tools.translate import _ +from odoo import _, api, exceptions, fields, models class PurchaseRequestLineMakePurchaseRequisition(models.TransientModel): _name = "purchase.request.line.make.purchase.requisition" - _description = "Purchase Request Line Make Purchase Requisition" + _description = "Purchase Request Line Make Purchase Agreement" item_ids = fields.One2many( "purchase.request.line.make.purchase.requisition.item", "wiz_id", string="Items" ) purchase_requisition_id = fields.Many2one( "purchase.requisition", - string="Purchase Requisition", + string="Purchase Agreement", required=False, domain=[("state", "=", "draft")], ) @@ -36,10 +34,19 @@ def default_get(self, fields): res = super(PurchaseRequestLineMakePurchaseRequisition, self).default_get( fields ) + + # By default, expect called from PR Line request_line_obj = self.env["purchase.request.line"] request_line_ids = self.env.context.get("active_ids") active_model = self.env.context.get("active_model") + # For case called from PR + if active_model == "purchase.request": + request_ids = self.env.context.get("active_ids") + requests = self.env["purchase.request"].browse(request_ids) + request_line_ids = requests.mapped("line_ids").ids + active_model = "purchase.request.line" + if not request_line_ids: return res assert active_model == "purchase.request.line", "Bad context propagation" @@ -68,6 +75,7 @@ def _prepare_purchase_requisition_line(self, pr, item): "product_uom_id": item.product_uom_id.id, "purchase_request_lines": [(4, item.line_id.id)], "account_analytic_id": item.line_id.analytic_account_id.id or False, + "analytic_tag_ids": item.line_id.analytic_tag_ids.ids or False, } @api.model @@ -77,10 +85,10 @@ def _get_requisition_line_search_domain(self, requisition, item): ("product_id", "=", item.product_id.id or False), ("product_uom_id", "=", item.product_uom_id.id or False), ("account_analytic_id", "=", item.line_id.analytic_account_id.id or False), + ("analytic_tag_ids", "=", item.line_id.analytic_tag_ids.ids or False), ] return vals - @api.multi def make_purchase_requisition(self): pr_obj = self.env["purchase.requisition"] pr_line_obj = self.env["purchase.requisition.line"] @@ -91,18 +99,18 @@ def make_purchase_requisition(self): for item in self.item_ids: line = item.line_id if item.product_qty <= 0.0: - raise exceptions.Warning(_("Enter a positive quantity.")) + raise exceptions.UserError(_("Enter a positive quantity.")) line_company_id = line.company_id and line.company_id.id or False if company_id is not False and line_company_id != company_id: - raise exceptions.Warning( - _("You have to select lines " "from the same company.") + raise exceptions.UserError( + _("You have to select lines from the same company.") ) else: company_id = line_company_id line_picking_type = line.request_id.picking_type_id if picking_type_id is not False and line_picking_type.id != picking_type_id: - raise exceptions.Warning( + raise exceptions.UserError( _("You have to select lines " "from the same picking type.") ) else: @@ -135,7 +143,7 @@ def make_purchase_requisition(self): return { "domain": "[('id','in', [" + ",".join(map(str, res)) + "])]", - "name": _("Purchase requisition"), + "name": _("Purchase Agreement"), "view_type": "form", "view_mode": "tree,form", "res_model": "purchase.requisition", @@ -147,7 +155,7 @@ def make_purchase_requisition(self): class PurchaseRequestLineMakePurchaseRequisitionItem(models.TransientModel): _name = "purchase.request.line.make.purchase.requisition.item" - _description = "Purchase Request Line Make Purchase Requisition Item" + _description = "Purchase Request Line Make Purchase Agreement Item" wiz_id = fields.Many2one( "purchase.request.line.make.purchase.requisition", @@ -157,10 +165,7 @@ class PurchaseRequestLineMakePurchaseRequisitionItem(models.TransientModel): readonly=True, ) line_id = fields.Many2one( - "purchase.request.line", - string="Purchase Request Line", - required=True, - readonly=True, + "purchase.request.line", string="Purchase Request Line", required=True, ) request_id = fields.Many2one( "purchase.request", @@ -171,9 +176,9 @@ class PurchaseRequestLineMakePurchaseRequisitionItem(models.TransientModel): product_id = fields.Many2one("product.product", string="Product") name = fields.Char(string="Description", required=True) product_qty = fields.Float( - string="Quantity to Bid", digits_compute=dp.get_precision("Product UoS") + string="Quantity to Bid", digits="Product Unit of Measure", ) - product_uom_id = fields.Many2one("product.uom", string="UoM") + product_uom_id = fields.Many2one("uom.uom", string="UoM") @api.onchange("product_id", "product_uom_id") def onchange_product_id(self): diff --git a/purchase_request_to_requisition/wizard/purchase_request_line_make_purchase_requisition_view.xml b/purchase_request_to_requisition/wizard/purchase_request_line_make_purchase_requisition_view.xml index 92dcdb6c82b..21ebe538798 100644 --- a/purchase_request_to_requisition/wizard/purchase_request_line_make_purchase_requisition_view.xml +++ b/purchase_request_to_requisition/wizard/purchase_request_line_make_purchase_requisition_view.xml @@ -1,18 +1,18 @@ - + - Purchase Request Line Make Purchase Requisition + Purchase Request Line Make Purchase Agreement purchase.request.line.make.purchase.requisition form -
    - + + @@ -30,53 +30,67 @@ - + - -