SET TERM ^ ;

CREATE OR ALTER procedure SP_CFE_BAIXA_AUTOMATICA (
    PDV_CFE_ID_PARAM integer,
    DATA_EMISSAO_PARAM date = null)
as
declare variable PDV_CFE_ID integer;
declare variable PDV_CFE_ITEM_ID integer;
declare variable ESTABELECIMENTO_ID integer;
declare variable CLIENTE_ID integer;
declare variable CAIXA_ID integer;
declare variable NUMERO_CFE integer;
declare variable SERIE_CFE varchar(3);
declare variable DATA_EMISSAO date;
declare variable PEDIDO_ITEM_ID integer;
declare variable CHECK_PEDIDO integer;
declare variable CHECK_ESTOQUE integer;
declare variable ESTOQUE_ID integer;

declare variable ESTOQUE_ID_TROCA integer;
declare variable PDV_CFE_ITEM_TROCA_ID integer;
declare variable ESTABELECIMENTO_ID_TROCA integer;
declare variable NUMERO_CFE_TROCA integer;
declare variable DATA_EMISSAO_TROCA DATE;
declare variable LOCALIZACAO_ID integer;
declare variable PRODUTO_ID integer;
declare variable TAMANHO integer;
declare variable QUANTIDADE NUMERIC(15,2);
declare variable OPERACAO_ENTRADA VARCHAR(3);
BEGIN


        IF(:DATA_EMISSAO_PARAM IS NOT NULL) THEN
        BEGIN
            :DATA_EMISSAO_PARAM = CAST(:DATA_EMISSAO_PARAM AS DATE);
        END

        :OPERACAO_ENTRADA       = FN_PARAMETRO('TBPDV.OPER_ENTRADA_ESTOQUE_AUTOMATICA');


        FOR SELECT
                T.ID,
                T.PRODUTO_ID,
                T.LOCALIZACAO_ID,
                T.TAMANHO,
                T.QUANTIDADE,
                C.ESTABELECIMENTO_ID,
                C.NUMERO_CFE,
                C.DATA_EMISSAO
        FROM TBPDV_CFE_ITEM_TROCA T, TBPDV_CFE C
        WHERE
        T.PDV_CFE_ID = C.ID
        AND T.ESTOQUE_ID = 0
        AND IIF(:PDV_CFE_ID_PARAM > 0, C.ID = :PDV_CFE_ID_PARAM, TRUE)
        AND IIF(:DATA_EMISSAO_PARAM IS NOT NULL, C.DATA_EMISSAO >= :DATA_EMISSAO_PARAM, TRUE)
        INTO :PDV_CFE_ITEM_TROCA_ID, :PRODUTO_ID, :LOCALIZACAO_ID, :TAMANHO, :QUANTIDADE, :ESTABELECIMENTO_ID_TROCA, :NUMERO_CFE_TROCA, :DATA_EMISSAO_TROCA
        DO BEGIN

             /* DAR ENTRADA DO PRODUTO */
            :ESTOQUE_ID_TROCA = COALESCE((SELECT GEN_ID(GTBESTOQUE_TRANSACAO_ITEM, 1) FROM RDB$DATABASE),0);

            EXECUTE PROCEDURE SPI_ESTOQUE_TRANSACAO('TBPDV_CFE_ITEM_TROCA', 0, :PDV_CFE_ITEM_TROCA_ID,
                :ESTABELECIMENTO_ID_TROCA, :LOCALIZACAO_ID, :DATA_EMISSAO_TROCA, :PRODUTO_ID,
                :TAMANHO, :QUANTIDADE, 'E', :OPERACAO_ENTRADA, 0, '', 'ENTRADA AUTOMATICA DE ESTOQUE (TELA 19120)',
                :ESTOQUE_ID_TROCA, :NUMERO_CFE_TROCA, NULL, NULL, 0, 0, 0, 0);

            UPDATE TBPDV_CFE_ITEM_TROCA T SET T.ESTOQUE_ID = :ESTOQUE_ID_TROCA WHERE T.ID = :PDV_CFE_ITEM_TROCA_ID;

            WHEN ANY DO
            BEGIN

            END

        END

        FOR

            SELECT
                C.ID AS PDV_CFE_ID,
                ITEM.ID,
                C.ESTABELECIMENTO_ID,
                COALESCE(C.CLIENTE_ID, 0) AS CLIENTE_ID,
                COALESCE((SELECT T.PDV_CAIXA_ID FROM TBPDV_MOVIMENTO_CAIXA T WHERE T.ID = C.PDV_MOVIMENTO_CAIXA_ID), 0) AS CAIXA_ID,
                C.NUMERO_CFE,
                C.SERIE,
                C.DATA_EMISSAO,
                ITEM.PEDIDO_ITEM_ID,
                T.PEDIDO,
                T.ESTOQUE,
                ITEM.ESTOQUE_ID
    
            FROM TBPDV_CFE_ITEM_TRATAMENTO T
            INNER JOIN TBPDV_CFE_ITEM ITEM ON ITEM.ID = T.PDV_CFE_ITEM_ID
            INNER JOIN TBPDV_CFE C ON C.ID = ITEM.PDV_CFE_ID
            WHERE ((T.PEDIDO = 0 AND ITEM.PEDIDO_ITEM_ID > 0) OR T.ESTOQUE = 0)
            AND IIF(:PDV_CFE_ID_PARAM > 0, C.ID = :PDV_CFE_ID_PARAM, TRUE)
            AND IIF(:DATA_EMISSAO_PARAM IS NOT NULL, C.DATA_EMISSAO >= :DATA_EMISSAO_PARAM, TRUE)
            AND C.SITUACAO = 2
            INTO :PDV_CFE_ID, :PDV_CFE_ITEM_ID, :ESTABELECIMENTO_ID, :CLIENTE_ID, :CAIXA_ID,
                :NUMERO_CFE, :SERIE_CFE, :DATA_EMISSAO, :PEDIDO_ITEM_ID, :CHECK_PEDIDO, :CHECK_ESTOQUE, :ESTOQUE_ID

        DO BEGIN

            IF(:CHECK_PEDIDO = 0 AND :PEDIDO_ITEM_ID > 0) THEN
            BEGIN
                EXECUTE PROCEDURE SP_CFE_ITEM_PEDIDO(:PDV_CFE_ID, :PDV_CFE_ITEM_ID, 1);
            END

            IF(:CHECK_ESTOQUE = 0 AND :ESTOQUE_ID = 0) THEN
            BEGIN
                EXECUTE PROCEDURE SP_CFE_ITEM_CONFERENCIA(:PDV_CFE_ID, :PDV_CFE_ITEM_ID, 1);

                EXECUTE PROCEDURE SP_CFE_ITEM_ESTOQUE(:PDV_CFE_ID, :PDV_CFE_ITEM_ID, :ESTABELECIMENTO_ID, :CLIENTE_ID, :CAIXA_ID, :NUMERO_CFE, :SERIE_CFE, :DATA_EMISSAO, 1);
            END

            IF(:CHECK_ESTOQUE = 0 AND :ESTOQUE_ID > 0) THEN
            BEGIN
               UPDATE TBPDV_CFE_ITEM_TRATAMENTO SET ESTOQUE = 1 WHERE PDV_CFE_ITEM_ID = :PDV_CFE_ITEM_ID;
            END
        END
END
^

SET TERM ; ^

