CREATE OR ALTER trigger ttbpdv_cfe_a01u for tbpdv_cfe
active after update position 1
AS
DECLARE VARIABLE CAIXA_ID INTEGER;

DECLARE VARIABLE ESTABELECIMENTO_ID INTEGER;
DECLARE VARIABLE NUMERO_NOTAFISCAL INTEGER;
DECLARE VARIABLE DATA DATE;
DECLARE VARIABLE HISTORICO_CONTABIL VARCHAR(100);
DECLARE VARIABLE CONTA_DEBITO VARCHAR(50);
DECLARE VARIABLE CONTA_CREDITO VARCHAR(50);
DECLARE VARIABLE VALOR NUMERIC(18,2);
DECLARE VARIABLE VFALHAS VARCHAR(50);
declare variable DOCUMENTO_TIPO varchar(3);
declare variable DOCUMENTO integer;
declare variable PAGAMENTO_FORMA_ID integer;
declare variable PARCELA integer;
declare variable VALOR_PARCELA decimal(15,2);
declare variable TARIFA decimal(15,4);
declare variable VALOR_LIQUIDO decimal(15,2);
declare variable NSU varchar(50);
declare variable ADQUIRENTE_ID integer;
declare variable BANDEIRA_CARTAO varchar(100);
declare variable CODIGO_AUTORIZACAO varchar(50);
declare variable CONCILIACAO varchar(1);

BEGIN

  SELECT T.PDV_CAIXA_ID FROM TBPDV_MOVIMENTO_CAIXA T WHERE T.ID = NEW.PDV_MOVIMENTO_CAIXA_ID INTO CAIXA_ID;

  /* SITUACAO AUTORIZADO */
  IF(OLD.SITUACAO = 1 AND NEW.SITUACAO = 2) THEN
  BEGIN

        EXECUTE PROCEDURE SP_CFE_PARCELAMENTO (NEW.ID, NEW.ESTABELECIMENTO_ID, NEW.REPRESENTANTE_ID,
           NEW.REPRESENTANTE_COMISSAO, NEW.VENDEDOR_ID, NEW.VENDEDOR_COMISSAO, NEW.CLIENTE_ID,
           :CAIXA_ID,  NEW.NUMERO_CFE, NEW.SERIE, NEW.DATA_EMISSAO, 1);

        EXECUTE PROCEDURE SP_CFE_PEDIDO(NEW.ID, 1);

        EXECUTE PROCEDURE SP_CFE_CONFERENCIA(NEW.ID, 1);

        EXECUTE PROCEDURE SP_CFE_ESTOQUE(NEW.ID, NEW.ESTABELECIMENTO_ID, NEW.CLIENTE_ID, :CAIXA_ID,
            NEW.NUMERO_CFE, NEW.SERIE, NEW.DATA_EMISSAO, 1);

        EXECUTE PROCEDURE SP_CFE_FORMA_PAGAMENTO(NEW.ID, 2);

        IF(NEW.NATUREZA = 1) THEN
        BEGIN

            FOR SELECT
                    ESTABELECIMENTO_ID,
                    NUMERO_NOTAFISCAL,
                    DATA,
                    HISTORICO_CONTABIL,
                    CONTA_DEBITO,
                    CONTA_CREDITO,
                    VALOR,
                    VFALHAS
                FROM SPI_NF_CONTABIL('CFI', NEW.ID, 0) T
            INTO :ESTABELECIMENTO_ID, :NUMERO_NOTAFISCAL, :DATA,
                :HISTORICO_CONTABIL, :CONTA_DEBITO, :CONTA_CREDITO,
                :VALOR, :VFALHAS
            DO BEGIN
    
            END

        END


        SELECT * FROM SP_FORMA_PAGAMENTO_CARTAO('CFE', NEW.ID, 1)
        INTO :DOCUMENTO_TIPO, :DOCUMENTO, :PAGAMENTO_FORMA_ID, :PARCELA, :VALOR_PARCELA, :TARIFA, :VALOR_LIQUIDO,
                 :NSU, :ADQUIRENTE_ID, :BANDEIRA_CARTAO, :CODIGO_AUTORIZACAO, :CONCILIACAO;

  END ELSE
  /* SITUACAO CANCELADO */
  IF((OLD.SITUACAO = 2 AND NEW.SITUACAO = 3) or (OLD.SITUACAO = 1 AND NEW.SITUACAO = 3) or (OLD.SITUACAO = 2 AND NEW.SITUACAO = 1) ) THEN
  BEGIN

        EXECUTE PROCEDURE SP_CFE_PARCELAMENTO (NEW.ID, NEW.ESTABELECIMENTO_ID, NEW.REPRESENTANTE_ID,
            NEW.REPRESENTANTE_COMISSAO, NEW.VENDEDOR_ID, NEW.VENDEDOR_COMISSAO, NEW.CLIENTE_ID,
            :CAIXA_ID,  NEW.NUMERO_CFE, NEW.SERIE, NEW.DATA_EMISSAO, 2);

        EXECUTE PROCEDURE SP_CFE_ESTOQUE(NEW.ID, NEW.ESTABELECIMENTO_ID, NEW.CLIENTE_ID, :CAIXA_ID,
            NEW.NUMERO_CFE, NEW.SERIE, NEW.DATA_EMISSAO, 2, 0);

        EXECUTE PROCEDURE SP_CFE_PEDIDO(NEW.ID, 2);

        EXECUTE PROCEDURE SP_CFE_CONFERENCIA(NEW.ID, 2);


        IF(OLD.NATUREZA = 1) THEN
        BEGIN
            EXECUTE PROCEDURE SPD_MOVCONTABIL(NEW.ID, 'CFI');
        END

        EXECUTE PROCEDURE SP_CFE_FORMA_PAGAMENTO(NEW.ID, 1);

        DELETE FROM TBNFS_FORMA_PAGAMENTO T WHERE T.DOCUMENTO_TIPO = 'CFE' AND T.DOCUMENTO_ID = NEW.ID;

  END

