From 66f9f37f41ba54ad578b6ede366907bce0ca4da6 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Thu, 20 Aug 2020 19:00:43 +0200 Subject: [PATCH] Minor code and doc enhancement --- .../mail/source_email_ticket_1_to_create.txt | 89 ++++++++++++ ...urce_email_ticket_2_answer_from_ticket.txt | 57 ++++++++ ...urce_email_ticket_3_answer_from_mailer.txt | 48 +++++++ ..._ticket_4_answer_of_answer_from_mailer.txt | 134 ++++++++++++++++++ htdocs/core/class/html.formticket.class.php | 2 +- .../core/modules/modEmailCollector.class.php | 20 +++ .../class/emailcollector.class.php | 6 +- htdocs/langs/en_US/admin.lang | 2 +- htdocs/langs/en_US/ticket.lang | 4 +- htdocs/ticket/card.php | 9 +- htdocs/ticket/class/ticket.class.php | 54 +++++-- 11 files changed, 399 insertions(+), 26 deletions(-) create mode 100644 dev/examples/mail/source_email_ticket_1_to_create.txt create mode 100644 dev/examples/mail/source_email_ticket_2_answer_from_ticket.txt create mode 100644 dev/examples/mail/source_email_ticket_3_answer_from_mailer.txt create mode 100644 dev/examples/mail/source_email_ticket_4_answer_of_answer_from_mailer.txt diff --git a/dev/examples/mail/source_email_ticket_1_to_create.txt b/dev/examples/mail/source_email_ticket_1_to_create.txt new file mode 100644 index 00000000000..94d4cb620b9 --- /dev/null +++ b/dev/examples/mail/source_email_ticket_1_to_create.txt @@ -0,0 +1,89 @@ +Delivered-To: testldrdev@gmail.com +Received: by 2002:a2e:9b9a:0:0:0:0:0 with SMTP id z26csp1425223lji; + Thu, 20 Aug 2020 08:29:02 -0700 (PDT) +X-Received: by 2002:a05:620a:1292:: with SMTP id w18mr2938234qki.158.1597937342304; + Thu, 20 Aug 2020 08:29:02 -0700 (PDT) +ARC-Seal: i=1; a=rsa-sha256; t=1597937342; cv=none; + d=google.com; s=arc-20160816; + b=FhT/+rJ/zNYgVQ5Nt/rLZJycGd/Ntkhm6LwI16YUfmEmxeGrP/cXXQULrqQ1LhBr9B + oRKweltTdnpyA14gm0kzbs1vUkf5HxLUuGk8IqqJWAPMUZoN8oUPkzq2BuKNQGxPiE+y + Hsg/fnYp8WzcAlZOLsEP2kcFIdA95Dyy5LkM8HgphI1jSS1d6gkx6nDGIMIpDD9D+w4X + ISxRUXp5JlDwFCUMOPoAvHIBUdJ3jpLsjesbMEnU4ssFqhxU21pBq+Fc+csSPeY5DL0M + HR1o+ChEAXIdDOrDqa0ohHfqR216juGCzH8YuEQ88LT0Qbst9IkOYWiAQv4TIh7vHtvQ + TMvA== +ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; + h=to:subject:message-id:date:from:mime-version:dkim-signature; + bh=sojOjnIKAXmsZ9zvMk5MGvY3qyOaFgnpRe6YPMYutOI=; + b=CRlrRPfoGkfmz6iXKy4HdxKQ4SeJTiIxjC2jNkgQPSnIDFJgDkJcwASJVpcjTmlVmH + Z9WnHKVUPRIHGDEoMRlx6eUx9QfelWqPYu3BBQGFry9sgth0BR/1s6tmQ+P+bAj23ryo + aL3UkF6KCSx4GhEk3MfHA5Ex81YDFHvHL3BZ2kb3XCVSlPiBq2szw1ETmRAsDdS5Gbu+ + ZlzBbl4pRtUWgi1fB5H4Wcv7e90F4Et1SBP8IKSCa23qu2nV9xefgjfMw2ndxCj1zgCL + c3l7Ul6pw32nqf6+vxfZTstwIwgu6dXZXCHDqJqesI2g8RGxeba+LfKZEDpBuSeINS9r + GMvw== +ARC-Authentication-Results: i=1; mx.google.com; + dkim=pass header.i=@destailleur.fr header.s=google header.b=IPMz90Yj; + spf=pass (google.com: domain of contact@destailleur.fr designates 209.85.220.41 as permitted sender) smtp.mailfrom=contact@destailleur.fr; + dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=destailleur.fr +Return-Path: +Received: from mail-sor-f41.google.com (mail-sor-f41.google.com. [209.85.220.41]) + by mx.google.com with SMTPS id w14sor2138230qtb.9.2020.08.20.08.29.00 + for + (Google Transport Security); + Thu, 20 Aug 2020 08:29:01 -0700 (PDT) +Received-SPF: pass (google.com: domain of contact@destailleur.fr designates 209.85.220.41 as permitted sender) client-ip=209.85.220.41; +Authentication-Results: mx.google.com; + dkim=pass header.i=@destailleur.fr header.s=google header.b=IPMz90Yj; + spf=pass (google.com: domain of contact@destailleur.fr designates 209.85.220.41 as permitted sender) smtp.mailfrom=contact@destailleur.fr; + dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=destailleur.fr +DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; + d=destailleur.fr; s=google; + h=mime-version:from:date:message-id:subject:to; + bh=sojOjnIKAXmsZ9zvMk5MGvY3qyOaFgnpRe6YPMYutOI=; + b=IPMz90Yjw1Mf57/rYWUYGtpc+IazEWcy6/bqxf1j0h6rxDH/wjhxsCWzfARgqqlfVj + ACg4IbPpZZlKFIYDSCbfMlWF65rbKfNre56HldfQgy0Tq3LC434zHz2ZZMOVCM52w3J9 + VGBpASUlSL1o+YRmzOpRtHVu7I9aNwGxHuA070Yka8XLV76vV3P0vdL8PcoHq0jUUEoi + +dCZ9NCPuAFtGK2IavNoM2qQrLdfYIi+RwgWBtqjTwzyvDEJR+p5fIPK142ynMbHgWYO + RVtMqAgxjvL4sfyKZ5KuzKXkQNM3zyzMinWK89scBl+QLFCcWA4Qqc0dJjqLCBhh8lmq + n67g== +X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; + d=1e100.net; s=20161025; + h=x-gm-message-state:mime-version:from:date:message-id:subject:to; + bh=sojOjnIKAXmsZ9zvMk5MGvY3qyOaFgnpRe6YPMYutOI=; + b=H0GsrFAi9JmRTKQ2budtDeLBqCaTisHKYCVVziyxmv+/tIcrSZBA4tdKwm+wR80r50 + zMJXmyVS2DMDWfnIlOv39wcwQjYN3WK1aRJfV0bVuEWrQuzt5MMWbskf6xbzo201nhr9 + ZlqATsEV7v1u5EHmfYwRhR8+AOmENdnm0g9RXPJVrFS58WNEJUSotS5Y5rZPjnT943y0 + 62Kf4Bd6uWvXhPFXWQoZLtWrPpkbcYPWIBmpftKhD0PD9c6rKaVduV0WhbigYsDoxb3F + iIafGPOyq91hiHR2gTLHiMmTDm+IDQ4n6gSkS7HKpZlLQhHoBMnpqJZYoxMJTxdpAbSy + mY+A== +X-Gm-Message-State: AOAM5325RcN4/ThWbYCO3vWRMFFBrfzJUHC1bd1Z9VB3/2Q3RuF9lmIJ +SjshEErhK68Of2pHDZQ3aPU4rzDfV8ozbvRsgChdfZg8aA= +X-Google-Smtp-Source: ABdhPJxUOUdurKEQfLldtiQGRkgC/h8gKQG1zhS+8k93p6N1SsOn517+GeRyT3E+/Uw536pmReO29la3EIAS6VT33SE= +X-Received: by 2002:aed:3e8e:: with SMTP id n14mr3191190qtf.67.1597937340509; Thu, 20 Aug 2020 08:29:00 -0700 (PDT) +MIME-Version: 1.0 +From: John Tester +Date: Thu, 20 Aug 2020 17:28:34 +0200 +Message-ID: +Subject: Support besoin +To: testldrdev@gmail.com +Content-Type: multipart/alternative; boundary="0000000000008e099705ad50c772" + +--0000000000008e099705ad50c772 +Content-Type: text/plain; charset="UTF-8" + +adfsdfsdfds + +-- +Laurent. +------------------------------------------------------------------------------------ +Twitter: https://www.twitter.com/eldy10 + +--0000000000008e099705ad50c772 +Content-Type: text/html; charset="UTF-8" +Content-Transfer-Encoding: quoted-printable + +
adfsdfsdfds

