CREATE OR ALTER PROCEDURE SPC_PEDIDO_PRECO_MODELO_01 (
    CLIENTE_ID INTEGER,
    ESTABELECIMENTO_ID INTEGER,
    PRODUTO_ID INTEGER,
    MODELO_ID INTEGER,
    GRADE_ID INTEGER,
    PRECO_NF_CF_ID INTEGER = 0,
    DATA_PEDIDO DATE = 'NOW')
RETURNS (
    TIPO INTEGER,
    TAMANHO INTEGER,
    TAMANHO_DESCRICAO VARCHAR(50),
    TAMANHO_PRECO NUMERIC(15,4),
    VALIDO INTEGER)
AS
DECLARE VARIABLE EMPRESA_VINCULO INTEGER;
DECLARE VARIABLE PERCENTUAL_BASE NUMERIC(18,8);
DECLARE VARIABLE DECIMAIS_BASE   INTEGER;
DECLARE VARIABLE TABELA_VALIDA   INTEGER;
BEGIN

--    EMPRESA_VINCULO = COALESCE((SELECT FIRST 1 C.EMPRESA_VINCULO FROM TBCLIENTE C WHERE C.CODIGO = :CLIENTE_ID),0);
    EMPRESA_VINCULO = COALESCE((SELECT FIRST 1 W.EMPRESA_GRUPO_ID FROM TBEMPRESA_GRUPO_CONTAS W WHERE W.EMPRESA_ID = :CLIENTE_ID),0);
    PERCENTUAL_BASE = COALESCE((SELECT FIRST 1 COALESCE(C.PERCENTUAL_BASE,0.00)/100.00 FROM TBTABELA_PRECO C WHERE C.ID = :PRECO_NF_CF_ID),0);
    DECIMAIS_BASE   = COALESCE((SELECT FIRST 1 COALESCE(C.DECIMAIS_BASE,2) FROM TBTABELA_PRECO C WHERE C.ID = :PRECO_NF_CF_ID),2);
    TABELA_VALIDA   = COALESCE((SELECT FIRST 1 1 FROM TBTABELA_PRECO D WHERE D.ID = :PRECO_NF_CF_ID AND :DATA_PEDIDO BETWEEN D.DATA_INICIAL AND D.DATA_FINAL),0);

    FOR

    SELECT
        TIPO,
        TAMANHO,
        TAMANHO_DESCRICAO,
        TAMANHO_PRECO,
        VALIDO
        FROM
            (
            SELECT
                TIPO,
                TAMANHO,
                (SELECT FIRST 1 TAM_DESCRICAO FROM SP_TAMANHO_GRADE(:GRADE_ID,TAMANHO)) TAMANHO_DESCRICAO,
                CAST(X.PRECO_VENDA AS NUMERIC(15,4)) TAMANHO_PRECO,
                VALIDO
            
            FROM
                (
                SELECT
                    1 TIPO,
                    S.TAMANHO,
                    A.PRECO_VENDA AS PRECO_VENDA,
                    :TABELA_VALIDA AS VALIDO

                FROM
                    TBGRADE_SEQ S
                    LEFT JOIN TBCLIENTE_PRODUTO_PRECO A ON (A.CLIENTE_CODIGO = :CLIENTE_ID AND A.PRODUTO_CODIGO = :PRODUTO_ID AND A.TABELA_ID = :PRECO_NF_CF_ID)
                
                WHERE
                    S.TAMANHO > 0
                
                UNION
                
                SELECT
                    1 TIPO,
                    S.TAMANHO,
                    FN_NUMBER_CAST((C.PRECO_VENDA*:PERCENTUAL_BASE),:DECIMAIS_BASE) AS PRECO_VENDA,
                    :TABELA_VALIDA AS VALIDO

                FROM
                    TBGRADE_SEQ S
                    LEFT JOIN TBCLIENTE_PRODUTO_PRECO C ON (C.CLIENTE_CODIGO = :CLIENTE_ID AND C.PRODUTO_CODIGO = :PRODUTO_ID AND C.TABELA_ID = (SELECT FIRST 1 C.TABELA_PRECO_ID_BASE FROM TBTABELA_PRECO C WHERE C.ID = :PRECO_NF_CF_ID))
                
                WHERE
                    S.TAMANHO > 0
                
                UNION

                SELECT
                    1 TIPO,
                    S.TAMANHO,
                    A.PRECO_VENDA AS PRECO_VENDA,
                    :TABELA_VALIDA AS VALIDO

                FROM
                    TBGRADE_SEQ S,(SELECT FIRST 1 B.*,
                     COALESCE(C.PERCENTUAL_BASE,0.00) AS PERCENTUAL_BASE,
                     COALESCE(C.DECIMAIS_BASE,2) AS DECIMAIS_BASE
                     FROM TBCLIENTE_PRODUTO_PRECO B, TBTABELA_PRECO C
                     WHERE B.CLIENTE_CODIGO IN --(SELECT C.CODIGO FROM TBCLIENTE C WHERE C.EMPRESA_VINCULO = :EMPRESA_VINCULO)
                      (SELECT C.CODIGO FROM TBCLIENTE C, TBEMPRESA_GRUPO_CONTAS W WHERE W.EMPRESA_ID = C.CODIGO AND W.EMPRESA_GRUPO_ID = :EMPRESA_VINCULO)
                     AND B.PRODUTO_CODIGO    = :PRODUTO_ID
                     AND B.TABELA_ID        = C.ID
                     AND B.TABELA_ID        = :PRECO_NF_CF_ID) A
                
                WHERE
                    S.TAMANHO > 0
                
                UNION

                SELECT
                    1 TIPO,
                    S.TAMANHO,
                    FN_NUMBER_CAST((A.PRECO_VENDA*:PERCENTUAL_BASE),:DECIMAIS_BASE) AS PRECO_VENDA,
                    :TABELA_VALIDA AS VALIDO

                FROM
                    TBGRADE_SEQ S,(
                        SELECT FIRST 1 B.*,
                         COALESCE(C.PERCENTUAL_BASE,0.00) AS PERCENTUAL_BASE,
                         COALESCE(C.DECIMAIS_BASE,2) AS DECIMAIS_BASE
                         FROM TBCLIENTE_PRODUTO_PRECO B, TBTABELA_PRECO C
                         WHERE B.CLIENTE_CODIGO IN --(SELECT C.CODIGO FROM TBCLIENTE C WHERE C.EMPRESA_VINCULO = :EMPRESA_VINCULO)
                          (SELECT C.CODIGO FROM TBCLIENTE C, TBEMPRESA_GRUPO_CONTAS W WHERE W.EMPRESA_ID = C.CODIGO AND W.EMPRESA_GRUPO_ID = :EMPRESA_VINCULO)
                         AND B.PRODUTO_CODIGO    = :PRODUTO_ID
                         AND B.TABELA_ID        = C.ID
                         AND B.TABELA_ID        = (SELECT FIRST 1 C.TABELA_PRECO_ID_BASE FROM TBTABELA_PRECO C WHERE C.ID = :PRECO_NF_CF_ID)) A
                    
                WHERE
                    S.TAMANHO > 0
                
                UNION

                
                SELECT
                             
                    2 TIPO,
                    S.TAMANHO,
                    B.PRECO_VENDA AS PRECO_VENDA,
                    :TABELA_VALIDA AS VALIDO
                
                FROM
                    TBGRADE_SEQ S
                    LEFT JOIN TBCLIENTE_MODELO_PRECO  B ON (B.CLIENTE_CODIGO = :CLIENTE_ID AND B.MODELO_CODIGO  = :MODELO_ID AND B.TABELA_ID = :PRECO_NF_CF_ID)

                WHERE S.TAMANHO > 0

               UNION
                                        
                   SELECT
                        2 TIPO,
                        S.TAMANHO,
                        FN_NUMBER_CAST((C.PRECO_VENDA*:PERCENTUAL_BASE),:DECIMAIS_BASE) AS PRECO_VENDA,
                        :TABELA_VALIDA AS VALIDO
                    
                    FROM
                        TBGRADE_SEQ S
                        LEFT JOIN TBCLIENTE_MODELO_PRECO  C ON (C.CLIENTE_CODIGO = :CLIENTE_ID AND C.MODELO_CODIGO  = :MODELO_ID AND C.TABELA_ID = (SELECT FIRST 1 C.TABELA_PRECO_ID_BASE FROM TBTABELA_PRECO C WHERE C.ID = :PRECO_NF_CF_ID))

                    WHERE S.TAMANHO > 0

                UNION

                    SELECT
                                 
                        2 TIPO,
                        S.TAMANHO,
                        B.PRECO_VENDA AS PRECO_VENDA,
                        :TABELA_VALIDA AS VALIDO
                    
                    FROM TBGRADE_SEQ S,(SELECT FIRST 1 B.*,
                             COALESCE(C.PERCENTUAL_BASE,0.00) AS PERCENTUAL_BASE,
                             COALESCE(C.DECIMAIS_BASE,2) AS DECIMAIS_BASE
                             FROM TBCLIENTE_MODELO_PRECO B, TBTABELA_PRECO C
                             WHERE B.CLIENTE_CODIGO IN --(SELECT C.CODIGO FROM TBCLIENTE C WHERE C.EMPRESA_VINCULO = :EMPRESA_VINCULO)
                              (SELECT C.CODIGO FROM TBCLIENTE C, TBEMPRESA_GRUPO_CONTAS W WHERE W.EMPRESA_ID = C.CODIGO AND W.EMPRESA_GRUPO_ID = :EMPRESA_VINCULO)
                             AND B.MODELO_CODIGO     = :MODELO_ID
                             AND B.TABELA_ID         = C.ID
                             AND B.TABELA_ID        = :PRECO_NF_CF_ID) B
    
                UNION

                  SELECT
                    2 TIPO,
                    S.TAMANHO,
                    FN_NUMBER_CAST((B.PRECO_VENDA*:PERCENTUAL_BASE),:DECIMAIS_BASE) AS PRECO_VENDA,
                    :TABELA_VALIDA AS VALIDO
                    
                    FROM TBGRADE_SEQ S,(SELECT FIRST 1 B.*,
                         COALESCE(C.PERCENTUAL_BASE,0.00) AS PERCENTUAL_BASE,
                         COALESCE(C.DECIMAIS_BASE,2) AS DECIMAIS_BASE
                         FROM TBCLIENTE_MODELO_PRECO B, TBTABELA_PRECO C
                         WHERE (B.CLIENTE_CODIGO IN --(SELECT C.CODIGO FROM TBCLIENTE C WHERE C.EMPRESA_VINCULO = :EMPRESA_VINCULO)
                          (SELECT C.CODIGO FROM TBCLIENTE C, TBEMPRESA_GRUPO_CONTAS W WHERE W.EMPRESA_ID = C.CODIGO AND W.EMPRESA_GRUPO_ID = :EMPRESA_VINCULO)
                         AND B.MODELO_CODIGO     = :MODELO_ID
                         AND B.TABELA_ID         = C.ID
                         AND (B.TABELA_ID        = (SELECT FIRST 1 C.TABELA_PRECO_ID_BASE FROM TBTABELA_PRECO C WHERE C.ID = :PRECO_NF_CF_ID)))) B
                   WHERE TAMANHO > 0
                ) X
                LEFT JOIN TBMODELO M ON M.CODIGO = :MODELO_ID)Z
        WHERE TAMANHO_PRECO IS NOT NULL

    INTO
        :TIPO,
        :TAMANHO,
        :TAMANHO_DESCRICAO,
        :TAMANHO_PRECO,
        :VALIDO
    DO
    SUSPEND;
END;