SET TERM ^ ;

create or alter procedure SPC_ESTOQUE_MODELO_TAM_SALDO2 (
    IMODELO_ID integer not null,
    IESTABELECIMENTO_ID integer not null,
    ILOCALIZACAO_ID integer not null,
    ITAMANHO integer not null,
    ICOR_ID integer)
returns (
    MODELO_ID integer,
    CORES blob sub_type 1 segment size 80,
    TAMANHOS_1 blob sub_type 1 segment size 80,
    TAMANHOS_2 blob sub_type 1 segment size 80,
    TAMANHOS_3 blob sub_type 1 segment size 80,
    SALDO_TOTAL_1 numeric(15,8),
    SALDO_TOTAL_2 numeric(15,8),
    SALDO_TOTAL_3 numeric(15,8))
as
BEGIN
    FOR
        SELECT
            Y.MODELO_ID,
            Y.SPLIT_COR AS CORES,

            CAST(:ITAMANHO AS VARCHAR(100)) AS TAMANHOS_1,
            CAST(:ITAMANHO AS VARCHAR(100)) AS TAMANHOS_2,
            CAST(:ITAMANHO AS VARCHAR(100)) AS TAMANHOS_3,
        
            IIF(:ITAMANHO = 1, SALDO_T01_1,
            IIF(:ITAMANHO = 2, SALDO_T02_1,
            IIF(:ITAMANHO = 3, SALDO_T03_1,
            IIF(:ITAMANHO = 4, SALDO_T04_1,
            IIF(:ITAMANHO = 5, SALDO_T05_1,
            IIF(:ITAMANHO = 6, SALDO_T06_1,
            IIF(:ITAMANHO = 7, SALDO_T07_1,
            IIF(:ITAMANHO = 8, SALDO_T08_1,
            IIF(:ITAMANHO = 9, SALDO_T09_1,
            IIF(:ITAMANHO = 10, SALDO_T10_1,
            IIF(:ITAMANHO = 11, SALDO_T11_1,
            IIF(:ITAMANHO = 12, SALDO_T12_1,
            IIF(:ITAMANHO = 13, SALDO_T13_1,
            IIF(:ITAMANHO = 14, SALDO_T14_1,
            IIF(:ITAMANHO = 15, SALDO_T15_1,
            IIF(:ITAMANHO = 16, SALDO_T16_1,
            IIF(:ITAMANHO = 17, SALDO_T17_1,
            IIF(:ITAMANHO = 18, SALDO_T18_1,
            IIF(:ITAMANHO = 19, SALDO_T19_1,
            IIF(:ITAMANHO = 20, SALDO_T20_1, 0)))))))))))))))))))) AS TAMANHO_1,
            
            IIF(:ITAMANHO = 1, SALDO_T01_2,
            IIF(:ITAMANHO = 2, SALDO_T02_2,
            IIF(:ITAMANHO = 3, SALDO_T03_2,
            IIF(:ITAMANHO = 4, SALDO_T04_2,
            IIF(:ITAMANHO = 5, SALDO_T05_2,
            IIF(:ITAMANHO = 6, SALDO_T06_2,
            IIF(:ITAMANHO = 7, SALDO_T07_2,
            IIF(:ITAMANHO = 8, SALDO_T08_2,
            IIF(:ITAMANHO = 9, SALDO_T09_2,
            IIF(:ITAMANHO = 10, SALDO_T10_2,
            IIF(:ITAMANHO = 11, SALDO_T11_2,
            IIF(:ITAMANHO = 12, SALDO_T12_2,
            IIF(:ITAMANHO = 13, SALDO_T13_2,
            IIF(:ITAMANHO = 14, SALDO_T14_2,
            IIF(:ITAMANHO = 15, SALDO_T15_2,
            IIF(:ITAMANHO = 16, SALDO_T16_2,
            IIF(:ITAMANHO = 17, SALDO_T17_2,
            IIF(:ITAMANHO = 18, SALDO_T18_2,
            IIF(:ITAMANHO = 19, SALDO_T19_2,
            IIF(:ITAMANHO = 20, SALDO_T20_2, 0)))))))))))))))))))) AS TAMANHO_2,

            IIF(:ITAMANHO = 1, SALDO_T01_3,
            IIF(:ITAMANHO = 2, SALDO_T02_3,
            IIF(:ITAMANHO = 3, SALDO_T03_3,
            IIF(:ITAMANHO = 4, SALDO_T04_3,
            IIF(:ITAMANHO = 5, SALDO_T05_3,
            IIF(:ITAMANHO = 6, SALDO_T06_3,
            IIF(:ITAMANHO = 7, SALDO_T07_3,
            IIF(:ITAMANHO = 8, SALDO_T08_3,
            IIF(:ITAMANHO = 9, SALDO_T09_3,
            IIF(:ITAMANHO = 10, SALDO_T10_3,
            IIF(:ITAMANHO = 11, SALDO_T11_3,
            IIF(:ITAMANHO = 12, SALDO_T12_3,
            IIF(:ITAMANHO = 13, SALDO_T13_3,
            IIF(:ITAMANHO = 14, SALDO_T14_3,
            IIF(:ITAMANHO = 15, SALDO_T15_3,
            IIF(:ITAMANHO = 16, SALDO_T16_3,
            IIF(:ITAMANHO = 17, SALDO_T17_3,
            IIF(:ITAMANHO = 18, SALDO_T18_3,
            IIF(:ITAMANHO = 19, SALDO_T19_3,
            IIF(:ITAMANHO = 20, SALDO_T20_3, 0)))))))))))))))))))) AS TAMANHO_3
        
        FROM (
            SELECT FIRST 1
                X.MODELO_ID,
                LIST(X.COR_ID, ',') AS  SPLIT_COR,
            
                /* Saldo do Tipo 1 - Estoque == 1 */
                FN_CALC_PRECISION_V2(SUM(X.T01_SALDO), SUM(X.A01_SALDO), '-', 8) AS SALDO_T01_1,
                FN_CALC_PRECISION_V2(SUM(X.T02_SALDO), SUM(X.A02_SALDO), '-', 8) AS SALDO_T02_1,
                FN_CALC_PRECISION_V2(SUM(X.T03_SALDO), SUM(X.A03_SALDO), '-', 8) AS SALDO_T03_1,
                FN_CALC_PRECISION_V2(SUM(X.T04_SALDO), SUM(X.A04_SALDO), '-', 8) AS SALDO_T04_1,
                FN_CALC_PRECISION_V2(SUM(X.T05_SALDO), SUM(X.A05_SALDO), '-', 8) AS SALDO_T05_1,
                FN_CALC_PRECISION_V2(SUM(X.T06_SALDO), SUM(X.A06_SALDO), '-', 8) AS SALDO_T06_1,
                FN_CALC_PRECISION_V2(SUM(X.T07_SALDO), SUM(X.A07_SALDO), '-', 8) AS SALDO_T07_1,
                FN_CALC_PRECISION_V2(SUM(X.T08_SALDO), SUM(X.A08_SALDO), '-', 8) AS SALDO_T08_1,
                FN_CALC_PRECISION_V2(SUM(X.T09_SALDO), SUM(X.A09_SALDO), '-', 8) AS SALDO_T09_1,
                FN_CALC_PRECISION_V2(SUM(X.T10_SALDO), SUM(X.A10_SALDO), '-', 8) AS SALDO_T10_1,
                FN_CALC_PRECISION_V2(SUM(X.T11_SALDO), SUM(X.A11_SALDO), '-', 8) AS SALDO_T11_1,
                FN_CALC_PRECISION_V2(SUM(X.T12_SALDO), SUM(X.A12_SALDO), '-', 8) AS SALDO_T12_1,
                FN_CALC_PRECISION_V2(SUM(X.T13_SALDO), SUM(X.A13_SALDO), '-', 8) AS SALDO_T13_1,
                FN_CALC_PRECISION_V2(SUM(X.T14_SALDO), SUM(X.A14_SALDO), '-', 8) AS SALDO_T14_1,
                FN_CALC_PRECISION_V2(SUM(X.T15_SALDO), SUM(X.A15_SALDO), '-', 8) AS SALDO_T15_1,
                FN_CALC_PRECISION_V2(SUM(X.T16_SALDO), SUM(X.A16_SALDO), '-', 8) AS SALDO_T16_1,
                FN_CALC_PRECISION_V2(SUM(X.T17_SALDO), SUM(X.A17_SALDO), '-', 8) AS SALDO_T17_1,
                FN_CALC_PRECISION_V2(SUM(X.T18_SALDO), SUM(X.A18_SALDO), '-', 8) AS SALDO_T18_1,
                FN_CALC_PRECISION_V2(SUM(X.T19_SALDO), SUM(X.A19_SALDO), '-', 8) AS SALDO_T19_1,
                FN_CALC_PRECISION_V2(SUM(X.T20_SALDO), SUM(X.A20_SALDO), '-', 8) AS SALDO_T20_1,
                
                /* Saldo do Tipo 2 - Estoque == 2 */
                FN_CALC_PRECISION_V2(SUM(X.T01_SALDO), SUM(X.D01_SALDO), '-', 8) AS SALDO_T01_2,
                FN_CALC_PRECISION_V2(SUM(X.T02_SALDO), SUM(X.D02_SALDO), '-', 8) AS SALDO_T02_2,
                FN_CALC_PRECISION_V2(SUM(X.T03_SALDO), SUM(X.D03_SALDO), '-', 8) AS SALDO_T03_2,
                FN_CALC_PRECISION_V2(SUM(X.T04_SALDO), SUM(X.D04_SALDO), '-', 8) AS SALDO_T04_2,
                FN_CALC_PRECISION_V2(SUM(X.T05_SALDO), SUM(X.D05_SALDO), '-', 8) AS SALDO_T05_2,
                FN_CALC_PRECISION_V2(SUM(X.T06_SALDO), SUM(X.D06_SALDO), '-', 8) AS SALDO_T06_2,
                FN_CALC_PRECISION_V2(SUM(X.T07_SALDO), SUM(X.D07_SALDO), '-', 8) AS SALDO_T07_2,
                FN_CALC_PRECISION_V2(SUM(X.T08_SALDO), SUM(X.D08_SALDO), '-', 8) AS SALDO_T08_2,
                FN_CALC_PRECISION_V2(SUM(X.T09_SALDO), SUM(X.D09_SALDO), '-', 8) AS SALDO_T09_2,
                FN_CALC_PRECISION_V2(SUM(X.T10_SALDO), SUM(X.D10_SALDO), '-', 8) AS SALDO_T10_2,
                FN_CALC_PRECISION_V2(SUM(X.T11_SALDO), SUM(X.D11_SALDO), '-', 8) AS SALDO_T11_2,
                FN_CALC_PRECISION_V2(SUM(X.T12_SALDO), SUM(X.D12_SALDO), '-', 8) AS SALDO_T12_2,
                FN_CALC_PRECISION_V2(SUM(X.T13_SALDO), SUM(X.D13_SALDO), '-', 8) AS SALDO_T13_2,
                FN_CALC_PRECISION_V2(SUM(X.T14_SALDO), SUM(X.D14_SALDO), '-', 8) AS SALDO_T14_2,
                FN_CALC_PRECISION_V2(SUM(X.T15_SALDO), SUM(X.D15_SALDO), '-', 8) AS SALDO_T15_2,
                FN_CALC_PRECISION_V2(SUM(X.T16_SALDO), SUM(X.D16_SALDO), '-', 8) AS SALDO_T16_2,
                FN_CALC_PRECISION_V2(SUM(X.T17_SALDO), SUM(X.D17_SALDO), '-', 8) AS SALDO_T17_2,
                FN_CALC_PRECISION_V2(SUM(X.T18_SALDO), SUM(X.D18_SALDO), '-', 8) AS SALDO_T18_2,
                FN_CALC_PRECISION_V2(SUM(X.T19_SALDO), SUM(X.D19_SALDO), '-', 8) AS SALDO_T19_2,
                FN_CALC_PRECISION_V2(SUM(X.T20_SALDO), SUM(X.D20_SALDO), '-', 8) AS SALDO_T20_2,

                /* Saldo do Tipo 3 - Estoque == 3 */
                CAST( SUM(X.T01_SALDO) AS NUMERIC(15,8) ) AS SALDO_T01_3,
                CAST( SUM(X.T02_SALDO) AS NUMERIC(15,8) ) AS SALDO_T02_3,
                CAST( SUM(X.T03_SALDO) AS NUMERIC(15,8) ) AS SALDO_T03_3,
                CAST( SUM(X.T04_SALDO) AS NUMERIC(15,8) ) AS SALDO_T04_3,
                CAST( SUM(X.T05_SALDO) AS NUMERIC(15,8) ) AS SALDO_T05_3,
                CAST( SUM(X.T06_SALDO) AS NUMERIC(15,8) ) AS SALDO_T06_3,
                CAST( SUM(X.T07_SALDO) AS NUMERIC(15,8) ) AS SALDO_T07_3,
                CAST( SUM(X.T08_SALDO) AS NUMERIC(15,8) ) AS SALDO_T08_3,
                CAST( SUM(X.T09_SALDO) AS NUMERIC(15,8) ) AS SALDO_T09_3,
                CAST( SUM(X.T10_SALDO) AS NUMERIC(15,8) ) AS SALDO_T10_3,
                CAST( SUM(X.T11_SALDO) AS NUMERIC(15,8) ) AS SALDO_T11_3,
                CAST( SUM(X.T12_SALDO) AS NUMERIC(15,8) ) AS SALDO_T12_3,
                CAST( SUM(X.T13_SALDO) AS NUMERIC(15,8) ) AS SALDO_T13_3,
                CAST( SUM(X.T14_SALDO) AS NUMERIC(15,8) ) AS SALDO_T14_3,
                CAST( SUM(X.T15_SALDO) AS NUMERIC(15,8) ) AS SALDO_T15_3,
                CAST( SUM(X.T16_SALDO) AS NUMERIC(15,8) ) AS SALDO_T16_3,
                CAST( SUM(X.T17_SALDO) AS NUMERIC(15,8) ) AS SALDO_T17_3,
                CAST( SUM(X.T18_SALDO) AS NUMERIC(15,8) ) AS SALDO_T18_3,
                CAST( SUM(X.T19_SALDO) AS NUMERIC(15,8) ) AS SALDO_T19_3,
                CAST( SUM(X.T20_SALDO) AS NUMERIC(15,8) ) AS SALDO_T20_3
            
            FROM (
                SELECT
                    ROW_NUMBER() OVER(ORDER BY M.CODIGO, P.COR_CODIGO) AS ID,
            
                    E.CODIGO||' - '||E.RAZAOSOCIAL AS ESTABELECIMENTO,
                    L.CODIGO||' - '||L.DESCRICAO AS LOCALIZACAO,
                    M.CODIGO AS MODELO_ID,
                    P.COR_CODIGO AS COR_ID,
            
                    S.SALDO,
                    S.T01_SALDO,
                    S.T02_SALDO,
                    S.T03_SALDO,
                    S.T04_SALDO,
                    S.T05_SALDO,
                    S.T06_SALDO,
                    S.T07_SALDO,
                    S.T08_SALDO,
                    S.T09_SALDO,
                    S.T10_SALDO,
                    S.T11_SALDO,
                    S.T12_SALDO,
                    S.T13_SALDO,
                    S.T14_SALDO,
                    S.T15_SALDO,
                    S.T16_SALDO,
                    S.T17_SALDO,
                    S.T18_SALDO,
                    S.T19_SALDO,
                    S.T20_SALDO,
            
                    IIF( S.T01_SALDO > 0, FN_ESTOQUE_SALDO_ALOCADO(S.ESTABELECIMENTO_CODIGO, S.LOCALIZACAO_CODIGO, P.CODIGO, 1),0) AS A01_SALDO,
                    IIF( S.T02_SALDO > 0, FN_ESTOQUE_SALDO_ALOCADO(S.ESTABELECIMENTO_CODIGO, S.LOCALIZACAO_CODIGO, P.CODIGO, 2),0) AS A02_SALDO,
                    IIF( S.T03_SALDO > 0, FN_ESTOQUE_SALDO_ALOCADO(S.ESTABELECIMENTO_CODIGO, S.LOCALIZACAO_CODIGO, P.CODIGO, 3),0) AS A03_SALDO,
                    IIF( S.T04_SALDO > 0, FN_ESTOQUE_SALDO_ALOCADO(S.ESTABELECIMENTO_CODIGO, S.LOCALIZACAO_CODIGO, P.CODIGO, 4),0) AS A04_SALDO,
                    IIF( S.T05_SALDO > 0, FN_ESTOQUE_SALDO_ALOCADO(S.ESTABELECIMENTO_CODIGO, S.LOCALIZACAO_CODIGO, P.CODIGO, 5),0) AS A05_SALDO,
                    IIF( S.T06_SALDO > 0, FN_ESTOQUE_SALDO_ALOCADO(S.ESTABELECIMENTO_CODIGO, S.LOCALIZACAO_CODIGO, P.CODIGO, 6),0) AS A06_SALDO,
                    IIF( S.T07_SALDO > 0, FN_ESTOQUE_SALDO_ALOCADO(S.ESTABELECIMENTO_CODIGO, S.LOCALIZACAO_CODIGO, P.CODIGO, 7),0) AS A07_SALDO,
                    IIF( S.T08_SALDO > 0, FN_ESTOQUE_SALDO_ALOCADO(S.ESTABELECIMENTO_CODIGO, S.LOCALIZACAO_CODIGO, P.CODIGO, 8),0) AS A08_SALDO,
                    IIF( S.T09_SALDO > 0, FN_ESTOQUE_SALDO_ALOCADO(S.ESTABELECIMENTO_CODIGO, S.LOCALIZACAO_CODIGO, P.CODIGO, 9),0) AS A09_SALDO,
                    IIF( S.T10_SALDO > 0, FN_ESTOQUE_SALDO_ALOCADO(S.ESTABELECIMENTO_CODIGO, S.LOCALIZACAO_CODIGO, P.CODIGO,10),0) AS A10_SALDO,
                    IIF( S.T11_SALDO > 0, FN_ESTOQUE_SALDO_ALOCADO(S.ESTABELECIMENTO_CODIGO, S.LOCALIZACAO_CODIGO, P.CODIGO,11),0) AS A11_SALDO,
                    IIF( S.T12_SALDO > 0, FN_ESTOQUE_SALDO_ALOCADO(S.ESTABELECIMENTO_CODIGO, S.LOCALIZACAO_CODIGO, P.CODIGO,12),0) AS A12_SALDO,
                    IIF( S.T13_SALDO > 0, FN_ESTOQUE_SALDO_ALOCADO(S.ESTABELECIMENTO_CODIGO, S.LOCALIZACAO_CODIGO, P.CODIGO,13),0) AS A13_SALDO,
                    IIF( S.T14_SALDO > 0, FN_ESTOQUE_SALDO_ALOCADO(S.ESTABELECIMENTO_CODIGO, S.LOCALIZACAO_CODIGO, P.CODIGO,14),0) AS A14_SALDO,
                    IIF( S.T15_SALDO > 0, FN_ESTOQUE_SALDO_ALOCADO(S.ESTABELECIMENTO_CODIGO, S.LOCALIZACAO_CODIGO, P.CODIGO,15),0) AS A15_SALDO,
                    IIF( S.T16_SALDO > 0, FN_ESTOQUE_SALDO_ALOCADO(S.ESTABELECIMENTO_CODIGO, S.LOCALIZACAO_CODIGO, P.CODIGO,16),0) AS A16_SALDO,
                    IIF( S.T17_SALDO > 0, FN_ESTOQUE_SALDO_ALOCADO(S.ESTABELECIMENTO_CODIGO, S.LOCALIZACAO_CODIGO, P.CODIGO,17),0) AS A17_SALDO,
                    IIF( S.T18_SALDO > 0, FN_ESTOQUE_SALDO_ALOCADO(S.ESTABELECIMENTO_CODIGO, S.LOCALIZACAO_CODIGO, P.CODIGO,18),0) AS A18_SALDO,
                    IIF( S.T19_SALDO > 0, FN_ESTOQUE_SALDO_ALOCADO(S.ESTABELECIMENTO_CODIGO, S.LOCALIZACAO_CODIGO, P.CODIGO,19),0) AS A19_SALDO,
                    IIF( S.T20_SALDO > 0, FN_ESTOQUE_SALDO_ALOCADO(S.ESTABELECIMENTO_CODIGO, S.LOCALIZACAO_CODIGO, P.CODIGO,20),0) AS A20_SALDO,
            
                    IIF( S.T01_SALDO > 0, FN_EMPENHADO_PEDIDO(S.ESTABELECIMENTO_CODIGO, S.LOCALIZACAO_CODIGO, P.CODIGO, 1),0) AS D01_SALDO,
                    IIF( S.T02_SALDO > 0, FN_EMPENHADO_PEDIDO(S.ESTABELECIMENTO_CODIGO, S.LOCALIZACAO_CODIGO, P.CODIGO, 2),0) AS D02_SALDO,
                    IIF( S.T03_SALDO > 0, FN_EMPENHADO_PEDIDO(S.ESTABELECIMENTO_CODIGO, S.LOCALIZACAO_CODIGO, P.CODIGO, 3),0) AS D03_SALDO,
                    IIF( S.T04_SALDO > 0, FN_EMPENHADO_PEDIDO(S.ESTABELECIMENTO_CODIGO, S.LOCALIZACAO_CODIGO, P.CODIGO, 4),0) AS D04_SALDO,
                    IIF( S.T05_SALDO > 0, FN_EMPENHADO_PEDIDO(S.ESTABELECIMENTO_CODIGO, S.LOCALIZACAO_CODIGO, P.CODIGO, 5),0) AS D05_SALDO,
                    IIF( S.T06_SALDO > 0, FN_EMPENHADO_PEDIDO(S.ESTABELECIMENTO_CODIGO, S.LOCALIZACAO_CODIGO, P.CODIGO, 6),0) AS D06_SALDO,
                    IIF( S.T07_SALDO > 0, FN_EMPENHADO_PEDIDO(S.ESTABELECIMENTO_CODIGO, S.LOCALIZACAO_CODIGO, P.CODIGO, 7),0) AS D07_SALDO,
                    IIF( S.T08_SALDO > 0, FN_EMPENHADO_PEDIDO(S.ESTABELECIMENTO_CODIGO, S.LOCALIZACAO_CODIGO, P.CODIGO, 8),0) AS D08_SALDO,
                    IIF( S.T09_SALDO > 0, FN_EMPENHADO_PEDIDO(S.ESTABELECIMENTO_CODIGO, S.LOCALIZACAO_CODIGO, P.CODIGO, 9),0) AS D09_SALDO,
                    IIF( S.T10_SALDO > 0, FN_EMPENHADO_PEDIDO(S.ESTABELECIMENTO_CODIGO, S.LOCALIZACAO_CODIGO, P.CODIGO,10),0) AS D10_SALDO,
                    IIF( S.T11_SALDO > 0, FN_EMPENHADO_PEDIDO(S.ESTABELECIMENTO_CODIGO, S.LOCALIZACAO_CODIGO, P.CODIGO,11),0) AS D11_SALDO,
                    IIF( S.T12_SALDO > 0, FN_EMPENHADO_PEDIDO(S.ESTABELECIMENTO_CODIGO, S.LOCALIZACAO_CODIGO, P.CODIGO,12),0) AS D12_SALDO,
                    IIF( S.T13_SALDO > 0, FN_EMPENHADO_PEDIDO(S.ESTABELECIMENTO_CODIGO, S.LOCALIZACAO_CODIGO, P.CODIGO,13),0) AS D13_SALDO,
                    IIF( S.T14_SALDO > 0, FN_EMPENHADO_PEDIDO(S.ESTABELECIMENTO_CODIGO, S.LOCALIZACAO_CODIGO, P.CODIGO,14),0) AS D14_SALDO,
                    IIF( S.T15_SALDO > 0, FN_EMPENHADO_PEDIDO(S.ESTABELECIMENTO_CODIGO, S.LOCALIZACAO_CODIGO, P.CODIGO,15),0) AS D15_SALDO,
                    IIF( S.T16_SALDO > 0, FN_EMPENHADO_PEDIDO(S.ESTABELECIMENTO_CODIGO, S.LOCALIZACAO_CODIGO, P.CODIGO,16),0) AS D16_SALDO,
                    IIF( S.T17_SALDO > 0, FN_EMPENHADO_PEDIDO(S.ESTABELECIMENTO_CODIGO, S.LOCALIZACAO_CODIGO, P.CODIGO,17),0) AS D17_SALDO,
                    IIF( S.T18_SALDO > 0, FN_EMPENHADO_PEDIDO(S.ESTABELECIMENTO_CODIGO, S.LOCALIZACAO_CODIGO, P.CODIGO,18),0) AS D18_SALDO,
                    IIF( S.T19_SALDO > 0, FN_EMPENHADO_PEDIDO(S.ESTABELECIMENTO_CODIGO, S.LOCALIZACAO_CODIGO, P.CODIGO,19),0) AS D19_SALDO,
                    IIF( S.T20_SALDO > 0, FN_EMPENHADO_PEDIDO(S.ESTABELECIMENTO_CODIGO, S.LOCALIZACAO_CODIGO, P.CODIGO,20),0) AS D20_SALDO
            
                FROM TBMODELO M, TBESTOQUE_SALDO S, TBPRODUTO P, TBESTABELECIMENTO E, TBLOCALIZACAO L
                WHERE M.CODIGO = :IMODELO_ID
                AND S.ESTABELECIMENTO_CODIGO = :IESTABELECIMENTO_ID
                AND S.LOCALIZACAO_CODIGO = :ILOCALIZACAO_ID
                AND P.MODELO_CODIGO = M.CODIGO
                AND P.CODIGO = S.PRODUTO_CODIGO
                AND IIF(FN_IS_EMPTY(CAST(:ICOR_ID AS INTEGER)) <> '' AND FN_IS_EMPTY(CAST(:ICOR_ID AS INTEGER)) > 0, P.COR_CODIGO = :ICOR_ID, true = true)
                AND L.CODIGO = S.LOCALIZACAO_CODIGO
                AND E.CODIGO = S.ESTABELECIMENTO_CODIGO
            
                ORDER BY M.CODIGO, P.COR_CODIGO
            ) X
            WHERE true = true
            
            GROUP BY
                X.MODELO_ID
        ) Y
        WHERE true = true

    INTO
        :MODELO_ID,
        :CORES,

        :TAMANHOS_1,
        :TAMANHOS_2,
        :TAMANHOS_3,

        :SALDO_TOTAL_1,
        :SALDO_TOTAL_2,
        :SALDO_TOTAL_3

    DO
    BEGIN

        SUSPEND;

    END
