SET TERM ^ ;

CREATE OR ALTER trigger ttbpdv_cfe_b13u for tbpdv_cfe
active before update position 13
AS
DECLARE VARIABLE PDV_DEVOLUCAO_TROCA_ID INTEGER;
DECLARE VARIABLE OPERACAO_ENTRADA VARCHAR(3);
DECLARE VARIABLE VALOR_TROCA DECIMAL(15,2);
DECLARE VARIABLE PDV_CFE_ITEM_TROCA_ID INTEGER;
DECLARE VARIABLE CHECAGEM_DEVOLUCAO_TROCA INTEGER;
DECLARE VARIABLE ESTOQUE_ID INTEGER;
DECLARE VARIABLE PRODUTO_ID INTEGER;
DECLARE VARIABLE PRODUTO_DESCRICAO VARCHAR(200);
DECLARE VARIABLE NCM_CODIGO VARCHAR(10);
DECLARE VARIABLE LOCALIZACAO_ID INTEGER;
DECLARE VARIABLE TAMANHO INTEGER;
DECLARE VARIABLE EAN VARCHAR(13);
DECLARE VARIABLE QUANTIDADE DECIMAL(15,4);
DECLARE VARIABLE VALOR_UNITARIO DECIMAL(15,4);
DECLARE VARIABLE VALOR_DESCONTO DECIMAL(15,2);
DECLARE VARIABLE VALOR_TOTAL DECIMAL(15,2);
DECLARE VARIABLE VALOR_LIQUIDO DECIMAL(15,2);
DECLARE VARIABLE PROMOCIONAL INTEGER;
DECLARE VARIABLE DOCUMENTO_ID INTEGER;
DECLARE VARIABLE DOCUMENTO_ITEM_ID INTEGER;
DECLARE VARIABLE DOCUMENTO_ITEM_SEQUENCIA INTEGER;
DECLARE VARIABLE DOCUMENTO_TIPO INTEGER;
declare variable PDV_DEVOLUCAO_TROCA_ITEM_ID INTEGER;

