Skip to content

Commit 9ed55af

Browse files
committed
docs: add product variants justification and implementation summary to README
1 parent 026d1e3 commit 9ed55af

File tree

1 file changed

+113
-35
lines changed

1 file changed

+113
-35
lines changed

README.md

Lines changed: 113 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -1,49 +1,121 @@
1-
# 🛍️ Nueva funcionalidad: Soporte para variantes de productos
1+
# 🛍️ Soporte para variantes de productos (Nueva funcionalidad)
22

3-
Este proyecto incorpora **soporte completo para variantes de productos** (ej: talla, tamaño) y su integración en **UI, carrito, checkout, órdenes, chatbot y pruebas** (unitarias y E2E).
4-
El objetivo fue extender la plataforma sin romper contratos existentes, asegurando compatibilidad hacia atrás ✅.
3+
## 📌 Contexto general
4+
5+
- Nuestro objetivo es consolidar productos con variantes (en vez de crear productos separados por cada opción).
6+
- Polos → Variantes por "talla": Small, Medium, Large (el precio NO cambia según la talla).
7+
- Stickers → Variantes por "tamaño": 3x3cm, 5x5cm, 10x10cm (el precio SÍ cambia según el tamaño).
8+
- Tazas → Sin variantes (se mantiene tal como esta).
9+
10+
---
11+
12+
## 📖 Justificación del diseño UI (PLP vs PDP)
13+
14+
### ¿Por qué mostrar variantes en la PDP y no en la PLP?
15+
16+
1. **Escaneabilidad y usabilidad en la grilla (PLP)**
17+
18+
- La Product Listing Page (PLP) debe ser ligera y fácil de escanear. Incluir selectores de talla en cada tarjeta sobrecarga visualmente, rompe el ritmo de navegación y empeora el rendimiento [1].
19+
- Mostrar tallas en la PLP también aumenta la carga cognitiva y dificulta comparar rápidamente múltiples productos [1].
20+
21+
2. **Complejidad de inventario y performance**
22+
23+
- Las tallas multiplican combinatorias (ej. precio × talla). Gestionar esta disponibilidad en la PLP incrementa costos de datos, ralentiza el rendimiento (LCP/INP) y genera riesgos de inconsistencias [2].
24+
- Los grandes e-commerce (Amazon, Mercado Libre, SHEIN) centralizan esta lógica en la PDP para asegurar precisión en stock y reducir errores de compra [3][4].
25+
26+
3. **Decisión de compra responsable**
27+
28+
- La PDP ofrece guías de tallas, reseñas y recomendaciones específicas, ayudando a los usuarios a elegir con menor riesgo de devolución [5].
29+
- En cambio, seleccionar talla directamente desde la PLP puede inducir a errores de talla y aumentar devoluciones [5].
30+
31+
4. **Consistencia en mobile y desktop**
32+
- En dispositivos móviles, los selectores de talla en la PLP ocupan demasiado espacio y reducen la accesibilidad de los tap targets [6].
33+
- Mantener la lógica en la PDP garantiza una experiencia consistente y más usable en todos los dispositivos [6].
534

635
---
736

8-
## ✨ Cambios principales
37+
### Beneficios de este enfoque
38+
39+
**Experiencia de usuario mejorada**: la PLP se mantiene rápida, clara y visualmente ligera.
40+
**Menos errores y devoluciones**: la elección de talla se respalda con guías y reseñas en la PDP.
41+
**Mejor rendimiento**: menos datos cargados en la PLP → scroll y carga más veloces.
42+
**Gestión de catálogo más simple**: evita duplicados y asegura consistencia de inventario.
43+
**Práctica alineada con líderes del mercado**: Amazon, Mercado Libre, SHEIN, Falabella y Ripley siguen este patrón.
44+
45+
---
46+
47+
### Ventajas y Desventajas de centralizar la selección de variantes en la PDP
48+
49+
- **Ventajas**
50+
51+
- Favorece la escaneabilidad y usabilidad en la PLP.
52+
- Reduce costos de rendimiento y evita errores de inventario.
53+
- Permite decisiones de compra informadas (guías de talla, reseñas).
54+
- Consistencia cross-platform (desktop y mobile).
55+
56+
- **Desventajas**
57+
- Un clic adicional para el usuario (pasar de PLP → PDP).
58+
- Puede percibirse como más lento para usuarios avanzados que ya conocen su talla.
59+
- Requiere un buen diseño de PDP (clara, ágil y optimizada).
60+
61+
---
62+
63+
## 📚 Referencias
64+
65+
[1] Baymard Institute, _Ecommerce UX: Product Lists & Filtering Guidelines_, 2024. [Online]. Available: https://baymard.com
66+
[2] Baymard Institute, _Performance and Loading UX Research_, 2024. [Online]. Available: https://baymard.com
67+
[3] Amazon Seller Central Ireland, _Managing Product Variations_, 2023. [Online]. Available: https://sellercentral.amazon.ie
68+
[4] Mercado Libre, _Guía de publicación con variantes_, 2023. [Online]. Available: https://www.mercadolibre.com.pe/ayuda
69+
[5] SHEIN, _Seller Guidelines – Size Guide and Variations_, 2023. [Online]. Available: https://seller-us.shein.com
70+
[6] Baymard Institute, _Mobile UX Research_, 2024. [Online]. Available: https://baymard.com
71+
72+
---
73+
74+
---
75+
76+
## ✨ Cambios principales en el proyecto
977

