---
# System prepended metadata

title: Sistema eventos nuevo checkout

---

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

```