2 /***************************************************************************
3 * Copyright (C) 2003-2010 Polytechnique.org *
4 * http://opensource.polytechnique.org/ *
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. *
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. *
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 *
19 * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA *
20 ***************************************************************************/
22 class ProfileSettingJob
extends ProfileSettingGeocoding
31 public function __construct()
33 $this->pub
= new ProfileSettingPub();
36 = new ProfileSettingEmail();
37 $this->url
= new ProfileSettingWeb();
38 $this->bool
= new ProfileSettingBool();
39 $this->checks
= array('url' => array('w_url'),
40 'email' => array('w_email'),
41 'pub' => array('pub', 'w_email_pub'),
45 public function emptyJob()
55 'hq_address' => array(
60 'administrativeAreaId' => '',
61 'subAdministrativeAreaId' => '',
77 'subSubSectorName' => null
,
80 'subSubSector' => '0',
89 'administrativeAreaId' => '',
90 'subAdministrativeAreaId' => '',
105 'w_email_pub' => 'private',
107 'w_phone' => array(0 => array(
117 private function cleanJob(ProfilePage
&$page, $jobid, array &$job, &$success)
120 if ($job['w_email'] == "new@example.org") {
121 $job['w_email'] = $job['w_email_new'];
123 foreach ($this->checks
as $obj=>&$fields) {
125 foreach ($fields as $field) {
126 $job[$field] = $chk->value($page, $field, $job[$field], $s);
129 $job[$field . '_error'] = true
;
133 if (!$job['subSubSectorName']) {
134 $res = XDB
::query("SELECT name
135 FROM profile_job_subsubsector_enum
137 $job['subSubSector']);
138 $job['subSubSectorName'] = $res->fetchOneCell();
140 $res = XDB
::query("SELECT sectorid, subsectorid, id
141 FROM profile_job_subsubsector_enum
143 $job['subSubSectorName']);
144 if ($res->numRows() != 1) {
146 $job['sector_error'] = true
;
148 list($job['sector'], $job['subSector'], $job['subSubSector']) = $res->fetchOneRow();
151 if (count($job['terms'])) {
153 foreach ($job['terms'] as $term) {
154 if (!$term['full_name']) {
155 $termsid[] = $term['jtid'];
158 if (count($termsid)) {
159 $res = XDB
::query("SELECT jtid, full_name
160 FROM profile_job_term_enum
163 $term_id_to_name = $res->fetchAllAssoc('jtid', false
);
164 foreach ($job['terms'] as &$term) {
165 if (!$term['full_name']) {
166 $term['full_name'] = $term_id_to_name[$term['jtid']];
172 $res = XDB
::query("SELECT id
173 FROM profile_job_enum
176 if ($res->numRows() != 1) {
177 $this->geocodeAddress($job['hq_address'], $s);
179 $gmapsGeocoder = new GMapsGeocoder();
180 $job['hq_address'] = $gmapsGeocoder->stripGeocodingFromAddress($job['hq_address']);
182 $req = new EntrReq(S
::user(), $page->profile
, $jobid, $job['name'], $job['hq_acronym'], $job['hq_url'],
183 $job['hq_email'], $job['hq_fixed'], $job['hq_fax'], $job['hq_address']);
185 $job['jobid'] = null
;
188 $job['jobid'] = $res->fetchOneCell();
191 $job['w_address']['pub'] = $this->pub
->value($page, 'address_pub', $job['w_address']['pub'], $s);
192 $job['w_phone'] = Phone
::formatFormArray($job['w_phone'], $s);
194 unset($job['removed']);
198 public function value(ProfilePage
&$page, $field, $value, &$success)
200 require_once 'validations.inc.php';
201 $entreprise = ProfileValidate
::get_typed_requests($page->pid(), 'entreprise');
205 if (is_null($value)) {
206 $value = $page->values
['jobs'];
210 foreach ($value as $key => &$job) {
211 $job['name'] = trim($job['name']);
212 if ($job['name'] == '' && $entreprise) {
213 $job['tmp_name'] = $entreprise[$entr_val]->name
;
215 } else if ($job['name'] == '') {
216 if ($job['subSubSectorName'] == '' && $job['description'] == '' && $job['w_url'] == ''
217 && $job['w_address']['text'] == '' && $job['w_email'] == ''
218 && count($job['w_phone']) == 1 && $job['w_phone']['tel'] == '') {
219 array_splice($value, $key, 1);
223 $job['name_error'] = true
;
227 if (isset($job['removed']) && $job['removed']) {
228 if ($job['name'] == '' && $entreprise) {
229 $entreprise[$entr_val - 1]->clean();
231 array_splice($value, $key, 1);
234 foreach ($value as $key => &$job) {
236 $this->geocodeAddress($job['w_address'], $s);
238 $this->cleanJob($page, $key, $job, $s);
241 $success = ($success && $ls);
247 public function save(ProfilePage
&$page, $field, $value)
249 // TODO: use address class to update profile_job_enum once it is done.
250 XDB
::execute("DELETE FROM profile_job
253 XDB
::execute("DELETE FROM profile_addresses
254 WHERE pid = {?} AND type = 'job'",
256 Phone
::deletePhones($page->pid(), Phone
::LINK_JOB
);
257 $terms_values = array();
258 foreach ($value as $id => &$job) {
259 if (isset($job['name']) && $job['name']) {
260 if (isset($job['jobid']) && $job['jobid']) {
261 XDB
::execute("INSERT INTO profile_job (pid, id, description, sectorid, subsectorid,
262 subsubsectorid, email, url, pub, email_pub, jobid)
263 VALUES ({?}, {?}, {?}, {?}, {?}, {?}, {?}, {?}, {?}, {?}, {?})",
264 $page->pid(), $id, $job['description'], $job['sector'], $job['subSector'],
265 $job['subSubSector'], $job['w_email'], $job['w_url'], $job['pub'], $job['w_email_pub'], $job['jobid']);
267 XDB
::execute("INSERT INTO profile_job (pid, id, description, sectorid, subsectorid,
268 subsubsectorid, email, url, pub, email_pub)
269 VALUES ({?}, {?}, {?}, {?}, {?}, {?}, {?}, {?}, {?}, {?})",
270 $page->pid(), $id, $job['description'], $job['sector'], $job['subSector'],
271 $job['subSubSector'], $job['w_email'], $job['w_url'], $job['pub'], $job['w_email_pub']);
273 $address = new ProfileSettingAddress();
274 $address->saveAddress($page->pid(), $id, $job['w_address'], 'job');
275 Phone
::savePhones($job['w_phone'], $page->pid(), Phone
::LINK_JOB
, $id);
276 if (isset($job['terms'])) {
277 foreach ($job['terms'] as $term) {
278 $terms_values[] = '('.XDB
::escape($page->pid()).', '. XDB
::escape($id).', '.XDB
::escape($term['jtid']).', "original")';
283 if (count($terms_values) > 0) {
284 XDB
::execute('INSERT INTO profile_job_term (pid, jid, jtid, computed)
285 VALUES '.implode(', ', $terms_values));
289 public function getText($value) {
291 foreach ($value as $id => $job) {
292 $address = new ProfileSettingAddress();
293 $phones = Phone
::formArrayToString($job['w_phone']);
294 $jobs[] = 'Entreprise : ' . $job['name'] . ', secteur : ' . $job['subSubSectorName']
295 . ', description : ' . $job['description'] . ', web : ' . $job['w_url']
296 . ', email : ' . $job['w_email']
297 . ($phones ?
', ' . $phones : '') . ', ' . $address->getText($job['w_address']);
299 return implode(' ; ' , $jobs);
303 class ProfileSettingCorps
implements ProfileSetting
305 public function value(ProfilePage
&$page, $field, $value, &$success)
308 if (is_null($value)) {
309 $res = XDB
::query("SELECT original_corpsid AS original, current_corpsid AS current,
310 rankid AS rank, corps_pub AS pub
314 return $res->fetchOneAssoc();
319 public function save(ProfilePage
&$page, $field, $value)
321 XDB
::execute('REPLACE INTO profile_corps (original_corpsid, current_corpsid, rankid, corps_pub, pid)
322 VALUES ({?}, {?}, {?}, {?}, {?})',
323 $value['original'], $value['current'], $value['rank'], $value['pub'], $page->pid());
326 public function getText($value)
328 $corpsList = DirEnum
::getOptions(DirEnum
::CORPS
);
329 $rankList = DirEnum
::getOptions(DirEnum
::CORPSRANKS
);
330 return 'Corps actuel : ' . $corpsList[$value['current']] . ' , rang : ' . $corpsList[$value['rank']]
331 . ' , corps d\'origine : ' . $corpsList[$value['original']] . ' , affichage : ' . $value['pub'];
335 class ProfileSettingJobs
extends ProfilePage
337 protected $pg_template = 'profile/jobs.tpl';
339 public function __construct(PlWizard
&$wiz)
341 parent
::__construct($wiz);
342 $this->settings
['cv'] = null
;
343 $this->settings
['corps'] = new ProfileSettingCorps();
344 $this->settings
['jobs'] = new ProfileSettingJob();
345 $this->watched
= array('cv' => true
, 'jobs' => true
, 'corps' => true
);
348 protected function _fetchData()
351 $res = XDB
::query("SELECT cv
355 $this->values
['cv'] = $res->fetchOneCell();
357 // Build the jobs tree
358 $res = XDB
::iterRow("SELECT j.id, j.jobid, je.name, j.sectorid, j.subsectorid, j.subsubsectorid,
359 s.name, j.description, j.email, j.email_pub, j.url, j.pub,
360 je.acronym, je.url, je.email,
361 aw.accuracy, aw.text, aw.postalText, aw.postalCode, aw.localityId,
362 aw.subAdministrativeAreaId, aw.administrativeAreaId, aw.countryId,
363 aw.latitude, aw.longitude, aw.pub, aw.updateTime,
364 aw.north, aw.south, aw.east, aw.west,
365 ah.accuracy, ah.text, ah.postalText, ah.postalCode, ah.localityId,
366 ah.subAdministrativeAreaId, ah.administrativeAreaId, ah.countryId,
367 ah.latitude, ah.longitude, ah.pub, ah.updateTime,
368 ah.north, ah.south, ah.east, ah.west
369 FROM profile_job AS j
370 LEFT JOIN profile_job_enum AS je ON (j.jobid = je.id)
371 LEFT JOIN profile_job_subsubsector_enum AS s ON (s.id = j.subsubsectorid)
372 LEFT JOIN profile_addresses AS aw ON (aw.pid = j.pid AND aw.type = 'job'
374 LEFT JOIN profile_addresses AS ah ON (ah.jobid = j.jobid AND ah.type = 'hq')
378 $this->values
['jobs'] = array();
380 if ($res->numRows() > 0) {
381 while (list($id, $jobid, $name, $sector, $subSector, $subSubSector,
382 $subSubSectorName, $description, $w_email, $w_emailPub, $w_url, $pub,
383 $hq_acronym, $hq_url, $hq_email,
384 $w_accuracy, $w_text, $w_postalText, $w_postalCode, $w_localityId,
385 $w_subAdministrativeAreaId, $w_administrativeAreaId, $w_countryId,
386 $w_latitude, $w_longitude, $w_pub, $w_updateTime,
387 $w_north, $w_south, $w_east, $w_west,
388 $hq_accuracy, $hq_text, $hq_postalText, $hq_postalCode, $hq_localityId,
389 $hq_subAdministrativeAreaId, $hq_administrativeAreaId, $hq_countryId,
390 $hq_latitude, $hq_longitude, $hq_pub, $hq_updateTime,
391 $hq_north, $hq_south, $hq_east, $hq_west,
393 $this->values
['jobs'][] = array(
398 'subSector' => $subSector,
399 'subSubSector' => $subSubSector,
400 'subSubSectorName' => $subSubSectorName,
401 'description' => $description,
403 'w_email' => $w_email,
404 'w_email_pub' => $w_emailPub,
406 'hq_acronym' => $hq_acronym,
408 'hq_email' => $hq_email,
409 'w_address' => array(
410 'accuracy' => $w_accuracy,
412 'postalText' => $w_postalText,
413 'postalCode' => $w_postalCode,
414 'localityId' => $w_localityId,
415 'subAdministrativeAreaId' => $w_subAdministrativeAreaId,
416 'administrativeAreaId' => $w_administrativeAreaId,
417 'countryId' => $w_countryId,
418 'latitude' => $w_latitude,
419 'longitude' => $w_longitude,
421 'updateTime' => $w_updateTime,
427 'hq_address' => array(
428 'accuracy' => $hq_accuracy,
430 'postalText' => $hq_postalText,
431 'postalCode' => $hq_postalCode,
432 'localityId' => $hq_localityId,
433 'subAdministrativeAreaId' => $hq_subAdministrativeAreaId,
434 'administrativeAreaId' => $hq_administrativeAreaId,
435 'countryId' => $hq_countryId,
436 'latitude' => $hq_latitude,
437 'longitude' => $hq_longitude,
439 'updateTime' => $hq_updateTime,
440 'north' => $hq_north,
441 'south' => $hq_south,
448 $it = Phone
::iterate(array($this->pid()), array(Phone
::LINK_JOB
));
449 while ($phone = $it->next()) {
450 $this->values
['jobs'][$phone->linkId()]['w_phone'][$phone->id()] = $phone->toFormArray();
452 $res = XDB
::iterator("SELECT e.jtid, e.full_name, j.jid AS jobid
453 FROM profile_job_term_enum AS e
454 INNER JOIN profile_job_term AS j USING(jtid)
459 $jobNb = count($this->values
['jobs']);
460 while ($term = $res->next()) {
461 $jobid = $term['jobid'];
462 while ($i < $jobNb && $this->values
['jobs'][$i]['id'] < $jobid) {
468 $job =& $this->values
['jobs'][$i];
469 if ($job['id'] != $jobid) {
472 if (!isset($job['terms'])) {
473 $job['terms'] = array();
475 $job['terms'][] = $term;
478 foreach ($this->values
['jobs'] as $id => &$job) {
479 $phone = new Phone();
480 if (!isset($job['w_phone'])) {
481 $job['w_phone'] = array(0 => $phone->toFormArray());
485 $job['w_email_new'] = '';
486 if (!isset($job['hq_fixed'])) {
487 $job['hq_fixed'] = '';
489 if (!isset($job['hq_fax'])) {
492 if (!isset($job['w_email_pub'])) {
493 $job['w_email_pub'] = 'private';
495 if (!$job['hq_address']['text']) {
496 $job['hq_address'] = array(
501 'administrativeAreaId' => '',
502 'subAdministrativeAreaId' => '',
517 $job['w_address']['cedex'] = '';
518 $job['w_address']['changed'] = '0';
519 $job['w_address']['removed'] = '0';
521 $this->values
['jobs'][] = $this->settings
['jobs']->emptyJob();
525 protected function _saveData()
527 if ($this->changed
['cv']) {
528 XDB
::execute("UPDATE profiles
531 $this->values
['cv'], $this->pid());
535 public function _prepare(PlPage
&$page, $id)
537 require_once 'emails.combobox.inc.php';
538 fill_email_combobox($page, $this->owner
);
540 $res = XDB
::query("SELECT id, name AS label
541 FROM profile_job_sector_enum");
542 $page->assign('sectors', $res->fetchAllAssoc());
544 $res = XDB
::iterator("SELECT id, name
545 FROM profile_corps_enum
546 ORDER BY id = 1 DESC, name");
547 $page->assign('original_corps', $res->fetchAllAssoc());
549 $res = XDB
::iterator("SELECT id, name
550 FROM profile_corps_enum
551 WHERE still_exists = 1
552 ORDER BY id = 1 DESC, name");
553 $page->assign('current_corps', $res->fetchAllAssoc());
555 $res = XDB
::iterator("SELECT id, name
556 FROM profile_corps_rank_enum
557 ORDER BY id = 1 DESC, name");
558 $page->assign('corps_rank', $res->fetchAllAssoc());
562 // vim:set et sw=4 sts=4 sws=4 foldmethod=marker enc=utf-8: