CartItem


Un producto agregado a un Cart: qué producto, cuánto y con qué variantes.

quantity es el número de unidades y stock el peso por unidad para productos por peso (unit_config); en productos sin peso, stock vale 1. La cantidad efectiva del pedido es quantity * stock.

snapshot e is_valid son derivados: los recalcula el carrito (Cart::computePrices()) cada vez que cambia, con el precio y los datos congelados del producto y si su configuración (variantes, stock, límites de compra) es válida. El cliente no los envía.

Estructura de Datos

Atributo Tipo Descripción
id int
list_type string\|null Contenedor del ítem (relación polimórfica). Hoy siempre App\Models\Cart
list_id int\|null Id del contenedor (el cart_id)
client_id int Cliente dueño del ítem (oculto)
branch_id int\|null Comercio del ítem (oculto); null en servicios / envío directo
good_id int\|null Producto solicitado
quantity int Cantidad de unidades solicitadas (ej. 2 hamburguesas)
stock float Peso por unidad para productos por peso (ej. 0.5 = 0,5 KG). 1 si el producto no tiene unit_config. Siempre se aplica
extras array\|null Variantes elegidas: lista de { property_id, value }. value = id de PropertyOption (tablas de opciones) o el valor crudo (rango / texto). Repetir una entrada = elegir esa opción N veces
notes string\|null Notas para este producto
provider_id int\|null Proveedor pre-asignado a este ítem; solo en órdenes de tipo servicio (cada servicio del pedido puede tener su propio proveedor)
snapshot array Instantánea derivada del producto (precio, tarifas, datos del good). La calcula el carrito; no se envía en el request
is_valid bool Si la configuración del ítem (variantes, stock, límites) es válida tras el último recálculo del carrito
created_at datetime\|null
updated_at datetime\|null
branch_good_id int\|null BranchGood resuelto para good_id en branch_id
allLogs ApiLog>
branchGood BranchGood\|null Oferta del producto en el comercio (precio, stock, propiedades)
client Client
list Model\|Eloquent Contenedor del ítem ({@link \App\Models\Cart})
logs ApiLog>
{
    "id": 16,
    "good_id": 8719,
    "quantity": 2,
    "stock": 1,
    "extras": null,
    "notes": null,
    "provider_id": null,
    "snapshot": {
        "good_id": 8719,
        "quantity": 2,
        "notes": null,
        "client_id": 10148,
        "branch_id": 80,
        "units": 2,
        "name": "CEREAL NESTUM ARROZ PREBIO 6M BOLSA 225G",
        "short_details": "n/a",
        "details": "NEST ARR PREB BOL225",
        "picture_urls": [
            "https://api-dev.dondemand.io/storage/companies/69/good/good_8719_0_1685195225.jpg"
        ],
        "base_price_e2": 10,
        "total_price_e2": 10,
        "original_total_e2": 10,
        "good_stock": 49,
        "sku": "7591016204764",
        "promo_id": null,
        "provider_fee_e2": 0,
        "quantity_real": 1,
        "properties": []
    },
    "is_valid": true,
    "created_at": "2024-05-29 21:11:59",
    "updated_at": "2024-07-04 12:47:48",
    "branch_good_id": 8909
}

Endpoints

Insertar CartItem

Insertar CartItem de Cart

Agrega un producto al carrito

El atributo quantity representa la cantidad solicitada del producto elegido, por ejemplo: 2 Hamburguesas

El atributo stock representa el peso por unidad en los productos por peso, por ejemplo: 0.5 KG de Queso. En caso de productos que no poseen configuración de peso (unit_config), este valor no tendrá ningún efecto.

Respuesta: Cart

Método URI Cabeceras
POST /companies/{companyId}/carts/{cartId}/cart-items Authorization
{
    "good_id": "required|integer|exists:goods,id",
    "quantity": "required|integer|min:1",
    "stock": "nullable|numeric|min:0.001",
    "provider_id": "nullable|integer|exists:providers,id",
    "notes": "nullable|string|max:255",
    "extras": [
        {
            "property_id": "required|integer|exists:properties,id",
            "value": "required|string"
        }
    ]
}

Errores de negocio

Código HTTP Cuándo ocurre
EC601 400 El producto no existe en el comercio del carrito.
EC602 400 No se pueden mezclar productos de tipos distintos en un mismo carrito.

Listar CartItem

Listar CartItem de Cart

{info} Soporta: Paginación Filters Carga dinámica

Muestra los productos que posee un Carrito

Método URI Cabeceras
GET /companies/{companyId}/carts/{cartId}/cart-items Authorization

Actualizar CartItem

Actualiza un producto del carrito.

Respuesta: Cart

Método URI Cabeceras
PATCH /companies/{companyId}/cart-items/{cartItemId} Authorization
{
    "quantity": "integer|min:1",
    "stock": "nullable|numeric|min:0.001",
    "provider_id": "nullable|integer|exists:providers,id",
    "notes": "nullable|string|max:255",
    "extras": [
        {
            "property_id": "required|integer|exists:properties,id",
            "value": "required|string"
        }
    ]
}

Eliminar CartItem

Elimina un producto del carrito

Respuesta: Cart

Método URI Cabeceras
DELETE /companies/{companyId}/cart-items/{cartItemId} Authorization

Relaciones