1078
### 🔧 Base de datos (Prisma + Migraciones)
79+
1180
- **Nuevo modelo `ProductVariant`** con:
1281
- `id`, `productId`, `type` (ej: `"talla"`, `"tamaño"`), `value` (ej: `"Small"`, `"3x3cm"`), `price (Decimal)`, `timestamps`.
1382
- Relación `Product.variants`.
1483
- Ajustes en `CartItem` y `OrderItem` para referenciar `productVariantId` opcional.
15-
- Migraciones para crear tabla `product_variants` + índices/foreign keys.
16-
📂 Archivos clave:
17-
- [`prisma/schema.prisma`](prisma/schema.prisma)
84+
- Migraciones para crear tabla `product_variants` + índices/foreign keys.
85+
📂 Archivos clave:
86+
- [`prisma/schema.prisma`](prisma/schema.prisma)
1887
- [`prisma/migrations`](prisma/migrations)
1988

2089
---
2190

2291
### 🌱 Seed y Datos Iniciales
92+
2393
- Generación automática de variantes:
24-
- **Polos**: Tallas `S`, `M`, `L` (precio base).
25-
- **Stickers**: Tamaños `3x3`, `5x5`, `10x10` (precio multiplicador).
26-
- **Tazas**: sin variantes.
27-
- Uso de `prisma.productVariant.createMany` para poblar datos.
28-
📂 Archivos clave:
29-
- [`prisma/initial_data.ts`](prisma/initial_data.ts)
94+
- **Polos**: Tallas `S`, `M`, `L` (precio base).
95+
- **Stickers**: Tamaños `3x3`, `5x5`, `10x10` (precio multiplicador).
96+
- **Tazas**: sin variantes.
97+
- Uso de `prisma.productVariant.createMany` para poblar datos.
98+
📂 Archivos clave:
99+
- [`prisma/initial_data.ts`](prisma/initial_data.ts)
30100
- [`prisma/seed.ts`](prisma/seed.ts)
31101

32102
---
33103

34104
### 🧩 Modelos y Servicios
105+
35106
- `Product` ahora expone `variants: { id, type, value, price }[]`.
36107
- Servicios (`product.service`, `cart.service`, `order.service`) cargan variantes y mantienen firmas originales.
37-
- Lógica de carrito/orden ahora distingue ítems por `(productId, productVariantId)`.
38-
📂 Archivos clave:
39-
- [`src/models/product.model.ts`](src/models/product.model.ts)
40-
- [`src/services/product.service.ts`](src/services/product.service.ts)
41-
- [`src/services/cart.service.ts`](src/services/cart.service.ts)
108+
- Lógica de carrito/orden ahora distingue ítems por `(productId, productVariantId)`.
109+
📂 Archivos clave:
110+
- [`src/models/product.model.ts`](src/models/product.model.ts)
111+
- [`src/services/product.service.ts`](src/services/product.service.ts)
112+
- [`src/services/cart.service.ts`](src/services/cart.service.ts)
42113
- [`src/services/order.service.ts`](src/services/order.service.ts)
43114

44115
---
45116

