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 if (!isset($job['w_phone'])) {
172 $job['w_phone'] = array();
174 $profiletel = new ProfileSettingPhones('pro', $jobid);
175 $job['w_phone'] = $profiletel->value($page, 'tel', $job['w_phone'], $s);
177 unset($job['removed']);
181 public function value(ProfilePage
&$page, $field, $value, &$success)
183 require_once 'validations.inc.php';
184 $entreprise = ProfileValidate
::get_typed_requests($page->pid(), 'entreprise');
188 if (is_null($value)) {
189 $value = $page->values
['jobs'];
193 foreach ($value as $key => &$job) {
194 $job['name'] = trim($job['name']);
195 if ($job['name'] == '' && $entreprise) {
196 $job['tmp_name'] = $entreprise[$entr_val]->name
;
198 } else if ($job['name'] == '') {
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);
206 $job['name_error'] = true
;
210 if (isset($job['removed']) && $job['removed']) {
211 if ($job['name'] == '' && $entreprise) {
212 $entreprise[$entr_val - 1]->clean();
214 array_splice($value, $key, 1);
217 foreach ($value as $key => &$job) {
219 $this->geocodeAddress($job['w_address'], $s);
221 $this->cleanJob($page, $key, $job, $s);
224 $success = ($success && $ls);
230 public function save(ProfilePage
&$page, $field, $value)
232 // TODO: use address and phone classes to update profile_job_enum and profile_phones once they are done.
234 require_once 'profil.func.inc.php';
236 XDB
::execute("DELETE FROM profile_job
239 XDB
::execute("DELETE FROM profile_addresses
240 WHERE pid = {?} AND type = 'job'",
242 XDB
::execute("DELETE FROM profile_phones
243 WHERE pid = {?} AND link_type = 'pro'",
245 foreach ($value as $id => &$job) {
246 if (isset($job['name']) && $job['name']) {
247 if (isset($job['jobid']) && $job['jobid']) {
248 XDB
::execute("INSERT INTO profile_job (pid, id, description, sectorid, subsectorid,
249 subsubsectorid, email, url, pub, email_pub, jobid)
250 VALUES ({?}, {?}, {?}, {?}, {?}, {?}, {?}, {?}, {?}, {?}, {?})",
251 $page->pid(), $id, $job['description'], $job['sector'], $job['subSector'],
252 $job['subSubSector'], $job['w_email'], $job['w_url'], $job['pub'], $job['w_email_pub'], $job['jobid']);
254 XDB
::execute("INSERT INTO profile_job (pid, id, description, sectorid, subsectorid,
255 subsubsectorid, email, url, pub, email_pub)
256 VALUES ({?}, {?}, {?}, {?}, {?}, {?}, {?}, {?}, {?}, {?})",
257 $page->pid(), $id, $job['description'], $job['sector'], $job['subSector'],
258 $job['subSubSector'], $job['w_email'], $job['w_url'], $job['pub'], $job['w_email_pub']);
260 $address = new ProfileSettingAddress();
261 $address->saveAddress($page->pid(), $id, $job['w_address'], 'job');
262 $profiletel = new ProfileSettingPhones('pro', $id);
263 $profiletel->saveTels($page->pid(), 'tel', $job['w_phone']);
268 public function getText($value) {
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']);
278 return implode(' ; ' , $jobs);
282 class ProfileSettingJobs
extends ProfilePage
284 protected $pg_template = 'profile/jobs.tpl';
286 public function __construct(PlWizard
&$wiz)
288 parent
::__construct($wiz);
289 $this->settings
['cv'] = null
;
290 /* TODO: ProfileSettingCorps, required for notifications. */
291 $this->settings
['corps'] = null
;
292 $this->settings
['jobs'] = new ProfileSettingJob();
293 $this->watched
= array('cv' => true
, 'jobs' => true
, 'corps' => true
);
296 protected function _fetchData()
299 $res = XDB
::query("SELECT cv
303 $this->values
['cv'] = $res->fetchOneCell();
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
311 $this->values
['corps'] = $res->fetchOneAssoc();
313 // Build the jobs tree
314 $res = XDB
::iterRow("SELECT j.id, j.jobid, je.name, j.sectorid, j.subsectorid, j.subsubsectorid,
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
325 FROM profile_job AS j
326 LEFT JOIN profile_job_enum AS je ON (j.jobid = je.id)
327 LEFT JOIN profile_job_subsubsector_enum AS s ON (s.id = j.subsubsectorid)
328 LEFT JOIN profile_addresses AS aw ON (aw.pid = j.pid AND aw.type = 'job'
330 LEFT JOIN profile_addresses AS ah ON (ah.jobid = j.jobid AND ah.type = 'hq')
334 $this->values
['jobs'] = array();
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,
349 $this->values
['jobs'][] = array(
354 'subSector' => $subSector,
355 'subSubSector' => $subSubSector,
356 'subSubSectorName' => $subSubSectorName,
357 'description' => $description,
359 'w_email' => $w_email,
360 'w_email_pub' => $w_emailPub,
362 'hq_acronym' => $hq_acronym,
364 'hq_email' => $hq_email,
365 'w_address' => array(
366 'accuracy' => $w_accuracy,
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,
377 'updateTime' => $w_updateTime,
383 'hq_address' => array(
384 'accuracy' => $hq_accuracy,
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,
395 'updateTime' => $hq_updateTime,
396 'north' => $hq_north,
397 'south' => $hq_south,
404 $res = XDB
::iterator("SELECT link_id AS jobid, tel_type AS type, pub, display_tel AS tel, comment
406 WHERE pid = {?} AND link_type = 'pro'
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) {
419 $job =& $this->values
['jobs'][$i];
420 if (!isset($job['w_phone'])) {
421 $job['w_phone'] = array();
423 if ($job['id'] == $jobid) {
424 $job['w_phone'][] = $phone;
427 foreach ($this->values
['jobs'] as $id => &$job) {
428 if (!isset($job['w_phone'])) {
429 $job['w_phone'] = array(
440 $job['w_email_new'] = '';
441 if (!isset($job['hq_phone'])) {
442 $job['hq_phone'] = '';
444 if (!isset($job['hq_fax'])) {
447 if (!isset($job['w_email_pub'])) {
448 $job['w_email_pub'] = 'private';
450 if (!$job['hq_address']['text']) {
451 $job['hq_address'] = array(
456 'administrativeAreaId' => '',
457 'subAdministrativeAreaId' => '',
472 $job['w_address']['cedex'] = '';
473 $job['w_address']['changed'] = '0';
474 $job['w_address']['removed'] = '0';
476 $this->values
['jobs'][] = $this->settings
['jobs']->emptyJob();
480 protected function _saveData()
482 if ($this->changed
['cv']) {
483 XDB
::execute("UPDATE profiles
486 $this->values
['cv'], $this->pid());
489 if ($this->changed
['corps']) {
490 XDB
::execute('REPLACE INTO profile_corps (original_corpsid, current_corpsid, rankid, corps_pub, pid)
491 VALUES ({?}, {?}, {?}, {?}, {?})',
492 $this->values
['corps']['original'], $this->values
['corps']['current'],
493 $this->values
['corps']['rank'], $this->values
['corps']['pub'], $this->pid());
497 public function _prepare(PlPage
&$page, $id)
499 require_once 'emails.combobox.inc.php';
500 fill_email_combobox($page, $this->owner
, $this->profile
);
502 $res = XDB
::query("SELECT id, name AS label
503 FROM profile_job_sector_enum");
504 $page->assign('sectors', $res->fetchAllAssoc());
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());
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());
517 $res = XDB
::iterator("SELECT id, name
518 FROM profile_corps_rank_enum
519 ORDER BY id = 1 DESC, name");
520 $page->assign('corps_rank', $res->fetchAllAssoc());
524 // vim:set et sw=4 sts=4 sws=4 foldmethod=marker enc=utf-8: