ab64c1db60d52f5abd9def639638787b95e4ed49
[platal.git] / modules / profile / jobs.inc.php
1 <?php
2 /***************************************************************************
3 * Copyright (C) 2003-2010 Polytechnique.org *
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
22 class ProfileSettingJob extends ProfileSettingGeocoding
23 {
24 private $pub;
25 private $email_new;
26 private $email;
27 private $url;
28 private $bool;
29 private $checks;
30
31 public function __construct()
32 {
33 $this->pub = new ProfileSettingPub();
34 $this->email
35 = $this->email_new
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'),
42 );
43 }
44
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
116 private function cleanJob(ProfilePage &$page, $jobid, array &$job, &$success)
117 {
118 $success = true;
119 if ($job['w_email'] == "new@example.org") {
120 $job['w_email'] = $job['w_email_new'];
121 }
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 }
132 if (!$job['subSubSectorName']) {
133 $res = XDB::query("SELECT name
134 FROM profile_job_subsubsector_enum
135 WHERE id = {?}",
136 $job['subSubSector']);
137 $job['subSubSectorName'] = $res->fetchOneCell();
138 } else {
139 $res = XDB::query("SELECT sectorid, subsectorid, id
140 FROM profile_job_subsubsector_enum
141 WHERE name = {?}",
142 $job['subSubSectorName']);
143 if ($res->numRows() != 1) {
144 $success = false;
145 $job['sector_error'] = true;
146 } else {
147 list($job['sector'], $job['subSector'], $job['subSubSector']) = $res->fetchOneRow();
148 }
149 }
150 if ($job['name']) {
151 $res = XDB::query("SELECT id
152 FROM profile_job_enum
153 WHERE name = {?}",
154 $job['name']);
155 if ($res->numRows() != 1) {
156 $this->geocodeAddress($job['hq_address'], $s);
157 if (!$s) {
158 $gmapsGeocoder = new GMapsGeocoder();
159 $job['hq_address'] = $gmapsGeocoder->stripGeocodingFromAddress($job['hq_address']);
160 }
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']);
163 $req->submit();
164 $job['jobid'] = null;
165 } else {
166 $job['jobid'] = $res->fetchOneCell();
167 }
168 }
169 $job['w_address']['pub'] = $this->pub->value($page, 'address_pub', $job['w_address']['pub'], $s);
170 if (!isset($job['w_phone'])) {
171 $job['w_phone'] = array();
172 }
173 $profiletel = new ProfileSettingPhones('pro', $jobid);
174 $job['w_phone'] = $profiletel->value($page, 'tel', $job['w_phone'], $s);
175
176 unset($job['removed']);
177 unset($job['new']);
178 }
179
180 public function value(ProfilePage &$page, $field, $value, &$success)
181 {
182 require_once 'validations.inc.php';
183 $entreprise = ProfileValidate::get_typed_requests($page->pid(), 'entreprise');
184 $entr_val = 0;
185
186 $init = false;
187 if (is_null($value)) {
188 $value = $page->values['jobs'];
189 $init = true;
190 }
191 $success = true;
192 foreach ($value as $key => &$job) {
193 $job['name'] = trim($job['name']);
194 if ($job['name'] == '' && $entreprise) {
195 $job['tmp_name'] = $entreprise[$entr_val]->name;
196 ++$entr_val;
197 } else if ($job['name'] == '') {
198 $job['name_error'] = true;
199 $success = false;
200 }
201
202 if (isset($job['removed']) && $job['removed']) {
203 if ($job['name'] == '' && $entreprise) {
204 $entreprise[$entr_val - 1]->clean();
205 }
206 array_splice($value, $key, 1);
207 }
208 }
209 foreach ($value as $key => &$job) {
210 $ls = true;
211 $this->geocodeAddress($job['w_address'], $s);
212 $ls = ($ls && $s);
213 $this->cleanJob($page, $key, $job, $s);
214 $ls = ($ls && $s);
215 if (!$init) {
216 $success = ($success && $ls);
217 }
218 }
219 return $value;
220 }
221
222 public function save(ProfilePage &$page, $field, $value)
223 {
224 // TODO: use address and phone classes to update profile_job_enum and profile_phones once they are done.
225
226 require_once 'profil.func.inc.php';
227
228 XDB::execute("DELETE FROM profile_job
229 WHERE pid = {?}",
230 $page->pid());
231 XDB::execute("DELETE FROM profile_addresses
232 WHERE pid = {?} AND type = 'job'",
233 $page->pid());
234 XDB::execute("DELETE FROM profile_phones
235 WHERE pid = {?} AND link_type = 'pro'",
236 $page->pid());
237 foreach ($value as $id => &$job) {
238 if (isset($job['name']) && $job['name']) {
239 if (isset($job['jobid']) && $job['jobid']) {
240 XDB::execute("INSERT INTO profile_job (pid, id, description, sectorid, subsectorid,
241 subsubsectorid, email, url, pub, email_pub, jobid)
242 VALUES ({?}, {?}, {?}, {?}, {?}, {?}, {?}, {?}, {?}, {?}, {?})",
243 $page->pid(), $id, $job['description'], $job['sector'], $job['subSector'],
244 $job['subSubSector'], $job['w_email'], $job['w_url'], $job['pub'], $job['w_email_pub'], $job['jobid']);
245 } else {
246 XDB::execute("INSERT INTO profile_job (pid, id, description, sectorid, subsectorid,
247 subsubsectorid, email, url, pub, email_pub)
248 VALUES ({?}, {?}, {?}, {?}, {?}, {?}, {?}, {?}, {?}, {?})",
249 $page->pid(), $id, $job['description'], $job['sector'], $job['subSector'],
250 $job['subSubSector'], $job['w_email'], $job['w_url'], $job['pub'], $job['w_email_pub']);
251 }
252 $address = new ProfileSettingAddress();
253 $address->saveAddress($page->pid(), $id, $job['w_address'], 'job');
254 $profiletel = new ProfileSettingPhones('pro', $id);
255 $profiletel->saveTels($page->pid(), 'tel', $job['w_phone']);
256 }
257 }
258 }
259 }
260
261 class ProfileSettingJobs extends ProfilePage
262 {
263 protected $pg_template = 'profile/jobs.tpl';
264
265 public function __construct(PlWizard &$wiz)
266 {
267 parent::__construct($wiz);
268 $this->settings['cv'] = null;
269 $this->settings['corps'] = null;
270 $this->settings['jobs'] = new ProfileSettingJob();
271 $this->watched = array('cv' => true, 'jobs' => true, 'corps' => true);
272 }
273
274 protected function _fetchData()
275 {
276 // Checkout the CV
277 $res = XDB::query("SELECT cv
278 FROM profiles
279 WHERE pid = {?}",
280 $this->pid());
281 $this->values['cv'] = $res->fetchOneCell();
282
283 // Checkout the corps
284 $res = XDB::query("SELECT original_corpsid AS original, current_corpsid AS current,
285 rankid AS rank, corps_pub AS pub
286 FROM profile_corps
287 WHERE pid = {?}",
288 $this->pid());
289 $this->values['corps'] = $res->fetchOneAssoc();
290
291 // Build the jobs tree
292 $res = XDB::iterRow("SELECT j.id, j.jobid, je.name, j.sectorid, j.subsectorid, j.subsubsectorid,
293 s.name, j.description, j.email, j.email_pub, j.url, j.pub,
294 je.acronym, je.url, je.email,
295 aw.accuracy, aw.text, aw.postalText, aw.postalCode, aw.localityId,
296 aw.subAdministrativeAreaId, aw.administrativeAreaId, aw.countryId,
297 aw.latitude, aw.longitude, aw.pub, aw.updateTime,
298 aw.north, aw.south, aw.east, aw.west,
299 ah.accuracy, ah.text, ah.postalText, ah.postalCode, ah.localityId,
300 ah.subAdministrativeAreaId, ah.administrativeAreaId, ah.countryId,
301 ah.latitude, ah.longitude, ah.pub, ah.updateTime,
302 ah.north, ah.south, ah.east, ah.west
303 FROM profile_job AS j
304 LEFT JOIN profile_job_enum AS je ON (j.jobid = je.id)
305 LEFT JOIN profile_job_subsubsector_enum AS s ON (s.id = j.subsubsectorid)
306 LEFT JOIN profile_addresses AS aw ON (aw.pid = j.pid AND aw.type = 'job'
307 AND aw.id = j.id)
308 LEFT JOIN profile_addresses AS ah ON (ah.jobid = j.jobid AND ah.type = 'hq')
309 WHERE j.pid = {?}
310 ORDER BY j.id",
311 $this->pid());
312 $this->values['jobs'] = array();
313
314 if ($res->numRows() > 0) {
315 while (list($id, $jobid, $name, $sector, $subSector, $subSubSector,
316 $subSubSectorName, $description, $w_email, $w_emailPub, $w_url, $pub,
317 $hq_acronym, $hq_url, $hq_email,
318 $w_accuracy, $w_text, $w_postalText, $w_postalCode, $w_localityId,
319 $w_subAdministrativeAreaId, $w_administrativeAreaId, $w_countryId,
320 $w_latitude, $w_longitude, $w_pub, $w_updateTime,
321 $w_north, $w_south, $w_east, $w_west,
322 $hq_accuracy, $hq_text, $hq_postalText, $hq_postalCode, $hq_localityId,
323 $hq_subAdministrativeAreaId, $hq_administrativeAreaId, $hq_countryId,
324 $hq_latitude, $hq_longitude, $hq_pub, $hq_updateTime,
325 $hq_north, $hq_south, $hq_east, $hq_west,
326 ) = $res->next()) {
327 $this->values['jobs'][] = array(
328 'id' => $id,
329 'jobid' => $jobid,
330 'name' => $name,
331 'sector' => $sector,
332 'subSector' => $subSector,
333 'subSubSector' => $subSubSector,
334 'subSubSectorName' => $subSubSectorName,
335 'description' => $description,
336 'pub' => $pub,
337 'w_email' => $w_email,
338 'w_email_pub' => $w_emailPub,
339 'w_url' => $w_url,
340 'hq_acronym' => $hq_acronym,
341 'hq_url' => $hq_url,
342 'hq_email' => $hq_email,
343 'w_address' => array(
344 'accuracy' => $w_accuracy,
345 'text' => $w_text,
346 'postalText' => $w_postalText,
347 'postalCode' => $w_postalCode,
348 'localityId' => $w_localityId,
349 'subAdministrativeAreaId' => $w_subAdministrativeAreaId,
350 'administrativeAreaId' => $w_administrativeAreaId,
351 'countryId' => $w_countryId,
352 'latitude' => $w_latitude,
353 'longitude' => $w_longitude,
354 'pub' => $w_pub,
355 'updateTime' => $w_updateTime,
356 'north' => $w_north,
357 'south' => $w_south,
358 'east' => $w_east,
359 'west' => $w_west,
360 ),
361 'hq_address' => array(
362 'accuracy' => $hq_accuracy,
363 'text' => $hq_text,
364 'postalText' => $hq_postalText,
365 'postalCode' => $hq_postalCode,
366 'localityId' => $hq_localityId,
367 'subAdministrativeAreaId' => $hq_subAdministrativeAreaId,
368 'administrativeAreaId' => $hq_administrativeAreaId,
369 'countryId' => $hq_countryId,
370 'latitude' => $hq_latitude,
371 'longitude' => $hq_longitude,
372 'pub' => $hq_pub,
373 'updateTime' => $hq_updateTime,
374 'north' => $hq_north,
375 'south' => $hq_south,
376 'east' => $hq_east,
377 'west' => $hq_west,
378 ),
379 );
380 }
381
382 $res = XDB::iterator("SELECT link_id AS jobid, tel_type AS type, pub, display_tel AS tel, comment
383 FROM profile_phones
384 WHERE pid = {?} AND link_type = 'pro'
385 ORDER BY link_id",
386 $this->pid());
387 $i = 0;
388 $jobNb = count($this->values['jobs']);
389 while ($phone = $res->next()) {
390 $jobid = $phone['jobid'];
391 while ($i < $jobNb && $this->values['jobs'][$i]['id'] < $jobid) {
392 $i++;
393 }
394 if ($i >= $jobNb) {
395 break;
396 }
397 $job =& $this->values['jobs'][$i];
398 if (!isset($job['w_phone'])) {
399 $job['w_phone'] = array();
400 }
401 if ($job['id'] == $jobid) {
402 $job['w_phone'][] = $phone;
403 }
404 }
405 foreach ($this->values['jobs'] as $id => &$job) {
406 if (!isset($job['w_phone'])) {
407 $job['w_phone'] = array(
408 0 => array(
409 'type' => 'fixed',
410 'tel' => '',
411 'pub' => 'private',
412 'comment' => '',
413 )
414 );
415 }
416 }
417
418 $job['w_email_new'] = '';
419 if (!isset($job['hq_phone'])) {
420 $job['hq_phone'] = '';
421 }
422 if (!isset($job['hq_fax'])) {
423 $job['hq_fax'] = '';
424 }
425 if (!isset($job['w_email_pub'])) {
426 $job['w_email_pub'] = 'private';
427 }
428 if (!$job['hq_address']['text']) {
429 $job['hq_address'] = array(
430 'text' => '',
431 'accuracy' => '',
432 'postalText' => '',
433 'postalCode' => '',
434 'administrativeAreaId' => '',
435 'subAdministrativeAreaId' => '',
436 'localityId' => '',
437 'countryId' => '',
438 'latitude' => '',
439 'longitude' => '',
440 'north' => '',
441 'south' => '',
442 'east' => '',
443 'west' => '',
444 'cedex' => '',
445 'updateTime' => '',
446 'changed' => '0',
447 'removed' => '0',
448 );
449 }
450 $job['w_address']['cedex'] = '';
451 $job['w_address']['changed'] = '0';
452 $job['w_address']['removed'] = '0';
453 } else {
454 $this->values['jobs'][] = $this->settings['jobs']->emptyJob();
455 }
456 }
457
458 protected function _saveData()
459 {
460 if ($this->changed['cv']) {
461 XDB::execute("UPDATE profiles
462 SET cv = {?}
463 WHERE pid = {?}",
464 $this->values['cv'], $this->pid());
465 }
466
467 if ($this->changed['corps']) {
468 XDB::execute('REPLACE INTO profile_corps (original_corpsid, current_corpsid, rankid, corps_pub, pid)
469 VALUES ({?}, {?}, {?}, {?}, {?})',
470 $this->values['corps']['original'], $this->values['corps']['current'],
471 $this->values['corps']['rank'], $this->values['corps']['pub'], $this->pid());
472 }
473 }
474
475 public function _prepare(PlPage &$page, $id)
476 {
477 require_once 'emails.combobox.inc.php';
478 fill_email_combobox($page, $this->owner, $this->profile);
479
480 $res = XDB::query("SELECT id, name AS label
481 FROM profile_job_sector_enum");
482 $page->assign('sectors', $res->fetchAllAssoc());
483
484 $res = XDB::iterator("SELECT id, name
485 FROM profile_corps_enum
486 ORDER BY id = 1 DESC, name");
487 $page->assign('original_corps', $res->fetchAllAssoc());
488
489 $res = XDB::iterator("SELECT id, name
490 FROM profile_corps_enum
491 WHERE still_exists = 1
492 ORDER BY id = 1 DESC, name");
493 $page->assign('current_corps', $res->fetchAllAssoc());
494
495 $res = XDB::iterator("SELECT id, name
496 FROM profile_corps_rank_enum
497 ORDER BY id = 1 DESC, name");
498 $page->assign('corps_rank', $res->fetchAllAssoc());
499 }
500 }
501
502 // vim:set et sw=4 sts=4 sws=4 foldmethod=marker enc=utf-8:
503 ?>