From 5bb3fd5f0620879d910ff380f4fe95028ae3e80c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Niels=20G=C3=B6ttsch?= Date: Tue, 18 Jun 2024 09:45:23 +0200 Subject: [PATCH 01/27] [add] nfu_sale_product_min_max_qty - initial structure --- nfu_sale_product_min_max_qty/README.rst | 65 +++ nfu_sale_product_min_max_qty/__init__.py | 1 + nfu_sale_product_min_max_qty/__manifest__.py | 11 + .../models/__init__.py | 0 .../models/sale_order_line.py | 5 + .../readme/CONTRIBUTORS.rst | 1 + .../readme/DESCRIPTION.rst | 1 + .../readme/HISTORY.rst | 1 + .../static/description/icon.png | Bin 0 -> 12282 bytes .../static/description/index.html | 428 ++++++++++++++++++ .../views/sale_order_views.xml | 10 + 11 files changed, 523 insertions(+) create mode 100644 nfu_sale_product_min_max_qty/README.rst create mode 100644 nfu_sale_product_min_max_qty/__init__.py create mode 100644 nfu_sale_product_min_max_qty/__manifest__.py create mode 100644 nfu_sale_product_min_max_qty/models/__init__.py create mode 100644 nfu_sale_product_min_max_qty/models/sale_order_line.py create mode 100644 nfu_sale_product_min_max_qty/readme/CONTRIBUTORS.rst create mode 100644 nfu_sale_product_min_max_qty/readme/DESCRIPTION.rst create mode 100644 nfu_sale_product_min_max_qty/readme/HISTORY.rst create mode 100644 nfu_sale_product_min_max_qty/static/description/icon.png create mode 100644 nfu_sale_product_min_max_qty/static/description/index.html create mode 100644 nfu_sale_product_min_max_qty/views/sale_order_views.xml diff --git a/nfu_sale_product_min_max_qty/README.rst b/nfu_sale_product_min_max_qty/README.rst new file mode 100644 index 0000000..8f135ec --- /dev/null +++ b/nfu_sale_product_min_max_qty/README.rst @@ -0,0 +1,65 @@ +========================== +NFU Sale Min Max Quantitiy +========================== + +.. + !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + !! This file is generated by oca-gen-addon-readme !! + !! changes will be overwritten. !! + !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + !! source digest: sha256:4dfaea54e4d01502b433eb5c0dcca409a5fbe2c3f175e29382a19230343183c9 + !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + +.. |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-LGPL--3-blue.png + :target: http://www.gnu.org/licenses/lgpl-3.0-standalone.html + :alt: License: LGPL-3 +.. |badge3| image:: https://img.shields.io/badge/github-bruecksen%2Fife_nfu-lightgray.png?logo=github + :target: https://github.com/bruecksen/ife_nfu/tree/16.0/nfu_sale_product_min_max_qty + :alt: bruecksen/ife_nfu + +|badge1| |badge2| |badge3| + +This module adds a minium and a maximum order quantity field to Sale Orders + +**Table of contents** + +.. contents:: + :local: + +Changelog +========= + +:1.0.0: Initial module. + +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 `_. + +Do not contact contributors directly about support or help with technical issues. + +Credits +======= + +Authors +~~~~~~~ + +* BAKEUP + +Contributors +~~~~~~~~~~~~ + +* Niels Göttsch + +Maintainers +~~~~~~~~~~~ + +This module is part of the `bruecksen/ife_nfu `_ project on GitHub. + +You are welcome to contribute. diff --git a/nfu_sale_product_min_max_qty/__init__.py b/nfu_sale_product_min_max_qty/__init__.py new file mode 100644 index 0000000..0650744 --- /dev/null +++ b/nfu_sale_product_min_max_qty/__init__.py @@ -0,0 +1 @@ +from . import models diff --git a/nfu_sale_product_min_max_qty/__manifest__.py b/nfu_sale_product_min_max_qty/__manifest__.py new file mode 100644 index 0000000..4a7a79c --- /dev/null +++ b/nfu_sale_product_min_max_qty/__manifest__.py @@ -0,0 +1,11 @@ +{ + "name": "NFU Sale Min Max Quantitiy", + "summary": "Add minimum and maximum order quantities to sale orders", + "author": "BAKEUP", + "website": "https://www.bakeup.org", + "category": "Stock", + "version": "16.0.0.0.1", + "depends": ["stock"], + "data": ["views/sale_order_views.xml"], + "license": "LGPL-3", +} diff --git a/nfu_sale_product_min_max_qty/models/__init__.py b/nfu_sale_product_min_max_qty/models/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/nfu_sale_product_min_max_qty/models/sale_order_line.py b/nfu_sale_product_min_max_qty/models/sale_order_line.py new file mode 100644 index 0000000..02734cb --- /dev/null +++ b/nfu_sale_product_min_max_qty/models/sale_order_line.py @@ -0,0 +1,5 @@ +from odoo import models + + +class SaleOrderLine(models.Model): + _inherit = "sale.order.line" diff --git a/nfu_sale_product_min_max_qty/readme/CONTRIBUTORS.rst b/nfu_sale_product_min_max_qty/readme/CONTRIBUTORS.rst new file mode 100644 index 0000000..fda28e1 --- /dev/null +++ b/nfu_sale_product_min_max_qty/readme/CONTRIBUTORS.rst @@ -0,0 +1 @@ +* Niels Göttsch \ No newline at end of file diff --git a/nfu_sale_product_min_max_qty/readme/DESCRIPTION.rst b/nfu_sale_product_min_max_qty/readme/DESCRIPTION.rst new file mode 100644 index 0000000..649dfdc --- /dev/null +++ b/nfu_sale_product_min_max_qty/readme/DESCRIPTION.rst @@ -0,0 +1 @@ +This module adds a minium and a maximum order quantity field to Sale Orders \ No newline at end of file diff --git a/nfu_sale_product_min_max_qty/readme/HISTORY.rst b/nfu_sale_product_min_max_qty/readme/HISTORY.rst new file mode 100644 index 0000000..765ab9c --- /dev/null +++ b/nfu_sale_product_min_max_qty/readme/HISTORY.rst @@ -0,0 +1 @@ +:1.0.0: Initial module. \ No newline at end of file diff --git a/nfu_sale_product_min_max_qty/static/description/icon.png b/nfu_sale_product_min_max_qty/static/description/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..126771222c96d9acfa22f7f2d27f6f4b9ce7feb6 GIT binary patch literal 12282 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

