CREATE OR REPLACE FUNCTION pagrgenprefac3(v_pperprefacact character varying, v_mnumprefactura character varying, v_mtarplana numeric, v_mtipuso character varying, v_mestubicacion character varying, v_mconcontratado numeric, v_mconimprevisto numeric, v_mconprogramado numeric, v_mconconmetcub double precision, v_mapartamentos integer, v_mpagiva character varying, v_mestsuscriptor character varying, v_mlecactual numeric, v_mfeclecact character varying) RETURNS integer AS $BODY$ DECLARE --Declaracion de Variables para mCurInfTarifa v_mCodConTarifa VARCHAR(3); v_mNomConcepto VARCHAR(50); v_mMonConcepto DOUBLE PRECISION; v_mEstTipCambio VARCHAR(1); v_mDotMinTipUso numeric; v_mFactor DOUBLE PRECISION; v_mMetCubMin DOUBLE PRECISION; v_mMetCubMax DOUBLE PRECISION; -- Declaracion de Variables de Trabajo v_mAnio VARCHAR(4); v_mMes VARCHAR(2); v_mPerPreFacAnt VARCHAR(6); v_mConsumo DOUBLE PRECISION; v_mConCalculado DOUBLE PRECISION; v_mConPreFacAnu DOUBLE PRECISION; v_mFecActual VARCHAR(10); v_mIndice INTEGER; v_mMonDetalle DOUBLE PRECISION; v_mMonTotal DOUBLE PRECISION; v_mMonTotIva DOUBLE PRECISION; v_mConCalculo DOUBLE PRECISION; v_mDotMinSus numeric; v_mNumBloCon INTEGER; v_mTipDocumento VARCHAR(2); v_mPorIva DOUBLE PRECISION; v_mValDolar DOUBLE PRECISION; v_mNumPreFacFin NUMERIC; v_mNumPreFacIni NUMERIC; v_mNumPreFac VARCHAR(20); v_mNomTipUso VARCHAR(50); v_mCodMotAnu VARCHAR(10); v_mFacturado VARCHAR(1); v_xDocumento VARCHAR(20); SWV_err INTEGER; -- ---> DECLARACION DEL CURSOR DE TARIFAS POR BLOQUE DE CONSUMO -- DECLARE mCurInfTarBlo Cursor FOR SELECT TIPO_TARIFA.COD_CON_TARIFA, CONCEPTO.NOM_CONCEPTO, CAST(TIPO_TARIFA.MONTO AS NUMERIC(15,2)), TIPO_TARIFA.EST_TIP_CAMBIO, TIPO_USO.DOT_MINIMA, REL_TAR_BLO_CON.FACTOR, BLOQUE_CONSUMO.MET_CUB_MIN, BLOQUE_CONSUMO.MET_CUB_MAX FROM BLOQUE_CONSUMO INNER JOIN((CONCEPTO INNER JOIN(TIPO_USO INNER JOIN TIPO_TARIFA ON TIPO_USO.ID_USO = TIPO_TARIFA.COD_TIP_USO) ON CONCEPTO.COD_CONCEPTO = TIPO_TARIFA.COD_CON_TARIFA) INNER JOIN REL_TAR_BLO_CON ON TIPO_TARIFA.COD_TIPO_TARIFA = REL_TAR_BLO_CON.COD_TIPO_TARIFA) ON BLOQUE_CONSUMO.COD_BLOQ_CONSUMO = REL_TAR_BLO_CON.COD_BLOQ_CONSUMO WHERE TIPO_TARIFA.COD_TIP_USO = v_mTipUso And TIPO_TARIFA.EST_UBICACION = v_mEstUbicacion AND TIPO_TARIFA.PER_INI_VIGENCIA <= v_pperprefacact AND (TIPO_TARIFA.PER_FIN_VIGENCIA >= v_pperprefacact OR TIPO_TARIFA.PER_FIN_VIGENCIA = '0') AND BLOQUE_CONSUMO.PER_INI_VIG <= v_pperprefacact AND (BLOQUE_CONSUMO.PER_FIN_VIG >= v_pperprefacact OR BLOQUE_CONSUMO.PER_FIN_VIG = '0') AND REL_TAR_BLO_CON.PER_INI_VIGENCIA <= v_pperprefacact AND (REL_TAR_BLO_CON.PER_FIN_VIGENCIA >= v_pperprefacact OR REL_TAR_BLO_CON.PER_FIN_VIGENCIA = '0') ORDER BY CAST(BLOQUE_CONSUMO.MET_CUB_MIN as INTEGER); -- ---> DECLARACION DEL CURSOR DE TARIFAS POR CONCEPTO -- DECLARE mCurInfTarCon Cursor FOR SELECT TIPO_TARIFA.COD_CON_TARIFA, CONCEPTO.NOM_CONCEPTO, CAST(TIPO_TARIFA.MONTO AS NUMERIC(15,2)), TIPO_TARIFA.EST_TIP_CAMBIO, TIPO_USO.DOT_MINIMA FROM TIPO_USO INNER JOIN(CONCEPTO INNER JOIN TIPO_TARIFA ON CONCEPTO.COD_CONCEPTO = TIPO_TARIFA.COD_CON_TARIFA) ON TIPO_USO.ID_USO = TIPO_TARIFA.COD_TIP_USO WHERE TIPO_TARIFA.COD_TIP_USO = v_mTipUso AND TIPO_TARIFA.EST_UBICACION = v_mEstUbicacion AND TIPO_TARIFA.PER_INI_VIGENCIA <= v_pperprefacact AND (TIPO_TARIFA.PER_FIN_VIGENCIA >= v_pperprefacact OR TIPO_TARIFA.PER_FIN_VIGENCIA = '0') ORDER BY TIPO_TARIFA.COD_CON_TARIFA; -- ---> PROGRAMA PRINCIPAL -- BEGIN -- ---> Crea una tabla temporal para guardar el monto concepto -- begin CREATE GLOBAL TEMPORARY TABLE tt_MMONDETALLE (mIdDetalle INTEGER, mMonDetalle DOUBLE PRECISION, mNomConDetalle VARCHAR(50), mMonTarifa DOUBLE PRECISION, mConContratado DOUBLE PRECISION, mMetCubMin DOUBLE PRECISION ) WITH OIDS; exception when others then truncate table tt_MMONDETALLE; end; IF SWV_err <> 0 then RAISE EXCEPTION 'Error tratando de crear la tabla temporal mMonDetalle, Reintente otra vez y si el error persiste consulte Administrador de la Aplicación....'; Return 0; END IF; SWV_err := 0; v_mIndice := 1; v_mMonTotal := 0; v_mConCalculado := v_mTarPlana; -- ---> Abre el cursor de Tarifas por Bloque -- OPEN mCurInfTarBlo; FETCH mCurInfTarBlo INTO v_mCodConTarifa, v_mNomConcepto, v_mMonConcepto, v_mEstTipCambio, v_mDotMinTipUso, v_mFactor, v_mMetCubMin, v_mMetCubMax; IF NOT FOUND then -- ---> Abre el cursor de Tarifas por Concepto -- OPEN mCurInfTarCon; FETCH mCurInfTarCon INTO v_mCodConTarifa, v_mNomConcepto, v_mMonConcepto, v_mEstTipCambio, v_mDotMinTipUso; IF NOT FOUND then RAISE EXCEPTION 'No Existe Plan Tarifario para el suscriptor'; DROP TABLE tt_MMONDETALLE CASCADE; END IF; while FOUND loop -- ---> Proceso de Cálculo Acueducto Industrial -- IF v_mTipUso = '8' OR v_mTipUso = '9' then v_mMonDetalle := 0; ---> Si la condición de Facturación es moneda distinta al Bolívar IF v_mEstTipCambio = '1' then v_mMonConcepto := v_mMonConcepto * v_mValDolar; END IF; ---> Cálculo Consumo Contratado IF v_mIndice = 1 then v_mMonDetalle := v_mConContratado * v_mMonConcepto; v_mConCalculo := v_mConContratado; END IF; ---> Cálculo Consumo Programado IF v_mIndice = 2 then v_mMonDetalle := v_mConProgramado * v_mMonConcepto; v_mConCalculo := v_mConProgramado; END IF; ---> Cálculo Consumo Imprevisto IF v_mIndice = 3 then v_mMonDetalle := v_mConImprevisto * v_mMonConcepto; v_mConCalculo := v_mConImprevisto; END IF; ---> Cálculo en Base al Consumo Mensual IF v_mIndice = 4 and(v_pLocalidad <> '00' OR v_mEstSuscriptor = '0') then ---> Cálculo Consumo hasta el Consumo Contratado en Metros Cúbicos sin Exceso IF v_mConCalculado <= v_mConConMetCub then v_mMonDetalle := v_mConCalculado * v_mMonConcepto; v_mConCalculo := v_mConCalculado; v_mMonTotal := v_mMonTotal + v_mMonDetalle; begin INSERT INTO tt_MMONDETALLE VALUES (v_mIndice, v_mMonDetalle, v_mCodConTarifa, v_mMonConcepto, v_mConCalculo, 0); EXCEPTION WHEN OTHERS THEN SWV_err := -1; end; IF SWV_err <> 0 then RAISE EXCEPTION 'Error tratando de ingresar el registro en la tabla temporal #mMonDetalle, Reintente otra vez y si el error persiste consulte Administrador de la Aplicación....'; DROP TABLE tt_MMONDETALLE CASCADE; Return 0; END IF; SWV_err := 0; FETCH mCurInfTarCon INTO v_mCodConTarifa, v_mNomConcepto, v_mMonConcepto, v_mEstTipCambio, v_mDotMinTipUso; v_mIndice := v_mIndice + 1; v_mMonDetalle := 0; v_mConCalculo := 0; ELSE ---> Cálculo Consumo hasta el Consumo Contratado en Metros Cúbicos con Exceso v_mMonDetalle := v_mConConMetCub * v_mMonConcepto; v_mConCalculo := v_mConConMetCub; v_mMonTotal := v_mMonTotal + v_mMonDetalle; begin INSERT INTO tt_MMONDETALLE VALUES (v_mIndice, v_mMonDetalle, v_mCodConTarifa, v_mMonConcepto, v_mConCalculo, 0); EXCEPTION WHEN OTHERS THEN SWV_err := -1; end; IF SWV_err <> 0 then RAISE EXCEPTION 'Error tratando de ingresar el registro en la tabla temporal #mMonDetalle, Reintente otra vez y si el error persiste consulte Administrador de la Aplicación....'; DROP TABLE tt_MMONDETALLE CASCADE; Return 0; END IF; SWV_err := 0; FETCH mCurInfTarCon INTO v_mCodConTarifa, v_mNomConcepto, v_mMonConcepto, v_mEstTipCambio, v_mDotMinTipUso; ---> Cálculo Consumo de Exceso v_mIndice := v_mIndice + 1; v_mMonDetalle := (v_mConCalculado - v_mConConMetCub) * v_mMonConcepto; v_mConCalculo :=(v_mConCalculado - v_mConConMetCub); END IF; END IF; ELSE -- ---> Proceso de Cálculo Aguada Marítima -- IF v_mTipUso = '7' then v_mMonDetalle := 0; v_mMonDetalle := v_mConCalculado * v_mMonConcepto; v_mConCalculo := v_mConCalculado; ELSE -- ---> Proceso de Cálculo Oficial, Comercial e Industrial A y B -- v_mMonDetalle := 0; ---> Calculo Cargo Fijo con el 1/6 de la dotación o el mínimo del uso IF v_mIndice = 1 then v_mDotMinSus := CAST(v_mConContratado / 6 AS NUMERIC(15,2)); --v_mDotMinSus := CAST(v_mDotMinSus AS NUMERIC(15,2)); IF v_mDotMinSus <= v_mDotMinTipUso then v_mMonDetalle := v_mDotMinTipUso * v_mMonConcepto; v_mConCalculo := v_mDotMinTipUso; ELSE v_mMonDetalle := v_mDotMinSus * v_mMonConcepto; v_mConCalculo := v_mDotMinSus; END IF; END IF; ---> Calculo hasta la Dotación IF v_mIndice = 2 and (v_pLocalidad <> '00' OR v_mEstSuscriptor = '0') then IF v_mConCalculado <= v_mConContratado then v_mMonDetalle := v_mConCalculado * v_mMonConcepto; v_mConCalculo := v_mConCalculado; ELSE v_mMonDetalle := v_mConContratado * v_mMonConcepto; v_mConCalculo := v_mConContratado; END IF; END IF; ---> Calculo Consumo por Exceso IF v_mIndice = 3 and (v_pLocalidad <> '00' OR v_mEstSuscriptor = '0') then IF v_mConCalculado <= v_mConContratado then v_mMonDetalle := 0; v_mConCalculo := 0; ELSE v_mMonDetalle := (v_mConCalculado - v_mConContratado) * v_mMonConcepto; v_mConCalculo :=(v_mConCalculado - v_mConContratado); END IF; END IF; END IF; END IF; begin INSERT INTO tt_MMONDETALLE VALUES (v_mIndice, v_mMonDetalle, v_mCodConTarifa, v_mMonConcepto, v_mConCalculo, 0); EXCEPTION WHEN OTHERS THEN SWV_err := -1; end; IF SWV_err <> 0 then RAISE EXCEPTION 'Error tratando de ingresar el registro en la tabla temporal #mMonDetalle, Reintente otra vez y si el error persiste consulte Administrador de la Aplicación....'; DROP TABLE tt_MMONDETALLE CASCADE; Return 0; END IF; SWV_err := 0; v_mMonTotal := v_mMonTotal + v_mMonDetalle; FETCH mCurInfTarCon INTO v_mCodConTarifa, v_mNomConcepto, v_mMonConcepto, v_mEstTipCambio, v_mDotMinTipUso; v_mIndice := v_mIndice + 1; end loop; CLOSE mCurInfTarCon; IF SWV_err <> 0 then RAISE EXCEPTION 'Error tratando de eliminar el cursor de tarifas, Reintente otra vez y si el error persiste consulte Administrador de la Aplicación....'; DROP TABLE tt_MMONDETALLE CASCADE; Return 0; END IF; SWV_err := 0; ELSE -- ---> Determina el Número de Bloques de Consumo -- begin SELECT COUNT(TIPO_TARIFA.COD_CON_TARIFA) INTO v_mNumBloCon FROM BLOQUE_CONSUMO INNER JOIN((CONCEPTO INNER JOIN(TIPO_USO INNER JOIN TIPO_TARIFA ON TIPO_USO.ID_USO = TIPO_TARIFA.COD_TIP_USO) ON CONCEPTO.COD_CONCEPTO = TIPO_TARIFA.COD_CON_TARIFA) INNER JOIN REL_TAR_BLO_CON ON TIPO_TARIFA.COD_TIPO_TARIFA = REL_TAR_BLO_CON.COD_TIPO_TARIFA) ON BLOQUE_CONSUMO.COD_BLOQ_CONSUMO = REL_TAR_BLO_CON.COD_BLOQ_CONSUMO WHERE TIPO_TARIFA.COD_TIP_USO = v_mTipUso And TIPO_TARIFA.EST_UBICACION = v_mEstUbicacion AND TIPO_TARIFA.PER_INI_VIGENCIA <= v_pperprefacact AND (TIPO_TARIFA.PER_FIN_VIGENCIA >= v_pperprefacact OR TIPO_TARIFA.PER_FIN_VIGENCIA = '0') AND BLOQUE_CONSUMO.PER_INI_VIG <= v_pperprefacact AND (BLOQUE_CONSUMO.PER_FIN_VIG >= v_pperprefacact OR BLOQUE_CONSUMO.PER_FIN_VIG = '0') AND REL_TAR_BLO_CON.PER_INI_VIGENCIA <= v_pperprefacact AND (REL_TAR_BLO_CON.PER_FIN_VIGENCIA >= v_pperprefacact OR REL_TAR_BLO_CON.PER_FIN_VIGENCIA = '0'); EXCEPTION WHEN OTHERS THEN SWV_err := -1; end; if SWV_err <> 0 then RAISE EXCEPTION 'Error tratando de determinar el Número de Bloques Consumo, Reintente otra vez y si el error persiste consulte Administrador de la Aplicación....'; DROP TABLE tt_MMONDETALLE CASCADE; Return 0; END IF; SWV_err := 0; v_mConsumo := CAST((v_mConCalculado / v_mApartamentos) AS NUMERIC(15,2)); --raise notice 'v_mConsumo: %', v_mConsumo; --raise notice 'v_mConCalculado: %', v_mConCalculado; --raise notice 'v_mApartamentos: %', v_mApartamentos; v_mMonTotal := 0; v_mIndice := 1; v_mConCalculo := 0; while FOUND loop IF v_mConsumo > 0 then IF v_mIndice = v_mNumBloCon then v_mConCalculo := v_mConsumo; v_mConsumo := 0; ELSE v_mConCalculo :=(v_mMetCubMax + 1) - v_mMetCubMin; v_mConsumo := v_mConsumo - v_mConCalculo; IF v_mConsumo < 0 then v_mConCalculo := v_mConCalculo + v_mConsumo; END IF; END IF; v_mMonDetalle := 0; v_mMonConcepto := v_mFactor * v_mMonConcepto; v_mMonDetalle := v_mMonConcepto * v_mConCalculo* v_mApartamentos; ELSE EXIT; END IF; begin INSERT INTO tt_MMONDETALLE VALUES (v_mIndice, v_mMonDetalle, v_mCodConTarifa, v_mMonConcepto, v_mConCalculo, v_mMetCubMin); EXCEPTION WHEN OTHERS THEN SWV_err := -1; end; IF SWV_err <> 0 then RAISE EXCEPTION 'Error tratando de ingresar el registro en la tabla temporal #mMonDetalle, Reintente otra vez y si el error persiste consulte Administrador de la Aplicación....'; DROP TABLE tt_MMONDETALLE CASCADE; Return 0; END IF; SWV_err := 0; v_mMonTotal := v_mMonTotal + v_mMonDetalle; v_mIndice := v_mIndice + 1; FETCH mCurInfTarBlo INTO v_mCodConTarifa, v_mNomConcepto, v_mMonConcepto, v_mEstTipCambio, v_mDotMinTipUso, v_mFactor, v_mMetCubMin, v_mMetCubMax; END LOOP; begin CLOSE mCurInfTarBlo; EXCEPTION WHEN OTHERS THEN SWV_err := -1; end; IF SWV_err <> 0 then RAISE EXCEPTION 'Error tratando de eliminar el cursor de tarifas, Reintente otra vez y si el error persiste consulte Administrador de la Aplicación....'; DROP TABLE tt_MMONDETALLE CASCADE; Return 0; END IF; SWV_err := 0; END IF; IF v_mPagIva = '1' then v_mMonTotIva := v_mMonTotal * v_mPorIva; ELSE v_mMonTotIva := 0; END IF; -- ---> Actualiza en la Tabla Prefacturación -- begin --raise notice 'entro al begin-end'; --aux3 := CAST(v_mMonTotal AS NUMERIC(15,2)) + CAST(v_mMonTotIva AS NUMERIC(15,2)); --RAISE NOTICE 'VALORES INGRESADOS EN LA TABLA PREFACTURACION'; --RAISE NOTICE 'Cuenta: %',v_mCuenta; --RAISE NOTICE 'v_mMonTotal:%',v_mMonTotal; --RAISE NOTICE 'v_mMonTotIva:%',v_mMonTotIva; --RAISE NOTICE 'v_mMonTotal + v_mMonTotIva:%', aux3; --raise notice 'v_mCuenta:%',v_mCuenta; raise notice 'v_mNumPrefactura:%', v_mNumPrefactura; UPDATE PREFACTURACION SET LECTURA = CAST(v_mLecActual AS VARCHAR(20)), FECHA_LECTURA = v_mFecLecAct, CONSUMO = v_mTarPlana, FECHA_FACTURACION = TO_CHAR(LOCALTIMESTAMP,'dd/mm/yyyy'), TOTAL_CONCEPTOS = CAST(v_mMonTotal AS NUMERIC(15,2)), TOTAL_IVA = CAST(v_mMonTotIva AS NUMERIC(15,2)), TOTAL_PAGAR = CAST(v_mMonTotal AS NUMERIC(15,2)) + CAST(v_mMonTotIva AS NUMERIC(15,2)), FACTURADO = v_mFacturado WHERE NRO_PREFACTURA = v_mNumPrefactura; EXCEPTION WHEN OTHERS THEN SWV_err := -1; end; IF SWV_err <> 0 then RAISE EXCEPTION 'Error al ingresar registro en PREFACTURA, Reintente otra vez y si el error persiste consulte Administrador de la Aplicación....'; DROP TABLE tt_MMONDETALLE CASCADE; Return 0; END IF; SWV_err := 0; -- ---> Inserta en la Tabla Detalle Prefactura -- begin INSERT INTO DETALLE_PREFACTURA (ID_DETALLE, CONCEPTO, MONTO_CONCEPTO, NRO_PREFACTURA, TIPO_OPERACION, MON_TARIFA, CANTIDAD, MET_CUB_MIN) SELECT mIdDetalle, mNomConDetalle, CAST(mMonDetalle AS NUMERIC(15,2)), v_mNumPrefactura as xNumPrefactura, '0' as xTipOperacion, CAST(mMonTarifa AS NUMERIC(15,2)), CAST(mConContratado AS NUMERIC(15,2)), mMetCubMin FROM tt_MMONDETALLE WHERE mMonDetalle <> 0; EXCEPTION WHEN OTHERS THEN SWV_err := -1; end; IF SWV_err <> 0 then RAISE EXCEPTION 'Error al ingresar registro en DETALLE PREFACTURA, Reintente otra vez y si el error persiste consulte Administrador de la Aplicación....'; DROP TABLE tt_MMONDETALLE CASCADE; Return 0; END IF; SWV_err := 0; -- ---> Elimina la Tabla Temporal -- begin DROP TABLE tt_MMONDETALLE CASCADE; EXCEPTION WHEN OTHERS THEN SWV_err := -1; end; IF SWV_err <> 0 then RAISE EXCEPTION 'Error al Eliminar la tabla temporal #mMonDetalle, Reintente otra vez y si el error persiste consulte Administrador de la Aplicación....'; Return 0; END IF; SWV_err := 0; Return 1; END; $BODY$ LANGUAGE 'plpgsql' VOLATILE;