create or replace PROCEDURE USR_PROT_EXPORTA_AF(
   V_INCDCENTCUST IN VARCHAR2,
   V_INNRAUTOFORN IN VARCHAR2,
   V_INCDFILLANC  IN VARCHAR2,
   P_IDINTERFACE  IN NUMBER)
IS
   --GERAL
   V_CNPJEMPRESA   USR_CISAUTO_FORNE.CNPJEMPRESA%TYPE;
   V_CDCENTCUST    USR_CISAUTO_FORNE.CDCENTCUST%TYPE;
   V_NRAUTOFORN    USR_CISAUTO_FORNE.NRAUTOFORNE%TYPE;
   V_CDFORNECED    USR_CISAUTO_FORNE.CDFORNECED%TYPE;
   V_CDARMAZEM     USR_CISAUTO_FORNE.CDARMAZEM%TYPE;
   V_DTAUTOFORN    USR_CISAUTO_FORNE.DTAUTOFORN%TYPE;
   V_VRTOTALAF     USR_CISAUTO_FORNE.VRTOTALAF%TYPE;
   V_CDCONDFORN    USR_CISAUTO_FORNE.CDCONDFORN%TYPE;
   V_CDLOJA        USR_CISAUTO_FORNE.CDLOJA%TYPE;
   V_CDITEM        USR_CISAUTO_FORNE.CDITEM%TYPE;
   V_SGUNIDADE     USR_CISAUTO_FORNE.SGUNIDADE%TYPE;
   V_CDPRODUTO     USR_CISAUTO_FORNE.CDPRODUTO%TYPE;
   V_CDMARCA       USR_CISAUTO_FORNE.CDMARCA%TYPE;
   V_VRQUANTIDADE  USR_CISAUTO_FORNE.VRQUANTIDADE%TYPE;
   V_VRUNITARIO    USR_CISAUTO_FORNE.VRUNITARIO%TYPE;
   V_VRTOTAL       USR_CISAUTO_FORNE.VRTOTAL%TYPE;
   V_VRPERDESAF    USR_CISAUTO_FORNE.VRPERDESAF%TYPE;
   V_VRDESCITMAF   USR_CISAUTO_FORNE.VRDESCITMAF%TYPE;
   V_TXOBSITMAF    USR_CISAUTO_FORNE.TXOBSITMAF%TYPE;
   V_IDBAIXAAF     AUTOFORNE.IDBAIXAAF%TYPE;
   V_DTPROGENTAF   ITEMAUTF.DTPROGENTAF%TYPE;

   --ESPECIFICO TABELA INT
   V_LOG_ERRO      USR_CISAUTO_FORNE.LOG_ERRO%TYPE;
   V_DTGRAVACAO    USR_CISAUTO_FORNE.DTGRAVACAO%TYPE;
   V_HRGRAVACAO    USR_CISAUTO_FORNE.HRGRAVACAO%TYPE;
   V_DTIMPORTACAO  USR_CISAUTO_FORNE.DTIMPORTACAO%TYPE;
   V_HRIMPORTACAO  USR_CISAUTO_FORNE.HRIMPORTACAO%TYPE;
   V_IDINTERFACE   USR_CISAUTO_FORNE.IDINTERFACE%TYPE;
   V_OLDINTERFACE  USR_CISAUTO_FORNE.IDINTERFACE%TYPE;
   V_ISEDICAO      NUMBER;
   V_ERRO 			 VARCHAR2(5000);
   V_OBS			    VARCHAR2(5000);
   V_JOBID         INT;
   V_COUNTCALLS    NUMBER;
   V_SID           NUMBER;
   V_KILL_SQL      VARCHAR2(5000);
   V_WAIT_TIME     INT; --num seconds
   V_NOW           DATE;
   V_NOMEJOBWEB	 VARCHAR2(100) := 'exportaAF';
   V_COMANDO		 VARCHAR2(100);

   --VARIAVEIS LOCAIS MUTAVEIS
   V_JACADASTRADO NUMBER;
   JOB_N          INT;

   CURSOR C_AF IS
      SELECT NRINSJUREMPR AS CNPJEMPRESA, CDEXFILIAL AS CDCENTCUST, AF.NRAUTOFORN AS NRAUTOFORN, SUBSTR(FORN.CDEXFORNECED, 0, 6) AS CDFORNECED, '01' AS CDARMAZEM, TO_DATE(DTAUTOFORN) AS DTAUTOFORN, VRTOTALAF, '0'||FORN.CDFORMPGTO AS CDCONDFORN,
             SUBSTR(FORN.CDEXFORNECED, 7, 2) AS CDLOJA, SUBSTR(P.SGUNIDADE, 0, 2) AS SGUNIDADE, IT.CDPRODUTO, IT.CDMARCA, QTPROGENTAF AS VRQUANTIDADE, VRPREUNIAF AS VRUNITARIO,
             QTPROGENTAF*VRPREUNIAF AS VRTOTAL, NVL(VRPERDESAF, 0) AS VRPERDESAF, NVL(VRDESCITMAF, 0) AS VRDESCITMAF, SUBSTR(NVL(TXOBSITMAF, 0), 0, 30)  AS TXOBSITMAF,
             IDBAIXAAF, IT.DTPROGENTAF
        FROM AUTOFORNE AF, ITEMAUTF IT, PRODUTO P, PARAMFILIAL FI, FORNECEDOR FORN, FILIAL FIL, EMPRESA EM
       WHERE IT.CDPRODUTO = P.CDPRODUTO
         AND AF.CDFILDEST = IT.CDFILDEST
         AND AF.NRAUTOFORN = IT.NRAUTOFORN
         AND AF.CDFILDEST = FI.CDFILIAL
         AND FI.CDFILIAL = FIL.CDFILIAL
         AND FIL.CDEMPRESA = EM.CDEMPRESA
         AND FORN.CDFORNECED = AF.CDFORNECED
         AND NVL(AF.IDBAIXAAF, 'null') = 'null'
         AND AF.CDFILDEST = V_INCDCENTCUST
         AND AF.NRAUTOFORN = V_INNRAUTOFORN
         AND AF.CDFILLANC = V_INCDFILLANC
         AND NOT EXISTS (SELECT 1
                           FROM USR_CISAUTO_FORNE USR
                          WHERE USR.NRAUTOFORNE = AF.NRAUTOFORN
                            AND USR.CDPRODUTO   = IT.CDPRODUTO
                            AND USR.CDMARCA     = IT.CDMARCA
                            AND USR.DTPROGENTAF = IT.DTPROGENTAF 
                            AND DTGRAVACAO IS NOT NULL)
       ORDER BY P.CDARVPROD;