END
^

SET TERM ; ^


SET TERM ^ ;

CREATE OR ALTER function FN_JSON_ARRAY3 (
    JSON varchar(5000),
    CAMPO varchar(100))
returns varchar(5000)
AS
DECLARE VARIABLE RETORNO VARCHAR(5000);
DECLARE VARIABLE POS INTEGER;
BEGIN
    RETORNO = '';

    POS = POSITION ('"'||:CAMPO||'":', :JSON, 1);
    IF (POS > 0) THEN
    BEGIN

        RETORNO = SUBSTRING (:JSON FROM (:POS + CHAR_LENGTH ('"'||:CAMPO||'":')) FOR CHAR_LENGTH(:JSON));
        POS = POSITION ('"', :RETORNO);

        if(POS is distinct from 1)then
        begin
            POS = POSITION (',"', :RETORNO, 2);

            IF(POS = 0)THEN
            BEGIN
                POS = POSITION('}', :RETORNO, 2);
                RETORNO = SUBSTRING (:RETORNO FROM 1 FOR (:POS - 1));
            END ELSE
            BEGIN
                RETORNO = SUBSTRING (:RETORNO FROM 1 FOR (:POS - 1));
            END
        end else
        begin
            POS = POSITION (',"', :RETORNO, 2);
    
            IF(POS = 0)THEN
            BEGIN
                POS = POSITION('"}', :RETORNO, 2);
                RETORNO = SUBSTRING (:RETORNO FROM 1 FOR (:POS - 1));
            END ELSE
            BEGIN
                RETORNO = SUBSTRING (:RETORNO FROM 1 FOR (:POS - 2));
            END
        end

    END

    POS = POSITION('"', :RETORNO, 1);

    IF (POS = 1) THEN
    BEGIN
        RETORNO = SUBSTRING (:RETORNO FROM 2 FOR CHAR_LENGTH(:RETORNO));
    END

    RETURN RETORNO;
