CREATE OR REPLACE
PROCEDURE IMP_AUTOFORNE_MOBILE(P_NRAUTOFORNE_MOBILE   IN NUMBER,
                               P_CDFILLANC            IN VARCHAR2 DEFAULT NULL)
IS
  V_CDFORNECED       FORNECEDOR.CDFORNECED%TYPE;
  V_CDFORMPGTO       FORNECEDOR.CDFORMPGTO%TYPE;
  V_IDTPFORPGTFO     FORNECEDOR.IDTPFORPGTFO%TYPE;
  V_NRDIAPGFIXFO     FORNECEDOR.NRDIAPGFIXFO%TYPE;
  V_NRPARCPGTOFO     FORNECEDOR.NRPARCPGTOFO%TYPE;
  V_IDUTDIAPGTFO     FORNECEDOR.IDUTDIAPGTFO%TYPE;
  V_IDGERAFDTENT     FORNECEDOR.IDGERAFDTENT%TYPE;
  V_CDTPCTPAGAR      FORNECEDOR.CDTPCTPAGAR%TYPE;
  V_CDTIPCOB         FORNECEDOR.CDTIPCOB%TYPE;
  V_IDTPFRETFORN     FORNECEDOR.IDTPFRETFORN%TYPE;
  V_CHAVE_LOOP       VARCHAR2(100) := '_';
  V_NRAUTOFORN       AUTOFORNE.NRAUTOFORN%TYPE;
  V_CDFILLANC        AUTOFORNE.CDFILLANC%TYPE;
  V_CDFILDEST        AUTOFORNE.CDFILDEST%TYPE;
  V_CDFILCENTCMP     FILIAL.CDFILCENTCMP%TYPE;
  V_AUTOFORNE        VARCHAR2(20);
  V_CDINSCESTA       ALIQUOTA.CDINSCESTA%TYPE;
  V_CDEMPRESA        EMPRESA.CDEMPRESA%TYPE;
  CONTA_ITEMAUTF     INTEGER;
  V_CHAVE_AF         VARCHAR2(2000);
  V_CHAVE_AF2        VARCHAR2(2000);
  V_CHAVE_AF3        VARCHAR2(2000);
