175 lines
6.3 KiB
SQL
175 lines
6.3 KiB
SQL
-- Script de inicialización para pycore
|
||
-- Verificar si la base de datos ya existe y solo crear tablas si no existen
|
||
|
||
-- Crear tipos ENUM personalizados si no existen
|
||
DO $$ BEGIN
|
||
CREATE TYPE tipo_producto_enum AS ENUM ('insumo', 'terminado');
|
||
EXCEPTION
|
||
WHEN duplicate_object THEN null;
|
||
END $$;
|
||
|
||
-- 1️⃣ Sucursales
|
||
CREATE TABLE IF NOT EXISTS Sucursales (
|
||
id_sucursal SERIAL PRIMARY KEY,
|
||
nombre VARCHAR(100) NOT NULL,
|
||
direccion VARCHAR(255),
|
||
telefono VARCHAR(20),
|
||
fecha_creacion TIMESTAMP DEFAULT CURRENT_TIMESTAMP
|
||
);
|
||
|
||
-- 2️⃣ Inventario
|
||
CREATE TABLE IF NOT EXISTS Inventario (
|
||
id_producto SERIAL PRIMARY KEY,
|
||
nombre_producto VARCHAR(100) NOT NULL,
|
||
tipo_producto tipo_producto_enum NOT NULL,
|
||
precio_unitario DECIMAL(10,2) NOT NULL,
|
||
stock INT DEFAULT 0,
|
||
id_sucursal INT,
|
||
fecha_creacion TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
|
||
FOREIGN KEY (id_sucursal) REFERENCES Sucursales(id_sucursal)
|
||
);
|
||
|
||
-- 3️⃣ Compras
|
||
CREATE TABLE IF NOT EXISTS Compras (
|
||
id_compra SERIAL PRIMARY KEY,
|
||
id_sucursal INT NOT NULL,
|
||
fecha_compra DATE NOT NULL,
|
||
total DECIMAL(10,2) NOT NULL,
|
||
FOREIGN KEY (id_sucursal) REFERENCES Sucursales(id_sucursal)
|
||
);
|
||
|
||
-- 4️⃣ Detalle_compras
|
||
CREATE TABLE IF NOT EXISTS Detalle_compras (
|
||
id_detalle SERIAL PRIMARY KEY,
|
||
id_compra INT NOT NULL,
|
||
id_producto INT NOT NULL,
|
||
cantidad INT NOT NULL,
|
||
precio_unitario DECIMAL(10,2) NOT NULL,
|
||
FOREIGN KEY (id_compra) REFERENCES Compras(id_compra),
|
||
FOREIGN KEY (id_producto) REFERENCES Inventario(id_producto)
|
||
);
|
||
|
||
-- 5️⃣ Promociones
|
||
CREATE TABLE IF NOT EXISTS Promociones (
|
||
id_promocion SERIAL PRIMARY KEY,
|
||
nombre_promocion VARCHAR(100) NOT NULL,
|
||
descripcion TEXT,
|
||
descuento DECIMAL(5,2), -- Porcentaje
|
||
fecha_inicio DATE,
|
||
fecha_fin DATE
|
||
);
|
||
|
||
-- 6️⃣ Colaboradores
|
||
CREATE TABLE IF NOT EXISTS Colaboradores (
|
||
id_colaborador SERIAL PRIMARY KEY,
|
||
id_sucursal INT NOT NULL,
|
||
nombre VARCHAR(100) NOT NULL,
|
||
puesto VARCHAR(50),
|
||
salario DECIMAL(10,2),
|
||
fecha_ingreso DATE,
|
||
FOREIGN KEY (id_sucursal) REFERENCES Sucursales(id_sucursal)
|
||
);
|
||
|
||
-- 7️⃣ Gastos_sucursal
|
||
CREATE TABLE IF NOT EXISTS Gastos_sucursal (
|
||
id_gasto SERIAL PRIMARY KEY,
|
||
id_sucursal INT NOT NULL,
|
||
concepto VARCHAR(255) NOT NULL,
|
||
monto DECIMAL(10,2) NOT NULL,
|
||
fecha_gasto DATE NOT NULL,
|
||
FOREIGN KEY (id_sucursal) REFERENCES Sucursales(id_sucursal)
|
||
);
|
||
|
||
-- 8️⃣ Ventas
|
||
CREATE TABLE IF NOT EXISTS Ventas (
|
||
id_venta SERIAL PRIMARY KEY,
|
||
id_sucursal INT NOT NULL,
|
||
fecha_venta TIMESTAMP NOT NULL,
|
||
total DECIMAL(10,2) NOT NULL,
|
||
id_promocion INT,
|
||
FOREIGN KEY (id_sucursal) REFERENCES Sucursales(id_sucursal),
|
||
FOREIGN KEY (id_promocion) REFERENCES Promociones(id_promocion)
|
||
);
|
||
|
||
-- 9️⃣ Detalle_ventas
|
||
CREATE TABLE IF NOT EXISTS Detalle_ventas (
|
||
id_detalle SERIAL PRIMARY KEY,
|
||
id_venta INT NOT NULL,
|
||
id_producto INT NOT NULL,
|
||
cantidad INT NOT NULL,
|
||
precio_unitario DECIMAL(10,2) NOT NULL,
|
||
FOREIGN KEY (id_venta) REFERENCES Ventas(id_venta),
|
||
FOREIGN KEY (id_producto) REFERENCES Inventario(id_producto)
|
||
);
|
||
|
||
-- ==========================
|
||
-- ÍNDICES PARA MEJOR PERFORMANCE
|
||
-- ==========================
|
||
|
||
DO $$ BEGIN
|
||
CREATE INDEX IF NOT EXISTS idx_inventario_sucursal ON Inventario(id_sucursal);
|
||
CREATE INDEX IF NOT EXISTS idx_ventas_fecha ON Ventas(fecha_venta);
|
||
CREATE INDEX IF NOT EXISTS idx_ventas_sucursal ON Ventas(id_sucursal);
|
||
CREATE INDEX IF NOT EXISTS idx_compras_fecha ON Compras(fecha_compra);
|
||
CREATE INDEX IF NOT EXISTS idx_detalle_ventas_producto ON Detalle_ventas(id_producto);
|
||
CREATE INDEX IF NOT EXISTS idx_detalle_compras_producto ON Detalle_compras(id_producto);
|
||
CREATE INDEX IF NOT EXISTS idx_colaboradores_sucursal ON Colaboradores(id_sucursal);
|
||
EXCEPTION
|
||
WHEN duplicate_table THEN null;
|
||
END $$;
|
||
|
||
-- ==========================
|
||
-- DATOS DE EJEMPLO
|
||
-- ==========================
|
||
|
||
-- Insertar sucursal principal si no existen
|
||
INSERT INTO Sucursales (id_sucursal, nombre, direccion, telefono) VALUES
|
||
(1, 'Alitas Downtown', 'Av. Principal 123, Ciudad', '+52-55-1234-5678'),
|
||
(2, 'Alitas Norte', 'Plaza Norte 456, Zona Norte', '+52-55-8765-4321')
|
||
ON CONFLICT (id_sucursal) DO UPDATE SET
|
||
nombre = EXCLUDED.nombre,
|
||
direccion = EXCLUDED.direccion,
|
||
telefono = EXCLUDED.telefono;
|
||
|
||
-- Insertar productos típicos de alitas
|
||
INSERT INTO Inventario (id_producto, nombre_producto, tipo_producto, precio_unitario, stock, id_sucursal) VALUES
|
||
(1, 'Alitas de pollo', 'insumo', 45.50, 200, 1),
|
||
(2, 'Salsa BBQ', 'insumo', 25.00, 50, 1),
|
||
(3, 'Salsa Buffalo', 'insumo', 28.00, 40, 1),
|
||
(4, 'Papas para freír', 'insumo', 18.00, 100, 1),
|
||
(5, 'Harina para empanizar', 'insumo', 12.50, 30, 1),
|
||
(6, 'Orden de alitas (6 pzas)', 'terminado', 120.00, 0, 1),
|
||
(7, 'Orden de alitas (12 pzas)', 'terminado', 220.00, 0, 1),
|
||
(8, 'Papas a la francesa', 'terminado', 45.00, 0, 1),
|
||
(9, 'Aros de cebolla', 'terminado', 55.00, 0, 1)
|
||
ON CONFLICT (id_producto) DO UPDATE SET
|
||
nombre_producto = EXCLUDED.nombre_producto,
|
||
tipo_producto = EXCLUDED.tipo_producto,
|
||
precio_unitario = EXCLUDED.precio_unitario,
|
||
stock = EXCLUDED.stock,
|
||
id_sucursal = EXCLUDED.id_sucursal;
|
||
|
||
-- Insertar promociones
|
||
INSERT INTO Promociones (id_promocion, nombre_promocion, descripcion, descuento, fecha_inicio, fecha_fin) VALUES
|
||
(1, 'Martes de Alitas', '2x1 en órdenes de alitas todos los martes', 50.00, '2024-01-01', '2024-12-31'),
|
||
(2, 'Happy Hour', '20% de descuento en bebidas de 4pm a 7pm', 20.00, '2024-01-01', '2024-12-31'),
|
||
(3, 'Combo Familiar', 'Descuento especial en combos familiares', 15.00, '2024-03-01', '2024-03-31')
|
||
ON CONFLICT (id_promocion) DO UPDATE SET
|
||
nombre_promocion = EXCLUDED.nombre_promocion,
|
||
descripcion = EXCLUDED.descripcion,
|
||
descuento = EXCLUDED.descuento,
|
||
fecha_inicio = EXCLUDED.fecha_inicio,
|
||
fecha_fin = EXCLUDED.fecha_fin;
|
||
|
||
-- Insertar colaboradores
|
||
INSERT INTO Colaboradores (id_colaborador, id_sucursal, nombre, puesto, salario, fecha_ingreso) VALUES
|
||
(1, 1, 'Juan Pérez García', 'Gerente', 15000.00, '2023-01-15'),
|
||
(2, 1, 'María Hernández López', 'Cocinero', 8000.00, '2023-03-20'),
|
||
(3, 1, 'Carlos Rodríguez Silva', 'Mesero', 6000.00, '2023-05-10')
|
||
ON CONFLICT (id_colaborador) DO UPDATE SET
|
||
id_sucursal = EXCLUDED.id_sucursal,
|
||
nombre = EXCLUDED.nombre,
|
||
puesto = EXCLUDED.puesto,
|
||
salario = EXCLUDED.salario,
|
||
fecha_ingreso = EXCLUDED.fecha_ingreso;
|