# 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; } ```