BEGIN
   FOR C_AUTOFORNE IN (SELECT AUTOFORNE_MOBILE.CDOPERADOR, FORNECEDOR.CDFORNECED, FORNECEDOR.NRINSJURFORN, AUTOFORNE_MOBILE.CDFILDEST,
                              TO_DATE(AUTOFORNE_MOBILE.DTPROGENTAF, 'DD/MM/YYYY') DTPROGENTAF,
                              NVL(AUTOFORNE_MOBILE.USR_NRAUTOFORN, 'X') USR_NRAUTOFORN
                         FROM AUTOFORNE_MOBILE, FORNECEDOR
                        WHERE AUTOFORNE_MOBILE.NRAUTOFORNE_MOBILE = P_NRAUTOFORNE_MOBILE
                          AND AUTOFORNE_MOBILE.CDFORNECED         = FORNECEDOR.NRINSJURFORN
                        GROUP BY AUTOFORNE_MOBILE.CDOPERADOR, FORNECEDOR.CDFORNECED, FORNECEDOR.NRINSJURFORN, AUTOFORNE_MOBILE.CDFILDEST,
                              NVL(AUTOFORNE_MOBILE.USR_NRAUTOFORN, 'X'), TO_DATE(AUTOFORNE_MOBILE.DTPROGENTAF, 'DD/MM/YYYY')
                        ORDER BY AUTOFORNE_MOBILE.CDOPERADOR, FORNECEDOR.CDFORNECED, FORNECEDOR.NRINSJURFORN, AUTOFORNE_MOBILE.CDFILDEST,
                              NVL(AUTOFORNE_MOBILE.USR_NRAUTOFORN, 'X'), TO_DATE(AUTOFORNE_MOBILE.DTPROGENTAF, 'DD/MM/YYYY'))
   LOOP

      SELECT MAX(CDFORNECED), MAX(CDFORMPGTO), MAX(IDTPFORPGTFO), MAX(NRDIAPGFIXFO), MAX(NRPARCPGTOFO),
             MAX(IDUTDIAPGTFO), MAX(IDGERAFDTENT), MAX(CDTPCTPAGAR), MAX(CDTIPCOB), MAX(IDTPFRETFORN)
        INTO V_CDFORNECED, V_CDFORMPGTO, V_IDTPFORPGTFO, V_NRDIAPGFIXFO, V_NRPARCPGTOFO,
             V_IDUTDIAPGTFO, V_IDGERAFDTENT, V_CDTPCTPAGAR, V_CDTIPCOB, V_IDTPFRETFORN
        FROM FORNECEDOR
       WHERE CDFORNECED = C_AUTOFORNE.CDFORNECED;

      SELECT MAX(NVL(CDFILCENTCMP, CDFILIAL)), MAX(CDEMPRESA)
        INTO V_CDFILCENTCMP, V_CDEMPRESA
        FROM FILIAL
       WHERE CDFILIAL = C_AUTOFORNE.CDFILDEST;

      SELECT MAX(CDINSCESTA)
        INTO V_CDINSCESTA
        FROM INSCRESTAD
       WHERE CDEMPRESA = V_CDEMPRESA;

      V_NRAUTOFORN := NULL;
      SELECT MAX(A.NRAUTOFORN), MAX(A.CDFILLANC), MAX(A.CDFILDEST)
        INTO V_NRAUTOFORN, V_CDFILLANC, V_CDFILDEST
        FROM AUTOFORNE A, ITEMAUTF I
       WHERE A.CDFILDEST   = C_AUTOFORNE.CDFILDEST
         AND A.CDFILLANC   = NVL(P_CDFILLANC, V_CDFILCENTCMP)
         AND A.CDFORNECED  = C_AUTOFORNE.CDFORNECED
         AND A.CDOPERADOR  = C_AUTOFORNE.CDOPERADOR
         AND A.CDFILDEST   = I.CDFILDEST
         AND A.CDFILLANC   = I.CDFILLANC
         AND A.NRAUTOFORN  = I.NRAUTOFORN
         AND I.DTPROGENTAF = CASE
                                WHEN V_IDGERAFDTENT = 'S'
                                THEN C_AUTOFORNE.DTPROGENTAF
                                ELSE I.DTPROGENTAF
                             END
         AND NVL(USR_NRAUTOFORN, 'X') = C_AUTOFORNE.USR_NRAUTOFORN
         AND A.IDBAIXAAF IS NULL;
      IF V_NRAUTOFORN IS NOT NULL THEN
         IF V_CHAVE_AF IS NULL THEN
            V_CHAVE_AF := V_NRAUTOFORN||V_CDFILLANC||V_CDFILDEST||'_';
         ELSE
            IF INSTR('_'||V_CHAVE_AF||'_', V_NRAUTOFORN||V_CDFILLANC||V_CDFILDEST) = 0 THEN
               V_CHAVE_AF := V_CHAVE_AF||V_NRAUTOFORN||V_CDFILLANC||V_CDFILDEST||'_';
            END IF;   
         END IF;
      END IF;
      IF (C_AUTOFORNE.USR_NRAUTOFORN <> 'X' AND V_NRAUTOFORN IS NULL) OR (C_AUTOFORNE.USR_NRAUTOFORN = 'X' AND V_NRAUTOFORN IS NULL) THEN
         IF (V_CHAVE_LOOP <> (CASE
                                 WHEN V_IDGERAFDTENT = 'S'
                                 THEN C_AUTOFORNE.CDOPERADOR||C_AUTOFORNE.NRINSJURFORN||C_AUTOFORNE.CDFILDEST||C_AUTOFORNE.USR_NRAUTOFORN||TO_CHAR(C_AUTOFORNE.DTPROGENTAF, 'YYYYMMDD')
                                 ELSE C_AUTOFORNE.CDOPERADOR||C_AUTOFORNE.NRINSJURFORN||C_AUTOFORNE.CDFILDEST||C_AUTOFORNE.USR_NRAUTOFORN
                              END))
                               THEN
            V_CHAVE_LOOP := (CASE
                                 WHEN V_IDGERAFDTENT = 'S'
                                 THEN C_AUTOFORNE.CDOPERADOR||C_AUTOFORNE.NRINSJURFORN||C_AUTOFORNE.CDFILDEST||C_AUTOFORNE.USR_NRAUTOFORN||TO_CHAR(C_AUTOFORNE.DTPROGENTAF, 'YYYYMMDD')
                                 ELSE C_AUTOFORNE.CDOPERADOR||C_AUTOFORNE.NRINSJURFORN||C_AUTOFORNE.CDFILDEST||C_AUTOFORNE.USR_NRAUTOFORN
                              END);

            NOVO_CODIGO_NT('AUTOFORNE', V_AUTOFORNE, 1);
            V_AUTOFORNE := SUBSTR(V_AUTOFORNE, 11, 10);
            IF V_CHAVE_AF IS NULL THEN
               V_CHAVE_AF := V_AUTOFORNE||NVL(P_CDFILLANC, V_CDFILCENTCMP)||C_AUTOFORNE.CDFILDEST||'_';
            ELSE
               IF INSTR('_'||V_CHAVE_AF||'_', V_AUTOFORNE||NVL(P_CDFILLANC, V_CDFILCENTCMP)||C_AUTOFORNE.CDFILDEST) = 0 THEN
                  V_CHAVE_AF := V_CHAVE_AF||V_AUTOFORNE||NVL(P_CDFILLANC, V_CDFILCENTCMP)||C_AUTOFORNE.CDFILDEST||'_';
               END IF;
            END IF;
            INSERT
              INTO AUTOFORNE (CDFILDEST,    CDFILLANC,    NRAUTOFORN, IDTPFORPGTAF,
                   IDTIPOFRETAF, NRPARCPGTOAF, NRDIAPGFIXAF, IDUTDIAPGTAF,
                   CDTIPCOB,    CDFORMPGTO,   CDFORNECED, IDTIPOLANCAF,
                   IDAFCONS, CDTPCTPAGAR, IDAUTOFORNEX, CDOPERADOR, DTAUTOFORN, IDTIPOEMITAF, USR_NRAUTOFORN)
            VALUES (C_AUTOFORNE.CDFILDEST, NVL(P_CDFILLANC, V_CDFILCENTCMP), V_AUTOFORNE, V_IDTPFORPGTFO,
                    V_IDTPFRETFORN, V_NRPARCPGTOFO, V_NRDIAPGFIXFO, V_IDUTDIAPGTFO,
                    V_CDTIPCOB, V_CDFORMPGTO, V_CDFORNECED, 'A',
                    'N',  V_CDTPCTPAGAR, 'N', C_AUTOFORNE.CDOPERADOR, SYSDATE, '1', C_AUTOFORNE.USR_NRAUTOFORN);
            IF NVL(V_IDUTDIAPGTFO, '0') = 'V' THEN
               INSERT
                 INTO PRAZOPGTAF (CDFILDEST, CDFILLANC, NRAUTOFORN, NRDIASPGTOAF, VRPERCPGTOAF)
               SELECT C_AUTOFORNE.CDFILDEST, NVL(P_CDFILLANC, V_CDFILCENTCMP), V_AUTOFORNE, NRDIASPGTOFO, VRPERCPGTOFO
                 FROM PRAZOPGTFORN
                WHERE CDFORNECED = V_CDFORNECED;
            END IF;
         END IF;
         FOR C_ITEMAUTF IN (SELECT AUTOFORNE_MOBILE.CDFILDEST, TO_DATE(AUTOFORNE_MOBILE.DTPROGENTAF, 'DD/MM/YYYY') DTPROGENTAF, PRODUTO.CDARVPROD CDPRODUTO,
                                   AUTOFORNE_MOBILE.CDMARCA, (TO_NUMBER(AUTOFORNE_MOBILE.QTPROGENTAF)/1000) QTPROGENTAF,
                                   (TO_NUMBER(AUTOFORNE_MOBILE.VRPREUNIAF)/1000) VRPREUNIAF
                              FROM AUTOFORNE_MOBILE, PRODUTO
                             WHERE AUTOFORNE_MOBILE.CDPRODUTO          = PRODUTO.CDARVPROD
                               AND AUTOFORNE_MOBILE.NRAUTOFORNE_MOBILE = P_NRAUTOFORNE_MOBILE
                               AND V_CHAVE_LOOP = CASE
                                                     WHEN V_IDGERAFDTENT = 'S'
                                                     THEN AUTOFORNE_MOBILE.CDOPERADOR||AUTOFORNE_MOBILE.CDFORNECED||AUTOFORNE_MOBILE.CDFILDEST||AUTOFORNE_MOBILE.USR_NRAUTOFORN||TO_CHAR(TO_DATE(AUTOFORNE_MOBILE.DTPROGENTAF, 'DD/MM/YYYY'), 'YYYYMMDD')
                                                     ELSE AUTOFORNE_MOBILE.CDOPERADOR||AUTOFORNE_MOBILE.CDFORNECED||AUTOFORNE_MOBILE.CDFILDEST||AUTOFORNE_MOBILE.USR_NRAUTOFORN
                                                  END)
         LOOP
            INSERT
              INTO ITEMAUTF (CDFILDEST, CDFILLANC, NRAUTOFORN, CDPRODUTO, QTPROGENTAF, VRPREUNIAF, DTPROGENTAF, CDMARCA)
            SELECT C_ITEMAUTF.CDFILDEST, NVL(P_CDFILLANC, V_CDFILCENTCMP), V_AUTOFORNE, C_ITEMAUTF.CDPRODUTO, C_ITEMAUTF.QTPROGENTAF,
                   C_ITEMAUTF.VRPREUNIAF, C_ITEMAUTF.DTPROGENTAF, C_ITEMAUTF.CDMARCA
              FROM DUAL
             WHERE NOT EXISTS(SELECT 1
                                FROM ITEMAUTF I
                               WHERE I.CDFILDEST    = C_ITEMAUTF.CDFILDEST
                                 AND I.CDFILLANC    = NVL(P_CDFILLANC, V_CDFILCENTCMP)
                                 AND I.NRAUTOFORN   = V_AUTOFORNE
                                 AND I.CDPRODUTO    = C_ITEMAUTF.CDPRODUTO
                                 AND I.DTPROGENTAF  = C_ITEMAUTF.DTPROGENTAF
                                 AND I.CDMARCA      = C_ITEMAUTF.CDMARCA);
            IMPOSTO_ITEMAF(V_CDEMPRESA, V_CDINSCESTA, V_CDFORNECED, C_ITEMAUTF.CDFILDEST, NVL(P_CDFILLANC, V_CDFILCENTCMP), V_AUTOFORNE, C_ITEMAUTF.DTPROGENTAF);
         END LOOP;
      ELSIF (C_AUTOFORNE.USR_NRAUTOFORN = 'X' AND V_NRAUTOFORN IS NOT NULL) THEN
         FOR C_ITEMAUTF IN (SELECT CDFILDEST, TO_DATE(AUTOFORNE_MOBILE.DTPROGENTAF, 'DD/MM/YYYY') DTPROGENTAF, CDPRODUTO, CDMARCA,
                                   (TO_NUMBER(AUTOFORNE_MOBILE.QTPROGENTAF)/1000) QTPROGENTAF,
                                   (TO_NUMBER(AUTOFORNE_MOBILE.VRPREUNIAF)/1000) VRPREUNIAF
                              FROM AUTOFORNE_MOBILE
                             WHERE NRAUTOFORNE_MOBILE = P_NRAUTOFORNE_MOBILE
                               AND V_CHAVE_LOOP       = CASE
                                                           WHEN V_IDGERAFDTENT = 'S'
                                                           THEN AUTOFORNE_MOBILE.CDOPERADOR||AUTOFORNE_MOBILE.CDFORNECED||AUTOFORNE_MOBILE.CDFILDEST||AUTOFORNE_MOBILE.USR_NRAUTOFORN||TO_CHAR(TO_DATE(AUTOFORNE_MOBILE.DTPROGENTAF, 'DD/MM/YYYY'), 'YYYYMMDD')
                                                           ELSE AUTOFORNE_MOBILE.CDOPERADOR||AUTOFORNE_MOBILE.CDFORNECED||AUTOFORNE_MOBILE.CDFILDEST||AUTOFORNE_MOBILE.USR_NRAUTOFORN
                                                        END)
         LOOP
            SELECT COUNT(*)
              INTO CONTA_ITEMAUTF
              FROM ITEMAUTF
             WHERE CDFILDEST   = C_ITEMAUTF.CDFILDEST
               AND CDFILLANC   = NVL(P_CDFILLANC, V_CDFILCENTCMP)
               AND NRAUTOFORN  = V_NRAUTOFORN
               AND CDMARCA     = C_ITEMAUTF.CDMARCA
               AND CDPRODUTO   = C_ITEMAUTF.CDPRODUTO
               AND DTPROGENTAF = C_ITEMAUTF.DTPROGENTAF;
            IF CONTA_ITEMAUTF > 0 THEN
               UPDATE ITEMAUTF
                  SET VRPREUNIAF  = C_ITEMAUTF.VRPREUNIAF,
                      QTPROGENTAF = C_ITEMAUTF.QTPROGENTAF
                WHERE CDFILDEST   = C_ITEMAUTF.CDFILDEST
                  AND CDFILLANC   = NVL(P_CDFILLANC, V_CDFILCENTCMP)
                  AND NRAUTOFORN  = V_NRAUTOFORN
                  AND CDMARCA     = C_ITEMAUTF.CDMARCA
                  AND CDPRODUTO   = C_ITEMAUTF.CDPRODUTO
                  AND DTPROGENTAF = C_ITEMAUTF.DTPROGENTAF
                  AND IDBAIXITMAF IS NULL;
            ELSE
               INSERT
                 INTO ITEMAUTF (CDFILDEST, CDFILLANC, NRAUTOFORN, CDPRODUTO, QTPROGENTAF, VRPREUNIAF, DTPROGENTAF, CDMARCA)
               SELECT C_ITEMAUTF.CDFILDEST, NVL(P_CDFILLANC, V_CDFILCENTCMP), V_NRAUTOFORN, C_ITEMAUTF.CDPRODUTO, C_ITEMAUTF.QTPROGENTAF,
                      C_ITEMAUTF.VRPREUNIAF, C_ITEMAUTF.DTPROGENTAF, C_ITEMAUTF.CDMARCA
                 FROM DUAL;
            END IF;
            IMPOSTO_ITEMAF(V_CDEMPRESA, V_CDINSCESTA, V_CDFORNECED, C_ITEMAUTF.CDFILDEST, NVL(P_CDFILLANC, V_CDFILCENTCMP), V_NRAUTOFORN, C_ITEMAUTF.DTPROGENTAF);
         END LOOP;
      ELSIF (C_AUTOFORNE.USR_NRAUTOFORN <> 'X' AND V_NRAUTOFORN IS NOT NULL) THEN
         FOR C_ITEMAUTF IN (SELECT CDFILDEST, TO_DATE(AUTOFORNE_MOBILE.DTPROGENTAF, 'DD/MM/YYYY') DTPROGENTAF, CDPRODUTO, CDMARCA, QTPROGENTAF, VRPREUNIAF
                              FROM AUTOFORNE_MOBILE
                             WHERE NRAUTOFORNE_MOBILE = P_NRAUTOFORNE_MOBILE
                               AND V_CHAVE_LOOP       = CASE
                                                           WHEN V_IDGERAFDTENT = 'S'
                                                           THEN AUTOFORNE_MOBILE.CDOPERADOR||AUTOFORNE_MOBILE.CDFORNECED||AUTOFORNE_MOBILE.CDFILDEST||AUTOFORNE_MOBILE.USR_NRAUTOFORN||TO_CHAR(TO_DATE(AUTOFORNE_MOBILE.DTPROGENTAF, 'DD/MM/YYYY'), 'YYYYMMDD')
                                                           ELSE AUTOFORNE_MOBILE.CDOPERADOR||AUTOFORNE_MOBILE.CDFORNECED||AUTOFORNE_MOBILE.CDFILDEST||AUTOFORNE_MOBILE.USR_NRAUTOFORN
                                                        END)
         LOOP
            UPDATE AUTOFORNE
               SET USR_NRAUTOFORN = C_AUTOFORNE.USR_NRAUTOFORN
             WHERE CDFILDEST      = C_AUTOFORNE.CDFILDEST
               AND CDFILLANC      = NVL(P_CDFILLANC, V_CDFILCENTCMP)
               AND CDFORNECED     = C_AUTOFORNE.CDFORNECED
               AND CDOPERADOR     = C_AUTOFORNE.CDOPERADOR
               AND NRAUTOFORN     = V_NRAUTOFORN;
            SELECT COUNT(*)
                 INTO CONTA_ITEMAUTF
                 FROM ITEMAUTF
                WHERE CDFILDEST   = C_ITEMAUTF.CDFILDEST
                  AND CDFILLANC   = NVL(P_CDFILLANC, V_CDFILCENTCMP)
                  AND NRAUTOFORN  = V_NRAUTOFORN
                  AND CDMARCA     = C_ITEMAUTF.CDMARCA
                  AND CDPRODUTO   = C_ITEMAUTF.CDPRODUTO
                  AND DTPROGENTAF = C_ITEMAUTF.DTPROGENTAF;
               IF CONTA_ITEMAUTF > 0 THEN
                  UPDATE ITEMAUTF
                     SET VRPREUNIAF  = C_ITEMAUTF.VRPREUNIAF,
                         QTPROGENTAF = C_ITEMAUTF.QTPROGENTAF
                   WHERE CDFILDEST   = C_ITEMAUTF.CDFILDEST
                     AND CDFILLANC   = NVL(P_CDFILLANC, V_CDFILCENTCMP)
                     AND NRAUTOFORN  = V_NRAUTOFORN
                     AND CDMARCA     = C_ITEMAUTF.CDMARCA
                     AND CDPRODUTO   = C_ITEMAUTF.CDPRODUTO
                     AND DTPROGENTAF = C_ITEMAUTF.DTPROGENTAF
                     AND IDBAIXITMAF IS NULL;
               ELSE
                  INSERT
                    INTO ITEMAUTF (CDFILDEST, CDFILLANC, NRAUTOFORN, CDPRODUTO, QTPROGENTAF, VRPREUNIAF, DTPROGENTAF, CDMARCA)
                  SELECT C_ITEMAUTF.CDFILDEST, NVL(P_CDFILLANC, V_CDFILCENTCMP), V_NRAUTOFORN, C_ITEMAUTF.CDPRODUTO, C_ITEMAUTF.QTPROGENTAF,
                         C_ITEMAUTF.VRPREUNIAF, C_ITEMAUTF.DTPROGENTAF, C_ITEMAUTF.CDMARCA
                    FROM DUAL;
               END IF;
               IMPOSTO_ITEMAF(V_CDEMPRESA, V_CDINSCESTA, V_CDFORNECED, C_ITEMAUTF.CDFILDEST, NVL(P_CDFILLANC, V_CDFILCENTCMP), V_NRAUTOFORN, C_ITEMAUTF.DTPROGENTAF);
         END LOOP;
      END IF;

   END LOOP;
   V_CHAVE_AF := SUBSTR(V_CHAVE_AF, 1, LENGTH(V_CHAVE_AF)-1);
   WHILE LENGTH(V_CHAVE_AF) > 17 LOOP
      V_CHAVE_AF2 := SUBSTR(V_CHAVE_AF, 1, 18);
      FECHA_AUTOFORNE_MOBILE(SUBSTR(V_CHAVE_AF, 15, 4), SUBSTR(V_CHAVE_AF, 11, 4), SUBSTR(V_CHAVE_AF, 1, 10));
      V_CHAVE_AF := SUBSTR(V_CHAVE_AF, 20, LENGTH(V_CHAVE_AF));
   END LOOP;
END;
/