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