SET TERM ^ ;

CREATE OR ALTER procedure SPU_RATEIO_PARCELA_ZERADA (
    NF_ID integer,
    ORIGEM varchar(5))
as
declare variable VALOR_PARCELA numeric(15,2);
declare variable VALOR_TOTAL numeric(15,2);
declare variable VALOR_ITEM numeric(15,2);
declare variable ID numeric(15,2);
declare variable VALOR_RATEIO numeric(15,2);
declare variable SALDO_RATEIO numeric(15,2);
BEGIN

    VALOR_PARCELA = 0;

    if (ORIGEM='21150') THEN
        BEGIN
        VALOR_PARCELA = COALESCE(( SELECT SUM(P.VALOR)
                                     FROM TBNFS S, TBNFS_PARCELAMENTO P, TBPAGAMENTO_FORMA F
                                    WHERE S.CONTROLE = P.NFS_CONTROLE
                                      AND F.CODIGO   = P.PAGAMENTO_FORMA
                                      AND COALESCE(F.PARCELAS_SEM_SALDO,'0') = '1'  -- CREDITO LOJA, VOUCHER, ETC.
                                      AND F.PDV_TIPO <> 7  -- EXCLUI NESSE CALCULO OS BRINDES
                                      AND S.CONTROLE = :NF_ID),0.00);
        END ELSE
    if (ORIGEM='19040') THEN
        BEGIN
        VALOR_PARCELA = COALESCE(( SELECT SUM(P.VALOR)
                                     FROM TBPDV_CFE A, TBPDV_CFE_FORMA_PAGAMENTO B, TBNFS_PARCELAMENTO P, TBPAGAMENTO_FORMA F
                                    WHERE A.ID = B.PDV_CFE_ID
                                      AND B.ID = P.PDV_CFE_FORMA_PAGAMENTO_ID
                                      AND F.CODIGO   = P.PAGAMENTO_FORMA
                                      AND COALESCE(F.PARCELAS_SEM_SALDO,'0') = '1'    -- CREDITO LOJA, VOUCHER, ETC.
                                      AND F.PDV_TIPO <> 7  -- EXCLUI NESSE CALCULO OS BRINDES
                                      AND A.ID = :NF_ID) , 0.00);
        END

    SALDO_RATEIO = :VALOR_PARCELA ;

    if (VALOR_PARCELA = 0) then
        BEGIN

        if (ORIGEM='21150') THEN
            BEGIN
            UPDATE TBNFS_ITEM A SET RATEIO_PARCELA_ZERADA = 0 WHERE A.NFS_CONTROLE = :NF_ID AND RATEIO_PARCELA_ZERADA > 0;
            END

        if (ORIGEM='19040') THEN
            BEGIN
            UPDATE TBPDV_CFE_ITEM D SET RATEIO_PARCELA_ZERADA = 0 WHERE D.PDV_CFE_ID = :NF_ID AND RATEIO_PARCELA_ZERADA > 0;
            END

        END ELSE
    if (VALOR_PARCELA > 0) then
        BEGIN

        if (ORIGEM='21150') THEN
            BEGIN
            VALOR_TOTAL   = COALESCE(( SELECT SUM(I.VALOR_TOTAL - I.VALOR_DESCONTO)
                                         FROM TBNFS_ITEM I
                                        WHERE I.NFS_CONTROLE = :NF_ID),0.00);

            IF (VALOR_TOTAL > 0) THEN
                BEGIN
                    FOR
                    SELECT I.CONTROLE, I.VALOR_TOTAL - I.VALOR_DESCONTO 
                      FROM TBNFS_ITEM I
                     WHERE I.NFS_CONTROLE = :NF_ID
                    INTO :ID, :VALOR_ITEM
                      DO BEGIN
                         VALOR_RATEIO = FN_ARRENDONDAR(:VALOR_ITEM / :VALOR_TOTAL * :VALOR_PARCELA,2);
                         UPDATE TBNFS_ITEM A SET RATEIO_PARCELA_ZERADA = :VALOR_RATEIO WHERE A.CONTROLE = :ID;
                         SALDO_RATEIO = :SALDO_RATEIO - VALOR_RATEIO;
                         END
                      IF( SALDO_RATEIO <> 0 ) THEN
                         BEGIN
                         UPDATE TBNFS_ITEM A SET RATEIO_PARCELA_ZERADA = COALESCE(RATEIO_PARCELA_ZERADA,0) + :SALDO_RATEIO WHERE A.CONTROLE = :ID;
                         SALDO_RATEIO = 0;
                         END
                END ELSE
                BEGIN
                UPDATE TBNFS_ITEM A SET RATEIO_PARCELA_ZERADA = 0 WHERE A.NFS_CONTROLE = :NF_ID AND RATEIO_PARCELA_ZERADA > 0;
                END
            END ELSE
        if (ORIGEM='19040') THEN
            BEGIN 
            VALOR_TOTAL   = COALESCE(( SELECT SUM(PI.VALOR_TOTAL - PI.VALOR_DESCONTO)
                                         FROM TBPDV_CFE_ITEM PI
                                        WHERE PI.PDV_CFE_ID = :NF_ID
                                          AND COALESCE(PI.brinde, 0) = 0),0.00);
            IF (VALOR_TOTAL > 0) THEN
                BEGIN 
                    FOR
                    SELECT I.ID, I.VALOR_TOTAL - I.VALOR_DESCONTO
                      FROM TBPDV_CFE_ITEM I
                     WHERE I.PDV_CFE_ID = :NF_ID
                    INTO :ID, :VALOR_ITEM
                      DO BEGIN
                         VALOR_RATEIO = FN_ARRENDONDAR(:VALOR_ITEM / :VALOR_TOTAL * :VALOR_PARCELA,2);
                         UPDATE TBPDV_CFE_ITEM D SET RATEIO_PARCELA_ZERADA = :VALOR_RATEIO WHERE D.ID = :ID;
                         SALDO_RATEIO = :SALDO_RATEIO - VALOR_RATEIO; 
                         END
                      IF( SALDO_RATEIO <> 0 ) THEN
                         BEGIN 
                         UPDATE TBPDV_CFE_ITEM D SET RATEIO_PARCELA_ZERADA = COALESCE(RATEIO_PARCELA_ZERADA,0) + :SALDO_RATEIO WHERE D.ID = :ID;
                         SALDO_RATEIO = 0;
                         END
                END ELSE
                BEGIN 
                UPDATE TBPDV_CFE_ITEM D SET RATEIO_PARCELA_ZERADA = 0 WHERE D.PDV_CFE_ID = :NF_ID AND RATEIO_PARCELA_ZERADA > 0;
                END
            END
       END
