-- 1.
Creación de la Base de Datos
CREATE DATABASE IF NOT EXISTS db_retail_el_codigo;
USE db_retail_el_codigo;
-- -----------------------------------------------------
-- MÓDULO DE USUARIOS Y ROLES
-- -----------------------------------------------------
-- Tabla Roles: Para diferenciar entre Admin, Cajero, Bodeguero
CREATE TABLE roles (
id_rol INT AUTO_INCREMENT PRIMARY KEY,
nombre_rol VARCHAR(50) NOT NULL UNIQUE, -- Ej: 'Administrador',
'Cajero'
descripcion VARCHAR(200)
);
-- Tabla Usuarios: Quienes acceden al sistema
CREATE TABLE usuarios (
id_usuario INT AUTO_INCREMENT PRIMARY KEY,
nombre_completo VARCHAR(100) NOT NULL,
email VARCHAR(100) NOT NULL UNIQUE,
password_hash VARCHAR(255) NOT NULL, -- Nunca guardar texto
plano
estado BOOLEAN DEFAULT TRUE, -- TRUE = Activo, FALSE = Inactivo
id_rol INT NOT NULL,
CONSTRAINT fk_usuarios_roles FOREIGN KEY (id_rol) REFERENCES
roles(id_rol)
);
-- -----------------------------------------------------
-- MÓDULO DE PROVEEDORES E INVENTARIO
-- -----------------------------------------------------
-- Tabla Proveedores: Quienes nos surten la mercancía
CREATE TABLE proveedores (
id_proveedor INT AUTO_INCREMENT PRIMARY KEY,
nit VARCHAR(20) NOT NULL UNIQUE,
razon_social VARCHAR(100) NOT NULL,
telefono VARCHAR(20),
direccion VARCHAR(150),
email_contacto VARCHAR(100)
);
-- Tabla Categorías: Para organizar los productos (Lácteos, Aseo, Granos)
CREATE TABLE categorias (
id_categoria INT AUTO_INCREMENT PRIMARY KEY,
nombre VARCHAR(50) NOT NULL
);
-- Tabla Productos: El inventario actual
CREATE TABLE productos (
id_producto INT AUTO_INCREMENT PRIMARY KEY,
codigo_barras VARCHAR(50) UNIQUE, -- Vital para usar lector de
códigos
nombre VARCHAR(100) NOT NULL,
descripcion TEXT,
-- IMPORTANTE: Usar DECIMAL para dinero, nunca FLOAT
precio_compra DECIMAL(10, 2) NOT NULL,
precio_venta DECIMAL(10, 2) NOT NULL,
stock_actual INT NOT NULL DEFAULT 0,
stock_minimo INT DEFAULT 5, -- Para alertas de "se está acabando"
id_categoria INT,
id_proveedor INT,
CONSTRAINT fk_prod_cat FOREIGN KEY (id_categoria) REFERENCES
categorias(id_categoria),
CONSTRAINT fk_prod_prov FOREIGN KEY (id_proveedor) REFERENCES
proveedores(id_proveedor)
);
-- -----------------------------------------------------
-- MÓDULO DE CLIENTES
-- -----------------------------------------------------
CREATE TABLE clientes (
id_cliente INT AUTO_INCREMENT PRIMARY KEY,
documento VARCHAR(20) NOT NULL UNIQUE,
nombre_completo VARCHAR(100) NOT NULL,
telefono VARCHAR(20),
direccion VARCHAR(150),
email VARCHAR(100)
-- Aquí podrías agregar un campo "puntos_acumulados" si deseas
fidelización
);
-- -----------------------------------------------------
-- MÓDULO DE CAJA (VENTAS)
-- -----------------------------------------------------
-- Tabla Ventas (Encabezado): DATOS GENERALES de la factura
CREATE TABLE ventas (
id_venta INT AUTO_INCREMENT PRIMARY KEY,
fecha_venta DATETIME DEFAULT CURRENT_TIMESTAMP,
numero_factura VARCHAR(20) UNIQUE, -- Opcional si usas el ID como
factura
total_venta DECIMAL(10, 2) NOT NULL,
metodo_pago ENUM('Efectivo', 'Tarjeta', 'Transferencia') DEFAULT
'Efectivo',
id_usuario INT NOT NULL, -- Qué cajero hizo la venta
id_cliente INT NOT NULL, -- A quién se le vendió (puede ser un cliente
"Genérico")
CONSTRAINT fk_ventas_usu FOREIGN KEY (id_usuario) REFERENCES
usuarios(id_usuario),
CONSTRAINT fk_ventas_cli FOREIGN KEY (id_cliente) REFERENCES
clientes(id_cliente)
);
-- Tabla Detalle de Venta: QUÉ PRODUCTOS se llevaron en esa factura
CREATE TABLE detalle_ventas (
id_detalle INT AUTO_INCREMENT PRIMARY KEY,
id_venta INT NOT NULL,
id_producto INT NOT NULL,
cantidad INT NOT NULL,
-- IMPORTANTE: Precio histórico. Si el producto sube de precio
mañana,
-- esta venta antigua debe conservar el precio al que se vendió hoy.
precio_unitario DECIMAL(10, 2) NOT NULL,
subtotal DECIMAL(10, 2) GENERATED ALWAYS AS (cantidad *
precio_unitario) VIRTUAL,
CONSTRAINT fk_det_venta FOREIGN KEY (id_venta) REFERENCES
ventas(id_venta),
CONSTRAINT fk_det_prod FOREIGN KEY (id_producto) REFERENCES
productos(id_producto)
);