CREATE OR REPLACE PROCEDURE ATUALIZA_DADOSADIC
   (P_CDFILIAL   IN FILIAL.CDFILIAL%TYPE,
    P_CDCAIXA    IN CAIXA.CDCAIXA%TYPE,
    P_CDFILIPROC IN NOTAFISCAL.CDFILIAL%TYPE,
    P_NRLANCTONF IN NOTAFISCAL.NRLANCTONF%TYPE,
    P_NRMD5ARQTXT IN TURCAIXA.NRMD5ARQTXT%TYPE,
    P_DSMENSAGEM IN VARCHAR2)

AS
   V_NRDADOADIC   DADOSADIC.NRDADOADIC%TYPE;
   V_DSDADOADIC   DADOSADIC.DSDADOADIC%TYPE;
   V_DSMENSCPFCUP CAIXA.DSMENSCPFCUP%TYPE;
   V_NRCOOACESSO  VARCHAR2(50);
   QTDREGISTRO    NUMBER;

BEGIN
   IF (P_NRMD5ARQTXT IS NOT NULL) THEN 
      QTDREGISTRO := 0;
      BEGIN
         SELECT COUNT(*)
           INTO QTDREGISTRO
           FROM DADOSADIC
          WHERE (CDFILIAL = P_CDFILIAL) 
            AND (NRLANCTONF = P_NRLANCTONF)
            AND (DSDADOADIC = P_NRMD5ARQTXT);
       EXCEPTION
          WHEN NO_DATA_FOUND THEN BEGIN
             QTDREGISTRO := 0;
          END;
      END;

      IF QTDREGISTRO = 0 THEN
         SELECT NVL(MAX(NRDADOADIC), '0') 
           INTO V_NRDADOADIC 
           FROM DADOSADIC 
          WHERE CDFILIAL   = P_CDFILIPROC 
            AND NRLANCTONF = P_NRLANCTONF; 
 
         V_NRDADOADIC := LPAD(TO_CHAR(TO_NUMBER(NVL(V_NRDADOADIC, '0')) + 1), 3, '0'); 
 
         INSERT INTO DADOSADIC 
            (CDFILIAL, NRLANCTONF, NRDADOADIC, DSDADOADIC) 
         VALUES 
            (P_CDFILIPROC, P_NRLANCTONF, V_NRDADOADIC, 'Código MD5: ' || P_NRMD5ARQTXT); 
      END IF;
   END IF; 

   FOR C_DADOSNF IN (SELECT NRCOOCUPOMNF, DSMARCAECFNF, DSMODELOECFNF, NRSERIEIMPNF, NRACESSONFCENF
                       FROM DADOSNF
                      WHERE CDFILIAL   = P_CDFILIPROC
                        AND NRLANCTONF = P_NRLANCTONF
                     ORDER BY NRSEQCUPOMNF) LOOP

      IF C_DADOSNF.NRACESSONFCENF IS NULL THEN
         V_NRCOOACESSO := C_DADOSNF.NRCOOCUPOMNF;
      ELSE
         V_NRCOOACESSO := C_DADOSNF.NRACESSONFCENF;
      END IF;
      
      /*Atualização dos números de cupons na tabela Dados Adicionais*/
      SELECT NVL(MAX(NRDADOADIC), '0'), MAX(DSDADOADIC)
        INTO V_NRDADOADIC, V_DSDADOADIC
        FROM DADOSADIC
       WHERE CDFILIAL   = P_CDFILIPROC
         AND NRLANCTONF = P_NRLANCTONF;

      IF V_NRDADOADIC <= '998' THEN
         IF (V_DSDADOADIC IS NULL) OR (LENGTH(V_DSDADOADIC || ', ' || V_NRCOOACESSO) >= 255) OR (NOT (V_DSDADOADIC LIKE '%Marca:%')) THEN
            V_NRDADOADIC := LPAD(TO_CHAR(TO_NUMBER(NVL(V_NRDADOADIC, '0')) + 1), 3, '0');

            IF C_DADOSNF.NRACESSONFCENF IS NULL THEN
               V_DSDADOADIC := P_DSMENSAGEM || V_NRCOOACESSO ||
                               ' (Marca: '  || SUBSTR(C_DADOSNF.DSMARCAECFNF, 1, 15) ||
                               ', Mod: '    || SUBSTR(C_DADOSNF.DSMODELOECFNF, 1, 15) ||
                               ', Nº: '     || C_DADOSNF.NRSERIEIMPNF ||
                               ')';
            ELSE
               V_DSDADOADIC := 'NF referente à Chave de Acesso ' || V_NRCOOACESSO;
            END IF;

            INSERT INTO DADOSADIC
               (CDFILIAL, NRLANCTONF, NRDADOADIC, DSDADOADIC)
            VALUES
               (P_CDFILIPROC, P_NRLANCTONF, V_NRDADOADIC, V_DSDADOADIC);
         ELSE
            V_DSDADOADIC := V_DSDADOADIC || ', ' || V_NRCOOACESSO;

            UPDATE DADOSADIC
               SET DSDADOADIC = V_DSDADOADIC
             WHERE CDFILIAL   = P_CDFILIPROC
               AND NRLANCTONF = P_NRLANCTONF
               AND NRDADOADIC = V_NRDADOADIC;
         END IF;
      END IF;
   END LOOP;

   SELECT MAX(C.DSMENSCPFCUP)
     INTO V_DSMENSCPFCUP
     FROM CAIXA C
    WHERE C.CDFILIAL = P_CDFILIAL
      AND C.CDCAIXA  = (SELECT MIN(CDCAIXA)
                          FROM CAIXA
                         WHERE CDFILIAL = P_CDFILIAL
                           AND ((INSTR(P_CDCAIXA, CDCAIXA) > 0) OR (P_CDCAIXA IS NULL))
                           AND DSMENSCPFCUP IS NOT NULL);

   SELECT MAX(DSDADOADIC)
     INTO V_DSDADOADIC
     FROM DADOSADIC
    WHERE CDFILIAL   = P_CDFILIPROC
      AND NRLANCTONF = P_NRLANCTONF
      AND DSDADOADIC = V_DSMENSCPFCUP;

   IF (V_DSDADOADIC IS NULL) AND (V_DSMENSCPFCUP IS NOT NULL) THEN
      SELECT NVL(MAX(NRDADOADIC), '0')
        INTO V_NRDADOADIC
        FROM DADOSADIC
       WHERE CDFILIAL   = P_CDFILIPROC
         AND NRLANCTONF = P_NRLANCTONF;

      IF V_NRDADOADIC <= '998' THEN
         V_NRDADOADIC := LPAD(TO_CHAR(TO_NUMBER(NVL(V_NRDADOADIC, '0')) + 1), 3, '0');

         INSERT INTO DADOSADIC
            (CDFILIAL, NRLANCTONF, NRDADOADIC, DSDADOADIC)
         VALUES
            (P_CDFILIPROC, P_NRLANCTONF, V_NRDADOADIC, V_DSMENSCPFCUP);
      END IF;
   END IF;
END;