CREATE OR REPLACE FUNCTION SUPVALIDATIONS(P_CDFILIAL     IN FILIAL.CDFILIAL%TYPE,
                                          P_CDFORNECED   IN FORNECEDOR.CDFORNECED%TYPE,
                                          P_NRINSJURFORN IN FORNECEDOR.NRINSJURFORN%TYPE,
                                          P_DATA         IN DATE,
                                          P_CDREGIAO     IN REGIAO.CDREGIAO%TYPE,
                                          P_CDPRODUTO    IN PRODUTO.CDPRODUTO%TYPE,
                                          P_CDARVPROD    IN PRODUTO.CDARVPROD%TYPE,
                                          P_CDMARCA      IN MARCA.CDMARCA%TYPE,
                                          P_CDOPERADOR   IN OPERADOR.CDOPERADOR%TYPE) RETURN SUPVALIDATIONS_TABLE PIPELINED IS
    C_PARASUPRI    PARASUPRI%ROWTYPE;
    C_FORNECEDOR   FORNECEDOR%ROWTYPE;
    C_REGIAO       REGIAO%ROWTYPE;
    C_PRODUTO      PRODUTO%ROWTYPE;
    C_MARCA        MARCA%ROWTYPE;
    C_FILIAL       FILIAL%ROWTYPE;
    C_PARAMPRODSUP PARAMPRODSUP%ROWTYPE;
    V_ERROR        VARCHAR2(200) := NULL;
    V_FIRST_VALUE  VARCHAR2(200) := NULL;
    V_SECOND_VALUE VARCHAR2(200) := NULL;
    V_EXISTS       NUMBER;
    
    OUT_RECORD SUPVALIDATIONS_TYPE := SUPVALIDATIONS_TYPE(NULL, NULL, NULL, NULL, NULL, NULL);
