Adds links for broken retrieval in xnet list et directory (Closes #1194).
[platal.git] / include / marketing.inc.php
CommitLineData
0337d704 1<?php
2/***************************************************************************
9f5bd98e 3 * Copyright (C) 2003-2010 Polytechnique.org *
0337d704 4 * http://opensource.polytechnique.org/ *
5 * *
6 * This program is free software; you can redistribute it and/or modify *
7 * it under the terms of the GNU General Public License as published by *
8 * the Free Software Foundation; either version 2 of the License, or *
9 * (at your option) any later version. *
10 * *
11 * This program is distributed in the hope that it will be useful, *
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of *
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
14 * GNU General Public License for more details. *
15 * *
16 * You should have received a copy of the GNU General Public License *
17 * along with this program; if not, write to the Free Software *
18 * Foundation, Inc., *
19 * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA *
20 ***************************************************************************/
21
e654517d 22class Marketing
23{
24 static private $engines = array(
25 //user name => array(class name, require data)
26 'annuaire' => array('AnnuaireMarketing', false),
27 'groupe' => array('GroupMarketing', true),
28 'liste' => array('ListMarketing', true),
29 );
0337d704 30
e654517d 31 private $engine;
32 public $sender_mail;
33 public $user;
0337d704 34
e654517d 35 private $type;
36 private $data;
37 private $from;
38 private $sender;
232577de 39 private $personal_notes;
e654517d 40
41 private $hash = '';
42
232577de 43 public function __construct($uid, $email, $type, $data, $from, $sender = null, $personal_notes = null)
e654517d 44 {
45 $this->user = $this->getUser($uid, $email);
46 $this->sender_mail = $this->getFrom($from, $sender);
232577de 47 $this->engine =& $this->getEngine($type, $data, $from == 'user' ? $sender : null, $personal_notes);
e654517d 48
49 $this->type = $type;
50 $this->data = $data;
51 $this->from = $from;
eaf30d86 52 $this->sender = $sender;
232577de 53 $this->personal_notes = $personal_notes;
e654517d 54 }
55
56 private function getUser($uid, $email)
57 {
56081a9c
VZ
58 $user = User::getSilent($uid);
59 if (!$user) {
e654517d 60 return null;
eaf30d86 61 }
56081a9c
VZ
62
63 global $globals;
64 return array(
5daf68f6
VZ
65 'user' => $user,
66 'id' => $user->id(),
67 'sexe' => $user->isFemale(),
68 'mail' => $email,
69 'to' => '"' . $user->fullName() . '" <' . $email . '>',
70 'forlife_email' => $user->login() . '@' . $globals->mail->domain,
56081a9c 71 'forlife_email2' => $user->login() . '@' . $globals->mail->domain2,
56081a9c 72 );
e654517d 73 }
74
75 private function getFrom($from, $sender)
76 {
799cdbcd 77 global $globals;
eaf30d86 78
56081a9c 79 if ($from == 'staff' || !($user = User::getSilent($sender))) {
24490a67 80 return '"L\'équipe de Polytechnique.org" <register@' . $globals->mail->domain . '>';
e654517d 81 }
5daf68f6 82 return '"' . $user->fullName() . '" <' . $user->bestEmail() . '>';
e654517d 83 }
84
232577de 85 private function &getEngine($type, $data, $from, $personal_notes)
e654517d 86 {
87 $class = $type . 'Marketing';
88 if (!class_exists($class, false)) {
89 $class= 'DefaultMarketing';
90 }
232577de 91 $engine = new $class($data, $from, $personal_notes);
8c4a0c30 92 if (!$engine instanceof MarketingEngine) {
f62bd784 93 $engine = null;
f62bd784 94 }
95 return $engine;
e654517d 96 }
97
98 public function getTitle()
99 {
100 return $this->engine->getTitle();
101 }
102
103 public function getText()
104 {
105 return $this->engine->getText($this->user);
106 }
107
108 public function send($title = null, $text = null)
109 {
110 $this->hash = rand_url_id(12);
111 if (!$title) {
112 $title = $this->engine->getTitle();
113 }
114 if (!$text) {
115 $text = $this->engine->getText($this->user);
116 }
117 $sender = substr($this->sender_mail, 1, strpos($this->sender_mail, '"', 2)-1);
232577de
SJ
118 $text = str_replace(array('%%hash%%', '%%sender%%', '%%personal_notes%%'),
119 array($this->hash, $this->sender_mail, ''), $text);
e654517d 120 $mailer = new PlMailer();
121 $mailer->setFrom($this->sender_mail);
122 $mailer->addTo($this->user['mail']);
123 $mailer->setSubject($title);
124 $mailer->setTxtBody($text);
125 $mailer->send();
126 $this->incr();
127 }
128
129 public function add($valid = true)
130 {
131 XDB::execute('INSERT IGNORE INTO register_marketing
232577de
SJ
132 (uid, sender, email, date, last, nb, type, hash, message, message_data, personal_notes)
133 VALUES ({?}, {?}, {?}, NOW(), 0, 0, {?}, {?}, {?}, {?}, {?})',
e654517d 134 $this->user['id'], $this->sender, $this->user['mail'], $this->from, $this->hash,
232577de 135 $this->type, $this->data, $this->personal_notes);
e654517d 136 $this->engine->process($this->user);
137 if ($valid) {
138 require_once 'validations.inc.php';
5daf68f6 139 $valid = new MarkReq(User::getSilent($this->sender), $this->user['user'], $this->user['mail'],
232577de 140 $this->from == 'user', $this->type, $this->data, $this->personal_notes);
e654517d 141 $valid->submit();
142 }
143 return true;
144 }
145
146 private function incr()
147 {
148 XDB::execute('UPDATE register_marketing
149 SET nb=nb+1, hash={?}, last=NOW()
150 WHERE uid={?} AND email={?}',
151 $this->hash, $this->user['id'], $this->user['mail']);
152 }
153
154 static public function getEngineList($exclude_data = true)
155 {
156 $array = array();
157 foreach (Marketing::$engines as $e => $d) {
158 if (!$d[1] || !$exclude_data) {
159 $array[] = $e;
160 }
161 }
162 return $array;
163 }
164
8ded5b5e 165 static public function get($uid, $email, $recentOnly = false)
e654517d 166 {
232577de 167 $res = XDB::query("SELECT uid, email, message, message_data, type, sender, personal_notes
e654517d 168 FROM register_marketing
8ded5b5e 169 WHERE uid = {?}
170 AND email = {?}".(
171 $recentOnly ? ' AND DATEDIFF(NOW(), last) < 30' : ''), $uid, $email);
172
e654517d 173 if ($res->numRows() == 0) {
174 return null;
175 }
232577de
SJ
176 list ($uid, $email, $type, $data, $from, $senderi, $personal_notes) = $res->fetchOneRow();
177 return new Marketing($uid, $email, $type, $data, $from, $sender, $personal_notes);
e654517d 178 }
179
180 static public function clear($uid, $email = null)
181 {
182 if (!$email) {
183 XDB::execute("DELETE FROM register_marketing WHERE uid = {?}", $uid);
184 } else {
eaf30d86 185 XDB::execute("DELETE FROM register_marketing WHERE uid = {?} AND email = {?}", $uid, $email);
e654517d 186 }
187 }
188
38c6fe96
FB
189 static public function getAliveUsersCount()
190 {
c8763ca3 191 $uf = new UserFilter(new PFC_Not(new UFC_Dead()));
0c1e3a66 192 return $uf->getTotalCount();
38c6fe96
FB
193 }
194
195 static public function relance(PlUser &$user, $nbx = -1)
e654517d 196 {
197 global $globals;
198
199 if ($nbx < 0) {
38c6fe96 200 $nbx = self::getAliveUsersCount();
e654517d 201 }
eaf30d86 202
0c1e3a66
FB
203 $res = XDB::fetchOneCell('SELECT r.date, r.email, r.bestalias
204 FROM register_pending
205 WHERE r.hash = \'INSCRIT\' AND uid = {?}',
38c6fe96
FB
206 $user->id());
207 if (!$res) {
e654517d 208 return false;
38c6fe96
FB
209 } else {
210 list($date, $email, $alias) = $res;
e654517d 211 }
eaf30d86 212
e654517d 213 $hash = rand_url_id(12);
214 $pass = rand_pass();
c67ba12a 215 $pass_encrypted = sha1($pass);
e654517d 216 $fdate = strftime('%d %B %Y', strtotime($date));
eaf30d86 217
b71f7275 218 $mymail = new PlMailer('marketing/relance.mail.tpl');
e654517d 219 $mymail->assign('nbdix', $nbx);
220 $mymail->assign('fdate', $fdate);
221 $mymail->assign('lusername', $alias);
222 $mymail->assign('nveau_pass', $pass);
223 $mymail->assign('baseurl', $globals->baseurl);
224 $mymail->assign('lins_id', $hash);
225 $mymail->assign('lemail', $email);
226 $mymail->assign('subj', $alias.'@'.$globals->mail->domain);
227 $mymail->send();
228 XDB::execute('UPDATE register_pending
229 SET hash={?}, password={?}, relance=NOW()
38c6fe96
FB
230 WHERE uid={?}', $hash, $pass_encrypted, $user->id());
231 return $user->fullName();
e654517d 232 }
0337d704 233}
0337d704 234
e654517d 235interface MarketingEngine
0337d704 236{
232577de 237 public function __construct($data, $from, $personal_notes = null);
e654517d 238 public function getTitle();
239 public function getText(array $user);
240 public function process(array $user);
0337d704 241}
242
e654517d 243class AnnuaireMarketing implements MarketingEngine
244{
245 protected $titre;
246 protected $intro;
24490a67 247 protected $signature;
232577de 248 protected $personal_notes;
0337d704 249
232577de 250 public function __construct($data, $from, $personal_notes = null)
e654517d 251 {
24490a67 252 $this->titre = "Rejoins la communauté polytechnicienne sur Internet";
253 $this->intro = " Tu n'as pas de fiche dans l'annuaire des polytechniciens sur Internet. "
254 . "Pour y figurer, il te suffit de visiter cette page ou de copier cette adresse "
e654517d 255 . "dans la barre de ton navigateur :";
24490a67 256 if ($from === null) {
257 $this->signature = "L'équipe de Polytechnique.org,\n"
258 . "Le portail des élèves & anciens élèves de l'École polytechnique";
259 } else {
260 $this->signature = "%%sender%%";
261 }
232577de
SJ
262 if (is_null($personal_notes) || $personal_notes == '') {
263 $this->personal_notes = '%%personal_notes%%';
264 } else {
265 $this->personal_notes = "\n" . $personal_notes . "\n";
266 }
e654517d 267 }
268
269 public function getTitle()
270 {
271 return $this->titre;
272 }
273
274 private function getIntro()
275 {
276 return $this->intro;
277 }
278
24490a67 279 public function getSignature()
280 {
281 return $this->signature;
282 }
283
232577de
SJ
284 public function getPersonalNotes()
285 {
286 return $this->personal_notes;
287 }
288
04334c61 289 protected function prepareText(PlPage &$page, array $user)
e654517d 290 {
291 $page->assign('intro', $this->getIntro());
292 $page->assign('u', $user);
24490a67 293 $page->assign('sign', $this->getSignature());
764b894d 294 $page->assign('num_users', Marketing::getAliveUsersCount());
232577de 295 $page->assign('personal_notes', $this->getPersonalNotes());
e654517d 296 }
297
298 public function getText(array $user)
299 {
f70f2bcd
FB
300 $page = new XorgPage();
301 $page->changeTpl('marketing/marketing.mail.tpl', NO_SKIN);
e654517d 302 $this->prepareText($page, $user);
303 return $page->raw();
304 }
305
306 public function process(array $user)
307 {
308 }
309}
310
311class ListMarketing extends AnnuaireMarketing
0337d704 312{
e654517d 313 private $name;
314 private $domain;
232577de 315 public function __construct($data, $from, $personal_notes = null)
e654517d 316 {
317 list($this->name, $this->domain) = explode('@', $data);
56081a9c
VZ
318 if ($from && ($user = User::getSilent($from))) {
319 $from = $user->fullName();
e654517d 320 } else {
321 $from = "Je";
322 }
323 $this->titre = "Un camarade solicite ton inscription à $data";
24490a67 324 $this->intro = "Polytechnique.org, l'annuaire des polytechniciens sur internet, "
325 . "fournit de nombreux services aux groupes X, ainsi que des listes "
326 . "de diffusion pour les X en faisant la demande.\n\n"
327 . "$from solicite ton inscription à la liste <$data>. "
328 . "Cependant, seuls les X inscrits sur Polytechnique.org peuvent "
329 . "profiter de l'ensemble de nos services, c'est pourquoi nous te "
330 . "proposons auparavant de t'inscrire sur notre site. Pour cela, il "
331 . "te suffit de visiter cette page ou de copier cette adresse dans "
332 . "la barre de ton navigateur :";
e654517d 333 }
0337d704 334
e654517d 335 public function process(array $user)
336 {
337 return XDB::execute("REPLACE INTO register_subs (uid, type, sub, domain)
24490a67 338 VALUES ({?}, 'list', {?}, {?})",
339 $user['id'], $this->name, $this->domain);
0337d704 340 }
e654517d 341}
0337d704 342
e654517d 343class GroupMarketing extends AnnuaireMarketing
344{
345 private $group;
232577de 346 public function __construct($data, $from, $personal_notes = null)
e654517d 347 {
348 $this->group = $data;
56081a9c
VZ
349 if ($from && ($user = User::getSilent($from))) {
350 $from = $user->fullName() . " vient";
e654517d 351 } else {
352 $from = "Je viens";
353 }
354 $this->titre = "Profite de ton inscription au groupe \"$data\" pour découvrir Polytechnique.org";
24490a67 355 $this->intro = "Polytechnique.org, l'annuaire des polytechniciens sur internet, fournit "
356 . "de nombreux services aux groupes X ( listes de diffusion, paiement en "
357 . "ligne, sites internet...), en particulier pour le groupe \"$data\"\n\n"
358 . "$from de t'inscrire dans l'annuaire du groupe \"$data\". "
359 . "Cependant, seuls les X inscrits sur Polytechnique.org peuvent profiter "
360 . "de l'ensemble de nos services, c'est pourquoi nous te proposons de "
361 . "t'inscrire sur notre site . Pour cela, il te suffit de visiter cette page "
362 . "ou de copier cette adresse dans la barre de ton navigateur :";
0337d704 363 }
364
e654517d 365 public function process(array $user)
366 {
367 return XDB::execute("REPLACE INTO register_subs (uid, type, sub, domain)
24490a67 368 VALUES ({?}, 'group', {?}, '')",
369 $user['id'], $this->group);
e654517d 370 }
0337d704 371}
372
e654517d 373/// Make AnnuaireMarketing to be the default message
374class DefaultMarketing extends AnnuaireMarketing
375{
376}
0337d704 377
a7de4ef7 378// vim:set et sw=4 sts=4 sws=4 enc=utf-8:
0337d704 379?>