SET TERM ^ ;

CREATE OR ALTER PROCEDURE SPU_TRATA_PEDIDO_ESTOQUE5 (
    PEDIDO_1 INTEGER,
    ALOCDESALOC CHAR(1),
    MODELO_ID INTEGER = 0)
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,
    LOCALIZACAO_ID INTEGER,
    TAMANHO INTEGER,
    REM_STATUS CHAR(1),
    QTD_MULT INTEGER)
AS
DECLARE VARIABLE VQTD_PRD NUMERIC(15,4);
DECLARE VARIABLE VQTD_DISP NUMERIC(15,4);
DECLARE VARIABLE ALOC_MULT CHAR(1);
BEGIN

  ALOC_MULT = COALESCE((SELECT FIRST 1 COALESCE(PF.ALOCAR_MULTIPLO,'0')
                 FROM TBPEDIDO P, TBPERFIL PF
                WHERE P.PEDIDO = :PEDIDO_1
                  AND P.CLASSIFICACAO = PF.ID
                  AND PF.TABELA = 'PED'),'0');

FOR 
SELECT A.ESTABELECIMENTO_CODIGO, A.PEDIDO, 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

  FROM TBPEDIDO_ITEM A
 WHERE PEDIDO = :PEDIDO_1
   AND SITUACAO = 1
   AND TAMANHO > 0
   AND IIF(:MODELO_ID > 0, A.MODELO_CODIGO = :MODELO_ID, TRUE)
 --FOR UPDATE
   WITH LOCK
INTO :ESTABELECIMENTO_ID, :PEDIDO, :CONTROLE,
     :PRODUTO_ID, :LOCALIZACAO_ID, :TAMANHO, :REM_STATUS, :QTD_PRD, :QTD_MULT
DO
BEGIN

IF(:QTD_MULT = 0) THEN
BEGIN
    :QTD_MULT = 1;
END

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
           VQTD_PRD = :QTD_PRD;
           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 (: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
END
^

SET TERM ; ^

