/*
 TECNISA - TECNOLOGIA EM INFORMÁTICA

 NOME: RECALCULO_ITEM

 DESCRIÇÃO:
 PROCEDIMENTO PARA ATUALIZAÇÃO DO VALOR CONTABIL DO ITEM, DEVIDO A ALTERAÇÃO REALIZADA NA TELA DE
 MANUTENÇÃO DE DOCUMENTOS.

 CRIAÇÃO:
 09/06/04 - REJANE PRISCILA LEITE

 @C:\WIN_V4\SQL\END_CONV\ORACLE\5020_FISSTPO.SQL

 RAISE_APPLICATION_ERROR(-20501, '' , TRUE);
 */

CREATE OR REPLACE PROCEDURE RECALCULO_ITEM(
   P_FILIAL       IN NOTAFISCAL.CDFILIAL%TYPE,
   P_LANCTONF     IN NOTAFISCAL.NRLANCTONF%TYPE,
   P_IDORIGDESTNF IN NOTAFISCAL.IDORIGDESTNF%TYPE,
   P_IDENTRSAIDOP IN NOTAFISCAL.IDENTRSAIDOP%TYPE,
   P_CDTIPOOPER   IN NOTAFISCAL.CDTIPOOPER%TYPE,
   P_IDOPERDEVONF IN TIPOOPERAC.IDOPERDEVONF%TYPE)

IS
   V_TOTAPRODENCA NUMBER;
   V_VRBRUTO      NUMBER;
   V_VRCONTAB     NUMBER;
   V_TOTAPRENIMPO NUMBER;
   V_PRODUENCARGO NUMBER;
   V_TAXABASECALC NUMBER;
   V_TAXAALIQUOTA NUMBER;
   V_TOTAIMPBCALC NUMBER;
   V_VRIMPOSTO    NUMBER;
   V_IMPOCONTAB   NUMBER;
   V_IMPOSINFO    NUMBER;

   V_CDIMPOSTRIB  VARCHAR2(02);
   V_IDACRPRODENTRNF VARCHAR2(01);
   
   V_IDIMPOBCALTPOP  VARCHAR2(01);
