# Dominio Purchase ## Propósito Implementa el ciclo de compra y checkout: crea una compra desde el carrito, toma una instantánea de sus ítems, reserva inventario, permite ediciones, inicia el pago y confirma, cancela o vence la operación. ## Modelo - `Purchase`: raíz de la compra; estados `created`, `pending_payment`, `paid`, `cancelled`, `rejected` y `expired`. - `PurchaseItem`: snapshot del producto o variante, cantidad, precio y total al comprar. - `TelepagosQr` y `TelepagosPayment`: datos del QR e intentos/resultados del proveedor. - `PurchasePaid`: evento emitido una sola vez al pasar a pagada bajo bloqueo transaccional. ## Servicios de checkout `CheckoutService` es la fachada estable. Delega en: - `StartCheckoutService`: inicia la compra desde el carrito. - `EditCheckoutService`: modifica cliente o cantidades antes del cierre. - `CompleteCheckoutService`: completa, envía a revisión o confirma el pago. - `ReleaseCheckoutService`: cancela, vence y procesa vencimientos pendientes. - `SourceCartService`: sincroniza, restaura o finaliza el carrito fuente. - `CatalogSelectionResolver` y `PurchaseItemSnapshotFactory`: resuelven selecciones y generan snapshots. `UserPurchaseLimitService` controla límites de compra y `CheckoutService` conserva el punto de entrada para controladores e integraciones. ## Endpoints Bajo `/tenants/{tenant:codigo}/compras`, con `auth:sanctum`: listado, inicio, detalle, edición de ítems, datos del cliente, intención de pago, finalización, revisión y cancelación. ## Dependencias y reglas Depende de `Cart`, `Catalog`, `Tenant`, `Auth` e `Integration`; emite eventos consumidos por `Ticket` y `Notification`. Los cambios de estado e inventario deben ser transaccionales y usar los servicios del checkout, no actualizaciones directas del modelo.