From 25918f5dd4d279ea53bb7fe9155b74e88b30d667 Mon Sep 17 00:00:00 2001
From: Ernesto Tejeda
Date: Wed, 22 Apr 2020 00:42:34 -0400
Subject: [PATCH 01/18] [ADD] sale_stock_available_info_popup: new module
---
sale_stock_available_info_popup/README.rst | 97 ++++
sale_stock_available_info_popup/__init__.py | 3 +
.../__manifest__.py | 23 +
sale_stock_available_info_popup/i18n/es.po | 47 ++
.../i18n/sale_stock_available_info_popup.pot | 39 ++
.../models/__init__.py | 3 +
.../models/sale_order.py | 28 ++
.../readme/CONTRIBUTORS.rst | 4 +
.../readme/DESCRIPTION.rst | 3 +
.../readme/USAGE.rst | 15 +
.../static/description/icon.png | Bin 0 -> 9455 bytes
.../static/description/index.html | 441 ++++++++++++++++++
.../static/src/xml/qty_at_date.xml | 19 +
.../tests/__init__.py | 3 +
.../test_sale_stock_available_info_popup.py | 114 +++++
.../views/sale_order_views.xml | 15 +
16 files changed, 854 insertions(+)
create mode 100644 sale_stock_available_info_popup/README.rst
create mode 100644 sale_stock_available_info_popup/__init__.py
create mode 100644 sale_stock_available_info_popup/__manifest__.py
create mode 100644 sale_stock_available_info_popup/i18n/es.po
create mode 100644 sale_stock_available_info_popup/i18n/sale_stock_available_info_popup.pot
create mode 100644 sale_stock_available_info_popup/models/__init__.py
create mode 100644 sale_stock_available_info_popup/models/sale_order.py
create mode 100644 sale_stock_available_info_popup/readme/CONTRIBUTORS.rst
create mode 100644 sale_stock_available_info_popup/readme/DESCRIPTION.rst
create mode 100644 sale_stock_available_info_popup/readme/USAGE.rst
create mode 100644 sale_stock_available_info_popup/static/description/icon.png
create mode 100644 sale_stock_available_info_popup/static/description/index.html
create mode 100644 sale_stock_available_info_popup/static/src/xml/qty_at_date.xml
create mode 100644 sale_stock_available_info_popup/tests/__init__.py
create mode 100644 sale_stock_available_info_popup/tests/test_sale_stock_available_info_popup.py
create mode 100644 sale_stock_available_info_popup/views/sale_order_views.xml
diff --git a/sale_stock_available_info_popup/README.rst b/sale_stock_available_info_popup/README.rst
new file mode 100644
index 00000000..933bd327
--- /dev/null
+++ b/sale_stock_available_info_popup/README.rst
@@ -0,0 +1,97 @@
+===============================
+Sale Stock Available Info Popup
+===============================
+
+.. !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+ !! 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/12.0/sale_stock_available_info_popup
+ :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-12-0/stock-logistics-warehouse-12-0-sale_stock_available_info_popup
+ :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/12.0
+ :alt: Try me on Runbot
+
+|badge1| |badge2| |badge3| |badge4| |badge5|
+
+This module extends the functionality of 'Sale Stock Info Popup' module
+to add the 'Available to promise' quantity of the corresponding product
+to the pop-up that show stock information at sales order line level.
+
+**Table of contents**
+
+.. contents::
+ :local:
+
+Usage
+=====
+
+To use this module, you need to:
+
+#. Go to *Sales > Orders > quotations* and create a new one.
+#. Add a sale order line with a storable product
+#. Click on the icon |fa_info_circle| in the line and you will
+ see in the popover the 'Available to promise' quantity of the
+ corresponding product.
+
+Note: Now the color of the icon depends on the 'Available to promise'
+quantity of the corresponding product instead of 'Forecast Quantity'.
+If that quantity is less than the quantity to deliver, the color of
+the icon will be red, indicating an alert; otherwise it will be blue.
+
+.. |fa_info_circle| image:: https://raw.githubusercontent.com/OCA/stock-logistics-warehouse/12.0/sale_stock_available_info_popup/static/src/img/info-circle-solid.png
+ :width: 10px
+
+Bug Tracker
+===========
+
+Bugs are tracked on `GitHub Issues `_.
+In case of trouble, please check there if your issue has already been reported.
+If you spotted it first, help us smashing it by providing a detailed and welcomed
+`feedback `_.
+
+Do not contact contributors directly about support or help with technical issues.
+
+Credits
+=======
+
+Authors
+~~~~~~~
+
+* Tecnativa
+
+Contributors
+~~~~~~~~~~~~
+
+* `Tecnativa `_:
+
+ * Ernesto Tejeda
+ * Pedro M. Baeza
+
+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 `_ project on GitHub.
+
+You are welcome to contribute. To learn how please visit https://odoo-community.org/page/Contribute.
diff --git a/sale_stock_available_info_popup/__init__.py b/sale_stock_available_info_popup/__init__.py
new file mode 100644
index 00000000..4b76c7b2
--- /dev/null
+++ b/sale_stock_available_info_popup/__init__.py
@@ -0,0 +1,3 @@
+# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl.html).
+
+from . import models
diff --git a/sale_stock_available_info_popup/__manifest__.py b/sale_stock_available_info_popup/__manifest__.py
new file mode 100644
index 00000000..a09a2b24
--- /dev/null
+++ b/sale_stock_available_info_popup/__manifest__.py
@@ -0,0 +1,23 @@
+# Copyright 2020 Tecnativa - Ernesto Tejeda
+# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl.html).
+{
+ "name": "Sale Stock Available Info Popup",
+ "summary": "Adds an 'Available to promise' quantity to the popover shown "
+ "in sale order line that display stock info of the product",
+ "author": "Tecnativa, Odoo Community Association (OCA)",
+ "website": "https://github.com/OCA/stock-logistics-warehouse",
+ "category": "Warehouse Management",
+ "version": "12.0.1.0.0",
+ "license": "AGPL-3",
+ "depends": [
+ "sale_stock_info_popup",
+ "stock_available",
+ ],
+ "data": [
+ "views/sale_order_views.xml",
+ ],
+ "qweb": [
+ "static/src/xml/qty_at_date.xml",
+ ],
+ "installable": True,
+}
diff --git a/sale_stock_available_info_popup/i18n/es.po b/sale_stock_available_info_popup/i18n/es.po
new file mode 100644
index 00000000..a4ef9095
--- /dev/null
+++ b/sale_stock_available_info_popup/i18n/es.po
@@ -0,0 +1,47 @@
+# Translation of Odoo Server.
+# This file contains the translation of the following modules:
+# * sale_stock_available_info_popup
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: Odoo Server 12.0\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2020-04-24 19:48+0000\n"
+"PO-Revision-Date: 2020-04-24 15:53-0400\n"
+"Last-Translator: <>\n"
+"Language-Team: \n"
+"Language: es\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: \n"
+"X-Generator: Poedit 2.0.6\n"
+
+#. module: sale_stock_available_info_popup
+#. openerp-web
+#: code:addons/sale_stock_available_info_popup/static/src/xml/qty_at_date.xml:13
+#, python-format
+msgid "Available to promise"
+msgstr "Disponible para Prometer"
+
+#. module: sale_stock_available_info_popup
+#: model:ir.model.fields,field_description:sale_stock_available_info_popup.field_sale_order_line__immediately_usable_qty_today
+msgid "Immediately Usable Qty Today"
+msgstr ""
+
+#. module: sale_stock_available_info_popup
+#: model:ir.model,name:sale_stock_available_info_popup.model_sale_order_line
+msgid "Sales Order Line"
+msgstr "Línea de pedido de venta"
+
+#. module: sale_stock_available_info_popup
+#. openerp-web
+#: code:addons/sale_stock_available_info_popup/static/src/xml/qty_at_date.xml:7
+#, python-format
+msgid ""
+"widget.data.immediately_usable_qty_today < widget.data.qty_to_deliver and !"
+"widget.data.is_mto"
+msgstr ""
+
+#~ msgid "Product Template"
+#~ msgstr "Plantilla de producto"
diff --git a/sale_stock_available_info_popup/i18n/sale_stock_available_info_popup.pot b/sale_stock_available_info_popup/i18n/sale_stock_available_info_popup.pot
new file mode 100644
index 00000000..3021e288
--- /dev/null
+++ b/sale_stock_available_info_popup/i18n/sale_stock_available_info_popup.pot
@@ -0,0 +1,39 @@
+# Translation of Odoo Server.
+# This file contains the translation of the following modules:
+# * sale_stock_available_info_popup
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: Odoo Server 12.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: sale_stock_available_info_popup
+#. openerp-web
+#: code:addons/sale_stock_available_info_popup/static/src/xml/qty_at_date.xml:13
+#, python-format
+msgid "Available to promise"
+msgstr ""
+
+#. module: sale_stock_available_info_popup
+#: model:ir.model.fields,field_description:sale_stock_available_info_popup.field_sale_order_line__immediately_usable_qty_today
+msgid "Immediately Usable Qty Today"
+msgstr ""
+
+#. module: sale_stock_available_info_popup
+#: model:ir.model,name:sale_stock_available_info_popup.model_sale_order_line
+msgid "Sales Order Line"
+msgstr ""
+
+#. module: sale_stock_available_info_popup
+#. openerp-web
+#: code:addons/sale_stock_available_info_popup/static/src/xml/qty_at_date.xml:7
+#, python-format
+msgid "widget.data.immediately_usable_qty_today < widget.data.qty_to_deliver and !widget.data.is_mto"
+msgstr ""
+
diff --git a/sale_stock_available_info_popup/models/__init__.py b/sale_stock_available_info_popup/models/__init__.py
new file mode 100644
index 00000000..b1ad204b
--- /dev/null
+++ b/sale_stock_available_info_popup/models/__init__.py
@@ -0,0 +1,3 @@
+# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl.html).
+
+from . import sale_order
diff --git a/sale_stock_available_info_popup/models/sale_order.py b/sale_stock_available_info_popup/models/sale_order.py
new file mode 100644
index 00000000..7e510da7
--- /dev/null
+++ b/sale_stock_available_info_popup/models/sale_order.py
@@ -0,0 +1,28 @@
+# Copyright 2020 Tecnativa - Ernesto Tejeda
+# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).
+
+from collections import defaultdict
+
+from odoo import api, fields, models
+
+
+class SaleOrderLine(models.Model):
+ _inherit = 'sale.order.line'
+
+ immediately_usable_qty_today = fields.Float(
+ compute='_compute_immediately_usable_qty_today')
+
+ @api.depends('product_id', 'product_uom_qty')
+ def _compute_immediately_usable_qty_today(self):
+ qty_processed_per_product = defaultdict(lambda: 0)
+ remaining = self.env['sale.order.line']
+ for line in self.sorted(key=lambda r: r.sequence):
+ if not line.display_qty_widget:
+ remaining |= line
+ continue
+ product = line.product_id
+ qty_processed = qty_processed_per_product[product.id]
+ line.immediately_usable_qty_today = \
+ product.immediately_usable_qty - qty_processed
+ qty_processed_per_product[product.id] += line.product_uom_qty
+ remaining.write({"immediately_usable_qty_today": False})
diff --git a/sale_stock_available_info_popup/readme/CONTRIBUTORS.rst b/sale_stock_available_info_popup/readme/CONTRIBUTORS.rst
new file mode 100644
index 00000000..b31cef32
--- /dev/null
+++ b/sale_stock_available_info_popup/readme/CONTRIBUTORS.rst
@@ -0,0 +1,4 @@
+* `Tecnativa `_:
+
+ * Ernesto Tejeda
+ * Pedro M. Baeza
diff --git a/sale_stock_available_info_popup/readme/DESCRIPTION.rst b/sale_stock_available_info_popup/readme/DESCRIPTION.rst
new file mode 100644
index 00000000..4e0c04d0
--- /dev/null
+++ b/sale_stock_available_info_popup/readme/DESCRIPTION.rst
@@ -0,0 +1,3 @@
+This module extends the functionality of 'Sale Stock Info Popup' module
+to add the 'Available to promise' quantity of the corresponding product
+to the pop-up that show stock information at sales order line level.
diff --git a/sale_stock_available_info_popup/readme/USAGE.rst b/sale_stock_available_info_popup/readme/USAGE.rst
new file mode 100644
index 00000000..a9e54033
--- /dev/null
+++ b/sale_stock_available_info_popup/readme/USAGE.rst
@@ -0,0 +1,15 @@
+To use this module, you need to:
+
+#. Go to *Sales > Orders > quotations* and create a new one.
+#. Add a sale order line with a storable product
+#. Click on the icon |fa_info_circle| in the line and you will
+ see in the popover the 'Available to promise' quantity of the
+ corresponding product.
+
+Note: Now the color of the icon depends on the 'Available to promise'
+quantity of the corresponding product instead of 'Forecast Quantity'.
+If that quantity is less than the quantity to deliver, the color of
+the icon will be red, indicating an alert; otherwise it will be blue.
+
+.. |fa_info_circle| image:: ../static/src/img/info-circle-solid.png
+ :width: 10px
diff --git a/sale_stock_available_info_popup/static/description/icon.png b/sale_stock_available_info_popup/static/description/icon.png
new file mode 100644
index 0000000000000000000000000000000000000000..3a0328b516c4980e8e44cdb63fd945757ddd132d
GIT binary patch
literal 9455
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
z
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
Xviia!U7SGha1wx#SCgwmn*{w2TRX*I
literal 0
HcmV?d00001
diff --git a/sale_stock_available_info_popup/static/description/index.html b/sale_stock_available_info_popup/static/description/index.html
new file mode 100644
index 00000000..bb0f6409
--- /dev/null
+++ b/sale_stock_available_info_popup/static/description/index.html
@@ -0,0 +1,441 @@
+
+
+
+
+
+
+Sale Stock Available Info Popup
+
+
+
+
+
+
diff --git a/sale_stock_available_info_popup/static/src/xml/qty_at_date.xml b/sale_stock_available_info_popup/static/src/xml/qty_at_date.xml
new file mode 100644
index 00000000..205eed5e
--- /dev/null
+++ b/sale_stock_available_info_popup/static/src/xml/qty_at_date.xml
@@ -0,0 +1,19 @@
+
+
+
+
+
+ widget.data.immediately_usable_qty_today < widget.data.qty_to_deliver and !widget.data.is_mto
+
+
+
+
+
+ | Available to promise |
+
+ |
+
+
+
+
diff --git a/sale_stock_available_info_popup/tests/__init__.py b/sale_stock_available_info_popup/tests/__init__.py
new file mode 100644
index 00000000..47d98091
--- /dev/null
+++ b/sale_stock_available_info_popup/tests/__init__.py
@@ -0,0 +1,3 @@
+# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl.html).
+
+from . import test_sale_stock_available_info_popup
diff --git a/sale_stock_available_info_popup/tests/test_sale_stock_available_info_popup.py b/sale_stock_available_info_popup/tests/test_sale_stock_available_info_popup.py
new file mode 100644
index 00000000..e9eced21
--- /dev/null
+++ b/sale_stock_available_info_popup/tests/test_sale_stock_available_info_popup.py
@@ -0,0 +1,114 @@
+# Copyright 2020 Tecnativa - Ernesto Tejeda
+# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl.html).
+
+from odoo.tests.common import SavepointCase
+
+
+class SaleStockAvailableInfoPopup(SavepointCase):
+
+ @classmethod
+ def setUpClass(cls):
+ super(SaleStockAvailableInfoPopup, cls).setUpClass()
+ user_group_stock_user = cls.env.ref('stock.group_stock_user')
+ cls.user_stock_user = cls.env['res.users'].create({
+ 'name': 'Pauline Poivraisselle',
+ 'login': 'pauline',
+ 'email': 'p.p@example.com',
+ 'notification_type': 'inbox',
+ 'groups_id': [(6, 0, [user_group_stock_user.id])]})
+ cls.product = cls.env['product.product'].create({
+ 'name': 'Storable product',
+ 'type': 'product',
+ })
+ cls.stock_location = cls.env.ref('stock.stock_location_stock')
+ cls.customers_location = cls.env.ref('stock.stock_location_customers')
+ cls.suppliers_location = cls.env.ref('stock.stock_location_suppliers')
+ cls.env['stock.quant'].create({
+ 'product_id': cls.product.id,
+ 'location_id': cls.stock_location.id,
+ 'quantity': 40.0})
+ cls.picking_out = cls.env['stock.picking'].create({
+ 'picking_type_id': cls.env.ref('stock.picking_type_out').id,
+ 'location_id': cls.stock_location.id,
+ 'location_dest_id': cls.customers_location.id})
+ cls.env['stock.move'].create({
+ 'name': 'a move',
+ 'product_id': cls.product.id,
+ 'product_uom_qty': 3.0,
+ 'product_uom': cls.product.uom_id.id,
+ 'picking_id': cls.picking_out.id,
+ 'location_id': cls.stock_location.id,
+ 'location_dest_id': cls.customers_location.id})
+ cls.picking_in = cls.env['stock.picking'].create({
+ 'picking_type_id': cls.env.ref('stock.picking_type_in').id,
+ 'location_id': cls.suppliers_location.id,
+ 'location_dest_id': cls.stock_location.id})
+ cls.env['stock.move'].create({
+ 'restrict_partner_id': cls.user_stock_user.partner_id.id,
+ 'name': 'another move',
+ 'product_id': cls.product.id,
+ 'product_uom_qty': 5.0,
+ 'product_uom': cls.product.uom_id.id,
+ 'picking_id': cls.picking_in.id,
+ 'location_id': cls.suppliers_location.id,
+ 'location_dest_id': cls.stock_location.id})
+
+ def test_immediately_usable_qty_today(self):
+ self.picking_out.action_confirm()
+ self.picking_in.action_assign()
+ so = self.env['sale.order'].create({
+ 'partner_id': self.env.ref('base.res_partner_1').id,
+ 'order_line': [
+ (0, 0, {
+ 'name': self.product.name,
+ 'product_id': self.product.id,
+ 'product_uom_qty': 1,
+ 'product_uom': self.product.uom_id.id,
+ 'price_unit': self.product.list_price
+ }),
+ ],
+ })
+ line = so.order_line
+ self.assertEqual(
+ line.immediately_usable_qty_today,
+ self.product.immediately_usable_qty,
+ )
+
+ def test_immediately_usable_qty_today_similar_solines(self):
+ """Create a sale order containing three times the same product. The
+ quantity available should be different for the 3 lines.
+ """
+ so = self.env['sale.order'].create({
+ 'partner_id': self.env.ref('base.res_partner_1').id,
+ 'order_line': [
+ (0, 0, {
+ 'name': self.product.name,
+ 'product_id': self.product.id,
+ 'product_uom_qty': 5,
+ 'product_uom': self.product.uom_id.id,
+ 'price_unit': self.product.list_price
+ }),
+ (0, 0, {
+ 'name': self.product.name,
+ 'product_id': self.product.id,
+ 'product_uom_qty': 5,
+ 'product_uom': self.product.uom_id.id,
+ 'price_unit': self.product.list_price
+ }),
+ (0, 0, {
+ 'name': self.product.name,
+ 'product_id': self.product.id,
+ 'product_uom_qty': 5,
+ 'product_uom': self.product.uom_id.id,
+ 'price_unit': self.product.list_price
+ }),
+ ],
+ })
+ self.assertEqual(
+ so.order_line.mapped('immediately_usable_qty_today'),
+ [
+ self.product.immediately_usable_qty,
+ self.product.immediately_usable_qty - 5,
+ self.product.immediately_usable_qty - 10,
+ ]
+ )
diff --git a/sale_stock_available_info_popup/views/sale_order_views.xml b/sale_stock_available_info_popup/views/sale_order_views.xml
new file mode 100644
index 00000000..d7b3f1a1
--- /dev/null
+++ b/sale_stock_available_info_popup/views/sale_order_views.xml
@@ -0,0 +1,15 @@
+
+
+
+
+ sale.order.line.tree.inherit
+ sale.order
+
+
+
+
+
+
+
+
From 16ebb789a19e1edd53e2e332d3b5a4e78a3ac394 Mon Sep 17 00:00:00 2001
From: Matjaz Mozetic
Date: Tue, 11 Aug 2020 08:09:59 +0000
Subject: [PATCH 02/18] Added translation using Weblate (Slovenian)
---
sale_stock_available_info_popup/i18n/sl.po | 44 ++++++++++++++++++++++
1 file changed, 44 insertions(+)
create mode 100644 sale_stock_available_info_popup/i18n/sl.po
diff --git a/sale_stock_available_info_popup/i18n/sl.po b/sale_stock_available_info_popup/i18n/sl.po
new file mode 100644
index 00000000..c05a6550
--- /dev/null
+++ b/sale_stock_available_info_popup/i18n/sl.po
@@ -0,0 +1,44 @@
+# Translation of Odoo Server.
+# This file contains the translation of the following modules:
+# * sale_stock_available_info_popup
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: Odoo Server 12.0\n"
+"Report-Msgid-Bugs-To: \n"
+"PO-Revision-Date: 2020-08-11 10:59+0000\n"
+"Last-Translator: Matjaz Mozetic \n"
+"Language-Team: none\n"
+"Language: sl\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: \n"
+"Plural-Forms: nplurals=4; plural=n%100==1 ? 0 : n%100==2 ? 1 : n%100==3 || "
+"n%100==4 ? 2 : 3;\n"
+"X-Generator: Weblate 3.10\n"
+
+#. module: sale_stock_available_info_popup
+#. openerp-web
+#: code:addons/sale_stock_available_info_popup/static/src/xml/qty_at_date.xml:13
+#, python-format
+msgid "Available to promise"
+msgstr "Lahko obljubimo"
+
+#. module: sale_stock_available_info_popup
+#: model:ir.model.fields,field_description:sale_stock_available_info_popup.field_sale_order_line__immediately_usable_qty_today
+msgid "Immediately Usable Qty Today"
+msgstr "Takoj razpoložljiva današnja kol"
+
+#. module: sale_stock_available_info_popup
+#: model:ir.model,name:sale_stock_available_info_popup.model_sale_order_line
+msgid "Sales Order Line"
+msgstr "Prodajna postavka"
+
+#. module: sale_stock_available_info_popup
+#. openerp-web
+#: code:addons/sale_stock_available_info_popup/static/src/xml/qty_at_date.xml:7
+#, python-format
+msgid "widget.data.immediately_usable_qty_today < widget.data.qty_to_deliver and !widget.data.is_mto"
+msgstr ""
+"widget.data.immediately_usable_qty_today < widget.data.qty_to_deliver and "
+"!widget.data.is_mto"
From 4305c4bad240a246bc024d41724a1a5418e81d3a Mon Sep 17 00:00:00 2001
From: david
Date: Thu, 21 Jan 2021 13:18:52 +0100
Subject: [PATCH 03/18] [FIX] sale_stock_available_info: ensure test line order
---
sale_stock_available_info_popup/__manifest__.py | 2 +-
.../tests/test_sale_stock_available_info_popup.py | 3 +++
2 files changed, 4 insertions(+), 1 deletion(-)
diff --git a/sale_stock_available_info_popup/__manifest__.py b/sale_stock_available_info_popup/__manifest__.py
index a09a2b24..84d26908 100644
--- a/sale_stock_available_info_popup/__manifest__.py
+++ b/sale_stock_available_info_popup/__manifest__.py
@@ -7,7 +7,7 @@
"author": "Tecnativa, Odoo Community Association (OCA)",
"website": "https://github.com/OCA/stock-logistics-warehouse",
"category": "Warehouse Management",
- "version": "12.0.1.0.0",
+ "version": "12.0.1.0.1",
"license": "AGPL-3",
"depends": [
"sale_stock_info_popup",
diff --git a/sale_stock_available_info_popup/tests/test_sale_stock_available_info_popup.py b/sale_stock_available_info_popup/tests/test_sale_stock_available_info_popup.py
index e9eced21..5ff90f7a 100644
--- a/sale_stock_available_info_popup/tests/test_sale_stock_available_info_popup.py
+++ b/sale_stock_available_info_popup/tests/test_sale_stock_available_info_popup.py
@@ -82,6 +82,7 @@ def test_immediately_usable_qty_today_similar_solines(self):
'partner_id': self.env.ref('base.res_partner_1').id,
'order_line': [
(0, 0, {
+ 'sequence': 1,
'name': self.product.name,
'product_id': self.product.id,
'product_uom_qty': 5,
@@ -89,6 +90,7 @@ def test_immediately_usable_qty_today_similar_solines(self):
'price_unit': self.product.list_price
}),
(0, 0, {
+ 'sequence': 2,
'name': self.product.name,
'product_id': self.product.id,
'product_uom_qty': 5,
@@ -96,6 +98,7 @@ def test_immediately_usable_qty_today_similar_solines(self):
'price_unit': self.product.list_price
}),
(0, 0, {
+ 'sequence': 3,
'name': self.product.name,
'product_id': self.product.id,
'product_uom_qty': 5,
From f788dddf0af5f71514d4aa532ad6e34044656d96 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?V=C3=ADctor=20Mart=C3=ADnez?=
Date: Fri, 19 Feb 2021 09:12:18 +0100
Subject: [PATCH 04/18] [IMP] sale_stock_available_info_popup: black, isort,
prettier
---
.../__manifest__.py | 15 +-
.../models/sale_order.py | 12 +-
.../static/src/xml/qty_at_date.xml | 21 +-
.../test_sale_stock_available_info_popup.py | 213 ++++++++++--------
.../views/sale_order_views.xml | 11 +-
5 files changed, 157 insertions(+), 115 deletions(-)
diff --git a/sale_stock_available_info_popup/__manifest__.py b/sale_stock_available_info_popup/__manifest__.py
index 84d26908..7679c498 100644
--- a/sale_stock_available_info_popup/__manifest__.py
+++ b/sale_stock_available_info_popup/__manifest__.py
@@ -3,21 +3,14 @@
{
"name": "Sale Stock Available Info Popup",
"summary": "Adds an 'Available to promise' quantity to the popover shown "
- "in sale order line that display stock info of the product",
+ "in sale order line that display stock info of the product",
"author": "Tecnativa, Odoo Community Association (OCA)",
"website": "https://github.com/OCA/stock-logistics-warehouse",
"category": "Warehouse Management",
"version": "12.0.1.0.1",
"license": "AGPL-3",
- "depends": [
- "sale_stock_info_popup",
- "stock_available",
- ],
- "data": [
- "views/sale_order_views.xml",
- ],
- "qweb": [
- "static/src/xml/qty_at_date.xml",
- ],
+ "depends": ["sale_stock_info_popup", "stock_available",],
+ "data": ["views/sale_order_views.xml",],
+ "qweb": ["static/src/xml/qty_at_date.xml",],
"installable": True,
}
diff --git a/sale_stock_available_info_popup/models/sale_order.py b/sale_stock_available_info_popup/models/sale_order.py
index 7e510da7..53c6eff3 100644
--- a/sale_stock_available_info_popup/models/sale_order.py
+++ b/sale_stock_available_info_popup/models/sale_order.py
@@ -7,22 +7,24 @@
class SaleOrderLine(models.Model):
- _inherit = 'sale.order.line'
+ _inherit = "sale.order.line"
immediately_usable_qty_today = fields.Float(
- compute='_compute_immediately_usable_qty_today')
+ compute="_compute_immediately_usable_qty_today"
+ )
- @api.depends('product_id', 'product_uom_qty')
+ @api.depends("product_id", "product_uom_qty")
def _compute_immediately_usable_qty_today(self):
qty_processed_per_product = defaultdict(lambda: 0)
- remaining = self.env['sale.order.line']
+ remaining = self.env["sale.order.line"]
for line in self.sorted(key=lambda r: r.sequence):
if not line.display_qty_widget:
remaining |= line
continue
product = line.product_id
qty_processed = qty_processed_per_product[product.id]
- line.immediately_usable_qty_today = \
+ line.immediately_usable_qty_today = (
product.immediately_usable_qty - qty_processed
+ )
qty_processed_per_product[product.id] += line.product_uom_qty
remaining.write({"immediately_usable_qty_today": False})
diff --git a/sale_stock_available_info_popup/static/src/xml/qty_at_date.xml b/sale_stock_available_info_popup/static/src/xml/qty_at_date.xml
index 205eed5e..dea9486b 100644
--- a/sale_stock_available_info_popup/static/src/xml/qty_at_date.xml
+++ b/sale_stock_available_info_popup/static/src/xml/qty_at_date.xml
@@ -1,18 +1,27 @@
-
+
-
- widget.data.immediately_usable_qty_today < widget.data.qty_to_deliver and !widget.data.is_mto
+
+ widget.data.immediately_usable_qty_today < widget.data.qty_to_deliver and !widget.data.is_mto
- | Available to promise |
-
- |
+
+ Available to promise
+ |
+
+
+
+ |
diff --git a/sale_stock_available_info_popup/tests/test_sale_stock_available_info_popup.py b/sale_stock_available_info_popup/tests/test_sale_stock_available_info_popup.py
index 5ff90f7a..1dff449e 100644
--- a/sale_stock_available_info_popup/tests/test_sale_stock_available_info_popup.py
+++ b/sale_stock_available_info_popup/tests/test_sale_stock_available_info_popup.py
@@ -5,113 +5,148 @@
class SaleStockAvailableInfoPopup(SavepointCase):
-
@classmethod
def setUpClass(cls):
super(SaleStockAvailableInfoPopup, cls).setUpClass()
- user_group_stock_user = cls.env.ref('stock.group_stock_user')
- cls.user_stock_user = cls.env['res.users'].create({
- 'name': 'Pauline Poivraisselle',
- 'login': 'pauline',
- 'email': 'p.p@example.com',
- 'notification_type': 'inbox',
- 'groups_id': [(6, 0, [user_group_stock_user.id])]})
- cls.product = cls.env['product.product'].create({
- 'name': 'Storable product',
- 'type': 'product',
- })
- cls.stock_location = cls.env.ref('stock.stock_location_stock')
- cls.customers_location = cls.env.ref('stock.stock_location_customers')
- cls.suppliers_location = cls.env.ref('stock.stock_location_suppliers')
- cls.env['stock.quant'].create({
- 'product_id': cls.product.id,
- 'location_id': cls.stock_location.id,
- 'quantity': 40.0})
- cls.picking_out = cls.env['stock.picking'].create({
- 'picking_type_id': cls.env.ref('stock.picking_type_out').id,
- 'location_id': cls.stock_location.id,
- 'location_dest_id': cls.customers_location.id})
- cls.env['stock.move'].create({
- 'name': 'a move',
- 'product_id': cls.product.id,
- 'product_uom_qty': 3.0,
- 'product_uom': cls.product.uom_id.id,
- 'picking_id': cls.picking_out.id,
- 'location_id': cls.stock_location.id,
- 'location_dest_id': cls.customers_location.id})
- cls.picking_in = cls.env['stock.picking'].create({
- 'picking_type_id': cls.env.ref('stock.picking_type_in').id,
- 'location_id': cls.suppliers_location.id,
- 'location_dest_id': cls.stock_location.id})
- cls.env['stock.move'].create({
- 'restrict_partner_id': cls.user_stock_user.partner_id.id,
- 'name': 'another move',
- 'product_id': cls.product.id,
- 'product_uom_qty': 5.0,
- 'product_uom': cls.product.uom_id.id,
- 'picking_id': cls.picking_in.id,
- 'location_id': cls.suppliers_location.id,
- 'location_dest_id': cls.stock_location.id})
+ user_group_stock_user = cls.env.ref("stock.group_stock_user")
+ cls.user_stock_user = cls.env["res.users"].create(
+ {
+ "name": "Pauline Poivraisselle",
+ "login": "pauline",
+ "email": "p.p@example.com",
+ "notification_type": "inbox",
+ "groups_id": [(6, 0, [user_group_stock_user.id])],
+ }
+ )
+ cls.product = cls.env["product.product"].create(
+ {"name": "Storable product", "type": "product",}
+ )
+ cls.stock_location = cls.env.ref("stock.stock_location_stock")
+ cls.customers_location = cls.env.ref("stock.stock_location_customers")
+ cls.suppliers_location = cls.env.ref("stock.stock_location_suppliers")
+ cls.env["stock.quant"].create(
+ {
+ "product_id": cls.product.id,
+ "location_id": cls.stock_location.id,
+ "quantity": 40.0,
+ }
+ )
+ cls.picking_out = cls.env["stock.picking"].create(
+ {
+ "picking_type_id": cls.env.ref("stock.picking_type_out").id,
+ "location_id": cls.stock_location.id,
+ "location_dest_id": cls.customers_location.id,
+ }
+ )
+ cls.env["stock.move"].create(
+ {
+ "name": "a move",
+ "product_id": cls.product.id,
+ "product_uom_qty": 3.0,
+ "product_uom": cls.product.uom_id.id,
+ "picking_id": cls.picking_out.id,
+ "location_id": cls.stock_location.id,
+ "location_dest_id": cls.customers_location.id,
+ }
+ )
+ cls.picking_in = cls.env["stock.picking"].create(
+ {
+ "picking_type_id": cls.env.ref("stock.picking_type_in").id,
+ "location_id": cls.suppliers_location.id,
+ "location_dest_id": cls.stock_location.id,
+ }
+ )
+ cls.env["stock.move"].create(
+ {
+ "restrict_partner_id": cls.user_stock_user.partner_id.id,
+ "name": "another move",
+ "product_id": cls.product.id,
+ "product_uom_qty": 5.0,
+ "product_uom": cls.product.uom_id.id,
+ "picking_id": cls.picking_in.id,
+ "location_id": cls.suppliers_location.id,
+ "location_dest_id": cls.stock_location.id,
+ }
+ )
def test_immediately_usable_qty_today(self):
self.picking_out.action_confirm()
self.picking_in.action_assign()
- so = self.env['sale.order'].create({
- 'partner_id': self.env.ref('base.res_partner_1').id,
- 'order_line': [
- (0, 0, {
- 'name': self.product.name,
- 'product_id': self.product.id,
- 'product_uom_qty': 1,
- 'product_uom': self.product.uom_id.id,
- 'price_unit': self.product.list_price
- }),
- ],
- })
+ so = self.env["sale.order"].create(
+ {
+ "partner_id": self.env.ref("base.res_partner_1").id,
+ "order_line": [
+ (
+ 0,
+ 0,
+ {
+ "name": self.product.name,
+ "product_id": self.product.id,
+ "product_uom_qty": 1,
+ "product_uom": self.product.uom_id.id,
+ "price_unit": self.product.list_price,
+ },
+ ),
+ ],
+ }
+ )
line = so.order_line
self.assertEqual(
- line.immediately_usable_qty_today,
- self.product.immediately_usable_qty,
+ line.immediately_usable_qty_today, self.product.immediately_usable_qty,
)
def test_immediately_usable_qty_today_similar_solines(self):
"""Create a sale order containing three times the same product. The
quantity available should be different for the 3 lines.
"""
- so = self.env['sale.order'].create({
- 'partner_id': self.env.ref('base.res_partner_1').id,
- 'order_line': [
- (0, 0, {
- 'sequence': 1,
- 'name': self.product.name,
- 'product_id': self.product.id,
- 'product_uom_qty': 5,
- 'product_uom': self.product.uom_id.id,
- 'price_unit': self.product.list_price
- }),
- (0, 0, {
- 'sequence': 2,
- 'name': self.product.name,
- 'product_id': self.product.id,
- 'product_uom_qty': 5,
- 'product_uom': self.product.uom_id.id,
- 'price_unit': self.product.list_price
- }),
- (0, 0, {
- 'sequence': 3,
- 'name': self.product.name,
- 'product_id': self.product.id,
- 'product_uom_qty': 5,
- 'product_uom': self.product.uom_id.id,
- 'price_unit': self.product.list_price
- }),
- ],
- })
+ so = self.env["sale.order"].create(
+ {
+ "partner_id": self.env.ref("base.res_partner_1").id,
+ "order_line": [
+ (
+ 0,
+ 0,
+ {
+ "sequence": 1,
+ "name": self.product.name,
+ "product_id": self.product.id,
+ "product_uom_qty": 5,
+ "product_uom": self.product.uom_id.id,
+ "price_unit": self.product.list_price,
+ },
+ ),
+ (
+ 0,
+ 0,
+ {
+ "sequence": 2,
+ "name": self.product.name,
+ "product_id": self.product.id,
+ "product_uom_qty": 5,
+ "product_uom": self.product.uom_id.id,
+ "price_unit": self.product.list_price,
+ },
+ ),
+ (
+ 0,
+ 0,
+ {
+ "sequence": 3,
+ "name": self.product.name,
+ "product_id": self.product.id,
+ "product_uom_qty": 5,
+ "product_uom": self.product.uom_id.id,
+ "price_unit": self.product.list_price,
+ },
+ ),
+ ],
+ }
+ )
self.assertEqual(
- so.order_line.mapped('immediately_usable_qty_today'),
+ so.order_line.mapped("immediately_usable_qty_today"),
[
self.product.immediately_usable_qty,
self.product.immediately_usable_qty - 5,
self.product.immediately_usable_qty - 10,
- ]
+ ],
)
diff --git a/sale_stock_available_info_popup/views/sale_order_views.xml b/sale_stock_available_info_popup/views/sale_order_views.xml
index d7b3f1a1..52d82ba8 100644
--- a/sale_stock_available_info_popup/views/sale_order_views.xml
+++ b/sale_stock_available_info_popup/views/sale_order_views.xml
@@ -1,14 +1,17 @@
-
+
sale.order.line.tree.inherit
sale.order
-
+
-
-
+
+
From 537cd1c10657db0c323c5e623186de06b9cfc0f1 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?V=C3=ADctor=20Mart=C3=ADnez?=
Date: Fri, 19 Feb 2021 09:23:40 +0100
Subject: [PATCH 05/18] [MIG] sale_stock_available_info_popup: Migration to
13.0
[UPD] Update sale_stock_available_info_popup.pot
[UPD] README.rst
Update translation files
Updated by "Update PO files to match POT (msgmerge)" hook in Weblate.
Translation: stock-logistics-warehouse-13.0/stock-logistics-warehouse-13.0-sale_stock_available_info_popup
Translate-URL: https://translation.odoo-community.org/projects/stock-logistics-warehouse-13-0/stock-logistics-warehouse-13-0-sale_stock_available_info_popup/
---
sale_stock_available_info_popup/README.rst | 15 ++++++++-------
.../__manifest__.py | 8 ++++----
sale_stock_available_info_popup/i18n/es.po | 4 ++--
.../i18n/sale_stock_available_info_popup.pot | 15 ++++++++-------
sale_stock_available_info_popup/i18n/sl.po | 18 ++++++++++--------
.../readme/CONTRIBUTORS.rst | 1 +
.../readme/DESCRIPTION.rst | 2 +-
.../static/description/index.html | 11 ++++++-----
.../test_sale_stock_available_info_popup.py | 4 ++--
9 files changed, 42 insertions(+), 36 deletions(-)
diff --git a/sale_stock_available_info_popup/README.rst b/sale_stock_available_info_popup/README.rst
index 933bd327..eade50bc 100644
--- a/sale_stock_available_info_popup/README.rst
+++ b/sale_stock_available_info_popup/README.rst
@@ -14,18 +14,18 @@ Sale Stock Available Info Popup
: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/12.0/sale_stock_available_info_popup
+ :target: https://github.com/OCA/stock-logistics-warehouse/tree/13.0/sale_stock_available_info_popup
: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-12-0/stock-logistics-warehouse-12-0-sale_stock_available_info_popup
+ :target: https://translation.odoo-community.org/projects/stock-logistics-warehouse-13-0/stock-logistics-warehouse-13-0-sale_stock_available_info_popup
: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/12.0
+ :target: https://runbot.odoo-community.org/runbot/153/13.0
:alt: Try me on Runbot
|badge1| |badge2| |badge3| |badge4| |badge5|
-This module extends the functionality of 'Sale Stock Info Popup' module
+This module extends the functionality of 'Sale Stock' module
to add the 'Available to promise' quantity of the corresponding product
to the pop-up that show stock information at sales order line level.
@@ -50,7 +50,7 @@ quantity of the corresponding product instead of 'Forecast Quantity'.
If that quantity is less than the quantity to deliver, the color of
the icon will be red, indicating an alert; otherwise it will be blue.
-.. |fa_info_circle| image:: https://raw.githubusercontent.com/OCA/stock-logistics-warehouse/12.0/sale_stock_available_info_popup/static/src/img/info-circle-solid.png
+.. |fa_info_circle| image:: https://raw.githubusercontent.com/OCA/stock-logistics-warehouse/13.0/sale_stock_available_info_popup/static/src/img/info-circle-solid.png
:width: 10px
Bug Tracker
@@ -59,7 +59,7 @@ Bug Tracker
Bugs are tracked on `GitHub Issues `_.
In case of trouble, please check there if your issue has already been reported.
If you spotted it first, help us smashing it by providing a detailed and welcomed
-`feedback `_.
+`feedback `_.
Do not contact contributors directly about support or help with technical issues.
@@ -78,6 +78,7 @@ Contributors
* Ernesto Tejeda
* Pedro M. Baeza
+ * Víctor Martínez
Maintainers
~~~~~~~~~~~
@@ -92,6 +93,6 @@ OCA, or the Odoo Community Association, is a nonprofit organization whose
mission is to support the collaborative development of Odoo features and
promote its widespread use.
-This module is part of the `OCA/stock-logistics-warehouse `_ project on GitHub.
+This module is part of the `OCA/stock-logistics-warehouse `_ project on GitHub.
You are welcome to contribute. To learn how please visit https://odoo-community.org/page/Contribute.
diff --git a/sale_stock_available_info_popup/__manifest__.py b/sale_stock_available_info_popup/__manifest__.py
index 7679c498..942a5aec 100644
--- a/sale_stock_available_info_popup/__manifest__.py
+++ b/sale_stock_available_info_popup/__manifest__.py
@@ -7,10 +7,10 @@
"author": "Tecnativa, Odoo Community Association (OCA)",
"website": "https://github.com/OCA/stock-logistics-warehouse",
"category": "Warehouse Management",
- "version": "12.0.1.0.1",
+ "version": "13.0.1.0.0",
"license": "AGPL-3",
- "depends": ["sale_stock_info_popup", "stock_available",],
- "data": ["views/sale_order_views.xml",],
- "qweb": ["static/src/xml/qty_at_date.xml",],
+ "depends": ["sale_stock", "stock_available"],
+ "data": ["views/sale_order_views.xml"],
+ "qweb": ["static/src/xml/qty_at_date.xml"],
"installable": True,
}
diff --git a/sale_stock_available_info_popup/i18n/es.po b/sale_stock_available_info_popup/i18n/es.po
index a4ef9095..25b0ad26 100644
--- a/sale_stock_available_info_popup/i18n/es.po
+++ b/sale_stock_available_info_popup/i18n/es.po
@@ -19,7 +19,7 @@ msgstr ""
#. module: sale_stock_available_info_popup
#. openerp-web
-#: code:addons/sale_stock_available_info_popup/static/src/xml/qty_at_date.xml:13
+#: code:addons/sale_stock_available_info_popup/static/src/xml/qty_at_date.xml:0
#, python-format
msgid "Available to promise"
msgstr "Disponible para Prometer"
@@ -36,7 +36,7 @@ msgstr "Línea de pedido de venta"
#. module: sale_stock_available_info_popup
#. openerp-web
-#: code:addons/sale_stock_available_info_popup/static/src/xml/qty_at_date.xml:7
+#: code:addons/sale_stock_available_info_popup/static/src/xml/qty_at_date.xml:0
#, python-format
msgid ""
"widget.data.immediately_usable_qty_today < widget.data.qty_to_deliver and !"
diff --git a/sale_stock_available_info_popup/i18n/sale_stock_available_info_popup.pot b/sale_stock_available_info_popup/i18n/sale_stock_available_info_popup.pot
index 3021e288..8154fda1 100644
--- a/sale_stock_available_info_popup/i18n/sale_stock_available_info_popup.pot
+++ b/sale_stock_available_info_popup/i18n/sale_stock_available_info_popup.pot
@@ -1,12 +1,12 @@
# Translation of Odoo Server.
# This file contains the translation of the following modules:
-# * sale_stock_available_info_popup
+# * sale_stock_available_info_popup
#
msgid ""
msgstr ""
-"Project-Id-Version: Odoo Server 12.0\n"
+"Project-Id-Version: Odoo Server 13.0\n"
"Report-Msgid-Bugs-To: \n"
-"Last-Translator: <>\n"
+"Last-Translator: \n"
"Language-Team: \n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
@@ -15,7 +15,7 @@ msgstr ""
#. module: sale_stock_available_info_popup
#. openerp-web
-#: code:addons/sale_stock_available_info_popup/static/src/xml/qty_at_date.xml:13
+#: code:addons/sale_stock_available_info_popup/static/src/xml/qty_at_date.xml:0
#, python-format
msgid "Available to promise"
msgstr ""
@@ -32,8 +32,9 @@ msgstr ""
#. module: sale_stock_available_info_popup
#. openerp-web
-#: code:addons/sale_stock_available_info_popup/static/src/xml/qty_at_date.xml:7
+#: code:addons/sale_stock_available_info_popup/static/src/xml/qty_at_date.xml:0
#, python-format
-msgid "widget.data.immediately_usable_qty_today < widget.data.qty_to_deliver and !widget.data.is_mto"
+msgid ""
+"widget.data.immediately_usable_qty_today < widget.data.qty_to_deliver and "
+"!widget.data.is_mto"
msgstr ""
-
diff --git a/sale_stock_available_info_popup/i18n/sl.po b/sale_stock_available_info_popup/i18n/sl.po
index c05a6550..877b19c8 100644
--- a/sale_stock_available_info_popup/i18n/sl.po
+++ b/sale_stock_available_info_popup/i18n/sl.po
@@ -1,6 +1,6 @@
# Translation of Odoo Server.
# This file contains the translation of the following modules:
-# * sale_stock_available_info_popup
+# * sale_stock_available_info_popup
#
msgid ""
msgstr ""
@@ -13,13 +13,13 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: \n"
-"Plural-Forms: nplurals=4; plural=n%100==1 ? 0 : n%100==2 ? 1 : n%100==3 || "
-"n%100==4 ? 2 : 3;\n"
+"Plural-Forms: nplurals=4; plural=n%100==1 ? 0 : n%100==2 ? 1 : n%100==3 || n"
+"%100==4 ? 2 : 3;\n"
"X-Generator: Weblate 3.10\n"
#. module: sale_stock_available_info_popup
#. openerp-web
-#: code:addons/sale_stock_available_info_popup/static/src/xml/qty_at_date.xml:13
+#: code:addons/sale_stock_available_info_popup/static/src/xml/qty_at_date.xml:0
#, python-format
msgid "Available to promise"
msgstr "Lahko obljubimo"
@@ -36,9 +36,11 @@ msgstr "Prodajna postavka"
#. module: sale_stock_available_info_popup
#. openerp-web
-#: code:addons/sale_stock_available_info_popup/static/src/xml/qty_at_date.xml:7
+#: code:addons/sale_stock_available_info_popup/static/src/xml/qty_at_date.xml:0
#, python-format
-msgid "widget.data.immediately_usable_qty_today < widget.data.qty_to_deliver and !widget.data.is_mto"
+msgid ""
+"widget.data.immediately_usable_qty_today < widget.data.qty_to_deliver and !"
+"widget.data.is_mto"
msgstr ""
-"widget.data.immediately_usable_qty_today < widget.data.qty_to_deliver and "
-"!widget.data.is_mto"
+"widget.data.immediately_usable_qty_today < widget.data.qty_to_deliver and !"
+"widget.data.is_mto"
diff --git a/sale_stock_available_info_popup/readme/CONTRIBUTORS.rst b/sale_stock_available_info_popup/readme/CONTRIBUTORS.rst
index b31cef32..bef4cdf8 100644
--- a/sale_stock_available_info_popup/readme/CONTRIBUTORS.rst
+++ b/sale_stock_available_info_popup/readme/CONTRIBUTORS.rst
@@ -2,3 +2,4 @@
* Ernesto Tejeda
* Pedro M. Baeza
+ * Víctor Martínez
diff --git a/sale_stock_available_info_popup/readme/DESCRIPTION.rst b/sale_stock_available_info_popup/readme/DESCRIPTION.rst
index 4e0c04d0..e690dfbc 100644
--- a/sale_stock_available_info_popup/readme/DESCRIPTION.rst
+++ b/sale_stock_available_info_popup/readme/DESCRIPTION.rst
@@ -1,3 +1,3 @@
-This module extends the functionality of 'Sale Stock Info Popup' module
+This module extends the functionality of 'Sale Stock' module
to add the 'Available to promise' quantity of the corresponding product
to the pop-up that show stock information at sales order line level.
diff --git a/sale_stock_available_info_popup/static/description/index.html b/sale_stock_available_info_popup/static/description/index.html
index bb0f6409..aa6b6939 100644
--- a/sale_stock_available_info_popup/static/description/index.html
+++ b/sale_stock_available_info_popup/static/description/index.html
@@ -367,8 +367,8 @@ Sale Stock Available Info Popup
!! This file is generated by oca-gen-addon-readme !!
!! changes will be overwritten. !!
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! -->
-

-This module extends the functionality of ‘Sale Stock Info Popup’ module
+

+This module extends the functionality of ‘Sale Stock’ module
to add the ‘Available to promise’ quantity of the corresponding product
to the pop-up that show stock information at sales order line level.
Table of contents
@@ -390,7 +390,7 @@
- Go to Sales > Orders > quotations and create a new one.
- Add a sale order line with a storable product
-- Click on the icon
in the line and you will
+ - Click on the icon
in the line and you will
see in the popover the ‘Available to promise’ quantity of the
corresponding product.
@@ -404,7 +404,7 @@
Bugs are tracked on GitHub Issues.
In case of trouble, please check there if your issue has already been reported.
If you spotted it first, help us smashing it by providing a detailed and welcomed
-feedback.
+feedback.
Do not contact contributors directly about support or help with technical issues.
diff --git a/sale_stock_available_info_popup/tests/test_sale_stock_available_info_popup.py b/sale_stock_available_info_popup/tests/test_sale_stock_available_info_popup.py
index 1dff449e..ef95d663 100644
--- a/sale_stock_available_info_popup/tests/test_sale_stock_available_info_popup.py
+++ b/sale_stock_available_info_popup/tests/test_sale_stock_available_info_popup.py
@@ -7,7 +7,7 @@
class SaleStockAvailableInfoPopup(SavepointCase):
@classmethod
def setUpClass(cls):
- super(SaleStockAvailableInfoPopup, cls).setUpClass()
+ super().setUpClass()
user_group_stock_user = cls.env.ref("stock.group_stock_user")
cls.user_stock_user = cls.env["res.users"].create(
{
@@ -19,7 +19,7 @@ def setUpClass(cls):
}
)
cls.product = cls.env["product.product"].create(
- {"name": "Storable product", "type": "product",}
+ {"name": "Storable product", "type": "product"}
)
cls.stock_location = cls.env.ref("stock.stock_location_stock")
cls.customers_location = cls.env.ref("stock.stock_location_customers")
From e47c4a37b8ef9bb101dc4e81417ee4460cd1704d Mon Sep 17 00:00:00 2001
From: david
Date: Mon, 4 Oct 2021 11:55:20 +0200
Subject: [PATCH 06/18] [FIX] sale_stock_available_info_popup: cache miss
TT29615
sale_stock_available_info_popup 13.0.1.0.1
---
sale_stock_available_info_popup/__manifest__.py | 2 +-
sale_stock_available_info_popup/models/sale_order.py | 4 +---
2 files changed, 2 insertions(+), 4 deletions(-)
diff --git a/sale_stock_available_info_popup/__manifest__.py b/sale_stock_available_info_popup/__manifest__.py
index 942a5aec..393c080f 100644
--- a/sale_stock_available_info_popup/__manifest__.py
+++ b/sale_stock_available_info_popup/__manifest__.py
@@ -7,7 +7,7 @@
"author": "Tecnativa, Odoo Community Association (OCA)",
"website": "https://github.com/OCA/stock-logistics-warehouse",
"category": "Warehouse Management",
- "version": "13.0.1.0.0",
+ "version": "13.0.1.0.1",
"license": "AGPL-3",
"depends": ["sale_stock", "stock_available"],
"data": ["views/sale_order_views.xml"],
diff --git a/sale_stock_available_info_popup/models/sale_order.py b/sale_stock_available_info_popup/models/sale_order.py
index 53c6eff3..b19ca7f2 100644
--- a/sale_stock_available_info_popup/models/sale_order.py
+++ b/sale_stock_available_info_popup/models/sale_order.py
@@ -16,10 +16,9 @@ class SaleOrderLine(models.Model):
@api.depends("product_id", "product_uom_qty")
def _compute_immediately_usable_qty_today(self):
qty_processed_per_product = defaultdict(lambda: 0)
- remaining = self.env["sale.order.line"]
+ self.immediately_usable_qty_today = False
for line in self.sorted(key=lambda r: r.sequence):
if not line.display_qty_widget:
- remaining |= line
continue
product = line.product_id
qty_processed = qty_processed_per_product[product.id]
@@ -27,4 +26,3 @@ def _compute_immediately_usable_qty_today(self):
product.immediately_usable_qty - qty_processed
)
qty_processed_per_product[product.id] += line.product_uom_qty
- remaining.write({"immediately_usable_qty_today": False})
From 67627589cff8b856ff147eb042ba8b948e81fc72 Mon Sep 17 00:00:00 2001
From: david
Date: Thu, 24 Mar 2022 13:17:46 +0100
Subject: [PATCH 07/18] [FIX] sale_stock_available_info_popup: right context
We must ensure the right context is provided to the product in order to
compute the right quantities in relation to the others.
TT35179
sale_stock_available_info_popup 13.0.1.0.2
---
.../__manifest__.py | 2 +-
.../models/sale_order.py | 8 +-
.../test_sale_stock_available_info_popup.py | 189 ++++++------------
3 files changed, 72 insertions(+), 127 deletions(-)
diff --git a/sale_stock_available_info_popup/__manifest__.py b/sale_stock_available_info_popup/__manifest__.py
index 393c080f..4a326556 100644
--- a/sale_stock_available_info_popup/__manifest__.py
+++ b/sale_stock_available_info_popup/__manifest__.py
@@ -7,7 +7,7 @@
"author": "Tecnativa, Odoo Community Association (OCA)",
"website": "https://github.com/OCA/stock-logistics-warehouse",
"category": "Warehouse Management",
- "version": "13.0.1.0.1",
+ "version": "13.0.1.0.2",
"license": "AGPL-3",
"depends": ["sale_stock", "stock_available"],
"data": ["views/sale_order_views.xml"],
diff --git a/sale_stock_available_info_popup/models/sale_order.py b/sale_stock_available_info_popup/models/sale_order.py
index b19ca7f2..d936b14b 100644
--- a/sale_stock_available_info_popup/models/sale_order.py
+++ b/sale_stock_available_info_popup/models/sale_order.py
@@ -18,9 +18,15 @@ def _compute_immediately_usable_qty_today(self):
qty_processed_per_product = defaultdict(lambda: 0)
self.immediately_usable_qty_today = False
for line in self.sorted(key=lambda r: r.sequence):
+ if line.order_id.commitment_date:
+ date = line.order_id.commitment_date
+ else:
+ date = line._expected_date()
if not line.display_qty_widget:
continue
- product = line.product_id
+ product = line.product_id.with_context(
+ to_date=date, warehouse=line.warehouse_id.id
+ )
qty_processed = qty_processed_per_product[product.id]
line.immediately_usable_qty_today = (
product.immediately_usable_qty - qty_processed
diff --git a/sale_stock_available_info_popup/tests/test_sale_stock_available_info_popup.py b/sale_stock_available_info_popup/tests/test_sale_stock_available_info_popup.py
index ef95d663..189f2d6f 100644
--- a/sale_stock_available_info_popup/tests/test_sale_stock_available_info_popup.py
+++ b/sale_stock_available_info_popup/tests/test_sale_stock_available_info_popup.py
@@ -1,152 +1,91 @@
# Copyright 2020 Tecnativa - Ernesto Tejeda
# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl.html).
-from odoo.tests.common import SavepointCase
+from datetime import timedelta
+
+from odoo.fields import Datetime
+from odoo.tests import Form
+from odoo.tests.common import SavepointCase, users
class SaleStockAvailableInfoPopup(SavepointCase):
@classmethod
def setUpClass(cls):
super().setUpClass()
- user_group_stock_user = cls.env.ref("stock.group_stock_user")
- cls.user_stock_user = cls.env["res.users"].create(
- {
- "name": "Pauline Poivraisselle",
- "login": "pauline",
- "email": "p.p@example.com",
- "notification_type": "inbox",
- "groups_id": [(6, 0, [user_group_stock_user.id])],
- }
- )
+ # Scratch some seconds from the tracking stuff that we won't need
+ cls.env = cls.env(context=dict(cls.env.context, tracking_disable=True))
+ cls.env.ref("base.user_demo").groups_id += cls.env.ref("stock.group_stock_user")
cls.product = cls.env["product.product"].create(
{"name": "Storable product", "type": "product"}
)
- cls.stock_location = cls.env.ref("stock.stock_location_stock")
- cls.customers_location = cls.env.ref("stock.stock_location_customers")
- cls.suppliers_location = cls.env.ref("stock.stock_location_suppliers")
+ cls.partner = cls.env["res.partner"].create({"name": "Mr. Odoo"})
cls.env["stock.quant"].create(
{
"product_id": cls.product.id,
- "location_id": cls.stock_location.id,
+ "location_id": cls.env.ref("stock.stock_location_stock").id,
"quantity": 40.0,
}
)
- cls.picking_out = cls.env["stock.picking"].create(
- {
- "picking_type_id": cls.env.ref("stock.picking_type_out").id,
- "location_id": cls.stock_location.id,
- "location_dest_id": cls.customers_location.id,
- }
- )
- cls.env["stock.move"].create(
- {
- "name": "a move",
- "product_id": cls.product.id,
- "product_uom_qty": 3.0,
- "product_uom": cls.product.uom_id.id,
- "picking_id": cls.picking_out.id,
- "location_id": cls.stock_location.id,
- "location_dest_id": cls.customers_location.id,
- }
- )
- cls.picking_in = cls.env["stock.picking"].create(
- {
- "picking_type_id": cls.env.ref("stock.picking_type_in").id,
- "location_id": cls.suppliers_location.id,
- "location_dest_id": cls.stock_location.id,
- }
- )
- cls.env["stock.move"].create(
- {
- "restrict_partner_id": cls.user_stock_user.partner_id.id,
- "name": "another move",
- "product_id": cls.product.id,
- "product_uom_qty": 5.0,
- "product_uom": cls.product.uom_id.id,
- "picking_id": cls.picking_in.id,
- "location_id": cls.suppliers_location.id,
- "location_dest_id": cls.stock_location.id,
- }
- )
+ picking_form = Form(cls.env["stock.picking"])
+ picking_form.picking_type_id = cls.env.ref("stock.picking_type_in")
+ with picking_form.move_ids_without_package.new() as move:
+ move.product_id = cls.product
+ move.product_uom_qty = 5
+ picking_form.save().action_assign()
+ picking_form = Form(cls.env["stock.picking"])
+ picking_form.picking_type_id = cls.env.ref("stock.picking_type_out")
+ with picking_form.move_ids_without_package.new() as move:
+ move.product_id = cls.product
+ move.product_uom_qty = 3
+ picking_form.save().action_assign()
+ def _create_sale(self):
+ sale_form = Form(self.env["sale.order"])
+ sale_form.partner_id = self.partner
+ return sale_form
+
+ def _add_sale_line(self, sale_form, product, qty=1):
+ with sale_form.order_line.new() as line:
+ line.product_id = self.product
+ line.product_uom_qty = qty
+
+ @users("admin", "demo")
def test_immediately_usable_qty_today(self):
- self.picking_out.action_confirm()
- self.picking_in.action_assign()
- so = self.env["sale.order"].create(
- {
- "partner_id": self.env.ref("base.res_partner_1").id,
- "order_line": [
- (
- 0,
- 0,
- {
- "name": self.product.name,
- "product_id": self.product.id,
- "product_uom_qty": 1,
- "product_uom": self.product.uom_id.id,
- "price_unit": self.product.list_price,
- },
- ),
- ],
- }
- )
- line = so.order_line
- self.assertEqual(
- line.immediately_usable_qty_today, self.product.immediately_usable_qty,
+ sale_form = self._create_sale()
+ self._add_sale_line(sale_form, self.product)
+ sale = sale_form.save()
+ self.assertAlmostEqual(
+ sale.order_line.immediately_usable_qty_today,
+ self.product.immediately_usable_qty,
)
+ @users("admin", "demo")
def test_immediately_usable_qty_today_similar_solines(self):
- """Create a sale order containing three times the same product. The
- quantity available should be different for the 3 lines.
+ """Create a sale order containing three times the same product. The quantity
+ available should be different for the 3 lines.
"""
- so = self.env["sale.order"].create(
- {
- "partner_id": self.env.ref("base.res_partner_1").id,
- "order_line": [
- (
- 0,
- 0,
- {
- "sequence": 1,
- "name": self.product.name,
- "product_id": self.product.id,
- "product_uom_qty": 5,
- "product_uom": self.product.uom_id.id,
- "price_unit": self.product.list_price,
- },
- ),
- (
- 0,
- 0,
- {
- "sequence": 2,
- "name": self.product.name,
- "product_id": self.product.id,
- "product_uom_qty": 5,
- "product_uom": self.product.uom_id.id,
- "price_unit": self.product.list_price,
- },
- ),
- (
- 0,
- 0,
- {
- "sequence": 3,
- "name": self.product.name,
- "product_id": self.product.id,
- "product_uom_qty": 5,
- "product_uom": self.product.uom_id.id,
- "price_unit": self.product.list_price,
- },
- ),
- ],
- }
+ # Modules like stock_available_inmmediately change the behavior of this field
+ # so we have to evaluate their values on the fly
+ qty = self.product.immediately_usable_qty
+ yesterday = Datetime.now() - timedelta(days=1)
+ sale_form = self._create_sale()
+ self._add_sale_line(sale_form, self.product, 5)
+ self._add_sale_line(sale_form, self.product, 5)
+ self._add_sale_line(sale_form, self.product, 5)
+ sale = sale_form.save()
+ self.assertEqual(
+ sale.order_line.mapped("immediately_usable_qty_today"),
+ [qty, qty - 5, qty - 10],
)
+ self.product.invalidate_cache()
+ qty_yesterday = self.product.with_context(
+ to_date=yesterday
+ ).immediately_usable_qty
+ self.assertFalse(qty == qty_yesterday)
+ # Commitment date will affect the computation
+ sale.commitment_date = yesterday
+ sale.order_line.invalidate_cache()
self.assertEqual(
- so.order_line.mapped("immediately_usable_qty_today"),
- [
- self.product.immediately_usable_qty,
- self.product.immediately_usable_qty - 5,
- self.product.immediately_usable_qty - 10,
- ],
+ sale.order_line.mapped("immediately_usable_qty_today"),
+ [qty_yesterday, qty_yesterday - 5, qty_yesterday - 10],
)
From e1e2ce03c6c32b2f90cf36b20308982fd962d944 Mon Sep 17 00:00:00 2001
From: Cesar Andres Sanchez
Date: Tue, 26 Jul 2022 12:27:45 +0200
Subject: [PATCH 08/18] [FIX] sale_stock_available_info_popup:
immediately_usable_qty_today triggers.
TT38197
[UPD] README.rst
sale_stock_available_info_popup 13.0.1.0.3
---
sale_stock_available_info_popup/README.rst | 1 +
sale_stock_available_info_popup/__manifest__.py | 2 +-
sale_stock_available_info_popup/models/sale_order.py | 8 +++++++-
sale_stock_available_info_popup/readme/CONTRIBUTORS.rst | 1 +
.../static/description/index.html | 1 +
5 files changed, 11 insertions(+), 2 deletions(-)
diff --git a/sale_stock_available_info_popup/README.rst b/sale_stock_available_info_popup/README.rst
index eade50bc..bedbabc3 100644
--- a/sale_stock_available_info_popup/README.rst
+++ b/sale_stock_available_info_popup/README.rst
@@ -79,6 +79,7 @@ Contributors
* Ernesto Tejeda
* Pedro M. Baeza
* Víctor Martínez
+ * César A. Sánchez
Maintainers
~~~~~~~~~~~
diff --git a/sale_stock_available_info_popup/__manifest__.py b/sale_stock_available_info_popup/__manifest__.py
index 4a326556..a8a054d9 100644
--- a/sale_stock_available_info_popup/__manifest__.py
+++ b/sale_stock_available_info_popup/__manifest__.py
@@ -7,7 +7,7 @@
"author": "Tecnativa, Odoo Community Association (OCA)",
"website": "https://github.com/OCA/stock-logistics-warehouse",
"category": "Warehouse Management",
- "version": "13.0.1.0.2",
+ "version": "13.0.1.0.3",
"license": "AGPL-3",
"depends": ["sale_stock", "stock_available"],
"data": ["views/sale_order_views.xml"],
diff --git a/sale_stock_available_info_popup/models/sale_order.py b/sale_stock_available_info_popup/models/sale_order.py
index d936b14b..ccb134b6 100644
--- a/sale_stock_available_info_popup/models/sale_order.py
+++ b/sale_stock_available_info_popup/models/sale_order.py
@@ -13,7 +13,13 @@ class SaleOrderLine(models.Model):
compute="_compute_immediately_usable_qty_today"
)
- @api.depends("product_id", "product_uom_qty")
+ @api.depends(
+ "product_id",
+ "product_uom_qty",
+ "order_id.commitment_date",
+ "order_id.date_order",
+ "warehouse_id",
+ )
def _compute_immediately_usable_qty_today(self):
qty_processed_per_product = defaultdict(lambda: 0)
self.immediately_usable_qty_today = False
diff --git a/sale_stock_available_info_popup/readme/CONTRIBUTORS.rst b/sale_stock_available_info_popup/readme/CONTRIBUTORS.rst
index bef4cdf8..f18dd5ed 100644
--- a/sale_stock_available_info_popup/readme/CONTRIBUTORS.rst
+++ b/sale_stock_available_info_popup/readme/CONTRIBUTORS.rst
@@ -3,3 +3,4 @@
* Ernesto Tejeda
* Pedro M. Baeza
* Víctor Martínez
+ * César A. Sánchez
diff --git a/sale_stock_available_info_popup/static/description/index.html b/sale_stock_available_info_popup/static/description/index.html
index aa6b6939..9b020125 100644
--- a/sale_stock_available_info_popup/static/description/index.html
+++ b/sale_stock_available_info_popup/static/description/index.html
@@ -422,6 +422,7 @@
Ernesto Tejeda
Pedro M. Baeza
Víctor Martínez
+César A. Sánchez
From 6d251376c7cc92c1aab89e01cf81b55f55b878cd Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?V=C3=ADctor=20Mart=C3=ADnez?=
Date: Thu, 27 Oct 2022 12:40:14 +0200
Subject: [PATCH 09/18] [MIG] sale_stock_available_info_popup: Migration to
15.0
TT36989
---
sale_stock_available_info_popup/README.rst | 12 ++---
.../__manifest__.py | 8 ++-
sale_stock_available_info_popup/i18n/es.po | 12 -----
.../i18n/sale_stock_available_info_popup.pot | 11 +----
sale_stock_available_info_popup/i18n/sl.po | 15 +++---
.../models/sale_order.py | 8 +--
.../static/description/index.html | 8 +--
.../static/src/xml/qty_at_date.xml | 16 ++----
.../test_sale_stock_available_info_popup.py | 49 ++++++++++---------
9 files changed, 53 insertions(+), 86 deletions(-)
diff --git a/sale_stock_available_info_popup/README.rst b/sale_stock_available_info_popup/README.rst
index bedbabc3..d55205cd 100644
--- a/sale_stock_available_info_popup/README.rst
+++ b/sale_stock_available_info_popup/README.rst
@@ -14,13 +14,13 @@ Sale Stock Available Info Popup
: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/13.0/sale_stock_available_info_popup
+ :target: https://github.com/OCA/stock-logistics-warehouse/tree/15.0/sale_stock_available_info_popup
: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-13-0/stock-logistics-warehouse-13-0-sale_stock_available_info_popup
+ :target: https://translation.odoo-community.org/projects/stock-logistics-warehouse-15-0/stock-logistics-warehouse-15-0-sale_stock_available_info_popup
: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/13.0
+ :target: https://runbot.odoo-community.org/runbot/153/15.0
:alt: Try me on Runbot
|badge1| |badge2| |badge3| |badge4| |badge5|
@@ -50,7 +50,7 @@ quantity of the corresponding product instead of 'Forecast Quantity'.
If that quantity is less than the quantity to deliver, the color of
the icon will be red, indicating an alert; otherwise it will be blue.
-.. |fa_info_circle| image:: https://raw.githubusercontent.com/OCA/stock-logistics-warehouse/13.0/sale_stock_available_info_popup/static/src/img/info-circle-solid.png
+.. |fa_info_circle| image:: https://raw.githubusercontent.com/OCA/stock-logistics-warehouse/15.0/sale_stock_available_info_popup/static/src/img/info-circle-solid.png
:width: 10px
Bug Tracker
@@ -59,7 +59,7 @@ Bug Tracker
Bugs are tracked on `GitHub Issues `_.
In case of trouble, please check there if your issue has already been reported.
If you spotted it first, help us smashing it by providing a detailed and welcomed
-`feedback `_.
+`feedback `_.
Do not contact contributors directly about support or help with technical issues.
@@ -94,6 +94,6 @@ OCA, or the Odoo Community Association, is a nonprofit organization whose
mission is to support the collaborative development of Odoo features and
promote its widespread use.
-This module is part of the `OCA/stock-logistics-warehouse `_ project on GitHub.
+This module is part of the `OCA/stock-logistics-warehouse `_ project on GitHub.
You are welcome to contribute. To learn how please visit https://odoo-community.org/page/Contribute.
diff --git a/sale_stock_available_info_popup/__manifest__.py b/sale_stock_available_info_popup/__manifest__.py
index a8a054d9..a39fc441 100644
--- a/sale_stock_available_info_popup/__manifest__.py
+++ b/sale_stock_available_info_popup/__manifest__.py
@@ -7,10 +7,14 @@
"author": "Tecnativa, Odoo Community Association (OCA)",
"website": "https://github.com/OCA/stock-logistics-warehouse",
"category": "Warehouse Management",
- "version": "13.0.1.0.3",
+ "version": "15.0.1.0.0",
"license": "AGPL-3",
"depends": ["sale_stock", "stock_available"],
"data": ["views/sale_order_views.xml"],
- "qweb": ["static/src/xml/qty_at_date.xml"],
+ "assets": {
+ "web.assets_qweb": [
+ "sale_stock_available_info_popup/static/src/xml/qty_at_date.xml",
+ ],
+ },
"installable": True,
}
diff --git a/sale_stock_available_info_popup/i18n/es.po b/sale_stock_available_info_popup/i18n/es.po
index 25b0ad26..3954725c 100644
--- a/sale_stock_available_info_popup/i18n/es.po
+++ b/sale_stock_available_info_popup/i18n/es.po
@@ -33,15 +33,3 @@ msgstr ""
#: model:ir.model,name:sale_stock_available_info_popup.model_sale_order_line
msgid "Sales Order Line"
msgstr "Línea de pedido de venta"
-
-#. module: sale_stock_available_info_popup
-#. openerp-web
-#: code:addons/sale_stock_available_info_popup/static/src/xml/qty_at_date.xml:0
-#, python-format
-msgid ""
-"widget.data.immediately_usable_qty_today < widget.data.qty_to_deliver and !"
-"widget.data.is_mto"
-msgstr ""
-
-#~ msgid "Product Template"
-#~ msgstr "Plantilla de producto"
diff --git a/sale_stock_available_info_popup/i18n/sale_stock_available_info_popup.pot b/sale_stock_available_info_popup/i18n/sale_stock_available_info_popup.pot
index 8154fda1..64df07d4 100644
--- a/sale_stock_available_info_popup/i18n/sale_stock_available_info_popup.pot
+++ b/sale_stock_available_info_popup/i18n/sale_stock_available_info_popup.pot
@@ -4,7 +4,7 @@
#
msgid ""
msgstr ""
-"Project-Id-Version: Odoo Server 13.0\n"
+"Project-Id-Version: Odoo Server 15.0\n"
"Report-Msgid-Bugs-To: \n"
"Last-Translator: \n"
"Language-Team: \n"
@@ -29,12 +29,3 @@ msgstr ""
#: model:ir.model,name:sale_stock_available_info_popup.model_sale_order_line
msgid "Sales Order Line"
msgstr ""
-
-#. module: sale_stock_available_info_popup
-#. openerp-web
-#: code:addons/sale_stock_available_info_popup/static/src/xml/qty_at_date.xml:0
-#, python-format
-msgid ""
-"widget.data.immediately_usable_qty_today < widget.data.qty_to_deliver and "
-"!widget.data.is_mto"
-msgstr ""
diff --git a/sale_stock_available_info_popup/i18n/sl.po b/sale_stock_available_info_popup/i18n/sl.po
index 877b19c8..e4e21aaa 100644
--- a/sale_stock_available_info_popup/i18n/sl.po
+++ b/sale_stock_available_info_popup/i18n/sl.po
@@ -34,13 +34,10 @@ msgstr "Takoj razpoložljiva današnja kol"
msgid "Sales Order Line"
msgstr "Prodajna postavka"
-#. module: sale_stock_available_info_popup
-#. openerp-web
-#: code:addons/sale_stock_available_info_popup/static/src/xml/qty_at_date.xml:0
#, python-format
-msgid ""
-"widget.data.immediately_usable_qty_today < widget.data.qty_to_deliver and !"
-"widget.data.is_mto"
-msgstr ""
-"widget.data.immediately_usable_qty_today < widget.data.qty_to_deliver and !"
-"widget.data.is_mto"
+#~ msgid ""
+#~ "widget.data.immediately_usable_qty_today < widget.data.qty_to_deliver "
+#~ "and !widget.data.is_mto"
+#~ msgstr ""
+#~ "widget.data.immediately_usable_qty_today < widget.data.qty_to_deliver "
+#~ "and !widget.data.is_mto"
diff --git a/sale_stock_available_info_popup/models/sale_order.py b/sale_stock_available_info_popup/models/sale_order.py
index ccb134b6..3bdf6415 100644
--- a/sale_stock_available_info_popup/models/sale_order.py
+++ b/sale_stock_available_info_popup/models/sale_order.py
@@ -16,7 +16,7 @@ class SaleOrderLine(models.Model):
@api.depends(
"product_id",
"product_uom_qty",
- "order_id.commitment_date",
+ "scheduled_date",
"order_id.date_order",
"warehouse_id",
)
@@ -24,14 +24,10 @@ def _compute_immediately_usable_qty_today(self):
qty_processed_per_product = defaultdict(lambda: 0)
self.immediately_usable_qty_today = False
for line in self.sorted(key=lambda r: r.sequence):
- if line.order_id.commitment_date:
- date = line.order_id.commitment_date
- else:
- date = line._expected_date()
if not line.display_qty_widget:
continue
product = line.product_id.with_context(
- to_date=date, warehouse=line.warehouse_id.id
+ to_date=line.scheduled_date, warehouse=line.warehouse_id.id
)
qty_processed = qty_processed_per_product[product.id]
line.immediately_usable_qty_today = (
diff --git a/sale_stock_available_info_popup/static/description/index.html b/sale_stock_available_info_popup/static/description/index.html
index 9b020125..272e398a 100644
--- a/sale_stock_available_info_popup/static/description/index.html
+++ b/sale_stock_available_info_popup/static/description/index.html
@@ -367,7 +367,7 @@ Sale Stock Available Info Popup
!! This file is generated by oca-gen-addon-readme !!
!! changes will be overwritten. !!
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! -->
-

+

This module extends the functionality of ‘Sale Stock’ module
to add the ‘Available to promise’ quantity of the corresponding product
to the pop-up that show stock information at sales order line level.
@@ -390,7 +390,7 @@
- Go to Sales > Orders > quotations and create a new one.
- Add a sale order line with a storable product
-- Click on the icon
in the line and you will
+ - Click on the icon
in the line and you will
see in the popover the ‘Available to promise’ quantity of the
corresponding product.
@@ -404,7 +404,7 @@
Bugs are tracked on GitHub Issues.
In case of trouble, please check there if your issue has already been reported.
If you spotted it first, help us smashing it by providing a detailed and welcomed
-feedback.
+feedback.
Do not contact contributors directly about support or help with technical issues.
diff --git a/sale_stock_available_info_popup/static/src/xml/qty_at_date.xml b/sale_stock_available_info_popup/static/src/xml/qty_at_date.xml
index dea9486b..34a3a59f 100644
--- a/sale_stock_available_info_popup/static/src/xml/qty_at_date.xml
+++ b/sale_stock_available_info_popup/static/src/xml/qty_at_date.xml
@@ -2,18 +2,8 @@
-
-
- widget.data.immediately_usable_qty_today < widget.data.qty_to_deliver and !widget.data.is_mto
-
-
-
-
+
+
|
Available to promise
@@ -24,5 +14,5 @@
|
-
+
diff --git a/sale_stock_available_info_popup/tests/test_sale_stock_available_info_popup.py b/sale_stock_available_info_popup/tests/test_sale_stock_available_info_popup.py
index 189f2d6f..eac3e370 100644
--- a/sale_stock_available_info_popup/tests/test_sale_stock_available_info_popup.py
+++ b/sale_stock_available_info_popup/tests/test_sale_stock_available_info_popup.py
@@ -4,19 +4,21 @@
from datetime import timedelta
from odoo.fields import Datetime
-from odoo.tests import Form
-from odoo.tests.common import SavepointCase, users
+from odoo.tests import Form, common, new_test_user
+from odoo.tests.common import users
-class SaleStockAvailableInfoPopup(SavepointCase):
+class SaleStockAvailableInfoPopup(common.TransactionCase):
@classmethod
def setUpClass(cls):
super().setUpClass()
- # Scratch some seconds from the tracking stuff that we won't need
- cls.env = cls.env(context=dict(cls.env.context, tracking_disable=True))
- cls.env.ref("base.user_demo").groups_id += cls.env.ref("stock.group_stock_user")
+ cls.sale_user = new_test_user(
+ cls.env,
+ login="sale_user",
+ groups="sales_team.group_sale_salesman",
+ )
cls.product = cls.env["product.product"].create(
- {"name": "Storable product", "type": "product"}
+ {"name": "Storable product", "detailed_type": "product"}
)
cls.partner = cls.env["res.partner"].create({"name": "Mr. Odoo"})
cls.env["stock.quant"].create(
@@ -26,22 +28,23 @@ def setUpClass(cls):
"quantity": 40.0,
}
)
- picking_form = Form(cls.env["stock.picking"])
- picking_form.picking_type_id = cls.env.ref("stock.picking_type_in")
- with picking_form.move_ids_without_package.new() as move:
- move.product_id = cls.product
- move.product_uom_qty = 5
- picking_form.save().action_assign()
- picking_form = Form(cls.env["stock.picking"])
- picking_form.picking_type_id = cls.env.ref("stock.picking_type_out")
+ picking_in = cls._create_picking(cls, cls.env.ref("stock.picking_type_in"), 5)
+ picking_in.action_assign()
+ picking_out = cls._create_picking(cls, cls.env.ref("stock.picking_type_out"), 3)
+ picking_out.action_assign()
+
+ def _create_picking(self, picking_type, qty):
+ picking_form = Form(self.env["stock.picking"])
+ picking_form.picking_type_id = picking_type
with picking_form.move_ids_without_package.new() as move:
- move.product_id = cls.product
- move.product_uom_qty = 3
- picking_form.save().action_assign()
+ move.product_id = self.product
+ move.product_uom_qty = qty
+ return picking_form.save()
def _create_sale(self):
sale_form = Form(self.env["sale.order"])
sale_form.partner_id = self.partner
+ sale_form.user_id = self.sale_user
return sale_form
def _add_sale_line(self, sale_form, product, qty=1):
@@ -49,17 +52,15 @@ def _add_sale_line(self, sale_form, product, qty=1):
line.product_id = self.product
line.product_uom_qty = qty
- @users("admin", "demo")
+ @users("admin", "sale_user")
def test_immediately_usable_qty_today(self):
sale_form = self._create_sale()
self._add_sale_line(sale_form, self.product)
sale = sale_form.save()
- self.assertAlmostEqual(
- sale.order_line.immediately_usable_qty_today,
- self.product.immediately_usable_qty,
- )
+ # 42=40-1+3
+ self.assertAlmostEqual(sale.order_line.immediately_usable_qty_today, 42)
- @users("admin", "demo")
+ @users("admin", "sale_user")
def test_immediately_usable_qty_today_similar_solines(self):
"""Create a sale order containing three times the same product. The quantity
available should be different for the 3 lines.
From cab394096872421e395d962d26e2842cffded81a Mon Sep 17 00:00:00 2001
From: "anjeel.haria"
Date: Tue, 20 Dec 2022 17:50:49 +0530
Subject: [PATCH 10/18] [IMP] sale_stock_available_info_popup: pre-commit stuff
---
sale_stock_available_info_popup/__manifest__.py | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/sale_stock_available_info_popup/__manifest__.py b/sale_stock_available_info_popup/__manifest__.py
index a39fc441..f18e29fd 100644
--- a/sale_stock_available_info_popup/__manifest__.py
+++ b/sale_stock_available_info_popup/__manifest__.py
@@ -5,7 +5,7 @@
"summary": "Adds an 'Available to promise' quantity to the popover shown "
"in sale order line that display stock info of the product",
"author": "Tecnativa, Odoo Community Association (OCA)",
- "website": "https://github.com/OCA/stock-logistics-warehouse",
+ "website": "https://github.com/OCA/stock-logistics-availability",
"category": "Warehouse Management",
"version": "15.0.1.0.0",
"license": "AGPL-3",
From 0fb8212ed9c88691af1f6067baf3c5cf99978fed Mon Sep 17 00:00:00 2001
From: "anjeel.haria"
Date: Tue, 20 Dec 2022 17:53:12 +0530
Subject: [PATCH 11/18] [MIG] sale_stock_available_info_popup: Migration to
16.0
[MIG] sale_stock_available_info_popup: Migration to 16.0
---
sale_stock_available_info_popup/README.rst | 21 ++++++++-----------
.../__manifest__.py | 4 ++--
sale_stock_available_info_popup/i18n/es.po | 2 +-
.../i18n/sale_stock_available_info_popup.pot | 4 ++--
sale_stock_available_info_popup/i18n/sl.po | 2 +-
.../static/description/index.html | 10 ++++-----
.../static/src/xml/qty_at_date.xml | 19 +++++++++++------
.../test_sale_stock_available_info_popup.py | 8 +++++--
8 files changed, 39 insertions(+), 31 deletions(-)
diff --git a/sale_stock_available_info_popup/README.rst b/sale_stock_available_info_popup/README.rst
index d55205cd..85a7ad70 100644
--- a/sale_stock_available_info_popup/README.rst
+++ b/sale_stock_available_info_popup/README.rst
@@ -13,17 +13,14 @@ Sale Stock Available Info Popup
.. |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/15.0/sale_stock_available_info_popup
- :alt: OCA/stock-logistics-warehouse
+.. |badge3| image:: https://img.shields.io/badge/github-OCA%2Fstock--logistics--availability-lightgray.png?logo=github
+ :target: https://github.com/OCA/stock-logistics-availability/tree/16.0/sale_stock_available_info_popup
+ :alt: OCA/stock-logistics-availability
.. |badge4| image:: https://img.shields.io/badge/weblate-Translate%20me-F47D42.png
- :target: https://translation.odoo-community.org/projects/stock-logistics-warehouse-15-0/stock-logistics-warehouse-15-0-sale_stock_available_info_popup
+ :target: https://translation.odoo-community.org/projects/stock-logistics-availability-16-0/stock-logistics-availability-16-0-sale_stock_available_info_popup
: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/15.0
- :alt: Try me on Runbot
-|badge1| |badge2| |badge3| |badge4| |badge5|
+|badge1| |badge2| |badge3| |badge4|
This module extends the functionality of 'Sale Stock' module
to add the 'Available to promise' quantity of the corresponding product
@@ -50,16 +47,16 @@ quantity of the corresponding product instead of 'Forecast Quantity'.
If that quantity is less than the quantity to deliver, the color of
the icon will be red, indicating an alert; otherwise it will be blue.
-.. |fa_info_circle| image:: https://raw.githubusercontent.com/OCA/stock-logistics-warehouse/15.0/sale_stock_available_info_popup/static/src/img/info-circle-solid.png
+.. |fa_info_circle| image:: https://raw.githubusercontent.com/OCA/stock-logistics-availability/16.0/sale_stock_available_info_popup/static/src/img/info-circle-solid.png
:width: 10px
Bug Tracker
===========
-Bugs are tracked on `GitHub Issues `_.
+Bugs are tracked on `GitHub Issues `_.
In case of trouble, please check there if your issue has already been reported.
If you spotted it first, help us smashing it by providing a detailed and welcomed
-`feedback `_.
+`feedback `_.
Do not contact contributors directly about support or help with technical issues.
@@ -94,6 +91,6 @@ OCA, or the Odoo Community Association, is a nonprofit organization whose
mission is to support the collaborative development of Odoo features and
promote its widespread use.
-This module is part of the `OCA/stock-logistics-warehouse `_ project on GitHub.
+This module is part of the `OCA/stock-logistics-availability `_ project on GitHub.
You are welcome to contribute. To learn how please visit https://odoo-community.org/page/Contribute.
diff --git a/sale_stock_available_info_popup/__manifest__.py b/sale_stock_available_info_popup/__manifest__.py
index f18e29fd..90e97308 100644
--- a/sale_stock_available_info_popup/__manifest__.py
+++ b/sale_stock_available_info_popup/__manifest__.py
@@ -7,12 +7,12 @@
"author": "Tecnativa, Odoo Community Association (OCA)",
"website": "https://github.com/OCA/stock-logistics-availability",
"category": "Warehouse Management",
- "version": "15.0.1.0.0",
+ "version": "16.0.1.0.0",
"license": "AGPL-3",
"depends": ["sale_stock", "stock_available"],
"data": ["views/sale_order_views.xml"],
"assets": {
- "web.assets_qweb": [
+ "web.assets_backend": [
"sale_stock_available_info_popup/static/src/xml/qty_at_date.xml",
],
},
diff --git a/sale_stock_available_info_popup/i18n/es.po b/sale_stock_available_info_popup/i18n/es.po
index 3954725c..ced1d73d 100644
--- a/sale_stock_available_info_popup/i18n/es.po
+++ b/sale_stock_available_info_popup/i18n/es.po
@@ -18,7 +18,7 @@ msgstr ""
"X-Generator: Poedit 2.0.6\n"
#. module: sale_stock_available_info_popup
-#. openerp-web
+#. odoo-javascript
#: code:addons/sale_stock_available_info_popup/static/src/xml/qty_at_date.xml:0
#, python-format
msgid "Available to promise"
diff --git a/sale_stock_available_info_popup/i18n/sale_stock_available_info_popup.pot b/sale_stock_available_info_popup/i18n/sale_stock_available_info_popup.pot
index 64df07d4..435e08fb 100644
--- a/sale_stock_available_info_popup/i18n/sale_stock_available_info_popup.pot
+++ b/sale_stock_available_info_popup/i18n/sale_stock_available_info_popup.pot
@@ -4,7 +4,7 @@
#
msgid ""
msgstr ""
-"Project-Id-Version: Odoo Server 15.0\n"
+"Project-Id-Version: Odoo Server 16.0\n"
"Report-Msgid-Bugs-To: \n"
"Last-Translator: \n"
"Language-Team: \n"
@@ -14,7 +14,7 @@ msgstr ""
"Plural-Forms: \n"
#. module: sale_stock_available_info_popup
-#. openerp-web
+#. odoo-javascript
#: code:addons/sale_stock_available_info_popup/static/src/xml/qty_at_date.xml:0
#, python-format
msgid "Available to promise"
diff --git a/sale_stock_available_info_popup/i18n/sl.po b/sale_stock_available_info_popup/i18n/sl.po
index e4e21aaa..a0ce678a 100644
--- a/sale_stock_available_info_popup/i18n/sl.po
+++ b/sale_stock_available_info_popup/i18n/sl.po
@@ -18,7 +18,7 @@ msgstr ""
"X-Generator: Weblate 3.10\n"
#. module: sale_stock_available_info_popup
-#. openerp-web
+#. odoo-javascript
#: code:addons/sale_stock_available_info_popup/static/src/xml/qty_at_date.xml:0
#, python-format
msgid "Available to promise"
diff --git a/sale_stock_available_info_popup/static/description/index.html b/sale_stock_available_info_popup/static/description/index.html
index 272e398a..fe90d517 100644
--- a/sale_stock_available_info_popup/static/description/index.html
+++ b/sale_stock_available_info_popup/static/description/index.html
@@ -367,7 +367,7 @@ Sale Stock Available Info Popup
!! This file is generated by oca-gen-addon-readme !!
!! changes will be overwritten. !!
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! -->
-

+

This module extends the functionality of ‘Sale Stock’ module
to add the ‘Available to promise’ quantity of the corresponding product
to the pop-up that show stock information at sales order line level.
@@ -390,7 +390,7 @@
- Go to Sales > Orders > quotations and create a new one.
- Add a sale order line with a storable product
-- Click on the icon
in the line and you will
+ - Click on the icon
in the line and you will
see in the popover the ‘Available to promise’ quantity of the
corresponding product.
@@ -401,10 +401,10 @@
-
Bugs are tracked on GitHub Issues.
+
Bugs are tracked on GitHub Issues.
In case of trouble, please check there if your issue has already been reported.
If you spotted it first, help us smashing it by providing a detailed and welcomed
-feedback.
+
feedback.
Do not contact contributors directly about support or help with technical issues.
diff --git a/sale_stock_available_info_popup/static/src/xml/qty_at_date.xml b/sale_stock_available_info_popup/static/src/xml/qty_at_date.xml
index 34a3a59f..be55a16a 100644
--- a/sale_stock_available_info_popup/static/src/xml/qty_at_date.xml
+++ b/sale_stock_available_info_popup/static/src/xml/qty_at_date.xml
@@ -2,17 +2,24 @@
-
-
-
+
+
+
|
Available to promise
|
-
-
+
|
-
+
+
diff --git a/sale_stock_available_info_popup/tests/test_sale_stock_available_info_popup.py b/sale_stock_available_info_popup/tests/test_sale_stock_available_info_popup.py
index eac3e370..8c17ec62 100644
--- a/sale_stock_available_info_popup/tests/test_sale_stock_available_info_popup.py
+++ b/sale_stock_available_info_popup/tests/test_sale_stock_available_info_popup.py
@@ -30,8 +30,12 @@ def setUpClass(cls):
)
picking_in = cls._create_picking(cls, cls.env.ref("stock.picking_type_in"), 5)
picking_in.action_assign()
+ picking_in.move_ids[0].move_line_ids[0].qty_done = 5
+ picking_in._action_done()
picking_out = cls._create_picking(cls, cls.env.ref("stock.picking_type_out"), 3)
picking_out.action_assign()
+ picking_out.move_ids[0].move_line_ids[0].qty_done = 3
+ picking_out._action_done()
def _create_picking(self, picking_type, qty):
picking_form = Form(self.env["stock.picking"])
@@ -78,14 +82,14 @@ def test_immediately_usable_qty_today_similar_solines(self):
sale.order_line.mapped("immediately_usable_qty_today"),
[qty, qty - 5, qty - 10],
)
- self.product.invalidate_cache()
+ self.product.invalidate_recordset()
qty_yesterday = self.product.with_context(
to_date=yesterday
).immediately_usable_qty
self.assertFalse(qty == qty_yesterday)
# Commitment date will affect the computation
sale.commitment_date = yesterday
- sale.order_line.invalidate_cache()
+ sale.order_line.invalidate_recordset()
self.assertEqual(
sale.order_line.mapped("immediately_usable_qty_today"),
[qty_yesterday, qty_yesterday - 5, qty_yesterday - 10],
From 175a237e1d52a4787814024be324d05d25a8f9c6 Mon Sep 17 00:00:00 2001
From: Bole
Date: Wed, 1 Mar 2023 14:33:24 +0000
Subject: [PATCH 12/18] Added translation using Weblate (Croatian)
---
sale_stock_available_info_popup/README.rst | 12 ++++--
sale_stock_available_info_popup/i18n/hr.po | 35 +++++++++++++++++
.../static/description/index.html | 38 ++++++++++---------
3 files changed, 64 insertions(+), 21 deletions(-)
create mode 100644 sale_stock_available_info_popup/i18n/hr.po
diff --git a/sale_stock_available_info_popup/README.rst b/sale_stock_available_info_popup/README.rst
index 85a7ad70..7dcee49b 100644
--- a/sale_stock_available_info_popup/README.rst
+++ b/sale_stock_available_info_popup/README.rst
@@ -2,10 +2,13 @@
Sale Stock Available Info Popup
===============================
-.. !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+..
+ !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
!! This file is generated by oca-gen-addon-readme !!
!! changes will be overwritten. !!
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+ !! source digest: sha256:03c40a24f7e84d8161569da2bb53b33f3dbc181a0158651e559492163d7b0583
+ !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
.. |badge1| image:: https://img.shields.io/badge/maturity-Beta-yellow.png
:target: https://odoo-community.org/page/development-status
@@ -19,8 +22,11 @@ Sale Stock Available Info Popup
.. |badge4| image:: https://img.shields.io/badge/weblate-Translate%20me-F47D42.png
:target: https://translation.odoo-community.org/projects/stock-logistics-availability-16-0/stock-logistics-availability-16-0-sale_stock_available_info_popup
:alt: Translate me on Weblate
+.. |badge5| image:: https://img.shields.io/badge/runboat-Try%20me-875A7B.png
+ :target: https://runboat.odoo-community.org/builds?repo=OCA/stock-logistics-availability&target_branch=16.0
+ :alt: Try me on Runboat
-|badge1| |badge2| |badge3| |badge4|
+|badge1| |badge2| |badge3| |badge4| |badge5|
This module extends the functionality of 'Sale Stock' module
to add the 'Available to promise' quantity of the corresponding product
@@ -55,7 +61,7 @@ Bug Tracker
Bugs are tracked on `GitHub Issues `_.
In case of trouble, please check there if your issue has already been reported.
-If you spotted it first, help us smashing it by providing a detailed and welcomed
+If you spotted it first, help us to smash it by providing a detailed and welcomed
`feedback `_.
Do not contact contributors directly about support or help with technical issues.
diff --git a/sale_stock_available_info_popup/i18n/hr.po b/sale_stock_available_info_popup/i18n/hr.po
new file mode 100644
index 00000000..8a0fe777
--- /dev/null
+++ b/sale_stock_available_info_popup/i18n/hr.po
@@ -0,0 +1,35 @@
+# Translation of Odoo Server.
+# This file contains the translation of the following modules:
+# * sale_stock_available_info_popup
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: Odoo Server 16.0\n"
+"Report-Msgid-Bugs-To: \n"
+"PO-Revision-Date: 2023-03-01 17:22+0000\n"
+"Last-Translator: Bole \n"
+"Language-Team: none\n"
+"Language: hr\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: \n"
+"Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && n"
+"%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n"
+"X-Generator: Weblate 4.14.1\n"
+
+#. module: sale_stock_available_info_popup
+#. odoo-javascript
+#: code:addons/sale_stock_available_info_popup/static/src/xml/qty_at_date.xml:0
+#, python-format
+msgid "Available to promise"
+msgstr "Dostupno za ponuditi"
+
+#. module: sale_stock_available_info_popup
+#: model:ir.model.fields,field_description:sale_stock_available_info_popup.field_sale_order_line__immediately_usable_qty_today
+msgid "Immediately Usable Qty Today"
+msgstr "Danas raspoloživa količina"
+
+#. module: sale_stock_available_info_popup
+#: model:ir.model,name:sale_stock_available_info_popup.model_sale_order_line
+msgid "Sales Order Line"
+msgstr "Stavka prodaje"
diff --git a/sale_stock_available_info_popup/static/description/index.html b/sale_stock_available_info_popup/static/description/index.html
index fe90d517..a9b2e543 100644
--- a/sale_stock_available_info_popup/static/description/index.html
+++ b/sale_stock_available_info_popup/static/description/index.html
@@ -1,20 +1,20 @@
-
+
-
+
Sale Stock Available Info Popup
-
diff --git a/sale_stock_available_info_popup/static/src/js/qty_at_date_widget.esm.js b/sale_stock_available_info_popup/static/src/js/qty_at_date_widget.esm.js
new file mode 100644
index 00000000..190d75f1
--- /dev/null
+++ b/sale_stock_available_info_popup/static/src/js/qty_at_date_widget.esm.js
@@ -0,0 +1,12 @@
+/* Copyright 2026 Tecnativa - Carlos Roca
+ * License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). */
+
+import {qtyAtDateWidget} from "@sale_stock/widgets/qty_at_date_widget";
+
+// The popover renders the "Available to promise" quantity, so the field has to be
+// loaded by the widget itself. This way it's available no matter where the widget is
+// rendered (order lines list or order line form dialog).
+qtyAtDateWidget.fieldDependencies.push({
+ name: "immediately_usable_qty_today",
+ type: "float",
+});
diff --git a/sale_stock_available_info_popup/static/src/xml/qty_at_date.xml b/sale_stock_available_info_popup/static/src/xml/qty_at_date.xml
index badf1528..8e2a7ab0 100644
--- a/sale_stock_available_info_popup/static/src/xml/qty_at_date.xml
+++ b/sale_stock_available_info_popup/static/src/xml/qty_at_date.xml
@@ -6,7 +6,6 @@
t-name="sale_stock_available_info_popup.QtyAtDatePopover"
t-inherit="sale_stock.QtyAtDatePopover"
t-inherit-mode="extension"
- owl="1"
>
@@ -14,8 +13,8 @@
Available to promise
|
-
-
+
+
|
diff --git a/sale_stock_available_info_popup/tests/test_sale_stock_available_info_popup.py b/sale_stock_available_info_popup/tests/test_sale_stock_available_info_popup.py
index eb47134b..e867444d 100644
--- a/sale_stock_available_info_popup/tests/test_sale_stock_available_info_popup.py
+++ b/sale_stock_available_info_popup/tests/test_sale_stock_available_info_popup.py
@@ -17,7 +17,7 @@ def setUpClass(cls):
groups="sales_team.group_sale_salesman",
)
cls.product = cls.env["product.product"].create(
- {"name": "Storable product", "detailed_type": "product"}
+ {"name": "Storable product", "type": "consu", "is_storable": True}
)
cls.partner = cls.env["res.partner"].create({"name": "Mr. Odoo"})
cls.env["stock.quant"].create(
@@ -41,7 +41,7 @@ def setUpClass(cls):
def _create_picking(self, picking_type, qty):
picking_form = Form(self.env["stock.picking"])
picking_form.picking_type_id = picking_type
- with picking_form.move_ids_without_package.new() as move:
+ with picking_form.move_ids.new() as move:
move.product_id = self.product
move.product_uom_qty = qty
return picking_form.save()
diff --git a/sale_stock_available_info_popup/views/sale_order_views.xml b/sale_stock_available_info_popup/views/sale_order_views.xml
deleted file mode 100644
index 346720a7..00000000
--- a/sale_stock_available_info_popup/views/sale_order_views.xml
+++ /dev/null
@@ -1,18 +0,0 @@
-
-
-
-
- sale.order.line.tree.inherit
- sale.order
-
-
-
-
-
-
-
-