diff --git a/website_sale_cart_with_unconfirmed_budget/controllers/website_sale.py b/website_sale_cart_with_unconfirmed_budget/controllers/website_sale.py index f55bf691..3c511948 100644 --- a/website_sale_cart_with_unconfirmed_budget/controllers/website_sale.py +++ b/website_sale_cart_with_unconfirmed_budget/controllers/website_sale.py @@ -1,35 +1,125 @@ -from odoo import fields, http +import logging + +from odoo import SUPERUSER_ID, fields, http from odoo.http import request from odoo.addons.website_sale.controllers.main import WebsiteSale +_logger = logging.getLogger(__name__) + class WebsiteSale(WebsiteSale): @http.route(["/shop/cart"], type="http", auth="public", website=True, sitemap=False) def cart(self, access_token=None, revive="", **post): - order = request.website.sale_get_order() - if order and order.state != "draft": + _logger.info( + "Entrando a la función cart con access_token: %s y revive: %s", + access_token, + revive, + ) + + SaleOrder = request.env["sale.order"].sudo() + sale_order_id = request.session.get("sale_order_id") + _logger.debug("ID del pedido en la sesión: %s", sale_order_id) + + if sale_order_id: + sale_order_sudo = SaleOrder.browse(sale_order_id).exists() + _logger.debug("Pedido encontrado en la sesión: %s", sale_order_sudo) + elif request.env.user and not request.env.user._is_public(): + sale_order_sudo = request.env.user.partner_id.last_website_so_id + _logger.debug("Pedido encontrado para el usuario: %s", sale_order_sudo) + + if sale_order_sudo: + available_pricelists = self.get_pricelist_available() + _logger.debug("Listas de precios disponibles: %s", available_pricelists) + + if sale_order_sudo.pricelist_id not in available_pricelists: + _logger.warning( + "La lista de precios del pedido no está disponible." + ) + sale_order_sudo = None + else: + fpos = ( + sale_order_sudo.env["account.fiscal.position"] + .with_company(sale_order_sudo.company_id) + ._get_fiscal_position( + sale_order_sudo.partner_id, + delivery=sale_order_sudo.partner_shipping_id, + ) + ) + _logger.debug("Posición fiscal obtenida: %s", fpos) + if fpos.id != sale_order_sudo.fiscal_position_id.id: + _logger.warning( + "La posición fiscal ha cambiado, invalidando el pedido." + ) + sale_order_sudo = None + else: + sale_order_sudo = SaleOrder + _logger.debug("No se encontró un pedido previo, se creará uno nuevo.") + + if sale_order_sudo and sale_order_sudo.state in ( + "pending", + "authorized", + "done", + ): + _logger.warning( + "El pedido está en un estado no válido: %s", sale_order_sudo.state + ) + sale_order_sudo = None + + if sale_order_sudo and sale_order_sudo.state not in ["draft", "sent"]: + _logger.info( + "El pedido tiene un estado diferente de 'draft' y 'sent',\ + reiniciando el ID del pedido en la sesión." + ) request.session["sale_order_id"] = None - order = request.website.sale_get_order() + sale_order_sudo = SaleOrder + + if not sale_order_sudo: + partner_sudo = request.env.user.partner_id + _logger.info("Creando un nuevo pedido para el socio: %s", partner_sudo.name) + so_data = request.env["website"]._prepare_sale_order_values(partner_sudo) + sale_order_sudo = SaleOrder.with_user(SUPERUSER_ID).create(so_data) - request.session["website_sale_cart_quantity"] = order.cart_quantity + request.session["sale_order_id"] = sale_order_sudo.id + request.session["website_sale_cart_quantity"] = ( + sale_order_sudo.cart_quantity + ) + sale_order_sudo = sale_order_sudo.with_user(request.env.user).sudo() + + _logger.debug( + "Cantidad del carrito antes de la actualización: %s", + request.session.get("website_sale_cart_quantity", 0), + ) + request.session["website_sale_cart_quantity"] = sale_order_sudo.cart_quantity values = { - "website_sale_order": order, + "website_sale_order": sale_order_sudo, "date": fields.Date.today(), "suggested_products": [], } - if order: - values.update(order._get_website_sale_extra_values()) - order.order_line.filtered( + if sale_order_sudo: + _logger.info("Actualizando valores adicionales para el pedido.") + values.update(sale_order_sudo._get_website_sale_extra_values()) + + _logger.debug( + "Líneas del pedido antes de limpiar: %s", sale_order_sudo.order_line + ) + sale_order_sudo.order_line.filtered( lambda line: line.product_id and not line.product_id.active ).unlink() - values["suggested_products"] = order._cart_accessories() - values.update(self._get_express_shop_payment_values(order)) + _logger.info("Líneas inactivas eliminadas del pedido.") + + _logger.info("Calculando productos sugeridos para el pedido.") + values["suggested_products"] = sale_order_sudo._cart_accessories() + values.update(self._get_express_shop_payment_values(sale_order_sudo)) + + response = super().cart(access_token=access_token, revive=revive, **post) + response.qcontext.update(values) - return request.render("website_sale.cart", values) + _logger.info("Valores de respuesta actualizados: %s", values) + return response @http.route( ["/shop/cart/update"], @@ -48,6 +138,13 @@ def cart_update( express=False, **kwargs ): + _logger.info( + "Actualizando carrito con producto_id: %s, add_qty: %s, set_qty: %s", + product_id, + add_qty, + set_qty, + ) + sale_order = super().cart_update( product_id=product_id, add_qty=add_qty, @@ -59,8 +156,10 @@ def cart_update( ) request.session["website_sale_cart_quantity"] = sale_order.cart_quantity + _logger.info("Cantidad del carrito actualizada a: %s", sale_order.cart_quantity) if express: + _logger.info("Redirigiendo a la página de checkout en modo expreso.") return request.redirect("/shop/checkout?express=1") return request.redirect("/shop/cart") @@ -84,6 +183,15 @@ def cart_update_json( no_variant_attribute_values=None, **kw ): + _logger.info( + "Actualizando carrito (JSON) con producto_id: %s,\ + line_id: %s, add_qty: %s, set_qty: %s", + product_id, + line_id, + add_qty, + set_qty, + ) + values = super().cart_update_json( product_id=product_id, line_id=line_id, @@ -96,5 +204,8 @@ def cart_update_json( ) request.session["website_sale_cart_quantity"] = values.get("cart_quantity", 0) + _logger.info( + "Cantidad del carrito actualizada a: %s", values.get("cart_quantity", 0) + ) return values diff --git a/website_sale_cart_with_unconfirmed_budget/models/sale_order.py b/website_sale_cart_with_unconfirmed_budget/models/sale_order.py index 3b8e76fd..e0e0a5e2 100644 --- a/website_sale_cart_with_unconfirmed_budget/models/sale_order.py +++ b/website_sale_cart_with_unconfirmed_budget/models/sale_order.py @@ -5,25 +5,34 @@ class SaleOrder(models.Model): _inherit = "sale.order" @api.model - def create(self, vals): - unconfirmed_budget = self.env["sale.order"].search( - [ - ("state", "=", "draft"), - ("partner_id", "=", vals.get("partner_id")), - ], - limit=1, - ) + def create(self, vals_list): + if isinstance(vals_list, dict): + vals_list = [vals_list] - if unconfirmed_budget: - unconfirmed_budget.order_line.unlink() - for line in vals.get("order_line", []): - unconfirmed_budget.order_line.create( - { - "order_id": unconfirmed_budget.id, - "product_id": line[2]["product_id"], - "product_uom_qty": line[2]["product_uom_qty"], - } - ) - return unconfirmed_budget + created_orders = self.browse() - return super().create(vals) + for vals in vals_list: + unconfirmed_budget = self.env["sale.order"].search( + [ + ("state", "=", "draft"), + ("partner_id", "=", vals.get("partner_id")), + ], + limit=1, + ) + + if unconfirmed_budget: + unconfirmed_budget.order_line.unlink() + for line in vals.get("order_line", []): + unconfirmed_budget.order_line.create( + { + "order_id": unconfirmed_budget.id, + "product_id": line[2]["product_id"], + "product_uom_qty": line[2]["product_uom_qty"], + } + ) + created_orders += unconfirmed_budget + else: + created_order = super().create(vals) + created_orders += created_order + + return created_orders