BEGIN
    IF P_CDFILIAL IS NOT NULL THEN
        SUP_VALIDATIONS.CHECK_PARASUPRI(P_CDFILIAL  => P_CDFILIAL,
                                        P_FILIAL    => C_FILIAL,
                                        P_PARASUPRI => C_PARASUPRI,
                                        P_ERROR     => V_ERROR);
        IF V_ERROR IS NOT NULL THEN
            OUT_RECORD.DSERROR    := V_ERROR;
            OUT_RECORD.CDARVPROD  := NULL;
            OUT_RECORD.NMFANTFORN := NULL;
            OUT_RECORD.CDREGIAO   := NULL;
            OUT_RECORD.CDMARCA    := NULL;
            OUT_RECORD.CDOPERADOR := NULL;
            PIPE ROW (OUT_RECORD);
        END IF;
    END IF;

    IF V_ERROR IS NULL THEN
        IF P_CDARVPROD IS NOT NULL THEN
            SUP_VALIDATIONS.CHECK_PRODUTO(P_CDARVPROD => P_CDARVPROD,
                                          P_PARASUPRI => C_PARASUPRI,
                                          P_MESSAGE   => V_ERROR, 
                                          P_PRODUTOS  => C_PRODUTO);
            IF V_ERROR IS NOT NULL THEN
                OUT_RECORD.DSERROR    := V_ERROR;
                OUT_RECORD.CDARVPROD  := C_PRODUTO.CDARVPROD;
                OUT_RECORD.NMFANTFORN := NULL;
                OUT_RECORD.CDREGIAO   := NULL;
                OUT_RECORD.CDMARCA    := NULL;
                OUT_RECORD.CDOPERADOR := NULL;
                PIPE ROW (OUT_RECORD);
            END IF;
        
            SUP_VALIDATIONS.CHECK_PRODUTO_ATIVO(P_CDPRODUTO => C_PRODUTO.CDPRODUTO,
                                                P_MESSAGE   => V_ERROR);
            IF V_ERROR IS NOT NULL THEN
                OUT_RECORD.DSERROR    := V_ERROR;
                OUT_RECORD.CDARVPROD  := C_PRODUTO.CDARVPROD;
                OUT_RECORD.NMFANTFORN := NULL;
                OUT_RECORD.CDREGIAO   := NULL;
                OUT_RECORD.CDMARCA    := NULL;
                OUT_RECORD.CDOPERADOR := NULL;
                PIPE ROW (OUT_RECORD);
            END IF;
        END IF;

        IF (P_NRINSJURFORN IS NOT NULL OR P_CDFORNECED IS NOT NULL) AND P_DATA IS NOT NULL THEN
            SUP_VALIDATIONS.CHECK_FORNECEDOR(P_NRINSJURFORN => P_NRINSJURFORN,
                                             P_CDFORNECED   => P_CDFORNECED,
                                             P_DTPEDIDO     => P_DATA,
                                             P_PARASUPRI    => C_PARASUPRI,
                                             P_FORNECEDORES => C_FORNECEDOR,
                                             P_MESSAGE      => V_ERROR);
            IF V_ERROR IS NOT NULL THEN
                OUT_RECORD.DSERROR    := V_ERROR;
                OUT_RECORD.CDARVPROD  := NULL;
                OUT_RECORD.NMFANTFORN := C_FORNECEDOR.NMFANTFORN;
                OUT_RECORD.CDREGIAO   := NULL;
                OUT_RECORD.CDMARCA    := NULL;
                OUT_RECORD.CDOPERADOR := NULL;
                PIPE ROW (OUT_RECORD);
            END IF;
        END IF;
        
        IF P_CDREGIAO IS NOT NULL THEN
            SUP_VALIDATIONS.CHECK_REGIAO(P_CDREGIAO => P_CDREGIAO,
                                         P_MESSAGE  => V_ERROR,
                                         P_REGIOES  => C_REGIAO);
            IF V_ERROR IS NOT NULL THEN
                OUT_RECORD.DSERROR    := V_ERROR;
                OUT_RECORD.CDARVPROD  := NULL;
                OUT_RECORD.NMFANTFORN := NULL;
                OUT_RECORD.CDREGIAO   := C_REGIAO.CDREGIAO;
                OUT_RECORD.CDMARCA    := NULL;
                OUT_RECORD.CDOPERADOR := NULL;
                PIPE ROW (OUT_RECORD);
            END IF;
        END IF;

        IF P_CDMARCA IS NOT NULL THEN
            SUP_VALIDATIONS.CHECK_MARCA(P_CDMARCA => P_CDMARCA,
                                        P_MESSAGE => V_ERROR,
                                        P_MARCAS  => C_MARCA);
            IF V_ERROR IS NOT NULL THEN
                OUT_RECORD.DSERROR    := V_ERROR;
                OUT_RECORD.CDARVPROD  := NULL;
                OUT_RECORD.NMFANTFORN := NULL;
                OUT_RECORD.CDREGIAO   := NULL;
                OUT_RECORD.CDMARCA    := C_MARCA.CDMARCA;
                OUT_RECORD.CDOPERADOR := NULL;
                PIPE ROW (OUT_RECORD);
            END IF;
        END IF;

        IF C_PRODUTO.CDPRODUTO IS NOT NULL AND C_MARCA.CDMARCA IS NOT NULL THEN
            V_ERROR := SUP_VALIDATIONS.CHECK_PRODUTO_MARCA(P_CDPRODUTO => C_PRODUTO.CDPRODUTO,
                                                           P_CDMARCA   => C_MARCA.CDMARCA);
            IF V_ERROR IS NOT NULL THEN
                OUT_RECORD.DSERROR    := V_ERROR;
                OUT_RECORD.CDARVPROD  := C_PRODUTO.CDARVPROD;
                OUT_RECORD.NMFANTFORN := NULL;
                OUT_RECORD.CDREGIAO   := NULL;
                OUT_RECORD.CDMARCA    := C_MARCA.CDMARCA;
                OUT_RECORD.CDOPERADOR := NULL;
                PIPE ROW (OUT_RECORD);
            END IF;

            IF P_DATA IS NOT NULL THEN
                V_ERROR := SUP_VALIDATIONS.QUALIFICACAO_MARCA_PRODUTO(P_CDPRODUTO => C_PRODUTO.CDPRODUTO,
                                                                      P_CDMARCA   => C_MARCA.CDMARCA,
                                                                      P_DTPEDIDO  => P_DATA,
                                                                      P_PARASUPRI => C_PARASUPRI);
                IF V_ERROR IS NOT NULL THEN
                    OUT_RECORD.DSERROR    := V_ERROR;
                    OUT_RECORD.CDARVPROD  := C_PRODUTO.CDARVPROD;
                    OUT_RECORD.NMFANTFORN := NULL;
                    OUT_RECORD.CDREGIAO   := NULL;
                    OUT_RECORD.CDMARCA    := C_MARCA.CDMARCA;
                    OUT_RECORD.CDOPERADOR := NULL;
                    PIPE ROW (OUT_RECORD);
                END IF;
            END IF;
        END IF;    

        IF C_PRODUTO.CDPRODUTO IS NOT NULL AND C_FORNECEDOR.CDFORNECED IS NOT NULL THEN
            V_ERROR := SUP_VALIDATIONS.CHECK_PRODUTO_FORNECEDOR(P_CDPRODUTO  => C_PRODUTO.CDPRODUTO,
                                                                P_CDFORNECED => C_FORNECEDOR.CDFORNECED);
            IF V_ERROR IS NOT NULL THEN
                OUT_RECORD.DSERROR    := V_ERROR;
                OUT_RECORD.CDARVPROD  := C_PRODUTO.CDARVPROD;
                OUT_RECORD.NMFANTFORN := C_FORNECEDOR.NMFANTFORN;
                OUT_RECORD.CDREGIAO   := NULL;
                OUT_RECORD.CDMARCA    := NULL;
                OUT_RECORD.CDOPERADOR := NULL;
                PIPE ROW (OUT_RECORD);
            END IF;

            IF P_DATA IS NOT NULL THEN
                V_ERROR := SUP_VALIDATIONS.QUALIFICACAO_PROD_FORN(P_CDPRODUTO  => C_PRODUTO.CDPRODUTO,
                                                                  P_CDFORNECED => C_FORNECEDOR.CDFORNECED,
                                                                  P_DTPEDIDO   => P_DATA,
                                                                  P_PARASUPRI  => C_PARASUPRI);
                IF V_ERROR IS NOT NULL THEN
                    OUT_RECORD.DSERROR    := V_ERROR;
                    OUT_RECORD.CDARVPROD  := C_PRODUTO.CDARVPROD;
                    OUT_RECORD.NMFANTFORN := C_FORNECEDOR.NMFANTFORN;
                    OUT_RECORD.CDREGIAO   := NULL;
                    OUT_RECORD.CDMARCA    := NULL;
                    OUT_RECORD.CDOPERADOR := NULL;
                    PIPE ROW (OUT_RECORD);
                END IF;
            END IF;            
        END IF;

        IF C_REGIAO.CDREGIAO IS NOT NULL AND C_FORNECEDOR.CDFORNECED IS NOT NULL THEN
            V_ERROR := SUP_VALIDATIONS.FORNECEDOR_ATENDE_REGIAO(P_CDFORNECED => C_FORNECEDOR.CDFORNECED,
                                                                P_CDREGIAO   => C_REGIAO.CDREGIAO);
            IF V_ERROR IS NOT NULL THEN
                OUT_RECORD.DSERROR    := V_ERROR;
                OUT_RECORD.CDARVPROD  := NULL;
                OUT_RECORD.NMFANTFORN := C_FORNECEDOR.NMFANTFORN;
                OUT_RECORD.CDREGIAO   := C_REGIAO.CDREGIAO;
                OUT_RECORD.CDMARCA    := NULL;
                OUT_RECORD.CDOPERADOR := NULL;
                PIPE ROW (OUT_RECORD);
            END IF;
        END IF;

        IF C_PRODUTO.CDPRODUTO IS NOT NULL AND P_CDOPERADOR IS NOT NULL THEN
            V_ERROR := SUP_VALIDATIONS.CHECK_PRODUTO_COMPRADOR(P_CDPRODUTO  => C_PRODUTO.CDPRODUTO,
                                                               P_CDOPERADOR => P_CDOPERADOR);
            IF V_ERROR IS NOT NULL THEN
                OUT_RECORD.DSERROR    := V_ERROR;
                OUT_RECORD.CDARVPROD  := C_PRODUTO.CDARVPROD;
                OUT_RECORD.NMFANTFORN := NULL;
                OUT_RECORD.CDREGIAO   := NULL;
                OUT_RECORD.CDMARCA    := NULL;
                OUT_RECORD.CDOPERADOR := P_CDOPERADOR;
                PIPE ROW (OUT_RECORD);
            END IF;
        END IF;

        IF C_FILIAL.CDFILIAL IS NOT NULL AND 
           C_REGIAO.CDREGIAO IS NOT NULL AND
           C_PRODUTO.CDPRODUTO IS NOT NULL 
        THEN
            IF C_FILIAL.IDFUNCAOFILI = 'C' THEN
                SUP_VALIDATIONS.GETPARAMPRODSUP(P_CDFILIAL     => C_FILIAL.CDFILIAL,
                                                P_CDREGIAO     => C_REGIAO.CDREGIAO,
                                                P_CDPRODUTO    => C_PRODUTO.CDPRODUTO,
                                                P_PARAMPRODSUP => C_PARAMPRODSUP);
                              
                              
                IF C_PARAMPRODSUP.IDFILINEGCOR = 'S' THEN
                    OUT_RECORD.DSERROR    := SUP_VALIDATIONS.K_PROD_NCORPORATIVA;
                    OUT_RECORD.CDARVPROD  := C_PRODUTO.CDARVPROD;
                    OUT_RECORD.NMFANTFORN := NULL;
                    OUT_RECORD.CDREGIAO   := C_REGIAO.CDREGIAO;
                    OUT_RECORD.CDMARCA    := NULL;
                    OUT_RECORD.CDOPERADOR := NULL;
                    PIPE ROW (OUT_RECORD);
                END IF;
            ELSE
                IF C_FILIAL.IDFUNCAOFILI = 'R' THEN
                    SUP_VALIDATIONS.GETPARAMPRODSUP(P_CDFILIAL     => C_FILIAL.CDFILIAL,
                                                    P_CDREGIAO     => C_REGIAO.CDREGIAO,
                                                    P_CDPRODUTO    => C_PRODUTO.CDPRODUTO,
                                                    P_PARAMPRODSUP => C_PARAMPRODSUP);
                    
                    IF C_PARAMPRODSUP.IDFILINEGREG = 'S' THEN
                        OUT_RECORD.DSERROR    := SUP_VALIDATIONS.K_PROD_NREGIONAL;
                        OUT_RECORD.CDARVPROD  := C_PRODUTO.CDARVPROD;
                        OUT_RECORD.NMFANTFORN := NULL;
                        OUT_RECORD.CDREGIAO   := C_REGIAO.CDREGIAO;
                        OUT_RECORD.CDMARCA    := NULL;
                        OUT_RECORD.CDOPERADOR := NULL;
                        PIPE ROW (OUT_RECORD);
                    END IF;                    
                END IF;
            END IF;

            IF C_FORNECEDOR.CDFORNECED IS NOT NULL AND 
               C_PRODUTO.CDPRODUTO IS NOT NULL AND 
               C_MARCA.CDMARCA IS NOT NULL 
            THEN
                V_ERROR := SUP_VALIDATIONS.CHECK_EAN(P_FORNECEDOR => C_FORNECEDOR,
                                                     P_CDPRODUTO  => C_PRODUTO.CDPRODUTO,
                                                     P_CDMARCA    => C_MARCA.CDMARCA);
                IF V_ERROR IS NOT NULL THEN
                    OUT_RECORD.DSERROR    := V_ERROR;
                    OUT_RECORD.CDARVPROD  := C_PRODUTO.CDARVPROD;
                    OUT_RECORD.NMFANTFORN := C_FORNECEDOR.NMFANTFORN;
                    OUT_RECORD.CDREGIAO   := NULL;
                    OUT_RECORD.CDMARCA    := C_MARCA.CDMARCA;
                    OUT_RECORD.CDOPERADOR := NULL;
                    PIPE ROW (OUT_RECORD);
                END IF;                
            END IF;
        END IF;
    END IF;
END SUPVALIDATIONS;
/