jueves, 1 de diciembre de 2022

Base de datos para un punto de venta

El siguiente código es para dar soporte a un sistema de venta mediante la inclusión de una base de datos relacional llamada ventas.


Código SQL para MySQL

  1. -- ------------------------------------
  2. -- Tabla "categoria"
  3. -- ------------------------------------
  4. CREATE TABLE `ventas`.`categoria` (
  5. `id` INT NOT NULL AUTO_INCREMENT ,
  6. `nombre` VARCHAR(50) NOT NULL ,
  7. `descripcion` TEXT NULL ,
  8. PRIMARY KEY (`id`)
  9. ) ENGINE = InnoDB;
  10. -- ------------------------------------
  11. -- Tabla "producto"
  12. -- ------------------------------------
  13. CREATE TABLE `ventas`.`producto` (
  14. `id` INT NOT NULL AUTO_INCREMENT ,
  15. `nombre` VARCHAR(255) NOT NULL ,
  16. `precio` DECIMAL(10,2) NOT NULL ,
  17. `descripcion` TEXT NULL ,
  18. `cantidad` INT NOT NULL ,
  19. `categoria` INT NOT NULL ,
  20. PRIMARY KEY (`id`),
  21. CONSTRAINT fk_prod_cat
  22. FOREIGN KEY (categoria)
  23. REFERENCES categoria (id)
  24. ON DELETE NO ACTION
  25. ON UPDATE NO ACTION
  26. ) ENGINE = InnoDB;
  27. -- ------------------------------------
  28. -- Tabla "cliente"
  29. -- ------------------------------------
  30. CREATE TABLE `ventas`.`cliente` (
  31. `id` INT NOT NULL AUTO_INCREMENT ,
  32. `dni` VARCHAR(20) NOT NULL UNIQUE ,
  33. `nombres` VARCHAR(150) NOT NULL ,
  34. `apellidos` VARCHAR(150) NOT NULL ,
  35. `correo` VARCHAR(200) NOT NULL UNIQUE ,
  36. PRIMARY KEY (`id`)
  37. ) ENGINE = InnoDB;
  38. -- ------------------------------------
  39. -- Tabla "empleado"
  40. -- ------------------------------------
  41. CREATE TABLE `ventas`.`empleado` (
  42. `id` INT NOT NULL AUTO_INCREMENT ,
  43. `dni` VARCHAR(20) NOT NULL UNIQUE ,
  44. `nombres` VARCHAR(50) NOT NULL ,
  45. `paterno` VARCHAR(50) NOT NULL ,
  46. `materno` VARCHAR(50) NOT NULL ,
  47. `correo` VARCHAR(200) NOT NULL UNIQUE ,
  48. `telefono` VARCHAR(30) NOT NULL UNIQUE ,
  49. `clave` BLOB(200) NOT NULL ,
  50. PRIMARY KEY (`id`)
  51. ) ENGINE = InnoDB;
  52. -- ------------------------------------
  53. -- Tabla "venta"
  54. -- ------------------------------------
  55. CREATE TABLE `ventas`.`venta` (
  56. `id` INT NOT NULL AUTO_INCREMENT ,
  57. `cliente` INT NOT NULL ,
  58. `empleado` INT NOT NULL ,
  59. `monto` DECIMAL(10,2) NOT NULL ,
  60. `fecha` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ,
  61. PRIMARY KEY (`id`),
  62. CONSTRAINT fk_venta_cliente
  63. FOREIGN KEY (cliente)
  64. REFERENCES cliente (id)
  65. ON DELETE NO ACTION
  66. ON UPDATE NO ACTION ,
  67. CONSTRAINT fk_venta_empl
  68. FOREIGN KEY (empleado)
  69. REFERENCES empleado (id)
  70. ON DELETE NO ACTION
  71. ON UPDATE NO ACTION
  72. ) ENGINE = InnoDB;
  73. -- ------------------------------------
  74. -- Tabla "detalle"
  75. -- ------------------------------------
  76. CREATE TABLE `ventas`.`detalle` (
  77. `id` INT NOT NULL AUTO_INCREMENT ,
  78. `venta` INT NOT NULL ,
  79. `producto` INT NOT NULL ,
  80. `precio` DECIMAL(10,2) NOT NULL ,
  81. `cantidad` INT NOT NULL ,
  82. PRIMARY KEY (`id`),
  83. CONSTRAINT fk_detalle_venta
  84. FOREIGN KEY (venta)
  85. REFERENCES venta (id)
  86. ON DELETE NO ACTION
  87. ON UPDATE NO ACTION ,
  88. CONSTRAINT fk_detalle_prod
  89. FOREIGN KEY (producto)
  90. REFERENCES producto (id)
  91. ON DELETE NO ACTION
  92. ON UPDATE NO ACTION
  93. ) ENGINE = InnoDB;

