Merge PR #1054 into 14.0

Signed-off-by LoisRForgeFlow
This commit is contained in:
OCA-git-bot
2021-10-04 08:06:22 +00:00
25 changed files with 1513 additions and 0 deletions

View File

@@ -0,0 +1 @@
../../../../stock_orderpoint_manual_procurement

View File

@@ -0,0 +1,6 @@
import setuptools
setuptools.setup(
setup_requires=['setuptools-odoo'],
odoo_addon=True,
)

View File

@@ -0,0 +1,104 @@
===================================
Stock Orderpoint Manual Procurement
===================================
.. !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
!! 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%2Fstock--logistics--warehouse-lightgray.png?logo=github
:target: https://github.com/OCA/stock-logistics-warehouse/tree/14.0/stock_orderpoint_manual_procurement
:alt: OCA/stock-logistics-warehouse
.. |badge4| image:: https://img.shields.io/badge/weblate-Translate%20me-F47D42.png
:target: https://translation.odoo-community.org/projects/stock-logistics-warehouse-14-0/stock-logistics-warehouse-14-0-stock_orderpoint_manual_procurement
:alt: Translate me on Weblate
.. |badge5| image:: https://img.shields.io/badge/runbot-Try%20me-875A7B.png
:target: https://runbot.odoo-community.org/runbot/153/14.0
:alt: Try me on Runbot
|badge1| |badge2| |badge3| |badge4| |badge5|
This module allows users to manually start procurements from the list of reordering rules,
based on the quantity that is recommended to be procured.
**Table of contents**
.. contents::
:local:
Configuration
=============
If you want users to be able to change the recommended quantity to procure,
you should assign them to the security group
'Change quantity in manual procurements from reordering rules',
under 'Settings / Users / Users'.
Usage
=====
Go to 'Inventory > Master Data > Reordering Rules' and review the quantity recommended to be procured.
You can now start the procurement for a single or a list of reordering rules.
The recommended quantity to procure is adjusted to the
procurement unit of measure indicated in the reordering rule.
Bug Tracker
===========
Bugs are tracked on `GitHub Issues <https://github.com/OCA/stock-logistics-warehouse/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 <https://github.com/OCA/stock-logistics-warehouse/issues/new?body=module:%20stock_orderpoint_manual_procurement%0Aversion:%2014.0%0A%0A**Steps%20to%20reproduce**%0A-%20...%0A%0A**Current%20behavior**%0A%0A**Expected%20behavior**>`_.
Do not contact contributors directly about support or help with technical issues.
Credits
=======
Authors
~~~~~~~
* ForgeFlow
Contributors
~~~~~~~~~~~~
* Jordi Ballester Alomar <jordi.ballester@forgeflow.com>
* Lois Rilo Antelo <lois.rilo@forgeflow.com>
* Bhavesh Odedra <bodedra@opensourceintegrators.com>
* Kitti Upariphutthiphong <kittiu@ecosoft.co.th>
* Joan Sisquella Andrés <joan.sisquella@forgeflow.com>
* `Trobz <https://trobz.com>`_:
* Dung Tran <dungtd@trobz.com>
Other credits
~~~~~~~~~~~~~
The migration of this module from 13.0 to 14.0 was financially supported by Camptocamp
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/stock-logistics-warehouse <https://github.com/OCA/stock-logistics-warehouse/tree/14.0/stock_orderpoint_manual_procurement>`_ project on GitHub.
You are welcome to contribute. To learn how please visit https://odoo-community.org/page/Contribute.

View File

@@ -0,0 +1,4 @@
# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl.html).
from . import models
from . import wizards

View File

@@ -0,0 +1,23 @@
# Copyright 2016-20 ForgeFlow S.L. (https://www.forgeflow.com)
# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl.html).
{
"name": "Stock Orderpoint Manual Procurement",
"summary": "Allows to create procurement orders from orderpoints instead "
"of relying only on the scheduler.",
"version": "14.0.1.0.0",
"author": "ForgeFlow, Odoo Community Association (OCA)",
"website": "https://github.com/OCA/stock-logistics-warehouse",
"category": "Warehouse Management",
"depends": ["purchase_stock"],
"demo": ["demo/product.xml"],
"data": [
"security/ir.model.access.csv",
"security/stock_orderpoint_manual_procurement_security.xml",
"wizards/make_procurement_orderpoint_view.xml",
"views/stock_warehouse_orderpoint_view.xml",
],
"license": "AGPL-3",
"installable": True,
"application": False,
}

View File

@@ -0,0 +1,10 @@
<?xml version="1.0" ?>
<odoo noupdate="1">
<record id="product_supplierinfo_product_7" model="product.supplierinfo">
<field name="product_tmpl_id" ref="product.product_product_7" />
<field name="name" ref="base.res_partner_3" />
<field name="delay">3</field>
<field name="min_qty">1</field>
<field name="price">72</field>
</record>
</odoo>

View File

