CREATE OR REPLACE PROCEDURE INC_FORN_COTA (P_CDFILIAL    IN COLETAPR.CDFILIAL%TYPE,
                                           P_NRCOLEPRECO IN COLETAPR.NRCOLEPRECO%TYPE,
                                           P_CDFORNECED  IN ITEMCOLE.CDFORNECED%TYPE,
                                           P_CDOPERSIS   IN OPERADOR.CDOPERADOR%TYPE,
                                           P_TREGIAO     IN VARCHAR2,
                                           P_CDFORNCARG  IN ITEMCOLE.CDFORNECED%TYPE,
                                           P_CDREGCARG   IN ITEMCOLE.CDREGIAO%TYPE,
                                           P_IDERRO      OUT VARCHAR2) IS
   
   V_VRPRECUNIITM  ITEMCOLE.VRPRECUNIITM%TYPE;
   V_VRPREDESITM   FORNECEDOR.VRPEDESCFORN%TYPE;
   R_PARASUPRI     PARASUPRI%ROWTYPE;
   R_FORNECEDOR    FORNECEDOR%ROWTYPE;
          
   V_CDEMPRESA     VARCHAR2(4);
   V_CDINSCMUNI    EMPRESA.CDINSCMUNI%TYPE;
   V_CDINSCESTA    EMPRESA.CDINSCESTA%TYPE;

   V_PGTO_CDFORMPGTO   PRODFORN.CDFORMPGTO%TYPE;
   V_PGTO_IDTPFORPGPRF PRODFORN.IDTPFORPGPRF%TYPE;
   V_PGTO_NRPARCPGTPRF PRODFORN.NRPARCPGTPRF%TYPE;
   V_PGTO_NRDIAPGFIPRF PRODFORN.NRDIAPGFIPRF%TYPE;
   V_PGTO_IDUTDIAPGPRF PRODFORN.IDUTDIAPGPRF%TYPE;

   V_PGTO_IDTPFORPGTFO FORNECEDOR.IDTPFORPGTFO%TYPE;
   V_PGTO_NRPARCPGTOFO FORNECEDOR.NRPARCPGTOFO%TYPE;
   V_PGTO_NRDIAPGFIXFO FORNECEDOR.NRDIAPGFIXFO%TYPE;
   V_PGTO_IDUTDIAPGTFO FORNECEDOR.IDUTDIAPGTFO%TYPE;
   V_PGTO_IDTPDESCFORN FORNECEDOR.IDTPDESCFORN%TYPE;
   V_PGTO_VRPEDESCFORN FORNECEDOR.VRPEDESCFORN%TYPE;
   V_PGTO_IDTPFRETFORN FORNECEDOR.IDTPFRETFORN%TYPE;

   V_COUNT         FLOAT;
   V_ROWS_AFFECTED FLOAT;
   
   PROCEDURE DELETE_LOGERROCOTA(P_CDFILIAL    IN VARCHAR2,
                                P_NRCOLEPRECO IN VARCHAR2) IS
   BEGIN
      DELETE FROM LOGERROCOTA
	    WHERE CDFILIAL = P_CDFILIAL
	      AND NRCOLEPRECO = P_NRCOLEPRECO;
   END DELETE_LOGERROCOTA;
   
   PROCEDURE INSERT_LOGERROCOTA(P_CDFILIAL    IN VARCHAR2,
                                P_NRCOLEPRECO IN VARCHAR2,
                                P_CDFORNECED  IN VARCHAR2,
                                P_CDREGIAO    IN VARCHAR2,
                                P_CDPRODUTO   IN VARCHAR2,
                                P_CDMARCA     IN VARCHAR2,
                                P_DSERRO      IN VARCHAR2) IS
   BEGIN
      INSERT INTO LOGERROCOTA (NRLOGERROCOTA,
                               CDFILIAL,
                               NRCOLEPRECO,
                               CDFORNECED, 
                               CDREGIAO,
                               CDPRODUTO,
                               CDMARCA,
                               DSERRO)
                       VALUES (SEQ_LOGERROCOTA.NEXTVAL,
                               P_CDFILIAL,
                               P_NRCOLEPRECO,
                               P_CDFORNECED,
                               P_CDREGIAO,
                               P_CDPRODUTO,
                               P_CDMARCA,
                               P_DSERRO);
   END INSERT_LOGERROCOTA;


