CREATE OR REPLACE FUNCTION VD_ALTERA_MIGRACAO_OL(P_CDFILDEST          IN VARCHAR2,   /*Filial de Destino*/
                                                 P_CDMARCA            IN VARCHAR2,   /*Codigo da Marca*/
                                                 P_CDPRODUTO          IN VARCHAR2,   /*Codigo do Produto*/
                                                 P_DTPROGENTAF        IN DATE,       /*Data de Entrega*/
                                                 P_CDPRODRUP          IN VARCHAR2,   /*Codigo do Produto Novo*/
                                                 P_CDMARCARUP         IN VARCHAR2,   /*Codigo da Marca Nova*/
                                                 P_CDFILCENTCMP       IN VARCHAR2,   /*Codigo da Central de Compras*/
                                                 P_CDFORNOPELOG       IN VARCHAR2)   /*Codigo do Fornecedor OL*/

RETURN CHAR
IS
   V_COUNT         NUMERIC;
   V_CDFORNOPELOG  FILIAL.CDFORNOPELOG%TYPE;
   V_CDPRODPREF    PRODPREFMED.CDPRODPREF%TYPE;
   V_VRPRECUNIITM  ITEMCOLE.VRPRECUNIITM%TYPE;
   V_ERROS         VARCHAR2(10);