@@ -0,0 +1,190 @@
# Translation of Odoo Server.
# This file contains the translation of the following modules:
# * stock_orderpoint_manual_procurement
#
msgid ""
msgstr ""
"Project-Id-Version: Odoo Server 13.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: stock_orderpoint_manual_procurement
#: model_terms:ir.ui.view,arch_db:stock_orderpoint_manual_procurement.view_make_procure_without_security
#: model_terms:ir.ui.view,arch_db:stock_orderpoint_manual_procurement.view_make_procurment_buffer_wizard
msgid "Cancel"
msgstr ""
#. module: stock_orderpoint_manual_procurement
#: model:res.groups,name:stock_orderpoint_manual_procurement.group_change_orderpoint_procure_qty
msgid "Change quantity in manual procurements from reordering rules"
msgstr ""
#. module: stock_orderpoint_manual_procurement
#: model_terms:ir.ui.view,arch_db:stock_orderpoint_manual_procurement.view_warehouse_orderpoint_tree
msgid "Create Procurement"
msgstr ""
#. module: stock_orderpoint_manual_procurement
#: model:ir.model.fields,field_description:stock_orderpoint_manual_procurement.field_make_procurement_orderpoint__create_uid
#: model:ir.model.fields,field_description:stock_orderpoint_manual_procurement.field_make_procurement_orderpoint_item__create_uid
msgid "Created by"
msgstr ""
#. module: stock_orderpoint_manual_procurement
#: model:ir.model.fields,field_description:stock_orderpoint_manual_procurement.field_make_procurement_orderpoint__create_date
#: model:ir.model.fields,field_description:stock_orderpoint_manual_procurement.field_make_procurement_orderpoint_item__create_date
msgid "Created on"
msgstr ""
#. module: stock_orderpoint_manual_procurement
#: model:ir.model.fields,field_description:stock_orderpoint_manual_procurement.field_make_procurement_orderpoint__display_name
#: model:ir.model.fields,field_description:stock_orderpoint_manual_procurement.field_make_procurement_orderpoint_item__display_name
msgid "Display Name"
msgstr ""
#. module: stock_orderpoint_manual_procurement
#: model_terms:ir.ui.view,arch_db:stock_orderpoint_manual_procurement.view_make_procure_without_security
#: model_terms:ir.ui.view,arch_db:stock_orderpoint_manual_procurement.view_make_procurment_buffer_wizard
msgid "Execute"
msgstr ""
#. module: stock_orderpoint_manual_procurement
#: model:ir.model.fields,field_description:stock_orderpoint_manual_procurement.field_make_procurement_orderpoint__id
#: model:ir.model.fields,field_description:stock_orderpoint_manual_procurement.field_make_procurement_orderpoint_item__id
msgid "ID"
msgstr ""
#. module: stock_orderpoint_manual_procurement
#: model:ir.model.fields,field_description:stock_orderpoint_manual_procurement.field_make_procurement_orderpoint__item_ids
#: model_terms:ir.ui.view,arch_db:stock_orderpoint_manual_procurement.view_make_procure_without_security
#: model_terms:ir.ui.view,arch_db:stock_orderpoint_manual_procurement.view_make_procurment_buffer_wizard
msgid "Items"
msgstr ""
#. module: stock_orderpoint_manual_procurement
#: model:ir.model.fields,field_description:stock_orderpoint_manual_procurement.field_make_procurement_orderpoint____last_update
#: model:ir.model.fields,field_description:stock_orderpoint_manual_procurement.field_make_procurement_orderpoint_item____last_update
msgid "Last Modified on"
msgstr ""
#. module: stock_orderpoint_manual_procurement
#: model:ir.model.fields,field_description:stock_orderpoint_manual_procurement.field_make_procurement_orderpoint__write_uid
#: model:ir.model.fields,field_description:stock_orderpoint_manual_procurement.field_make_procurement_orderpoint_item__write_uid
msgid "Last Updated by"
msgstr ""
#. module: stock_orderpoint_manual_procurement
#: model:ir.model.fields,field_description:stock_orderpoint_manual_procurement.field_make_procurement_orderpoint__write_date
#: model:ir.model.fields,field_description:stock_orderpoint_manual_procurement.field_make_procurement_orderpoint_item__write_date
msgid "Last Updated on"
msgstr ""
#. module: stock_orderpoint_manual_procurement
#: model:ir.model.fields,field_description:stock_orderpoint_manual_procurement.field_make_procurement_orderpoint_item__location_id
msgid "Location"
msgstr ""
#. module: stock_orderpoint_manual_procurement
#: model:ir.model,name:stock_orderpoint_manual_procurement.model_make_procurement_orderpoint_item
msgid "Make Procurements from Orderpoint Item"
msgstr ""
#. module: stock_orderpoint_manual_procurement
#: model:ir.model,name:stock_orderpoint_manual_procurement.model_make_procurement_orderpoint
msgid "Make Procurements from Orderpoints"
msgstr ""
#. module: stock_orderpoint_manual_procurement
#: model:ir.model,name:stock_orderpoint_manual_procurement.model_stock_warehouse_orderpoint
msgid "Minimum Inventory Rule"
msgstr ""
#. module: stock_orderpoint_manual_procurement
#: code:addons/stock_orderpoint_manual_procurement/wizards/make_procurement_orderpoint.py:0
#, python-format
msgid "No reordering rule found!"
msgstr ""
#. module: stock_orderpoint_manual_procurement
#: model:ir.model.fields,field_description:stock_orderpoint_manual_procurement.field_make_procurement_orderpoint_item__date_planned
msgid "Planned Date"
msgstr ""
#. module: stock_orderpoint_manual_procurement
#: model:ir.model.fields,field_description:stock_orderpoint_manual_procurement.field_stock_warehouse_orderpoint__procure_recommended_qty
#: model:ir.model.fields,field_description:stock_orderpoint_manual_procurement.field_stock_warehouse_orderpoint_template__procure_recommended_qty
msgid "Procure Recommendation"
msgstr ""
#. module: stock_orderpoint_manual_procurement
#: model_terms:ir.ui.view,arch_db:stock_orderpoint_manual_procurement.view_make_procure_without_security
#: model_terms:ir.ui.view,arch_db:stock_orderpoint_manual_procurement.view_make_procurment_buffer_wizard
msgid "Procurement Request"
msgstr ""
#. module: stock_orderpoint_manual_procurement
#: model:ir.model.fields,field_description:stock_orderpoint_manual_procurement.field_make_procurement_orderpoint_item__product_id
msgid "Product"
msgstr ""
#. module: stock_orderpoint_manual_procurement
#: model:ir.model.fields,field_description:stock_orderpoint_manual_procurement.field_make_procurement_orderpoint_item__qty
msgid "Qty"
msgstr ""
#. module: stock_orderpoint_manual_procurement
#: model:ir.model.fields,field_description:stock_orderpoint_manual_procurement.field_make_procurement_orderpoint_item__qty_without_security
msgid "Quantity"
msgstr ""
#. module: stock_orderpoint_manual_procurement
#: code:addons/stock_orderpoint_manual_procurement/wizards/make_procurement_orderpoint.py:0
#, python-format
msgid "Quantity must be positive."
msgstr ""
#. module: stock_orderpoint_manual_procurement
#: model:ir.model.fields,field_description:stock_orderpoint_manual_procurement.field_stock_warehouse_orderpoint__procure_recommended_date
#: model:ir.model.fields,field_description:stock_orderpoint_manual_procurement.field_stock_warehouse_orderpoint_template__procure_recommended_date
msgid "Recommended Request Date"
msgstr ""
#. module: stock_orderpoint_manual_procurement
#: model:ir.model.fields,field_description:stock_orderpoint_manual_procurement.field_make_procurement_orderpoint_item__orderpoint_id
msgid "Reordering rule"
msgstr ""
#. module: stock_orderpoint_manual_procurement
#: model:ir.actions.act_window,name:stock_orderpoint_manual_procurement.act_make_procurement_from_orderpoint
msgid "Request Procurement"
msgstr ""
#. module: stock_orderpoint_manual_procurement
#: model:ir.model.fields,field_description:stock_orderpoint_manual_procurement.field_make_procurement_orderpoint_item__uom_id
msgid "Unit of Measure"
msgstr ""
#. module: stock_orderpoint_manual_procurement
#: model_terms:ir.ui.view,arch_db:stock_orderpoint_manual_procurement.view_make_procure_without_security
#: model_terms:ir.ui.view,arch_db:stock_orderpoint_manual_procurement.view_make_procurment_buffer_wizard
msgid ""
"Use this assistant to generate a procurement request for this\n"
" stock buffer. According to the product configuration,\n"
" this may trigger a draft purchase order, a manufacturing\n"
" order or a transfer picking."
msgstr ""
#. module: stock_orderpoint_manual_procurement
#: model:ir.model.fields,field_description:stock_orderpoint_manual_procurement.field_make_procurement_orderpoint_item__warehouse_id
msgid "Warehouse"
msgstr ""
#. module: stock_orderpoint_manual_procurement
#: model:ir.model.fields,field_description:stock_orderpoint_manual_procurement.field_make_procurement_orderpoint_item__wiz_id
msgid "Wizard"
msgstr ""

View File