END^

CREATE OR ALTER TRIGGER TTBNFS_PARCELAMENTO_A01D FOR TBNFS_PARCELAMENTO
ACTIVE AFTER DELETE POSITION 9
AS
DECLARE VARIABLE PDV_CFE_ID INTEGER;
DECLARE VARIABLE NFS_CONTROLE INTEGER;
BEGIN
  IF(OLD.AVULSO = '1')THEN
  BEGIN
     DELETE FROM TBCOMISSAO WHERE TABELA_ID = OLD.CONTROLE AND ORIGEM = 'AVU';
  END

  /*VERIFICAR SE PARCELAS ESTAO SENDO REPROCESSADAS PELA CONCILIACAO DE CARTOES*/

  :PDV_CFE_ID = COALESCE((SELECT FIRST 1 CFE_PAG.PDV_CFE_ID FROM TBPDV_CFE_FORMA_PAGAMENTO CFE_PAG, TBPDV_CFE CFE
                    WHERE CFE.ID = CFE_PAG.PDV_CFE_ID AND CFE_PAG.ID = OLD.PDV_CFE_FORMA_PAGAMENTO_ID AND COALESCE(CFE.REPROCESSAR_PARCELAS,0) = 0),0);

  :NFS_CONTROLE = COALESCE((SELECT FIRST 1 NFS.CONTROLE FROM TBNFS NFS
                    WHERE NFS.CONTROLE = OLD.NFS_CONTROLE
                    AND COALESCE(NFS.REPROCESSAR_PARCELAS,0) = 0
                    AND OLD.NFS_CONTROLE > 0),0);

  IF(:PDV_CFE_ID > 0)THEN
  BEGIN
    EXECUTE PROCEDURE SPI_CFE_GERAR_COMISSAO(:PDV_CFE_ID);
    EXECUTE PROCEDURE SPI_GERAR_COMISSAO(:PDV_CFE_ID,'CFE');

    EXECUTE PROCEDURE SPU_RATEIO_PARCELA_ZERADA(:PDV_CFE_ID,'19040');
  END

  IF(:NFS_CONTROLE > 0)THEN
  BEGIN
     EXECUTE PROCEDURE SPI_GERAR_COMISSAO(:NFS_CONTROLE,'NFS');

     EXECUTE PROCEDURE SPU_RATEIO_PARCELA_ZERADA(:NFS_CONTROLE,'21150');
  END
