X-Git-Url: http://git.polytechnique.org/?a=blobdiff_plain;f=modules%2Fprofile%2Fjobs.inc.php;h=43c70d1bb16be85805c1b33df3451a991832a183;hb=07e4a9a091ac34c84129c230cde455de34e1ae91;hp=f0d30d705ca843e4879dca385e7662ccb067a9b9;hpb=cbbf5ac90978263b86068c83dc3ccdc82d75700d;p=platal.git diff --git a/modules/profile/jobs.inc.php b/modules/profile/jobs.inc.php index f0d30d7..43c70d1 100644 --- a/modules/profile/jobs.inc.php +++ b/modules/profile/jobs.inc.php @@ -1,6 +1,6 @@ '0', 'jobid' => '', - 'pub' => 'private', + 'pub' => 'ax', 'name' => '', 'description' => '', 'w_url' => '', 'w_address' => $address->toFormArray(), 'w_email' => '', - 'w_email_pub' => 'private', + 'w_email_pub' => 'ax', 'w_email_new' => '', 'w_phone' => array(0 => $phone->toFormArray()), 'terms' => array() ); } - private function cleanJob(ProfilePage &$page, $jobid, array &$job, &$success) + private function fetchJobs(ProfilePage $page) + { + // Build the jobs tree + $jobs = XDB::fetchAllAssoc('SELECT j.id, j.jobid, je.name, + j.description, j.email AS w_email, + j.email_pub AS w_email_pub, + j.url AS w_url, j.pub, j.entry_year AS w_entry_year + FROM profile_job AS j + LEFT JOIN profile_job_enum AS je ON (j.jobid = je.id) + WHERE j.pid = {?} + ORDER BY j.id', + $page->pid()); + + if (empty($jobs)) { + return array($this->emptyJob()); + } + + $compagnies = array(); + $backtrack = array(); + foreach ($jobs as $key=>$job) { + $compagnies[] = $job['jobid']; + $backtrack[$job['id']] = $key; + } + + $it = Address::iterate(array($page->pid()), array(Address::LINK_JOB), array(), Visibility::get(Visibility::VIEW_ADMIN)); + while ($address = $it->next()) { + $jobs[$address->id]['w_address'] = $address->toFormArray(); + } + $it = Phone::iterate(array($page->pid()), array(Phone::LINK_JOB), array(), Visibility::get(Visibility::VIEW_ADMIN)); + while ($phone = $it->next()) { + $jobs[$phone->link_id]['w_phone'][$phone->id] = $phone->toFormArray(); + } + $res = XDB::iterator("SELECT e.jtid, e.full_name, j.jid + FROM profile_job_term_enum AS e + INNER JOIN profile_job_term AS j USING(jtid) + WHERE pid = {?} + ORDER BY j.jid", + $page->pid()); + while ($term = $res->next()) { + // $jid is the ID of the job among this user's jobs + $jid = $term['jid']; + if (!isset($backtrack[$jid])) { + continue; + } + $job =& $jobs[$backtrack[$jid]]; + if (!isset($job['terms'])) { + $job['terms'] = array(); + } + $job['terms'][] = $term; + } + + $phone = new Phone(); + $address = new Address(); + foreach ($jobs as $id => &$job) { + if (!isset($job['w_phone'])) { + $job['w_phone'] = array(0 => $phone->toFormArray()); + } + if (!isset($job['w_address'])) { + $job['w_address'] = $address->toFormArray(); + } + + $job['w_email_new'] = ''; + if (!isset($job['w_email_pub'])) { + $job['w_email_pub'] = 'private'; + } + } + return $jobs; + } + + private function cleanJob(ProfilePage $page, $jobid, array &$job, &$success, $job_level) { if ($job['w_email'] == "new@example.org") { $job['w_email'] = $job['w_email_new']; @@ -80,7 +149,7 @@ class ProfileSettingJob implements ProfileSetting if (count($job['terms'])) { $termsid = array(); foreach ($job['terms'] as $term) { - if (!$term['full_name']) { + if (!isset($term['full_name'])) { $termsid[] = $term['jtid']; } } @@ -91,7 +160,7 @@ class ProfileSettingJob implements ProfileSetting $termsid); $term_id_to_name = $res->fetchAllAssoc('jtid', false); foreach ($job['terms'] as &$term) { - if (!$term['full_name']) { + if (!isset($term['full_name'])) { $term['full_name'] = $term_id_to_name[$term['jtid']]; } } @@ -103,43 +172,49 @@ class ProfileSettingJob implements ProfileSetting WHERE name = {?}", $job['name']); if ($res->numRows() != 1) { - $req = new EntrReq(S::user(), $page->profile, $jobid, $job['name'], $job['hq_acronym'], $job['hq_url'], - $job['hq_email'], $job['hq_fixed'], $job['hq_fax'], $job['hq_address']); - $req->submit(); $job['jobid'] = null; - sleep(1); } else { $job['jobid'] = $res->fetchOneCell(); } } - $job['w_phone'] = Phone::formatFormArray($job['w_phone'], $s); + + if (Visibility::isLessRestrictive($job_level, $job['w_email_pub'])) { + $job['w_email_pub'] = $job_level; + } + $job['w_phone'] = Phone::formatFormArray($job['w_phone'], $s, $job_level); + + if ($job['w_entry_year'] && strlen($job['w_entry_year']) != 4) { + $job['w_entry_year_error'] = true; + $success = false; + } unset($job['removed']); unset($job['new']); } - public function value(ProfilePage &$page, $field, $value, &$success) + + + public function value(ProfilePage $page, $field, $value, &$success) { - require_once 'validations.inc.php'; $entreprise = ProfileValidate::get_typed_requests($page->pid(), 'entreprise'); $entr_val = 0; $init = false; if (is_null($value)) { - $value = $page->values['jobs']; + $value = $this->fetchJobs($page); $init = true; } $success = true; - foreach ($value as $key => &$job) { + foreach ($value as $key => $job) { $job['name'] = trim($job['name']); - if ($job['name'] == '' && $entreprise) { + if ($job['name'] == '' && $entreprise[$entr_val]->id == $key) { $job['tmp_name'] = $entreprise[$entr_val]->name; ++$entr_val; } else if ($job['name'] == '') { if ($job['description'] == '' && $job['w_url'] == '' && $job['w_address']['text'] == '' && $job['w_email'] == '' && count($job['w_phone']) >= 1 && $job['w_phone'][0]['display'] == '') { - array_splice($value, $key, 1); + unset($value[$key]); continue; } @@ -150,69 +225,131 @@ class ProfileSettingJob implements ProfileSetting } if (isset($job['removed']) && $job['removed']) { - if ($job['name'] == '' && $entreprise) { - $entreprise[$entr_val - 1]->clean(); + if (!S::user()->checkPerms('directory_private') + && (Phone::hasPrivate($job['w_phone']) || Address::hasPrivate($job['w_address']) || $job['w_email_pub'] == 'private')) { + Platal::page()->trigWarning("L'entreprise ne peut être supprimée car elle contient des informations pour lesquelles vous n'avez pas le droit d'édition."); + } else { + if ($job['name'] == '' && $entreprise && isset($entreprise[$entr_val - 1])) { + $entreprise[$entr_val - 1]->clean(); + } + unset($value[$key]); + continue; } - array_splice($value, $key, 1); } + if (!isset($job['pub']) || !$job['pub']) { + $job['pub'] = 'private'; + } + $value[$key] = $job; } foreach ($value as $key => &$job) { $address = new Address($job['w_address']); $s = $address->format(); + + // Force the address publicity to be at least as restricted as + // the job publicity. + $job_level = $job['pub']; + if (Visibility::isLessRestrictive($job_level, $address->pub)) { + $address->pub = $job_level; + } $job['w_address'] = $address->toFormArray(); - $this->cleanJob($page, $key, $job, $s); + $this->cleanJob($page, $key, $job, $s, $job_level); if (!$init) { $success = ($success && $s); } } + usort($value, 'Visibility::comparePublicity'); return $value; } - public function save(ProfilePage &$page, $field, $value) + public function save(ProfilePage $page, $field, $value) { - XDB::execute("DELETE FROM profile_job - WHERE pid = {?}", + + $deletePrivate = S::user()->isMe($page->owner) || S::admin(); + XDB::execute('DELETE FROM pj, pjt + USING profile_job AS pj + LEFT JOIN profile_job_term AS pjt ON (pj.pid = pjt.pid AND pj.id = pjt.jid) + WHERE pj.pid = {?}' . (($deletePrivate) ? '' : ' AND pj.pub IN (\'public\', \'ax\')'), $page->pid()); - Address::delete($page->pid(), Address::LINK_JOB); - Phone::deletePhones($page->pid(), Phone::LINK_JOB); + Address::deleteAddresses($page->pid(), Address::LINK_JOB, null, null, $deletePrivate); + Phone::deletePhones($page->pid(), Phone::LINK_JOB, null, $deletePrivate); + $previous_requests = EntrReq::get_typed_requests($page->pid(), 'entreprise'); + foreach ($previous_requests as $request) { + $request->clean(); + } $terms_values = array(); foreach ($value as $id => &$job) { - if (isset($job['name']) && $job['name']) { + if (($job['pub'] != 'private' || $deletePrivate) && (isset($job['name']) && $job['name'])) { if (isset($job['jobid']) && $job['jobid']) { - XDB::execute('INSERT INTO profile_job (pid, id, description, email, url, pub, email_pub, jobid) - VALUES ({?}, {?}, {?}, {?}, {?}, {?}, {?}, {?})', - $page->pid(), $id, $job['description'], $job['w_email'], $job['w_url'], $job['pub'], $job['w_email_pub'], $job['jobid']); + XDB::execute('INSERT INTO profile_job (pid, id, description, email, entry_year, + url, pub, email_pub, jobid) + VALUES ({?}, {?}, {?}, {?}, {?}, {?}, {?}, {?}, {?})', + $page->pid(), $id, $job['description'], $job['w_email'], $job['w_entry_year'], + $job['w_url'], $job['pub'], $job['w_email_pub'], $job['jobid']); } else { - XDB::execute('INSERT INTO profile_job (pid, id, description, email, url, pub, email_pub) - VALUES ({?}, {?}, {?}, {?}, {?}, {?}, {?})', - $page->pid(), $id, $job['description'], $job['w_email'], $job['w_url'], $job['pub'], $job['w_email_pub']); + XDB::execute('INSERT INTO profile_job (pid, id, description, email, entry_year, + url, pub, email_pub) + VALUES ({?}, {?}, {?}, {?}, {?}, {?}, {?}, {?})', + $page->pid(), $id, $job['description'], $job['w_email'], $job['w_entry_year'], + $job['w_url'], $job['pub'], $job['w_email_pub']); + $request = new EntrReq(S::user(), $page->profile, $id, $job['name'], $job['hq_acronym'], $job['hq_url'], + $job['hq_email'], $job['hq_fixed'], $job['hq_fax'], $job['hq_address']); + $request->submit(); + sleep(1); } - $address = new Address(array_merge($job['w_address'], array('pid' => $page->pid(), 'id' => $id, 'type' => Address::LINK_JOB))); + $address = new Address(array_merge($job['w_address'], + array('pid' => $page->pid(), + 'id' => $id, + 'type' => Address::LINK_JOB))); $address->save(); Phone::savePhones($job['w_phone'], $page->pid(), Phone::LINK_JOB, $id); if (isset($job['terms'])) { foreach ($job['terms'] as $term) { - $terms_values[] = '('.XDB::escape($page->pid()).', '. XDB::escape($id).', '.XDB::escape($term['jtid']).', "original")'; + $terms_values[] = XDB::format('({?}, {?}, {?}, {?})', + $page->pid(), $id, $term['jtid'], "original"); } } } } if (count($terms_values) > 0) { - XDB::execute('INSERT INTO profile_job_term (pid, jid, jtid, computed) - VALUES '.implode(', ', $terms_values)); + XDB::rawExecute('INSERT INTO profile_job_term (pid, jid, jtid, computed) + VALUES ' . implode(', ', $terms_values) . ' + ON DUPLICATE KEY UPDATE computed = VALUES(computed)'); + } + if (S::user()->isMe($page->owner) && count($value) > 1) { + Platal::page()->trigWarning('Attention, tu as plusieurs emplois sur ton profil. Pense à supprimer ceux qui sont obsolètes.'); } } - public function getText($value) { + public function getText($value) + { + static $pubs = array('public' => 'publique', 'ax' => 'annuaire AX', 'private' => 'privé'); $jobs = array(); foreach ($value as $id => $job) { - $address = Address::formArrayToString($job['w_address']); + $address = Address::formArrayToString(array($job['w_address'])); $phones = Phone::formArrayToString($job['w_phone']); - // TODO: add jobterms here. - $jobs[] = 'Entreprise : ' . $job['name'] - . ', description : ' . $job['description'] . ', web : ' . $job['w_url'] - . ', email : ' . $job['w_email'] - . ($phones ? ', ' . $phones : '') . ($address ? ', ' . $address : ''); + $jobs[$id] = $job['name']; + $jobs[$id] .= ($job['description'] ? (', ' . $job['description']) : ''); + $jobs[$id] .= ' (affichage ' . $pubs[$job['pub']]; + if (count($job['terms'])) { + $terms = array(); + foreach ($job['terms'] as $term) { + $terms[] = $term['full_name']; + } + $jobs[$id] .= ', mots-clefs : ' . implode(', ', $terms); + } + if ($job['w_url']) { + $jobs[$id] .= ', page perso : ' . $job['w_url']; + } + if ($address) { + $jobs[$id] .= ', adresse : ' . $address; + } + if ($job['w_email']) { + $jobs[$id] .= ', email : ' . $job['w_email']; + } + if ($phones) { + $jobs[$id] .= ', téléphones : ' . $phones; + } + $jobs[$id] .= ')'; } return implode(' ; ' , $jobs); } @@ -220,33 +357,45 @@ class ProfileSettingJob implements ProfileSetting class ProfileSettingCorps implements ProfileSetting { - public function value(ProfilePage &$page, $field, $value, &$success) + public function value(ProfilePage $page, $field, $value, &$success) { $success = true; if (is_null($value)) { - $res = XDB::query("SELECT original_corpsid AS original, current_corpsid AS current, - rankid AS rank, corps_pub AS pub - FROM profile_corps - WHERE pid = {?}", + $res = XDB::query('SELECT c.original_corpsid AS original, e.name AS originalText, + c.current_corpsid AS current, c.rankid AS rank, c.corps_pub AS pub + FROM profile_corps AS c + INNER JOIN profile_corps_enum AS e ON (c.original_corpsid = e.id) + WHERE c.pid = {?}', $page->pid()); return $res->fetchOneAssoc(); } return $value; } - public function save(ProfilePage &$page, $field, $value) + public function save(ProfilePage $page, $field, $value) { - XDB::execute('REPLACE INTO profile_corps (original_corpsid, current_corpsid, rankid, corps_pub, pid) - VALUES ({?}, {?}, {?}, {?}, {?})', - $value['original'], $value['current'], $value['rank'], $value['pub'], $page->pid()); + if (!S::user()->isMe($page->owner)) { + XDB::execute('INSERT INTO profile_corps (original_corpsid, current_corpsid, rankid, corps_pub, pid) + VALUES ({?}, {?}, {?}, {?}, {?}) + ON DUPLICATE KEY UPDATE original_corpsid = VALUES(original_corpsid), current_corpsid = VALUES(current_corpsid), + rankid = VALUES(rankid), corps_pub = VALUES(corps_pub)', + $value['original'], $value['current'], $value['rank'], $value['pub'], $page->pid()); + } else { + XDB::execute('INSERT INTO profile_corps (current_corpsid, rankid, corps_pub, pid) + VALUES ({?}, {?}, {?}, {?}) + ON DUPLICATE KEY UPDATE current_corpsid = VALUES(current_corpsid), + rankid = VALUES(rankid), corps_pub = VALUES(corps_pub)', + $value['current'], $value['rank'], $value['pub'], $page->pid()); + } } public function getText($value) { - $corpsList = DirEnum::getOptions(DirEnum::CORPS); + static $pubs = array('public' => 'publique', 'ax' => 'annuaire AX', 'private' => 'privé'); + $corpsList = DirEnum::getOptions(DirEnum::ORIGINCORPS); $rankList = DirEnum::getOptions(DirEnum::CORPSRANKS); - return 'Corps actuel : ' . $corpsList[$value['current']] . ' , rang : ' . $corpsList[$value['rank']] - . ' , corps d\'origine : ' . $corpsList[$value['original']] . ' , affichage : ' . $value['pub']; + return $corpsList[$value['current']] . ', ' . $corpsList[$value['rank']] . ' (' + . 'corps d\'origine : ' . $corpsList[$value['original']] . ', affichage ' . $pubs[$value['pub']] . ')'; } } @@ -254,7 +403,7 @@ class ProfilePageJobs extends ProfilePage { protected $pg_template = 'profile/jobs.tpl'; - public function __construct(PlWizard &$wiz) + public function __construct(PlWizard $wiz) { parent::__construct($wiz); if (S::user()->checkPerms(User::PERM_DIRECTORY_PRIVATE)) { @@ -263,6 +412,7 @@ class ProfilePageJobs extends ProfilePage $this->settings['corps'] = new ProfileSettingCorps(); $this->settings['jobs'] = new ProfileSettingJob(); $this->watched = array('cv' => true, 'jobs' => true, 'corps' => true); + Platal::page()->assign('geocoding_removal', true); } protected function _fetchData() @@ -275,85 +425,6 @@ class ProfilePageJobs extends ProfilePage $this->pid()); $this->values['cv'] = $res->fetchOneCell(); } - - // Build the jobs tree - $res = XDB::iterRow('SELECT j.id, j.jobid, je.name, j.description, j.email, j.email_pub, - j.url, j.pub - FROM profile_job AS j - LEFT JOIN profile_job_enum AS je ON (j.jobid = je.id) - WHERE j.pid = {?} - ORDER BY j.id', - $this->pid()); - $this->values['jobs'] = array(); - - $compagnies = array(); - if ($res->numRows() > 0) { - while (list($id, $jobid, $name, $description, $w_email, $w_emailPub, $w_url, $pub) = $res->next()) { - $compagnies[] = $jobid; - $this->values['jobs'][] = array( - 'id' => $id, - 'jobid' => $jobid, - 'name' => $name, - 'description' => $description, - 'pub' => $pub, - 'w_email' => $w_email, - 'w_email_pub' => $w_emailPub, - 'w_url' => $w_url, - ); - } - - $it = Address::iterate(array($this->pid()), array(Address::LINK_JOB)); - while ($address = $it->next()) { - $this->values['jobs'][$address->jobid]['w_address'] = $address->toFormArray(); - } - $it = Phone::iterate(array($this->pid()), array(Phone::LINK_JOB)); - while ($phone = $it->next()) { - $this->values['jobs'][$phone->linkId()]['w_phone'][$phone->id()] = $phone->toFormArray(); - } - $res = XDB::iterator("SELECT e.jtid, e.full_name, j.jid AS jobid - FROM profile_job_term_enum AS e - INNER JOIN profile_job_term AS j USING(jtid) - WHERE pid = {?} - ORDER BY j.jid", - $this->pid()); - $i = 0; - $jobNb = count($this->values['jobs']); - while ($term = $res->next()) { - $jobid = $term['jobid']; - while ($i < $jobNb && $this->values['jobs'][$i]['id'] < $jobid) { - $i++; - } - if ($i >= $jobNb) { - break; - } - $job =& $this->values['jobs'][$i]; - if ($job['id'] != $jobid) { - continue; - } - if (!isset($job['terms'])) { - $job['terms'] = array(); - } - $job['terms'][] = $term; - } - - $phone = new Phone(); - $address = new Address(); - foreach ($this->values['jobs'] as $id => &$job) { - if (!isset($job['w_phone'])) { - $job['w_phone'] = array(0 => $phone->toFormArray()); - } - if (!isset($job['w_address'])) { - $job['w_address'] = $address->toFormArray(); - } - } - - $job['w_email_new'] = ''; - if (!isset($job['w_email_pub'])) { - $job['w_email_pub'] = 'private'; - } - } else { - $this->values['jobs'][] = $this->settings['jobs']->emptyJob(); - } } protected function _saveData() @@ -368,15 +439,17 @@ class ProfilePageJobs extends ProfilePage } } - public function _prepare(PlPage &$page, $id) + public function _prepare(PlPage $page, $id) { require_once 'emails.combobox.inc.php'; - fill_email_combobox($page, $this->owner); + fill_email_combobox($page, array('redirect', 'job', 'stripped_directory'), $this->owner); - $res = XDB::iterator("SELECT id, name - FROM profile_corps_enum - ORDER BY id = 1 DESC, name"); - $page->assign('original_corps', $res->fetchAllAssoc()); + if (!S::user()->isMe($this->owner)) { + $res = XDB::iterator('SELECT id, name + FROM profile_corps_enum + ORDER BY id = 1 DESC, name'); + $page->assign('original_corps', $res->fetchAllAssoc()); + } $res = XDB::iterator("SELECT id, name FROM profile_corps_enum