Como usar a data do remetente original em vez da data de busca no OTRS

1

Quando o OTRS obtém emails de uma conta IMAP, ele esquece a data de envio original e a substitui pela data de busca (!).
Normalmente, isso não é um problema, mas quando você está importando uma pasta IMAP existente com muitos emails para OTRS , todas as datas são definidas para os dados importados.

Isso não é legal e gostaria de saber se há alguma maneira de o OTRS ler os cabeçalhos de email e usá-los para substituir o campo create_time na tabela article . Eu estava pensando em usar o módulo de filtro do postmaster (ou algo similar).

Como obtenho o OTRS para ler o cabeçalho date no e-mail e usar essa data para o create_time ?

    
por Johan 17.07.2012 / 10:36

3 respostas

1

A solução que encontrei é adicionar um gatilho ao MySQL da seguinte forma:

Em article_attachement

CREATE TRIGGER bi_article_attachement_each BEFORE INSERT ON article_attachment
FOR EACH ROW
BEGIN

  DECLARE newdate datetime;
  SET newdate = null;

  SELECT create_time INTO newdate FROM article_plain ap WHERE ap.article_id = new.article_id LIMIT 1;

  IF newdate IS NOT NULL THEN
    SET new.create_time = newdate;
    SET new.change_time = newdate;
  END IF;


END

Em article_plain

CREATE TRIGGER bi_article_plain_each BEFORE INSERT ON article_plain
FOR EACH ROW
BEGIN
  DECLARE datestr CHAR(40);
  DECLARE newdate DATETIME;
  DECLARE mindate DATETIME;
  DECLARE myticket BIGINT;

  SET datestr = mid(new.body,locate('Date: ',new.body)+6,40);
  SET newdate = coalesce(str_to_date(datestr,'%a, %e %M %Y %k:%i:%s'),str_to_date(datestr,'%e %M %Y %k:%i:%s'),new.create_time);  

  SET new.create_time = newdate;

  UPDATE article a SET a.create_time = newdate WHERE a.id = new.article_id; 

  SELECT a.ticket_id INTO myticket FROM article a WHERE a.id = new.article_id LIMIT 1;
  SELECT least(min(a.create_time),new.create_time) INTO mindate FROM article a WHERE a.ticket_id = myticket;

  UPDATE ticket t
    SET t.create_time = least(t.create_time, mindate)
        , t.create_time_unix = unix_timestamp(least(t.create_time, mindate))
    WHERE t.id = myticket;

END

Mesma tabela, mas após atualização

CREATE TRIGGER ua_article_plain_each AFTER UPDATE ON article_plain
FOR EACH ROW
BEGIN

  IF old.create_time <> new.create_time THEN BEGIN

    UPDATE article a SET a.create_time = new.create_time, a.change_time = new.create_time WHERE a.id = new.article_id;

  END; END IF;

END

Finalmente, um acionador em ticket :

CREATE TRIGGER bu_ticket_each BEFORE UPDATE ON ticket
FOR EACH ROW
BEGIN
  DECLARE newtn varchar(50);
  DECLARE newdate varchar(12);
  DECLARE filter varchar(13);
  SET newdate = date_format(old.create_time,'%Y%m%d%H%i');
  SET filter = concat(newdate,'%');
  SELECT concat(newdate,ifnull(right(concat('0000',right(max(tn),4)+1),4),'0001')) INTO newtn 
    FROM ticket
    WHERE tn LIKE filter;
  SET new.tn = newtn;
END
    
por 19.12.2012 / 13:16
2

A resposta curta é: isso não é possível. A resposta longa é: se você quiser fazer isso, é necessário modificar o método TicketCreate (), porque, no momento, ele só utilizará a hora atual como data de criação de um novo ticket.

    
por 17.07.2012 / 10:59
1

Eu tive o mesmo problema. Muito obrigado por esta ajuda. Os Procedimentos não funcionaram para mim, então eu mudei e trabalhei com uma tabela temporária.

CREATE TABLE 'article_plain_date' (
  'article_plain_FK' INT(11) NOT NULL,
  'atricle_ID' INT(11) DEFAULT NULL,
  'ticket_ID' INT(11) DEFAULT NULL,
  'create_date' DATETIME DEFAULT NULL,
  PRIMARY KEY ('article_plain_FK')
) ENGINE=MYISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;

INSERT INTO article_plain_date
SELECT p.id,a.id,t.id,IF(STR_TO_DATE(MID(body,LOCATE('Date: ',body)+6,25),'%a, %e %M %Y %k:%i:%s'),STR_TO_DATE(MID(body,LOCATE('Date: ',body)+6,25),'%a, %e %M %Y %k:%i:%s'),p.create_time) AS create_date  FROM otrs.article_plain p

JOIN article a ON (p.'article_id' = a.id)
JOIN ticket t ON (a.'ticket_id' = t.id);

UPDATE article_plain p
JOIN article_plain_date d ON (p.'article_id' = d.'atricle_ID')
SET p.'create_time' = d.'create_date';

UPDATE article a
JOIN article_plain_date d ON (a.id = d.'atricle_ID')
SET a.'create_time' = d.'create_date';

UPDATE ticket t
JOIN article_plain_date d ON (t.id = d.'ticket_ID')
SET t.'create_time' = d.'create_date', t.'create_time_unix' = UNIX_TIMESTAMP(d.'create_date');
    
por 20.01.2015 / 15:38

Tags