X-Git-Url: http://git.polytechnique.org/?a=blobdiff_plain;f=modules%2Fprofile%2Fjobs.inc.php;h=453d21fa84e3630b9eac03e17763bd048a690186;hb=972fd3c59f152b7f2d61f7aa30afc819f094e4aa;hp=06c74b509f6552a3dffa492a2a9f4947ab39d8d0;hpb=5b2c99878fc75a6acffb2239e284f2cb1782142c;p=platal.git diff --git a/modules/profile/jobs.inc.php b/modules/profile/jobs.inc.php index 06c74b5..453d21f 100644 --- a/modules/profile/jobs.inc.php +++ b/modules/profile/jobs.inc.php @@ -1,6 +1,6 @@ pub = new ProfilePub(); - $this->mail - = $this->mail_new - = new ProfileEmail(); - $this->web = new ProfileWeb(); - $this->bool = new ProfileBool(); - $this->checks = array('web' => array('w_web'), - 'mail_new' => array('w_email_new'), - 'mail' => array('w_email'), - 'pub' => array('pub', 'w_email_pub')); + $this->pub = new ProfileSettingPub(); + $this->email + = $this->email_new + = new ProfileSettingEmail(); + $this->url = new ProfileSettingWeb(); + $this->bool = new ProfileSettingBool(); + $this->checks = array('url' => array('w_url'), + 'email' => array('w_email'), + 'pub' => array('pub', 'w_email_pub'), + ); + } + + public function emptyJob() + { + $address = new Address(); + $phone = new Phone(); + return array( + 'id' => '0', + 'jobid' => '', + 'pub' => 'private', + 'name' => '', + 'description' => '', + 'w_url' => '', + 'w_address' => $address->toFormArray(), + 'w_email' => '', + 'w_email_pub' => 'private', + 'w_email_new' => '', + 'w_phone' => array(0 => $phone->toFormArray()), + 'terms' => array() + ); } private function cleanJob(ProfilePage &$page, $jobid, array &$job, &$success) { - $success = true; + if ($job['w_email'] == "new@example.org") { + $job['w_email'] = $job['w_email_new']; + } foreach ($this->checks as $obj=>&$fields) { $chk =& $this->$obj; foreach ($fields as $field) { - if ($field == "w_email_new") { - if ($job['w_email'] == "new@example.org") { - $job['w_email'] = $job[$field]; - } - continue; - } $job[$field] = $chk->value($page, $field, $job[$field], $s); if (!$s) { $success = false; @@ -61,22 +77,24 @@ class ProfileJob extends ProfileGeocoding } } } - if (!$job['sss_secteur_name']) { - $res = XDB::query("SELECT name - FROM profile_job_subsubsector_enum - WHERE id = {?}", - $job['sss_secteur']); - $job['sss_secteur_name'] = $res->fetchOneCell(); - } else { - $res = XDB::query("SELECT sectorid, subsectorid, id - FROM profile_job_subsubsector_enum - WHERE name = {?}", - $job['sss_secteur_name']); - if ($res->numRows() != 1) { - $success = false; - $job['sector_error'] = true; - } else { - list($job['secteur'], $job['ss_secteur'], $job['sss_secteur']) = $res->fetchOneRow(); + if (count($job['terms'])) { + $termsid = array(); + foreach ($job['terms'] as $term) { + if (!$term['full_name']) { + $termsid[] = $term['jtid']; + } + } + if (count($termsid)) { + $res = XDB::query("SELECT jtid, full_name + FROM profile_job_term_enum + WHERE jtid IN {?}", + $termsid); + $term_id_to_name = $res->fetchAllAssoc('jtid', false); + foreach ($job['terms'] as &$term) { + if (!$term['full_name']) { + $term['full_name'] = $term_id_to_name[$term['jtid']]; + } + } } } if ($job['name']) { @@ -85,32 +103,25 @@ class ProfileJob extends ProfileGeocoding WHERE name = {?}", $job['name']); if ($res->numRows() != 1) { - $user = S::user(); - $req = new EntrReq($user, $jobid, $job['name'], $job['acronym'], $job['hq_web'], $job['hq_email'], $job['hq_tel'], $job['hq_fax']); + $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_adr']['pub'] = $this->pub->value($page, 'adr_pub', @$job['w_adr']['pub'], $s); - $job['w_adr']['checked'] = $this->bool->value($page, 'adr_checked', @$job['w_adr']['checked'], $s); - if (!isset($job['w_tel'])) { - $job['w_tel'] = array(); - } - $profiletel = new ProfilePhones('pro', $jobid); - $job['w_tel'] = $profiletel->value($page, 'tel', $job['w_tel'], $s); + $job['w_phone'] = Phone::formatFormArray($job['w_phone'], $s); + unset($job['removed']); unset($job['new']); - unset($job['w_adr']['changed']); - unset($job['w_adr']['parsevalid']); - unset($job['w_adr']['display']); } public function value(ProfilePage &$page, $field, $value, &$success) { - require_once('validations.inc.php'); - $entreprise = Validate::get_typed_requests(S::i('uid'), 'entreprise'); + require_once 'validations.inc.php'; + $entreprise = ProfileValidate::get_typed_requests($page->pid(), 'entreprise'); $entr_val = 0; $init = false; @@ -119,24 +130,39 @@ class ProfileJob extends ProfileGeocoding $init = true; } $success = true; - foreach ($value as $key=>&$job) { + foreach ($value as $key => &$job) { $job['name'] = trim($job['name']); - if (!$job['name']) { + if ($job['name'] == '' && $entreprise) { $job['tmp_name'] = $entreprise[$entr_val]->name; - $entr_val ++; + ++$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']['tel'] == '') { + array_splice($value, $key, 1); + continue; + } + + if (!$init) { + $job['name_error'] = true; + $success = false; + } } - if (@$job['removed']) { - unset($value[$key]); + + if (isset($job['removed']) && $job['removed']) { + if ($job['name'] == '' && $entreprise) { + $entreprise[$entr_val - 1]->clean(); + } + array_splice($value, $key, 1); } } - foreach ($value as $key=>&$job) { - $ls = true; - $this->geocodeAddress($job['w_adr'], $s); - $ls = ($ls && $s); + foreach ($value as $key => &$job) { + $address = new Address($job['w_address']); + $s = $address->format(); + $job['w_address'] = $address->toFormArray(); $this->cleanJob($page, $key, $job, $s); - $ls = ($ls && $s); if (!$init) { - $success = ($success && $ls); + $success = ($success && $s); } } return $value; @@ -144,181 +170,208 @@ class ProfileJob extends ProfileGeocoding public function save(ProfilePage &$page, $field, $value) { - require_once('profil.func.inc.php'); - require_once('validations.inc.php'); - XDB::execute("DELETE FROM profile_job - WHERE uid = {?}", - S::i('uid')); - XDB::execute("DELETE FROM profile_phones - WHERE uid = {?} AND link_type = 'pro'", - S::i('uid')); - foreach ($value as $id=>&$job) { - if ($job['w_email'] == "new@example.org") { - $job['w_email'] = $job['w_email_new']; - } - if ($job['jobid']) { - XDB::execute("INSERT INTO profile_job (uid, id, functionid, description, sectorid, subsectorid, - subsubsectorid, email, url, pub, email_pub, jobid) - VALUES ({?}, {?}, {?}, {?}, {?}, {?}, {?}, {?}, {?}, {?}, {?}, {?})", - S::i('uid'), $id, $job['fonction'], $job['description'], $job['secteur'], $job['ss_secteur'], - $job['sss_secteur'], $job['w_email'], $job['w_web'], $job['pub'], $job['w_email_pub'], $job['jobid']); - } else { - XDB::execute("INSERT INTO profile_job (uid, id, functionid, description, sectorid, subsectorid, - subsubsectorid, email, url, pub, email_pub) - VALUES ({?}, {?}, {?}, {?}, {?}, {?}, {?}, {?}, {?}, {?}, {?})", - S::i('uid'), $id, $job['fonction'], $job['description'], $job['secteur'], $job['ss_secteur'], - $job['sss_secteur'], $job['w_email'], $job['w_web'], $job['pub'], $job['w_email_pub']); + WHERE pid = {?}", + $page->pid()); + Address::delete($page->pid(), Address::LINK_JOB); + Phone::deletePhones($page->pid(), Phone::LINK_JOB); + $terms_values = array(); + foreach ($value as $id => &$job) { + if (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']); + } 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']); + } + $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")'; + } + } } - $profiletel = new ProfilePhones('pro', $id); - $profiletel->saveTels('tel', $job['w_tel']); } + if (count($terms_values) > 0) { + XDB::execute('INSERT INTO profile_job_term (pid, jid, jtid, computed) + VALUES '.implode(', ', $terms_values)); + } + } + + public function getText($value) { + $jobs = array(); + foreach ($value as $id => $job) { + $address = Address::formArrayToString($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 : ''); + } + return implode(' ; ' , $jobs); + } +} + +class ProfileSettingCorps implements ProfileSetting +{ + 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 = {?}", + $page->pid()); + return $res->fetchOneAssoc(); + } + return $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()); + } + + public function getText($value) + { + $corpsList = DirEnum::getOptions(DirEnum::CORPS); + $rankList = DirEnum::getOptions(DirEnum::CORPSRANKS); + return 'Corps actuel : ' . $corpsList[$value['current']] . ' , rang : ' . $corpsList[$value['rank']] + . ' , corps d\'origine : ' . $corpsList[$value['original']] . ' , affichage : ' . $value['pub']; } } -class ProfileJobs extends ProfilePage +class ProfileSettingJobs extends ProfilePage { protected $pg_template = 'profile/jobs.tpl'; public function __construct(PlWizard &$wiz) { parent::__construct($wiz); - $this->settings['cv'] = null; - $this->settings['corps'] = null; - $this->settings['jobs'] = new ProfileJob(); + if (S::user()->checkPerms(User::PERM_DIRECTORY_PRIVATE)) { + $this->settings['cv'] = null; + } + $this->settings['corps'] = new ProfileSettingCorps(); + $this->settings['jobs'] = new ProfileSettingJob(); $this->watched = array('cv' => true, 'jobs' => true, 'corps' => true); } protected function _fetchData() { - // Checkout the CV - $res = XDB::query("SELECT cv - FROM profiles - WHERE pid = {?}", - $this->pid()); - $this->values['cv'] = $res->fetchOneCell(); - - // Checkout the corps - $res = XDB::query("SELECT original_corpsid AS original, current_corpsid AS current, - rankid AS rank, corps_pub AS pub - FROM profile_corps - WHERE uid = {?}", - $this->pid()); - $this->values['corps'] = $res->fetchOneAssoc(); + if (S::user()->checkPerms(User::PERM_DIRECTORY_PRIVATE)) { + // Checkout the CV + $res = XDB::query("SELECT cv + FROM profiles + WHERE pid = {?}", + $this->pid()); + $this->values['cv'] = $res->fetchOneCell(); + } // Build the jobs tree - $res = XDB::iterRow("SELECT j.id, je.name, j.functionid, j.sectorid, j.subsectorid, - j.subsubsectorid, j.description, e.adr1, e.adr2, e.adr3, - e.postcode, e.city, e.cityid, e.region, e.regiontxt, - e.country, gc.countryFR, pa.accuracy, - j.email, j.url, j.pub, - e.adr_pub, j.email_pub, - e.glat, e.glng, s.name - FROM profile_job AS j - LEFT JOIN profile_job_enum AS je ON (j.jobid = je.id) - LEFT JOIN entreprises AS e ON (j.uid = e.uid AND j.id = e.entrid) - LEFT JOIN geoloc_countries AS gc ON (gc.iso_3166_1_a2 = e.country) - LEFT JOIN profile_job_subsubsector_enum AS s ON (s.id = j.subsubsectorid) - WHERE j.uid = {?} - ORDER BY entrid", $this->pid()); + $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(); - while (list($id, $name, $function, $secteur, $ss_secteur, $sss_secteur, $description, - $w_adr1, $w_adr2, $w_adr3, $w_postcode, $w_city, $w_cityid, - $w_region, $w_regiontxt, $w_country, $w_countrytxt, - $w_checked, $w_email, $w_web, - $pub, $w_adr_pub, $w_email_pub, $w_glat, $w_glng, $sss_secteur_name - ) = $res->next()) { - $this->values['jobs'][] = array('id' => $id, - 'name' => $name, - 'fonction' => $function, - 'secteur' => $secteur, - 'ss_secteur' => $ss_secteur, - 'sss_secteur' => $sss_secteur, - 'sss_secteur_name' => $sss_secteur_name, - 'description' => $description, - 'w_adr' => array('adr1' => $w_adr1, - 'adr2' => $w_adr2, - 'adr3' => $w_adr3, - 'postcode' => $w_postcode, - 'city' => $w_city, - 'cityid' => $w_cityid, - 'region' => $w_region, - 'regiontxt' => $w_regiontxt, - 'country' => $w_country, - 'countrytxt' => $w_countrytxt, - 'pub' => $w_adr_pub, - 'checked' => (($w_checked == 0)? true : false), - 'precise_lat' => $w_glat, - 'precise_lon' => $w_glng), - 'w_email' => $w_email, - 'w_web' => $w_web, - 'pub' => $pub, - 'w_email_pub' => $w_email_pub); - } - $res = XDB::iterator("SELECT link_id AS jobid, tel_type AS type, pub, display_tel AS tel, comment - FROM profile_phones - WHERE uid = {?} AND link_type = 'pro' - ORDER BY link_id", - $this->pid()); - $i = 0; - $jobNb = count($this->values['jobs']); - while ($tel = $res->next()) { - $jobid = $tel['jobid']; - unset($tel['jobid']); - while ($i < $jobNb && $this->values['jobs'][$i]['id'] < $jobid) { - $i++; + $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, + ); } - if ($i >= $jobNb) { - break; + + $it = Address::iterate(array($this->pid()), array(Address::LINK_JOB)); + while ($address = $it->next()) { + $this->values['jobs'][$address->jobid]['w_address'] = $address->toFormArray(); } - $job =& $this->values['jobs'][$i]; - if (!isset($job['w_tel'])) { - $job['w_tel'] = array(); + $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(); } - if ($job['id'] == $jobid) { - $job['w_tel'][] = $tel; + $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; } - } - foreach ($this->values['jobs'] as $id=>&$job) { - if (!isset($job['w_tel'])) { - $job['w_tel'] = array(); + + $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'; } - unset($job['id']); + } else { + $this->values['jobs'][] = $this->settings['jobs']->emptyJob(); } } protected function _saveData() { - if ($this->changed['cv']) { - XDB::execute("UPDATE profiles - SET cv = {?} - WHERE pid = {?}", - $this->values['cv'], $this->pid()); - } - - if ($this->changed['corps']) { - XDB::execute("UPDATE profile_corps - SET original_corpsid = {?}, current_corpsid = {?}, - rankid = {?}, corps_pub = {?} - WHERE uid = {?}", - $this->values['corps']['original'], $this->values['corps']['current'], - $this->values['corps']['rank'], $this->values['corps']['pub'], $this->pid()); + if (S::user()->checkPerms(User::PERM_DIRECTORY_PRIVATE)) { + if ($this->changed['cv']) { + XDB::execute("UPDATE profiles + SET cv = {?} + WHERE pid = {?}", + $this->values['cv'], $this->pid()); + } } } public function _prepare(PlPage &$page, $id) { - require_once "emails.combobox.inc.php"; - fill_email_combobox($page, $this->owner, $this->profile); - - $res = XDB::query("SELECT id, name AS label - FROM profile_job_sector_enum"); - $page->assign('secteurs', $res->fetchAllAssoc()); - $res = XDB::query("SELECT id, fonction_fr, FIND_IN_SET('titre', flags) AS title - FROM fonctions_def - ORDER BY id"); - $page->assign('fonctions', $res->fetchAllAssoc()); + require_once 'emails.combobox.inc.php'; + fill_email_combobox($page, $this->owner); $res = XDB::iterator("SELECT id, name FROM profile_corps_enum @@ -332,7 +385,8 @@ class ProfileJobs extends ProfilePage $page->assign('current_corps', $res->fetchAllAssoc()); $res = XDB::iterator("SELECT id, name - FROM profile_corps_rank_enum"); + FROM profile_corps_rank_enum + ORDER BY id = 1 DESC, name"); $page->assign('corps_rank', $res->fetchAllAssoc()); } }