CREATE OR REPLACE PROCEDURE PREV_IMPOSTO
  (P_CDCENTITMAP  IN VARCHAR2,
   P_NRSEQITMAP   IN VARCHAR2,
   P_IDENTRSAID   IN VARCHAR2,
   P_CDREGITMAP   IN VARCHAR2 DEFAULT NULL,
   P_CDFORNITMAP  IN VARCHAR2 DEFAULT NULL,
   P_NRCOLEITMAP  IN VARCHAR2 DEFAULT NULL,
   P_CDPRODITMAP  IN VARCHAR2 DEFAULT NULL,
   P_CDMARCITMAP  IN VARCHAR2 DEFAULT NULL)
IS
   V_PAISDEST          VARCHAR2(04);
   V_ESTADEST          VARCHAR2(02);
   V_MUNIDEST          VARCHAR2(04);
   V_PAISORIG          VARCHAR2(04);
   V_ESTAORIG          VARCHAR2(02);
   V_MUNIORIG          VARCHAR2(04);
   V_NRITMAPURPRECIMPO VARCHAR2(20);
   V_IDVRIMPSTRIB      VARCHAR2(01);
   V_IMPOSTOIT         FLOAT;
   V_ADIMPOSTOIT       FLOAT;
   V_VRIMPOSTO         FLOAT;
   V_CDIMPOSTRIB       VARCHAR2(2000);
