-
Notifications
You must be signed in to change notification settings - Fork 1
Expand file tree
/
Copy pathInventario.sql
More file actions
242 lines (210 loc) · 9.97 KB
/
Inventario.sql
File metadata and controls
242 lines (210 loc) · 9.97 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
-- =====================================================
-- SCRIPT DE CREACIÓN DE BASE DE DATOS - EMPRESA INDUSTRIAL
-- Sistema de gestión de materias primas, productos y ventas por lotes
-- MariaDB/MySQL compatible
-- =====================================================
-- Crear la base de datos
CREATE DATABASE IF NOT EXISTS empresa_industrial;
USE empresa_industrial;
-- =====================================================
-- TABLA: PROVEEDORES
-- =====================================================
CREATE TABLE PROVEEDORES (
proveedor_id INT AUTO_INCREMENT PRIMARY KEY,
nombre VARCHAR(100) NOT NULL,
contacto_principal VARCHAR(100),
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
);
-- =====================================================
-- TABLA: MATERIAS_PRIMAS
-- =====================================================
CREATE TABLE MATERIAS_PRIMAS (
materia_prima_id INT AUTO_INCREMENT PRIMARY KEY,
codigo VARCHAR(50) NOT NULL UNIQUE,
nombre VARCHAR(100) NOT NULL,
precio_unitario DECIMAL(10,2) NOT NULL DEFAULT 0.00,
categoria VARCHAR(50),
stock_minimo_dinamico DECIMAL(12,2) DEFAULT NULL,
stock_maximo_dinamico DECIMAL(12,2) DEFAULT NULL,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
);
-- =====================================================
-- TABLA: ALMACENES
-- =====================================================
CREATE TABLE ALMACENES (
almacen_id INT AUTO_INCREMENT PRIMARY KEY,
nombre VARCHAR(100) NOT NULL,
ubicacion VARCHAR(200),
capacidad_maxima DECIMAL(12,2) DEFAULT 0.00,
capacidad_actual DECIMAL(12,2) DEFAULT 0.00,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
);
-- =====================================================
-- TABLA: PRODUCTOS
-- =====================================================
CREATE TABLE PRODUCTOS (
producto_id INT AUTO_INCREMENT PRIMARY KEY,
nombre VARCHAR(100) NOT NULL,
precio_venta DECIMAL(10,2) NOT NULL DEFAULT 0.00,
categoria VARCHAR(50),
stock_minimo_dinamico DECIMAL(12,2) DEFAULT NULL,
stock_maximo_dinamico DECIMAL(12,2) DEFAULT NULL,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
);
-- =====================================================
-- TABLA: CLIENTES
-- =====================================================
CREATE TABLE CLIENTES (
cliente_id INT AUTO_INCREMENT PRIMARY KEY,
nombre VARCHAR(100) NOT NULL,
contacto_principal VARCHAR(100),
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
);
-- =====================================================
-- TABLA: LOTES_MATERIAS
-- =====================================================
CREATE TABLE LOTES_MATERIAS (
lote_materia_id INT AUTO_INCREMENT PRIMARY KEY,
materia_prima_id INT NOT NULL,
almacen_id INT NOT NULL,
cantidad_disponible DECIMAL(12,2) NOT NULL DEFAULT 0.00,
fecha_compra DATE NOT NULL,
fecha_caducidad DATE,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
FOREIGN KEY (materia_prima_id) REFERENCES MATERIAS_PRIMAS(materia_prima_id) ON DELETE CASCADE,
FOREIGN KEY (almacen_id) REFERENCES ALMACENES(almacen_id) ON DELETE CASCADE
);
-- =====================================================
-- TABLA: LOTES_PRODUCTOS
-- =====================================================
CREATE TABLE LOTES_PRODUCTOS (
lote_producto_id INT AUTO_INCREMENT PRIMARY KEY,
producto_id INT NOT NULL,
almacen_id INT NOT NULL,
cantidad_disponible DECIMAL(12,2) NOT NULL DEFAULT 0.00,
fecha_produccion DATE NOT NULL,
fecha_caducidad DATE,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
FOREIGN KEY (producto_id) REFERENCES PRODUCTOS(producto_id) ON DELETE CASCADE,
FOREIGN KEY (almacen_id) REFERENCES ALMACENES(almacen_id) ON DELETE CASCADE
);
-- =====================================================
-- TABLA: COMPRAS
-- =====================================================
CREATE TABLE COMPRAS (
compra_id INT AUTO_INCREMENT PRIMARY KEY,
proveedor_id INT NOT NULL,
lote_materia_id INT NOT NULL,
fecha_compra DATE NOT NULL,
subtotal DECIMAL(12,2) NOT NULL DEFAULT 0.00,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
FOREIGN KEY (proveedor_id) REFERENCES PROVEEDORES(proveedor_id) ON DELETE CASCADE,
FOREIGN KEY (lote_materia_id) REFERENCES LOTES_MATERIAS(lote_materia_id) ON DELETE CASCADE
);
-- =====================================================
-- TABLA: VENTAS
-- =====================================================
CREATE TABLE VENTAS (
venta_id INT AUTO_INCREMENT PRIMARY KEY,
cliente_id INT NOT NULL,
lote_producto_id INT NOT NULL,
fecha_venta DATE NOT NULL,
cantidad_vendida DECIMAL(12,2) NOT NULL DEFAULT 0.00,
total_venta DECIMAL(12,2) NOT NULL DEFAULT 0.00,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
FOREIGN KEY (cliente_id) REFERENCES CLIENTES(cliente_id) ON DELETE CASCADE,
FOREIGN KEY (lote_producto_id) REFERENCES LOTES_PRODUCTOS(lote_producto_id) ON DELETE CASCADE
);
-- =====================================================
-- TABLA: PRODUCTO_MATERIAS (Relación de componentes)
-- =====================================================
CREATE TABLE PRODUCTO_MATERIAS (
producto_materia_id INT AUTO_INCREMENT PRIMARY KEY,
producto_id INT NOT NULL,
materia_prima_id INT NOT NULL,
cantidad_requerida DECIMAL(12,2) NOT NULL DEFAULT 0.00,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
FOREIGN KEY (producto_id) REFERENCES PRODUCTOS(producto_id) ON DELETE CASCADE,
FOREIGN KEY (materia_prima_id) REFERENCES MATERIAS_PRIMAS(materia_prima_id) ON DELETE CASCADE,
-- Evitar duplicados de la misma combinación producto-materia prima
UNIQUE KEY unique_producto_materia (producto_id, materia_prima_id)
);
-- =====================================================
-- TABLA: CONSUMO_LOTES_MATERIAS (Trazabilidad)
-- =====================================================
CREATE TABLE CONSUMO_LOTES_MATERIAS (
consumo_id INT AUTO_INCREMENT PRIMARY KEY,
lote_producto_id INT NOT NULL,
lote_materia_id INT NOT NULL,
cantidad_consumida DECIMAL(12,2) NOT NULL DEFAULT 0.00,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
FOREIGN KEY (lote_producto_id) REFERENCES LOTES_PRODUCTOS(lote_producto_id) ON DELETE CASCADE,
FOREIGN KEY (lote_materia_id) REFERENCES LOTES_MATERIAS(lote_materia_id) ON DELETE CASCADE
);
-- =====================================================
-- TABLA: MOVIMIENTOS_INVENTARIO (Auditoría)
-- =====================================================
CREATE TABLE MOVIMIENTOS_INVENTARIO (
movimiento_id INT AUTO_INCREMENT PRIMARY KEY,
almacen_id INT NOT NULL,
tipo_item ENUM('MATERIA_PRIMA', 'PRODUCTO') NOT NULL,
item_id INT NOT NULL,
tipo_movimiento ENUM('ENTRADA', 'SALIDA', 'AJUSTE', 'TRANSFERENCIA', 'MERMA') NOT NULL,
cantidad DECIMAL(12,2) NOT NULL,
fecha_movimiento TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
FOREIGN KEY (almacen_id) REFERENCES ALMACENES(almacen_id) ON DELETE CASCADE
);
-- =====================================================
-- ÍNDICES PARA OPTIMIZAR CONSULTAS
-- =====================================================
-- Índices en LOTES_MATERIAS
CREATE INDEX idx_lotes_materias_caducidad ON LOTES_MATERIAS(fecha_caducidad);
CREATE INDEX idx_lotes_materias_materia ON LOTES_MATERIAS(materia_prima_id);
CREATE INDEX idx_lotes_materias_almacen ON LOTES_MATERIAS(almacen_id);
-- Índices en LOTES_PRODUCTOS
CREATE INDEX idx_lotes_productos_caducidad ON LOTES_PRODUCTOS(fecha_caducidad);
CREATE INDEX idx_lotes_productos_producto ON LOTES_PRODUCTOS(producto_id);
CREATE INDEX idx_lotes_productos_almacen ON LOTES_PRODUCTOS(almacen_id);
-- Índices en COMPRAS
CREATE INDEX idx_compras_fecha ON COMPRAS(fecha_compra);
CREATE INDEX idx_compras_proveedor ON COMPRAS(proveedor_id);
-- Índices en VENTAS
CREATE INDEX idx_ventas_fecha ON VENTAS(fecha_venta);
CREATE INDEX idx_ventas_cliente ON VENTAS(cliente_id);
-- Índices en MOVIMIENTOS_INVENTARIO
CREATE INDEX idx_movimientos_fecha ON MOVIMIENTOS_INVENTARIO(fecha_movimiento);
CREATE INDEX idx_movimientos_tipo ON MOVIMIENTOS_INVENTARIO(tipo_movimiento);
CREATE INDEX idx_movimientos_almacen ON MOVIMIENTOS_INVENTARIO(almacen_id);
-- =====================================================
-- DATOS DE EJEMPLO (OPCIONAL)
-- =====================================================
-- Insertar almacenes de ejemplo
INSERT INTO ALMACENES (nombre, ubicacion, capacidad_maxima) VALUES
('Almacén Principal', 'Planta Baja - Sector A', 10000.00),
('Almacén de Materias Primas', 'Planta Baja - Sector B', 5000.00),
('Almacén de Productos Terminados', 'Primer Piso', 8000.00);
-- Insertar proveedores de ejemplo
INSERT INTO PROVEEDORES (nombre, contacto_principal) VALUES
('Proveedora Industrial SA', 'Juan Pérez'),
('Materias Primas del Norte', 'María García'),
('Suministros Técnicos SRL', 'Carlos López');
-- Insertar clientes de ejemplo
INSERT INTO CLIENTES (nombre, contacto_principal) VALUES
('Distribuidora Central', 'Ana Martínez'),
('Comercial del Sur', 'Pedro Rodríguez'),
('Mayorista Express', 'Laura Sánchez');
-- =====================================================
-- SCRIPT COMPLETADO
-- =====================================================
-- La base de datos está lista para usar
-- Recuerda ajustar los tipos de datos según tus necesidades específicas