SELECT coalesce(A.ESTABELECIMENTO_CODIGO,1) ESTABELECIMENTO_ID, coalesce(A.LOCALIZACAO_CODIGO,p.localizacao_codigo) LOCALIZACAO_ID, p.codigo as PRODUTO_ID, P.FAMILIA_CODIGO FAMILIA_ID, P.DESCRICAO, P.GRADE_CODIGO GRADE_ID, 03 TAMANHO, FN_TAMANHO_GRADE(P.GRADE_CODIGO,03) TAMANHO_DESCRICAO, COALESCE((SELECT EA.QUANTIDADE      FROM TBESTOQUE_SALDO_ALOCACAO EA WHERE EA.ESTABELECIMENTO_ID = A.ESTABELECIMENTO_CODIGO AND EA.LOCALIZACAO_ID = A.LOCALIZACAO_CODIGO AND EA.PRODUTO_ID = A.PRODUTO_CODIGO AND EA.TAMANHO = 03),0) as ALOCADO, A.T03_SALDO as SALDO, P.UNIDADEMEDIDA_SIGLA2, a.saldo_deterceiro, a.saldo_emterceiro FROM TBPRODUTO P LEFT JOIN TBESTOQUE_SALDO A ON P.CODIGO = A.PRODUTO_CODIGO WHERE P.GRADE_CODIGO > 0 and P.STATUS = '1'  UNION
SELECT coalesce(A.ESTABELECIMENTO_CODIGO,1) ESTABELECIMENTO_ID, coalesce(A.LOCALIZACAO_CODIGO,p.localizacao_codigo) LOCALIZACAO_ID, p.codigo as PRODUTO_ID, P.FAMILIA_CODIGO FAMILIA_ID, P.DESCRICAO, P.GRADE_CODIGO GRADE_ID, 04 TAMANHO, FN_TAMANHO_GRADE(P.GRADE_CODIGO,04) TAMANHO_DESCRICAO, COALESCE((SELECT EA.QUANTIDADE      FROM TBESTOQUE_SALDO_ALOCACAO EA WHERE EA.ESTABELECIMENTO_ID = A.ESTABELECIMENTO_CODIGO AND EA.LOCALIZACAO_ID = A.LOCALIZACAO_CODIGO AND EA.PRODUTO_ID = A.PRODUTO_CODIGO AND EA.TAMANHO = 04),0) as ALOCADO, A.T04_SALDO as SALDO, P.UNIDADEMEDIDA_SIGLA2, a.saldo_deterceiro, a.saldo_emterceiro FROM TBPRODUTO P LEFT JOIN TBESTOQUE_SALDO A ON P.CODIGO = A.PRODUTO_CODIGO WHERE P.GRADE_CODIGO > 0 and P.STATUS = '1'  UNION
SELECT coalesce(A.ESTABELECIMENTO_CODIGO,1) ESTABELECIMENTO_ID, coalesce(A.LOCALIZACAO_CODIGO,p.localizacao_codigo) LOCALIZACAO_ID, p.codigo as PRODUTO_ID, P.FAMILIA_CODIGO FAMILIA_ID, P.DESCRICAO, P.GRADE_CODIGO GRADE_ID, 05 TAMANHO, FN_TAMANHO_GRADE(P.GRADE_CODIGO,05) TAMANHO_DESCRICAO, COALESCE((SELECT EA.QUANTIDADE      FROM TBESTOQUE_SALDO_ALOCACAO EA WHERE EA.ESTABELECIMENTO_ID = A.ESTABELECIMENTO_CODIGO AND EA.LOCALIZACAO_ID = A.LOCALIZACAO_CODIGO AND EA.PRODUTO_ID = A.PRODUTO_CODIGO AND EA.TAMANHO = 05),0) as ALOCADO, A.T05_SALDO as SALDO, P.UNIDADEMEDIDA_SIGLA2, a.saldo_deterceiro, a.saldo_emterceiro FROM TBPRODUTO P LEFT JOIN TBESTOQUE_SALDO A ON P.CODIGO = A.PRODUTO_CODIGO WHERE P.GRADE_CODIGO > 0 and P.STATUS = '1'  UNION
SELECT coalesce(A.ESTABELECIMENTO_CODIGO,1) ESTABELECIMENTO_ID, coalesce(A.LOCALIZACAO_CODIGO,p.localizacao_codigo) LOCALIZACAO_ID, p.codigo as PRODUTO_ID, P.FAMILIA_CODIGO FAMILIA_ID, P.DESCRICAO, P.GRADE_CODIGO GRADE_ID, 06 TAMANHO, FN_TAMANHO_GRADE(P.GRADE_CODIGO,06) TAMANHO_DESCRICAO, COALESCE((SELECT EA.QUANTIDADE      FROM TBESTOQUE_SALDO_ALOCACAO EA WHERE EA.ESTABELECIMENTO_ID = A.ESTABELECIMENTO_CODIGO AND EA.LOCALIZACAO_ID = A.LOCALIZACAO_CODIGO AND EA.PRODUTO_ID = A.PRODUTO_CODIGO AND EA.TAMANHO = 06),0) as ALOCADO, A.T06_SALDO as SALDO, P.UNIDADEMEDIDA_SIGLA2, a.saldo_deterceiro, a.saldo_emterceiro FROM TBPRODUTO P LEFT JOIN TBESTOQUE_SALDO A ON P.CODIGO = A.PRODUTO_CODIGO WHERE P.GRADE_CODIGO > 0 and P.STATUS = '1'  UNION
SELECT coalesce(A.ESTABELECIMENTO_CODIGO,1) ESTABELECIMENTO_ID, coalesce(A.LOCALIZACAO_CODIGO,p.localizacao_codigo) LOCALIZACAO_ID, p.codigo as PRODUTO_ID, P.FAMILIA_CODIGO FAMILIA_ID, P.DESCRICAO, P.GRADE_CODIGO GRADE_ID, 07 TAMANHO, FN_TAMANHO_GRADE(P.GRADE_CODIGO,07) TAMANHO_DESCRICAO, COALESCE((SELECT EA.QUANTIDADE      FROM TBESTOQUE_SALDO_ALOCACAO EA WHERE EA.ESTABELECIMENTO_ID = A.ESTABELECIMENTO_CODIGO AND EA.LOCALIZACAO_ID = A.LOCALIZACAO_CODIGO AND EA.PRODUTO_ID = A.PRODUTO_CODIGO AND EA.TAMANHO = 07),0) as ALOCADO, A.T07_SALDO as SALDO, P.UNIDADEMEDIDA_SIGLA2, a.saldo_deterceiro, a.saldo_emterceiro FROM TBPRODUTO P LEFT JOIN TBESTOQUE_SALDO A ON P.CODIGO = A.PRODUTO_CODIGO WHERE P.GRADE_CODIGO > 0 and P.STATUS = '1'  UNION
SELECT coalesce(A.ESTABELECIMENTO_CODIGO,1) ESTABELECIMENTO_ID, coalesce(A.LOCALIZACAO_CODIGO,p.localizacao_codigo) LOCALIZACAO_ID, p.codigo as PRODUTO_ID, P.FAMILIA_CODIGO FAMILIA_ID, P.DESCRICAO, P.GRADE_CODIGO GRADE_ID, 08 TAMANHO, FN_TAMANHO_GRADE(P.GRADE_CODIGO,08) TAMANHO_DESCRICAO, COALESCE((SELECT EA.QUANTIDADE      FROM TBESTOQUE_SALDO_ALOCACAO EA WHERE EA.ESTABELECIMENTO_ID = A.ESTABELECIMENTO_CODIGO AND EA.LOCALIZACAO_ID = A.LOCALIZACAO_CODIGO AND EA.PRODUTO_ID = A.PRODUTO_CODIGO AND EA.TAMANHO = 08),0) as ALOCADO, A.T08_SALDO as SALDO, P.UNIDADEMEDIDA_SIGLA2, a.saldo_deterceiro, a.saldo_emterceiro FROM TBPRODUTO P LEFT JOIN TBESTOQUE_SALDO A ON P.CODIGO = A.PRODUTO_CODIGO WHERE P.GRADE_CODIGO > 0 and P.STATUS = '1'  UNION
SELECT coalesce(A.ESTABELECIMENTO_CODIGO,1) ESTABELECIMENTO_ID, coalesce(A.LOCALIZACAO_CODIGO,p.localizacao_codigo) LOCALIZACAO_ID, p.codigo as PRODUTO_ID, P.FAMILIA_CODIGO FAMILIA_ID, P.DESCRICAO, P.GRADE_CODIGO GRADE_ID, 09 TAMANHO, FN_TAMANHO_GRADE(P.GRADE_CODIGO,09) TAMANHO_DESCRICAO, COALESCE((SELECT EA.QUANTIDADE      FROM TBESTOQUE_SALDO_ALOCACAO EA WHERE EA.ESTABELECIMENTO_ID = A.ESTABELECIMENTO_CODIGO AND EA.LOCALIZACAO_ID = A.LOCALIZACAO_CODIGO AND EA.PRODUTO_ID = A.PRODUTO_CODIGO AND EA.TAMANHO = 09),0) as ALOCADO, A.T09_SALDO as SALDO, P.UNIDADEMEDIDA_SIGLA2, a.saldo_deterceiro, a.saldo_emterceiro FROM TBPRODUTO P LEFT JOIN TBESTOQUE_SALDO A ON P.CODIGO = A.PRODUTO_CODIGO WHERE P.GRADE_CODIGO > 0 and P.STATUS = '1'  UNION
SELECT coalesce(A.ESTABELECIMENTO_CODIGO,1) ESTABELECIMENTO_ID, coalesce(A.LOCALIZACAO_CODIGO,p.localizacao_codigo) LOCALIZACAO_ID, p.codigo as PRODUTO_ID, P.FAMILIA_CODIGO FAMILIA_ID, P.DESCRICAO, P.GRADE_CODIGO GRADE_ID, 10 TAMANHO, FN_TAMANHO_GRADE(P.GRADE_CODIGO,10) TAMANHO_DESCRICAO, COALESCE((SELECT EA.QUANTIDADE      FROM TBESTOQUE_SALDO_ALOCACAO EA WHERE EA.ESTABELECIMENTO_ID = A.ESTABELECIMENTO_CODIGO AND EA.LOCALIZACAO_ID = A.LOCALIZACAO_CODIGO AND EA.PRODUTO_ID = A.PRODUTO_CODIGO AND EA.TAMANHO = 10),0) as ALOCADO, A.T10_SALDO as SALDO, P.UNIDADEMEDIDA_SIGLA2, a.saldo_deterceiro, a.saldo_emterceiro FROM TBPRODUTO P LEFT JOIN TBESTOQUE_SALDO A ON P.CODIGO = A.PRODUTO_CODIGO WHERE P.GRADE_CODIGO > 0 and P.STATUS = '1'  UNION
SELECT coalesce(A.ESTABELECIMENTO_CODIGO,1) ESTABELECIMENTO_ID, coalesce(A.LOCALIZACAO_CODIGO,p.localizacao_codigo) LOCALIZACAO_ID, p.codigo as PRODUTO_ID, P.FAMILIA_CODIGO FAMILIA_ID, P.DESCRICAO, P.GRADE_CODIGO GRADE_ID, 11 TAMANHO, FN_TAMANHO_GRADE(P.GRADE_CODIGO,11) TAMANHO_DESCRICAO, COALESCE((SELECT EA.QUANTIDADE      FROM TBESTOQUE_SALDO_ALOCACAO EA WHERE EA.ESTABELECIMENTO_ID = A.ESTABELECIMENTO_CODIGO AND EA.LOCALIZACAO_ID = A.LOCALIZACAO_CODIGO AND EA.PRODUTO_ID = A.PRODUTO_CODIGO AND EA.TAMANHO = 11),0) as ALOCADO, A.T11_SALDO as SALDO, P.UNIDADEMEDIDA_SIGLA2, a.saldo_deterceiro, a.saldo_emterceiro FROM TBPRODUTO P LEFT JOIN TBESTOQUE_SALDO A ON P.CODIGO = A.PRODUTO_CODIGO WHERE P.GRADE_CODIGO > 0 and P.STATUS = '1'  UNION
SELECT coalesce(A.ESTABELECIMENTO_CODIGO,1) ESTABELECIMENTO_ID, coalesce(A.LOCALIZACAO_CODIGO,p.localizacao_codigo) LOCALIZACAO_ID, p.codigo as PRODUTO_ID, P.FAMILIA_CODIGO FAMILIA_ID, P.DESCRICAO, P.GRADE_CODIGO GRADE_ID, 12 TAMANHO, FN_TAMANHO_GRADE(P.GRADE_CODIGO,12) TAMANHO_DESCRICAO, COALESCE((SELECT EA.QUANTIDADE      FROM TBESTOQUE_SALDO_ALOCACAO EA WHERE EA.ESTABELECIMENTO_ID = A.ESTABELECIMENTO_CODIGO AND EA.LOCALIZACAO_ID = A.LOCALIZACAO_CODIGO AND EA.PRODUTO_ID = A.PRODUTO_CODIGO AND EA.TAMANHO = 12),0) as ALOCADO, A.T12_SALDO as SALDO, P.UNIDADEMEDIDA_SIGLA2, a.saldo_deterceiro, a.saldo_emterceiro FROM TBPRODUTO P LEFT JOIN TBESTOQUE_SALDO A ON P.CODIGO = A.PRODUTO_CODIGO WHERE P.GRADE_CODIGO > 0 and P.STATUS = '1'  UNION
SELECT coalesce(A.ESTABELECIMENTO_CODIGO,1) ESTABELECIMENTO_ID, coalesce(A.LOCALIZACAO_CODIGO,p.localizacao_codigo) LOCALIZACAO_ID, p.codigo as PRODUTO_ID, P.FAMILIA_CODIGO FAMILIA_ID, P.DESCRICAO, P.GRADE_CODIGO GRADE_ID, 13 TAMANHO, FN_TAMANHO_GRADE(P.GRADE_CODIGO,13) TAMANHO_DESCRICAO, COALESCE((SELECT EA.QUANTIDADE      FROM TBESTOQUE_SALDO_ALOCACAO EA WHERE EA.ESTABELECIMENTO_ID = A.ESTABELECIMENTO_CODIGO AND EA.LOCALIZACAO_ID = A.LOCALIZACAO_CODIGO AND EA.PRODUTO_ID = A.PRODUTO_CODIGO AND EA.TAMANHO = 13),0) as ALOCADO, A.T13_SALDO as SALDO, P.UNIDADEMEDIDA_SIGLA2, a.saldo_deterceiro, a.saldo_emterceiro FROM TBPRODUTO P LEFT JOIN TBESTOQUE_SALDO A ON P.CODIGO = A.PRODUTO_CODIGO WHERE P.GRADE_CODIGO > 0 and P.STATUS = '1'  UNION
SELECT coalesce(A.ESTABELECIMENTO_CODIGO,1) ESTABELECIMENTO_ID, coalesce(A.LOCALIZACAO_CODIGO,p.localizacao_codigo) LOCALIZACAO_ID, p.codigo as PRODUTO_ID, P.FAMILIA_CODIGO FAMILIA_ID, P.DESCRICAO, P.GRADE_CODIGO GRADE_ID, 14 TAMANHO, FN_TAMANHO_GRADE(P.GRADE_CODIGO,14) TAMANHO_DESCRICAO, COALESCE((SELECT EA.QUANTIDADE      FROM TBESTOQUE_SALDO_ALOCACAO EA WHERE EA.ESTABELECIMENTO_ID = A.ESTABELECIMENTO_CODIGO AND EA.LOCALIZACAO_ID = A.LOCALIZACAO_CODIGO AND EA.PRODUTO_ID = A.PRODUTO_CODIGO AND EA.TAMANHO = 14),0) as ALOCADO, A.T14_SALDO as SALDO, P.UNIDADEMEDIDA_SIGLA2, a.saldo_deterceiro, a.saldo_emterceiro FROM TBPRODUTO P LEFT JOIN TBESTOQUE_SALDO A ON P.CODIGO = A.PRODUTO_CODIGO WHERE P.GRADE_CODIGO > 0 and P.STATUS = '1'  UNION
SELECT coalesce(A.ESTABELECIMENTO_CODIGO,1) ESTABELECIMENTO_ID, coalesce(A.LOCALIZACAO_CODIGO,p.localizacao_codigo) LOCALIZACAO_ID, p.codigo as PRODUTO_ID, P.FAMILIA_CODIGO FAMILIA_ID, P.DESCRICAO, P.GRADE_CODIGO GRADE_ID, 15 TAMANHO, FN_TAMANHO_GRADE(P.GRADE_CODIGO,15) TAMANHO_DESCRICAO, COALESCE((SELECT EA.QUANTIDADE      FROM TBESTOQUE_SALDO_ALOCACAO EA WHERE EA.ESTABELECIMENTO_ID = A.ESTABELECIMENTO_CODIGO AND EA.LOCALIZACAO_ID = A.LOCALIZACAO_CODIGO AND EA.PRODUTO_ID = A.PRODUTO_CODIGO AND EA.TAMANHO = 15),0) as ALOCADO, A.T15_SALDO as SALDO, P.UNIDADEMEDIDA_SIGLA2, a.saldo_deterceiro, a.saldo_emterceiro FROM TBPRODUTO P LEFT JOIN TBESTOQUE_SALDO A ON P.CODIGO = A.PRODUTO_CODIGO WHERE P.GRADE_CODIGO > 0 and P.STATUS = '1'  UNION
SELECT coalesce(A.ESTABELECIMENTO_CODIGO,1) ESTABELECIMENTO_ID, coalesce(A.LOCALIZACAO_CODIGO,p.localizacao_codigo) LOCALIZACAO_ID, p.codigo as PRODUTO_ID, P.FAMILIA_CODIGO FAMILIA_ID, P.DESCRICAO, P.GRADE_CODIGO GRADE_ID, 16 TAMANHO, FN_TAMANHO_GRADE(P.GRADE_CODIGO,16) TAMANHO_DESCRICAO, COALESCE((SELECT EA.QUANTIDADE      FROM TBESTOQUE_SALDO_ALOCACAO EA WHERE EA.ESTABELECIMENTO_ID = A.ESTABELECIMENTO_CODIGO AND EA.LOCALIZACAO_ID = A.LOCALIZACAO_CODIGO AND EA.PRODUTO_ID = A.PRODUTO_CODIGO AND EA.TAMANHO = 16),0) as ALOCADO, A.T16_SALDO as SALDO, P.UNIDADEMEDIDA_SIGLA2, a.saldo_deterceiro, a.saldo_emterceiro FROM TBPRODUTO P LEFT JOIN TBESTOQUE_SALDO A ON P.CODIGO = A.PRODUTO_CODIGO WHERE P.GRADE_CODIGO > 0 and P.STATUS = '1'  UNION
SELECT coalesce(A.ESTABELECIMENTO_CODIGO,1) ESTABELECIMENTO_ID, coalesce(A.LOCALIZACAO_CODIGO,p.localizacao_codigo) LOCALIZACAO_ID, p.codigo as PRODUTO_ID, P.FAMILIA_CODIGO FAMILIA_ID, P.DESCRICAO, P.GRADE_CODIGO GRADE_ID, 17 TAMANHO, FN_TAMANHO_GRADE(P.GRADE_CODIGO,17) TAMANHO_DESCRICAO, COALESCE((SELECT EA.QUANTIDADE      FROM TBESTOQUE_SALDO_ALOCACAO EA WHERE EA.ESTABELECIMENTO_ID = A.ESTABELECIMENTO_CODIGO AND EA.LOCALIZACAO_ID = A.LOCALIZACAO_CODIGO AND EA.PRODUTO_ID = A.PRODUTO_CODIGO AND EA.TAMANHO = 17),0) as ALOCADO, A.T17_SALDO as SALDO, P.UNIDADEMEDIDA_SIGLA2, a.saldo_deterceiro, a.saldo_emterceiro FROM TBPRODUTO P LEFT JOIN TBESTOQUE_SALDO A ON P.CODIGO = A.PRODUTO_CODIGO WHERE P.GRADE_CODIGO > 0 and P.STATUS = '1'  UNION
SELECT coalesce(A.ESTABELECIMENTO_CODIGO,1) ESTABELECIMENTO_ID, coalesce(A.LOCALIZACAO_CODIGO,p.localizacao_codigo) LOCALIZACAO_ID, p.codigo as PRODUTO_ID, P.FAMILIA_CODIGO FAMILIA_ID, P.DESCRICAO, P.GRADE_CODIGO GRADE_ID, 18 TAMANHO, FN_TAMANHO_GRADE(P.GRADE_CODIGO,18) TAMANHO_DESCRICAO, COALESCE((SELECT EA.QUANTIDADE      FROM TBESTOQUE_SALDO_ALOCACAO EA WHERE EA.ESTABELECIMENTO_ID = A.ESTABELECIMENTO_CODIGO AND EA.LOCALIZACAO_ID = A.LOCALIZACAO_CODIGO AND EA.PRODUTO_ID = A.PRODUTO_CODIGO AND EA.TAMANHO = 18),0) as ALOCADO, A.T18_SALDO as SALDO, P.UNIDADEMEDIDA_SIGLA2, a.saldo_deterceiro, a.saldo_emterceiro FROM TBPRODUTO P LEFT JOIN TBESTOQUE_SALDO A ON P.CODIGO = A.PRODUTO_CODIGO WHERE P.GRADE_CODIGO > 0 and P.STATUS = '1'  UNION
SELECT coalesce(A.ESTABELECIMENTO_CODIGO,1) ESTABELECIMENTO_ID, coalesce(A.LOCALIZACAO_CODIGO,p.localizacao_codigo) LOCALIZACAO_ID, p.codigo as PRODUTO_ID, P.FAMILIA_CODIGO FAMILIA_ID, P.DESCRICAO, P.GRADE_CODIGO GRADE_ID, 19 TAMANHO, FN_TAMANHO_GRADE(P.GRADE_CODIGO,19) TAMANHO_DESCRICAO, COALESCE((SELECT EA.QUANTIDADE      FROM TBESTOQUE_SALDO_ALOCACAO EA WHERE EA.ESTABELECIMENTO_ID = A.ESTABELECIMENTO_CODIGO AND EA.LOCALIZACAO_ID = A.LOCALIZACAO_CODIGO AND EA.PRODUTO_ID = A.PRODUTO_CODIGO AND EA.TAMANHO = 19),0) as ALOCADO, A.T19_SALDO as SALDO, P.UNIDADEMEDIDA_SIGLA2, a.saldo_deterceiro, a.saldo_emterceiro FROM TBPRODUTO P LEFT JOIN TBESTOQUE_SALDO A ON P.CODIGO = A.PRODUTO_CODIGO WHERE P.GRADE_CODIGO > 0 and P.STATUS = '1'  UNION
SELECT coalesce(A.ESTABELECIMENTO_CODIGO,1) ESTABELECIMENTO_ID, coalesce(A.LOCALIZACAO_CODIGO,p.localizacao_codigo) LOCALIZACAO_ID, p.codigo as PRODUTO_ID, P.FAMILIA_CODIGO FAMILIA_ID, P.DESCRICAO, P.GRADE_CODIGO GRADE_ID, 20 TAMANHO, FN_TAMANHO_GRADE(P.GRADE_CODIGO,20) TAMANHO_DESCRICAO, COALESCE((SELECT EA.QUANTIDADE      FROM TBESTOQUE_SALDO_ALOCACAO EA WHERE EA.ESTABELECIMENTO_ID = A.ESTABELECIMENTO_CODIGO AND EA.LOCALIZACAO_ID = A.LOCALIZACAO_CODIGO AND EA.PRODUTO_ID = A.PRODUTO_CODIGO AND EA.TAMANHO = 20),0) as ALOCADO, A.T20_SALDO as SALDO, P.UNIDADEMEDIDA_SIGLA2, a.saldo_deterceiro, a.saldo_emterceiro FROM TBPRODUTO P LEFT JOIN TBESTOQUE_SALDO A ON P.CODIGO = A.PRODUTO_CODIGO WHERE P.GRADE_CODIGO > 0 and P.STATUS = '1'
)
;

CREATE OR ALTER VIEW VWPDV_PRODUTOS(
    ESTABELECIMENTO_ID,
    LOCALIZACAO_ID,
    FAMILIA_ID,
    MODELO_ID,
    PRODUTO_ID,
    PRODUTO_DESCRICAO,
    COR_DESCRICAO,
    UM,
    NCM,
    EAN,
    TAMANHO,
    FRACIONAR,
    CEST,
    CFOP_CODIGO,
    OPERACAO_CODIGO,
    TABELA_PRECO_ID,
    VALOR_UNITARIO,
    VALOR_UNITARIO_PROMOCIONAL,
    QUANTIDADE_MINIMA,
    TRIBUTACAO_ORIGEM,
    TRIBUTACAO_ICMS,
    ICMS_ALIQUOTA,
    TRIBUTACAO_PIS,
    PIS_ALIQUOTA,
    TRIBUTACAO_COFINS,
    COFINS_ALIQUOTA,
    REDUCAO_BASE_PISCOF,
    TIPO_DESCONTO,
    TAM_DESCRICAO)
AS
SELECT
ESTABELECIMENTO_ID,
LOCALIZACAO_ID,
FAMILIA_ID,
MODELO_ID,
PRODUTO_ID,
PRODUTO_DESCRICAO||' '||TAM_DESCRICAO AS PRODUTO_DESCRICAO,
COR_DESCRICAO,
UM,
NCM,
EAN,
TAMANHO,
FRACIONAR,
CEST,
CFOP_CODIGO,
OPERACAO_CODIGO,
TABELA_PRECO_ID,
VALOR_UNITARIO,
CAST(FN_ARRAY(VALOR_QUANTIDADE_PROMOCIONAL,1,'|') AS NUMERIC(15,2)) VALOR_UNITARIO_PROMOCIONAL,
CAST(FN_ARRAY(VALOR_QUANTIDADE_PROMOCIONAL,2,'|') AS INTEGER) QUANTIDADE_MINIMA,
TRIBUTACAO_ORIGEM,
TRIBUTACAO_ICMS,
ICMS_ALIQUOTA,
TRIBUTACAO_PIS,
PIS_ALIQUOTA,
TRIBUTACAO_COFINS,
COFINS_ALIQUOTA,
REDUCAO_BASE_PISCOF,
TIPO_DESCONTO,
TAM_DESCRICAO

FROM (
            SELECT 
                B.ESTABELECIMENTO_CODIGO ESTABELECIMENTO_ID,
                B.LOCALIZACAO_PDV AS LOCALIZACAO_ID,
                P.FAMILIA_INVENTARIO AS FAMILIA_ID,
                M.CODIGO AS MODELO_ID,
                P.CODIGO AS PRODUTO_ID,
                IIF(COALESCE(N.DESCRICAO_PDV,'') <> '' AND N.DESCRICAO_PDV <> '0', COALESCE(N.DESCRICAO_PDV,''),
                   IIF(COALESCE(M.DESCRICAO_COMERCIAL,'') <> '' AND M.DESCRICAO_COMERCIAL <> '0',
                       COALESCE(UPPER(M.DESCRICAO_COMERCIAL),'')||' '||COALESCE(UPPER(H.DESCRICAO),''),
                          COALESCE(UPPER(P.DESCRICAO),'')/*||' '||COALESCE(UPPER(H.DESCRICAO),'')*/)) PRODUTO_DESCRICAO,
                H.DESCRICAO AS COR_DESCRICAO,
                P.UNIDADEMEDIDA_SIGLA2 AS UM,
                P.NCM_CODIGO AS NCM,
                E.PREFIXO||E.CODIGO||COALESCE((SELECT DIGITO FROM DIGITOEAN(E.PREFIXO||E.CODIGO)),'') AS EAN,
                E.TAMANHO,

               (SELECT U.PODE_FRACIONAR FROM TbUnidadeMedida U WHERE U.SIGLA = P.UNIDADEMEDIDA_SIGLA2) FRACIONAR,
               (SELECT CEST FROM TBFAMILIA F WHERE F.CODIGO = P.FAMILIA_INVENTARIO) CEST,
                B.CFOP_CODIGO,
                B.OPERACAO_PDV AS OPERACAO_CODIGO,
                MP.TABELA_ID   AS TABELA_PRECO_ID,
                IIF(E.TAMANHO = 1 AND MP.PR_NF_01 > 0, MP.PR_NF_01,
                IIF(E.TAMANHO = 2 AND MP.PR_NF_02 > 0, MP.PR_NF_02,
                IIF(E.TAMANHO = 3 AND MP.PR_NF_03 > 0, MP.PR_NF_03,
                IIF(E.TAMANHO = 4 AND MP.PR_NF_04 > 0, MP.PR_NF_04,
                IIF(E.TAMANHO = 5 AND MP.PR_NF_05 > 0, MP.PR_NF_05,
                IIF(E.TAMANHO = 6 AND MP.PR_NF_06 > 0, MP.PR_NF_06,
                IIF(E.TAMANHO = 7 AND MP.PR_NF_07 > 0, MP.PR_NF_07,
                IIF(E.TAMANHO = 8 AND MP.PR_NF_08 > 0, MP.PR_NF_08,
                IIF(E.TAMANHO = 9 AND MP.PR_NF_09 > 0, MP.PR_NF_09,
                IIF(E.TAMANHO =10 AND MP.PR_NF_10 > 0, MP.PR_NF_10,
                IIF(E.TAMANHO =11 AND MP.PR_NF_11 > 0, MP.PR_NF_11,
                IIF(E.TAMANHO =12 AND MP.PR_NF_12 > 0, MP.PR_NF_12,
                IIF(E.TAMANHO =13 AND MP.PR_NF_13 > 0, MP.PR_NF_13,
                IIF(E.TAMANHO =14 AND MP.PR_NF_14 > 0, MP.PR_NF_14,
                IIF(E.TAMANHO =15 AND MP.PR_NF_15 > 0, MP.PR_NF_15,
                IIF(E.TAMANHO =16 AND MP.PR_NF_16 > 0, MP.PR_NF_16,
                IIF(E.TAMANHO =17 AND MP.PR_NF_17 > 0, MP.PR_NF_17,
                IIF(E.TAMANHO =18 AND MP.PR_NF_18 > 0, MP.PR_NF_18,
                IIF(E.TAMANHO =19 AND MP.PR_NF_19 > 0, MP.PR_NF_19,
                IIF(E.TAMANHO =20 AND MP.PR_NF_20 > 0, MP.PR_NF_20,
                MP.PRECO_VENDA)))))))))))))))))))) AS VALOR_UNITARIO,

                IIF(TP.TABELA_PRECO_ID_PROMOCIONAL > 0,
                COALESCE((SELECT

                    IIF(E.TAMANHO = 1 AND MPP.PR_NF_01 > 0, MPP.PR_NF_01,
                    IIF(E.TAMANHO = 2 AND MPP.PR_NF_02 > 0, MPP.PR_NF_02,
                    IIF(E.TAMANHO = 3 AND MPP.PR_NF_03 > 0, MPP.PR_NF_03,
                    IIF(E.TAMANHO = 4 AND MPP.PR_NF_04 > 0, MPP.PR_NF_04,
                    IIF(E.TAMANHO = 5 AND MPP.PR_NF_05 > 0, MPP.PR_NF_05,
                    IIF(E.TAMANHO = 6 AND MPP.PR_NF_06 > 0, MPP.PR_NF_06,
                    IIF(E.TAMANHO = 7 AND MPP.PR_NF_07 > 0, MPP.PR_NF_07,
                    IIF(E.TAMANHO = 8 AND MPP.PR_NF_08 > 0, MPP.PR_NF_08,
                    IIF(E.TAMANHO = 9 AND MPP.PR_NF_09 > 0, MPP.PR_NF_09,
                    IIF(E.TAMANHO =10 AND MPP.PR_NF_10 > 0, MPP.PR_NF_10,
                    IIF(E.TAMANHO =11 AND MPP.PR_NF_11 > 0, MPP.PR_NF_11,
                    IIF(E.TAMANHO =12 AND MPP.PR_NF_12 > 0, MPP.PR_NF_12,
                    IIF(E.TAMANHO =13 AND MPP.PR_NF_13 > 0, MPP.PR_NF_13,
                    IIF(E.TAMANHO =14 AND MPP.PR_NF_14 > 0, MPP.PR_NF_14,
                    IIF(E.TAMANHO =15 AND MPP.PR_NF_15 > 0, MPP.PR_NF_15,
                    IIF(E.TAMANHO =16 AND MPP.PR_NF_16 > 0, MPP.PR_NF_16,
                    IIF(E.TAMANHO =17 AND MPP.PR_NF_17 > 0, MPP.PR_NF_17,
                    IIF(E.TAMANHO =18 AND MPP.PR_NF_18 > 0, MPP.PR_NF_18,
                    IIF(E.TAMANHO =19 AND MPP.PR_NF_19 > 0, MPP.PR_NF_19,
                    IIF(E.TAMANHO =20 AND MPP.PR_NF_20 > 0, MPP.PR_NF_20,
                    MPP.PRECO_VENDA))))))))))))))))))))||'|'||COALESCE(MPP.QUANTIDADE_MINIMA,0)

                    FROM TBMODELO_PRECO MPP, TBTABELA_PRECO TPP
                    WHERE MPP.TABELA_ID = TPP.ID
                    AND MPP.MODELO_CODIGO = M.CODIGO
                    AND MPP.ESTABELECIMENTO_CODIGO = B.ESTABELECIMENTO_CODIGO
                    AND TPP.HABILITA_PDV = '1'
                    AND CURRENT_DATE BETWEEN TPP.DATA_INICIAL AND TPP.DATA_FINAL
                    AND TPP.ID = TP.TABELA_PRECO_ID_PROMOCIONAL), '0|0'), '0|0') AS VALOR_QUANTIDADE_PROMOCIONAL,

                B.CST_ORIGEM   AS TRIBUTACAO_ORIGEM,
                B.CST          AS TRIBUTACAO_ICMS,
                B.TAXA_ICMS    AS ICMS_ALIQUOTA,
                COALESCE(B.CST_PISCOF,'')  AS TRIBUTACAO_PIS,
                B.TAXA_PIS     AS PIS_ALIQUOTA,
                COALESCE(B.CST_PISCOF,'')  AS TRIBUTACAO_COFINS,
                B.TAXA_COFINS  AS COFINS_ALIQUOTA,
                C.REDUCAO_BASE_PISCOF,
                OP.TIPO_DESCONTO,
                FN_TAMANHO_GRADE(P.GRADE_CODIGO, E.TAMANHO) AS TAM_DESCRICAO

            FROM TBMODELO        M,
                 TBCOR           H,
                 TBFAMILIA_FICHA B,
                 TBMODELO_PRECO MP,
                 TBTABELA_PRECO TP,
                 TBCFOP          C,
                 TBOPERACAO     OP,
                 TBEAN           E,
                 TBPRODUTO       P
                 LEFT JOIN TBPRODUTO_FICHA N ON N.PRODUTO_CODIGO = P.CODIGO 

            WHERE MP.ESTABELECIMENTO_CODIGO = B.ESTABELECIMENTO_CODIGO
              AND B.FAMILIA_CODIGO          = P.FAMILIA_INVENTARIO
              AND E.MODELO_ID               = P.MODELO_CODIGO
              AND M.CODIGO                  = P.MODELO_CODIGO
              AND M.CODIGO                  = MP.MODELO_CODIGO
              AND E.COR_ID                  = P.COR_CODIGO
              AND H.CODIGO                  = P.COR_CODIGO
              AND C.CODIGO                  = B.CFOP_CODIGO
              AND OP.CODIGO                 = B.OPERACAO_PDV
              AND MP.TABELA_ID              = TP.ID
              AND P.STATUS                  = '1'  /* SOMENTE PRODUTOS ATIVOS */
              AND M.STATUS                  = '1'  /* SOMENTE MODELOS  ATIVOS */
              AND TP.HABILITA_PDV           = '1'  /* SOMENTE ITENS COM TABELA DE PREÇO HABILITADAS PARA PDV */
              AND CURRENT_DATE BETWEEN TP.DATA_INICIAL AND TP.DATA_FINAL /* SOMENTE TABELAS DE PREÇOS VIGENTES NA DATA CORRENTE */
)
;

CREATE OR ALTER VIEW VWPRODUTOS_PDV(
    ID,
    ATIVO,
    PERMITE_FRACIONAR,
    GTIN,
    TAMANHO,
    DESCRICAO,
    UND,
    EXTIPI,
    CFOP,
    SN_ALIQCREDITO,
    ID_CSTPIS,
    ID_CSTCOFINS,
    QTDE_ESTOQUE,
    VL_UNITARIO,
    CEST,
    NCM,
    CST,
    PIS_ALIQUOTA,
    ICMS_ALIQUOTA,
    COFINS_ALIQUOTA,
    ORIGEM,
    MODELO_ID,
    FAMILIA_INVENTARIO)
AS
SELECT
ID,
ATIVO,
PERMITE_FRACIONAR,
GTIN,
TAMANHO,
DESCRICAO,
UND,
EXTIPI,
CFOP,
SN_ALIQCREDITO,
ID_CSTPIS,
ID_CSTCOFINS,
QTDE_ESTOQUE,
VL_UNITARIO,
CEST,
NCM,
CST,
PIS_ALIQUOTA,
ICMS_ALIQUOTA,
COFINS_ALIQUOTA,
ORIGEM,
MODELO_ID, 
FAMILIA_INVENTARIO
FROM (
            SELECT
                T.PRODUTO_ID ID,
                'S' ATIVO,
                'N' PERMITE_FRACIONAR,
                T.EAN GTIN,
                T.TAMANHO,
                IIF(COALESCE(N.DESCRICAO_PDV,'') <> '', COALESCE(N.DESCRICAO_PDV,'')||' '||T.TAMANHO_DESCRICAO,
                    IIF(COALESCE(M.DESCRICAO_COMERCIAL,'') <> '', COALESCE(LOWER(M.DESCRICAO_COMERCIAL),'')||' '||COALESCE(LOWER(H.DESCRICAO),'')||' '||T.TAMANHO_DESCRICAO,
                        COALESCE(LOWER(LL.PRODUTO_DESCRICAO),'')||' '||COALESCE(LOWER(H.DESCRICAO),'')||' '||T.TAMANHO_DESCRICAO)) DESCRICAO,
                P.UNIDADEMEDIDA_SIGLA2 AS UND,
                '' EXTIPI,
                REPLACE(B.CFOP_CODIGO,'.','') CFOP,
                0 SN_ALIQCREDITO,
                COALESCE(B.CST_PISCOF,'01') AS ID_CSTPIS,
                COALESCE(B.CST_PISCOF,'01') AS ID_CSTCOFINS,
                0 QTDE_ESTOQUE,
            
                IIF(COALESCE(Z.CUSTOUNITARIO_PADRAO,0) > 0, Z.CUSTOUNITARIO_PADRAO,
                (SELECT FIRST 1 C.VALOR FROM TBREFERENCIA_PRECO C
                  WHERE C.REFERENCIA_ID = L.REFERENCIA_ID
                    AND C.CLIENTE_TIPO_ID = 61
                    AND CURRENT_TIMESTAMP BETWEEN C.DATA_INICIO AND C.DATA_FIM)) AS VL_UNITARIO,
            
                F.CEST,
                P.NCM_CODIGO  AS NCM,
                B.CST,                            --     0
                B.TAXA_PIS    AS PIS_ALIQUOTA,    --  1,65
                B.TAXA_ICMS   AS ICMS_ALIQUOTA,   -- 18,00
                B.TAXA_COFINS AS COFINS_ALIQUOTA, --  7,60
                B.CST_ORIGEM  AS ORIGEM,
                M.CODIGO      AS MODELO_ID, 
                P.FAMILIA_INVENTARIO
            
            FROM SPC_SKUS_ECOMMERCE2(0,0) T, TBMODELO M, TBMODELO_LINHA L, TBFAMILIA F, TBFAMILIA_FICHA B, TBREFERENCIA_LINHA LL, TBCOR H, TBPRODUTO P
            LEFT JOIN TBPRODUTO_CONTABIL Z ON Z.PRODUTO_CODIGO = P.CODIGO
            LEFT JOIN TBPRODUTO_FICHA N ON N.PRODUTO_CODIGO = P.CODIGO
            WHERE P.CODIGO = T.PRODUTO_ID
            AND M.CODIGO = P.MODELO_CODIGO
            AND L.CODIGO = M.LINHA_CODIGO
            AND F.CODIGO = P.FAMILIA_CODIGO
            AND B.FAMILIA_CODIGO = F.CODIGO
            AND B.ESTABELECIMENTO_CODIGO = 1
            AND LL.ID = L.REFERENCIA_ID
            AND H.CODIGO = P.COR_CODIGO
            AND P.STATUS = '1'
       )
WHERE VL_UNITARIO > 0
;

SET TERM ^ ;

CREATE OR ALTER procedure SPC_AMOSTRA_INVENTARIO (
    REGISTROS integer,
    LOC integer,
    FAM varchar(40))
returns (
    SEQ integer,
    DATAHORA timestamp,
    FAMILIA varchar(30),
    PRODUTO varchar(110),
    SALDO numeric(18,5),
    UM varchar(3),
    INVENTARIO varchar(1),
    PRODUTO_ID integer,
    LOCALIZACAO varchar(40))
as
declare variable I integer;
BEGIN

i = 0;
UPDATE TBPRODUTO SET DATA_AMOSTRA_INVENTARIO = NULL WHERE DATA_AMOSTRA_INVENTARIO = CURRENT_DATE AND FAMILIA_CODIGO = :FAM;

FOR SELECT
    DATAHORA, FAMILIA, PRODUTO, SALDO, UM, INVENTARIO, PRODUTO_ID,
    LOCALIZACAO_ID||'-'||(SELECT DESCRICAO FROM TBLOCALIZACAO WHERE CODIGO = LOCALIZACAO_ID) LOCALIZACAO
    FROM (
    SELECT FIRST 50 DISTINCT
            CURRENT_TIMESTAMP DATAHORA,
            FN_LPAD(F.CODIGO,4,'0')||' - '||F.DESCRICAO FAMILIA,
            FN_LPAD(P.CODIGO,6,'0')||' - '||P.DESCRICAO PRODUTO, E.SALDO,
            P.UNIDADEMEDIDA_SIGLA2 UM,
            '' INVENTARIO,
            IIF( CHAR_LENGTH( CAST(:LOC AS INTEGER) ) > 0, :LOC , P.LOCALIZACAO_CODIGO ) LOCALIZACAO_ID, P.CODIGO PRODUTO_ID
       FROM TBPRODUTO P, TBESTOQUE_SALDO E, TBESTOQUE_SALDO_DIARIO ES, TBFAMILIA F
      WHERE E.PRODUTO_CODIGO = P.CODIGO
        AND E.ESTABELECIMENTO_CODIGO = ES.ESTABELECIMENTO_CODIGO
        AND E.LOCALIZACAO_CODIGO = ES.LOCALIZACAO_CODIGO
        AND E.PRODUTO_CODIGO = ES.PRODUTO_CODIGO
        AND P.FAMILIA_CODIGO = F.CODIGO
        AND E.ESTABELECIMENTO_CODIGO = 1
        AND E.LOCALIZACAO_CODIGO = IIF( CHAR_LENGTH( CAST(:LOC AS INTEGER) ) > 0, CAST(:LOC AS INTEGER) , P.LOCALIZACAO_CODIGO )
        AND ES.DATA >= CURRENT_DATE - 90
        AND E.SALDO > 0
        AND F.INVENTARIO = '1'
        AND F.STATUS = '1'
        AND F.CODIGO||F.DESCRICAO CONTAINING UPPER( :FAM )
        AND (COALESCE(P.DATA_AMOSTRA_INVENTARIO,CAST('01.01.2000' as DATE)) = CURRENT_DATE or
             COALESCE(P.DATA_AMOSTRA_INVENTARIO,CAST('01.01.2000' as DATE)) < CURRENT_DATE - 30)

    ORDER BY RAND())
    ORDER BY 2,3

INTO
:DATAHORA,
:FAMILIA,
:PRODUTO,
:SALDO,
:UM,
:INVENTARIO,
:PRODUTO_ID,
:LOCALIZACAO
DO BEGIN
   if (:Registros > i) then
       Begin
           i = i + 1;
           SEQ = I;
           UPDATE TBPRODUTO SET DATA_AMOSTRA_INVENTARIO = CURRENT_DATE WHERE CODIGO = :PRODUTO_ID;
           SUSPEND;
       End
   END
END
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER procedure SPC_AMOSTRA_INVENTARIO_V3 (
    QTD integer,
    FAMILIA varchar(100),
    LOCALIZACAO varchar(100),
    GRAVAR varchar(1),
    PERCENTUAL integer)
returns (
    SEQ integer,
    LOCALIZACAO_ID integer,
    LOCALIZACAO_DESCRICAO varchar(80),
    FAMILIA_ID integer,
    FAMILIA_DESCRICAO varchar(80),
    ITENS integer,
    MARCADO integer,
    TOTAL_ITENS integer,
    TOTAL_MARCADOS integer,
    PRODUTO_ID integer,
    PRODUTO_DESCRICAO varchar(110),
    SALDO numeric(18,5),
    DATA_MOVIMENTACAO date,
    REGISTROS integer)
as
declare variable VQTD integer;
declare variable VPERC numeric(15,2);
declare variable I integer;
Begin

  vQtd = :Qtd;
  vPerc = :Percentual / 100.00;

       UPDATE TBESTOQUE_SALDO SET DATA_AMOSTRA_INVENTARIO = NULL WHERE DATA_AMOSTRA_INVENTARIO = '1.1.1900';--CURRENT_DATE or extract ( year from DATA_AMOSTRA_INVENTARIO ) <> extract ( year from current_date);

  i = 0;

  While (:i < :vQtd) Do
    Begin

    For

        SELECT
        LOCALIZACAO_ID,
        LOCALIZACAO_DESCRICAO,
        FAMILIA_ID,
        FAMILIA_DESCRICAO,
        ITENS,
        MARCADO,
        TOTAL_ITENS,
        TOTAL_MARCADOS,
        COUNT(*) over() REGISTROS
        
        FROM (
        Select 0 LOCALIZACAO_ID,
            '' LOCALIZACAO_DESCRICAO,
            0 FAMILIA_ID,
            '' FAMILIA_DESCRICAO,
            99999 ITENS,
            99999 MARCADO,
            0 TOTAL_ITENS,
            0 TOTAL_MARCADOS
        From RDB$DATABASE
        
        UNION
        
        Select LOCALIZACAO_ID,
            LOCALIZACAO_DESCRICAO,
            FAMILIA_ID,
            FAMILIA_DESCRICAO,
            ITENS,
            MARCADO,
            SUM(ITENS) Over () TOTAL_ITENS,
            SUM(MARCADO) Over () TOTAL_MARCADOS
            From (
            Select LOCALIZACAO_ID,
            LOCALIZACAO_DESCRICAO,
            FAMILIA_ID,
            FAMILIA_DESCRICAO,
            trunc(fn_arrendondar_para_cima(COUNT(PRODUTO_ID) * :vPerc )) ITENS,
            SUM(MARCADO) MARCADO
            From (
             SELECT S.Localizacao_Codigo Localizacao_Id,
                    L.Descricao Localizacao_Descricao,
                    P.FAMILIA_CODIGO Familia_Id, F.Descricao Familia_Descricao,
                    S.Produto_codigo Produto_Id, P.Descricao Produto_Descricao,
                    S.Saldo,
                   (Select First 1 I.Data
                    From tbestoque_transacao_item i, tboperacao o
                    Where p.codigo = i.produto_codigo
                      and o.codigo = i.operacao_codigo
                      and s.estabelecimento_codigo = i.estabelecimento_codigo
                      and s.localizacao_codigo = i.localizacao_codigo
                      and i.data >= Current_Date - 90
                      and o.tipo = 'S'
                      and o.acerto = '0') Data_Movimentacao,
                     IIF((Extract(Year From COALESCE(S.DATA_AMOSTRA_INVENTARIO,CAST('01.01.2000' as DATE))) = Extract(Year From CURRENT_DATE)),1,
                     IIF(S.DATA_AMOSTRA_INVENTARIO = '01.01.1900' and :gravar <> '1',1,0)) MARCADO
--                   IIF(S.DATA_AMOSTRA_INVENTARIO = CURRENT_DATE,1,0) MARCADO
               FROM TBPRODUTO P, TBFAMILIA F,  tbestoque_saldo S, TbLocalizacao L
              WHERE s.estabelecimento_codigo = 1
                and p.familia_codigo = f.codigo
                and s.produto_codigo = p.codigo
                and l.Codigo = s.localizacao_codigo
                and p.status = '1'
                and s.Saldo > 0
                and P.Familia_Codigo not in (3,14,71)
                and S.localizacao_codigo not in (4,7,8,23,27,30)
        
                AND F.CODIGO LIKE IIF(COALESCE( CAST( :FAMILIA AS VARCHAR(100)) ,'')='','%', CAST( :FAMILIA AS VARCHAR(100)) )
                AND L.CODIGO LIKE IIF(COALESCE( CAST( :LOCALIZACAO AS VARCHAR(100)) ,'')='','%', CAST( :LOCALIZACAO AS VARCHAR(100)) )
        
                and p.inventario = '1'
            )
            Where DATA_MOVIMENTACAO is not null
            Group By
            LOCALIZACAO_ID,
            LOCALIZACAO_DESCRICAO,
            FAMILIA_ID,
            FAMILIA_DESCRICAO
            )
        
        Order By 5,1,3
        )

    INTO :LOCALIZACAO_ID,:LOCALIZACAO_DESCRICAO,:FAMILIA_ID,:FAMILIA_DESCRICAO,:ITENS,:MARCADO,:TOTAL_ITENS,:TOTAL_MARCADOS,:REGISTROS
    DO begin

    if (:REGISTROS = 1) then
        i = :qtd;

    if ((:qtd - :i) > (:TOTAL_ITENS - :TOTAL_MARCADOS) and :FAMILIA_ID > 0) then
        Begin
        vQtd = :TOTAL_ITENS - :TOTAL_MARCADOS;
        End

    if (:marcado < :itens and :FAMILIA_ID > 0) then
        Begin
    if ( :i < :vQtd ) then
        Begin
           For
            Select First 1
            PRODUTO_ID,
            PRODUTO_DESCRICAO,
            SALDO,
            DATA_MOVIMENTACAO
            From (
             SELECT S.Produto_codigo Produto_Id, P.Descricao||'/'||P.UNIDADEMEDIDA_SIGLA2 Produto_Descricao,
                    S.Saldo,
                   (Select First 1 I.Data
                    From tbestoque_transacao_item i, tboperacao o
                    Where p.codigo = i.produto_codigo
                      and o.codigo = i.operacao_codigo
                      and s.estabelecimento_codigo = i.estabelecimento_codigo
                      and s.localizacao_codigo = i.localizacao_codigo
                      and i.data >= Current_Date - 90
                      and o.tipo = 'S'
                      and o.acerto = '0') Data_Movimentacao
            
               FROM TBPRODUTO P, tbestoque_saldo S
            
              WHERE s.estabelecimento_codigo = 1
                and s.produto_codigo = p.codigo
                and p.status = '1'
                and s.Saldo > 0
                and P.Familia_Codigo = :FAMILIA_ID
                and S.localizacao_codigo = :LOCALIZACAO_ID
                and p.inventario = '1'
                AND (Extract(Year From COALESCE(S.DATA_AMOSTRA_INVENTARIO,CAST('01.01.2000' as DATE))) <> Extract(Year From CURRENT_DATE))
                AND (S.DATA_AMOSTRA_INVENTARIO = '1.1.1900' AND :gravar = '1')

            )
            Where DATA_MOVIMENTACAO is not null
            Order By SALDO Desc
            Into :PRODUTO_ID,:PRODUTO_DESCRICAO,:SALDO,:DATA_MOVIMENTACAO
            Do Begin
               i = i + 1;
               SEQ = :I;
--                if (:gravar = '1') then
--                    begin
                       IN AUTONOMOUS TRANSACTION DO
                       BEGIN
                             UPDATE TBESTOQUE_SALDO SET DATA_AMOSTRA_INVENTARIO = IIF(:GRAVAR='1',CURRENT_DATE,Cast('1.1.1900' as Date))
                              WHERE PRODUTO_CODIGO = :PRODUTO_ID
                                AND ESTABELECIMENTO_CODIGO = 1
                                AND LOCALIZACAO_CODIGO = :LOCALIZACAO_ID;
                       END
--                    End
               Suspend;
               End
    
           end 
        End
        End
    End

--  if (:gravar = '1') then
--    begin
--    IN AUTONOMOUS TRANSACTION DO
--       BEGIN
       UPDATE TBESTOQUE_SALDO SET DATA_AMOSTRA_INVENTARIO = NULL WHERE DATA_AMOSTRA_INVENTARIO = '1.1.1900';--CURRENT_DATE or extract ( year from DATA_AMOSTRA_INVENTARIO ) <> extract ( year from current_date);
--       END
--    end

End
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER procedure SPC_AMOSTRA_INVENTARIO_V4 (
    QTD integer,
    FAMILIA varchar(100),
    LOCALIZACAO varchar(100),
    GRAVAR varchar(1),
    PERCENTUAL integer,
    PRODUTO varchar(100),
    PRODUTOS varchar(100))
returns (
    SEQ integer,
    LOCALIZACAO_ID integer,
    LOCALIZACAO_DESCRICAO varchar(80),
    FAMILIA_ID integer,
    FAMILIA_DESCRICAO varchar(80),
    ITENS integer,
    MARCADO integer,
    TOTAL_ITENS integer,
    TOTAL_MARCADOS integer,
    PRODUTO_ID integer,
    PRODUTO_DESCRICAO varchar(110),
    SALDO numeric(18,5),
    ALOCADO numeric(18,5),
    DATA_MOVIMENTACAO date,
    SALDO_GRADE varchar(500),
    REGISTROS integer,
    FISICO varchar(10),
    CUSTO_MEDIO numeric(15,4))
as
declare variable VQTD integer;
declare variable VPERC numeric(15,2);
declare variable I integer;
Begin

  vQtd = :Qtd;
  vPerc = :Percentual / 100.00;

--    IN AUTONOMOUS TRANSACTION DO
      UPDATE TBESTOQUE_SALDO SET DATA_AMOSTRA_INVENTARIO = NULL WHERE DATA_AMOSTRA_INVENTARIO = '1.1.1900';

  i = 0;

  While (:i < :vQtd) Do
    Begin

    For
        SELECT
        LOCALIZACAO_ID,
        LOCALIZACAO_DESCRICAO,
        FAMILIA_ID,
        FAMILIA_DESCRICAO,
        ITENS,
        MARCADO,
        TOTAL_ITENS,
        TOTAL_MARCADOS,
        COUNT(*) over() REGISTROS
        
        FROM (
        Select 0 LOCALIZACAO_ID,
            '' LOCALIZACAO_DESCRICAO,
            0 FAMILIA_ID,
            '' FAMILIA_DESCRICAO,
            99999 ITENS,
            99999 MARCADO,
            0 TOTAL_ITENS,
            0 TOTAL_MARCADOS
        From RDB$DATABASE
        
        UNION
        
        Select LOCALIZACAO_ID,
            LOCALIZACAO_DESCRICAO,
            FAMILIA_ID,
            FAMILIA_DESCRICAO,
            ITENS,
            MARCADO,
            SUM(ITENS) Over () TOTAL_ITENS,
            SUM(MARCADO) Over () TOTAL_MARCADOS
            From (
            Select LOCALIZACAO_ID,
            LOCALIZACAO_DESCRICAO,
            FAMILIA_ID,
            FAMILIA_DESCRICAO,
            trunc(fn_arrendondar_para_cima(COUNT(PRODUTO_ID) * :vPerc )) ITENS,
            SUM(MARCADO) MARCADO
            From (
             SELECT S.Localizacao_Codigo Localizacao_Id,
                    L.Descricao Localizacao_Descricao,
                    P.FAMILIA_CODIGO Familia_Id, F.Descricao Familia_Descricao,
                    S.Produto_codigo Produto_Id, P.Descricao Produto_Descricao,
                    S.Saldo,
                   (Select First 1 I.Data
                    From tbestoque_transacao_item i, tboperacao o
                    Where p.codigo = i.produto_codigo
                      and o.codigo = i.operacao_codigo
                      and s.estabelecimento_codigo = i.estabelecimento_codigo
                      and s.localizacao_codigo = i.localizacao_codigo
                      and i.data >= Current_Date - 90
                      and o.tipo = 'S'
                      and o.acerto = '0') Data_Movimentacao,
                     IIF((Extract(Year From COALESCE(S.DATA_AMOSTRA_INVENTARIO,CAST('01.01.2000' as DATE))) = Extract(Year From CURRENT_DATE)),1,
                     IIF(COALESCE(S.DATA_AMOSTRA_INVENTARIO,CAST('01.01.2000' as DATE)) = '01.01.1900',1,0)) MARCADO
--                   IIF(S.DATA_AMOSTRA_INVENTARIO = CURRENT_DATE,1,0) MARCADO
               FROM TBPRODUTO P, TBFAMILIA F,  tbestoque_saldo S, TbLocalizacao L
              WHERE s.estabelecimento_codigo = 1
                and p.familia_codigo = f.codigo
                and s.produto_codigo = p.codigo
                and l.Codigo = s.localizacao_codigo
                and p.status = '1'
                and s.Saldo > 0
                and P.Familia_Codigo not in (3,14,71)
                and S.localizacao_codigo not in (4,7,8,23,27,30)
        
                AND F.CODIGO LIKE IIF(COALESCE( CAST( :FAMILIA AS VARCHAR(100)) ,'')='','%', CAST( :FAMILIA AS VARCHAR(100)) )
                AND L.CODIGO LIKE IIF(COALESCE( CAST( :LOCALIZACAO AS VARCHAR(100)) ,'')='','%', CAST( :LOCALIZACAO AS VARCHAR(100)) )
                AND (P.DESCRICAO LIKE :PRODUTO)-- or P.CODIGO IN (SELECT OSPLIT FROM SPLIT2(:PRODUTOS,',')))
        
                and p.inventario = '1'
            )
            Where DATA_MOVIMENTACAO is not null
            Group By
            LOCALIZACAO_ID,
            LOCALIZACAO_DESCRICAO,
            FAMILIA_ID,
            FAMILIA_DESCRICAO
            )
        
        Order By 5,1,3
        )

    INTO :LOCALIZACAO_ID,:LOCALIZACAO_DESCRICAO,:FAMILIA_ID,:FAMILIA_DESCRICAO,:ITENS,:MARCADO,:TOTAL_ITENS,:TOTAL_MARCADOS,:REGISTROS
    DO begin

    if (:REGISTROS = 1) then
        i = :qtd;

    if ((:qtd - :i) > (:TOTAL_ITENS - :TOTAL_MARCADOS) and :FAMILIA_ID > 0) then
        Begin
        vQtd = :TOTAL_ITENS - :TOTAL_MARCADOS;
        End

    if (:marcado < :itens and :FAMILIA_ID > 0) then
        Begin
    if ( :i < :vQtd ) then
        Begin
           For
            Select First 1
            PRODUTO_ID,
            PRODUTO_DESCRICAO,
            SALDO,
            ALOCADO,
            DATA_MOVIMENTACAO,
            SALDO_GRADE,
            '' FISICO
            From (
             SELECT S.Produto_codigo Produto_Id,
                    P.Descricao||'/'||P.UNIDADEMEDIDA_SIGLA2 Produto_Descricao,
                    S.Saldo,

                    COALESCE((
                    SELECT SUM(SA.QUANTIDADE) FROM TBESTOQUE_SALDO_ALOCACAO SA
                     WHERE SA.ESTABELECIMENTO_ID = S.ESTABELECIMENTO_CODIGO
                       AND SA.LOCALIZACAO_ID = S.LOCALIZACAO_CODIGO
                       AND SA.PRODUTO_ID = S.PRODUTO_CODIGO
                       AND SA.QUANTIDADE > 0),0) ALOCADO,

                    IIF(S.T01_SALDO>0,G.T01||'/'||Trunc(S.T01_SALDO)||' ','')||
                    IIF(S.T02_SALDO>0,G.T02||'/'||Trunc(S.T02_SALDO)||' ','')||
                    IIF(S.T03_SALDO>0,G.T03||'/'||Trunc(S.T03_SALDO)||' ','')||
                    IIF(S.T04_SALDO>0,G.T04||'/'||Trunc(S.T04_SALDO)||' ','')||
                    IIF(S.T05_SALDO>0,G.T05||'/'||Trunc(S.T05_SALDO)||' ','')||
                    IIF(S.T06_SALDO>0,G.T06||'/'||Trunc(S.T06_SALDO)||' ','')||
                    IIF(S.T07_SALDO>0,G.T07||'/'||Trunc(S.T07_SALDO)||' ','')||
                    IIF(S.T08_SALDO>0,G.T08||'/'||Trunc(S.T08_SALDO)||' ','')||
                    IIF(S.T09_SALDO>0,G.T09||'/'||Trunc(S.T09_SALDO)||' ','')||
                    IIF(S.T10_SALDO>0,G.T10||'/'||Trunc(S.T10_SALDO)||' ','')||
                    IIF(S.T11_SALDO>1,G.T11||'/'||Trunc(S.T11_SALDO)||' ','')||
                    IIF(S.T12_SALDO>1,G.T12||'/'||Trunc(S.T12_SALDO)||' ','')||
                    IIF(S.T13_SALDO>1,G.T13||'/'||Trunc(S.T13_SALDO)||' ','')||
                    IIF(S.T14_SALDO>1,G.T14||'/'||Trunc(S.T14_SALDO)||' ','')||
                    IIF(S.T15_SALDO>1,G.T15||'/'||Trunc(S.T15_SALDO)||' ','')||
                    IIF(S.T16_SALDO>1,G.T16||'/'||Trunc(S.T16_SALDO)||' ','')||
                    IIF(S.T17_SALDO>1,G.T17||'/'||Trunc(S.T17_SALDO)||' ','')||
                    IIF(S.T18_SALDO>1,G.T18||'/'||Trunc(S.T18_SALDO)||' ','')||
                    IIF(S.T19_SALDO>1,G.T19||'/'||Trunc(S.T19_SALDO)||' ','')||
                    IIF(S.T20_SALDO>1,G.T20||'/'||Trunc(S.T20_SALDO)||' ','') SALDO_GRADE,

                   (Select First 1 I.Data
                    From tbestoque_transacao_item i, tboperacao o
                    Where p.codigo = i.produto_codigo
                      and o.codigo = i.operacao_codigo
                      and s.estabelecimento_codigo = i.estabelecimento_codigo
                      and s.localizacao_codigo = i.localizacao_codigo
                      and i.data >= Current_Date - 90
                      and o.tipo = 'S'
                      and o.acerto = '0') Data_Movimentacao
            
               FROM tbestoque_saldo S, TBPRODUTO P Left Join TbGrade G On G.Codigo = P.Grade_Codigo
            
              WHERE s.estabelecimento_codigo = 1
                and s.produto_codigo = p.codigo
                and p.status = '1'
                and s.Saldo > 0
                and P.Familia_Codigo = :FAMILIA_ID
                and S.localizacao_codigo = :LOCALIZACAO_ID
                and p.inventario = '1'
                and COALESCE(S.DATA_AMOSTRA_INVENTARIO,CAST('01.01.2000' as DATE)) <> '1.1.1900'
                and Extract(Year From COALESCE(S.DATA_AMOSTRA_INVENTARIO,CAST('01.01.2000' as DATE))) <> Extract(Year From CURRENT_DATE)
                AND (P.DESCRICAO LIKE :PRODUTO)-- or P.CODIGO IN (SELECT OSPLIT FROM SPLIT2(:PRODUTOS,',')))

            )
            Where DATA_MOVIMENTACAO is not null
           --   AND PRODUTO_ID IN (SELECT OSPLIT FROM SPLIT2(:PRODUTOS,','))
            Order By SALDO Desc
            Into :PRODUTO_ID,:PRODUTO_DESCRICAO,:SALDO,:ALOCADO,:DATA_MOVIMENTACAO,:SALDO_GRADE,:FISICO
            Do Begin
               i = i + 1;
               SEQ = :I;

               CUSTO_MEDIO = Coalesce((Select First 1 D.Custo_Medio From TbEstoque_Saldo_Diario D
                     Where D.Estabelecimento_Codigo = 1
                       and D.Localizacao_Codigo = :LOCALIZACAO_ID
                       and D.produto_codigo = :PRODUTO_ID
                       and D.Custo_Medio > 0
                      Order By Data Desc),0);

               SUSPEND;

               --    IN AUTONOMOUS TRANSACTION DO
               --    BEGIN
                         UPDATE TBESTOQUE_SALDO SET DATA_AMOSTRA_INVENTARIO = IIF(:GRAVAR='1',CURRENT_DATE,Cast('1.1.1900' as Date))
                          WHERE PRODUTO_CODIGO = :PRODUTO_ID
                            AND ESTABELECIMENTO_CODIGO = 1
                            AND LOCALIZACAO_CODIGO = :LOCALIZACAO_ID;
               --    END

               End
    
           end 
        End
        End
    End

      UPDATE TBESTOQUE_SALDO SET DATA_AMOSTRA_INVENTARIO = NULL WHERE DATA_AMOSTRA_INVENTARIO = '1.1.1900';

End
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER procedure SPC_CALCULAR_CUSTO_INVENTARIO (
    VQTD integer,
    VMES integer,
    VANO integer)
returns (
    ANO integer,
    MES integer,
    PRODUTO_ID integer,
    PRODUTO_DESCRICAO varchar(100),
    UM varchar(3),
    SALDO_FISICO numeric(18,4),
    SALDO_EMTERCEIRO numeric(18,4),
    CUSTO_MEDIO numeric(18,4),
    DESPESA numeric(18,8),
    MODELO_ID integer,
    FAMILIA_ID integer,
    COR_ID integer,
    TAMANHO integer,
    FATOR_SETUP integer,
    DEFEITOS numeric(18,8),
    PRODUZIDO numeric(18,8),
    CUSTO_MEDIO_P numeric(18,8),
    C_P numeric(18,8),
    CUSTO_P numeric(18,8),
    ICMS_P numeric(18,8))
as
declare variable MODELO_DESCRICAO varchar(100);
declare variable COR_DESCRICAO varchar(100);
declare variable TAMANHO_DESCRICAO varchar(20);
declare variable PRODUTO_CONSUMO integer;
declare variable TAMANHO_CONSUMO integer;
declare variable ORIGEM integer;
declare variable TS numeric(18,8);
declare variable "TO" numeric(18,8);
declare variable CMS numeric(18,8);
declare variable CMO numeric(18,8);
declare variable CMOIP numeric(18,8);
declare variable CMOIA numeric(18,8);
declare variable CSMOIP numeric(18,8);
declare variable CSMOIA numeric(18,8);
declare variable PERDA numeric(18,8);
declare variable CONSUMO numeric(18,8);
declare variable C numeric(18,8);
declare variable T numeric(18,8);
declare variable CS numeric(18,8);
declare variable CO numeric(18,8);
declare variable COIP numeric(18,8);
declare variable COIA numeric(18,8);
declare variable CSIP numeric(18,8);
declare variable CSIA numeric(18,8);
declare variable FATOR_CONVERSAO numeric(18,8);
declare variable CUSTO_MINUTO numeric(18,8);
declare variable MOI_PROPRIO numeric(18,8);
declare variable MOI_ABSORVIDO numeric(18,8);
declare variable DATA date;
declare variable CUSTO numeric(18,8);
declare variable DOLAR numeric(18,8);
declare variable MARGEM numeric(18,4);
declare variable OPERACIONAL numeric(18,8);
declare variable INDIRETO numeric(18,8);
declare variable NIVEL integer;
declare variable FLAG integer;
declare variable FLAG_TAMANHO integer;
declare variable H_ORIGEM varchar(200);
declare variable ICMS numeric(18,8);
BEGIN

    FOR
        select
            FAMILIA_CODIGO,
            PRODUTO_ID,
            PRODUTO_DESCRICAO,
            UM,
            SALDO_FISICO,
            SALDO_EM_TERCEIRO,
            CUSTO_MEDIO,
            MODELO_CODIGO,
            COR
        from(
            SELECT
                b.familia_codigo,
                A.PRODUTO_CODIGO PRODUTO_ID,
                B.DESCRICAO PRODUTO_DESCRICAO,
                B.UNIDADEMEDIDA_SIGLA2 UM,
                CAST(A.SALDO AS NUMERIC(18,4)) SALDO_FISICO,
                CAST(A.SALDO_EMTERCEIRO AS NUMERIC(18,4)) SALDO_EM_TERCEIRO,
                CAST(A.CUSTO_MEDIO AS NUMERIC(18,4)) CUSTO_MEDIO,
                b.modelo_codigo,
                p.id as ID_CUSTO,
                b.cor_codigo as COR
            FROM TBPRODUTO B, TBESTOQUE_SALDO_MES A
            left join tbcusto_produto p on p.produto_id = a.produto_codigo and p.ano = a.ano and p.mes = a.mes
            WHERE A.PRODUTO_CODIGO = B.CODIGO
              AND B.FAMILIA_CODIGO IN (3,133)
              AND A.SALDO + A.SALDO_EMTERCEIRO > 0
              AND a.ANO = :VANO
              AND a.MES = :VMES
        ) where ID_CUSTO is null
    INTO :FAMILIA_ID,
         :PRODUTO_ID,
         :PRODUTO_DESCRICAO,
         :UM,
         :SALDO_FISICO,
         :SALDO_EMTERCEIRO,
         :CUSTO_MEDIO,
         :MODELO_ID,
         :COR_ID
    DO BEGIN

        :FATOR_SETUP = coalesce((select first 1 RC.fator_setup FROM tbregra_calculo_custo RC WHERE RC.familia_producao = :FAMILIA_ID AND RC.familia_id = RC.familia_producao),1);

        for
            select v.tamanho from VWSKU v where v.modelo_id = :MODELO_ID and v.cor_id = :COR_ID
        into
            :TAMANHO
        do begin

            for
                select first 1
                    ANO,
                    MES,
                    NIVEL,
                    PRODUTO_DESCRICAO,
                    PRODUTO_CONSUMO,
                    TAMANHO_CONSUMO,
                    ORIGEM,
                    TS,
                    "TO",
                    CMS,
                    CMO,
                    CMOIP,
                    CMOIA,
                    CSMOIP,
                    CSMOIA,
                    PERDA,
                    CONSUMO,
                    C,
                    T,
                    CS,
                    CO,
                    COIP,
                    COIA,
                    CSIP,
                    CSIA,
                    CUSTO_MEDIO,
                    FATOR_CONVERSAO,
                    TAMANHO,
                    FLAG,
                    CUSTO_MINUTO,
                    MOI_PROPRIO,
                    MOI_ABSORVIDO,
                    FLAG_TAMANHO,
                    H_ORIGEM,
                    DATA,
                    CUSTO,
                    DOLAR,
                    MARGEM,
                    OPERACIONAL,
                    INDIRETO,
                    ICMS,
                    DEFEITOS,
                    PRODUZIDO,
                    CUSTO_MEDIO_P,
                    C_P,
                    CUSTO_P,
                    ICMS_P
                from SPC_CALCULAR_ABSORVIDO(:VANO,:VMES,:PRODUTO_ID,:tamanho, :FATOR_SETUP)
    
                where NIVEL = -1
            into
                ANO,
                MES,
                NIVEL,
                PRODUTO_DESCRICAO,
                PRODUTO_CONSUMO,
                TAMANHO_CONSUMO,
                ORIGEM,
                TS,
                "TO",
                CMS,
                CMO,
                CMOIP,
                CMOIA,
                CSMOIP,
                CSMOIA,
                PERDA,
                CONSUMO,
                C,
                T,
                CS,
                CO,
                COIP,
                COIA,
                CSIP,
                CSIA,
                CUSTO_MEDIO,
                FATOR_CONVERSAO,
                TAMANHO,
                FLAG,
                CUSTO_MINUTO,
                MOI_PROPRIO,
                MOI_ABSORVIDO,
                FLAG_TAMANHO,
                H_ORIGEM,
                DATA,
                CUSTO,
                DOLAR,
                MARGEM,
                OPERACIONAL,
                INDIRETO,
                ICMS,
                DEFEITOS,
                PRODUZIDO,
                CUSTO_MEDIO_P,
                C_P,
                CUSTO_P,
                ICMS_P
            do begin
                in autonomous transaction
                do begin
                    UPDATE OR INSERT INTO TBCUSTO_PRODUTO (PRODUTO_ID, ANO, MES, NIVEL, PRODUTO_DESCRICAO, PRODUTO_CONSUMO, TAMANHO_CONSUMO, ORIGEM, TS, "TO", CMS, CMO, CMOIP, CMOIA, CSMOIP, CSMOIA, PERDA, C, T, CS, CO, CUSTO_MEDIO, FATOR_CONVERSAO, TAMANHO, CUSTO_MINUTO, MOI_PROPRIO, MOI_ABSORVIDO, COIP, COIA, CSIP, CSIA, CONSUMO, FLAG_TAMANHO, DATA, CUSTO, DOLAR, MARGEM,OPERACIONAL,INDIRETO, ICMS, DEFEITOS, PRODUZIDO, CUSTO_MEDIO_P, C_P, CUSTO_P, ICMS_P)
                        VALUES (:PRODUTO_ID, :ANO, :MES, :NIVEL, :PRODUTO_DESCRICAO, :PRODUTO_CONSUMO, :TAMANHO_CONSUMO, :ORIGEM, :TS, :"TO", :CMS, :CMO, :CMOIP, :CMOIA, :CSMOIP, :CSMOIA, :PERDA, :C, :T, :CS, :CO, :CUSTO_MEDIO, :FATOR_CONVERSAO, :TAMANHO, :CUSTO_MINUTO, :MOI_PROPRIO, :MOI_ABSORVIDO, :COIP, :COIA, :CSIP, :CSIA, :CONSUMO, :FLAG_TAMANHO, :DATA, :CUSTO, :DOLAR, :MARGEM, :OPERACIONAL, :INDIRETO, :ICMS, :DEFEITOS, :PRODUZIDO, :CUSTO_MEDIO_P, :C_P, :CUSTO_P, :ICMS_P)
                    MATCHING (PRODUTO_ID, ANO, MES, TAMANHO);
                end
            end
    
            suspend;
        end

        suspend;
    END
END
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER procedure SPC_CUSTO_PRODUTO_INVENTARIO (
    VQTD integer,
    VMES integer,
    VANO integer,
    VPROD1 integer,
    VPROD2 integer,
    FATOR_DESPESA numeric(15,1),
    FATOR_PERDA numeric(15,1),
    FATOR_CUSTO_MP numeric(15,1),
    FATOR_CUSTO_MO numeric(15,1))
returns (
    ANO integer,
    MES integer,
    ESTABELECIMENTO_ID integer,
    ESTABELECIMENTO_NOMEFANTASIA varchar(50),
    LOCALIZACAO_ID integer,
    LOCALIZACAO_DESCRICAO varchar(50),
    TIPOPRODUTO_ID integer,
    TIPOPRODUTO_DESCRICAO varchar(50),
    FAMILIA_ID integer,
    FAMILIA_DESCRICAO varchar(50),
    PRODUTO_ID integer,
    PRODUTO_DESCRICAO varchar(100),
    UM varchar(3),
    TAMANHO integer,
    TAMANHO_DESCRICAO varchar(20),
    SALDO_FISICO numeric(18,4),
    SALDO_EMTERCEIRO numeric(18,4),
    CUSTO_MEDIO numeric(18,4),
    CUSTO_TOTAL numeric(18,2),
    CUSTO_MP numeric(18,4),
    CUSTO_MO numeric(18,4),
    CUSTO_MP_MO numeric(18,4),
    CUSTO_MP_TOTAL numeric(18,4),
    CUSTO_MO_TOTAL numeric(18,4),
    CUSTO_MP_MO_TOTAL numeric(18,4),
    CMP numeric(18,8),
    CS numeric(18,8),
    CO numeric(18,8),
    CMO numeric(18,8),
    CIP numeric(18,8),
    CIA numeric(18,8),
    CD numeric(18,8),
    CI numeric(18,8),
    CT numeric(18,8),
    PERDA numeric(18,8),
    DESPESA numeric(18,8))
as
BEGIN

FOR SELECT
    A.ESTABELECIMENTO_CODIGO ESTABELECIMENTO_ID,(SELECT FIRST 1 E.NOMEFANTASIA FROM TBESTABELECIMENTO E WHERE A.ESTABELECIMENTO_CODIGO = E.CODIGO) ESTABELECIMENTO_NOMEFANTASIA,
    A.LOCALIZACAO_CODIGO LOCALIZACAO_ID,        (SELECT FIRST 1 L.DESCRICAO FROM TBLOCALIZACAO L WHERE A.LOCALIZACAO_CODIGO = L.CODIGO) LOCALIZACAO_DESCRICAO,
    B.TIPOPRODUTO_CODIGO TIPO_ID,               (SELECT FIRST 1 T.DESCRICAO FROM TBTIPOPRODUTO T WHERE B.TIPOPRODUTO_CODIGO = T.CODIGO) TIPO_DESCRICAO,
    B.FAMILIA_INVENTARIO FAMILIA_ID,                (SELECT FIRST 1 F.DESCRICAO FROM TBFAMILIA F WHERE B.FAMILIA_INVENTARIO = F.CODIGO) FAMILIA_DESCRICAO,
    A.PRODUTO_CODIGO PRODUTO_ID, B.DESCRICAO PRODUTO_DESCRICAO, B.UNIDADEMEDIDA_SIGLA2 UM,
    CAST(A.SALDO AS NUMERIC(18,4)) SALDO_FISICO,
    CAST(A.SALDO_EMTERCEIRO AS NUMERIC(18,4)) SALDO_EM_TERCEIRO,
    CAST(A.CUSTO_MEDIO AS NUMERIC(18,4)) CUSTO_MEDIO

FROM TBPRODUTO B, TBESTOQUE_SALDO_MES A
WHERE A.PRODUTO_CODIGO = B.CODIGO
  AND B.FAMILIA_INVENTARIO = 174 -- IN (3,58,47,133,160,157)
  AND A.SALDO + A.SALDO_EMTERCEIRO > 0
  AND ANO = :VANO
  AND MES = :VMES
  AND A.PRODUTO_CODIGO between :vPROD1 AND :vPROD2
order by a.estabelecimento_codigo, b.familia_inventario, a.localizacao_codigo

INTO :ESTABELECIMENTO_ID,
     :ESTABELECIMENTO_NOMEFANTASIA,
     :LOCALIZACAO_ID,
     :LOCALIZACAO_DESCRICAO,
     :TIPOPRODUTO_ID,
     :TIPOPRODUTO_DESCRICAO,
     :FAMILIA_ID,
     :FAMILIA_DESCRICAO,
     :PRODUTO_ID,
     :PRODUTO_DESCRICAO,
     :UM,
     :SALDO_FISICO,
     :SALDO_EMTERCEIRO,
     :CUSTO_MEDIO

DO BEGIN

    FOR
        select
            CMP,
            CS,
            CO,
            CMO,
            CIP,
            CIA,
            CD,
            CI,
            CT,
            --PERDA,
            --DEFEITOS,
            --PRODUZIDO,
            iif(PRODUZIDO > 0, DEFEITOS / PRODUZIDO, iif(DEFEITOS > 0, 100, 0)) PERDA,
            DESPESA
        from(
            SELECT AVG(CMP) CMP,
                   AVG(CS) CS,
                   AVG(CO) CO,
                   AVG(CMO) CMO,
                   AVG(CIP) CIP,
                   AVG(CIA) CIA,
                   AVG(CD) CD,
                   AVG(CI) CI,
                   AVG(CT) CT,
                   AVG(PERDA) PERDA,
                   sum(DEFEITOS) as DEFEITOS,
                   sum(PRODUZIDO) as PRODUZIDO,
                   AVG(DESPESA) DESPESA
            FROM (
            SELECT
                TAMANHO,
                TAMANHO_DESCRICAO,
                OPERACIONAL + INDIRETO + C AS CMP,
                CMS AS CS,                           
                CMO AS CO,
                CMS + CMO AS CMO,
                CMOIP + CSMOIP AS CIP,
                CMOIA + CSMOIA AS CIA,
                OPERACIONAL + INDIRETO + C + CMS + CMO AS CD,
                CMOIP + CSMOIP + CMOIA + CSMOIA AS CI,
                OPERACIONAL + INDIRETO + C + CMS + CMO +
                CMOIP + CSMOIP + CMOIA + CSMOIA AS CT,
                PERDA AS PERDA,
              --OPERACIONAL, -- CUSTO DE MAO DE OBRA ABSORVIDO DE OUTROS SETORES,
              --INDIRETO,    -- CUSTO INDIRETO ABSORVIDO DE OUTROS SETORES
              --TS,          -- TEMPO SETUP
              --"TO",        -- TEMPO OPERACIONAL
                IIF(FATOR_DESPESA > 0,
                ((TS / CAST(:vQTD AS INTEGER)) * FATOR_DESPESA ) + ("TO" * FATOR_DESPESA),0) DESPESA,
                DEFEITOS,
                PRODUZIDO
            
              FROM( SELECT
                    C.ID,
                    C.PRODUTO_ID,
                    C.ANO,
                    C.MES,
                    C.NIVEL,
                    C.PRODUTO_DESCRICAO,
                    C.PRODUTO_CONSUMO,
                    C.TAMANHO_CONSUMO,
                    C.ORIGEM,
                    C.TS,
                    C."TO",
                    C.CMS / CAST(:vQTD AS INTEGER) AS CMS,
                    C.CMO,
                    C.CMOIP,
                    C.CMOIA,
                    C.CSMOIP  / CAST(:vQTD AS INTEGER) AS CSMOIP,
                    C.CSMOIA  / CAST(:vQTD AS INTEGER) AS CSMOIA,
                    C.PERDA,
                    C.C,
                    C.T,
                    C.CS  / CAST(:vQTD AS INTEGER) AS CS,
                    C.CO,
                    C.CUSTO_MEDIO,
                    C.FATOR_CONVERSAO,
                    C.TAMANHO,
                    C.CUSTO_MINUTO,
                    C.MOI_PROPRIO,
                    C.MOI_ABSORVIDO,
                    C.COIP,
                    C.COIA,
                    C.CSIP,
                    C.CSIA,
                    C.CONSUMO,
                    C.FLAG_TAMANHO,
                    C.GENEALOGIA,
                    C.DATA,
                    C.CUSTO,
                    C.DOLAR,
                    C.MARGEM,
                    C.OPERACIONAL,
                    C.INDIRETO,
                    D.FATOR FATOR_DESPESA,
                    C.DEFEITOS,
                    C.PRODUZIDO,
                    FN_TAMANHO_GRADE(P.GRADE_CODIGO,C.TAMANHO) TAMANHO_DESCRICAO 
                FROM TBCUSTO_PRODUTO C
                LEFT JOIN TBPRODUTO P ON C.PRODUTO_ID = P.CODIGO
                LEFT JOIN  TBCUSTO_DESPESA D ON D.MES = C.MES AND D.ANO = C.ANO AND D.FAMILIA_ID = P.FAMILIA_CODIGO
                WHERE C.ANO = :VANO
                  AND C.MES = :VMES
                  AND C.PRODUTO_ID = :PRODUTO_ID
            )
           )
         )
       INTO --:TAMANHO,:TAMANHO_DESCRICAO,
            :CMP,:CS,:CO,:CMO,:CIP,:CIA,:CD,:CI,:CT,
            :PERDA,:DESPESA
    
       DO BEGIN

           ANO = :VANO;
           MES = :VMES;
           ESTABELECIMENTO_ID = ESTABELECIMENTO_ID;
           ESTABELECIMENTO_NOMEFANTASIA = ESTABELECIMENTO_NOMEFANTASIA;
           LOCALIZACAO_ID = LOCALIZACAO_ID;
           LOCALIZACAO_DESCRICAO = LOCALIZACAO_DESCRICAO;
           TIPOPRODUTO_ID = TIPOPRODUTO_ID;
           TIPOPRODUTO_DESCRICAO = TIPOPRODUTO_DESCRICAO;
           FAMILIA_ID = FAMILIA_ID;
           FAMILIA_DESCRICAO = FAMILIA_DESCRICAO;
           PRODUTO_ID = PRODUTO_ID;
           PRODUTO_DESCRICAO = PRODUTO_DESCRICAO;
           UM = UM;
           TAMANHO = TAMANHO;
           TAMANHO_DESCRICAO = TAMANHO_DESCRICAO;
           SALDO_FISICO = SALDO_FISICO;
           SALDO_EMTERCEIRO = SALDO_EMTERCEIRO;
           CUSTO_MEDIO = CUSTO_MEDIO;
           CUSTO_TOTAL = CUSTO_MEDIO * (SALDO_FISICO + SALDO_EMTERCEIRO);

           PERDA = PERDA * :FATOR_PERDA;
           DESPESA = DESPESA * :FATOR_DESPESA;

           CUSTO_MP = CMP + (CMP * PERDA);
           CUSTO_MO = (CMO + CIP + CIA + DESPESA) + ((CMO + CIP + CIA + DESPESA) * PERDA);

           IF (COALESCE(CUSTO_MO,0) = 0 AND COALESCE(CUSTO_MP,0) = 0 ) THEN
               BEGIN
               CUSTO_MP = CUSTO_MEDIO / 2;
               CUSTO_MO = CUSTO_MEDIO / 2;
               END

           IF (COALESCE(CUSTO_MP,0) = 0 AND CUSTO_MO > 0 ) THEN
               BEGIN
               CUSTO_MP = CUSTO_MO;
               END

           IF (COALESCE(CUSTO_MO,0) = 0 AND CUSTO_MP > 0 ) THEN
               BEGIN
               CUSTO_MO = CUSTO_MP;
               END

           IF (LOCALIZACAO_ID = 14 OR LOCALIZACAO_ID = 21) THEN
               BEGIN
               CUSTO_MP = CUSTO_MP * :FATOR_CUSTO_MP;
               CUSTO_MO = CUSTO_MO * :FATOR_CUSTO_MO;
               END

           CUSTO_MP_MO    = CUSTO_MP + CUSTO_MO;
           CUSTO_MP_TOTAL = CUSTO_MP * (SALDO_FISICO + SALDO_EMTERCEIRO);
           CUSTO_MO_TOTAL = CUSTO_MO * (SALDO_FISICO + SALDO_EMTERCEIRO);
           CUSTO_MP_MO_TOTAL = CUSTO_MP_TOTAL + CUSTO_MO_TOTAL;

           CMP = CMP;
           CS  = CS;
           CO  = CO;
           CMO = CMO;
           CIP = CIP;
           CIA = CIA;
           CD  = CD;
           CI  = CI;
           CT  = CT; 

          SUSPEND;
          END

   END
END
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER procedure SPC_ENTRADA_FAMILIA_PRODUTO2 (
    ESTABELECIMENTO_T integer,
    ESTABELECIMENTO_1 integer,
    PRODUTO_1 integer,
    PRODUTO_2 integer,
    ANO integer,
    MES integer,
    FAM_T integer,
    FAM_1 integer,
    FAM_2 integer,
    FAM_3 integer,
    FAM_4 integer,
    FAM_5 integer,
    FAM_6 integer,
    FAM_7 integer,
    FAM_8 integer,
    FAM_9 integer,
    FAM_10 integer,
    OPER_T varchar(3),
    OPER_1 varchar(3),
    OPER_2 varchar(3),
    OPER_3 varchar(3),
    OPER_4 varchar(3),
    OPER_5 varchar(3),
    OPER_6 varchar(3),
    OPER_7 varchar(3),
    OPER_8 varchar(3),
    OPER_9 varchar(3),
    OPER_10 varchar(3),
    CFOP_T varchar(5),
    CFOP_1 varchar(5),
    CFOP_2 varchar(5),
    CFOP_3 varchar(5),
    CFOP_4 varchar(5),
    CFOP_5 varchar(5),
    CFOP_6 varchar(5),
    CFOP_7 varchar(5),
    CFOP_8 varchar(5),
    CFOP_9 varchar(5),
    CFOP_10 varchar(5),
    CFOP_11 varchar(5),
    CFOP_12 varchar(5),
    CFOP_13 varchar(5),
    CFOP_14 varchar(5),
    CFOP_15 varchar(5))
returns (
    FAMILIA_CODIGO integer,
    VALOR_TOTAL numeric(10,5),
    PRODUTO_CODIGO integer,
    PRODUTO_DESCRICAO varchar(100),
    PRODUTO_UNIDADEMEDIDA varchar(3),
    QUANTIDADE numeric(10,5))
as
BEGIN

FOR Select Distinct(A.Familia_Codigo), Sum(B.Valor_Total),
A.Codigo, A.Descricao, A.UnidadeMedida_Sigla2, Sum(B.Quantidade)
From TbProduto A, TbNfe_Item B
Where  A.Codigo = B.Produto_Codigo
and   (B.Produto_Codigo > 0)
and   (B.Situacao < 3)

and   (extract(year  from B.Data_Entrada) = :ANO)
and   (extract(month from B.Data_Entrada) = :MES)
and   (B.Estabelecimento_Codigo > :ESTABELECIMENTO_T or
       B.Estabelecimento_Codigo = :ESTABELECIMENTO_1)
and   (B.Produto_Codigo BetWeen   :PRODUTO_1 and :PRODUTO_2)
and   (B.OPERACAO_CODIGO <> :OPER_T or
       B.OPERACAO_CODIGO = :OPER_1 or
       B.OPERACAO_CODIGO = :OPER_2 or
       B.OPERACAO_CODIGO = :OPER_3 or
       B.OPERACAO_CODIGO = :OPER_4 or
       B.OPERACAO_CODIGO = :OPER_5 or
       B.OPERACAO_CODIGO = :OPER_6 or
       B.OPERACAO_CODIGO = :OPER_7 or
       B.OPERACAO_CODIGO = :OPER_8 or
       B.OPERACAO_CODIGO = :OPER_9 or
       B.OPERACAO_CODIGO = :OPER_10)

and   (B.CFOP_CODIGO <> :CFOP_T or
       B.CFOP_CODIGO = :CFOP_1 or
       B.CFOP_CODIGO = :CFOP_2 or
       B.CFOP_CODIGO = :CFOP_3 or
       B.CFOP_CODIGO = :CFOP_4 or
       B.CFOP_CODIGO = :CFOP_5 or
       B.CFOP_CODIGO = :CFOP_6 or
       B.CFOP_CODIGO = :CFOP_7 or
       B.CFOP_CODIGO = :CFOP_8 or
       B.CFOP_CODIGO = :CFOP_9 or
       B.CFOP_CODIGO = :CFOP_10 or
       B.CFOP_CODIGO = :CFOP_11 or
       B.CFOP_CODIGO = :CFOP_12 or
       B.CFOP_CODIGO = :CFOP_13 or
       B.CFOP_CODIGO = :CFOP_14 or
       B.CFOP_CODIGO = :CFOP_15)

and   (A.FAMILIA_CODIGO > :FAM_T or
       A.FAMILIA_CODIGO = :FAM_1 or
       A.FAMILIA_CODIGO = :FAM_2 or
       A.FAMILIA_CODIGO = :FAM_3 or
       A.FAMILIA_CODIGO = :FAM_4 or
       A.FAMILIA_CODIGO = :FAM_5 or
       A.FAMILIA_CODIGO = :FAM_6 or
       A.FAMILIA_CODIGO = :FAM_7 or
       A.FAMILIA_CODIGO = :FAM_8 or
       A.FAMILIA_CODIGO = :FAM_9 or
       A.FAMILIA_CODIGO = :FAM_10)

Group By A.Familia_Codigo, A.Codigo, A.Descricao, A.UnidadeMedida_Sigla2
Order By A.Descricao

INTO
  :Familia_Codigo,
  :Valor_Total,
  :Produto_Codigo,
  :Produto_Descricao,
  :Produto_UnidadeMedida,
  :Quantidade
DO SUSPEND;
END
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER procedure SPC_ESTOQUE_ANALITICO1 (
    ESTABELECIMENTO_CODIGO_T integer,
    ESTABELECIMENTO_CODIGO_1 integer,
    LOCALIZACAO_CODIGO_T integer,
    LOCALIZACAO_CODIGO_1 integer,
    PRODUTO_CODIGO_1 integer,
    PRODUTO_CODIGO_2 integer,
    TIPO_T integer,
    TIPO_1 integer,
    DATA_1 date,
    DATA_2 date,
    FAM_T integer,
    FAM_1 integer,
    FAM_2 integer,
    FAM_3 integer,
    FAM_4 integer,
    FAM_5 integer,
    FAM_6 integer,
    FAM_7 integer,
    FAM_8 integer,
    FAM_9 integer,
    FAM_10 integer)
returns (
    ESTABELECIMENTO_CODIGO integer,
    LOCALIZACAO_CODIGO integer,
    FAMILIA_CODIGO integer,
    TIPOPRODUTO_CODIGO integer,
    PRODUTO_CODIGO integer,
    DESCRICAO varchar(100),
    UNIDADEMEDIDA_SIGLA varchar(3),
    TIPO varchar(1),
    TOTAL numeric(10,5))
as
BEGIN

FOR Select Distinct(A.ESTABELECIMENTO_CODIGO), A.LOCALIZACAO_CODIGO,
                    B.FAMILIA_CODIGO, B.TIPOPRODUTO_CODIGO,
                    A.PRODUTO_CODIGO, B.DESCRICAO,
                    B.UNIDADEMEDIDA_SIGLA2,A.TIPO, SUM(A.QUANTIDADE)
from TBESTOQUE_TRANSACAO_ITEM A, TbProduto B
Where  A.PRODUTO_CODIGO = B.CODIGO
and   (A.Estabelecimento_Codigo > :ESTABELECIMENTO_CODIGO_T or
       A.Estabelecimento_Codigo = :ESTABELECIMENTO_CODIGO_1)
and   (A.Localizacao_Codigo     > :LOCALIZACAO_CODIGO_T or
       A.Localizacao_Codigo     = :LOCALIZACAO_CODIGO_1)
and    A.Produto_codigo BetWeen   :PRODUTO_CODIGO_1 and
                                  :PRODUTO_CODIGO_2
and   (B.TIPOPRODUTO_CODIGO     > :TIPO_T or
       B.TIPOPRODUTO_CODIGO     = :TIPO_1)
and    A.Data BetWeen             :DATA_1 and
                                  :DATA_2
and   (B.FAMILIA_CODIGO > :FAM_T or
       B.FAMILIA_CODIGO = :FAM_1 or
       B.FAMILIA_CODIGO = :FAM_2 or
       B.FAMILIA_CODIGO = :FAM_3 or
       B.FAMILIA_CODIGO = :FAM_4 or
       B.FAMILIA_CODIGO = :FAM_5 or
       B.FAMILIA_CODIGO = :FAM_6 or
       B.FAMILIA_CODIGO = :FAM_7 or
       B.FAMILIA_CODIGO = :FAM_8 or
       B.FAMILIA_CODIGO = :FAM_9 or
       B.FAMILIA_CODIGO = :FAM_10)

Group By A.ESTABELECIMENTO_CODIGO, A.LOCALIZACAO_CODIGO,B.FAMILIA_CODIGO,
         B.TIPOPRODUTO_CODIGO, A.PRODUTO_CODIGO, B.DESCRICAO, B.UNIDADEMEDIDA_SIGLA2, A.TIPO

INTO
  :ESTABELECIMENTO_CODIGO,
  :LOCALIZACAO_CODIGO,
  :FAMILIA_CODIGO,
  :TIPOPRODUTO_CODIGO,
  :PRODUTO_CODIGO,
  :DESCRICAO,
  :UNIDADEMEDIDA_SIGLA,
  :TIPO,
  :TOTAL
DO SUSPEND;
END
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER procedure SPC_ESTOQUE_ANALITICO2 (
    ESTABELECIMENTO_CODIGO_T integer,
    ESTABELECIMENTO_CODIGO_1 integer,
    LOCALIZACAO_CODIGO_T integer,
    LOCALIZACAO_CODIGO_1 integer,
    PRODUTO_CODIGO_1 integer,
    PRODUTO_CODIGO_2 integer,
    TIPO_T integer,
    TIPO_1 integer,
    DATA_1 date,
    FAM_T integer,
    FAM_1 integer,
    FAM_2 integer,
    FAM_3 integer,
    FAM_4 integer,
    FAM_5 integer,
    FAM_6 integer,
    FAM_7 integer,
    FAM_8 integer,
    FAM_9 integer,
    FAM_10 integer)
returns (
    ESTABELECIMENTO_CODIGO integer,
    LOCALIZACAO_CODIGO integer,
    TIPOPRODUTO_CODIGO integer,
    FAMILIA_CODIGO integer,
    PRODUTO_CODIGO integer,
    DESCRICAO varchar(100),
    UNIDADEMEDIDA_SIGLA varchar(3),
    DATA date)
as
BEGIN

FOR SELECT DISTINCT(A.Estabelecimento_Codigo),
       A.Localizacao_Codigo, B.TIPOPRODUTO_CODIGO, B.FAMILIA_CODIGO,
       A.PRODUTO_CODIGO, B.DESCRICAO, B.UNIDADEMEDIDA_SIGLA2,
       MAX(A.DATA)
FROM   TBESTOQUE_SALDO_DIARIO A, TbProduto B
Where  A.PRODUTO_CODIGO = B.CODIGO
and   (A.Estabelecimento_Codigo > :ESTABELECIMENTO_CODIGO_T or
       A.Estabelecimento_Codigo = :ESTABELECIMENTO_CODIGO_1)
and   (A.Localizacao_Codigo     > :LOCALIZACAO_CODIGO_T or
       A.Localizacao_Codigo     = :LOCALIZACAO_CODIGO_1)
and    A.Produto_codigo BetWeen   :PRODUTO_CODIGO_1 and
                                  :PRODUTO_CODIGO_2
and   (B.TIPOPRODUTO_CODIGO     > :TIPO_T or
       B.TIPOPRODUTO_CODIGO     = :TIPO_1)

and    A.DATA < :DATA_1

and   (B.FAMILIA_CODIGO > :FAM_T or
       B.FAMILIA_CODIGO = :FAM_1 or
       B.FAMILIA_CODIGO = :FAM_2 or
       B.FAMILIA_CODIGO = :FAM_3 or
       B.FAMILIA_CODIGO = :FAM_4 or
       B.FAMILIA_CODIGO = :FAM_5 or
       B.FAMILIA_CODIGO = :FAM_6 or
       B.FAMILIA_CODIGO = :FAM_7 or
       B.FAMILIA_CODIGO = :FAM_8 or
       B.FAMILIA_CODIGO = :FAM_9 or
       B.FAMILIA_CODIGO = :FAM_10)

Group By A.Estabelecimento_Codigo,A.Localizacao_Codigo,
       B.TIPOPRODUTO_CODIGO,B.FAMILIA_CODIGO,
       A.PRODUTO_CODIGO, B.DESCRICAO, B.UNIDADEMEDIDA_SIGLA2
INTO
  :ESTABELECIMENTO_CODIGO,
  :LOCALIZACAO_CODIGO,
  :TIPOPRODUTO_CODIGO,
  :FAMILIA_CODIGO,
  :PRODUTO_CODIGO,
  :DESCRICAO,
  :UNIDADEMEDIDA_SIGLA,
  :DATA
DO SUSPEND;
END
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER procedure SPC_ESTOQUE_SALDO_PRODUTO (
    IREG bigint,
    IFAMILIA_ID integer,
    ISALDO integer,
    IFILTER varchar(100))
returns (
    ESTABELECIMENTO_ID integer,
    LOCALIZACAO_ID integer,
    FAMILIA_ID integer,
    PRODUTO_ID integer,
    PRODUTO_DESCRICAO varchar(400),
    GRADE_ID integer,
    TAMANHO integer,
    TAMANHO_DESCRICAO varchar(200),
    ALOCADO numeric(18,4),
    SALDO numeric(18,5),
    UM varchar(12),
    FILTRO varchar(4624),
    SALDO_DETERCEIRO numeric(18,5),
    SALDO_EMTERCEIRO numeric(18,5))
as
declare variable GRADE integer;
declare variable ABILITA_GRADE varchar(100);
declare variable FLAG integer;
declare variable COUT integer;
begin

  COUT = 0;

  for
     select first 100
        p.codigo,
        p.descricao,
        p.grade_codigo,
        coalesce((select

            m.t01||','|| m.t02||','|| m.t03||','|| m.t04||','||
            m.t05||','|| m.t06||','|| m.t07||','|| m.t08||','||
            m.t09||','|| m.t10||','|| m.t11||','|| m.t12||','||
            m.t13||','|| m.t14||','|| m.t15||','|| m.t16||','||
            m.t17||','|| m.t18||','|| m.t19||','|| m.t20

        from tbmodelo m where m.codigo = p.modelo_codigo),'') as ABILITA_GRADE
     from tbproduto p
     where p.familia_codigo = :IFAMILIA_ID
     and upper(p.descricao||' '||p.codigo) like '%'||replace(upper(:IFILTER),' ','%')||'%'
     and p.status = 1
     order by p.descricao
  into
     :PRODUTO_ID,
     :PRODUTO_DESCRICAO,
     :GRADE,
     :ABILITA_GRADE
  do
  begin

    for
        SELECT
            FLAG,
            ESTABELECIMENTO_ID,
            LOCALIZACAO_ID,
            FAMILIA_ID, 
            PRODUTO_ID,
            DESCRICAO PRODUTO_DESCRICAO,
            GRADE_ID,
            TAMANHO,
            TAMANHO_DESCRICAO,
            ALOCADO,
            coalesce(SALDO,0),
            UNIDADEMEDIDA_SIGLA2 UM,
            FN_LPAD(PRODUTO_ID,6,0) || ' - ' || DESCRICAO || ' - ' || TAMANHO_DESCRICAO FILTRO,
            coalesce(saldo_deterceiro,0),
            coalesce(saldo_emterceiro,0)
        
        FROM (
        SELECT 00 as FLAG, coalesce(A.ESTABELECIMENTO_CODIGO,1) ESTABELECIMENTO_ID, coalesce(A.LOCALIZACAO_CODIGO,p.localizacao_codigo) LOCALIZACAO_ID, p.codigo as PRODUTO_ID, P.FAMILIA_CODIGO FAMILIA_ID, P.DESCRICAO, P.GRADE_CODIGO GRADE_ID, 00 TAMANHO, '' TAMANHO_DESCRICAO, COALESCE((SELECT SUM(EA.QUANTIDADE) FROM TBESTOQUE_SALDO_ALOCACAO EA WHERE EA.ESTABELECIMENTO_ID = A.ESTABELECIMENTO_CODIGO AND EA.LOCALIZACAO_ID = A.LOCALIZACAO_CODIGO AND EA.PRODUTO_ID = A.PRODUTO_CODIGO),0) as ALOCADO, (A.SALDO) SALDO, P.UNIDADEMEDIDA_SIGLA2, a.saldo_deterceiro, a.saldo_emterceiro FROM TBPRODUTO P LEFT JOIN TBESTOQUE_SALDO A ON P.CODIGO = A.PRODUTO_CODIGO WHERE P.GRADE_CODIGO = 0 and P.STATUS = 1 and p.codigo = :PRODUTO_ID UNION
        SELECT 01 as FLAG, coalesce(A.ESTABELECIMENTO_CODIGO,1) ESTABELECIMENTO_ID, coalesce(A.LOCALIZACAO_CODIGO,p.localizacao_codigo) LOCALIZACAO_ID, p.codigo as PRODUTO_ID, P.FAMILIA_CODIGO FAMILIA_ID, P.DESCRICAO, P.GRADE_CODIGO GRADE_ID, 01 TAMANHO, FN_TAMANHO_GRADE(P.GRADE_CODIGO,01) TAMANHO_DESCRICAO, COALESCE((SELECT EA.QUANTIDADE      FROM TBESTOQUE_SALDO_ALOCACAO EA WHERE EA.ESTABELECIMENTO_ID = A.ESTABELECIMENTO_CODIGO AND EA.LOCALIZACAO_ID = A.LOCALIZACAO_CODIGO AND EA.PRODUTO_ID = A.PRODUTO_CODIGO AND EA.TAMANHO = 01),0) as ALOCADO, A.T01_SALDO as SALDO, P.UNIDADEMEDIDA_SIGLA2, a.saldo_deterceiro, a.saldo_emterceiro FROM TBPRODUTO P LEFT JOIN TBESTOQUE_SALDO A ON P.CODIGO = A.PRODUTO_CODIGO WHERE P.GRADE_CODIGO > 0 and P.STATUS = 1 and p.codigo = :PRODUTO_ID and fn_array(:ABILITA_GRADE,01,',') = '1' UNION
        SELECT 02 as FLAG, coalesce(A.ESTABELECIMENTO_CODIGO,1) ESTABELECIMENTO_ID, coalesce(A.LOCALIZACAO_CODIGO,p.localizacao_codigo) LOCALIZACAO_ID, p.codigo as PRODUTO_ID, P.FAMILIA_CODIGO FAMILIA_ID, P.DESCRICAO, P.GRADE_CODIGO GRADE_ID, 02 TAMANHO, FN_TAMANHO_GRADE(P.GRADE_CODIGO,02) TAMANHO_DESCRICAO, COALESCE((SELECT EA.QUANTIDADE      FROM TBESTOQUE_SALDO_ALOCACAO EA WHERE EA.ESTABELECIMENTO_ID = A.ESTABELECIMENTO_CODIGO AND EA.LOCALIZACAO_ID = A.LOCALIZACAO_CODIGO AND EA.PRODUTO_ID = A.PRODUTO_CODIGO AND EA.TAMANHO = 02),0) as ALOCADO, A.T02_SALDO as SALDO, P.UNIDADEMEDIDA_SIGLA2, a.saldo_deterceiro, a.saldo_emterceiro FROM TBPRODUTO P LEFT JOIN TBESTOQUE_SALDO A ON P.CODIGO = A.PRODUTO_CODIGO WHERE P.GRADE_CODIGO > 0 and P.STATUS = 1 and p.codigo = :PRODUTO_ID and fn_array(:ABILITA_GRADE,02,',') = '1' UNION
        SELECT 03 as FLAG, coalesce(A.ESTABELECIMENTO_CODIGO,1) ESTABELECIMENTO_ID, coalesce(A.LOCALIZACAO_CODIGO,p.localizacao_codigo) LOCALIZACAO_ID, p.codigo as PRODUTO_ID, P.FAMILIA_CODIGO FAMILIA_ID, P.DESCRICAO, P.GRADE_CODIGO GRADE_ID, 03 TAMANHO, FN_TAMANHO_GRADE(P.GRADE_CODIGO,03) TAMANHO_DESCRICAO, COALESCE((SELECT EA.QUANTIDADE      FROM TBESTOQUE_SALDO_ALOCACAO EA WHERE EA.ESTABELECIMENTO_ID = A.ESTABELECIMENTO_CODIGO AND EA.LOCALIZACAO_ID = A.LOCALIZACAO_CODIGO AND EA.PRODUTO_ID = A.PRODUTO_CODIGO AND EA.TAMANHO = 03),0) as ALOCADO, A.T03_SALDO as SALDO, P.UNIDADEMEDIDA_SIGLA2, a.saldo_deterceiro, a.saldo_emterceiro FROM TBPRODUTO P LEFT JOIN TBESTOQUE_SALDO A ON P.CODIGO = A.PRODUTO_CODIGO WHERE P.GRADE_CODIGO > 0 and P.STATUS = 1 and p.codigo = :PRODUTO_ID and fn_array(:ABILITA_GRADE,03,',') = '1' UNION
        SELECT 04 as FLAG, coalesce(A.ESTABELECIMENTO_CODIGO,1) ESTABELECIMENTO_ID, coalesce(A.LOCALIZACAO_CODIGO,p.localizacao_codigo) LOCALIZACAO_ID, p.codigo as PRODUTO_ID, P.FAMILIA_CODIGO FAMILIA_ID, P.DESCRICAO, P.GRADE_CODIGO GRADE_ID, 04 TAMANHO, FN_TAMANHO_GRADE(P.GRADE_CODIGO,04) TAMANHO_DESCRICAO, COALESCE((SELECT EA.QUANTIDADE      FROM TBESTOQUE_SALDO_ALOCACAO EA WHERE EA.ESTABELECIMENTO_ID = A.ESTABELECIMENTO_CODIGO AND EA.LOCALIZACAO_ID = A.LOCALIZACAO_CODIGO AND EA.PRODUTO_ID = A.PRODUTO_CODIGO AND EA.TAMANHO = 04),0) as ALOCADO, A.T04_SALDO as SALDO, P.UNIDADEMEDIDA_SIGLA2, a.saldo_deterceiro, a.saldo_emterceiro FROM TBPRODUTO P LEFT JOIN TBESTOQUE_SALDO A ON P.CODIGO = A.PRODUTO_CODIGO WHERE P.GRADE_CODIGO > 0 and P.STATUS = 1 and p.codigo = :PRODUTO_ID and fn_array(:ABILITA_GRADE,04,',') = '1' UNION
        SELECT 05 as FLAG, coalesce(A.ESTABELECIMENTO_CODIGO,1) ESTABELECIMENTO_ID, coalesce(A.LOCALIZACAO_CODIGO,p.localizacao_codigo) LOCALIZACAO_ID, p.codigo as PRODUTO_ID, P.FAMILIA_CODIGO FAMILIA_ID, P.DESCRICAO, P.GRADE_CODIGO GRADE_ID, 05 TAMANHO, FN_TAMANHO_GRADE(P.GRADE_CODIGO,05) TAMANHO_DESCRICAO, COALESCE((SELECT EA.QUANTIDADE      FROM TBESTOQUE_SALDO_ALOCACAO EA WHERE EA.ESTABELECIMENTO_ID = A.ESTABELECIMENTO_CODIGO AND EA.LOCALIZACAO_ID = A.LOCALIZACAO_CODIGO AND EA.PRODUTO_ID = A.PRODUTO_CODIGO AND EA.TAMANHO = 05),0) as ALOCADO, A.T05_SALDO as SALDO, P.UNIDADEMEDIDA_SIGLA2, a.saldo_deterceiro, a.saldo_emterceiro FROM TBPRODUTO P LEFT JOIN TBESTOQUE_SALDO A ON P.CODIGO = A.PRODUTO_CODIGO WHERE P.GRADE_CODIGO > 0 and P.STATUS = 1 and p.codigo = :PRODUTO_ID and fn_array(:ABILITA_GRADE,05,',') = '1' UNION
        SELECT 06 as FLAG, coalesce(A.ESTABELECIMENTO_CODIGO,1) ESTABELECIMENTO_ID, coalesce(A.LOCALIZACAO_CODIGO,p.localizacao_codigo) LOCALIZACAO_ID, p.codigo as PRODUTO_ID, P.FAMILIA_CODIGO FAMILIA_ID, P.DESCRICAO, P.GRADE_CODIGO GRADE_ID, 06 TAMANHO, FN_TAMANHO_GRADE(P.GRADE_CODIGO,06) TAMANHO_DESCRICAO, COALESCE((SELECT EA.QUANTIDADE      FROM TBESTOQUE_SALDO_ALOCACAO EA WHERE EA.ESTABELECIMENTO_ID = A.ESTABELECIMENTO_CODIGO AND EA.LOCALIZACAO_ID = A.LOCALIZACAO_CODIGO AND EA.PRODUTO_ID = A.PRODUTO_CODIGO AND EA.TAMANHO = 06),0) as ALOCADO, A.T06_SALDO as SALDO, P.UNIDADEMEDIDA_SIGLA2, a.saldo_deterceiro, a.saldo_emterceiro FROM TBPRODUTO P LEFT JOIN TBESTOQUE_SALDO A ON P.CODIGO = A.PRODUTO_CODIGO WHERE P.GRADE_CODIGO > 0 and P.STATUS = 1 and p.codigo = :PRODUTO_ID and fn_array(:ABILITA_GRADE,06,',') = '1' UNION
        SELECT 07 as FLAG, coalesce(A.ESTABELECIMENTO_CODIGO,1) ESTABELECIMENTO_ID, coalesce(A.LOCALIZACAO_CODIGO,p.localizacao_codigo) LOCALIZACAO_ID, p.codigo as PRODUTO_ID, P.FAMILIA_CODIGO FAMILIA_ID, P.DESCRICAO, P.GRADE_CODIGO GRADE_ID, 07 TAMANHO, FN_TAMANHO_GRADE(P.GRADE_CODIGO,07) TAMANHO_DESCRICAO, COALESCE((SELECT EA.QUANTIDADE      FROM TBESTOQUE_SALDO_ALOCACAO EA WHERE EA.ESTABELECIMENTO_ID = A.ESTABELECIMENTO_CODIGO AND EA.LOCALIZACAO_ID = A.LOCALIZACAO_CODIGO AND EA.PRODUTO_ID = A.PRODUTO_CODIGO AND EA.TAMANHO = 07),0) as ALOCADO, A.T07_SALDO as SALDO, P.UNIDADEMEDIDA_SIGLA2, a.saldo_deterceiro, a.saldo_emterceiro FROM TBPRODUTO P LEFT JOIN TBESTOQUE_SALDO A ON P.CODIGO = A.PRODUTO_CODIGO WHERE P.GRADE_CODIGO > 0 and P.STATUS = 1 and p.codigo = :PRODUTO_ID and fn_array(:ABILITA_GRADE,07,',') = '1' UNION
        SELECT 08 as FLAG, coalesce(A.ESTABELECIMENTO_CODIGO,1) ESTABELECIMENTO_ID, coalesce(A.LOCALIZACAO_CODIGO,p.localizacao_codigo) LOCALIZACAO_ID, p.codigo as PRODUTO_ID, P.FAMILIA_CODIGO FAMILIA_ID, P.DESCRICAO, P.GRADE_CODIGO GRADE_ID, 08 TAMANHO, FN_TAMANHO_GRADE(P.GRADE_CODIGO,08) TAMANHO_DESCRICAO, COALESCE((SELECT EA.QUANTIDADE      FROM TBESTOQUE_SALDO_ALOCACAO EA WHERE EA.ESTABELECIMENTO_ID = A.ESTABELECIMENTO_CODIGO AND EA.LOCALIZACAO_ID = A.LOCALIZACAO_CODIGO AND EA.PRODUTO_ID = A.PRODUTO_CODIGO AND EA.TAMANHO = 08),0) as ALOCADO, A.T08_SALDO as SALDO, P.UNIDADEMEDIDA_SIGLA2, a.saldo_deterceiro, a.saldo_emterceiro FROM TBPRODUTO P LEFT JOIN TBESTOQUE_SALDO A ON P.CODIGO = A.PRODUTO_CODIGO WHERE P.GRADE_CODIGO > 0 and P.STATUS = 1 and p.codigo = :PRODUTO_ID and fn_array(:ABILITA_GRADE,08,',') = '1' UNION
        SELECT 09 as FLAG, coalesce(A.ESTABELECIMENTO_CODIGO,1) ESTABELECIMENTO_ID, coalesce(A.LOCALIZACAO_CODIGO,p.localizacao_codigo) LOCALIZACAO_ID, p.codigo as PRODUTO_ID, P.FAMILIA_CODIGO FAMILIA_ID, P.DESCRICAO, P.GRADE_CODIGO GRADE_ID, 09 TAMANHO, FN_TAMANHO_GRADE(P.GRADE_CODIGO,09) TAMANHO_DESCRICAO, COALESCE((SELECT EA.QUANTIDADE      FROM TBESTOQUE_SALDO_ALOCACAO EA WHERE EA.ESTABELECIMENTO_ID = A.ESTABELECIMENTO_CODIGO AND EA.LOCALIZACAO_ID = A.LOCALIZACAO_CODIGO AND EA.PRODUTO_ID = A.PRODUTO_CODIGO AND EA.TAMANHO = 09),0) as ALOCADO, A.T09_SALDO as SALDO, P.UNIDADEMEDIDA_SIGLA2, a.saldo_deterceiro, a.saldo_emterceiro FROM TBPRODUTO P LEFT JOIN TBESTOQUE_SALDO A ON P.CODIGO = A.PRODUTO_CODIGO WHERE P.GRADE_CODIGO > 0 and P.STATUS = 1 and p.codigo = :PRODUTO_ID and fn_array(:ABILITA_GRADE,09,',') = '1' UNION
        SELECT 10 as FLAG, coalesce(A.ESTABELECIMENTO_CODIGO,1) ESTABELECIMENTO_ID, coalesce(A.LOCALIZACAO_CODIGO,p.localizacao_codigo) LOCALIZACAO_ID, p.codigo as PRODUTO_ID, P.FAMILIA_CODIGO FAMILIA_ID, P.DESCRICAO, P.GRADE_CODIGO GRADE_ID, 10 TAMANHO, FN_TAMANHO_GRADE(P.GRADE_CODIGO,10) TAMANHO_DESCRICAO, COALESCE((SELECT EA.QUANTIDADE      FROM TBESTOQUE_SALDO_ALOCACAO EA WHERE EA.ESTABELECIMENTO_ID = A.ESTABELECIMENTO_CODIGO AND EA.LOCALIZACAO_ID = A.LOCALIZACAO_CODIGO AND EA.PRODUTO_ID = A.PRODUTO_CODIGO AND EA.TAMANHO = 10),0) as ALOCADO, A.T10_SALDO as SALDO, P.UNIDADEMEDIDA_SIGLA2, a.saldo_deterceiro, a.saldo_emterceiro FROM TBPRODUTO P LEFT JOIN TBESTOQUE_SALDO A ON P.CODIGO = A.PRODUTO_CODIGO WHERE P.GRADE_CODIGO > 0 and P.STATUS = 1 and p.codigo = :PRODUTO_ID and fn_array(:ABILITA_GRADE,10,',') = '1' UNION
        SELECT 11 as FLAG, coalesce(A.ESTABELECIMENTO_CODIGO,1) ESTABELECIMENTO_ID, coalesce(A.LOCALIZACAO_CODIGO,p.localizacao_codigo) LOCALIZACAO_ID, p.codigo as PRODUTO_ID, P.FAMILIA_CODIGO FAMILIA_ID, P.DESCRICAO, P.GRADE_CODIGO GRADE_ID, 11 TAMANHO, FN_TAMANHO_GRADE(P.GRADE_CODIGO,11) TAMANHO_DESCRICAO, COALESCE((SELECT EA.QUANTIDADE      FROM TBESTOQUE_SALDO_ALOCACAO EA WHERE EA.ESTABELECIMENTO_ID = A.ESTABELECIMENTO_CODIGO AND EA.LOCALIZACAO_ID = A.LOCALIZACAO_CODIGO AND EA.PRODUTO_ID = A.PRODUTO_CODIGO AND EA.TAMANHO = 11),0) as ALOCADO, A.T11_SALDO as SALDO, P.UNIDADEMEDIDA_SIGLA2, a.saldo_deterceiro, a.saldo_emterceiro FROM TBPRODUTO P LEFT JOIN TBESTOQUE_SALDO A ON P.CODIGO = A.PRODUTO_CODIGO WHERE P.GRADE_CODIGO > 0 and P.STATUS = 1 and p.codigo = :PRODUTO_ID and fn_array(:ABILITA_GRADE,11,',') = '1' UNION
        SELECT 12 as FLAG, coalesce(A.ESTABELECIMENTO_CODIGO,1) ESTABELECIMENTO_ID, coalesce(A.LOCALIZACAO_CODIGO,p.localizacao_codigo) LOCALIZACAO_ID, p.codigo as PRODUTO_ID, P.FAMILIA_CODIGO FAMILIA_ID, P.DESCRICAO, P.GRADE_CODIGO GRADE_ID, 12 TAMANHO, FN_TAMANHO_GRADE(P.GRADE_CODIGO,12) TAMANHO_DESCRICAO, COALESCE((SELECT EA.QUANTIDADE      FROM TBESTOQUE_SALDO_ALOCACAO EA WHERE EA.ESTABELECIMENTO_ID = A.ESTABELECIMENTO_CODIGO AND EA.LOCALIZACAO_ID = A.LOCALIZACAO_CODIGO AND EA.PRODUTO_ID = A.PRODUTO_CODIGO AND EA.TAMANHO = 12),0) as ALOCADO, A.T12_SALDO as SALDO, P.UNIDADEMEDIDA_SIGLA2, a.saldo_deterceiro, a.saldo_emterceiro FROM TBPRODUTO P LEFT JOIN TBESTOQUE_SALDO A ON P.CODIGO = A.PRODUTO_CODIGO WHERE P.GRADE_CODIGO > 0 and P.STATUS = 1 and p.codigo = :PRODUTO_ID and fn_array(:ABILITA_GRADE,12,',') = '1' UNION
        SELECT 13 as FLAG, coalesce(A.ESTABELECIMENTO_CODIGO,1) ESTABELECIMENTO_ID, coalesce(A.LOCALIZACAO_CODIGO,p.localizacao_codigo) LOCALIZACAO_ID, p.codigo as PRODUTO_ID, P.FAMILIA_CODIGO FAMILIA_ID, P.DESCRICAO, P.GRADE_CODIGO GRADE_ID, 13 TAMANHO, FN_TAMANHO_GRADE(P.GRADE_CODIGO,13) TAMANHO_DESCRICAO, COALESCE((SELECT EA.QUANTIDADE      FROM TBESTOQUE_SALDO_ALOCACAO EA WHERE EA.ESTABELECIMENTO_ID = A.ESTABELECIMENTO_CODIGO AND EA.LOCALIZACAO_ID = A.LOCALIZACAO_CODIGO AND EA.PRODUTO_ID = A.PRODUTO_CODIGO AND EA.TAMANHO = 13),0) as ALOCADO, A.T13_SALDO as SALDO, P.UNIDADEMEDIDA_SIGLA2, a.saldo_deterceiro, a.saldo_emterceiro FROM TBPRODUTO P LEFT JOIN TBESTOQUE_SALDO A ON P.CODIGO = A.PRODUTO_CODIGO WHERE P.GRADE_CODIGO > 0 and P.STATUS = 1 and p.codigo = :PRODUTO_ID and fn_array(:ABILITA_GRADE,13,',') = '1' UNION
        SELECT 14 as FLAG, coalesce(A.ESTABELECIMENTO_CODIGO,1) ESTABELECIMENTO_ID, coalesce(A.LOCALIZACAO_CODIGO,p.localizacao_codigo) LOCALIZACAO_ID, p.codigo as PRODUTO_ID, P.FAMILIA_CODIGO FAMILIA_ID, P.DESCRICAO, P.GRADE_CODIGO GRADE_ID, 14 TAMANHO, FN_TAMANHO_GRADE(P.GRADE_CODIGO,14) TAMANHO_DESCRICAO, COALESCE((SELECT EA.QUANTIDADE      FROM TBESTOQUE_SALDO_ALOCACAO EA WHERE EA.ESTABELECIMENTO_ID = A.ESTABELECIMENTO_CODIGO AND EA.LOCALIZACAO_ID = A.LOCALIZACAO_CODIGO AND EA.PRODUTO_ID = A.PRODUTO_CODIGO AND EA.TAMANHO = 14),0) as ALOCADO, A.T14_SALDO as SALDO, P.UNIDADEMEDIDA_SIGLA2, a.saldo_deterceiro, a.saldo_emterceiro FROM TBPRODUTO P LEFT JOIN TBESTOQUE_SALDO A ON P.CODIGO = A.PRODUTO_CODIGO WHERE P.GRADE_CODIGO > 0 and P.STATUS = 1 and p.codigo = :PRODUTO_ID and fn_array(:ABILITA_GRADE,14,',') = '1' UNION
        SELECT 15 as FLAG, coalesce(A.ESTABELECIMENTO_CODIGO,1) ESTABELECIMENTO_ID, coalesce(A.LOCALIZACAO_CODIGO,p.localizacao_codigo) LOCALIZACAO_ID, p.codigo as PRODUTO_ID, P.FAMILIA_CODIGO FAMILIA_ID, P.DESCRICAO, P.GRADE_CODIGO GRADE_ID, 15 TAMANHO, FN_TAMANHO_GRADE(P.GRADE_CODIGO,15) TAMANHO_DESCRICAO, COALESCE((SELECT EA.QUANTIDADE      FROM TBESTOQUE_SALDO_ALOCACAO EA WHERE EA.ESTABELECIMENTO_ID = A.ESTABELECIMENTO_CODIGO AND EA.LOCALIZACAO_ID = A.LOCALIZACAO_CODIGO AND EA.PRODUTO_ID = A.PRODUTO_CODIGO AND EA.TAMANHO = 15),0) as ALOCADO, A.T15_SALDO as SALDO, P.UNIDADEMEDIDA_SIGLA2, a.saldo_deterceiro, a.saldo_emterceiro FROM TBPRODUTO P LEFT JOIN TBESTOQUE_SALDO A ON P.CODIGO = A.PRODUTO_CODIGO WHERE P.GRADE_CODIGO > 0 and P.STATUS = 1 and p.codigo = :PRODUTO_ID and fn_array(:ABILITA_GRADE,15,',') = '1' UNION
        SELECT 16 as FLAG, coalesce(A.ESTABELECIMENTO_CODIGO,1) ESTABELECIMENTO_ID, coalesce(A.LOCALIZACAO_CODIGO,p.localizacao_codigo) LOCALIZACAO_ID, p.codigo as PRODUTO_ID, P.FAMILIA_CODIGO FAMILIA_ID, P.DESCRICAO, P.GRADE_CODIGO GRADE_ID, 16 TAMANHO, FN_TAMANHO_GRADE(P.GRADE_CODIGO,16) TAMANHO_DESCRICAO, COALESCE((SELECT EA.QUANTIDADE      FROM TBESTOQUE_SALDO_ALOCACAO EA WHERE EA.ESTABELECIMENTO_ID = A.ESTABELECIMENTO_CODIGO AND EA.LOCALIZACAO_ID = A.LOCALIZACAO_CODIGO AND EA.PRODUTO_ID = A.PRODUTO_CODIGO AND EA.TAMANHO = 16),0) as ALOCADO, A.T16_SALDO as SALDO, P.UNIDADEMEDIDA_SIGLA2, a.saldo_deterceiro, a.saldo_emterceiro FROM TBPRODUTO P LEFT JOIN TBESTOQUE_SALDO A ON P.CODIGO = A.PRODUTO_CODIGO WHERE P.GRADE_CODIGO > 0 and P.STATUS = 1 and p.codigo = :PRODUTO_ID and fn_array(:ABILITA_GRADE,16,',') = '1' UNION
        SELECT 17 as FLAG, coalesce(A.ESTABELECIMENTO_CODIGO,1) ESTABELECIMENTO_ID, coalesce(A.LOCALIZACAO_CODIGO,p.localizacao_codigo) LOCALIZACAO_ID, p.codigo as PRODUTO_ID, P.FAMILIA_CODIGO FAMILIA_ID, P.DESCRICAO, P.GRADE_CODIGO GRADE_ID, 17 TAMANHO, FN_TAMANHO_GRADE(P.GRADE_CODIGO,17) TAMANHO_DESCRICAO, COALESCE((SELECT EA.QUANTIDADE      FROM TBESTOQUE_SALDO_ALOCACAO EA WHERE EA.ESTABELECIMENTO_ID = A.ESTABELECIMENTO_CODIGO AND EA.LOCALIZACAO_ID = A.LOCALIZACAO_CODIGO AND EA.PRODUTO_ID = A.PRODUTO_CODIGO AND EA.TAMANHO = 17),0) as ALOCADO, A.T17_SALDO as SALDO, P.UNIDADEMEDIDA_SIGLA2, a.saldo_deterceiro, a.saldo_emterceiro FROM TBPRODUTO P LEFT JOIN TBESTOQUE_SALDO A ON P.CODIGO = A.PRODUTO_CODIGO WHERE P.GRADE_CODIGO > 0 and P.STATUS = 1 and p.codigo = :PRODUTO_ID and fn_array(:ABILITA_GRADE,17,',') = '1' UNION
        SELECT 18 as FLAG, coalesce(A.ESTABELECIMENTO_CODIGO,1) ESTABELECIMENTO_ID, coalesce(A.LOCALIZACAO_CODIGO,p.localizacao_codigo) LOCALIZACAO_ID, p.codigo as PRODUTO_ID, P.FAMILIA_CODIGO FAMILIA_ID, P.DESCRICAO, P.GRADE_CODIGO GRADE_ID, 18 TAMANHO, FN_TAMANHO_GRADE(P.GRADE_CODIGO,18) TAMANHO_DESCRICAO, COALESCE((SELECT EA.QUANTIDADE      FROM TBESTOQUE_SALDO_ALOCACAO EA WHERE EA.ESTABELECIMENTO_ID = A.ESTABELECIMENTO_CODIGO AND EA.LOCALIZACAO_ID = A.LOCALIZACAO_CODIGO AND EA.PRODUTO_ID = A.PRODUTO_CODIGO AND EA.TAMANHO = 18),0) as ALOCADO, A.T18_SALDO as SALDO, P.UNIDADEMEDIDA_SIGLA2, a.saldo_deterceiro, a.saldo_emterceiro FROM TBPRODUTO P LEFT JOIN TBESTOQUE_SALDO A ON P.CODIGO = A.PRODUTO_CODIGO WHERE P.GRADE_CODIGO > 0 and P.STATUS = 1 and p.codigo = :PRODUTO_ID and fn_array(:ABILITA_GRADE,18,',') = '1' UNION
        SELECT 19 as FLAG, coalesce(A.ESTABELECIMENTO_CODIGO,1) ESTABELECIMENTO_ID, coalesce(A.LOCALIZACAO_CODIGO,p.localizacao_codigo) LOCALIZACAO_ID, p.codigo as PRODUTO_ID, P.FAMILIA_CODIGO FAMILIA_ID, P.DESCRICAO, P.GRADE_CODIGO GRADE_ID, 19 TAMANHO, FN_TAMANHO_GRADE(P.GRADE_CODIGO,19) TAMANHO_DESCRICAO, COALESCE((SELECT EA.QUANTIDADE      FROM TBESTOQUE_SALDO_ALOCACAO EA WHERE EA.ESTABELECIMENTO_ID = A.ESTABELECIMENTO_CODIGO AND EA.LOCALIZACAO_ID = A.LOCALIZACAO_CODIGO AND EA.PRODUTO_ID = A.PRODUTO_CODIGO AND EA.TAMANHO = 19),0) as ALOCADO, A.T19_SALDO as SALDO, P.UNIDADEMEDIDA_SIGLA2, a.saldo_deterceiro, a.saldo_emterceiro FROM TBPRODUTO P LEFT JOIN TBESTOQUE_SALDO A ON P.CODIGO = A.PRODUTO_CODIGO WHERE P.GRADE_CODIGO > 0 and P.STATUS = 1 and p.codigo = :PRODUTO_ID and fn_array(:ABILITA_GRADE,19,',') = '1' UNION
        SELECT 20 as FLAG, coalesce(A.ESTABELECIMENTO_CODIGO,1) ESTABELECIMENTO_ID, coalesce(A.LOCALIZACAO_CODIGO,p.localizacao_codigo) LOCALIZACAO_ID, p.codigo as PRODUTO_ID, P.FAMILIA_CODIGO FAMILIA_ID, P.DESCRICAO, P.GRADE_CODIGO GRADE_ID, 20 TAMANHO, FN_TAMANHO_GRADE(P.GRADE_CODIGO,20) TAMANHO_DESCRICAO, COALESCE((SELECT EA.QUANTIDADE      FROM TBESTOQUE_SALDO_ALOCACAO EA WHERE EA.ESTABELECIMENTO_ID = A.ESTABELECIMENTO_CODIGO AND EA.LOCALIZACAO_ID = A.LOCALIZACAO_CODIGO AND EA.PRODUTO_ID = A.PRODUTO_CODIGO AND EA.TAMANHO = 20),0) as ALOCADO, A.T20_SALDO as SALDO, P.UNIDADEMEDIDA_SIGLA2, a.saldo_deterceiro, a.saldo_emterceiro FROM TBPRODUTO P LEFT JOIN TBESTOQUE_SALDO A ON P.CODIGO = A.PRODUTO_CODIGO WHERE P.GRADE_CODIGO > 0 and P.STATUS = 1 and p.codigo = :PRODUTO_ID and fn_array(:ABILITA_GRADE,20,',') = '1'
        )
    into
        :FLAG,
        :ESTABELECIMENTO_ID,
        :LOCALIZACAO_ID,
        :FAMILIA_ID,
        :PRODUTO_ID,
        :PRODUTO_DESCRICAO,
        :GRADE_ID,
        :TAMANHO,
        :TAMANHO_DESCRICAO,
        :ALOCADO,
        :SALDO,
        :UM,
        :FILTRO,
        :SALDO_DETERCEIRO,
        :SALDO_EMTERCEIRO
    do
    begin
      if(:GRADE = 0 and COUT <= IREG)then
      begin
        COUT = COUT + 1;
        suspend;
      end else
      begin
        if(fn_array(:ABILITA_GRADE,:FLAG,',') = '1' and COUT <= IREG)then
        begin
          COUT = COUT + 1;
          suspend;
        end
      end
    end
  end

end
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER procedure SPC_ESTOQUE_SALDO_RESUMIDO7 (
    ESTABELECIMENTO_1 integer,
    LOCALIZACAO_1 integer,
    FAMILIA_1 integer,
    MODELO_1 integer,
    MODELO_2 integer,
    MRP char(1))
returns (
    ESTABELECIMENTO_CODIGO integer,
    LOCALIZACAO_CODIGO integer,
    PRODUTO_CODIGO integer,
    DESCRICAO varchar(100),
    SALDO numeric(10,4),
    UNIDADEMEDIDA_SIGLA varchar(3),
    GRADE_CODIGO integer,
    T01_SALDO numeric(10,4),
    T02_SALDO numeric(10,4),
    T03_SALDO numeric(10,4),
    T04_SALDO numeric(10,4),
    T05_SALDO numeric(10,4),
    T06_SALDO numeric(10,4),
    T07_SALDO numeric(10,4),
    T08_SALDO numeric(10,4),
    T09_SALDO numeric(10,4),
    T10_SALDO numeric(10,4),
    T11_SALDO numeric(10,4),
    T12_SALDO numeric(10,4),
    T13_SALDO numeric(10,4),
    T14_SALDO numeric(10,4),
    T15_SALDO numeric(10,4),
    T16_SALDO numeric(10,4),
    T17_SALDO numeric(10,4),
    T18_SALDO numeric(10,4),
    T19_SALDO numeric(10,4),
    T20_SALDO numeric(10,4),
    EM_TERCEIROS numeric(10,4),
    SALDO_REVISAO numeric(10,4),
    SALDO_ESTRAGADO numeric(10,4),
    ESTOQUE_MINIMO numeric(10,4),
    ESTOQUE_SEGURANCA char(1),
    OC_ABERTO numeric(10,4),
    COR_CODIGO integer)
as
BEGIN

if (:Mrp = '0') then
    Begin

FOR Select Distinct(A.Estabelecimento_Codigo), A.Localizacao_Codigo,
B.Codigo, B.Descricao, Coalesce(A.Saldo,0), B.UnidadeMedida_Sigla2,
B.Grade_Codigo,A.T01_Saldo, A.T02_Saldo, A.T03_Saldo, A.T04_Saldo,
A.T05_Saldo, A.T06_Saldo, A.T07_Saldo, A.T08_Saldo, A.T09_Saldo,
A.T10_Saldo, A.T11_Saldo, A.T12_Saldo, A.T13_Saldo, A.T14_Saldo,
A.T15_Saldo, A.T16_Saldo, A.T17_Saldo, A.T18_Saldo, A.T19_Saldo,
A.T20_Saldo, Coalesce(A.Saldo_EmTerceiro,0),

Coalesce((Select First 1 Cast(R.Saldo as Numeric(15,4)) From TBEstoque_Saldo R, TbFamilia_Ficha FF
  Where R.Estabelecimento_Codigo = :Estabelecimento_1
    and R.Produto_Codigo = B.Codigo
    and R.Estabelecimento_Codigo = FF.Estabelecimento_Codigo
    and FF.Familia_Codigo = B.Familia_Codigo
    and R.Localizacao_Codigo = FF.Localizacao_Revisao and R.Saldo > 0),0) Saldo_Revisao,

Coalesce((Select First 1 Cast(R.Saldo as Numeric(15,4)) From TBEstoque_Saldo R, TbFamilia_Ficha FF
  Where R.Estabelecimento_Codigo = :Estabelecimento_1
    and R.Produto_Codigo = B.Codigo
    and R.Estabelecimento_Codigo = FF.Estabelecimento_Codigo
    and FF.Familia_Codigo = B.Familia_Codigo
    and R.Localizacao_Codigo = FF.Localizacao_Estragado and R.Saldo > 0),0) Saldo_Estragado,

Coalesce((Select (R.QUANTIDADE) From TbEstoque_Minimo R
  Where R.Estabelecimento_Codigo = :ESTABELECIMENTO_1 and R.Localizacao_Codigo = :Localizacao_1 and R.Produto_Codigo = B.Codigo),0) ESTOQUE_MINIMO,

(Select (R.Estoque_Seguranca) From TbEstoque_Minimo R
  Where R.Estabelecimento_Codigo = :ESTABELECIMENTO_1 and R.Localizacao_Codigo = :Localizacao_1 and R.Produto_Codigo = B.Codigo) ESTOQUE_SEGURANCA,

Coalesce((Select Sum(Z.Quantidade) From TbOc X, TbOc_Item Y, TbOC_Item_Saldo Z
Where  X.Oc = Y.Oc and Y.Controle = Z.Oc_Item_Controle and Y.Situacao = 1 and X.Status = 1
  and  X.Estabelecimento_Codigo = :ESTABELECIMENTO_1 and Y.Produto_Codigo = B.CODIGO),0) OC,
  B.COR_CODIGO

From TbProduto B

Left Join TbEstoque_Saldo A On (A.Produto_Codigo = B.Codigo
and A.Estabelecimento_Codigo = :ESTABELECIMENTO_1
and A.Localizacao_Codigo = :LOCALIZACAO_1)

Where B.Familia_Codigo     = :FAMILIA_1
and   B.Modelo_Codigo between :Modelo_1 and :Modelo_2
and   B.Status = '1'

Order By B.Descricao

INTO :Estabelecimento_Codigo,
     :Localizacao_Codigo,
     :Produto_Codigo,
     :Descricao,
     :Saldo,
     :UnidadeMedida_Sigla,
     :Grade_Codigo,
     :T01_Saldo, :T02_Saldo, :T03_Saldo, :T04_Saldo, :T05_Saldo,
     :T06_Saldo, :T07_Saldo, :T08_Saldo, :T09_Saldo, :T10_Saldo,
     :T11_Saldo, :T12_Saldo, :T13_Saldo, :T14_Saldo, :T15_Saldo,
     :T16_Saldo, :T17_Saldo, :T18_Saldo, :T19_Saldo, :T20_Saldo,
     :Em_Terceiros,   :Saldo_Revisao, :Saldo_Estragado,
     :Estoque_Minimo, :ESTOQUE_SEGURANCA, :Oc_Aberto, :COR_CODIGO

DO SUSPEND;
END 

ELSE

if (:Mrp = '1') then
BEGIN

FOR Select Distinct(A.Estabelecimento_Codigo), A.Localizacao_Codigo,
B.Codigo, B.Descricao, Coalesce(A.Saldo,0), B.UnidadeMedida_Sigla2,
B.Grade_Codigo,A.T01_Saldo, A.T02_Saldo, A.T03_Saldo, A.T04_Saldo,
A.T05_Saldo, A.T06_Saldo, A.T07_Saldo, A.T08_Saldo, A.T09_Saldo,
A.T10_Saldo, A.T11_Saldo, A.T12_Saldo, A.T13_Saldo, A.T14_Saldo,
A.T15_Saldo, A.T16_Saldo, A.T17_Saldo, A.T18_Saldo, A.T19_Saldo,
A.T20_Saldo, Coalesce(A.Saldo_EmTerceiro,0),

Coalesce((Select First 1 Cast(R.Saldo as Numeric(15,4)) From TBEstoque_Saldo R, TbFamilia_Ficha FF
  Where R.Estabelecimento_Codigo = :Estabelecimento_1
    and R.Produto_Codigo = B.Codigo
    and R.Estabelecimento_Codigo = FF.Estabelecimento_Codigo
    and FF.Familia_Codigo = B.Familia_Codigo
    and R.Localizacao_Codigo = FF.Localizacao_Revisao and R.Saldo > 0),0) Saldo_Revisao,

Coalesce((Select First 1 Cast(R.Saldo as Numeric(15,4)) From TBEstoque_Saldo R, TbFamilia_Ficha FF
  Where R.Estabelecimento_Codigo = :Estabelecimento_1
    and R.Produto_Codigo = B.Codigo
    and R.Estabelecimento_Codigo = FF.Estabelecimento_Codigo
    and FF.Familia_Codigo = B.Familia_Codigo
    and R.Localizacao_Codigo = FF.Localizacao_Estragado and R.Saldo > 0),0) Saldo_Estragado,

Coalesce((Select (R.QUANTIDADE) From TbEstoque_Minimo R
  Where R.Estabelecimento_Codigo = :ESTABELECIMENTO_1 and R.Localizacao_Codigo = :Localizacao_1 and R.Produto_Codigo = B.Codigo),0) ESTOQUE_MINIMO,

(Select (R.Estoque_Seguranca) From TbEstoque_Minimo R
  Where R.Estabelecimento_Codigo = :ESTABELECIMENTO_1 and R.Localizacao_Codigo = :Localizacao_1 and R.Produto_Codigo = B.Codigo) ESTOQUE_SEGURANCA,

Coalesce((Select Sum(Z.Quantidade) From TbOc X, TbOc_Item Y, TbOC_Item_Saldo Z
Where  X.Oc = Y.Oc and Y.Controle = Z.Oc_Item_Controle and Y.Situacao = 1 and X.Status = 1
  and  X.Estabelecimento_Codigo = A.ESTABELECIMENTO_CODIGO and Y.Produto_Codigo = B.CODIGO),0) OC,
  B.COR_CODIGO

From TbProduto B, TbEstoque_Saldo A
Where A.Produto_Codigo = B.Codigo
and A.Estabelecimento_Codigo = :ESTABELECIMENTO_1
and A.Localizacao_Codigo = :LOCALIZACAO_1 
and B.Familia_Codigo     = :FAMILIA_1
and B.Modelo_Codigo between :Modelo_1 and :Modelo_2
and (A.Saldo > 0 or A.Saldo_EmTerceiro > 0)

Order By B.Descricao

INTO :Estabelecimento_Codigo,
     :Localizacao_Codigo,
     :Produto_Codigo,
     :Descricao,
     :Saldo,
     :UnidadeMedida_Sigla,
     :Grade_Codigo,
     :T01_Saldo, :T02_Saldo, :T03_Saldo, :T04_Saldo, :T05_Saldo,
     :T06_Saldo, :T07_Saldo, :T08_Saldo, :T09_Saldo, :T10_Saldo,
     :T11_Saldo, :T12_Saldo, :T13_Saldo, :T14_Saldo, :T15_Saldo,
     :T16_Saldo, :T17_Saldo, :T18_Saldo, :T19_Saldo, :T20_Saldo,
     :Em_Terceiros,   :Saldo_Revisao, :Saldo_Estragado,
     :Estoque_Minimo, :ESTOQUE_SEGURANCA, :Oc_Aberto, :COR_CODIGO

DO SUSPEND;

END

END
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER procedure SPC_ESTOQUE_TRANSACAO_ITEM (
    TRANSACAO_CONTROLE_1 integer)
returns (
    OPERACAO_CODIGO varchar(3),
    DEFEITO_CODIGO integer,
    PRODUTO_CODIGO integer,
    DESCRICAO varchar(100),
    UNIDADEMEDIDA_SIGLA varchar(3),
    GRADE_CODIGO integer,
    CONTROLE integer,
    QUANTIDADE numeric(10,5),
    T01 numeric(10,5),
    T02 numeric(10,5),
    T03 numeric(10,5),
    T04 numeric(10,5),
    T05 numeric(10,5),
    T06 numeric(10,5),
    T07 numeric(10,5),
    T08 numeric(10,5),
    T09 numeric(10,5),
    T10 numeric(10,5),
    T11 numeric(10,5),
    T12 numeric(10,5),
    T13 numeric(10,5),
    T14 numeric(10,5),
    T15 numeric(10,5),
    T16 numeric(10,5),
    T17 numeric(10,5),
    T18 numeric(10,5),
    T19 numeric(10,5),
    T20 numeric(10,5),
    CONSUMO char(1),
    CUSTO_UNITARIO numeric(10,5),
    LOCALIZACAO_CODIGO integer,
    PRODUTO_LOCALIZACAO_CODIGO integer,
    MODELO_CODIGO integer,
    OPERACAO_TIPO char(1),
    DEFEITO_DESCRICAO varchar(30))
as
BEGIN
FOR Select A.operacao_codigo, A.defeito_codigo, A.produto_codigo, B.Descricao,
       B.unidademedida_sigla2, B.grade_codigo, A.controle, A.quantidade,
       A.t01, A.t02, A.t03, A.t04, A.t05, A.t06, A.t07, A.t08, A.t09, A.t10,
       A.t11, A.t12, A.t13, A.t14, A.t15, A.t16, A.t17, A.t18, A.t19, A.t20,
       A.Consumo, A.Custo_Unitario, A.Localizacao_Codigo, B.Localizacao_Codigo,
       B.Modelo_Codigo,
      (Select C.Tipo From TbOperacao C Where A.Operacao_Codigo = C.Codigo) Operacao_Tipo,
      (Select C.Descricao From TbSac_Defeito C Where A.defeito_codigo = C.Codigo) Defeito_Descricao
from TbEstoque_Transacao_Item A, TbProduto B
Where A.Produto_Codigo = B.Codigo
  and A.transacao_controle = :TRANSACAO_CONTROLE_1
Order By a.controle
INTO
   :operacao_codigo,
   :defeito_codigo,
   :produto_codigo,
   :descricao,
   :unidademedida_sigla,
   :grade_codigo,
   :controle,
   :quantidade,
   :t01, :t02, :t03, :t04, :t05, :t06, :t07, :t08, :t09, :t10,
   :t11, :t12, :t13, :t14, :t15, :t16, :t17, :t18, :t19, :t20,
   :Consumo,
   :Custo_Unitario,
   :Localizacao_Codigo,
   :Produto_Localizacao_Codigo,
   :Modelo_Codigo,
   :Operacao_Tipo,
   :Defeito_Descricao
DO SUSPEND;
END
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER procedure SPC_FORM_PRODUTO3 (
    FAMILIA_CODIGO_T integer,
    FAMILIA_CODIGO_1 integer,
    CLASS integer,
    PATRIMONIO char(1),
    DESCRICAO_1 varchar(100))
returns (
    CODIGO integer,
    DESCRICAO varchar(100),
    UNIDADEMEDIDA_SIGLA char(3),
    GRADE_CODIGO integer,
    MODELO_CODIGO integer,
    LOCALIZACAO_CODIGO integer,
    FAMILIA_DESCRICAO varchar(20))
as
BEGIN
FOR Select A.CODIGO, A.DESCRICAO, A.UNIDADEMEDIDA_SIGLA2, A.GRADE_CODIGO,
           A.MODELO_CODIGO, A.LOCALIZACAO_CODIGO, B.DESCRICAO
From TbProduto A, TbFamilia B
Where A.Status = 1
  and(A.Familia_Codigo >= :FAMILIA_CODIGO_T or
      A.Familia_Codigo  = :FAMILIA_CODIGO_1)
  and A.Familia_Codigo = B.Codigo
  And B.Classificacao = :CLASS
  AND B.CONTROLE_PATRIMONIO LIKE :PATRIMONIO
  and A.Descricao like :Descricao_1
Order by A.Descricao
INTO
   :CODIGO,
   :DESCRICAO,
   :UNIDADEMEDIDA_SIGLA,
   :GRADE_CODIGO,
   :MODELO_CODIGO,
   :LOCALIZACAO_CODIGO,
   :FAMILIA_DESCRICAO
DO SUSPEND;
END
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER procedure SPC_FORM_PRODUTO_COR (
    DESCRICAO_1 varchar(100),
    MODELO_1 integer,
    MODELO_2 integer)
returns (
    DESCRICAO varchar(100),
    CODIGO integer,
    UNIDADEMEDIDA_SIGLA char(3),
    GRADE_CODIGO integer,
    MODELO_CODIGO integer,
    LOCALIZACAO_CODIGO integer,
    FAMILIA_DESCRICAO varchar(20))
as
BEGIN
FOR Select
Distinct(Trim(Replace(A.Descricao,C.Descricao,''))), 0,
A.UNIDADEMEDIDA_SIGLA2, A.GRADE_CODIGO, A.FAMILIA_CODIGO, A.LOCALIZACAO_CODIGO,
--NO CAMPO MODELO_CODIGO SERA VISUALIZADO O VALOR DO CAMPO FAMILIA_CODIGO
--PARA SER USADO EXCLUSIVAMENTE NO FORM 3.16 (CAD.PROD.POR COR)
(Select C.Descricao From TbFamilia C Where C.Codigo = A.Familia_Codigo)

From TbProduto A, TbCor C
Where A.Descricao like :Descricao_1
and A.Cor_Codigo = C.Codigo
and A.Modelo_Codigo between :Modelo_1 and :Modelo_2

and Character_length(Trim(Replace(A.Descricao,C.Descricao,''))) > 0

Order by 1
INTO
   :DESCRICAO,
   :CODIGO,
   :UNIDADEMEDIDA_SIGLA,
   :GRADE_CODIGO,
   :MODELO_CODIGO,
   :LOCALIZACAO_CODIGO ,
   :FAMILIA_DESCRICAO
DO SUSPEND;
END
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER procedure SPC_FORM_PRODUTO_COR2 (
    DESCRICAO_1 varchar(100),
    MODELO_1 integer,
    MODELO_2 integer)
returns (
    DESCRICAO varchar(100),
    CODIGO integer,
    UNIDADEMEDIDA_SIGLA char(3),
    FAMILIA_CODIGO integer,
    GRADE_CODIGO integer,
    MODELO_CODIGO integer,
    LOCALIZACAO_CODIGO integer,
    FAMILIA_DESCRICAO varchar(20))
as
BEGIN
FOR Select
Distinct(Trim(Replace(A.Descricao,C.Descricao,''))), 0,
A.UNIDADEMEDIDA_SIGLA2, A.FAMILIA_CODIGO, A.GRADE_CODIGO, A.MODELO_CODIGO, A.LOCALIZACAO_CODIGO,
(Select C.Descricao From TbFamilia C Where C.Codigo = A.Familia_Codigo)

From TbProduto A, TbCor C
Where A.Descricao like :Descricao_1
and A.Cor_Codigo = C.Codigo
and A.Modelo_Codigo between :Modelo_1 and :Modelo_2
and Character_length(Trim(Replace(A.Descricao,C.Descricao,''))) > 0

Order by 1
INTO
   :DESCRICAO,
   :CODIGO,
   :UNIDADEMEDIDA_SIGLA,
   :FAMILIA_CODIGO,
   :GRADE_CODIGO,
   :MODELO_CODIGO,
   :LOCALIZACAO_CODIGO ,
   :FAMILIA_DESCRICAO
DO SUSPEND;
END
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER procedure SPC_FORTES_NFE (
    ESTABELECIMENTO integer,
    DATA_INICIAL date,
    DATA_FINAL date)
returns (
    CONTEUDO varchar(1000))
as
declare variable CONT1 varchar(1000);
declare variable CONT2 varchar(1000);
declare variable CONTADOR integer;
declare variable NFE_ID integer;
begin

  CONTADOR = 1;
  Conteudo = 'CAB'||
             '|'||'71'|| /* VERSAO */
             '|GCWeb'||
             '|'||EXTRACT(YEAR FROM CURRENT_DATE)||LPAD(EXTRACT(MONTH FROM CURRENT_DATE),2,'0')||LPAD(EXTRACT(DAY FROM CURRENT_DATE),2,'0')||
             '|'||COALESCE((SELECT VALOR_EXT FROM TBCONTROLE_N WHERE ID = 133),'')||  /* GRUPO EMPRESARIAL */
             '|'||EXTRACT(YEAR FROM DATA_INICIAL)||LPAD(EXTRACT(MONTH FROM DATA_INICIAL),2,'0')||LPAD(EXTRACT(DAY FROM DATA_INICIAL),2,'0')||
             '|'||EXTRACT(YEAR FROM DATA_FINAL)||LPAD(EXTRACT(MONTH FROM DATA_FINAL),2,'0')||LPAD(EXTRACT(DAY FROM DATA_FINAL),2,'0')||
             '|ENTRADAS COM PRODUTOS'||
             '|N';
  SUSPEND;

/*
        SELECT
        'PAR'||
        '|'||Empresa_Codigo||
        '|'||RazaoSocial||
        '|'||UF||
        '|'||Cnpj||
        '|'||IE||
        '|'||coalesce(Im,'')||
        '|N||||N||N|N|' ||
        '|'||Endereco||
        '|'||Numero||
        '|'||coalesce(Complemento,'')||
        '|01|'||Bairro||
        '|'||Cep||
        '|'||FN_LPAD(Codigo_Ibge,5,'0')||
        '|||||||'||
        IIF(UF<>'EX','1058',FN_LPAD(Codigo_Pais,4,'0'))
        FROM (
                SELECT 
                DISTINCT 
                IIF((A.CNPJ = '00000000000000' or A.CNPJ = '') and (A.UF <> 'EX'), B.EMPRESA_CNPJ, B.EMPRESA_CODIGO) as EMPRESA_CODIGO,
                B.EMPRESA_CNPJ AS CNPJ, 
                A.IE, 
                B.SUFRAMA,
                A.COMPLEMENTO, 
                A.IM,
                (SELECT First 1 E.PAIS_CODIGO FROM TBCIDADE E WHERE MAX(B.EMPRESA_CIDADE) = E.DESCRICAO AND MAX(B.EMPRESA_UF) = E.UF) Codigo_Pais,
                (SELECT First 1 E.CODIGOIBGE  FROM TBCIDADE E WHERE MAX(B.EMPRESA_CIDADE) = E.DESCRICAO AND MAX(B.EMPRESA_UF) = E.UF) Codigo_Ibge,
                MAX(B.EMPRESA_UF) AS UF,
                MAX(B.EMPRESA_RAZAOSOCIAL) AS RAZAOSOCIAL,
                MAX(B.EMPRESA_BAIRRO) AS BAIRRO,
                MAX(B.EMPRESA_ENDERECO) AS ENDERECO,
                MAX(B.EMPRESA_NUMERO) AS NUMERO,
                MAX(B.EMPRESA_CEP) AS CEP
                
                FROM TbNfs B, TBEMPRESA A
                
                WHERE  B.EMPRESA_CODIGO = A.CODIGO
                  AND B.sped = '1'
                  AND B.NATUREZA = 1
                  AND B.situacao = 2
                  AND B.estabelecimento_codigo = :ESTABELECIMENTO
                  and(Extract(Year  from B.Data_Emissao) = :ANO)
                  and(Extract(Month from B.Data_Emissao) = :MES)
                
                Group By
                A.CNPJ,A.UF,B.EMPRESA_CNPJ,B.EMPRESA_CODIGO,
                B.EMPRESA_CNPJ,A.IE,B.SUFRAMA,A.COMPLEMENTO,A.IM
                
                Order By 1
             )

        SELECT
        'PRO'||
        '|'||FN_LPAD(CODIGO,8,'0')||
        '|'||FN_RPAD(DESCRICAO,60,' ')||
        '|'||FN_LPAD(CODIGO,8,'0')||
        '|'||NCM2||
        '|'||UNIDADEMEDIDA_SIGLA2||
        '|'||IIF( UNID = '1' , 'LT'  ,
             IIF( UNID = '2' , 'MT'  ,
             IIF( UNID = '3' , 'M3'  ,
             IIF( UNID = '4' , 'M2'  ,
             IIF( UNID = '5' , 'PR'  ,
             IIF( UNID = '6' , 'KG'  ,
             IIF( UNID = '7' , 'KW'  ,
             IIF( UNID = '8' , 'UN'  , '')))))))) ||
        '|||001|00||' AS PRO,
        
        'OUM'||
        '|'||FN_LPAD(CODIGO,8,'0')||
        '|'||UNIDADEMEDIDA_SIGLA||
        '|1.000' AS OUM
        FROM (
                SELECT DISTINCT
                       C.CODIGO,
                       C.DESCRICAO,
                       C.UNIDADEMEDIDA_SIGLA2,
                       C.NCM_CODIGO NCM2,
                      (SELECT FIRST 1 E.UNID_DIEF FROM TBFAMILIA_FICHA E
                        WHERE C.FAMILIA_CODIGO = E.FAMILIA_CODIGO
                          AND E.ESTABELECIMENTO_CODIGO = B.ESTABELECIMENTO_CODIGO) UNID
                FROM TBNFS_ITEM A, TBNFS B, TBPRODUTO C
                WHERE A.NFS_CONTROLE = B.CONTROLE
                  AND C.CODIGO = A.PRODUTO_CODIGO
                  AND B.SPED = '1'
                
                  AND ((B.NATUREZA = 1 AND B.SITUACAO = 2) OR
                       (B.NATUREZA = 2 AND B.SITUACAO = 1 AND B.EMPRESA_UF <> 'EX'))
                
                  AND B.ESPECIE IN('01','1B','04','55')
                  AND B.ESTABELECIMENTO_CODIGO = :ESTABELECIMENTO
                  AND   (EXTRACT(YEAR  FROM B.DATA_EMISSAO) = :ANO)
                  AND   (EXTRACT(MONTH FROM B.DATA_EMISSAO) = :MES)
        
                ORDER BY 1
             )
   */

     /* EMPRESAS */
        FOR
        SELECT
        'PAR'||
        '|'||EMPRESA_CODIGO||
        '|'||RAZAOSOCIAL||
        '|'||UF||
        '|'||CNPJ||
        '|'||IE||
        '|'||COALESCE(IM,'')||
        '|N'||
        '|N'||
        '|N'||
        '|N'||
        '|N'||
        '|N'||
        '|N'||
        '|N'||
        '|'|| -- tipo logradouro
        '|'||ENDERECO||
        '|'||NUMERO||
        '|'||COALESCE(COMPLEMENTO,'')||
        '|01'|| -- tipo de bairro
        '|'||BAIRRO||
        '|'||CEP||
        '|'||FN_LPAD(CODIGO_IBGE,5,'0')||
        '|'||  -- ddd
        '|'||  -- telefone
        '|N'|| -- suframa
        '|'||  -- subst. icms
        '|'||  -- conta remetente
        '|'||  -- conta prestador
        '|'||IIF(UF<>'EX','1058',FN_LPAD(CODIGO_PAIS,4,'0'))||
        '|'||IIF(UF<>'EX','N','S')||
        '|N'||
        '|'||EMAIL

        FROM (
                SELECT DISTINCT
                CAST(B.EMPRESA_CODIGO AS VARCHAR(14)) AS EMPRESA_CODIGO, 
                A.UF, A.CNPJ, A.IE, A.RAZAOSOCIAL, 
                A.COMPLEMENTO, A.BAIRRO, A.ENDERECO, A.NUMERO, A.CEP, A.IM,
                (SELECT E.PAIS_CODIGO FROM TBCIDADE E WHERE 
                  A.CIDADE = E.DESCRICAO AND A.UF = E.UF) CODIGO_PAIS,
                (SELECT E.CODIGOIBGE  FROM TBCIDADE E WHERE 
                  A.CIDADE = E.DESCRICAO AND A.UF = E.UF) CODIGO_IBGE,
                  A.EMAIL
                FROM TBNFE B, TBEMPRESA A
                WHERE B.EMPRESA_CODIGO = A.CODIGO
                  AND B.SPED = '1'
                  AND ((B.NATUREZA = 1 AND B.SITUACAO = 2) OR
                       (B.NATUREZA = 2 AND B.SITUACAO = 1))
                  AND B.ESTABELECIMENTO_CODIGO = :ESTABELECIMENTO
                  AND B.DATA_FISCAL BETWEEN :DATA_INICIAL AND :DATA_FINAL
                ORDER BY 1
        
             )
        INTO :CONT1
        DO BEGIN
           CONTADOR = CONTADOR + 1;
           CONTEUDO = CONT1;
           SUSPEND;
           END

     /* GRUPOS / FAMILIAS */
          FOR
            SELECT
            'GRP'||
            '|'||FN_LPAD(CODIGO,8,'0')||
            '|'||DESCRICAO||
            '|'||IIF( SIT_SPED = '00' , '1'  ,
                 IIF( SIT_SPED = '01' , '2'  ,
                 IIF( SIT_SPED = '02' , '5'  ,
                 IIF( SIT_SPED = '03' , '3'  ,
                 IIF( SIT_SPED = '04' , '4'  ,
                 IIF( SIT_SPED = '05' , '7'  ,
                 IIF( SIT_SPED = '06' , '7'  ,
                 IIF( SIT_SPED = '07' , '7'  ,
                 IIF( SIT_SPED = '08' , '7'  ,
                 IIF( SIT_SPED = '09' , '7'  ,
                 IIF( SIT_SPED = '10' , '7'  ,
                 IIF( SIT_SPED = '99' , '7'  , '')))))))))))) ||
            '|'||SIT_SPED||
            '|'
            FROM (
                    SELECT DISTINCT
                           F.CODIGO,
                           F.DESCRICAO,
                           COALESCE((SELECT FIRST 1 E.NG_SITUACAO FROM TBFAMILIA_FICHA E
                            WHERE C.FAMILIA_CODIGO = E.FAMILIA_CODIGO
                              AND E.ESTABELECIMENTO_CODIGO = B.ESTABELECIMENTO_CODIGO),'99') SIT_SPED
                    FROM TBNFE_ITEM A, TBNFE B, TBPRODUTO C, TBFAMILIA F
                    WHERE A.NFE_CONTROLE = B.CONTROLE
                      AND C.CODIGO = A.PRODUTO_CODIGO
                      AND B.SPED = '1'
                      AND ((B.NATUREZA = 1 AND B.SITUACAO = 2) OR
                           (B.NATUREZA = 2 AND B.SITUACAO = 1 AND B.EMPRESA_UF <> 'EX'))
                      AND B.ESPECIE IN('01','1B','04','55')
                      AND C.FAMILIA_INVENTARIO = F.CODIGO
                      AND B.ESTABELECIMENTO_CODIGO = :ESTABELECIMENTO
                      AND B.DATA_FISCAL BETWEEN :DATA_INICIAL AND :DATA_FINAL
                 )
        INTO :CONT1 
        DO BEGIN
           CONTADOR = CONTADOR + 1;
           CONTEUDO = CONT1;
           SUSPEND;
           END


     /* UNIDADES DE MEDIDA */
          FOR
            SELECT
            'UND'||
            '|'||UM||
            '|'||FN_RPAD(DESCRICAO,60,' ')
            FROM (
                    SELECT DISTINCT
                           C.UNIDADEMEDIDA_SIGLA2 AS UM,
                           U.DESCRICAO
                    FROM TBNFE_ITEM A, TBNFE B, TBPRODUTO C, TbUnidadeMedida U
                    WHERE A.NFE_CONTROLE = B.CONTROLE
                      AND C.CODIGO = A.PRODUTO_CODIGO
                      AND C.UNIDADEMEDIDA_SIGLA2 = U.SIGLA
                      AND B.SPED = '1'
                      AND ((B.NATUREZA = 1 AND B.SITUACAO = 2) OR
                           (B.NATUREZA = 2 AND B.SITUACAO = 1 AND B.EMPRESA_UF <> 'EX'))
                      AND B.ESPECIE IN('01','1B','04','55')
                      AND B.ESTABELECIMENTO_CODIGO = :ESTABELECIMENTO
                      AND B.DATA_FISCAL BETWEEN :DATA_INICIAL AND :DATA_FINAL
                 )
        INTO :CONT1
        DO BEGIN
           CONTADOR = CONTADOR + 1;
           CONTEUDO = CONT1;
           SUSPEND;
           END




     /* PRODUTO */
          FOR
            SELECT
            'PRO'||
            '|'||FN_LPAD(CODIGO,8,'0')||
            '|'||DESCRICAO||
            '|'||FN_LPAD(CODIGO,8,'0')||
            '|'||NCM||
            '|'||UM||
            '|'||UNID_DIEF||
            '|'||
            '|'||
            '|'||FN_LPAD(FAMILIA,8,'0')||
            '|'||
            '|'||
            '|'||
            '|'||
            '|'||CST_ORIGEM_PADRAO||CST_ICMS_PADRAO||
            '|'||'49'||
            '|'||CST_PISCOFINS_PADRAO||
            '|'||CST_PISCOFINS_PADRAO||
            '|'||
            '|'||
            '|'||
            '|'||
            '|'||
            '|'||'N'||
            '|'  AS PRO,

            'OUM'||
            '|'||FN_LPAD(CODIGO,8,'0')||
            '|'||UM||
            '|'||'1.000'||
            '|' -- COD BARRAS
                   AS OUM

            FROM (
                    SELECT DISTINCT
                           C.CODIGO,
                           C.DESCRICAO,
                           C.UNIDADEMEDIDA_SIGLA2 AS UM,
                           C.NCM_CODIGO AS NCM,
                           C.FAMILIA_INVENTARIO AS FAMILIA,

                          COALESCE((SELECT FIRST 1 E.UNID_DIEF FROM TBFAMILIA_FICHA E
                            WHERE C.FAMILIA_CODIGO = E.FAMILIA_CODIGO
                              AND E.ESTABELECIMENTO_CODIGO = B.ESTABELECIMENTO_CODIGO),'8') UNID_DIEF,
                          COALESCE((SELECT FIRST 1 E.CST_ORIGEM FROM TBFAMILIA_FICHA E
                            WHERE C.FAMILIA_CODIGO = E.FAMILIA_CODIGO
                              AND E.ESTABELECIMENTO_CODIGO = B.ESTABELECIMENTO_CODIGO),'0') CST_ORIGEM_PADRAO,
                          COALESCE((SELECT FIRST 1 E.CST FROM TBFAMILIA_FICHA E
                            WHERE C.FAMILIA_CODIGO = E.FAMILIA_CODIGO
                              AND E.ESTABELECIMENTO_CODIGO = B.ESTABELECIMENTO_CODIGO),'90') CST_ICMS_PADRAO,
                          COALESCE((SELECT FIRST 1 E.CST_PISCOF FROM TBFAMILIA_FICHA E
                            WHERE C.FAMILIA_CODIGO = E.FAMILIA_CODIGO
                              AND E.ESTABELECIMENTO_CODIGO = B.ESTABELECIMENTO_CODIGO),'98') CST_PISCOFINS_PADRAO

                    FROM TBNFE_ITEM A, TBNFE B, TBPRODUTO C
                    WHERE A.NFE_CONTROLE = B.CONTROLE
                      AND C.CODIGO = A.PRODUTO_CODIGO
                      AND B.SPED = '1'
                      AND ((B.NATUREZA = 1 AND B.SITUACAO = 2) OR
                           (B.NATUREZA = 2 AND B.SITUACAO = 1 AND B.EMPRESA_UF <> 'EX'))
                      AND B.ESPECIE IN('01','1B','04','55')
                      AND B.ESTABELECIMENTO_CODIGO = :ESTABELECIMENTO
                      AND B.DATA_FISCAL BETWEEN :DATA_INICIAL AND :DATA_FINAL
                    ORDER BY 1
                 )
        INTO :CONT1, :CONT2
        DO BEGIN
           CONTADOR = CONTADOR + 1;
           CONTEUDO = CONT1;
           SUSPEND;

           CONTADOR = CONTADOR + 1;
           CONTEUDO = CONT2;
           SUSPEND;
           END


        /* NOTAS DE ENTRADA */
            FOR
                SELECT
                'NFM'||
                '|'||LPAD(ESTABELECIMENTO_ID,4,'0')||
                '|'||'E'||
                '|'||DESCRICAO_ESPECIE||
                '|'||IIF(NATUREZA=1,'S','N')||
                '|'|| --AIDF
                '|'||SERIE||
                '|'||
                '|'||LPAD(NUMERO_NOTAFISCAL,9,'0')||
                '|'||
                '|'||
                '|'||EXTRACT(YEAR FROM DATA_EMISSAO)||LPAD(EXTRACT(MONTH FROM DATA_EMISSAO),2,'0')||LPAD(EXTRACT(DAY FROM DATA_EMISSAO),2,'0')||
                '|'||-- situação do documento, informado só pra saída   IIF(SITUACAO=3,'1','0')||
                '|'||EXTRACT(YEAR FROM DATA_FISCAL)||LPAD(EXTRACT(MONTH FROM DATA_FISCAL),2,'0')||LPAD(EXTRACT(DAY FROM DATA_FISCAL),2,'0')||
                '|'||EMPRESA_ID||
                '|'||'N'||
                '|'||
                '|'||
                '|'||
                '|'||
                '|'||
                '|'||
                '|'||
                '|'||
                '|'||

                '|'||CAST(VALOR_PRODUTOS AS NUMERIC(15,2))||
                '|'||CAST(VALOR_FRETE AS NUMERIC(15,2))||
                '|'||CAST(VALOR_SEGURO AS NUMERIC(15,2))||
                '|'||CAST(VALOR_OUTROSCUSTOS AS NUMERIC(15,2))||
                '|'||0.00|| /* icms importação */
                '|'||0.00|| /* icms diferido */
                '|'||CAST(VALOR_IPI AS NUMERIC(15,2))||
                '|'||0.00||/* icms subst retido */
                '|'||CAST(VALOR_ISSQN AS NUMERIC(15,2))||
                '|'||CAST(VALOR_DESCONTO AS NUMERIC(15,2))||
                '|'||CAST(VALOR_TOTAL_NF AS NUMERIC(15,2))||
                '|'||LPAD(ITENS,10,'0')||
                '|'||'N'||
                '|'||'N'||
                '|'||'N'||
                '|'||
                '|'||
                '|'||
                '|'||'N'||
                '|'||
                '|'||
                '|'||

                '|'||'N'||--FRETE||
                '|'||'N'||--PAGAMENTO||
                '|'||
                '|'||

                '|'||
                '|'||
                '|'||
                '|'||
                '|'||
                '|'||
                '|'||
                '|'||
                '|'||CAST(RETENCAO_VALOR_COFINS AS NUMERIC(15,2))||
                '|'||CAST(RETENCAO_VALOR_PIS AS NUMERIC(15,2))||
                '|'||CAST(RETENCAO_VALOR_CSLL AS NUMERIC(15,2))||
                '|'||
                '|'||'N'||
                '|'||
                '|'||
                '|'||CHAVE_ACESSO||
                '|'||
                '|'||

                '|'||
                '|'||
                '|'||
                '|'||
                '|'||
                '|'||
                '|'||
                '|'||
                '|'||
                '|'

                ,NFE_ID
                
                FROM (
                        SELECT B.CONTROLE NFE_ID,
                               B.ESTABELECIMENTO_CODIGO AS ESTABELECIMENTO_ID,
                               B.EMPRESA_CODIGO AS EMPRESA_ID,
                               B.ESPECIE,
                               B.MODELO,
                               B.SERIE,
                               B.NUMERO_NOTAFISCAL,
                               B.CHAVE_ACESSO,
                               B.DATA_EMISSAO,
                               B.DATA_FISCAL,
                               B.NATUREZA,
                               B.SITUACAO,
                               MAX((SELECT MAX(E.XML) FROM TBNF_LOTE E WHERE B.CONTROLE = E.NFE_CONTROLE AND E.NFS_CONTROLE = 0 AND B.ESTABELECIMENTO_CODIGO = E.ESTABELECIMENTO_CODIGO)) XML,
                              (SELECT FIRST 1 D.FRETE FROM TBNFE_TRANSPORTADORA D WHERE  D.NFE_CONTROLE = B.CONTROLE) AS FRETE,
                              (SELECT FIRST 1 G.DESCRICAO_RESUMIDA FROM TBFISCAL_ESPECIE G WHERE B.MODELO = G.CODIGO_DIEF AND B.ESPECIE = G.CODIGO_SPED) DESCRICAO_ESPECIE,
                               COALESCE(IIF((SELECT CAST(COUNT(P.PARCELA) AS INTEGER) FROM TBNFE_PARCELAMENTO P WHERE B.CONTROLE = P.NFE_CONTROLE) > 0, '1' /*PRAZO*/, '2'/*OUTROS*/),'2') AS PAGAMENTO,
                        
                               COUNT(A.CONTROLE) AS ITENS,
                               SUM(A.VALOR_DESCONTO) AS VALOR_DESCONTO,
                               SUM(A.VALOR_PEDAGIO) AS VALOR_PEDAGIO,
                               SUM(A.VALOR_FRETE) AS VALOR_FRETE,
                               SUM(A.VALOR_SEGURO) AS VALOR_SEGURO,
                               SUM(A.FISCAL_BASECALCULO_ICMS_ST) basecalculo_icms_subst,
                               SUM(A.FISCAL_VALOR_ICMS_ST) valor_icms_subst,
                               SUM(A.VALOR_TOTAL) VALOR_PRODUTOS,
                               SUM(A.VALOR_CONTABIL) VALOR_CONTABIL,
                               SUM(A.VALOR_BASECALCULO_ICMS) BASECALCULO_ICMS,
                               SUM(A.FISCAL_VALOR_ICMS) VALOR_ICMS,
                               SUM(A.FISCAL_VALOR_IPI) VALOR_IPI,
                               SUM(A.FISCAL_VALOR_PIS) VALOR_PIS,
                               SUM(A.FISCAL_VALOR_COFINS) VALOR_COFINS,
                               SUM(A.FISCAL_BASECALCULO_IPI) AS BASECALCULO_IPI,
                               SUM(A.VALOR_ACRESCIMO) AS VALOR_ACRESCIMO,
                        
                               C.VALOR_OUTROSCUSTOS,
                               C.VALOR_TOTAL_NF,
                               C.VALOR_ISSQN,
                               C.RETENCAO_VALOR_ISSQN,
                               C.RETENCAO_VALOR_COFINS,
                               C.RETENCAO_VALOR_PIS,
                               C.RETENCAO_VALOR_CSLL,
                               C.RETENCAO_VALOR_IRRF,
                               C.RETENCAO_VALOR_INSS
                        
                        FROM TBNFE_ITEM A, TBNFE B, TBNFE_TOTAIS C
                        WHERE  A.NFE_CONTROLE = B.CONTROLE
                          AND  C.NFE_CONTROLE = B.CONTROLE
                          AND  B.SPED = '1'
                          AND ((B.NATUREZA = 1 AND B.SITUACAO > 1) OR (B.NATUREZA = 2 AND B.SITUACAO = 1))
                          AND  B.ESPECIE IN('01','1B','55')
                          AND  B.ESTABELECIMENTO_CODIGO = :ESTABELECIMENTO
                          AND  B.DATA_FISCAL BETWEEN :DATA_INICIAL AND :DATA_FINAL

                        GROUP BY
                        B.CONTROLE, B.ESTABELECIMENTO_CODIGO, B.EMPRESA_CODIGO, B.ESPECIE,
                        B.SERIE, B.NUMERO_NOTAFISCAL, B.CHAVE_ACESSO, B.DATA_EMISSAO,
                        B.DATA_FISCAL, B.NATUREZA, B.SITUACAO, C.VALOR_OUTROSCUSTOS,
                        C.VALOR_TOTAL_NF, C.VALOR_ISSQN, B.MODELO, C.RETENCAO_VALOR_ISSQN,
                        C.RETENCAO_VALOR_COFINS, C.RETENCAO_VALOR_PIS, C.RETENCAO_VALOR_CSLL,
                        C.RETENCAO_VALOR_IRRF, C.RETENCAO_VALOR_INSS
                )
        INTO :CONT1, :NFE_ID
        DO BEGIN
           CONTADOR = CONTADOR + 1;
           CONTEUDO = CONT1;
           SUSPEND;







       /* ITENS DAS NOTAS FISCAIS DE ENTRADA */
             FOR
                SELECT
                'PNM'||
                '|'||LPAD(PRODUTO_CODIGO,8,'0')||
                '|'||REPLACE(FISCAL_CFOP_CODIGO,'.','')||
                '|'||
                '|'||FISCAL_TRIBUTACAO_ORIGEM||
                '|'||LPAD(FISCAL_TRIBUTACAO_ICMS,2,'0')||
                '|'||PRODUTO_UNIDADEMEDIDA||
                '|'||CAST(QUANTIDADE AS NUMERIC(15,2))||
                '|'||CAST(VALOR_TOTAL AS NUMERIC(15,2))||
                '|'||CAST(FISCAL_VALOR_IPI AS NUMERIC(15,2))||
                '|'||IIF(FISCAL_TRIBUTACAO_ICMS =  0, '1',
                     IIF(FISCAL_TRIBUTACAO_ICMS = 20, '1',
                     IIF(FISCAL_TRIBUTACAO_ICMS = 30, '2',
                     IIF(FISCAL_TRIBUTACAO_ICMS = 40, '2',
                     IIF(FISCAL_TRIBUTACAO_ICMS = 41, '2','3')))))||
                '|'||CAST(BASECALCULO_ICMS_R AS NUMERIC(15,2))||
                '|'||CAST(FISCAL_PERCENTUAL_ICMS AS NUMERIC(15,2))||
                '|'||
                '|'||
                '|'||'0'||
                '|'||
                '|'||
                '|'||
                '|'||
                '|'||
                '|'||
                '|'||
                '|'||
                '|'||
                '|'||
                '|'||
                '|'||
                '|'||
                '|'||
                '|'||

                '|'||IIF(FISCAL_TRIBUTACAO_IPI ='00','1',
                     IIF(FISCAL_TRIBUTACAO_IPI ='01','1',
                     IIF(FISCAL_TRIBUTACAO_IPI ='02','2',
                     IIF(FISCAL_TRIBUTACAO_IPI ='03','2',
                     IIF(FISCAL_TRIBUTACAO_IPI ='04','3',
                     IIF(FISCAL_TRIBUTACAO_IPI ='05','3',
                     IIF(FISCAL_TRIBUTACAO_IPI ='49','3','3')))))))||
                '|'||CAST(FISCAL_BASECALCULO_IPI AS NUMERIC(15,2))||
                '|'||CAST(FISCAL_PERCENTUAL_IPI AS NUMERIC(15,2))||
                '|'||CAST(FISCAL_VALOR_IPI AS NUMERIC(15,2))||
                '|'||FISCAL_TRIBUTACAO_IPI||

                '|'|| -- FISCAL_TRIBUTACAO_COFINS||
                '|'|| -- FISCAL_TRIBUTACAO_PIS||

                '|'||CAST(FISCAL_BASECALCULO_COFINS AS NUMERIC(15,2))||
                '|'||CAST(FISCAL_BASECALCULO_PIS AS NUMERIC(15,2))||

                '|'||CAST(VALOR_FRETE AS NUMERIC(15,2))||
                '|'||CAST(VALOR_SEGURO AS NUMERIC(15,2))||
                '|'||CAST(VALOR_DESCONTO AS NUMERIC(15,2))||
                '|'||CAST(VALOR_TOTAL+VALOR_FRETE+VALOR_SEGURO-VALOR_DESCONTO AS NUMERIC(15,2))||
                '|'||
                '|'||
                '|'||
                '|'||
                '|'||
                '|'||
                '|'||'1'||
                '|'||
                '|'||
                '|'||
                '|'||'1'||
                '|'||
                '|'||
                '|'||
                '|'||
                '|'||
                '|'||
                '|'||
                '|'||
                '|'||'0'
                FROM (
                        SELECT B.SEQUENCIA,
                               B.PRODUTO_CODIGO,
                               B.FISCAL_CFOP_CODIGO,
                               B.FISCAL_TRIBUTACAO_ORIGEM, 
                               B.PRODUTO_UNIDADEMEDIDA,
                               B.QUANTIDADE,
                               B.VALOR_TOTAL, 
                               B.FISCAL_TRIBUTACAO_ICMS,
                               B.VALOR_BASECALCULO_ICMS AS BASECALCULO_ICMS_R,
                               B.FISCAL_PERCENTUAL_ICMS,
                               B.FISCAL_TRIBUTACAO_IPI,
                               B.FISCAL_BASECALCULO_IPI,
                               B.FISCAL_PERCENTUAL_IPI,
                               B.FISCAL_VALOR_IPI, 
                               B.FISCAL_TRIBUTACAO_COFINS,
                               B.FISCAL_BASECALCULO_COFINS,
                               B.FISCAL_TRIBUTACAO_PIS,
                               B.FISCAL_BASECALCULO_PIS,
                               B.VALOR_FRETE,
                               B.VALOR_SEGURO,
                               B.VALOR_DESCONTO,
                               B.VALOR_CONTABIL 
                        
                        FROM TBNFE_ITEM B
                        WHERE B.NFE_CONTROLE = :NFE_ID
                        ORDER BY 1
                 )
                INTO :CONT1
                DO BEGIN
                   CONTADOR = CONTADOR + 1;
                   CONTEUDO = CONT1;
                   SUSPEND;
                   END


                 /* TOTALIZADORES DA NF POR CFOP */
                  FOR
                    SELECT
                    'INM'||
                    '|'||CAST(VALOR AS NUMERIC(15,2))||
                    '|'||EMPRESA_UF||
                    '|'||REPLACE(FISCAL_CFOP_CODIGO,'.','')||
                    '|'||
                    '|'||CAST(BASECALCULO_ICMS_R AS NUMERIC(15,2))||
                    '|'||CAST(FISCAL_PERCENTUAL_ICMS AS NUMERIC(15,2))||
                    '|'||CAST(VALOR_ICMS AS NUMERIC(15,2))||
                    '|'||CAST(iICMS AS NUMERIC(15,2))||
                    '|'||CAST(oICMS AS NUMERIC(15,2))||
                    
                    '|'||CAST(BcIPI AS NUMERIC(15,2))||
                    '|'||CAST(VALOR_IPI AS NUMERIC(15,2))||
                    '|'||CAST(IIPI AS NUMERIC(15,2))||
                    '|'||CAST(oIPI AS NUMERIC(15,2))||
                    '|'||
                    '|'||
                    '|'||
                    '|'
                    
                    FROM (
                            SELECT 
                            A.FISCAL_CFOP_CODIGO,
                            E.EMPRESA_UF,
                            A.FISCAL_Percentual_Icms,
                            A.FISCAL_Percentual_Ipi,
                            A.FISCAL_Tributacao_Icms,
                            A.FISCAL_Tributacao_Ipi,
                            SUM(A.VALOR_TOTAL) VALOR,
                            SUM(A.FISCAL_VALOR_IPI) VALOR_IPI,
                            SUM(A.FISCAL_VALOR_ICMS) VALOR_ICMS,
                            SUM(A.FISCAL_BASECALCULO_ICMS) BCICMS,
                            SUM(A.FISCAL_BASECALCULO_IPI) BcIPI, 
                            SUM(A.FISCAL_ISENTAS_ICMS) IICMS,
                            SUM(A.FISCAL_ISENTAS_IPI) IIPI, 
                            SUM(A.FISCAL_OUTRAS_ICMS) OICMS,
                            SUM(A.FISCAL_OUTRAS_IPI) OIPI,
                            SUM(A.VALOR_BASECALCULO_ICMS) BASECALCULO_ICMS_R
                            
                            FROM TBNFE_ITEM A, TBNFE E
                            WHERE A.NFE_CONTROLE = E.CONTROLE
                              AND A.NFE_CONTROLE = :NFE_ID
                            
                            Group By 
                            A.FISCAL_CFOP_CODIGO,
                            E.EMPRESA_UF,
                            A.FISCAL_PERCENTUAL_ICMS,
                            A.FISCAL_PERCENTUAL_IPI, 
                            A.FISCAL_TRIBUTACAO_ICMS,
                            A.FISCAL_TRIBUTACAO_IPI
                    )
                INTO :CONT1
                DO BEGIN
                   CONTADOR = CONTADOR + 1;
                   CONTEUDO = CONT1;
                   SUSPEND;
                   END

       END


           /* FRETES */
             FOR
                SELECT
                'CTC'||
                '|'||LPAD(ESTABELECIMENTO_ID,4,'0')||
                '|'||'E'||
                '|'||DESCRICAO_ESPECIE||
                '|'||  
                '|'||SERIE||
                '|'||
                '|'||LPAD(NUMERO_NOTAFISCAL,9,'0')||
                '|'||
                '|'||EXTRACT(YEAR FROM DATA_EMISSAO)||LPAD(EXTRACT(MONTH FROM DATA_EMISSAO),2,'0')||LPAD(EXTRACT(DAY FROM DATA_EMISSAO),2,'0')||

                '|'||'0'|| -- Situação do Documento
                '|'||EXTRACT(YEAR FROM DATA_FISCAL)||LPAD(EXTRACT(MONTH FROM DATA_FISCAL),2,'0')||LPAD(EXTRACT(DAY FROM DATA_FISCAL),2,'0')||
                '|'||IIF(FRETE = 0, 'C',
                     IIF(FRETE = 1, 'F',
                     IIF(FRETE = 2, 'S',
                     IIF(FRETE = 3, 'S',
                     IIF(FRETE = 4, 'S',
                     IIF(FRETE = 9, 'S','S'))))))||
                '|'||EMPRESA_ID||
                '|'||
                '|'||REPLACE(FISCAL_CFOP_CODIGO,'.','')||
                '|'||CAST(VALOR_TOTAL_NF AS NUMERIC(15,2))||
                '|'||CAST(VALOR_BASECALCULO_ICMS AS NUMERIC(15,2))||
                '|'||CAST(FISCAL_PERCENTUAL_ICMS AS NUMERIC(15,2))||
                '|'||CAST(VALOR_ICMS AS NUMERIC(15,2))||

                '|'||CAST(VALOR_ISENTAS_ICMS AS NUMERIC(15,2))||
                '|'||CAST(VALOR_OUTRAS_ICMS  AS NUMERIC(15,2))||
                '|'||(SELECT UF FROM TBUF WHERE CODIGO_IBGE = SUBSTRING(CMUNINI FROM 1 FOR 2))||
                '|'||SUBSTRING(CMUNINI FROM 3 FOR 5)||
                '|'||(SELECT UF FROM TBUF WHERE CODIGO_IBGE = SUBSTRING(CMUNFIM FROM 1 FOR 2))||
                '|'||SUBSTRING(CMUNFIM FROM 3 FOR 5)||
                '|'||   -- DISTANCIA
                '|'||   -- QUANT. MERCADORIAS
                '|'||   -- UNID MEDIDA
                '|'||   -- FRETE CALCULADO

                '|'||   -- PLACA DO VEICULO
                '|'||   -- UF VEICULO
                '|'||   -- AIDF DO RMD
                '|'||   -- SERIE DO RMD
                '|'||   -- SUBSERIE DO RMD
                '|'||   -- NUMERO DO RMD
                '|'||'N'|| -- DIF ALIQUOTA (S/N)
                '|'||   -- BS CALC DIF ALIQUOTA
                '|'||   -- ALIQ ORIGEM
                '|'||   -- ALIQ INTERNA

                '|'||   -- RECEITA TRIBUTAVEL COFINS
                '|'||
                '|'||
                '|'||
                '|'||
                '|'||
                '|'||
                '|'||
                '|'||
                '|'||

                '|'||  -- CSL RETIDO NA FONTE
                '|'||
                '|'||
                '|'||'N'||
                '|'||FN_LPAD(FISCAL_TRIBUTACAO_ICMS,2,'0')|| -- CSTb ICMS
                '|'||IIF(DESCRICAO_ESPECIE='CTE',CHAVE_ACESSO,'')||
                '|'|| -- COD INF COMPLEMENTAR
                '|'||FISCAL_TRIBUTACAO_PIS||
                '|'||FISCAL_TRIBUTACAO_COFINS||
                '|'||

                '|'||IND_NAT_FRETE||
                '|'||
                '|'||
                '|'||
                '|'||
                '|'

                FROM (
                        SELECT B.CONTROLE NFE_ID,
                               B.ESTABELECIMENTO_CODIGO AS ESTABELECIMENTO_ID,
                               B.EMPRESA_CODIGO AS EMPRESA_ID,
                               B.ESPECIE,
                               B.MODELO,
                               B.SERIE,
                               B.NUMERO_NOTAFISCAL,
                               B.CHAVE_ACESSO,
                               B.DATA_EMISSAO,
                               B.DATA_FISCAL,
                               B.NATUREZA,
                               B.SITUACAO,
                               D.FRETE,
                               D.CMUNINI,
                               D.CMUNFIM,
                               D.IND_NAT_FRETE,
                              (SELECT FIRST 1 G.DESCRICAO_RESUMIDA FROM TBFISCAL_ESPECIE G WHERE B.MODELO = G.CODIGO_DIEF AND B.ESPECIE = G.CODIGO_SPED) DESCRICAO_ESPECIE,
                
                               A.FISCAL_CFOP_CODIGO,
                               A.FISCAL_PERCENTUAL_ICMS,
                               SUM(A.VALOR_DESCONTO) AS VALOR_DESCONTO,
                               SUM(A.VALOR_PEDAGIO) AS VALOR_PEDAGIO,
                               SUM(A.VALOR_FRETE) AS VALOR_FRETE,
                               SUM(A.VALOR_SEGURO) AS VALOR_SEGURO,
                               SUM(A.VALOR_TOTAL) VALOR_PRODUTOS,
                               SUM(A.VALOR_CONTABIL) VALOR_CONTABIL,
                               SUM(A.VALOR_BASECALCULO_ICMS) VALOR_BASECALCULO_ICMS,
                               SUM(A.FISCAL_VALOR_ICMS) VALOR_ICMS,
                               SUM(A.FISCAL_ISENTAS_ICMS) VALOR_ISENTAS_ICMS,
                               SUM(A.FISCAL_OUTRAS_ICMS) VALOR_OUTRAS_ICMS,
                               SUM(A.FISCAL_VALOR_IPI) VALOR_IPI,
                               SUM(A.FISCAL_VALOR_PIS) VALOR_PIS,
                               SUM(A.FISCAL_VALOR_COFINS) VALOR_COFINS,
                               SUM(A.VALOR_ACRESCIMO) AS VALOR_ACRESCIMO,
                               C.VALOR_TOTAL_NF,
                               A.FISCAL_TRIBUTACAO_ICMS,
                               A.FISCAL_TRIBUTACAO_PIS,
                               A.FISCAL_TRIBUTACAO_COFINS
                
                        FROM TBNFE_ITEM A, TBNFE B, TBNFE_TOTAIS C, TBNFE_TRANSPORTADORA D 
                        WHERE  A.NFE_CONTROLE = B.CONTROLE
                          AND  C.NFE_CONTROLE = B.CONTROLE
                          AND  D.NFE_CONTROLE = B.CONTROLE
                          AND  B.SPED = '1'
                          AND  B.ESPECIE IN('07','08','8B','09','10','11','26','27','57')
                          AND  B.ESTABELECIMENTO_CODIGO = :ESTABELECIMENTO
                          AND B.DATA_FISCAL BETWEEN :DATA_INICIAL AND :DATA_FINAL

                        GROUP BY
                        B.CONTROLE, B.ESTABELECIMENTO_CODIGO, B.EMPRESA_CODIGO, B.ESPECIE,
                        B.SERIE, B.NUMERO_NOTAFISCAL, B.CHAVE_ACESSO, B.DATA_EMISSAO,
                        B.DATA_FISCAL, B.NATUREZA, B.SITUACAO, C.VALOR_OUTROSCUSTOS,
                        C.VALOR_TOTAL_NF, B.MODELO, A.FISCAL_CFOP_CODIGO, A.FISCAL_PERCENTUAL_ICMS,
                        D.FRETE, D.CMUNINI, D.CMUNFIM, D.IND_NAT_FRETE, A.FISCAL_TRIBUTACAO_PIS,
                        A.FISCAL_TRIBUTACAO_COFINS,A.FISCAL_TRIBUTACAO_ICMS
                )
                INTO :CONT1
                DO BEGIN
                   CONTADOR = CONTADOR + 1;
                   CONTEUDO = CONT1;
                   SUSPEND;
                   END

    CONTEUDO = 'TRA'||
               '|'||FN_LPAD(CONTADOR+1,10,'0');
    SUSPEND;

end
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER procedure SPC_MODELOS_REMSSA (
    REMESSAS blob sub_type 1 segment size 80 = '',
    DATA1 date = null,
    DATA2 date = null,
    FAMILIAS blob sub_type 1 segment size 80 = '',
    STATUS_TALAO integer = 0,
    ESTABELECIMENTO integer = 0)
returns (
    MODELO_ID integer,
    MODELO_DESCRICAO varchar(200),
    COR_ID integer,
    COR_DESCRICAO varchar(80),
    TAM_DESCRICAO varchar(40),
    GRADE_CODIGO integer,
    TAMANHO integer,
    QUANTIDADE numeric(18,4),
    SALDO_FATURAR numeric(18,4),
    ALOC_EST numeric(18,4),
    ALOC_REM numeric(18,4),
    ALOC_AGR numeric(18,4),
    PEDIDO integer,
    CLIENTE_CODIGO integer,
    CLIENTE varchar(80),
    DATA date,
    PREV_FATURAMENTO date,
    DATA_CLIENTE date,
    PRODUTO_ID integer,
    FAMILIA_ID integer,
    UM varchar(12),
    FRACIONAR char(4),
    INFO blob sub_type 1 segment size 100)
as
declare variable OREMESSA integer;
declare variable TIPO_REMESSA integer;
begin

  for
    select
        osplit
    from split(:REMESSAS,',')
  into OREMESSA
  do begin

      TIPO_REMESSA = coalesce((select first 1 0 from tbremessa_acumulado a where a.remessa = :OREMESSA),1);

      if(TIPO_REMESSA = 1)then
      begin
        for
            SELECT
                A.MODELO_CODIGO MODELO_ID,
                M.DESCRICAO MODELO_DESCRICAO,
                A.COR_ID,
                (SELECT FIRST 1 C.DESCRICAO FROM TBCOR C WHERE C.CODIGO = A.COR_ID) COR_DESCRICAO,
                (SELECT TAM_DESCRICAO FROM SP_TAMANHO_GRADE (M.GRADE_CODIGO,A.TAMANHO)) TAM_DESCRICAO,
                M.GRADE_CODIGO,
                A.TAMANHO,
                CAST(A.QUANTIDADE_PEDIDO AS NUMERIC(15,4)) QUANTIDADE,
                CAST(0.0000 AS NUMERIC(15,4)) SALDO_FATURAR,
                CAST(0.0000 AS NUMERIC(15,4)) ALOC_EST,
                CAST(0.0000 AS NUMERIC(15,4)) ALOC_REM,
                CAST(0.0000 AS NUMERIC(15,4)) ALOC_AGR,
                0 PEDIDO, 0 CLIENTE_CODIGO,
                CAST('' AS VARCHAR(20)) CLIENTE,
                CAST(NULL AS DATE) DATA,
                CAST(NULL AS DATE) PREV_FATURAMENTO,
                CAST(NULL AS DATE) DATA_CLIENTE,
                P.CODIGO AS PRODUTO_ID,
                P.FAMILIA_CODIGO AS FAMILIA_ID,
                U.SIGLA AS UM,
                U.PODE_FRACIONAR AS FRACIONAR,
        
                FN_TO_JSON_V2(
                    FN_TO_PAR_JSON_V2('REMESSA', R.REMESSA),
                    FN_TO_PAR_JSON_V2('NUMERO', R.NUMERO),
                    FN_TO_PAR_JSON_V2('TALAO', fn_lpad(A.REMESSA_ACUMULADO_CONTROLE,4,'0')),
                    FN_TO_PAR_JSON_V2('CONTROLE', A.CONTROLE),
                    FN_TO_PAR_JSON_V2('QUANTIDADE', A.QUANTIDADE_PEDIDO),
                    FN_TO_PAR_JSON_V2('ORIGEM', coalesce(R.ORIGEM,'0'))
                ) AS INFO
        
            FROM TBPEDIDO_ITEM_PROCESSADO A, TBREMESSA R, TBMODELO M, TBPRODUTO P, TbUnidadeMedida U
            WHERE A.ESTABELECIMENTO_CODIGO = :ESTABELECIMENTO
            AND A.MODELO_CODIGO = M.CODIGO
            AND A.ESTABELECIMENTO_CODIGO = R.ESTABELECIMENTO_CODIGO
            AND A.REMESSA = R.NUMERO
            
            AND P.MODELO_CODIGO = M.CODIGO
            AND P.COR_CODIGO    = A.COR_ID
            AND P.CODIGO        = A.PRODUTO_CODIGO
            AND U.SIGLA         = P.UNIDADEMEDIDA_SIGLA2
            and R.NUMERO        = :OREMESSA

            and iif(:STATUS_TALAO > 0 , iif(:STATUS_TALAO = 2, A.SITUACAO < 3 and A.DATA_PRODUCAO is NULL, A.SITUACAO = 3 and A.DATA_PRODUCAO is NULL), true)
            and iif(:DATA1 is distinct from null and :DATA2 is distinct from null, R.DATA BETWEEN :DATA1 AND :DATA2, true)
            and iif(char_length(:FAMILIAS) > 1, M.FAMILIA_CODIGO in (select osplit from split(:FAMILIAS,',')),true)

         into
            MODELO_ID,
            MODELO_DESCRICAO,
            COR_ID,
            COR_DESCRICAO,
            TAM_DESCRICAO,
            GRADE_CODIGO,
            TAMANHO,
            QUANTIDADE,
            SALDO_FATURAR,
            ALOC_EST,
            ALOC_REM,
            ALOC_AGR,
            PEDIDO,
            CLIENTE_CODIGO,
            CLIENTE,
            DATA,
            PREV_FATURAMENTO,
            DATA_CLIENTE,
            PRODUTO_ID,
            FAMILIA_ID,
            UM,
            FRACIONAR,
            INFO
        do begin
            suspend;
        end
    
      end else
      begin
        for
            SELECT 
            
                A.MODELO_CODIGO MODELO_ID, M.DESCRICAO MODELO_DESCRICAO, A.cor_codigo as COR_ID,
                (SELECT FIRST 1 C.DESCRICAO FROM TBCOR C WHERE C.CODIGO = A.cor_codigo) COR_DESCRICAO,
                (SELECT TAM_DESCRICAO FROM SP_TAMANHO_GRADE (M.GRADE_CODIGO,A.TAMANHO)) TAM_DESCRICAO,
                M.GRADE_CODIGO, A.TAMANHO, CAST(A.quantidade AS NUMERIC(15,4)) QUANTIDADE,
                CAST(0.0000 AS NUMERIC(15,4)) SALDO_FATURAR,
                CAST(0.0000 AS NUMERIC(15,4)) ALOC_EST,
                CAST(0.0000 AS NUMERIC(15,4)) ALOC_REM,
                CAST(0.0000 AS NUMERIC(15,4)) ALOC_AGR,
                0 PEDIDO, 0 CLIENTE_CODIGO,
                CAST('' AS VARCHAR(20)) CLIENTE,
                CAST(NULL AS DATE) DATA,
                CAST(NULL AS DATE) PREV_FATURAMENTO,
                CAST(NULL AS DATE) DATA_CLIENTE,
                P.CODIGO AS PRODUTO_ID,
                P.FAMILIA_CODIGO AS FAMILIA_ID,
                U.SIGLA AS UM,
                U.PODE_FRACIONAR AS FRACIONAR,
            
                FN_TO_JSON_V2(
                    FN_TO_PAR_JSON_V2('REMESSA', R.REMESSA),
                    FN_TO_PAR_JSON_V2('NUMERO', R.NUMERO),
                    FN_TO_PAR_JSON_V2('TALAO', fn_lpad(0,4,'0')),
                    FN_TO_PAR_JSON_V2('CONTROLE', A.CONTROLE),
                    FN_TO_PAR_JSON_V2('QUANTIDADE', A.quantidade),
                    FN_TO_PAR_JSON_V2('ORIGEM', coalesce(R.ORIGEM,'0'))
                ) INFO

            FROM TBREMESSA_ACUMULADO A, TBREMESSA R, TBMODELO M, TBPRODUTO P, TbUnidadeMedida U
            WHERE A.MODELO_CODIGO = M.CODIGO
            AND A.ESTABELECIMENTO_CODIGO = R.ESTABELECIMENTO_CODIGO
            AND A.REMESSA = R.NUMERO
            
            AND P.MODELO_CODIGO     = M.CODIGO
            AND P.COR_CODIGO        = A.cor_codigo
            AND P.CODIGO            = A.PRODUTO_CODIGO
            AND U.SIGLA             = P.UNIDADEMEDIDA_SIGLA2
            AND R.NUMERO            = :OREMESSA

            and iif(:DATA1 is distinct from null and :DATA2 is distinct from null, R.DATA BETWEEN :DATA1 AND :DATA2, true)
            and iif(char_length(:FAMILIAS) > 1, M.FAMILIA_CODIGO in (select osplit from split(:FAMILIAS,',')),true)

         into
            MODELO_ID,
            MODELO_DESCRICAO,
            COR_ID,
            COR_DESCRICAO,
            TAM_DESCRICAO,
            GRADE_CODIGO,
            TAMANHO,
            QUANTIDADE,
            SALDO_FATURAR,
            ALOC_EST,
            ALOC_REM,
            ALOC_AGR,
            PEDIDO,
            CLIENTE_CODIGO,
            CLIENTE,
            DATA,
            PREV_FATURAMENTO,
            DATA_CLIENTE,
            PRODUTO_ID,
            FAMILIA_ID,
            UM,
            FRACIONAR,
            INFO
        do begin
            suspend;
        end
      end
  end

end
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER procedure SPC_NFE_OC_ITEM (
    ESTABELECIMENTO_1 integer,
    EMPRESA_1 integer)
returns (
    OC integer,
    PRODUTO_CODIGO integer,
    VALOR numeric(10,5),
    OC_ITEM_CONTROLE integer,
    DATA_ENTREGA date,
    IPI numeric(10,5),
    QUANTIDADE_SALDO numeric(10,5),
    T01 numeric(10,5),
    T02 numeric(10,5),
    T03 numeric(10,5),
    T04 numeric(10,5),
    T05 numeric(10,5),
    T06 numeric(10,5),
    T07 numeric(10,5),
    T08 numeric(10,5),
    T09 numeric(10,5),
    T10 numeric(10,5),
    T11 numeric(10,5),
    T12 numeric(10,5),
    T13 numeric(10,5),
    T14 numeric(10,5),
    T15 numeric(10,5),
    T16 numeric(10,5),
    T17 numeric(10,5),
    T18 numeric(10,5),
    T19 numeric(10,5),
    T20 numeric(10,5),
    DESCRICAO varchar(100),
    UNIDADEMEDIDA_SIGLA varchar(3),
    LOCALIZACAO_CODIGO integer,
    NCM_CODIGO varchar(10),
    TRANSPORTADORA_CODIGO integer,
    FRETE integer,
    PAGAMENTO_CONDICAO integer,
    GRADE_CODIGO integer,
    QUANTIDADE numeric(10,5),
    PAGAMENTO_FORMA integer,
    ACRESCIMO numeric(15,2),
    DESCONTO numeric(15,2))
as
BEGIN
FOR
Select B.OC, A.Produto_Codigo, A.Valor, C.OC_Item_Controle,A.Data_Entrega,a.Ipi,
C.Quantidade, C.T01, C.T02, C.T03, C.T04, C.T05, C.T06, C.T07, C.T08, C.T09, C.T10,
C.T11, C.T12, C.T13, C.T14, C.T15, C.T16, C.T17, C.T18, C.T19, C.T20,
D.Descricao, D.UnidadeMedida_Sigla2, D.Localizacao_Codigo, D.Ncm_Codigo,
B.Transportadora_Codigo, B.Frete, B.Pagamento_Condicao, D.Grade_Codigo, A.Quantidade,
B.Pagamento_Forma, A.ACRESCIMO, A.DESCONTO
From TbOC_Item A, TBOC B, TBOC_ITEM_SALDO C, TBPRODUTO D
WHERE B.OC = A.OC
AND   A.Controle = C.OC_Item_Controle
AND   A.Produto_Codigo = D.Codigo
AND   A.Situacao = 1
and   B.Estabelecimento_Codigo = :ESTABELECIMENTO_1
and   B.fornecedor_codigo = :EMPRESA_1
and   B.Autorizacao = '2'
and   B.Status = '1'
Order By D.Descricao, B.OC, A.Sequencia
INTO
:OC, :Produto_Codigo,
:Valor, :OC_Item_Controle,:Data_Entrega,:Ipi,:Quantidade_Saldo,
:T01,:T02,:T03,:T04,:T05,:T06,:T07,:T08,:T09,:T10,
:T11,:T12,:T13,:T14,:T15,:T16,:T17,:T18,:T19,:T20,
:Descricao, :UnidadeMedida_Sigla, :Localizacao_Codigo,
:Ncm_Codigo, :Transportadora_Codigo, :Frete, :Pagamento_Condicao,
:Grade_Codigo, :Quantidade, :Pagamento_Forma, :ACRESCIMO, :DESCONTO
DO SUSPEND;
END
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER procedure SPC_PEDIDO_PROCESSADO_ITEM (
    ESTABELECIMENTO_CODIGO_1 integer,
    FAMILIA_CODIGO_1 integer,
    REMESSA_1 integer)
returns (
    "Pedido" integer,
    "Pedido_Item_Sequencia" integer,
    "Pedido_Processado_Data" date,
    "Data_Liberacao" date,
    "Quantidade" numeric(10,5),
    T01 numeric(10,5),
    T02 numeric(10,5),
    T03 numeric(10,5),
    T04 numeric(10,5),
    T05 numeric(10,5),
    T06 numeric(10,5),
    T07 numeric(10,5),
    T08 numeric(10,5),
    T09 numeric(10,5),
    T10 numeric(10,5),
    T11 numeric(10,5),
    T12 numeric(10,5),
    T13 numeric(10,5),
    T14 numeric(10,5),
    T15 numeric(10,5),
    T16 numeric(10,5),
    T17 numeric(10,5),
    T18 numeric(10,5),
    T19 numeric(10,5),
    T20 numeric(10,5),
    "Setor_Codigo" integer,
    "Cliente_Codigo" integer,
    "Remessa_Controle" integer,
    "Controle" integer,
    "Pedido_Item_Produto_Codig" integer,
    "Descricao" varchar(100),
    "Grade_Codigo" integer,
    "Situacao" integer,
    "Pedido_Processado_Control" integer,
    "Pedido_Item_Controle" integer,
    "UnidadeMedida_Sigla" varchar(3),
    "Cor_Codigo" integer,
    "Modelo_Codigo" integer,
    "Estabelecimento_Codigo" integer,
    "Familia_Codigo" integer,
    "Remessa" integer,
    "Remessa_Turno_Codigo" integer)
as
BEGIN
FOR Select A.Pedido, A.Pedido_Item_Sequencia, A.Pedido_Processado_Data,A.Data_Liberacao,
A.Quantidade,A.T01,A.T02,A.T03,A.T04,A.T05,A.T06,A.T07,A.T08,A.T09,A.T10,A.T11,A.T12,A.T13,
A.T14,A.T15,A.T16,A.T17,A.T18,A.T19,A.T20,A.Setor_Codigo, A.Cliente_Codigo, A.Remessa_Controle,
A.Controle, A.Pedido_Item_Produto_Codig, B.Descricao, B.Grade_Codigo, A.Situacao,
A.Pedido_Processado_Control, A.Pedido_Item_Controle, B.UnidadeMedida_Sigla2, B.Cor_Codigo,
B.Modelo_Codigo, A.Estabelecimento_Codigo, A.Familia_Codigo, A.Remessa, A.Remessa_Turno_Codigo
From TbPedido_Processado_Item A, TbProduto B
Where A.Pedido_Item_Produto_Codig = B.Codigo
  and A.Remessa > 0
  and A.ESTABELECIMENTO_CODIGO = :"ESTABELECIMENTO_CODIGO_1"
  and B.FAMILIA_CODIGO = :"FAMILIA_CODIGO_1"
  and A.REMESSA        = :"REMESSA_1"
INTO :"Pedido",
     :"Pedido_Item_Sequencia",
     :"Pedido_Processado_Data",
     :"Data_Liberacao",
     :"Quantidade",
     :"T01", :"T02", :"T03", :"T04",
     :"T05", :"T06", :"T07", :"T08",
     :"T09", :"T10", :"T11", :"T12",
     :"T13", :"T14", :"T15", :"T16",
     :"T17", :"T18", :"T19", :"T20",
     :"Setor_Codigo"     ,
     :"Cliente_Codigo"   ,
     :"Remessa_Controle" ,
     :"Controle"         ,
     :"Pedido_Item_Produto_Codig",
     :"Descricao"        ,
     :"Grade_Codigo",
     :"Situacao",
     :"Pedido_Processado_Control",
     :"Pedido_Item_Controle",
     :"UnidadeMedida_Sigla",
     :"Cor_Codigo",
     :"Modelo_Codigo",
     :"Estabelecimento_Codigo", 
     :"Familia_Codigo", 
     :"Remessa",
     :"Remessa_Turno_Codigo"     
DO SUSPEND;
END
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER procedure SPC_PEDIDO_PROCESSADO_ITEM2 (
    ESTABELECIMENTO_CODIGO_1 integer,
    FAMILIA_CODIGO_1 integer,
    PEDIDO_T varchar(20),
    PEDIDO_1 varchar(20),
    CLIENTE_1 integer,
    CLIENTE_2 integer,
    MODELO_1 integer,
    MODELO_2 integer,
    PRODUTO_1 integer,
    PRODUTO_2 integer)
returns (
    "Pedido" integer,
    "Pedido_Item_Sequencia" integer,
    "Pedido_Processado_Data" date,
    "Data_Liberacao" date,
    "Quantidade" numeric(10,5),
    T01 numeric(10,5),
    T02 numeric(10,5),
    T03 numeric(10,5),
    T04 numeric(10,5),
    T05 numeric(10,5),
    T06 numeric(10,5),
    T07 numeric(10,5),
    T08 numeric(10,5),
    T09 numeric(10,5),
    T10 numeric(10,5),
    T11 numeric(10,5),
    T12 numeric(10,5),
    T13 numeric(10,5),
    T14 numeric(10,5),
    T15 numeric(10,5),
    T16 numeric(10,5),
    T17 numeric(10,5),
    T18 numeric(10,5),
    T19 numeric(10,5),
    T20 numeric(10,5),
    "Setor_Codigo" integer,
    "Cliente_Codigo" integer,
    "Remessa_Controle" integer,
    "Controle" integer,
    "Pedido_Item_Produto_Codig" integer,
    "Descricao" varchar(100),
    "Grade_Codigo" integer,
    "Situacao" integer,
    "Pedido_Processado_Control" integer,
    "Pedido_Item_Controle" integer,
    "UnidadeMedida_Sigla" varchar(3),
    "Cor_Codigo" integer,
    "Modelo_Codigo" integer,
    "Estabelecimento_Codigo" integer,
    "Familia_Codigo" integer,
    "Remessa" integer,
    "Remessa_Turno_Codigo" integer,
    PEDIDO_CLIENTE varchar(20))
as
BEGIN
FOR Select A.Pedido, A.Pedido_Item_Sequencia, A.Pedido_Processado_Data,A.Data_Liberacao,
A.Quantidade,A.T01,A.T02,A.T03,A.T04,A.T05,A.T06,A.T07,A.T08,A.T09,A.T10,
A.T11,A.T12,A.T13,A.T14,A.T15,A.T16,A.T17,A.T18,A.T19,A.T20,
A.Setor_Codigo, A.Cliente_Codigo, A.Remessa_Controle,
A.Controle, A.Pedido_Item_Produto_Codig,B.Descricao,B.Grade_Codigo,
A.Situacao,A.Pedido_Processado_Control,A.Pedido_Item_Controle,
B.UnidadeMedida_Sigla2,B.Cor_Codigo,B.Modelo_Codigo,A.Estabelecimento_Codigo, A.Familia_Codigo,
A.Remessa,A.Remessa_Turno_Codigo, C.Pedido_Cliente
From TbPedido_Processado_Item A, TbProduto B, TbPedido C
Where A.Pedido_Item_Produto_Codig = B.Codigo
  and A.Pedido = C.Pedido
  and A.Remessa = 0 and A.Situacao  = 1
  and A.ESTABELECIMENTO_CODIGO = :"ESTABELECIMENTO_CODIGO_1"
  and A.FAMILIA_CODIGO = :"FAMILIA_CODIGO_1"
  and (C.Pedido_Cliente <>   :PEDIDO_T or
       C.Pedido_Cliente Like :PEDIDO_1)
  and C.cliente_codigo Between :Cliente_1 and :Cliente_2
  and B.Modelo_Codigo Between :Modelo_1 and :Modelo_2
  and B.Codigo Between :Produto_1 and :Produto_2
Order By A.Pedido_Processado_Data, A.Pedido,A.Pedido_Item_Sequencia
INTO :"Pedido",
     :"Pedido_Item_Sequencia",
     :"Pedido_Processado_Data",
     :"Data_Liberacao",
     :"Quantidade",
     :"T01", :"T02", :"T03", :"T04",
     :"T05", :"T06", :"T07", :"T08",
     :"T09", :"T10", :"T11", :"T12",
     :"T13", :"T14", :"T15", :"T16",
     :"T17", :"T18", :"T19", :"T20",
     :"Setor_Codigo"     ,
     :"Cliente_Codigo"   ,
     :"Remessa_Controle" ,
     :"Controle"         ,
     :"Pedido_Item_Produto_Codig",
     :"Descricao"        ,
     :"Grade_Codigo",
     :"Situacao",
     :"Pedido_Processado_Control",
     :"Pedido_Item_Controle",
     :"UnidadeMedida_Sigla",
     :"Cor_Codigo",
     :"Modelo_Codigo",
     :"Estabelecimento_Codigo",
     :"Familia_Codigo",
     :"Remessa",
     :"Remessa_Turno_Codigo",
     :Pedido_Cliente 
DO SUSPEND;
END
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER procedure SPC_PRODUCAO_CONFORMACAO_V2 (
    I_GP_ID integer,
    I_UP_ID integer,
    I_ESTACAO varchar(500),
    I_DATA_INICIO date,
    I_DATA_FIM date,
    I_FLAG integer)
returns (
    PERDAS_PERC numeric(15,2),
    EFICIENCIA numeric(15,2),
    SETUP_PREVISTO numeric(15,2),
    SETUP_REALIZADO numeric(15,2),
    COR_EFIC integer,
    JUSTIFICATIVA varchar(1000),
    PROGRAMACAO_ID integer,
    REQUISICAO_ID integer,
    GP_ID integer,
    GP_DESCRICAO varchar(500),
    UP_ID integer,
    UP_DESCRICAO varchar(500),
    ESTACAO integer,
    ESTACAO_DESCRICAO varchar(500),
    REMESSA integer,
    REMESSA_ID integer,
    REMESSA_DATA date,
    REMESSA_TALAO_ID integer,
    TALAO_ID integer,
    PRODUTO_ID integer,
    PRODUTO_DESCRICAO varchar(500),
    MODELO_ID integer,
    MODELO_DESCRICAO varchar(500),
    COR_ID integer,
    COR_DESCRICAO varchar(500),
    TAMANHO integer,
    TAMANHO_DESCRICAO varchar(500),
    QUANTIDADE numeric(15,2),
    UM varchar(500),
    FERRAMENTA_ID integer,
    FERRAMENTA_DESCICAO varchar(500),
    DATAHORA_REALIZADO_INICIO varchar(20),
    DATAHORA_REALIZADO_FIM varchar(20),
    TEMPO_PREVISTO numeric(15,2),
    TEMPO_REALIZADO numeric(15,2),
    TEMPO_PREVISTO_OPERACIONAL numeric(15,2),
    TEMPO_PREVISTO_FERRAMENTA numeric(15,2),
    TEMPO_PREVISTO_AQUECIMENTO numeric(15,2),
    TEMPO_PREVISTO_APROVACAO numeric(15,2),
    TEMPO_REALIZADO_OPERACIONAL numeric(15,2),
    TEMPO_REALIZADO_FERRAMENTA numeric(15,2),
    TEMPO_REALIZADO_AQUECIMENTO numeric(15,2),
    TEMPO_REALIZADO_APROVACAO numeric(15,2),
    PERFIL_SKU varchar(10),
    TEMPO_PARADO numeric(15,2),
    PERDAS numeric(15,2),
    PERFIL_SKU_DESCRICAO varchar(500),
    PERDAS_PERC1 numeric(15,2),
    EFICIENCIA_MINIMA numeric(15,2),
    EFICIENCIA_A numeric(15,2),
    EFICIENCIA_B numeric(15,2),
    PERDAS_A numeric(15,2),
    PERDAS_B numeric(15,2),
    TEMPO_EXTRA numeric(15,2),
    TEMPO_EFIC numeric(15,2),
    TURNO integer,
    EFIC numeric(15,2))
as
begin

  for
    SELECT
    
            iif(PERDAS_PERC > 100,100,PERDAS_PERC) as PERDAS_PERC,
    
            iif(z.efic > 100,100,z.efic) as eficiencia,
            (TEMPO_PREVISTO_FERRAMENTA+
            TEMPO_PREVISTO_AQUECIMENTO+
            TEMPO_PREVISTO_APROVACAO) as SETUP_PREVISTO,
    
            (TEMPO_REALIZADO_FERRAMENTA+
            TEMPO_REALIZADO_AQUECIMENTO+
            TEMPO_REALIZADO_APROVACAO) as SETUP_REALIZADO,
    
            iif(z.efic < EFICIENCIA_A,1,
            iif(z.efic >= EFICIENCIA_A and z.efic <= EFICIENCIA_B,2,
            iif(z.efic > EFICIENCIA_B,3,0))) as cor_efic,
    
            coalesce((SELECT
                        list(j.descricao||': '||coalesce(p.observacao,''),',<br>') from
                    TBREGISTRO_PARADA P,
                    tbjustificativa J
                    where p.tabela = 'INEFICIENCIA'
                    and p.tabela_id = z.PROGRAMACAO_ID
                    and j.id = p.status)
    
            ,'') as JUSTIFICATIVA,
    
            z.*
    
        from(
        SELECT
            PROGRAMACAO_ID,
            REQUISICAO_ID,
            GP_ID,
            GP_DESCRICAO,
            UP_ID,
            UP_DESCRICAO,
            ESTACAO,
            ESTACAO_DESCRICAO,
            REMESSA,
            REMESSA_ID,
            REMESSA_DATA,
            REMESSA_TALAO_ID,
            TALAO_ID,
            PRODUTO_ID,
            PRODUTO_DESCRICAO,
            MODELO_ID,
            MODELO_DESCRICAO,
            COR_ID,
            COR_DESCRICAO,
            TAMANHO,
            TAMANHO_DESCRICAO,
            QUANTIDADE,
            UM,
            FERRAMENTA_ID,
            FERRAMENTA_DESCICAO,
            formatdatetime(DATAHORA_REALIZADO_INICIO) as DATAHORA_REALIZADO_INICIO,
            formatdatetime(DATAHORA_REALIZADO_FIM) as DATAHORA_REALIZADO_FIM,
            TEMPO_PREVISTO,
            TEMPO_REALIZADO,
            TEMPO_PREVISTO_OPERACIONAL,
            TEMPO_PREVISTO_FERRAMENTA,
            TEMPO_PREVISTO_AQUECIMENTO,
            TEMPO_PREVISTO_APROVACAO,
            IIF( TEMPO_REALIZADO_OPERACIONAL < 0, 0, TEMPO_REALIZADO_OPERACIONAL) TEMPO_REALIZADO_OPERACIONAL,
            TEMPO_REALIZADO_FERRAMENTA,
            TEMPO_REALIZADO_AQUECIMENTO,
            TEMPO_REALIZADO_APROVACAO,
            PERFIL_SKU,
            TEMPO_PARADO,
            TEMPO_EXTRA,
            PERDAS,
            PERFIL_SKU_DESCRICAO,
            cast(((PERDAS / iif(QUANTIDADE > 0,QUANTIDADE,1)) * 100) as numeric(15,2)) PERDAS_PERC,
            EFICIENCIA_MINIMA,
            EFICIENCIA_A,
            EFICIENCIA_B,
            PERDAS_A,
            PERDAS_B,
            iif(TEMPO_EFIC > 0, TEMPO_EFIC,0) as TEMPO_EFIC,

            (select first 1 b.codigo from tbturno_producao b where (COMPARE_HORA(b.hora_inicio,b.hora_fim,gethora(DATAHORA_REALIZADO_FIM))) = 1 and b.dia_semana = iif(gethora(DATAHORA_REALIZADO_FIM) < '07:00:00', (extract(weekday from DATAHORA_REALIZADO_FIM)-1),extract(weekday from DATAHORA_REALIZADO_FIM))) as turno,
            (TEMPO_PREVISTO_OPERACIONAL / iif(TEMPO_EFIC>0,TEMPO_EFIC,1) * 100) as efic
        
        FROM (
            SELECT
                ((TEMPO_REALIZADO - TEMPO_REALIZADO_FERRAMENTA - TEMPO_REALIZADO_AQUECIMENTO - TEMPO_REALIZADO_APROVACAO) + TEMPO_EXTRA + TEMPO_PARADO) as TEMPO_EFIC,
                PROGRAMACAO_ID,
                REQUISICAO_ID,
                GP_ID,
                GP_DESCRICAO,
                UP_ID,
                UP_DESCRICAO,
                ESTACAO,
                ESTACAO_DESCRICAO,
                REMESSA,
                REMESSA_ID,
                REMESSA_DATA,
                REMESSA_TALAO_ID,
                TALAO_ID,
                PRODUTO_ID,
                PRODUTO_DESCRICAO,
                MODELO_ID,
                MODELO_DESCRICAO,
                COR_ID,
                COR_DESCRICAO,
                TAMANHO,
                TAMANHO_DESCRICAO,
                QUANTIDADE,
                UM,
                FERRAMENTA_ID,
                FERRAMENTA_DESCICAO,
                DATAHORA_REALIZADO_INICIO,
                DATAHORA_REALIZADO_FIM,
                TEMPO_PREVISTO,
                TEMPO_REALIZADO,
                TEMPO_PREVISTO_OPERACIONAL,
                TEMPO_PREVISTO_FERRAMENTA,
                TEMPO_PREVISTO_AQUECIMENTO,
                TEMPO_PREVISTO_APROVACAO,
                (TEMPO_REALIZADO - TEMPO_REALIZADO_FERRAMENTA - TEMPO_REALIZADO_AQUECIMENTO - TEMPO_REALIZADO_APROVACAO) TEMPO_REALIZADO_OPERACIONAL,
                TEMPO_REALIZADO_FERRAMENTA,
                TEMPO_REALIZADO_AQUECIMENTO,
                TEMPO_REALIZADO_APROVACAO,
                TEMPO_PARADO,
                PERFIL_SKU,
                PERDAS,
                PF.descricao as PERFIL_SKU_DESCRICAO,
                PF.efic_minima as EFICIENCIA_MINIMA,
                PF.efic_a as EFICIENCIA_A,
                PF.efic_b as EFICIENCIA_B,
                PF.perda_a as PERDAS_A,
                PF.perda_b as PERDAS_B,
                TEMPO_EXTRA
            
            FROM (
                SELECT
                    P.ID                                            AS PROGRAMACAO_ID,   
                    A.REQUISICAO_ID                                 AS REQUISICAO_ID,
                    G.ID                                            AS GP_ID,
                    G.DESCRICAO                                     AS GP_DESCRICAO,
                    U.ID                                            AS UP_ID,
                    U.DESCRICAO                                     AS UP_DESCRICAO,
                    P.ESTACAO                                       AS ESTACAO,
                    SU.DESCRICAO                                    AS ESTACAO_DESCRICAO,
                    R.REMESSA                                       AS REMESSA,
                    T.REMESSA_ID                                    AS REMESSA_ID,
                    R.DATA                                          AS REMESSA_DATA,
                    T.REMESSA_TALAO_ID                              AS REMESSA_TALAO_ID,
                    T.ID                                            AS TALAO_ID,
                    PR.CODIGO                                       AS PRODUTO_ID,
                    PR.DESCRICAO                                    AS PRODUTO_DESCRICAO,
                    M.CODIGO                                        AS MODELO_ID,
                    M.DESCRICAO                                     AS MODELO_DESCRICAO,
                    C.CODIGO                                        AS COR_ID,
                    C.DESCRICAO                                     AS COR_DESCRICAO,
                    P.TAMANHO                                       AS TAMANHO,
                    TAMANHO_GRADE(GR.CODIGO,P.TAMANHO)              AS TAMANHO_DESCRICAO,
                    A.QUANTIDADE                                    AS QUANTIDADE,
                    PR.UNIDADEMEDIDA_SIGLA2                          AS UM,
                    A.datahora_realizado_inicio                     AS DATAHORA_REALIZADO_INICIO,
                    A.DATAHORA_REALIZADO_FIM                        AS DATAHORA_REALIZADO_FIM,
                    P.TEMPO                                         AS TEMPO_PREVISTO,
                    A.TEMPO_REALIZADO                               AS TEMPO_REALIZADO,
                    A.TEMPO_OPERACIONAL                             AS TEMPO_PREVISTO_OPERACIONAL,
                    A.TEMPO_SETUP_FERRAMENTA                        AS TEMPO_PREVISTO_FERRAMENTA,
                    (A.TEMPO_SETUP_AQUECIMENTO + A.TEMPO_SETUP_COR) AS TEMPO_PREVISTO_AQUECIMENTO,
                    A.TEMPO_SETUP_APROVACAO                         AS TEMPO_PREVISTO_APROVACAO,
                    coalesce(a.tempo_parado,0)                      AS TEMPO_PARADO,
                    coalesce(a.tempo_estacao,0)                     AS TEMPO_EXTRA,

                
                    CAST(COALESCE((SELECT FIRST 1 DATEDIFF(MINUTE, S.DATAHORA_INICIO, S.DATAHORA_FIM)
                                     FROM TBREGISTRO_SETUP S
                                    WHERE S.TALAO_ID = P.TABELA_ID
                                      AND S.REQUISICAO_ID = A.REQUISICAO_ID
                                      AND S.SETUP_ID = 1),0) AS NUMERIC(15,4)) AS TEMPO_REALIZADO_FERRAMENTA,
                
                
                   CAST(COALESCE((SELECT FIRST 1 DATEDIFF(MINUTE, S.DATAHORA_INICIO, S.DATAHORA_FIM)
                                    FROM TBREGISTRO_SETUP S
                                   WHERE S.TALAO_ID = P.TABELA_ID
                                     AND S.REQUISICAO_ID = A.REQUISICAO_ID
                                     AND S.SETUP_ID = 2),0) AS NUMERIC(15,4)) AS TEMPO_REALIZADO_AQUECIMENTO,
                
                
                   CAST(COALESCE((SELECT FIRST 1 DATEDIFF(MINUTE, S.DATAHORA_INICIO, S.DATAHORA_FIM)
                                    FROM TBREGISTRO_SETUP S
                                   WHERE S.TALAO_ID = P.TABELA_ID
                                     AND S.REQUISICAO_ID = A.REQUISICAO_ID
                                     AND S.SETUP_ID = 3),0) AS NUMERIC(15,4)) AS TEMPO_REALIZADO_APROVACAO,
            
                  (SELECT FIRST 1 SK.PERFIL
                     FROM VWSKU SK
                    WHERE SK.MODELO_ID = M.CODIGO
                     AND SK.COR_ID    = C.CODIGO
                     AND SK.TAMANHO   = T.TAMANHO) PERFIL_SKU,
        
                    A.FERRAMENTA_ID,
        
                    (SELECT FIRST 1 LPAD(F.SERIE,4,'0') || ' - ' || DESCRICAO FROM TBFERRAMENTARIA F WHERE F.ID = A.FERRAMENTA_ID) FERRAMENTA_DESCICAO,
    
                    coalesce((SELECT
                        SUM(D.quantidade) AS quantidade
                    FROM
                        TbDefeito_Transacao_Item D,
                        tbsac_defeito j
                    WHERE d.remessa           = r.remessa_id
                        AND d.remessa_controle  = t.remessa_talao_id
                        and d.defeito_id        = j.codigo
                        and j.conformacao       = '1'
                    ),0) as PERDAS
                
                FROM
                    TBPROGRAMACAO_REQUISICAO A,
                    TBPROGRAMACAO P,
                    VWREMESSA_TALAO T,
                    VWREMESSA R,
                    TBGP G,
                    TBUP U,
                    TBSUB_UP SU,
                    TBPRODUTO PR,
                    TBMODELO M,
                    TBCOR C,
                    TBGRADE GR
                
                WHERE p.gp_id    = :I_GP_ID
                and p.up_id    = :I_UP_ID
                AND P.ESTACAO  in(select * from split(:I_estacao,','))
        
                AND P.ID            = A.PROGRAMACAO_ID
                AND P.FERRAMENTA_ID > 0
                AND A.STATUS        = 3
                AND P.TIPO          = 'A'
                AND P.TABELA_ID     = T.ID
                AND R.REMESSA_ID    = T.REMESSA_ID
                AND G.ID            = P.GP_ID
                AND U.ID            = P.UP_ID
                AND SU.UP_ID        = P.UP_ID
                AND SU.ID           = P.ESTACAO
                AND PR.CODIGO       = P.PRODUTO_ID
                AND M.CODIGO        = PR.MODELO_CODIGO
                AND C.CODIGO        = PR.COR_CODIGO
                AND GR.CODIGO       = PR.GRADE_CODIGO
                AND A.DATAHORA_REALIZADO_FIM >= iif(:I_FLAG = 1, cast(cast(:i_data_inicio as date) ||' '|| (select first 1 tt.hora_inicio from tbturno_producao tt where tt.dia_semana = extract(weekday from cast(:i_data_inicio as date))) as timestamp),
                                                                 cast((select first 2 k.data_producao from tbturno_producao k where k.turno_corrente = 1) ||' '|| (select first 1 tt.hora_inicio from tbturno_producao  tt where tt.dia_semana = extract(weekday from (select first 2 k.data_producao from tbturno_producao k where k.turno_corrente = 1))) as timestamp))
                and iif(:i_flag = 1,
                    A.DATAHORA_REALIZADO_FIM BETWEEN

                    cast(cast(:i_data_inicio as date) ||' '|| (select first 1 tt.hora_inicio from tbturno_producao tt where tt.dia_semana = extract(weekday from cast(:i_data_inicio as date))) as timestamp)
                    and
                    cast(dateadd(day, 1 ,cast(:i_data_fim as date)) ||' '|| (select first 1 tt.hora_inicio - 0.0000001 from tbturno_producao tt where tt.dia_semana = extract(weekday from cast(:i_data_inicio as date))) as timestamp),


                    A.DATAHORA_REALIZADO_FIM >= cast((select first 2 k.data_producao from tbturno_producao k where k.turno_corrente = 1) ||' '|| (select first 1 tt.hora_inicio from tbturno_producao  tt where tt.dia_semana = extract(weekday from (select first 2 k.data_producao from tbturno_producao k where k.turno_corrente = 1))) as timestamp)
                )
        
            ) X, TBPERFIL PF
    
            where PF.tabela = 'SKU' and  PF.id = PERFIL_SKU
        ) Y
    )Z
    order by z.estacao,z.datahora_realizado_fim

  into
    :PERDAS_PERC,
    :EFICIENCIA,
    :SETUP_PREVISTO,
    :SETUP_REALIZADO,
    :COR_EFIC,
    :JUSTIFICATIVA,
    :PROGRAMACAO_ID,
    :REQUISICAO_ID,
    :GP_ID,
    :GP_DESCRICAO,
    :UP_ID,
    :UP_DESCRICAO,
    :ESTACAO,
    :ESTACAO_DESCRICAO,
    :REMESSA,
    :REMESSA_ID,
    :REMESSA_DATA,
    :REMESSA_TALAO_ID,
    :TALAO_ID,
    :PRODUTO_ID,
    :PRODUTO_DESCRICAO,
    :MODELO_ID,
    :MODELO_DESCRICAO,
    :COR_ID,
    :COR_DESCRICAO,
    :TAMANHO,
    :TAMANHO_DESCRICAO,
    :QUANTIDADE,
    :UM,
    :FERRAMENTA_ID,
    :FERRAMENTA_DESCICAO,
    :DATAHORA_REALIZADO_INICIO,
    :DATAHORA_REALIZADO_FIM,
    :TEMPO_PREVISTO,
    :TEMPO_REALIZADO,
    :TEMPO_PREVISTO_OPERACIONAL,
    :TEMPO_PREVISTO_FERRAMENTA,
    :TEMPO_PREVISTO_AQUECIMENTO,
    :TEMPO_PREVISTO_APROVACAO,
    :TEMPO_REALIZADO_OPERACIONAL,
    :TEMPO_REALIZADO_FERRAMENTA,
    :TEMPO_REALIZADO_AQUECIMENTO,
    :TEMPO_REALIZADO_APROVACAO,
    :PERFIL_SKU,
    :TEMPO_PARADO,
    :TEMPO_EXTRA,
    :PERDAS,
    :PERFIL_SKU_DESCRICAO,
    :PERDAS_PERC1,
    :EFICIENCIA_MINIMA,
    :EFICIENCIA_A,
    :EFICIENCIA_B,
    :PERDAS_A,
    :PERDAS_B,
    :TEMPO_EFIC,
    :TURNO,
    :EFIC
  do
  begin
    suspend;
  end

end
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER procedure SPC_PRODUCAO_PARADA (
    I_GP_ID integer,
    I_UP_ID integer,
    I_DATA_INICIO date,
    I_DATA_FIM date,
    I_FLAG integer)
returns (
    PERDAS_PERC numeric(15,2),
    EFICIENCIA numeric(15,2),
    SETUP_PREVISTO numeric(15,2),
    SETUP_REALIZADO numeric(15,2),
    COR_EFIC integer,
    JUSTIFICATIVA varchar(1000),
    PROGRAMACAO_ID integer,
    REQUISICAO_ID integer,
    GP_ID integer,
    GP_DESCRICAO varchar(500),
    UP_ID integer,
    UP_DESCRICAO varchar(500),
    ESTACAO integer,
    ESTACAO_DESCRICAO varchar(500),
    REMESSA integer,
    REMESSA_ID integer,
    REMESSA_DATA date,
    REMESSA_TALAO_ID integer,
    TALAO_ID integer,
    PRODUTO_ID integer,
    PRODUTO_DESCRICAO varchar(500),
    MODELO_ID integer,
    MODELO_DESCRICAO varchar(500),
    COR_ID integer,
    COR_DESCRICAO varchar(500),
    TAMANHO integer,
    TAMANHO_DESCRICAO varchar(500),
    QUANTIDADE numeric(15,2),
    UM varchar(500),
    FERRAMENTA_ID integer,
    FERRAMENTA_DESCICAO varchar(500),
    DATAHORA_REALIZADO_INICIO varchar(20),
    DATAHORA_REALIZADO_FIM varchar(20),
    TEMPO_PREVISTO numeric(15,2),
    TEMPO_REALIZADO numeric(15,2),
    TEMPO_PREVISTO_OPERACIONAL numeric(15,2),
    TEMPO_PREVISTO_FERRAMENTA numeric(15,2),
    TEMPO_PREVISTO_AQUECIMENTO numeric(15,2),
    TEMPO_PREVISTO_APROVACAO numeric(15,2),
    TEMPO_REALIZADO_OPERACIONAL numeric(15,2),
    TEMPO_REALIZADO_FERRAMENTA numeric(15,2),
    TEMPO_REALIZADO_AQUECIMENTO numeric(15,2),
    TEMPO_REALIZADO_APROVACAO numeric(15,2),
    PERFIL_SKU varchar(10),
    TEMPO_PARADO numeric(15,2),
    PERDAS numeric(15,2),
    PERFIL_SKU_DESCRICAO varchar(500),
    PERDAS_PERC1 numeric(15,2),
    EFICIENCIA_MINIMA numeric(15,2),
    EFICIENCIA_A numeric(15,2),
    EFICIENCIA_B numeric(15,2),
    PERDAS_A numeric(15,2),
    PERDAS_B numeric(15,2),
    TEMPO_EXTRA numeric(15,2),
    TEMPO_EFIC numeric(15,2),
    TURNO integer,
    EFIC numeric(15,2))
as
begin

  for
    SELECT
    
            iif(PERDAS_PERC > 100,100,PERDAS_PERC) as PERDAS_PERC,
    
            iif(z.efic > 100,100,z.efic) as eficiencia,
            (TEMPO_PREVISTO_FERRAMENTA+
            TEMPO_PREVISTO_AQUECIMENTO+
            TEMPO_PREVISTO_APROVACAO) as SETUP_PREVISTO,
    
            (TEMPO_REALIZADO_FERRAMENTA+
            TEMPO_REALIZADO_AQUECIMENTO+
            TEMPO_REALIZADO_APROVACAO) as SETUP_REALIZADO,
    
            iif(z.efic < EFICIENCIA_A,1,
            iif(z.efic >= EFICIENCIA_A and z.efic <= EFICIENCIA_B,2,
            iif(z.efic > EFICIENCIA_B,3,0))) as cor_efic,
    
            coalesce((SELECT
                        list(j.descricao||': '||coalesce(p.observacao,''),',<br>') from
                    TBREGISTRO_PARADA P,
                    tbjustificativa J
                    where p.tabela = 'INEFICIENCIA'
                    and p.tabela_id = z.PROGRAMACAO_ID
                    and j.id = p.status)
    
            ,'') as JUSTIFICATIVA,
    
            z.*
    
        from(
        SELECT
            PROGRAMACAO_ID,
            REQUISICAO_ID,
            GP_ID,
            GP_DESCRICAO,
            UP_ID,
            UP_DESCRICAO,
            ESTACAO,
            ESTACAO_DESCRICAO,
            REMESSA,
            REMESSA_ID,
            REMESSA_DATA,
            REMESSA_TALAO_ID,
            TALAO_ID,
            PRODUTO_ID,
            PRODUTO_DESCRICAO,
            MODELO_ID,
            MODELO_DESCRICAO,
            COR_ID,
            COR_DESCRICAO,
            TAMANHO,
            TAMANHO_DESCRICAO,
            QUANTIDADE,
            UM,
            FERRAMENTA_ID,
            FERRAMENTA_DESCICAO,
            formatdatetime(DATAHORA_REALIZADO_INICIO) as DATAHORA_REALIZADO_INICIO,
            formatdatetime(DATAHORA_REALIZADO_FIM) as DATAHORA_REALIZADO_FIM,
            TEMPO_PREVISTO,
            TEMPO_REALIZADO,
            TEMPO_PREVISTO_OPERACIONAL,
            TEMPO_PREVISTO_FERRAMENTA,
            TEMPO_PREVISTO_AQUECIMENTO,
            TEMPO_PREVISTO_APROVACAO,
            IIF( TEMPO_REALIZADO_OPERACIONAL < 0, 0, TEMPO_REALIZADO_OPERACIONAL) TEMPO_REALIZADO_OPERACIONAL,
            TEMPO_REALIZADO_FERRAMENTA,
            TEMPO_REALIZADO_AQUECIMENTO,
            TEMPO_REALIZADO_APROVACAO,
            PERFIL_SKU,
            TEMPO_PARADO,
            TEMPO_EXTRA,
            PERDAS,
            PERFIL_SKU_DESCRICAO,
            cast(((PERDAS / iif(QUANTIDADE > 0,QUANTIDADE,1)) * 100) as numeric(15,2)) PERDAS_PERC,
            EFICIENCIA_MINIMA,
            EFICIENCIA_A,
            EFICIENCIA_B,
            PERDAS_A,
            PERDAS_B,
            iif(TEMPO_EFIC > 0, TEMPO_EFIC,0) as TEMPO_EFIC,

            (select first 1 b.codigo from tbturno_producao b where (COMPARE_HORA(b.hora_inicio,b.hora_fim,gethora(DATAHORA_REALIZADO_FIM))) = 1 and b.dia_semana = iif(gethora(DATAHORA_REALIZADO_FIM) < '07:00:00', (extract(weekday from DATAHORA_REALIZADO_FIM)-1),extract(weekday from DATAHORA_REALIZADO_FIM))) as turno,
            (TEMPO_PREVISTO_OPERACIONAL / iif(TEMPO_EFIC>0,TEMPO_EFIC,1) * 100) as efic
        
        FROM (
            SELECT
                ((TEMPO_REALIZADO - TEMPO_REALIZADO_FERRAMENTA - TEMPO_REALIZADO_AQUECIMENTO - TEMPO_REALIZADO_APROVACAO) + TEMPO_EXTRA + TEMPO_PARADO) as TEMPO_EFIC,
                PROGRAMACAO_ID,
                REQUISICAO_ID,
                GP_ID,
                GP_DESCRICAO,
                UP_ID,
                UP_DESCRICAO,
                ESTACAO,
                ESTACAO_DESCRICAO,
                REMESSA,
                REMESSA_ID,
                REMESSA_DATA,
                REMESSA_TALAO_ID,
                TALAO_ID,
                PRODUTO_ID,
                PRODUTO_DESCRICAO,
                MODELO_ID,
                MODELO_DESCRICAO,
                COR_ID,
                COR_DESCRICAO,
                TAMANHO,
                TAMANHO_DESCRICAO,
                QUANTIDADE,
                UM,
                FERRAMENTA_ID,
                FERRAMENTA_DESCICAO,
                DATAHORA_REALIZADO_INICIO,
                DATAHORA_REALIZADO_FIM,
                TEMPO_PREVISTO,
                TEMPO_REALIZADO,
                TEMPO_PREVISTO_OPERACIONAL,
                TEMPO_PREVISTO_FERRAMENTA,
                TEMPO_PREVISTO_AQUECIMENTO,
                TEMPO_PREVISTO_APROVACAO,
                (TEMPO_REALIZADO - TEMPO_REALIZADO_FERRAMENTA - TEMPO_REALIZADO_AQUECIMENTO - TEMPO_REALIZADO_APROVACAO) TEMPO_REALIZADO_OPERACIONAL,
                TEMPO_REALIZADO_FERRAMENTA,
                TEMPO_REALIZADO_AQUECIMENTO,
                TEMPO_REALIZADO_APROVACAO,
                TEMPO_PARADO,
                PERFIL_SKU,
                PERDAS,
                PF.descricao as PERFIL_SKU_DESCRICAO,
                PF.efic_minima as EFICIENCIA_MINIMA,
                PF.efic_a as EFICIENCIA_A,
                PF.efic_b as EFICIENCIA_B,
                PF.perda_a as PERDAS_A,
                PF.perda_b as PERDAS_B,
                TEMPO_EXTRA
            
            FROM (
                SELECT
                    P.ID                                            AS PROGRAMACAO_ID,   
                    A.REQUISICAO_ID                                 AS REQUISICAO_ID,
                    G.ID                                            AS GP_ID,
                    G.DESCRICAO                                     AS GP_DESCRICAO,
                    U.ID                                            AS UP_ID,
                    U.DESCRICAO                                     AS UP_DESCRICAO,
                    P.ESTACAO                                       AS ESTACAO,
                    SU.DESCRICAO                                    AS ESTACAO_DESCRICAO,
                    R.REMESSA                                       AS REMESSA,
                    T.REMESSA_ID                                    AS REMESSA_ID,
                    R.DATA                                          AS REMESSA_DATA,
                    T.REMESSA_TALAO_ID                              AS REMESSA_TALAO_ID,
                    T.ID                                            AS TALAO_ID,
                    PR.CODIGO                                       AS PRODUTO_ID,
                    PR.DESCRICAO                                    AS PRODUTO_DESCRICAO,
                    M.CODIGO                                        AS MODELO_ID,
                    M.DESCRICAO                                     AS MODELO_DESCRICAO,
                    C.CODIGO                                        AS COR_ID,
                    C.DESCRICAO                                     AS COR_DESCRICAO,
                    P.TAMANHO                                       AS TAMANHO,
                    TAMANHO_GRADE(GR.CODIGO,P.TAMANHO)              AS TAMANHO_DESCRICAO,
                    A.QUANTIDADE                                    AS QUANTIDADE,
                    PR.UNIDADEMEDIDA_SIGLA2                          AS UM,
                    A.datahora_realizado_inicio                     AS DATAHORA_REALIZADO_INICIO,
                    A.DATAHORA_REALIZADO_FIM                        AS DATAHORA_REALIZADO_FIM,
                    P.TEMPO                                         AS TEMPO_PREVISTO,
                    A.TEMPO_REALIZADO                               AS TEMPO_REALIZADO,
                    A.TEMPO_OPERACIONAL                             AS TEMPO_PREVISTO_OPERACIONAL,
                    A.TEMPO_SETUP_FERRAMENTA                        AS TEMPO_PREVISTO_FERRAMENTA,
                    (A.TEMPO_SETUP_AQUECIMENTO + A.TEMPO_SETUP_COR) AS TEMPO_PREVISTO_AQUECIMENTO,
                    A.TEMPO_SETUP_APROVACAO                         AS TEMPO_PREVISTO_APROVACAO,
                    coalesce(a.tempo_parado,0)                      AS TEMPO_PARADO,
                    coalesce(a.tempo_estacao,0)                     AS TEMPO_EXTRA,

                
                    CAST(COALESCE((SELECT FIRST 1 DATEDIFF(MINUTE, S.DATAHORA_INICIO, S.DATAHORA_FIM)
                                     FROM TBREGISTRO_SETUP S
                                    WHERE S.TALAO_ID = P.TABELA_ID
                                      AND S.REQUISICAO_ID = A.REQUISICAO_ID
                                      AND S.SETUP_ID = 1),0) AS NUMERIC(15,4)) AS TEMPO_REALIZADO_FERRAMENTA,
                
                
                   CAST(COALESCE((SELECT FIRST 1 DATEDIFF(MINUTE, S.DATAHORA_INICIO, S.DATAHORA_FIM)
                                    FROM TBREGISTRO_SETUP S
                                   WHERE S.TALAO_ID = P.TABELA_ID
                                     AND S.REQUISICAO_ID = A.REQUISICAO_ID
                                     AND S.SETUP_ID = 2),0) AS NUMERIC(15,4)) AS TEMPO_REALIZADO_AQUECIMENTO,
                
                
                   CAST(COALESCE((SELECT FIRST 1 DATEDIFF(MINUTE, S.DATAHORA_INICIO, S.DATAHORA_FIM)
                                    FROM TBREGISTRO_SETUP S
                                   WHERE S.TALAO_ID = P.TABELA_ID
                                     AND S.REQUISICAO_ID = A.REQUISICAO_ID
                                     AND S.SETUP_ID = 3),0) AS NUMERIC(15,4)) AS TEMPO_REALIZADO_APROVACAO,
            
                  (SELECT FIRST 1 SK.PERFIL
                     FROM VWSKU SK
                    WHERE SK.MODELO_ID = M.CODIGO
                     AND SK.COR_ID    = C.CODIGO
                     AND SK.TAMANHO   = T.TAMANHO) PERFIL_SKU,
        
                    A.FERRAMENTA_ID,
        
                    (SELECT FIRST 1 LPAD(F.SERIE,4,'0') || ' - ' || DESCRICAO FROM TBFERRAMENTARIA F WHERE F.ID = A.FERRAMENTA_ID) FERRAMENTA_DESCICAO,
    
                    coalesce((SELECT
                        SUM(D.quantidade) AS quantidade
                    FROM
                        TbDefeito_Transacao_Item D,
                        tbsac_defeito j
                    WHERE d.remessa           = r.remessa_id
                        AND d.remessa_controle  = t.remessa_talao_id
                        and d.defeito_id        = j.codigo
                        and j.conformacao       = '1'
                    ),0) as PERDAS
                
                FROM
                    TBPROGRAMACAO_REQUISICAO A,
                    TBPROGRAMACAO P,
                    VWREMESSA_TALAO T,
                    VWREMESSA R,
                    TBGP G,
                    TBUP U,
                    TBSUB_UP SU,
                    TBPRODUTO PR,
                    TBMODELO M,
                    TBCOR C,
                    TBGRADE GR
                
                WHERE p.gp_id    = :I_GP_ID
                and p.up_id    = :I_UP_ID
                AND P.ID            = A.PROGRAMACAO_ID
                AND P.FERRAMENTA_ID > 0
                AND A.STATUS        = 3
                AND P.TIPO          = 'A'
                AND P.TABELA_ID     = T.ID
                AND R.REMESSA_ID    = T.REMESSA_ID
                AND G.ID            = P.GP_ID
                AND U.ID            = P.UP_ID
                AND SU.UP_ID        = P.UP_ID
                AND SU.ID           = P.ESTACAO
                AND PR.CODIGO       = P.PRODUTO_ID
                AND M.CODIGO        = PR.MODELO_CODIGO
                AND C.CODIGO        = PR.COR_CODIGO
                AND GR.CODIGO       = PR.GRADE_CODIGO
                AND A.DATAHORA_REALIZADO_FIM >= iif(:I_FLAG = 1, cast(cast(:i_data_inicio as date) ||' '|| (select first 1 tt.hora_inicio from tbturno_producao tt where tt.dia_semana = extract(weekday from cast(:i_data_inicio as date))) as timestamp),
                                                                 cast((select first 2 k.data_producao from tbturno_producao k where k.turno_corrente = 1) ||' '|| (select first 1 tt.hora_inicio from tbturno_producao  tt where tt.dia_semana = extract(weekday from (select first 2 k.data_producao from tbturno_producao k where k.turno_corrente = 1))) as timestamp))
                and iif(:i_flag = 1,
                    A.DATAHORA_REALIZADO_FIM BETWEEN

                    cast(cast(:i_data_inicio as date) ||' '|| (select first 1 tt.hora_inicio from tbturno_producao tt where tt.dia_semana = extract(weekday from cast(:i_data_inicio as date))) as timestamp)
                    and
                    cast(dateadd(day, 1 ,cast(:i_data_fim as date)) ||' '|| (select first 1 tt.hora_inicio - 0.0000001 from tbturno_producao tt where tt.dia_semana = extract(weekday from cast(:i_data_inicio as date))) as timestamp),


                    A.DATAHORA_REALIZADO_FIM >= cast((select first 2 k.data_producao from tbturno_producao k where k.turno_corrente = 1) ||' '|| (select first 1 tt.hora_inicio from tbturno_producao  tt where tt.dia_semana = extract(weekday from (select first 2 k.data_producao from tbturno_producao k where k.turno_corrente = 1))) as timestamp)
                )
        
            ) X, TBPERFIL PF
    
            where PF.tabela = 'SKU' and  PF.id = PERFIL_SKU
        ) Y
    )Z
    order by z.estacao,z.datahora_realizado_fim

  into
    :PERDAS_PERC,
    :EFICIENCIA,
    :SETUP_PREVISTO,
    :SETUP_REALIZADO,
    :COR_EFIC,
    :JUSTIFICATIVA,
    :PROGRAMACAO_ID,
    :REQUISICAO_ID,
    :GP_ID,
    :GP_DESCRICAO,
    :UP_ID,
    :UP_DESCRICAO,
    :ESTACAO,
    :ESTACAO_DESCRICAO,
    :REMESSA,
    :REMESSA_ID,
    :REMESSA_DATA,
    :REMESSA_TALAO_ID,
    :TALAO_ID,
    :PRODUTO_ID,
    :PRODUTO_DESCRICAO,
    :MODELO_ID,
    :MODELO_DESCRICAO,
    :COR_ID,
    :COR_DESCRICAO,
    :TAMANHO,
    :TAMANHO_DESCRICAO,
    :QUANTIDADE,
    :UM,
    :FERRAMENTA_ID,
    :FERRAMENTA_DESCICAO,
    :DATAHORA_REALIZADO_INICIO,
    :DATAHORA_REALIZADO_FIM,
    :TEMPO_PREVISTO,
    :TEMPO_REALIZADO,
    :TEMPO_PREVISTO_OPERACIONAL,
    :TEMPO_PREVISTO_FERRAMENTA,
    :TEMPO_PREVISTO_AQUECIMENTO,
    :TEMPO_PREVISTO_APROVACAO,
    :TEMPO_REALIZADO_OPERACIONAL,
    :TEMPO_REALIZADO_FERRAMENTA,
    :TEMPO_REALIZADO_AQUECIMENTO,
    :TEMPO_REALIZADO_APROVACAO,
    :PERFIL_SKU,
    :TEMPO_PARADO,
    :TEMPO_EXTRA,
    :PERDAS,
    :PERFIL_SKU_DESCRICAO,
    :PERDAS_PERC1,
    :EFICIENCIA_MINIMA,
    :EFICIENCIA_A,
    :EFICIENCIA_B,
    :PERDAS_A,
    :PERDAS_B,
    :TEMPO_EFIC,
    :TURNO,
    :EFIC
  do
  begin
    suspend;
  end

end
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER procedure SPC_PROJECAO_CONSUMO
returns (
    EMCONFERENCIA integer,
    FAMILIA varchar(100),
    PRODUTO varchar(100),
    UM varchar(10),
    LOCALIZACAO integer,
    ESTOQUE numeric(15,2),
    EMPENHADO numeric(15,2),
    ALOCADO numeric(15,2),
    DISPONIVEL numeric(15,2),
    PROJECAO numeric(15,2),
    COMPRADO numeric(15,2),
    REVISAO numeric(15,2),
    ESTOQUEMIN numeric(15,2),
    ESTOQUEMAX numeric(15,2),
    NECESSIDADE numeric(15,2),
    ESTRAGADO numeric(15,2),
    PRODUTO_ID integer,
    FLAG integer,
    ESTOQUE_SEGURANCA integer,
    PONTO_REPOSICAO integer,
    TIPO_REPOSICAO integer)
as
declare variable VMODELO_ID integer;
declare variable VMODELO_DESCRICAO varchar(100);
declare variable VCOR_ID integer;
declare variable VCOR_DESCRICAO varchar(100);
declare variable VTAM_DESCRICAO varchar(100);
declare variable VGRADE_CODIGO integer;
declare variable VTAMANHO integer;
declare variable VQUANTIDADE integer;
declare variable VSALDO_FATURAR numeric(15,2);
declare variable VALOC_EST numeric(15,2);
declare variable VALOC_REM numeric(15,2);
declare variable VALOC_AGR numeric(15,2);
declare variable VFAMILIA_CODIGO integer;
declare variable VFAMILIA_DESCRICAO varchar(100);
declare variable VPRODUTO_ID integer;
declare variable VTAM integer;
declare variable VGRADE_CODIGO2 integer;
declare variable VPRODUTO_DESCRICAO varchar(100);
declare variable VUM varchar(100);
declare variable VLOCALIZACAO_CODIGO integer;
declare variable VTAM_DESCRICAO2 varchar(100);
declare variable VPROJECAO numeric(15,2);
declare variable VESTOQUE numeric(15,2);
declare variable VEMPENHADO numeric(15,2);
declare variable VALOCADO numeric(15,2);
declare variable VCOMPRADO numeric(15,2);
declare variable VREVISAO numeric(15,2);
declare variable VESTRAGADO numeric(15,2);
declare variable VESTOQUE_MINIMO integer;
declare variable VESTOQUE_MAXIMO integer;
declare variable VLOC_REV integer;
declare variable VLOC_EST integer;
declare variable VEMCONFERENCIA numeric(15,2);
declare variable VPONTO_REPOSICAO integer;
declare variable VESTOQUE_SEGURANCA integer;
declare variable VTIPO_REPOSICAO integer;
declare variable VESTABELECIMENTOCOD integer;
declare variable CODFAMILIA varchar(80);
declare variable DATAINICIALPEDIDOS date;
declare variable DATAFINALPEDIDOS date;
BEGIN
CODFAMILIA = '39';
VESTABELECIMENTOCOD = 1;
DATAINICIALPEDIDOS = current_date - 365 - 182;
DATAFINALPEDIDOS = current_date + 40;

FOR select
  Modelo_Id,
  Modelo_Descricao,
  Cor_Id,
  Cor_Descricao,
  Tam_Descricao,
  Grade_Codigo,
  Tamanho,
  Saldo_Faturar,
  (Saldo_Faturar - Aloc_Est - Aloc_Rem) as Quantidade,
  Aloc_Est,
  Aloc_Rem,
  Aloc_Agr


 from (

Select
  --0 Pedido,
  --Cast(null as Date) Data,
  --Cast(null as Date) Prev_Faturamento,
  --Cast(null as Date) Data_Cliente,
  --0 Cliente_Codigo,
  --Cast(null as VarChar(20)) Cliente,
  A.Modelo_Codigo Modelo_Id,
  M.Descricao Modelo_Descricao,
  A.Cor_Id,
  (Select First 1 C.Descricao From TbCor C Where C.Codigo = A.Cor_Id) Cor_Descricao,
  (Select Tam_Descricao From Sp_Tamanho_Grade (M.Grade_Codigo,A.Tamanho)) Tam_Descricao,
  M.Grade_Codigo,
  A.Tamanho,
  Cast(Sum(A.Quantidade) as Numeric(15,4)) Quantidade,
  Cast(Sum(S.Quantidade) as Numeric(15,4)) Saldo_Faturar,
  Cast(Sum(A.Qtd_Est) as Numeric(15,4)) Aloc_Est,
  Cast(Sum(A.Qtd_Rem) as Numeric(15,4)) Aloc_Rem,
  Cast(Sum(A.Qtd_Agp) as Numeric(15,4)) Aloc_Agr

From TbPedido_Item A, TbPedido P, TbModelo M, TbPedido_Item_Saldo S
Where A.Estabelecimento_Codigo = :VESTABELECIMENTOCOD
  and A.Estabelecimento_Codigo = P.Estabelecimento_Codigo
  and A.Controle = S.Pedido_Item_Controle
  and A.Pedido = P.Pedido
  and A.Modelo_codigo = M.Codigo
  and Coalesce(P.Remessa_Id,0) = 0

  and P.DATA_ENTREGA between :DATAINICIALPEDIDOS and :DATAFINALPEDIDOS
--  and P.DATA between '01.01.2014' and current_date
  and P.STATUS=1
  and P.SITUACAO=1
  and A.situacao=1

Group By A.Modelo_Codigo, M.Descricao, A.Cor_Id, M.Grade_Codigo, A.Tamanho,Cor_Descricao,Tam_Descricao
)
Where (Saldo_Faturar - Aloc_Est - Aloc_Rem) > 0

INTO
    :VMODELO_ID,
    :VMODELO_DESCRICAO,
    :VCOR_ID,
    :VCOR_DESCRICAO,
    :VTAM_DESCRICAO,
    :VGRADE_CODIGO,
    :VTAMANHO,
    :VSALDO_FATURAR,
    :VQUANTIDADE,
    :VALOC_EST,
    :VALOC_REM,
    :VALOC_AGR

DO
begin
    FOR
      SELECT P.Familia_Codigo, (Select First 1 F.Descricao From TbFamilia F Where F.Codigo = P.Familia_Codigo) Familia_Descricao,
       B.CONSUMO_PRODUTO_CODIGO PRODUTO_ID, B.Tam, P.Grade_Codigo, P.DESCRICAO Produto_Descricao, P.UNIDADEMEDIDA_SIGLA2 UM,
       P.Localizacao_Codigo, (Select Tam_Descricao From SP_Tamanho_Grade (P.Grade_Codigo,B.Tam)) Tam_Descricao,

        Cast((
         (Case When (Cast(:vtamanho as integer)= 0) and (B.CONSUMO_QUANTIDADE     > 0) Then Cast( (Cast(:vQuantidade as Numeric(15,4)) * CAST((B.CONSUMO_QUANTIDADE    /B.FATOR_CONVERSAO)AS NUMERIC(15,8))) as Numeric(15,4)) else 0 end) +
         (Case When (Cast(:vtamanho as integer)= 1) and (B.CONSUMO_QUANTIDADE_T01 > 0) Then Cast( (Cast(:vQuantidade as Numeric(15,4)) * CAST((B.CONSUMO_QUANTIDADE_T01/B.FATOR_CONVERSAO)AS NUMERIC(15,8))) as Numeric(15,4)) else 0 end) +
         (Case When (Cast(:vtamanho as integer)= 2) and (B.CONSUMO_QUANTIDADE_T02 > 0) Then Cast( (Cast(:vQuantidade as Numeric(15,4)) * CAST((B.CONSUMO_QUANTIDADE_T02/B.FATOR_CONVERSAO)AS NUMERIC(15,8))) as Numeric(15,4)) else 0 end) +
         (Case When (Cast(:vtamanho as integer)= 3) and (B.CONSUMO_QUANTIDADE_T03 > 0) Then Cast( (Cast(:vQuantidade as Numeric(15,4)) * CAST((B.CONSUMO_QUANTIDADE_T03/B.FATOR_CONVERSAO)AS NUMERIC(15,8))) as Numeric(15,4)) else 0 end) +
         (Case When (Cast(:vtamanho as integer)= 4) and (B.CONSUMO_QUANTIDADE_T04 > 0) Then Cast( (Cast(:vQuantidade as Numeric(15,4)) * CAST((B.CONSUMO_QUANTIDADE_T04/B.FATOR_CONVERSAO)AS NUMERIC(15,8))) as Numeric(15,4)) else 0 end) +
         (Case When (Cast(:vtamanho as integer)= 5) and (B.CONSUMO_QUANTIDADE_T05 > 0) Then Cast( (Cast(:vQuantidade as Numeric(15,4)) * CAST((B.CONSUMO_QUANTIDADE_T05/B.FATOR_CONVERSAO)AS NUMERIC(15,8))) as Numeric(15,4)) else 0 end) +
         (Case When (Cast(:vtamanho as integer)= 6) and (B.CONSUMO_QUANTIDADE_T06 > 0) Then Cast( (Cast(:vQuantidade as Numeric(15,4)) * CAST((B.CONSUMO_QUANTIDADE_T06/B.FATOR_CONVERSAO)AS NUMERIC(15,8))) as Numeric(15,4)) else 0 end) +
         (Case When (Cast(:vtamanho as integer)= 7) and (B.CONSUMO_QUANTIDADE_T07 > 0) Then Cast( (Cast(:vQuantidade as Numeric(15,4)) * CAST((B.CONSUMO_QUANTIDADE_T07/B.FATOR_CONVERSAO)AS NUMERIC(15,8))) as Numeric(15,4)) else 0 end) +
         (Case When (Cast(:vtamanho as integer)= 8) and (B.CONSUMO_QUANTIDADE_T08 > 0) Then Cast( (Cast(:vQuantidade as Numeric(15,4)) * CAST((B.CONSUMO_QUANTIDADE_T08/B.FATOR_CONVERSAO)AS NUMERIC(15,8))) as Numeric(15,4)) else 0 end) +
         (Case When (Cast(:vtamanho as integer)= 9) and (B.CONSUMO_QUANTIDADE_T09 > 0) Then Cast( (Cast(:vQuantidade as Numeric(15,4)) * CAST((B.CONSUMO_QUANTIDADE_T09/B.FATOR_CONVERSAO)AS NUMERIC(15,8))) as Numeric(15,4)) else 0 end) +
         (Case When (Cast(:vtamanho as integer)=10) and (B.CONSUMO_QUANTIDADE_T10 > 0) Then Cast( (Cast(:vQuantidade as Numeric(15,4)) * CAST((B.CONSUMO_QUANTIDADE_T10/B.FATOR_CONVERSAO)AS NUMERIC(15,8))) as Numeric(15,4)) else 0 end) +
         (Case When (Cast(:vtamanho as integer)=11) and (B.CONSUMO_QUANTIDADE_T11 > 0) Then Cast( (Cast(:vQuantidade as Numeric(15,4)) * CAST((B.CONSUMO_QUANTIDADE_T11/B.FATOR_CONVERSAO)AS NUMERIC(15,8))) as Numeric(15,4)) else 0 end) +
         (Case When (Cast(:vtamanho as integer)=12) and (B.CONSUMO_QUANTIDADE_T12 > 0) Then Cast( (Cast(:vQuantidade as Numeric(15,4)) * CAST((B.CONSUMO_QUANTIDADE_T12/B.FATOR_CONVERSAO)AS NUMERIC(15,8))) as Numeric(15,4)) else 0 end) +
         (Case When (Cast(:vtamanho as integer)=13) and (B.CONSUMO_QUANTIDADE_T13 > 0) Then Cast( (Cast(:vQuantidade as Numeric(15,4)) * CAST((B.CONSUMO_QUANTIDADE_T13/B.FATOR_CONVERSAO)AS NUMERIC(15,8))) as Numeric(15,4)) else 0 end) +
         (Case When (Cast(:vtamanho as integer)=14) and (B.CONSUMO_QUANTIDADE_T14 > 0) Then Cast( (Cast(:vQuantidade as Numeric(15,4)) * CAST((B.CONSUMO_QUANTIDADE_T14/B.FATOR_CONVERSAO)AS NUMERIC(15,8))) as Numeric(15,4)) else 0 end) +
         (Case When (Cast(:vtamanho as integer)=15) and (B.CONSUMO_QUANTIDADE_T15 > 0) Then Cast( (Cast(:vQuantidade as Numeric(15,4)) * CAST((B.CONSUMO_QUANTIDADE_T15/B.FATOR_CONVERSAO)AS NUMERIC(15,8))) as Numeric(15,4)) else 0 end) +
         (Case When (Cast(:vtamanho as integer)=16) and (B.CONSUMO_QUANTIDADE_T16 > 0) Then Cast( (Cast(:vQuantidade as Numeric(15,4)) * CAST((B.CONSUMO_QUANTIDADE_T16/B.FATOR_CONVERSAO)AS NUMERIC(15,8))) as Numeric(15,4)) else 0 end) +
         (Case When (Cast(:vtamanho as integer)=17) and (B.CONSUMO_QUANTIDADE_T17 > 0) Then Cast( (Cast(:vQuantidade as Numeric(15,4)) * CAST((B.CONSUMO_QUANTIDADE_T17/B.FATOR_CONVERSAO)AS NUMERIC(15,8))) as Numeric(15,4)) else 0 end) +
         (Case When (Cast(:vtamanho as integer)=18) and (B.CONSUMO_QUANTIDADE_T18 > 0) Then Cast( (Cast(:vQuantidade as Numeric(15,4)) * CAST((B.CONSUMO_QUANTIDADE_T18/B.FATOR_CONVERSAO)AS NUMERIC(15,8))) as Numeric(15,4)) else 0 end) +
         (Case When (Cast(:vtamanho as integer)=19) and (B.CONSUMO_QUANTIDADE_T19 > 0) Then Cast( (Cast(:vQuantidade as Numeric(15,4)) * CAST((B.CONSUMO_QUANTIDADE_T19/B.FATOR_CONVERSAO)AS NUMERIC(15,8))) as Numeric(15,4)) else 0 end) +
         (Case When (Cast(:vtamanho as integer)=20) and (B.CONSUMO_QUANTIDADE_T20 > 0) Then Cast( (Cast(:vQuantidade as Numeric(15,4)) * CAST((B.CONSUMO_QUANTIDADE_T20/B.FATOR_CONVERSAO)AS NUMERIC(15,8))) as Numeric(15,4)) else 0 end)) as Numeric(15,4))  Projecao
        
         FROM TBMODELO_CONSUMO B, TbProduto P
        WHERE B.MODELO_Codigo = :vmodelo_id
          and B.CONSUMO_PRODUTO_CODIGO = P.Codigo
          and p.familia_codigo in (select osplit from split(:codfamilia,','))
          /*P.FAMILIA_CODIGO*/
        
        Union
        
        SELECT P.Familia_Codigo, (Select First 1 F.Descricao From TbFamilia F Where F.Codigo = P.Familia_Codigo) Familia_Descricao,
               B.PRODUTO_ID, B.Tam, P.Grade_Codigo, P.DESCRICAO Produto_Descricao, P.UNIDADEMEDIDA_SIGLA2 UM,
               P.Localizacao_Codigo, (Select Tam_Descricao From SP_Tamanho_Grade (P.Grade_Codigo,B.Tam)) Tam_Descricao,
        
        Cast((
         (Case When (Cast(:vtamanho as integer)= 0) and (B.QUANTIDADE     > 0) Then Cast( (Cast(:vQuantidade as Numeric(15,4)) * CAST((B.QUANTIDADE    /B.FATOR_CONVERSAO)AS NUMERIC(15,8))) as Numeric(15,4)) else 0 end) +
         (Case When (Cast(:vtamanho as integer)= 1) and (B.T01 > 0) Then Cast( (Cast(:vQuantidade as Numeric(15,4)) * CAST((B.T01/B.FATOR_CONVERSAO)AS NUMERIC(15,8))) as Numeric(15,4)) else 0 end) +
         (Case When (Cast(:vtamanho as integer)= 2) and (B.T02 > 0) Then Cast( (Cast(:vQuantidade as Numeric(15,4)) * CAST((B.T02/B.FATOR_CONVERSAO)AS NUMERIC(15,8))) as Numeric(15,4)) else 0 end) +
         (Case When (Cast(:vtamanho as integer)= 3) and (B.T03 > 0) Then Cast( (Cast(:vQuantidade as Numeric(15,4)) * CAST((B.T03/B.FATOR_CONVERSAO)AS NUMERIC(15,8))) as Numeric(15,4)) else 0 end) +
         (Case When (Cast(:vtamanho as integer)= 4) and (B.T04 > 0) Then Cast( (Cast(:vQuantidade as Numeric(15,4)) * CAST((B.T04/B.FATOR_CONVERSAO)AS NUMERIC(15,8))) as Numeric(15,4)) else 0 end) +
         (Case When (Cast(:vtamanho as integer)= 5) and (B.T05 > 0) Then Cast( (Cast(:vQuantidade as Numeric(15,4)) * CAST((B.T05/B.FATOR_CONVERSAO)AS NUMERIC(15,8))) as Numeric(15,4)) else 0 end) +
         (Case When (Cast(:vtamanho as integer)= 6) and (B.T06 > 0) Then Cast( (Cast(:vQuantidade as Numeric(15,4)) * CAST((B.T06/B.FATOR_CONVERSAO)AS NUMERIC(15,8))) as Numeric(15,4)) else 0 end) +
         (Case When (Cast(:vtamanho as integer)= 7) and (B.T07 > 0) Then Cast( (Cast(:vQuantidade as Numeric(15,4)) * CAST((B.T07/B.FATOR_CONVERSAO)AS NUMERIC(15,8))) as Numeric(15,4)) else 0 end) +
         (Case When (Cast(:vtamanho as integer)= 8) and (B.T08 > 0) Then Cast( (Cast(:vQuantidade as Numeric(15,4)) * CAST((B.T08/B.FATOR_CONVERSAO)AS NUMERIC(15,8))) as Numeric(15,4)) else 0 end) +
         (Case When (Cast(:vtamanho as integer)= 9) and (B.T09 > 0) Then Cast( (Cast(:vQuantidade as Numeric(15,4)) * CAST((B.T09/B.FATOR_CONVERSAO)AS NUMERIC(15,8))) as Numeric(15,4)) else 0 end) +
         (Case When (Cast(:vtamanho as integer)=10) and (B.T10 > 0) Then Cast( (Cast(:vQuantidade as Numeric(15,4)) * CAST((B.T10/B.FATOR_CONVERSAO)AS NUMERIC(15,8))) as Numeric(15,4)) else 0 end) +
         (Case When (Cast(:vtamanho as integer)=11) and (B.T11 > 0) Then Cast( (Cast(:vQuantidade as Numeric(15,4)) * CAST((B.T11/B.FATOR_CONVERSAO)AS NUMERIC(15,8))) as Numeric(15,4)) else 0 end) +
         (Case When (Cast(:vtamanho as integer)=12) and (B.T12 > 0) Then Cast( (Cast(:vQuantidade as Numeric(15,4)) * CAST((B.T12/B.FATOR_CONVERSAO)AS NUMERIC(15,8))) as Numeric(15,4)) else 0 end) +
         (Case When (Cast(:vtamanho as integer)=13) and (B.T13 > 0) Then Cast( (Cast(:vQuantidade as Numeric(15,4)) * CAST((B.T13/B.FATOR_CONVERSAO)AS NUMERIC(15,8))) as Numeric(15,4)) else 0 end) +
         (Case When (Cast(:vtamanho as integer)=14) and (B.T14 > 0) Then Cast( (Cast(:vQuantidade as Numeric(15,4)) * CAST((B.T14/B.FATOR_CONVERSAO)AS NUMERIC(15,8))) as Numeric(15,4)) else 0 end) +
         (Case When (Cast(:vtamanho as integer)=15) and (B.T15 > 0) Then Cast( (Cast(:vQuantidade as Numeric(15,4)) * CAST((B.T15/B.FATOR_CONVERSAO)AS NUMERIC(15,8))) as Numeric(15,4)) else 0 end) +
         (Case When (Cast(:vtamanho as integer)=16) and (B.T16 > 0) Then Cast( (Cast(:vQuantidade as Numeric(15,4)) * CAST((B.T16/B.FATOR_CONVERSAO)AS NUMERIC(15,8))) as Numeric(15,4)) else 0 end) +
         (Case When (Cast(:vtamanho as integer)=17) and (B.T17 > 0) Then Cast( (Cast(:vQuantidade as Numeric(15,4)) * CAST((B.T17/B.FATOR_CONVERSAO)AS NUMERIC(15,8))) as Numeric(15,4)) else 0 end) +
         (Case When (Cast(:vtamanho as integer)=18) and (B.T18 > 0) Then Cast( (Cast(:vQuantidade as Numeric(15,4)) * CAST((B.T18/B.FATOR_CONVERSAO)AS NUMERIC(15,8))) as Numeric(15,4)) else 0 end) +
         (Case When (Cast(:vtamanho as integer)=19) and (B.T19 > 0) Then Cast( (Cast(:vQuantidade as Numeric(15,4)) * CAST((B.T19/B.FATOR_CONVERSAO)AS NUMERIC(15,8))) as Numeric(15,4)) else 0 end) +
         (Case When (Cast(:vtamanho as integer)=20) and (B.T20 > 0) Then Cast( (Cast(:vQuantidade as Numeric(15,4)) * CAST((B.T20/B.FATOR_CONVERSAO)AS NUMERIC(15,8))) as Numeric(15,4)) else 0 end)) as Numeric(15,4)) PROJECAO
        
         FROM TBMODELO_CONSUMO_COR B, TbProduto P
        WHERE B.MODELO_ID = :vmodelo_id
          AND B.COR_ID = :vcor_id
          and B.PRODUTO_ID = P.Codigo
          and p.familia_codigo in (select osplit from split(:codfamilia,','))
          /*P.FAMILIA_CODIGO*/
    INTO
        :vFAMILIA_CODIGO,
        :vFAMILIA_DESCRICAO,
        :vPRODUTO_ID,
        :vTAM,
        :vGRADE_CODIGO2,
        :vPRODUTO_DESCRICAO,
        :vUM,
        :vLOCALIZACAO_CODIGO,
        :vTAM_DESCRICAO2,
        :vPROJECAO

    DO
    Begin

    insert into TMP10168_1 (
        FAMILIA_CODIGO,
        FAMILIA_DESCRICAO,
        PRODUTO_ID,
        TAM,
        GRADE_CODIGO2,
        PRODUTO_DESCRICAO,
        UM,
        LOCALIZACAO_CODIGO,
        TAM_DESCRICAO,
        PROJECAO
        ) Values(
        :vFAMILIA_CODIGO,
        :vFAMILIA_DESCRICAO,
        :vPRODUTO_ID,
        :vTAM,
        :vGRADE_CODIGO2,
        :vPRODUTO_DESCRICAO,
        :vUM,
        :vLOCALIZACAO_CODIGO,
        :vTAM_DESCRICAO2,
        :vPROJECAO
        );

   end
end

   --/*
    for
        select
        FAMILIA_CODIGO,FAMILIA_DESCRICAO,PRODUTO_ID,TAM,GRADE_CODIGO2,
        PRODUTO_DESCRICAO,UM,LOCALIZACAO_CODIGO,TAM_DESCRICAO,sum(PROJECAO)
        from tmp10168_1 e group by
        FAMILIA_CODIGO,FAMILIA_DESCRICAO,PRODUTO_ID,TAM,GRADE_CODIGO2,
        PRODUTO_DESCRICAO,UM,LOCALIZACAO_CODIGO,TAM_DESCRICAO
   INTO
        :vFAMILIA_CODIGO,
        :vFAMILIA_DESCRICAO,
        :vPRODUTO_ID,
        :vTAM,
        :vGRADE_CODIGO2,
        :vPRODUTO_DESCRICAO,
        :vUM,
        :vLOCALIZACAO_CODIGO,
        :vTAM_DESCRICAO2,
        :vPROJECAO
   do
   Begin

    VLOC_REV= (select first 1 f.localizacao_revisao from tbfamilia_ficha f where f.familia_codigo = :vFAMILIA_CODIGO);
    VLOC_EST= (select first 1 f.localizacao_estragado from tbfamilia_ficha f where f.familia_codigo = :vFAMILIA_CODIGO);

          FOR
           select
             Coalesce(Cast((SELECT First 1
             Sum(IIF(Cast(:vtam as integer)= 0,S.SALDO,
             IIF(Cast(:vtam as integer)= 1,S.T01_SALDO, IIF(Cast(:vtam as integer)= 2,S.T02_SALDO,
             IIF(Cast(:vtam as integer)= 3,S.T03_SALDO, IIF(Cast(:vtam as integer)= 4,S.T04_SALDO,
             IIF(Cast(:vtam as integer)= 5,S.T05_SALDO, IIF(Cast(:vtam as integer)= 6,S.T06_SALDO,
             IIF(Cast(:vtam as integer)= 7,S.T07_SALDO, IIF(Cast(:vtam as integer)= 8,S.T08_SALDO,
             IIF(Cast(:vtam as integer)= 9,S.T09_SALDO, IIF(Cast(:vtam as integer)=10,S.T10_SALDO,
             IIF(Cast(:vtam as integer)=11,S.T11_SALDO, IIF(Cast(:vtam as integer)=12,S.T12_SALDO,
             IIF(Cast(:vtam as integer)=13,S.T13_SALDO, IIF(Cast(:vtam as integer)=14,S.T14_SALDO,
             IIF(Cast(:vtam as integer)=15,S.T15_SALDO, IIF(Cast(:vtam as integer)=16,S.T16_SALDO,
             IIF(Cast(:vtam as integer)=17,S.T17_SALDO, IIF(Cast(:vtam as integer)=18,S.T18_SALDO,
             IIF(Cast(:vtam as integer)=19,S.T19_SALDO, IIF(Cast(:vtam as integer)=20,S.T20_SALDO,
             0.0000))))))))))))))))))))))
              From TbEstoque_Saldo S
             Where S.Produto_Codigo = :vPRODUTO_ID
               And S.Localizacao_Codigo = :vLOCALIZACAO_CODIGO
               And S.ESTABELECIMENTO_CODIGO = :VESTABELECIMENTOCOD ) as Numeric(15,4)),0.0000) Estoque,
            
             Coalesce(Cast((Select Cast(Sum(E.Consumo_Kg-Coalesce(E.Quantidade_Conferencia,0)) as Numeric(15,4))
              From TbRemessa_Consumo E
             Where E.PRODUTO_ID = :vPRODUTO_ID
               and E.Conferencia = '0'
               and Coalesce(E.Componente,'0') = '0'
               and E.Estabelecimento_Id = :VESTABELECIMENTOCOD
               and E.Localizacao_Id = :vLOCALIZACAO_CODIGO
               and E.Tamanho = :vtam) as Numeric(15,4)),0.0000) Empenhado,
            
             Coalesce((Select Sum(SA.Saldo)
              From TbEstoque_Detalhe_Alocacao SA
             Where SA.Produto_Id = :vPRODUTO_ID
               and SA.Estabelecimento_Id = :VESTABELECIMENTOCOD
               and SA.Localizacao_Id = :vLOCALIZACAO_CODIGO
               and SA.Tipo <> 'R'
               and SA.Saldo > 0
               and SA.Tamanho = :vtam),0.0000) Alocado,
            
             Coalesce(Cast((SELECT
             Sum(IIF(Cast(:vtam as integer)= 0,Z.QUANTIDADE,
             IIF(Cast(:vtam as integer)= 1,Z.T01, IIF(Cast(:vtam as integer)= 2,Z.T02,
             IIF(Cast(:vtam as integer)= 3,Z.T03, IIF(Cast(:vtam as integer)= 4,Z.T04,
             IIF(Cast(:vtam as integer)= 5,Z.T05, IIF(Cast(:vtam as integer)= 6,Z.T06,
             IIF(Cast(:vtam as integer)= 7,Z.T07, IIF(Cast(:vtam as integer)= 8,Z.T08,
             IIF(Cast(:vtam as integer)= 9,Z.T09, IIF(Cast(:vtam as integer)=10,Z.T10,
             IIF(Cast(:vtam as integer)=11,Z.T11, IIF(Cast(:vtam as integer)=12,Z.T12,
             IIF(Cast(:vtam as integer)=13,Z.T13, IIF(Cast(:vtam as integer)=14,Z.T14,
             IIF(Cast(:vtam as integer)=15,Z.T15, IIF(Cast(:vtam as integer)=16,Z.T16,
             IIF(Cast(:vtam as integer)=17,Z.T17, IIF(Cast(:vtam as integer)=18,Z.T18,
             IIF(Cast(:vtam as integer)=19,Z.T19, IIF(Cast(:vtam as integer)=20,Z.T20,
             0.0000))))))))))))))))))))))
              From TbOc X, TbOc_Item Y, TbOC_Item_Saldo Z
             Where X.ESTABELECIMENTO_CODIGO = Y.ESTABELECIMENTO_CODIGO
               and X.Oc = Y.Oc
               and Y.Controle = Z.Oc_Item_Controle
               and Y.Situacao = 1
               and X.Status = 1
               and Y.Produto_Codigo = :vPRODUTO_ID
               and Y.ESTABELECIMENTO_CODIGO = :VESTABELECIMENTOCOD ) as Numeric(15,4)),0.0000) Comprado,
            
                 Coalesce(Cast((SELECT
                 Sum(IIF(Cast(:vtam as integer)= 0,Y.QUANTIDADE,
                 IIF(Cast(:vtam as integer)= 1,Y.T01, IIF(Cast(:vtam as integer)= 2,Y.T02,
                 IIF(Cast(:vtam as integer)= 3,Y.T03, IIF(Cast(:vtam as integer)= 4,Y.T04,
                 IIF(Cast(:vtam as integer)= 5,Y.T05, IIF(Cast(:vtam as integer)= 6,Y.T06,
                 IIF(Cast(:vtam as integer)= 7,Y.T07, IIF(Cast(:vtam as integer)= 8,Y.T08,
                 IIF(Cast(:vtam as integer)= 9,Y.T09, IIF(Cast(:vtam as integer)=10,Y.T10,
                 IIF(Cast(:vtam as integer)=11,Y.T11, IIF(Cast(:vtam as integer)=12,Y.T12,
                 IIF(Cast(:vtam as integer)=13,Y.T13, IIF(Cast(:vtam as integer)=14,Y.T14,
                 IIF(Cast(:vtam as integer)=15,Y.T15, IIF(Cast(:vtam as integer)=16,Y.T16,
                 IIF(Cast(:vtam as integer)=17,Y.T17, IIF(Cast(:vtam as integer)=18,Y.T18,
                 IIF(Cast(:vtam as integer)=19,Y.T19, IIF(Cast(:vtam as integer)=20,Y.T20,
                 0.0000))))))))))))))))))))))
                  From TbNFe X, TbNFe_Item Y, TbOperacao O
                 Where X.ESTABELECIMENTO_CODIGO = Y.ESTABELECIMENTO_CODIGO
                   and X.Controle = Y.NFe_Controle
                   and Y.Operacao_Codigo = O.Codigo
                   and X.Natureza = 2
                   and X.Situacao = 1
                   and X.ESTABELECIMENTO_CODIGO = :VESTABELECIMENTOCOD
                   and Y.Produto_Codigo = :vPRODUTO_ID
                   and X.Status_Revisao = '0'
                   and Y.Status_Revisao = '0'
                   and O.Controle_Revisao = '1'
                   and O.Controle_Estoque = '0'
                   ) as Numeric(15,4)),0.0000) Em_Conferencia,

             Coalesce(Cast((SELECT First 1
             Sum(IIF(Cast(:vtam as integer)= 0,S.SALDO,
             IIF(Cast(:vtam as integer)= 1,S.T01_SALDO, IIF(Cast(:vtam as integer)= 2,S.T02_SALDO,
             IIF(Cast(:vtam as integer)= 3,S.T03_SALDO, IIF(Cast(:vtam as integer)= 4,S.T04_SALDO,
             IIF(Cast(:vtam as integer)= 5,S.T05_SALDO, IIF(Cast(:vtam as integer)= 6,S.T06_SALDO,
             IIF(Cast(:vtam as integer)= 7,S.T07_SALDO, IIF(Cast(:vtam as integer)= 8,S.T08_SALDO,
             IIF(Cast(:vtam as integer)= 9,S.T09_SALDO, IIF(Cast(:vtam as integer)=10,S.T10_SALDO,
             IIF(Cast(:vtam as integer)=11,S.T11_SALDO, IIF(Cast(:vtam as integer)=12,S.T12_SALDO,
             IIF(Cast(:vtam as integer)=13,S.T13_SALDO, IIF(Cast(:vtam as integer)=14,S.T14_SALDO,
             IIF(Cast(:vtam as integer)=15,S.T15_SALDO, IIF(Cast(:vtam as integer)=16,S.T16_SALDO,
             IIF(Cast(:vtam as integer)=17,S.T17_SALDO, IIF(Cast(:vtam as integer)=18,S.T18_SALDO,
             IIF(Cast(:vtam as integer)=19,S.T19_SALDO, IIF(Cast(:vtam as integer)=20,S.T20_SALDO,
             0.0000))))))))))))))))))))))
              From TbEstoque_Saldo S
             Where S.Produto_Codigo = :vPRODUTO_ID
               And S.Localizacao_Codigo = :vloc_rev
               And S.ESTABELECIMENTO_CODIGO = :VESTABELECIMENTOCOD ) as Numeric(15,4)),0.0000) Revisao,
            
            Coalesce(Cast((SELECT First 1
             Sum(IIF(Cast(:vtam as integer)= 0,S.SALDO,
             IIF(Cast(:vtam as integer)= 1,S.T01_SALDO, IIF(Cast(:vtam as integer)= 2,S.T02_SALDO,
             IIF(Cast(:vtam as integer)= 3,S.T03_SALDO, IIF(Cast(:vtam as integer)= 4,S.T04_SALDO,
             IIF(Cast(:vtam as integer)= 5,S.T05_SALDO, IIF(Cast(:vtam as integer)= 6,S.T06_SALDO,
             IIF(Cast(:vtam as integer)= 7,S.T07_SALDO, IIF(Cast(:vtam as integer)= 8,S.T08_SALDO,
             IIF(Cast(:vtam as integer)= 9,S.T09_SALDO, IIF(Cast(:vtam as integer)=10,S.T10_SALDO,
             IIF(Cast(:vtam as integer)=11,S.T11_SALDO, IIF(Cast(:vtam as integer)=12,S.T12_SALDO,
             IIF(Cast(:vtam as integer)=13,S.T13_SALDO, IIF(Cast(:vtam as integer)=14,S.T14_SALDO,
             IIF(Cast(:vtam as integer)=15,S.T15_SALDO, IIF(Cast(:vtam as integer)=16,S.T16_SALDO,
             IIF(Cast(:vtam as integer)=17,S.T17_SALDO, IIF(Cast(:vtam as integer)=18,S.T18_SALDO,
             IIF(Cast(:vtam as integer)=19,S.T19_SALDO, IIF(Cast(:vtam as integer)=20,S.T20_SALDO,
             0.0000))))))))))))))))))))))
              From TbEstoque_Saldo S
             Where S.Produto_Codigo = :vPRODUTO_ID
               And S.Localizacao_Codigo = :vloc_est
               And S.ESTABELECIMENTO_CODIGO = :VESTABELECIMENTOCOD ) as Numeric(15,4)),0.0000) Estragado,

                Coalesce(Cast((SELECT First 1 B.Seguranca
           /*      IIF(Cast(:vtam as integer)= 0,B.QUANTIDADE,
                 IIF(Cast(:vtam as integer)= 1,B.T01, IIF(Cast(:vtam as integer)= 2,B.T02,
                 IIF(Cast(:vtam as integer)= 3,B.T03, IIF(Cast(:vtam as integer)= 4,B.T04,
                 IIF(Cast(:vtam as integer)= 5,B.T05, IIF(Cast(:vtam as integer)= 6,B.T06,
                 IIF(Cast(:vtam as integer)= 7,B.T07, IIF(Cast(:vtam as integer)= 8,B.T08,
                 IIF(Cast(:vtam as integer)= 9,B.T09, IIF(Cast(:vtam as integer)=10,B.T10,
                 IIF(Cast(:vtam as integer)=11,B.T11, IIF(Cast(:vtam as integer)=12,B.T12,
                 IIF(Cast(:vtam as integer)=13,B.T13, IIF(Cast(:vtam as integer)=14,B.T14,
                 IIF(Cast(:vtam as integer)=15,B.T15, IIF(Cast(:vtam as integer)=16,B.T16,
                 IIF(Cast(:vtam as integer)=17,B.T17, IIF(Cast(:vtam as integer)=18,B.T18,
                 IIF(Cast(:vtam as integer)=19,B.T19, IIF(Cast(:vtam as integer)=20,B.T20,   
                 0.0000))))))))))))))))))))) * (Coalesce(B.Seguranca,0.0000) / 100.0000) */
                FROM TbEstoque_Minimo B
                WHERE B.Estabelecimento_Codigo = :VESTABELECIMENTOCOD
                  and B.Localizacao_Codigo = :vLOCALIZACAO_CODIGO
                  and B.PRODUTO_Codigo = :vPRODUTO_ID) as Numeric(15,4)),0.0000) Estoque_Seguranca,
                
                 Coalesce(Cast((SELECT First 1
                 IIF(Cast(:vtam as integer)= 0,B.QUANTIDADE,
                 IIF(Cast(:vtam as integer)= 1,B.T01, IIF(Cast(:vtam as integer)= 2,B.T02,
                 IIF(Cast(:vtam as integer)= 3,B.T03, IIF(Cast(:vtam as integer)= 4,B.T04,
                 IIF(Cast(:vtam as integer)= 5,B.T05, IIF(Cast(:vtam as integer)= 6,B.T06,
                 IIF(Cast(:vtam as integer)= 7,B.T07, IIF(Cast(:vtam as integer)= 8,B.T08,
                 IIF(Cast(:vtam as integer)= 9,B.T09, IIF(Cast(:vtam as integer)=10,B.T10,
                 IIF(Cast(:vtam as integer)=11,B.T11, IIF(Cast(:vtam as integer)=12,B.T12,
                 IIF(Cast(:vtam as integer)=13,B.T13, IIF(Cast(:vtam as integer)=14,B.T14,
                 IIF(Cast(:vtam as integer)=15,B.T15, IIF(Cast(:vtam as integer)=16,B.T16,
                 IIF(Cast(:vtam as integer)=17,B.T17, IIF(Cast(:vtam as integer)=18,B.T18,
                 IIF(Cast(:vtam as integer)=19,B.T19, IIF(Cast(:vtam as integer)=20,B.T20,
                 0.0000))))))))))))))))))))) * (Coalesce(B.Ponto_Reposicao,100.0000) / 100.0000)
                FROM TbEstoque_Minimo B
                WHERE B.Estabelecimento_Codigo = :VESTABELECIMENTOCOD
                  and B.Localizacao_Codigo = :vLOCALIZACAO_CODIGO
                  and B.PRODUTO_Codigo = :vPRODUTO_ID) as Numeric(15,4)),0.0000) Ponto_Reposicao,
            
             Coalesce(Cast((SELECT First 1
             IIF(Cast(:vtam as integer)= 0,B.QUANTIDADE,
             IIF(Cast(:vtam as integer)= 1,B.T01, IIF(Cast(:vtam as integer)= 2,B.T02,
             IIF(Cast(:vtam as integer)= 3,B.T03, IIF(Cast(:vtam as integer)= 4,B.T04,
             IIF(Cast(:vtam as integer)= 5,B.T05, IIF(Cast(:vtam as integer)= 6,B.T06,
             IIF(Cast(:vtam as integer)= 7,B.T07, IIF(Cast(:vtam as integer)= 8,B.T08,
             IIF(Cast(:vtam as integer)= 9,B.T09, IIF(Cast(:vtam as integer)=10,B.T10,
             IIF(Cast(:vtam as integer)=11,B.T11, IIF(Cast(:vtam as integer)=12,B.T12,
             IIF(Cast(:vtam as integer)=13,B.T13, IIF(Cast(:vtam as integer)=14,B.T14,
             IIF(Cast(:vtam as integer)=15,B.T15, IIF(Cast(:vtam as integer)=16,B.T16,
             IIF(Cast(:vtam as integer)=17,B.T17, IIF(Cast(:vtam as integer)=18,B.T18,
             IIF(Cast(:vtam as integer)=19,B.T19, IIF(Cast(:vtam as integer)=20,B.T20,
             0.0000)))))))))))))))))))))
            FROM TbEstoque_Minimo B
            WHERE B.Estabelecimento_Codigo = :VESTABELECIMENTOCOD
              and B.Localizacao_Codigo = :vLOCALIZACAO_CODIGO
              and B.PRODUTO_Codigo = :vPRODUTO_ID) as Numeric(15,4)),0.0000) Estoque_Minimo,
            
             Coalesce(Cast((SELECT First 1
             IIF(Cast(:vtam as integer)= 0,B.Estoque_Max,
             IIF(Cast(:vtam as integer)= 1,B.M01, IIF(Cast(:vtam as integer)= 2,B.M02,
             IIF(Cast(:vtam as integer)= 3,B.M03, IIF(Cast(:vtam as integer)= 4,B.M04,
             IIF(Cast(:vtam as integer)= 5,B.M05, IIF(Cast(:vtam as integer)= 6,B.M06,
             IIF(Cast(:vtam as integer)= 7,B.M07, IIF(Cast(:vtam as integer)= 8,B.M08,
             IIF(Cast(:vtam as integer)= 9,B.M09, IIF(Cast(:vtam as integer)=10,B.M10,
             IIF(Cast(:vtam as integer)=11,B.M11, IIF(Cast(:vtam as integer)=12,B.M12,
             IIF(Cast(:vtam as integer)=13,B.M13, IIF(Cast(:vtam as integer)=14,B.M14,
             IIF(Cast(:vtam as integer)=15,B.M15, IIF(Cast(:vtam as integer)=16,B.M16,
             IIF(Cast(:vtam as integer)=17,B.M17, IIF(Cast(:vtam as integer)=18,B.M18,
             IIF(Cast(:vtam as integer)=19,B.M19, IIF(Cast(:vtam as integer)=20,B.M20,
             0.0000)))))))))))))))))))))
            FROM TbEstoque_Minimo B
            WHERE B.Estabelecimento_Codigo = :VESTABELECIMENTOCOD
              and B.Localizacao_Codigo = :vLOCALIZACAO_CODIGO
              and B.PRODUTO_Codigo = :vPRODUTO_ID) as Numeric(15,4)),0.0000) Estoque_Maximo,

             Coalesce((SELECT First 1 Coalesce(B.TIPO_REPOSICAO,'1')
                FROM TbEstoque_Minimo B
                WHERE B.Estabelecimento_Codigo = :VESTABELECIMENTOCOD
                  and B.Localizacao_Codigo = :vLOCALIZACAO_CODIGO
                  and B.PRODUTO_Codigo = :vPRODUTO_ID),'1') Tipo_Reposicao
            
            From RDB$DATABASE
        INTO
          :vESTOQUE
          ,:vEMPENHADO
          ,:vALOCADO
          ,:vCOMPRADO
          ,:vEMCONFERENCIA
          ,:vREVISAO
          ,:vESTRAGADO
          ,:vESTOQUE_SEGURANCA
          ,:vPONTO_REPOSICAO
          ,:vESTOQUE_MINIMO
          ,:vESTOQUE_MAXIMO
          ,:vTIPO_REPOSICAO

        DO
        Begin
            PRODUTO_ID      = vPRODUTO_ID;
            FAMILIA         = vFAMILIA_DESCRICAO;
            PRODUTO         = vPRODUTO_DESCRICAO;
            UM              = vUM;
            LOCALIZACAO     = vLOCALIZACAO_CODIGO;
            EMCONFERENCIA   = vEMCONFERENCIA;
            ESTOQUE         = vestoque;
            EMPENHADO       = vempenhado;
            ALOCADO         = valocado;
            DISPONIVEL      = ESTOQUE - EMPENHADO;--  -ALOCADO;
            PROJECAO        = vprojecao;
            COMPRADO        = vcomprado;
            REVISAO         = vrevisao;
            ESTOQUEMIN      = vestoque_minimo;
            ESTOQUEMAX      = vestoque_maximo;
            ESTRAGADO       = vestragado;

            ESTOQUE_SEGURANCA = vESTOQUE_SEGURANCA;
            PONTO_REPOSICAO   = vPONTO_REPOSICAO;
            TIPO_REPOSICAO  = vTIPO_REPOSICAO;

            PROJECAO = PROJECAO + (PROJECAO*(ESTOQUE_SEGURANCA/100.00));
            NECESSIDADE     = (DISPONIVEL + comprado + revisao + EMCONFERENCIA) - PROJECAO ;

            if (NECESSIDADE <= PONTO_REPOSICAO) then
            begin
                if (TIPO_REPOSICAO = 0) then
                begin
                  NECESSIDADE= ESTOQUEMIN-NECESSIDADE;
                end
                else
                begin
                  NECESSIDADE= ESTOQUEMAX-NECESSIDADE;
                end

             FLAG=1;
            end
            else
            begin
             NECESSIDADE= 0;
             FLAG=2;
            end



            if (disponivel < projecao) then
            begin
            FLAG=3;
            end

          SUSPEND;
        end
   end

SUSPEND;
END
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER procedure SPC_PROJECAO_CONSUMO_PEDIDO (
    XESTABELECIMENTO integer,
    XFAMILIA integer,
    XPEDIDO integer,
    XCOR integer)
returns (
    PEDIDO integer,
    FAMILIA varchar(100),
    PRODUTO_ID integer,
    PRODUTO varchar(100),
    UM varchar(10),
    LOCALIZACAO integer,
    PROJECAO numeric(15,2),
    ALOCADO numeric(15,2))
as
declare variable VPEDIDO integer;
declare variable VMODELO_ID integer;
declare variable VMODELO_DESCRICAO varchar(100);
declare variable VCOR_ID integer;
declare variable VCOR_DESCRICAO varchar(100);
declare variable VTAM_DESCRICAO varchar(100);
declare variable VGRADE_CODIGO integer;
declare variable VTAMANHO integer;
declare variable VQUANTIDADE integer;
declare variable VSALDO_FATURAR numeric(15,2);
declare variable VALOC_EST numeric(15,2);
declare variable VALOC_REM numeric(15,2);
declare variable VALOC_AGR numeric(15,2);
declare variable VFAMILIA_CODIGO integer;
declare variable VFAMILIA_DESCRICAO varchar(100);
declare variable VPRODUTO_ID integer;
declare variable VTAM integer;
declare variable VGRADE_CODIGO2 integer;
declare variable VPRODUTO_DESCRICAO varchar(100);
declare variable VUM varchar(100);
declare variable VLOCALIZACAO_CODIGO integer;
declare variable VTAM_DESCRICAO2 varchar(100);
declare variable VPROJECAO numeric(15,2);
declare variable VALOCADO numeric(15,2);
declare variable VESTOQUE_SEGURANCA numeric(15,2);
BEGIN

  delete from TMP10168_1;


FOR Select
  Pedido,
  Modelo_Id,
  Modelo_Descricao,
  Cor_Id,
  Cor_Descricao,
  Tam_Descricao,
  Grade_Codigo,
  Tamanho,
  Saldo_Faturar,
  (Saldo_Faturar - Aloc_Est - Aloc_Rem) as Quantidade,
  Aloc_Est,
  Aloc_Rem,
  Aloc_Agr


 from (

SELECT
  P.PEDIDO,
  A.MODELO_CODIGO MODELO_ID,
  M.DESCRICAO MODELO_DESCRICAO,
  A.COR_ID,
  (SELECT FIRST 1 C.DESCRICAO FROM TBCOR C WHERE C.CODIGO = A.COR_ID) COR_DESCRICAO,
  (SELECT TAM_DESCRICAO FROM SP_TAMANHO_GRADE (M.GRADE_CODIGO,A.TAMANHO)) TAM_DESCRICAO,
  M.GRADE_CODIGO,
  A.TAMANHO,
  CAST(SUM(A.QUANTIDADE) AS NUMERIC(15,4)) QUANTIDADE,
  CAST(SUM(S.QUANTIDADE) AS NUMERIC(15,4)) SALDO_FATURAR,
  CAST(SUM(A.QTD_EST) AS NUMERIC(15,4)) ALOC_EST,
  CAST(SUM(A.QTD_REM) AS NUMERIC(15,4)) ALOC_REM,
  CAST(SUM(A.QTD_AGP) AS NUMERIC(15,4)) ALOC_AGR

FROM TBPEDIDO_ITEM A, TBPEDIDO P, TBMODELO M, TBPEDIDO_ITEM_SALDO S
WHERE A.ESTABELECIMENTO_CODIGO = :xESTABELECIMENTO
  AND A.ESTABELECIMENTO_CODIGO = P.ESTABELECIMENTO_CODIGO
  AND A.CONTROLE = S.PEDIDO_ITEM_CONTROLE
  AND A.PEDIDO = P.PEDIDO
  AND A.MODELO_CODIGO = M.CODIGO
  AND COALESCE(P.REMESSA_ID,0) = 0
  AND P.DATA BETWEEN '01.01.2014' AND CURRENT_DATE
  AND P.STATUS=1
  AND P.SITUACAO=1
  AND A.SITUACAO=1
  AND IIF(:XPEDIDO > 0 , P.Pedido = :xPEDIDO, True)
  AND IIF(:XCOR > 0 , A.Cor_Id = :xCOR, True)

GROUP BY P.PEDIDO, A.MODELO_CODIGO, M.DESCRICAO, A.COR_ID, M.GRADE_CODIGO, A.TAMANHO,COR_DESCRICAO,TAM_DESCRICAO
)
WHERE (SALDO_FATURAR - ALOC_EST - ALOC_REM) > 0

INTO
    :VPEDIDO,
    :VMODELO_ID,
    :VMODELO_DESCRICAO,
    :VCOR_ID,
    :VCOR_DESCRICAO,
    :VTAM_DESCRICAO,
    :VGRADE_CODIGO,
    :VTAMANHO,
    :VSALDO_FATURAR,
    :VQUANTIDADE,
    :VALOC_EST,
    :VALOC_REM,
    :VALOC_AGR
DO
begin
    FOR
      SELECT P.FAMILIA_CODIGO, (SELECT FIRST 1 F.DESCRICAO FROM TBFAMILIA F WHERE F.CODIGO = P.FAMILIA_CODIGO) FAMILIA_DESCRICAO,
       B.CONSUMO_PRODUTO_CODIGO PRODUTO_ID, B.TAM, P.GRADE_CODIGO, P.DESCRICAO PRODUTO_DESCRICAO, P.UNIDADEMEDIDA_SIGLA2 UM,
       P.LOCALIZACAO_CODIGO, (SELECT TAM_DESCRICAO FROM SP_TAMANHO_GRADE (P.GRADE_CODIGO,B.TAM)) TAM_DESCRICAO,

        CAST((
         (Case When (Cast(:vtamanho as integer)= 0) and (B.CONSUMO_QUANTIDADE     > 0) Then Cast( (Cast(:vQuantidade as Numeric(15,4)) * CAST((B.CONSUMO_QUANTIDADE    /B.FATOR_CONVERSAO)AS NUMERIC(15,8))) as Numeric(15,4)) else 0 end) +
         (Case When (Cast(:vtamanho as integer)= 1) and (B.CONSUMO_QUANTIDADE_T01 > 0) Then Cast( (Cast(:vQuantidade as Numeric(15,4)) * CAST((B.CONSUMO_QUANTIDADE_T01/B.FATOR_CONVERSAO)AS NUMERIC(15,8))) as Numeric(15,4)) else 0 end) +
         (Case When (Cast(:vtamanho as integer)= 2) and (B.CONSUMO_QUANTIDADE_T02 > 0) Then Cast( (Cast(:vQuantidade as Numeric(15,4)) * CAST((B.CONSUMO_QUANTIDADE_T02/B.FATOR_CONVERSAO)AS NUMERIC(15,8))) as Numeric(15,4)) else 0 end) +
         (Case When (Cast(:vtamanho as integer)= 3) and (B.CONSUMO_QUANTIDADE_T03 > 0) Then Cast( (Cast(:vQuantidade as Numeric(15,4)) * CAST((B.CONSUMO_QUANTIDADE_T03/B.FATOR_CONVERSAO)AS NUMERIC(15,8))) as Numeric(15,4)) else 0 end) +
         (Case When (Cast(:vtamanho as integer)= 4) and (B.CONSUMO_QUANTIDADE_T04 > 0) Then Cast( (Cast(:vQuantidade as Numeric(15,4)) * CAST((B.CONSUMO_QUANTIDADE_T04/B.FATOR_CONVERSAO)AS NUMERIC(15,8))) as Numeric(15,4)) else 0 end) +
         (Case When (Cast(:vtamanho as integer)= 5) and (B.CONSUMO_QUANTIDADE_T05 > 0) Then Cast( (Cast(:vQuantidade as Numeric(15,4)) * CAST((B.CONSUMO_QUANTIDADE_T05/B.FATOR_CONVERSAO)AS NUMERIC(15,8))) as Numeric(15,4)) else 0 end) +
         (Case When (Cast(:vtamanho as integer)= 6) and (B.CONSUMO_QUANTIDADE_T06 > 0) Then Cast( (Cast(:vQuantidade as Numeric(15,4)) * CAST((B.CONSUMO_QUANTIDADE_T06/B.FATOR_CONVERSAO)AS NUMERIC(15,8))) as Numeric(15,4)) else 0 end) +
         (Case When (Cast(:vtamanho as integer)= 7) and (B.CONSUMO_QUANTIDADE_T07 > 0) Then Cast( (Cast(:vQuantidade as Numeric(15,4)) * CAST((B.CONSUMO_QUANTIDADE_T07/B.FATOR_CONVERSAO)AS NUMERIC(15,8))) as Numeric(15,4)) else 0 end) +
         (Case When (Cast(:vtamanho as integer)= 8) and (B.CONSUMO_QUANTIDADE_T08 > 0) Then Cast( (Cast(:vQuantidade as Numeric(15,4)) * CAST((B.CONSUMO_QUANTIDADE_T08/B.FATOR_CONVERSAO)AS NUMERIC(15,8))) as Numeric(15,4)) else 0 end) +
         (Case When (Cast(:vtamanho as integer)= 9) and (B.CONSUMO_QUANTIDADE_T09 > 0) Then Cast( (Cast(:vQuantidade as Numeric(15,4)) * CAST((B.CONSUMO_QUANTIDADE_T09/B.FATOR_CONVERSAO)AS NUMERIC(15,8))) as Numeric(15,4)) else 0 end) +
         (Case When (Cast(:vtamanho as integer)=10) and (B.CONSUMO_QUANTIDADE_T10 > 0) Then Cast( (Cast(:vQuantidade as Numeric(15,4)) * CAST((B.CONSUMO_QUANTIDADE_T10/B.FATOR_CONVERSAO)AS NUMERIC(15,8))) as Numeric(15,4)) else 0 end) +
         (Case When (Cast(:vtamanho as integer)=11) and (B.CONSUMO_QUANTIDADE_T11 > 0) Then Cast( (Cast(:vQuantidade as Numeric(15,4)) * CAST((B.CONSUMO_QUANTIDADE_T11/B.FATOR_CONVERSAO)AS NUMERIC(15,8))) as Numeric(15,4)) else 0 end) +
         (Case When (Cast(:vtamanho as integer)=12) and (B.CONSUMO_QUANTIDADE_T12 > 0) Then Cast( (Cast(:vQuantidade as Numeric(15,4)) * CAST((B.CONSUMO_QUANTIDADE_T12/B.FATOR_CONVERSAO)AS NUMERIC(15,8))) as Numeric(15,4)) else 0 end) +
         (Case When (Cast(:vtamanho as integer)=13) and (B.CONSUMO_QUANTIDADE_T13 > 0) Then Cast( (Cast(:vQuantidade as Numeric(15,4)) * CAST((B.CONSUMO_QUANTIDADE_T13/B.FATOR_CONVERSAO)AS NUMERIC(15,8))) as Numeric(15,4)) else 0 end) +
         (Case When (Cast(:vtamanho as integer)=14) and (B.CONSUMO_QUANTIDADE_T14 > 0) Then Cast( (Cast(:vQuantidade as Numeric(15,4)) * CAST((B.CONSUMO_QUANTIDADE_T14/B.FATOR_CONVERSAO)AS NUMERIC(15,8))) as Numeric(15,4)) else 0 end) +
         (Case When (Cast(:vtamanho as integer)=15) and (B.CONSUMO_QUANTIDADE_T15 > 0) Then Cast( (Cast(:vQuantidade as Numeric(15,4)) * CAST((B.CONSUMO_QUANTIDADE_T15/B.FATOR_CONVERSAO)AS NUMERIC(15,8))) as Numeric(15,4)) else 0 end) +
         (Case When (Cast(:vtamanho as integer)=16) and (B.CONSUMO_QUANTIDADE_T16 > 0) Then Cast( (Cast(:vQuantidade as Numeric(15,4)) * CAST((B.CONSUMO_QUANTIDADE_T16/B.FATOR_CONVERSAO)AS NUMERIC(15,8))) as Numeric(15,4)) else 0 end) +
         (Case When (Cast(:vtamanho as integer)=17) and (B.CONSUMO_QUANTIDADE_T17 > 0) Then Cast( (Cast(:vQuantidade as Numeric(15,4)) * CAST((B.CONSUMO_QUANTIDADE_T17/B.FATOR_CONVERSAO)AS NUMERIC(15,8))) as Numeric(15,4)) else 0 end) +
         (Case When (Cast(:vtamanho as integer)=18) and (B.CONSUMO_QUANTIDADE_T18 > 0) Then Cast( (Cast(:vQuantidade as Numeric(15,4)) * CAST((B.CONSUMO_QUANTIDADE_T18/B.FATOR_CONVERSAO)AS NUMERIC(15,8))) as Numeric(15,4)) else 0 end) +
         (Case When (Cast(:vtamanho as integer)=19) and (B.CONSUMO_QUANTIDADE_T19 > 0) Then Cast( (Cast(:vQuantidade as Numeric(15,4)) * CAST((B.CONSUMO_QUANTIDADE_T19/B.FATOR_CONVERSAO)AS NUMERIC(15,8))) as Numeric(15,4)) else 0 end) +
         (Case When (Cast(:vtamanho as integer)=20) and (B.CONSUMO_QUANTIDADE_T20 > 0) Then Cast( (Cast(:vQuantidade as Numeric(15,4)) * CAST((B.CONSUMO_QUANTIDADE_T20/B.FATOR_CONVERSAO)AS NUMERIC(15,8))) as Numeric(15,4)) else 0 end)) as Numeric(15,4))  Projecao
        
         FROM TBMODELO_CONSUMO B, TbProduto P
        WHERE B.MODELO_Codigo = :vmodelo_id
          and B.CONSUMO_PRODUTO_CODIGO = P.Codigo
          and p.familia_codigo = :xFamilia --in (select osplit from split(:xFamilia,','))
        
        Union
        
        SELECT P.FAMILIA_CODIGO, (SELECT FIRST 1 F.DESCRICAO FROM TBFAMILIA F WHERE F.CODIGO = P.FAMILIA_CODIGO) FAMILIA_DESCRICAO,
               B.PRODUTO_ID, B.TAM, P.GRADE_CODIGO, P.DESCRICAO PRODUTO_DESCRICAO, P.UNIDADEMEDIDA_SIGLA2 UM,
               P.LOCALIZACAO_CODIGO, (SELECT TAM_DESCRICAO FROM SP_TAMANHO_GRADE (P.GRADE_CODIGO,B.TAM)) TAM_DESCRICAO,
        
        Cast((
         (Case When (Cast(:vtamanho as integer)= 0) and (B.QUANTIDADE     > 0) Then Cast( (Cast(:vQuantidade as Numeric(15,4)) * CAST((B.QUANTIDADE    /B.FATOR_CONVERSAO)AS NUMERIC(15,8))) as Numeric(15,4)) else 0 end) +
         (Case When (Cast(:vtamanho as integer)= 1) and (B.T01 > 0) Then Cast( (Cast(:vQuantidade as Numeric(15,4)) * CAST((B.T01/B.FATOR_CONVERSAO)AS NUMERIC(15,8))) as Numeric(15,4)) else 0 end) +
         (Case When (Cast(:vtamanho as integer)= 2) and (B.T02 > 0) Then Cast( (Cast(:vQuantidade as Numeric(15,4)) * CAST((B.T02/B.FATOR_CONVERSAO)AS NUMERIC(15,8))) as Numeric(15,4)) else 0 end) +
         (Case When (Cast(:vtamanho as integer)= 3) and (B.T03 > 0) Then Cast( (Cast(:vQuantidade as Numeric(15,4)) * CAST((B.T03/B.FATOR_CONVERSAO)AS NUMERIC(15,8))) as Numeric(15,4)) else 0 end) +
         (Case When (Cast(:vtamanho as integer)= 4) and (B.T04 > 0) Then Cast( (Cast(:vQuantidade as Numeric(15,4)) * CAST((B.T04/B.FATOR_CONVERSAO)AS NUMERIC(15,8))) as Numeric(15,4)) else 0 end) +
         (Case When (Cast(:vtamanho as integer)= 5) and (B.T05 > 0) Then Cast( (Cast(:vQuantidade as Numeric(15,4)) * CAST((B.T05/B.FATOR_CONVERSAO)AS NUMERIC(15,8))) as Numeric(15,4)) else 0 end) +
         (Case When (Cast(:vtamanho as integer)= 6) and (B.T06 > 0) Then Cast( (Cast(:vQuantidade as Numeric(15,4)) * CAST((B.T06/B.FATOR_CONVERSAO)AS NUMERIC(15,8))) as Numeric(15,4)) else 0 end) +
         (Case When (Cast(:vtamanho as integer)= 7) and (B.T07 > 0) Then Cast( (Cast(:vQuantidade as Numeric(15,4)) * CAST((B.T07/B.FATOR_CONVERSAO)AS NUMERIC(15,8))) as Numeric(15,4)) else 0 end) +
         (Case When (Cast(:vtamanho as integer)= 8) and (B.T08 > 0) Then Cast( (Cast(:vQuantidade as Numeric(15,4)) * CAST((B.T08/B.FATOR_CONVERSAO)AS NUMERIC(15,8))) as Numeric(15,4)) else 0 end) +
         (Case When (Cast(:vtamanho as integer)= 9) and (B.T09 > 0) Then Cast( (Cast(:vQuantidade as Numeric(15,4)) * CAST((B.T09/B.FATOR_CONVERSAO)AS NUMERIC(15,8))) as Numeric(15,4)) else 0 end) +
         (Case When (Cast(:vtamanho as integer)=10) and (B.T10 > 0) Then Cast( (Cast(:vQuantidade as Numeric(15,4)) * CAST((B.T10/B.FATOR_CONVERSAO)AS NUMERIC(15,8))) as Numeric(15,4)) else 0 end) +
         (Case When (Cast(:vtamanho as integer)=11) and (B.T11 > 0) Then Cast( (Cast(:vQuantidade as Numeric(15,4)) * CAST((B.T11/B.FATOR_CONVERSAO)AS NUMERIC(15,8))) as Numeric(15,4)) else 0 end) +
         (Case When (Cast(:vtamanho as integer)=12) and (B.T12 > 0) Then Cast( (Cast(:vQuantidade as Numeric(15,4)) * CAST((B.T12/B.FATOR_CONVERSAO)AS NUMERIC(15,8))) as Numeric(15,4)) else 0 end) +
         (Case When (Cast(:vtamanho as integer)=13) and (B.T13 > 0) Then Cast( (Cast(:vQuantidade as Numeric(15,4)) * CAST((B.T13/B.FATOR_CONVERSAO)AS NUMERIC(15,8))) as Numeric(15,4)) else 0 end) +
         (Case When (Cast(:vtamanho as integer)=14) and (B.T14 > 0) Then Cast( (Cast(:vQuantidade as Numeric(15,4)) * CAST((B.T14/B.FATOR_CONVERSAO)AS NUMERIC(15,8))) as Numeric(15,4)) else 0 end) +
         (Case When (Cast(:vtamanho as integer)=15) and (B.T15 > 0) Then Cast( (Cast(:vQuantidade as Numeric(15,4)) * CAST((B.T15/B.FATOR_CONVERSAO)AS NUMERIC(15,8))) as Numeric(15,4)) else 0 end) +
         (Case When (Cast(:vtamanho as integer)=16) and (B.T16 > 0) Then Cast( (Cast(:vQuantidade as Numeric(15,4)) * CAST((B.T16/B.FATOR_CONVERSAO)AS NUMERIC(15,8))) as Numeric(15,4)) else 0 end) +
         (Case When (Cast(:vtamanho as integer)=17) and (B.T17 > 0) Then Cast( (Cast(:vQuantidade as Numeric(15,4)) * CAST((B.T17/B.FATOR_CONVERSAO)AS NUMERIC(15,8))) as Numeric(15,4)) else 0 end) +
         (Case When (Cast(:vtamanho as integer)=18) and (B.T18 > 0) Then Cast( (Cast(:vQuantidade as Numeric(15,4)) * CAST((B.T18/B.FATOR_CONVERSAO)AS NUMERIC(15,8))) as Numeric(15,4)) else 0 end) +
         (Case When (Cast(:vtamanho as integer)=19) and (B.T19 > 0) Then Cast( (Cast(:vQuantidade as Numeric(15,4)) * CAST((B.T19/B.FATOR_CONVERSAO)AS NUMERIC(15,8))) as Numeric(15,4)) else 0 end) +
         (Case When (Cast(:vtamanho as integer)=20) and (B.T20 > 0) Then Cast( (Cast(:vQuantidade as Numeric(15,4)) * CAST((B.T20/B.FATOR_CONVERSAO)AS NUMERIC(15,8))) as Numeric(15,4)) else 0 end)) as Numeric(15,4)) PROJECAO
        
         FROM TBMODELO_CONSUMO_COR B, TbProduto P
        WHERE B.MODELO_ID = :vmodelo_id
          AND B.COR_ID = :vcor_id
          and B.PRODUTO_ID = P.Codigo
          and p.familia_codigo = :xFamilia --in (select osplit from split(:xFamilia,','))

    INTO
        :vFAMILIA_CODIGO,
        :vFAMILIA_DESCRICAO,
        :vPRODUTO_ID,
        :vTAM,
        :vGRADE_CODIGO2,
        :vPRODUTO_DESCRICAO,
        :vUM,
        :vLOCALIZACAO_CODIGO,
        :vTAM_DESCRICAO2,
        :vPROJECAO
    DO
    Begin

    insert into TMP10168_1 values(
        :vFAMILIA_CODIGO,
        :vFAMILIA_DESCRICAO,
        :vPRODUTO_ID,
        :vTAM,
        :vGRADE_CODIGO2,
        :vPRODUTO_DESCRICAO,
        :vUM,
        :vLOCALIZACAO_CODIGO,
        :vTAM_DESCRICAO2,
        :vPROJECAO,
        :vPEDIDO
    );

   end
end

   --/*
    for
        select
        PEDIDO,FAMILIA_CODIGO,FAMILIA_DESCRICAO,PRODUTO_ID,TAM,GRADE_CODIGO2,
        PRODUTO_DESCRICAO,UM,LOCALIZACAO_CODIGO,TAM_DESCRICAO,sum(PROJECAO)
        from tmp10168_1 e group by
        PEDIDO,FAMILIA_CODIGO,FAMILIA_DESCRICAO,PRODUTO_ID,TAM,GRADE_CODIGO2,
        PRODUTO_DESCRICAO,UM,LOCALIZACAO_CODIGO,TAM_DESCRICAO
   INTO
        :vPEDIDO,
        :vFAMILIA_CODIGO,
        :vFAMILIA_DESCRICAO,
        :vPRODUTO_ID,
        :vTAM,
        :vGRADE_CODIGO2,
        :vPRODUTO_DESCRICAO,
        :vUM,
        :vLOCALIZACAO_CODIGO,
        :vTAM_DESCRICAO2,
        :vPROJECAO
   do
   Begin

        FOR
           SELECT

             Coalesce(
             (Select Sum(SA.Saldo)
                From TbEstoque_Detalhe_Alocacao SA
               Where SA.Produto_Id = :vPRODUTO_ID
                 and SA.Estabelecimento_Id = :xESTABELECIMENTO
                 and SA.Localizacao_Id = :vLOCALIZACAO_CODIGO
                 and SA.Tipo = 'C'
                 and SA.Tabela_Id = :vPEDIDO
                 and SA.Saldo > 0
                 and SA.Tamanho = :vTAM)
             ,0.0000) Alocado,

             Coalesce(
             Cast(
             (SELECT First 1 B.Seguranca
                FROM TbEstoque_Minimo B
               WHERE B.Estabelecimento_Codigo = :xESTABELECIMENTO
                 and B.Localizacao_Codigo = :vLOCALIZACAO_CODIGO
                 and B.PRODUTO_Codigo = :vPRODUTO_ID)
             as Numeric(15,4))
             ,0.0000) Estoque_Seguranca
            
           From RDB$DATABASE

        INTO :vALOCADO, :vESTOQUE_SEGURANCA
        DO
        Begin

            PEDIDO          = vPEDIDO;
            PRODUTO_ID      = vPRODUTO_ID;
            FAMILIA         = vFAMILIA_DESCRICAO;
            PRODUTO         = vPRODUTO_DESCRICAO;
            UM              = vUM;
            LOCALIZACAO     = vLOCALIZACAO_CODIGO;
            PROJECAO        = vPROJECAO + (vPROJECAO*(Coalesce(vESTOQUE_SEGURANCA,0)/100.00));
            ALOCADO         = vALOCADO;

          suspend;
        end
   end

END
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER procedure SPC_PROJECAO_PEDIDO (
    ESTABELECIMENTO_1 integer,
    FAMILIA_1 integer)
returns (
    PRODUTO_ID integer,
    MODELO_ID integer,
    MODELO_DESCRICAO varchar(50),
    COR_ID integer,
    COR_DESCRICAO varchar(20),
    UM varchar(3),
    TAMANHO_ID integer,
    TAMANHO varchar(10),
    LOCALIZACAO_ID integer,
    ESTOQUE numeric(18,4),
    EMPENHADO numeric(18,4),
    EM_PRODUCAO numeric(18,4),
    PROJECAO numeric(18,4),
    EST_MIN numeric(18,4),
    EST_MAX numeric(18,4),
    SEGURANCA numeric(18,4),
    PERC_PONTO_REP numeric(18,4),
    QTD_PONTO_REP numeric(18,4),
    TIPO_REP char(12),
    QTD_REP numeric(18,4),
    NECESSIDADE numeric(18,4),
    PROGRAMAR numeric(18,4),
    DENSIDADE integer,
    ESPESSURA numeric(18,4),
    FILTRO varchar(500))
as
declare variable YMODELO_ID integer;
declare variable YCOR_ID integer;
declare variable YTAMANHO integer;
declare variable QUANTIDADE numeric(15,4);
declare variable VPRODUTO_ID integer;
declare variable VTAM integer;
declare variable VPROJECAO numeric(15,4);
declare variable XPRODUTO_ID integer;
declare variable XMODELO_ID integer;
declare variable XMODELO_DESCRICAO varchar(50);
declare variable XCOR_ID integer;
declare variable XCOR_DESCRICAO varchar(20);
declare variable XTAMANHO_ID integer;
declare variable XTAMANHO varchar(10);
declare variable XUM varchar(3);
declare variable XLOCALIZACAO_ID integer;
declare variable XESTOQUE numeric(18,4);
declare variable XEMPENHADO numeric(18,4);
declare variable XEM_PRODUCAO numeric(18,4);
declare variable XPROJECAO numeric(18,4);
declare variable XEST_MIN numeric(18,4);
declare variable XEST_MAX numeric(18,4);
declare variable XSEGURANCA numeric(18,4);
declare variable XPERC_PONTO_REP numeric(18,4);
declare variable XQTD_PONTO_REP numeric(18,4);
declare variable XTIPO_REP char(12);
declare variable XQTD_REP numeric(18,4);
declare variable XNECESSIDADE numeric(18,4);
declare variable XDENSIDADE integer;
declare variable XESPESSURA numeric(18,4);
BEGIN

    For
    Select
      Modelo_Id,
      Cor_Id,
      Tamanho,
     (Saldo_Faturar - Aloc_Est - Aloc_Rem) as Quantidade
    
    From (
    Select
      A.Modelo_Codigo Modelo_Id, A.Cor_Id, A.Tamanho,
      Cast(Sum(S.Quantidade) as Numeric(15,4)) Saldo_Faturar,
      Cast(Sum(A.Qtd_Est) as Numeric(15,4)) Aloc_Est,
      Cast(Sum(A.Qtd_Rem) as Numeric(15,4)) Aloc_Rem
    
    From TbPedido_Item A, TbPedido P, TbPedido_Item_Saldo S
    Where A.Estabelecimento_Codigo = :ESTABELECIMENTO_1
      and A.Estabelecimento_Codigo =  P.Estabelecimento_Codigo
      and A.Controle = S.Pedido_Item_Controle
      and A.Pedido = P.Pedido
      and P.DATA between '01.01.2015' and current_date
      and P.STATUS=1
      and P.SITUACAO=1
      and A.situacao=1
    
    Group By A.Modelo_Codigo, A.Cor_Id, A.Tamanho)
    Where (Saldo_Faturar - Aloc_Est - Aloc_Rem) > 0
    
    Into :yModelo_Id, :yCor_Id, :yTamanho, :Quantidade
    Do
    
    Begin

    For

       SELECT B.CONSUMO_PRODUTO_CODIGO PRODUTO_ID, B.Tam,
        Cast((
         (Case When (Cast(:yTamanho as integer)= 0) and (B.CONSUMO_QUANTIDADE     > 0) Then Cast( (Cast(:Quantidade as Numeric(15,4)) * CAST((B.CONSUMO_QUANTIDADE    /B.FATOR_CONVERSAO)AS NUMERIC(15,8))) as Numeric(15,4)) else 0 end) +
         (Case When (Cast(:yTamanho as integer)= 1) and (B.CONSUMO_QUANTIDADE_T01 > 0) Then Cast( (Cast(:Quantidade as Numeric(15,4)) * CAST((B.CONSUMO_QUANTIDADE_T01/B.FATOR_CONVERSAO)AS NUMERIC(15,8))) as Numeric(15,4)) else 0 end) +
         (Case When (Cast(:yTamanho as integer)= 2) and (B.CONSUMO_QUANTIDADE_T02 > 0) Then Cast( (Cast(:Quantidade as Numeric(15,4)) * CAST((B.CONSUMO_QUANTIDADE_T02/B.FATOR_CONVERSAO)AS NUMERIC(15,8))) as Numeric(15,4)) else 0 end) +
         (Case When (Cast(:yTamanho as integer)= 3) and (B.CONSUMO_QUANTIDADE_T03 > 0) Then Cast( (Cast(:Quantidade as Numeric(15,4)) * CAST((B.CONSUMO_QUANTIDADE_T03/B.FATOR_CONVERSAO)AS NUMERIC(15,8))) as Numeric(15,4)) else 0 end) +
         (Case When (Cast(:yTamanho as integer)= 4) and (B.CONSUMO_QUANTIDADE_T04 > 0) Then Cast( (Cast(:Quantidade as Numeric(15,4)) * CAST((B.CONSUMO_QUANTIDADE_T04/B.FATOR_CONVERSAO)AS NUMERIC(15,8))) as Numeric(15,4)) else 0 end) +
         (Case When (Cast(:yTamanho as integer)= 5) and (B.CONSUMO_QUANTIDADE_T05 > 0) Then Cast( (Cast(:Quantidade as Numeric(15,4)) * CAST((B.CONSUMO_QUANTIDADE_T05/B.FATOR_CONVERSAO)AS NUMERIC(15,8))) as Numeric(15,4)) else 0 end) +
         (Case When (Cast(:yTamanho as integer)= 6) and (B.CONSUMO_QUANTIDADE_T06 > 0) Then Cast( (Cast(:Quantidade as Numeric(15,4)) * CAST((B.CONSUMO_QUANTIDADE_T06/B.FATOR_CONVERSAO)AS NUMERIC(15,8))) as Numeric(15,4)) else 0 end) +
         (Case When (Cast(:yTamanho as integer)= 7) and (B.CONSUMO_QUANTIDADE_T07 > 0) Then Cast( (Cast(:Quantidade as Numeric(15,4)) * CAST((B.CONSUMO_QUANTIDADE_T07/B.FATOR_CONVERSAO)AS NUMERIC(15,8))) as Numeric(15,4)) else 0 end) +
         (Case When (Cast(:yTamanho as integer)= 8) and (B.CONSUMO_QUANTIDADE_T08 > 0) Then Cast( (Cast(:Quantidade as Numeric(15,4)) * CAST((B.CONSUMO_QUANTIDADE_T08/B.FATOR_CONVERSAO)AS NUMERIC(15,8))) as Numeric(15,4)) else 0 end) +
         (Case When (Cast(:yTamanho as integer)= 9) and (B.CONSUMO_QUANTIDADE_T09 > 0) Then Cast( (Cast(:Quantidade as Numeric(15,4)) * CAST((B.CONSUMO_QUANTIDADE_T09/B.FATOR_CONVERSAO)AS NUMERIC(15,8))) as Numeric(15,4)) else 0 end) +
         (Case When (Cast(:yTamanho as integer)=10) and (B.CONSUMO_QUANTIDADE_T10 > 0) Then Cast( (Cast(:Quantidade as Numeric(15,4)) * CAST((B.CONSUMO_QUANTIDADE_T10/B.FATOR_CONVERSAO)AS NUMERIC(15,8))) as Numeric(15,4)) else 0 end) +
         (Case When (Cast(:yTamanho as integer)=11) and (B.CONSUMO_QUANTIDADE_T11 > 0) Then Cast( (Cast(:Quantidade as Numeric(15,4)) * CAST((B.CONSUMO_QUANTIDADE_T11/B.FATOR_CONVERSAO)AS NUMERIC(15,8))) as Numeric(15,4)) else 0 end) +
         (Case When (Cast(:yTamanho as integer)=12) and (B.CONSUMO_QUANTIDADE_T12 > 0) Then Cast( (Cast(:Quantidade as Numeric(15,4)) * CAST((B.CONSUMO_QUANTIDADE_T12/B.FATOR_CONVERSAO)AS NUMERIC(15,8))) as Numeric(15,4)) else 0 end) +
         (Case When (Cast(:yTamanho as integer)=13) and (B.CONSUMO_QUANTIDADE_T13 > 0) Then Cast( (Cast(:Quantidade as Numeric(15,4)) * CAST((B.CONSUMO_QUANTIDADE_T13/B.FATOR_CONVERSAO)AS NUMERIC(15,8))) as Numeric(15,4)) else 0 end) +
         (Case When (Cast(:yTamanho as integer)=14) and (B.CONSUMO_QUANTIDADE_T14 > 0) Then Cast( (Cast(:Quantidade as Numeric(15,4)) * CAST((B.CONSUMO_QUANTIDADE_T14/B.FATOR_CONVERSAO)AS NUMERIC(15,8))) as Numeric(15,4)) else 0 end) +
         (Case When (Cast(:yTamanho as integer)=15) and (B.CONSUMO_QUANTIDADE_T15 > 0) Then Cast( (Cast(:Quantidade as Numeric(15,4)) * CAST((B.CONSUMO_QUANTIDADE_T15/B.FATOR_CONVERSAO)AS NUMERIC(15,8))) as Numeric(15,4)) else 0 end) +
         (Case When (Cast(:yTamanho as integer)=16) and (B.CONSUMO_QUANTIDADE_T16 > 0) Then Cast( (Cast(:Quantidade as Numeric(15,4)) * CAST((B.CONSUMO_QUANTIDADE_T16/B.FATOR_CONVERSAO)AS NUMERIC(15,8))) as Numeric(15,4)) else 0 end) +
         (Case When (Cast(:yTamanho as integer)=17) and (B.CONSUMO_QUANTIDADE_T17 > 0) Then Cast( (Cast(:Quantidade as Numeric(15,4)) * CAST((B.CONSUMO_QUANTIDADE_T17/B.FATOR_CONVERSAO)AS NUMERIC(15,8))) as Numeric(15,4)) else 0 end) +
         (Case When (Cast(:yTamanho as integer)=18) and (B.CONSUMO_QUANTIDADE_T18 > 0) Then Cast( (Cast(:Quantidade as Numeric(15,4)) * CAST((B.CONSUMO_QUANTIDADE_T18/B.FATOR_CONVERSAO)AS NUMERIC(15,8))) as Numeric(15,4)) else 0 end) +
         (Case When (Cast(:yTamanho as integer)=19) and (B.CONSUMO_QUANTIDADE_T19 > 0) Then Cast( (Cast(:Quantidade as Numeric(15,4)) * CAST((B.CONSUMO_QUANTIDADE_T19/B.FATOR_CONVERSAO)AS NUMERIC(15,8))) as Numeric(15,4)) else 0 end) +
         (Case When (Cast(:yTamanho as integer)=20) and (B.CONSUMO_QUANTIDADE_T20 > 0) Then Cast( (Cast(:Quantidade as Numeric(15,4)) * CAST((B.CONSUMO_QUANTIDADE_T20/B.FATOR_CONVERSAO)AS NUMERIC(15,8))) as Numeric(15,4)) else 0 end)) as Numeric(15,4))  Quantidade
        
         FROM TBMODELO_CONSUMO B, TbProduto P
        WHERE B.MODELO_Codigo = :yModelo_id
          and B.CONSUMO_PRODUTO_CODIGO = P.Codigo
          and P.Familia_Codigo = :Familia_1

        Union
        
        SELECT B.PRODUTO_ID, B.Tam,
         Cast((
         (Case When (Cast(:yTamanho as integer)= 0) and (B.QUANTIDADE     > 0) Then Cast( (Cast(:Quantidade as Numeric(15,4)) * CAST((B.QUANTIDADE    /B.FATOR_CONVERSAO)AS NUMERIC(15,8))) as Numeric(15,4)) else 0 end) +
         (Case When (Cast(:yTamanho as integer)= 1) and (B.T01 > 0) Then Cast( (Cast(:Quantidade as Numeric(15,4)) * CAST((B.T01/B.FATOR_CONVERSAO)AS NUMERIC(15,8))) as Numeric(15,4)) else 0 end) +
         (Case When (Cast(:yTamanho as integer)= 2) and (B.T02 > 0) Then Cast( (Cast(:Quantidade as Numeric(15,4)) * CAST((B.T02/B.FATOR_CONVERSAO)AS NUMERIC(15,8))) as Numeric(15,4)) else 0 end) +
         (Case When (Cast(:yTamanho as integer)= 3) and (B.T03 > 0) Then Cast( (Cast(:Quantidade as Numeric(15,4)) * CAST((B.T03/B.FATOR_CONVERSAO)AS NUMERIC(15,8))) as Numeric(15,4)) else 0 end) +
         (Case When (Cast(:yTamanho as integer)= 4) and (B.T04 > 0) Then Cast( (Cast(:Quantidade as Numeric(15,4)) * CAST((B.T04/B.FATOR_CONVERSAO)AS NUMERIC(15,8))) as Numeric(15,4)) else 0 end) +
         (Case When (Cast(:yTamanho as integer)= 5) and (B.T05 > 0) Then Cast( (Cast(:Quantidade as Numeric(15,4)) * CAST((B.T05/B.FATOR_CONVERSAO)AS NUMERIC(15,8))) as Numeric(15,4)) else 0 end) +
         (Case When (Cast(:yTamanho as integer)= 6) and (B.T06 > 0) Then Cast( (Cast(:Quantidade as Numeric(15,4)) * CAST((B.T06/B.FATOR_CONVERSAO)AS NUMERIC(15,8))) as Numeric(15,4)) else 0 end) +
         (Case When (Cast(:yTamanho as integer)= 7) and (B.T07 > 0) Then Cast( (Cast(:Quantidade as Numeric(15,4)) * CAST((B.T07/B.FATOR_CONVERSAO)AS NUMERIC(15,8))) as Numeric(15,4)) else 0 end) +
         (Case When (Cast(:yTamanho as integer)= 8) and (B.T08 > 0) Then Cast( (Cast(:Quantidade as Numeric(15,4)) * CAST((B.T08/B.FATOR_CONVERSAO)AS NUMERIC(15,8))) as Numeric(15,4)) else 0 end) +
         (Case When (Cast(:yTamanho as integer)= 9) and (B.T09 > 0) Then Cast( (Cast(:Quantidade as Numeric(15,4)) * CAST((B.T09/B.FATOR_CONVERSAO)AS NUMERIC(15,8))) as Numeric(15,4)) else 0 end) +
         (Case When (Cast(:yTamanho as integer)=10) and (B.T10 > 0) Then Cast( (Cast(:Quantidade as Numeric(15,4)) * CAST((B.T10/B.FATOR_CONVERSAO)AS NUMERIC(15,8))) as Numeric(15,4)) else 0 end) +
         (Case When (Cast(:yTamanho as integer)=11) and (B.T11 > 0) Then Cast( (Cast(:Quantidade as Numeric(15,4)) * CAST((B.T11/B.FATOR_CONVERSAO)AS NUMERIC(15,8))) as Numeric(15,4)) else 0 end) +
         (Case When (Cast(:yTamanho as integer)=12) and (B.T12 > 0) Then Cast( (Cast(:Quantidade as Numeric(15,4)) * CAST((B.T12/B.FATOR_CONVERSAO)AS NUMERIC(15,8))) as Numeric(15,4)) else 0 end) +
         (Case When (Cast(:yTamanho as integer)=13) and (B.T13 > 0) Then Cast( (Cast(:Quantidade as Numeric(15,4)) * CAST((B.T13/B.FATOR_CONVERSAO)AS NUMERIC(15,8))) as Numeric(15,4)) else 0 end) +
         (Case When (Cast(:yTamanho as integer)=14) and (B.T14 > 0) Then Cast( (Cast(:Quantidade as Numeric(15,4)) * CAST((B.T14/B.FATOR_CONVERSAO)AS NUMERIC(15,8))) as Numeric(15,4)) else 0 end) +
         (Case When (Cast(:yTamanho as integer)=15) and (B.T15 > 0) Then Cast( (Cast(:Quantidade as Numeric(15,4)) * CAST((B.T15/B.FATOR_CONVERSAO)AS NUMERIC(15,8))) as Numeric(15,4)) else 0 end) +
         (Case When (Cast(:yTamanho as integer)=16) and (B.T16 > 0) Then Cast( (Cast(:Quantidade as Numeric(15,4)) * CAST((B.T16/B.FATOR_CONVERSAO)AS NUMERIC(15,8))) as Numeric(15,4)) else 0 end) +
         (Case When (Cast(:yTamanho as integer)=17) and (B.T17 > 0) Then Cast( (Cast(:Quantidade as Numeric(15,4)) * CAST((B.T17/B.FATOR_CONVERSAO)AS NUMERIC(15,8))) as Numeric(15,4)) else 0 end) +
         (Case When (Cast(:yTamanho as integer)=18) and (B.T18 > 0) Then Cast( (Cast(:Quantidade as Numeric(15,4)) * CAST((B.T18/B.FATOR_CONVERSAO)AS NUMERIC(15,8))) as Numeric(15,4)) else 0 end) +
         (Case When (Cast(:yTamanho as integer)=19) and (B.T19 > 0) Then Cast( (Cast(:Quantidade as Numeric(15,4)) * CAST((B.T19/B.FATOR_CONVERSAO)AS NUMERIC(15,8))) as Numeric(15,4)) else 0 end) +
         (Case When (Cast(:yTamanho as integer)=20) and (B.T20 > 0) Then Cast( (Cast(:Quantidade as Numeric(15,4)) * CAST((B.T20/B.FATOR_CONVERSAO)AS NUMERIC(15,8))) as Numeric(15,4)) else 0 end)) as Numeric(15,4)) Quantidade
        
         FROM TBMODELO_CONSUMO_COR B, TbProduto P
        WHERE B.MODELO_ID = :yModelo_id
          AND B.COR_ID = :yCor_id
          and B.PRODUTO_ID = P.Codigo
          and P.Familia_Codigo = :Familia_1

     Into :vProduto_Id, :vTam, vProjecao
       Do
       Begin
        insert into TMP10168_1 values(0,'',:vProduto_Id,:vTam,0,'','',0,'',:vProjecao,0);
       End

  End

  For

    Select V.PRODUTO_ID,V.MODELO_ID,V.MODELO_DESCRICAO,V.COR_ID,V.COR_DESCRICAO,
           V.TAMANHO_ID, V.TAMANHO,V.UM,V.LOCALIZACAO_ID,V.ESTOQUE,V.EM_PRODUCAO,
           V.EMPENHADO,V.PROJECAO,V.EST_MIN,V.EST_MAX, V.SEGURANCA,
           V.PERC_PONTO_REP, V.QTD_PONTO_REP, V.TIPO_REP,V.QTD_REP,V.NECESSIDADE,
          (Select First 1 M.Densidade From TbModelo M Where M.Codigo = V.MODELO_ID),
          (Select First 1 M.Espessura From TbModelo M Where M.Codigo = V.MODELO_ID)

    From (
    Select X.Produto_Id, X.MODELO_ID,X.MODELO_DESCRICAO,X.COR_ID,X.COR_DESCRICAO,
           X.TAMANHO_ID, X.TAMANHO,X.UM,X.LOCALIZACAO_ID, X.ESTOQUE, X.EM_PRODUCAO,
           X.EMPENHADO, X.PROJECAO, X.ESTOQUE_MINIMO EST_MIN, X.ESTOQUE_MAXIMO EST_MAX, X.SEGURANCA,
           X.PONTO_REPOSICAO PERC_PONTO_REP, X.QUANTIDADE_PONTO_REPOSICAO QTD_PONTO_REP,
           IIF(X.TIPO_REPOSICAO='0','MIN','MAX') TIPO_REP,
           IIF(X.TIPO_REPOSICAO='0' AND X.QUANTIDADE_PONTO_REPOSICAO <= X.ESTOQUE_MINIMO,X.ESTOQUE_MINIMO,X.ESTOQUE_MAXIMO) QTD_REP,

           IIF( X.ESTOQUE + X.EM_PRODUCAO - X.EMPENHADO - X.PROJECAO < X.QUANTIDADE_PONTO_REPOSICAO,
                 IIF(X.TIPO_REPOSICAO='0' AND X.QUANTIDADE_PONTO_REPOSICAO <= X.ESTOQUE_MINIMO,X.ESTOQUE_MINIMO,X.ESTOQUE_MAXIMO) -
                (X.ESTOQUE + X.EM_PRODUCAO - X.EMPENHADO - X.PROJECAO), 0) NECESSIDADE
    From (
    Select P.Codigo Produto_Id, P.MODELO_CODIGO MODELO_ID,
          (Select First 1 M.Descricao From TbModelo M Where M.Codigo = P.Modelo_Codigo) Modelo_Descricao,
           P.COR_CODIGO COR_ID, (Select First 1 C.Descricao From TbCor C Where C.Codigo = P.Cor_Codigo) Cor_Descricao,
           0 TAMANHO_ID, Cast('' as VarChar(10)) TAMANHO, P.UNIDADEMEDIDA_SIGLA2 UM,
           P.LOCALIZACAO_CODIGO LOCALIZACAO_ID,
    
     Coalesce(Cast((SELECT First 1 Sum(S.Projecao)
      From TMP10168_1 S
     Where S.Produto_id = P.Codigo) as Numeric(15,4)),0.0000) PROJECAO,

     Coalesce(Cast((SELECT First 1 Sum(S.SALDO)
      From TbEstoque_Saldo S
     Where S.Produto_Codigo = P.Codigo And S.Localizacao_Codigo = P.Localizacao_Codigo
       And S.ESTABELECIMENTO_CODIGO = :ESTABELECIMENTO_1) as Numeric(15,4)),0.0000) Estoque,
    
     Coalesce(Cast((Select Cast(Sum(E.Consumo_Kg-Coalesce(E.Quantidade_Conferencia,0)) as Numeric(15,4))
      From TbRemessa_Consumo E
     Where E.PRODUTO_ID = P.Codigo
       and E.Conferencia = '0'
       and Coalesce(E.Componente,'0') = '0'
       and E.Estabelecimento_Id = :Estabelecimento_1
       and E.Localizacao_Id = P.Localizacao_Codigo
       and E.Remessa >= -1) as Numeric(15,4)),0.0000)  Empenhado,

     Coalesce(Cast((Select Sum(PG.QUANTIDADE)
      From TbProgramacao PG
     Where PG.PRODUTO_ID = P.CODIGO
       and PG.Estabelecimento_Id = :Estabelecimento_1
       and PG.Tipo in ('A','D')
       and PG.STATUS in ('0','1','2')) as Numeric(15,4)),0.0000)  Em_Producao,
    
    Coalesce(Cast(B.QUANTIDADE * (Coalesce(B.Ponto_Reposicao,100.0000) / 100.0000) as Numeric(15,4)),0.0000) QUANTIDADE_PONTO_REPOSICAO,
    Coalesce(B.QUANTIDADE,0.0000) Estoque_Minimo,
    Coalesce(B.PONTO_REPOSICAO,0.0000) PONTO_REPOSICAO,
    Coalesce(B.Estoque_Max,0.0000) Estoque_Maximo,
    Coalesce(B.TIPO_REPOSICAO,'1') Tipo_Reposicao,

    Coalesce(P.Seguranca,0.00) / 100.00 Seguranca
    
    From TbProduto P  
    Left Join TbEstoque_Minimo B ON B.Estabelecimento_Codigo = :Estabelecimento_1
                                and B.Localizacao_Codigo = P.Localizacao_Codigo
                                and B.PRODUTO_Codigo = P.Codigo and B.QUANTIDADE > 0
    Where P.Familia_Codigo = :Familia_1
      and P.Status = '1'
      and P.Grade_Codigo = 0

    
    ) X
    ) V Where V.NECESSIDADE > 0

  Into  :xPRODUTO_ID, :xModelo_Id, :xMODELO_DESCRICAO, :xCOR_Id, :xCOR_DESCRICAO,
        :xTAMANHO_ID, :xTAMANHO, :xUM, :xLOCALIZACAO_ID, :xESTOQUE,
        :xEM_PRODUCAO, :xEMPENHADO, :xPROJECAO, :xEST_MIN, :xEST_MAX, :xSEGURANCA,
        :xPERC_PONTO_REP, :xQTD_PONTO_REP, :xTIPO_REP, :xQTD_REP, :xNECESSIDADE,
        :xDensidade, :xEspessura

    Do
      
      Begin

      if (:xPRODUTO_ID > 0) then
          Begin
            produto_id = :Xproduto_id ;
            modelo_id = :Xmodelo_id;
            modelo_descricao = :Xmodelo_descricao;
            cor_id = :Xcor_id;
            cor_descricao = :Xcor_descricao;
            tamanho_id = :Xtamanho_id;
            tamanho = :Xtamanho;
            um = :Xum;
            localizacao_id = :Xlocalizacao_id ;
            estoque = :Xestoque ;
            empenhado = :Xempenhado ;
            em_producao = :Xem_producao ;
            projecao = :Xprojecao ;
            est_min = :Xest_min ;
            est_max = :Xest_max ;
            seguranca = :Xseguranca ;
            perc_ponto_rep = :Xperc_ponto_rep ;
            qtd_ponto_rep = :Xqtd_ponto_rep ;
            tipo_rep = :Xtipo_rep ;
            qtd_rep = :Xqtd_rep ;
            NECESSIDADE = :XNECESSIDADE ;
            PROGRAMAR = (Select Valor2 From ARREDONDAR_PRA_CIMA(:XNECESSIDADE));
            Densidade = :xDensidade;
            Espessura = :xEspessura;
            FILTRO = :produto_id||' '||:modelo_id||' '||:modelo_descricao||' '||:cor_descricao||' '||:tamanho;
            Suspend;
          End
      End 

End
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER procedure SPC_PROJECAO_REMESSA (
    ESTABELECIMENTO_1 integer,
    FAMILIA_1 integer)
returns (
    PRODUTO_ID integer,
    MODELO_ID integer,
    MODELO_DESCRICAO varchar(50),
    COR_ID integer,
    COR_DESCRICAO varchar(20),
    UM varchar(3),
    TAMANHO_ID integer,
    TAMANHO varchar(10),
    LOCALIZACAO_ID integer,
    ESTOQUE numeric(18,4),
    EMPENHADO numeric(18,4),
    EM_PRODUCAO numeric(18,4),
    PROJECAO numeric(18,4),
    EST_MIN numeric(18,4),
    EST_MAX numeric(18,4),
    SEGURANCA numeric(18,4),
    PERC_PONTO_REP numeric(18,4),
    QTD_PONTO_REP numeric(18,4),
    TIPO_REP char(12),
    QTD_REP numeric(18,4),
    NECESSIDADE numeric(18,4),
    PROGRAMAR numeric(18,4),
    DENSIDADE integer,
    ESPESSURA numeric(18,4),
    FILTRO varchar(500))
as
declare variable YMODELO_ID integer;
declare variable YCOR_ID integer;
declare variable YTAMANHO integer;
declare variable QUANTIDADE numeric(15,4);
declare variable VPRODUTO_ID integer;
declare variable VTAM integer;
declare variable VPROJECAO numeric(15,4);
declare variable XPRODUTO_ID integer;
declare variable XMODELO_ID integer;
declare variable XMODELO_DESCRICAO varchar(50);
declare variable XCOR_ID integer;
declare variable XCOR_DESCRICAO varchar(20);
declare variable XTAMANHO_ID integer;
declare variable XTAMANHO varchar(10);
declare variable XUM varchar(3);
declare variable XLOCALIZACAO_ID integer;
declare variable XESTOQUE numeric(18,4);
declare variable XEMPENHADO numeric(18,4);
declare variable XEM_PRODUCAO numeric(18,4);
declare variable XPROJECAO numeric(18,4);
declare variable XEST_MIN numeric(18,4);
declare variable XEST_MAX numeric(18,4);
declare variable XSEGURANCA numeric(18,4);
declare variable XPERC_PONTO_REP numeric(18,4);
declare variable XQTD_PONTO_REP numeric(18,4);
declare variable XTIPO_REP char(12);
declare variable XQTD_REP numeric(18,4);
declare variable XNECESSIDADE numeric(18,4);
declare variable XDENSIDADE integer;
declare variable XESPESSURA numeric(18,4);
BEGIN

    /* COLETA OS ITENS DE PEDIDOS COM SALDO A FATURAR DESCONTANDO O QUE ESTA NO ESTOQUE E EM REMESSAS */
    FOR
        SELECT
            MODELO_ID,
            COR_ID,
            TAMANHO,
            (SALDO_FATURAR - ALOC_EST - ALOC_REM) AS QUANTIDADE
        
        FROM
           (SELECT
                A.MODELO_CODIGO MODELO_ID,
                A.COR_ID,
                A.TAMANHO,
                CAST(SUM(S.QUANTIDADE) AS NUMERIC(15,4)) SALDO_FATURAR,
                CAST(SUM(A.QTD_EST   ) AS NUMERIC(15,4)) ALOC_EST,
                CAST(SUM(A.QTD_REM   ) AS NUMERIC(15,4)) ALOC_REM
        
            FROM
                TBPEDIDO_ITEM A,
                TBPEDIDO P,
                TBPEDIDO_ITEM_SALDO S

            WHERE A.ESTABELECIMENTO_CODIGO = :ESTABELECIMENTO_1
              AND A.ESTABELECIMENTO_CODIGO =  P.ESTABELECIMENTO_CODIGO
              AND A.CONTROLE              = S.PEDIDO_ITEM_CONTROLE
              AND A.PEDIDO                = P.PEDIDO
              AND P.STATUS                = 1
              AND P.SITUACAO              = 1
              AND A.SITUACAO              = 1
              AND P.DATA            BETWEEN '01.01.2015' AND CURRENT_DATE
        
            GROUP BY
                A.MODELO_CODIGO,
                A.COR_ID,
                A.TAMANHO)
        WHERE
            (SALDO_FATURAR - ALOC_EST - ALOC_REM) > 0
    
    INTO
        :YMODELO_ID,
        :YCOR_ID,
        :YTAMANHO,
        :QUANTIDADE
    DO
    BEGIN
        
        
        /* COLETA O CONSUMO DOS ITENS DOS PEDIDOS */
        FOR
            /* CONSULTA A FICHA TECNICA 2 (GERAL) */
            SELECT
                B.CONSUMO_PRODUTO_CODIGO PRODUTO_ID, B.TAM,
                CAST((
                    (CASE WHEN (CAST(:YTAMANHO AS INTEGER)= 0) AND (B.CONSUMO_QUANTIDADE     > 0) THEN CAST( (CAST(:QUANTIDADE AS NUMERIC(15,4)) * CAST((B.CONSUMO_QUANTIDADE    /B.FATOR_CONVERSAO)AS NUMERIC(15,8))) AS NUMERIC(15,4)) ELSE 0 END) +
                    (CASE WHEN (CAST(:YTAMANHO AS INTEGER)= 1) AND (B.CONSUMO_QUANTIDADE_T01 > 0) THEN CAST( (CAST(:QUANTIDADE AS NUMERIC(15,4)) * CAST((B.CONSUMO_QUANTIDADE_T01/B.FATOR_CONVERSAO)AS NUMERIC(15,8))) AS NUMERIC(15,4)) ELSE 0 END) +
                    (CASE WHEN (CAST(:YTAMANHO AS INTEGER)= 2) AND (B.CONSUMO_QUANTIDADE_T02 > 0) THEN CAST( (CAST(:QUANTIDADE AS NUMERIC(15,4)) * CAST((B.CONSUMO_QUANTIDADE_T02/B.FATOR_CONVERSAO)AS NUMERIC(15,8))) AS NUMERIC(15,4)) ELSE 0 END) +
                    (CASE WHEN (CAST(:YTAMANHO AS INTEGER)= 3) AND (B.CONSUMO_QUANTIDADE_T03 > 0) THEN CAST( (CAST(:QUANTIDADE AS NUMERIC(15,4)) * CAST((B.CONSUMO_QUANTIDADE_T03/B.FATOR_CONVERSAO)AS NUMERIC(15,8))) AS NUMERIC(15,4)) ELSE 0 END) +
                    (CASE WHEN (CAST(:YTAMANHO AS INTEGER)= 4) AND (B.CONSUMO_QUANTIDADE_T04 > 0) THEN CAST( (CAST(:QUANTIDADE AS NUMERIC(15,4)) * CAST((B.CONSUMO_QUANTIDADE_T04/B.FATOR_CONVERSAO)AS NUMERIC(15,8))) AS NUMERIC(15,4)) ELSE 0 END) +
                    (CASE WHEN (CAST(:YTAMANHO AS INTEGER)= 5) AND (B.CONSUMO_QUANTIDADE_T05 > 0) THEN CAST( (CAST(:QUANTIDADE AS NUMERIC(15,4)) * CAST((B.CONSUMO_QUANTIDADE_T05/B.FATOR_CONVERSAO)AS NUMERIC(15,8))) AS NUMERIC(15,4)) ELSE 0 END) +
                    (CASE WHEN (CAST(:YTAMANHO AS INTEGER)= 6) AND (B.CONSUMO_QUANTIDADE_T06 > 0) THEN CAST( (CAST(:QUANTIDADE AS NUMERIC(15,4)) * CAST((B.CONSUMO_QUANTIDADE_T06/B.FATOR_CONVERSAO)AS NUMERIC(15,8))) AS NUMERIC(15,4)) ELSE 0 END) +
                    (CASE WHEN (CAST(:YTAMANHO AS INTEGER)= 7) AND (B.CONSUMO_QUANTIDADE_T07 > 0) THEN CAST( (CAST(:QUANTIDADE AS NUMERIC(15,4)) * CAST((B.CONSUMO_QUANTIDADE_T07/B.FATOR_CONVERSAO)AS NUMERIC(15,8))) AS NUMERIC(15,4)) ELSE 0 END) +
                    (CASE WHEN (CAST(:YTAMANHO AS INTEGER)= 8) AND (B.CONSUMO_QUANTIDADE_T08 > 0) THEN CAST( (CAST(:QUANTIDADE AS NUMERIC(15,4)) * CAST((B.CONSUMO_QUANTIDADE_T08/B.FATOR_CONVERSAO)AS NUMERIC(15,8))) AS NUMERIC(15,4)) ELSE 0 END) +
                    (CASE WHEN (CAST(:YTAMANHO AS INTEGER)= 9) AND (B.CONSUMO_QUANTIDADE_T09 > 0) THEN CAST( (CAST(:QUANTIDADE AS NUMERIC(15,4)) * CAST((B.CONSUMO_QUANTIDADE_T09/B.FATOR_CONVERSAO)AS NUMERIC(15,8))) AS NUMERIC(15,4)) ELSE 0 END) +
                    (CASE WHEN (CAST(:YTAMANHO AS INTEGER)=10) AND (B.CONSUMO_QUANTIDADE_T10 > 0) THEN CAST( (CAST(:QUANTIDADE AS NUMERIC(15,4)) * CAST((B.CONSUMO_QUANTIDADE_T10/B.FATOR_CONVERSAO)AS NUMERIC(15,8))) AS NUMERIC(15,4)) ELSE 0 END) +
                    (CASE WHEN (CAST(:YTAMANHO AS INTEGER)=11) AND (B.CONSUMO_QUANTIDADE_T11 > 0) THEN CAST( (CAST(:QUANTIDADE AS NUMERIC(15,4)) * CAST((B.CONSUMO_QUANTIDADE_T11/B.FATOR_CONVERSAO)AS NUMERIC(15,8))) AS NUMERIC(15,4)) ELSE 0 END) +
                    (CASE WHEN (CAST(:YTAMANHO AS INTEGER)=12) AND (B.CONSUMO_QUANTIDADE_T12 > 0) THEN CAST( (CAST(:QUANTIDADE AS NUMERIC(15,4)) * CAST((B.CONSUMO_QUANTIDADE_T12/B.FATOR_CONVERSAO)AS NUMERIC(15,8))) AS NUMERIC(15,4)) ELSE 0 END) +
                    (CASE WHEN (CAST(:YTAMANHO AS INTEGER)=13) AND (B.CONSUMO_QUANTIDADE_T13 > 0) THEN CAST( (CAST(:QUANTIDADE AS NUMERIC(15,4)) * CAST((B.CONSUMO_QUANTIDADE_T13/B.FATOR_CONVERSAO)AS NUMERIC(15,8))) AS NUMERIC(15,4)) ELSE 0 END) +
                    (CASE WHEN (CAST(:YTAMANHO AS INTEGER)=14) AND (B.CONSUMO_QUANTIDADE_T14 > 0) THEN CAST( (CAST(:QUANTIDADE AS NUMERIC(15,4)) * CAST((B.CONSUMO_QUANTIDADE_T14/B.FATOR_CONVERSAO)AS NUMERIC(15,8))) AS NUMERIC(15,4)) ELSE 0 END) +
                    (CASE WHEN (CAST(:YTAMANHO AS INTEGER)=15) AND (B.CONSUMO_QUANTIDADE_T15 > 0) THEN CAST( (CAST(:QUANTIDADE AS NUMERIC(15,4)) * CAST((B.CONSUMO_QUANTIDADE_T15/B.FATOR_CONVERSAO)AS NUMERIC(15,8))) AS NUMERIC(15,4)) ELSE 0 END) +
                    (CASE WHEN (CAST(:YTAMANHO AS INTEGER)=16) AND (B.CONSUMO_QUANTIDADE_T16 > 0) THEN CAST( (CAST(:QUANTIDADE AS NUMERIC(15,4)) * CAST((B.CONSUMO_QUANTIDADE_T16/B.FATOR_CONVERSAO)AS NUMERIC(15,8))) AS NUMERIC(15,4)) ELSE 0 END) +
                    (CASE WHEN (CAST(:YTAMANHO AS INTEGER)=17) AND (B.CONSUMO_QUANTIDADE_T17 > 0) THEN CAST( (CAST(:QUANTIDADE AS NUMERIC(15,4)) * CAST((B.CONSUMO_QUANTIDADE_T17/B.FATOR_CONVERSAO)AS NUMERIC(15,8))) AS NUMERIC(15,4)) ELSE 0 END) +
                    (CASE WHEN (CAST(:YTAMANHO AS INTEGER)=18) AND (B.CONSUMO_QUANTIDADE_T18 > 0) THEN CAST( (CAST(:QUANTIDADE AS NUMERIC(15,4)) * CAST((B.CONSUMO_QUANTIDADE_T18/B.FATOR_CONVERSAO)AS NUMERIC(15,8))) AS NUMERIC(15,4)) ELSE 0 END) +
                    (CASE WHEN (CAST(:YTAMANHO AS INTEGER)=19) AND (B.CONSUMO_QUANTIDADE_T19 > 0) THEN CAST( (CAST(:QUANTIDADE AS NUMERIC(15,4)) * CAST((B.CONSUMO_QUANTIDADE_T19/B.FATOR_CONVERSAO)AS NUMERIC(15,8))) AS NUMERIC(15,4)) ELSE 0 END) +
                    (CASE WHEN (CAST(:YTAMANHO AS INTEGER)=20) AND (B.CONSUMO_QUANTIDADE_T20 > 0) THEN CAST( (CAST(:QUANTIDADE AS NUMERIC(15,4)) * CAST((B.CONSUMO_QUANTIDADE_T20/B.FATOR_CONVERSAO)AS NUMERIC(15,8))) AS NUMERIC(15,4)) ELSE 0 END)) AS NUMERIC(15,4))  QUANTIDADE
            
            FROM
                TBMODELO_CONSUMO B,
                TBPRODUTO P

            WHERE B.CONSUMO_PRODUTO_CODIGO = P.CODIGO
              AND B.MODELO_CODIGO          = :YMODELO_ID
              AND P.FAMILIA_CODIGO         = :FAMILIA_1
        
            UNION
            
            /* CONSULTA A FICHA TECNICA 3 (POR COR) */
            SELECT
                B.PRODUTO_ID,
                B.TAM,
                CAST((
                    (CASE WHEN (CAST(:YTAMANHO AS INTEGER)= 0) AND (B.QUANTIDADE     > 0) THEN CAST( (CAST(:QUANTIDADE AS NUMERIC(15,4)) * CAST((B.QUANTIDADE    /B.FATOR_CONVERSAO)AS NUMERIC(15,8))) AS NUMERIC(15,4)) ELSE 0 END) +
                    (CASE WHEN (CAST(:YTAMANHO AS INTEGER)= 1) AND (B.T01 > 0) THEN CAST( (CAST(:QUANTIDADE AS NUMERIC(15,4)) * CAST((B.T01/B.FATOR_CONVERSAO)AS NUMERIC(15,8))) AS NUMERIC(15,4)) ELSE 0 END) +
                    (CASE WHEN (CAST(:YTAMANHO AS INTEGER)= 2) AND (B.T02 > 0) THEN CAST( (CAST(:QUANTIDADE AS NUMERIC(15,4)) * CAST((B.T02/B.FATOR_CONVERSAO)AS NUMERIC(15,8))) AS NUMERIC(15,4)) ELSE 0 END) +
                    (CASE WHEN (CAST(:YTAMANHO AS INTEGER)= 3) AND (B.T03 > 0) THEN CAST( (CAST(:QUANTIDADE AS NUMERIC(15,4)) * CAST((B.T03/B.FATOR_CONVERSAO)AS NUMERIC(15,8))) AS NUMERIC(15,4)) ELSE 0 END) +
                    (CASE WHEN (CAST(:YTAMANHO AS INTEGER)= 4) AND (B.T04 > 0) THEN CAST( (CAST(:QUANTIDADE AS NUMERIC(15,4)) * CAST((B.T04/B.FATOR_CONVERSAO)AS NUMERIC(15,8))) AS NUMERIC(15,4)) ELSE 0 END) +
                    (CASE WHEN (CAST(:YTAMANHO AS INTEGER)= 5) AND (B.T05 > 0) THEN CAST( (CAST(:QUANTIDADE AS NUMERIC(15,4)) * CAST((B.T05/B.FATOR_CONVERSAO)AS NUMERIC(15,8))) AS NUMERIC(15,4)) ELSE 0 END) +
                    (CASE WHEN (CAST(:YTAMANHO AS INTEGER)= 6) AND (B.T06 > 0) THEN CAST( (CAST(:QUANTIDADE AS NUMERIC(15,4)) * CAST((B.T06/B.FATOR_CONVERSAO)AS NUMERIC(15,8))) AS NUMERIC(15,4)) ELSE 0 END) +
                    (CASE WHEN (CAST(:YTAMANHO AS INTEGER)= 7) AND (B.T07 > 0) THEN CAST( (CAST(:QUANTIDADE AS NUMERIC(15,4)) * CAST((B.T07/B.FATOR_CONVERSAO)AS NUMERIC(15,8))) AS NUMERIC(15,4)) ELSE 0 END) +
                    (CASE WHEN (CAST(:YTAMANHO AS INTEGER)= 8) AND (B.T08 > 0) THEN CAST( (CAST(:QUANTIDADE AS NUMERIC(15,4)) * CAST((B.T08/B.FATOR_CONVERSAO)AS NUMERIC(15,8))) AS NUMERIC(15,4)) ELSE 0 END) +
                    (CASE WHEN (CAST(:YTAMANHO AS INTEGER)= 9) AND (B.T09 > 0) THEN CAST( (CAST(:QUANTIDADE AS NUMERIC(15,4)) * CAST((B.T09/B.FATOR_CONVERSAO)AS NUMERIC(15,8))) AS NUMERIC(15,4)) ELSE 0 END) +
                    (CASE WHEN (CAST(:YTAMANHO AS INTEGER)=10) AND (B.T10 > 0) THEN CAST( (CAST(:QUANTIDADE AS NUMERIC(15,4)) * CAST((B.T10/B.FATOR_CONVERSAO)AS NUMERIC(15,8))) AS NUMERIC(15,4)) ELSE 0 END) +
                    (CASE WHEN (CAST(:YTAMANHO AS INTEGER)=11) AND (B.T11 > 0) THEN CAST( (CAST(:QUANTIDADE AS NUMERIC(15,4)) * CAST((B.T11/B.FATOR_CONVERSAO)AS NUMERIC(15,8))) AS NUMERIC(15,4)) ELSE 0 END) +
                    (CASE WHEN (CAST(:YTAMANHO AS INTEGER)=12) AND (B.T12 > 0) THEN CAST( (CAST(:QUANTIDADE AS NUMERIC(15,4)) * CAST((B.T12/B.FATOR_CONVERSAO)AS NUMERIC(15,8))) AS NUMERIC(15,4)) ELSE 0 END) +
                    (CASE WHEN (CAST(:YTAMANHO AS INTEGER)=13) AND (B.T13 > 0) THEN CAST( (CAST(:QUANTIDADE AS NUMERIC(15,4)) * CAST((B.T13/B.FATOR_CONVERSAO)AS NUMERIC(15,8))) AS NUMERIC(15,4)) ELSE 0 END) +
                    (CASE WHEN (CAST(:YTAMANHO AS INTEGER)=14) AND (B.T14 > 0) THEN CAST( (CAST(:QUANTIDADE AS NUMERIC(15,4)) * CAST((B.T14/B.FATOR_CONVERSAO)AS NUMERIC(15,8))) AS NUMERIC(15,4)) ELSE 0 END) +
                    (CASE WHEN (CAST(:YTAMANHO AS INTEGER)=15) AND (B.T15 > 0) THEN CAST( (CAST(:QUANTIDADE AS NUMERIC(15,4)) * CAST((B.T15/B.FATOR_CONVERSAO)AS NUMERIC(15,8))) AS NUMERIC(15,4)) ELSE 0 END) +
                    (CASE WHEN (CAST(:YTAMANHO AS INTEGER)=16) AND (B.T16 > 0) THEN CAST( (CAST(:QUANTIDADE AS NUMERIC(15,4)) * CAST((B.T16/B.FATOR_CONVERSAO)AS NUMERIC(15,8))) AS NUMERIC(15,4)) ELSE 0 END) +
                    (CASE WHEN (CAST(:YTAMANHO AS INTEGER)=17) AND (B.T17 > 0) THEN CAST( (CAST(:QUANTIDADE AS NUMERIC(15,4)) * CAST((B.T17/B.FATOR_CONVERSAO)AS NUMERIC(15,8))) AS NUMERIC(15,4)) ELSE 0 END) +
                    (CASE WHEN (CAST(:YTAMANHO AS INTEGER)=18) AND (B.T18 > 0) THEN CAST( (CAST(:QUANTIDADE AS NUMERIC(15,4)) * CAST((B.T18/B.FATOR_CONVERSAO)AS NUMERIC(15,8))) AS NUMERIC(15,4)) ELSE 0 END) +
                    (CASE WHEN (CAST(:YTAMANHO AS INTEGER)=19) AND (B.T19 > 0) THEN CAST( (CAST(:QUANTIDADE AS NUMERIC(15,4)) * CAST((B.T19/B.FATOR_CONVERSAO)AS NUMERIC(15,8))) AS NUMERIC(15,4)) ELSE 0 END) +
                    (CASE WHEN (CAST(:YTAMANHO AS INTEGER)=20) AND (B.T20 > 0) THEN CAST( (CAST(:QUANTIDADE AS NUMERIC(15,4)) * CAST((B.T20/B.FATOR_CONVERSAO)AS NUMERIC(15,8))) AS NUMERIC(15,4)) ELSE 0 END)) AS NUMERIC(15,4)) QUANTIDADE
            
            FROM
                TBMODELO_CONSUMO_COR B,
                TBPRODUTO P

            WHERE B.MODELO_ID      = :YMODELO_ID
              AND B.COR_ID         = :YCOR_ID
              AND B.PRODUTO_ID     = P.CODIGO
              AND P.FAMILIA_CODIGO = :FAMILIA_1
    
        INTO
            :VPRODUTO_ID,
            :VTAM,
            :VPROJECAO
        DO
        BEGIN
            INSERT INTO TMP10168_1 VALUES(0,'',:VPRODUTO_ID,:VTAM,0,'','',0,'',:VPROJECAO,0);
        END
  END

    FOR
        SELECT
            V.PRODUTO_ID,
            V.MODELO_ID,
            V.MODELO_DESCRICAO,
            V.COR_ID,
            V.COR_DESCRICAO,
            V.TAMANHO_ID,
            V.TAMANHO,
            V.UM,
            V.LOCALIZACAO_ID,
            V.ESTOQUE,
            V.EM_PRODUCAO,
            V.EMPENHADO,
            V.PROJECAO,
            V.EST_MIN,
            V.EST_MAX,
            V.SEGURANCA,
            V.PERC_PONTO_REP,
            V.QTD_PONTO_REP,
            V.TIPO_REP,
            V.QTD_REP,
            V.NECESSIDADE,
            (SELECT FIRST 1 M.DENSIDADE FROM TBMODELO M WHERE M.CODIGO = V.MODELO_ID),
            (SELECT FIRST 1 M.ESPESSURA FROM TBMODELO M WHERE M.CODIGO = V.MODELO_ID)
    
        FROM
            (SELECT
                X.PRODUTO_ID,
                X.MODELO_ID,
                X.MODELO_DESCRICAO,
                X.COR_ID,
                X.COR_DESCRICAO,
                X.TAMANHO_ID,
                X.TAMANHO,
                X.UM,
                X.LOCALIZACAO_ID,
                X.ESTOQUE,
                X.EM_PRODUCAO,
                X.EMPENHADO,
                X.PROJECAO,
                X.ESTOQUE_MINIMO EST_MIN,
                X.ESTOQUE_MAXIMO EST_MAX,
                X.SEGURANCA,
                X.PONTO_REPOSICAO PERC_PONTO_REP,
                X.QUANTIDADE_PONTO_REPOSICAO QTD_PONTO_REP,
                IIF(X.TIPO_REPOSICAO='0','MIN','MAX') TIPO_REP,
                IIF(X.TIPO_REPOSICAO='0' AND X.QUANTIDADE_PONTO_REPOSICAO <= X.ESTOQUE_MINIMO,X.ESTOQUE_MINIMO,X.ESTOQUE_MAXIMO) QTD_REP,
                IIF(X.ESTOQUE + X.EM_PRODUCAO - X.EMPENHADO - X.PROJECAO < X.QUANTIDADE_PONTO_REPOSICAO,
                    IIF(X.TIPO_REPOSICAO='0' AND X.QUANTIDADE_PONTO_REPOSICAO <= X.ESTOQUE_MINIMO,X.ESTOQUE_MINIMO,X.ESTOQUE_MAXIMO) -
                    (X.ESTOQUE + X.EM_PRODUCAO - X.EMPENHADO /* - X.PROJECAO */ ), 0) NECESSIDADE
            FROM
               (SELECT
                    P.CODIGO PRODUTO_ID,
                    P.MODELO_CODIGO MODELO_ID,
    
                    (SELECT FIRST 1 M.DESCRICAO
                       FROM TBMODELO M
                      WHERE M.CODIGO = P.MODELO_CODIGO) MODELO_DESCRICAO,
    
                    P.COR_CODIGO COR_ID,
    
                    (SELECT FIRST 1 C.DESCRICAO
                       FROM TBCOR C
                      WHERE C.CODIGO = P.COR_CODIGO) COR_DESCRICAO,
    
                    COALESCE(B.TAMANHO_ID,0) TAMANHO_ID,
                    COALESCE((SELECT FIRST 1 TAM_DESCRICAO
                       FROM SP_TAMANHO_GRADE(P.GRADE_CODIGO,B.TAMANHO_ID)),'') TAMANHO,

                    P.UNIDADEMEDIDA_SIGLA2 UM,
                    P.LOCALIZACAO_CODIGO LOCALIZACAO_ID,
            
                    COALESCE(CAST(
                        (SELECT FIRST 1 SUM(S.PROJECAO)
                           FROM TMP10168_1 S
                          WHERE S.PRODUTO_ID = P.CODIGO) AS NUMERIC(15,4)),0.0000) PROJECAO,
                
                    COALESCE(CAST(
                        (SELECT FIRST 1 SUM(S.SALDO)
                           FROM TBESTOQUE_SALDO S, TBLOCALIZACAO L
                          WHERE S.PRODUTO_CODIGO         = P.CODIGO
                            AND S.LOCALIZACAO_CODIGO = L.CODIGO
                            AND (S.LOCALIZACAO_CODIGO    = P.LOCALIZACAO_CODIGO or (L.CODIGO = S.LOCALIZACAO_CODIGO AND L.WIP = '1'))
                            AND S.ESTABELECIMENTO_CODIGO = :ESTABELECIMENTO_1) AS NUMERIC(15,4)),0.0000) ESTOQUE,

                    COALESCE(CAST(
                        (SELECT CAST(SUM(E.CONSUMO_KG-COALESCE(E.QUANTIDADE_CONFERENCIA,0)) AS NUMERIC(15,4))
                           FROM TBREMESSA_CONSUMO E
                          WHERE E.PRODUTO_ID  = P.CODIGO
                            AND E.CONFERENCIA = '0'
                            and Coalesce(E.Componente,'0') = '0'
                            AND E.ESTABELECIMENTO_ID = :ESTABELECIMENTO_1
                   --         AND E.LOCALIZACAO_ID = P.LOCALIZACAO_CODIGO
                            AND E.REMESSA >= -1) AS NUMERIC(15,4)),0.0000)  EMPENHADO,
        
                    COALESCE(CAST(
                        (SELECT SUM(PG.QUANTIDADE)
                           FROM TBPROGRAMACAO PG
                          WHERE PG.PRODUTO_ID         = P.CODIGO
                            AND PG.ESTABELECIMENTO_ID = :ESTABELECIMENTO_1
                            AND PG.TIPO              IN ('A','D')
                            AND PG.STATUS            IN ('0','1','2')) AS NUMERIC(15,4)),0.0000)  EM_PRODUCAO,
            
                    COALESCE(CAST(B.ESTOQUE_MIN * (COALESCE(B.PONTO_REPOSICAO,100.0000) / 100.0000) AS NUMERIC(15,4)),0.0000) QUANTIDADE_PONTO_REPOSICAO,
                    COALESCE(B.ESTOQUE_MIN,0.0000) ESTOQUE_MINIMO,
                    COALESCE(B.PONTO_REPOSICAO,0.0000) PONTO_REPOSICAO,
                    COALESCE(B.ESTOQUE_MAX,0.0000) ESTOQUE_MAXIMO,
                    COALESCE(B.TIPO_REPOSICAO,'1') TIPO_REPOSICAO,
                    COALESCE(P.SEGURANCA,0.00) / 100.00 SEGURANCA
            
                FROM TBPRODUTO P LEFT JOIN
                    (
                    SELECT M00.ESTABELECIMENTO_CODIGO, M00.PRODUTO_CODIGO, M00.LOCALIZACAO_CODIGO, M00.ESTOQUE_SEGURANCA, 00 TAMANHO_ID, M00.QUANTIDADE ESTOQUE_MIN, M00.SEGURANCA, M00.ESTOQUE_MAX ESTOQUE_MAX, M00.PONTO_REPOSICAO, M00.TIPO_REPOSICAO FROM TBESTOQUE_MINIMO M00, TBPRODUTO P WHERE P.CODIGO = M00.PRODUTO_CODIGO AND P.GRADE_CODIGO = 0 AND (M00.QUANTIDADE > 0 OR M00.ESTOQUE_MAX > 0) UNION
                    SELECT M01.ESTABELECIMENTO_CODIGO, M01.PRODUTO_CODIGO, M01.LOCALIZACAO_CODIGO, M01.ESTOQUE_SEGURANCA, 01 TAMANHO_ID, T01            ESTOQUE_MIN, M01.SEGURANCA, M01             ESTOQUE_MAX, M01.PONTO_REPOSICAO, M01.TIPO_REPOSICAO FROM TBESTOQUE_MINIMO M01, TBPRODUTO P WHERE P.CODIGO = M01.PRODUTO_CODIGO AND P.GRADE_CODIGO > 0 AND (M01.T01        > 0 OR M01.M01         > 0) UNION
                    SELECT M02.ESTABELECIMENTO_CODIGO, M02.PRODUTO_CODIGO, M02.LOCALIZACAO_CODIGO, M02.ESTOQUE_SEGURANCA, 02 TAMANHO_ID, T02            ESTOQUE_MIN, M02.SEGURANCA, M02             ESTOQUE_MAX, M02.PONTO_REPOSICAO, M02.TIPO_REPOSICAO FROM TBESTOQUE_MINIMO M02, TBPRODUTO P WHERE P.CODIGO = M02.PRODUTO_CODIGO AND P.GRADE_CODIGO > 0 AND (M02.T02        > 0 OR M02.M02         > 0) UNION
                    SELECT M03.ESTABELECIMENTO_CODIGO, M03.PRODUTO_CODIGO, M03.LOCALIZACAO_CODIGO, M03.ESTOQUE_SEGURANCA, 03 TAMANHO_ID, T03            ESTOQUE_MIN, M03.SEGURANCA, M03             ESTOQUE_MAX, M03.PONTO_REPOSICAO, M03.TIPO_REPOSICAO FROM TBESTOQUE_MINIMO M03, TBPRODUTO P WHERE P.CODIGO = M03.PRODUTO_CODIGO AND P.GRADE_CODIGO > 0 AND (M03.T03        > 0 OR M03.M03         > 0) UNION
                    SELECT M04.ESTABELECIMENTO_CODIGO, M04.PRODUTO_CODIGO, M04.LOCALIZACAO_CODIGO, M04.ESTOQUE_SEGURANCA, 04 TAMANHO_ID, T04            ESTOQUE_MIN, M04.SEGURANCA, M04             ESTOQUE_MAX, M04.PONTO_REPOSICAO, M04.TIPO_REPOSICAO FROM TBESTOQUE_MINIMO M04, TBPRODUTO P WHERE P.CODIGO = M04.PRODUTO_CODIGO AND P.GRADE_CODIGO > 0 AND (M04.T04        > 0 OR M04.M04         > 0) UNION
                    SELECT M05.ESTABELECIMENTO_CODIGO, M05.PRODUTO_CODIGO, M05.LOCALIZACAO_CODIGO, M05.ESTOQUE_SEGURANCA, 05 TAMANHO_ID, T05            ESTOQUE_MIN, M05.SEGURANCA, M05             ESTOQUE_MAX, M05.PONTO_REPOSICAO, M05.TIPO_REPOSICAO FROM TBESTOQUE_MINIMO M05, TBPRODUTO P WHERE P.CODIGO = M05.PRODUTO_CODIGO AND P.GRADE_CODIGO > 0 AND (M05.T05        > 0 OR M05.M05         > 0) UNION
                    SELECT M06.ESTABELECIMENTO_CODIGO, M06.PRODUTO_CODIGO, M06.LOCALIZACAO_CODIGO, M06.ESTOQUE_SEGURANCA, 06 TAMANHO_ID, T06            ESTOQUE_MIN, M06.SEGURANCA, M06             ESTOQUE_MAX, M06.PONTO_REPOSICAO, M06.TIPO_REPOSICAO FROM TBESTOQUE_MINIMO M06, TBPRODUTO P WHERE P.CODIGO = M06.PRODUTO_CODIGO AND P.GRADE_CODIGO > 0 AND (M06.T06        > 0 OR M06.M06         > 0) UNION
                    SELECT M07.ESTABELECIMENTO_CODIGO, M07.PRODUTO_CODIGO, M07.LOCALIZACAO_CODIGO, M07.ESTOQUE_SEGURANCA, 07 TAMANHO_ID, T07            ESTOQUE_MIN, M07.SEGURANCA, M07             ESTOQUE_MAX, M07.PONTO_REPOSICAO, M07.TIPO_REPOSICAO FROM TBESTOQUE_MINIMO M07, TBPRODUTO P WHERE P.CODIGO = M07.PRODUTO_CODIGO AND P.GRADE_CODIGO > 0 AND (M07.T07        > 0 OR M07.M07         > 0) UNION
                    SELECT M08.ESTABELECIMENTO_CODIGO, M08.PRODUTO_CODIGO, M08.LOCALIZACAO_CODIGO, M08.ESTOQUE_SEGURANCA, 08 TAMANHO_ID, T08            ESTOQUE_MIN, M08.SEGURANCA, M08             ESTOQUE_MAX, M08.PONTO_REPOSICAO, M08.TIPO_REPOSICAO FROM TBESTOQUE_MINIMO M08, TBPRODUTO P WHERE P.CODIGO = M08.PRODUTO_CODIGO AND P.GRADE_CODIGO > 0 AND (M08.T08        > 0 OR M08.M08         > 0) UNION
                    SELECT M09.ESTABELECIMENTO_CODIGO, M09.PRODUTO_CODIGO, M09.LOCALIZACAO_CODIGO, M09.ESTOQUE_SEGURANCA, 09 TAMANHO_ID, T09            ESTOQUE_MIN, M09.SEGURANCA, M09             ESTOQUE_MAX, M09.PONTO_REPOSICAO, M09.TIPO_REPOSICAO FROM TBESTOQUE_MINIMO M09, TBPRODUTO P WHERE P.CODIGO = M09.PRODUTO_CODIGO AND P.GRADE_CODIGO > 0 AND (M09.T09        > 0 OR M09.M09         > 0) UNION
                    SELECT M10.ESTABELECIMENTO_CODIGO, M10.PRODUTO_CODIGO, M10.LOCALIZACAO_CODIGO, M10.ESTOQUE_SEGURANCA, 10 TAMANHO_ID, T10            ESTOQUE_MIN, M10.SEGURANCA, M10             ESTOQUE_MAX, M10.PONTO_REPOSICAO, M10.TIPO_REPOSICAO FROM TBESTOQUE_MINIMO M10, TBPRODUTO P WHERE P.CODIGO = M10.PRODUTO_CODIGO AND P.GRADE_CODIGO > 0 AND (M10.T10        > 0 OR M10.M10         > 0) UNION
                    SELECT M11.ESTABELECIMENTO_CODIGO, M11.PRODUTO_CODIGO, M11.LOCALIZACAO_CODIGO, M11.ESTOQUE_SEGURANCA, 11 TAMANHO_ID, T11            ESTOQUE_MIN, M11.SEGURANCA, M11             ESTOQUE_MAX, M11.PONTO_REPOSICAO, M11.TIPO_REPOSICAO FROM TBESTOQUE_MINIMO M11, TBPRODUTO P WHERE P.CODIGO = M11.PRODUTO_CODIGO AND P.GRADE_CODIGO > 0 AND (M11.T11        > 0 OR M11.M11         > 0) UNION
                    SELECT M12.ESTABELECIMENTO_CODIGO, M12.PRODUTO_CODIGO, M12.LOCALIZACAO_CODIGO, M12.ESTOQUE_SEGURANCA, 12 TAMANHO_ID, T12            ESTOQUE_MIN, M12.SEGURANCA, M12             ESTOQUE_MAX, M12.PONTO_REPOSICAO, M12.TIPO_REPOSICAO FROM TBESTOQUE_MINIMO M12, TBPRODUTO P WHERE P.CODIGO = M12.PRODUTO_CODIGO AND P.GRADE_CODIGO > 0 AND (M12.T12        > 0 OR M12.M12         > 0) UNION
                    SELECT M13.ESTABELECIMENTO_CODIGO, M13.PRODUTO_CODIGO, M13.LOCALIZACAO_CODIGO, M13.ESTOQUE_SEGURANCA, 13 TAMANHO_ID, T13            ESTOQUE_MIN, M13.SEGURANCA, M13             ESTOQUE_MAX, M13.PONTO_REPOSICAO, M13.TIPO_REPOSICAO FROM TBESTOQUE_MINIMO M13, TBPRODUTO P WHERE P.CODIGO = M13.PRODUTO_CODIGO AND P.GRADE_CODIGO > 0 AND (M13.T13        > 0 OR M13.M13         > 0) UNION
                    SELECT M14.ESTABELECIMENTO_CODIGO, M14.PRODUTO_CODIGO, M14.LOCALIZACAO_CODIGO, M14.ESTOQUE_SEGURANCA, 14 TAMANHO_ID, T14            ESTOQUE_MIN, M14.SEGURANCA, M14             ESTOQUE_MAX, M14.PONTO_REPOSICAO, M14.TIPO_REPOSICAO FROM TBESTOQUE_MINIMO M14, TBPRODUTO P WHERE P.CODIGO = M14.PRODUTO_CODIGO AND P.GRADE_CODIGO > 0 AND (M14.T14        > 0 OR M14.M14         > 0) UNION
                    SELECT M15.ESTABELECIMENTO_CODIGO, M15.PRODUTO_CODIGO, M15.LOCALIZACAO_CODIGO, M15.ESTOQUE_SEGURANCA, 15 TAMANHO_ID, T15            ESTOQUE_MIN, M15.SEGURANCA, M15             ESTOQUE_MAX, M15.PONTO_REPOSICAO, M15.TIPO_REPOSICAO FROM TBESTOQUE_MINIMO M15, TBPRODUTO P WHERE P.CODIGO = M15.PRODUTO_CODIGO AND P.GRADE_CODIGO > 0 AND (M15.T15        > 0 OR M15.M15         > 0) UNION
                    SELECT M16.ESTABELECIMENTO_CODIGO, M16.PRODUTO_CODIGO, M16.LOCALIZACAO_CODIGO, M16.ESTOQUE_SEGURANCA, 16 TAMANHO_ID, T16            ESTOQUE_MIN, M16.SEGURANCA, M16             ESTOQUE_MAX, M16.PONTO_REPOSICAO, M16.TIPO_REPOSICAO FROM TBESTOQUE_MINIMO M16, TBPRODUTO P WHERE P.CODIGO = M16.PRODUTO_CODIGO AND P.GRADE_CODIGO > 0 AND (M16.T16        > 0 OR M16.M16         > 0) UNION
                    SELECT M17.ESTABELECIMENTO_CODIGO, M17.PRODUTO_CODIGO, M17.LOCALIZACAO_CODIGO, M17.ESTOQUE_SEGURANCA, 17 TAMANHO_ID, T17            ESTOQUE_MIN, M17.SEGURANCA, M17             ESTOQUE_MAX, M17.PONTO_REPOSICAO, M17.TIPO_REPOSICAO FROM TBESTOQUE_MINIMO M17, TBPRODUTO P WHERE P.CODIGO = M17.PRODUTO_CODIGO AND P.GRADE_CODIGO > 0 AND (M17.T17        > 0 OR M17.M17         > 0) UNION
                    SELECT M18.ESTABELECIMENTO_CODIGO, M18.PRODUTO_CODIGO, M18.LOCALIZACAO_CODIGO, M18.ESTOQUE_SEGURANCA, 18 TAMANHO_ID, T18            ESTOQUE_MIN, M18.SEGURANCA, M18             ESTOQUE_MAX, M18.PONTO_REPOSICAO, M18.TIPO_REPOSICAO FROM TBESTOQUE_MINIMO M18, TBPRODUTO P WHERE P.CODIGO = M18.PRODUTO_CODIGO AND P.GRADE_CODIGO > 0 AND (M18.T18        > 0 OR M18.M18         > 0) UNION
                    SELECT M19.ESTABELECIMENTO_CODIGO, M19.PRODUTO_CODIGO, M19.LOCALIZACAO_CODIGO, M19.ESTOQUE_SEGURANCA, 19 TAMANHO_ID, T19            ESTOQUE_MIN, M19.SEGURANCA, M19             ESTOQUE_MAX, M19.PONTO_REPOSICAO, M19.TIPO_REPOSICAO FROM TBESTOQUE_MINIMO M19, TBPRODUTO P WHERE P.CODIGO = M19.PRODUTO_CODIGO AND P.GRADE_CODIGO > 0 AND (M19.T19        > 0 OR M19.M19         > 0) UNION
                    SELECT M20.ESTABELECIMENTO_CODIGO, M20.PRODUTO_CODIGO, M20.LOCALIZACAO_CODIGO, M20.ESTOQUE_SEGURANCA, 20 TAMANHO_ID, T20            ESTOQUE_MIN, M20.SEGURANCA, M20             ESTOQUE_MAX, M20.PONTO_REPOSICAO, M20.TIPO_REPOSICAO FROM TBESTOQUE_MINIMO M20, TBPRODUTO P WHERE P.CODIGO = M20.PRODUTO_CODIGO AND P.GRADE_CODIGO > 0 AND (M20.T20        > 0 OR M20.M20         > 0)
                    ) B ON
                        B.ESTABELECIMENTO_CODIGO = :ESTABELECIMENTO_1
                    AND B.LOCALIZACAO_CODIGO     = P.LOCALIZACAO_CODIGO
                    AND B.PRODUTO_CODIGO         = P.CODIGO
                    AND B.ESTOQUE_MIN > 0
    
                WHERE P.FAMILIA_CODIGO = :FAMILIA_1
                AND P.STATUS           = '1'
                ) X
            ) V
    
  --      WHERE V.NECESSIDADE > 0

    INTO
        :XPRODUTO_ID,
        :XMODELO_ID,
        :XMODELO_DESCRICAO,
        :XCOR_ID,
        :XCOR_DESCRICAO,
        :XTAMANHO_ID,
        :XTAMANHO,
        :XUM,
        :XLOCALIZACAO_ID,
        :XESTOQUE,
        :XEM_PRODUCAO,
        :XEMPENHADO,
        :XPROJECAO,
        :XEST_MIN,
        :XEST_MAX,
        :XSEGURANCA,
        :XPERC_PONTO_REP,
        :XQTD_PONTO_REP,
        :XTIPO_REP,
        :XQTD_REP,
        :XNECESSIDADE,
        :XDENSIDADE,
        :XESPESSURA

    DO
    BEGIN
        IF (:XPRODUTO_ID > 0) THEN
        BEGIN
            PRODUTO_ID       = :XPRODUTO_ID ;
            MODELO_ID        = :XMODELO_ID;
            MODELO_DESCRICAO = :XMODELO_DESCRICAO;
            COR_ID           = :XCOR_ID;
            COR_DESCRICAO    = :XCOR_DESCRICAO;
            TAMANHO_ID       = :XTAMANHO_ID;
            TAMANHO          = :XTAMANHO;
            UM               = :XUM;
            LOCALIZACAO_ID   = :XLOCALIZACAO_ID ;
            ESTOQUE          = :XESTOQUE ;
            EMPENHADO        = :XEMPENHADO ;
            EM_PRODUCAO      = :XEM_PRODUCAO ;
            PROJECAO         = :XPROJECAO ;
            EST_MIN          = :XEST_MIN ;
            EST_MAX          = :XEST_MAX ;
            SEGURANCA        = :XSEGURANCA ;
            PERC_PONTO_REP   = :XPERC_PONTO_REP ;
            QTD_PONTO_REP    = :XQTD_PONTO_REP ;
            TIPO_REP         = :XTIPO_REP ;
            QTD_REP          = :XQTD_REP ;
            NECESSIDADE      = :XNECESSIDADE ;
            PROGRAMAR        = (SELECT VALOR2 FROM ARREDONDAR_PRA_CIMA(:XNECESSIDADE));
            DENSIDADE        = :XDENSIDADE;
            ESPESSURA        = :XESPESSURA;
            FILTRO           = :PRODUTO_ID||' '||:MODELO_ID||' '||:MODELO_DESCRICAO||' '||:COR_DESCRICAO||' '||:TAMANHO;
            SUSPEND;
        END
    END

END
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER procedure SPC_PROJECAO_REMESSA1 (
    ESTABELECIMENTO_1 integer,
    FAMILIA_1 integer,
    I_PRODUTO_ID integer = null,
    I_TAMANHO integer = null)
returns (
    PRODUTO_ID integer,
    MODELO_ID integer,
    MODELO_DESCRICAO varchar(50),
    COR_ID integer,
    COR_DESCRICAO varchar(20),
    UM varchar(3),
    TAMANHO_ID integer,
    TAMANHO varchar(10),
    LOCALIZACAO_ID integer,
    ESTOQUE numeric(18,4),
    EMPENHADO numeric(18,4),
    PEDIDO numeric(18,4),
    EM_PRODUCAO numeric(18,4),
    EST_MIN numeric(18,4),
    EST_MAX numeric(18,4),
    SEGURANCA numeric(18,4),
    PERC_PONTO_REP numeric(18,4),
    QTD_PONTO_REP numeric(18,4),
    TIPO_REP char(12),
    QTD_REP numeric(18,4),
    NECESSIDADE numeric(18,4),
    PROGRAMAR numeric(18,4),
    DENSIDADE integer,
    ESPESSURA numeric(18,4),
    FILTRO varchar(500))
as
declare variable YMODELO_ID integer;
declare variable YCOR_ID integer;
declare variable YTAMANHO integer;
declare variable QUANTIDADE numeric(15,4);
declare variable VPRODUTO_ID integer;
declare variable VTAM integer;
declare variable VPROJECAO numeric(15,4);
declare variable XPRODUTO_ID integer;
declare variable XMODELO_ID integer;
declare variable XMODELO_DESCRICAO varchar(50);
declare variable XCOR_ID integer;
declare variable XCOR_DESCRICAO varchar(20);
declare variable XTAMANHO_ID integer;
declare variable XTAMANHO varchar(10);
declare variable XUM varchar(3);
declare variable XLOCALIZACAO_ID integer;
declare variable XESTOQUE numeric(18,4);
declare variable XEMPENHADO numeric(18,4);
declare variable XPEDIDO numeric(18,4);
declare variable XEM_PRODUCAO numeric(18,4);
declare variable XEST_MIN numeric(18,4);
declare variable XEST_MAX numeric(18,4);
declare variable XSEGURANCA numeric(18,4);
declare variable XPERC_PONTO_REP numeric(18,4);
declare variable XQTD_PONTO_REP numeric(18,4);
declare variable XTIPO_REP char(12);
declare variable XQTD_REP numeric(18,4);
declare variable XNECESSIDADE numeric(18,4);
declare variable XDENSIDADE integer;
declare variable XESPESSURA numeric(18,4);
BEGIN

    FOR
        SELECT
            Y.PRODUTO_ID,
            Y.MODELO_ID,
            Y.MODELO_DESCRICAO,
            Y.DENSIDADE,
            Y.ESPESSURA,
            Y.COR_ID,
            Y.COR_DESCRICAO,
            Y.TAMANHO_ID,
            Y.TAMANHO,
            Y.UM,
            Y.LOCALIZACAO_ID,
            Y.ESTOQUE,
       --     Y.ESTOQUE_WIP,
            Y.EMPENHADO,
            Y.PEDIDO,
            Y.EM_PRODUCAO,
            Y.SEGURANCA,
            Y.ESTOQUE_MINIMO,
            Y.ESTOQUE_MAXIMO,
            Y.PONTO_REPOSICAO,
            Y.QUANTIDADE_PONTO_REPOSICAO,
            Y.TIPO_REP,
            Y.QTD_REP,
            Y.NECESSIDADE

        FROM
            (SELECT
                X.PRODUTO_ID,
                X.MODELO_ID,
                X.MODELO_DESCRICAO,
                X.DENSIDADE,
                X.ESPESSURA,
                X.COR_ID,
                X.COR_DESCRICAO,
                X.TAMANHO_ID,
                X.TAMANHO,
                X.UM,
                X.LOCALIZACAO_ID,
                X.ESTOQUE,
        --        X.ESTOQUE_WIP,
                X.EMPENHADO,
                X.PEDIDO,
                X.EM_PRODUCAO,
                X.SEGURANCA,
                X.ESTOQUE_MINIMO,
                X.ESTOQUE_MAXIMO,
                X.PONTO_REPOSICAO,
                X.TIPO_REPOSICAO,
                X.QUANTIDADE_PONTO_REPOSICAO,
                IIF(X.TIPO_REPOSICAO='0','MIN','MAX') TIPO_REP,
            
                IIF(X.TIPO_REPOSICAO='0' AND X.QUANTIDADE_PONTO_REPOSICAO <= X.ESTOQUE_MINIMO,
                    X.ESTOQUE_MINIMO,
                    X.ESTOQUE_MAXIMO) QTD_REP,
            
                IIF(X.ESTOQUE  + X.EM_PRODUCAO - X.EMPENHADO - X.PEDIDO < X.QUANTIDADE_PONTO_REPOSICAO,
                    IIF(X.TIPO_REPOSICAO='0' AND X.QUANTIDADE_PONTO_REPOSICAO <= X.ESTOQUE_MINIMO,
                        X.ESTOQUE_MINIMO,X.ESTOQUE_MAXIMO) - ( X.ESTOQUE  + X.EM_PRODUCAO - X.EMPENHADO - X.PEDIDO ), 0) NECESSIDADE
            FROM
                (SELECT
                    A.PRODUTO_ID,
                    A.MODELO_ID,
                    CAST(SUBSTRING(A.MODELO   FROM 01 FOR 50) AS   VARCHAR(50)) MODELO_DESCRICAO,

                    IIF( CAST(SUBSTRING(A.MODELO FROM 51 FOR 10) AS INTEGER) > 0, CAST(SUBSTRING(A.MODELO FROM 51 FOR 10) AS INTEGER), CAST(SUBSTRING(A.DENS_ESP FROM 01 FOR 05) AS       INTEGER)) DENSIDADE,

                    IIF( CAST(SUBSTRING(A.MODELO FROM 61 FOR 12) AS NUMERIC(10,1)) > 0, CAST(SUBSTRING(A.MODELO FROM 61 FOR 12) AS NUMERIC(10,1)), CAST(SUBSTRING(A.DENS_ESP FROM 06 FOR 10) AS NUMERIC(10,1))) ESPESSURA,

                    A.COR_ID,
                    A.COR_DESCRICAO,
                    A.TAMANHO_ID,
                    A.TAMANHO,
                    A.UM,
                    A.LOCALIZACAO_ID,
                    A.ESTOQUE,
          --          A.ESTOQUE_WIP,
                    A.EMPENHADO,
                    A.PEDIDO,
                    A.EM_PRODUCAO,
                    A.SEGURANCA,
                    CAST(COALESCE(SUBSTRING(A.REPOSICAO FROM 01 FOR 15),  0) AS NUMERIC(10,4)) ESTOQUE_MINIMO,
                    CAST(COALESCE(SUBSTRING(A.REPOSICAO FROM 16 FOR 15),  0) AS NUMERIC(10,4)) ESTOQUE_MAXIMO,
                    CAST(COALESCE(SUBSTRING(A.REPOSICAO FROM 31 FOR 12),100) AS       INTEGER) PONTO_REPOSICAO,
                    CAST(COALESCE(SUBSTRING(A.REPOSICAO FROM 43 FOR 05),'1') AS       CHAR(1)) TIPO_REPOSICAO,
                
                    CAST(
                    (CAST(COALESCE(SUBSTRING(A.REPOSICAO FROM 01 FOR 15),  0) AS NUMERIC(10,4)) *
                     CAST(COALESCE(SUBSTRING(A.REPOSICAO FROM 31 FOR 12),100) AS       INTEGER) / 100) AS NUMERIC(10,4)) QUANTIDADE_PONTO_REPOSICAO
                
                FROM
                    (SELECT
                        P.CODIGO PRODUTO_ID,
                        P.MODELO_CODIGO MODELO_ID,
                    
                        (SELECT FIRST 1 RPAD(COALESCE(M.DESCRICAO,''),50) || LPAD(COALESCE(M.DENSIDADE,0),10) || LPAD(COALESCE(M.ESPESSURA,0),12)
                           FROM TBMODELO M
                          WHERE M.CODIGO = P.MODELO_CODIGO) MODELO,

                        Coalesce((
                            Select First 1
                              Coalesce((Select First 1 lPad(M.Densidade,5,'0')||lPad(M.Espessura,5,'0')
                                 From TbModelo M Where M.Codigo = P2.Modelo_Codigo),'0000000000')
                              From TbModelo_Consumo_Cor MC, TbFamilia F, TbProduto P2
                             Where MC.Modelo_Id = P.MODELO_CODIGO
                               and MC.Cor_Id = P.COR_CODIGO
                               and MC.Produto_Id = P2.Codigo
                               and P2.Familia_Codigo = F.Codigo
                               and F.Densidade_Espessura = '1'
                               and((GS.TAMANHO = 1 and MC.T01 > 0) or
                                   (GS.TAMANHO = 2 and MC.T02 > 0) or
                                   (GS.TAMANHO = 3 and MC.T03 > 0) or
                                   (GS.TAMANHO = 4 and MC.T04 > 0) or
                                   (GS.TAMANHO = 5 and MC.T05 > 0) or
                                   (GS.TAMANHO = 6 and MC.T06 > 0) or
                                   (GS.TAMANHO = 7 and MC.T07 > 0) or
                                   (GS.TAMANHO = 8 and MC.T08 > 0) or
                                   (GS.TAMANHO = 9 and MC.T09 > 0) or
                                   (GS.TAMANHO =10 and MC.T10 > 0) or
                                   (GS.TAMANHO =11 and MC.T11 > 0) or
                                   (GS.TAMANHO =12 and MC.T12 > 0) or
                                   (GS.TAMANHO =13 and MC.T13 > 0) or
                                   (GS.TAMANHO =14 and MC.T14 > 0) or
                                   (GS.TAMANHO =15 and MC.T15 > 0) or
                                   (GS.TAMANHO =16 and MC.T16 > 0) or
                                   (GS.TAMANHO =17 and MC.T17 > 0) or
                                   (GS.TAMANHO =18 and MC.T18 > 0) or
                                   (GS.TAMANHO =19 and MC.T19 > 0) or
                                   (GS.TAMANHO =20 and MC.T20 > 0))),'0000000000') DENS_ESP,

                        P.COR_CODIGO COR_ID,
                    
                        (SELECT FIRST 1 C.DESCRICAO
                           FROM TBCOR C
                          WHERE C.CODIGO = P.COR_CODIGO) COR_DESCRICAO,
                    
                        COALESCE(GS.TAMANHO,0) TAMANHO_ID,
                    
                        COALESCE((SELECT FIRST 1 TAM_DESCRICAO
                                    FROM SP_TAMANHO_GRADE(P.GRADE_CODIGO,GS.TAMANHO)),'') TAMANHO,
                        
                        P.UNIDADEMEDIDA_SIGLA2 UM,
                        P.LOCALIZACAO_CODIGO LOCALIZACAO_ID,
                    
                        COALESCE(CAST(
                            (SELECT
                                IIF(GS.TAMANHO = 00, SUM(S.SALDO),
                                IIF(GS.TAMANHO = 01, SUM(S.T01_SALDO),
                                IIF(GS.TAMANHO = 02, SUM(S.T02_SALDO),
                                IIF(GS.TAMANHO = 03, SUM(S.T03_SALDO),
                                IIF(GS.TAMANHO = 04, SUM(S.T04_SALDO),
                                IIF(GS.TAMANHO = 05, SUM(S.T05_SALDO),
                                IIF(GS.TAMANHO = 06, SUM(S.T06_SALDO),
                                IIF(GS.TAMANHO = 07, SUM(S.T07_SALDO),
                                IIF(GS.TAMANHO = 08, SUM(S.T08_SALDO),
                                IIF(GS.TAMANHO = 09, SUM(S.T09_SALDO),
                                IIF(GS.TAMANHO = 10, SUM(S.T10_SALDO),
                                IIF(GS.TAMANHO = 11, SUM(S.T11_SALDO),
                                IIF(GS.TAMANHO = 12, SUM(S.T12_SALDO),
                                IIF(GS.TAMANHO = 13, SUM(S.T13_SALDO),
                                IIF(GS.TAMANHO = 14, SUM(S.T14_SALDO),
                                IIF(GS.TAMANHO = 15, SUM(S.T15_SALDO),
                                IIF(GS.TAMANHO = 16, SUM(S.T16_SALDO),
                                IIF(GS.TAMANHO = 17, SUM(S.T17_SALDO),
                                IIF(GS.TAMANHO = 18, SUM(S.T18_SALDO),
                                IIF(GS.TAMANHO = 19, SUM(S.T19_SALDO),
                                IIF(GS.TAMANHO = 20, SUM(S.T20_SALDO),0)))))))))))))))))))))
                    
                               FROM TBESTOQUE_SALDO S, TBLOCALIZACAO L
                              WHERE S.PRODUTO_CODIGO         = P.CODIGO
                                AND S.LOCALIZACAO_CODIGO     = L.CODIGO
                                AND (S.LOCALIZACAO_CODIGO    IN (SELECT OSPLIT FROM SPLIT(COALESCE(NULLIF(FN_PARAMETRO('TBFAMILIA.LOCALIZACAO_PADRAO',P.FAMILIA_CODIGO),'0'),P.LOCALIZACAO_CODIGO),',')) or (L.CODIGO = S.LOCALIZACAO_CODIGO AND L.WIP = '1'))
                                AND S.ESTABELECIMENTO_CODIGO = :ESTABELECIMENTO_1) AS NUMERIC(15,4)),0.0000) ESTOQUE,
                        /*
                        COALESCE((
                            SELECT SUM(SALDO)
                              FROM (
                                SELECT DISTINCT ES.*
                                  FROM VWESTOQUE_SALDO_PRODUTO ES,
                                       TBFAMILIA_LOCALIZACAO L
                                 WHERE P.CODIGO              = ES.PRODUTO_ID
                                   AND GS.TAMANHO            = ES.TAMANHO
                                   AND L.LOCALIZACAO_ID      = ES.LOCALIZACAO_ID
                                   AND P.FAMILIA_CODIGO      = L.FAMILIA_ID
                                   AND L.LOCALIZACAO_TIPO_ID = 5 -- WIP
                                   AND ES.PRODUTO_ID         = P.CODIGO) X),0)ESTOQUE_WIP,
                        */
                        COALESCE(CAST(
                            (SELECT CAST(SUM(E.CONSUMO_KG-COALESCE(E.QUANTIDADE_CONFERENCIA,0)) AS NUMERIC(15,4))
                               FROM TBREMESSA_CONSUMO E
                              WHERE E.PRODUTO_ID  = P.CODIGO
                                AND E.CONFERENCIA = '0'
                          --      AND COALESCE(E.COMPONENTE,'0') = '0'
                                AND E.ESTABELECIMENTO_ID = :ESTABELECIMENTO_1
                          --    AND E.LOCALIZACAO_ID = P.LOCALIZACAO_CODIGO
                                AND E.TAMANHO = GS.TAMANHO
                                AND E.REMESSA >= -1) AS NUMERIC(15,4)),0.0000)  EMPENHADO,
                    
                        IIF(FN_PARAMETRO('TBFAMILIA.REPOR_PEDIDO',P.FAMILIA_CODIGO) = 0,0,
                        COALESCE(CAST(
                           (SELECT CAST(SUM(PIS.QUANTIDADE) AS NUMERIC(15,4))
                              FROM TBPEDIDO PE, TBPEDIDO_ITEM PI, TBPEDIDO_ITEM_SALDO PIS
                             WHERE PE.PEDIDO = PI.PEDIDO
                               AND PE.PEDIDO = PIS.PEDIDO
                               AND PI.CONTROLE = PIS.PEDIDO_ITEM_CONTROLE
                               AND PI.PRODUTO_CODIGO = P.CODIGO
                               AND PE.ESTABELECIMENTO_CODIGO = :ESTABELECIMENTO_1
                          --   AND PI.LOCALIZACAO_ID = P.LOCALIZACAO_CODIGO
                               AND PI.TAMANHO = GS.TAMANHO
                               AND PI.SITUACAO = 1
                               AND PE.STATUS = '1'
                               AND PE.SITUACAO = '1'
                               AND COALESCE(PE.REMESSA_ID,0) = 0) AS NUMERIC(15,4)),0.0000))  PEDIDO,

                        COALESCE(CAST(
                            (SELECT SUM(PG.QUANTIDADE)
                               FROM TBPROGRAMACAO PG LEFT JOIN TBPEDIDO PD ON PD.REMESSA_ID = PG.REMESSA_ID
                              WHERE PG.PRODUTO_ID = P.CODIGO
                                AND PG.ESTABELECIMENTO_ID = :ESTABELECIMENTO_1
                                AND PG.TAMANHO = GS.TAMANHO
                                AND PG.TIPO IN ('A','D')
                                AND PG.STATUS IN ('0','1','2')
                                AND PD.REMESSA_ID IS NULL
                                ) AS NUMERIC(15,4)),0.0000)  EM_PRODUCAO,
                
                        COALESCE(P.SEGURANCA,0.00) / 100.00 SEGURANCA,
                    
                            (SELECT
                                LPAD(
                                IIF(GS.TAMANHO = 00, M00.QUANTIDADE,
                                IIF(GS.TAMANHO = 01, M00.T01,
                                IIF(GS.TAMANHO = 02, M00.T02,
                                IIF(GS.TAMANHO = 03, M00.T03,
                                IIF(GS.TAMANHO = 04, M00.T04,
                                IIF(GS.TAMANHO = 05, M00.T05,
                                IIF(GS.TAMANHO = 06, M00.T06,
                                IIF(GS.TAMANHO = 07, M00.T07,
                                IIF(GS.TAMANHO = 08, M00.T08,
                                IIF(GS.TAMANHO = 09, M00.T09,
                                IIF(GS.TAMANHO = 10, M00.T10,
                                IIF(GS.TAMANHO = 11, M00.T11,
                                IIF(GS.TAMANHO = 12, M00.T12,
                                IIF(GS.TAMANHO = 13, M00.T13,
                                IIF(GS.TAMANHO = 14, M00.T14,
                                IIF(GS.TAMANHO = 15, M00.T15,
                                IIF(GS.TAMANHO = 16, M00.T16,
                                IIF(GS.TAMANHO = 17, M00.T17,
                                IIF(GS.TAMANHO = 18, M00.T18,
                                IIF(GS.TAMANHO = 19, M00.T19,
                                IIF(GS.TAMANHO = 20, M00.T20,0))))))))))))))))))))),15)||
                    
                                LPAD(
                                IIF(GS.TAMANHO = 00, M00.ESTOQUE_MAX,
                                IIF(GS.TAMANHO = 01, M00.M01,
                                IIF(GS.TAMANHO = 02, M00.M02,
                                IIF(GS.TAMANHO = 03, M00.M03,
                                IIF(GS.TAMANHO = 04, M00.M04,
                                IIF(GS.TAMANHO = 05, M00.M05,
                                IIF(GS.TAMANHO = 06, M00.M06,
                                IIF(GS.TAMANHO = 07, M00.M07,
                                IIF(GS.TAMANHO = 08, M00.M08,
                                IIF(GS.TAMANHO = 09, M00.M09,
                                IIF(GS.TAMANHO = 10, M00.M10,
                                IIF(GS.TAMANHO = 11, M00.M11,
                                IIF(GS.TAMANHO = 12, M00.M12,
                                IIF(GS.TAMANHO = 13, M00.M13,
                                IIF(GS.TAMANHO = 14, M00.M14,
                                IIF(GS.TAMANHO = 15, M00.M15,
                                IIF(GS.TAMANHO = 16, M00.M16,
                                IIF(GS.TAMANHO = 17, M00.M17,
                                IIF(GS.TAMANHO = 18, M00.M18,
                                IIF(GS.TAMANHO = 19, M00.M19,
                                IIF(GS.TAMANHO = 20, M00.M20,0))))))))))))))))))))),15)||
                    
                               LPAD(COALESCE(M00.PONTO_REPOSICAO,100),12) ||
                               RPAD(COALESCE(M00.TIPO_REPOSICAO,'1' ), 5)
                    
                          FROM TBESTOQUE_MINIMO M00
                         WHERE P.CODIGO = M00.PRODUTO_CODIGO
                           AND M00.ESTABELECIMENTO_CODIGO = :ESTABELECIMENTO_1
                           AND M00.LOCALIZACAO_CODIGO = P.LOCALIZACAO_CODIGO)REPOSICAO
                    
                    FROM TBPRODUTO P, TBGRADE_SEQ GS--, tbmodelo m
                    
                    WHERE
                        P.FAMILIA_CODIGO = :FAMILIA_1

                    --and p.modelo_codigo = m.codigo
                    /*
                    and (
                        (gs.tamanho = 1 and m.t01 = '1') or
                        (gs.tamanho = 2 and m.t02 = '1') or
                        (gs.tamanho = 3 and m.t03 = '1') or
                        (gs.tamanho = 4 and m.t04 = '1') or
                        (gs.tamanho = 5 and m.t05 = '1') or
                        (gs.tamanho = 6 and m.t06 = '1') or
                        (gs.tamanho = 7 and m.t07 = '1') or
                        (gs.tamanho = 8 and m.t08 = '1') or
                        (gs.tamanho = 9 and m.t09 = '1') or
                        (gs.tamanho =10 and m.t10 = '1') or
                        (gs.tamanho =11 and m.t11 = '1') or
                        (gs.tamanho =12 and m.t12 = '1') or
                        (gs.tamanho =13 and m.t13 = '1') or
                        (gs.tamanho =14 and m.t14 = '1') or
                        (gs.tamanho =15 and m.t15 = '1') or
                        (gs.tamanho =16 and m.t16 = '1') or
                        (gs.tamanho =17 and m.t17 = '1') or
                        (gs.tamanho =18 and m.t18 = '1') or
                        (gs.tamanho =19 and m.t19 = '1') or
                        (gs.tamanho =20 and m.t20 = '1')
                    )
                    */
                    AND P.STATUS           = '1'
                    AND IIF(:I_PRODUTO_ID IS NOT NULL,P.CODIGO = :I_PRODUTO_ID,TRUE)
                    AND IIF(:I_TAMANHO IS NOT NULL,GS.TAMANHO = :I_TAMANHO,TRUE)
                    AND ( (P.GRADE_CODIGO > 0 AND GS.TAMANHO > 0) OR (COALESCE(P.GRADE_CODIGO,0) = 0 AND COALESCE(GS.TAMANHO,0) = 0) )
                    )A
                )X
            )Y
        WHERE
            Y.NECESSIDADE > 0
    INTO

        :XPRODUTO_ID,
        :XMODELO_ID,
        :XMODELO_DESCRICAO,
        :XDENSIDADE,
        :XESPESSURA,
        :XCOR_ID,
        :XCOR_DESCRICAO,
        :XTAMANHO_ID,
        :XTAMANHO,
        :XUM,
        :XLOCALIZACAO_ID,
        :XESTOQUE,
     --   :XESTOQUE_WIP,
        :XEMPENHADO,
        :XPEDIDO,
        :XEM_PRODUCAO,
        :XSEGURANCA,
        :XEST_MIN,
        :XEST_MAX,
        :XPERC_PONTO_REP,
        :XQTD_PONTO_REP,
        :XTIPO_REP,
        :XQTD_REP,
        :XNECESSIDADE



    DO
    BEGIN
        IF (:XPRODUTO_ID > 0) THEN
        BEGIN
            PRODUTO_ID       = :XPRODUTO_ID ;
            MODELO_ID        = :XMODELO_ID;
            MODELO_DESCRICAO = :XMODELO_DESCRICAO;
            COR_ID           = :XCOR_ID;
            COR_DESCRICAO    = :XCOR_DESCRICAO;
            TAMANHO_ID       = :XTAMANHO_ID;
            TAMANHO          = :XTAMANHO;
            UM               = :XUM;
            LOCALIZACAO_ID   = :XLOCALIZACAO_ID ;
            ESTOQUE          = :XESTOQUE ;
     --       ESTOQUE_WIP      = :XESTOQUE_WIP ;
            EMPENHADO        = :XEMPENHADO ;
            PEDIDO           = :XPEDIDO ;
            EM_PRODUCAO      = :XEM_PRODUCAO ;
            EST_MIN          = :XEST_MIN ;
            EST_MAX          = :XEST_MAX ;
            SEGURANCA        = :XSEGURANCA ;
            PERC_PONTO_REP   = :XPERC_PONTO_REP ;
            QTD_PONTO_REP    = :XQTD_PONTO_REP ;
            TIPO_REP         = :XTIPO_REP ;
            QTD_REP          = :XQTD_REP ;
            NECESSIDADE      = :XNECESSIDADE ;
            PROGRAMAR        = (SELECT VALOR2 FROM ARREDONDAR_PRA_CIMA(:XNECESSIDADE));
            DENSIDADE        = :XDENSIDADE;
            ESPESSURA        = :XESPESSURA;
            FILTRO           = :PRODUTO_ID||' '||:MODELO_ID||' '||:MODELO_DESCRICAO||' '||:COR_DESCRICAO||' '||:TAMANHO;
            SUSPEND;
        END
    END

END
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER procedure SPC_REL_ABC_ESTOQUE (
    ESTABELECIMENTO_CODIGO_1 integer,
    DATA_1 date,
    DATA_2 date,
    TIPO_1 char(1),
    PRODUTO_CODIGO_1 integer,
    PRODUTO_CODIGO_2 integer,
    LOCALIZACAO_CODIGO_T integer,
    LOCALIZACAO_CODIGO_1 integer,
    FAMILIA_CODIGO_T integer,
    FAMILIA_CODIGO_1 integer,
    FAMILIA_CODIGO_2 integer,
    FAMILIA_CODIGO_3 integer,
    FAMILIA_CODIGO_4 integer,
    FAMILIA_CODIGO_5 integer,
    FAMILIA_CODIGO_6 integer,
    FAMILIA_CODIGO_7 integer,
    FAMILIA_CODIGO_8 integer,
    FAMILIA_CODIGO_9 integer,
    FAMILIA_CODIGO_10 integer,
    OPERACAO_CODIGO_T varchar(3),
    OPERACAO_CODIGO_1 varchar(3),
    OPERACAO_CODIGO_2 varchar(3),
    OPERACAO_CODIGO_3 varchar(3),
    OPERACAO_CODIGO_4 varchar(3),
    OPERACAO_CODIGO_5 varchar(3),
    OPERACAO_CODIGO_6 varchar(3),
    OPERACAO_CODIGO_7 varchar(3),
    OPERACAO_CODIGO_8 varchar(3),
    OPERACAO_CODIGO_9 varchar(3),
    OPERACAO_CODIGO_10 varchar(3))
returns (
    ESTABELECIMENTO_CODIGO integer,
    PRODUTO_CODIGO integer,
    DESCRICAO varchar(100),
    UNIDADEMEDIDA_SIGLA varchar(3),
    FAMILIA_CODIGO integer,
    QUANTIDADE numeric(10,5),
    TOTAL numeric(10,5))
as
BEGIN
FOR Select A.Estabelecimento_Codigo,
       A.Produto_Codigo,
       C.Descricao, C.UnidadeMedida_Sigla2,
       C.Familia_Codigo,
       Sum(A.Quantidade),
       Sum(A.Quantidade *
       (Select B.Custo_Medio From TbEstoque_Saldo_Diario B Where
              (A.Produto_Codigo         = B.Produto_Codigo
           and A.Estabelecimento_Codigo = B.Estabelecimento_Codigo
           and A.Localizacao_Codigo     = B.Localizacao_Codigo
           and A.Data                   = B.Data)))
From   TbEstoque_Transacao_Item  A, TbProduto C
Where   A.Produto_Codigo = C.Codigo
  and ((A.Nfe_Item_Controle = 0) or (A.Nfe_Item_Controle is null)
  and  (A.Nfs_Item_Controle = 0) or (A.Nfs_Item_Controle is null))

  and (A.Tipo = :TIPO_1)

  and (C.Familia_Codigo > :FAMILIA_CODIGO_T or
       C.Familia_Codigo = :FAMILIA_CODIGO_1 or
       C.Familia_Codigo = :FAMILIA_CODIGO_2 or
       C.Familia_Codigo = :FAMILIA_CODIGO_3 or
       C.Familia_Codigo = :FAMILIA_CODIGO_4 or
       C.Familia_Codigo = :FAMILIA_CODIGO_5 or
       C.Familia_Codigo = :FAMILIA_CODIGO_6 or
       C.Familia_Codigo = :FAMILIA_CODIGO_7 or
       C.Familia_Codigo = :FAMILIA_CODIGO_8 or
       C.Familia_Codigo = :FAMILIA_CODIGO_9 or
       C.Familia_Codigo = :FAMILIA_CODIGO_10)

  and (A.Data between :DATA_1 and :DATA_2)

  and  A.Estabelecimento_Codigo = :ESTABELECIMENTO_CODIGO_1

  and (A.Localizacao_Codigo > :LOCALIZACAO_CODIGO_T or
       A.Localizacao_Codigo = :LOCALIZACAO_CODIGO_1)
  and (A.Produto_Codigo BetWeen :PRODUTO_CODIGO_1 AND :PRODUTO_CODIGO_2)

  and (A.Operacao_Codigo <>:OPERACAO_CODIGO_T or
       A.Operacao_Codigo = :OPERACAO_CODIGO_1 or
       A.Operacao_Codigo = :OPERACAO_CODIGO_2 or
       A.Operacao_Codigo = :OPERACAO_CODIGO_3 or
       A.Operacao_Codigo = :OPERACAO_CODIGO_4 or
       A.Operacao_Codigo = :OPERACAO_CODIGO_5 or
       A.Operacao_Codigo = :OPERACAO_CODIGO_6 or
       A.Operacao_Codigo = :OPERACAO_CODIGO_7 or
       A.Operacao_Codigo = :OPERACAO_CODIGO_8 or
       A.Operacao_Codigo = :OPERACAO_CODIGO_9 or
       A.Operacao_Codigo = :OPERACAO_CODIGO_10)

Group By A.Estabelecimento_Codigo, A.Produto_Codigo,
         C.Descricao, C.UnidadeMedida_Sigla2, C.Familia_Codigo

Order By 6 Desc

INTO
   :Estabelecimento_Codigo,
   :Produto_Codigo,
   :Descricao,
   :UnidadeMedida_Sigla,
   :Familia_Codigo,
   :Quantidade,
   :Total
DO SUSPEND;
END
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER procedure SPC_REL_ABC_ESTOQUE_NFE_QTD (
    ESTABELECIMENTO_CODIGO_1 integer,
    LOCALIZACAO_CODIGO_T integer,
    LOCALIZACAO_CODIGO_1 integer,
    PRODUTO_CODIGO_1 integer,
    PRODUTO_CODIGO_2 integer,
    EMPRESA_CODIGO_T integer,
    EMPRESA_CODIGO_1 integer,
    DATA_1 date,
    DATA_2 date,
    CFOP_CODIGO_T varchar(5),
    CFOP_CODIGO_1 varchar(5),
    CFOP_CODIGO_2 varchar(5),
    CFOP_CODIGO_3 varchar(5),
    CFOP_CODIGO_4 varchar(5),
    CFOP_CODIGO_5 varchar(5),
    CFOP_CODIGO_6 varchar(5),
    CFOP_CODIGO_7 varchar(5),
    CFOP_CODIGO_8 varchar(5),
    CFOP_CODIGO_9 varchar(5),
    CFOP_CODIGO_10 varchar(5),
    FAMILIA_CODIGO_T integer,
    FAMILIA_CODIGO_1 integer,
    FAMILIA_CODIGO_2 integer,
    FAMILIA_CODIGO_3 integer,
    FAMILIA_CODIGO_4 integer,
    FAMILIA_CODIGO_5 integer,
    FAMILIA_CODIGO_6 integer,
    FAMILIA_CODIGO_7 integer,
    FAMILIA_CODIGO_8 integer,
    FAMILIA_CODIGO_9 integer,
    FAMILIA_CODIGO_10 integer,
    OPERACAO_CODIGO_T varchar(3),
    OPERACAO_CODIGO_1 varchar(3),
    OPERACAO_CODIGO_2 varchar(3),
    OPERACAO_CODIGO_3 varchar(3),
    OPERACAO_CODIGO_4 varchar(3),
    OPERACAO_CODIGO_5 varchar(3),
    OPERACAO_CODIGO_6 varchar(3),
    OPERACAO_CODIGO_7 varchar(3),
    OPERACAO_CODIGO_8 varchar(3),
    OPERACAO_CODIGO_9 varchar(3),
    OPERACAO_CODIGO_10 varchar(3))
returns (
    ESTABELECIMENTO_CODIGO integer,
    PRODUTO_CODIGO integer,
    DESCRICAO varchar(100),
    UNIDADEMEDIDA_SIGLA varchar(3),
    FAMILIA_CODIGO integer,
    QUANTIDADE numeric(10,5),
    TOTAL numeric(10,5))
as
BEGIN
FOR Select A.Estabelecimento_Codigo,
       A.Produto_Codigo,
       C.Descricao, C.UnidadeMedida_Sigla2,
       C.Familia_Codigo,
       Sum(A.Quantidade),
       Sum(A.Valor_Total)

From   TbNfe_Item  A, TbProduto   C
Where  A.Produto_Codigo = C.Codigo
  and (A.Situacao < 3 and A.Produto_Codigo > 0)
  and  A.Estabelecimento_Codigo = :ESTABELECIMENTO_CODIGO_1
  and (A.Localizacao_Codigo > :LOCALIZACAO_CODIGO_T or
       A.Localizacao_Codigo = :LOCALIZACAO_CODIGO_1)
  and (A.Produto_Codigo BetWeen :PRODUTO_CODIGO_1 AND :PRODUTO_CODIGO_2)
  and (A.Empresa_Codigo     > :EMPRESA_CODIGO_T or
       A.Empresa_Codigo     = :EMPRESA_CODIGO_1)
  and (A.Data_Entrada between :DATA_1 and :DATA_2)

  and (A.Cfop_Codigo <>:CFOP_CODIGO_T or
       A.Cfop_Codigo = :CFOP_CODIGO_1 or
       A.Cfop_Codigo = :CFOP_CODIGO_2 or
       A.Cfop_Codigo = :CFOP_CODIGO_3 or
       A.Cfop_Codigo = :CFOP_CODIGO_4 or
       A.Cfop_Codigo = :CFOP_CODIGO_5 or
       A.Cfop_Codigo = :CFOP_CODIGO_6 or
       A.Cfop_Codigo = :CFOP_CODIGO_7 or
       A.Cfop_Codigo = :CFOP_CODIGO_8 or
       A.Cfop_Codigo = :CFOP_CODIGO_9 or
       A.Cfop_Codigo = :CFOP_CODIGO_10)

  and (C.Familia_Codigo > :FAMILIA_CODIGO_T or
       C.Familia_Codigo = :FAMILIA_CODIGO_1 or
       C.Familia_Codigo = :FAMILIA_CODIGO_2 or
       C.Familia_Codigo = :FAMILIA_CODIGO_3 or
       C.Familia_Codigo = :FAMILIA_CODIGO_4 or
       C.Familia_Codigo = :FAMILIA_CODIGO_5 or
       C.Familia_Codigo = :FAMILIA_CODIGO_6 or
       C.Familia_Codigo = :FAMILIA_CODIGO_7 or
       C.Familia_Codigo = :FAMILIA_CODIGO_8 or
       C.Familia_Codigo = :FAMILIA_CODIGO_9 or
       C.Familia_Codigo = :FAMILIA_CODIGO_10)

  and (A.Operacao_Codigo <>:OPERACAO_CODIGO_T or
       A.Operacao_Codigo = :OPERACAO_CODIGO_1 or
       A.Operacao_Codigo = :OPERACAO_CODIGO_2 or
       A.Operacao_Codigo = :OPERACAO_CODIGO_3 or
       A.Operacao_Codigo = :OPERACAO_CODIGO_4 or
       A.Operacao_Codigo = :OPERACAO_CODIGO_5 or
       A.Operacao_Codigo = :OPERACAO_CODIGO_6 or
       A.Operacao_Codigo = :OPERACAO_CODIGO_7 or
       A.Operacao_Codigo = :OPERACAO_CODIGO_8 or
       A.Operacao_Codigo = :OPERACAO_CODIGO_9 or
       A.Operacao_Codigo = :OPERACAO_CODIGO_10)

Group By A.Estabelecimento_Codigo, A.Produto_Codigo,
         C.Descricao, C.UnidadeMedida_Sigla2, C.Familia_Codigo

Order By 6 Desc

INTO
   :Estabelecimento_Codigo,
   :Produto_Codigo,
   :Descricao,
   :UnidadeMedida_Sigla,
   :Familia_Codigo,
   :Quantidade,
   :Total
DO SUSPEND;
END
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER procedure SPC_REL_ABC_ESTOQUE_NFE_VLR (
    ESTABELECIMENTO_CODIGO_1 integer,
    LOCALIZACAO_CODIGO_T integer,
    LOCALIZACAO_CODIGO_1 integer,
    PRODUTO_CODIGO_1 integer,
    PRODUTO_CODIGO_2 integer,
    EMPRESA_CODIGO_T integer,
    EMPRESA_CODIGO_1 integer,
    DATA_1 date,
    DATA_2 date,
    CFOP_CODIGO_T varchar(5),
    CFOP_CODIGO_1 varchar(5),
    CFOP_CODIGO_2 varchar(5),
    CFOP_CODIGO_3 varchar(5),
    CFOP_CODIGO_4 varchar(5),
    CFOP_CODIGO_5 varchar(5),
    CFOP_CODIGO_6 varchar(5),
    CFOP_CODIGO_7 varchar(5),
    CFOP_CODIGO_8 varchar(5),
    CFOP_CODIGO_9 varchar(5),
    CFOP_CODIGO_10 varchar(5),
    FAMILIA_CODIGO_T integer,
    FAMILIA_CODIGO_1 integer,
    FAMILIA_CODIGO_2 integer,
    FAMILIA_CODIGO_3 integer,
    FAMILIA_CODIGO_4 integer,
    FAMILIA_CODIGO_5 integer,
    FAMILIA_CODIGO_6 integer,
    FAMILIA_CODIGO_7 integer,
    FAMILIA_CODIGO_8 integer,
    FAMILIA_CODIGO_9 integer,
    FAMILIA_CODIGO_10 integer,
    OPERACAO_CODIGO_T varchar(3),
    OPERACAO_CODIGO_1 varchar(3),
    OPERACAO_CODIGO_2 varchar(3),
    OPERACAO_CODIGO_3 varchar(3),
    OPERACAO_CODIGO_4 varchar(3),
    OPERACAO_CODIGO_5 varchar(3),
    OPERACAO_CODIGO_6 varchar(3),
    OPERACAO_CODIGO_7 varchar(3),
    OPERACAO_CODIGO_8 varchar(3),
    OPERACAO_CODIGO_9 varchar(3),
    OPERACAO_CODIGO_10 varchar(3))
returns (
    ESTABELECIMENTO_CODIGO integer,
    PRODUTO_CODIGO integer,
    DESCRICAO varchar(100),
    UNIDADEMEDIDA_SIGLA varchar(3),
    FAMILIA_CODIGO integer,
    QUANTIDADE numeric(10,5),
    TOTAL numeric(10,5))
as
BEGIN
FOR Select A.Estabelecimento_Codigo,
       A.Produto_Codigo,
       C.Descricao, C.UnidadeMedida_Sigla2,
       C.Familia_Codigo,
       Sum(A.Quantidade),
       Sum(A.Valor_Total)

From      TbNfe_Item  A, TbProduto C
Where  A.Produto_Codigo = C.Codigo
  and (A.Situacao < 3 and A.Produto_Codigo > 0)
  and  A.Estabelecimento_Codigo = :ESTABELECIMENTO_CODIGO_1
  and (A.Localizacao_Codigo > :LOCALIZACAO_CODIGO_T or
       A.Localizacao_Codigo = :LOCALIZACAO_CODIGO_1)
  and (A.Produto_Codigo BetWeen :PRODUTO_CODIGO_1 AND :PRODUTO_CODIGO_2)
  and (A.Empresa_Codigo     > :EMPRESA_CODIGO_T or
       A.Empresa_Codigo     = :EMPRESA_CODIGO_1)
  and (A.Data_Entrada between :DATA_1 and :DATA_2)

  and (A.Cfop_Codigo <>:CFOP_CODIGO_T or
       A.Cfop_Codigo = :CFOP_CODIGO_1 or
       A.Cfop_Codigo = :CFOP_CODIGO_2 or
       A.Cfop_Codigo = :CFOP_CODIGO_3 or
       A.Cfop_Codigo = :CFOP_CODIGO_4 or
       A.Cfop_Codigo = :CFOP_CODIGO_5 or
       A.Cfop_Codigo = :CFOP_CODIGO_6 or
       A.Cfop_Codigo = :CFOP_CODIGO_7 or
       A.Cfop_Codigo = :CFOP_CODIGO_8 or
       A.Cfop_Codigo = :CFOP_CODIGO_9 or
       A.Cfop_Codigo = :CFOP_CODIGO_10)

  and (C.Familia_Codigo > :FAMILIA_CODIGO_T or
       C.Familia_Codigo = :FAMILIA_CODIGO_1 or
       C.Familia_Codigo = :FAMILIA_CODIGO_2 or
       C.Familia_Codigo = :FAMILIA_CODIGO_3 or
       C.Familia_Codigo = :FAMILIA_CODIGO_4 or
       C.Familia_Codigo = :FAMILIA_CODIGO_5 or
       C.Familia_Codigo = :FAMILIA_CODIGO_6 or
       C.Familia_Codigo = :FAMILIA_CODIGO_7 or
       C.Familia_Codigo = :FAMILIA_CODIGO_8 or
       C.Familia_Codigo = :FAMILIA_CODIGO_9 or
       C.Familia_Codigo = :FAMILIA_CODIGO_10)

  and (A.Operacao_Codigo <>:OPERACAO_CODIGO_T or
       A.Operacao_Codigo = :OPERACAO_CODIGO_1 or
       A.Operacao_Codigo = :OPERACAO_CODIGO_2 or
       A.Operacao_Codigo = :OPERACAO_CODIGO_3 or
       A.Operacao_Codigo = :OPERACAO_CODIGO_4 or
       A.Operacao_Codigo = :OPERACAO_CODIGO_5 or
       A.Operacao_Codigo = :OPERACAO_CODIGO_6 or
       A.Operacao_Codigo = :OPERACAO_CODIGO_7 or
       A.Operacao_Codigo = :OPERACAO_CODIGO_8 or
       A.Operacao_Codigo = :OPERACAO_CODIGO_9 or
       A.Operacao_Codigo = :OPERACAO_CODIGO_10)

Group By A.Estabelecimento_Codigo, A.Produto_Codigo,
         C.Descricao, C.UnidadeMedida_Sigla2, C.Familia_Codigo

Order By 7 Desc

INTO
   :Estabelecimento_Codigo,
   :Produto_Codigo,
   :Descricao,
   :UnidadeMedida_Sigla,
   :Familia_Codigo,
   :Quantidade,
   :Total
DO SUSPEND;
END
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER procedure SPC_REL_ABC_ESTOQUE_NFS_QTD (
    ESTABELECIMENTO_CODIGO_1 integer,
    LOCALIZACAO_CODIGO_T integer,
    LOCALIZACAO_CODIGO_1 integer,
    PRODUTO_CODIGO_1 integer,
    PRODUTO_CODIGO_2 integer,
    EMPRESA_CODIGO_T integer,
    EMPRESA_CODIGO_1 integer,
    DATA_1 date,
    DATA_2 date,
    CFOP_CODIGO_T varchar(5),
    CFOP_CODIGO_1 varchar(5),
    CFOP_CODIGO_2 varchar(5),
    CFOP_CODIGO_3 varchar(5),
    CFOP_CODIGO_4 varchar(5),
    CFOP_CODIGO_5 varchar(5),
    CFOP_CODIGO_6 varchar(5),
    CFOP_CODIGO_7 varchar(5),
    CFOP_CODIGO_8 varchar(5),
    CFOP_CODIGO_9 varchar(5),
    CFOP_CODIGO_10 varchar(5),
    FAMILIA_CODIGO_T integer,
    FAMILIA_CODIGO_1 integer,
    FAMILIA_CODIGO_2 integer,
    FAMILIA_CODIGO_3 integer,
    FAMILIA_CODIGO_4 integer,
    FAMILIA_CODIGO_5 integer,
    FAMILIA_CODIGO_6 integer,
    FAMILIA_CODIGO_7 integer,
    FAMILIA_CODIGO_8 integer,
    FAMILIA_CODIGO_9 integer,
    FAMILIA_CODIGO_10 integer,
    OPERACAO_CODIGO_T varchar(3),
    OPERACAO_CODIGO_1 varchar(3),
    OPERACAO_CODIGO_2 varchar(3),
    OPERACAO_CODIGO_3 varchar(3),
    OPERACAO_CODIGO_4 varchar(3),
    OPERACAO_CODIGO_5 varchar(3),
    OPERACAO_CODIGO_6 varchar(3),
    OPERACAO_CODIGO_7 varchar(3),
    OPERACAO_CODIGO_8 varchar(3),
    OPERACAO_CODIGO_9 varchar(3),
    OPERACAO_CODIGO_10 varchar(3))
returns (
    ESTABELECIMENTO_CODIGO integer,
    PRODUTO_CODIGO integer,
    DESCRICAO varchar(100),
    UNIDADEMEDIDA_SIGLA varchar(3),
    FAMILIA_CODIGO integer,
    QUANTIDADE numeric(10,5),
    TOTAL numeric(10,5))
as
BEGIN
FOR Select A.Estabelecimento_Codigo,
       A.Produto_Codigo,
       C.Descricao, C.UnidadeMedida_Sigla2,
       C.Familia_Codigo,
       Sum(A.Quantidade),
       Sum(A.Valor_Total)

From      TbNfs_Item A, TbProduto C
Where  A.Produto_Codigo = C.Codigo
  and (A.Situacao < 3 and A.Produto_Codigo > 0)
  and  A.Estabelecimento_Codigo = :ESTABELECIMENTO_CODIGO_1
  and (A.Localizacao_Codigo > :LOCALIZACAO_CODIGO_T or
       A.Localizacao_Codigo = :LOCALIZACAO_CODIGO_1)
  and (A.Produto_Codigo BetWeen :PRODUTO_CODIGO_1 AND :PRODUTO_CODIGO_2)
  and (A.Empresa_Codigo     > :EMPRESA_CODIGO_T or
       A.Empresa_Codigo     = :EMPRESA_CODIGO_1)
  and (A.Data_Emissao between :DATA_1 and :DATA_2)

  and (A.Cfop_Codigo <>:CFOP_CODIGO_T or
       A.Cfop_Codigo = :CFOP_CODIGO_1 or
       A.Cfop_Codigo = :CFOP_CODIGO_2 or
       A.Cfop_Codigo = :CFOP_CODIGO_3 or
       A.Cfop_Codigo = :CFOP_CODIGO_4 or
       A.Cfop_Codigo = :CFOP_CODIGO_5 or
       A.Cfop_Codigo = :CFOP_CODIGO_6 or
       A.Cfop_Codigo = :CFOP_CODIGO_7 or
       A.Cfop_Codigo = :CFOP_CODIGO_8 or
       A.Cfop_Codigo = :CFOP_CODIGO_9 or
       A.Cfop_Codigo = :CFOP_CODIGO_10)

  and (C.Familia_Codigo > :FAMILIA_CODIGO_T or
       C.Familia_Codigo = :FAMILIA_CODIGO_1 or
       C.Familia_Codigo = :FAMILIA_CODIGO_2 or
       C.Familia_Codigo = :FAMILIA_CODIGO_3 or
       C.Familia_Codigo = :FAMILIA_CODIGO_4 or
       C.Familia_Codigo = :FAMILIA_CODIGO_5 or
       C.Familia_Codigo = :FAMILIA_CODIGO_6 or
       C.Familia_Codigo = :FAMILIA_CODIGO_7 or
       C.Familia_Codigo = :FAMILIA_CODIGO_8 or
       C.Familia_Codigo = :FAMILIA_CODIGO_9 or
       C.Familia_Codigo = :FAMILIA_CODIGO_10)

  and (A.Operacao_Codigo <>:OPERACAO_CODIGO_T or
       A.Operacao_Codigo = :OPERACAO_CODIGO_1 or
       A.Operacao_Codigo = :OPERACAO_CODIGO_2 or
       A.Operacao_Codigo = :OPERACAO_CODIGO_3 or
       A.Operacao_Codigo = :OPERACAO_CODIGO_4 or
       A.Operacao_Codigo = :OPERACAO_CODIGO_5 or
       A.Operacao_Codigo = :OPERACAO_CODIGO_6 or
       A.Operacao_Codigo = :OPERACAO_CODIGO_7 or
       A.Operacao_Codigo = :OPERACAO_CODIGO_8 or
       A.Operacao_Codigo = :OPERACAO_CODIGO_9 or
       A.Operacao_Codigo = :OPERACAO_CODIGO_10)

Group By A.Estabelecimento_Codigo, A.Produto_Codigo,
         C.Descricao, C.UnidadeMedida_Sigla2, C.Familia_Codigo

Order By 6 Desc

INTO
   :Estabelecimento_Codigo,
   :Produto_Codigo,
   :Descricao,
   :UnidadeMedida_Sigla,
   :Familia_Codigo,
   :Quantidade,
   :Total
DO SUSPEND;
END
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER procedure SPC_REL_ABC_ESTOQUE_NFS_VLR (
    ESTABELECIMENTO_CODIGO_1 integer,
    LOCALIZACAO_CODIGO_T integer,
    LOCALIZACAO_CODIGO_1 integer,
    PRODUTO_CODIGO_1 integer,
    PRODUTO_CODIGO_2 integer,
    EMPRESA_CODIGO_T integer,
    EMPRESA_CODIGO_1 integer,
    DATA_1 date,
    DATA_2 date,
    CFOP_CODIGO_T varchar(5),
    CFOP_CODIGO_1 varchar(5),
    CFOP_CODIGO_2 varchar(5),
    CFOP_CODIGO_3 varchar(5),
    CFOP_CODIGO_4 varchar(5),
    CFOP_CODIGO_5 varchar(5),
    CFOP_CODIGO_6 varchar(5),
    CFOP_CODIGO_7 varchar(5),
    CFOP_CODIGO_8 varchar(5),
    CFOP_CODIGO_9 varchar(5),
    CFOP_CODIGO_10 varchar(5),
    FAMILIA_CODIGO_T integer,
    FAMILIA_CODIGO_1 integer,
    FAMILIA_CODIGO_2 integer,
    FAMILIA_CODIGO_3 integer,
    FAMILIA_CODIGO_4 integer,
    FAMILIA_CODIGO_5 integer,
    FAMILIA_CODIGO_6 integer,
    FAMILIA_CODIGO_7 integer,
    FAMILIA_CODIGO_8 integer,
    FAMILIA_CODIGO_9 integer,
    FAMILIA_CODIGO_10 integer,
    OPERACAO_CODIGO_T varchar(3),
    OPERACAO_CODIGO_1 varchar(3),
    OPERACAO_CODIGO_2 varchar(3),
    OPERACAO_CODIGO_3 varchar(3),
    OPERACAO_CODIGO_4 varchar(3),
    OPERACAO_CODIGO_5 varchar(3),
    OPERACAO_CODIGO_6 varchar(3),
    OPERACAO_CODIGO_7 varchar(3),
    OPERACAO_CODIGO_8 varchar(3),
    OPERACAO_CODIGO_9 varchar(3),
    OPERACAO_CODIGO_10 varchar(3))
returns (
    ESTABELECIMENTO_CODIGO integer,
    PRODUTO_CODIGO integer,
    DESCRICAO varchar(100),
    UNIDADEMEDIDA_SIGLA varchar(3),
    FAMILIA_CODIGO integer,
    QUANTIDADE numeric(10,5),
    TOTAL numeric(10,5))
as
BEGIN
FOR Select A.Estabelecimento_Codigo,
       A.Produto_Codigo,
       C.Descricao, C.UnidadeMedida_Sigla2,
       C.Familia_Codigo,
       Sum(A.Quantidade),
       Sum(A.Valor_Total)

From      TbNfs_Item  A, TbProduto  C
Where  A.Produto_Codigo = C.Codigo
  and (A.Situacao < 3 and A.Produto_Codigo > 0)
  and  A.Estabelecimento_Codigo = :ESTABELECIMENTO_CODIGO_1
  and (A.Localizacao_Codigo > :LOCALIZACAO_CODIGO_T or
       A.Localizacao_Codigo = :LOCALIZACAO_CODIGO_1)
  and (A.Produto_Codigo BetWeen :PRODUTO_CODIGO_1 AND :PRODUTO_CODIGO_2)
  and (A.Empresa_Codigo     > :EMPRESA_CODIGO_T or
       A.Empresa_Codigo     = :EMPRESA_CODIGO_1)
  and (A.Data_Emissao between :DATA_1 and :DATA_2)

  and (A.Cfop_Codigo <>:CFOP_CODIGO_T or
       A.Cfop_Codigo = :CFOP_CODIGO_1 or
       A.Cfop_Codigo = :CFOP_CODIGO_2 or
       A.Cfop_Codigo = :CFOP_CODIGO_3 or
       A.Cfop_Codigo = :CFOP_CODIGO_4 or
       A.Cfop_Codigo = :CFOP_CODIGO_5 or
       A.Cfop_Codigo = :CFOP_CODIGO_6 or
       A.Cfop_Codigo = :CFOP_CODIGO_7 or
       A.Cfop_Codigo = :CFOP_CODIGO_8 or
       A.Cfop_Codigo = :CFOP_CODIGO_9 or
       A.Cfop_Codigo = :CFOP_CODIGO_10)

  and (C.Familia_Codigo > :FAMILIA_CODIGO_T or
       C.Familia_Codigo = :FAMILIA_CODIGO_1 or
       C.Familia_Codigo = :FAMILIA_CODIGO_2 or
       C.Familia_Codigo = :FAMILIA_CODIGO_3 or
       C.Familia_Codigo = :FAMILIA_CODIGO_4 or
       C.Familia_Codigo = :FAMILIA_CODIGO_5 or
       C.Familia_Codigo = :FAMILIA_CODIGO_6 or
       C.Familia_Codigo = :FAMILIA_CODIGO_7 or
       C.Familia_Codigo = :FAMILIA_CODIGO_8 or
       C.Familia_Codigo = :FAMILIA_CODIGO_9 or
       C.Familia_Codigo = :FAMILIA_CODIGO_10)

  and (A.Operacao_Codigo <>:OPERACAO_CODIGO_T or
       A.Operacao_Codigo = :OPERACAO_CODIGO_1 or
       A.Operacao_Codigo = :OPERACAO_CODIGO_2 or
       A.Operacao_Codigo = :OPERACAO_CODIGO_3 or
       A.Operacao_Codigo = :OPERACAO_CODIGO_4 or
       A.Operacao_Codigo = :OPERACAO_CODIGO_5 or
       A.Operacao_Codigo = :OPERACAO_CODIGO_6 or
       A.Operacao_Codigo = :OPERACAO_CODIGO_7 or
       A.Operacao_Codigo = :OPERACAO_CODIGO_8 or
       A.Operacao_Codigo = :OPERACAO_CODIGO_9 or
       A.Operacao_Codigo = :OPERACAO_CODIGO_10)

Group By A.Estabelecimento_Codigo, A.Produto_Codigo,
         C.Descricao, C.UnidadeMedida_Sigla2, C.Familia_Codigo

Order By 7 Desc

INTO
   :Estabelecimento_Codigo,
   :Produto_Codigo,
   :Descricao,
   :UnidadeMedida_Sigla,
   :Familia_Codigo,
   :Quantidade,
   :Total
DO SUSPEND;
END
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER procedure SPC_REL_ABC_ESTOQUE_VLR (
    ESTABELECIMENTO_CODIGO_1 integer,
    DATA_1 date,
    DATA_2 date,
    TIPO_1 char(1),
    PRODUTO_CODIGO_1 integer,
    PRODUTO_CODIGO_2 integer,
    LOCALIZACAO_CODIGO_T integer,
    LOCALIZACAO_CODIGO_1 integer,
    FAMILIA_CODIGO_T integer,
    FAMILIA_CODIGO_1 integer,
    FAMILIA_CODIGO_2 integer,
    FAMILIA_CODIGO_3 integer,
    FAMILIA_CODIGO_4 integer,
    FAMILIA_CODIGO_5 integer,
    FAMILIA_CODIGO_6 integer,
    FAMILIA_CODIGO_7 integer,
    FAMILIA_CODIGO_8 integer,
    FAMILIA_CODIGO_9 integer,
    FAMILIA_CODIGO_10 integer,
    OPERACAO_CODIGO_T varchar(3),
    OPERACAO_CODIGO_1 varchar(3),
    OPERACAO_CODIGO_2 varchar(3),
    OPERACAO_CODIGO_3 varchar(3),
    OPERACAO_CODIGO_4 varchar(3),
    OPERACAO_CODIGO_5 varchar(3),
    OPERACAO_CODIGO_6 varchar(3),
    OPERACAO_CODIGO_7 varchar(3),
    OPERACAO_CODIGO_8 varchar(3),
    OPERACAO_CODIGO_9 varchar(3),
    OPERACAO_CODIGO_10 varchar(3))
returns (
    ESTABELECIMENTO_CODIGO integer,
    PRODUTO_CODIGO integer,
    DESCRICAO varchar(100),
    UNIDADEMEDIDA_SIGLA varchar(3),
    FAMILIA_CODIGO integer,
    QUANTIDADE numeric(10,5),
    TOTAL numeric(10,5))
as
BEGIN
FOR Select A.Estabelecimento_Codigo,
       A.Produto_Codigo,
       C.Descricao, C.UnidadeMedida_Sigla2,
       C.Familia_Codigo,
       Sum(A.Quantidade),
       Sum(A.Quantidade *
       (Select B.Custo_Medio From TbEstoque_Saldo_Diario B Where
              (A.Produto_Codigo         = B.Produto_Codigo
           and A.Estabelecimento_Codigo = B.Estabelecimento_Codigo
           and A.Localizacao_Codigo     = B.Localizacao_Codigo
           and A.Data                   = B.Data)))
From   TbEstoque_Transacao_Item  A, TbProduto C
Where   A.Produto_Codigo = C.Codigo
  and ((A.Nfe_Item_Controle = 0) or (A.Nfe_Item_Controle is null)
  and  (A.Nfs_Item_Controle = 0) or (A.Nfs_Item_Controle is null))

  and (A.Tipo = :TIPO_1)

  and (C.Familia_Codigo > :FAMILIA_CODIGO_T or
       C.Familia_Codigo = :FAMILIA_CODIGO_1 or
       C.Familia_Codigo = :FAMILIA_CODIGO_2 or
       C.Familia_Codigo = :FAMILIA_CODIGO_3 or
       C.Familia_Codigo = :FAMILIA_CODIGO_4 or
       C.Familia_Codigo = :FAMILIA_CODIGO_5 or
       C.Familia_Codigo = :FAMILIA_CODIGO_6 or
       C.Familia_Codigo = :FAMILIA_CODIGO_7 or
       C.Familia_Codigo = :FAMILIA_CODIGO_8 or
       C.Familia_Codigo = :FAMILIA_CODIGO_9 or
       C.Familia_Codigo = :FAMILIA_CODIGO_10)

  and (A.Data between :DATA_1 and :DATA_2)

  and  A.Estabelecimento_Codigo = :ESTABELECIMENTO_CODIGO_1

  and (A.Localizacao_Codigo > :LOCALIZACAO_CODIGO_T or
       A.Localizacao_Codigo = :LOCALIZACAO_CODIGO_1)
  and (A.Produto_Codigo BetWeen :PRODUTO_CODIGO_1 AND :PRODUTO_CODIGO_2)

  and (A.Operacao_Codigo <>:OPERACAO_CODIGO_T or
       A.Operacao_Codigo = :OPERACAO_CODIGO_1 or
       A.Operacao_Codigo = :OPERACAO_CODIGO_2 or
       A.Operacao_Codigo = :OPERACAO_CODIGO_3 or
       A.Operacao_Codigo = :OPERACAO_CODIGO_4 or
       A.Operacao_Codigo = :OPERACAO_CODIGO_5 or
       A.Operacao_Codigo = :OPERACAO_CODIGO_6 or
       A.Operacao_Codigo = :OPERACAO_CODIGO_7 or
       A.Operacao_Codigo = :OPERACAO_CODIGO_8 or
       A.Operacao_Codigo = :OPERACAO_CODIGO_9 or
       A.Operacao_Codigo = :OPERACAO_CODIGO_10)

Group By A.Estabelecimento_Codigo, A.Produto_Codigo,
         C.Descricao, C.UnidadeMedida_Sigla2, C.Familia_Codigo

Order By 7 Desc

INTO
   :Estabelecimento_Codigo,
   :Produto_Codigo,
   :Descricao,
   :UnidadeMedida_Sigla,
   :Familia_Codigo,
   :Quantidade,
   :Total
DO SUSPEND;
END
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER procedure SPC_REL_FICHA2 (
    REMESSA_1 integer,
    REMESSA_2 integer)
returns (
    PRODUTO_CODIGO integer,
    GRADE_CODIGO integer,
    DESCRICAO varchar(100),
    UNIDADEMEDIDA_SIGLA varchar(3),
    QUANTIDADE_TOTAL numeric(10,5),
    R_TOTAL numeric(10,5),
    T01 numeric(10,5),
    R01 numeric(10,5),
    T02 numeric(10,5),
    R02 numeric(10,5),
    T03 numeric(10,5),
    R03 numeric(10,5),
    T04 numeric(10,5),
    R04 numeric(10,5),
    T05 numeric(10,5),
    R05 numeric(10,5),
    T06 numeric(10,5),
    R06 numeric(10,5),
    T07 numeric(10,5),
    R07 numeric(10,5),
    T08 numeric(10,5),
    R08 numeric(10,5),
    T09 numeric(10,5),
    R09 numeric(10,5),
    T10 numeric(10,5),
    R10 numeric(10,5),
    T11 numeric(10,5),
    R11 numeric(10,5),
    T12 numeric(10,5),
    R12 numeric(10,5),
    T13 numeric(10,5),
    R13 numeric(10,5),
    T14 numeric(10,5),
    R14 numeric(10,5),
    T15 numeric(10,5),
    R15 numeric(10,5),
    T16 numeric(10,5),
    R16 numeric(10,5),
    T17 numeric(10,5),
    R17 numeric(10,5),
    T18 numeric(10,5),
    R18 numeric(10,5),
    T19 numeric(10,5),
    R19 numeric(10,5),
    T20 numeric(10,5),
    R20 numeric(10,5))
as
BEGIN
FOR  SELECT B.CONSUMO_PRODUTO_CODIGO PRODUTO_CODIGO, F.GRADE_CODIGO,
 Max((SELECT D.DESCRICAO FROM TBPRODUTO D WHERE B.CONSUMO_PRODUTO_CODIGO = D.CODIGO)) DESCRICAO,
 Max((SELECT D.UNIDADEMEDIDA_SIGLA2 FROM TBPRODUTO D WHERE B.CONSUMO_PRODUTO_CODIGO = D.CODIGO)) UNIDADEMEDIDA_SIGLA,
 Sum(A.QUANTIDADE_PEDIDO) QUANTIDADE_TOTAL,
 MAX(B.CONSUMO_QUANTIDADE) R_TOTAL,
 SUM(CASE WHEN A.TAMANHO =  1 AND B.CONSUMO_QUANTIDADE_T01 > 0  THEN A.Quantidade_Pedido ELSE 0 END) T01, MAX(B.CONSUMO_QUANTIDADE_T01) R01,
 SUM(CASE WHEN A.TAMANHO =  2 AND B.CONSUMO_QUANTIDADE_T02 > 0  THEN A.Quantidade_Pedido ELSE 0 END) T02, MAX(B.CONSUMO_QUANTIDADE_T02) R02,
 SUM(CASE WHEN A.TAMANHO =  3 AND B.CONSUMO_QUANTIDADE_T03 > 0  THEN A.Quantidade_Pedido ELSE 0 END) T03, MAX(B.CONSUMO_QUANTIDADE_T03) R03,
 SUM(CASE WHEN A.TAMANHO =  4 AND B.CONSUMO_QUANTIDADE_T04 > 0  THEN A.Quantidade_Pedido ELSE 0 END) T04, MAX(B.CONSUMO_QUANTIDADE_T04) R04,
 SUM(CASE WHEN A.TAMANHO =  5 AND B.CONSUMO_QUANTIDADE_T05 > 0  THEN A.Quantidade_Pedido ELSE 0 END) T05, MAX(B.CONSUMO_QUANTIDADE_T05) R05,
 SUM(CASE WHEN A.TAMANHO =  6 AND B.CONSUMO_QUANTIDADE_T06 > 0  THEN A.Quantidade_Pedido ELSE 0 END) T06, MAX(B.CONSUMO_QUANTIDADE_T06) R06,
 SUM(CASE WHEN A.TAMANHO =  7 AND B.CONSUMO_QUANTIDADE_T07 > 0  THEN A.Quantidade_Pedido ELSE 0 END) T07, MAX(B.CONSUMO_QUANTIDADE_T07) R07,
 SUM(CASE WHEN A.TAMANHO =  8 AND B.CONSUMO_QUANTIDADE_T08 > 0  THEN A.Quantidade_Pedido ELSE 0 END) T08, MAX(B.CONSUMO_QUANTIDADE_T08) R08,
 SUM(CASE WHEN A.TAMANHO =  9 AND B.CONSUMO_QUANTIDADE_T09 > 0  THEN A.Quantidade_Pedido ELSE 0 END) T09, MAX(B.CONSUMO_QUANTIDADE_T09) R09,
 SUM(CASE WHEN A.TAMANHO = 10 AND B.CONSUMO_QUANTIDADE_T10 > 0  THEN A.Quantidade_Pedido ELSE 0 END) T10, MAX(B.CONSUMO_QUANTIDADE_T10) R10,
 SUM(CASE WHEN A.TAMANHO = 11 AND B.CONSUMO_QUANTIDADE_T11 > 0  THEN A.Quantidade_Pedido ELSE 0 END) T11, MAX(B.CONSUMO_QUANTIDADE_T11) R11,
 SUM(CASE WHEN A.TAMANHO = 12 AND B.CONSUMO_QUANTIDADE_T12 > 0  THEN A.Quantidade_Pedido ELSE 0 END) T12, MAX(B.CONSUMO_QUANTIDADE_T12) R12,
 SUM(CASE WHEN A.TAMANHO = 13 AND B.CONSUMO_QUANTIDADE_T13 > 0  THEN A.Quantidade_Pedido ELSE 0 END) T13, MAX(B.CONSUMO_QUANTIDADE_T13) R13,
 SUM(CASE WHEN A.TAMANHO = 14 AND B.CONSUMO_QUANTIDADE_T14 > 0  THEN A.Quantidade_Pedido ELSE 0 END) T14, MAX(B.CONSUMO_QUANTIDADE_T14) R14,
 SUM(CASE WHEN A.TAMANHO = 15 AND B.CONSUMO_QUANTIDADE_T15 > 0  THEN A.Quantidade_Pedido ELSE 0 END) T15, MAX(B.CONSUMO_QUANTIDADE_T15) R15,
 SUM(CASE WHEN A.TAMANHO = 16 AND B.CONSUMO_QUANTIDADE_T16 > 0  THEN A.Quantidade_Pedido ELSE 0 END) T16, MAX(B.CONSUMO_QUANTIDADE_T16) R16,
 SUM(CASE WHEN A.TAMANHO = 17 AND B.CONSUMO_QUANTIDADE_T17 > 0  THEN A.Quantidade_Pedido ELSE 0 END) T17, MAX(B.CONSUMO_QUANTIDADE_T17) R17,
 SUM(CASE WHEN A.TAMANHO = 18 AND B.CONSUMO_QUANTIDADE_T18 > 0  THEN A.Quantidade_Pedido ELSE 0 END) T18, MAX(B.CONSUMO_QUANTIDADE_T18) R18,
 SUM(CASE WHEN A.TAMANHO = 19 AND B.CONSUMO_QUANTIDADE_T19 > 0  THEN A.Quantidade_Pedido ELSE 0 END) T19, MAX(B.CONSUMO_QUANTIDADE_T19) R19,
 SUM(CASE WHEN A.TAMANHO = 20 AND B.CONSUMO_QUANTIDADE_T20 > 0  THEN A.Quantidade_Pedido ELSE 0 END) T20, MAX(B.CONSUMO_QUANTIDADE_T20) R20

FROM TBPEDIDO_ITEM_PROCESSADO A,
     TBMODELO_CONSUMO B,
     TBMODELO F

WHERE A.MODELO_CODIGO = B.MODELO_CODIGO
  AND A.MODELO_CODIGO = F.CODIGO
  AND A.REMESSA BETWEEN :REMESSA_1 AND :REMESSA_2

Group BY B.CONSUMO_PRODUTO_CODIGO, F.GRADE_CODIGO
Order By 3, 2

INTO
:produto_codigo,:grade_codigo,
:descricao, :UnidadeMedida_Sigla,:quantidade_Total,:R_Total,
:T01,:R01,:T02,:R02,:T03,:R03,:T04,:R04,:T05,:R05,:T06,:R06,:T07,:R07,:T08,:R08,
:T09,:R09,:T10,:R10,:T11,:R11,:T12,:R12,:T13,:R13,:T14,:R14,:T15,:R15,:T16,:R16,
:T17,:R17,:T18,:R18,:T19,:R19,:T20,:R20
DO SUSPEND;
END
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER procedure SPC_REL_FICHA2_C (
    REMESSA_1 integer,
    REMESSA_2 integer)
returns (
    PRODUTO_CODIGO integer,
    GRADE_CODIGO integer,
    DESCRICAO varchar(100),
    UNIDADEMEDIDA_SIGLA varchar(3),
    QUANTIDADE_TOTAL numeric(10,5),
    R_TOTAL numeric(10,5),
    T01 numeric(10,5),
    R01 numeric(10,5),
    T02 numeric(10,5),
    R02 numeric(10,5),
    T03 numeric(10,5),
    R03 numeric(10,5),
    T04 numeric(10,5),
    R04 numeric(10,5),
    T05 numeric(10,5),
    R05 numeric(10,5),
    T06 numeric(10,5),
    R06 numeric(10,5),
    T07 numeric(10,5),
    R07 numeric(10,5),
    T08 numeric(10,5),
    R08 numeric(10,5),
    T09 numeric(10,5),
    R09 numeric(10,5),
    T10 numeric(10,5),
    R10 numeric(10,5),
    T11 numeric(10,5),
    R11 numeric(10,5),
    T12 numeric(10,5),
    R12 numeric(10,5),
    T13 numeric(10,5),
    R13 numeric(10,5),
    T14 numeric(10,5),
    R14 numeric(10,5),
    T15 numeric(10,5),
    R15 numeric(10,5),
    T16 numeric(10,5),
    R16 numeric(10,5),
    T17 numeric(10,5),
    R17 numeric(10,5),
    T18 numeric(10,5),
    R18 numeric(10,5),
    T19 numeric(10,5),
    R19 numeric(10,5),
    T20 numeric(10,5),
    R20 numeric(10,5))
as
BEGIN
FOR  SELECT B.CONSUMO_PRODUTO_CODIGO,
 Max(F.Grade_Codigo),
 Max((SELECT D.DESCRICAO FROM TBPRODUTO D WHERE B.CONSUMO_PRODUTO_CODIGO = D.CODIGO)) DESCRICAO,
 Max((SELECT D.UNIDADEMEDIDA_SIGLA2 FROM TBPRODUTO D WHERE B.CONSUMO_PRODUTO_CODIGO = D.CODIGO)) UNIDADEMEDIDA_SIGLA,
 Sum(A.QUANTIDADE_PEDIDO) QUANTIDADE_TOTAL,
 MAX(B.CONSUMO_QUANTIDADE) R_TOTAL,
 SUM(CASE WHEN A.TAMANHO =  1 AND B.CONSUMO_QUANTIDADE_T01 > 0  THEN A.Quantidade_Pedido ELSE 0 END) T01, MAX(B.CONSUMO_QUANTIDADE_T01) R01,
 SUM(CASE WHEN A.TAMANHO =  2 AND B.CONSUMO_QUANTIDADE_T02 > 0  THEN A.Quantidade_Pedido ELSE 0 END) T02, MAX(B.CONSUMO_QUANTIDADE_T02) R02,
 SUM(CASE WHEN A.TAMANHO =  3 AND B.CONSUMO_QUANTIDADE_T03 > 0  THEN A.Quantidade_Pedido ELSE 0 END) T03, MAX(B.CONSUMO_QUANTIDADE_T03) R03,
 SUM(CASE WHEN A.TAMANHO =  4 AND B.CONSUMO_QUANTIDADE_T04 > 0  THEN A.Quantidade_Pedido ELSE 0 END) T04, MAX(B.CONSUMO_QUANTIDADE_T04) R04,
 SUM(CASE WHEN A.TAMANHO =  5 AND B.CONSUMO_QUANTIDADE_T05 > 0  THEN A.Quantidade_Pedido ELSE 0 END) T05, MAX(B.CONSUMO_QUANTIDADE_T05) R05,
 SUM(CASE WHEN A.TAMANHO =  6 AND B.CONSUMO_QUANTIDADE_T06 > 0  THEN A.Quantidade_Pedido ELSE 0 END) T06, MAX(B.CONSUMO_QUANTIDADE_T06) R06,
 SUM(CASE WHEN A.TAMANHO =  7 AND B.CONSUMO_QUANTIDADE_T07 > 0  THEN A.Quantidade_Pedido ELSE 0 END) T07, MAX(B.CONSUMO_QUANTIDADE_T07) R07,
 SUM(CASE WHEN A.TAMANHO =  8 AND B.CONSUMO_QUANTIDADE_T08 > 0  THEN A.Quantidade_Pedido ELSE 0 END) T08, MAX(B.CONSUMO_QUANTIDADE_T08) R08,
 SUM(CASE WHEN A.TAMANHO =  9 AND B.CONSUMO_QUANTIDADE_T09 > 0  THEN A.Quantidade_Pedido ELSE 0 END) T09, MAX(B.CONSUMO_QUANTIDADE_T09) R09,
 SUM(CASE WHEN A.TAMANHO = 10 AND B.CONSUMO_QUANTIDADE_T10 > 0  THEN A.Quantidade_Pedido ELSE 0 END) T10, MAX(B.CONSUMO_QUANTIDADE_T10) R10,
 SUM(CASE WHEN A.TAMANHO = 11 AND B.CONSUMO_QUANTIDADE_T11 > 0  THEN A.Quantidade_Pedido ELSE 0 END) T11, MAX(B.CONSUMO_QUANTIDADE_T11) R11,
 SUM(CASE WHEN A.TAMANHO = 12 AND B.CONSUMO_QUANTIDADE_T12 > 0  THEN A.Quantidade_Pedido ELSE 0 END) T12, MAX(B.CONSUMO_QUANTIDADE_T12) R12,
 SUM(CASE WHEN A.TAMANHO = 13 AND B.CONSUMO_QUANTIDADE_T13 > 0  THEN A.Quantidade_Pedido ELSE 0 END) T13, MAX(B.CONSUMO_QUANTIDADE_T13) R13,
 SUM(CASE WHEN A.TAMANHO = 14 AND B.CONSUMO_QUANTIDADE_T14 > 0  THEN A.Quantidade_Pedido ELSE 0 END) T14, MAX(B.CONSUMO_QUANTIDADE_T14) R14,
 SUM(CASE WHEN A.TAMANHO = 15 AND B.CONSUMO_QUANTIDADE_T15 > 0  THEN A.Quantidade_Pedido ELSE 0 END) T15, MAX(B.CONSUMO_QUANTIDADE_T15) R15,
 SUM(CASE WHEN A.TAMANHO = 16 AND B.CONSUMO_QUANTIDADE_T16 > 0  THEN A.Quantidade_Pedido ELSE 0 END) T16, MAX(B.CONSUMO_QUANTIDADE_T16) R16,
 SUM(CASE WHEN A.TAMANHO = 17 AND B.CONSUMO_QUANTIDADE_T17 > 0  THEN A.Quantidade_Pedido ELSE 0 END) T17, MAX(B.CONSUMO_QUANTIDADE_T17) R17,
 SUM(CASE WHEN A.TAMANHO = 18 AND B.CONSUMO_QUANTIDADE_T18 > 0  THEN A.Quantidade_Pedido ELSE 0 END) T18, MAX(B.CONSUMO_QUANTIDADE_T18) R18,
 SUM(CASE WHEN A.TAMANHO = 19 AND B.CONSUMO_QUANTIDADE_T19 > 0  THEN A.Quantidade_Pedido ELSE 0 END) T19, MAX(B.CONSUMO_QUANTIDADE_T19) R19,
 SUM(CASE WHEN A.TAMANHO = 20 AND B.CONSUMO_QUANTIDADE_T20 > 0  THEN A.Quantidade_Pedido ELSE 0 END) T20, MAX(B.CONSUMO_QUANTIDADE_T20) R20

FROM TBPEDIDO_ITEM_PROCESSADO A,
     TBMODELO_CONSUMO B,
     TBMODELO F

WHERE A.MODELO_CODIGO = B.MODELO_CODIGO
  AND A.MODELO_CODIGO = F.CODIGO
  AND A.REMESSA BETWEEN :REMESSA_1 AND :REMESSA_2

Group BY B.CONSUMO_PRODUTO_CODIGO
Order By 3

INTO
:produto_codigo, :grade_codigo,
:descricao, :UnidadeMedida_Sigla,:quantidade_Total,:R_Total,
:T01,:R01,:T02,:R02,:T03,:R03,:T04,:R04,:T05,:R05,:T06,:R06,:T07,:R07,:T08,:R08,
:T09,:R09,:T10,:R10,:T11,:R11,:T12,:R12,:T13,:R13,:T14,:R14,:T15,:R15,:T16,:R16,
:T17,:R17,:T18,:R18,:T19,:R19,:T20,:R20
DO SUSPEND;
END
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER procedure SPC_REL_FICHA2_PL_N (
    ESTABELECIMENTO_1 integer,
    FAMILIA_1 integer,
    CONTROLE_1 integer)
returns (
    PRODUTO_CODIGO integer,
    GRADE_CODIGO integer,
    DESCRICAO varchar(100),
    UNIDADEMEDIDA_SIGLA varchar(3),
    QUANTIDADE_TOTAL numeric(10,5),
    R_TOTAL numeric(10,5),
    T01 numeric(10,5),
    R01 numeric(10,5),
    T02 numeric(10,5),
    R02 numeric(10,5),
    T03 numeric(10,5),
    R03 numeric(10,5),
    T04 numeric(10,5),
    R04 numeric(10,5),
    T05 numeric(10,5),
    R05 numeric(10,5),
    T06 numeric(10,5),
    R06 numeric(10,5),
    T07 numeric(10,5),
    R07 numeric(10,5),
    T08 numeric(10,5),
    R08 numeric(10,5),
    T09 numeric(10,5),
    R09 numeric(10,5),
    T10 numeric(10,5),
    R10 numeric(10,5),
    T11 numeric(10,5),
    R11 numeric(10,5),
    T12 numeric(10,5),
    R12 numeric(10,5),
    T13 numeric(10,5),
    R13 numeric(10,5),
    T14 numeric(10,5),
    R14 numeric(10,5),
    T15 numeric(10,5),
    R15 numeric(10,5),
    T16 numeric(10,5),
    R16 numeric(10,5),
    T17 numeric(10,5),
    R17 numeric(10,5),
    T18 numeric(10,5),
    R18 numeric(10,5),
    T19 numeric(10,5),
    R19 numeric(10,5),
    T20 numeric(10,5),
    R20 numeric(10,5))
as
BEGIN
FOR  SELECT B.CONSUMO_PRODUTO_CODIGO PRODUTO_CODIGO, F.GRADE_CODIGO,
 Max((SELECT D.DESCRICAO FROM TBPRODUTO D WHERE B.CONSUMO_PRODUTO_CODIGO = D.CODIGO)) DESCRICAO,
 Max((SELECT D.UNIDADEMEDIDA_SIGLA2 FROM TBPRODUTO D WHERE B.CONSUMO_PRODUTO_CODIGO = D.CODIGO)) UNIDADEMEDIDA_SIGLA,
 Sum(E.QUANTIDADE_PEDIDO) QUANTIDADE_TOTAL,
 MAX(B.CONSUMO_QUANTIDADE) R_TOTAL,
 SUM(CASE WHEN A.TAMANHO =  1 AND B.CONSUMO_QUANTIDADE_T01 > 0  THEN E.QUANTIDADE_PEDIDO ELSE 0 END) T01, MAX(B.CONSUMO_QUANTIDADE_T01) R01,
 SUM(CASE WHEN A.TAMANHO =  2 AND B.CONSUMO_QUANTIDADE_T02 > 0  THEN E.QUANTIDADE_PEDIDO ELSE 0 END) T02, MAX(B.CONSUMO_QUANTIDADE_T02) R02,
 SUM(CASE WHEN A.TAMANHO =  3 AND B.CONSUMO_QUANTIDADE_T03 > 0  THEN E.QUANTIDADE_PEDIDO ELSE 0 END) T03, MAX(B.CONSUMO_QUANTIDADE_T03) R03,
 SUM(CASE WHEN A.TAMANHO =  4 AND B.CONSUMO_QUANTIDADE_T04 > 0  THEN E.QUANTIDADE_PEDIDO ELSE 0 END) T04, MAX(B.CONSUMO_QUANTIDADE_T04) R04,
 SUM(CASE WHEN A.TAMANHO =  5 AND B.CONSUMO_QUANTIDADE_T05 > 0  THEN E.QUANTIDADE_PEDIDO ELSE 0 END) T05, MAX(B.CONSUMO_QUANTIDADE_T05) R05,
 SUM(CASE WHEN A.TAMANHO =  6 AND B.CONSUMO_QUANTIDADE_T06 > 0  THEN E.QUANTIDADE_PEDIDO ELSE 0 END) T06, MAX(B.CONSUMO_QUANTIDADE_T06) R06,
 SUM(CASE WHEN A.TAMANHO =  7 AND B.CONSUMO_QUANTIDADE_T07 > 0  THEN E.QUANTIDADE_PEDIDO ELSE 0 END) T07, MAX(B.CONSUMO_QUANTIDADE_T07) R07,
 SUM(CASE WHEN A.TAMANHO =  8 AND B.CONSUMO_QUANTIDADE_T08 > 0  THEN E.QUANTIDADE_PEDIDO ELSE 0 END) T08, MAX(B.CONSUMO_QUANTIDADE_T08) R08,
 SUM(CASE WHEN A.TAMANHO =  9 AND B.CONSUMO_QUANTIDADE_T09 > 0  THEN E.QUANTIDADE_PEDIDO ELSE 0 END) T09, MAX(B.CONSUMO_QUANTIDADE_T09) R09,
 SUM(CASE WHEN A.TAMANHO = 10 AND B.CONSUMO_QUANTIDADE_T10 > 0  THEN E.QUANTIDADE_PEDIDO ELSE 0 END) T10, MAX(B.CONSUMO_QUANTIDADE_T10) R10,
 SUM(CASE WHEN A.TAMANHO = 11 AND B.CONSUMO_QUANTIDADE_T11 > 0  THEN E.QUANTIDADE_PEDIDO ELSE 0 END) T11, MAX(B.CONSUMO_QUANTIDADE_T11) R11,
 SUM(CASE WHEN A.TAMANHO = 12 AND B.CONSUMO_QUANTIDADE_T12 > 0  THEN E.QUANTIDADE_PEDIDO ELSE 0 END) T12, MAX(B.CONSUMO_QUANTIDADE_T12) R12,
 SUM(CASE WHEN A.TAMANHO = 13 AND B.CONSUMO_QUANTIDADE_T13 > 0  THEN E.QUANTIDADE_PEDIDO ELSE 0 END) T13, MAX(B.CONSUMO_QUANTIDADE_T13) R13,
 SUM(CASE WHEN A.TAMANHO = 14 AND B.CONSUMO_QUANTIDADE_T14 > 0  THEN E.QUANTIDADE_PEDIDO ELSE 0 END) T14, MAX(B.CONSUMO_QUANTIDADE_T14) R14,
 SUM(CASE WHEN A.TAMANHO = 15 AND B.CONSUMO_QUANTIDADE_T15 > 0  THEN E.QUANTIDADE_PEDIDO ELSE 0 END) T15, MAX(B.CONSUMO_QUANTIDADE_T15) R15,
 SUM(CASE WHEN A.TAMANHO = 16 AND B.CONSUMO_QUANTIDADE_T16 > 0  THEN E.QUANTIDADE_PEDIDO ELSE 0 END) T16, MAX(B.CONSUMO_QUANTIDADE_T16) R16,
 SUM(CASE WHEN A.TAMANHO = 17 AND B.CONSUMO_QUANTIDADE_T17 > 0  THEN E.QUANTIDADE_PEDIDO ELSE 0 END) T17, MAX(B.CONSUMO_QUANTIDADE_T17) R17,
 SUM(CASE WHEN A.TAMANHO = 18 AND B.CONSUMO_QUANTIDADE_T18 > 0  THEN E.QUANTIDADE_PEDIDO ELSE 0 END) T18, MAX(B.CONSUMO_QUANTIDADE_T18) R18,
 SUM(CASE WHEN A.TAMANHO = 19 AND B.CONSUMO_QUANTIDADE_T19 > 0  THEN E.QUANTIDADE_PEDIDO ELSE 0 END) T19, MAX(B.CONSUMO_QUANTIDADE_T19) R19,
 SUM(CASE WHEN A.TAMANHO = 20 AND B.CONSUMO_QUANTIDADE_T20 > 0  THEN E.QUANTIDADE_PEDIDO ELSE 0 END) T20, MAX(B.CONSUMO_QUANTIDADE_T20) R20

From TbRemessa_Item_Processado A, TbPedido_Item_Processado E,
     TBMODELO_CONSUMO B, TBMODELO F

Where (A.Remessa = E.Remessa and A.Controle = E.Remessa_Acumulado_Controle)
  AND  A.MODELO_CODIGO = B.MODELO_CODIGO
  AND  A.MODELO_CODIGO = F.CODIGO
  and  A.Estabelecimento_Codigo = :ESTABELECIMENTO_1
  and  A.Familia_Codigo         = :FAMILIA_1
  and (E.Situacao <= 2)
  AND A.programacao_controle  = :CONTROLE_1

Group BY B.CONSUMO_PRODUTO_CODIGO, F.GRADE_CODIGO
Order By 3, 2

INTO
:produto_codigo,:grade_codigo,
:descricao, :UnidadeMedida_Sigla,:quantidade_Total,:R_Total,
:T01,:R01,:T02,:R02,:T03,:R03,:T04,:R04,:T05,:R05,:T06,:R06,:T07,:R07,:T08,:R08,
:T09,:R09,:T10,:R10,:T11,:R11,:T12,:R12,:T13,:R13,:T14,:R14,:T15,:R15,:T16,:R16,
:T17,:R17,:T18,:R18,:T19,:R19,:T20,:R20
DO SUSPEND;
END
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER procedure SPC_REL_NFE_PRODUTO (
    ESTABELECIMENTO_CODIGO_1 integer,
    EMPRESA_CODIGO_T integer,
    EMPRESA_CODIGO_1 integer,
    DATA_1 date,
    DATA_2 date,
    DATA_3 date,
    DATA_4 date,
    NOTAFISCAL_1 integer,
    NOTAFISCAL_2 integer,
    PRODUTO_1 integer,
    PRODUTO_2 integer,
    NATUREZA_1 integer,
    SITUACAO_1 integer,
    CFOP_CODIGO_T varchar(5),
    CFOP_CODIGO_1 varchar(5),
    CFOP_CODIGO_2 varchar(5),
    CFOP_CODIGO_3 varchar(5),
    CFOP_CODIGO_4 varchar(5),
    CFOP_CODIGO_5 varchar(5),
    CFOP_CODIGO_6 varchar(5),
    CFOP_CODIGO_7 varchar(5),
    CFOP_CODIGO_8 varchar(5),
    CFOP_CODIGO_9 varchar(5),
    CFOP_CODIGO_10 varchar(5),
    OPERACAO_CODIGO_T varchar(3),
    OPERACAO_CODIGO_1 varchar(3),
    OPERACAO_CODIGO_2 varchar(3),
    OPERACAO_CODIGO_3 varchar(3),
    OPERACAO_CODIGO_4 varchar(3),
    OPERACAO_CODIGO_5 varchar(3),
    OPERACAO_CODIGO_6 varchar(3),
    OPERACAO_CODIGO_7 varchar(3),
    OPERACAO_CODIGO_8 varchar(3),
    OPERACAO_CODIGO_9 varchar(3),
    OPERACAO_CODIGO_10 varchar(3),
    FAMILIA_CODIGO_T integer,
    FAMILIA_CODIGO_1 integer,
    FAMILIA_CODIGO_2 integer,
    FAMILIA_CODIGO_3 integer,
    FAMILIA_CODIGO_4 integer,
    FAMILIA_CODIGO_5 integer,
    FAMILIA_CODIGO_6 integer,
    FAMILIA_CODIGO_7 integer,
    FAMILIA_CODIGO_8 integer,
    FAMILIA_CODIGO_9 integer,
    FAMILIA_CODIGO_10 integer)
returns (
    PRODUTO_CODIGO integer,
    PRODUTO_DESCRICAO varchar(100),
    PRODUTO_UNIDADEMEDIDA varchar(3),
    FAMILIA_CODIGO integer,
    GRADE_CODIGO integer,
    QUANTIDADE numeric(10,5),
    VALOR_TOTAL numeric(10,5),
    T01 numeric(10,5),
    T02 numeric(10,5),
    T03 numeric(10,5),
    T04 numeric(10,5),
    T05 numeric(10,5),
    T06 numeric(10,5),
    T07 numeric(10,5),
    T08 numeric(10,5),
    T09 numeric(10,5),
    T10 numeric(10,5),
    T11 numeric(10,5),
    T12 numeric(10,5),
    T13 numeric(10,5),
    T14 numeric(10,5),
    T15 numeric(10,5),
    T16 numeric(10,5),
    T17 numeric(10,5),
    T18 numeric(10,5),
    T19 numeric(10,5),
    T20 numeric(10,5))
as
BEGIN
For Select Distinct(A.Produto_Codigo), A.Produto_Descricao,
B.UnidadeMedida_Sigla2, B.Familia_Codigo, B.Grade_Codigo,
Sum(A.Quantidade), Sum(A.valor_total),
Sum(A.T01), Sum(A.T02), Sum(A.T03), Sum(A.T04), Sum(A.T05),
Sum(A.T06), Sum(A.T07), Sum(A.T08), Sum(A.T09), Sum(A.T10),
Sum(A.T11), Sum(A.T12), Sum(A.T13), Sum(A.T14), Sum(A.T15),
Sum(A.T16), Sum(A.T17), Sum(A.T18), Sum(A.T19), Sum(A.T20)

From TbNfe_Item A
Inner Join TbProduto B On A.Produto_Codigo = B.Codigo
Inner Join TbNfE C     On A.nfe_controle   = C.Controle

Where  A.Estabelecimento_Codigo = :ESTABELECIMENTO_CODIGO_1

  and (A.Empresa_Codigo      > :EMPRESA_CODIGO_T or
       A.Empresa_Codigo      = :EMPRESA_CODIGO_1)

  and (C.Data_Emissao between :DATA_1 and :DATA_2)
  and (A.Data_Entrada between :DATA_3 and :DATA_4)

  and (A.Numero_NotaFiscal between :NOTAFISCAL_1 and :NOTAFISCAL_2)
  and (A.Produto_Codigo between :PRODUTO_1 and :PRODUTO_2)

  and (C.Natureza = :NATUREZA_1)
  and (C.Situacao = :SITUACAO_1)

  and (A.Cfop_Codigo <>:CFOP_CODIGO_T or
       A.Cfop_Codigo = :CFOP_CODIGO_1 or
       A.Cfop_Codigo = :CFOP_CODIGO_2 or
       A.Cfop_Codigo = :CFOP_CODIGO_3 or
       A.Cfop_Codigo = :CFOP_CODIGO_4 or
       A.Cfop_Codigo = :CFOP_CODIGO_5 or
       A.Cfop_Codigo = :CFOP_CODIGO_6 or
       A.Cfop_Codigo = :CFOP_CODIGO_7 or
       A.Cfop_Codigo = :CFOP_CODIGO_8 or
       A.Cfop_Codigo = :CFOP_CODIGO_9 or
       A.Cfop_Codigo = :CFOP_CODIGO_10)

  and (A.Operacao_Codigo <>:OPERACAO_CODIGO_T or
       A.Operacao_Codigo = :OPERACAO_CODIGO_1 or
       A.Operacao_Codigo = :OPERACAO_CODIGO_2 or
       A.Operacao_Codigo = :OPERACAO_CODIGO_3 or
       A.Operacao_Codigo = :OPERACAO_CODIGO_4 or
       A.Operacao_Codigo = :OPERACAO_CODIGO_5 or
       A.Operacao_Codigo = :OPERACAO_CODIGO_6 or
       A.Operacao_Codigo = :OPERACAO_CODIGO_7 or
       A.Operacao_Codigo = :OPERACAO_CODIGO_8 or
       A.Operacao_Codigo = :OPERACAO_CODIGO_9 or
       A.Operacao_Codigo = :OPERACAO_CODIGO_10)

  and (B.Familia_Codigo <>:FAMILIA_CODIGO_T or
       B.Familia_Codigo = :FAMILIA_CODIGO_1 or
       B.Familia_Codigo = :FAMILIA_CODIGO_2 or
       B.Familia_Codigo = :FAMILIA_CODIGO_3 or
       B.Familia_Codigo = :FAMILIA_CODIGO_4 or
       B.Familia_Codigo = :FAMILIA_CODIGO_5 or
       B.Familia_Codigo = :FAMILIA_CODIGO_6 or
       B.Familia_Codigo = :FAMILIA_CODIGO_7 or
       B.Familia_Codigo = :FAMILIA_CODIGO_8 or
       B.Familia_Codigo = :FAMILIA_CODIGO_9 or
       B.Familia_Codigo = :FAMILIA_CODIGO_10)

Group By A.Produto_Codigo, A.Produto_Descricao,
         B.UnidadeMedida_Sigla2, B.Familia_Codigo, B.Grade_Codigo
Order By A.Produto_Descricao

INTO
   :produto_codigo,
   :produto_descricao,
   :produto_unidademedida,
   :familia_codigo,
   :grade_codigo,
   :quantidade, :Valor_Total,
   :t01,:t02,:t03,:t04,:t05,:t06,:t07,:t08,:t09,:t10,
   :t11,:t12,:t13,:t14,:t15,:t16,:t17,:t18,:t19,:t20
DO SUSPEND;
END
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER procedure SPC_REMESSA_CONSUMO_TALAO (
    REMESSA_ID integer,
    REMESSA_TALAO_ID integer,
    QUANTIDADE_PRODUCAO numeric(10,5))
returns (
    CONSUMO_ID integer,
    CONSUMO_PRODUTO_ID integer,
    CONSUMO_TAMANHO integer,
    CONSUMO_FATOR_UNIDADE numeric(15,8),
    CONSUMO_QUANTIDADE_SALDO numeric(15,5),
    CONSUMO_UM varchar(10),
    CONSUMO_FAMILIA_ID integer,
    CONSUMO_LOCALIZACAO_ID integer,
    CONSUMO_PERMITE_FRACAO varchar(5),
    CONSUMO_QUANTIDADE numeric(15,5),
    ULTIMO_TALAO boolean)
as
begin

        ULTIMO_TALAO = IIF(COALESCE((
            SELECT COUNT(D.ID)
              FROM VWREMESSA_TALAO_DETALHE D
             WHERE D.REMESSA_ID = :REMESSA_ID
               AND D.REMESSA_TALAO_ID = :REMESSA_TALAO_ID
               AND D.STATUS < 2
        ),0) = 1,TRUE, FALSE);


        /* REALIZA AS BAIXAS DE CONSUMO */
        FOR
            SELECT
                C.ID,
                C.PRODUTO_ID,
                C.TAMANHO,
                C.FATOR_UNIDADE,
                C.QUANTIDADE_SALDO,
                P.UNIDADEMEDIDA_SIGLA2,
                P.FAMILIA_CODIGO,
                P.LOCALIZACAO_CODIGO
            FROM
                VWREMESSA_CONSUMO C,
                TBPRODUTO P
            WHERE
                P.CODIGO = C.PRODUTO_ID
            AND C.REMESSA_ID = :REMESSA_ID
            AND C.REMESSA_TALAO_ID = :REMESSA_TALAO_ID
            AND C.STATUS = '0'
            AND C.COMPONENTE = '0'
        INTO
            CONSUMO_ID,
            CONSUMO_PRODUTO_ID,
            CONSUMO_TAMANHO,
            CONSUMO_FATOR_UNIDADE,
            CONSUMO_QUANTIDADE_SALDO,
            CONSUMO_UM,
            CONSUMO_FAMILIA_ID,
            CONSUMO_LOCALIZACAO_ID
        DO
        BEGIN

            /* VERIFICA SE O PRODUTO PERMITE BAIXA FRACIONADA */
            CONSUMO_PERMITE_FRACAO = COALESCE((
                SELECT U.PODE_FRACIONAR
                  FROM TbUnidadeMedida U
                 WHERE U.SIGLA = :CONSUMO_UM),'N');

            /* REALIZA O CALCULO DE CONSUMO */
            /*
               OBS1:
                   SE FOR O ULTIMO TALAO DETALHADO A SER PRODUZIDO A BAIXA DEVE SER IGUAL AO RESTANTE A SER CONSUMIDO,
                   SENAO, DEVERA SER CALCULDO BASEADO NA QUANTIDADE DO TALAO DETALHADO.
               OBS2:
                   SE O PRODUTO NAO PERMITIR QUANTIDADE FRANCIONADA, O VALOR SERA ARREDONDADO PARA CIMA.
            */
            CONSUMO_QUANTIDADE = IIF(ULTIMO_TALAO,COALESCE(CONSUMO_QUANTIDADE_SALDO,0), COALESCE(:QUANTIDADE_PRODUCAO * CONSUMO_FATOR_UNIDADE,0));
            CONSUMO_QUANTIDADE = IIF(CONSUMO_PERMITE_FRACAO = 'S',CONSUMO_QUANTIDADE,FN_ARRENDONDAR_PARA_CIMA(CONSUMO_QUANTIDADE));


            SUSPEND;
        END

end
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER procedure SPC_REMESSA_PEDIDO_TALAO1 (
    ESTABELECIMENTO_1 integer,
    FAMILIA_1 integer,
    REMESSA_1 integer,
    E smallint,
    D smallint)
returns (
    REMESSA integer,
    CONTROLE integer,
    MODELO_CODIGO integer,
    MODELO_ESPESSURA numeric(15,2),
    MODELO_DENSIDADE integer,
    MATRIZ_CODIGO integer,
    MATRIZ_DESCRICAO varchar(20),
    MATRIZ_LARGURA numeric(10,2),
    PRODUTO_CODIGO integer,
    TAMANHO integer,
    QUANTIDADE numeric(10,2),
    TOLERANCIA numeric(10,2),
    CHAPAS numeric(10,2),
    PLACAS numeric(10,2),
    SOBRAS numeric(10,2),
    PLACAS_ smallint,
    SOBRAS_ smallint,
    CONSUMO_MEDIO numeric(10,2),
    OBSERVACAO varchar(200),
    SITUACAO integer,
    DESCRICAO varchar(100),
    GRADE_CODIGO integer,
    UNIDADEMEDIDA_SIGLA varchar(3),
    COR_CODIGO integer,
    PERCENTUAL_TALAO numeric(15,2),
    CLASSE varchar(1),
    PROGRAMACAO_BOCA integer,
    PROGRAMACAO_ESTEIRA integer,
    PROGRAMACAO_SEQUENCIA integer,
    ESTEIRA_DESCRICAO varchar(20),
    HORA_PRODUCAO timestamp,
    HORA_LIBERACAO timestamp,
    LIB char(1),
    COMPOSICAO varchar(20))
as
BEGIN
FOR Select A.REMESSA,A.CONTROLE,A.MODELO_CODIGO,
/* (Select F.ESPESSURA From TbModelo F Where A.MODELO_CODIGO = F.Codigo),*/

     ((CASE WHEN A.TAMANHO =  1  THEN
     (Select First 1 F.T01 From TbModelo_Ficha_Tecnica F
      Where A.MODELO_CODIGO = F.Modelo_Codigo and F.Tipo_Codigo = :E) ELSE
     (CASE WHEN A.TAMANHO =  2  THEN
     (Select First 1 F.T02 From TbModelo_Ficha_Tecnica F
      Where A.MODELO_CODIGO = F.Modelo_Codigo and F.Tipo_Codigo = :E) ELSE
     (CASE WHEN A.TAMANHO =  3  THEN
     (Select First 1 F.T03 From TbModelo_Ficha_Tecnica F
      Where A.MODELO_CODIGO = F.Modelo_Codigo and F.Tipo_Codigo = :E) ELSE
     (CASE WHEN A.TAMANHO =  4  THEN
     (Select First 1 F.T04 From TbModelo_Ficha_Tecnica F
      Where A.MODELO_CODIGO = F.Modelo_Codigo and F.Tipo_Codigo = :E) ELSE
     (CASE WHEN A.TAMANHO =  5  THEN
     (Select First 1 F.T05 From TbModelo_Ficha_Tecnica F
      Where A.MODELO_CODIGO = F.Modelo_Codigo and F.Tipo_Codigo = :E) ELSE
     (CASE WHEN A.TAMANHO =  6  THEN
     (Select First 1 F.T06 From TbModelo_Ficha_Tecnica F
      Where A.MODELO_CODIGO = F.Modelo_Codigo and F.Tipo_Codigo = :E) ELSE
     (CASE WHEN A.TAMANHO =  7  THEN
     (Select First 1 F.T07 From TbModelo_Ficha_Tecnica F
      Where A.MODELO_CODIGO = F.Modelo_Codigo and F.Tipo_Codigo = :E) ELSE
     (CASE WHEN A.TAMANHO =  8  THEN
     (Select First 1 F.T08 From TbModelo_Ficha_Tecnica F
      Where A.MODELO_CODIGO = F.Modelo_Codigo and F.Tipo_Codigo = :E) ELSE
     (CASE WHEN A.TAMANHO =  9  THEN
     (Select First 1 F.T09 From TbModelo_Ficha_Tecnica F
      Where A.MODELO_CODIGO = F.Modelo_Codigo and F.Tipo_Codigo = :E) ELSE
     (CASE WHEN A.TAMANHO =  10 THEN
     (Select First 1 F.T10 From TbModelo_Ficha_Tecnica F
      Where A.MODELO_CODIGO = F.Modelo_Codigo and F.Tipo_Codigo = :E) ELSE
     (CASE WHEN A.TAMANHO =  11 THEN
     (Select First 1 F.T11 From TbModelo_Ficha_Tecnica F
      Where A.MODELO_CODIGO = F.Modelo_Codigo and F.Tipo_Codigo = :E) ELSE
     (CASE WHEN A.TAMANHO =  12 THEN
     (Select First 1 F.T12 From TbModelo_Ficha_Tecnica F
      Where A.MODELO_CODIGO = F.Modelo_Codigo and F.Tipo_Codigo = :E) ELSE
     (CASE WHEN A.TAMANHO =  13 THEN
     (Select First 1 F.T13 From TbModelo_Ficha_Tecnica F
      Where A.MODELO_CODIGO = F.Modelo_Codigo and F.Tipo_Codigo = :E) ELSE
     (CASE WHEN A.TAMANHO =  14 THEN
     (Select First 1 F.T14 From TbModelo_Ficha_Tecnica F
      Where A.MODELO_CODIGO = F.Modelo_Codigo and F.Tipo_Codigo = :E) ELSE
     (CASE WHEN A.TAMANHO =  15 THEN
     (Select First 1 F.T15 From TbModelo_Ficha_Tecnica F
      Where A.MODELO_CODIGO = F.Modelo_Codigo and F.Tipo_Codigo = :E) ELSE
     (CASE WHEN A.TAMANHO =  16 THEN
     (Select First 1 F.T16 From TbModelo_Ficha_Tecnica F
      Where A.MODELO_CODIGO = F.Modelo_Codigo and F.Tipo_Codigo = :E) ELSE
     (CASE WHEN A.TAMANHO =  17 THEN
     (Select First 1 F.T17 From TbModelo_Ficha_Tecnica F
      Where A.MODELO_CODIGO = F.Modelo_Codigo and F.Tipo_Codigo = :E) ELSE
     (CASE WHEN A.TAMANHO =  18 THEN
     (Select First 1 F.T18 From TbModelo_Ficha_Tecnica F
      Where A.MODELO_CODIGO = F.Modelo_Codigo and F.Tipo_Codigo = :E) ELSE
     (CASE WHEN A.TAMANHO =  19 THEN
     (Select First 1 F.T19 From TbModelo_Ficha_Tecnica F
      Where A.MODELO_CODIGO = F.Modelo_Codigo and F.Tipo_Codigo = :E) ELSE
     (CASE WHEN A.TAMANHO =  20 THEN
     (Select First 1 F.T20 From TbModelo_Ficha_Tecnica F
      Where A.MODELO_CODIGO = F.Modelo_Codigo and F.Tipo_Codigo = :E) ELSE
     (Select First 1 F.Quantidade From TbModelo_Ficha_Tecnica F
      Where A.MODELO_CODIGO = F.Modelo_Codigo and F.Tipo_Codigo = :E)
      END)END)END)END)END)END)END)END)END)END)END)END)END)END)END)END)END)END)END)END))*1000 ESPESSURA,

     ((CASE WHEN A.TAMANHO =  1  THEN
     (Select First 1 F.T01 From TbModelo_Ficha_Tecnica F
      Where A.MODELO_CODIGO = F.Modelo_Codigo and F.Tipo_Codigo = :D) ELSE
     (CASE WHEN A.TAMANHO =  2  THEN
     (Select First 1 F.T02 From TbModelo_Ficha_Tecnica F
      Where A.MODELO_CODIGO = F.Modelo_Codigo and F.Tipo_Codigo = :D) ELSE
     (CASE WHEN A.TAMANHO =  3  THEN
     (Select First 1 F.T03 From TbModelo_Ficha_Tecnica F
      Where A.MODELO_CODIGO = F.Modelo_Codigo and F.Tipo_Codigo = :D) ELSE
     (CASE WHEN A.TAMANHO =  4  THEN
     (Select First 1 F.T04 From TbModelo_Ficha_Tecnica F
      Where A.MODELO_CODIGO = F.Modelo_Codigo and F.Tipo_Codigo = :D) ELSE
     (CASE WHEN A.TAMANHO =  5  THEN
     (Select First 1 F.T05 From TbModelo_Ficha_Tecnica F
      Where A.MODELO_CODIGO = F.Modelo_Codigo and F.Tipo_Codigo = :D) ELSE
     (CASE WHEN A.TAMANHO =  6  THEN
     (Select First 1 F.T06 From TbModelo_Ficha_Tecnica F
      Where A.MODELO_CODIGO = F.Modelo_Codigo and F.Tipo_Codigo = :D) ELSE
     (CASE WHEN A.TAMANHO =  7  THEN
     (Select First 1 F.T07 From TbModelo_Ficha_Tecnica F
      Where A.MODELO_CODIGO = F.Modelo_Codigo and F.Tipo_Codigo = :D) ELSE
     (CASE WHEN A.TAMANHO =  8  THEN
     (Select First 1 F.T08 From TbModelo_Ficha_Tecnica F
      Where A.MODELO_CODIGO = F.Modelo_Codigo and F.Tipo_Codigo = :D) ELSE
     (CASE WHEN A.TAMANHO =  9  THEN
     (Select First 1 F.T09 From TbModelo_Ficha_Tecnica F
      Where A.MODELO_CODIGO = F.Modelo_Codigo and F.Tipo_Codigo = :D) ELSE
     (CASE WHEN A.TAMANHO =  10 THEN
     (Select First 1 F.T10 From TbModelo_Ficha_Tecnica F
      Where A.MODELO_CODIGO = F.Modelo_Codigo and F.Tipo_Codigo = :D) ELSE
     (CASE WHEN A.TAMANHO =  11 THEN
     (Select First 1 F.T11 From TbModelo_Ficha_Tecnica F
      Where A.MODELO_CODIGO = F.Modelo_Codigo and F.Tipo_Codigo = :D) ELSE
     (CASE WHEN A.TAMANHO =  12 THEN
     (Select First 1 F.T12 From TbModelo_Ficha_Tecnica F
      Where A.MODELO_CODIGO = F.Modelo_Codigo and F.Tipo_Codigo = :D) ELSE
     (CASE WHEN A.TAMANHO =  13 THEN
     (Select First 1 F.T13 From TbModelo_Ficha_Tecnica F
      Where A.MODELO_CODIGO = F.Modelo_Codigo and F.Tipo_Codigo = :D) ELSE
     (CASE WHEN A.TAMANHO =  14 THEN
     (Select First 1 F.T14 From TbModelo_Ficha_Tecnica F
      Where A.MODELO_CODIGO = F.Modelo_Codigo and F.Tipo_Codigo = :D) ELSE
     (CASE WHEN A.TAMANHO =  15 THEN
     (Select First 1 F.T15 From TbModelo_Ficha_Tecnica F
      Where A.MODELO_CODIGO = F.Modelo_Codigo and F.Tipo_Codigo = :D) ELSE
     (CASE WHEN A.TAMANHO =  16 THEN
     (Select First 1 F.T16 From TbModelo_Ficha_Tecnica F
      Where A.MODELO_CODIGO = F.Modelo_Codigo and F.Tipo_Codigo = :D) ELSE
     (CASE WHEN A.TAMANHO =  17 THEN
     (Select First 1 F.T17 From TbModelo_Ficha_Tecnica F
      Where A.MODELO_CODIGO = F.Modelo_Codigo and F.Tipo_Codigo = :D) ELSE
     (CASE WHEN A.TAMANHO =  18 THEN
     (Select First 1 F.T18 From TbModelo_Ficha_Tecnica F
      Where A.MODELO_CODIGO = F.Modelo_Codigo and F.Tipo_Codigo = :D) ELSE
     (CASE WHEN A.TAMANHO =  19 THEN
     (Select First 1 F.T19 From TbModelo_Ficha_Tecnica F
      Where A.MODELO_CODIGO = F.Modelo_Codigo and F.Tipo_Codigo = :D) ELSE
     (CASE WHEN A.TAMANHO =  20 THEN
     (Select First 1 F.T20 From TbModelo_Ficha_Tecnica F
      Where A.MODELO_CODIGO = F.Modelo_Codigo and F.Tipo_Codigo = :D) ELSE
     (Select First 1 F.Quantidade From TbModelo_Ficha_Tecnica F
      Where A.MODELO_CODIGO = F.Modelo_Codigo and F.Tipo_Codigo = :D)
      END)END)END)END)END)END)END)END)END)END)END)END)END)END)END)END)END)END)END)END)) DENSIDADE,

    A.MATRIZ_CODIGO,
    (Select First 1 G.DESCRICAO From TbMATRIZ G Where A.MATRIZ_CODIGO = G.Codigo),
    (Select First 1 H.LARGURA   From TbMATRIZ H Where A.MATRIZ_CODIGO = H.Codigo),
    A.PRODUTO_CODIGO,A.TAMANHO,A.QUANTIDADE, A.Tolerancia,

    A.CHAPAS,A.PLACAS,A.SOBRAS,A.PLACAS_,A.SOBRAS_,

    A.CONSUMO_MEDIO,A.OBSERVACAO,A.SITUACAO,
    (Select First 1 B.DESCRICAO From TbProduto B Where A.PRODUTO_CODIGO = B.Codigo),
    (Select First 1 C.GRADE_CODIGO From TbProduto C Where A.PRODUTO_CODIGO = C.Codigo),
    (Select First 1 D.UNIDADEMEDIDA_SIGLA2 From TbProduto D Where A.PRODUTO_CODIGO = D.Codigo),
    (Select First 1 E.COR_CODIGO From TbProduto E Where A.PRODUTO_CODIGO = E.Codigo),
    (Select First 1 Coalesce(G.Percentual_Talao,0) From TbProduto E, TbCor G Where A.PRODUTO_CODIGO = E.Codigo and E.Cor_Codigo = G.Codigo),
    (Select First 1 Coalesce(G.Classe,'0') From TbProduto E, TbCor G Where A.PRODUTO_CODIGO = E.Codigo and E.Cor_Codigo = G.Codigo),
     A.Programacao_Boca, A.Programacao_Esteira, A.Programacao_Sequencia,
    (Select First 1 E.Descricao From TbEsteira E Where A.Programacao_Esteira = E.Codigo),
     A.HORA_PRODUCAO, A.HORA_LIBERACAO, Coalesce(A.lib,'0'),
    (Select First 1 F.Composicao From TbProduto_Ficha F Where A.PRODUTO_CODIGO = F.PRODUTO_CODIGO) 

From TbRemessa_Item_Processado A
WHERE A.REMESSA > 0
  and A.ESTABELECIMENTO_CODIGO = :ESTABELECIMENTO_1
  and A.FAMILIA_CODIGO = :FAMILIA_1
  and A.REMESSA = :REMESSA_1

Order By A.CONTROLE

INTO
    :REMESSA        ,
    :CONTROLE       ,
    :MODELO_CODIGO  ,
    :MODELO_ESPESSURA,
    :modelo_densidade,
    :MATRIZ_CODIGO  ,
    :MATRIZ_DESCRICAO,
    :MATRIZ_LARGURA ,
    :PRODUTO_CODIGO ,
    :TAMANHO        ,
    :QUANTIDADE     ,
    :TOLERANCIA     ,
    :CHAPAS         ,
    :PLACAS         ,
    :SOBRAS         ,
    :PLACAS_        ,
    :SOBRAS_        ,
    :CONSUMO_MEDIO  ,
    :OBSERVACAO     ,
    :SITUACAO       ,
    :DESCRICAO      ,
    :GRADE_CODIGO   ,
    :UNIDADEMEDIDA_SIGLA ,
    :COR_CODIGO,
    :Percentual_Talao,
    :Classe,
    :Programacao_Boca,
    :Programacao_Esteira,
    :Programacao_Sequencia,
    :Esteira_Descricao,
    :HORA_PRODUCAO,
    :HORA_LIBERACAO,
    :Lib,
    :Composicao
DO SUSPEND;
END
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER procedure SPC_REMESSA_PEDIDO_TALAO2 (
    ESTABELECIMENTO_1 integer,
    FAMILIA_1 integer,
    REMESSA_1 integer,
    E smallint,
    D smallint)
returns (
    REMESSA integer,
    CONTROLE integer,
    MODELO_CODIGO integer,
    MODELO_ESPESSURA numeric(15,2),
    MODELO_DENSIDADE integer,
    MATRIZ_CODIGO integer,
    MATRIZ_DESCRICAO varchar(20),
    MATRIZ_LARGURA numeric(10,2),
    PRODUTO_CODIGO integer,
    TAMANHO integer,
    QUANTIDADE numeric(10,2),
    TOLERANCIA numeric(10,2),
    CHAPAS numeric(10,2),
    PLACAS numeric(10,2),
    SOBRAS numeric(10,2),
    PLACAS_ smallint,
    SOBRAS_ smallint,
    CONSUMO_MEDIO numeric(10,2),
    OBSERVACAO varchar(200),
    SITUACAO integer,
    DESCRICAO varchar(100),
    GRADE_CODIGO integer,
    UNIDADEMEDIDA_SIGLA varchar(3),
    COR_CODIGO integer,
    PERCENTUAL_TALAO numeric(15,2),
    CLASSE varchar(1),
    PROGRAMACAO_BOCA integer,
    PROGRAMACAO_ESTEIRA integer,
    PROGRAMACAO_SEQUENCIA integer,
    ESTEIRA_DESCRICAO varchar(20),
    HORA_PRODUCAO timestamp,
    HORA_LIBERACAO timestamp,
    LIB char(1),
    COMPOSICAO varchar(20))
as
BEGIN
FOR Select A.REMESSA,A.CONTROLE,A.MODELO_CODIGO,
     ((CASE WHEN A.TAMANHO =  1  THEN
     (Select First 1 F.T01 From TbModelo_Ficha_Tecnica F
      Where A.MODELO_CODIGO = F.Modelo_Codigo and F.Tipo_Codigo = :E) ELSE
     (CASE WHEN A.TAMANHO =  2  THEN
     (Select First 1 F.T02 From TbModelo_Ficha_Tecnica F
      Where A.MODELO_CODIGO = F.Modelo_Codigo and F.Tipo_Codigo = :E) ELSE
     (CASE WHEN A.TAMANHO =  3  THEN
     (Select First 1 F.T03 From TbModelo_Ficha_Tecnica F
      Where A.MODELO_CODIGO = F.Modelo_Codigo and F.Tipo_Codigo = :E) ELSE
     (CASE WHEN A.TAMANHO =  4  THEN
     (Select First 1 F.T04 From TbModelo_Ficha_Tecnica F
      Where A.MODELO_CODIGO = F.Modelo_Codigo and F.Tipo_Codigo = :E) ELSE
     (CASE WHEN A.TAMANHO =  5  THEN
     (Select First 1 F.T05 From TbModelo_Ficha_Tecnica F
      Where A.MODELO_CODIGO = F.Modelo_Codigo and F.Tipo_Codigo = :E) ELSE
     (CASE WHEN A.TAMANHO =  6  THEN
     (Select First 1 F.T06 From TbModelo_Ficha_Tecnica F
      Where A.MODELO_CODIGO = F.Modelo_Codigo and F.Tipo_Codigo = :E) ELSE
     (CASE WHEN A.TAMANHO =  7  THEN
     (Select First 1 F.T07 From TbModelo_Ficha_Tecnica F
      Where A.MODELO_CODIGO = F.Modelo_Codigo and F.Tipo_Codigo = :E) ELSE
     (CASE WHEN A.TAMANHO =  8  THEN
     (Select First 1 F.T08 From TbModelo_Ficha_Tecnica F
      Where A.MODELO_CODIGO = F.Modelo_Codigo and F.Tipo_Codigo = :E) ELSE
     (CASE WHEN A.TAMANHO =  9  THEN
     (Select First 1 F.T09 From TbModelo_Ficha_Tecnica F
      Where A.MODELO_CODIGO = F.Modelo_Codigo and F.Tipo_Codigo = :E) ELSE
     (CASE WHEN A.TAMANHO =  10 THEN
     (Select First 1 F.T10 From TbModelo_Ficha_Tecnica F
      Where A.MODELO_CODIGO = F.Modelo_Codigo and F.Tipo_Codigo = :E) ELSE
     (CASE WHEN A.TAMANHO =  11 THEN
     (Select First 1 F.T11 From TbModelo_Ficha_Tecnica F
      Where A.MODELO_CODIGO = F.Modelo_Codigo and F.Tipo_Codigo = :E) ELSE
     (CASE WHEN A.TAMANHO =  12 THEN
     (Select First 1 F.T12 From TbModelo_Ficha_Tecnica F
      Where A.MODELO_CODIGO = F.Modelo_Codigo and F.Tipo_Codigo = :E) ELSE
     (CASE WHEN A.TAMANHO =  13 THEN
     (Select First 1 F.T13 From TbModelo_Ficha_Tecnica F
      Where A.MODELO_CODIGO = F.Modelo_Codigo and F.Tipo_Codigo = :E) ELSE
     (CASE WHEN A.TAMANHO =  14 THEN
     (Select First 1 F.T14 From TbModelo_Ficha_Tecnica F
      Where A.MODELO_CODIGO = F.Modelo_Codigo and F.Tipo_Codigo = :E) ELSE
     (CASE WHEN A.TAMANHO =  15 THEN
     (Select First 1 F.T15 From TbModelo_Ficha_Tecnica F
      Where A.MODELO_CODIGO = F.Modelo_Codigo and F.Tipo_Codigo = :E) ELSE
     (CASE WHEN A.TAMANHO =  16 THEN
     (Select First 1 F.T16 From TbModelo_Ficha_Tecnica F
      Where A.MODELO_CODIGO = F.Modelo_Codigo and F.Tipo_Codigo = :E) ELSE
     (CASE WHEN A.TAMANHO =  17 THEN
     (Select First 1 F.T17 From TbModelo_Ficha_Tecnica F
      Where A.MODELO_CODIGO = F.Modelo_Codigo and F.Tipo_Codigo = :E) ELSE
     (CASE WHEN A.TAMANHO =  18 THEN
     (Select First 1 F.T18 From TbModelo_Ficha_Tecnica F
      Where A.MODELO_CODIGO = F.Modelo_Codigo and F.Tipo_Codigo = :E) ELSE
     (CASE WHEN A.TAMANHO =  19 THEN
     (Select First 1 F.T19 From TbModelo_Ficha_Tecnica F
      Where A.MODELO_CODIGO = F.Modelo_Codigo and F.Tipo_Codigo = :E) ELSE
     (CASE WHEN A.TAMANHO =  20 THEN
     (Select First 1 F.T20 From TbModelo_Ficha_Tecnica F
      Where A.MODELO_CODIGO = F.Modelo_Codigo and F.Tipo_Codigo = :E) ELSE
     (Select First 1 F.Quantidade From TbModelo_Ficha_Tecnica F
      Where A.MODELO_CODIGO = F.Modelo_Codigo and F.Tipo_Codigo = :E)
      END)END)END)END)END)END)END)END)END)END)END)END)END)END)END)END)END)END)END)END))*1000 ESPESSURA,

     ((CASE WHEN A.TAMANHO =  1  THEN
     (Select First 1 F.T01 From TbModelo_Ficha_Tecnica F
      Where A.MODELO_CODIGO = F.Modelo_Codigo and F.Tipo_Codigo = :D) ELSE
     (CASE WHEN A.TAMANHO =  2  THEN
     (Select First 1 F.T02 From TbModelo_Ficha_Tecnica F
      Where A.MODELO_CODIGO = F.Modelo_Codigo and F.Tipo_Codigo = :D) ELSE
     (CASE WHEN A.TAMANHO =  3  THEN
     (Select First 1 F.T03 From TbModelo_Ficha_Tecnica F
      Where A.MODELO_CODIGO = F.Modelo_Codigo and F.Tipo_Codigo = :D) ELSE
     (CASE WHEN A.TAMANHO =  4  THEN
     (Select First 1 F.T04 From TbModelo_Ficha_Tecnica F
      Where A.MODELO_CODIGO = F.Modelo_Codigo and F.Tipo_Codigo = :D) ELSE
     (CASE WHEN A.TAMANHO =  5  THEN
     (Select First 1 F.T05 From TbModelo_Ficha_Tecnica F
      Where A.MODELO_CODIGO = F.Modelo_Codigo and F.Tipo_Codigo = :D) ELSE
     (CASE WHEN A.TAMANHO =  6  THEN
     (Select First 1 F.T06 From TbModelo_Ficha_Tecnica F
      Where A.MODELO_CODIGO = F.Modelo_Codigo and F.Tipo_Codigo = :D) ELSE
     (CASE WHEN A.TAMANHO =  7  THEN
     (Select First 1 F.T07 From TbModelo_Ficha_Tecnica F
      Where A.MODELO_CODIGO = F.Modelo_Codigo and F.Tipo_Codigo = :D) ELSE
     (CASE WHEN A.TAMANHO =  8  THEN
     (Select First 1 F.T08 From TbModelo_Ficha_Tecnica F
      Where A.MODELO_CODIGO = F.Modelo_Codigo and F.Tipo_Codigo = :D) ELSE
     (CASE WHEN A.TAMANHO =  9  THEN
     (Select First 1 F.T09 From TbModelo_Ficha_Tecnica F
      Where A.MODELO_CODIGO = F.Modelo_Codigo and F.Tipo_Codigo = :D) ELSE
     (CASE WHEN A.TAMANHO =  10 THEN
     (Select First 1 F.T10 From TbModelo_Ficha_Tecnica F
      Where A.MODELO_CODIGO = F.Modelo_Codigo and F.Tipo_Codigo = :D) ELSE
     (CASE WHEN A.TAMANHO =  11 THEN
     (Select First 1 F.T11 From TbModelo_Ficha_Tecnica F
      Where A.MODELO_CODIGO = F.Modelo_Codigo and F.Tipo_Codigo = :D) ELSE
     (CASE WHEN A.TAMANHO =  12 THEN
     (Select First 1 F.T12 From TbModelo_Ficha_Tecnica F
      Where A.MODELO_CODIGO = F.Modelo_Codigo and F.Tipo_Codigo = :D) ELSE
     (CASE WHEN A.TAMANHO =  13 THEN
     (Select First 1 F.T13 From TbModelo_Ficha_Tecnica F
      Where A.MODELO_CODIGO = F.Modelo_Codigo and F.Tipo_Codigo = :D) ELSE
     (CASE WHEN A.TAMANHO =  14 THEN
     (Select First 1 F.T14 From TbModelo_Ficha_Tecnica F
      Where A.MODELO_CODIGO = F.Modelo_Codigo and F.Tipo_Codigo = :D) ELSE
     (CASE WHEN A.TAMANHO =  15 THEN
     (Select First 1 F.T15 From TbModelo_Ficha_Tecnica F
      Where A.MODELO_CODIGO = F.Modelo_Codigo and F.Tipo_Codigo = :D) ELSE
     (CASE WHEN A.TAMANHO =  16 THEN
     (Select First 1 F.T16 From TbModelo_Ficha_Tecnica F
      Where A.MODELO_CODIGO = F.Modelo_Codigo and F.Tipo_Codigo = :D) ELSE
     (CASE WHEN A.TAMANHO =  17 THEN
     (Select First 1 F.T17 From TbModelo_Ficha_Tecnica F
      Where A.MODELO_CODIGO = F.Modelo_Codigo and F.Tipo_Codigo = :D) ELSE
     (CASE WHEN A.TAMANHO =  18 THEN
     (Select First 1 F.T18 From TbModelo_Ficha_Tecnica F
      Where A.MODELO_CODIGO = F.Modelo_Codigo and F.Tipo_Codigo = :D) ELSE
     (CASE WHEN A.TAMANHO =  19 THEN
     (Select First 1 F.T19 From TbModelo_Ficha_Tecnica F
      Where A.MODELO_CODIGO = F.Modelo_Codigo and F.Tipo_Codigo = :D) ELSE
     (CASE WHEN A.TAMANHO =  20 THEN
     (Select First 1 F.T20 From TbModelo_Ficha_Tecnica F
      Where A.MODELO_CODIGO = F.Modelo_Codigo and F.Tipo_Codigo = :D) ELSE
     (Select First 1 F.Quantidade From TbModelo_Ficha_Tecnica F
      Where A.MODELO_CODIGO = F.Modelo_Codigo and F.Tipo_Codigo = :D)
      END)END)END)END)END)END)END)END)END)END)END)END)END)END)END)END)END)END)END)END)) DENSIDADE,

    A.MATRIZ_CODIGO,
    (Select First 1 G.DESCRICAO From TbMATRIZ G Where A.MATRIZ_CODIGO = G.Codigo),
    (Select First 1 H.LARGURA   From TbMATRIZ H Where A.MATRIZ_CODIGO = H.Codigo),
    A.PRODUTO_CODIGO,A.TAMANHO,A.QUANTIDADE, A.Tolerancia,

    A.CHAPAS,A.PLACAS,A.SOBRAS,A.PLACAS_,A.SOBRAS_,

    A.CONSUMO_MEDIO,A.OBSERVACAO,A.SITUACAO,
    P.Descricao,
    P.Grade_Codigo,
    P.UnidadeMedida_Sigla2,
    P.Cor_Codigo,
    (Select First 1 Coalesce(G.Percentual_Talao,0) From TbCor G Where P.Cor_Codigo = G.Codigo),
    (Select First 1 Coalesce(G.Classe,'0') From TbCor G Where P.Cor_Codigo = G.Codigo),
     A.Programacao_Boca, A.Programacao_Esteira, A.Programacao_Sequencia,
    (Select First 1 E.Descricao From TbEsteira E Where A.Programacao_Esteira = E.Codigo),
     A.HORA_PRODUCAO, A.HORA_LIBERACAO, Coalesce(A.lib, '0'),
    (Select First 1 F.Composicao From TbProduto_Ficha F Where A.PRODUTO_CODIGO = F.PRODUTO_CODIGO) 

From TbRemessa_Item_Processado A, TbProduto P
WHERE A.PRODUTO_CODIGO = P.Codigo
  and A.ESTABELECIMENTO_CODIGO = :ESTABELECIMENTO_1
  and A.FAMILIA_CODIGO = :FAMILIA_1
  and A.REMESSA = :REMESSA_1

Order By 5, 4, (Select First 1 C.Descricao From TbCor C Where C.Codigo = P.Cor_Codigo), A.Controle

INTO
    :REMESSA        ,
    :CONTROLE       ,
    :MODELO_CODIGO  ,
    :MODELO_ESPESSURA,
    :modelo_densidade,
    :MATRIZ_CODIGO  ,
    :MATRIZ_DESCRICAO,
    :MATRIZ_LARGURA ,
    :PRODUTO_CODIGO ,
    :TAMANHO        ,
    :QUANTIDADE     ,
    :TOLERANCIA     ,
    :CHAPAS         ,
    :PLACAS         ,
    :SOBRAS         ,
    :PLACAS_        ,
    :SOBRAS_        ,
    :CONSUMO_MEDIO  ,
    :OBSERVACAO     ,
    :SITUACAO       ,
    :DESCRICAO      ,
    :GRADE_CODIGO   ,
    :UNIDADEMEDIDA_SIGLA ,
    :COR_CODIGO,
    :Percentual_Talao,
    :Classe,
    :Programacao_Boca,
    :Programacao_Esteira,
    :Programacao_Sequencia,
    :Esteira_Descricao,
    :HORA_PRODUCAO,
    :HORA_LIBERACAO,
    :Lib,
    :Composicao
DO SUSPEND;
END
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER procedure SPC_REQUISICAO_BOJO (
    I_REMESSA_ID integer = 44154,
    REMESSA_TALAO_ID integer = 107,
    NAO_PREENCHER integer = null)
returns (
    ESTABELECIMENTO_ID integer,
    REMESSA_ID integer,
    GP_ID integer,
    GP_DESCRICAO varchar(255),
    GP_REQUISITA_SOBRA integer,
    PRODUTO_ID integer,
    PRODUTO_DESCRICAO varchar(255),
    MODELO_ID integer,
    COR_ID integer,
    GRADE_ID integer,
    TAMANHO integer,
    TAMANHO_DESCRICAO varchar(10),
    UM varchar(10),
    HABILITA_REQ_SKU_FECHADO integer,
    HABILITA_REQ_SEM_LIMITE integer,
    QUANTIDADE_TOTAL numeric(15,4),
    QUANTIDADE_PRODUZIDA numeric(15,4),
    QUANTIDADE_ABERTO numeric(15,4),
    REMESSA_ID_APROV integer,
    REMESSA_TALAO_ID_APROV integer,
    QUANTIDADE_APROV numeric(15,4),
    QUANTIDADE_EXTRA numeric(15,4),
    QUANTIDADE_DEFEITO numeric(15,4),
    QUANTIDADE_SOBRA_APROVEITADA numeric(15,4),
    QUANTIDADE_SOBRA numeric(15,4),
    QUANTIDADE_REQUISITADA numeric(15,4),
    QUANTIDADE_REQUISITADA_PENDENTE numeric(15,4),
    PERCENTUAL_TOLERANCIA numeric(15,4),
    QUANTIDADE_TOLERANCIA numeric(15,4),
    QUANTIDADE_SALDO numeric(15,4),
    QUANTIDADE_PLACAS integer,
    REQUISITAR_PLACAS integer,
    PLACAS blob sub_type 1 segment size 80,
    QUANTIDADE_BOJO_PLACA integer,
    QUANTIDADE_PLACA_APROVEITADA integer,
    QUANTIDADE_PARES_APROVEITADA integer,
    SALDO_PARES integer,
    QUANTIDADE_PLACA_ESTOQUE integer)
as
declare variable QTD_SALDO_BOJO numeric(15,4);
declare variable QTD_SALDO_BOJO_PARES integer;
declare variable PECA_DENSIDADE numeric(18,4);
declare variable PECA_ESPESSURA numeric(18,4);
declare variable PECA_LARGURA numeric(18,4);
declare variable PECA_COMPRIMENTO numeric(18,4);
declare variable PECA_COR_ID integer;
declare variable PECA_COR_DESCRICAO varchar(50);
declare variable PECA_SALDO numeric(18,4);
declare variable PECA_QTD_PARES numeric(18,4);
declare variable CONT integer;
begin

    SELECT FIRST 1
           T.ESTABELECIMENTO_ID,
           T.REMESSA_ID, 
           T.PRODUTO_ID,
           T.TAMANHO,
           T.GP_ID
      FROM VWREMESSA_TALAO_DETALHE T
     WHERE T.REMESSA_ID       = :I_REMESSA_ID
       AND T.REMESSA_TALAO_ID = :REMESSA_TALAO_ID
      INTO :ESTABELECIMENTO_ID,
           :REMESSA_ID,
           :PRODUTO_ID,
           :TAMANHO,
           :GP_ID;

    IF ( PRODUTO_ID IS NULL ) THEN
    BEGIN
        EXCEPTION "..." 'TALAO INVALIDO. VERIFIQUE OS DADOS INFORMADOS: REMESSA ' || COALESCE(I_REMESSA_ID,'') || ' TALAO ' || COALESCE(FN_LPAD(REMESSA_TALAO_ID,4,0),'');
    END

    HABILITA_REQ_SKU_FECHADO = COALESCE(FN_PARAMETRO('TBUSUARIO.REQ_SKU_FECHADO',FN_CURRENT_USER_ID()),0);
    HABILITA_REQ_SEM_LIMITE  = COALESCE(FN_PARAMETRO('TBUSUARIO.REQ_SKU_SEM_LIMITE',FN_CURRENT_USER_ID()),0);

    SELECT FIRST 1
           P.DESCRICAO,
           P.MODELO_CODIGO,
           P.COR_CODIGO,
           P.GRADE_CODIGO,
           P.UNIDADEMEDIDA_SIGLA2
      FROM TBPRODUTO P
     WHERE P.CODIGO = :PRODUTO_ID
      INTO :PRODUTO_DESCRICAO,
           :MODELO_ID,
           :COR_ID,
           :GRADE_ID,
           :UM;

    SELECT FIRST 1
           G.DESCRICAO,
           G.REQUISITA_SOBRA
      FROM TBGP G
     WHERE G.ID = :GP_ID
      INTO GP_DESCRICAO,
           GP_REQUISITA_SOBRA;


    TAMANHO_DESCRICAO = FN_TAMANHO_GRADE(GRADE_ID,TAMANHO);


    QUANTIDADE_TOTAL = COALESCE((
        SELECT SUM(D.QUANTIDADE) QUANTIDADE
          FROM VWREMESSA_TALAO_DETALHE D
         WHERE D.REMESSA_ID        = :REMESSA_ID
           AND D.PRODUTO_ID        = :PRODUTO_ID
           AND D.TAMANHO           = :TAMANHO
           AND D.GP_ID             = :GP_ID
           AND D.REMESSA_TALAO_ID  < 8000
    ),0);

    QUANTIDADE_PRODUZIDA = COALESCE((
        SELECT SUM(D.QUANTIDADE)
          FROM VWREMESSA_TALAO_DETALHE D
         WHERE D.GP_ID            = :GP_ID
           AND D.REMESSA_ID       = :REMESSA_ID
           AND D.PRODUTO_ID       = :PRODUTO_ID
           AND D.TAMANHO          = :TAMANHO
           AND D.REMESSA_TALAO_ID < 8000
           AND D.DATA_PRODUCAO IS NOT NULL
    ),0);

    QUANTIDADE_ABERTO = QUANTIDADE_TOTAL - QUANTIDADE_PRODUZIDA;
        
    if ( COALESCE(NAO_PREENCHER,0) = 0 ) then
    BEGIN
    SELECT FIRST 1
        X.REMESSA_ID,
        X.REMESSA_TALAO_ID,
        (SELECT FIRST 1 SALDO_PARES FROM SPC_REQUISICAO_BOJO_V2(REMESSA_ID,REMESSA_TALAO_ID,1)) SALDO_ANTERIOR
    FROM (
        SELECT
            P.GP_ID,
            P.PRODUTO_ID,
            P.TAMANHO,
            P.REMESSA_ID,
            (SELECT FIRST 1 D.ID
              FROM VWREMESSA_TALAO_DETALHE D
             WHERE D.REMESSA_ID = P.REMESSA_ID
               AND D.GP_ID = P.GP_ID
               AND D.PRODUTO_ID = P.PRODUTO_ID
               AND D.TAMANHO = P.TAMANHO
               AND D.DATA_PRODUCAO IS NULL) PRODUZIDO,
            MIN(P.REMESSA_TALAO_ID) REMESSA_TALAO_ID,
            MIN(R.DATA) DATA
        FROM
            VWREMESSA_TALAO P,
            VWREMESSA R,
            VWREMESSA R2,
            TBPRODUTO G1,
            TBPRODUTO G2,
            TBMODELO  F1,
            TBMODELO  F2
        WHERE G1.CODIGO      = :PRODUTO_ID
        AND F1.CODIGO        = G1.MODELO_CODIGO
        AND F1.MODELO_PAI    = F2.MODELO_PAI
        AND G2.MODELO_CODIGO = F2.CODIGO
        AND G2.CODIGO        = P.PRODUTO_ID
        AND G1.COR_CODIGO    = G2.COR_CODIGO
        AND P.TAMANHO        = :TAMANHO
        AND P.GP_ID          = :GP_ID
        AND R2.REMESSA_ID    = :REMESSA_ID
        AND R.REMESSA_ID     = P.REMESSA_ID
        --AND R.REMESSA_ID        <> R2.REMESSA_ID
        AND IIF(P.remessa_id = R2.remessa_id, P.remessa_talao_id <> :REMESSA_TALAO_ID, P.remessa_id <> R2.remessa_id)
        AND R.DATA              <= R2.DATA
        AND P.REMESSA_TALAO_ID  < 8000
        AND DATEDIFF(DAY, R.DATA, CURRENT_DATE) <= 7 /*7 DIAS DE DIFERENCA A PARTIR DA DATA DA REMESSA BASE*/
        GROUP BY 1,2,3,4
        ORDER BY DATA DESC
        ) X
    WHERE
        X.PRODUZIDO IS NULL
    INTO
        REMESSA_ID_APROV,
        REMESSA_TALAO_ID_APROV,
        QUANTIDADE_APROV;    
    END

    QUANTIDADE_APROV = COALESCE(QUANTIDADE_APROV,0);

    QUANTIDADE_EXTRA = COALESCE((
        SELECT SUM(T.QUANTIDADE) QUANTIDADE
          FROM VWREMESSA_TALAO T
         WHERE T.REMESSA_TALAO_ID BETWEEN 8000 AND 8999
           AND T.GP_ID            = :GP_ID
           AND T.REMESSA_ID       = :REMESSA_ID
           AND T.PRODUTO_ID       = :PRODUTO_ID
           AND T.TAMANHO          = :TAMANHO
    ),0);

    QUANTIDADE_DEFEITO = COALESCE((
        SELECT SUM(I.QUANTIDADE)
          FROM TBDEFEITO_TRANSACAO_ITEM I
         WHERE I.ESTEIRA_ID = :GP_ID
           AND I.REMESSA    = :REMESSA_ID
           AND I.PRODUTO_ID = :PRODUTO_ID
           AND I.TAMANHO    = :TAMANHO
    ),0);

    QUANTIDADE_SOBRA_APROVEITADA = COALESCE((
        SELECT SUM(S.QUANTIDADE)
          FROM TBREQUISICAO R,
               TBREQUISICAO_SOBRA S
         WHERE R.REMESSA       = :REMESSA_ID
           AND R.PRODUTO_ID    = :PRODUTO_ID
           AND R.TAMANHO       = :TAMANHO
           AND R.GP_ID         = :GP_ID
           AND S.REQUISICAO_ID = R.ID
    ),0);


    SELECT SUM(S.QUANTIDADE), SUM(S.PARES)
      FROM TBREQUISICAO R,
           TBREQUISICAO_PLACA S
     WHERE R.REMESSA       = :REMESSA_ID
       AND R.PRODUTO_ID    = :PRODUTO_ID
       AND R.TAMANHO       = :TAMANHO
       AND R.GP_ID         = :GP_ID
       AND S.REQUISICAO_ID = R.ID
       and s.status < 3
    into QUANTIDADE_PLACA_APROVEITADA, QUANTIDADE_PARES_APROVEITADA;

    QUANTIDADE_PLACA_APROVEITADA = COALESCE(QUANTIDADE_PLACA_APROVEITADA, 0);
    QUANTIDADE_PARES_APROVEITADA = COALESCE(QUANTIDADE_PARES_APROVEITADA, 0);

    QUANTIDADE_SOBRA = COALESCE((
        SELECT SUM(S.SALDO - COALESCE((SELECT SUM(R.SALDO) FROM TBREQUISICAO_SOBRA R WHERE R.SOBRA_ID = S.ID AND R.STATUS = '0'),0.0000))
        FROM
            TBSOBRA S
        WHERE
            S.STATUS             = '1'
        AND S.ESTABELECIMENTO_ID = :ESTABELECIMENTO_ID
        AND S.TAMANHO            = :TAMANHO
        AND S.PRODUTO_ID IN (
            SELECT P.CODIGO
              FROM TBMODELO M,
                   TBPRODUTO P,
                  (SELECT P.MODELO_CODIGO MODELO_ID,
                          P.COR_CODIGO COR_ID,
                         (SELECT MODELO_PAI
                            FROM TBMODELO
                           WHERE CODIGO     = P.MODELO_CODIGO
                             AND MODELO_PAI > 0) MODELO_PAI
                     FROM TBPRODUTO P
                    WHERE P.CODIGO = :PRODUTO_ID) A
             WHERE A.COR_ID      = P.COR_CODIGO
               AND M.CODIGO      = P.MODELO_CODIGO
               AND (A.MODELO_ID  = M.CODIGO
                OR A.MODELO_ID  = M.MODELO_PAI
                OR A.MODELO_PAI = M.CODIGO
                OR A.MODELO_PAI = M.MODELO_PAI))
    ),0);

    QUANTIDADE_REQUISITADA = COALESCE((
        SELECT SUM(R.QUANTIDADE)
          FROM TBREQUISICAO R
         WHERE R.GP_ID      = :GP_ID
           AND R.REMESSA    = :REMESSA_ID
           AND R.PRODUTO_ID = :PRODUTO_ID
           AND R.TAMANHO    = :TAMANHO
    ),0);

    QUANTIDADE_REQUISITADA_PENDENTE = COALESCE((
        SELECT SUM(R.QUANTIDADE)
          FROM TBREQUISICAO R
         WHERE R.GP_ID      = :GP_ID
           AND R.REMESSA    = :REMESSA_ID
           AND R.PRODUTO_ID = :PRODUTO_ID
           AND R.TAMANHO    = :TAMANHO
           AND COALESCE(R.REMESSA_GERADA,0) = 0
    ),0);

    PERCENTUAL_TOLERANCIA = COALESCE(NULLIF(FN_PARAMETRO('SISTEMA.PERC_DEF_REQ'),''),0);

    QUANTIDADE_TOLERANCIA = FN_ARRENDONDAR((PERCENTUAL_TOLERANCIA/100) * QUANTIDADE_DEFEITO,0,2);

    QUANTIDADE_SALDO = (QUANTIDADE_DEFEITO + QUANTIDADE_TOLERANCIA + QUANTIDADE_APROV) - QUANTIDADE_EXTRA - QUANTIDADE_REQUISITADA - QUANTIDADE_SOBRA_APROVEITADA - QUANTIDADE_PARES_APROVEITADA;
    QUANTIDADE_SALDO = IIF(QUANTIDADE_SALDO < 0,0,QUANTIDADE_SALDO);
    SALDO_PARES      = QUANTIDADE_SALDO;

    QUANTIDADE_SOBRA = iif(QUANTIDADE_SALDO > QUANTIDADE_SOBRA, QUANTIDADE_SOBRA , QUANTIDADE_SALDO   );
    QUANTIDADE_SALDO = iif(QUANTIDADE_SALDO > QUANTIDADE_SOBRA, QUANTIDADE_SALDO - QUANTIDADE_SOBRA, 0);

    QTD_SALDO_BOJO = QUANTIDADE_SALDO;

    QTD_SALDO_BOJO_PARES = QUANTIDADE_SALDO;
    REQUISITAR_PLACAS    = 0;
    QUANTIDADE_PLACAS    = 0;
    PECA_QTD_PARES       = 0;
    PLACAS               = null;
    QUANTIDADE_PLACA_ESTOQUE = 0;

    for
        select
            DENSIDADE,
            ESPESSURA,
            LARGURA,
            COMPRIMENTO,
            COR_ID,
            COR_DESCRICAO,
            SALDO,
            PACA_QTD_PARES

        from SPC_REQUISICAO_PLACA(:REMESSA_ID, :REMESSA_TALAO_ID)
        where saldo > 0
    into
        PECA_DENSIDADE,
        PECA_ESPESSURA,
        PECA_LARGURA,
        PECA_COMPRIMENTO,
        PECA_COR_ID,
        PECA_COR_DESCRICAO,
        PECA_SALDO,
        PECA_QTD_PARES
    do begin

        QUANTIDADE_PLACA_ESTOQUE = QUANTIDADE_PLACA_ESTOQUE + PECA_SALDO;

        if(REQUISITAR_PLACAS = 0)then
        begin
           QTD_SALDO_BOJO = fn_arrendondar_para_cima(QTD_SALDO_BOJO / PECA_QTD_PARES);
        end

       REQUISITAR_PLACAS = 1;

       if( QTD_SALDO_BOJO > 0 )then
       begin

            if(QTD_SALDO_BOJO <= PECA_SALDO)then
            begin

                PLACAS = coalesce(PLACAS||',','[')||fn_to_json_v2(
                    fn_to_par_json('PECA_DENSIDADE'     ,coalesce(PECA_DENSIDADE,0)),
                    fn_to_par_json('PECA_ESPESSURA'     ,coalesce(PECA_ESPESSURA,0)),
                    fn_to_par_json('PECA_LARGURA'       ,coalesce(PECA_LARGURA,0)),
                    fn_to_par_json('PECA_COMPRIMENTO'   ,coalesce(PECA_COMPRIMENTO,0)),
                    fn_to_par_json('PECA_COR_ID'        ,coalesce(PECA_COR_ID,0)),
                    fn_to_par_json('PECA_COR_DESCRICAO' ,coalesce(PECA_COR_DESCRICAO,'')),
                    fn_to_par_json('PECA_SALDO'         ,coalesce(PECA_SALDO,0)),
                    fn_to_par_json('PECA_QTD_PARES'     ,coalesce(PECA_QTD_PARES,0)),
                    fn_to_par_json('QTD'                ,coalesce(QTD_SALDO_BOJO,0))
                );

                QUANTIDADE_PLACAS    = QUANTIDADE_PLACAS + QTD_SALDO_BOJO;
                QTD_SALDO_BOJO       = 0;
                QTD_SALDO_BOJO_PARES = 0;

            end else
            begin

                QTD_SALDO_BOJO = QTD_SALDO_BOJO - PECA_SALDO;
                QUANTIDADE_PLACAS = QUANTIDADE_PLACAS + PECA_SALDO;

                QTD_SALDO_BOJO_PARES = QTD_SALDO_BOJO_PARES - (PECA_SALDO * PECA_QTD_PARES);

                PLACAS = coalesce(PLACAS||',','[')||fn_to_json_v2(
                    fn_to_par_json('PECA_DENSIDADE'     ,coalesce(PECA_DENSIDADE,0)),
                    fn_to_par_json('PECA_ESPESSURA'     ,coalesce(PECA_ESPESSURA,0)),
                    fn_to_par_json('PECA_LARGURA'       ,coalesce(PECA_LARGURA,0)),
                    fn_to_par_json('PECA_COMPRIMENTO'   ,coalesce(PECA_COMPRIMENTO,0)),
                    fn_to_par_json('PECA_COR_ID'        ,coalesce(PECA_COR_ID,0)),
                    fn_to_par_json('PECA_COR_DESCRICAO' ,coalesce(PECA_COR_DESCRICAO,'')),
                    fn_to_par_json('PECA_SALDO'         ,coalesce(PECA_SALDO,0)),
                    fn_to_par_json('PECA_QTD_PARES'     ,coalesce(PECA_QTD_PARES,0)),
                    fn_to_par_json('QTD'                ,coalesce(PECA_SALDO,0))
                );

                /*
                PLACAS = coalesce(PLACAS||',','[')||fn_to_json(
                    fn_to_par_json('PECA_DENSIDADE'     ,PECA_DENSIDADE),
                    fn_to_par_json('PECA_ESPESSURA'     ,PECA_ESPESSURA),
                    fn_to_par_json('PECA_LARGURA'       ,PECA_LARGURA),
                    fn_to_par_json('PECA_COMPRIMENTO'   ,PECA_COMPRIMENTO),
                    fn_to_par_json('PECA_COR_ID'        ,PECA_COR_ID),
                    fn_to_par_json('PECA_COR_DESCRICAO' ,PECA_COR_DESCRICAO),
                    fn_to_par_json('PECA_SALDO'         ,PECA_SALDO),
                    fn_to_par_json('PECA_QTD_PARES'     ,PECA_QTD_PARES),
                    fn_to_par_json('QTD'                ,PECA_SALDO)
                );
                */

            end

       end
    end

    PLACAS = coalesce(PLACAS,'[')||']';

    if(PLACAS = '[]')then
    begin
        REQUISITAR_PLACAS = 0;
        QUANTIDADE_PLACAS = 0;
    end

    if(REQUISITAR_PLACAS = 1 and PECA_QTD_PARES > 0)then
    begin
        QUANTIDADE_SALDO = QTD_SALDO_BOJO_PARES;
    end

    QUANTIDADE_BOJO_PLACA = PECA_QTD_PARES;

    suspend;
end
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER procedure SPC_REQUISICAO_BOJO_V2 (
    I_REMESSA_ID integer = 44154,
    REMESSA_TALAO_ID integer = 107,
    NAO_PREENCHER integer = null)
returns (
    ESTABELECIMENTO_ID integer,
    REMESSA_ID integer,
    GP_ID integer,
    GP_DESCRICAO varchar(255),
    GP_REQUISITA_SOBRA integer,
    PRODUTO_ID integer,
    PRODUTO_DESCRICAO varchar(255),
    MODELO_ID integer,
    COR_ID integer,
    GRADE_ID integer,
    TAMANHO integer,
    TAMANHO_DESCRICAO varchar(10),
    UM varchar(10),
    HABILITA_REQ_SKU_FECHADO integer,
    HABILITA_REQ_SEM_LIMITE integer,
    QUANTIDADE_TOTAL numeric(15,4),
    QUANTIDADE_PRODUZIDA numeric(15,4),
    QUANTIDADE_ABERTO numeric(15,4),
    REMESSA_ID_APROV integer,
    REMESSA_TALAO_ID_APROV integer,
    QUANTIDADE_APROV numeric(15,4),
    QUANTIDADE_EXTRA numeric(15,4),
    QUANTIDADE_DEFEITO numeric(15,4),
    QUANTIDADE_SOBRA_APROVEITADA numeric(15,4),
    QUANTIDADE_SOBRA numeric(15,4),
    QUANTIDADE_REQUISITADA numeric(15,4),
    QUANTIDADE_REQUISITADA_PENDENTE numeric(15,4),
    PERCENTUAL_TOLERANCIA numeric(15,4),
    QUANTIDADE_TOLERANCIA numeric(15,4),
    QUANTIDADE_SALDO numeric(15,4),
    QUANTIDADE_PLACAS integer,
    REQUISITAR_PLACAS integer,
    PLACAS blob sub_type 1 segment size 80,
    QUANTIDADE_BOJO_PLACA integer,
    QUANTIDADE_PLACA_APROVEITADA integer,
    QUANTIDADE_PARES_APROVEITADA integer,
    SALDO_PARES integer,
    QUANTIDADE_PLACA_ESTOQUE integer)
as
declare variable QTD_SALDO_BOJO numeric(15,4);
declare variable QTD_SALDO_BOJO_PARES integer;
declare variable PECA_DENSIDADE numeric(18,4);
declare variable PECA_ESPESSURA numeric(18,4);
declare variable PECA_LARGURA numeric(18,4);
declare variable PECA_COMPRIMENTO numeric(18,4);
declare variable PECA_COR_ID integer;
declare variable PECA_COR_DESCRICAO varchar(50);
declare variable PECA_SALDO numeric(18,4);
declare variable PECA_QTD_PARES numeric(18,4);
declare variable CONT integer;
begin

    SELECT FIRST 1
           T.ESTABELECIMENTO_ID,
           T.REMESSA_ID, 
           T.PRODUTO_ID,
           T.TAMANHO,
           T.GP_ID
      FROM VWREMESSA_TALAO_DETALHE T
     WHERE T.REMESSA_ID       = :I_REMESSA_ID
       AND T.REMESSA_TALAO_ID = :REMESSA_TALAO_ID
      INTO :ESTABELECIMENTO_ID,
           :REMESSA_ID,
           :PRODUTO_ID,
           :TAMANHO,
           :GP_ID;

    IF ( PRODUTO_ID IS NULL ) THEN
    BEGIN
        EXCEPTION "..." 'TALAO INVALIDO. VERIFIQUE OS DADOS INFORMADOS: REMESSA ' || COALESCE(I_REMESSA_ID,'') || ' TALAO ' || COALESCE(FN_LPAD(REMESSA_TALAO_ID,4,0),'');
    END

    HABILITA_REQ_SKU_FECHADO = COALESCE(FN_PARAMETRO('TBUSUARIO.REQ_SKU_FECHADO',FN_CURRENT_USER_ID()),0);
    HABILITA_REQ_SEM_LIMITE  = COALESCE(FN_PARAMETRO('TBUSUARIO.REQ_SKU_SEM_LIMITE',FN_CURRENT_USER_ID()),0);

    SELECT FIRST 1
           P.DESCRICAO,
           P.MODELO_CODIGO,
           P.COR_CODIGO,
           P.GRADE_CODIGO,
           P.UNIDADEMEDIDA_SIGLA2
      FROM TBPRODUTO P
     WHERE P.CODIGO = :PRODUTO_ID
      INTO :PRODUTO_DESCRICAO,
           :MODELO_ID,
           :COR_ID,
           :GRADE_ID,
           :UM;

    SELECT FIRST 1
           G.DESCRICAO,
           G.REQUISITA_SOBRA
      FROM TBGP G
     WHERE G.ID = :GP_ID
      INTO GP_DESCRICAO,
           GP_REQUISITA_SOBRA;


    TAMANHO_DESCRICAO = FN_TAMANHO_GRADE(GRADE_ID,TAMANHO);


    QUANTIDADE_TOTAL = COALESCE((
        SELECT SUM(D.QUANTIDADE) QUANTIDADE
          FROM VWREMESSA_TALAO_DETALHE D
         WHERE D.REMESSA_ID        = :REMESSA_ID
           AND D.PRODUTO_ID        = :PRODUTO_ID
           AND D.TAMANHO           = :TAMANHO
           AND D.GP_ID             = :GP_ID
           AND D.REMESSA_TALAO_ID  < 8000
    ),0);

    QUANTIDADE_PRODUZIDA = COALESCE((
        SELECT SUM(D.QUANTIDADE)
          FROM VWREMESSA_TALAO_DETALHE D
         WHERE D.GP_ID            = :GP_ID
           AND D.REMESSA_ID       = :REMESSA_ID
           AND D.PRODUTO_ID       = :PRODUTO_ID
           AND D.TAMANHO          = :TAMANHO
           AND D.REMESSA_TALAO_ID < 8000
           AND D.DATA_PRODUCAO IS NOT NULL
    ),0);

    QUANTIDADE_ABERTO = QUANTIDADE_TOTAL - QUANTIDADE_PRODUZIDA;
        
    if ( COALESCE(NAO_PREENCHER,0) = 0 ) then
    BEGIN
    SELECT FIRST 1
        X.REMESSA_ID,
        X.REMESSA_TALAO_ID,
        (SELECT FIRST 1 SALDO_PARES FROM SPC_REQUISICAO_BOJO_V2(REMESSA_ID,REMESSA_TALAO_ID,1)) SALDO_ANTERIOR
    FROM (
        SELECT
            P.GP_ID,
            P.PRODUTO_ID,
            P.TAMANHO,
            P.REMESSA_ID,
            (SELECT FIRST 1 D.ID
              FROM VWREMESSA_TALAO_DETALHE D
             WHERE D.REMESSA_ID = P.REMESSA_ID
               AND D.GP_ID = P.GP_ID
               AND D.PRODUTO_ID = P.PRODUTO_ID
               AND D.TAMANHO = P.TAMANHO
               AND D.DATA_PRODUCAO IS NULL) PRODUZIDO,
            MIN(P.REMESSA_TALAO_ID) REMESSA_TALAO_ID,
            MIN(R.DATA) DATA
        FROM
            VWREMESSA_TALAO P,
            VWREMESSA R,
            VWREMESSA R2,
            TBPRODUTO G1,
            TBPRODUTO G2,
            TBMODELO  F1,
            TBMODELO  F2
        WHERE G1.CODIGO      = :PRODUTO_ID
        AND F1.CODIGO        = G1.MODELO_CODIGO
        AND F1.MODELO_PAI    = F2.MODELO_PAI
        AND G2.MODELO_CODIGO = F2.CODIGO
        AND G2.CODIGO        = P.PRODUTO_ID
        AND G1.COR_CODIGO    = G2.COR_CODIGO
        AND P.TAMANHO        = :TAMANHO
        AND P.GP_ID          = :GP_ID
        AND R2.REMESSA_ID    = :REMESSA_ID
        AND R.REMESSA_ID     = P.REMESSA_ID
        --AND R.REMESSA_ID        <> R2.REMESSA_ID
        AND IIF(P.remessa_id = R2.remessa_id, P.remessa_talao_id <> :REMESSA_TALAO_ID, P.remessa_id <> R2.remessa_id)
        AND R.DATA              <= R2.DATA
        AND P.REMESSA_TALAO_ID  < 8000
        AND DATEDIFF(DAY, R.DATA, CURRENT_DATE) <= 7 /*7 DIAS DE DIFERENCA A PARTIR DA DATA DA REMESSA BASE*/
        GROUP BY 1,2,3,4
        ORDER BY DATA DESC
        ) X
    WHERE
        X.PRODUZIDO IS NULL
    INTO
        REMESSA_ID_APROV,
        REMESSA_TALAO_ID_APROV,
        QUANTIDADE_APROV;    
    END

    QUANTIDADE_APROV = COALESCE(QUANTIDADE_APROV,0);

    QUANTIDADE_EXTRA = COALESCE((
        SELECT SUM(T.QUANTIDADE) QUANTIDADE
          FROM VWREMESSA_TALAO T
         WHERE T.REMESSA_TALAO_ID BETWEEN 8000 AND 8999
           AND T.GP_ID            = :GP_ID
           AND T.REMESSA_ID       = :REMESSA_ID
           AND T.PRODUTO_ID       = :PRODUTO_ID
           AND T.TAMANHO          = :TAMANHO
    ),0);

    QUANTIDADE_DEFEITO = COALESCE((
