Download as txt, pdf, or txt
Download as txt, pdf, or txt
You are on page 1of 2

CREATE OR REPLACE PACKAGE PKG_HOTEL AS

V_CONSUMO_TOTAL NUMBER:=0;
FUNCTION FN_CONSUMO_HUESPED(P_ID_HUESPED NUMBER) RETURN NUMBER;
END PKG_HOTEL;

CREATE OR REPLACE PACKAGE BODY PKG_HOTEL AS


FUNCTION FN_CONSUMO_HUESPED(P_ID_HUESPED NUMBER) RETURN NUMBER AS
V_CONSUMO_TOTAL NUMBER:=0;
BEGIN
SELECT SUM(MONTO)
INTO V_CONSUMO_TOTAL
FROM CONSUMO
WHERE ID_HUESPED = P_ID_HUESPED;
RETURN V_CONSUMO_TOTAL;
END FN_CONSUMO_HUESPED;
END PKG_HOTEL;

CREATE OR REPLACE FUNCTION FN_MONTO_TOUR(P_ID_HUESPED NUMBER) RETURN NUMBER AS


V_MONTO_TOUR NUMBER;
BEGIN
BEGIN
EXECUTE IMMEDIATE 'SELECT SUM(T.VALOR_TOUR*HT.NUM_PERSONAS) "TOTAL TUR"
FROM HUESPED_TOUR HT JOIN TOUR T
ON HT.ID_TOUR = T.ID_TOUR
WHERE ID_HUESPED = P_ID_HUESPED'
INTO V_MONTO_TOUR USING P_ID_HUESPED;
RETURN V_MONTO_TOUR;
END;
END;

CREATE OR REPLACE PROCEDURE SP_CALCULO_PAGOS(P_FECHA_INGRESO DATE) AS


CURSOR C_HUESPEDES IS
SELECT H.ID_HUESPED, H.APPAT_HUESPED||' '||H.APMAT_HUESPED||' '||H.NOM_HUESPED
"NOMBRE",(VALOR_HABITACION+VALOR_MINIBAR)*R.ESTADIA "ESTADIA", SUM(C.MONTO) "MONTO
CONSUMO", H.ID_PROCEDENCIA,
(T.VALOR_TOUR*HT.NUM_PERSONAS) "TOURs",
((VALOR_HABITACION+VALOR_MINIBAR)*R.ESTADIA) + SUM(C.MONTO) +
(T.VALOR_TOUR*HT.NUM_PERSONAS) "SUBTOTAL"
FROM HUESPED H JOIN RESERVA R
ON H.ID_HUESPED = R.ID_HUESPED
JOIN DETALLE_RESERVA DR
ON R.ID_RESERVA = DR.ID_RESERVA
JOIN HABITACION HAB
ON DR.ID_HABITACION = HAB.ID_HABITACION
JOIN CONSUMO C
ON H.ID_HUESPED = C.ID_HUESPED
JOIN HUESPED_TOUR HT
ON H.ID_HUESPED = HT.ID_HUESPED
JOIN TOUR T
ON HT.ID_TOUR = T.ID_TOUR
GROUP BY H.ID_HUESPED, H.APPAT_HUESPED||' '||H.APMAT_HUESPED||' '||
H.NOM_HUESPED, (VALOR_HABITACION+VALOR_MINIBAR)*R.ESTADIA,
(T.VALOR_TOUR*HT.NUM_PERSONAS);

V_NOMBRE VARCHAR2(60);
V_ALOJAMIENTO NUMBER;
V_CONSUMOS NUMBER;
V_TOURS NUMBER;
V_SUBTOTAL_PAGO NUMBER;
V_PORCENTAJE_DESCTO NUMBER;
V_DESCUENTO_CONSUMOS NUMBER;
V_DESCUENTO_PROCEDENCIA NUMBER;
V_TOTAL NUMBER;
V_FECHA_INICIAL DATE;
V_FECHA_FINAL DATE;

BEGIN
EXECUTE IMMEDIATE 'TRUNCATE TABLE SALIDAS_DIARIAS_HUESPEDES';
EXECUTE IMMEDIATE 'TRUNCATE TABLE ERRORES_PROCESO';

FOR REG_HUESPEDES IN C_HUESPEDES LOOP


V_NOMBRE:= REG_HUESPEDES.APPAT_HUESPED||' '||REG_HUESPEDES.APMAT_HUESPED||'
'||REG_HUESPEDES.NOM_HUESPED;
V_ALOJAMIENTO:= REG_HUESPEDES.ALOJAMIENTO;
V_CONSUMOS:= PKG_HOTEL.FN_CONSUMO_HUESPED(REG_HUESPEDES.ID_HUESPED);
V_TOURS:= FN_MONTO_TOUR(REG_HUESPEDES.ID_HUESPED);
V_SUBTOTAL_PAGO:= V_ALOJAMIENTO + V_CONSUMOS + V_TOURS;

BEGIN
SELECT PCT
INTO V_PORCENTAJE_DESCTO
FROM RANGOS_CONSUMOS
WHERE PKG_HOTEL.FN_CONSUMO_HUESPED(REG_HUESPEDES.ID_HUESPED)
BETWEEN VMIN_TRAMO AND VMAX_TRAMO;

V_DESCUENTO_CONSUMOS:=
ROUND(PKG_HOTEL.FN_CONSUMO_HUESPED(REG_HUESPEDES.ID_HUESPED)* V_PORCENTAJE_DESCTO);
END;

V_DESCUENTO_PROCEDENCIA :=
CASE WHEN REG_HUESPEDES.ID_PROCEDENCIA = 151 THEN
ROUND(REG_HUESPEDES.SUBTOTAL * 0.10)
WHEN REG_HUESPEDES.ID_PROCEDENCIA = 115 THEN
ROUND(REG_HUESPEDES.SUBTOTAL * 0.20)
WHEN REG_HUESPEDES.ID_PROCEDENCIA = 120 THEN
ROUND(REG_HUESPEDES.SUBTOTAL * 0.20)
ELSE REG_HUESPEDES.SUBTOTAL * 0
END;

V_TOTAL:= ROUND(V_SUBTOTAL_PAGO - V_DESCUENTO_CONSUMOS -


V_DESCUENTO_PROCEDENCIA);

INSERT INTO SALIDAS_DIARIAS_HUESPEDES VALUES (REG_HUESPEDES.ID_HUESPED,


V_NOMBRE, V_ALOJAMIENTO, V_CONSUMOS, V_TOURS, V_SUBTOTAL_PAGO,
V_DESCUENTO_CONSUMOS, V_DESCUENTO_PROCEDENCIA, V_TOTAL);

END LOOP;
END SP_CALCULO_PAGOS;

You might also like