CREATE OR ALTER TRIGGER TTBPDV_MOVIMENTO_B02U FOR TBPDV_MOVIMENTO
ACTIVE BEFORE UPDATE POSITION 0
AS
DECLARE VARIABLE HISTORICO VARCHAR(2000);
declare variable OPERADOR VARCHAR(500);
declare variable ID_CAIXA  INTEGER;
declare variable PDV_DESC  VARCHAR(500);
declare variable ID_MOV  INTEGER;
BEGIN
  HISTORICO = '';
  ID_MOV    = COALESCE((SELECT FIRST 1 Z.ID FROM TBPDV_MOVIMENTO Z WHERE CAST(Z.DATAHORA_ABERTURA AS DATE) IS NOT NULL AND Z.ID <> NEW.ID AND Z.ESTABELECIMENTO_ID = NEW.ESTABELECIMENTO_ID AND Z.PDV_ID = NEW.PDV_ID AND Z.DATAHORA_FECHAMENTO IS NULL AND Z.DATAHORA_ABERTURA IS NOT NULL),0);
  PDV_DESC  = COALESCE((SELECT FIRST 1 FN_LPAD(Z.ID,4,0)||' - '||z.descricao FROM TBPDV Z WHERE Z.ID = NEW.PDV_ID),'');

  IF(NEW.DATAHORA_ABERTURA IS NOT NULL AND OLD.DATAHORA_ABERTURA IS NULL)THEN
  BEGIN
     IF(CURRENT_DATE < CAST(NEW.DATA AS DATE))THEN
     BEGIN
         EXCEPTION "..." 'NAO E POSSIVEL REALIZAR A ABERTURA DE MOVIMENTOS DIARIOS COM DATA SUPERIOR A DATA ATUAL. OPERAÇÃO CANCELADA!';
     END
     IF(ID_MOV > 0)THEN
     BEGIN
         EXCEPTION "..." 'JÁ EXISTE UMA MOVIMENTAÇÃO ABERTA PARA O PDV:'||PDV_DESC||' OPERAÇÃO CANCELADA!';
     END
     OPERADOR  = (SELECT FIRST 1 IIF(CHAR_LENGTH(B.NOME) > 0, B.NOME, B.USUARIO) FROM TBPDV_OPERADOR A, TBUSUARIO B WHERE A.ID = NEW.OPERADOR_ABERTURA AND B.CODIGO = A.USUARIO_ID AND A.PDV_ID = NEW.PDV_ID);
     HISTORICO = 'ABERTURA DO DIA: '||FORMATDATE(OLD.DATA)||' REALIZADA PELO OPERADOR: '||FN_LPAD(NEW.OPERADOR_ABERTURA,4,0)||' - '||OPERADOR||', DATA/HORA:'||FORMATDATETIME(NEW.DATAHORA_ABERTURA)||'.';
  END

  IF(NEW.DATAHORA_FECHAMENTO IS NOT NULL AND OLD.DATAHORA_FECHAMENTO IS NULL)THEN
  BEGIN  
     ID_CAIXA  = COALESCE((SELECT FIRST 1 A.ID FROM TBPDV_MOVIMENTO_CAIXA A WHERE A.PDV_MOVIMENTO_ID = NEW.ID AND A.STATUS = 1),0);
     IF(ID_CAIXA > 0)THEN
     BEGIN
         EXCEPTION "..." 'EXISTEM CAIXAS ABERTOS NESTA MOVIMENTAÇÃO, OPERAÇÃO CANCELADA!';
     END
     OPERADOR  = (SELECT FIRST 1 IIF(CHAR_LENGTH(B.NOME) > 0, B.NOME, B.USUARIO) FROM TBPDV_OPERADOR A, TBUSUARIO B WHERE A.ID = NEW.OPERADOR_FECHAMENTO AND B.CODIGO = A.USUARIO_ID AND A.PDV_ID = NEW.PDV_ID);
     HISTORICO = 'FECHAMENTO DO DIA: '||FORMATDATE(OLD.DATA)||' REALIZADA PELO OPERADOR: '||FN_LPAD(NEW.OPERADOR_FECHAMENTO,4,0)||' - '||OPERADOR||', DATA/HORA:'||FORMATDATETIME(NEW.DATAHORA_FECHAMENTO)||'.';
  END

  IF(NEW.DATAHORA_ABERTURA IS NULL AND OLD.DATAHORA_ABERTURA IS NOT NULL)THEN
  BEGIN
     ID_CAIXA  = COALESCE((SELECT FIRST 1 count(a.ID) FROM TBPDV_MOV_CAIXA_ABERTURA A WHERE A.PDV_MOVIMENTO_ID = NEW.ID),0);
     IF(ID_CAIXA > 0)THEN
     BEGIN
         EXCEPTION "..." 'EXISTEM CAIXAS COM ABERTURAS/FECHAMENTOS REALIZADOS NESTA MOVIMENTAÇÃO, OPERAÇÃO CANCELADA!';
     END
     OPERADOR  = (SELECT FIRST 1 IIF(CHAR_LENGTH(B.NOME) > 0, B.NOME, B.USUARIO) FROM TBPDV_OPERADOR A, TBUSUARIO B WHERE A.ID = NEW.OPERADOR_FECHAMENTO AND B.CODIGO = A.USUARIO_ID AND A.PDV_ID = NEW.PDV_ID);
     HISTORICO = 'CANCELAMENTO DE ABERTURA DO DIA: '||FORMATDATE(OLD.DATA)||' REALIZADO.';
  END

  IF(NEW.DATAHORA_FECHAMENTO IS NULL AND OLD.DATAHORA_FECHAMENTO IS NOT NULL)THEN
  BEGIN  
     IF(ID_MOV > 0)THEN
     BEGIN
         EXCEPTION "..." 'JÁ EXISTE UMA MOVIMENTAÇÃO ABERTA PARA O PDV:'||PDV_DESC||' OPERAÇÃO CANCELADA!';
     END
     OPERADOR  = (SELECT FIRST 1 IIF(CHAR_LENGTH(B.NOME) > 0, B.NOME, B.USUARIO) FROM TBPDV_OPERADOR A, TBUSUARIO B WHERE A.ID = NEW.OPERADOR_ABERTURA AND B.CODIGO = A.USUARIO_ID AND A.PDV_ID = NEW.PDV_ID);
     HISTORICO = 'CANCELAMENTO DE FECHAMENTO DO DIA: '||FORMATDATE(OLD.DATA)||' REALIZADO.';
  END

  IF(HISTORICO <> '') THEN
  BEGIN
      EXECUTE PROCEDURE SPI_HISTORICO('TBPDV_MOVIMENTO', OLD.ID, HISTORICO);
  END
END;