@@ -0,0 +1,196 @@
# Translation of Odoo Server.
# This file contains the translation of the following modules:
# * stock_orderpoint_manual_procurement
#
msgid ""
msgstr ""
"Project-Id-Version: Odoo Server 12.0\n"
"Report-Msgid-Bugs-To: \n"
"PO-Revision-Date: 2019-10-12 16:36+0000\n"
"Last-Translator: 黎伟杰 <674416404@qq.com>\n"
"Language-Team: none\n"
"Language: zh_CN\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: \n"
"Plural-Forms: nplurals=1; plural=0;\n"
"X-Generator: Weblate 3.8\n"
#. module: stock_orderpoint_manual_procurement
#: model_terms:ir.ui.view,arch_db:stock_orderpoint_manual_procurement.view_make_procure_without_security
#: model_terms:ir.ui.view,arch_db:stock_orderpoint_manual_procurement.view_make_procurment_buffer_wizard
msgid "Cancel"
msgstr "取消"
#. module: stock_orderpoint_manual_procurement
#: model:res.groups,name:stock_orderpoint_manual_procurement.group_change_orderpoint_procure_qty
msgid "Change quantity in manual procurements from reordering rules"
msgstr "从重新订购规则更改手动采购的数量"
#. module: stock_orderpoint_manual_procurement
#: model_terms:ir.ui.view,arch_db:stock_orderpoint_manual_procurement.view_warehouse_orderpoint_tree
msgid "Create Procurement"
msgstr "创建补货"
#. module: stock_orderpoint_manual_procurement
#: model:ir.model.fields,field_description:stock_orderpoint_manual_procurement.field_make_procurement_orderpoint__create_uid
#: model:ir.model.fields,field_description:stock_orderpoint_manual_procurement.field_make_procurement_orderpoint_item__create_uid
msgid "Created by"
msgstr "创建者"
#. module: stock_orderpoint_manual_procurement
#: model:ir.model.fields,field_description:stock_orderpoint_manual_procurement.field_make_procurement_orderpoint__create_date
#: model:ir.model.fields,field_description:stock_orderpoint_manual_procurement.field_make_procurement_orderpoint_item__create_date
msgid "Created on"
msgstr "创建时间"
#. module: stock_orderpoint_manual_procurement
#: model:ir.model.fields,field_description:stock_orderpoint_manual_procurement.field_make_procurement_orderpoint__display_name
#: model:ir.model.fields,field_description:stock_orderpoint_manual_procurement.field_make_procurement_orderpoint_item__display_name
msgid "Display Name"
msgstr "显示名称"
#. module: stock_orderpoint_manual_procurement
#: model_terms:ir.ui.view,arch_db:stock_orderpoint_manual_procurement.view_make_procure_without_security
#: model_terms:ir.ui.view,arch_db:stock_orderpoint_manual_procurement.view_make_procurment_buffer_wizard
msgid "Execute"
msgstr "执行"
#. module: stock_orderpoint_manual_procurement
#: model:ir.model.fields,field_description:stock_orderpoint_manual_procurement.field_make_procurement_orderpoint__id
#: model:ir.model.fields,field_description:stock_orderpoint_manual_procurement.field_make_procurement_orderpoint_item__id
msgid "ID"
msgstr "ID"
#. module: stock_orderpoint_manual_procurement
#: model:ir.model.fields,field_description:stock_orderpoint_manual_procurement.field_make_procurement_orderpoint__item_ids
#: model_terms:ir.ui.view,arch_db:stock_orderpoint_manual_procurement.view_make_procure_without_security
#: model_terms:ir.ui.view,arch_db:stock_orderpoint_manual_procurement.view_make_procurment_buffer_wizard
msgid "Items"
msgstr "项"
#. module: stock_orderpoint_manual_procurement
#: model:ir.model.fields,field_description:stock_orderpoint_manual_procurement.field_make_procurement_orderpoint____last_update
#: model:ir.model.fields,field_description:stock_orderpoint_manual_procurement.field_make_procurement_orderpoint_item____last_update
msgid "Last Modified on"
msgstr "最后修改时间"
#. module: stock_orderpoint_manual_procurement
#: model:ir.model.fields,field_description:stock_orderpoint_manual_procurement.field_make_procurement_orderpoint__write_uid
#: model:ir.model.fields,field_description:stock_orderpoint_manual_procurement.field_make_procurement_orderpoint_item__write_uid
msgid "Last Updated by"
msgstr "最后更新者"
#. module: stock_orderpoint_manual_procurement
#: model:ir.model.fields,field_description:stock_orderpoint_manual_procurement.field_make_procurement_orderpoint__write_date
#: model:ir.model.fields,field_description:stock_orderpoint_manual_procurement.field_make_procurement_orderpoint_item__write_date
msgid "Last Updated on"
msgstr "最后更新时间"
#. module: stock_orderpoint_manual_procurement
#: model:ir.model.fields,field_description:stock_orderpoint_manual_procurement.field_make_procurement_orderpoint_item__location_id
msgid "Location"
msgstr "位置"
#. module: stock_orderpoint_manual_procurement
#: model:ir.model,name:stock_orderpoint_manual_procurement.model_make_procurement_orderpoint_item
msgid "Make Procurements from Orderpoint Item"
msgstr "从订单点项进行补货"
#. module: stock_orderpoint_manual_procurement
#: model:ir.model,name:stock_orderpoint_manual_procurement.model_make_procurement_orderpoint
msgid "Make Procurements from Orderpoints"
msgstr "从订单点项进行补货"
#. module: stock_orderpoint_manual_procurement
#: model:ir.model,name:stock_orderpoint_manual_procurement.model_stock_warehouse_orderpoint
msgid "Minimum Inventory Rule"
msgstr "最小库存规则"
#. module: stock_orderpoint_manual_procurement
#: code:addons/stock_orderpoint_manual_procurement/wizards/make_procurement_orderpoint.py:0
#, python-format
msgid "No reordering rule found!"
msgstr "找不到重新订购规则!"
#. module: stock_orderpoint_manual_procurement
#: model:ir.model.fields,field_description:stock_orderpoint_manual_procurement.field_make_procurement_orderpoint_item__date_planned
msgid "Planned Date"
msgstr "计划日期"
#. module: stock_orderpoint_manual_procurement
#: model:ir.model.fields,field_description:stock_orderpoint_manual_procurement.field_stock_warehouse_orderpoint__procure_recommended_qty
#: model:ir.model.fields,field_description:stock_orderpoint_manual_procurement.field_stock_warehouse_orderpoint_template__procure_recommended_qty
msgid "Procure Recommendation"
msgstr "获取推荐"
#. module: stock_orderpoint_manual_procurement
#: model_terms:ir.ui.view,arch_db:stock_orderpoint_manual_procurement.view_make_procure_without_security
#: model_terms:ir.ui.view,arch_db:stock_orderpoint_manual_procurement.view_make_procurment_buffer_wizard
msgid "Procurement Request"
msgstr "补货请求"
#. module: stock_orderpoint_manual_procurement
#: model:ir.model.fields,field_description:stock_orderpoint_manual_procurement.field_make_procurement_orderpoint_item__product_id
msgid "Product"
msgstr "产品"
#. module: stock_orderpoint_manual_procurement
#: model:ir.model.fields,field_description:stock_orderpoint_manual_procurement.field_make_procurement_orderpoint_item__qty
msgid "Qty"
msgstr "数量"
#. module: stock_orderpoint_manual_procurement
#: model:ir.model.fields,field_description:stock_orderpoint_manual_procurement.field_make_procurement_orderpoint_item__qty_without_security
msgid "Quantity"
msgstr "数量"
#. module: stock_orderpoint_manual_procurement
#: code:addons/stock_orderpoint_manual_procurement/wizards/make_procurement_orderpoint.py:0
#, python-format
msgid "Quantity must be positive."
msgstr "数量必须为正数。"
#. module: stock_orderpoint_manual_procurement
#: model:ir.model.fields,field_description:stock_orderpoint_manual_procurement.field_stock_warehouse_orderpoint__procure_recommended_date
#: model:ir.model.fields,field_description:stock_orderpoint_manual_procurement.field_stock_warehouse_orderpoint_template__procure_recommended_date
msgid "Recommended Request Date"
msgstr "引用请求日期"
#. module: stock_orderpoint_manual_procurement
#: model:ir.model.fields,field_description:stock_orderpoint_manual_procurement.field_make_procurement_orderpoint_item__orderpoint_id
msgid "Reordering rule"
msgstr "重新订购规则"
#. module: stock_orderpoint_manual_procurement
#: model:ir.actions.act_window,name:stock_orderpoint_manual_procurement.act_make_procurement_from_orderpoint
msgid "Request Procurement"
msgstr "请求补货"
#. module: stock_orderpoint_manual_procurement
#: model:ir.model.fields,field_description:stock_orderpoint_manual_procurement.field_make_procurement_orderpoint_item__uom_id
msgid "Unit of Measure"
msgstr "计量单位"
#. module: stock_orderpoint_manual_procurement
#: model_terms:ir.ui.view,arch_db:stock_orderpoint_manual_procurement.view_make_procure_without_security
#: model_terms:ir.ui.view,arch_db:stock_orderpoint_manual_procurement.view_make_procurment_buffer_wizard
msgid ""
"Use this assistant to generate a procurement request for this\n"
" stock buffer. According to the product configuration,\n"
" this may trigger a draft purchase order, a "
"manufacturing\n"
" order or a transfer picking."
msgstr ""
"使用此助手为此库存缓冲区生成采购请求。根据产品配置,这可能会触发采购订单草"
"案、生产订单或转移领料。"
#. module: stock_orderpoint_manual_procurement
#: model:ir.model.fields,field_description:stock_orderpoint_manual_procurement.field_make_procurement_orderpoint_item__warehouse_id
msgid "Warehouse"
msgstr "仓库"
#. module: stock_orderpoint_manual_procurement
#: model:ir.model.fields,field_description:stock_orderpoint_manual_procurement.field_make_procurement_orderpoint_item__wiz_id
msgid "Wizard"
msgstr "向导"

