CREATE OR REPLACE PACKAGE BODY SUP_VALIDATIONS AS

    PROCEDURE CHECK_FORNECEDOR(P_NRINSJURFORN IN FORNECEDOR.NRINSJURFORN%TYPE DEFAULT NULL,
                               P_CDFORNECED   IN FORNECEDOR.CDFORNECED%TYPE   DEFAULT NULL,
                               P_DTPEDIDO     IN DATE                         DEFAULT NULL,
                               P_PARASUPRI    IN PARASUPRI%ROWTYPE            DEFAULT NULL,
                               P_FORNECEDORES OUT FORNECEDOR%ROWTYPE,
                               P_MESSAGE      OUT VARCHAR2) IS
        C_FORNECEDORES FORNECEDOR%ROWTYPE;
        C_QUALIFICACAO QUALIFICACAO%ROWTYPE;
    BEGIN
        IF P_CDFORNECED IS NULL THEN 
            SELECT *
              INTO C_FORNECEDORES
              FROM FORNECEDOR
             WHERE NRINSJURFORN = P_NRINSJURFORN;
        ELSE
            SELECT *
              INTO C_FORNECEDORES
              FROM FORNECEDOR
             WHERE CDFORNECED = P_CDFORNECED;
        END IF;

        IF C_FORNECEDORES.IDSITUCADA = K_I THEN
            P_MESSAGE := K_FORNECEDOR_INATIVO;
            RETURN;
        END IF;
        
        IF C_FORNECEDORES.IDFORNAUTO = K_N AND P_PARASUPRI.IDULTIDTVALQ IS NOT NULL 
                                           AND P_DTPEDIDO IS NOT NULL THEN
            BEGIN 
                SELECT *
                  INTO C_QUALIFICACAO
                  FROM QUALIFICACAO
                 WHERE CDQUALIF    = C_FORNECEDORES.CDQUALIF
                   AND IDPERCOTCMP = K_2;
               
                IF P_PARASUPRI.IDULTIDTVALQ = K_D AND P_DTPEDIDO > C_FORNECEDORES.DTVALQUALIF THEN
                    P_MESSAGE := K_FORN_NAO_QUALIFICADO;
                    RETURN;
                END IF;
                
                IF P_PARASUPRI.IDULTIDTVALQ = K_M AND P_DTPEDIDO > LAST_DAY(C_FORNECEDORES.DTVALQUALIF) THEN
                    P_MESSAGE := K_FORN_NAO_QUALIFICADO;
                    RETURN;
                END IF;
            EXCEPTION
                WHEN NO_DATA_FOUND THEN
                    NULL;
            END ;
        END IF;

        P_FORNECEDORES := C_FORNECEDORES;
    EXCEPTION
        WHEN TOO_MANY_ROWS THEN
            P_MESSAGE := K_FORN_MANY_INSCR;
        WHEN NO_DATA_FOUND THEN
            P_MESSAGE := K_FORN_N_CADASTRADO;
    END CHECK_FORNECEDOR;

    PROCEDURE CHECK_REGIAO(P_CDREGIAO IN  VARCHAR2,
                           P_MESSAGE  OUT VARCHAR2, 
                           P_REGIOES  OUT REGIAO%ROWTYPE) IS
    BEGIN
        SELECT *
          INTO P_REGIOES
          FROM REGIAO
         WHERE CDREGIAO = LPAD(P_CDREGIAO, 3, K_0);
    EXCEPTION
        WHEN NO_DATA_FOUND THEN
            P_MESSAGE := K_REGIAO_N_CADASTRADA;
    END CHECK_REGIAO;

    PROCEDURE CHECK_PRODUTO(P_CDARVPROD IN  VARCHAR2,
                            P_PARASUPRI IN  PARASUPRI%ROWTYPE DEFAULT NULL,
                            P_MESSAGE   OUT VARCHAR2, 
                            P_PRODUTOS  OUT PRODUTO%ROWTYPE) IS
        C_PRODUTOS    PRODUTO%ROWTYPE;
        V_CDNVPRODUTO PRODUTO.CDNVPRODUTO%TYPE;
    BEGIN
        SELECT *
          INTO C_PRODUTOS
          FROM PRODUTO
         WHERE CDARVPROD = P_CDARVPROD;
        
        IF C_PRODUTOS.IDPRODATIVPR = K_N THEN
            P_MESSAGE := K_PRODUTO_INATIVO;
            RETURN;
        END IF;

        SELECT MAX(CDNVPRODUTO) 
          INTO V_CDNVPRODUTO
          FROM PRODUTO;

        IF C_PRODUTOS.CDNVPRODUTO <> V_CDNVPRODUTO THEN
            P_MESSAGE := K_PROD_NIVEL_INCOMPL;
            RETURN;
        END IF;

        IF P_PARASUPRI.IDUTLPROCMP = 'S' AND C_PRODUTOS.CDPRODUTO = C_PRODUTOS.CDPRODESTO THEN
            P_MESSAGE := K_UTL_PROD_COMPRA;
            RETURN;
        END IF;

        P_PRODUTOS := C_PRODUTOS;
    EXCEPTION
        WHEN NO_DATA_FOUND THEN
            P_MESSAGE := K_PRODUTO_N_CADASTRADO;
    END CHECK_PRODUTO;

    PROCEDURE CHECK_MARCA(P_CDMARCA IN  VARCHAR2,
                          P_MESSAGE OUT VARCHAR2, 
                          P_MARCAS  OUT MARCA%ROWTYPE) IS
        C_MARCAS MARCA%ROWTYPE;
    BEGIN
        SELECT *
          INTO C_MARCAS
          FROM MARCA
         WHERE CDMARCA = P_CDMARCA;

        IF C_MARCAS.IDMARCAATIVA = K_I THEN 
            P_MESSAGE := K_MARCA_INATIVA;
        END IF;

        P_MARCAS := C_MARCAS;
    EXCEPTION
        WHEN NO_DATA_FOUND THEN
            P_MESSAGE := K_MARCA_NAO_CADASTRADA;
    END CHECK_MARCA;

    FUNCTION CHECK_PRODUTO_FORNECEDOR(P_CDPRODUTO  IN PRODUTO.CDPRODUTO%TYPE,
                                      P_CDFORNECED IN FORNECEDOR.CDFORNECED%TYPE) 
    RETURN VARCHAR2 IS
        V_EXISTS NUMBER;
    BEGIN
        SELECT 1
          INTO V_EXISTS
          FROM PRODFORNCOMP
         WHERE CDPRODCOMPL = P_CDPRODUTO
           AND CDFORNECED  = P_CDFORNECED;

        RETURN NULL;
    EXCEPTION
        WHEN NO_DATA_FOUND THEN
            RETURN K_PRODUTO_FORNECEDOR;
    END CHECK_PRODUTO_FORNECEDOR;

    FUNCTION FORNECEDOR_ATENDE_REGIAO(P_CDFORNECED IN FORNECEDOR.CDFORNECED%TYPE,
                                      P_CDREGIAO   IN REGIAO.CDREGIAO%TYPE)                                               
    RETURN VARCHAR2 IS
        V_EXISTS NUMBER;
    BEGIN
        SELECT 1
          INTO V_EXISTS
          FROM REFOREG
         WHERE REFOREG.CDREGIAO   = P_CDREGIAO
           AND REFOREG.CDFORNECED = P_CDFORNECED;

        RETURN K_FORN_N_ATENDE_REGIAO;
    EXCEPTION
        WHEN NO_DATA_FOUND THEN
            RETURN NULL;
    END FORNECEDOR_ATENDE_REGIAO;

    FUNCTION QUALIFICACAO_MARCA_PRODUTO(P_CDPRODUTO IN PRODUTO.CDPRODUTO%TYPE,
                                        P_CDMARCA   IN MARCA.CDMARCA%TYPE,
                                        P_DTPEDIDO  IN DATE,
                                        P_PARASUPRI IN PARASUPRI%ROWTYPE)
    RETURN VARCHAR2 IS
        V_COUNT NUMBER := 0;
        V_COUNTAUX NUMBER := 0;
    BEGIN
       SELECT COUNT(1)
         INTO V_COUNT
         FROM QFOMARPROD
        WHERE QFOMARPROD.CDPRODUTO = P_CDPRODUTO
          AND QFOMARPROD.CDMARCA   = P_CDMARCA
          AND ((QFOMARPROD.IDAPRMARPRO = 'N' AND QFOMARPROD.IDAUTMARPRO = 'N') OR
               ((QFOMARPROD.IDAPRMARPRO = 'S') AND ((P_PARASUPRI.IDULTIDTVALQ = 'M' AND
                                                     P_DTPEDIDO > LAST_DAY(QFOMARPROD.DTVALAPROVA)) OR
                                                    (P_PARASUPRI.IDULTIDTVALQ = 'D' AND
                                                     P_DTPEDIDO > QFOMARPROD.DTVALAPROVA))));

       SELECT COUNT(1)
         INTO V_COUNTAUX
         FROM (SELECT 1
                 FROM QFOMARPROD
                WHERE QFOMARPROD.CDPRODUTO = P_CDPRODUTO
                  AND QFOMARPROD.CDMARCA   = P_CDMARCA
                UNION
               SELECT 1
                 FROM DUAL
                WHERE NVL(P_PARASUPRI.IDMARSEMQUA, 'N') = 'N');

       IF V_COUNT = 0 AND V_COUNTAUX <> 0 THEN
          RETURN NULL;
       ELSE
            RETURN K_QUAL_MARCA_PRODUTO;
        END IF;
    END QUALIFICACAO_MARCA_PRODUTO;

    FUNCTION QUALIFICACAO_PROD_FORN(P_CDPRODUTO  IN PRODUTO.CDPRODUTO%TYPE, 
                                    P_CDFORNECED IN FORNECEDOR.CDFORNECED%TYPE,
                                    P_DTPEDIDO   IN DATE,
                                    P_PARASUPRI  IN PARASUPRI%ROWTYPE)
    RETURN VARCHAR2 IS
    BEGIN
        FOR C_QUALIF IN (SELECT IDFORNAPROV, IDFORNAUTOR, DTVALPRFORN
                          FROM QFOPRODFORN
                         WHERE CDPRODUTO   = P_CDPRODUTO
                           AND CDFORNECED  = P_CDFORNECED)
        LOOP
            IF C_QUALIF.IDFORNAPROV = K_N AND C_QUALIF.IDFORNAUTOR = K_N THEN
                RETURN K_PROD_NAO_QUALIF_FORN;
            END IF;

            IF P_PARASUPRI.IDULTIDTVALQ = K_D AND C_QUALIF.IDFORNAPROV = K_S 
                                              AND P_DTPEDIDO > C_QUALIF.DTVALPRFORN THEN
                RETURN K_PROD_NAO_QUALIF_FORN;
            END IF;

            IF P_PARASUPRI.IDULTIDTVALQ = K_M AND C_QUALIF.IDFORNAPROV = K_S 
                                              AND P_DTPEDIDO > LAST_DAY(C_QUALIF.DTVALPRFORN) THEN
                RETURN K_PROD_NAO_QUALIF_FORN;
            END IF;
        END LOOP;
        
        RETURN NULL;
    END QUALIFICACAO_PROD_FORN;

    PROCEDURE CHECK_PARASUPRI(P_CDFILIAL   IN PARASUPRI.CDFILIAL%TYPE,
                              P_PARASUPRI OUT PARASUPRI%ROWTYPE,
                              P_ERROR     OUT VARCHAR2) IS
    BEGIN
        SELECT *
          INTO P_PARASUPRI
          FROM PARASUPRI 
         WHERE CDFILIAL = P_CDFILIAL;
    EXCEPTION
        WHEN NO_DATA_FOUND THEN
            P_ERROR := K_CENTRAL_N_PARAM;
    END CHECK_PARASUPRI;

END SUP_VALIDATIONS;
/