BEGIN
   P_IDERRO := '000';
   V_ROWS_AFFECTED := 0;
   
   DELETE_LOGERROCOTA(P_CDFILIAL, P_NRCOLEPRECO);
   
   SELECT *
     INTO R_PARASUPRI
     FROM PARASUPRI
    WHERE PARASUPRI.CDFILIAL = P_CDFILIAL;
    
   SELECT *
     INTO R_FORNECEDOR       
     FROM FORNECEDOR
    WHERE FORNECEDOR.CDFORNECED = P_CDFORNECED;
    
   V_VRPREDESITM := 0;
   IF R_FORNECEDOR.IDTPDESCFORN = 'C' THEN
      V_VRPREDESITM := R_FORNECEDOR.VRPEDESCFORN;
   END IF;
   
   FOR C_REGIAO IN (SELECT REGIAO.CDREGIAO
                      FROM REGIAO
                     WHERE EXISTS (SELECT 1
                                     FROM REGIAO RG
                                    WHERE REGIAO.CDREGIAO = RG.CDREGIAO
                                      AND P_TREGIAO = 'S'
                                    UNION ALL
                                   SELECT 1
                                     FROM ITEMCOLE
                                    WHERE REGIAO.CDREGIAO = ITEMCOLE.CDREGIAO
                                      AND CDFILIAL    = P_CDFILIAL
                                      AND NRCOLEPRECO = P_NRCOLEPRECO
                                      AND P_TREGIAO = 'N')
                       AND NOT EXISTS (SELECT 1
                                         FROM ITEMCOLE
                                        WHERE ITEMCOLE.CDREGIAO = REGIAO.CDREGIAO
                                          AND CDFILIAL    = P_CDFILIAL
                                          AND NRCOLEPRECO = P_NRCOLEPRECO
                                          AND CDFORNECED  = R_FORNECEDOR.CDFORNECED)
                       AND NOT EXISTS (SELECT 1
                                         FROM REFOREG
                                        WHERE REFOREG.CDFORNECED = R_FORNECEDOR.CDFORNECED
                                          AND REFOREG.CDREGIAO   = REGIAO.CDREGIAO))
   LOOP
      FOR C_INCLUI IN (SELECT PRODUTO.CDPRODUTO,
                              PRODUTO.CDARVPROD,
                              MARCA.CDMARCA,
                              COLETAPR.CDFILIAL,
                              COLETAPR.NRCOLEPRECO,
                              COLETAPR.DTINIVALCOL,
                              COLETAPR.DTFINVALCOL,
                              COLETAPR.DTCOLEPREC
                         FROM PRODUTO, MARCA, COLETAPR
                        WHERE EXISTS (SELECT 1
                                        FROM ITEMCOLE
                                       WHERE ITEMCOLE.CDFILIAL    = P_CDFILIAL
                                         AND ITEMCOLE.NRCOLEPRECO = P_NRCOLEPRECO
                                         AND ITEMCOLE.CDPRODUTO   = PRODUTO.CDPRODUTO
                                         AND ITEMCOLE.CDMARCA     = MARCA.CDMARCA
                                         AND ITEMCOLE.CDFILIAL    = COLETAPR.CDFILIAL
                                         AND ITEMCOLE.NRCOLEPRECO = COLETAPR.NRCOLEPRECO))
      LOOP
         SELECT NVL(MIN(VRPRECUNIITM), 0)
           INTO V_VRPRECUNIITM
           FROM ITEMCOLE
          WHERE CDFILIAL    = C_INCLUI.CDFILIAL
            AND NRCOLEPRECO = C_INCLUI.NRCOLEPRECO
            AND CDPRODUTO   = C_INCLUI.CDPRODUTO
            AND CDMARCA     = C_INCLUI.CDMARCA
            AND CDFORNECED  = NVL(P_CDFORNCARG, CDFORNECED)
            AND CDREGIAO    = NVL(P_CDREGCARG, CDREGIAO)
            AND (P_CDFORNCARG IS NOT NULL OR P_CDREGCARG IS NOT NULL);
         
         SELECT COUNT(*)
           INTO V_COUNT
           FROM QFOPRODFORN
          WHERE QFOPRODFORN.CDPRODUTO = C_INCLUI.CDPRODUTO
            AND QFOPRODFORN.CDFORNECED = R_FORNECEDOR.CDFORNECED
            AND ((QFOPRODFORN.IDFORNAPROV = 'N' AND QFOPRODFORN.IDFORNAUTOR = 'N') OR
                 ((QFOPRODFORN.IDFORNAPROV = 'S') AND ((R_PARASUPRI.IDULTIDTVALQ = 'M' AND C_INCLUI.DTCOLEPREC > LAST_DAY(QFOPRODFORN.DTVALPRFORN)) OR
                                                       (R_PARASUPRI.IDULTIDTVALQ = 'D' AND C_INCLUI.DTCOLEPREC > QFOPRODFORN.DTVALPRFORN))));
         IF V_COUNT > 0 THEN
            P_IDERRO := SUBSTR(P_IDERRO, 1, 1)||'1'||SUBSTR(P_IDERRO, 3, 1);
            INSERT_LOGERROCOTA(C_INCLUI.CDFILIAL, 
                               C_INCLUI.NRCOLEPRECO,
                               R_FORNECEDOR.CDFORNECED,
                               C_REGIAO.CDREGIAO,
                               C_INCLUI.CDPRODUTO,
                               C_INCLUI.CDMARCA,
                               'FORN_N_QUAL_PROD');
         ELSE
            SELECT COUNT(*)
              INTO V_COUNT
              FROM PRODFORNCOMP
             WHERE PRODFORNCOMP.CDFORNECED = R_FORNECEDOR.CDFORNECED
               AND PRODFORNCOMP.CDPRODCOMPL = C_INCLUI.CDPRODUTO;
            
            IF V_COUNT = 0 THEN
               P_IDERRO := SUBSTR(P_IDERRO, 1, 2)||'1';
               INSERT_LOGERROCOTA(C_INCLUI.CDFILIAL, 
                                  C_INCLUI.NRCOLEPRECO,
                                  R_FORNECEDOR.CDFORNECED,
                                  C_REGIAO.CDREGIAO,
                                  C_INCLUI.CDPRODUTO,
                                  C_INCLUI.CDMARCA,
                                  'FORN_N_CAD_PROD');
            ELSE
               V_ROWS_AFFECTED := V_ROWS_AFFECTED + 1;

               INSERT INTO ITEMCOLE (CDFILIAL,
                                     NRCOLEPRECO,
                                     CDFORNECED,
                                     CDREGIAO,
                                     CDPRODUTO,
                                     CDMARCA,
                                     VRPRECUNIITM,
                                     DTINIVALITM,
                                     DTFINVALITM,
                                     VRPERDESITM,
                                     IDTIPFREITM,
                                     IDITMCOTPREC,
                                     CDOPERINCL,
                                     DTINCLITMCOL)
                             VALUES (C_INCLUI.CDFILIAL,
                                     C_INCLUI.NRCOLEPRECO,
                                     R_FORNECEDOR.CDFORNECED,
                                     C_REGIAO.CDREGIAO,
                                     C_INCLUI.CDPRODUTO,
                                     C_INCLUI.CDMARCA,
                                     V_VRPRECUNIITM,
                                     C_INCLUI.DTINIVALCOL,
                                     C_INCLUI.DTFINVALCOL,
                                     V_VRPREDESITM,
                                     R_FORNECEDOR.IDTPFRETFORN,
                                     'S',
                                     P_CDOPERSIS,
                                     SYSDATE);
               IF V_VRPRECUNIITM > 0 THEN
                  SELECT SUBSTR(EMITENTE(C_INCLUI.CDFILIAL, C_INCLUI.CDPRODUTO, R_FORNECEDOR.CDFORNECED), 3, 2) CDEMPRESA
                    INTO V_CDEMPRESA
                    FROM DUAL;
                  
                  SELECT MAX(EMPRESA.CDEMPRESA), 
                         MIN(INSCRMUNICIP.CDINSCMUNI),
                         MIN(INSCRESTAD.CDINSCESTA)
                    INTO V_CDEMPRESA, V_CDINSCMUNI, V_CDINSCESTA
                    FROM EMPRESA INNER JOIN INSCRMUNICIP ON EMPRESA.CDEMPRESA = INSCRMUNICIP.CDEMPRESA
                                 INNER JOIN INSCRESTAD ON EMPRESA.CDEMPRESA = INSCRESTAD.CDEMPRESA
                   WHERE EMPRESA.CDEMPRESA = V_CDEMPRESA;

                  IMPOSTO_ITEMCOL(V_CDEMPRESA,
                                  V_CDINSCESTA,
                                  R_FORNECEDOR.CDFORNECED,
                                  C_INCLUI.CDFILIAL,
                                  C_INCLUI.NRCOLEPRECO,
                                  R_FORNECEDOR.CDFORNECED,
                                  C_REGIAO.CDREGIAO,
                                  C_INCLUI.CDPRODUTO,
                                  C_INCLUI.CDMARCA,
                                  C_INCLUI.DTCOLEPREC);

                  SELECT MAX(PRODFORN.CDFORMPGTO),
                         MAX(PRODFORN.IDTPFORPGPRF),
                         MAX(PRODFORN.NRPARCPGTPRF),
                         MAX(PRODFORN.NRDIAPGFIPRF),
                         MAX(PRODFORN.IDUTDIAPGPRF)
                    INTO V_PGTO_CDFORMPGTO,
                         V_PGTO_IDTPFORPGPRF,
                         V_PGTO_NRPARCPGTPRF,
                         V_PGTO_NRDIAPGFIPRF,
                         V_PGTO_IDUTDIAPGPRF  
                    FROM PRODFORN
                   WHERE PRODFORN.CDFORNECED = R_FORNECEDOR.CDFORNECED
                     AND PRODFORN.CDPRODUTO = (SELECT CDPRODUTO 
                                                 FROM PRODFORNCOMP
                                                WHERE PRODFORNCOMP.CDPRODCOMPL = C_INCLUI.CDPRODUTO
                                                  AND CDFORNECED = R_FORNECEDOR.CDFORNECED
                                                  AND ROWNUM = 1);                                          

                  IF V_PGTO_IDTPFORPGPRF IS NULL THEN
                     V_PGTO_CDFORMPGTO   := R_FORNECEDOR.CDFORMPGTO;
                     V_PGTO_IDTPFORPGTFO := R_FORNECEDOR.IDTPFORPGTFO;
                     V_PGTO_NRPARCPGTOFO := R_FORNECEDOR.NRPARCPGTOFO;
                     V_PGTO_NRDIAPGFIXFO := R_FORNECEDOR.NRDIAPGFIXFO;
                     V_PGTO_IDUTDIAPGTFO := R_FORNECEDOR.IDUTDIAPGTFO;
                     V_PGTO_IDTPDESCFORN := R_FORNECEDOR.IDTPDESCFORN;
                     V_PGTO_VRPEDESCFORN := R_FORNECEDOR.VRPEDESCFORN;
                     V_PGTO_IDTPFRETFORN := R_FORNECEDOR.IDTPFRETFORN;
                    
                     UPDATE ITEMCOLE 
                        SET CDFORMPGTO   = V_PGTO_CDFORMPGTO,
                            IDTPFOPGTCOL = V_PGTO_IDTPFORPGTFO,
                            NRDIAPGFXCOL = V_PGTO_NRDIAPGFIXFO,
                            NRPARCPGTCOL = V_PGTO_NRPARCPGTOFO,
                            IDUTDIAPGCOL = V_PGTO_IDUTDIAPGTFO
                      WHERE CDFILIAL    = C_INCLUI.CDFILIAL
                        AND NRCOLEPRECO = C_INCLUI.NRCOLEPRECO
                        AND CDPRODUTO   = C_INCLUI.CDPRODUTO
                        AND CDMARCA     = C_INCLUI.CDMARCA
                        AND CDFORNECED  = R_FORNECEDOR.CDFORNECED
                        AND CDREGIAO    = C_REGIAO.CDREGIAO;
                    
                     IF V_PGTO_IDTPFORPGTFO = 'V' THEN
                        INSERT INTO PZOPGTITMCOL (CDFILIAL, 
                                                  NRCOLEPRECO,
                                                  CDFORNECED,
                                                  CDPRODUTO,
                                                  CDMARCA,
                                                  CDREGIAO,
                                                  NRDIASPGTCOL,
                                                  VRPERCPGTCOL)
                                           SELECT C_INCLUI.CDFILIAL,
                                                  C_INCLUI.NRCOLEPRECO,
                                                  R_FORNECEDOR.CDFORNECED,
                                                  C_INCLUI.CDPRODUTO,
                                                  C_INCLUI.CDMARCA,
                                                  C_REGIAO.CDREGIAO,
                                                  PRAZOPGTFORN.NRDIASPGTOFO,
                                                  PRAZOPGTFORN.VRPERCPGTOFO
                                             FROM PRAZOPGTFORN
                                            WHERE PRAZOPGTFORN.CDFORNECED = R_FORNECEDOR.CDFORNECED;
                     END IF;
                  ELSE
                     UPDATE ITEMCOLE
                        SET CDFORMPGTO   = V_PGTO_CDFORMPGTO,
                            IDTPFOPGTCOL = V_PGTO_IDTPFORPGPRF,
                            NRDIAPGFXCOL = V_PGTO_NRDIAPGFIPRF,
                            NRPARCPGTCOL = V_PGTO_NRPARCPGTPRF,
                            IDUTDIAPGCOL = V_PGTO_IDUTDIAPGPRF
                      WHERE CDFILIAL    = C_INCLUI.CDFILIAL
                        AND NRCOLEPRECO = C_INCLUI.NRCOLEPRECO 
                        AND CDPRODUTO   = C_INCLUI.CDPRODUTO  
                        AND CDMARCA     = C_INCLUI.CDMARCA    
                        AND CDFORNECED  = R_FORNECEDOR.CDFORNECED 
                        AND CDREGIAO    = C_REGIAO.CDREGIAO;
                     
                     IF V_PGTO_IDTPFORPGPRF = 'V' THEN
                        INSERT INTO PZOPGTITMCOL (CDFILIAL, 
                                                  NRCOLEPRECO, 
                                                  CDFORNECED, 
                                                  CDPRODUTO,
                                                  CDMARCA, 
                                                  CDREGIAO,
                                                  NRDIASPGTCOL,
                                                  VRPERCPGTCOL)
                                           SELECT C_INCLUI.CDFILIAL,
                                                  C_INCLUI.NRCOLEPRECO,
                                                  R_FORNECEDOR.CDFORNECED,
                                                  C_INCLUI.CDPRODUTO,
                                                  C_INCLUI.CDMARCA,
                                                  C_REGIAO.CDREGIAO,
                                                  PZOPGTPRFO.NRDIASPGPRFO,
                                                  PZOPGTPRFO.VRPERCPGPRFO
                                             FROM PZOPGTPRFO INNER JOIN PRODUTO ON PZOPGTPRFO.CDPRODUTO  = PRODUTO.CDPRODUTO
                                            WHERE PZOPGTPRFO.CDFORNECED = R_FORNECEDOR.CDFORNECED 
                                              AND C_INCLUI.CDARVPROD LIKE PRODUTO.CDARVPROD || '%';
                     END IF;
                  END IF;

                  UPDATE ITEMCOLE 
                     SET IDTPFOPGTCOL = IDTPFOPGTCOL
                   WHERE CDFILIAL    = C_INCLUI.CDFILIAL
                     AND NRCOLEPRECO = C_INCLUI.NRCOLEPRECO
                     AND CDPRODUTO   = C_INCLUI.CDPRODUTO
                     AND CDMARCA     = C_INCLUI.CDMARCA
                     AND CDFORNECED  = R_FORNECEDOR.CDFORNECED
                     AND CDREGIAO    = C_REGIAO.CDREGIAO;

                  COMMIT;
               END IF;
            END IF;
         END IF;      
      END LOOP;
   END LOOP;   
   IF V_ROWS_AFFECTED <> 0 THEN
      IF INSTR(P_IDERRO, '1') <> 0 THEN
         IF SUBSTR(P_IDERRO, 1, 1) = 1 THEN
            P_IDERRO := '2'||SUBSTR(P_IDERRO, 2, 2);
         END IF;
         IF SUBSTR(P_IDERRO, 2, 1) = 1 THEN
            P_IDERRO := SUBSTR(P_IDERRO, 1, 1)||'2'||SUBSTR(P_IDERRO, 3, 1);
         END IF;
         IF SUBSTR(P_IDERRO, 3, 1) = 1 THEN
            P_IDERRO := SUBSTR(P_IDERRO, 1, 2)||'2';
         END IF;
      ELSE
         P_IDERRO := '000';
      END IF;
   END IF;
END;
/