CREATE OR REPLACE PACKAGE SUP_VALIDATIONS AS

    K_FORN_N_CADASTRADO    CONSTANT VARCHAR2(30) := 'FORNECEDOR_NAO_CADASTRADO';
    K_FORN_MANY_INSCR      CONSTANT VARCHAR2(30) := 'INSCRICAO_CAD_MAIS_FORN';
    K_FORNECEDOR_INATIVO   CONSTANT VARCHAR2(30) := 'FORNECEDOR_INATIVO';
    K_FORN_NAO_QUALIFICADO CONSTANT VARCHAR2(30) := 'FORNECEDOR_NAO_QUALIFICADO';
    K_REGIAO_N_CADASTRADA  CONSTANT VARCHAR2(30) := 'REGIAO_NAO_CADASTRADA';
    K_PRODUTO_INATIVO      CONSTANT VARCHAR2(30) := 'PRODUTO_INATIVO';
    K_PROD_NIVEL_INCOMPL   CONSTANT VARCHAR2(30) := 'PRODUTO_NIVEL_INCOMPLETO';
    K_UTL_PROD_COMPRA      CONSTANT VARCHAR2(30) := 'UTILIZA_SOMENTE_PROD_COMPRA';
    K_PRODUTO_N_CADASTRADO CONSTANT VARCHAR2(30) := 'PRODUTO_NAO_CADASTRADO';
    K_MARCA_INATIVA        CONSTANT VARCHAR2(30) := 'MARCA_INATIVA';
    K_MARCA_NAO_CADASTRADA CONSTANT VARCHAR2(30) := 'MARCA_NAO_CADASTRADA';
    K_FORN_N_ATENDE_REGIAO CONSTANT VARCHAR2(30) := 'FORNECEDOR_NAO_ATENDE_REGIAO';
    K_QUAL_MARCA_PRODUTO   CONSTANT VARCHAR2(30) := 'QUALIFICACA0_MARCA_PRODUTO';
    K_PROD_NAO_QUALIF_FORN CONSTANT VARCHAR2(30) := 'PROD_NAO_QUALIF_FORN';
    K_PRODUTO_FORNECEDOR   CONSTANT VARCHAR2(30) := 'PRODUTO_NAO_CADASTRADO_FORN';
    K_CENTRAL_N_PARAM      CONSTANT VARCHAR2(30) := 'CENTRAL_NAO_PARAMETRIZADA';

    K_N                    CONSTANT VARCHAR2(01) := 'N';
    K_S                    CONSTANT VARCHAR2(01) := 'S';
    K_I                    CONSTANT VARCHAR2(01) := 'I';
    K_D                    CONSTANT VARCHAR2(01) := 'D';
    K_M                    CONSTANT VARCHAR2(01) := 'M';
    K_VZERO                CONSTANT VARCHAR2(01) := '0';
    K_V2                   CONSTANT VARCHAR2(01) := '2';
    K_N1                   CONSTANT NUMBER       := 1;
    K_N3                   CONSTANT NUMBER       := 3;

    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);

    PROCEDURE CHECK_REGIAO(P_CDREGIAO IN  VARCHAR2,
                           P_MESSAGE  OUT VARCHAR2, 
                           P_REGIOES  OUT REGIAO%ROWTYPE);

    PROCEDURE CHECK_PRODUTO(P_CDARVPROD IN  VARCHAR2,
                            P_PARASUPRI IN  PARASUPRI%ROWTYPE DEFAULT NULL,
                            P_MESSAGE   OUT VARCHAR2, 
                            P_PRODUTOS  OUT PRODUTO%ROWTYPE);

    PROCEDURE CHECK_MARCA(P_CDMARCA IN  VARCHAR2,
                          P_MESSAGE OUT VARCHAR2, 
                          P_MARCAS  OUT MARCA%ROWTYPE);

    /*
     * Verifica se produto cadastrado por fornecedor
     *
     */
    FUNCTION CHECK_PRODUTO_FORNECEDOR(P_CDPRODUTO  IN PRODUTO.CDPRODUTO%TYPE,
                                      P_CDFORNECED IN FORNECEDOR.CDFORNECED%TYPE) RETURN VARCHAR2;
    
    /*
     * Verifica se fornecedor atende a regiao
     *
     */
    FUNCTION FORNECEDOR_ATENDE_REGIAO(P_CDFORNECED IN FORNECEDOR.CDFORNECED%TYPE,
                                      P_CDREGIAO   IN REGIAO.CDREGIAO%TYPE) RETURN VARCHAR2;
    
    /*
     * Verifica a qualificacao de marca por produto
     *
     */
    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;

    /*
     * Verifica a qualificacao de produto por fornecedor
     *
     */
    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;

    PROCEDURE CHECK_PARASUPRI(P_CDFILIAL   IN PARASUPRI.CDFILIAL%TYPE,
                              P_PARASUPRI OUT PARASUPRI%ROWTYPE,
                              P_ERROR     OUT VARCHAR2);                                   

END SUP_VALIDATIONS;
/

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_V2;
               
                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, K_N3, K_VZERO);
    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 K_N1
          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 K_N1
          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;        
    BEGIN
        FOR C_QUALIF IN (SELECT IDAPRMARPRO, IDAUTMARPRO, DTVALAPROVA
                           FROM QFOMARPROD
                          WHERE CDPRODUTO = P_CDPRODUTO
                            AND CDMARCA   = P_CDMARCA)
        LOOP
            IF C_QUALIF.IDAPRMARPRO = K_N AND C_QUALIF.IDAUTMARPRO = K_N THEN
                V_COUNT := K_N1;
            ELSE
                IF P_PARASUPRI.IDULTIDTVALQ = K_M AND C_QUALIF.IDAPRMARPRO = K_S 
                                                  AND P_DTPEDIDO > LAST_DAY(C_QUALIF.DTVALAPROVA) THEN
                    V_COUNT := K_N1; 
                ELSIF P_PARASUPRI.IDULTIDTVALQ = K_D AND C_QUALIF.IDAPRMARPRO = K_S 
                                                     AND P_DTPEDIDO > C_QUALIF.DTVALAPROVA THEN
                    V_COUNT := K_N1;
                END IF;
            END IF;
        END LOOP;
        
        IF V_COUNT = 0 AND NVL(P_PARASUPRI.IDMARSEMQUA, K_N) = K_N 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;
/