BEGIN

   FOR C_ITEMPRODUTO IN (SELECT VRTOTAITEM, VRDESCITEM, IT.CDPRODUTO, NRSEQITPROD,
                                CDCSTINFUSU, CDCFOPINFUSU, CDSUFXINFUSU, P.CDARVPROD
                         FROM ITEMPRODUTO IT, PRODUTO P
                         WHERE IT.CDFILIAL     = P_FILIAL     AND
                               IT.NRLANCTONF   = P_LANCTONF   AND
                               IT.CDPRODUTO    = P.CDPRODUTO) LOOP

      UPDATE ITEMPRODUTO
      SET VRCONTITEM = (VRTOTAITEM - VRDESCITEM)
      WHERE (CDFILIAL    = P_FILIAL)   AND
            (NRLANCTONF  = P_LANCTONF) AND
            (NRSEQITPROD = C_ITEMPRODUTO.NRSEQITPROD);
      /*
      UPDATE RATEIONF
      SET VRRATENF  = (C_ITEMPRODUTO.VRTOTAITEM - C_ITEMPRODUTO.VRDESCITEM)
      WHERE (CDFILIAL    = P_FILIAL)   AND
            (NRLANCTONF  = P_LANCTONF) AND
            (NRSEQITPROD = C_ITEMPRODUTO.NRSEQITPROD);
      */
   END LOOP;

   --RATEIO DOS ENCARGOS.

   FOR C_ITEMENCARGO IN (SELECT IE.CDENCARGO AS CDENCARGO, VRITEMENCA, IDENCARGO,
                                EN.CDCTBLENTREN, EN.CDCTBLSAIDEN
                         FROM ITEMENCARGO IE, ENCARGO EN
                         WHERE (IE.CDFILIAL   = P_FILIAL)     AND
                               (IE.NRLANCTONF = P_LANCTONF)   AND
                               (IE.VRITEMENCA > 0)            AND
                               (EN.CDENCARGO  = IE.CDENCARGO)) LOOP
      V_TOTAPRODENCA := 0;
      FOR C_VRLIQRATEIO IN (SELECT DISTINCT(IP.NRSEQITPROD) AS NRSEQITPROD, (VRTOTAITEM - VRDESCITEM) AS VRLIQUIDO
                            FROM ITEMPRODUTO IP, ITEMPROIMPOS II
                            WHERE (IP.CDFILIAL    = P_FILIAL)       AND
                                  (IP.NRLANCTONF  = P_LANCTONF)     AND
                                  (II.CDFILIAL    = IP.CDFILIAL)    AND
                                  (II.NRLANCTONF  = IP.NRLANCTONF)  AND
                                  (II.NRSEQITPROD = IP.NRSEQITPROD) AND
                                  (EXISTS(SELECT BC.CDIMPOSTO
                                          FROM BASECALC BC
                                          WHERE (BC.CDENCARGO = C_ITEMENCARGO.CDENCARGO) AND
                                                (BC.CDIMPOSTO = II.CDIMPOSTO)            AND
                                                (BC.CDIMPOSTO = (SELECT MIN(B.CDIMPOSTO)
                                                                 FROM BASECALC B
                                                                 WHERE B.CDENCARGO = C_ITEMENCARGO.CDENCARGO))))) LOOP

         IF NOT (C_VRLIQRATEIO.VRLIQUIDO IS NULL) THEN
            V_TOTAPRODENCA := V_TOTAPRODENCA + C_VRLIQRATEIO.VRLIQUIDO;
         END IF;
      END LOOP;

      IF V_TOTAPRODENCA = 0 THEN
         SELECT SUM(VRTOTAITEM - VRDESCITEM)
           INTO V_TOTAPRODENCA
           FROM ITEMPRODUTO IP
          WHERE (IP.CDFILIAL   = P_FILIAL)   AND
                (IP.NRLANCTONF = P_LANCTONF);
                
         IF V_TOTAPRODENCA > 0 THEN
            FOR C_ATUAVRCONT IN (SELECT IP.NRSEQITPROD, (VRTOTAITEM - VRDESCITEM) AS VRLIQUIDO
                                  FROM ITEMPRODUTO IP
                                  WHERE (IP.CDFILIAL    = P_FILIAL)   AND
                                        (IP.NRLANCTONF  = P_LANCTONF)) LOOP

               IF (C_ITEMENCARGO.IDENCARGO = 'A') THEN
                  V_VRBRUTO  := (C_ITEMENCARGO.VRITEMENCA/V_TOTAPRODENCA);
               ELSIF (C_ITEMENCARGO.IDENCARGO = 'D') THEN
                  V_VRBRUTO  := - (C_ITEMENCARGO.VRITEMENCA/V_TOTAPRODENCA);
               ELSE
                  V_VRBRUTO := 0;
               END IF;

               IF ((C_ITEMENCARGO.CDCTBLSAIDEN IS NULL) AND (P_IDENTRSAIDOP = 'S')) OR
                  ((C_ITEMENCARGO.CDCTBLENTREN IS NULL) AND (P_IDENTRSAIDOP = 'E')) THEN
                  V_VRCONTAB := V_VRBRUTO;
               ELSE
                  V_VRCONTAB := 0;
               END IF;

               UPDATE ITEMPRODUTO
               SET VRCONTITEM = VRCONTITEM + (V_VRCONTAB * (VRTOTAITEM - VRDESCITEM))
               WHERE CDFILIAL    = P_FILIAL   AND
                     NRLANCTONF  = P_LANCTONF AND
                     NRSEQITPROD = C_ATUAVRCONT.NRSEQITPROD;
               /*
               UPDATE RATEIONF
               SET VRRATENF  = VRRATENF + (V_VRCONTAB * C_ATUAVRCONT.VRLIQUIDO)
               WHERE CDFILIAL    = P_FILIAL   AND
                     NRLANCTONF  = P_LANCTONF AND
                     NRSEQITPROD = C_ATUAVRCONT.NRSEQITPROD;
               */

            END LOOP;
         END IF;
      ELSE
         FOR C_ATUAVRCONT IN (SELECT DISTINCT(IP.NRSEQITPROD) AS NRSEQITPROD, (VRTOTAITEM - VRDESCITEM) AS VRLIQUIDO
                               FROM ITEMPRODUTO IP, ITEMPROIMPOS II
                               WHERE (IP.CDFILIAL    = P_FILIAL)                  AND
                                     (IP.NRLANCTONF  = P_LANCTONF)                AND
                                     (II.CDFILIAL    = IP.CDFILIAL)               AND
                                     (II.NRLANCTONF  = IP.NRLANCTONF)             AND
                                     (II.NRSEQITPROD = IP.NRSEQITPROD)            AND
                                     (EXISTS(SELECT BC.CDIMPOSTO
                                             FROM BASECALC BC
                                             WHERE (BC.CDENCARGO = C_ITEMENCARGO.CDENCARGO) AND
                                                   (BC.CDIMPOSTO = II.CDIMPOSTO)            AND
                                                   (BC.CDIMPOSTO = (SELECT MIN(B.CDIMPOSTO)
                                                                    FROM BASECALC B
                                                                    WHERE B.CDENCARGO = C_ITEMENCARGO.CDENCARGO))))) LOOP

            IF (C_ITEMENCARGO.IDENCARGO = 'A') THEN
               V_VRBRUTO  := (C_ITEMENCARGO.VRITEMENCA/V_TOTAPRODENCA);
            ELSIF (C_ITEMENCARGO.IDENCARGO = 'D') THEN
               V_VRBRUTO  := - (C_ITEMENCARGO.VRITEMENCA/V_TOTAPRODENCA);
            ELSE
               V_VRBRUTO := 0;
            END IF;

            IF ((C_ITEMENCARGO.CDCTBLSAIDEN IS NULL) AND (P_IDENTRSAIDOP = 'S')) OR
               ((C_ITEMENCARGO.CDCTBLENTREN IS NULL) AND (P_IDENTRSAIDOP = 'E')) THEN
               V_VRCONTAB := V_VRBRUTO;
            ELSE
               V_VRCONTAB := 0;
            END IF;

            UPDATE ITEMPRODUTO
            SET VRCONTITEM = VRCONTITEM + (V_VRCONTAB * (VRTOTAITEM - VRDESCITEM))
            WHERE CDFILIAL    = P_FILIAL   AND
                  NRLANCTONF  = P_LANCTONF AND
                  NRSEQITPROD = C_ATUAVRCONT.NRSEQITPROD;

            /*UPDATE RATEIONF
            SET VRRATENF  = VRRATENF + (V_VRCONTAB * C_ATUAVRCONT.VRLIQUIDO)
            WHERE CDFILIAL    = P_FILIAL   AND
                  NRLANCTONF  = P_LANCTONF AND
                  NRSEQITPROD = C_ATUAVRCONT.NRSEQITPROD;
            */

         END LOOP;
      END IF;
   END LOOP;
   -- FIM DO RATEIO DOS ENCARGOS

   FOR C_PRODUTO IN (SELECT IP.NRSEQITPROD AS NRSEQITPROD, II.CDIMPOSTO, IP.VRCONTITEM,
                            II.VRPERREDBCIT, II.VRALIQITEM, II.VRPARDEDIT, II.CDFISCALIT, II.VRIMPOSTOIT,
                            IM.IDTRATIMPO, IM.IDIMPORECUP, IM.CDCCTBLPASS, IM.CDCCTBLATIV,
                            II.NRITPROIMPOS, NVL(II.IDVALORINFIT, 'N') AS IDVALORINFO, IDTRIMPSTII
                     FROM ITEMPRODUTO IP, ITEMPROIMPOS II, IMPOSTO IM
                     WHERE (IP.CDFILIAL     = P_FILIAL)                  AND
                           (IP.NRLANCTONF   = P_LANCTONF)                AND
                           (II.CDFILIAL     = P_FILIAL)                  AND
                           (II.NRLANCTONF   = P_LANCTONF)                AND
                           (II.NRSEQITPROD  = IP.NRSEQITPROD)            AND
                           (II.CDIMPOSTO    = IM.CDIMPOSTO)              AND
                           (II.NRITPROIMPOS = '1')) LOOP

      V_IDIMPOBCALTPOP := NULL;

      SELECT MAX('S'), SUM(II.VRIMPOSTOIT) AS VRIMPOBCALC
      INTO V_IDIMPOBCALTPOP, V_TOTAIMPBCALC
      FROM ITEMPRODUTO IP, ITEMPROIMPOS II, BASECALCTPOPER BC
      WHERE BC.IDENTRSAIDOP = P_IDENTRSAIDOP
        AND BC.CDTIPOOPER = P_CDTIPOOPER
        AND BC.CDIMPOSTO = C_PRODUTO.CDIMPOSTO
        AND IP.CDFILIAL = P_FILIAL
        AND IP.NRLANCTONF = P_LANCTONF
        AND IP.NRSEQITPROD = C_PRODUTO.NRSEQITPROD
        AND II.CDFILIAL = P_FILIAL
        AND II.NRLANCTONF = P_LANCTONF
        AND II.NRSEQITPROD  = IP.NRSEQITPROD
        AND II.CDIMPOSTO    = BC.CDIMPOBCALC
        AND II.NRITPROIMPOS = '1'
        AND ((SUBSTR(IP.CDSITUTRIBPR,2,2) = BC.CDCSTIMPOTPOP)  OR (BC.CDCSTIMPOTPOP  IS NULL))
        AND ((SUBSTR(IP.CDFISOPEITEM,2,10) = BC.CDCFOPIMPOTPOP) OR (BC.CDCFOPIMPOTPOP IS NULL))
        AND ((C_PRODUTO.CDFISCALIT = BC.CDFISCIMPOTPOP) OR (BC.CDFISCIMPOTPOP IS NULL));

      IF V_IDIMPOBCALTPOP IS NULL THEN

         SELECT SUM(II.VRIMPOSTOIT) AS VRIMPOBCALC
         INTO V_TOTAIMPBCALC
         FROM ITEMPRODUTO IP, ITEMPROIMPOS II, BASECALC BC
         WHERE (BC.CDIMPOSTO    = C_PRODUTO.CDIMPOSTO)    AND
               (IP.CDFILIAL     = P_FILIAL)               AND
               (IP.NRLANCTONF   = P_LANCTONF)             AND
               (IP.NRSEQITPROD  = C_PRODUTO.NRSEQITPROD)  AND
               (II.CDFILIAL     = P_FILIAL)               AND
               (II.NRLANCTONF   = P_LANCTONF)             AND
               (II.NRSEQITPROD  = IP.NRSEQITPROD)         AND
               (II.CDIMPOSTO    = BC.CDIMPOBCALC)         AND
               (II.NRITPROIMPOS = '1')                    AND
               ((SUBSTR(IP.CDSITUTRIBPR,2,2) = BC.CDCSTIMPO)  OR (BC.CDCSTIMPO  IS NULL)) AND
               ((SUBSTR(IP.CDFISOPEITEM,2,10) = BC.CDCFOPIMPO) OR (BC.CDCFOPIMPO IS NULL)) AND
               ((C_PRODUTO.CDFISCALIT        = BC.CDFISCIMPO) OR (BC.CDFISCIMPO IS NULL)) AND
               (BC.IDTIPOBCALC   = 'I');
      END IF;

      V_IMPOSINFO := C_PRODUTO.VRIMPOSTOIT;
      V_IMPOCONTAB := 0;

      IF (P_IDENTRSAIDOP = 'E') THEN
         IF (C_PRODUTO.IDIMPORECUP = 'S') THEN
            IF (C_PRODUTO.CDFISCALIT = '1') THEN
               IF (C_PRODUTO.CDCCTBLATIV IS NOT NULL) THEN
                  IF C_PRODUTO.IDTRATIMPO = 'V' THEN
                     V_IMPOCONTAB := - V_IMPOSINFO;
                  END IF;
               END IF;
            ELSE
               IF C_PRODUTO.IDTRATIMPO = 'A' THEN
                  V_IMPOCONTAB := V_IMPOSINFO;
               ELSIF C_PRODUTO.IDTRATIMPO IN ('D','R') THEN
                  V_IMPOCONTAB := - V_IMPOSINFO;
               END IF;
            END IF;
         ELSE
            IF NOT(C_PRODUTO.CDCCTBLPASS IS NULL) THEN
               IF C_PRODUTO.IDTRATIMPO = 'V' THEN
                  V_IMPOCONTAB := - V_IMPOSINFO;
               ELSE
                  IF C_PRODUTO.IDTRATIMPO = 'A' THEN
                     SELECT NVL(MAX(IDACRPRODENTRNF), 'N')
                       INTO V_IDACRPRODENTRNF
                       FROM IMPOSTO
                      WHERE CDIMPOSTO = C_PRODUTO.CDIMPOSTO;

                      IF V_IDACRPRODENTRNF = 'S' THEN
                         V_IMPOCONTAB := V_IMPOSINFO;
                      END IF;
                   END IF;
               END IF;
            ELSE
               IF C_PRODUTO.IDTRATIMPO = 'A' THEN
                  V_IMPOCONTAB := V_IMPOSINFO;
               ELSIF C_PRODUTO.IDTRATIMPO IN ('D','R') THEN
                  V_IMPOCONTAB := - V_IMPOSINFO;
               END IF;
            END IF;
         END IF;
      ELSE
         IF (C_PRODUTO.IDTRATIMPO = 'A') THEN
            IF ((V_CDIMPOSTRIB IS NOT NULL) AND (C_PRODUTO.IDTRIMPSTII = '0')) OR
                (V_CDIMPOSTRIB IS NULL) THEN

               V_IMPOCONTAB := V_IMPOSINFO;
            END IF;
         ELSIF (C_PRODUTO.IDTRATIMPO = 'D') THEN
            IF ((C_PRODUTO.IDIMPORECUP = 'S') AND (C_PRODUTO.CDFISCALIT <> '1')) OR
               ((C_PRODUTO.IDIMPORECUP <> 'S') AND (C_PRODUTO.CDCCTBLATIV IS NULL)) THEN
               V_IMPOCONTAB := - V_IMPOSINFO;
            END IF;

         ELSIF (C_PRODUTO.IDTRATIMPO = 'R') THEN
            IF (C_PRODUTO.IDIMPORECUP = 'S') THEN
               IF (C_PRODUTO.CDCCTBLATIV IS NULL) OR
                  (C_PRODUTO.CDFISCALIT <> '1') THEN

                  V_IMPOCONTAB := - V_IMPOSINFO;
               END IF;
            ELSE
               IF (C_PRODUTO.CDCCTBLATIV IS NULL) THEN
                  V_IMPOCONTAB := - V_IMPOSINFO;
               END IF;
            END IF;

         ELSIF C_PRODUTO.IDTRATIMPO = 'V' THEN
            IF (C_PRODUTO.IDIMPORECUP = 'S') AND (P_IDORIGDESTNF = 'L') THEN
               IF (C_PRODUTO.CDCCTBLPASS IS NOT NULL) AND
                  (C_PRODUTO.CDFISCALIT = '1') THEN
                  V_IMPOCONTAB := - V_IMPOSINFO;
               END IF;
            END IF;
         END IF;
      END IF;


      IF (P_IDOPERDEVONF = 'S') OR ((P_IDENTRSAIDOP = 'E') AND (P_CDTIPOOPER = '16')) THEN
         IF (C_PRODUTO.IDTRATIMPO = 'A') THEN
           IF NOT (((C_PRODUTO.IDIMPORECUP = 'S')  AND (C_PRODUTO.CDFISCALIT = '1')) OR
                   ((C_PRODUTO.IDIMPORECUP <> 'S') AND (C_PRODUTO.CDCCTBLATIV IS NOT NULL))) THEN
              V_IMPOCONTAB := V_IMPOSINFO;
           END IF;
         ELSIF (C_PRODUTO.IDTRATIMPO = 'D') THEN
           IF NOT(((C_PRODUTO.IDIMPORECUP = 'S') AND (C_PRODUTO.CDFISCALIT = '1')) OR
                  ((C_PRODUTO.IDIMPORECUP <> 'S') AND (C_PRODUTO.CDCCTBLATIV IS NOT NULL))) THEN
              V_IMPOCONTAB := - V_IMPOSINFO;
           END IF;
         ELSIF (C_PRODUTO.IDTRATIMPO = 'R') THEN
           IF (C_PRODUTO.IDIMPORECUP = 'S') THEN
              IF (C_PRODUTO.CDCCTBLATIV IS NULL) OR
                 (C_PRODUTO.CDFISCALIT <> '1') THEN

                 V_IMPOCONTAB := - V_IMPOSINFO;
              END IF;
           ELSE
              IF (C_PRODUTO.CDCCTBLATIV IS NULL) THEN
                 V_IMPOCONTAB := - V_IMPOSINFO;
              END IF;
           END IF;
         ELSE
            V_IMPOCONTAB := 0;
         END IF;
      END IF;

      IF C_PRODUTO.IDTRATIMPO = 'A' THEN
         UPDATE ITEMPRODUTO
         SET VRCONTITEM = VRCONTITEM + V_IMPOCONTAB
         WHERE CDFILIAL    = P_FILIAL   AND
               NRLANCTONF  = P_LANCTONF AND
               NRSEQITPROD = C_PRODUTO.NRSEQITPROD;

         /*UPDATE RATEIONF
         SET VRRATENF  = VRRATENF + V_IMPOCONTAB
         WHERE CDFILIAL    = P_FILIAL   AND
               NRLANCTONF  = P_LANCTONF AND
               NRSEQITPROD = C_PRODUTO.NRSEQITPROD;
         */

      ELSIF C_PRODUTO.IDTRATIMPO = 'D' THEN
         UPDATE ITEMPRODUTO
         SET VRCONTITEM = VRCONTITEM + V_IMPOCONTAB
         WHERE CDFILIAL    = P_FILIAL   AND
               NRLANCTONF  = P_LANCTONF AND
               NRSEQITPROD = C_PRODUTO.NRSEQITPROD;

         /*UPDATE RATEIONF
         SET VRRATENF  = VRRATENF + V_IMPOCONTAB
         WHERE CDFILIAL    = P_FILIAL   AND
               NRLANCTONF  = P_LANCTONF AND
               NRSEQITPROD = C_PRODUTO.NRSEQITPROD;
         */
      ELSE

         UPDATE ITEMPRODUTO
         SET VRCONTITEM = VRCONTITEM + V_IMPOCONTAB
         WHERE CDFILIAL    = P_FILIAL   AND
               NRLANCTONF  = P_LANCTONF AND
               NRSEQITPROD = C_PRODUTO.NRSEQITPROD;

         /*UPDATE RATEIONF
         SET VRRATENF  = VRRATENF + V_IMPOCONTAB
         WHERE CDFILIAL    = P_FILIAL   AND
               NRLANCTONF  = P_LANCTONF AND
               NRSEQITPROD = C_PRODUTO.NRSEQITPROD;
         */

      END IF;
   END LOOP;
END;
/

-- VERSAO --
BEGIN ATUVEROBJ('RECALCULO_ITEM','5.30.000'); END;
/

