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(
116 private function cleanJob(ProfilePage
&$page, $jobid, array &$job, &$success)
119 if ($job['w_email'] == "new@example.org") {
120 $job['w_email'] = $job['w_email_new'];
122 foreach ($this->checks
as $obj=>&$fields) {
124 foreach ($fields as $field) {
125 $job[$field] = $chk->value($page, $field, $job[$field], $s);
128 $job[$field . '_error'] = true
;
132 if (!$job['subSubSectorName']) {
133 $res = XDB
::query("SELECT name
134 FROM profile_job_subsubsector_enum
136 $job['subSubSector']);
137 $job['subSubSectorName'] = $res->fetchOneCell();
139 $res = XDB
::query("SELECT sectorid, subsectorid, id
140 FROM profile_job_subsubsector_enum
142 $job['subSubSectorName']);
143 if ($res->numRows() != 1) {
145 $job['sector_error'] = true
;
147 list($job['sector'], $job['subSector'], $job['subSubSector']) = $res->fetchOneRow();
151 $res = XDB
::query("SELECT id
152 FROM profile_job_enum
155 if ($res->numRows() != 1) {
156 $this->geocodeAddress($job['hq_address'], $s);
158 $gmapsGeocoder = new GMapsGeocoder();
159 $job['hq_address'] = $gmapsGeocoder->stripGeocodingFromAddress($job['hq_address']);
161 $req = new EntrReq(S
::user(), $page->profile
, $jobid, $job['name'], $job['hq_acronym'], $job['hq_url'],
162 $job['hq_email'], $job['hq_fixed'], $job['hq_fax'], $job['hq_address']);
164 $job['jobid'] = null
;
167 $job['jobid'] = $res->fetchOneCell();
170 $job['w_address']['pub'] = $this->pub
->value($page, 'address_pub', $job['w_address']['pub'], $s);
171 $job['w_phone'] = Phone
::formatFormArray($job['w_phone'], $s);
173 unset($job['removed']);
177 public function value(ProfilePage
&$page, $field, $value, &$success)
179 require_once 'validations.inc.php';
180 $entreprise = ProfileValidate
::get_typed_requests($page->pid(), 'entreprise');
184 if (is_null($value)) {
185 $value = $page->values
['jobs'];
189 foreach ($value as $key => &$job) {
190 $job['name'] = trim($job['name']);
191 if ($job['name'] == '' && $entreprise) {
192 $job['tmp_name'] = $entreprise[$entr_val]->name
;
194 } else if ($job['name'] == '') {
195 if ($job['subSubSectorName'] == '' && $job['description'] == '' && $job['w_url'] == ''
196 && $job['w_address']['text'] == '' && $job['w_email'] == ''
197 && count($job['w_phone']) == 1 && $job['w_phone']['tel'] == '') {
198 array_splice($value, $key, 1);
202 $job['name_error'] = true
;
206 if (isset($job['removed']) && $job['removed']) {
207 if ($job['name'] == '' && $entreprise) {
208 $entreprise[$entr_val - 1]->clean();
210 array_splice($value, $key, 1);
213 foreach ($value as $key => &$job) {
215 $this->geocodeAddress($job['w_address'], $s);
217 $this->cleanJob($page, $key, $job, $s);
220 $success = ($success && $ls);
226 public function save(ProfilePage
&$page, $field, $value)
228 // TODO: use address class to update profile_job_enum once it is done.
229 XDB
::execute("DELETE FROM profile_job
232 XDB
::execute("DELETE FROM profile_addresses
233 WHERE pid = {?} AND type = 'job'",
235 Phone
::deletePhones($page->pid(), Phone
::LINK_JOB
);
236 foreach ($value as $id => &$job) {
237 if (isset($job['name']) && $job['name']) {
238 if (isset($job['jobid']) && $job['jobid']) {
239 XDB
::execute("INSERT INTO profile_job (pid, id, description, sectorid, subsectorid,
240 subsubsectorid, email, url, pub, email_pub, jobid)
241 VALUES ({?}, {?}, {?}, {?}, {?}, {?}, {?}, {?}, {?}, {?}, {?})",
242 $page->pid(), $id, $job['description'], $job['sector'], $job['subSector'],
243 $job['subSubSector'], $job['w_email'], $job['w_url'], $job['pub'], $job['w_email_pub'], $job['jobid']);
245 XDB
::execute("INSERT INTO profile_job (pid, id, description, sectorid, subsectorid,
246 subsubsectorid, email, url, pub, email_pub)
247 VALUES ({?}, {?}, {?}, {?}, {?}, {?}, {?}, {?}, {?}, {?})",
248 $page->pid(), $id, $job['description'], $job['sector'], $job['subSector'],
249 $job['subSubSector'], $job['w_email'], $job['w_url'], $job['pub'], $job['w_email_pub']);
251 $address = new ProfileSettingAddress();
252 $address->saveAddress($page->pid(), $id, $job['w_address'], 'job');
253 Phone
::savePhones($job['w_phone'], $page->pid(), Phone
::LINK_JOB
, $id);
258 public function getText($value) {
260 foreach ($value as $id => $job) {
261 $address = new ProfileSettingAddress();
262 $phones = Phone
::formArrayToString($job['w_phone']);
263 $jobs[] = 'Entreprise : ' . $job['name'] . ', secteur : ' . $job['subSubSectorName']
264 . ', description : ' . $job['description'] . ', web : ' . $job['w_url']
265 . ', email : ' . $job['w_email']
266 . ($phones ?
', ' . $phones : '') . ', ' . $address->getText($job['w_address']);
268 return implode(' ; ' , $jobs);
272 class ProfileSettingCorps
implements ProfileSetting
274 public function value(ProfilePage
&$page, $field, $value, &$success)
277 if (is_null($value)) {
278 $res = XDB
::query("SELECT original_corpsid AS original, current_corpsid AS current,
279 rankid AS rank, corps_pub AS pub
283 return $res->fetchOneAssoc();
288 public function save(ProfilePage
&$page, $field, $value)
290 XDB
::execute('REPLACE INTO profile_corps (original_corpsid, current_corpsid, rankid, corps_pub, pid)
291 VALUES ({?}, {?}, {?}, {?}, {?})',
292 $value['original'], $value['current'], $value['rank'], $value['pub'], $page->pid());
295 public function getText($value)
297 $corpsList = DirEnum
::getOptions(DirEnum
::CORPS
);
298 $rankList = DirEnum
::getOptions(DirEnum
::CORPSRANKS
);
299 return 'Corps actuel : ' . $corpsList[$value['current']] . ' , rang : ' . $corpsList[$value['rank']]
300 . ' , corps d\'origine : ' . $corpsList[$value['original']] . ' , affichage : ' . $value['pub'];
304 class ProfileSettingJobs
extends ProfilePage
306 protected $pg_template = 'profile/jobs.tpl';
308 public function __construct(PlWizard
&$wiz)
310 parent
::__construct($wiz);
311 $this->settings
['cv'] = null
;
312 $this->settings
['corps'] = new ProfileSettingCorps();
313 $this->settings
['jobs'] = new ProfileSettingJob();
314 $this->watched
= array('cv' => true
, 'jobs' => true
, 'corps' => true
);
317 protected function _fetchData()
320 $res = XDB
::query("SELECT cv
324 $this->values
['cv'] = $res->fetchOneCell();
326 // Build the jobs tree
327 $res = XDB
::iterRow("SELECT j.id, j.jobid, je.name, j.sectorid, j.subsectorid, j.subsubsectorid,
328 s.name, j.description, j.email, j.email_pub, j.url, j.pub,
329 je.acronym, je.url, je.email,
330 aw.accuracy, aw.text, aw.postalText, aw.postalCode, aw.localityId,
331 aw.subAdministrativeAreaId, aw.administrativeAreaId, aw.countryId,
332 aw.latitude, aw.longitude, aw.pub, aw.updateTime,
333 aw.north, aw.south, aw.east, aw.west,
334 ah.accuracy, ah.text, ah.postalText, ah.postalCode, ah.localityId,
335 ah.subAdministrativeAreaId, ah.administrativeAreaId, ah.countryId,
336 ah.latitude, ah.longitude, ah.pub, ah.updateTime,
337 ah.north, ah.south, ah.east, ah.west
338 FROM profile_job AS j
339 LEFT JOIN profile_job_enum AS je ON (j.jobid = je.id)
340 LEFT JOIN profile_job_subsubsector_enum AS s ON (s.id = j.subsubsectorid)
341 LEFT JOIN profile_addresses AS aw ON (aw.pid = j.pid AND aw.type = 'job'
343 LEFT JOIN profile_addresses AS ah ON (ah.jobid = j.jobid AND ah.type = 'hq')
347 $this->values
['jobs'] = array();
349 if ($res->numRows() > 0) {
350 while (list($id, $jobid, $name, $sector, $subSector, $subSubSector,
351 $subSubSectorName, $description, $w_email, $w_emailPub, $w_url, $pub,
352 $hq_acronym, $hq_url, $hq_email,
353 $w_accuracy, $w_text, $w_postalText, $w_postalCode, $w_localityId,
354 $w_subAdministrativeAreaId, $w_administrativeAreaId, $w_countryId,
355 $w_latitude, $w_longitude, $w_pub, $w_updateTime,
356 $w_north, $w_south, $w_east, $w_west,
357 $hq_accuracy, $hq_text, $hq_postalText, $hq_postalCode, $hq_localityId,
358 $hq_subAdministrativeAreaId, $hq_administrativeAreaId, $hq_countryId,
359 $hq_latitude, $hq_longitude, $hq_pub, $hq_updateTime,
360 $hq_north, $hq_south, $hq_east, $hq_west,
362 $this->values
['jobs'][] = array(
367 'subSector' => $subSector,
368 'subSubSector' => $subSubSector,
369 'subSubSectorName' => $subSubSectorName,
370 'description' => $description,
372 'w_email' => $w_email,
373 'w_email_pub' => $w_emailPub,
375 'hq_acronym' => $hq_acronym,
377 'hq_email' => $hq_email,
378 'w_address' => array(
379 'accuracy' => $w_accuracy,
381 'postalText' => $w_postalText,
382 'postalCode' => $w_postalCode,
383 'localityId' => $w_localityId,
384 'subAdministrativeAreaId' => $w_subAdministrativeAreaId,
385 'administrativeAreaId' => $w_administrativeAreaId,
386 'countryId' => $w_countryId,
387 'latitude' => $w_latitude,
388 'longitude' => $w_longitude,
390 'updateTime' => $w_updateTime,
396 'hq_address' => array(
397 'accuracy' => $hq_accuracy,
399 'postalText' => $hq_postalText,
400 'postalCode' => $hq_postalCode,
401 'localityId' => $hq_localityId,
402 'subAdministrativeAreaId' => $hq_subAdministrativeAreaId,
403 'administrativeAreaId' => $hq_administrativeAreaId,
404 'countryId' => $hq_countryId,
405 'latitude' => $hq_latitude,
406 'longitude' => $hq_longitude,
408 'updateTime' => $hq_updateTime,
409 'north' => $hq_north,
410 'south' => $hq_south,
417 $it = Phone
::iterate(array($this->pid()), array(Phone
::LINK_JOB
));
418 while ($phone = $it->next()) {
419 $this->values
['jobs'][$phone->linkId()]['w_phone'][$phone->id()] = $phone->toFormArray();
421 foreach ($this->values
['jobs'] as $id => &$job) {
422 $phone = new Phone();
423 if (!isset($job['w_phone'])) {
424 $job['w_phone'] = array(0 => $phone->toFormArray());
428 $job['w_email_new'] = '';
429 if (!isset($job['hq_fixed'])) {
430 $job['hq_fixed'] = '';
432 if (!isset($job['hq_fax'])) {
435 if (!isset($job['w_email_pub'])) {
436 $job['w_email_pub'] = 'private';
438 if (!$job['hq_address']['text']) {
439 $job['hq_address'] = array(
444 'administrativeAreaId' => '',
445 'subAdministrativeAreaId' => '',
460 $job['w_address']['cedex'] = '';
461 $job['w_address']['changed'] = '0';
462 $job['w_address']['removed'] = '0';
464 $this->values
['jobs'][] = $this->settings
['jobs']->emptyJob();
468 protected function _saveData()
470 if ($this->changed
['cv']) {
471 XDB
::execute("UPDATE profiles
474 $this->values
['cv'], $this->pid());
478 public function _prepare(PlPage
&$page, $id)
480 require_once 'emails.combobox.inc.php';
481 fill_email_combobox($page, $this->owner
);
483 $res = XDB
::query("SELECT id, name AS label
484 FROM profile_job_sector_enum");
485 $page->assign('sectors', $res->fetchAllAssoc());
487 $res = XDB
::iterator("SELECT id, name
488 FROM profile_corps_enum
489 ORDER BY id = 1 DESC, name");
490 $page->assign('original_corps', $res->fetchAllAssoc());
492 $res = XDB
::iterator("SELECT id, name
493 FROM profile_corps_enum
494 WHERE still_exists = 1
495 ORDER BY id = 1 DESC, name");
496 $page->assign('current_corps', $res->fetchAllAssoc());
498 $res = XDB
::iterator("SELECT id, name
499 FROM profile_corps_rank_enum
500 ORDER BY id = 1 DESC, name");
501 $page->assign('corps_rank', $res->fetchAllAssoc());
505 // vim:set et sw=4 sts=4 sws=4 foldmethod=marker enc=utf-8: