Initial commit - estructura completa del proyecto
This commit is contained in:
174
postgres/init/01-init.sql
Normal file
174
postgres/init/01-init.sql
Normal file
@@ -0,0 +1,174 @@
|
||||
-- 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;
|
||||
Reference in New Issue
Block a user