END^

CREATE OR ALTER TRIGGER TTBNFS_PARCELAMENTO_B13U FOR TBNFS_PARCELAMENTO
ACTIVE BEFORE UPDATE POSITION 10
AS
DECLARE VARIABLE PDV_CFE_ID INTEGER;
BEGIN
  IF((OLD.REPRESENTANTE_ID      <> NEW.REPRESENTANTE_ID
  OR OLD.REPRESENTANTE_COMISSAO <> NEW.REPRESENTANTE_COMISSAO
  OR OLD.VALOR                  <> NEW.VALOR
  OR OLD.ESTABELECIMENTO_CODIGO <> NEW.ESTABELECIMENTO_CODIGO) AND OLD.AVULSO = 0)THEN
  BEGIN
     EXECUTE PROCEDURE SPI_GERAR_COMISSAO(NEW.NFS_CONTROLE,'NFS');
  END
  
  IF((OLD.REPRESENTANTE_ID      <> NEW.REPRESENTANTE_ID
  OR OLD.REPRESENTANTE_COMISSAO <> NEW.REPRESENTANTE_COMISSAO
  OR OLD.VALOR                  <> NEW.VALOR
  OR OLD.ESTABELECIMENTO_CODIGO <> NEW.ESTABELECIMENTO_CODIGO) AND OLD.AVULSO = 1)THEN
  BEGIN
     EXECUTE PROCEDURE SPI_GERAR_COMISSAO(NEW.CONTROLE,'AVU');
  END 

  IF((OLD.VALOR          <> NEW.VALOR
  OR OLD.PAGAMENTO_FORMA <> NEW.PAGAMENTO_FORMA) AND OLD.AVULSO = 0)THEN
  BEGIN
      :PDV_CFE_ID = COALESCE((SELECT FIRST 1 CFE_PAG.PDV_CFE_ID FROM TBPDV_CFE_FORMA_PAGAMENTO CFE_PAG, TBPDV_CFE CFE
                    WHERE CFE.ID = CFE_PAG.PDV_CFE_ID AND CFE_PAG.ID = OLD.PDV_CFE_FORMA_PAGAMENTO_ID AND COALESCE(CFE.REPROCESSAR_PARCELAS,0) = 0),0);

      IF(:PDV_CFE_ID > 0)THEN
      BEGIN
        EXECUTE PROCEDURE SPU_RATEIO_PARCELA_ZERADA(:PDV_CFE_ID,'19040');
      END
      ELSE
      BEGIN
        EXECUTE PROCEDURE SPU_RATEIO_PARCELA_ZERADA(NEW.NFS_CONTROLE,'21150');
      END
  END
END^

CREATE OR ALTER TRIGGER TTBNFS_B18U FOR TBNFS
ACTIVE BEFORE UPDATE POSITION 0
AS

DECLARE VARIABLE LIMITE NUMERIC(10,2);
DECLARE VARIABLE SALDO NUMERIC(10,2);
DECLARE VARIABLE BLOQUEIA_NF CHAR(1);
DECLARE VARIABLE QTD_PARCELAS INTEGER;

