[FIX] website_sale_stock: check cart before payment
Have a Storable Product configured to 'Show inventory below a threshold and prevent sales if not enough stock' (availability settings). Have a quantity available of such product, i.e 100 From the shop create 2 sessions with 2 different users A and B. With both follow the steps in parallel: - put 100 of product in cart - go to checkout up to payment screen Press 'Pay Now' with A (and confirm the order in backend if auto confirm is not enabled so available quantity is updated) Press 'Pay Now' with B 200 of product are requested because all cart checks for availability are done before payment but not on the final step. Adding a final step of check for availability opw-2261598 closes odoo/odoo#52954 X-original-commit: 4d3f2fbdcda68d4f0e0bb3bb34d51e71d963621b Signed-off-by: Nicolas Lempereur (nle) <nle@odoo.com> Signed-off-by: Nicolas Martinelli (nim) <nim@odoo.com>
This commit is contained in:
@@ -2,3 +2,4 @@
|
||||
# Part of Odoo. See LICENSE file for full copyright and licensing details.
|
||||
|
||||
from . import variant
|
||||
from . import main
|
||||
|
||||
@@ -0,0 +1,26 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
# Part of Odoo. See LICENSE file for full copyright and licensing details.
|
||||
from odoo.addons.website_sale.controllers.main import WebsiteSale
|
||||
|
||||
from odoo import http,_
|
||||
from odoo.http import request
|
||||
from odoo.exceptions import ValidationError
|
||||
|
||||
|
||||
class WebsiteSaleStock(WebsiteSale):
|
||||
@http.route()
|
||||
def payment_transaction(self, **kwargs):
|
||||
""" Payment transaction override to double check cart quantities before
|
||||
placing the order
|
||||
"""
|
||||
order = request.website.sale_get_order()
|
||||
values = []
|
||||
for line in order.order_line:
|
||||
if line.product_id.type == 'product' and line.product_id.inventory_availability in ['always', 'threshold']:
|
||||
cart_qty = sum(order.order_line.filtered(lambda p: p.product_id.id == line.product_id.id).mapped('product_uom_qty'))
|
||||
avl_qty = line.product_id.with_context(warehouse=order.warehouse_id.id).virtual_available
|
||||
if cart_qty > avl_qty:
|
||||
values.append(_('You ask for %s products but only %s is available') % (cart_qty, avl_qty if avl_qty > 0 else 0))
|
||||
if values:
|
||||
raise ValidationError('. '.join(values) + '.')
|
||||
return super(WebsiteSaleStock, self).payment_transaction(**kwargs)
|
||||
Reference in New Issue
Block a user