ed92991872
Agent-Logs-Url: https://github.com/dsaub/proyecto-final/sessions/49df17c8-213a-4e23-adfe-465a0104f6a3 Co-authored-by: dsaub <54474838+dsaub@users.noreply.github.com>
2.4 KiB
2.4 KiB
create_order_from_cart
Archivo: tienda/views.py
Tipo: Función auxiliar pública
Descripción
Crea un pedido (Order) a partir del contenido actual del carrito, descuenta el stock de cada producto y vacía el carrito. Es el núcleo de la lógica de confirmación de compra.
El proceso completo se ejecuta dentro de una transacción atómica con bloqueos de fila:
- Verifica que el carrito no está vacío.
- Calcula el precio de cada ítem con IVA.
- Libera reservas expiradas.
- Si se proporcionó una reserva de stock, la bloquea y valida que siga activa.
- Valida que el stock disponible sea suficiente para cada producto.
- Crea el registro
Ordery losOrderItemasociados. - Descuenta el stock de cada producto.
- Elimina los ítems del carrito.
- Marca la reserva como completada.
- Si el usuario está autenticado, lanza la tarea Celery
process_purchasede forma asíncrona.
Firma
def create_order_from_cart(
request,
payment_method: str,
payment_reference: str = "",
shipping_address=None,
stock_reservation=None
) -> tuple[Order | None, str]:
Parámetros
| Nombre | Tipo | Descripción |
|---|---|---|
request |
HttpRequest |
Petición HTTP de Django. |
payment_method |
str |
Constante de pago (Order.PAYMENT_STRIPE o Order.PAYMENT_PAYPAL). |
payment_reference |
str |
Referencia de la transacción en la pasarela (ID de sesión Stripe, ID de pago PayPal, etc.). |
shipping_address |
ShippingAddress o None |
Dirección de envío seleccionada. |
stock_reservation |
StockReservation o None |
Reserva de stock a completar junto con el pedido. |
Retorno
Tupla (order, error_message):
- Pedido creado correctamente:
(Order, ""). - Error (carrito vacío, stock insuficiente, reserva caducada, etc.):
(None, "mensaje de error").
Uso
Llamada desde checkout_success y paypal_execute.
Important
Toda la operación se ejecuta bajo
transaction.atomic()conSELECT FOR UPDATEpara garantizar la integridad del stock en entornos concurrentes.