BEGIN
    IF(NEW.GC_WEB = 1) THEN
    BEGIN
        IF(OLD.SITUACAO = 1 AND NEW.SITUACAO = 2) THEN
        BEGIN
            SELECT COUNT(T.CONTROLE) FROM TBNFS_PARCELAMENTO T WHERE T.NFS_CONTROLE = NEW.CONTROLE INTO :QTD_PARCELAS;

            IF(QTD_PARCELAS > 0) THEN
            BEGIN
                SELECT TRIM(A.BLOQUEIA_NOTAFISCAL) FROM TBCLIENTE A WHERE A.CODIGO = NEW.EMPRESA_CODIGO INTO :BLOQUEIA_NF;

                IF(BLOQUEIA_NF = '1') THEN
                BEGIN
                   EXCEPTION "..." 'CLIENTE BLOQUEADO PARA EMISSAO DE NOVAS NOTAS FISCAIS. OPERACAO CANCELADA!';
                END /*ELSE
                    SELECT * FROM SPC_NFS_PARCELAMENTO_SALDO11(NEW.EMPRESA_CODIGO, NEW.CONTROLE) INTO :LIMITE, :SALDO;
                    IF(:LIMITE > 0) THEN
                    BEGIN
                        IF(:SALDO > :LIMITE) THEN
                        BEGIN
                            EXCEPTION "..." 'CLIENTE COM LIMITE DE CREDITO EXCEDIDO. OPERACAO CANCELADA! LIMITE: R$ '||:LIMITE||' SALDO R$ '||:SALDO;
                        END
                    END  */
            END

            IF(NEW.PDV_DEVOLUCAO_ID > 0)THEN
            BEGIN
               EXECUTE PROCEDURE SPUI_DEVOLUCAO_TROCA_NF(NEW.PDV_DEVOLUCAO_ID,COALESCE((SELECT FIRST 1 B.VALOR_TOTAL_NF FROM TBNFS_TOTAIS B WHERE B.NFS_CONTROLE = NEW.CONTROLE),0),2);
            END

            EXECUTE PROCEDURE SPU_RATEIO_PARCELA_ZERADA(NEW.CONTROLE,'21150');
        END

        IF(OLD.SITUACAO = 2 AND NEW.SITUACAO <> 2) THEN
        BEGIN
         IF(NEW.PDV_DEVOLUCAO_ID > 0)THEN
            BEGIN
               EXECUTE PROCEDURE SPUI_DEVOLUCAO_TROCA_NF(NEW.PDV_DEVOLUCAO_ID,COALESCE((SELECT FIRST 1 B.VALOR_TOTAL_NF FROM TBNFS_TOTAIS B WHERE B.NFS_CONTROLE = NEW.CONTROLE),0),1);
               
               IF(NEW.SITUACAO = 3)THEN
               BEGIN
                  IF(NEW.NATUREZA = 1)THEN
                  BEGIN
                    UPDATE TBPDV_DEVOLUCAO_TROCA A SET A.NFE_DEVOLUCAO = 0 WHERE A.ID = NEW.PDV_DEVOLUCAO_ID;
                  END                
                  IF(NEW.NATUREZA = 2)THEN
                  BEGIN
                    UPDATE TBPDV_DEVOLUCAO_TROCA A SET A.ROMANEIO_DEVOLUCAO = 0 WHERE A.ID = NEW.PDV_DEVOLUCAO_ID;
                  END
                  NEW.PDV_DEVOLUCAO_ID = 0;
               END
            END
        END

    END
END^

CREATE OR ALTER TRIGGER TTBPDV_CFE_A02U FOR TBPDV_CFE
ACTIVE AFTER UPDATE POSITION 2
AS
DECLARE VARIABLE DOCUMENTO_TIPO VARCHAR(20);
BEGIN
  /* ALTERACAO DE REPRESENTANTE*/
  IF(OLD.REPRESENTANTE_ID 		 <> NEW.REPRESENTANTE_ID
  OR OLD.REPRESENTANTE_COMISSAO  <> NEW.REPRESENTANTE_COMISSAO
  OR OLD.VENDEDOR_ID    		 <> NEW.VENDEDOR_ID
  OR OLD.CORRETOR_ID     		 <> NEW.CORRETOR_ID) THEN
  BEGIN
     /*GERAR COMISSAO*/
	DELETE FROM TBCOMISSAO A WHERE A.ORIGEM = 'CFE' AND A.TABELA_ID = NEW.ID;

	EXECUTE PROCEDURE SPI_CFE_GERAR_COMISSAO(NEW.ID);

	EXECUTE PROCEDURE SPI_GERAR_COMISSAO(NEW.ID,'CFE');

  END


  /* SITUACAO AUTORIZADO */
  IF(OLD.SITUACAO = 1 AND NEW.SITUACAO = 2) THEN
  BEGIN /*GERAR COMISSAO*/
	EXECUTE PROCEDURE SPI_CFE_GERAR_COMISSAO(NEW.ID);

	EXECUTE PROCEDURE SPI_GERAR_COMISSAO(NEW.ID,'CFE');

	SELECT DOCUMENTO_TIPO FROM SP_FORMA_PAGAMENTO_CARTAO('CFE',NEW.ID,1) INTO :DOCUMENTO_TIPO;

	EXECUTE PROCEDURE SPI_GERAR_COMISSAO(NEW.ID,'CFE');

	EXECUTE PROCEDURE SPU_RATEIO_PARCELA_ZERADA(NEW.ID,'19040');

  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
    /*APAGAR COMISSAO*/
    DELETE FROM TBCOMISSAO A WHERE A.ORIGEM = 'CFE' AND A.TABELA_ID = NEW.ID;
  END

END^

SET TERM ; ^