Files
Pycore-ERP/postgres/init/01-init.sql

175 lines
6.3 KiB
SQL
Raw Permalink Blame History

This file contains invisible Unicode characters
This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
-- 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;