INSERT INTO TBPARAMETRO (TABELA, CODIGO, DESCRICAO, VALOR, OBSERVACAO, GRUPO) 
	VALUES ('SISTEMA', 'PERMITE_CONF_SEM_ALOC', 'PERMITE FINALIZAR CONFERENCIA SEM ALOCACAO DE PECAS', '0', '0 - NÃO;1 - SIM;', 'WEB14210');
	
/*****************************************************************************/	
	
SET TERM ^ ;

CREATE OR ALTER procedure SPU_TRATA_PED_ITEM_ESTOQUE4 (
    PEDIDO_1 integer,
    CONTROLE_1 integer,
    QTD_ALOCACAO numeric(15,4),
    ALOCDESALOC char(1))
returns (
    ESTABELECIMENTO_ID integer,
    PEDIDO integer,
    CONTROLE integer,
    QTD_PRD numeric(15,4),
    QTD_DISP numeric(15,4),
    REMESSA integer,
    TALAO integer,
    PRODUTO_ID integer,
    MODELO_CODIGO integer,
    LOCALIZACAO_ID integer,
    TAMANHO integer,
    REM_STATUS char(1),
    QTD_MULT integer,
    ALOC_MULT char(1))
as
declare variable VDESC_COR_ERR varchar(100) collate UTF8;
declare variable VDESC_MODELO_ERR varchar(200) collate UTF8;
declare variable VTAMANHO_DESC_ERR varchar(15) collate UTF8;
declare variable VTAMANHO_ERR integer;
declare variable VPRODUTO_DESC_ERR varchar(150) collate UTF8;
declare variable VPRODUTO_DESC_ID_ERR varchar(10) collate UTF8;
declare variable VPRODUTO_ID_ERR integer;
declare variable VQTD_PRD numeric(15,4);
declare variable VQTD_DISP numeric(15,4);
declare variable PARAMETRO_VERIF varchar(500);
BEGIN
FOR 
Select First 1 A.Estabelecimento_Codigo, A.Pedido, a.modelo_codigo, A.Controle, A.Produto_Codigo,
               A.Localizacao_Id, A.Tamanho,
               Coalesce((Select First 1 T.Status From TbRemessa_Item_Tratamento T
                          Where T.Tabela_Id = A.Pedido
                            and T.Tab_Item_Id = A.Controle
                            and T.ESTABELECIMENTO_ID = A.ESTABELECIMENTO_CODIGO
                            AND T.TAMANHO = A.TAMANHO
                            and T.Status = '1'),'0') Rem_Status,
               Coalesce((Select First 1 C.Quantidade From TbPedido_Item_Saldo C
                          Where C.Pedido = A.Pedido and C.PEDIDO_ITEM_CONTROLE = A.Controle),0.0000)
               -A.Qtd_Est-A.Qtd_Agp-A.Qtd_Rem,

       Coalesce((Select First 1 IIF(A.TAMANHO = 1,MPC.MU01,IIF(A.TAMANHO = 2,MPC.MU02,
                                IIF(A.TAMANHO = 3,MPC.MU03,IIF(A.TAMANHO = 4,MPC.MU04,
                                IIF(A.TAMANHO = 5,MPC.MU05,IIF(A.TAMANHO = 6,MPC.MU06,
                                IIF(A.TAMANHO = 7,MPC.MU07,IIF(A.TAMANHO = 8,MPC.MU08,
                                IIF(A.TAMANHO = 9,MPC.MU09,IIF(A.TAMANHO =10,MPC.MU10,
                                IIF(A.TAMANHO =11,MPC.MU11,IIF(A.TAMANHO =12,MPC.MU12,
                                IIF(A.TAMANHO =13,MPC.MU13,IIF(A.TAMANHO =14,MPC.MU14,
                                IIF(A.TAMANHO =15,MPC.MU15,IIF(A.TAMANHO =16,MPC.MU16,
                                IIF(A.TAMANHO =17,MPC.MU17,IIF(A.TAMANHO =18,MPC.MU18,
                                IIF(A.TAMANHO =19,MPC.MU19,IIF(A.TAMANHO =20,MPC.MU20,
                                1))))))))))))))))))))
                   From TBMODELO_PEDIDO_COTA MPC Where Modelo_Id = A.Modelo_Codigo),1) Qtd_Mult,

                  (Select First 1 Coalesce(PF.Alocar_Multiplo,'0')
                     From TbPedido P, TbPerfil PF
                    Where P.Pedido = A.Pedido
                      and P.Classificacao = PF.Id
                      and PF.Tabela = 'PED') aloc_mult

  From TbPedido_Item A
 Where Pedido = :Pedido_1
   and Controle = :Controle_1
   and Situacao = 1
   and Tamanho > 0
 --For Update
   With Lock
