X-Git-Url: http://git.polytechnique.org/?a=blobdiff_plain;f=modules%2Fprofile%2Fjobs.inc.php;h=30cc3f45816ecad1fd76f0a8d76827a0fc85c377;hb=3ac45f10c6b54e4db4bfeb0aeb5eef0f5ee5d1b2;hp=1fe8d151542fa015f5973dd3d1d269402b74b1a7;hpb=9f5bd98e936d8cef7ca9f774eeef64dbb8a1b079;p=platal.git diff --git a/modules/profile/jobs.inc.php b/modules/profile/jobs.inc.php index 1fe8d15..30cc3f4 100644 --- a/modules/profile/jobs.inc.php +++ b/modules/profile/jobs.inc.php @@ -19,31 +19,107 @@ * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * ***************************************************************************/ -class ProfileJob extends ProfileGeoloc +class ProfileSettingJob extends ProfileSettingGeocoding { private $pub; - private $mail; - private $web; - private $tel; + private $email_new; + private $email; + private $url; private $bool; private $checks; public function __construct() { - $this->pub = new ProfilePub(); - $this->mail = new ProfileEmail(); - $this->web = new ProfileWeb(); - $this->tel = new ProfileTel(); - $this->bool = new ProfileBool(); - $this->checks = array('web' => array('web'), - 'mail' => array('email'), - 'tel' => array('tel', 'fax', 'mobile'), - 'pub' => array('pub', 'tel_pub', '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'), + ); } - private function cleanJob(ProfilePage &$page, array &$job, &$success) + public function emptyJob() + { + return array( + 'id' => '0', + 'jobid' => '', + 'pub' => 'private', + 'name' => '', + 'hq_acronym' => '', + 'hq_url' => '', + 'hq_email' => '', + 'hq_address' => array( + 'text' => '', + 'accuracy' => '', + 'postalText' => '', + 'postalCode' => '', + 'administrativeAreaId' => '', + 'subAdministrativeAreaId' => '', + 'localityId' => '', + 'countryId' => '', + 'latitude' => '', + 'longitude' => '', + 'north' => '', + 'south' => '', + 'east' => '', + 'west' => '', + 'cedex' => '', + 'updateTime' => '', + 'changed' => '0', + 'removed' => '0', + ), + 'hq_fixed' => '', + 'hq_fax' => '', + 'subSubSectorName' => null, + 'sector' => '0', + 'subSector' => '0', + 'subSubSector' => '0', + 'description' => '', + 'w_url' => '', + 'w_address' => array( + 'pub' => 'private', + 'text' => '', + 'accuracy' => '', + 'postalText' => '', + 'postalCode' => '', + 'administrativeAreaId' => '', + 'subAdministrativeAreaId' => '', + 'localityId' => '', + 'countryId' => '', + 'latitude' => '', + 'longitude' => '', + 'north' => '', + 'south' => '', + 'east' => '', + 'west' => '', + 'cedex' => '', + 'updateTime' => '', + 'changed' => '0', + 'removed' => '0', + ), + 'w_email' => '', + 'w_email_pub' => 'private', + 'w_email_new' => '', + 'w_phone' => array(0 => array( + 'type' => 'fixed', + 'tel' => '', + 'pub' => 'private', + 'comment' => '', + ), + '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) { @@ -54,33 +130,112 @@ class ProfileJob extends ProfileGeoloc } } } - $job['adr']['pub'] = $this->pub->value($page, 'adr_pub', @$job['adr']['pub'], $s); - $job['adr']['checked'] = $this->bool->value($page, 'adr_checked', @$job['adr']['checked'], $s); + if (!$job['subSubSectorName']) { + $res = XDB::query("SELECT name + FROM profile_job_subsubsector_enum + WHERE id = {?}", + $job['subSubSector']); + $job['subSubSectorName'] = $res->fetchOneCell(); + } else { + $res = XDB::query("SELECT sectorid, subsectorid, id + FROM profile_job_subsubsector_enum + WHERE name = {?}", + $job['subSubSectorName']); + if ($res->numRows() != 1) { + $success = false; + $job['sector_error'] = true; + } else { + list($job['sector'], $job['subSector'], $job['subSubSector']) = $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']) { + $res = XDB::query("SELECT id + FROM profile_job_enum + WHERE name = {?}", + $job['name']); + if ($res->numRows() != 1) { + $this->geocodeAddress($job['hq_address'], $s); + if (!$s) { + $gmapsGeocoder = new GMapsGeocoder(); + $job['hq_address'] = $gmapsGeocoder->stripGeocodingFromAddress($job['hq_address']); + } + $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_address']['pub'] = $this->pub->value($page, 'address_pub', $job['w_address']['pub'], $s); + $job['w_phone'] = Phone::formatFormArray($job['w_phone'], $s); + unset($job['removed']); unset($job['new']); - unset($job['adr']['changed']); - unset($job['adr']['parsevalid']); - unset($job['adr']['display']); } 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']; $init = true; } $success = true; - foreach ($value as $key=>&$job) { - if (@$job['removed'] || !trim($job['name'])) { - unset($value[$key]); + foreach ($value as $key => &$job) { + $job['name'] = trim($job['name']); + if ($job['name'] == '' && $entreprise) { + $job['tmp_name'] = $entreprise[$entr_val]->name; + ++$entr_val; + } else if ($job['name'] == '') { + if ($job['subSubSectorName'] == '' && $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; + } + + $job['name_error'] = true; + $success = false; + } + + 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) { + foreach ($value as $key => &$job) { $ls = true; - $this->geolocAddress($job['adr'], $s); + $this->geocodeAddress($job['w_address'], $s); $ls = ($ls && $s); - $this->cleanJob($page, $job, $s); + $this->cleanJob($page, $key, $job, $s); $ls = ($ls && $s); if (!$init) { $success = ($success && $ls); @@ -91,37 +246,93 @@ class ProfileJob extends ProfileGeoloc public function save(ProfilePage &$page, $field, $value) { - XDB::execute("DELETE FROM entreprises - WHERE uid = {?}", - S::i('uid')); - $i = 0; - foreach ($value as &$job) { - XDB::execute("INSERT INTO entreprises (uid, entrid, entreprise, secteur, ss_secteur, - fonction, poste, adr1, adr2, adr3, postcode, - city, cityid, country, region, regiontxt, - tel, fax, mobile, email, web, - pub, adr_pub, tel_pub, email_pub, flags, - glat, glng) - VALUES ({?}, {?}, {?}, {?}, {?}, - {?}, {?}, {?}, {?}, {?}, {?}, - {?}, {?}, {?}, {?}, {?}, - {?}, {?}, {?}, {?}, {?}, - {?}, {?}, {?}, {?}, {?}, - {?}, {?})", - S::i('uid'), $i++, $job['name'], $job['secteur'], $job['ss_secteur'], - $job['fonction'], $job['poste'], $job['adr']['adr1'], $job['adr']['adr2'], $job['adr']['adr3'], - $job['adr']['postcode'], - $job['adr']['city'], $job['adr']['cityid'], $job['adr']['country'], $job['adr']['region'], - $job['adr']['regiontxt'], - $job['tel'], $job['fax'], $job['mobile'], $job['email'], $job['web'], - $job['pub'], $job['adr']['pub'], $job['tel_pub'], $job['email_pub'], - $job['adr']['checked'] ? 'geoloc' : '', $job['adr']['precise_lat'], - $job['adr']['precise_lon']); + // TODO: use address class to update profile_job_enum once it is done. + XDB::execute("DELETE FROM profile_job + WHERE pid = {?}", + $page->pid()); + XDB::execute("DELETE FROM profile_addresses + WHERE pid = {?} AND type = 'job'", + $page->pid()); + 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, sectorid, subsectorid, + subsubsectorid, email, url, pub, email_pub, jobid) + VALUES ({?}, {?}, {?}, {?}, {?}, {?}, {?}, {?}, {?}, {?}, {?})", + $page->pid(), $id, $job['description'], $job['sector'], $job['subSector'], + $job['subSubSector'], $job['w_email'], $job['w_url'], $job['pub'], $job['w_email_pub'], $job['jobid']); + } else { + XDB::execute("INSERT INTO profile_job (pid, id, description, sectorid, subsectorid, + subsubsectorid, email, url, pub, email_pub) + VALUES ({?}, {?}, {?}, {?}, {?}, {?}, {?}, {?}, {?}, {?})", + $page->pid(), $id, $job['description'], $job['sector'], $job['subSector'], + $job['subSubSector'], $job['w_email'], $job['w_url'], $job['pub'], $job['w_email_pub']); + } + $address = new ProfileSettingAddress(); + $address->saveAddress($page->pid(), $id, $job['w_address'], 'job'); + 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")'; + } + } + } + } + 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 = new ProfileSettingAddress(); + $phones = Phone::formArrayToString($job['w_phone']); + $jobs[] = 'Entreprise : ' . $job['name'] . ', secteur : ' . $job['subSubSectorName'] + . ', description : ' . $job['description'] . ', web : ' . $job['w_url'] + . ', email : ' . $job['w_email'] + . ($phones ? ', ' . $phones : '') . ', ' . $address->getText($job['w_address']); + } + return implode(' ; ' , $jobs); + } } -class ProfileJobs extends ProfilePage +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 ProfileSettingJobs extends ProfilePage { protected $pg_template = 'profile/jobs.tpl'; @@ -129,88 +340,222 @@ class ProfileJobs extends ProfilePage { parent::__construct($wiz); $this->settings['cv'] = null; - $this->settings['jobs'] = new ProfileJob(); - $this->watched['cv'] = $this->watched['jobs'] = true; + $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 auth_user_md5 - WHERE user_id = {?}", - S::i('uid')); + FROM profiles + WHERE pid = {?}", + $this->pid()); $this->values['cv'] = $res->fetchOneCell(); // Build the jobs tree - $res = XDB::iterRow("SELECT e.entreprise, e.secteur, e.ss_secteur, - e.fonction, e.poste, e.adr1, e.adr2, e.adr3, - e.postcode, e.city, e.cityid, e.region, e.regiontxt, - e.country, gp.pays, gp.display, - FIND_IN_SET('geoloc', flags), - e.tel, e.fax, e.mobile, e.email, e.web, e.pub, - e.adr_pub, e.tel_pub, e.email_pub, - e.glat AS precise_lat, e.glng AS precise_lon - FROM entreprises AS e - LEFT JOIN geoloc_pays AS gp ON(gp.a2 = e.country) - WHERE uid = {?} AND entreprise != '' - ORDER BY entrid", S::i('uid')); + $res = XDB::iterRow("SELECT j.id, j.jobid, je.name, j.sectorid, j.subsectorid, j.subsubsectorid, + s.name, j.description, j.email, j.email_pub, j.url, j.pub, + je.acronym, je.url, je.email, + aw.accuracy, aw.text, aw.postalText, aw.postalCode, aw.localityId, + aw.subAdministrativeAreaId, aw.administrativeAreaId, aw.countryId, + aw.latitude, aw.longitude, aw.pub, aw.updateTime, + aw.north, aw.south, aw.east, aw.west, + ah.accuracy, ah.text, ah.postalText, ah.postalCode, ah.localityId, + ah.subAdministrativeAreaId, ah.administrativeAreaId, ah.countryId, + ah.latitude, ah.longitude, ah.pub, ah.updateTime, + ah.north, ah.south, ah.east, ah.west + FROM profile_job AS j + LEFT JOIN profile_job_enum AS je ON (j.jobid = je.id) + LEFT JOIN profile_job_subsubsector_enum AS s ON (s.id = j.subsubsectorid) + LEFT JOIN profile_addresses AS aw ON (aw.pid = j.pid AND aw.type = 'job' + AND aw.id = j.id) + LEFT JOIN profile_addresses AS ah ON (ah.jobid = j.jobid AND ah.type = 'hq') + WHERE j.pid = {?} + ORDER BY j.id", + $this->pid()); $this->values['jobs'] = array(); - while (list($name, $secteur, $ss_secteur, $fonction, $poste, - $adr1, $adr2, $adr3, $postcode, $city, $cityid, - $region, $regiontxt, $country, $countrytxt, $display, - $checked, $tel, $fax, $mobile, $email, $web, - $pub, $adr_pub, $tel_pub, $email_pub, $glat, $glng) = $res->next()) { - $this->values['jobs'][] = array('name' => $name, - 'secteur' => $secteur, - 'ss_secteur' => $ss_secteur, - 'fonction' => $fonction, - 'poste' => $poste, - 'adr' => array('adr1' => $adr1, - 'adr2' => $adr2, - 'adr3' => $adr3, - 'postcode' => $postcode, - 'city' => $city, - 'cityid' => $cityid, - 'region' => $region, - 'regiontxt' => $regiontxt, - 'country' => $country, - 'countrytxt' => $countrytxt, - 'display' => $display, - 'pub' => $adr_pub, - 'checked' => $checked, - 'precise_lat'=> $glat, - 'precise_lon'=> $glng), - 'tel' => $tel, - 'fax' => $fax, - 'mobile' => $mobile, - 'email' => $email, - 'web' => $web, - 'pub' => $pub, - 'tel_pub' => $tel_pub, - 'email_pub' => $email_pub); + + if ($res->numRows() > 0) { + while (list($id, $jobid, $name, $sector, $subSector, $subSubSector, + $subSubSectorName, $description, $w_email, $w_emailPub, $w_url, $pub, + $hq_acronym, $hq_url, $hq_email, + $w_accuracy, $w_text, $w_postalText, $w_postalCode, $w_localityId, + $w_subAdministrativeAreaId, $w_administrativeAreaId, $w_countryId, + $w_latitude, $w_longitude, $w_pub, $w_updateTime, + $w_north, $w_south, $w_east, $w_west, + $hq_accuracy, $hq_text, $hq_postalText, $hq_postalCode, $hq_localityId, + $hq_subAdministrativeAreaId, $hq_administrativeAreaId, $hq_countryId, + $hq_latitude, $hq_longitude, $hq_pub, $hq_updateTime, + $hq_north, $hq_south, $hq_east, $hq_west, + ) = $res->next()) { + $this->values['jobs'][] = array( + 'id' => $id, + 'jobid' => $jobid, + 'name' => $name, + 'sector' => $sector, + 'subSector' => $subSector, + 'subSubSector' => $subSubSector, + 'subSubSectorName' => $subSubSectorName, + 'description' => $description, + 'pub' => $pub, + 'w_email' => $w_email, + 'w_email_pub' => $w_emailPub, + 'w_url' => $w_url, + 'hq_acronym' => $hq_acronym, + 'hq_url' => $hq_url, + 'hq_email' => $hq_email, + 'w_address' => array( + 'accuracy' => $w_accuracy, + 'text' => $w_text, + 'postalText' => $w_postalText, + 'postalCode' => $w_postalCode, + 'localityId' => $w_localityId, + 'subAdministrativeAreaId' => $w_subAdministrativeAreaId, + 'administrativeAreaId' => $w_administrativeAreaId, + 'countryId' => $w_countryId, + 'latitude' => $w_latitude, + 'longitude' => $w_longitude, + 'pub' => $w_pub, + 'updateTime' => $w_updateTime, + 'north' => $w_north, + 'south' => $w_south, + 'east' => $w_east, + 'west' => $w_west, + ), + 'hq_address' => array( + 'accuracy' => $hq_accuracy, + 'text' => $hq_text, + 'postalText' => $hq_postalText, + 'postalCode' => $hq_postalCode, + 'localityId' => $hq_localityId, + 'subAdministrativeAreaId' => $hq_subAdministrativeAreaId, + 'administrativeAreaId' => $hq_administrativeAreaId, + 'countryId' => $hq_countryId, + 'latitude' => $hq_latitude, + 'longitude' => $hq_longitude, + 'pub' => $hq_pub, + 'updateTime' => $hq_updateTime, + 'north' => $hq_north, + 'south' => $hq_south, + 'east' => $hq_east, + 'west' => $hq_west, + ), + ); + } + + $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; + } + + foreach ($this->values['jobs'] as $id => &$job) { + $phone = new Phone(); + if (!isset($job['w_phone'])) { + $job['w_phone'] = array(0 => $phone->toFormArray()); + } + } + + $job['w_email_new'] = ''; + if (!isset($job['hq_fixed'])) { + $job['hq_fixed'] = ''; + } + if (!isset($job['hq_fax'])) { + $job['hq_fax'] = ''; + } + if (!isset($job['w_email_pub'])) { + $job['w_email_pub'] = 'private'; + } + if (!$job['hq_address']['text']) { + $job['hq_address'] = array( + 'text' => '', + 'accuracy' => '', + 'postalText' => '', + 'postalCode' => '', + 'administrativeAreaId' => '', + 'subAdministrativeAreaId' => '', + 'localityId' => '', + 'countryId' => '', + 'latitude' => '', + 'longitude' => '', + 'north' => '', + 'south' => '', + 'east' => '', + 'west' => '', + 'cedex' => '', + 'updateTime' => '', + 'changed' => '0', + 'removed' => '0', + ); + } + $job['w_address']['cedex'] = ''; + $job['w_address']['changed'] = '0'; + $job['w_address']['removed'] = '0'; + } else { + $this->values['jobs'][] = $this->settings['jobs']->emptyJob(); } } protected function _saveData() { if ($this->changed['cv']) { - XDB::execute("UPDATE auth_user_md5 + XDB::execute("UPDATE profiles SET cv = {?} - WHERE user_id = {?}", - $this->values['cv'], S::i('uid')); + WHERE pid = {?}", + $this->values['cv'], $this->pid()); } } public function _prepare(PlPage &$page, $id) { - $res = XDB::query("SELECT id, label - FROM emploi_secteur"); - $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::query("SELECT id, name AS label + FROM profile_job_sector_enum"); + $page->assign('sectors', $res->fetchAllAssoc()); + + $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 + WHERE still_exists = 1 + ORDER BY id = 1 DESC, name"); + $page->assign('current_corps', $res->fetchAllAssoc()); + + $res = XDB::iterator("SELECT id, name + FROM profile_corps_rank_enum + ORDER BY id = 1 DESC, name"); + $page->assign('corps_rank', $res->fetchAllAssoc()); } }