DROP TYPE TRAVAFISCAL_TABLE
/

DROP TYPE TRAVAFISCAL_TYPE
/

CREATE TYPE TRAVAFISCAL_TYPE AS
OBJECT (CDIMPOSTO        VARCHAR2(02),
        NRSEQITPROD      VARCHAR2(04),
        CDARVPROD        VARCHAR2(20),
        NMPRODUTO        VARCHAR2(50),
        NRSEQCONSISTE    VARCHAR2(40),
        DSCONSISTENCIA   VARCHAR2(250),
        CDREGRAIT        VARCHAR2(10));
/

CREATE TYPE TRAVAFISCAL_TABLE AS
TABLE OF TRAVAFISCAL_TYPE
/

CREATE OR REPLACE FUNCTION CONSISTE_FISCAL(
   P_CDFILIAL    IN NOTAFISCAL.CDFILIAL%TYPE,
   P_NRLANCTONF  IN NOTAFISCAL.NRLANCTONF%TYPE) RETURN TRAVAFISCAL_TABLE PIPELINED
IS

V_IDUTCONSISTE    VARCHAR2(01);
V_IDSISTEMA       VARCHAR2(03);
V_IDATATUS        VARCHAR2(01);
V_IDSTATUSNFE     VARCHAR2(01);
V_IDENTRSAIDOP    VARCHAR2(01);
V_TRAVA           VARCHAR2(40);
V_CDIMPOSTO       VARCHAR2(02);
V_NRSEQITPROD     VARCHAR2(04);
V_CONFALIQ        VARCHAR2(30);
V_IMPOSTO         VARCHAR2(30);
V_CDFILIMOVI      VARCHAR2(04);
V_IDCUMUPISCOFIL  VARCHAR2(01);
V_CDFILIEMIT      VARCHAR2(04);
V_CDFILIRECE      VARCHAR2(04);
V_COFINS          VARCHAR2(02);
V_COUNT           INTEGER;
V_VRBASECALCIT    FLOAT;
V_CDSITUTRIBITNFE VARCHAR2(02);
V_CDTPCREDPICOITE VARCHAR2(03);
V_CDNATUBCALPCIT  VARCHAR2(02);
V_PIS             VARCHAR2(02);
V_DESC            VARCHAR2(250);
V_CDARVPROD       VARCHAR2(20);
V_NMPRODUTO       VARCHAR2(50);
V_CDSITUCRT       VARCHAR2(01);
V_IDIMPORECUP     VARCHAR2(01);
V_CDREGRAIT       VARCHAR2(10);
V_CDTIPOOPER      VARCHAR2(02);
V_CDEMPRESA       VARCHAR2(02);
V_CDINSCESTA      VARCHAR2(16);
V_DIFICMSANTCFOP  VARCHAR2(01);
V_IDCUMUPISCOFIL_TPOPER  VARCHAR2(01);

