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

Sale Stock Available Info Popup

+ + +

Beta License: AGPL-3 OCA/stock-logistics-warehouse Translate me on Weblate Try me on Runbot

+

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

+ +
+

Usage

+

To use this module, you need to:

+
    +
  1. Go to Sales > Orders > quotations and create a new one.
  2. +
  3. Add a sale order line with a storable product
  4. +
  5. 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.
  6. +
+

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.

+
+
+

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.

+Odoo Community Association +

OCA, or the Odoo Community Association, is a nonprofit organization whose +mission is to support the collaborative development of Odoo features and +promote its widespread use.

+

This module is part of the OCA/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/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. !! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! --> -

Beta License: AGPL-3 OCA/stock-logistics-warehouse Translate me on Weblate Try me on Runbot

-

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

Beta License: AGPL-3 OCA/stock-logistics-warehouse Translate me on Weblate Try me on Runbot

+

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

Usage

  1. Go to Sales > Orders > quotations and create a new one.
  2. Add a sale order line with a storable product
  3. -
  4. Click on the icon fa_info_circle in the line and you will +
  5. 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.
@@ -404,7 +404,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.

@@ -421,6 +421,7 @@

Contributors

  • Tecnativa:
    • Ernesto Tejeda
    • Pedro M. Baeza
    • +
    • Víctor Martínez
  • @@ -432,7 +433,7 @@

    Maintainers

    OCA, or the Odoo Community Association, is a nonprofit organization whose mission is to support the collaborative development of Odoo features and promote its widespread use.

    -

    This module is part of the OCA/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/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 @@

    Contributors

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

    Beta License: AGPL-3 OCA/stock-logistics-warehouse Translate me on Weblate Try me on Runbot

    +

    Beta License: AGPL-3 OCA/stock-logistics-warehouse Translate me on Weblate Try me on Runbot

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

    Usage

    1. Go to Sales > Orders > quotations and create a new one.
    2. Add a sale order line with a storable product
    3. -
    4. Click on the icon fa_info_circle in the line and you will +
    5. 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.
    @@ -404,7 +404,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.

    @@ -434,7 +434,7 @@

    Maintainers

    OCA, or the Odoo Community Association, is a nonprofit organization whose mission is to support the collaborative development of Odoo features and promote its widespread use.

    -

    This module is part of the OCA/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/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. !! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! --> -

    Beta License: AGPL-3 OCA/stock-logistics-warehouse Translate me on Weblate Try me on Runbot

    +

    Beta License: AGPL-3 OCA/stock-logistics-availability Translate me on Weblate

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

    Usage

    1. Go to Sales > Orders > quotations and create a new one.
    2. Add a sale order line with a storable product
    3. -
    4. Click on the icon fa_info_circle in the line and you will +
    5. 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.
    @@ -401,10 +401,10 @@

    Usage

    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.

    @@ -434,7 +434,7 @@

    Maintainers

    OCA, or the Odoo Community Association, is a nonprofit organization whose mission is to support the collaborative development of Odoo features and promote its widespread use.

    -

    This module is part of the OCA/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/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 -
    -

    Sale Stock Available Info Popup

    +
    + + +Odoo Community Association + +
    +

    Sale Stock Available Info Popup

    -

    Beta License: AGPL-3 OCA/stock-logistics-availability Translate me on Weblate Try me on Runboat

    +

    Beta License: AGPL-3 OCA/stock-logistics-availability Translate me on Weblate Try me on Runboat

    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.

    @@ -387,50 +392,50 @@

    Sale Stock Available Info Popup

    -

    Usage

    +

    Usage

    To use this module, you need to:

      -
    1. Go to Sales > Orders > quotations and create a new one.
    2. -
    3. Add a sale order line with a storable product
    4. -
    5. 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.
    6. +
    7. Go to Sales > Orders > Quotations and create a new one.
    8. +
    9. Add a sale order line with a storable product.
    10. +
    11. Click on the chart icon of 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.

    +

    Note: the quantity is computed at the line level, so if the same product +is added in several lines, every line discounts the quantities of the +previous ones. The commitment date of the order and the warehouse of the +line are taken into account as well.

    -

    Bug Tracker

    +

    Bug Tracker

    Bugs are tracked on GitHub Issues. In case of trouble, please check there if your issue has already been reported. If you spotted it first, help us to smash it by providing a detailed and welcomed -feedback.

    +feedback.

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

    -

    Credits

    +

    Credits

    -

    Authors

    +

    Authors

    • Tecnativa
    -

    Contributors

    +

    Contributors

    • Tecnativa:
      • Ernesto Tejeda
      • Pedro M. Baeza
      • Víctor Martínez
      • César A. Sánchez
      • +
      • Carlos Roca
    -

    Maintainers

    +

    Maintainers

    This module is maintained by the OCA.

    Odoo Community Association @@ -438,10 +443,11 @@

    Maintainers

    OCA, or the Odoo Community Association, is a nonprofit organization whose mission is to support the collaborative development of Odoo features and promote its widespread use.

    -

    This module is part of the OCA/stock-logistics-availability 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/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 - - - - - - - -