W$<1~*|NZw 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 literal 0 HcmV?d00001 diff --git a/nfu_sale_product_min_max_qty/static/description/index.html b/nfu_sale_product_min_max_qty/static/description/index.html new file mode 100644 index 0000000..9a46f09 --- /dev/null +++ b/nfu_sale_product_min_max_qty/static/description/index.html @@ -0,0 +1,428 @@ + + + + + +NFU Sale Min Max Quantitiy + + + +

+

NFU Sale Min Max Quantitiy

+ + +

Beta License: LGPL-3 bruecksen/ife_nfu

+

This module adds a minium and a maximum order quantity field to Sale Orders

+

Table of contents

+ +
+

Changelog

+ +++ + + + +
1.0.0:Initial module.
+
+
+

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.

+

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

+
+
+

Credits

+
+

Authors

+
    +
  • BAKEUP
  • +
+
+
+

Contributors

+ +
+
+

Maintainers

+

This module is part of the bruecksen/ife_nfu project on GitHub.

+

You are welcome to contribute.

+
+
+
+ + diff --git a/nfu_sale_product_min_max_qty/views/sale_order_views.xml b/nfu_sale_product_min_max_qty/views/sale_order_views.xml new file mode 100644 index 0000000..1ca5b7f --- /dev/null +++ b/nfu_sale_product_min_max_qty/views/sale_order_views.xml @@ -0,0 +1,10 @@ + + + + sale.order.form.product.min_max_qty + sale.order + + + + + From 3b28ac0205986b8337313fd730bad1c9c51550fb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Matthias=20Br=C3=BCck?= Date: Wed, 19 Jun 2024 11:37:17 +1000 Subject: [PATCH 02/27] Add min max inputs to shop --- nfu_sale_product_min_max_qty/__manifest__.py | 7 +++++-- .../models/__init__.py | 1 + .../models/sale_order_line.py | 5 ++++- .../views/sale_order_views.xml | 16 +++++++++------ .../views/templates.xml | 20 +++++++++++++++++++ 5 files changed, 40 insertions(+), 9 deletions(-) create mode 100644 nfu_sale_product_min_max_qty/views/templates.xml diff --git a/nfu_sale_product_min_max_qty/__manifest__.py b/nfu_sale_product_min_max_qty/__manifest__.py index 4a7a79c..450effe 100644 --- a/nfu_sale_product_min_max_qty/__manifest__.py +++ b/nfu_sale_product_min_max_qty/__manifest__.py @@ -5,7 +5,10 @@ "website": "https://www.bakeup.org", "category": "Stock", "version": "16.0.0.0.1", - "depends": ["stock"], - "data": ["views/sale_order_views.xml"], + "depends": ["sale_management", "website_sale"], + "data": [ + "views/sale_order_views.xml", + 'views/templates.xml', + ], "license": "LGPL-3", } diff --git a/nfu_sale_product_min_max_qty/models/__init__.py b/nfu_sale_product_min_max_qty/models/__init__.py index e69de29..b4f6336 100644 --- a/nfu_sale_product_min_max_qty/models/__init__.py +++ b/nfu_sale_product_min_max_qty/models/__init__.py @@ -0,0 +1 @@ +from . import sale_order_line \ No newline at end of file diff --git a/nfu_sale_product_min_max_qty/models/sale_order_line.py b/nfu_sale_product_min_max_qty/models/sale_order_line.py index 02734cb..6899a27 100644 --- a/nfu_sale_product_min_max_qty/models/sale_order_line.py +++ b/nfu_sale_product_min_max_qty/models/sale_order_line.py @@ -1,5 +1,8 @@ -from odoo import models +from odoo import models, fields class SaleOrderLine(models.Model): _inherit = "sale.order.line" + + product_uom_min_qty = fields.Float(string="Max quantity", digits="Product Unit of Measure") + product_uom_max_qty = fields.Float(string="Min quantity", digits="Product Unit of Measure") diff --git a/nfu_sale_product_min_max_qty/views/sale_order_views.xml b/nfu_sale_product_min_max_qty/views/sale_order_views.xml index 1ca5b7f..150741e 100644 --- a/nfu_sale_product_min_max_qty/views/sale_order_views.xml +++ b/nfu_sale_product_min_max_qty/views/sale_order_views.xml @@ -1,10 +1,14 @@ - sale.order.form.product.min_max_qty - sale.order - - - + sale.order.form.product.min_max_qty + sale.order + + + + + + + - + \ No newline at end of file diff --git a/nfu_sale_product_min_max_qty/views/templates.xml b/nfu_sale_product_min_max_qty/views/templates.xml new file mode 100644 index 0000000..ecc7d1e --- /dev/null +++ b/nfu_sale_product_min_max_qty/views/templates.xml @@ -0,0 +1,20 @@ + + + + \ No newline at end of file From 12814d7dafa064f91607a276388c31390bd7a8ac Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Matthias=20Br=C3=BCck?= Date: Wed, 19 Jun 2024 12:16:10 +1000 Subject: [PATCH 03/27] WIP save min max values of order line --- nfu_sale_product_min_max_qty/__init__.py | 1 + 1 file changed, 1 insertion(+) diff --git a/nfu_sale_product_min_max_qty/__init__.py b/nfu_sale_product_min_max_qty/__init__.py index 0650744..38718f0 100644 --- a/nfu_sale_product_min_max_qty/__init__.py +++ b/nfu_sale_product_min_max_qty/__init__.py @@ -1 +1,2 @@ from . import models +from . import controllers \ No newline at end of file From 618fe289c9da90012aefa8fb5dd09c617e97e27d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Matthias=20Br=C3=BCck?= Date: Thu, 20 Jun 2024 13:37:45 +1000 Subject: [PATCH 04/27] Add contributor --- nfu_sale_product_min_max_qty/README.rst | 1 + 1 file changed, 1 insertion(+) diff --git a/nfu_sale_product_min_max_qty/README.rst b/nfu_sale_product_min_max_qty/README.rst index 8f135ec..3d74009 100644 --- a/nfu_sale_product_min_max_qty/README.rst +++ b/nfu_sale_product_min_max_qty/README.rst @@ -56,6 +56,7 @@ Contributors ~~~~~~~~~~~~ * Niels Göttsch +* Matthias Brück Maintainers ~~~~~~~~~~~ From 334269b9cf65df90502b5c8afeb4fe026f5176ca Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Matthias=20Br=C3=BCck?= Date: Thu, 20 Jun 2024 13:38:48 +1000 Subject: [PATCH 05/27] Change github repository --- nfu_sale_product_min_max_qty/README.rst | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/nfu_sale_product_min_max_qty/README.rst b/nfu_sale_product_min_max_qty/README.rst index 3d74009..9c7877b 100644 --- a/nfu_sale_product_min_max_qty/README.rst +++ b/nfu_sale_product_min_max_qty/README.rst @@ -17,7 +17,7 @@ NFU Sale Min Max Quantitiy :target: http://www.gnu.org/licenses/lgpl-3.0-standalone.html :alt: License: LGPL-3 .. |badge3| image:: https://img.shields.io/badge/github-bruecksen%2Fife_nfu-lightgray.png?logo=github - :target: https://github.com/bruecksen/ife_nfu/tree/16.0/nfu_sale_product_min_max_qty + :target: https://github.com/bakeupboys/nfu/tree/16.0/nfu_sale_product_min_max_qty :alt: bruecksen/ife_nfu |badge1| |badge2| |badge3| @@ -37,10 +37,10 @@ Changelog 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 to smash it by providing a detailed and welcomed -`feedback `_. +`feedback `_. Do not contact contributors directly about support or help with technical issues. @@ -61,6 +61,6 @@ Contributors Maintainers ~~~~~~~~~~~ -This module is part of the `bruecksen/ife_nfu `_ project on GitHub. +This module is part of the `bruecksen/ife_nfu `_ project on GitHub. You are welcome to contribute. From 685d3c0d1d56533c50863f8ebe763b904e07f651 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Matthias=20Br=C3=BCck?= Date: Thu, 20 Jun 2024 13:39:35 +1000 Subject: [PATCH 06/27] Update description --- nfu_sale_product_min_max_qty/README.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/nfu_sale_product_min_max_qty/README.rst b/nfu_sale_product_min_max_qty/README.rst index 9c7877b..f68c655 100644 --- a/nfu_sale_product_min_max_qty/README.rst +++ b/nfu_sale_product_min_max_qty/README.rst @@ -22,7 +22,7 @@ NFU Sale Min Max Quantitiy |badge1| |badge2| |badge3| -This module adds a minium and a maximum order quantity field to Sale Orders +This module adds a minium and a maximum order quantity field to Sale Orders and the Webshop. **Table of contents** From e6fec01a608b125741ba84ec4628cdb5b140cbc0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Matthias=20Br=C3=BCck?= Date: Thu, 20 Jun 2024 16:15:32 +1000 Subject: [PATCH 07/27] Add file to gitignore --- .gitignore | 1 + 1 file changed, 1 insertion(+) diff --git a/.gitignore b/.gitignore index 6b757b0..239a50b 100644 --- a/.gitignore +++ b/.gitignore @@ -159,3 +159,4 @@ cython_debug/ # option (not recommended) you can uncomment the following to ignore the entire idea folder. .idea/ .vscode +.DS_Store From 7cf45db2a34b5b755f731a01844b2221891bcac9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Matthias=20Br=C3=BCck?= Date: Thu, 20 Jun 2024 16:17:41 +1000 Subject: [PATCH 08/27] Add min,max field to checkout, add field to json request, process fields when updating SaleOrderLine --- nfu_sale_product_min_max_qty/__manifest__.py | 5 ++ .../controllers/__init__.py | 1 + .../controllers/main.py | 16 ++++ .../models/__init__.py | 3 +- .../models/sale_order.py | 32 +++++++ .../models/sale_order_line.py | 4 +- .../static/src/js/website_sale.js | 86 +++++++++++++++++++ .../views/sale_order_views.xml | 2 +- .../views/templates.xml | 59 ++++++++++--- 9 files changed, 190 insertions(+), 18 deletions(-) create mode 100644 nfu_sale_product_min_max_qty/controllers/__init__.py create mode 100644 nfu_sale_product_min_max_qty/controllers/main.py create mode 100644 nfu_sale_product_min_max_qty/models/sale_order.py create mode 100644 nfu_sale_product_min_max_qty/static/src/js/website_sale.js diff --git a/nfu_sale_product_min_max_qty/__manifest__.py b/nfu_sale_product_min_max_qty/__manifest__.py index 450effe..7555177 100644 --- a/nfu_sale_product_min_max_qty/__manifest__.py +++ b/nfu_sale_product_min_max_qty/__manifest__.py @@ -10,5 +10,10 @@ "views/sale_order_views.xml", 'views/templates.xml', ], + 'assets': { + "web.assets_frontend": [ + "nfu_sale_product_min_max_qty/static/src/js/website_sale.js" + ] + }, "license": "LGPL-3", } diff --git a/nfu_sale_product_min_max_qty/controllers/__init__.py b/nfu_sale_product_min_max_qty/controllers/__init__.py new file mode 100644 index 0000000..deec4a8 --- /dev/null +++ b/nfu_sale_product_min_max_qty/controllers/__init__.py @@ -0,0 +1 @@ +from . import main \ No newline at end of file diff --git a/nfu_sale_product_min_max_qty/controllers/main.py b/nfu_sale_product_min_max_qty/controllers/main.py new file mode 100644 index 0000000..0aa1f84 --- /dev/null +++ b/nfu_sale_product_min_max_qty/controllers/main.py @@ -0,0 +1,16 @@ +# -*- coding: utf-8 -*- +from odoo.http import request +from odoo import fields, http + +from odoo.addons.website_sale.controllers.main import WebsiteSale + + +class WebsiteSaleMinMax(WebsiteSale): + + @http.route() + def cart_update(self, *args, min_qty=None, max_qty=None, **kw): + """ Override to parse to datetime optional pickup and return dates. + """ + product_uom_min_qty = fields.Float(min_qty) + product_uom_max_qty = fields.Float(max_qty) + return super().cart_update(*args, min_qty=product_uom_min_qty, max_qty=product_uom_max_qty, **kw) \ No newline at end of file diff --git a/nfu_sale_product_min_max_qty/models/__init__.py b/nfu_sale_product_min_max_qty/models/__init__.py index b4f6336..91f1542 100644 --- a/nfu_sale_product_min_max_qty/models/__init__.py +++ b/nfu_sale_product_min_max_qty/models/__init__.py @@ -1 +1,2 @@ -from . import sale_order_line \ No newline at end of file +from . import sale_order_line +from . import sale_order \ No newline at end of file diff --git a/nfu_sale_product_min_max_qty/models/sale_order.py b/nfu_sale_product_min_max_qty/models/sale_order.py new file mode 100644 index 0000000..bf8f353 --- /dev/null +++ b/nfu_sale_product_min_max_qty/models/sale_order.py @@ -0,0 +1,32 @@ +# Part of Odoo. See LICENSE file for full copyright and licensing details. + +from odoo import _, fields, models + + +class SaleOrder(models.Model): + _inherit = 'sale.order' + + + def _prepare_order_line_values( + self, product_id, quantity, linked_line_id=False, + no_variant_attribute_values=None, product_custom_attribute_values=None, + **kwargs + ): + values = super()._prepare_order_line_values(product_id, quantity, linked_line_id=linked_line_id, no_variant_attribute_values=no_variant_attribute_values, product_custom_attribute_values=product_custom_attribute_values, **kwargs) + values.update({ + 'product_uom_min_qty': quantity, + 'product_uom_max_qty': kwargs.get('max_qty', quantity), + }) + return values + + def _prepare_order_line_update_values( + self, order_line, quantity, linked_line_id=False, **kwargs + ): + values = super()._prepare_order_line_update_values(order_line, quantity, linked_line_id=linked_line_id, **kwargs) + max_qty = kwargs.get('max_qty', quantity) + if quantity != order_line.product_uom_min_qty: + values['product_uom_min_qty'] = quantity + if max_qty and max_qty != order_line.product_uom_max_qty: + values['product_uom_max_qty'] = max_qty + + return values diff --git a/nfu_sale_product_min_max_qty/models/sale_order_line.py b/nfu_sale_product_min_max_qty/models/sale_order_line.py index 6899a27..3552fa0 100644 --- a/nfu_sale_product_min_max_qty/models/sale_order_line.py +++ b/nfu_sale_product_min_max_qty/models/sale_order_line.py @@ -4,5 +4,5 @@ from odoo import models, fields class SaleOrderLine(models.Model): _inherit = "sale.order.line" - product_uom_min_qty = fields.Float(string="Max quantity", digits="Product Unit of Measure") - product_uom_max_qty = fields.Float(string="Min quantity", digits="Product Unit of Measure") + product_uom_min_qty = fields.Float(string="Min qty.", digits="Product Unit of Measure") + product_uom_max_qty = fields.Float(string="Max qty.", digits="Product Unit of Measure") diff --git a/nfu_sale_product_min_max_qty/static/src/js/website_sale.js b/nfu_sale_product_min_max_qty/static/src/js/website_sale.js new file mode 100644 index 0000000..0a91598 --- /dev/null +++ b/nfu_sale_product_min_max_qty/static/src/js/website_sale.js @@ -0,0 +1,86 @@ +odoo.define('nfu_sale_product_min_max_qty.website_min_max_qty', function (require) { + 'use strict'; + var core = require('web.core'); + var _t = core._t; + var core = require('web.core'); + var ajax = require('web.ajax'); + var wSaleUtils = require('website_sale.utils'); + var publicWidget = require('web.public.widget'); + require('website_sale.website_sale'); + console.log('here1'); + publicWidget.registry.WebsiteSale.include({ + + onClickAddCartJSON: function (ev) { + + ev.preventDefault(); + $('.css_quantity').popover('dispose'); + var $link = $(ev.currentTarget); + var $input = $link.closest('.input-group').find("input"); + var min = parseFloat($input.data("min") || 0); + var previousQty = parseFloat($input.val() || 0, 10); + var quantity = ($link.has(".fa-minus").length ? -1 : 1) + previousQty; + if (quantity < min) { + $input.closest('.css_quantity').popover({ + content: _t(`Minimum Quantity is ${min}.`), + title: _t("Warning"), + placement: "left", + trigger: 'focus', + html: true, + }); + $input.closest('.css_quantity').popover('show'); + + setTimeout(function () { + $('.css_quantity').popover('dispose') + }, 3000); + } + this._super(ev); + + }, + + /** + * Adds the stock checking to the regular method + * @override + */ + _changeCartQuantity: function ($input, value, $dom_optional, line_id, productIDs) { + console.log('here2'); + _.each($dom_optional, function (elem) { + $(elem).find('.js_quantity').text(value); + productIDs.push($(elem).find('span[data-product-id]').data('product-id')); + }); + $input.data('update_change', true); + var max_qty = parseInt($input.closest('tr').find('input[name="max-qty"]').val(), 0); + var set_qty = parseInt($input.closest('tr').find('input[name!="max-qty"]').val(), 0); + this._rpc({ + route: "/shop/cart/update_json", + params: { + line_id: line_id, + product_id: parseInt($input.data('product-id'), 10), + set_qty: set_qty, + max_qty: max_qty, + }, + }).then(function (data) { + $input.data('update_change', false); + var check_value = parseInt($input.val() || 0, 10); + if (isNaN(check_value)) { + check_value = 1; + } + if (value !== check_value) { + $input.trigger('change'); + return; + } + sessionStorage.setItem('website_sale_cart_quantity', data.cart_quantity); + if (!data.cart_quantity) { + return window.location = '/shop/cart'; + } + $input.val(data.quantity); + $('.js_quantity[data-line-id='+line_id+']').val(data.quantity).text(data.quantity); + + wSaleUtils.updateCartNavBar(data); + wSaleUtils.showWarning(data.warning); + // Propagating the change to the express checkout forms + core.bus.trigger('cart_amount_changed', data.amount, data.minor_amount); + }); + } + }); + +}); diff --git a/nfu_sale_product_min_max_qty/views/sale_order_views.xml b/nfu_sale_product_min_max_qty/views/sale_order_views.xml index 150741e..7b4059b 100644 --- a/nfu_sale_product_min_max_qty/views/sale_order_views.xml +++ b/nfu_sale_product_min_max_qty/views/sale_order_views.xml @@ -6,8 +6,8 @@ - + diff --git a/nfu_sale_product_min_max_qty/views/templates.xml b/nfu_sale_product_min_max_qty/views/templates.xml index ecc7d1e..611340f 100644 --- a/nfu_sale_product_min_max_qty/views/templates.xml +++ b/nfu_sale_product_min_max_qty/views/templates.xml @@ -1,20 +1,51 @@ -