BEGIN
   V_ERROS := '0000000000';
   SELECT COUNT(1)
     INTO V_COUNT
     FROM PRODUTO
    WHERE CDPRODUTO = p_CDPRODRUP
      AND NVL(IDPRODATIVPR, 'N') = 'S';
   IF V_COUNT = 0 THEN
      /*Produto informado inativo.*/
      V_ERROS := '1'||SUBSTR(V_ERROS, 2);
   ELSE
      V_ERROS := '0'||SUBSTR(V_ERROS, 2);
   END IF;

   SELECT COUNT(1)
     INTO V_COUNT
     FROM (SELECT QFOMARPROD.CDMARCA
             FROM QFOMARPROD, PARASUPRI
            WHERE (QFOMARPROD.CDPRODUTO     = P_CDPRODRUP)
              AND (QFOMARPROD.CDMARCA       = P_CDMARCARUP)
              AND (PARASUPRI.CDFILIAL       = P_DTPROGENTAF)
              AND ((QFOMARPROD.IDAPRMARPRO  = 'N'
              AND QFOMARPROD.IDAUTMARPRO    = 'N')
               OR ((QFOMARPROD.IDAPRMARPRO  = 'S')
              AND (( PARASUPRI.IDULTIDTVALQ = 'M'
              AND P_DTPROGENTAF             > LAST_DAY(QFOMARPROD.DTVALAPROVA))
               OR (PARASUPRI.IDULTIDTVALQ   = 'D'
              AND P_DTPROGENTAF             > QFOMARPROD.DTVALAPROVA))))
            UNION
           SELECT PARASUPRI.CDMARCA
             FROM PARASUPRI
            WHERE PARASUPRI.CDFILIAL        = P_CDFILCENTCMP
              AND PARASUPRI.IDMARSEMQUA     = 'S'
              AND NOT EXISTS (SELECT QFOMARPROD.CDMARCA
                                FROM QFOMARPROD
                               WHERE QFOMARPROD.CDPRODUTO = P_CDPRODRUP
                                 AND QFOMARPROD.CDMARCA   = P_CDMARCARUP));
   IF V_COUNT > 0 THEN
      /*Marca nao qualificada ou com validade vencida.*/
      V_ERROS := SUBSTR(V_ERROS, 1, 1)||'1'||SUBSTR(V_ERROS, 3);
   ELSE
      V_ERROS := SUBSTR(V_ERROS, 1, 1)||'0'||SUBSTR(V_ERROS, 3);
   END IF;

   SELECT COUNT(1)
     INTO V_COUNT
     FROM MARCA
    WHERE MARCA.CDMARCA = P_CDMARCARUP
      AND EXISTS (SELECT QFOMARPROD.CDMARCA
                    FROM QFOMARPROD, PRODUTO, PARASUPRI
                   WHERE (QFOMARPROD.CDPRODUTO = PRODUTO.CDPRODUTO)
                     AND (MARCA.CDMARCA        = QFOMARPROD.CDMARCA)
                     AND (PRODUTO.CDARVPROD = P_CDPRODRUP)
                     AND (PARASUPRI.CDFILIAL = P_CDFILCENTCMP)
                     AND ((QFOMARPROD.IDAPRMARPRO   = 'N'
                     AND QFOMARPROD.IDAUTMARPRO   = 'N')
                      OR ((QFOMARPROD.IDAPRMARPRO = 'S')
                     AND ((PARASUPRI.IDULTIDTVALQ = 'M'
                     AND TO_DATE(P_DTPROGENTAF)    > LAST_DAY(QFOMARPROD.DTVALAPROVA))
                      OR (PARASUPRI.IDULTIDTVALQ = 'D'
                     AND TO_DATE(P_DTPROGENTAF)    > QFOMARPROD.DTVALAPROVA)))))
                     AND EXISTS (SELECT QFOMARPROD.CDMARCA
                                   FROM QFOMARPROD, PRODUTO
                                  WHERE (PRODUTO.CDARVPROD = P_CDPRODRUP)
                                    AND QFOMARPROD.CDMARCA   = MARCA.CDMARCA
                                    AND QFOMARPROD.CDPRODUTO = PRODUTO.CDPRODUTO
                                  UNION
                                 SELECT PARASUPRI.CDMARCA
                                   FROM PARASUPRI
                                  WHERE PARASUPRI.CDFILIAL = P_CDFILCENTCMP
                                    AND (PARASUPRI.IDMARSEMQUA   = 'N'
                                     OR PARASUPRI.IDMARSEMQUA IS NULL));
   IF V_COUNT > 0 THEN
      /*Marca informada nao cadastrada ou nao qualificada para o produto informado.*/
      V_ERROS := SUBSTR(V_ERROS, 1, 2)||'1'||SUBSTR(V_ERROS, 4);
   ELSE
      V_ERROS := SUBSTR(V_ERROS, 1, 2)||'0'||SUBSTR(V_ERROS, 4);
   END IF;

   SELECT COUNT(1)
     INTO V_COUNT
     FROM PRODFORNCOMP
    WHERE CDFORNECED  = P_CDFORNOPELOG
      AND CDPRODCOMPL = P_CDPRODRUP;
   IF V_COUNT = 0 THEN
      /*Produto informado nao cadastrado para o fornecedor.*/
      V_ERROS := SUBSTR(V_ERROS, 1, 3)||'1'||SUBSTR(V_ERROS, 5);
   ELSE
      V_ERROS := SUBSTR(V_ERROS, 1, 3)||'0'||SUBSTR(V_ERROS, 5);
   END IF;

   SELECT COUNT(1)
     INTO V_COUNT
     FROM REFOREG, FILIAL
    WHERE REFOREG.CDREGIAO = FILIAL.CDREGIAO
      AND CDFORNECED       = P_CDFORNOPELOG
      AND CDFILIAL         = P_CDFILDEST;
   IF V_COUNT > 0 THEN
      /*Fornecedor nao atende a regiao/filial informada.*/
      V_ERROS := SUBSTR(V_ERROS, 1, 4)||'1'||SUBSTR(V_ERROS, 6);
   ELSE
      SELECT COUNT(1)
        INTO V_COUNT
        FROM REFORFIL
       WHERE CDFORNECED = P_CDFORNOPELOG
         AND CDFILIAL   = P_CDFILDEST
         AND CDPERIENTR IS NULL;
      IF V_COUNT > 0 THEN
         /*Fornecedor nao atende a regiao/filial informada.*/
         V_ERROS := SUBSTR(V_ERROS, 1, 4)||'1'||SUBSTR(V_ERROS, 6);
      ELSE
         V_ERROS := SUBSTR(V_ERROS, 1, 4)||'0'||SUBSTR(V_ERROS, 6);
      END IF;
   END IF;

   FOR C_PARTFILI IN(SELECT PARTFILI.CDFILIAL, PARTFILI.CDTIPPART, LISTAGG(PARTFILI.CDMARCA, '_') WITHIN GROUP (ORDER BY PARTFILI.CDMARCA) CDMARCA
                       FROM PARTFILI
                      WHERE PARTFILI.CDPRODUTO = P_CDPRODRUP
                        AND PARTFILI.CDFILIAL  = P_CDFILDEST
                        AND PARTFILI.CDTIPPART IN ('1', '2', '3', '7', '8', '9')
                      GROUP BY PARTFILI.CDFILIAL, PARTFILI.CDTIPPART)
   LOOP
      IF (C_PARTFILI.CDMARCA <> P_CDMARCARUP) AND C_PARTFILI.CDTIPPART IN ('1', '7') THEN
         /*Marca Obrigatoria*/
         V_ERROS := SUBSTR(V_ERROS, 1, 5)||'1'||SUBSTR(V_ERROS, 7);
      ELSE
         V_ERROS := SUBSTR(V_ERROS, 1, 5)||'0'||SUBSTR(V_ERROS, 7);
      END IF;


      IF INSTR('_'||C_PARTFILI.CDMARCA||'_', P_CDMARCARUP) = 0 AND C_PARTFILI.CDTIPPART IN ('2', '8') THEN
         /*Marca Preferencial*/
         V_ERROS := SUBSTR(V_ERROS, 1, 6)||'1'||SUBSTR(V_ERROS, 8);
      ELSE
         V_ERROS := SUBSTR(V_ERROS, 1, 6)||'0'||SUBSTR(V_ERROS, 8);
      END IF;

      IF INSTR('_'||C_PARTFILI.CDMARCA||'_', P_CDMARCARUP) > 0 AND C_PARTFILI.CDTIPPART IN ('3', '9') THEN
         /*Restricao a Marca*/
         V_ERROS := SUBSTR(V_ERROS, 1, 7)||'1'||SUBSTR(V_ERROS, 9);
      ELSE
         V_ERROS := SUBSTR(V_ERROS, 1, 7)||'0'||SUBSTR(V_ERROS, 9);
      END IF;
   END LOOP;

   
   SELECT NVL(MAX(PRODPREFMED.CDPRODPREF), 'W')
     INTO V_CDPRODPREF
     FROM PARCMPSUP, PRODUTO, PRODPREFMED
    WHERE PARCMPSUP.CDFILIAL     = P_CDFILDEST
      AND PARCMPSUP.IDUTPRODPREF = 'S'
      AND PRODUTO.CDPRODUTO      = P_CDPRODRUP
      AND PRODPREFMED.CDFILIAL   = P_CDFILDEST
      AND PRODPREFMED.CDPRODUTO  = PRODUTO.CDPRODESTO;
   IF V_CDPRODPREF <> 'W' THEN
      IF V_CDPRODPREF <>  P_CDPRODRUP THEN
         /*Produto Preferencial*/
         V_ERROS := SUBSTR(V_ERROS, 1, 8)||'1'||SUBSTR(V_ERROS, 10);
      ELSE
         V_ERROS := SUBSTR(V_ERROS, 1, 8)||'0'||SUBSTR(V_ERROS, 10);
      END IF;
   END IF;

   SELECT NVL(MIN(ITEMCOLE.VRPRECUNIITM), 0)
     INTO V_VRPRECUNIITM
     FROM COLETAPR, ITEMCOLE, FILIAL
    WHERE FILIAL.CDFILIAL       = P_CDFILDEST
      AND COLETAPR.CDFILIAL     = P_CDFILCENTCMP
      AND COLETAPR.CDFILIAL     = ITEMCOLE.CDFILIAL
      AND COLETAPR.NRCOLEPRECO  = ITEMCOLE.NRCOLEPRECO
      AND NVL(COLETAPR.IDSITUCOLETA, 'C') = 'C'
      AND ITEMCOLE.CDPRODUTO    = P_CDPRODRUP
      AND ITEMCOLE.CDMARCA      = P_CDMARCARUP
      AND ITEMCOLE.CDREGIAO     = FILIAL.CDREGIAO
      AND ITEMCOLE.CDFORNECED   = P_CDFORNOPELOG
      AND P_DTPROGENTAF BETWEEN ITEMCOLE.DTINIVALITM AND ITEMCOLE.DTFINVALITM
      AND NVL(ITEMCOLE.VRPRECUNIITM, 0) > 0;

   IF V_VRPRECUNIITM = 0 THEN
      /*Item sem preco de cotacao.*/
      V_ERROS := SUBSTR(V_ERROS, 1, 9)||'1'||SUBSTR(V_ERROS, 11);
   ELSE
      V_ERROS := SUBSTR(V_ERROS, 1, 9)||'0'||SUBSTR(V_ERROS, 11);
   END IF;
   RETURN(V_ERROS);
END;
/