-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathR1-MantenimientoHistorico.sql
278 lines (243 loc) · 10 KB
/
R1-MantenimientoHistorico.sql
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
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
-----------------------------------------------------------------------
-- REQUERIMIENTO 1 - MANTENIMIENTO DE HISTORICO DE PRECIOS DE FLORES --
-----------------------------------------------------------------------
CREATE OR REPLACE FUNCTION cambiar_precio_flor(
p_idCatalogoFloristeria NUMERIC,
p_idCatalogocodigo NUMERIC, --Verificar si es mas eficiente con el id del corte de la flor
p_nuevo_precio NUMERIC
)
RETURNS TEXT AS $$
DECLARE
last_fechaInicio DATE;
last_tamanotallo NUMERIC;
today DATE := CURRENT_DATE;
dias_transcurridos INTEGER;
BEGIN
-- Obtener la fecha de inicio y el tamaño del tallo del último registro de precio
SELECT fechaInicio, tamanotallo INTO last_fechaInicio, last_tamanotallo
FROM HISTORICO_PRECIO_FLOR
WHERE idCatalogoFloristeria = p_idCatalogoFloristeria
AND idCatalogocodigo = p_idCatalogocodigo
ORDER BY fechaInicio DESC
LIMIT 1;
IF last_fechaInicio IS NULL THEN
RETURN 'No existen registros de precio para esta flor en la floristería especificada.';
END IF;
-- Calcular los días transcurridos desde la fecha de inicio
dias_transcurridos := today - last_fechaInicio;
IF dias_transcurridos >= 7 THEN
-- Actualizar la fechaFin del último registro al día actual
UPDATE HISTORICO_PRECIO_FLOR
SET fechaFin = today
WHERE idCatalogoFloristeria = p_idCatalogoFloristeria
AND idCatalogocodigo = p_idCatalogocodigo
AND fechaInicio = last_fechaInicio;
-- Insertar el nuevo registro con el nuevo precio y el mismo tamaño de tallo
INSERT INTO HISTORICO_PRECIO_FLOR (
idCatalogoFloristeria,
idCatalogocodigo,
fechaInicio,
fechaFin,
precio,
tamanotallo
) VALUES (
p_idCatalogoFloristeria,
p_idCatalogocodigo,
today,
NULL,
p_nuevo_precio,
last_tamanotallo
);
RETURN 'Precio actualizado exitosamente.';
ELSE
RETURN 'No es posible cambiar el precio por las políticas de la floristería que permiten un máximo de 7 días por precio.';
END IF;
END;
$$ LANGUAGE plpgsql;
----------------------------------------------------------------------
-- Posible superfuncion del requerimiento 1 --
----------------------------------------------------------------------
CREATE OR REPLACE FUNCTION cambiar_precio_flor_super(
p_nombreFloristeria TEXT,
p_nuevo_precio NUMERIC,
p_idCatalogocodigo NUMERIC DEFAULT NULL,
p_nombreFlor TEXT DEFAULT NULL,
p_idCorteFlor NUMERIC DEFAULT NULL
)
RETURNS TEXT AS $$
DECLARE
v_idFloristeria NUMERIC;
v_idCatalogoFloristeria NUMERIC;
v_idCatalogocodigo NUMERIC;
last_fechaInicio DATE;
last_tamanoTallo NUMERIC;
today DATE := CURRENT_DATE;
dias_transcurridos INTEGER;
BEGIN
-- Validar que se proporcione al menos uno de los métodos de identificación adicionales
IF p_idCatalogocodigo IS NULL AND p_nombreFlor IS NULL AND p_idCorteFlor IS NULL THEN
RETURN 'Debe proporcionar al menos uno de los siguientes parámetros para identificar la flor: p_idCatalogocodigo, p_nombreFlor, o p_idCorteFlor.';
END IF;
-- Obtener floristeriaId basado en p_nombreFloristeria
SELECT floristeriaId INTO v_idFloristeria
FROM FLORISTERIAS
WHERE nombre ILIKE p_nombreFloristeria
LIMIT 1;
IF NOT FOUND THEN
RETURN 'No se encontró la floristería especificada.';
END IF;
-- Obtener idCatalogoFloristeria basado en floristeriaId
SELECT codigo INTO v_idCatalogoFloristeria
FROM CATALOGO_FLORISTERIA
WHERE idFloristeria = v_idFloristeria
LIMIT 1;
IF NOT FOUND THEN
RETURN 'No se encontró el catálogo para la floristería especificada.';
END IF;
-- Determinar el idCatalogocodigo basado en los parámetros opcionales
IF p_idCatalogocodigo IS NOT NULL THEN
-- Método 1: Identificación por idCatalogocodigo
v_idCatalogocodigo := p_idCatalogocodigo;
RAISE NOTICE 'Método de identificación: idCatalogocodigo=%', v_idCatalogocodigo;
ELSIF p_nombreFlor IS NOT NULL THEN
-- Método 2: Identificación por nombreFlor
SELECT codigo INTO v_idCatalogocodigo
FROM CATALOGO_FLORISTERIA
WHERE nombrePropio ILIKE p_nombreFlor
AND idFloristeria = v_idFloristeria
ORDER BY codigo DESC
LIMIT 1;
IF NOT FOUND THEN
RETURN 'No se encontró la flor con el nombre especificado en la floristería.';
END IF;
RAISE NOTICE 'Método de identificación: nombreFlor=% con idCatalogocodigo=%', p_nombreFlor, v_idCatalogocodigo;
ELSIF p_idCorteFlor IS NOT NULL THEN
-- Método 3: Identificación por idCorteFlor
SELECT codigo INTO v_idCatalogocodigo
FROM CATALOGO_FLORISTERIA
WHERE idCorteFlor = p_idCorteFlor
AND idFloristeria = v_idFloristeria
LIMIT 1;
IF NOT FOUND THEN
RETURN 'No se encontró la flor con el idCorteFlor especificado en la floristería.';
END IF;
RAISE NOTICE 'Método de identificación: idCorteFlor=% con idCatalogocodigo=%', p_idCorteFlor, v_idCatalogocodigo;
END IF;
-- Verificar que v_idCatalogocodigo haya sido determinado
IF v_idCatalogocodigo IS NULL THEN
RETURN 'No se pudo determinar el idCatalogocodigo de la flor especificada.';
END IF;
-- Obtener la última fechaInicio y tamanoTallo del historial de precios
SELECT fechaInicio, tamanoTallo INTO last_fechaInicio, last_tamanoTallo
FROM HISTORICO_PRECIO_FLOR
WHERE idCatalogoFloristeria = v_idCatalogoFloristeria
AND idCatalogocodigo = v_idCatalogocodigo
ORDER BY fechaInicio DESC
LIMIT 1;
IF last_fechaInicio IS NULL THEN
RETURN 'No existen registros de precio para esta flor en la floristería especificada.';
END IF;
RAISE NOTICE 'Último registro encontrado: fechaInicio=%, tamanoTallo=%', last_fechaInicio, last_tamanoTallo;
-- Verificar si tamanoTallo es NULL y obtener el último valor válido si es necesario
IF last_tamanoTallo IS NULL THEN
RAISE NOTICE 'El tamanoTallo del último registro es NULL, buscando el último valor válido.';
SELECT tamanoTallo INTO last_tamanoTallo
FROM HISTORICO_PRECIO_FLOR
WHERE idCatalogoFloristeria = v_idCatalogoFloristeria
AND idCatalogocodigo = v_idCatalogocodigo
AND tamanoTallo IS NOT NULL
ORDER BY fechaInicio DESC
LIMIT 1;
IF last_tamanoTallo IS NULL THEN
RETURN 'No se encontró un valor válido para tamanoTallo en los registros anteriores.';
END IF;
RAISE NOTICE 'Último tamanoTallo válido encontrado: tamanoTallo=%', last_tamanoTallo;
END IF;
-- Calcular los días transcurridos desde la última fecha de inicio
dias_transcurridos := today - last_fechaInicio;
RAISE NOTICE 'Días transcurridos desde la última actualización: %', dias_transcurridos;
IF dias_transcurridos >= 7 THEN
-- Actualizar la fechaFin del último registro al día actual
UPDATE HISTORICO_PRECIO_FLOR
SET fechaFin = today
WHERE idCatalogoFloristeria = v_idCatalogoFloristeria
AND idCatalogocodigo = v_idCatalogocodigo
AND fechaInicio = last_fechaInicio;
RAISE NOTICE 'Actualizado fechaFin del último registro a %', today;
-- Insertar el nuevo registro con el nuevo precio y el mismo tamaño de tallo
INSERT INTO HISTORICO_PRECIO_FLOR (
idCatalogoFloristeria,
idCatalogocodigo,
fechaInicio,
fechaFin,
precio,
tamanoTallo
) VALUES (
v_idCatalogoFloristeria,
v_idCatalogocodigo,
today,
NULL,
p_nuevo_precio,
last_tamanoTallo
);
RAISE NOTICE 'Insertado nuevo registro con precio=% y tamanoTallo=%', p_nuevo_precio, last_tamanoTallo;
RETURN 'Precio actualizado exitosamente.';
ELSE
RETURN 'No es posible cambiar el precio por las políticas de la floristería que permiten un máximo de 7 días por precio.';
END IF;
EXCEPTION
WHEN OTHERS THEN
RAISE NOTICE 'Ocurrió un error: %', SQLERRM;
RETURN 'Ocurrió un error al intentar cambiar el precio de la flor: ' || SQLERRM;
END;
$$ LANGUAGE plpgsql;
/* Ejemplos de solicitud
SELECT cambiar_precio_flor_super(
p_nombreFloristeria := 'Floristería Central',
p_nuevo_precio := 20.00,
p_idCatalogocodigo := 1
);
SELECT cambiar_precio_flor_super(
p_nombreFloristeria := 'Floristería Central',
p_nuevo_precio := 25.00,
p_nombreFlor := 'Rosa Roja'
);
SELECT cambiar_precio_flor_super(
p_nombreFloristeria := 'Floristería Central',
p_nuevo_precio := 30.00,
p_idCorteFlor := 5
);*/
-----------------------------------------------------------------------------------
-- FUNCION PARA RETORNAR UNA TABLA QUE ME MUESTRE LAS FLORES ACTIVAS Y EXPIRADAS --
-----------------------------------------------------------------------------------
CREATE OR REPLACE FUNCTION obtener_flores_precio_activo()
RETURNS TABLE (
floristeria_nombre VARCHAR,
flor_nombre VARCHAR,
precio_actual NUMERIC,
dias_para_expirar INTEGER,
estado VARCHAR
) AS $$
BEGIN
RETURN QUERY
SELECT
f.nombre AS floristeria_nombre,
c.nombrePropio AS flor_nombre,
h.precio AS precio_actual,
7 - (CURRENT_DATE - h.fechaInicio) AS dias_para_expirar,
CASE
WHEN 7 - (CURRENT_DATE - h.fechaInicio) > 0 THEN
CONCAT('Activo: ', 7 - (CURRENT_DATE - h.fechaInicio), ' días restantes')::VARCHAR
ELSE
'Necesita actualización'::VARCHAR
END AS estado
FROM HISTORICO_PRECIO_FLOR h
JOIN CATALOGO_FLORISTERIA c
ON h.idCatalogoFloristeria = c.idFloristeria
AND h.idCatalogocodigo = c.codigo
JOIN FLORISTERIAS f
ON c.idFloristeria = f.floristeriaId
WHERE h.fechaFin IS NULL;
END;
$$ LANGUAGE plpgsql;
/* FIN DEL REQUERIMIENTO 1 */