Adapts profile related validation requests to ProfileValidate.
[platal.git] / modules / profile / jobs.inc.php
CommitLineData
3950bc21
FB
1<?php
2/***************************************************************************
9f5bd98e 3 * Copyright (C) 2003-2010 Polytechnique.org *
3950bc21
FB
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
12bcf04b 22class ProfileSettingJob extends ProfileSettingGeocoding
37d44b3b
FB
23{
24 private $pub;
541e8d03
SJ
25 private $email_new;
26 private $email;
27 private $url;
f93fb300 28 private $bool;
37d44b3b
FB
29 private $checks;
30
31 public function __construct()
32 {
12bcf04b 33 $this->pub = new ProfileSettingPub();
541e8d03
SJ
34 $this->email
35 = $this->email_new
12bcf04b
RB
36 = new ProfileSettingEmail();
37 $this->url = new ProfileSettingWeb();
38 $this->bool = new ProfileSettingBool();
541e8d03
SJ
39 $this->checks = array('url' => array('w_url'),
40 'email' => array('w_email'),
41 'pub' => array('pub', 'w_email_pub'),
42 );
37d44b3b
FB
43 }
44
afaa2cc7
SJ
45 public function emptyJob()
46 {
47 return array(
48 'id' => '0',
49 'jobid' => '',
50 'pub' => 'private',
51 'name' => '',
52 'hq_acronym' => '',
53 'hq_url' => '',
54 'hq_email' => '',
55 'hq_address' => array(
56 'text' => '',
57 'accuracy' => '',
58 'postalText' => '',
59 'postalCode' => '',
60 'administrativeAreaId' => '',
61 'subAdministrativeAreaId' => '',
62 'localityId' => '',
63 'countryId' => '',
64 'latitude' => '',
65 'longitude' => '',
66 'north' => '',
67 'south' => '',
68 'east' => '',
69 'west' => '',
70 'cedex' => '',
71 'updateTime' => '',
72 'changed' => '0',
73 'removed' => '0',
74 ),
75 'hq_phone' => '',
76 'hq_fax' => '',
77 'subSubSectorName' => null,
78 'sector' => '0',
79 'subSector' => '0',
80 'subSubSector' => '0',
81 'description' => '',
82 'w_url' => '',
83 'w_address' => array(
84 'pub' => 'private',
85 'text' => '',
86 'accuracy' => '',
87 'postalText' => '',
88 'postalCode' => '',
89 'administrativeAreaId' => '',
90 'subAdministrativeAreaId' => '',
91 'localityId' => '',
92 'countryId' => '',
93 'latitude' => '',
94 'longitude' => '',
95 'north' => '',
96 'south' => '',
97 'east' => '',
98 'west' => '',
99 'cedex' => '',
100 'updateTime' => '',
101 'changed' => '0',
102 'removed' => '0',
103 ),
104 'w_email' => '',
105 'w_email_pub' => 'private',
106 'w_email_new' => '',
107 'w_phone' => array(0 => array(
108 'type' => 'fixed',
109 'tel' => '',
110 'pub' => 'private',
111 'comment' => '',
112 )),
113 );
114 }
115
b814a8b8 116 private function cleanJob(ProfilePage &$page, $jobid, array &$job, &$success)
37d44b3b
FB
117 {
118 $success = true;
541e8d03
SJ
119 if ($job['w_email'] == "new@example.org") {
120 $job['w_email'] = $job['w_email_new'];
121 }
37d44b3b
FB
122 foreach ($this->checks as $obj=>&$fields) {
123 $chk =& $this->$obj;
124 foreach ($fields as $field) {
125 $job[$field] = $chk->value($page, $field, $job[$field], $s);
126 if (!$s) {
127 $success = false;
128 $job[$field . '_error'] = true;
129 }
130 }
131 }
541e8d03 132 if (!$job['subSubSectorName']) {
c7139c07
SJ
133 $res = XDB::query("SELECT name
134 FROM profile_job_subsubsector_enum
135 WHERE id = {?}",
541e8d03
SJ
136 $job['subSubSector']);
137 $job['subSubSectorName'] = $res->fetchOneCell();
c7139c07
SJ
138 } else {
139 $res = XDB::query("SELECT sectorid, subsectorid, id
140 FROM profile_job_subsubsector_enum
141 WHERE name = {?}",
541e8d03 142 $job['subSubSectorName']);
c7139c07
SJ
143 if ($res->numRows() != 1) {
144 $success = false;
145 $job['sector_error'] = true;
146 } else {
541e8d03 147 list($job['sector'], $job['subSector'], $job['subSubSector']) = $res->fetchOneRow();
c7139c07
SJ
148 }
149 }
b814a8b8 150 if ($job['name']) {
c7139c07
SJ
151 $res = XDB::query("SELECT id
152 FROM profile_job_enum
153 WHERE name = {?}",
154 $job['name']);
155 if ($res->numRows() != 1) {
a6483c12 156 $user = $page->profile->owner;
4d7d27fc
SJ
157 $this->geocodeAddress($job['hq_address'], $s);
158 if (!$s) {
159 $gmapsGeocoder = new GMapsGeocoder();
160 $job['hq_address'] = $gmapsGeocoder->stripGeocodingFromAddress($job['hq_address']);
161 }
162 $req = new EntrReq($user, $jobid, $job['name'], $job['hq_acronym'], $job['hq_url'],
163 $job['hq_email'], $job['hq_fixed'], $job['hq_fax'], $job['hq_address']);
b814a8b8
SJ
164 $req->submit();
165 $job['jobid'] = null;
c7139c07
SJ
166 } else {
167 $job['jobid'] = $res->fetchOneCell();
168 }
169 }
541e8d03
SJ
170 $job['w_address']['pub'] = $this->pub->value($page, 'address_pub', $job['w_address']['pub'], $s);
171 if (!isset($job['w_phone'])) {
172 $job['w_phone'] = array();
bde2be3b 173 }
12bcf04b 174 $profiletel = new ProfileSettingPhones('pro', $jobid);
541e8d03 175 $job['w_phone'] = $profiletel->value($page, 'tel', $job['w_phone'], $s);
afaa2cc7 176
37d44b3b
FB
177 unset($job['removed']);
178 unset($job['new']);
37d44b3b
FB
179 }
180
181 public function value(ProfilePage &$page, $field, $value, &$success)
182 {
a6483c12
SJ
183 require_once 'validations.inc.php';
184 $entreprise = Validate::get_typed_requests($page->profile->owner->id(), 'entreprise');
b814a8b8
SJ
185 $entr_val = 0;
186
37d44b3b
FB
187 $init = false;
188 if (is_null($value)) {
189 $value = $page->values['jobs'];
190 $init = true;
191 }
192 $success = true;
a6483c12 193 foreach ($value as $key => &$job) {
b814a8b8 194 $job['name'] = trim($job['name']);
a6483c12 195 if ($job['name'] == '' && $entreprise) {
b814a8b8 196 $job['tmp_name'] = $entreprise[$entr_val]->name;
a6483c12
SJ
197 ++$entr_val;
198 } else if ($job['name'] == '') {
199 $job['name_error'] = true;
200 $success = false;
b814a8b8 201 }
b94719c1 202
541e8d03 203 if (isset($job['removed']) && $job['removed']) {
b94719c1
SJ
204 if ($job['name'] == '' && $entreprise) {
205 $entreprise[$entr_val - 1]->clean();
206 }
ed01acac 207 array_splice($value, $key, 1);
37d44b3b
FB
208 }
209 }
a6483c12 210 foreach ($value as $key => &$job) {
37d44b3b 211 $ls = true;
541e8d03 212 $this->geocodeAddress($job['w_address'], $s);
37d44b3b 213 $ls = ($ls && $s);
bde2be3b 214 $this->cleanJob($page, $key, $job, $s);
37d44b3b
FB
215 $ls = ($ls && $s);
216 if (!$init) {
217 $success = ($success && $ls);
218 }
219 }
220 return $value;
221 }
222
223 public function save(ProfilePage &$page, $field, $value)
224 {
ecad8a08
SJ
225 // TODO: use address and phone classes to update profile_job_enum and profile_phones once they are done.
226
a6483c12
SJ
227 require_once 'profil.func.inc.php';
228 require_once 'validations.inc.php';
b814a8b8 229
c7139c07 230 XDB::execute("DELETE FROM profile_job
ce0b2c6f 231 WHERE pid = {?}",
a6483c12 232 $page->pid());
541e8d03
SJ
233 XDB::execute("DELETE FROM profile_addresses
234 WHERE pid = {?} AND type = 'job'",
a6483c12 235 $page->pid());
b235d980 236 XDB::execute("DELETE FROM profile_phones
ce0b2c6f 237 WHERE pid = {?} AND link_type = 'pro'",
a6483c12
SJ
238 $page->pid());
239 foreach ($value as $id => &$job) {
afaa2cc7
SJ
240 if (isset($job['name']) && $job['name']) {
241 if (isset($job['jobid']) && $job['jobid']) {
ce0b2c6f 242 XDB::execute("INSERT INTO profile_job (pid, id, description, sectorid, subsectorid,
afaa2cc7
SJ
243 subsubsectorid, email, url, pub, email_pub, jobid)
244 VALUES ({?}, {?}, {?}, {?}, {?}, {?}, {?}, {?}, {?}, {?}, {?})",
a6483c12 245 $page->pid(), $id, $job['description'], $job['sector'], $job['subSector'],
afaa2cc7
SJ
246 $job['subSubSector'], $job['w_email'], $job['w_url'], $job['pub'], $job['w_email_pub'], $job['jobid']);
247 } else {
ce0b2c6f 248 XDB::execute("INSERT INTO profile_job (pid, id, description, sectorid, subsectorid,
afaa2cc7
SJ
249 subsubsectorid, email, url, pub, email_pub)
250 VALUES ({?}, {?}, {?}, {?}, {?}, {?}, {?}, {?}, {?}, {?})",
a6483c12 251 $page->pid(), $id, $job['description'], $job['sector'], $job['subSector'],
afaa2cc7
SJ
252 $job['subSubSector'], $job['w_email'], $job['w_url'], $job['pub'], $job['w_email_pub']);
253 }
12bcf04b 254 $address = new ProfileSettingAddress();
a6483c12 255 $address->saveAddress($page->pid(), $id, $job['w_address'], 'job');
12bcf04b 256 $profiletel = new ProfileSettingPhones('pro', $id);
e3164bb1 257 $profiletel->saveTels($page->pid(), 'tel', $job['w_phone']);
b814a8b8 258 }
37d44b3b
FB
259 }
260 }
261}
262
12bcf04b 263class ProfileSettingJobs extends ProfilePage
3950bc21
FB
264{
265 protected $pg_template = 'profile/jobs.tpl';
266
267 public function __construct(PlWizard &$wiz)
268 {
269 parent::__construct($wiz);
37d44b3b 270 $this->settings['cv'] = null;
72e96bc0 271 $this->settings['corps'] = null;
12bcf04b 272 $this->settings['jobs'] = new ProfileSettingJob();
72e96bc0 273 $this->watched = array('cv' => true, 'jobs' => true, 'corps' => true);
37d44b3b
FB
274 }
275
7c2e0f0d 276 protected function _fetchData()
37d44b3b 277 {
37d44b3b
FB
278 // Checkout the CV
279 $res = XDB::query("SELECT cv
e5bcd851
FB
280 FROM profiles
281 WHERE pid = {?}",
282 $this->pid());
37d44b3b
FB
283 $this->values['cv'] = $res->fetchOneCell();
284
72e96bc0
SJ
285 // Checkout the corps
286 $res = XDB::query("SELECT original_corpsid AS original, current_corpsid AS current,
287 rankid AS rank, corps_pub AS pub
288 FROM profile_corps
ce0b2c6f 289 WHERE pid = {?}",
e5bcd851 290 $this->pid());
72e96bc0
SJ
291 $this->values['corps'] = $res->fetchOneAssoc();
292
37d44b3b 293 // Build the jobs tree
563f86f5 294 $res = XDB::iterRow("SELECT j.id, j.jobid, je.name, j.sectorid, j.subsectorid, j.subsubsectorid,
541e8d03
SJ
295 s.name, j.description, j.email, j.email_pub, j.url, j.pub,
296 je.acronym, je.url, je.email,
297 aw.accuracy, aw.text, aw.postalText, aw.postalCode, aw.localityId,
298 aw.subAdministrativeAreaId, aw.administrativeAreaId, aw.countryId,
299 aw.latitude, aw.longitude, aw.pub, aw.updateTime,
300 aw.north, aw.south, aw.east, aw.west,
301 ah.accuracy, ah.text, ah.postalText, ah.postalCode, ah.localityId,
302 ah.subAdministrativeAreaId, ah.administrativeAreaId, ah.countryId,
303 ah.latitude, ah.longitude, ah.pub, ah.updateTime,
304 ah.north, ah.south, ah.east, ah.west
c7139c07
SJ
305 FROM profile_job AS j
306 LEFT JOIN profile_job_enum AS je ON (j.jobid = je.id)
c7139c07 307 LEFT JOIN profile_job_subsubsector_enum AS s ON (s.id = j.subsubsectorid)
ce0b2c6f 308 LEFT JOIN profile_addresses AS aw ON (aw.pid = j.pid AND aw.type = 'job'
4d7d27fc 309 AND aw.id = j.id)
541e8d03 310 LEFT JOIN profile_addresses AS ah ON (ah.jobid = j.jobid AND ah.type = 'hq')
ce0b2c6f 311 WHERE j.pid = {?}
541e8d03 312 ORDER BY j.id",
a6391000 313 $this->pid());
37d44b3b 314 $this->values['jobs'] = array();
bde2be3b 315
afaa2cc7
SJ
316 if ($res->numRows() > 0) {
317 while (list($id, $jobid, $name, $sector, $subSector, $subSubSector,
318 $subSubSectorName, $description, $w_email, $w_emailPub, $w_url, $pub,
319 $hq_acronym, $hq_url, $hq_email,
320 $w_accuracy, $w_text, $w_postalText, $w_postalCode, $w_localityId,
321 $w_subAdministrativeAreaId, $w_administrativeAreaId, $w_countryId,
322 $w_latitude, $w_longitude, $w_pub, $w_updateTime,
323 $w_north, $w_south, $w_east, $w_west,
324 $hq_accuracy, $hq_text, $hq_postalText, $hq_postalCode, $hq_localityId,
325 $hq_subAdministrativeAreaId, $hq_administrativeAreaId, $hq_countryId,
326 $hq_latitude, $hq_longitude, $hq_pub, $hq_updateTime,
327 $hq_north, $hq_south, $hq_east, $hq_west,
328 ) = $res->next()) {
329 $this->values['jobs'][] = array(
330 'id' => $id,
331 'jobid' => $jobid,
332 'name' => $name,
333 'sector' => $sector,
334 'subSector' => $subSector,
335 'subSubSector' => $subSubSector,
336 'subSubSectorName' => $subSubSectorName,
337 'description' => $description,
338 'pub' => $pub,
339 'w_email' => $w_email,
340 'w_email_pub' => $w_emailPub,
341 'w_url' => $w_url,
342 'hq_acronym' => $hq_acronym,
343 'hq_url' => $hq_url,
344 'hq_email' => $hq_email,
345 'w_address' => array(
346 'accuracy' => $w_accuracy,
347 'text' => $w_text,
348 'postalText' => $w_postalText,
349 'postalCode' => $w_postalCode,
350 'localityId' => $w_localityId,
351 'subAdministrativeAreaId' => $w_subAdministrativeAreaId,
352 'administrativeAreaId' => $w_administrativeAreaId,
353 'countryId' => $w_countryId,
354 'latitude' => $w_latitude,
355 'longitude' => $w_longitude,
356 'pub' => $w_pub,
357 'updateTime' => $w_updateTime,
358 'north' => $w_north,
359 'south' => $w_south,
360 'east' => $w_east,
361 'west' => $w_west,
362 ),
363 'hq_address' => array(
364 'accuracy' => $hq_accuracy,
365 'text' => $hq_text,
366 'postalText' => $hq_postalText,
367 'postalCode' => $hq_postalCode,
368 'localityId' => $hq_localityId,
369 'subAdministrativeAreaId' => $hq_subAdministrativeAreaId,
370 'administrativeAreaId' => $hq_administrativeAreaId,
371 'countryId' => $hq_countryId,
372 'latitude' => $hq_latitude,
373 'longitude' => $hq_longitude,
374 'pub' => $hq_pub,
375 'updateTime' => $hq_updateTime,
376 'north' => $hq_north,
377 'south' => $hq_south,
378 'east' => $hq_east,
379 'west' => $hq_west,
380 ),
381 );
bde2be3b 382 }
afaa2cc7
SJ
383
384 $res = XDB::iterator("SELECT link_id AS jobid, tel_type AS type, pub, display_tel AS tel, comment
385 FROM profile_phones
ce0b2c6f 386 WHERE pid = {?} AND link_type = 'pro'
afaa2cc7 387 ORDER BY link_id",
a6483c12 388 $this->pid());
afaa2cc7
SJ
389 $i = 0;
390 $jobNb = count($this->values['jobs']);
391 while ($phone = $res->next()) {
392 $jobid = $phone['jobid'];
393 while ($i < $jobNb && $this->values['jobs'][$i]['id'] < $jobid) {
394 $i++;
395 }
396 if ($i >= $jobNb) {
397 break;
398 }
399 $job =& $this->values['jobs'][$i];
400 if (!isset($job['w_phone'])) {
401 $job['w_phone'] = array();
402 }
403 if ($job['id'] == $jobid) {
404 $job['w_phone'][] = $phone;
405 }
bde2be3b 406 }
afaa2cc7
SJ
407 foreach ($this->values['jobs'] as $id => &$job) {
408 if (!isset($job['w_phone'])) {
409 $job['w_phone'] = array(
410 0 => array(
411 'type' => 'fixed',
412 'tel' => '',
413 'pub' => 'private',
414 'comment' => '',
415 )
416 );
417 }
bde2be3b 418 }
afaa2cc7
SJ
419
420 $job['w_email_new'] = '';
421 if (!isset($job['hq_phone'])) {
422 $job['hq_phone'] = '';
bde2be3b 423 }
afaa2cc7
SJ
424 if (!isset($job['hq_fax'])) {
425 $job['hq_fax'] = '';
bde2be3b 426 }
afaa2cc7
SJ
427 if (!isset($job['w_email_pub'])) {
428 $job['w_email_pub'] = 'private';
bde2be3b 429 }
afaa2cc7
SJ
430 if (!$job['hq_address']['text']) {
431 $job['hq_address'] = array(
432 'text' => '',
433 'accuracy' => '',
434 'postalText' => '',
435 'postalCode' => '',
436 'administrativeAreaId' => '',
437 'subAdministrativeAreaId' => '',
438 'localityId' => '',
439 'countryId' => '',
440 'latitude' => '',
441 'longitude' => '',
442 'north' => '',
443 'south' => '',
444 'east' => '',
445 'west' => '',
446 'cedex' => '',
447 'updateTime' => '',
448 'changed' => '0',
449 'removed' => '0',
450 );
451 }
452 $job['w_address']['cedex'] = '';
453 $job['w_address']['changed'] = '0';
454 $job['w_address']['removed'] = '0';
455 } else {
456 $this->values['jobs'][] = $this->settings['jobs']->emptyJob();
bde2be3b 457 }
37d44b3b
FB
458 }
459
7c2e0f0d 460 protected function _saveData()
37d44b3b
FB
461 {
462 if ($this->changed['cv']) {
e5bcd851 463 XDB::execute("UPDATE profiles
37d44b3b 464 SET cv = {?}
e5bcd851
FB
465 WHERE pid = {?}",
466 $this->values['cv'], $this->pid());
37d44b3b 467 }
72e96bc0
SJ
468
469 if ($this->changed['corps']) {
34d09b54
SJ
470 XDB::execute('REPLACE INTO profile_corps (original_corpsid, current_corpsid, rankid, corps_pub, pid)
471 VALUES ({?}, {?}, {?}, {?}, {?})',
72e96bc0 472 $this->values['corps']['original'], $this->values['corps']['current'],
e5bcd851 473 $this->values['corps']['rank'], $this->values['corps']['pub'], $this->pid());
72e96bc0 474 }
3950bc21 475 }
2dcac0f5 476
04334c61 477 public function _prepare(PlPage &$page, $id)
2dcac0f5 478 {
a6483c12 479 require_once 'emails.combobox.inc.php';
e5bcd851 480 fill_email_combobox($page, $this->owner, $this->profile);
b715c1e1 481
33b6f5a0
SJ
482 $res = XDB::query("SELECT id, name AS label
483 FROM profile_job_sector_enum");
541e8d03 484 $page->assign('sectors', $res->fetchAllAssoc());
72e96bc0
SJ
485
486 $res = XDB::iterator("SELECT id, name
487 FROM profile_corps_enum
488 ORDER BY id = 1 DESC, name");
489 $page->assign('original_corps', $res->fetchAllAssoc());
490
491 $res = XDB::iterator("SELECT id, name
492 FROM profile_corps_enum
493 WHERE still_exists = 1
494 ORDER BY id = 1 DESC, name");
495 $page->assign('current_corps', $res->fetchAllAssoc());
496
497 $res = XDB::iterator("SELECT id, name
e489faf7
SJ
498 FROM profile_corps_rank_enum
499 ORDER BY id = 1 DESC, name");
72e96bc0 500 $page->assign('corps_rank', $res->fetchAllAssoc());
2dcac0f5 501 }
3950bc21
FB
502}
503
504// vim:set et sw=4 sts=4 sws=4 foldmethod=marker enc=utf-8:
505?>