46-
### 🖥️ UI
117+
### 🖥️ UI
118+
47119
- **Categorías (PLP)**:
48120
- Precio mostrado usa `displayedPrice` (mínimo o rango si hay variantes).
49121
- **Producto (PDP)**:
@@ -54,41 +126,44 @@ El objetivo fue extender la plataforma sin romper contratos existentes, aseguran
54126
- Controles `+/-` separados por variante.
55127
- **Checkout**:
56128
- Resumen y total con precios de variantes.
57-
- Orden guarda `productVariantId` y precios correctos.
129+
- Orden guarda `productVariantId` y precios correctos.
58130
- **Órdenes**:
59-
- Órdenes guardan `productVariantId`.
60-
- Render en UI muestra **Producto (Variante)**.
131+
- Órdenes guardan `productVariantId`.
132+
- Render en UI muestra **Producto (Variante)**.
61133

62134
📂 Archivos clave:
63-
- [`src/routes/category`](src/routes/category)
64-
- [`src/routes/product/index.tsx`](src/routes/product/index.tsx)
65-
- [`src/routes/cart/index.tsx`](src/routes/cart/index.tsx)
135+
136+
- [`src/routes/category`](src/routes/category)
137+
- [`src/routes/product/index.tsx`](src/routes/product/index.tsx)
138+
- [`src/routes/cart/index.tsx`](src/routes/cart/index.tsx)
66139
- [`src/routes/checkout/index.tsx`](src/routes/checkout/index.tsx)
67140
- [`src/services/order.service.ts`](src/services/order.service.ts)
68141
- [`src/routes/account/orders/index.tsx`](src/routes/account/orders/index.tsx)
69142

70143
---
71144

72145
### 🤖 Chatbot
146+
73147
- `sendMessage` y `generateSystemPrompt` listan variantes con precios y links (`?variant=`).
74148
- Instrucciones para el bot:
75149
- Preguntar por talla/tamaño cuando sea necesario.
76150
- Respetar selección previa.
77-
- Carrito mostrado al usuario incluye variantes y subtotales.
78-
📂 Archivos clave:
79-
- [`src/services/chat.service.ts`](src/services/chat.service.ts)
151+
- Carrito mostrado al usuario incluye variantes y subtotales.
152+
📂 Archivos clave:
153+
- [`src/services/chat.service.ts`](src/services/chat.service.ts)
80154
- [`src/services/chat-system-prompt.ts`](src/services/chat-system-prompt.ts)
81155

82156
---
83157

84158
### ✅ Testing
159+
85160
- **Unitarios e integración**:
86161
- Cobertura de servicios y UI con variantes (`product.service.test`, `product.test.tsx`, `cart.ui.variants.test.tsx`).
87162
- **E2E (Playwright)**:
88-
- Flujo completo: selección de variantes → carrito → checkout → Culqi sandbox.
89-
📂 Archivos clave:
90-
- [`src/routes/product/product.test.tsx`](src/routes/product/product.test.tsx)
91-
- [`src/routes/cart/cart.ui.variants.test.tsx`](src/routes/cart/cart.ui.variants.test.tsx)
163+
- Flujo completo: selección de variantes → carrito → checkout → Culqi sandbox.
164+
📂 Archivos clave:
165+
- [`src/routes/product/product.test.tsx`](src/routes/product/product.test.tsx)
166+
- [`src/routes/cart/cart.ui.variants.test.tsx`](src/routes/cart/cart.ui.variants.test.tsx)
92167
- [`src/e2e/cart-variants.spec.ts`](src/e2e/cart-variants.spec.ts)
93168

94169
---
@@ -156,9 +231,8 @@ erDiagram
156231
int quantity
157232
}
158233
```
159-
## Cómo ejecutar
160-
161234

235+
## Cómo ejecutar
162236

163237
### Base de datos y seeds
164238

@@ -168,17 +242,20 @@ npx run prisma:generate
168242
npx run prisma:migrate
169243
npx run prisma:seed
170244
```
245+
171246
### Desarrollo
172247

173248
```bash
174249
npm install
175250
npm run dev
176251
```
252+
177253
### Pruebas unitarias/integración
178254

179255
```bash
180256
npm run test
181257
```
258+
182259
### Pruebas E2E (Playwright)
183260

184261
```bash
@@ -195,6 +272,7 @@ npm run test:e2e
195272
---
196273

197274
## Notas finales
275+
198276
- Todos los cambios mantuvieron compatibilidad hacia atrás cuando fue posible.
199277
- El soporte de variantes está integrado de extremo a extremo: lectura, UI, carrito, checkout, órdenes, chatbot y pruebas.
200-
- Ante cualquier divergencia de UI en E2E, ajustar selectores manteniendo la intención de validación.
278+
- Ante cualquier divergencia de UI en E2E, ajustar selectores manteniendo la intención de validación.

0 commit comments

Comments
 (0)