CREATE OR ALTER procedure SPC_NFS_ITEM_CALCULO_PESO (
    PRODUTO_ID integer,
    TAMANHO integer,
    QUANTIDADE numeric(15,4))
returns (
    VOLUMES numeric(18,10),
    PESO_LIQUIDO numeric(18,10),
    PESO_EMBALAGEM numeric(18,12),
    CUBAGEM numeric(18,14),
    HABILITA_COMPOSICAO_CARGA integer)
as
BEGIN

    VOLUMES = 0;
    PESO_LIQUIDO = 0;
    PESO_EMBALAGEM = 0;
    CUBAGEM = 0;

        FOR
        SELECT
        IIF(X.QUANTIDADE / X.QUANTIDADE_POR_VOLUME <> TRUNC(X.QUANTIDADE / X.QUANTIDADE_POR_VOLUME),
        TRUNC(X.QUANTIDADE / X.QUANTIDADE_POR_VOLUME) + 1,
        TRUNC(X.QUANTIDADE / X.QUANTIDADE_POR_VOLUME)) VOLUMES,
        X.QUANTIDADE * X.PESO_LIQUIDO / 1000 PESO_LIQUIDO,

        COALESCE((SELECT SUM(H.PESO_EMBALAGEM)
        FROM (
        SELECT
        CAST((CAST((CAST((CAST((G.CONSUMO / CAST(G.FATOR_CONVERSAO AS NUMERIC(15,4))) AS NUMERIC(15,4)) * X.QUANTIDADE) AS NUMERIC(15,4)) * G.PESO) AS NUMERIC(15,4)) / 1000) AS NUMERIC(15,4)) AS PESO_EMBALAGEM
        FROM (
        SELECT C.PRODUTO_CODIGO PRODUTO_ID, C.PESOLIQUIDO PESO, COALESCE(D.FATOR_CONVERSAO,1) FATOR_CONVERSAO,
               CASE WHEN X.TAMANHO = 1 THEN D.CONSUMO_QUANTIDADE_T01 WHEN X.TAMANHO = 2 THEN D.CONSUMO_QUANTIDADE_T02
                    WHEN X.TAMANHO = 3 THEN D.CONSUMO_QUANTIDADE_T03 WHEN X.TAMANHO = 4 THEN D.CONSUMO_QUANTIDADE_T04
                    WHEN X.TAMANHO = 5 THEN D.CONSUMO_QUANTIDADE_T05 WHEN X.TAMANHO = 6 THEN D.CONSUMO_QUANTIDADE_T06
                    WHEN X.TAMANHO = 7 THEN D.CONSUMO_QUANTIDADE_T07 WHEN X.TAMANHO = 8 THEN D.CONSUMO_QUANTIDADE_T08
                    WHEN X.TAMANHO = 9 THEN D.CONSUMO_QUANTIDADE_T09 WHEN X.TAMANHO =10 THEN D.CONSUMO_QUANTIDADE_T10
                    WHEN X.TAMANHO =11 THEN D.CONSUMO_QUANTIDADE_T11 WHEN X.TAMANHO =12 THEN D.CONSUMO_QUANTIDADE_T12
                    WHEN X.TAMANHO =13 THEN D.CONSUMO_QUANTIDADE_T13 WHEN X.TAMANHO =14 THEN D.CONSUMO_QUANTIDADE_T14
                    WHEN X.TAMANHO =15 THEN D.CONSUMO_QUANTIDADE_T15 WHEN X.TAMANHO =16 THEN D.CONSUMO_QUANTIDADE_T16
                    WHEN X.TAMANHO =17 THEN D.CONSUMO_QUANTIDADE_T17 WHEN X.TAMANHO =18 THEN D.CONSUMO_QUANTIDADE_T18
                    WHEN X.TAMANHO =19 THEN D.CONSUMO_QUANTIDADE_T19 WHEN X.TAMANHO =20 THEN D.CONSUMO_QUANTIDADE_T20 END CONSUMO
         FROM TBPRODUTO_FICHA C, TBMODELO_CONSUMO D 
         WHERE C.PRODUTO_CODIGO = D.CONSUMO_PRODUTO_CODIGO
           AND D.MODELO_CODIGO = X.MODELO_ID
        ) G ) H),0) PESO_EMBALAGEM,
        
        COALESCE((SELECT FIRST 1
               CAST(CAST((C.CUBAGEM_ALTURA/ 1000) * (C.CUBAGEM_LARGURA/ 1000) AS NUMERIC(15,4)) * (C.CUBAGEM_COMPRIMENTO/ 1000) AS NUMERIC(15,4))
         FROM TBPRODUTO_FICHA C, TBMODELO_CONSUMO D 
         WHERE C.PRODUTO_CODIGO = D.CONSUMO_PRODUTO_CODIGO
           AND D.MODELO_CODIGO = X.MODELO_ID
           AND
           IIF(:TAMANHO = 01, D.CONSUMO_QUANTIDADE_T01 > 0,
           IIF(:TAMANHO = 02, D.CONSUMO_QUANTIDADE_T02 > 0,
           IIF(:TAMANHO = 03, D.CONSUMO_QUANTIDADE_T03 > 0,
           IIF(:TAMANHO = 04, D.CONSUMO_QUANTIDADE_T04 > 0,
           IIF(:TAMANHO = 05, D.CONSUMO_QUANTIDADE_T05 > 0,
           IIF(:TAMANHO = 06, D.CONSUMO_QUANTIDADE_T06 > 0,
           IIF(:TAMANHO = 07, D.CONSUMO_QUANTIDADE_T07 > 0,
           IIF(:TAMANHO = 08, D.CONSUMO_QUANTIDADE_T08 > 0,
           IIF(:TAMANHO = 09, D.CONSUMO_QUANTIDADE_T09 > 0,
           IIF(:TAMANHO = 10, D.CONSUMO_QUANTIDADE_T10 > 0,
           IIF(:TAMANHO = 11, D.CONSUMO_QUANTIDADE_T11 > 0,
           IIF(:TAMANHO = 12, D.CONSUMO_QUANTIDADE_T12 > 0,
           IIF(:TAMANHO = 13, D.CONSUMO_QUANTIDADE_T13 > 0,
           IIF(:TAMANHO = 14, D.CONSUMO_QUANTIDADE_T14 > 0,
           IIF(:TAMANHO = 15, D.CONSUMO_QUANTIDADE_T15 > 0,
           IIF(:TAMANHO = 16, D.CONSUMO_QUANTIDADE_T16 > 0,
           IIF(:TAMANHO = 17, D.CONSUMO_QUANTIDADE_T17 > 0,
           IIF(:TAMANHO = 18, D.CONSUMO_QUANTIDADE_T18 > 0,
           IIF(:TAMANHO = 19, D.CONSUMO_QUANTIDADE_T19 > 0,
           IIF(:TAMANHO = 20, D.CONSUMO_QUANTIDADE_T20 > 0,
           TRUE))))))))))))))))))))
           AND C.CUBAGEM_ALTURA > 0),0) * (X.QUANTIDADE / X.QUANTIDADE_POR_VOLUME)  CUBAGEM,

           X.HABILITA_COMPOSICAO_CARGA
        
        FROM (SELECT P.MODELO_CODIGO MODELO_ID, CAST(:TAMANHO AS INTEGER) TAMANHO, CAST(:QUANTIDADE AS NUMERIC(15,4)) QUANTIDADE,
        COALESCE(F.HABILITA_COMPOSICAO_CARGA, 0) AS HABILITA_COMPOSICAO_CARGA,

        COALESCE((
        SELECT CASE WHEN CAST(:TAMANHO AS INTEGER) = 1 THEN M.T01 WHEN CAST(:TAMANHO AS INTEGER) = 2 THEN M.T02
                    WHEN CAST(:TAMANHO AS INTEGER) = 3 THEN M.T03 WHEN CAST(:TAMANHO AS INTEGER) = 4 THEN M.T04
                    WHEN CAST(:TAMANHO AS INTEGER) = 5 THEN M.T05 WHEN CAST(:TAMANHO AS INTEGER) = 6 THEN M.T06
                    WHEN CAST(:TAMANHO AS INTEGER) = 7 THEN M.T07 WHEN CAST(:TAMANHO AS INTEGER) = 8 THEN M.T08
                    WHEN CAST(:TAMANHO AS INTEGER) = 9 THEN M.T09 WHEN CAST(:TAMANHO AS INTEGER) =10 THEN M.T10
                    WHEN CAST(:TAMANHO AS INTEGER) =11 THEN M.T11 WHEN CAST(:TAMANHO AS INTEGER) =12 THEN M.T12
                    WHEN CAST(:TAMANHO AS INTEGER) =13 THEN M.T13 WHEN CAST(:TAMANHO AS INTEGER) =14 THEN M.T14
                    WHEN CAST(:TAMANHO AS INTEGER) =15 THEN M.T15 WHEN CAST(:TAMANHO AS INTEGER) =16 THEN M.T16
                    WHEN CAST(:TAMANHO AS INTEGER) =17 THEN M.T17 WHEN CAST(:TAMANHO AS INTEGER) =18 THEN M.T18
                    WHEN CAST(:TAMANHO AS INTEGER) =19 THEN M.T19 WHEN CAST(:TAMANHO AS INTEGER) =20 THEN M.T20 END
          FROM TBMODELO_EMBALAGEM M WHERE M.MODELO_CODIGO = P.MODELO_CODIGO),1) QUANTIDADE_POR_VOLUME,

        COALESCE((
        SELECT CASE WHEN CAST(:TAMANHO AS INTEGER) = 1 THEN M.T01 WHEN CAST(:TAMANHO AS INTEGER) = 2 THEN M.T02
                    WHEN CAST(:TAMANHO AS INTEGER) = 3 THEN M.T03 WHEN CAST(:TAMANHO AS INTEGER) = 4 THEN M.T04
                    WHEN CAST(:TAMANHO AS INTEGER) = 5 THEN M.T05 WHEN CAST(:TAMANHO AS INTEGER) = 6 THEN M.T06
                    WHEN CAST(:TAMANHO AS INTEGER) = 7 THEN M.T07 WHEN CAST(:TAMANHO AS INTEGER) = 8 THEN M.T08
                    WHEN CAST(:TAMANHO AS INTEGER) = 9 THEN M.T09 WHEN CAST(:TAMANHO AS INTEGER) =10 THEN M.T10
                    WHEN CAST(:TAMANHO AS INTEGER) =11 THEN M.T11 WHEN CAST(:TAMANHO AS INTEGER) =12 THEN M.T12
                    WHEN CAST(:TAMANHO AS INTEGER) =13 THEN M.T13 WHEN CAST(:TAMANHO AS INTEGER) =14 THEN M.T14
                    WHEN CAST(:TAMANHO AS INTEGER) =15 THEN M.T15 WHEN CAST(:TAMANHO AS INTEGER) =16 THEN M.T16
                    WHEN CAST(:TAMANHO AS INTEGER) =17 THEN M.T17 WHEN CAST(:TAMANHO AS INTEGER) =18 THEN M.T18
                    WHEN CAST(:TAMANHO AS INTEGER) =19 THEN M.T19 WHEN CAST(:TAMANHO AS INTEGER) =20 THEN M.T20 END
          FROM TBMODELO_FICHA_TECNICA M WHERE M.MODELO_CODIGO = P.MODELO_CODIGO AND M.TIPO_CODIGO = 9),0) PESO_LIQUIDO
        
          FROM TBPRODUTO P
          LEFT JOIN TBFAMILIA F ON F.CODIGO = P.FAMILIA_INVENTARIO
         WHERE P.CODIGO = :PRODUTO_ID) X WHERE QUANTIDADE_POR_VOLUME > 0

       INTO :VOLUMES,:PESO_LIQUIDO,:PESO_EMBALAGEM,:CUBAGEM, :HABILITA_COMPOSICAO_CARGA
       DO

       IF(:HABILITA_COMPOSICAO_CARGA = 0) THEN
       BEGIN
            :VOLUMES = 0;
            :PESO_LIQUIDO = 0;
            :PESO_EMBALAGEM = 0;
            :CUBAGEM = 0;
            :HABILITA_COMPOSICAO_CARGA = 0;

       END

       SUSPEND;
       
END;