Fixes jobs upgrade script.
[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) {
b814a8b8 156 $user = S::user();
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 {
b814a8b8
SJ
183 require_once('validations.inc.php');
184 $entreprise = Validate::get_typed_requests(S::i('uid'), 'entreprise');
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;
193 foreach ($value as $key=>&$job) {
b814a8b8 194 $job['name'] = trim($job['name']);
0345fc9d 195 if (!$job['name'] && $entreprise) {
b814a8b8
SJ
196 $job['tmp_name'] = $entreprise[$entr_val]->name;
197 $entr_val ++;
198 }
541e8d03 199 if (isset($job['removed']) && $job['removed']) {
37d44b3b
FB
200 unset($value[$key]);
201 }
202 }
203 foreach ($value as $key=>&$job) {
204 $ls = true;
541e8d03 205 $this->geocodeAddress($job['w_address'], $s);
37d44b3b 206 $ls = ($ls && $s);
bde2be3b 207 $this->cleanJob($page, $key, $job, $s);
37d44b3b
FB
208 $ls = ($ls && $s);
209 if (!$init) {
210 $success = ($success && $ls);
211 }
212 }
213 return $value;
214 }
215
216 public function save(ProfilePage &$page, $field, $value)
217 {
ecad8a08
SJ
218 // TODO: use address and phone classes to update profile_job_enum and profile_phones once they are done.
219
5e4417a9 220 require_once('profil.func.inc.php');
b814a8b8
SJ
221 require_once('validations.inc.php');
222
c7139c07 223 XDB::execute("DELETE FROM profile_job
ce0b2c6f
FB
224 WHERE pid = {?}",
225 $this->pid());
541e8d03
SJ
226 XDB::execute("DELETE FROM profile_addresses
227 WHERE pid = {?} AND type = 'job'",
ce0b2c6f 228 $this->pid());
b235d980 229 XDB::execute("DELETE FROM profile_phones
ce0b2c6f
FB
230 WHERE pid = {?} AND link_type = 'pro'",
231 $this->pid());
b814a8b8 232 foreach ($value as $id=>&$job) {
afaa2cc7
SJ
233 if (isset($job['name']) && $job['name']) {
234 if (isset($job['jobid']) && $job['jobid']) {
ce0b2c6f 235 XDB::execute("INSERT INTO profile_job (pid, id, description, sectorid, subsectorid,
afaa2cc7
SJ
236 subsubsectorid, email, url, pub, email_pub, jobid)
237 VALUES ({?}, {?}, {?}, {?}, {?}, {?}, {?}, {?}, {?}, {?}, {?})",
ce0b2c6f 238 $this->pid(), $id, $job['description'], $job['sector'], $job['subSector'],
afaa2cc7
SJ
239 $job['subSubSector'], $job['w_email'], $job['w_url'], $job['pub'], $job['w_email_pub'], $job['jobid']);
240 } else {
ce0b2c6f 241 XDB::execute("INSERT INTO profile_job (pid, id, description, sectorid, subsectorid,
afaa2cc7
SJ
242 subsubsectorid, email, url, pub, email_pub)
243 VALUES ({?}, {?}, {?}, {?}, {?}, {?}, {?}, {?}, {?}, {?})",
ce0b2c6f 244 $this->pid(), $id, $job['description'], $job['sector'], $job['subSector'],
afaa2cc7
SJ
245 $job['subSubSector'], $job['w_email'], $job['w_url'], $job['pub'], $job['w_email_pub']);
246 }
12bcf04b 247 $address = new ProfileSettingAddress();
afaa2cc7 248 $address->saveAddress($id, $job['w_address'], 'job');
12bcf04b 249 $profiletel = new ProfileSettingPhones('pro', $id);
afaa2cc7 250 $profiletel->saveTels('tel', $job['w_phone']);
b814a8b8 251 }
37d44b3b
FB
252 }
253 }
254}
255
12bcf04b 256class ProfileSettingJobs extends ProfilePage
3950bc21
FB
257{
258 protected $pg_template = 'profile/jobs.tpl';
259
260 public function __construct(PlWizard &$wiz)
261 {
262 parent::__construct($wiz);
37d44b3b 263 $this->settings['cv'] = null;
72e96bc0 264 $this->settings['corps'] = null;
12bcf04b 265 $this->settings['jobs'] = new ProfileSettingJob();
72e96bc0 266 $this->watched = array('cv' => true, 'jobs' => true, 'corps' => true);
37d44b3b
FB
267 }
268
7c2e0f0d 269 protected function _fetchData()
37d44b3b 270 {
37d44b3b
FB
271 // Checkout the CV
272 $res = XDB::query("SELECT cv
e5bcd851
FB
273 FROM profiles
274 WHERE pid = {?}",
275 $this->pid());
37d44b3b
FB
276 $this->values['cv'] = $res->fetchOneCell();
277
72e96bc0
SJ
278 // Checkout the corps
279 $res = XDB::query("SELECT original_corpsid AS original, current_corpsid AS current,
280 rankid AS rank, corps_pub AS pub
281 FROM profile_corps
ce0b2c6f 282 WHERE pid = {?}",
e5bcd851 283 $this->pid());
72e96bc0
SJ
284 $this->values['corps'] = $res->fetchOneAssoc();
285
37d44b3b 286 // Build the jobs tree
563f86f5 287 $res = XDB::iterRow("SELECT j.id, j.jobid, je.name, j.sectorid, j.subsectorid, j.subsubsectorid,
541e8d03
SJ
288 s.name, j.description, j.email, j.email_pub, j.url, j.pub,
289 je.acronym, je.url, je.email,
290 aw.accuracy, aw.text, aw.postalText, aw.postalCode, aw.localityId,
291 aw.subAdministrativeAreaId, aw.administrativeAreaId, aw.countryId,
292 aw.latitude, aw.longitude, aw.pub, aw.updateTime,
293 aw.north, aw.south, aw.east, aw.west,
294 ah.accuracy, ah.text, ah.postalText, ah.postalCode, ah.localityId,
295 ah.subAdministrativeAreaId, ah.administrativeAreaId, ah.countryId,
296 ah.latitude, ah.longitude, ah.pub, ah.updateTime,
297 ah.north, ah.south, ah.east, ah.west
c7139c07
SJ
298 FROM profile_job AS j
299 LEFT JOIN profile_job_enum AS je ON (j.jobid = je.id)
c7139c07 300 LEFT JOIN profile_job_subsubsector_enum AS s ON (s.id = j.subsubsectorid)
ce0b2c6f 301 LEFT JOIN profile_addresses AS aw ON (aw.pid = j.pid AND aw.type = 'job'
4d7d27fc 302 AND aw.id = j.id)
541e8d03 303 LEFT JOIN profile_addresses AS ah ON (ah.jobid = j.jobid AND ah.type = 'hq')
ce0b2c6f 304 WHERE j.pid = {?}
541e8d03 305 ORDER BY j.id",
a6391000 306 $this->pid());
37d44b3b 307 $this->values['jobs'] = array();
bde2be3b 308
afaa2cc7
SJ
309 if ($res->numRows() > 0) {
310 while (list($id, $jobid, $name, $sector, $subSector, $subSubSector,
311 $subSubSectorName, $description, $w_email, $w_emailPub, $w_url, $pub,
312 $hq_acronym, $hq_url, $hq_email,
313 $w_accuracy, $w_text, $w_postalText, $w_postalCode, $w_localityId,
314 $w_subAdministrativeAreaId, $w_administrativeAreaId, $w_countryId,
315 $w_latitude, $w_longitude, $w_pub, $w_updateTime,
316 $w_north, $w_south, $w_east, $w_west,
317 $hq_accuracy, $hq_text, $hq_postalText, $hq_postalCode, $hq_localityId,
318 $hq_subAdministrativeAreaId, $hq_administrativeAreaId, $hq_countryId,
319 $hq_latitude, $hq_longitude, $hq_pub, $hq_updateTime,
320 $hq_north, $hq_south, $hq_east, $hq_west,
321 ) = $res->next()) {
322 $this->values['jobs'][] = array(
323 'id' => $id,
324 'jobid' => $jobid,
325 'name' => $name,
326 'sector' => $sector,
327 'subSector' => $subSector,
328 'subSubSector' => $subSubSector,
329 'subSubSectorName' => $subSubSectorName,
330 'description' => $description,
331 'pub' => $pub,
332 'w_email' => $w_email,
333 'w_email_pub' => $w_emailPub,
334 'w_url' => $w_url,
335 'hq_acronym' => $hq_acronym,
336 'hq_url' => $hq_url,
337 'hq_email' => $hq_email,
338 'w_address' => array(
339 'accuracy' => $w_accuracy,
340 'text' => $w_text,
341 'postalText' => $w_postalText,
342 'postalCode' => $w_postalCode,
343 'localityId' => $w_localityId,
344 'subAdministrativeAreaId' => $w_subAdministrativeAreaId,
345 'administrativeAreaId' => $w_administrativeAreaId,
346 'countryId' => $w_countryId,
347 'latitude' => $w_latitude,
348 'longitude' => $w_longitude,
349 'pub' => $w_pub,
350 'updateTime' => $w_updateTime,
351 'north' => $w_north,
352 'south' => $w_south,
353 'east' => $w_east,
354 'west' => $w_west,
355 ),
356 'hq_address' => array(
357 'accuracy' => $hq_accuracy,
358 'text' => $hq_text,
359 'postalText' => $hq_postalText,
360 'postalCode' => $hq_postalCode,
361 'localityId' => $hq_localityId,
362 'subAdministrativeAreaId' => $hq_subAdministrativeAreaId,
363 'administrativeAreaId' => $hq_administrativeAreaId,
364 'countryId' => $hq_countryId,
365 'latitude' => $hq_latitude,
366 'longitude' => $hq_longitude,
367 'pub' => $hq_pub,
368 'updateTime' => $hq_updateTime,
369 'north' => $hq_north,
370 'south' => $hq_south,
371 'east' => $hq_east,
372 'west' => $hq_west,
373 ),
374 );
bde2be3b 375 }
afaa2cc7
SJ
376
377 $res = XDB::iterator("SELECT link_id AS jobid, tel_type AS type, pub, display_tel AS tel, comment
378 FROM profile_phones
ce0b2c6f 379 WHERE pid = {?} AND link_type = 'pro'
afaa2cc7
SJ
380 ORDER BY link_id",
381 S::i('uid'));
382 $i = 0;
383 $jobNb = count($this->values['jobs']);
384 while ($phone = $res->next()) {
385 $jobid = $phone['jobid'];
386 while ($i < $jobNb && $this->values['jobs'][$i]['id'] < $jobid) {
387 $i++;
388 }
389 if ($i >= $jobNb) {
390 break;
391 }
392 $job =& $this->values['jobs'][$i];
393 if (!isset($job['w_phone'])) {
394 $job['w_phone'] = array();
395 }
396 if ($job['id'] == $jobid) {
397 $job['w_phone'][] = $phone;
398 }
bde2be3b 399 }
afaa2cc7
SJ
400 foreach ($this->values['jobs'] as $id => &$job) {
401 if (!isset($job['w_phone'])) {
402 $job['w_phone'] = array(
403 0 => array(
404 'type' => 'fixed',
405 'tel' => '',
406 'pub' => 'private',
407 'comment' => '',
408 )
409 );
410 }
bde2be3b 411 }
afaa2cc7
SJ
412
413 $job['w_email_new'] = '';
414 if (!isset($job['hq_phone'])) {
415 $job['hq_phone'] = '';
bde2be3b 416 }
afaa2cc7
SJ
417 if (!isset($job['hq_fax'])) {
418 $job['hq_fax'] = '';
bde2be3b 419 }
afaa2cc7
SJ
420 if (!isset($job['w_email_pub'])) {
421 $job['w_email_pub'] = 'private';
bde2be3b 422 }
afaa2cc7
SJ
423 if (!$job['hq_address']['text']) {
424 $job['hq_address'] = array(
425 'text' => '',
426 'accuracy' => '',
427 'postalText' => '',
428 'postalCode' => '',
429 'administrativeAreaId' => '',
430 'subAdministrativeAreaId' => '',
431 'localityId' => '',
432 'countryId' => '',
433 'latitude' => '',
434 'longitude' => '',
435 'north' => '',
436 'south' => '',
437 'east' => '',
438 'west' => '',
439 'cedex' => '',
440 'updateTime' => '',
441 'changed' => '0',
442 'removed' => '0',
443 );
444 }
445 $job['w_address']['cedex'] = '';
446 $job['w_address']['changed'] = '0';
447 $job['w_address']['removed'] = '0';
448 } else {
449 $this->values['jobs'][] = $this->settings['jobs']->emptyJob();
bde2be3b 450 }
37d44b3b
FB
451 }
452
7c2e0f0d 453 protected function _saveData()
37d44b3b
FB
454 {
455 if ($this->changed['cv']) {
e5bcd851 456 XDB::execute("UPDATE profiles
37d44b3b 457 SET cv = {?}
e5bcd851
FB
458 WHERE pid = {?}",
459 $this->values['cv'], $this->pid());
37d44b3b 460 }
72e96bc0
SJ
461
462 if ($this->changed['corps']) {
463 XDB::execute("UPDATE profile_corps
464 SET original_corpsid = {?}, current_corpsid = {?},
465 rankid = {?}, corps_pub = {?}
ce0b2c6f 466 WHERE pid = {?}",
72e96bc0 467 $this->values['corps']['original'], $this->values['corps']['current'],
e5bcd851 468 $this->values['corps']['rank'], $this->values['corps']['pub'], $this->pid());
72e96bc0 469 }
3950bc21 470 }
2dcac0f5 471
04334c61 472 public function _prepare(PlPage &$page, $id)
2dcac0f5 473 {
b715c1e1 474 require_once "emails.combobox.inc.php";
e5bcd851 475 fill_email_combobox($page, $this->owner, $this->profile);
b715c1e1 476
33b6f5a0
SJ
477 $res = XDB::query("SELECT id, name AS label
478 FROM profile_job_sector_enum");
541e8d03 479 $page->assign('sectors', $res->fetchAllAssoc());
72e96bc0
SJ
480
481 $res = XDB::iterator("SELECT id, name
482 FROM profile_corps_enum
483 ORDER BY id = 1 DESC, name");
484 $page->assign('original_corps', $res->fetchAllAssoc());
485
486 $res = XDB::iterator("SELECT id, name
487 FROM profile_corps_enum
488 WHERE still_exists = 1
489 ORDER BY id = 1 DESC, name");
490 $page->assign('current_corps', $res->fetchAllAssoc());
491
492 $res = XDB::iterator("SELECT id, name
493 FROM profile_corps_rank_enum");
494 $page->assign('corps_rank', $res->fetchAllAssoc());
2dcac0f5 495 }
3950bc21
FB
496}
497
498// vim:set et sw=4 sts=4 sws=4 foldmethod=marker enc=utf-8:
499?>