View File

@@ -0,0 +1,3 @@
# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl.html).
from . import stock_warehouse_orderpoint

View File

@@ -0,0 +1,59 @@
# Copyright 2016-20 ForgeFlow S.L. (https://www.forgeflow.com)
# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl.html).
from odoo import api, fields, models
from odoo.tools import float_compare, float_round
class StockWarehouseOrderpoint(models.Model):
_inherit = "stock.warehouse.orderpoint"
procure_recommended_qty = fields.Float(
string="Procure Recommendation",
compute="_compute_procure_recommended",
digits="Product Unit of Measure",
)
procure_recommended_date = fields.Date(
string="Recommended Request Date", compute="_compute_procure_recommended"
)
def _get_procure_recommended_qty(self, virtual_qty, op_qtys):
self.ensure_one()
procure_recommended_qty = 0.0
qty = max(self.product_min_qty, self.product_max_qty) - virtual_qty
remainder = self.qty_multiple > 0 and qty % self.qty_multiple or 0.0
if (
float_compare(remainder, 0.0, precision_rounding=self.product_uom.rounding)
> 0
):
qty += self.qty_multiple - remainder
if float_compare(qty, 0.0, precision_rounding=self.product_uom.rounding) <= 0:
return procure_recommended_qty
qty -= op_qtys[self.id]
qty_rounded = float_round(qty, precision_rounding=self.product_uom.rounding)
if qty_rounded > 0:
procure_recommended_qty = qty_rounded
return procure_recommended_qty
@api.depends("product_min_qty", "product_id", "qty_multiple")
def _compute_procure_recommended(self):
op_qtys = self._quantity_in_progress()
for op in self:
qty = 0.0
virtual_qty = op.with_context(
location=op.location_id.id
).product_id.virtual_available
if (
float_compare(
virtual_qty,
op.product_min_qty,
precision_rounding=op.product_uom.rounding or 0.01,
)
< 0
):
qty = op._get_procure_recommended_qty(virtual_qty, op_qtys)
op.procure_recommended_qty = qty
op.procure_recommended_date = op.lead_days_date

View File

@@ -0,0 +1,4 @@
If you want users to be able to change the recommended quantity to procure,
you should assign them to the security group
'Change quantity in manual procurements from reordering rules',
under 'Settings / Users / Users'.

View File

@@ -0,0 +1,9 @@
* Jordi Ballester Alomar <jordi.ballester@forgeflow.com>
* Lois Rilo Antelo <lois.rilo@forgeflow.com>
* Bhavesh Odedra <bodedra@opensourceintegrators.com>
* Kitti Upariphutthiphong <kittiu@ecosoft.co.th>
* Joan Sisquella Andrés <joan.sisquella@forgeflow.com>
* `Trobz <https://trobz.com>`_:
* Dung Tran <dungtd@trobz.com>

View File

@@ -0,0 +1 @@
The migration of this module from 13.0 to 14.0 was financially supported by Camptocamp

View File

@@ -0,0 +1,2 @@
This module allows users to manually start procurements from the list of reordering rules,
based on the quantity that is recommended to be procured.

View File

@@ -0,0 +1,5 @@
Go to 'Inventory > Master Data > Reordering Rules' and review the quantity recommended to be procured.
You can now start the procurement for a single or a list of reordering rules.
The recommended quantity to procure is adjusted to the
procurement unit of measure indicated in the reordering rule.

View File

@@ -0,0 +1,3 @@
id,name,model_id:id,group_id:id,perm_read,perm_write,perm_create,perm_unlink
access_make_procurement_orderpoint_wizard,make.procurement.orderpoint wizard,model_make_procurement_orderpoint,stock.group_stock_user,1,1,1,1
access_make_procurement_orderpoint_item_wizard,make.procurement.orderpoint.item wizard,model_make_procurement_orderpoint_item,stock.group_stock_user,1,1,1,1
1 id name model_id:id group_id:id perm_read perm_write perm_create perm_unlink
2 access_make_procurement_orderpoint_wizard make.procurement.orderpoint wizard model_make_procurement_orderpoint stock.group_stock_user 1 1 1 1
3 access_make_procurement_orderpoint_item_wizard make.procurement.orderpoint.item wizard model_make_procurement_orderpoint_item stock.group_stock_user 1 1 1 1

View File

@@ -0,0 +1,12 @@
<?xml version="1.0" ?>
<odoo noupdate="1">
<record id="group_change_orderpoint_procure_qty" model="res.groups">
<field
name="name"
>Change quantity in manual procurements from reordering rules</field>
<field name="implied_ids" eval="[(4, ref('base.group_user'))]" />
<field name="category_id" ref="base.module_category_hidden" />
</record>
</odoo>

Binary file not shown.

After

Width:  |  Height:  |  Size: 9.2 KiB

View File

@@ -0,0 +1,449 @@
<?xml version="1.0" encoding="utf-8" ?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<meta name="generator" content="Docutils 0.15.1: http://docutils.sourceforge.net/" />
<title>Stock Orderpoint Manual Procurement</title>
<style type="text/css">
/*
:Author: David Goodger (goodger@python.org)
:Id: $Id: html4css1.css 7952 2016-07-26 18:15:59Z milde $
:Copyright: This stylesheet has been placed in the public domain.
Default cascading style sheet for the HTML output of Docutils.
See http://docutils.sf.net/docs/howto/html-stylesheets.html for how to
customize this style sheet.
*/
/* used to remove borders from tables and images */
.borderless, table.borderless td, table.borderless th {
border: 0 }
table.borderless td, table.borderless th {
/* Override padding for "table.docutils td" with "! important".
The right padding separates the table cells. */
padding: 0 0.5em 0 0 ! important }
.first {
/* Override more specific margin styles with "! important". */
margin-top: 0 ! important }
.last, .with-subtitle {
margin-bottom: 0 ! important }
.hidden {
display: none }
.subscript {
vertical-align: sub;
font-size: smaller }
.superscript {
vertical-align: super;
font-size: smaller }
a.toc-backref {
text-decoration: none ;
color: black }
blockquote.epigraph {
margin: 2em 5em ; }
dl.docutils dd {
margin-bottom: 0.5em }
object[type="image/svg+xml"], object[type="application/x-shockwave-flash"] {
overflow: hidden;
}
/* Uncomment (and remove this text!) to get bold-faced definition list terms
dl.docutils dt {
font-weight: bold }
*/
div.abstract {
margin: 2em 5em }
div.abstract p.topic-title {
font-weight: bold ;
text-align: center }
div.admonition, div.attention, div.caution, div.danger, div.error,
div.hint, div.important, div.note, div.tip, div.warning {
margin: 2em ;
border: medium outset ;
padding: 1em }
div.admonition p.admonition-title, div.hint p.admonition-title,
div.important p.admonition-title, div.note p.admonition-title,
div.tip p.admonition-title {
font-weight: bold ;
font-family: sans-serif }
div.attention p.admonition-title, div.caution p.admonition-title,
div.danger p.admonition-title, div.error p.admonition-title,
div.warning p.admonition-title, .code .error {
color: red ;
font-weight: bold ;
font-family: sans-serif }
/* Uncomment (and remove this text!) to get reduced vertical space in
compound paragraphs.
div.compound .compound-first, div.compound .compound-middle {
margin-bottom: 0.5em }
div.compound .compound-last, div.compound .compound-middle {
margin-top: 0.5em }
*/
div.dedication {
margin: 2em 5em ;
text-align: center ;
font-style: italic }
div.dedication p.topic-title {
font-weight: bold ;
font-style: normal }
div.figure {
margin-left: 2em ;
margin-right: 2em }
div.footer, div.header {
clear: both;
font-size: smaller }
div.line-block {
display: block ;
margin-top: 1em ;
margin-bottom: 1em }
div.line-block div.line-block {
margin-top: 0 ;
margin-bottom: 0 ;
margin-left: 1.5em }
div.sidebar {
margin: 0 0 0.5em 1em ;
border: medium outset ;
padding: 1em ;
background-color: #ffffee ;
width: 40% ;
float: right ;
clear: right }
div.sidebar p.rubric {
font-family: sans-serif ;
font-size: medium }
div.system-messages {
margin: 5em }
div.system-messages h1 {
color: red }
div.system-message {
border: medium outset ;
padding: 1em }
div.system-message p.system-message-title {
color: red ;
font-weight: bold }
div.topic {
margin: 2em }
h1.section-subtitle, h2.section-subtitle, h3.section-subtitle,
h4.section-subtitle, h5.section-subtitle, h6.section-subtitle {
margin-top: 0.4em }
h1.title {
text-align: center }
h2.subtitle {
text-align: center }
hr.docutils {
width: 75% }
img.align-left, .figure.align-left, object.align-left, table.align-left {
clear: left ;
float: left ;
margin-right: 1em }
img.align-right, .figure.align-right, object.align-right, table.align-right {
clear: right ;
float: right ;
margin-left: 1em }
img.align-center, .figure.align-center, object.align-center {
display: block;
margin-left: auto;
margin-right: auto;
}
table.align-center {
margin-left: auto;
margin-right: auto;
}
.align-left {
text-align: left }
.align-center {
clear: both ;
text-align: center }
.align-right {
text-align: right }
/* reset inner alignment in figures */
div.align-right {
text-align: inherit }
/* div.align-center * { */
/* text-align: left } */
.align-top {
vertical-align: top }
.align-middle {
vertical-align: middle }
.align-bottom {
vertical-align: bottom }
ol.simple, ul.simple {
margin-bottom: 1em }
ol.arabic {
list-style: decimal }
ol.loweralpha {
list-style: lower-alpha }
ol.upperalpha {
list-style: upper-alpha }
ol.lowerroman {
list-style: lower-roman }
ol.upperroman {
list-style: upper-roman }
p.attribution {
text-align: right ;
margin-left: 50% }
p.caption {
font-style: italic }
p.credits {
font-style: italic ;
font-size: smaller }
p.label {
white-space: nowrap }
p.rubric {
font-weight: bold ;
font-size: larger ;
color: maroon ;
text-align: center }
p.sidebar-title {
font-family: sans-serif ;
font-weight: bold ;
font-size: larger }
p.sidebar-subtitle {
font-family: sans-serif ;
font-weight: bold }
p.topic-title {
font-weight: bold }
pre.address {
margin-bottom: 0 ;
margin-top: 0 ;
font: inherit }
pre.literal-block, pre.doctest-block, pre.math, pre.code {
margin-left: 2em ;
margin-right: 2em }
pre.code .ln { color: grey; } /* line numbers */
pre.code, code { background-color: #eeeeee }
pre.code .comment, code .comment { color: #5C6576 }
pre.code .keyword, code .keyword { color: #3B0D06; font-weight: bold }
pre.code .literal.string, code .literal.string { color: #0C5404 }
pre.code .name.builtin, code .name.builtin { color: #352B84 }
pre.code .deleted, code .deleted { background-color: #DEB0A1}
pre.code .inserted, code .inserted { background-color: #A3D289}
span.classifier {
font-family: sans-serif ;
font-style: oblique }
span.classifier-delimiter {
font-family: sans-serif ;
font-weight: bold }
span.interpreted {
font-family: sans-serif }
span.option {
white-space: nowrap }
span.pre {
white-space: pre }
span.problematic {
color: red }
span.section-subtitle {
/* font-size relative to parent (h1..h6 element) */
font-size: 80% }
table.citation {
border-left: solid 1px gray;
margin-left: 1px }
table.docinfo {
margin: 2em 4em }
table.docutils {
margin-top: 0.5em ;
margin-bottom: 0.5em }
table.footnote {
border-left: solid 1px black;
margin-left: 1px }
table.docutils td, table.docutils th,
table.docinfo td, table.docinfo th {
padding-left: 0.5em ;
padding-right: 0.5em ;
vertical-align: top }
table.docutils th.field-name, table.docinfo th.docinfo-name {
font-weight: bold ;
text-align: left ;
white-space: nowrap ;
padding-left: 0 }
/* "booktabs" style (no vertical lines) */
table.docutils.booktabs {
border: 0px;
border-top: 2px solid;
border-bottom: 2px solid;
border-collapse: collapse;
}
table.docutils.booktabs * {
border: 0px;
}
table.docutils.booktabs th {
border-bottom: thin solid;
text-align: left;
}
h1 tt.docutils, h2 tt.docutils, h3 tt.docutils,
h4 tt.docutils, h5 tt.docutils, h6 tt.docutils {
font-size: 100% }
ul.auto-toc {
list-style-type: none }
</style>
</head>
<body>
<div class="document" id="stock-orderpoint-manual-procurement">
<h1 class="title">Stock Orderpoint Manual Procurement</h1>
<!-- !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
!! This file is generated by oca-gen-addon-readme !!
!! changes will be overwritten. !!
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! -->
<p><a class="reference external" href="https://odoo-community.org/page/development-status"><img alt="Beta" src="https://img.shields.io/badge/maturity-Beta-yellow.png" /></a> <a class="reference external" href="http://www.gnu.org/licenses/agpl-3.0-standalone.html"><img alt="License: AGPL-3" src="https://img.shields.io/badge/licence-AGPL--3-blue.png" /></a> <a class="reference external" href="https://github.com/OCA/stock-logistics-warehouse/tree/14.0/stock_orderpoint_manual_procurement"><img alt="OCA/stock-logistics-warehouse" src="https://img.shields.io/badge/github-OCA%2Fstock--logistics--warehouse-lightgray.png?logo=github" /></a> <a class="reference external" href="https://translation.odoo-community.org/projects/stock-logistics-warehouse-14-0/stock-logistics-warehouse-14-0-stock_orderpoint_manual_procurement"><img alt="Translate me on Weblate" src="https://img.shields.io/badge/weblate-Translate%20me-F47D42.png" /></a> <a class="reference external" href="https://runbot.odoo-community.org/runbot/153/14.0"><img alt="Try me on Runbot" src="https://img.shields.io/badge/runbot-Try%20me-875A7B.png" /></a></p>
<p>This module allows users to manually start procurements from the list of reordering rules,
based on the quantity that is recommended to be procured.</p>
<p><strong>Table of contents</strong></p>
<div class="contents local topic" id="contents">
<ul class="simple">
<li><a class="reference internal" href="#configuration" id="id1">Configuration</a></li>
<li><a class="reference internal" href="#usage" id="id2">Usage</a></li>
<li><a class="reference internal" href="#bug-tracker" id="id3">Bug Tracker</a></li>
<li><a class="reference internal" href="#credits" id="id4">Credits</a><ul>
<li><a class="reference internal" href="#authors" id="id5">Authors</a></li>
<li><a class="reference internal" href="#contributors" id="id6">Contributors</a></li>
<li><a class="reference internal" href="#other-credits" id="id7">Other credits</a></li>
<li><a class="reference internal" href="#maintainers" id="id8">Maintainers</a></li>
</ul>
</li>
</ul>
</div>
<div class="section" id="configuration">
<h1><a class="toc-backref" href="#id1">Configuration</a></h1>
<p>If you want users to be able to change the recommended quantity to procure,
you should assign them to the security group
Change quantity in manual procurements from reordering rules,
under Settings / Users / Users.</p>
</div>
<div class="section" id="usage">
<h1><a class="toc-backref" href="#id2">Usage</a></h1>
<p>Go to Inventory &gt; Master Data &gt; Reordering Rules and review the quantity recommended to be procured.
You can now start the procurement for a single or a list of reordering rules.</p>
<p>The recommended quantity to procure is adjusted to the
procurement unit of measure indicated in the reordering rule.</p>
</div>
<div class="section" id="bug-tracker">
<h1><a class="toc-backref" href="#id3">Bug Tracker</a></h1>
<p>Bugs are tracked on <a class="reference external" href="https://github.com/OCA/stock-logistics-warehouse/issues">GitHub Issues</a>.
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
<a class="reference external" href="https://github.com/OCA/stock-logistics-warehouse/issues/new?body=module:%20stock_orderpoint_manual_procurement%0Aversion:%2014.0%0A%0A**Steps%20to%20reproduce**%0A-%20...%0A%0A**Current%20behavior**%0A%0A**Expected%20behavior**">feedback</a>.</p>
<p>Do not contact contributors directly about support or help with technical issues.</p>
</div>
<div class="section" id="credits">
<h1><a class="toc-backref" href="#id4">Credits</a></h1>
<div class="section" id="authors">
<h2><a class="toc-backref" href="#id5">Authors</a></h2>
<ul class="simple">
<li>ForgeFlow</li>
</ul>
</div>
<div class="section" id="contributors">
<h2><a class="toc-backref" href="#id6">Contributors</a></h2>
<ul class="simple">
<li>Jordi Ballester Alomar &lt;<a class="reference external" href="mailto:jordi.ballester&#64;forgeflow.com">jordi.ballester&#64;forgeflow.com</a>&gt;</li>
<li>Lois Rilo Antelo &lt;<a class="reference external" href="mailto:lois.rilo&#64;forgeflow.com">lois.rilo&#64;forgeflow.com</a>&gt;</li>
<li>Bhavesh Odedra &lt;<a class="reference external" href="mailto:bodedra&#64;opensourceintegrators.com">bodedra&#64;opensourceintegrators.com</a>&gt;</li>
<li>Kitti Upariphutthiphong &lt;<a class="reference external" href="mailto:kittiu&#64;ecosoft.co.th">kittiu&#64;ecosoft.co.th</a>&gt;</li>
<li>Joan Sisquella Andrés &lt;<a class="reference external" href="mailto:joan.sisquella&#64;forgeflow.com">joan.sisquella&#64;forgeflow.com</a>&gt;</li>
<li><a class="reference external" href="https://trobz.com">Trobz</a>:<ul>
<li>Dung Tran &lt;<a class="reference external" href="mailto:dungtd&#64;trobz.com">dungtd&#64;trobz.com</a>&gt;</li>
</ul>
</li>
</ul>
</div>
<div class="section" id="other-credits">
<h2><a class="toc-backref" href="#id7">Other credits</a></h2>
<p>The migration of this module from 13.0 to 14.0 was financially supported by Camptocamp</p>
</div>
<div class="section" id="maintainers">
<h2><a class="toc-backref" href="#id8">Maintainers</a></h2>
<p>This module is maintained by the OCA.</p>
<a class="reference external image-reference" href="https://odoo-community.org"><img alt="Odoo Community Association" src="https://odoo-community.org/logo.png" /></a>
<p>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.</p>
<p>This module is part of the <a class="reference external" href="https://github.com/OCA/stock-logistics-warehouse/tree/14.0/stock_orderpoint_manual_procurement">OCA/stock-logistics-warehouse</a> project on GitHub.</p>
<p>You are welcome to contribute. To learn how please visit <a class="reference external" href="https://odoo-community.org/page/Contribute">https://odoo-community.org/page/Contribute</a>.</p>
</div>
</div>
</div>
</body>
</html>

View File

@@ -0,0 +1,3 @@
# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl.html).
from . import test_stock_orderpoint_manual_procurement

View File

@@ -0,0 +1,172 @@
# Copyright 2016-20 ForgeFlow S.L. (https://www.forgeflow.com)
# Copyright 2016 Serpent Consulting Services Pvt. Ltd.
# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl.html).
from datetime import timedelta
from odoo import fields
from odoo.tests import common
class TestStockWarehouseOrderpoint(common.TransactionCase):
def setUp(self):
super(TestStockWarehouseOrderpoint, self).setUp()
# Refs
self.group_stock_manager = self.env.ref("stock.group_stock_manager")
self.group_purchase_manager = self.env.ref("purchase.group_purchase_manager")
self.group_change_procure_qty = self.env.ref(
"stock_orderpoint_manual_procurement." "group_change_orderpoint_procure_qty"
)
self.company1 = self.env.ref("base.main_company")
# Get required Model
self.reordering_rule_model = self.env["stock.warehouse.orderpoint"]
self.product_model = self.env["product.product"]
self.purchase_model = self.env["purchase.order"]
self.purchase_line_model = self.env["purchase.order.line"]
self.user_model = self.env["res.users"]
self.product_ctg_model = self.env["product.category"]
self.stock_change_model = self.env["stock.change.product.qty"]
self.make_procurement_orderpoint_model = self.env["make.procurement.orderpoint"]
# Create users
self.user = self._create_user(
"user_1",
[
self.group_stock_manager,
self.group_change_procure_qty,
self.group_purchase_manager,
],
self.company1,
)
# Get required Model data
self.product_uom = self.env.ref("uom.product_uom_unit")
self.location = self.env.ref("stock.stock_location_stock")
self.product = self.env.ref("product.product_product_7")
# Create vendor and supplier info
test_seller = self.env["res.partner"].create({"name": "Test seller"})
self.vendor = self.env["product.supplierinfo"].create(
{"name": test_seller.id, "price": 8.0}
)
# Create Product category and Product
self.product_ctg = self._create_product_category()
self.product = self._create_product()
# Add default quantity
quantity = 20.00
self._update_product_qty(self.product, quantity)
# Create Reordering Rule
self.reorder = self.create_orderpoint()
def _create_user(self, login, groups, company):
""" Create a user."""
group_ids = [group.id for group in groups]
user = self.user_model.with_context({"no_reset_password": True}).create(
{
"name": "Test User",
"login": login,
"password": "demo",
"email": "test@yourcompany.com",
"company_id": company.id,
"company_ids": [(4, company.id)],
"groups_id": [(6, 0, group_ids)],
}
)
return user
def _create_product_category(self):
"""Create a Product Category."""
product_ctg = self.product_ctg_model.create({"name": "test_product_ctg"})
return product_ctg
def _create_product(self):
"""Create a Product."""
product = self.product_model.create(
{
"name": "Test Product",
"categ_id": self.product_ctg.id,
"type": "product",
"uom_id": self.product_uom.id,
"variant_seller_ids": [(6, 0, [self.vendor.id])],
}
)
return product
def _update_product_qty(self, product, quantity):
"""Update Product quantity."""
change_product_qty = self.stock_change_model.create(
{
"product_id": product.id,
"product_tmpl_id": product.product_tmpl_id.id,
"new_quantity": quantity,
}
)
change_product_qty.change_product_qty()
return change_product_qty
def create_orderpoint(self):
"""Create a Reordering Rule"""
reorder = self.reordering_rule_model.with_user(self.user).create(
{
"name": "Order-point",
"product_id": self.product.id,
"product_min_qty": "100",
"product_max_qty": "500",
"qty_multiple": "1",
}
)
return reorder
def create_orderpoint_procurement(self, manual_date=None):
"""Make Procurement from Reordering Rule"""
context = {
"active_model": "stock.warehouse.orderpoint",
"active_ids": self.reorder.ids,
"active_id": self.reorder.id,
}
wizard = (
self.make_procurement_orderpoint_model.with_user(self.user)
.with_context(context)
.create({})
)
if manual_date:
wizard.item_ids.write({"date_planned": manual_date})
wizard.make_procurement()
return wizard
def test_manual_procurement(self):
"""Test Manual Procurement created from Order-Point"""
# Create Manual Procurement from order-point procured quantity
self.create_orderpoint_procurement()
# As per route configuration, it will create Purchase order
# Assert that Procurement is created with the desired quantity
purchase = self.purchase_model.search([("origin", "ilike", self.reorder.name)])
self.assertEquals(len(purchase), 1)
purchase_line = self.purchase_line_model.search(
[("orderpoint_id", "=", self.reorder.id), ("order_id", "=", purchase.id)]
)
self.assertEquals(len(purchase_line), 1)
self.reorder._compute_procure_recommended()
self.assertNotEqual(
self.reorder.procure_recommended_qty, purchase_line.product_qty
)
self.assertEqual(purchase_line.product_qty, 480.0)
def test_manual_procurement_modified_date(self):
"""Test manual procurement created from an orderpoint with
modified date."""
manual_date = fields.Date.from_string(fields.Date.today()) + timedelta(days=30)
self.create_orderpoint_procurement(manual_date)
purchase = self.purchase_model.search([("origin", "ilike", self.reorder.name)])
purchase_line = self.purchase_line_model.search(
[("orderpoint_id", "=", self.reorder.id), ("order_id", "=", purchase.id)]
)
self.assertEquals(len(purchase_line), 1)
pol_date = fields.Date.from_string(purchase_line.date_planned)
self.assertEquals(pol_date, manual_date)

View File

@@ -0,0 +1,22 @@
<?xml version="1.0" ?>
<odoo>
<record id="view_warehouse_orderpoint_tree" model="ir.ui.view">
<field name="name">stock.warehouse.orderpoint.tree</field>
<field name="model">stock.warehouse.orderpoint</field>
<field name="inherit_id" ref="stock.view_warehouse_orderpoint_tree_editable" />
<field name="arch" type="xml">
<field name="product_uom_name" position="after">
<field name="procure_recommended_qty" />
<field name="procure_recommended_date" />
<button
string=""
title="Create Procurement"
name="%(stock_orderpoint_manual_procurement.act_make_procurement_from_orderpoint)d"
icon="fa-cogs"
type="action"
class="btn-default"
/>
</field>
</field>
</record>
</odoo>

View File

@@ -0,0 +1,3 @@
# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl.html).
from . import make_procurement_orderpoint

View File

@@ -0,0 +1,134 @@
# Copyright 2016-20 ForgeFlow S.L. (https://www.forgeflow.com)
# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl.html).
from odoo import _, api, fields, models
from odoo.exceptions import UserError, ValidationError
class MakeProcurementOrderpoint(models.TransientModel):
_name = "make.procurement.orderpoint"
_description = "Make Procurements from Orderpoints"
item_ids = fields.One2many(
"make.procurement.orderpoint.item", "wiz_id", string="Items"
)
@api.model
def _prepare_item(self, orderpoint):
return {
"qty": orderpoint.procure_recommended_qty,
"qty_without_security": orderpoint.procure_recommended_qty,
"uom_id": orderpoint.product_uom.id,
"date_planned": orderpoint.procure_recommended_date, # string
"orderpoint_id": orderpoint.id,
"product_id": orderpoint.product_id.id,
"warehouse_id": orderpoint.warehouse_id.id,
"location_id": orderpoint.location_id.id,
}
@api.model
def fields_view_get(
self, view_id=None, view_type="form", toolbar=False, submenu=False
):
if not self.user_has_groups(
"stock_orderpoint_manual_procurement.group_change_orderpoint_procure_qty"
): # noqa
# Redirect to readonly qty form view
view_id = self.env.ref(
"stock_orderpoint_manual_procurement.view_make_procure_without_security"
).id # noqa
return super(MakeProcurementOrderpoint, self).fields_view_get(
view_id=view_id, view_type=view_type, toolbar=toolbar, submenu=submenu
)
@api.model
def default_get(self, fields):
res = super(MakeProcurementOrderpoint, self).default_get(fields)
orderpoint_obj = self.env["stock.warehouse.orderpoint"]
orderpoint_ids = self.env.context["active_ids"] or []
active_model = self.env.context["active_model"]
if not orderpoint_ids:
return res
assert active_model == "stock.warehouse.orderpoint", "Bad context propagation"
items = []
for line in orderpoint_obj.browse(orderpoint_ids):
items.append([0, 0, self._prepare_item(line)])
res["item_ids"] = items
return res
def make_procurement(self):
self.ensure_one()
errors = []
# User requesting the procurement is passed by context to be able to
# update final MO, PO or trasfer with that information.
pg_obj = self.env["procurement.group"].with_context(requested_uid=self.env.user)
procurements = []
for item in self.item_ids:
if not item.qty:
raise ValidationError(_("Quantity must be positive."))
if not item.orderpoint_id:
raise ValidationError(_("No reordering rule found!"))
values = item.orderpoint_id._prepare_procurement_values(item.qty)
values["date_planned"] = fields.Datetime.to_string(
fields.Date.from_string(item.date_planned)
)
procurements.append(
pg_obj.Procurement(
item.orderpoint_id.product_id,
item.qty,
item.uom_id,
item.orderpoint_id.location_id,
item.orderpoint_id.name,
item.orderpoint_id.name,
item.orderpoint_id.company_id,
values,
)
)
try:
# Run procurement
pg_obj.run(procurements)
except UserError as error:
errors.append(error.name)
if errors:
raise UserError("\n".join(errors))
return {"type": "ir.actions.act_window_close"}
class MakeProcurementOrderpointItem(models.TransientModel):
_name = "make.procurement.orderpoint.item"
_description = "Make Procurements from Orderpoint Item"
wiz_id = fields.Many2one(
"make.procurement.orderpoint",
string="Wizard",
required=True,
ondelete="cascade",
readonly=True,
)
qty = fields.Float(string="Qty")
qty_without_security = fields.Float(string="Quantity")
uom_id = fields.Many2one(string="Unit of Measure", comodel_name="uom.uom")
date_planned = fields.Date(string="Planned Date", required=False)
orderpoint_id = fields.Many2one(
string="Reordering rule",
comodel_name="stock.warehouse.orderpoint",
readonly=False,
)
product_id = fields.Many2one(
string="Product", comodel_name="product.product", readonly=True
)
warehouse_id = fields.Many2one(
string="Warehouse", comodel_name="stock.warehouse", readonly=True
)
location_id = fields.Many2one(
string="Location", comodel_name="stock.location", readonly=True
)
@api.onchange("uom_id")
def onchange_uom_id(self):
for rec in self:
rec.qty = rec.orderpoint_id.product_uom._compute_quantity(
rec.orderpoint_id.procure_recommended_qty, rec.uom_id
)

View File

@@ -0,0 +1,98 @@
<?xml version="1.0" ?>
<odoo>
<!-- Make Procurement with security access right -->
<record id="view_make_procurment_buffer_wizard" model="ir.ui.view">
<field name="name">Request Procurement</field>
<field name="model">make.procurement.orderpoint</field>
<field name="arch" type="xml">
<form string="Procurement Request">
<p class="oe_gray">
Use this assistant to generate a procurement request for this
stock buffer. According to the product configuration,
this may trigger a draft purchase order, a manufacturing
order or a transfer picking.
</p>
<group name="items" string="Items">
<field name="item_ids" nolabel="1">
<tree string="Items" nocreate="1" editable="top">
<field name="orderpoint_id" invisible="True" />
<field
name="warehouse_id"
groups="stock.group_stock_multi_locations"
/>
<field
name="location_id"
groups="stock.group_stock_multi_locations"
/>
<field name="product_id" />
<field name="qty" />
<field name="qty_without_security" invisible="1" />
<field name="uom_id" groups="uom.group_uom" />
<field name="date_planned" />
</tree>
</field>
</group>
<footer>
<button
string="Execute"
name="make_procurement"
type="object"
class="btn-primary"
/>
<button string="Cancel" class="btn-default" special="cancel" />
</footer>
</form>
</field>
</record>
<!-- Make Procurement without security access right -->
<record id="view_make_procure_without_security" model="ir.ui.view">
<field name="name">Request Procurement</field>
<field name="model">make.procurement.orderpoint</field>
<field name="arch" type="xml">
<form string="Procurement Request">
<p class="oe_gray">
Use this assistant to generate a procurement request for this
stock buffer. According to the product configuration,
this may trigger a draft purchase order, a manufacturing
order or a transfer picking.
</p>
<group name="items" string="Items">
<field name="item_ids" nolabel="1">
<tree string="Items" nocreate="1" editable="top">
<field name="orderpoint_id" invisible="True" />
<field
name="warehouse_id"
groups="stock.group_stock_multi_locations"
/>
<field
name="location_id"
groups="stock.group_stock_multi_locations"
/>
<field name="product_id" />
<field name="qty" invisible="1" />
<field name="qty_without_security" readonly="1" />
<field name="uom_id" groups="uom.group_uom" />
<field name="date_planned" />
</tree>
</field>
</group>
<footer>
<button
string="Execute"
name="make_procurement"
type="object"
class="btn-primary"
/>
<button string="Cancel" class="btn-default" special="cancel" />
</footer>
</form>
</field>
</record>
<record model="ir.actions.act_window" id="act_make_procurement_from_orderpoint">
<field name="name">Request Procurement</field>
<field name="res_model">make.procurement.orderpoint</field>
<field name="view_mode">form</field>
<field name="target">new</field>
<field name="binding_model_id" ref="stock.model_stock_warehouse_orderpoint" />
</record>
</odoo>