--
Laur= +ent.
-------------------------------------------------------------------= +-----------------
Twitter: https://www.twitter.com/eldy10
+ +--0000000000008e099705ad50c772-- diff --git a/dev/examples/mail/source_email_ticket_2_answer_from_ticket.txt b/dev/examples/mail/source_email_ticket_2_answer_from_ticket.txt new file mode 100644 index 00000000000..350b9a93cad --- /dev/null +++ b/dev/examples/mail/source_email_ticket_2_answer_from_ticket.txt @@ -0,0 +1,57 @@ +Return-Path: +Received: from smtp.gmail.com ([2a01:e0a:7e:4ae0:329c:23ff:feb8:dc8d]) + by smtp.gmail.com with ESMTPSA id 32sm5811196wrh.18.2020.08.20.09.31.37 + for + (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); + Thu, 20 Aug 2020 09:31:37 -0700 (PDT) +From: testldrdev@gmail.com +X-Google-Original-From: +To: customer@customercompany.fr +Subject: [MyBigCompany - Ticket #TS2008-0040] Nouveau message +Date: Thu, 20 Aug 2020 18:31:37 +0200 +Message-ID: <1597941097.SMTPs-dolibarr-tic58@83b5bc91f83a56e458db71e0adac2b62> +References: <1597941097.SMTPs-dolibarr-tic58@83b5bc91f83a56e458db71e0adac2b62> +X-Dolibarr-TRACKID: tic58@83b5bc91f83a56e458db71e0adac2b62 +X-RemoteAddr: 127.0.0.1 +X-Mailer: Dolibarr version 13.0.0-alpha (using SMTPs Mailer) +X-Dolibarr-Option: MAIN_MAIL_USE_MULTI_PART +Mime-Version: 1.0 +Content-Type: multipart/mixed; boundary="multipart_x.1597941097.x_boundary" +Content-Transfer-Encoding: 8bit + +--multipart_x.1597941097.x_boundary +Content-Type: multipart/alternative; boundary="mul_872cdd6a64216735955664484832b075" + +--mul_872cdd6a64216735955664484832b075 +Content-Type: text/plain; charset=UTF-8 + +Bonjour + + +Une nouvelle réponse a été ajoutée à un ticket que vous suivez. Voici +le message :PredefinedMailContentTicket_send + + +Vous pouvez voir la progression du ticket en cliquant sur le lien +ci-dessus. : fr5uw2yospypn2rz + Cordialement, + +-- +--mul_872cdd6a64216735955664484832b075 +Content-Type: text/html; charset=UTF-8 + +Bonjour
+ +
+Une nouvelle réponse a été ajoutée à un ticket que vous suivez. Voici +le message :PredefinedMailContentTicket_send
+
+
+Vous pouvez voir la progression du ticket en cliquant sur le lien +ci-dessus. : fr5uw2yospypn2rz
+
Cordialement,
+
+-- +--mul_872cdd6a64216735955664484832b075-- +--multipart_x.1597941097.x_boundary-- diff --git a/dev/examples/mail/source_email_ticket_3_answer_from_mailer.txt b/dev/examples/mail/source_email_ticket_3_answer_from_mailer.txt new file mode 100644 index 00000000000..6c2ac1bb2af --- /dev/null +++ b/dev/examples/mail/source_email_ticket_3_answer_from_mailer.txt @@ -0,0 +1,48 @@ +MIME-Version: 1.0 +Date: Thu, 20 Aug 2020 18:34:01 +0200 +References: +In-Reply-To: +Message-ID: +Subject: Re: Support besoin +From: John Tester +To: John Tester +Content-Type: multipart/alternative; boundary="0000000000001620dd05ad51b075" + +--0000000000001620dd05ad51b075 +Content-Type: text/plain; charset="UTF-8" +Content-Transfer-Encoding: quoted-printable + +Merci pour votre question. +Voici la rep. + +Le jeu. 20 ao=C3=BBt 2020 =C3=A0 17:29, John Tester +a =C3=A9crit : + +> adfsdfsdfds +> +> -- +> Laurent. +> +> -------------------------------------------------------------------------= +----------- +> Twitter: https://www.twitter.com/eldy10 +> + +--0000000000001620dd05ad51b075 +Content-Type: text/html; charset="UTF-8" +Content-Transfer-Encoding: quoted-printable + +
Merci pour votre question.
Voici la rep.
Le=C2=A0= +jeu. 20 ao=C3=BBt 2020 =C3=A0=C2=A017:29, John Tester <customer@customercompany.fr> a =C3=A9c= +rit=C2=A0:
adfsdfsdfds

--
Laurent.
----------------------------------------------------------= +--------------------------
Twitter: https://www.twitter.com/eldy10
+
+ +--0000000000001620dd05ad51b075-- diff --git a/dev/examples/mail/source_email_ticket_4_answer_of_answer_from_mailer.txt b/dev/examples/mail/source_email_ticket_4_answer_of_answer_from_mailer.txt new file mode 100644 index 00000000000..314e9cda20f --- /dev/null +++ b/dev/examples/mail/source_email_ticket_4_answer_of_answer_from_mailer.txt @@ -0,0 +1,134 @@ +Delivered-To: testldrdev@gmail.com +Received: by 2002:a2e:9b9a:0:0:0:0:0 with SMTP id z26csp1483607lji; + Thu, 20 Aug 2020 09:56:03 -0700 (PDT) +X-Received: by 2002:ac8:3868:: with SMTP id r37mr3301993qtb.95.1597942563252; + Thu, 20 Aug 2020 09:56:03 -0700 (PDT) +ARC-Seal: i=1; a=rsa-sha256; t=1597942563; cv=none; + d=google.com; s=arc-20160816; + b=skUGL+keim3FdNXfKGgQokCfj85gnhYhuLbMM61qY5W6ixSH9s8I6uoNh3gzVy89XM + NGbZiajjDiPMBryl87PhD+ACBjv8WoZAQiojAga0ELPPmVDnhrtWKANLbRrkUI3Xtfoj + b1o2iHP2Q12Vqs6xiAy86yxURlIKGM3tw91WryWiIPiAL7bRZPn49N3XbO2ULE0QKTBq + BI5YnOxt9NfTj0xhKaLLIJ9M1qa4e1QyOHl56WuEv3Gx6uHDAQDYz+C5G0VgdjBvwRzH + pJaiAulc1uW/V9TcRMwvwIWtI7eWygvU2PiuI/c05G1KVKibAubHE55IjOJCn2O2UaH4 + WMNQ== +ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; + h=to:subject:message-id:date:from:in-reply-to:references:mime-version + :dkim-signature; + bh=j6+rsx5MBsg1/s7LIIfByV7u0jGK09n72bnK4XcN6ZQ=; + b=Ps5kk+tBGQzMP6ugDCwKf4hzn8fn3DU4AFz1dJvkHdDestLZWN99Qtr6iNMdslsHJm + ov378c+8oCfcV7shyBYjlAFfikFi7o4RM/evh3yqqjAnhyVfcYH7c9cexVvDo/AXUAZ7 + N7Mh7EOvyDXXsaHK2l89XiAxZx/hZh/O+/HR2EoVEGre1eYRYwI/aEfPN8d4/fL2VtCD + 0wzAwnUrINuXmcaUDT30Twjk9kwGjjTsM6Z531vKM6L3y48a7f3GTE7V+vo2QxHdUT54 + fQVue9OO7b4VKTEj/x/dmNr+92sHRAMMS7dj/VXMmzM+WttUCAPNxZ27/bvt4bBc5oBp + QPEA== +ARC-Authentication-Results: i=1; mx.google.com; + dkim=pass header.i=@destailleur.fr header.s=google header.b=SEYSmxbT; + spf=pass (google.com: domain of contact@destailleur.fr designates 209.85.220.41 as permitted sender) smtp.mailfrom=contact@destailleur.fr; + dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=destailleur.fr +Return-Path: +Received: from mail-sor-f41.google.com (mail-sor-f41.google.com. [209.85.220.41]) + by mx.google.com with SMTPS id q3sor2285165qtn.34.2020.08.20.09.56.02 + for + (Google Transport Security); + Thu, 20 Aug 2020 09:56:03 -0700 (PDT) +Received-SPF: pass (google.com: domain of contact@destailleur.fr designates 209.85.220.41 as permitted sender) client-ip=209.85.220.41; +Authentication-Results: mx.google.com; + dkim=pass header.i=@destailleur.fr header.s=google header.b=SEYSmxbT; + spf=pass (google.com: domain of contact@destailleur.fr designates 209.85.220.41 as permitted sender) smtp.mailfrom=contact@destailleur.fr; + dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=destailleur.fr +DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; + d=destailleur.fr; s=google; + h=mime-version:references:in-reply-to:from:date:message-id:subject:to; + bh=j6+rsx5MBsg1/s7LIIfByV7u0jGK09n72bnK4XcN6ZQ=; + b=SEYSmxbTKCuc1baQZzjIJwm7WXvgjt/nEGhMLqWxQCU3beM3qhH8wYlSeMyB8Z/9pi + tszZFZhZ3cjnIbbJnjzsMYJgBnYbkf6hz14+BsFwyPU030EkDjJy2i3DSXzYK7A+GbBn + G9I9foG/4+pcx0LnFsjchGsRhLFkTKJIsP2SVfOx0wlim3WHMIqIXvKsxY05PoPyf8Tp + IwQi7iNl/+nTyjNHl2DQh+ty3CRTmUw9uEbY+jRRvIg5i/7cfREekK98d7qi/5HQycr6 + aptRDdCVHXpe47q+c7OPiMEEQWs+mFJhBqPXIlU54fwFApEEnLn/jwGbrPsrPYJaswgI + vd/g== +X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; + d=1e100.net; s=20161025; + h=x-gm-message-state:mime-version:references:in-reply-to:from:date + :message-id:subject:to; + bh=j6+rsx5MBsg1/s7LIIfByV7u0jGK09n72bnK4XcN6ZQ=; + b=M6a4k1gKc4e7TwKncuNPy0b3KxutR1FLFJGWxd4NyW84b7f3LfIR94IeInLQIWmY8C + Ddus0upZJI4+NN9XBGvXCdsiiYlwFGBJRWwjv82XFKVAKL5DD94RJNQZJUiE39hgJ2aa + 6V9gasiP+nUAX4ZV9bZmw21CgKEZrZVXh5unmW2ABrfcx8lHjp/DUw5XEkym1J92Wo1l + g0H3XrC2FL+aQuj+WpCynMNkY9ljw71oqyv3SP9pjnVNHArAdZiPMHkNxiuPdq7q41fg + eIbdRCQXYZL5O48QsjDdiXwaQzx+NcYtrKAH0RIVD1lG6zc9pxqDJsbGxP9VLs8jGDTT + mSdQ== +X-Gm-Message-State: AOAM532LuATWDKbo1HImMWshHVqb0kC0isehf3owfYUKq5J68o3juKbm kCgUMt25A2C7QoNMDXcjfJyteBNQD7ZhSh3yeYTGoLSvsD4= +X-Google-Smtp-Source: ABdhPJyQYCpCHSwA87x030i8YChySZqcNXxT1qVlZyEA+XM6DTyPZusa8gtbDUVcMyx7Jma/7toh+4EEE2bWg0bG+2E= +X-Received: by 2002:aed:3e8e:: with SMTP id n14mr3547383qtf.67.1597942562373; Thu, 20 Aug 2020 09:56:02 -0700 (PDT) +MIME-Version: 1.0 +References: +In-Reply-To: +From: John Tester +Date: Thu, 20 Aug 2020 18:55:36 +0200 +Message-ID: +Subject: Re: Support besoin +To: John Tester +Content-Type: multipart/alternative; boundary="000000000000cd54be05ad51fe67" + +--000000000000cd54be05ad51fe67 +Content-Type: text/plain; charset="UTF-8" +Content-Transfer-Encoding: quoted-printable + +Merci + +Le jeu. 20 ao=C3=BBt 2020 =C3=A0 18:34, John Tester a +=C3=A9crit : + +> Merci pour votre question. +> Voici la rep. +> +> Le jeu. 20 ao=C3=BBt 2020 =C3=A0 17:29, John Tester +> a =C3=A9crit : +> +>> adfsdfsdfds +>> +>> -- +>> Laurent. +>> +>> ------------------------------------------------------------------------= +------------ +>> Twitter: https://www.twitter.com/eldy10 +>> +> + +--=20 +Laurent. +---------------------------------------------------------------------------= +--------- +Twitter: https://www.twitter.com/eldy10 + +--000000000000cd54be05ad51fe67 +Content-Type: text/html; charset="UTF-8" +Content-Transfer-Encoding: quoted-printable + +
Merci

Le=C2=A0jeu. 20 ao=C3=BBt 2020 =C3=A0=C2=A018:34, Lau= +rent Destailleur <testldrdev@gma= +il.com> a =C3=A9crit=C2=A0:
Merci pour votre question.
Voici la= + rep.

Le=C2=A0jeu. 20 ao=C3=BBt 2020 =C3=A0=C2=A017:29, Laurent Destai= +lleur <laure= +nt@destailleur.fr> a =C3=A9crit=C2=A0:
adfsdfsdfds

--
Laurent.
-----------------------= +-------------------------------------------------------------
Twitter: <= +a href=3D"https://www.twitter.com/eldy10" target=3D"_blank">https://www.twi= +tter.com/eldy10
+
+


--
Laurent.
------------------------------------= +------------------------------------------------
Twitter: https://www.twitter.com/eldy= +10
+ +--000000000000cd54be05ad51fe67-- \ No newline at end of file diff --git a/htdocs/core/class/html.formticket.class.php b/htdocs/core/class/html.formticket.class.php index d2e709c69a3..3197ea8cd59 100644 --- a/htdocs/core/class/html.formticket.class.php +++ b/htdocs/core/class/html.formticket.class.php @@ -209,7 +209,7 @@ class FormTicket print ''; // Group - print ''; + print ''; $this->selectGroupTickets((GETPOST('category_code') ? GETPOST('category_code') : $this->category_code), 'category_code', '', '2'); print ''; diff --git a/htdocs/core/modules/modEmailCollector.class.php b/htdocs/core/modules/modEmailCollector.class.php index ce8ea9436e8..6193126f5f4 100644 --- a/htdocs/core/modules/modEmailCollector.class.php +++ b/htdocs/core/modules/modEmailCollector.class.php @@ -299,6 +299,26 @@ class modEmailCollector extends DolibarrModules } } else dol_print_error($this->db); + $tmpsql = "SELECT rowid FROM ".MAIN_DB_PREFIX."emailcollector_emailcollector WHERE ref = 'Collect_Ticket_Answers' and entity = ".$conf->entity; + $tmpresql = $this->db->query($tmpsql); + if ($tmpresql) { + if ($this->db->num_rows($tmpresql) == 0) { + + $descriptionA1 = 'This collector will scan your mailbox "Sent" directory to find emails that was sent as an answer of a Ticket (Module Ticket must be enabled) directly from your email browser instead of from Dolibarr. If such an email is found, the event of answer is recorded into Dolibarr.'; + $sqlforexampleA1 = "INSERT INTO ".MAIN_DB_PREFIX."emailcollector_emailcollector (entity, ref, label, description, source_directory, date_creation, fk_user_creat, status)"; + $sqlforexampleA1 .= " VALUES (".$conf->entity.", 'Collect_Ticket_Answers', 'Example to collect answers to tickets', '".$this->db->escape($descriptionA1)."', 'Sent', '".$this->db->idate(dol_now())."', ".$user->id.", 0)"; + /* + $sqlforexampleA2 = "INSERT INTO ".MAIN_DB_PREFIX."emailcollector_emailcollectorfilter (fk_emailcollector, type, date_creation, fk_user_creat, status)"; + $sqlforexampleA2 .= " VALUES ((SELECT rowid FROM ".MAIN_DB_PREFIX."emailcollector_emailcollector WHERE ref = 'Collect_Ticket_Requets' and entity = ".$conf->entity."), 'withouttrackingid', '".$this->db->idate(dol_now())."', ".$user->id.", 1)"; + $sqlforexampleA3 = "INSERT INTO ".MAIN_DB_PREFIX."emailcollector_emailcollectorfilter (fk_emailcollector, type, rulevalue, date_creation, fk_user_creat, status)"; + $sqlforexampleA3 .= " VALUES ((SELECT rowid FROM ".MAIN_DB_PREFIX."emailcollector_emailcollector WHERE ref = 'Collect_Ticket_Requets' and entity = ".$conf->entity."), 'to', 'support@example.com', '".$this->db->idate(dol_now())."', ".$user->id.", 1)"; + $sqlforexampleA4 = "INSERT INTO ".MAIN_DB_PREFIX."emailcollector_emailcollectoraction (fk_emailcollector, type, date_creation, fk_user_creat, status)"; + $sqlforexampleA4 .= " VALUES ((SELECT rowid FROM ".MAIN_DB_PREFIX."emailcollector_emailcollector WHERE ref = 'Collect_Ticket_Requets' and entity = ".$conf->entity."), 'ticket', '".$this->db->idate(dol_now())."', ".$user->id.", 1)"; + */ + $sql[] = $sqlforexampleA1; + } + } + $tmpsql = "SELECT rowid FROM ".MAIN_DB_PREFIX."emailcollector_emailcollector WHERE ref = 'Collect_Responses' and entity = ".$conf->entity; $tmpresql = $this->db->query($tmpsql); if ($tmpresql) { diff --git a/htdocs/emailcollector/class/emailcollector.class.php b/htdocs/emailcollector/class/emailcollector.class.php index 1a546256483..44e7b04f184 100644 --- a/htdocs/emailcollector/class/emailcollector.class.php +++ b/htdocs/emailcollector/class/emailcollector.class.php @@ -1685,6 +1685,7 @@ class EmailCollector extends CommonObject if ($thirdpartystatic->id > 0) { $tickettocreate->socid = $thirdpartystatic->id; + $tickettocreate->fk_soc = $thirdpartystatic->id; if ($thirdpartyfoundby) $descriptionmeta = dol_concatdesc($descriptionmeta, 'Third party found from '.$thirdpartyfoundby); } if ($contactstatic->id > 0) @@ -1706,13 +1707,12 @@ class EmailCollector extends CommonObject $tickettocreate->subject = $subject; $tickettocreate->message = $description; $tickettocreate->type_code = 0; - $tickettocreate->category_code = 0; - $tickettocreate->severity_code = 0; + $tickettocreate->category_code = null; + $tickettocreate->severity_code = null; $tickettocreate->origin_email = $from; $tickettocreate->fk_user_create = $user->id; $tickettocreate->datec = $date; $tickettocreate->fk_project = $projectstatic->id; - $tickettocreate->fk_soc = $thirdpartystatic->id; $tickettocreate->notify_tiers_at_create = 0; $tickettocreate->note_private = $descriptionfull; $tickettocreate->entity = $conf->entity; diff --git a/htdocs/langs/en_US/admin.lang b/htdocs/langs/en_US/admin.lang index 67611c6c0c0..9c9a5c136fb 100644 --- a/htdocs/langs/en_US/admin.lang +++ b/htdocs/langs/en_US/admin.lang @@ -1943,7 +1943,7 @@ NothingProcessed=Nothing done XEmailsDoneYActionsDone=%s emails qualified, %s emails successfully processed (for %s record/actions done) RecordEvent=Record email event CreateLeadAndThirdParty=Create lead (and third party if necessary) -CreateTicketAndThirdParty=Create ticket (and third party if necessary) +CreateTicketAndThirdParty=Create ticket (and link to third party if it was loaded by a previous operation) CodeLastResult=Latest result code NbOfEmailsInInbox=Number of emails in source directory LoadThirdPartyFromName=Load third party searching on %s (load only) diff --git a/htdocs/langs/en_US/ticket.lang b/htdocs/langs/en_US/ticket.lang index a9cff9391d0..59519282c80 100644 --- a/htdocs/langs/en_US/ticket.lang +++ b/htdocs/langs/en_US/ticket.lang @@ -72,7 +72,6 @@ Deleted=Deleted # Dict Type=Type -Category=Analytic code Severity=Severity # Email templates @@ -128,7 +127,6 @@ TicketsAutoAssignTicket=Automatically assign the user who created the ticket TicketsAutoAssignTicketHelp=When creating a ticket, the user can be automatically assigned to the ticket. TicketNumberingModules=Tickets numbering module TicketNotifyTiersAtCreation=Notify third party at creation -TicketGroup=Group TicketsDisableCustomerEmail=Always disable emails when a ticket is created from public interface TicketsPublicNotificationNewMessage=Send email(s) when a new message is added TicketsPublicNotificationNewMessageHelp=Send email(s) when a new message is added from public interface (to assigned user or the notifications email to (update) and/or the notifications email to) @@ -162,7 +160,7 @@ CreatedBy=Created by NewTicket=New Ticket SubjectAnswerToTicket=Ticket answer TicketTypeRequest=Request type -TicketCategory=Analytic code +TicketCategory=Group SeeTicket=See ticket TicketMarkedAsRead=Ticket has been marked as read TicketReadOn=Read on diff --git a/htdocs/ticket/card.php b/htdocs/ticket/card.php index d03ef3cd614..437df1981ba 100644 --- a/htdocs/ticket/card.php +++ b/htdocs/ticket/card.php @@ -894,8 +894,6 @@ if (empty($action) || $action == 'view' || $action == 'addlink' || $action == 'd if ($object->fk_user_assign > 0) { $userstat->fetch($object->fk_user_assign); print $userstat->getNomUrl(1); - } else { - print $langs->trans('None'); } // Show user list to assignate one if status is "read" @@ -1027,7 +1025,7 @@ if (empty($action) || $action == 'view' || $action == 'addlink' || $action == 'd print $langs->getLabelFromKey($db, $object->type_code, 'c_ticket_type', 'code', 'label'); print ''; // Group - print ''.$langs->trans("TicketGroup").''; + print ''.$langs->trans("TicketCategory").''; print $langs->getLabelFromKey($db, $object->category_code, 'c_ticket_category', 'code', 'label'); print ''; // Severity @@ -1178,7 +1176,7 @@ if (empty($action) || $action == 'view' || $action == 'addlink' || $action == 'd { // Show link to add a message (if read and not closed) if ($object->fk_statut < Ticket::STATUS_CLOSED && $action != "presend" && $action != "presend_addmessage") { - print ''; + print ''; } // Link to create an intervention @@ -1207,7 +1205,7 @@ if (empty($action) || $action == 'view' || $action == 'addlink' || $action == 'd } print ''."\n"; } else { - print '
'; + //print '
'; } // Select mail models is same action as presend @@ -1256,6 +1254,7 @@ if (empty($action) || $action == 'view' || $action == 'addlink' || $action == 'd $morehtmlright .= $form->textwithpicto(''.$langs->trans("TicketMessageSubstitutionReplacedByGenericValues").'', $help, 1, 'helpclickable', '', 0, 3, 'helpsubstitution'); print '
'; + print load_fiche_titre($langs->trans('TicketAddMessage'), $morehtmlright, 'messages@ticket'); print '
'; diff --git a/htdocs/ticket/class/ticket.class.php b/htdocs/ticket/class/ticket.class.php index 4c5b599da90..4496eb776fb 100644 --- a/htdocs/ticket/class/ticket.class.php +++ b/htdocs/ticket/class/ticket.class.php @@ -178,6 +178,45 @@ class Ticket extends CommonObject */ public $regeximgext = '\.jpg|\.jpeg|\.bmp|\.gif|\.png|\.tiff'; + /** + * Status + */ + const STATUS_NOT_READ = 0; + const STATUS_READ = 1; + const STATUS_ASSIGNED = 2; + const STATUS_IN_PROGRESS = 3; + const STATUS_NEED_MORE_INFO = 5; + const STATUS_WAITING = 7; + const STATUS_CLOSED = 8; + const STATUS_CANCELED = 9; + + + /** + * 'type' if the field format ('integer', 'integer:ObjectClass:PathToClass[:AddCreateButtonOrNot[:Filter]]', 'varchar(x)', 'double(24,8)', 'real', 'price', 'text', 'html', 'date', 'datetime', 'timestamp', 'duration', 'mail', 'phone', 'url', 'password') + * Note: Filter can be a string like "(t.ref:like:'SO-%') or (t.date_creation:<:'20160101') or (t.nature:is:NULL)" + * 'label' the translation key. + * 'enabled' is a condition when the field must be managed (Example: 1 or '$conf->global->MY_SETUP_PARAM) + * 'position' is the sort order of field. + * 'notnull' is set to 1 if not null in database. Set to -1 if we must set data to null if empty ('' or 0). + * 'visible' says if field is visible in list (Examples: 0=Not visible, 1=Visible on list and create/update/view forms, 2=Visible on list only, 3=Visible on create/update/view form only (not list), 4=Visible on list and update/view form only (not create). 5=Visible on list and view only (not create/not update). Using a negative value means field is not shown by default on list but can be selected for viewing) + * 'noteditable' says if field is not editable (1 or 0) + * 'default' is a default value for creation (can still be overwrote by the Setup of Default Values if field is editable in creation form). Note: If default is set to '(PROV)' and field is 'ref', the default value will be set to '(PROVid)' where id is rowid when a new record is created. + * 'index' if we want an index in database. + * 'foreignkey'=>'tablename.field' if the field is a foreign key (it is recommanded to name the field fk_...). + * 'searchall' is 1 if we want to search in this field when making a search from the quick search button. + * 'isameasure' must be set to 1 if you want to have a total on list for this field. Field type must be summable like integer or double(24,8). + * 'css' is the CSS style to use on field. For example: 'maxwidth200' + * 'help' is a string visible as a tooltip on field + * 'showoncombobox' if value of the field must be visible into the label of the combobox that list record + * 'disabled' is 1 if we want to have the field locked by a 'disabled' attribute. In most cases, this is never set into the definition of $fields into class, but is set dynamically by some part of code. + * 'arraykeyval' to set list of value if type is a list of predefined values. For example: array("0"=>"Draft","1"=>"Active","-1"=>"Cancel") + * 'autofocusoncreate' to have field having the focus on a create form. Only 1 field should have this property set to 1. + * 'comment' is not used. You can store here any text of your choice. It is not used by application. + * + * Note: To have value dynamic, you can set value to 0 in definition and edit the value on the fly into the constructor. + */ + + // BEGIN MODULEBUILDER PROPERTIES public $fields = array( 'rowid' => array('type'=>'integer', 'label'=>'TechnicalID', 'position'=>1, 'visible'=>-2, 'enabled'=>1, 'position'=>1, 'notnull'=>1, 'index'=>1, 'comment'=>"Id"), 'entity' => array('type'=>'integer', 'label'=>'Entity', 'visible'=>0, 'enabled'=>1, 'position'=>5, 'notnull'=>1, 'index'=>1), @@ -187,7 +226,7 @@ class Ticket extends CommonObject 'origin_email' => array('type'=>'mail', 'label'=>'OriginEmail', 'visible'=>-2, 'enabled'=>1, 'position'=>16, 'notnull'=>1, 'index'=>1, 'searchall'=>1, 'comment'=>"Reference of object", 'css'=>'tdoverflowmax150'), 'subject' => array('type'=>'varchar(255)', 'label'=>'Subject', 'visible'=>1, 'enabled'=>1, 'position'=>18, 'notnull'=>-1, 'searchall'=>1, 'help'=>"", 'css'=>'maxwidth200', 'autofocusoncreate'=>1), 'type_code' => array('type'=>'varchar(32)', 'label'=>'Type', 'visible'=>1, 'enabled'=>1, 'position'=>20, 'notnull'=>-1, 'searchall'=>1, 'help'=>"", 'css'=>'maxwidth150'), - 'category_code' => array('type'=>'varchar(32)', 'label'=>'TicketGroup', 'visible'=>-1, 'enabled'=>1, 'position'=>21, 'notnull'=>-1, 'help'=>"", 'css'=>'maxwidth100'), + 'category_code' => array('type'=>'varchar(32)', 'label'=>'TicketCategory', 'visible'=>-1, 'enabled'=>1, 'position'=>21, 'notnull'=>-1, 'help'=>"", 'css'=>'maxwidth100'), 'severity_code' => array('type'=>'varchar(32)', 'label'=>'Severity', 'visible'=>1, 'enabled'=>1, 'position'=>22, 'notnull'=>-1, 'help'=>"", 'css'=>'maxwidth100'), 'fk_soc' => array('type'=>'integer:Societe:societe/class/societe.class.php', 'label'=>'ThirdParty', 'visible'=>1, 'enabled'=>1, 'position'=>50, 'notnull'=>-1, 'index'=>1, 'searchall'=>1, 'help'=>"LinkToThirparty", 'css'=>'tdoverflowmax150 maxwidth150onsmartphone'), 'notify_tiers_at_create' => array('type'=>'integer', 'label'=>'NotifyThirdparty', 'visible'=>-1, 'enabled'=>0, 'position'=>51, 'notnull'=>1, 'index'=>1), @@ -204,18 +243,7 @@ class Ticket extends CommonObject 'fk_statut' => array('type'=>'integer', 'label'=>'Status', 'visible'=>1, 'enabled'=>1, 'position'=>600, 'notnull'=>1, 'index'=>1, 'arrayofkeyval'=>array(0 => 'Unread', 1 => 'Read', 3 => 'Answered', 4 => 'Assigned', 5 => 'InProgress', 6 => 'Waiting', 8 => 'Closed', 9 => 'Deleted')), 'import_key' =>array('type'=>'varchar(14)', 'label'=>'ImportId', 'enabled'=>1, 'visible'=>-2, 'position'=>900), ); - - /** - * Status - */ - const STATUS_NOT_READ = 0; - const STATUS_READ = 1; - const STATUS_ASSIGNED = 2; - const STATUS_IN_PROGRESS = 3; - const STATUS_NEED_MORE_INFO = 5; - const STATUS_WAITING = 7; - const STATUS_CLOSED = 8; - const STATUS_CANCELED = 9; + // END MODULEBUILDER PROPERTIES /**