Como se modela el historico de una entidad? Precio de producto en pedido

B

Tengo bastantes dudas de como plantear un escenario de este tipo, con estas entidades:

type Producto = {
  nombre: string;
  precio: number;
}

type Pedido = {
  productos: Producto[]
};

El precio de los productos va a ir cambiando, y quiero que en Pedido se quede el precio que tenía en ese momento el producto.

Lo meto al Pedido cuando vale 5, se paga y se hace todo y dentro de 1 año ese producto vale 10, cuando vaya a mirar ese Pedido antiguo necesito que salga 5 que es lo que en su día se pagó, no 10 que tiene ahora

Se me ocurren varias maneras de hacerlo pero no se cual sería la más correcta

Lo que se me ocurre es ir guardando una versión de Producto con cada cambio y apuntar Pedido a la versión que fuera, esto añadiría cierta complejidad para distinguir las versiones, sacar la última versión y demás.

Otra opción es guardar el precio ahí directamente en Pedido, guardando también el producto que es para luego sacar de ahí datos como la imagen.

type Producto = {
  nombre: string;
  precio: number;
}

type ProductoPedido = {
  producto: Producto[];
  precio: number;
}

type Pedido = {
  productos: ProductoPedido[]
};

Me da la sensación de que lo estoy complicando demasiado y seguro que hay algún patrón bien definido para hacer esto.

r2d2rigo

Tienes el Pedido mal modelado de base, ten en cuenta que habra pedidos en los que se pidan mas de 1 unidad de un Producto y ahi no tienes soporte para eso.

En Pedido deberias tener un array con los siguientes campos:

  • Id de Producto
  • Precio unitario (en el momento de la compra)
  • Numero de unidades
  • Precio total
2 2 respuestas
X-Crim

justo lo que dice #2 el pedido debe ser una foto del momento de creación

B

#2 Tienes toda la razón, de todas formas esto lo he hecho un poco sobre la marcha para plantear la duda, el caso real no tiene productos ni pedidos ni nada parecido.

Me quedo con la idea de guardar la fotocopia de lo que necesito que se quede así, muchas gracias

enin

Te recomiendo tener dos clases para el Producto, una la utilizas como plantilla base del producto en si (lo que te encuentras en el catálogo) y otra para representar un producto dentro de un pedido (al que puedes haberle aplicado descuentos, cuentas las unidades que se han añadido, precio unitario/total...), así tienes la libertad de poder modificar la plantilla sin afectar a los pedidos donde ya lo has añadido

Usuarios habituales