# Sistema eventos nuevo checkout
Diseñar nuevo sistema de eventos para notificar a front cualquier cambio o ajuste realizado por el back.
## Necesidades
Identificar todos los tipos de eventos:
- Ganar descuento
- Perder descuento
- Cambio tipologia de producto fijo, ej velocidad fibra
- Cambio tipologia de producto móvil, ej línea deja de ser adicional
## Estructura
Definir estructura.
Debe soportar cualquier tipo de evento definido en el apartado anterior
```javascript!
events: [
{
"id": "", // Id único (local) de evento
"category": "",
"message": "",
"processed": false,
"amount": 0.0, // Nullable, importe asociado al evento
}
];
```
¿es necesario ligar eventos sobre id único de producto?
## Sincronización
Permitir confirmación de eventos por parte de front para sincronizar los eventos ya procesados.
Ej: `POST /cart/{cartId}/event/{eventId}`
Marcaría la propiedad `processed` a `true` en la seccion eventos, liberando al frontal de la necesitad de ese trackeo. Así mismo se mantiene el histórico asociado a ese carrito.
## Información de descuentos aplicados en Catálogo
En la devolución del catálogo el front necesita saber qué descuentos tiene
aplicadas la tarifas. Para ello se podría utilizar el modelo de eventos. Posible modelo:
```javascript!
interface ProductPrice {
taxType: TaxTypes;
price: number;
}
interface ProductSpeed {
amount: number;
unit: ProductDataUnits;
}
interface ProductData {
amount: number;
unit: ProductDataUnits;
}
enum ProductDataUnits {
'mb' = 'mb',
'gb' = 'gb',
}
enum TaxTypes {
IVA = 'IVA',
IPSI_C = 'IPSI_C',
IPSI_M = 'IPSI_M',
IGIC = 'IGIC',
}
interface ProductVoice {
amount: number;
unit: 'min';
}
type EventCategory =
| 'APPLIED_DISCOUNT' // verde
| 'POTENCIAL_DISCOUNT' // azul
| 'ERROR' // rojo
| 'WARNING' // Narana
| 'CONVERGENCE_CREATION';
type EventColor =
interface EventDetail {
message: string; // markdown
broadband: {
speedTo: ProductSpeed;
speedFrom: ProductSpeed;
producCode: string
};
mobile: {
dataFrom: ProductData;
dataTo: ProductData
priceFrom: ProductPrice;
priceTo: ProductPrice;
productCode: string
};
}
interface Event {
id: number;
category: EventCategory;
processed: boolean;
details: EventDetail;
}
```