BEGIN
   FOR C_PRODUTO IN (SELECT I.NRSEQITMAP, I.CDREGITMAP, I.CDFORNITMAP, I.NRCOLEITMAP, MAX(I.DTENTRAPUT) DTENTRAPUT, I.CDFILIAP, I.CDPRODITMAP,
                            MAX(I.CDMARCITMAP) CDMARCITMAP, 1 QTACOMP, I.IDTIPOFRETAP, CASE 
                                                                                          WHEN NVL(PARASUPRI.IDTIPOAPUR, '0') = '0'
                                                                                          THEN I.VRPRECUNIAP
                                                                                          ELSE CASE
                                                                                                  WHEN NVL(PARASUPRI.IDTIPOAPUR, '0') = '1'
                                                                                                  THEN I.VRPRECECOAP
                                                                                                  ELSE I.VRPRECONPIAP
                                                                                               END
                                                                                        END VRTOTAITEM,
                            P.CDARVPROD,
                            FUN_CONSULTA_CDINSCESTA(I.CDFILIAP, FILIAL.CDINSCESTA, FILIAL.CDEMPRESA, I.CDEMPRESAAP) CDINSCESTA,
                            NVL(TIPOOPERAC.IDORIGDESTOP,'F') IDORIGDESTOP, NVL(TIPOOPERAC.IDNFPRESTSERV, 'N') IDNFPRESTSERV,
                            NVL(TIPOOPERAC.IDUTLOCPRESTSERV, 'N') IDUTLOCPRESTSERV, TIPOOPERAC.CDTIPOOPER,
                            FUN_CONSULTA_GRUPOFISCAL(NVL(TIPOOPERAC.IDORIGDESTOP,'F'), I.CDFORNITMAP, I.CDFILIAP,
                                                    P_IDENTRSAID, TIPOOPERAC.CDTIPOOPER) CDGRUPOFISC
                       FROM ITMAPURPREC I, PRODUTO P, FILIAL, PARCMPSUP, TIPOOPERAC, PARASUPRI
                      WHERE I.CDCENTITMAP = P_CDCENTITMAP
                        AND I.NRSEQITMAP  = P_NRSEQITMAP
                        AND I.CDFILIAP    = FILIAL.CDFILIAL
                        AND I.CDREGITMAP  = NVL(P_CDREGITMAP, I.CDREGITMAP)
                        AND I.CDFORNITMAP = NVL(P_CDFORNITMAP, I.CDFORNITMAP)
                        AND I.NRCOLEITMAP = NVL(P_NRCOLEITMAP, I.NRCOLEITMAP)
                        AND I.CDPRODITMAP = NVL(P_CDPRODITMAP, I.CDPRODITMAP)
                        AND I.CDMARCITMAP = NVL(P_CDMARCITMAP, I.CDMARCITMAP)
                        AND I.CDFILIAP    = PARCMPSUP.CDFILIAL
                        AND I.CDPRODITMAP = P.CDPRODUTO
                        AND NVL(PARCMPSUP.CDTIPOOPER, '01') = TIPOOPERAC.CDTIPOOPER
                        AND TIPOOPERAC.IDENTRSAIDOP         =  P_IDENTRSAID
                        AND PARASUPRI.CDFILIAL = NVL(FILIAL.CDFILCENTCMP, FILIAL.CDFILIAL)
                      GROUP BY I.NRSEQITMAP, I.CDREGITMAP, I.CDFORNITMAP, I.NRCOLEITMAP, I.CDFILIAP, I.CDPRODITMAP,
                            I.IDTIPOFRETAP, CASE
                                              WHEN NVL(PARASUPRI.IDTIPOAPUR, '0') = '0'
                                              THEN I.VRPRECUNIAP
                                              ELSE CASE
                                                      WHEN NVL(PARASUPRI.IDTIPOAPUR, '0') = '1'
                                                      THEN I.VRPRECECOAP
                                                      ELSE I.VRPRECONPIAP
                                                   END
                                            END, P.CDARVPROD,
                            FUN_CONSULTA_CDINSCESTA(I.CDFILIAP, FILIAL.CDINSCESTA, FILIAL.CDEMPRESA, I.CDEMPRESAAP),
                            NVL(TIPOOPERAC.IDORIGDESTOP,'F'), NVL(TIPOOPERAC.IDNFPRESTSERV, 'N'),
                            NVL(TIPOOPERAC.IDUTLOCPRESTSERV, 'N'), TIPOOPERAC.CDTIPOOPER,
                            FUN_CONSULTA_GRUPOFISCAL(NVL(TIPOOPERAC.IDORIGDESTOP,'F'), I.CDFORNITMAP, I.CDFILIAP,
                                                    P_IDENTRSAID, TIPOOPERAC.CDTIPOOPER)) LOOP
      BEGIN
         SELECT CDPAIS, SGESTADO, CDMUNICIPIO
           INTO V_PAISDEST, V_ESTADEST, V_MUNIDEST
           FROM INSCRESTAD
          WHERE CDEMPRESA  = SUBSTR(C_PRODUTO.CDINSCESTA, 1, 2)
            AND CDINSCESTA = SUBSTR(C_PRODUTO.CDINSCESTA, 4, 25);
      EXCEPTION
         WHEN NO_DATA_FOUND THEN BEGIN
            V_PAISDEST := NULL;
            V_ESTADEST := NULL;
            V_MUNIDEST := NULL;
         END;
      END;

      IF C_PRODUTO.IDORIGDESTOP = 'F' THEN
         BEGIN
            SELECT CDPAIS, SGESTADO, CDMUNICIPIO
              INTO V_PAISORIG, V_ESTAORIG, V_MUNIORIG
              FROM ENDEFORN
             WHERE CDFORNECED = C_PRODUTO.CDFORNITMAP
               AND IDTPENDEFORN = 'P';
          EXCEPTION
             WHEN NO_DATA_FOUND THEN BEGIN
                V_PAISORIG := NULL;
                V_ESTAORIG := NULL;
                V_MUNIORIG := NULL;
             END;
          END;
      ELSE
         -- SE O IDENTIFICADOR DE ORIGEM DO LANCAMENTO FOR IGUAL A LICENCA DE USO OU OUTRO VALOR DIFERENTE DE L,C,F
         IF P_IDENTRSAID = 'E' THEN
            BEGIN
               SELECT CDPAIS, SGESTADO, CDMUNICIPIO
                 INTO V_PAISORIG, V_ESTAORIG, V_MUNIORIG
                 FROM ENDEFORN
                WHERE CDFORNECED = C_PRODUTO.CDFORNITMAP
                  AND IDTPENDEFORN = 'P';
            EXCEPTION
               WHEN NO_DATA_FOUND THEN BEGIN
                  V_PAISORIG := NULL;
                  V_ESTAORIG := NULL;
                  V_MUNIORIG := NULL;
               END;
            END;
         ELSIF P_IDENTRSAID = 'S' THEN
            BEGIN
               SELECT CDPAIS, SGESTADO, CDMUNICIPIO
                 INTO V_PAISORIG, V_ESTAORIG, V_MUNIORIG
                 FROM ENDECLIE
                WHERE CDCLIENTE = C_PRODUTO.CDFORNITMAP
                  AND IDTPENDECLIE = 'P';
            EXCEPTION
               WHEN NO_DATA_FOUND THEN BEGIN
                  V_PAISORIG := NULL;
                  V_ESTAORIG := NULL;
                  V_MUNIORIG := NULL;
               END;
            END;
         END IF;
      END IF;

     /* CONSULTA_GRUPOFISCAL(V_IDORIGDESTOP, C_PRODUTO.CDFORNITMAP, C_PRODUTO.CDFILIAP, P_IDENTRSAID, V_TIPOOPER, V_CDGRUPOFISC);    */
      FOR C_ITEM IN (SELECT C_PRODUTO.CDREGITMAP, C_PRODUTO.CDFORNITMAP, C_PRODUTO.NRCOLEITMAP, C_PRODUTO.DTENTRAPUT,
                            C_PRODUTO.CDFILIAP, C_PRODUTO.CDPRODITMAP, C_PRODUTO.CDMARCITMAP, R.CDIMPOSTO,
                            ((C_PRODUTO.VRTOTAITEM - (C_PRODUTO.VRTOTAITEM * ((NVL(R.VRPERREDBC, 0))/100))) +
                            ((C_PRODUTO.VRTOTAITEM - (C_PRODUTO.VRTOTAITEM * ((NVL(R.VRPERREDBC, 0))/100))) * (NVL(R.VRPBCSUBTRIB, 0)/100))) * (R.VRALIQUOTA/100) AS VRIMPOSTO,

                            --C_PRODUTO.VRTOTAITEM *(NVL(R.VRALIQUOTA, 0)/100) VRIMPOSTO,

                            R.CDREGRAFISC,
                            (NVL(R.VRPERREDBC, 0)) VRPERREDBC, R.VRPBCSUBTRIB, R.VRALIQUOTA,


                            ((C_PRODUTO.VRTOTAITEM - (C_PRODUTO.VRTOTAITEM * ((NVL(R.VRPERREDBC, 0))/100))) +
                            ((C_PRODUTO.VRTOTAITEM - (C_PRODUTO.VRTOTAITEM * ((NVL(R.VRPERREDBC, 0))/100))) * (NVL(R.VRPBCSUBTRIB, 0)/100))) AS VRBASECALC, I.IDTRATIMPO

                            /*((C_PRODUTO.VRTOTAITEM - (C_PRODUTO.VRTOTAITEM * ((NVL(R.VRPERREDBC, 0))/100))) * (R.VRPBCSUBTRIB/100))) */

                       FROM TABLE(CONSULTA_REGRA_FISCAL(NULL, SUBSTR(C_PRODUTO.CDINSCESTA, 1, 2), C_PRODUTO.CDGRUPOFISC, P_IDENTRSAID, C_PRODUTO.CDTIPOOPER, C_PRODUTO.CDINSCESTA, C_PRODUTO.CDARVPROD,
                                                        C_PRODUTO.DTENTRAPUT, V_PAISORIG, V_ESTAORIG, V_MUNIORIG, V_PAISDEST, V_ESTADEST, V_MUNIDEST,
                                                        C_PRODUTO.VRTOTAITEM, 'N', 'N')) R, IMPOSTO I
                      WHERE I.CDIMPOSTO = R.CDIMPOSTO
                        AND R.VRALIQUOTA IS NOT NULL
                      ORDER BY R.CDIMPOSTO)
      LOOP
         NOVO_CODIGO_NT('ITMAPURPRECIMPO', V_NRITMAPURPRECIMPO);
         V_NRITMAPURPRECIMPO :=  SUBSTR(V_NRITMAPURPRECIMPO, 11, 10);

         V_IMPOSTOIT := C_ITEM.VRIMPOSTO;

         /*INICIIO IMPOSTO DE SUBSTITUICAO TRIBUTARIA*/
         V_CDIMPOSTRIB := '';
         FOR C_ICMSST IN (SELECT CDIMPOSTO
                            FROM IMPOSTO
                           WHERE CDIMPOSTRIB = C_ITEM.CDIMPOSTO)
         LOOP
            V_CDIMPOSTRIB := V_CDIMPOSTRIB||'_'||C_ICMSST.CDIMPOSTO;
         END LOOP;

         IF V_CDIMPOSTRIB IS NOT NULL THEN
            SELECT NVL(MAX(IDVRIMPSTRIB), 'N')
              INTO V_IDVRIMPSTRIB
              FROM IMPOSTO
             WHERE (INSTR(V_CDIMPOSTRIB, CDIMPOSTO) > 0)
               AND NVL(IDVRIMPSTRIB, 'N') <> 'N';

            IF (NVL(V_IDVRIMPSTRIB,'N') = 'N') THEN
               V_VRIMPOSTO := 0;
            ELSE
               SELECT NVL(MAX(VRIMPOSTO), 0)
                 INTO V_VRIMPOSTO
                 FROM ITMAPURPRECIMPO I
                WHERE (I.CDCENTITMAP   = P_CDCENTITMAP)
                  AND (I.NRSEQITMAP    = P_NRSEQITMAP)
                  AND (I.CDREGITMAP    = C_ITEM.CDREGITMAP)
                  AND (I.NRCOLEITMAP   = C_ITEM.NRCOLEITMAP)
                  AND (I.DTENTRAPUT    = C_ITEM.DTENTRAPUT)
                  AND (I.CDFILIAP      = C_ITEM.CDFILIAP)
                  AND (I.CDMARCITMAP   = C_ITEM.CDMARCITMAP)
                  AND (I.CDPRODITMAP   = C_ITEM.CDPRODITMAP)
                  AND (INSTR(V_CDIMPOSTRIB, I.CDIMPOSTO) > 0);
            END IF;
            V_IMPOSTOIT := V_IMPOSTOIT - V_VRIMPOSTO;
         END IF;
         /*FIM IMPOSTO DE SUBSTITUICAO TRIBUTARIA*/
         IF (V_IMPOSTOIT < 0) THEN
            V_IMPOSTOIT := 0;
         END IF;

         V_ADIMPOSTOIT := 0;

         IF (C_ITEM.IDTRATIMPO = 'A') THEN
            V_ADIMPOSTOIT := V_IMPOSTOIT;
         ELSIF (C_ITEM.IDTRATIMPO = 'D') THEN
            V_ADIMPOSTOIT := - V_IMPOSTOIT;
         END IF;

         IF LENGTH(P_CDMARCITMAP) > 0 THEN
            DELETE
              FROM ITMAPURPRECIMPO
             WHERE CDCENTITMAP  = P_CDCENTITMAP
               AND NRSEQITMAP   = P_NRSEQITMAP
               AND CDREGITMAP   = C_ITEM.CDREGITMAP
               AND CDFORNITMAP  = C_ITEM.CDFORNITMAP
               AND NRCOLEITMAP  = C_ITEM.NRCOLEITMAP
               AND DTENTRAPUT   = C_ITEM.DTENTRAPUT
               AND CDFILIAP     = C_ITEM.CDFILIAP
               AND CDPRODITMAP  = C_ITEM.CDPRODITMAP
               AND CDMARCITMAP  = C_ITEM.CDMARCITMAP
               AND CDIMPOSTO    = C_ITEM.CDIMPOSTO;
         END IF;
         INSERT
           INTO ITMAPURPRECIMPO (NRITMAPURPRECIMPO, CDCENTITMAP, NRSEQITMAP, CDREGITMAP,
                CDFORNITMAP, NRCOLEITMAP, DTENTRAPUT,
                CDFILIAP, CDPRODITMAP, CDMARCITMAP, CDIMPOSTO,
                VRIMPOSTO, NRREGRAFISCAL,
                VRREDUBASECALC, VRMAJOBASECALC, VRPERCALIQUOTA,
                VRBASECALC, IDTRATAMENTO, VRADIMPOSTOIT, CDGRUPOFISC)
         VALUES (V_NRITMAPURPRECIMPO, P_CDCENTITMAP, P_NRSEQITMAP, C_ITEM.CDREGITMAP,
                 C_ITEM.CDFORNITMAP, C_ITEM.NRCOLEITMAP, C_ITEM.DTENTRAPUT,
                 C_ITEM.CDFILIAP, C_ITEM.CDPRODITMAP, C_ITEM.CDMARCITMAP, C_ITEM.CDIMPOSTO,
                 V_IMPOSTOIT, C_ITEM.CDREGRAFISC,
                 C_ITEM.VRPERREDBC, C_ITEM.VRPBCSUBTRIB, C_ITEM.VRALIQUOTA,
                 C_ITEM.VRBASECALC, C_ITEM.IDTRATIMPO, V_ADIMPOSTOIT, C_PRODUTO.CDGRUPOFISC);
      END LOOP;
   END LOOP;
END;
/