END;

CREATE OR ALTER procedure SP_CFE_FORMA_PAGAMENTO (
    PDV_CFE_ID integer,
    ACAO integer = 1)
as
declare variable VALOR_LIQUIDO numeric(15,2);
declare variable PDV_DEVOLUCAO_TROCA_ID integer;
declare variable PDV_MOVIMENTO_DETALHE_ID integer;
declare variable PDV_TIPO integer;
declare variable COLABORADOR_ID integer;
declare variable NATUREZA integer;
declare variable OLD_SALDO_DEVOLUCAO numeric(15,2);
declare variable NEW_SALDO_DEVOLUCAO numeric(15,2);
declare variable OLD_SALDO_DEPOSITO numeric(15,2);
declare variable NEW_SALDO_DEPOSITO numeric(15,2);
BEGIN

    FOR SELECT
        CAST(ROUND(A.VALOR_LIQUIDO - A.TROCO, 2) AS NUMERIC(15,2)) AS VALOR_LIQUIDO,
        COALESCE(A.PDV_DEVOLUCAO_TROCA_ID, 0) AS PDV_DEVOLUCAO_TROCA_ID,
        COALESCE(A.PDV_MOVIMENTO_DETALHE_ID, 0) AS PDV_MOVIMENTO_DETALHE_ID,
        PF.PDV_TIPO,
        COALESCE(C.COLABORADOR_ID, 0) AS COLABORADOR_ID,
        COALESCE(C.NATUREZA, 1) AS NATUREZA
    FROM TBPDV_CFE_FORMA_PAGAMENTO A
    INNER JOIN TBPDV_CFE C ON C.ID = A.PDV_CFE_ID
    INNER JOIN TBPAGAMENTO_FORMA PF ON PF.CODIGO = A.PAGAMENTO_FORMA_ID
    WHERE A.PDV_CFE_ID = :PDV_CFE_ID
    INTO :VALOR_LIQUIDO, :PDV_DEVOLUCAO_TROCA_ID, :PDV_MOVIMENTO_DETALHE_ID,
    :PDV_TIPO, :COLABORADOR_ID, :NATUREZA
    DO BEGIN
        IF(:ACAO = 1) THEN /* DESFAZER BAIXA DE SALDO PARA DEVOLUÇÕES */
        BEGIN
            IF(:PDV_DEVOLUCAO_TROCA_ID > 0) THEN
            BEGIN
    
                UPDATE TBPDV_DEVOLUCAO_TROCA SET VALOR_SALDO = VALOR_SALDO + :VALOR_LIQUIDO
                        WHERE ID = :PDV_DEVOLUCAO_TROCA_ID;
    
            END ELSE IF(:PDV_MOVIMENTO_DETALHE_ID > 0) THEN
            BEGIN
                
                UPDATE TBPDV_MOVIMENTO_DETALHE SET VALOR_SALDO = VALOR_SALDO + :VALOR_LIQUIDO
                        WHERE ID = :PDV_MOVIMENTO_DETALHE_ID;
    
            END


            /* IF(:PDV_TIPO = 6 AND :NATUREZA = 0) THEN
            BEGIN
                UPDATE TBCOLABORADOR_CREDITO SET SALDO = SALDO + :VALOR_LIQUIDO
                    WHERE COLABORADOR_ID = :COLABORADOR_ID;
            END*/

        END ELSE
        IF(:ACAO = 2) THEN /* REALIZAR BAIXA DE DEVOLUÇÕES */
        BEGIN
            
            IF(:PDV_DEVOLUCAO_TROCA_ID > 0) THEN
            BEGIN
                SELECT
                T.VALOR_SALDO
                FROM TBPDV_DEVOLUCAO_TROCA T
                WHERE T.ID = :PDV_DEVOLUCAO_TROCA_ID
                INTO :OLD_SALDO_DEVOLUCAO;
        
                IF(COALESCE(:OLD_SALDO_DEVOLUCAO, 0) > 0) THEN
                BEGIN
                    :NEW_SALDO_DEVOLUCAO = ROUND(:OLD_SALDO_DEVOLUCAO - :VALOR_LIQUIDO, 2);
        
                    IF(:NEW_SALDO_DEVOLUCAO >= 0) THEN
                    BEGIN
                        UPDATE TBPDV_DEVOLUCAO_TROCA SET VALOR_SALDO = :NEW_SALDO_DEVOLUCAO
                            WHERE ID = :PDV_DEVOLUCAO_TROCA_ID;

                    END
                END

            END ELSE
            IF(:PDV_MOVIMENTO_DETALHE_ID > 0) THEN
            BEGIN
                SELECT
                    T.VALOR_SALDO
                    FROM TBPDV_MOVIMENTO_DETALHE T
                    WHERE T.ID = :PDV_MOVIMENTO_DETALHE_ID
                    INTO :OLD_SALDO_DEPOSITO;
            
                    IF(COALESCE(:OLD_SALDO_DEPOSITO, 0) > 0) THEN
                    BEGIN
                        :NEW_SALDO_DEPOSITO = ROUND(:OLD_SALDO_DEPOSITO - :VALOR_LIQUIDO, 2);
            
                        IF(:NEW_SALDO_DEPOSITO >= 0) THEN
                        BEGIN
            
                            UPDATE TBPDV_MOVIMENTO_DETALHE SET VALOR_SALDO = :NEW_SALDO_DEPOSITO
                                WHERE ID = :PDV_MOVIMENTO_DETALHE_ID;
            
            
                        END
                    END

              END


              IF(:PDV_TIPO = 6 AND :NATUREZA = 0) THEN
              BEGIN
                UPDATE TBCOLABORADOR_CREDITO SET SALDO = SALDO - :VALOR_LIQUIDO
                    WHERE COLABORADOR_ID = :COLABORADOR_ID;

              END
        END



    END


END;