BEGIN
    /* REALIZAR ENTRADA NO ESTOQUE PARA PECAS DEVOLVIDAS QUANDO AUTORIZAR O DOCUMENTO */
    IF(OLD.SITUACAO = 1 AND NEW.SITUACAO = 2 AND COALESCE(NEW.IMPORTACAO, 0) = 0) THEN
    BEGIN
        :PDV_DEVOLUCAO_TROCA_ID = GEN_ID(GTBPDV_DEVOLUCAO_TROCA, 1);
        :OPERACAO_ENTRADA       = FN_PARAMETRO('TBPDV.OPER_ENTRADA_ESTOQUE_AUTOMATICA', NEW.PDV_ID);

        :VALOR_TROCA            = 0;

        FOR SELECT
                T.ID,
                T.PRODUTO_ID,
                T.PRODUTO_DESCRICAO,
                T.NCM_CODIGO,
                T.LOCALIZACAO_ID,
                T.TAMANHO,
                T.EAN,
                T.QUANTIDADE,
                T.VALOR_UNITARIO,
                T.VALOR_DESCONTO,
                T.VALOR_TOTAL,
                T.VALOR_LIQUIDO,
                T.PROMOCIONAL,
                T.DOCUMENTO_ID,
                T.DOCUMENTO_ITEM_ID,
                T.DOCUMENTO_ITEM_SEQUENCIA,
                T.DOCUMENTO_TIPO
        FROM TBPDV_CFE_ITEM_TROCA T
        WHERE T.PDV_CFE_ID = NEW.ID
        INTO :PDV_CFE_ITEM_TROCA_ID, :PRODUTO_ID, :PRODUTO_DESCRICAO, :NCM_CODIGO, :LOCALIZACAO_ID, :TAMANHO, :EAN, :QUANTIDADE,
             :VALOR_UNITARIO, :VALOR_DESCONTO, :VALOR_TOTAL, :VALOR_LIQUIDO, :PROMOCIONAL, :DOCUMENTO_ID, :DOCUMENTO_ITEM_ID,
             :DOCUMENTO_ITEM_SEQUENCIA, :DOCUMENTO_TIPO
        DO BEGIN
            :VALOR_TROCA = :VALOR_TROCA + :VALOR_LIQUIDO;

            :PDV_DEVOLUCAO_TROCA_ITEM_ID = GEN_ID(GTBPDV_DEVOLUCAO_TROCA_ITEM, 1);

            INSERT INTO TBPDV_DEVOLUCAO_TROCA_ITEM (ID, ITEM_ID, QUANTIDADE, VALOR_UNITARIO, VALOR_DESCONTO, VALOR_TOTAL,
                PDV_DEVOLUCAO_ID, DOCUMENTO_CONTROLE, ITEM_SEQUENCIA, TIPO_DOCUMENTO,
                CLIENTE_ID, VALOR_LIQUIDO, TAMANHO, PRODUTO_ID,
                TIPO_DEVOLUCAO_TROCA)
            VALUES (:PDV_DEVOLUCAO_TROCA_ITEM_ID, :DOCUMENTO_ITEM_ID, :QUANTIDADE, :VALOR_UNITARIO, :VALOR_DESCONTO, :VALOR_TOTAL, :PDV_DEVOLUCAO_TROCA_ID,
                    :DOCUMENTO_ID, :DOCUMENTO_ITEM_SEQUENCIA, :DOCUMENTO_TIPO, NEW.CLIENTE_ID, :VALOR_LIQUIDO, :TAMANHO, :PRODUTO_ID, 2);
            
            UPDATE TBPDV_CFE_ITEM_TROCA T SET T.PDV_DEVOLUCAO_TROCA_ID = :PDV_DEVOLUCAO_TROCA_ID,
                T.PDV_DEVOLUCAO_TROCA_ITEM_ID = :PDV_DEVOLUCAO_TROCA_ITEM_ID
            WHERE T.ID = :PDV_CFE_ITEM_TROCA_ID;

             /* DAR ENTRADA DO PRODUTO */
            :ESTOQUE_ID = 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,
                NEW.ESTABELECIMENTO_ID, :LOCALIZACAO_ID, NEW.DATA_EMISSAO, :PRODUTO_ID,
                :TAMANHO, :QUANTIDADE, 'E', :OPERACAO_ENTRADA, 0, '', 'ENTRADA AUTOMATICA DE ESTOQUE (TELA 19120)',
                :ESTOQUE_ID, NEW.NUMERO_CFE, NULL, NULL, 0, 0, 0, 0);

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

            WHEN ANY DO
            BEGIN
                /* ERRO NA TRANSACAO DE ESTOQUE DE ENTRADA */
                :ESTOQUE_ID = 0;
                UPDATE TBPDV_CFE_ITEM_TROCA T SET T.ESTOQUE_ID = :ESTOQUE_ID WHERE T.ID = :PDV_CFE_ITEM_TROCA_ID;
            END

        END

        IF(:VALOR_TROCA > 0) THEN
        BEGIN
            
            UPDATE TBPDV_CFE_FORMA_PAGAMENTO T SET T.PDV_DEVOLUCAO_TROCA_ID = :PDV_DEVOLUCAO_TROCA_ID WHERE T.CREDITO_LOJA_AUTOMATICO = 1 AND T.PDV_CFE_ID = NEW.ID;

            INSERT INTO TBPDV_DEVOLUCAO_TROCA (ID, CLIENTE_ID, TIPO_ED, DOCUMENTO_ID, TIPO_DOCUMENTO, VALOR_SALDO,
               NFE_DEVOLUCAO, VALOR_ENCERRADO, PRE_PEDIDO_ID, ROMANEIO_DEVOLUCAO,
               ESTABELECIMENTO_ID, INCLUSAO_AUTOMATICA)
            VALUES (:PDV_DEVOLUCAO_TROCA_ID, NEW.CLIENTE_ID, 2, 0, 0, :VALOR_TROCA, 0,
                    0, 0, 0, NEW.ESTABELECIMENTO_ID, 1);

        END

    END
END
^

SET TERM ; ^

