store: poder cambiar la cantidad de un mismo artículo en el carrito

El carrito era un conjunto: añadir dos veces el mismo ítem no hacía nada y el
botón se quedaba en "Añadido". Ahora cada línea lleva sus copias, editables con
un <input number> en la columna Cant, y volver a pulsar Añadir suma una (mismo
patrón que el carrito de send-gift, que ya lo hacía así).

Ojo con los dos "cantidad" que conviven, que no son lo mismo:
`home_store_item.quantity` es el LOTE que entrega cada copia (Paño de lino = 20)
y `copies` es cuántas veces se compra la línea. Por eso la fila enseña "3 × 20"
y el total de la columna Cant sigue siendo unidades (60), como en el original.
Cada copia se manda al SOAP como una entrada propia (`2589:20 2589:20`), que es
justo lo que ya sabía trocear sendStoreItems (12 por correo) y parsear
fulfillStoreOrder: el formato del pedido de tarjeta no cambia.

El servidor no se fía del cliente: priceStoreCart recibe {id, copies}, valida las
copias (1..MAX_COPIES, como el MAX_QTY de send-gift), rechaza el carrito si algún
id no existe y recalcula los totales como precio*copias contra la BD.

Verificado contra la API con saldo de prueba, no solo en la interfaz: con 500 PD
y un ítem de 200, 2 copias (400) pasan el cobro y 3 (600) dan insufficientPd. Si
el servidor ignorase las copias ambas darían lo mismo, así que el corte exacto
entre 2 y 3 prueba que multiplica. Comprobado también que el reembolso del
deliveryFailed devuelve los 400 PD, y que copias=0 o 101 se rechazan.

El CSS del input va con `#cart-list` por especificidad, no por gusto: el tema
define `input[type=number] { width: 290px }` y se carga el último para ganar la
cascada, así que un `.store-copies` a secas perdía y el input salía de 290px
reventando la tabla (send-gift se libra porque usa estilo en línea).

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
2026-07-15 10:10:33 +00:00
parent e500bd7a84
commit f232f0fc5f
7 changed files with 128 additions and 33 deletions
+9
View File
@@ -593,6 +593,15 @@ textarea:focus {
/* Precios del carrito: se enseñan SIEMPRE las dos monedas (saldo PD/PV y euros)
y se apaga la que no se va a cobrar con el método elegido. Así el carrito no
presupone nada antes de elegir ni se contradice al pagar con tarjeta. */
/* Cantidad por línea del carrito. Va con `#cart-list` por especificidad, NO por
gusto: el tema define `input[type=number] { width: 290px }` y se carga el
último para ganar la cascada, así que un `.store-copies` a secas pierde y el
input sale de 290px, reventando la tabla. */
#cart-list input.store-copies {
width: 4em;
height: 24px;
text-align: center;
}
.store-price { display: block; transition: opacity .2s, color .2s; }
.store-price-eur { color: #ebdec2; }
.store-price-total { font-weight: bold; }