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