Estoy trabajando en un nuevo punto de venta para una empresa que ofrece productos a diferentes precios según la combinación de productos.
Todos los productos tienen un precio base.
Para explicar mi problema, usaré la siguiente información:
Product Category Price
A 1 45
B 1 70
Q 2 20
R 2 27
S 2 15
X 3 17
Y 3 22
Z 3 16
La compañía tiene Paquetes, por ejemplo Paquete "Combo": para el producto A o B, si elige 1 de Q o R y 1 de X, Y o Z obtendrá un descuento de $ 20.
Caso A: a veces los clientes agregan un producto base al realizar un pedido, por ejemplo: no quieren uno del Producto A, y agregan el Producto Q y el Producto P para crear un paquete que tiene un precio con descuento. Luego podrían agregar que quieren 1 del producto B con 1 R y 1 Z.
Caso B: a veces los clientes agregarán 1 A y 2 B, 2 Q, 1 S, 2 X y 1 Z. De acuerdo con las reglas establecidas por el paquete "Combo", solo se aplicarían 2 combos porque S no es un elemento combinado.
Otras promociones dependen de la cantidad, por lo que si compra 2 de B obtiene un 20% de descuento y / o depende del tiempo, solo es válido después de las 5 p.m. o antes del 10% de descuento si antes de las 10 a.m. Otra promoción puede depender de cuándo ocurrió su última compra o si ha comprado más de $ X en el marco temporal Y.
Mis problemas:
1) ¿Cómo estructuro las tablas para poder crear los diferentes paquetes o promociones de una manera que sea muy flexible para agregar diferentes tipos de promociones con diferentes requisitos?
2) Cuando hacen un pedido como el Caso B (o una combinación de Caso A y Caso B), ¿cómo puedo estructurar mi consulta para poder comprobar qué mezclas de productos hay en el pedido y actualizar los precios / descripciones en consecuencia? ? En última instancia, el mejor resultado para esta consulta sería devolver qué paquetes y promociones tienen requisitos cumplidos en orden de los cuales brinda el mayor beneficio para el cliente (es decir, tal vez lo que ordenaron cumple con los requisitos para las promociones 1 y 3, pero la promoción 3 es menos costosa). debe trabajar con múltiples promociones).
Gracias de antemano por la ayuda!
ACTUALIZACIÓN # 1
Para describir mejor los problemas en cuestión y actualizar el trabajo realizado hasta el momento para resolverlos , incluyo un ERD del modelo de producto limitado a las entidades y atributos que afectan el problema (es decir, el inventario no está en juego aquí, por lo que no hay inventario las entidades están presentes).
También incluyo datos de muestra de las entidades y atributos que afectan esta pregunta (para simplificar la lectura de los datos, pongo el nombre / las descripciones en lugar de las claves externas):
PRODUCT
---------
ID Name
================================
1 Hamburger
2 Cheeseburger
3 Bacon Hamburger
4 Bacon Cheeseburger
5 Orange Juice
6 Apple Juice
7 Coffee
8 Coke
9 French Fries
10 Onion Rings
11 Soup du Jour
12 Hamburger Combo
13 CheeseBurger Combo
14 Bacon Hamburger Combo
15 Bacon Cheeseburger Combo
16 Combo Side
17 Combo Beverage
18 Small Orange Juice
19 Large Orange Juice
20 Small Apple Juice
21 Large Apple Juice
22 Add Extra Patty
23 Add Avocado
PRODUCT COMPONENT
------------------
productFrom productTo
===================================================
Hamburger Combo Hamburger
Hamburger Combo Combo Side
Hamburger Combo Combo Beverage
CheeseBurger Combo Cheeseburger
CheeseBurger Combo Combo Side
CheeseBurger Combo Combo Beverage
Bacon Hamburger Combo Bacon Hamburger
Bacon Hamburger Combo Combo Side
Bacon Hamburger Combo Combo Beverage
Bacon Cheeseburger Combo Bacon Cheeseburger
Bacon Cheeseburger Combo Combo Side
Bacon Cheeseburger Combo Combo Beverage
PRODUCT FEATURE
----------------
ID Description
=======================
1 Combo Side Option
2 Combo Beverage
3 Juice
4 Orange Juice Size
5 Apple Juice Size
6 Extras
PRODUCT FEATURE APPLICABILITY
------------------------------
product productFeature ProductFeatureApplicabilityType
============================================================================
Hamburger Combo Combo Side Required
Hamburger Combo Juice Flavor Required
Cheeseburger Combo Combo Side Required
Cheeseburger Combo Juice Flavor Required
Bacon Hamburger Combo Combo Side Required
Bacon Hamburger Combo Juice Flavor Required
Bacon Cheeseburger Combo Combo Side Required
Bacon Cheeseburger Combo Juice Flavor Required
PRODUCT FEATURE APPLICABILITY
------------------------------
productFeature product ProductFeatureApplicabilityType
============================================================================
Combo Side Hamburger Combo Required
Combo Beverage Hamburger Combo Required
Extras Hamburger Combo Optional
Combo Side Cheeseburger Combo Required
Combo Beverage Cheeseburger Combo Required
Extras Cheeseburger Combo Optional
Combo Side Bacon Hamburger Combo Required
Combo Beverage Bacon Hamburger Combo Required
Extras Bacon Hamburger Combo Optional
Combo Side Bacon Cheeseburger Combo Required
Combo Beverage Bacon Cheeseburger Combo Required
Extras Bacon Cheeseburger Combo Optional
OPTIONAL FEATURE
------------------
productFeatureFrom Product ProductFeatureTo
=============================================================
Combo Side Option French Fries
Combo Side Option Onion Rings
Combo Side Option Soup du Jour
Combo Beverage Juice
Combo Beverage Coffee
Juice Orange Juice Size
Juice Apple Juice Size
Orange Juice Size Orange Apple Juice
Orange Juice Size Orange Apple Juice
Apple Juice Size Small Apple Juice
Apple Juice Size Large Apple Juice
Extras Add Extra Patty
Extras Add Avocado
Entonces, con la investigación y el apoyo brindado por la comunidad hasta ahora, he podido resolver el problema # 1. De hecho, lo hice con más flexibilidad de lo que pensé que podría hacer en la primera implementación del sistema.
A pesar de que ha habido avances con el problema 2, no se resuelve satisfactoriamente. Ha habido algunas ideas sobre cómo hacer esto, Neil McGuilgan hizo una gran pregunta que condujo a una posible solución utilizando la División Relacional (dba.stackexchange.com/questions/45829/what-is-the-name-of-this-type- of-query-and-what-is-an-eficiente-example) y este libro (www.amazon.com/books/dp/0471380237) fue de gran ayuda. Sin embargo, esta solución en la actualidad, y según tengo entendido, solo funciona con "un" registro (combo) a la vez. Si un cliente camina y dice que quiere 2 hamburguesas con queso, 1 hamburguesa, 1 jugo de manzana pequeño, 1 Coca-Cola, 1 papas fritas y 2 aros de cebolla, necesito una forma de detectar que solo hay un combo en la mezcla y agregar el otro productos a precio base. Si hay múltiples combinaciones de combo, yo '
Una idea que se me ocurrió para resolver el problema dos es agregar y atribuir a COMPONENTES DEL PRODUCTO marcando el producto principal para el combo (es decir, hamburguesa). Luego, cuando ejecute el proceso de fijación de precios, consulte qué productos en el pedido son productos principales en un "paquete", relacionando la consulta con el descuento dado por la tabla COMPONENTE DE PRECIOS y ordenando por ese valor (descendente), y en ese orden de paquetes verifique para ver si puede crear un "paquete" con los productos no principales restantes con una consulta y repetir el proceso hasta que no haya más productos principales o no haya más productos no principales en el resto.
Respuestas:
Esto podría complicarse ...
Puede comenzar con una
packaged_with
tabla para determinar qué productos se pueden agrupar y empaquetar:package_group
se refiere a apackage
.packaged_with
se refiere aproducts
ypackage_groups
, de modo que una fila enpackaged_with
muestra con qué productos se puede empaquetar un producto, y un paquete puede estar compuesto por múltiples grupos.Los datos se verían así:
Esto lo ayudará con los paquetes de productos en sí. Tengo algunas ideas para el resto de su pregunta, pero no tengo tiempo para terminar esta respuesta en este momento ...
Promociones
Usted enumera muchos tipos de promociones. Es posible que desee buscar algún tipo de motor de reglas, pero trataré de mantener las cosas más simples que eso, pero aún así ... Esto se complicará ...
Comencemos con promociones simples donde un precio tiene un cierto porcentaje de descuento:
Aquí tenemos una tabla que almacena el porcentaje que obtiene por producto. Otra tabla en realidad vincula los productos a la tasa de descuento, y también incluye una fecha de inicio y finalización para que sepa si el descuento es aplicable en una fecha determinada.
Ideas para las otras promociones que vendrán después ...
fuente
Aunque es un hilo de 3 años, todavía lo respondo pensando que podría ser útil para alguien.
Detalles de la oferta ------------
Para construir una ofertaDetalles, debe proporcionar un obligatorio, mixgropu1 y amixGropu2. Entonces caseB, tiene solo 2 ofertas de la siguiente manera:
Otras ofertas se basan en la lógica del negocio: Para descuentos por cantidad: cree una consulta para encontrar el recuento de B en una oferta para un cliente. vamos a llamarlo QTYB encuentre QTYB% 2 y multiplíquelo con la cantidad Valor de oferta (que es $ 20)
Para la oferta de estadísticas, simplemente agregue otro bit llamado wonPoint para la compra de un cliente. y establezca el punto ganado una fecha de vencimiento. El punto ganado puede ser igual al monto comprado. Verifique si la cantidad comprada> = $ X, ellos emiten un descuento según la política.
Similar es la comparación del tiempo de pedido si es antes de las 5 p.m. y después de las 10 a.m., luego emite un 5%, de lo contrario, emite un 10% de descuento.
fuente