Datos para inicializar la base de datos

  1. -- ------------------------------------
  2. -- Datos de inicialización
  3. -- ------------------------------------
  4. -- 3 empleados
  5. INSERT INTO empleado(dni, nombres, paterno,
  6. materno, correo, telefono, clave) VALUES
  7. ('10001000','PAUL','GARCIA','MATTOS','paul@mail.com',
  8. '999888777',AES_ENCRYPT('2022','2022')),
  9. ('20002000','LORENA','HERRERA','SOTELO','lorena@mail.com',
  10. '999888666',AES_ENCRYPT('123456','123456')),
  11. ('30003000','DEMETRIO','GARCIA','GARCIA','demetrio@mail.com',
  12. '999888555',AES_ENCRYPT('ADMIN','ADMIN'));
  13. -- 2 clientes
  14. INSERT INTO cliente (dni, nombres, apellidos, correo) VALUES
  15. ('10101010','EMILIA','MELGAREJO CHAVEZ','emilia@mail.com'),
  16. ('10201020','KAREN','TORRES ALVA','karen@mail.com');
  17. -- 2 categorias
  18. INSERT INTO categoria(nombre, descripcion) VALUES
  19. ('BEBIDAS',null),('ENTRADAS','Lorem ipsum');
  20. -- 5 productos
  21. INSERT INTO producto(nombre, descripcion, precio, cantidad, categoria) VALUES
  22. ('Soda 500ml', 'Gaseosa de 500ml en botella de vidrio', 4.50, 100, 1),
  23. ('Soda 1l', 'Gaseosa de 1 litro retornable', 7.50, 50, 1),
  24. ('Chicha morada 500ml', 'Chicha morada de 500ml retornable', 3.50, 40, 1),
  25. ('Causa rellena - 250gr', 'Porción de causa de 250 gramos', 10.50, 10, 2),
  26. ('Papa a la huancaína', null, 11.00, 10, 2);
  27. -- 3 Ventas
  28. INSERT INTO venta(cliente,empleado,monto,fecha) VALUES
  29. (1,1,100,"2022-04-03 14:00:45"),
  30. (1,2,100,"2022-05-01 22:00:00"),
  31. (2,2,100,"2022-08-13 21:30:45");
  32. -- Detalle de cada venta
  33. INSERT INTO detalle(venta,producto,precio,cantidad) VALUES
  34. (1,4,10,5),
  35. (1,1,5,10);
  36. INSERT INTO detalle(venta,producto,precio,cantidad) VALUES
  37. (2,2,7.50,10),
  38. (2,3,2.50,10);
  39. INSERT INTO detalle(venta,producto,precio,cantidad) VALUES
  40. (3,4,10,10);

Vistas de la base de datos

  1. -- VISTAS
  2. -- ------------------------------------
  3. -- productos_view
  4. -- ------------------------------------
  5. CREATE VIEW productos_view AS SELECT
  6. p.id,
  7. p.nombre,
  8. p.precio,
  9. p.descripcion,
  10. p.cantidad,
  11. c.nombre AS categoria
  12. FROM producto p INNER JOIN categoria c
  13. ON p.categoria = c.id;
  14. -- ------------------------------------
  15. -- venta_view
  16. -- ------------------------------------
  17. CREATE VIEW venta_view AS SELECT
  18. v.id,
  19. CONCAT_WS(' ', c.nombres,c.apellidos) AS cliente,
  20. CONCAT_WS(' ', e.nombres,e.paterno,e.materno) AS empleado,
  21. v.fecha,
  22. v.monto,
  23. c.id AS id_cliente,
  24. e.id AS id_empleado
  25. FROM venta v
  26. INNER JOIN cliente c ON v.cliente = c.id
  27. INNER JOIN empleado e ON v.empleado = e.id;
  28. -- ------------------------------------
  29. -- detalle_view
  30. -- ------------------------------------
  31. CREATE VIEW detalle_view AS SELECT
  32. d.id,
  33. v.id AS venta,
  34. p.nombre AS producto,
  35. p.id AS id_producto,
  36. d.precio,
  37. d.cantidad
  38. FROM detalle d
  39. INNER JOIN venta v ON d.venta = v.id
  40. INNER JOIN producto p ON d.producto = p.id;