CREATE OR ALTER procedure SPU_CONFERENCIA_ESTOQUE (
    PDV_CONFERENCIA_ID integer,
    PDV_CONFERENCIA_ITEM_ID integer,
    ALOCDESALOC char(1))
as
declare variable ESTABELECIMENTO_ID integer;
declare variable LOCALIZACAO_ID integer;
declare variable ITEM_ID integer;
declare variable PRODUTO_ID integer;
declare variable TAMANHO integer;
declare variable VQTD_PRD numeric(15,4);
declare variable QTD_ESTOQUE numeric(15,4);
declare variable VQTD_DISP numeric(15,4);
declare variable CALC_QTD numeric(15,4);
BEGIN
FOR 
SELECT
    A.ESTABELECIMENTO_ID,
    COALESCE(A.LOCALIZACAO_ID, 0) AS LOCALIZACAO_ID,
    B.ID,
    B.PRODUTO_ID,
    B.TAMANHO,
    B.QUANTIDADE,
    B.QTD_ESTOQUE

  FROM TBPDV_CONFERENCIA A, TBPDV_CONFERENCIA_ITEM B
 WHERE
        A.ID = B.PDV_CONFERENCIA_ID
   AND  B.PDV_CONFERENCIA_ID = :PDV_CONFERENCIA_ID
   AND  IIF(:PDV_CONFERENCIA_ITEM_ID > 0, B.ID = :PDV_CONFERENCIA_ITEM_ID, TRUE)
   AND  B.SITUACAO = 0
INTO :ESTABELECIMENTO_ID, :LOCALIZACAO_ID, :ITEM_ID, :PRODUTO_ID, :TAMANHO, :VQTD_PRD, :QTD_ESTOQUE
DO BEGIN

    IF (:ALOCDESALOC = 'D') THEN
        BEGIN
            DELETE FROM TBESTOQUE_DETALHE_ALOCACAO
            WHERE ESTABELECIMENTO_ID = :ESTABELECIMENTO_ID
            AND TABELA_ID =  :PDV_CONFERENCIA_ID
            AND TAB_ITEM_ID = :ITEM_ID
            AND TIPO = 'O'
            AND PRODUTO_ID = :PRODUTO_ID
            AND TAMANHO = :TAMANHO
            AND SALDO > 0;
        END
    
    IF (:ALOCDESALOC = 'A' AND :LOCALIZACAO_ID > 0) THEN
        BEGIN

        IF (:VQTD_PRD > 0 AND :VQTD_PRD <> :QTD_ESTOQUE) 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 :VQTD_DISP
                DO BEGIN
                    IF (:VQTD_DISP > 0) THEN
                    BEGIN
                        :CALC_QTD = :VQTD_PRD - :QTD_ESTOQUE;

                        IF (:CALC_QTD <= :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, :PDV_CONFERENCIA_ID, :ITEM_ID, 'O',
                            :LOCALIZACAO_ID, :PRODUTO_ID, :TAMANHO, :CALC_QTD, :CALC_QTD);
    
                        END ELSE
                        IF (:CALC_QTD > :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, :PDV_CONFERENCIA_ID, :ITEM_ID, 'O',
                            :LOCALIZACAO_ID, :PRODUTO_ID, :TAMANHO, :VQTD_DISP, :VQTD_DISP);

                        END
                    END
                END
            END
        END
    END
END;