CREATE OR REPLACE FUNCTION "FN_ARREDONDAMENTO_TARIFA"(pTarifa IN NUMBER, pOrgaoConcedenteId IN NUMBER, pImporteSeguro IN NUMBER, pImporteTaxaEmbarque IN NUMBER, pImportePedagio IN NUMBER, pImporteOutros IN NUMBER, pTxEmbarque IN INTEGER) RETURN NUMBER AS lStrPrecoTotal VARCHAR(15); lUltimoNumero NUMBER; lStrPenlultimoNumero VARCHAR(2); lStrParteInteira VARCHAR(10); lPrecoTotallArredondado NUMBER; lPrecoTotal NUMBER; lDiferencaArredondamento NUMBER; lCentavos NUMBER; lDoisUltimos NUMBER; lTresUltimos NUMBER; lStrAntePenlultimoNumero NUMBER; BEGIN IF pTxEmbarque = 1 THEN lPrecoTotal := coalesce(pTarifa, 0) + coalesce(pImporteSeguro, 0) + coalesce(pImporteTaxaEmbarque, 0) + coalesce(pImportePedagio, 0) + coalesce(pImporteOutros, 0); ELSE lPrecoTotal := coalesce(pTarifa, 0) + coalesce(pImporteSeguro, 0) + coalesce(pImportePedagio, 0) + coalesce(pImporteOutros, 0); END IF; lPrecoTotallArredondado := lPrecoTotal; lStrPrecoTotal := to_char(lPrecoTotal, '99999.99'); lUltimoNumero := to_number(substr(lStrPrecoTotal, -1), '9'); lStrPenlultimoNumero := substr(lStrPrecoTotal, length(lStrPrecoTotal) - 1, 1); lStrParteInteira := trim(substr(lStrPrecoTotal, 0, length(lStrPrecoTotal) - 3)); lCentavos := to_number(substr(lStrPrecoTotal, -2, 2), '99'); -- SINFRA - MA - tarifas arredondadas a cada R$ 0,50 - com a seguinte regra, de 0,01 a 0,24 e de 0,51 a 0,74, arredonda para baixo, e de 0,25 a 0,49 e de 0,75 a 0,99, arredonda para cima. IF pOrgaoConcedenteId = 17 THEN IF lCentavos BETWEEN 1 AND 24 THEN lPrecoTotallArredondado := to_number(lStrParteInteira || '.' || '00', '99999.99'); END IF; IF (lCentavos BETWEEN 51 AND 74) OR (lCentavos BETWEEN 25 AND 49) THEN lPrecoTotallArredondado := to_number(lStrParteInteira || '.' || '50', '99999.99'); END IF; IF lCentavos BETWEEN 75 AND 99 THEN lPrecoTotallArredondado := to_number(lStrParteInteira || '.' || '00', '99999.99') + 1; END IF; END IF; -- SETRANS - PI - tarifas arredondadas a cada R$ 0,10 - sendo de 0,01 a 0,04 arredonda para baixo, de 0,05 a 0,09, arredonda para cima. IF pOrgaoConcedenteId = 18 OR pOrgaoConcedenteId = 10 THEN IF lUltimoNumero BETWEEN 1 AND 4 THEN lPrecoTotallArredondado := to_number(lStrParteInteira || '.' || lStrPenlultimoNumero || '0', '99999.99'); END IF; IF lUltimoNumero BETWEEN 5 AND 9 THEN lPrecoTotallArredondado := to_number(lStrParteInteira || '.' || lStrPenlultimoNumero || '0', '99999.99') + 0.1; END IF; END IF; --DER-MG -- DER-PB e DETRAN-CE: mesma regra para os dois, tarifas arredondadas a cada R$ 0,05, sendo de 0,01 a 0,024 e 0,051 a 0,074 arredonda para baixo e de 0,025 a 0,049 e de 0,075 a 0,099 arredonda para cima. IF pOrgaoConcedenteId = 19 OR pOrgaoConcedenteId = 20 OR pOrgaoConcedenteId = 6 THEN lStrPrecoTotal := to_char(lPrecoTotal, '99999.999'); lUltimoNumero := to_number(substr(lStrPrecoTotal, -1), '9'); lStrAntePenlultimoNumero := substr(lStrPrecoTotal, -3, 1); lStrParteInteira := trim(substr(lStrPrecoTotal, 0, length(lStrPrecoTotal) - 4)); lDoisUltimos := to_number(substr(lStrPrecoTotal, -2, 2), '99'); IF lDoisUltimos BETWEEN 10 AND 24 THEN lPrecoTotallArredondado := to_number( lStrParteInteira || '.' || lStrAntePenlultimoNumero || '00', '99999.999'); END IF; IF (lDoisUltimos BETWEEN 51 AND 74) OR (lDoisUltimos BETWEEN 25 AND 49) THEN lPrecoTotallArredondado := to_number( lStrParteInteira || '.' || lStrAntePenlultimoNumero || '50', '99999.999'); END IF; IF lDoisUltimos BETWEEN 75 AND 99 THEN lPrecoTotallArredondado := to_number(lStrParteInteira || '.' || lStrAntePenlultimoNumero || '00', '99999.999') + 0.1; END IF; END IF; --ARTESP IF pOrgaoConcedenteId = 21 THEN --regra 1 IF lUltimoNumero BETWEEN 1 AND 2 THEN lPrecoTotallArredondado := to_number(lStrParteInteira || '.' || lStrPenlultimoNumero || '0', '99999.99'); END IF; --regras 2 e 3 IF (lUltimoNumero BETWEEN 3 AND 4) OR (lUltimoNumero BETWEEN 6 AND 7) THEN lPrecoTotallArredondado := to_number(lStrParteInteira || '.' || lStrPenlultimoNumero || '5', '99999.99'); END IF; --regra 5 IF lCentavos BETWEEN 98 AND 99 THEN lPrecoTotallArredondado := to_number(lStrParteInteira || '.' || '00', '99999.99') + 1; --regra 4 ELSIF lUltimoNumero BETWEEN 8 AND 9 THEN lPrecoTotallArredondado := to_number( lStrParteInteira || '.' || (to_number(substr(lCentavos, -2, 1), '9') + 1), '99999.99'); END IF; END IF; IF pOrgaoConcedenteId = 9 or pOrgaoConcedenteId= 22 THEN lStrPrecoTotal := to_char(lPrecoTotal, '99999.9999'); lStrAntePenlultimoNumero := substr(lStrPrecoTotal, -4, 1); lStrParteInteira := trim(substr(lStrPrecoTotal, 0, length(lStrPrecoTotal) - 5)); lTresUltimos := to_number(substr(lStrPrecoTotal, -3, 3), '999'); IF lTresUltimos BETWEEN 001 and 254 THEN lPrecoTotallArredondado := to_number(lStrParteInteira || '.' || lStrAntePenlultimoNumero || '000', '99999.9999'); END IF; IF lTresUltimos BETWEEN 255 AND 754 THEN lPrecoTotallArredondado := to_number( lStrParteInteira || '.' || lStrAntePenlultimoNumero || '500', '99999.9999'); END IF; IF lTresUltimos BETWEEN 755 AND 999 THEN lPrecoTotallArredondado := to_number(lStrParteInteira || '.' || lStrAntePenlultimoNumero || '000', '99999.999') + 0.1; END IF; END IF; lDiferencaArredondamento := lPrecoTotallArredondado - lPrecoTotal; RETURN pTarifa + ldiferencaarredondamento; END FN_ARREDONDAMENTO_TARIFA;