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