Into :Estabelecimento_Id, :Pedido, :modelo_codigo, :Controle,
     :Produto_Id, :Localizacao_Id, :Tamanho, :Rem_Status, :Qtd_Prd, :Qtd_Mult, :aloc_mult
Do

if (:Rem_Status = '0') then
     Begin

      if (:AlocDesaloc = 'D') then
          Begin
            Delete from TBESTOQUE_DETALHE_ALOCACAO
            Where Estabelecimento_id = :Estabelecimento_Id
              and Tabela_id =  :Pedido
              and Tab_item_id = :Controle
              and Tipo = 'P'
              and Produto_Id = :Produto_Id
              and Tamanho = :Tamanho
              and Saldo > 0;
          End
        
      if (:AlocDesaloc = 'A') then
           Begin
    
            IF(:Qtd_Mult = 0)THEN
            BEGIN
               exception "..." 'Modelo '||:modelo_codigo||' sem cota definida no tamanho '||:Tamanho;
            END
            
           vQtd_Prd = iif(:QTD_ALOCACAO > :Qtd_Prd, :Qtd_Prd, :QTD_ALOCACAO);
           if (Mod(:vQtd_Prd,:Qtd_Mult) > 0 and :aloc_mult = '1') Then
               Begin
               :vQtd_Prd = :vQtd_Prd - (Mod(:vQtd_Prd,:Qtd_Mult));
               End

           if (:vQtd_Prd > 0) then
              Begin
        
              For
              Select First 1
                Cast(IIF(:Tamanho =  0, A.Saldo,
                     IIF(:Tamanho =  1, A.T01_Saldo,IIF(:Tamanho =  2, A.T02_Saldo,
                     IIF(:Tamanho =  3, A.T03_Saldo,IIF(:Tamanho =  4, A.T04_Saldo,
                     IIF(:Tamanho =  5, A.T05_Saldo,IIF(:Tamanho =  6, A.T06_Saldo,
                     IIF(:Tamanho =  7, A.T07_Saldo,IIF(:Tamanho =  8, A.T08_Saldo,
                     IIF(:Tamanho =  9, A.T09_Saldo,IIF(:Tamanho = 10, A.T10_Saldo,
                     IIF(:Tamanho = 11, A.T11_Saldo,IIF(:Tamanho = 12, A.T12_Saldo,
                     IIF(:Tamanho = 13, A.T13_Saldo,IIF(:Tamanho = 14, A.T14_Saldo,
                     IIF(:Tamanho = 15, A.T15_Saldo,IIF(:Tamanho = 16, A.T16_Saldo,
                     IIF(:Tamanho = 17, A.T17_Saldo,IIF(:Tamanho = 18, A.T18_Saldo,
                     IIF(:Tamanho = 19, A.T19_Saldo,IIF(:Tamanho = 20, A.T20_Saldo,
                     0))))))))))))))))))))) As Numeric(15,4))
              -(Coalesce(
               (Select First 1 ESA.QUANTIDADE
                  From TBESTOQUE_SALDO_ALOCACAO ESA
                 Where ESA.ESTABELECIMENTO_ID = A.Estabelecimento_Codigo
                   and ESA.LOCALIZACAO_ID = A.Localizacao_Codigo
                   and ESA.PRODUTO_ID = A.Produto_Codigo
                   and ESA.TAMANHO = :Tamanho),0))
        
                  From TbEstoque_Saldo A
                 Where A.Estabelecimento_Codigo = :Estabelecimento_Id
                   and A.Localizacao_Codigo = :Localizacao_Id
                   and A.Produto_Codigo = :Produto_Id
                  Into :Qtd_Disp
                    Do
                       Begin

                        IF (:vQtd_Prd > :Qtd_Disp) THEN
                        BEGIN
                        
                            FOR
                            SELECT FIRST 1
                                T.CODIGO AS ID,
                                FN_LPAD(T.CODIGO, 7, '0') AS DESC_ID,
                                T.DESCRICAO,
                            
                                :Tamanho AS TAMANHO,
                                IIF(:Tamanho > 0, (SELECT TAM_DESCRICAO FROM SP_TAMANHO_GRADE(T.GRADE_CODIGO, :Tamanho)), '') AS TAMANHO_DESC,
                        
                                FN_LPAD(A.CODIGO, 6, '0')||' - '||A.DESCRICAO AS DESC_MODELO,
                            
                                FN_LPAD(B.CODIGO, 6, '0')||' - '||B.DESCRICAO AS DESC_COR
                            
                            FROM TBPRODUTO T
                            LEFT JOIN TBMODELO A ON A.CODIGO = T.MODELO_CODIGO
                            LEFT JOIN TBCOR B ON B.CODIGO = T.COR_CODIGO
                            WHERE T.CODIGO = :Produto_Id
                            AND T.MODELO_CODIGO = :modelo_codigo
                            INTO :vproduto_id_err, :vproduto_desc_id_err, :vproduto_desc_err, :vtamanho_err, :vtamanho_desc_err, :vdesc_modelo_err, :vdesc_cor_err
                                DO
                                BEGIN

                                    :PARAMETRO_VERIF = COALESCE((SELECT FIRST 1 FN_PARAMETRO('SISTEMA.PERMITE_CONF_SEM_ALOC') FROM RDB$DATABASE), '0');

                                    IF (:PARAMETRO_VERIF = '0') THEN
                                    BEGIN

                                        exception "..." 'MODELO:'||:vdesc_modelo_err||', COR:'||:vdesc_cor_err||', TAMANHO:'||:vtamanho_desc_err||'<br> NÃO HÁ SALDO DISPONÍVEL PARA ALOCAÇÃO! <br><br>QUANTIDADE DISPONÍVEL: '||FN_FORMAT_NUMBER2(:Qtd_Disp, 4)||'<br>QUANTIDADE NECESSÁRIA: '||FN_FORMAT_NUMBER2(:vQtd_Prd, 4);

                                    END

                                END
                        END

                       if (:Qtd_Disp > 0) then
                            Begin

                            vQtd_Disp = Qtd_Disp;
        
                            if (Mod(:vQtd_Disp,:Qtd_Mult) > 0 and :aloc_mult = '1') Then
                                Begin
                                 :vQtd_Disp = :vQtd_Disp - (Mod(:vQtd_Disp,:Qtd_Mult));
                                End

                            IF (:vQtd_Prd <= :vQtd_Disp and :vQtd_Disp > 0) Then
                               Begin
                                insert into TBESTOQUE_DETALHE_ALOCACAO ( 
                                estabelecimento_id, tabela_id, tab_item_id, tipo, localizacao_id,
                                produto_id, tamanho, Quantidade, Saldo)
                                values (:estabelecimento_id, :Pedido, :Controle, 'P',
                                :localizacao_id, :produto_id, :tamanho, :vQtd_Prd, :vQtd_Prd);
        
                                Delete From TbPedido_Consumo
                                Where Estabelecimento_Id = :Estabelecimento_Id
                                  and Pedido_Id = :Pedido
                                  and Pedido_Item_Id = :Controle
                                  and Tamanho_Item = :Tamanho
                                  and Tipo = 'C';
        
                               End else
                            IF (:vQtd_Prd > :vQtd_Disp and :vQtd_Disp > 0) Then
                               Begin
                                insert into TBESTOQUE_DETALHE_ALOCACAO ( 
                                estabelecimento_id, tabela_id, tab_item_id, tipo, localizacao_id,
                                produto_id, tamanho, Quantidade, Saldo)
                                values (:estabelecimento_id, :Pedido, :Controle, 'P',
                                :localizacao_id, :produto_id, :tamanho, :vQtd_Disp, :vQtd_Disp);
        
                                Delete From TbPedido_Consumo
                                Where Estabelecimento_Id = :Estabelecimento_Id
                                  and Pedido_Id = :Pedido
                                  and Pedido_Item_Id = :Controle
                                  and Tamanho_Item = :Tamanho
                                  and Tipo = 'C';
                               End
                
                            End
                          End
                    End
           End
     End
End
^

SET TERM ; ^