END
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER procedure SPC_CASO_DETALHE (
    IPAINEL_ID integer not null,
    ICASO_ID integer not null,
    ICAMPO_VISUALIZACAO varchar(100) not null)
returns (
    OCAMPO_ID integer,
    OTIPO integer,
    ODESCRICAO varchar(100),
    ODECIMAIS integer,
    OVALOR varchar(7000))
as
declare variable EMAIL varchar(5000);
declare variable MONITOR varchar(5000);
declare variable MOTIVO varchar(5000);
declare variable TIPO varchar(5000);
declare variable ORIGEM varchar(5000);
declare variable RESPONSAVEL varchar(5000);
declare variable COR varchar(5000);
declare variable STATUS varchar(5000);
BEGIN

    FOR
        SELECT FIRST 1
            P.EMAIL,
            P.EMAIL_MONITOR,
        
            M.DESCRICAO AS MOTIVO,
        
            T.DESCRICAO AS TIPO,
        
            O.DESCRICAO AS ORIGEM,
        
            U.USUARIO AS RESPONSAVEL,
        
            I.DESCRICAO AS STATUS,
            I.COR AS COR
        
        FROM TBCASO_REGISTRO R
        INNER JOIN TBCASO_PAINEL P ON P.ID = R.PAINEL_ID
        INNER JOIN TBCASO_TIPO T ON T.ID = R.TIPO_ID
        INNER JOIN TBCASO_MOTIVO M ON M.ID = R.MOTIVO_ID
        INNER JOIN TBCASO_ORIGEM O ON O.ID = R.ORIGEM_ID
        INNER JOIN TBUSUARIO U ON U.CODIGO = R.RESPONSAVEL_ID
        INNER JOIN TBCASO_STATUS I ON I.ID = R.STATUS_ID
        WHERE P.ID = :IPAINEL_ID
        AND R.ID = :ICASO_ID
    
    INTO
        :EMAIL,
        :MONITOR,
        :MOTIVO,
        :TIPO,
        :ORIGEM,
        :RESPONSAVEL,
        :STATUS,
        :COR

    DO
    BEGIN
        
        :OCAMPO_ID = 0;
        :OTIPO     = 7;

        :ODESCRICAO = 'Motivo';
        :OVALOR = :MOTIVO;
        SUSPEND;

        :ODESCRICAO = 'Tipo';
        :OVALOR = :TIPO;
        SUSPEND;

        :ODESCRICAO = 'Tipo de Origem';
        :OVALOR = :ORIGEM;
        SUSPEND;

        :ODESCRICAO = 'Respons??vel';
        :OVALOR = :RESPONSAVEL;
        SUSPEND;

        :ODESCRICAO = 'Status';
        :OVALOR = :STATUS;
        SUSPEND;

    END

    /**************************************************************************/

    FOR
        SELECT
            A.TIPO,
            A.CAMPO_ID,
            A.DESCRICAO,
            A.DECIMAIS,
        
            IIF(A.TIPO = 9, FN_IS_EMPTY2(I.DESCRICAO, ''),
            IIF(((A.TIPO = 4) OR (A.TIPO = 5)), COALESCE((SELECT LIST(S.DESCRICAO||':'||R.SELECIONADO, ', ') FROM TBCASO_REGISTRO_ITENS R, TBCASO_PAINEL_CONF_ITENS S WHERE R.CAMPO_ID = A.ID AND R.VALOR = S.VALOR AND S.CAMPO_ID = R.CAMPO_ID AND R.REGISTRO_ID = A.REGISTRO_ID), ''),
            IIF(A.TIPO = 7, FN_JSON_ARRAY3(A.JSON, COALESCE((SELECT FIRST 1 V.CAMPO FROM TBCASO_VISUALIZACAO_CAMPO V WHERE V.CAMPO_ID = A.ID AND V.PAINEL_ID = A.PAINEL_ID AND V.CAMPO LIKE COALESCE(:ICAMPO_VISUALIZACAO, '')), COALESCE(:ICAMPO_VISUALIZACAO, ''))),
            IIF(A.TIPO = 11, FN_ELIPSE2( COALESCE((SELECT LIST(SPLV.VALOR, ', ') FROM ( SELECT FN_JSON_ARRAY3(SPL.OSPLIT, COALESCE((SELECT FIRST 1 V.CAMPO FROM TBCASO_VISUALIZACAO_CAMPO V WHERE V.CAMPO_ID = A.ID AND V.PAINEL_ID = A.PAINEL_ID AND V.CAMPO LIKE COALESCE(:ICAMPO_VISUALIZACAO, '')), COALESCE(:ICAMPO_VISUALIZACAO, ''))) AS VALOR FROM SPLIT_BLOB2(A.DADOS_TABELA, ',{') SPL ) SPLV), '') , 7000), A.VALOR)))) AS VALOR
        
        FROM (
            SELECT
                F.ID,
                F.TIPO,
                F.DESCRICAO,
                F.CAMPO_VISUALIZAR,
                F.STEP,
                IIF(F.STEP >= 1, 0, IIF(F.STEP >= 0.1, 1, IIF(F.STEP >= 0.01, 2, IIF(F.STEP >= 0.001, 3, IIF(F.STEP >= 0.0001, 4, 0))))) AS DECIMAIS,
        
                C.CAMPO_ID,
                C.PAINEL_ID,
                C.REGISTRO_ID,
                C.JSON,
                C.DADOS_TABELA,
        
                FN_IS_EMPTY2(CAST(C.VALOR AS VARCHAR(7000)), '') AS VALOR,
        
                IIF(((F.TIPO = 4) OR (F.TIPO = 5) OR (F.TIPO = 9)), FN_IS_EMPTY2(C.VALOR, '0'), 0) AS CHAVE
            
            FROM TBCASO_REGISTRO_DETALHE C
            INNER JOIN TBCASO_PAINEL_CONF F ON F.ID = C.CAMPO_ID
            WHERE C.REGISTRO_ID = :ICASO_ID
            AND C.PAINEL_ID = :IPAINEL_ID
        
            ORDER BY C.CAMPO_ID
        ) A
        LEFT JOIN TBCASO_PAINEL_CONF_ITENS I ON I.CAMPO_ID = A.ID AND I.VALOR = A.CHAVE

    INTO
        :OTIPO,
        :OCAMPO_ID,
        :ODESCRICAO,
        :ODECIMAIS,
        :OVALOR

    DO
    BEGIN

        IF (COALESCE(:OVALOR, '') = '') THEN
        BEGIN
            :OVALOR = NULL;
        END

        SUSPEND;

    END
END
^

SET TERM ; ^

COMMENT ON PARAMETER SPC_CASO_DETALHE.IPAINEL_ID IS
'ID do Painel de Casos';

COMMENT ON PARAMETER SPC_CASO_DETALHE.ICASO_ID IS
'ID do Caso (Numero do Caso)';

COMMENT ON PARAMETER SPC_CASO_DETALHE.ICAMPO_VISUALIZACAO IS
'Campo de Visualizacao da tabela TBCASO_VISUALIZACAO_CAMPO';