BEGIN
   --*** CRIA UM NOME COMPOSTO PARA O JOB PARA QUE POSSAM COEXISTIR MULTIPLOS EVIOS SIMULTANEOS ***--
   V_COMANDO := 'BEGIN Usr_callWebservice('||CHR(39)||V_NOMEJOBWEB||CHR(39)||'); END;';

   V_IDINTERFACE := P_IDINTERFACE;
   SELECT CDEXFILIAL
     INTO V_CDCENTCUST
     FROM PARAMFILIAL
    WHERE CDFILIAL = V_INCDCENTCUST;

   --*** IDENTIFICA ATRAVES DE UM CONTADOR SE SE TRATA DA ADIÇÃO DE UM NOVO ITEM E UMA AF JÁ EXISTENTE ***--
   SELECT COUNT(*)
     INTO V_ISEDICAO
     FROM USR_CISAUTO_FORNE
    WHERE NRAUTOFORNE = V_INNRAUTOFORN
      AND DTIMPORTACAO IS NOT NULL;

   --*** IDENTIFICA SE TRATA-SE DE UM LANÇAMENTO QUE JÁ FOI ENVIADO ALGUMA VEZ AO WEBSERVICE PARA TENTAR EVITAR DUPLICAÇOES ***--
   BEGIN
       SELECT MAX(DISTINCT(HRIMPORTACAO))
         INTO V_HRIMPORTACAO
         FROM USR_CISAUTO_FORNE
        WHERE NRAUTOFORNE = V_INNRAUTOFORN
          AND DTIMPORTACAO IS NOT NULL;
   EXCEPTION
      WHEN NO_DATA_FOUND THEN
         V_HRIMPORTACAO := NULL;
   END;

   --*** LIMPA AS DATAS DE GRAVAÇÃO E ENVIO PARA QUE POSSA ATUALIZADA A TABELA DE INTEGRACAO E REENVIADO AO WEBSERVICE ***--
   UPDATE USR_CISAUTO_FORNE
      SET DTIMPORTACAO = NULL,
          DTGRAVACAO = NULL
   WHERE CDCENTCUST  = V_CDCENTCUST
     AND NRAUTOFORNE = V_INNRAUTOFORN;

   OPEN C_AF;
   LOOP
      FETCH C_AF INTO V_CNPJEMPRESA,
                      V_CDCENTCUST,
                      V_NRAUTOFORN,
                      V_CDFORNECED,
                      V_CDARMAZEM,
                      V_DTAUTOFORN,
                      V_VRTOTALAF,
                      V_CDCONDFORN,
                      V_CDLOJA,
                      V_SGUNIDADE,
                      V_CDPRODUTO,
                      V_CDMARCA,
                      V_VRQUANTIDADE,
                      V_VRUNITARIO,
                      V_VRTOTAL,
                      V_VRPERDESAF,
                      V_VRDESCITMAF,
                      V_TXOBSITMAF,
                      V_IDBAIXAAF,
                      V_DTPROGENTAF;
      EXIT WHEN C_AF%NOTFOUND;

      V_ERRO := NULL;
      V_OBS  := NULL;

      --*** CONTADOR SEQUENCIAL DE ITEM (REQUISITO PARA EXPOTAR AO PROTHEUS) ***--
      SELECT LPAD(COUNT(NRAUTOFORNE)+1, 4, 0)
        INTO V_CDITEM
        FROM USR_CISAUTO_FORNE
       WHERE CDCENTCUST = V_CDCENTCUST
         AND NRAUTOFORNE = V_NRAUTOFORN;

      --*** VALIDA SE SE TRATA DE UM ITEM JÁ INSERIDO ***--
      SELECT COUNT(*)
        INTO V_JACADASTRADO
        FROM USR_CISAUTO_FORNE
       WHERE NRAUTOFORNE = V_NRAUTOFORN
         AND CDPRODUTO   = V_CDPRODUTO
         AND CDMARCA     = V_CDMARCA
         AND cdcentcust  = v_cdcentcust;

      SELECT MAX(IDINTERFACE), MAX(DTIMPORTACAO)
        INTO V_OLDINTERFACE, V_DTIMPORTACAO
        FROM USR_CISAUTO_FORNE
       WHERE CDCENTCUST  = V_CDCENTCUST
         AND NRAUTOFORNE = V_NRAUTOFORN
         AND CDPRODUTO   = V_CDPRODUTO
         AND CDMARCA     = V_CDMARCA
         AND cdcentcust  = v_cdcentcust;

      --*** VALIDA SE TRATA-SE DE UM UPDATE DE UM ITEM QUE AINDA NAO FOI INTEGRADO E ALTERA O STATUS PARA INSERÇÃO ***--
      IF (V_JACADASTRADO = 0 AND V_IDINTERFACE = 2) THEN
         V_IDINTERFACE := 1;
      END IF;

      --*** VALIDA SE TRATA-SE DE UM INSERT DE UM ITEM JÁ INGRADO E ALTERA O STATUS PARA UPDATE ***--
      IF (V_JACADASTRADO = 1 AND V_IDINTERFACE <> 3) THEN
         V_IDINTERFACE := 2;
      END IF;

      IF (V_IDINTERFACE = '1') THEN
         IF (V_ISEDICAO > 0) THEN
            V_IDINTERFACE := '2';

            UPDATE USR_CISAUTO_FORNE
               SET IDINTERFACE = V_IDINTERFACE
             WHERE CDCENTCUST  = V_CDCENTCUST
               AND NRAUTOFORNE = V_NRAUTOFORN;
         END IF;

         BEGIN
            INSERT INTO USR_CISAUTO_FORNE
               (CNPJEMPRESA, CDCENTCUST, NRAUTOFORNE, CDFORNECED, CDARMAZEM, DTAUTOFORN,
                VRTOTALAF, CDCONDFORN, CDLOJA, CDITEM, SGUNIDADE,
                CDPRODUTO, CDMARCA, VRQUANTIDADE, VRUNITARIO, VRTOTAL, VRPERDESAF,
                VRDESCITMAF, TXOBSITMAF, IDINTERFACE, DTGRAVACAO,
                HRGRAVACAO, DTPROGENTAF)
            VALUES
               (V_CNPJEMPRESA, V_CDCENTCUST, V_NRAUTOFORN, V_CDFORNECED, V_CDARMAZEM, V_DTAUTOFORN,
                V_VRTOTALAF, V_CDCONDFORN, V_CDLOJA, V_CDITEM, V_SGUNIDADE,
                V_CDPRODUTO, V_CDMARCA, V_VRQUANTIDADE, V_VRUNITARIO, V_VRTOTAL, V_VRPERDESAF,
                V_VRDESCITMAF, V_TXOBSITMAF, V_IDINTERFACE, SYSDATE,
                TO_CHAR(SYSDATE, 'HH:MM'), V_DTPROGENTAF);
         EXCEPTION
            WHEN OTHERS THEN
               V_ERRO := SQLERRM(SQLCODE);
         END;
      END IF;

      IF (V_IDINTERFACE = '2' AND (V_OLDINTERFACE <> '1' OR V_DTIMPORTACAO IS NOT NULL)) THEN
         BEGIN
            UPDATE USR_CISAUTO_FORNE
               SET CNPJEMPRESA  = V_CNPJEMPRESA,
                   CDCENTCUST   = V_CDCENTCUST,
                   CDFORNECED   = V_CDFORNECED,
                   CDARMAZEM    = V_CDARMAZEM,
                   DTAUTOFORN   = V_DTAUTOFORN,
                   VRTOTALAF    = V_VRTOTALAF,
                   CDCONDFORN   = V_CDCONDFORN,
                   CDLOJA       = V_CDLOJA,
                   SGUNIDADE    = V_SGUNIDADE,
                   VRQUANTIDADE = V_VRQUANTIDADE,
                   VRUNITARIO   = V_VRUNITARIO,
                   VRTOTAL      = V_VRTOTAL,
                   VRPERDESAF   = V_VRPERDESAF,
                   VRDESCITMAF  = V_VRDESCITMAF,
                   TXOBSITMAF   = V_TXOBSITMAF,
                   IDINTERFACE  = V_IDINTERFACE,
                   LOG_ERRO     = V_ERRO,
                   DTGRAVACAO   = SYSDATE,
                   HRGRAVACAO   = TO_CHAR(SYSDATE, 'HH:MM'),
                   DTIMPORTACAO = NULL
              WHERE NRAUTOFORNE = V_NRAUTOFORN
                AND CDPRODUTO   = V_CDPRODUTO
                AND CDMARCA     = V_CDMARCA
                AND CDCENTCUST  = V_CDCENTCUST
                AND DTPROGENTAF = V_DTPROGENTAF
                AND DTIMPORTACAO IS NOT NULL;

            UPDATE USR_CISAUTO_FORNE VRTOTALAF
               SET VRTOTALAF = V_VRTOTALAF
             WHERE CDCENTCUST  = V_CDCENTCUST
               AND NRAUTOFORNE = V_NRAUTOFORN;
         EXCEPTION
            WHEN OTHERS THEN
               V_ERRO := SQLERRM(SQLCODE);
         END;
      END IF;

      UPDATE USR_CISAUTO_FORNE
         SET LOG_ERRO = V_ERRO,
             DTGRAVACAO = SYSDATE,
             HRGRAVACAO = TO_CHAR(SYSDATE, 'HH:MM')
       WHERE NRAUTOFORNE = V_NRAUTOFORN
         AND CDITEM = V_CDITEM
         AND CDMARCA = V_CDMARCA;

      COMMIT;
   END LOOP;
   CLOSE C_AF;

   IF (V_IDINTERFACE = '3') THEN
      BEGIN
         SELECT CDEXFILIAL
           INTO V_CDCENTCUST
           FROM PARAMFILIAL
          WHERE CDFILIAL = V_INCDCENTCUST;

         UPDATE USR_CISAUTO_FORNE
            SET IDINTERFACE = V_IDINTERFACE,
                DTGRAVACAO = SYSDATE,
                HRGRAVACAO = TO_CHAR(SYSDATE, 'HH:MM'),
                DTIMPORTACAO = NULL
          WHERE NRAUTOFORNE = V_INNRAUTOFORN
            AND CDCENTCUST = V_CDCENTCUST;
      EXCEPTION
         WHEN OTHERS THEN
            V_ERRO := SQLERRM(SQLCODE);
      END;
   END IF;

   IF V_HRIMPORTACAO IS NOT NULL OR (V_IDINTERFACE = '1' OR P_IDINTERFACE = '1') THEN
       BEGIN
         DBMS_SCHEDULER.DROP_JOB('CALLWEBEXPORTAAF');
       EXCEPTION
          WHEN OTHERS THEN
             NULL;
       END;

       BEGIN
          DBMS_SCHEDULER.CREATE_JOB (
             JOB_NAME => 'CALLWEBEXPORTAAF',
             JOB_TYPE => 'PLSQL_BLOCK',
             JOB_ACTION => V_COMANDO,
             START_DATE => SYSDATE + INTERVAL '60' SECOND,
             ENABLED => TRUE);
       EXCEPTION
          WHEN OTHERS THEN
             NULL;
       END;
   END IF;
EXCEPTION
   WHEN OTHERS THEN
      V_ERRO := SQLERRM(SQLCODE);
END;
/

-- VERSAO --
BEGIN ATUVEROBJ('USR_PROT_EXPORTA_AF','6.49.014'); END;
/
