f173b41ca9df7aaf1269c05833b3dc2d008b0bba
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);
233 foreach (array('sectorid', 'subsectorid', 'subsubsectorid') as $key) {
234 if ($job[$key] == 0) {
239 foreach ($value as $key => &$job) {
241 $this->geocodeAddress($job['w_address'], $s);
243 $this->cleanJob($page, $key, $job, $s);
246 $success = ($success && $ls);
252 public function save(ProfilePage
&$page, $field, $value)
254 // TODO: use address class to update profile_job_enum once it is done.
255 XDB
::execute("DELETE FROM profile_job
258 XDB
::execute("DELETE FROM profile_addresses
259 WHERE pid = {?} AND type = 'job'",
261 Phone
::deletePhones($page->pid(), Phone
::LINK_JOB
);
262 $terms_values = array();
263 foreach ($value as $id => &$job) {
264 if (isset($job['name']) && $job['name']) {
265 if (isset($job['jobid']) && $job['jobid']) {
266 XDB
::execute("INSERT INTO profile_job (pid, id, description, sectorid, subsectorid,
267 subsubsectorid, email, url, pub, email_pub, jobid)
268 VALUES ({?}, {?}, {?}, {?}, {?}, {?}, {?}, {?}, {?}, {?}, {?})",
269 $page->pid(), $id, $job['description'], $job['sector'], $job['subSector'],
270 $job['subSubSector'], $job['w_email'], $job['w_url'], $job['pub'], $job['w_email_pub'], $job['jobid']);
272 XDB
::execute("INSERT INTO profile_job (pid, id, description, sectorid, subsectorid,
273 subsubsectorid, email, url, pub, email_pub)
274 VALUES ({?}, {?}, {?}, {?}, {?}, {?}, {?}, {?}, {?}, {?})",
275 $page->pid(), $id, $job['description'], $job['sector'], $job['subSector'],
276 $job['subSubSector'], $job['w_email'], $job['w_url'], $job['pub'], $job['w_email_pub']);
278 $address = new ProfileSettingAddress();
279 $address->saveAddress($page->pid(), $id, $job['w_address'], 'job');
280 Phone
::savePhones($job['w_phone'], $page->pid(), Phone
::LINK_JOB
, $id);
281 if (isset($job['terms'])) {
282 foreach ($job['terms'] as $term) {
283 $terms_values[] = '('.XDB
::escape($page->pid()).', '. XDB
::escape($id).', '.XDB
::escape($term['jtid']).', "original")';
288 if (count($terms_values) > 0) {
289 XDB
::execute('INSERT INTO profile_job_term (pid, jid, jtid, computed)
290 VALUES '.implode(', ', $terms_values));
294 public function getText($value) {
296 foreach ($value as $id => $job) {
297 $address = new ProfileSettingAddress();
298 $phones = Phone
::formArrayToString($job['w_phone']);
299 $jobs[] = 'Entreprise : ' . $job['name'] . ', secteur : ' . $job['subSubSectorName']
300 . ', description : ' . $job['description'] . ', web : ' . $job['w_url']
301 . ', email : ' . $job['w_email']
302 . ($phones ?
', ' . $phones : '') . ', ' . $address->getText($job['w_address']);
304 return implode(' ; ' , $jobs);
308 class ProfileSettingCorps
implements ProfileSetting
310 public function value(ProfilePage
&$page, $field, $value, &$success)
313 if (is_null($value)) {
314 $res = XDB
::query("SELECT original_corpsid AS original, current_corpsid AS current,
315 rankid AS rank, corps_pub AS pub
319 return $res->fetchOneAssoc();
324 public function save(ProfilePage
&$page, $field, $value)
326 XDB
::execute('REPLACE INTO profile_corps (original_corpsid, current_corpsid, rankid, corps_pub, pid)
327 VALUES ({?}, {?}, {?}, {?}, {?})',
328 $value['original'], $value['current'], $value['rank'], $value['pub'], $page->pid());
331 public function getText($value)
333 $corpsList = DirEnum
::getOptions(DirEnum
::CORPS
);
334 $rankList = DirEnum
::getOptions(DirEnum
::CORPSRANKS
);
335 return 'Corps actuel : ' . $corpsList[$value['current']] . ' , rang : ' . $corpsList[$value['rank']]
336 . ' , corps d\'origine : ' . $corpsList[$value['original']] . ' , affichage : ' . $value['pub'];
340 class ProfileSettingJobs
extends ProfilePage
342 protected $pg_template = 'profile/jobs.tpl';
344 public function __construct(PlWizard
&$wiz)
346 parent
::__construct($wiz);
347 $this->settings
['cv'] = null
;
348 $this->settings
['corps'] = new ProfileSettingCorps();
349 $this->settings
['jobs'] = new ProfileSettingJob();
350 $this->watched
= array('cv' => true
, 'jobs' => true
, 'corps' => true
);
353 protected function _fetchData()
356 $res = XDB
::query("SELECT cv
360 $this->values
['cv'] = $res->fetchOneCell();
362 // Build the jobs tree
363 $res = XDB
::iterRow("SELECT j.id, j.jobid, je.name, j.sectorid, j.subsectorid, j.subsubsectorid,
364 s.name, j.description, j.email, j.email_pub, j.url, j.pub,
365 je.acronym, je.url, je.email,
366 aw.accuracy, aw.text, aw.postalText, aw.postalCode, aw.localityId,
367 aw.subAdministrativeAreaId, aw.administrativeAreaId, aw.countryId,
368 aw.latitude, aw.longitude, aw.pub, aw.updateTime,
369 aw.north, aw.south, aw.east, aw.west,
370 ah.accuracy, ah.text, ah.postalText, ah.postalCode, ah.localityId,
371 ah.subAdministrativeAreaId, ah.administrativeAreaId, ah.countryId,
372 ah.latitude, ah.longitude, ah.pub, ah.updateTime,
373 ah.north, ah.south, ah.east, ah.west
374 FROM profile_job AS j
375 LEFT JOIN profile_job_enum AS je ON (j.jobid = je.id)
376 LEFT JOIN profile_job_subsubsector_enum AS s ON (s.id = j.subsubsectorid)
377 LEFT JOIN profile_addresses AS aw ON (aw.pid = j.pid AND aw.type = 'job'
379 LEFT JOIN profile_addresses AS ah ON (ah.jobid = j.jobid AND ah.type = 'hq')
383 $this->values
['jobs'] = array();
385 if ($res->numRows() > 0) {
386 while (list($id, $jobid, $name, $sector, $subSector, $subSubSector,
387 $subSubSectorName, $description, $w_email, $w_emailPub, $w_url, $pub,
388 $hq_acronym, $hq_url, $hq_email,
389 $w_accuracy, $w_text, $w_postalText, $w_postalCode, $w_localityId,
390 $w_subAdministrativeAreaId, $w_administrativeAreaId, $w_countryId,
391 $w_latitude, $w_longitude, $w_pub, $w_updateTime,
392 $w_north, $w_south, $w_east, $w_west,
393 $hq_accuracy, $hq_text, $hq_postalText, $hq_postalCode, $hq_localityId,
394 $hq_subAdministrativeAreaId, $hq_administrativeAreaId, $hq_countryId,
395 $hq_latitude, $hq_longitude, $hq_pub, $hq_updateTime,
396 $hq_north, $hq_south, $hq_east, $hq_west,
398 $this->values
['jobs'][] = array(
403 'subSector' => $subSector,
404 'subSubSector' => $subSubSector,
405 'subSubSectorName' => $subSubSectorName,
406 'description' => $description,
408 'w_email' => $w_email,
409 'w_email_pub' => $w_emailPub,
411 'hq_acronym' => $hq_acronym,
413 'hq_email' => $hq_email,
414 'w_address' => array(
415 'accuracy' => $w_accuracy,
417 'postalText' => $w_postalText,
418 'postalCode' => $w_postalCode,
419 'localityId' => $w_localityId,
420 'subAdministrativeAreaId' => $w_subAdministrativeAreaId,
421 'administrativeAreaId' => $w_administrativeAreaId,
422 'countryId' => $w_countryId,
423 'latitude' => $w_latitude,
424 'longitude' => $w_longitude,
426 'updateTime' => $w_updateTime,
432 'hq_address' => array(
433 'accuracy' => $hq_accuracy,
435 'postalText' => $hq_postalText,
436 'postalCode' => $hq_postalCode,
437 'localityId' => $hq_localityId,
438 'subAdministrativeAreaId' => $hq_subAdministrativeAreaId,
439 'administrativeAreaId' => $hq_administrativeAreaId,
440 'countryId' => $hq_countryId,
441 'latitude' => $hq_latitude,
442 'longitude' => $hq_longitude,
444 'updateTime' => $hq_updateTime,
445 'north' => $hq_north,
446 'south' => $hq_south,
453 $it = Phone
::iterate(array($this->pid()), array(Phone
::LINK_JOB
));
454 while ($phone = $it->next()) {
455 $this->values
['jobs'][$phone->linkId()]['w_phone'][$phone->id()] = $phone->toFormArray();
457 $res = XDB
::iterator("SELECT e.jtid, e.full_name, j.jid AS jobid
458 FROM profile_job_term_enum AS e
459 INNER JOIN profile_job_term AS j USING(jtid)
464 $jobNb = count($this->values
['jobs']);
465 while ($term = $res->next()) {
466 $jobid = $term['jobid'];
467 while ($i < $jobNb && $this->values
['jobs'][$i]['id'] < $jobid) {
473 $job =& $this->values
['jobs'][$i];
474 if ($job['id'] != $jobid) {
477 if (!isset($job['terms'])) {
478 $job['terms'] = array();
480 $job['terms'][] = $term;
483 foreach ($this->values
['jobs'] as $id => &$job) {
484 $phone = new Phone();
485 if (!isset($job['w_phone'])) {
486 $job['w_phone'] = array(0 => $phone->toFormArray());
490 $job['w_email_new'] = '';
491 if (!isset($job['hq_fixed'])) {
492 $job['hq_fixed'] = '';
494 if (!isset($job['hq_fax'])) {
497 if (!isset($job['w_email_pub'])) {
498 $job['w_email_pub'] = 'private';
500 if (!$job['hq_address']['text']) {
501 $job['hq_address'] = array(
506 'administrativeAreaId' => '',
507 'subAdministrativeAreaId' => '',
522 $job['w_address']['cedex'] = '';
523 $job['w_address']['changed'] = '0';
524 $job['w_address']['removed'] = '0';
526 $this->values
['jobs'][] = $this->settings
['jobs']->emptyJob();
530 protected function _saveData()
532 if ($this->changed
['cv']) {
533 XDB
::execute("UPDATE profiles
536 $this->values
['cv'], $this->pid());
540 public function _prepare(PlPage
&$page, $id)
542 require_once 'emails.combobox.inc.php';
543 fill_email_combobox($page, $this->owner
);
545 $res = XDB
::query("SELECT id, name AS label
546 FROM profile_job_sector_enum");
547 $page->assign('sectors', $res->fetchAllAssoc());
549 $res = XDB
::iterator("SELECT id, name
550 FROM profile_corps_enum
551 ORDER BY id = 1 DESC, name");
552 $page->assign('original_corps', $res->fetchAllAssoc());
554 $res = XDB
::iterator("SELECT id, name
555 FROM profile_corps_enum
556 WHERE still_exists = 1
557 ORDER BY id = 1 DESC, name");
558 $page->assign('current_corps', $res->fetchAllAssoc());
560 $res = XDB
::iterator("SELECT id, name
561 FROM profile_corps_rank_enum
562 ORDER BY id = 1 DESC, name");
563 $page->assign('corps_rank', $res->fetchAllAssoc());
567 // vim:set et sw=4 sts=4 sws=4 foldmethod=marker enc=utf-8: