Notifies profile's owner when profile modified by a third party (Closes #1038).
[platal.git] / modules / profile / jobs.inc.php
index 18a8f6a..924ebac 100644 (file)
@@ -1,6 +1,6 @@
 <?php
 /***************************************************************************
- *  Copyright (C) 2003-2009 Polytechnique.org                              *
+ *  Copyright (C) 2003-2010 Polytechnique.org                              *
  *  http://opensource.polytechnique.org/                                   *
  *                                                                         *
  *  This program is free software; you can redistribute it and/or modify   *
@@ -19,7 +19,7 @@
  *  59 Temple Place, Suite 330, Boston, MA  02111-1307  USA                *
  ***************************************************************************/
 
-class ProfileJob extends ProfileGeocoding
+class ProfileSettingJob extends ProfileSettingGeocoding
 {
     private $pub;
     private $email_new;
@@ -30,12 +30,12 @@ class ProfileJob extends ProfileGeocoding
 
     public function __construct()
     {
-        $this->pub    = new ProfilePub();
+        $this->pub    = new ProfileSettingPub();
         $this->email
                       = $this->email_new
-                      = new ProfileEmail();
-        $this->url    = new ProfileWeb();
-        $this->bool   = new ProfileBool();
+                      = 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'),
@@ -153,16 +153,16 @@ class ProfileJob extends ProfileGeocoding
                                 WHERE  name = {?}",
                               $job['name']);
             if ($res->numRows() != 1) {
-                $user = S::user();
                 $this->geocodeAddress($job['hq_address'], $s);
                 if (!$s) {
                     $gmapsGeocoder = new GMapsGeocoder();
                     $job['hq_address'] = $gmapsGeocoder->stripGeocodingFromAddress($job['hq_address']);
                 }
-                $req = new EntrReq($user, $jobid, $job['name'], $job['hq_acronym'], $job['hq_url'],
+                $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();
             }
@@ -171,7 +171,7 @@ class ProfileJob extends ProfileGeocoding
         if (!isset($job['w_phone'])) {
             $job['w_phone'] = array();
         }
-        $profiletel = new ProfilePhones('pro', $jobid);
+        $profiletel = new ProfileSettingPhones('pro', $jobid);
         $job['w_phone'] = $profiletel->value($page, 'tel', $job['w_phone'], $s);
 
         unset($job['removed']);
@@ -180,8 +180,8 @@ class ProfileJob extends ProfileGeocoding
 
     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;
@@ -190,17 +190,31 @@ 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'] && $entreprise) {
+            if ($job['name'] == '' && $entreprise) {
                 $job['tmp_name'] = $entreprise[$entr_val]->name;
-                $entr_val ++;
+                ++$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']) {
-                unset($value[$key]);
+                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->geocodeAddress($job['w_address'], $s);
             $ls = ($ls && $s);
@@ -217,43 +231,55 @@ class ProfileJob extends ProfileGeocoding
     {
         // TODO: use address and phone classes to update profile_job_enum and profile_phones once they are done.
 
-        require_once('profil.func.inc.php');
-        require_once('validations.inc.php');
+        require_once 'profil.func.inc.php';
 
         XDB::execute("DELETE FROM  profile_job
-                            WHERE  uid = {?}",
-                     S::i('uid'));
+                            WHERE  pid = {?}",
+                     $page->pid());
         XDB::execute("DELETE FROM  profile_addresses
                             WHERE  pid = {?} AND type = 'job'",
-                     S::i('uid'));
+                     $page->pid());
         XDB::execute("DELETE FROM  profile_phones
-                            WHERE  uid = {?} AND link_type = 'pro'",
-                     S::i('uid'));
-        foreach ($value as $id=>&$job) {
+                            WHERE  pid = {?} AND link_type = 'pro'",
+                     $page->pid());
+        foreach ($value as $id => &$job) {
             if (isset($job['name']) && $job['name']) {
                 if (isset($job['jobid']) && $job['jobid']) {
-                    XDB::execute("INSERT INTO  profile_job (uid, id, description, sectorid, subsectorid,
+                    XDB::execute("INSERT INTO  profile_job (pid, id, description, sectorid, subsectorid,
                                                             subsubsectorid, email, url, pub, email_pub, jobid)
                                        VALUES  ({?}, {?}, {?}, {?}, {?}, {?}, {?}, {?}, {?}, {?}, {?})",
-                                 S::i('uid'), $id, $job['description'], $job['sector'], $job['subSector'],
+                                 $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 (uid, id, description, sectorid, subsectorid,
+                    XDB::execute("INSERT INTO  profile_job (pid, id, description, sectorid, subsectorid,
                                                             subsubsectorid, email, url, pub, email_pub)
                                        VALUES  ({?}, {?}, {?}, {?}, {?}, {?}, {?}, {?}, {?}, {?})",
-                                 S::i('uid'), $id, $job['description'], $job['sector'], $job['subSector'],
+                                 $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 ProfileAddress();
-                $address->saveAddress($id, $job['w_address'], 'job');
-                $profiletel = new ProfilePhones('pro', $id);
-                $profiletel->saveTels('tel', $job['w_phone']);
+                $address = new ProfileSettingAddress();
+                $address->saveAddress($page->pid(), $id, $job['w_address'], 'job');
+                $profiletel = new ProfileSettingPhones('pro', $id);
+                $profiletel->saveTels($page->pid(), 'tel', $job['w_phone']);
             }
         }
     }
+
+    public function getText($value) {
+        $jobs = array();
+        foreach ($value as $id => $job) {
+            $address = new ProfileSettingAddress();
+            $phones = new ProfileSettingPhones('pro', $id);
+            $jobs[] = 'Entreprise : ' . $job['name'] . ', secteur : ' . $job['subSubSectorName']
+                    . ', description : ' . $job['description'] . ', web : ' . $job['w_url']
+                    . ', email : ' . $job['w_email']
+                    . ', ' . $phones->getText($job['w_phone']) . ', ' .  $address->getText($job['w_address']);
+        }
+        return implode(' ; ' , $jobs);
+    }
 }
 
-class ProfileJobs extends ProfilePage
+class ProfileSettingJobs extends ProfilePage
 {
     protected $pg_template = 'profile/jobs.tpl';
 
@@ -261,8 +287,9 @@ class ProfileJobs extends ProfilePage
     {
         parent::__construct($wiz);
         $this->settings['cv'] = null;
+        /* TODO: ProfileSettingCorps, required for notifications. */
         $this->settings['corps'] = null;
-        $this->settings['jobs'] = new ProfileJob();
+        $this->settings['jobs'] = new ProfileSettingJob();
         $this->watched = array('cv' => true, 'jobs' => true, 'corps' => true);
     }
 
@@ -279,7 +306,7 @@ class ProfileJobs extends ProfilePage
         $res = XDB::query("SELECT  original_corpsid AS original, current_corpsid AS current,
                                    rankid AS rank, corps_pub AS pub
                              FROM  profile_corps
-                            WHERE  uid = {?}",
+                            WHERE  pid = {?}",
                         $this->pid());
         $this->values['corps'] = $res->fetchOneAssoc();
 
@@ -298,10 +325,10 @@ class ProfileJobs extends ProfilePage
                                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.uid AND aw.type = 'job'
+                          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.uid = {?}
+                              WHERE  j.pid = {?}
                            ORDER BY  j.id",
                             $this->pid());
         $this->values['jobs'] = array();
@@ -376,9 +403,9 @@ class ProfileJobs extends ProfilePage
 
             $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'
+                                   WHERE  pid = {?} AND link_type = 'pro'
                                 ORDER BY  link_id",
-                                 S::i('uid'));
+                                 $this->pid());
             $i = 0;
             $jobNb = count($this->values['jobs']);
             while ($phone = $res->next()) {
@@ -460,10 +487,8 @@ class ProfileJobs extends ProfilePage
         }
 
         if ($this->changed['corps']) {
-            XDB::execute("UPDATE  profile_corps
-                             SET  original_corpsid = {?}, current_corpsid = {?},
-                                  rankid = {?}, corps_pub = {?}
-                           WHERE  uid = {?}",
+            XDB::execute('REPLACE INTO  profile_corps (original_corpsid, current_corpsid, rankid, corps_pub, pid)
+                                VALUES  ({?}, {?}, {?}, {?}, {?})',
                           $this->values['corps']['original'], $this->values['corps']['current'],
                           $this->values['corps']['rank'], $this->values['corps']['pub'], $this->pid());
         }
@@ -471,7 +496,7 @@ class ProfileJobs extends ProfilePage
 
     public function _prepare(PlPage &$page, $id)
     {
-        require_once "emails.combobox.inc.php";
+        require_once 'emails.combobox.inc.php';
         fill_email_combobox($page, $this->owner, $this->profile);
 
         $res = XDB::query("SELECT  id, name AS label
@@ -490,7 +515,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());
     }
 }