OUT_RECORD TRAVAFISCAL_TYPE := TRAVAFISCAL_TYPE (NULL, NULL, NULL, NULL, NULL, NULL, NULL);
BEGIN
   SELECT MAX(IDUTCONSISTE)
     INTO V_IDUTCONSISTE
     FROM PARAMFISCAL;

   IF (V_IDUTCONSISTE  = 'S') THEN
      SELECT MAX(IDSISTEMA), 
             MAX(IDSTATUS), 
             MAX(IDSTATUSNFE), 
             MAX(IDENTRSAIDOP), 
             MAX(CDFILIEMIT), 
             MAX(CDFILIRECE),
             MAX(CDSITUCRT), 
             MAX(CDTIPOOPER),
             MAX(N.CDEMPRESA),
             MAX(N.CDINSCESTA)
        INTO V_IDSISTEMA,
             V_IDATATUS,
             V_IDSTATUSNFE,
             V_IDENTRSAIDOP,
             V_CDFILIEMIT,
             V_CDFILIRECE,
             V_CDSITUCRT,
             V_CDTIPOOPER,
             V_CDEMPRESA,
             V_CDINSCESTA
        FROM NOTAFISCAL N, PARAMEMPRESA P
       WHERE CDFILIAL = P_CDFILIAL
         AND NRLANCTONF = P_NRLANCTONF
         AND N.CDEMPRESA = P.CDEMPRESA(+);


      FOR C_ITEM IN
         (SELECT CDFILIAL, NRLANCTONF, NRSEQITPROD, CDFISOPEITEM, CDSITUTRIBPR, P.CDARVPROD, P.NMPRODUTO, CDFISCOPERSN
            FROM ITEMPRODUTO I, PRODUTO P
           WHERE CDFILIAL   = P_CDFILIAL
             AND NRLANCTONF = P_NRLANCTONF
             AND I.CDPRODUTO = P.CDPRODUTO
            ORDER BY CDFILIAL, NRLANCTONF, NRSEQITPROD)
      LOOP
         IF C_ITEM.CDFISOPEITEM IS NOT NULL THEN
            IF LENGTH(C_ITEM.CDFISOPEITEM) <> 4 THEN
               V_TRAVA := 'CFOP_TAM_INV';
               V_DESC  := 'CFOP com tamanho invalido. O CFOP do item deve possuir 4 digitos.';
               V_CDIMPOSTO := '';
               V_NRSEQITPROD := C_ITEM.NRSEQITPROD;
               V_CDARVPROD   := C_ITEM.CDARVPROD;
               V_NMPRODUTO   := C_ITEM.NMPRODUTO;

               OUT_RECORD.CDIMPOSTO            := V_CDIMPOSTO;
               OUT_RECORD.NRSEQITPROD          := V_NRSEQITPROD;
               OUT_RECORD.NRSEQCONSISTE        := V_TRAVA;
               OUT_RECORD.CDARVPROD            := V_CDARVPROD;
               OUT_RECORD.NMPRODUTO            := V_NMPRODUTO;
               OUT_RECORD.DSCONSISTENCIA       := V_DESC;
               PIPE ROW (OUT_RECORD);
            ELSE
               IF V_IDENTRSAIDOP = 'E' THEN
                  IF SUBSTR(C_ITEM.CDFISOPEITEM, 1, 1) NOT IN ('1', '2', '3') THEN
                     V_TRAVA := 'CFOP_1DIG_INV';
                     V_DESC  := '1 Digito do CFOP invalido. O CFOP de operacoes de entrada se inicia com 1,2 ou 3.';
                     V_CDIMPOSTO := '';
                     V_NRSEQITPROD := C_ITEM.NRSEQITPROD;
                     V_CDARVPROD   := C_ITEM.CDARVPROD;
                     V_NMPRODUTO   := C_ITEM.NMPRODUTO;

                     OUT_RECORD.CDIMPOSTO            := V_CDIMPOSTO;
                     OUT_RECORD.NRSEQITPROD          := V_NRSEQITPROD;
                     OUT_RECORD.NRSEQCONSISTE        := V_TRAVA;
                     OUT_RECORD.CDARVPROD            := V_CDARVPROD;
                     OUT_RECORD.NMPRODUTO            := V_NMPRODUTO;
                     OUT_RECORD.DSCONSISTENCIA       := V_DESC;
                     PIPE ROW (OUT_RECORD);
                  END IF;
               ELSE
                  IF SUBSTR(C_ITEM.CDFISOPEITEM, 1, 1) NOT IN ('5', '6', '7') THEN
                     V_TRAVA := 'CFOP_1DIG_INV';
                     V_DESC  := '1 Digito do CFOP invalido. O CFOP de operacoes de saida se inicia com 5,6 ou 7.';
                     V_CDIMPOSTO := '';
                     V_NRSEQITPROD := C_ITEM.NRSEQITPROD;
                     V_CDARVPROD   := C_ITEM.CDARVPROD;
                     V_NMPRODUTO   := C_ITEM.NMPRODUTO;

                     OUT_RECORD.CDIMPOSTO            := V_CDIMPOSTO;
                     OUT_RECORD.NRSEQITPROD          := V_NRSEQITPROD;
                     OUT_RECORD.CDARVPROD            := V_CDARVPROD;
                     OUT_RECORD.NMPRODUTO            := V_NMPRODUTO;
                     OUT_RECORD.NRSEQCONSISTE        := V_TRAVA;
                     OUT_RECORD.DSCONSISTENCIA       := V_DESC;
                     PIPE ROW (OUT_RECORD);
                  END IF;
               END IF;
            END IF;

         END IF;
         IF C_ITEM.CDSITUTRIBPR IS NOT NULL THEN
            IF LENGTH(C_ITEM.CDSITUTRIBPR) <> 3 THEN
               V_TRAVA := 'CST_TAM_INV';
               V_DESC  := 'CST com tamanho invalido. O CST do item deve possuir 3 digitos.';
               V_CDIMPOSTO := '';
               V_NRSEQITPROD := C_ITEM.NRSEQITPROD;
               V_CDARVPROD   := C_ITEM.CDARVPROD;
               V_NMPRODUTO   := C_ITEM.NMPRODUTO;

               OUT_RECORD.CDIMPOSTO            := V_CDIMPOSTO;
               OUT_RECORD.NRSEQITPROD          := V_NRSEQITPROD;
               OUT_RECORD.CDARVPROD            := V_CDARVPROD;
               OUT_RECORD.NMPRODUTO            := V_NMPRODUTO;
               OUT_RECORD.NRSEQCONSISTE        := V_TRAVA;
               OUT_RECORD.DSCONSISTENCIA       := V_DESC;
               PIPE ROW (OUT_RECORD);
            END IF;
         END IF;
         FOR C_TRAVA IN
            (SELECT I.CDIMPOSTO,NRSEQCONSISTE, CDFISCOPER, IDTPALIQUOTA, CDSITUTRIB, IDTPBASECALC,
                    IDTPVRIMPOSTO, IDCONSISTELANC, IDCONSISTEAPRO, IDBLOQADMI, CDFISCAL, IDCONSPREDEFI,
                    IDENTRSAIDOP, I.CDIMPOSTONFE, CDCST1DIGT,  CDTPCREDPICOITE, DSCONSISTENCIA
               FROM CONSISTEFISCAL C, IMPOSTO I
              WHERE ((IDENTRSAIDOP = V_IDENTRSAIDOP) OR (IDENTRSAIDOP = 'T'))
                AND IDCONSPREDEFI = 'S'
                AND IDCONSATIVA = 'S'
                AND C.CDIMPOSTO = I.CDIMPOSTONFE)
         LOOP
            V_TRAVA := NULL;
            V_DESC  := NULL;
            V_CDIMPOSTO := NULL;
            V_NRSEQITPROD := NULL;

            FOR C_IMPOSTO IN
               (SELECT CDIMPOSTO, VRCONTITIMP, VRBASECALCIT, VRIMPOSTOIT, CDSITUTRIBITNFE, CDSITUTRIBIT,
                       CDFISCOPERIT, CDFISCALIT, VRALIQITEM, NRITPROIMPOS, VRPERREDBCIT, CDREGRAIT, 'A'
                  FROM ITEMPROIMPOS
                 WHERE CDFILIAL = P_CDFILIAL
                   AND NRLANCTONF = P_NRLANCTONF
                   AND NRSEQITPROD = C_ITEM.NRSEQITPROD
                   AND CDIMPOSTO = C_TRAVA.CDIMPOSTO
                   AND ((CDFISCOPERIT = C_TRAVA.CDFISCOPER) OR (NVL(C_TRAVA.CDFISCOPER,'T') = 'T'))
                   AND ((CDSITUTRIBITNFE = C_TRAVA.CDSITUTRIB) OR (NVL(C_TRAVA.CDSITUTRIB, 'T') = 'T'))
                   AND ((SUBSTR(CDSITUTRIBIT, 1, 1) = C_TRAVA.CDCST1DIGT) OR (NVL(C_TRAVA.CDCST1DIGT, 'T') = 'T'))
                   AND ((CDFISCALIT = C_TRAVA.CDFISCAL) OR (NVL(C_TRAVA.CDFISCAL, 'T') = 'T'))
                   AND ((CDTPCREDPICOITE = C_TRAVA.CDTPCREDPICOITE) OR (NVL(C_TRAVA.CDTPCREDPICOITE, 'T') = 'T'))
				   AND (NRITPROIMPOS NOT IN ('3'))
                UNION ALL
                SELECT CDIMPOSTO, VRCONTITIMP, VRBASECALCIT, VRIMPOSTOIT, CDSITUTRIBITNFE, CDSITUTRIBIT,
                       CDFISCOPERIT, CDFISCALIT, VRALIQITEM, NRITPROIMPOS, VRPERREDBCIT, CDREGRAIT, 'B'
                  FROM ITEMPROIMPOS
                 WHERE CDFILIAL = P_CDFILIAL
                   AND NRLANCTONF = P_NRLANCTONF
                   AND NRSEQITPROD = C_ITEM.NRSEQITPROD
                   AND CDIMPOSTO = C_TRAVA.CDIMPOSTO
                   AND ((INSTR(C_TRAVA.CDFISCOPER, SUBSTR(CDFISCOPERIT, 1, 3)) =  1) OR (NVL(C_TRAVA.CDFISCOPER,'T') = 'T'))
                   AND ((CDSITUTRIBITNFE = C_TRAVA.CDSITUTRIB) OR (NVL(C_TRAVA.CDSITUTRIB, 'T') = 'T'))
                   AND ((SUBSTR(CDSITUTRIBIT, 1, 1) = C_TRAVA.CDCST1DIGT) OR (NVL(C_TRAVA.CDCST1DIGT, 'T') = 'T'))
                   AND ((CDFISCALIT = C_TRAVA.CDFISCAL) OR (NVL(C_TRAVA.CDFISCAL, 'T') = 'T'))
                   AND ((CDTPCREDPICOITE = C_TRAVA.CDTPCREDPICOITE) OR (NVL(C_TRAVA.CDTPCREDPICOITE, 'T') = 'T'))
				   AND (NRITPROIMPOS NOT IN ('3')))
            LOOP
               IF V_CDTIPOOPER <> '03' THEN
                  IF ((C_TRAVA.IDTPBASECALC  = '0') AND (C_TRAVA.IDTPVRIMPOSTO = '0') AND (C_TRAVA.IDTPALIQUOTA = '0')) THEN
                     IF NOT((C_IMPOSTO.NRITPROIMPOS = '2') AND (C_IMPOSTO.VRPERREDBCIT > 0)) THEN
                        IF (C_TRAVA.CDSITUTRIB IS NOT NULL) THEN
                           IF V_CDSITUCRT = '3' THEN

                              V_DIFICMSANTCFOP := 'N';
                              IF C_IMPOSTO.CDFISCALIT = '3' THEN
                                 BEGIN
                                    SELECT CASE COUNT(*) WHEN 0 THEN 'N' ELSE 'S' END
                                      INTO V_DIFICMSANTCFOP
                                      FROM DIFERICMSANTCFOP
                                     WHERE CDEMPRESA = V_CDEMPRESA
                                       AND CDINSCESTA = V_CDINSCESTA
                                       AND CDCFOPPADRAO = C_IMPOSTO.CDFISCOPERIT;
                                 EXCEPTION
                                    WHEN NO_DATA_FOUND THEN BEGIN
                                       V_DIFICMSANTCFOP := 'N';
                                    END;
                                 END;
                              END IF;

                              IF (C_IMPOSTO.CDFISCALIT = '2') OR ((C_IMPOSTO.CDFISCALIT = '3') AND (V_DIFICMSANTCFOP = 'N')) THEN
                                 V_TRAVA       := C_TRAVA.NRSEQCONSISTE;
                                 V_DESC        := C_TRAVA.DSCONSISTENCIA;
                                 V_CDIMPOSTO   := C_TRAVA.CDIMPOSTO;
                                 V_NRSEQITPROD := C_ITEM.NRSEQITPROD;
                                 V_CDARVPROD   := C_ITEM.CDARVPROD;
                                 V_NMPRODUTO   := C_ITEM.NMPRODUTO;
                                 V_CDREGRAIT   := C_IMPOSTO.CDREGRAIT;
                              END IF;
                           END IF;
                        ELSE
                           V_TRAVA       := C_TRAVA.NRSEQCONSISTE;
                           V_DESC        := C_TRAVA.DSCONSISTENCIA;
                           V_CDIMPOSTO   := C_TRAVA.CDIMPOSTO;
                           V_NRSEQITPROD := C_ITEM.NRSEQITPROD;
                           V_CDARVPROD   := C_ITEM.CDARVPROD;
                           V_NMPRODUTO   := C_ITEM.NMPRODUTO;
                           V_CDREGRAIT   := C_IMPOSTO.CDREGRAIT;
                        END IF;
                     END IF;
                  END IF;
                  IF C_TRAVA.IDBLOQADMI = 'B' THEN
                     IF V_CDSITUCRT = '3' THEN
                        IF C_TRAVA.IDTPBASECALC  = '1' THEN
                           IF C_IMPOSTO.VRBASECALCIT < 0 THEN
                              V_TRAVA       := C_TRAVA.NRSEQCONSISTE;
                              V_DESC        := C_TRAVA.DSCONSISTENCIA;
                              V_CDIMPOSTO   := C_TRAVA.CDIMPOSTO;
                              V_NRSEQITPROD := C_ITEM.NRSEQITPROD;
                              V_CDARVPROD   := C_ITEM.CDARVPROD;
                              V_NMPRODUTO   := C_ITEM.NMPRODUTO;
                              V_CDREGRAIT   := C_IMPOSTO.CDREGRAIT;
                           END IF;
                           IF C_IMPOSTO.VRCONTITIMP < 0 THEN
                              V_TRAVA       := C_TRAVA.NRSEQCONSISTE;
                              V_DESC        := C_TRAVA.DSCONSISTENCIA;
                              V_CDIMPOSTO   := C_TRAVA.CDIMPOSTO;
                              V_NRSEQITPROD := C_ITEM.NRSEQITPROD;
                              V_CDARVPROD   := C_ITEM.CDARVPROD;
                              V_NMPRODUTO   := C_ITEM.NMPRODUTO;
                              V_CDREGRAIT   := C_IMPOSTO.CDREGRAIT;
                           END IF;
                        ELSIF C_TRAVA.IDTPBASECALC  = '2' THEN
                           IF C_IMPOSTO.VRBASECALCIT = 0 THEN
                              V_TRAVA       := C_TRAVA.NRSEQCONSISTE;
                              V_DESC        := C_TRAVA.DSCONSISTENCIA;
                              V_CDIMPOSTO   := C_TRAVA.CDIMPOSTO;
                              V_NRSEQITPROD := C_ITEM.NRSEQITPROD;
                              V_CDARVPROD   := C_ITEM.CDARVPROD;
                              V_NMPRODUTO   := C_ITEM.NMPRODUTO;
                              V_CDREGRAIT   := C_IMPOSTO.CDREGRAIT;
                           END IF;
                        ELSIF C_TRAVA.IDTPBASECALC  = '3' THEN
                           IF C_IMPOSTO.VRBASECALCIT >= 0 THEN
                              V_TRAVA       := C_TRAVA.NRSEQCONSISTE;
                              V_DESC        := C_TRAVA.DSCONSISTENCIA;
                              V_CDIMPOSTO   := C_TRAVA.CDIMPOSTO;
                              V_NRSEQITPROD := C_ITEM.NRSEQITPROD;
                              V_CDARVPROD   := C_ITEM.CDARVPROD;
                              V_NMPRODUTO   := C_ITEM.NMPRODUTO;
                              V_CDREGRAIT   := C_IMPOSTO.CDREGRAIT;
                           END IF;
                        ELSIF C_TRAVA.IDTPBASECALC  = '4' THEN
                           IF C_IMPOSTO.VRBASECALCIT <> 0 THEN
                              V_TRAVA       := C_TRAVA.NRSEQCONSISTE;
                              V_DESC        := C_TRAVA.DSCONSISTENCIA;
                              V_CDIMPOSTO   := C_TRAVA.CDIMPOSTO;
                              V_NRSEQITPROD := C_ITEM.NRSEQITPROD;
                              V_CDARVPROD   := C_ITEM.CDARVPROD;
                              V_NMPRODUTO   := C_ITEM.NMPRODUTO;
                              V_CDREGRAIT   := C_IMPOSTO.CDREGRAIT;
                           END IF;
                        END IF;

                        IF C_TRAVA.IDTPVRIMPOSTO  = '1' THEN
                           IF C_IMPOSTO.VRIMPOSTOIT < 0 THEN
                              V_TRAVA       := C_TRAVA.NRSEQCONSISTE;
                              V_DESC        := C_TRAVA.DSCONSISTENCIA;
                              V_CDIMPOSTO   := C_TRAVA.CDIMPOSTO;
                              V_NRSEQITPROD := C_ITEM.NRSEQITPROD;
                              V_CDARVPROD   := C_ITEM.CDARVPROD;
                              V_NMPRODUTO   := C_ITEM.NMPRODUTO;
                              V_CDREGRAIT   := C_IMPOSTO.CDREGRAIT;
                           END IF;
                        ELSIF C_TRAVA.IDTPVRIMPOSTO  = '2' THEN
                           IF C_IMPOSTO.VRIMPOSTOIT = 0 THEN
                              V_TRAVA       := C_TRAVA.NRSEQCONSISTE;
                              V_DESC        := C_TRAVA.DSCONSISTENCIA;
                              V_CDIMPOSTO   := C_TRAVA.CDIMPOSTO;
                              V_NRSEQITPROD := C_ITEM.NRSEQITPROD;
                              V_CDARVPROD   := C_ITEM.CDARVPROD;
                              V_NMPRODUTO   := C_ITEM.NMPRODUTO;
                              V_CDREGRAIT   := C_IMPOSTO.CDREGRAIT;
                           END IF;
                        ELSIF C_TRAVA.IDTPVRIMPOSTO  = '3' THEN
                           IF C_IMPOSTO.VRIMPOSTOIT >= 0 THEN
                              V_TRAVA       := C_TRAVA.NRSEQCONSISTE;
                              V_DESC        := C_TRAVA.DSCONSISTENCIA;
                              V_CDIMPOSTO   := C_TRAVA.CDIMPOSTO;
                              V_NRSEQITPROD := C_ITEM.NRSEQITPROD;
                              V_CDARVPROD   := C_ITEM.CDARVPROD;
                              V_NMPRODUTO   := C_ITEM.NMPRODUTO;
                              V_CDREGRAIT   := C_IMPOSTO.CDREGRAIT;
                           END IF;
                        ELSIF C_TRAVA.IDTPVRIMPOSTO  = '4' THEN
                           IF C_IMPOSTO.VRIMPOSTOIT <> 0 THEN
                              V_TRAVA       := C_TRAVA.NRSEQCONSISTE;
                              V_DESC        := C_TRAVA.DSCONSISTENCIA;
                              V_CDIMPOSTO   := C_TRAVA.CDIMPOSTO;
                              V_NRSEQITPROD := C_ITEM.NRSEQITPROD;
                              V_CDARVPROD   := C_ITEM.CDARVPROD;
                              V_NMPRODUTO   := C_ITEM.NMPRODUTO;
                              V_CDREGRAIT   := C_IMPOSTO.CDREGRAIT;
                           END IF;
                        END IF;

                        IF C_TRAVA.IDTPALIQUOTA  = '1' THEN
                           IF C_IMPOSTO.VRALIQITEM < 0 THEN
                              V_TRAVA       := C_TRAVA.NRSEQCONSISTE;
                              V_DESC        := C_TRAVA.DSCONSISTENCIA;
                              V_CDIMPOSTO   := C_TRAVA.CDIMPOSTO;
                              V_NRSEQITPROD := C_ITEM.NRSEQITPROD;
                              V_CDARVPROD   := C_ITEM.CDARVPROD;
                              V_NMPRODUTO   := C_ITEM.NMPRODUTO;
                              V_CDREGRAIT   := C_IMPOSTO.CDREGRAIT;
                           END IF;
                        ELSIF C_TRAVA.IDTPALIQUOTA  = '2' THEN
                           IF C_IMPOSTO.VRALIQITEM = 0 THEN
                              V_TRAVA       := C_TRAVA.NRSEQCONSISTE;
                              V_DESC        := C_TRAVA.DSCONSISTENCIA;
                              V_CDIMPOSTO   := C_TRAVA.CDIMPOSTO;
                              V_NRSEQITPROD := C_ITEM.NRSEQITPROD;
                              V_CDARVPROD   := C_ITEM.CDARVPROD;
                              V_NMPRODUTO   := C_ITEM.NMPRODUTO;
                              V_CDREGRAIT   := C_IMPOSTO.CDREGRAIT;
                           END IF;
                        ELSIF C_TRAVA.IDTPALIQUOTA  = '3' THEN
                           IF C_IMPOSTO.VRALIQITEM >= 0 THEN
                              V_TRAVA       := C_TRAVA.NRSEQCONSISTE;
                              V_DESC        := C_TRAVA.DSCONSISTENCIA;
                              V_CDIMPOSTO   := C_TRAVA.CDIMPOSTO;
                              V_NRSEQITPROD := C_ITEM.NRSEQITPROD;
                              V_CDARVPROD   := C_ITEM.CDARVPROD;
                              V_NMPRODUTO   := C_ITEM.NMPRODUTO;
                              V_CDREGRAIT   := C_IMPOSTO.CDREGRAIT;
                           END IF;
                        ELSIF C_TRAVA.IDTPALIQUOTA  = '4' THEN
                           IF C_IMPOSTO.VRALIQITEM <> 0 THEN
                              V_TRAVA       := C_TRAVA.NRSEQCONSISTE;
                              V_DESC        := C_TRAVA.DSCONSISTENCIA;
                              V_CDIMPOSTO   := C_TRAVA.CDIMPOSTO;
                              V_NRSEQITPROD := C_ITEM.NRSEQITPROD;
                              V_CDARVPROD   := C_ITEM.CDARVPROD;
                              V_NMPRODUTO   := C_ITEM.NMPRODUTO;
                              V_CDREGRAIT   := C_IMPOSTO.CDREGRAIT;
                           END IF;
                        END IF;
                     END IF;
                  END IF;
               END IF;
            END LOOP;
            IF V_TRAVA IS NOT NULL THEN
               OUT_RECORD.CDIMPOSTO      := V_CDIMPOSTO;
               OUT_RECORD.NRSEQITPROD    := V_NRSEQITPROD;
               OUT_RECORD.CDARVPROD      := V_CDARVPROD;
               OUT_RECORD.NMPRODUTO      := V_NMPRODUTO;
               OUT_RECORD.NRSEQCONSISTE  := V_TRAVA;
               OUT_RECORD.DSCONSISTENCIA := V_DESC;
               OUT_RECORD.CDREGRAIT      := V_CDREGRAIT;
               PIPE ROW (OUT_RECORD);
            END IF;
         END LOOP;
         FOR C_IMP IN
            (SELECT IT.CDIMPOSTO, VRCONTITIMP, VRBASECALCIT, VRIMPOSTOIT, CDSITUTRIBITNFE, CDSITUTRIBIT,
                    CDFISCOPERIT, CDFISCALIT, I.CDIMPOSTONFE, IT.VRALIQITEM, I.IDUTVLRQTDEIMPO, IT.CDTPCREDPICOITE,
                    IT.CDNATUBCALPCIT, I.IDIMPORECUP, IT.CDREGRAIT, IT.NRITPROIMPOS
               FROM ITEMPROIMPOS IT, IMPOSTO I
              WHERE CDFILIAL     = P_CDFILIAL
                AND NRLANCTONF   = P_NRLANCTONF
                AND NRSEQITPROD  = C_ITEM.NRSEQITPROD
                AND IT.CDIMPOSTO = I.CDIMPOSTO)
         LOOP
            V_TRAVA       := NULL;
            V_DESC        := NULL;
            V_CDIMPOSTO   := NULL;
            V_CDREGRAIT   := NULL;
            IF V_CDTIPOOPER <> '03' THEN
               IF C_IMP.CDIMPOSTONFE = '00' THEN
                  IF ((C_ITEM.CDFISOPEITEM IS NULL) OR (C_IMP.CDFISCOPERIT IS NULL)) THEN
                     V_TRAVA       := 'ICMS_CFOP';
                     V_DESC        := 'Notas com ICMS devem possuir CFOP.';
                     V_CDIMPOSTO   := C_IMP.CDIMPOSTO;
                     V_NRSEQITPROD := C_ITEM.NRSEQITPROD;
                     V_CDARVPROD   := C_ITEM.CDARVPROD;
                     V_NMPRODUTO   := C_ITEM.NMPRODUTO;
                     V_CDREGRAIT   := C_IMP.CDREGRAIT;

                     OUT_RECORD.CDIMPOSTO      := V_CDIMPOSTO;
                     OUT_RECORD.NRSEQITPROD    := V_NRSEQITPROD;
                     OUT_RECORD.CDARVPROD      := V_CDARVPROD;
                     OUT_RECORD.NMPRODUTO      := V_NMPRODUTO;
                     OUT_RECORD.NRSEQCONSISTE  := V_TRAVA;
                     OUT_RECORD.DSCONSISTENCIA := V_DESC;
                     OUT_RECORD.CDREGRAIT      := V_CDREGRAIT;
                     PIPE ROW (OUT_RECORD);
                  END IF;
                  IF V_CDSITUCRT = '3' THEN
                     IF (C_ITEM.CDSITUTRIBPR IS NULL) THEN

                        V_TRAVA       := 'ERRO_CSTITEM';
                        V_DESC        := 'Notas com ICMS devem possuir CST.';
                        V_CDIMPOSTO   := C_IMP.CDIMPOSTO;
                        V_NRSEQITPROD := C_ITEM.NRSEQITPROD;
                        V_CDARVPROD   := C_ITEM.CDARVPROD;
                        V_NMPRODUTO   := C_ITEM.NMPRODUTO;
                        V_CDREGRAIT   := C_IMP.CDREGRAIT;

                        OUT_RECORD.CDIMPOSTO      := V_CDIMPOSTO;
                        OUT_RECORD.NRSEQITPROD    := V_NRSEQITPROD;
                        OUT_RECORD.CDARVPROD      := V_CDARVPROD;
                        OUT_RECORD.NMPRODUTO      := V_NMPRODUTO;
                        OUT_RECORD.NRSEQCONSISTE  := V_TRAVA;
                        OUT_RECORD.DSCONSISTENCIA := V_DESC;
                        OUT_RECORD.CDREGRAIT      := V_CDREGRAIT;
                        PIPE ROW (OUT_RECORD);
                     END IF;
                     IF C_ITEM.CDSITUTRIBPR <> C_IMP.CDSITUTRIBIT THEN
                        V_TRAVA       := 'ERRO_CST';
                        V_DESC        := 'Situacao tributaria do item deve ser igual a situacao tributaria do ICMS.';
                        V_CDIMPOSTO   := C_IMP.CDIMPOSTO;
                        V_NRSEQITPROD := C_ITEM.NRSEQITPROD;
                        V_CDARVPROD   := C_ITEM.CDARVPROD;
                        V_NMPRODUTO   := C_ITEM.NMPRODUTO;
                        V_CDREGRAIT   := C_IMP.CDREGRAIT;

                        OUT_RECORD.CDIMPOSTO      := V_CDIMPOSTO;
                        OUT_RECORD.NRSEQITPROD    := V_NRSEQITPROD;
                        OUT_RECORD.CDARVPROD      := V_CDARVPROD;
                        OUT_RECORD.NMPRODUTO      := V_NMPRODUTO;
                        OUT_RECORD.NRSEQCONSISTE  := V_TRAVA;
                        OUT_RECORD.DSCONSISTENCIA := V_DESC;
                        OUT_RECORD.CDREGRAIT      := V_CDREGRAIT;
                        PIPE ROW (OUT_RECORD);
                     END IF;
                     IF (C_IMP.CDSITUTRIBITNFE IS NOT NULL) THEN
                        IF C_IMP.CDSITUTRIBITNFE <> SUBSTR(C_IMP.CDSITUTRIBIT, 2, 2) THEN
                           V_TRAVA       := 'CSTNFE_CST';
                           V_DESC        := 'Situacao tributaria do ICMS deve ser igual a situacao tributaria eletronica do ICMS.';
                           V_CDIMPOSTO   := C_IMP.CDIMPOSTO;
                           V_NRSEQITPROD := C_ITEM.NRSEQITPROD;
                           V_CDARVPROD   := C_ITEM.CDARVPROD;
                           V_NMPRODUTO   := C_ITEM.NMPRODUTO;
                           V_CDREGRAIT   := C_IMP.CDREGRAIT;

                           OUT_RECORD.CDIMPOSTO      := V_CDIMPOSTO;
                           OUT_RECORD.NRSEQITPROD    := V_NRSEQITPROD;
                           OUT_RECORD.CDARVPROD      := V_CDARVPROD;
                           OUT_RECORD.NMPRODUTO      := V_NMPRODUTO;
                           OUT_RECORD.NRSEQCONSISTE  := V_TRAVA;
                           OUT_RECORD.DSCONSISTENCIA := V_DESC;
                           OUT_RECORD.CDREGRAIT      := V_CDREGRAIT;
                           PIPE ROW (OUT_RECORD);
                        END IF;
                     END IF;

                     IF C_IMP.CDSITUTRIBITNFE = '20' THEN
                        SELECT COUNT(1)
                          INTO V_COUNT
                          FROM ITEMPROIMPOS
                         WHERE CDFILIAL    = P_CDFILIAL
                           AND NRLANCTONF  = P_NRLANCTONF
                           AND NRSEQITPROD = C_ITEM.NRSEQITPROD
                           AND CDIMPOSTO   = C_IMP.CDIMPOSTO
                           AND VRPERREDBCIT > 0
                           AND NRITPROIMPOS = '2';

                        IF V_COUNT = 0 THEN
                           V_TRAVA       := 'CSTREDBC';
                           V_DESC        := 'Situacao tributaria do ICMS indica que deve haver reducao de base de calculo.';
                           V_CDIMPOSTO   := C_IMP.CDIMPOSTO;
                           V_NRSEQITPROD := C_ITEM.NRSEQITPROD;
                           V_CDARVPROD   := C_ITEM.CDARVPROD;
                           V_NMPRODUTO   := C_ITEM.NMPRODUTO;
                           V_CDREGRAIT   := C_IMP.CDREGRAIT;

                           OUT_RECORD.CDIMPOSTO      := V_CDIMPOSTO;
                           OUT_RECORD.NRSEQITPROD    := V_NRSEQITPROD;
                           OUT_RECORD.CDARVPROD      := V_CDARVPROD;
                           OUT_RECORD.NMPRODUTO      := V_NMPRODUTO;
                           OUT_RECORD.NRSEQCONSISTE  := V_TRAVA;
                           OUT_RECORD.DSCONSISTENCIA := V_DESC;
                           OUT_RECORD.CDREGRAIT      := V_CDREGRAIT;
                           PIPE ROW (OUT_RECORD);
                        END IF;
                     END IF;
                  ELSE
                     IF (C_ITEM.CDFISCOPERSN IS NULL) THEN

                        V_TRAVA       := 'ERRO_CSOSNITEM';
                        V_DESC        := 'Notas com ICMS devem possuir CSOSN.';
                        V_CDIMPOSTO   := C_IMP.CDIMPOSTO;
                        V_NRSEQITPROD := C_ITEM.NRSEQITPROD;
                        V_CDARVPROD   := C_ITEM.CDARVPROD;
                        V_NMPRODUTO   := C_ITEM.NMPRODUTO;
                        V_CDREGRAIT   := C_IMP.CDREGRAIT;

                        OUT_RECORD.CDIMPOSTO      := V_CDIMPOSTO;
                        OUT_RECORD.NRSEQITPROD    := V_NRSEQITPROD;
                        OUT_RECORD.CDARVPROD      := V_CDARVPROD;
                        OUT_RECORD.NMPRODUTO      := V_NMPRODUTO;
                        OUT_RECORD.NRSEQCONSISTE  := V_TRAVA;
                        OUT_RECORD.DSCONSISTENCIA := V_DESC;
                        OUT_RECORD.CDREGRAIT      := V_CDREGRAIT;
                        PIPE ROW (OUT_RECORD);
                     END IF;

                  END IF;

               END IF;


               IF ((C_IMP.CDIMPOSTONFE = '50') OR (C_IMP.CDIMPOSTONFE = '60')) THEN
                  IF (C_IMP.CDSITUTRIBITNFE IS NULL) THEN
                     V_TRAVA       := 'ERROCSTNFE';
                     V_DESC        := 'Imposto com CST vazio.';
                     V_CDIMPOSTO   := C_IMP.CDIMPOSTO;
                     V_NRSEQITPROD := C_ITEM.NRSEQITPROD;
                     V_CDARVPROD   := C_ITEM.CDARVPROD;
                     V_NMPRODUTO   := C_ITEM.NMPRODUTO;
                     V_CDREGRAIT   := C_IMP.CDREGRAIT;


                     OUT_RECORD.CDIMPOSTO      := V_CDIMPOSTO;
                     OUT_RECORD.NRSEQITPROD    := V_NRSEQITPROD;
                     OUT_RECORD.CDARVPROD      := V_CDARVPROD;
                     OUT_RECORD.NMPRODUTO      := V_NMPRODUTO;
                     OUT_RECORD.NRSEQCONSISTE  := V_TRAVA;
                     OUT_RECORD.DSCONSISTENCIA := V_DESC;
                     OUT_RECORD.CDREGRAIT      := V_CDREGRAIT;
                     PIPE ROW (OUT_RECORD);
                  END IF;
               END IF;

               IF V_CDSITUCRT = '3' THEN
                  IF (C_IMP.CDSITUTRIBITNFE IS NOT NULL) THEN
                     SELECT MAX(CDIMPOSTO)
                       INTO V_IMPOSTO
                       FROM ALIQUOTACSTNFE
                      WHERE CDIMPOSTO = C_IMP.CDIMPOSTONFE
                        AND CDSITUTRIBNFE = C_IMP.CDSITUTRIBITNFE;

                     IF V_IMPOSTO IS NOT NULL THEN
                        IF ((C_IMP.CDFISCALIT = '1') AND (C_IMP.CDSITUTRIBITNFE IS NOT NULL)) AND (C_IMP.NRITPROIMPOS <> '3') THEN
                           SELECT MAX(CDIMPOSTO), DECODE(C_IMP.CDIMPOSTONFE, '50', 'do PIS', 'da COFINS')
                             INTO V_CONFALIQ, V_IMPOSTO
                             FROM ALIQUOTACSTNFE
                            WHERE CDIMPOSTO = C_IMP.CDIMPOSTONFE
                              AND CDSITUTRIBNFE = C_IMP.CDSITUTRIBITNFE
                              AND VRALIQUOTA = C_IMP.VRALIQITEM;

                           IF V_CONFALIQ IS NULL THEN
                              V_TRAVA       := 'CSTALIQ';
                              V_DESC        := 'Aliquota invalida para a situacao tributaria. Consulte a tela: Aliquota Valida por CST e Imposto';
                              V_CDIMPOSTO   := C_IMP.CDIMPOSTO;
                              V_NRSEQITPROD := C_ITEM.NRSEQITPROD;
                              V_CDARVPROD   := C_ITEM.CDARVPROD;
                              V_NMPRODUTO   := C_ITEM.NMPRODUTO;
                              V_CDREGRAIT   := C_IMP.CDREGRAIT;

                              OUT_RECORD.CDIMPOSTO      := V_CDIMPOSTO;
                              OUT_RECORD.NRSEQITPROD    := V_NRSEQITPROD;
                              OUT_RECORD.CDARVPROD      := V_CDARVPROD;
                              OUT_RECORD.NMPRODUTO      := V_NMPRODUTO;
                              OUT_RECORD.NRSEQCONSISTE  := V_TRAVA;
                              OUT_RECORD.DSCONSISTENCIA := V_DESC;
                              OUT_RECORD.CDREGRAIT      := V_CDREGRAIT;
                              PIPE ROW (OUT_RECORD);
                           END IF;
                        END IF;
                     END IF;
                  END IF;
                  IF V_IDENTRSAIDOP = 'E' THEN
                     V_CDFILIMOVI := V_CDFILIRECE;
                  ELSE
                     V_CDFILIMOVI := V_CDFILIEMIT;
                  END IF;

                  BEGIN
                     SELECT MAX(IDCUMUPISCOFIL)
                       INTO V_IDCUMUPISCOFIL
                       FROM FILIAL
                      WHERE CDFILIAL = V_CDFILIMOVI;
                  EXCEPTION
                    WHEN NO_DATA_FOUND THEN
                       V_IDCUMUPISCOFIL := NULL;
                  END;

                  BEGIN
                     SELECT MAX(IDCUMUPISCOFIL)
                       INTO V_IDCUMUPISCOFIL_TPOPER
                       FROM TIPOOPERAC
                      WHERE IDENTRSAIDOP = V_IDENTRSAIDOP
                        AND CDTIPOOPER   = V_CDTIPOOPER;
                  EXCEPTION
                     WHEN NO_DATA_FOUND THEN
                        V_IDCUMUPISCOFIL_TPOPER := NULL;
                  END;   

                  IF ((C_IMP.CDIMPOSTONFE = '50')  AND (C_IMP.CDSITUTRIBITNFE = '01')) THEN
                     IF (V_IDCUMUPISCOFIL = 'N') OR (V_IDCUMUPISCOFIL = 'A' AND V_IDCUMUPISCOFIL_TPOPER = 'N') THEN
                        IF C_IMP.VRALIQITEM <> 0.65 THEN
                           V_TRAVA       := 'ALIQPISBAS';
                           V_DESC        := 'Aliquota invalida para a filiais cumulativas.';
                           V_CDIMPOSTO   := C_IMP.CDIMPOSTO;
                           V_NRSEQITPROD := C_ITEM.NRSEQITPROD;
                           V_CDARVPROD   := C_ITEM.CDARVPROD;
                           V_NMPRODUTO   := C_ITEM.NMPRODUTO;
                           V_CDREGRAIT   := C_IMP.CDREGRAIT;

                           OUT_RECORD.CDIMPOSTO      := V_CDIMPOSTO;
                           OUT_RECORD.NRSEQITPROD    := V_NRSEQITPROD;
                           OUT_RECORD.CDARVPROD      := V_CDARVPROD;
                           OUT_RECORD.NMPRODUTO      := V_NMPRODUTO;
                           OUT_RECORD.NRSEQCONSISTE  := V_TRAVA;
                           OUT_RECORD.DSCONSISTENCIA := V_DESC;
                           OUT_RECORD.CDREGRAIT      := V_CDREGRAIT;
                           PIPE ROW (OUT_RECORD);
                        END IF;
                     ELSIF (V_IDCUMUPISCOFIL = 'S') OR (V_IDCUMUPISCOFIL = 'A' AND V_IDCUMUPISCOFIL_TPOPER = 'S') THEN
                        IF C_IMP.VRALIQITEM <> 1.65 THEN
                           V_TRAVA       := 'ALIQPISBAS';
                           V_DESC        := 'Aliquota invalida para a filiais nao cumulativas.';
                           V_CDIMPOSTO   := C_IMP.CDIMPOSTO;
                           V_NRSEQITPROD := C_ITEM.NRSEQITPROD;
                           V_CDARVPROD   := C_ITEM.CDARVPROD;
                           V_NMPRODUTO   := C_ITEM.NMPRODUTO;
                           V_CDREGRAIT   := C_IMP.CDREGRAIT;

                           OUT_RECORD.CDIMPOSTO      := V_CDIMPOSTO;
                           OUT_RECORD.NRSEQITPROD    := V_NRSEQITPROD;
                           OUT_RECORD.CDARVPROD      := V_CDARVPROD;
                           OUT_RECORD.NMPRODUTO      := V_NMPRODUTO;
                           OUT_RECORD.NRSEQCONSISTE  := V_TRAVA;
                           OUT_RECORD.DSCONSISTENCIA := V_DESC;
                           OUT_RECORD.CDREGRAIT      := V_CDREGRAIT;
                           PIPE ROW (OUT_RECORD);
                        END IF;
                     END IF;
                  END IF;


                  IF ((C_IMP.CDIMPOSTONFE = '60')  AND (C_IMP.CDSITUTRIBITNFE = '01')) THEN
                     IF (V_IDCUMUPISCOFIL = 'N') OR (V_IDCUMUPISCOFIL = 'A' AND V_IDCUMUPISCOFIL_TPOPER = 'N') THEN
                        IF C_IMP.VRALIQITEM <> 3.00 THEN
                           V_TRAVA       := 'ALIQCOFBAS';
                           V_DESC        := 'Aliquota invalida para a filiais cumulativas.';
                           V_CDIMPOSTO   := C_IMP.CDIMPOSTO;
                           V_NRSEQITPROD := C_ITEM.NRSEQITPROD;
                           V_CDARVPROD   := C_ITEM.CDARVPROD;
                           V_NMPRODUTO   := C_ITEM.NMPRODUTO;
                           V_CDREGRAIT   := C_IMP.CDREGRAIT;

                           OUT_RECORD.CDIMPOSTO      := V_CDIMPOSTO;
                           OUT_RECORD.NRSEQITPROD    := V_NRSEQITPROD;
                           OUT_RECORD.CDARVPROD      := V_CDARVPROD;
                           OUT_RECORD.NMPRODUTO      := V_NMPRODUTO;
                           OUT_RECORD.NRSEQCONSISTE  := V_TRAVA;
                           OUT_RECORD.DSCONSISTENCIA := V_DESC;
                           OUT_RECORD.CDREGRAIT      := V_CDREGRAIT;
                           PIPE ROW (OUT_RECORD);
                        END IF;
                     ELSIF (V_IDCUMUPISCOFIL = 'S') OR (V_IDCUMUPISCOFIL = 'A' AND V_IDCUMUPISCOFIL_TPOPER = 'S') THEN
                        IF C_IMP.VRALIQITEM <> 7.60 THEN
                           V_TRAVA       := 'ALIQCOVBAS';
                           V_DESC        := 'Aliquota invalida para a filiais nao cumulativas.';
                           V_CDIMPOSTO   := C_IMP.CDIMPOSTO;
                           V_NRSEQITPROD := C_ITEM.NRSEQITPROD;
                           V_CDARVPROD   := C_ITEM.CDARVPROD;
                           V_NMPRODUTO   := C_ITEM.NMPRODUTO;
                           V_CDREGRAIT   := C_IMP.CDREGRAIT;

                           OUT_RECORD.CDIMPOSTO      := V_CDIMPOSTO;
                           OUT_RECORD.NRSEQITPROD    := V_NRSEQITPROD;
                           OUT_RECORD.CDARVPROD      := V_CDARVPROD;
                           OUT_RECORD.NMPRODUTO      := V_NMPRODUTO;
                           OUT_RECORD.NRSEQCONSISTE  := V_TRAVA;
                           OUT_RECORD.DSCONSISTENCIA := V_DESC;
                           OUT_RECORD.CDREGRAIT      := V_CDREGRAIT;
                           PIPE ROW (OUT_RECORD);
                        END IF;
                     END IF;
                  END IF;


                  IF (((C_IMP.CDIMPOSTONFE = '50') OR (C_IMP.CDIMPOSTONFE = '60')) AND (C_IMP.IDUTVLRQTDEIMPO = 'S')) THEN

                     IF C_IMP.CDSITUTRIBITNFE <> 03 THEN
                        V_TRAVA       := 'ERROCSTQT';
                        V_DESC        := 'Ao utilizar valor por quantidade o CST deve ser 03.';
                        V_CDIMPOSTO   := C_IMP.CDIMPOSTO;
                        V_NRSEQITPROD := C_ITEM.NRSEQITPROD;
                        V_CDARVPROD   := C_ITEM.CDARVPROD;
                        V_NMPRODUTO   := C_ITEM.NMPRODUTO;
                        V_CDREGRAIT   := C_IMP.CDREGRAIT;

                        OUT_RECORD.CDIMPOSTO      := V_CDIMPOSTO;
                        OUT_RECORD.NRSEQITPROD    := V_NRSEQITPROD;
                        OUT_RECORD.CDARVPROD      := V_CDARVPROD;
                        OUT_RECORD.NMPRODUTO      := V_NMPRODUTO;
                        OUT_RECORD.NRSEQCONSISTE  := V_TRAVA;
                        OUT_RECORD.DSCONSISTENCIA := V_DESC;
                        OUT_RECORD.CDREGRAIT      := V_CDREGRAIT;
                        PIPE ROW (OUT_RECORD);
                     END IF;
                  END IF;


                  IF ((C_IMP.CDIMPOSTONFE = '50') OR (C_IMP.CDIMPOSTONFE = '60')) THEN

                     IF C_IMP.CDSITUTRIBITNFE IN ('50', '51', '52', '53', '54', '55', '56', '60', '61', '62', '63', '64', '65', '66', '67') THEN
                        IF C_IMP.CDTPCREDPICOITE IS NULL THEN
                           V_TRAVA       := 'ERROTPCRED';
                           V_DESC        := 'Tipo de credito deve ser informado.';
                           V_CDIMPOSTO   := C_IMP.CDIMPOSTO;
                           V_NRSEQITPROD := C_ITEM.NRSEQITPROD;
                           V_CDARVPROD   := C_ITEM.CDARVPROD;
                           V_NMPRODUTO   := C_ITEM.NMPRODUTO;
                           V_CDREGRAIT   := C_IMP.CDREGRAIT;

                           OUT_RECORD.CDIMPOSTO      := V_CDIMPOSTO;
                           OUT_RECORD.NRSEQITPROD    := V_NRSEQITPROD;
                           OUT_RECORD.CDARVPROD      := V_CDARVPROD;
                           OUT_RECORD.NMPRODUTO      := V_NMPRODUTO;
                           OUT_RECORD.NRSEQCONSISTE  := V_TRAVA;
                           OUT_RECORD.DSCONSISTENCIA := V_DESC;
                           OUT_RECORD.CDREGRAIT      := V_CDREGRAIT;
                           PIPE ROW (OUT_RECORD);
                        END IF;

                        IF C_IMP.CDNATUBCALPCIT IS NULL THEN
                           V_TRAVA       := 'ERRONATUBC';
                           V_DESC        := 'Natureza da base de calculo deve ser informada.';
                           V_CDIMPOSTO   := C_IMP.CDIMPOSTO;
                           V_NRSEQITPROD := C_ITEM.NRSEQITPROD;
                           V_CDARVPROD   := C_ITEM.CDARVPROD;
                           V_NMPRODUTO   := C_ITEM.NMPRODUTO;
                           V_CDREGRAIT   := C_IMP.CDREGRAIT;

                           OUT_RECORD.CDIMPOSTO      := V_CDIMPOSTO;
                           OUT_RECORD.NRSEQITPROD    := V_NRSEQITPROD;
                           OUT_RECORD.CDARVPROD      := V_CDARVPROD;
                           OUT_RECORD.NMPRODUTO      := V_NMPRODUTO;
                           OUT_RECORD.NRSEQCONSISTE  := V_TRAVA;
                           OUT_RECORD.DSCONSISTENCIA := V_DESC;
                           OUT_RECORD.CDREGRAIT      := V_CDREGRAIT;
                           PIPE ROW (OUT_RECORD);
                        END IF;
                     END IF;
                  END IF;

                  IF (C_IMP.CDIMPOSTONFE = '50') THEN

                     SELECT COUNT(*)
                       INTO V_COUNT
                       FROM ITEMPROIMPOS II, IMPOSTO I
                      WHERE II.CDFILIAL = P_CDFILIAL
                        AND II.NRLANCTONF = P_NRLANCTONF
                        AND II.NRSEQITPROD = C_ITEM.NRSEQITPROD
                        AND II.CDIMPOSTO = I.CDIMPOSTO
                        AND I.CDIMPOSTONFE = '60';

                     IF V_COUNT = 1 THEN
                        SELECT II.CDIMPOSTO, COUNT(1), SUM(VRBASECALCIT), MAX(CDSITUTRIBITNFE), MAX(CDTPCREDPICOITE), MAX(CDNATUBCALPCIT), MAX(IDIMPORECUP)
                          INTO V_COFINS,  V_COUNT,  V_VRBASECALCIT,    V_CDSITUTRIBITNFE,    V_CDTPCREDPICOITE,    V_CDNATUBCALPCIT, V_IDIMPORECUP
                          FROM ITEMPROIMPOS II, IMPOSTO I
                         WHERE II.CDFILIAL = P_CDFILIAL
                           AND II.NRLANCTONF = P_NRLANCTONF
                           AND II.NRSEQITPROD = C_ITEM.NRSEQITPROD
                           AND II.CDIMPOSTO = I.CDIMPOSTO
                           AND I.CDIMPOSTONFE = '60'
                        GROUP BY II.CDIMPOSTO
                        HAVING COUNT(1) = 1;

                        IF (V_COFINS IS NULL) THEN
                           V_TRAVA       := 'ERROCOFINS';
                           V_DESC        := 'Deve haver incidencia de ambos os impostos PIS e COFINS.';
                           V_CDIMPOSTO   := C_IMP.CDIMPOSTO;
                           V_NRSEQITPROD := C_ITEM.NRSEQITPROD;
                           V_CDARVPROD   := C_ITEM.CDARVPROD;
                           V_NMPRODUTO   := C_ITEM.NMPRODUTO;
                           V_CDREGRAIT   := C_IMP.CDREGRAIT;

                           OUT_RECORD.CDIMPOSTO      := V_CDIMPOSTO;
                           OUT_RECORD.NRSEQITPROD    := V_NRSEQITPROD;
                           OUT_RECORD.CDARVPROD      := V_CDARVPROD;
                           OUT_RECORD.NMPRODUTO      := V_NMPRODUTO;
                           OUT_RECORD.NRSEQCONSISTE  := V_TRAVA;
                           OUT_RECORD.DSCONSISTENCIA := V_DESC;
                           OUT_RECORD.CDREGRAIT      := V_CDREGRAIT;
                           PIPE ROW (OUT_RECORD);
                        ELSE
                           IF C_IMP.VRBASECALCIT <> V_VRBASECALCIT THEN
                              V_TRAVA       := 'ERROBCCOF';
                              V_DESC        := 'A base de calculo do PIS e do COFINS devem ser iguais.';
                              V_CDIMPOSTO   := C_IMP.CDIMPOSTO;
                              V_NRSEQITPROD := C_ITEM.NRSEQITPROD;
                              V_CDARVPROD   := C_ITEM.CDARVPROD;
                              V_NMPRODUTO   := C_ITEM.NMPRODUTO;
                              V_CDREGRAIT   := C_IMP.CDREGRAIT;

                              OUT_RECORD.CDIMPOSTO      := V_CDIMPOSTO;
                              OUT_RECORD.NRSEQITPROD    := V_NRSEQITPROD;
                              OUT_RECORD.CDARVPROD      := V_CDARVPROD;
                              OUT_RECORD.NMPRODUTO      := V_NMPRODUTO;
                              OUT_RECORD.NRSEQCONSISTE  := V_TRAVA;
                              OUT_RECORD.DSCONSISTENCIA := V_DESC;
                              OUT_RECORD.CDREGRAIT      := V_CDREGRAIT;
                              PIPE ROW (OUT_RECORD);
                           END IF;
                           IF C_IMP.CDSITUTRIBITNFE <> V_CDSITUTRIBITNFE THEN
                              V_TRAVA       := 'ERROCSTCOF';
                              V_DESC        := 'A situacao tributaria do PIS e do COFINS devem ser iguais.';
                              V_CDIMPOSTO   := C_IMP.CDIMPOSTO;
                              V_NRSEQITPROD := C_ITEM.NRSEQITPROD;
                              V_CDARVPROD   := C_ITEM.CDARVPROD;
                              V_NMPRODUTO   := C_ITEM.NMPRODUTO;
                              V_CDREGRAIT   := C_IMP.CDREGRAIT;

                              OUT_RECORD.CDIMPOSTO      := V_CDIMPOSTO;
                              OUT_RECORD.NRSEQITPROD    := V_NRSEQITPROD;
                              OUT_RECORD.CDARVPROD      := V_CDARVPROD;
                              OUT_RECORD.NMPRODUTO      := V_NMPRODUTO;
                              OUT_RECORD.NRSEQCONSISTE  := V_TRAVA;
                              OUT_RECORD.DSCONSISTENCIA := V_DESC;
                              OUT_RECORD.CDREGRAIT      := V_CDREGRAIT;
                              PIPE ROW (OUT_RECORD);
                           END IF;
                           IF C_IMP.CDTPCREDPICOITE <> V_CDTPCREDPICOITE THEN
                              V_TRAVA       := 'ERROTPCOF';
                              V_DESC        := 'O tipo de credito do PIS e do COFINS devem ser iguais.';
                              V_CDIMPOSTO   := C_IMP.CDIMPOSTO;
                              V_NRSEQITPROD := C_ITEM.NRSEQITPROD;
                              V_CDARVPROD   := C_ITEM.CDARVPROD;
                              V_NMPRODUTO   := C_ITEM.NMPRODUTO;
                              V_CDREGRAIT   := C_IMP.CDREGRAIT;

                              OUT_RECORD.CDIMPOSTO      := V_CDIMPOSTO;
                              OUT_RECORD.NRSEQITPROD    := V_NRSEQITPROD;
                              OUT_RECORD.CDARVPROD      := V_CDARVPROD;
                              OUT_RECORD.NMPRODUTO      := V_NMPRODUTO;
                              OUT_RECORD.NRSEQCONSISTE  := V_TRAVA;
                              OUT_RECORD.DSCONSISTENCIA := V_DESC;
                              OUT_RECORD.CDREGRAIT      := V_CDREGRAIT;
                              PIPE ROW (OUT_RECORD);
                           END IF;
                           IF C_IMP.CDNATUBCALPCIT <> V_CDNATUBCALPCIT THEN
                              V_TRAVA       := 'ERRONTCOF';
                              V_DESC        := 'A natureza da base de calculo do PIS e do COFINS devem ser iguais.';
                              V_CDIMPOSTO   := C_IMP.CDIMPOSTO;
                              V_NRSEQITPROD := C_ITEM.NRSEQITPROD;
                              V_CDARVPROD   := C_ITEM.CDARVPROD;
                              V_NMPRODUTO   := C_ITEM.NMPRODUTO;
                              V_CDREGRAIT   := C_IMP.CDREGRAIT;

                              OUT_RECORD.CDIMPOSTO      := V_CDIMPOSTO;
                              OUT_RECORD.NRSEQITPROD    := V_NRSEQITPROD;
                              OUT_RECORD.CDARVPROD      := V_CDARVPROD;
                              OUT_RECORD.NMPRODUTO      := V_NMPRODUTO;
                              OUT_RECORD.NRSEQCONSISTE  := V_TRAVA;
                              OUT_RECORD.DSCONSISTENCIA := V_DESC;
                              OUT_RECORD.CDREGRAIT      := V_CDREGRAIT;
                              PIPE ROW (OUT_RECORD);
                           END IF;
                           IF C_IMP.IDIMPORECUP <> V_IDIMPORECUP THEN
                              V_TRAVA       := 'ERRORECCOF';
                              V_DESC        := 'Os impostos PIS e COFINS devem ter o mesmo tratamento de recuperacao de impostos.';
                              V_CDIMPOSTO   := C_IMP.CDIMPOSTO;
                              V_NRSEQITPROD := C_ITEM.NRSEQITPROD;
                              V_CDARVPROD   := C_ITEM.CDARVPROD;
                              V_NMPRODUTO   := C_ITEM.NMPRODUTO;
                              V_CDREGRAIT   := C_IMP.CDREGRAIT;

                              OUT_RECORD.CDIMPOSTO      := V_CDIMPOSTO;
                              OUT_RECORD.NRSEQITPROD    := V_NRSEQITPROD;
                              OUT_RECORD.CDARVPROD      := V_CDARVPROD;
                              OUT_RECORD.NMPRODUTO      := V_NMPRODUTO;
                              OUT_RECORD.NRSEQCONSISTE  := V_TRAVA;
                              OUT_RECORD.DSCONSISTENCIA := V_DESC;
                              OUT_RECORD.CDREGRAIT      := V_CDREGRAIT;
                              PIPE ROW (OUT_RECORD);
                           END IF;
                        END IF;
                     END IF;
                  END IF;

                  IF (C_IMP.CDIMPOSTONFE = '60') THEN
                     SELECT COUNT(*)
                       INTO V_COUNT
                       FROM ITEMPROIMPOS II, IMPOSTO I
                      WHERE II.CDFILIAL = P_CDFILIAL
                        AND II.NRLANCTONF = P_NRLANCTONF
                        AND II.NRSEQITPROD = C_ITEM.NRSEQITPROD
                        AND II.CDIMPOSTO = I.CDIMPOSTO
                        AND I.CDIMPOSTONFE = '50';

                     IF V_COUNT = 1 THEN
                        SELECT II.CDIMPOSTO, COUNT(1), SUM(VRBASECALCIT), MAX(CDSITUTRIBITNFE), MAX(CDTPCREDPICOITE), MAX(CDNATUBCALPCIT), MAX(IDIMPORECUP)
                          INTO V_PIS,  V_COUNT,  V_VRBASECALCIT,    V_CDSITUTRIBITNFE,    V_CDTPCREDPICOITE,    V_CDNATUBCALPCIT, V_IDIMPORECUP
                          FROM ITEMPROIMPOS II, IMPOSTO I
                         WHERE II.CDFILIAL = P_CDFILIAL
                           AND II.NRLANCTONF = P_NRLANCTONF
                           AND II.NRSEQITPROD = C_ITEM.NRSEQITPROD
                           AND II.CDIMPOSTO = I.CDIMPOSTO
                           AND I.CDIMPOSTONFE = '50'
                        GROUP BY II.CDIMPOSTO
                        HAVING COUNT(1) = 1;

                        IF (V_PIS IS NULL) THEN
                           V_TRAVA       := 'ERROPIS';
                           V_DESC        := 'Deve haver incidencia de ambos os impostos PIS e COFINS.';
                           V_CDIMPOSTO   := C_IMP.CDIMPOSTO;
                           V_NRSEQITPROD := C_ITEM.NRSEQITPROD;
                           V_CDARVPROD   := C_ITEM.CDARVPROD;
                           V_NMPRODUTO   := C_ITEM.NMPRODUTO;
                           V_CDREGRAIT   := C_IMP.CDREGRAIT;

                           OUT_RECORD.CDIMPOSTO      := V_CDIMPOSTO;
                           OUT_RECORD.NRSEQITPROD    := V_NRSEQITPROD;
                           OUT_RECORD.CDARVPROD      := V_CDARVPROD;
                           OUT_RECORD.NMPRODUTO      := V_NMPRODUTO;
                           OUT_RECORD.NRSEQCONSISTE  := V_TRAVA;
                           OUT_RECORD.DSCONSISTENCIA := V_DESC;
                           OUT_RECORD.CDREGRAIT      := V_CDREGRAIT;
                           PIPE ROW (OUT_RECORD);
                        ELSE
                           IF C_IMP.VRBASECALCIT <> V_VRBASECALCIT THEN
                              V_TRAVA       := 'ERROBCPIS';
                              V_DESC        := 'A base de calculo do PIS e do COFINS devem ser iguais.';
                              V_CDIMPOSTO   := C_IMP.CDIMPOSTO;
                              V_NRSEQITPROD := C_ITEM.NRSEQITPROD;
                              V_CDARVPROD   := C_ITEM.CDARVPROD;
                              V_NMPRODUTO   := C_ITEM.NMPRODUTO;
                              V_CDREGRAIT   := C_IMP.CDREGRAIT;

                              OUT_RECORD.CDIMPOSTO      := V_CDIMPOSTO;
                              OUT_RECORD.NRSEQITPROD    := V_NRSEQITPROD;
                              OUT_RECORD.CDARVPROD      := V_CDARVPROD;
                              OUT_RECORD.NMPRODUTO      := V_NMPRODUTO;
                              OUT_RECORD.NRSEQCONSISTE  := V_TRAVA;
                              OUT_RECORD.DSCONSISTENCIA := V_DESC;
                              OUT_RECORD.CDREGRAIT      := V_CDREGRAIT;
                              PIPE ROW (OUT_RECORD);
                           END IF;
                           IF C_IMP.CDSITUTRIBITNFE <> V_CDSITUTRIBITNFE THEN
                              V_TRAVA       := 'ERROCSTPIS';
                              V_DESC        := 'A situacao tributaria do PIS e do COFINS devem ser iguais.';
                              V_CDIMPOSTO   := C_IMP.CDIMPOSTO;
                              V_NRSEQITPROD := C_ITEM.NRSEQITPROD;
                              V_CDARVPROD   := C_ITEM.CDARVPROD;
                              V_NMPRODUTO   := C_ITEM.NMPRODUTO;
                              V_CDREGRAIT   := C_IMP.CDREGRAIT;

                              OUT_RECORD.CDIMPOSTO      := V_CDIMPOSTO;
                              OUT_RECORD.NRSEQITPROD    := V_NRSEQITPROD;
                              OUT_RECORD.CDARVPROD      := V_CDARVPROD;
                              OUT_RECORD.NMPRODUTO      := V_NMPRODUTO;
                              OUT_RECORD.NRSEQCONSISTE  := V_TRAVA;
                              OUT_RECORD.DSCONSISTENCIA := V_DESC;
                              OUT_RECORD.CDREGRAIT      := V_CDREGRAIT;
                              PIPE ROW (OUT_RECORD);
                           END IF;
                           IF C_IMP.CDTPCREDPICOITE <> V_CDTPCREDPICOITE THEN
                              V_TRAVA       := 'ERROTPPIS';
                              V_DESC        := 'O tipo de credito do PIS e do COFINS devem ser iguais.';
                              V_CDIMPOSTO   := C_IMP.CDIMPOSTO;
                              V_NRSEQITPROD := C_ITEM.NRSEQITPROD;
                              V_CDARVPROD   := C_ITEM.CDARVPROD;
                              V_NMPRODUTO   := C_ITEM.NMPRODUTO;
                              V_CDREGRAIT   := C_IMP.CDREGRAIT;

                              OUT_RECORD.CDIMPOSTO      := V_CDIMPOSTO;
                              OUT_RECORD.NRSEQITPROD    := V_NRSEQITPROD;
                              OUT_RECORD.CDARVPROD      := V_CDARVPROD;
                              OUT_RECORD.NMPRODUTO      := V_NMPRODUTO;
                              OUT_RECORD.NRSEQCONSISTE  := V_TRAVA;
                              OUT_RECORD.DSCONSISTENCIA := V_DESC;
                              OUT_RECORD.CDREGRAIT      := V_CDREGRAIT;
                              PIPE ROW (OUT_RECORD);
                           END IF;
                           IF C_IMP.CDNATUBCALPCIT <> V_CDNATUBCALPCIT THEN
                              V_TRAVA := 'ERRONTPIS';
                              V_DESC  := 'A natureza da base de calculo do PIS e do COFINS devem ser iguais.';
                              V_CDIMPOSTO := C_IMP.CDIMPOSTO;
                              V_NRSEQITPROD := C_ITEM.NRSEQITPROD;
                              V_CDARVPROD   := C_ITEM.CDARVPROD;
                              V_NMPRODUTO   := C_ITEM.NMPRODUTO;
                              V_CDREGRAIT   := C_IMP.CDREGRAIT;

                              OUT_RECORD.CDIMPOSTO      := V_CDIMPOSTO;
                              OUT_RECORD.NRSEQITPROD    := V_NRSEQITPROD;
                              OUT_RECORD.CDARVPROD      := V_CDARVPROD;
                              OUT_RECORD.NMPRODUTO      := V_NMPRODUTO;
                              OUT_RECORD.NRSEQCONSISTE  := V_TRAVA;
                              OUT_RECORD.DSCONSISTENCIA := V_DESC;
                              OUT_RECORD.CDREGRAIT      := V_CDREGRAIT;
                              PIPE ROW (OUT_RECORD);
                           END IF;
                           IF C_IMP.IDIMPORECUP <> V_IDIMPORECUP THEN
                              V_TRAVA := 'ERRORECPIS';
                              V_DESC  := 'Os impostos PIS e COFINS devem ter o mesmo tratamento de recuperacao de impostos.';
                              V_CDIMPOSTO := C_IMP.CDIMPOSTO;
                              V_NRSEQITPROD := C_ITEM.NRSEQITPROD;
                              V_CDARVPROD   := C_ITEM.CDARVPROD;
                              V_NMPRODUTO   := C_ITEM.NMPRODUTO;
                              V_CDREGRAIT   := C_IMP.CDREGRAIT;

                              OUT_RECORD.CDIMPOSTO      := V_CDIMPOSTO;
                              OUT_RECORD.NRSEQITPROD    := V_NRSEQITPROD;
                              OUT_RECORD.CDARVPROD      := V_CDARVPROD;
                              OUT_RECORD.NMPRODUTO      := V_NMPRODUTO;
                              OUT_RECORD.NRSEQCONSISTE  := V_TRAVA;
                              OUT_RECORD.DSCONSISTENCIA := V_DESC;
                              OUT_RECORD.CDREGRAIT      := V_CDREGRAIT;
                              PIPE ROW (OUT_RECORD);
                           END IF;
                        END IF;
                     END IF;
                  END IF;

                  IF (C_IMP.CDNATUBCALPCIT IS NOT NULL) AND (C_IMP.CDFISCOPERIT IS NOT NULL) AND (V_IDENTRSAIDOP = 'E') THEN

                     SELECT COUNT(1)
                       INTO V_COUNT
                       FROM NATUBCALCCFOP
                      WHERE CDFISCOPER = C_IMP.CDFISCOPERIT
                        AND CDNATUBCPCSTNFE = C_IMP.CDNATUBCALPCIT;
                     IF NOT(V_COUNT > 0) THEN
                        V_TRAVA       := 'ERRONTCFOP';
                        V_DESC        := 'CFOP do item nao corresponde a natureza da base de calculo.Consulte a tela:  Natureza da base de calculo por CFOP';
                        V_CDIMPOSTO   := C_IMP.CDIMPOSTO;
                        V_NRSEQITPROD := C_ITEM.NRSEQITPROD;
                        V_CDARVPROD   := C_ITEM.CDARVPROD;
                        V_NMPRODUTO   := C_ITEM.NMPRODUTO;
                        V_CDREGRAIT   := C_IMP.CDREGRAIT;

                        OUT_RECORD.CDIMPOSTO      := V_CDIMPOSTO;
                        OUT_RECORD.NRSEQITPROD    := V_NRSEQITPROD;
                        OUT_RECORD.CDARVPROD      := V_CDARVPROD;
                        OUT_RECORD.NMPRODUTO      := V_NMPRODUTO;
                        OUT_RECORD.NRSEQCONSISTE  := V_TRAVA;
                        OUT_RECORD.DSCONSISTENCIA := V_DESC;
                        OUT_RECORD.CDREGRAIT      := V_CDREGRAIT;
                        PIPE ROW (OUT_RECORD);
                     END IF;
                  END IF;
               END IF;
            END IF;
         END LOOP;
      END LOOP;
   END IF;
END;
/