Moving to GitHub.
[platal.git] / include / vcard.inc.php
index 1b67aee..2fb2e58 100644 (file)
@@ -1,6 +1,6 @@
 <?php
 /***************************************************************************
- *  Copyright (C) 2003-2009 Polytechnique.org                              *
+ *  Copyright (C) 2003-2014 Polytechnique.org                              *
  *  http://opensource.polytechnique.org/                                   *
  *                                                                         *
  *  This program is free software; you can redistribute it and/or modify   *
  *  59 Temple Place, Suite 330, Boston, MA  02111-1307  USA                *
  ***************************************************************************/
 
-require_once('user.func.inc.php');
-
 class VCard extends PlVCard
 {
-    private $user_list = array();
+    private $profile_list = array();
     private $count     = 0;
     private $freetext  = null;
     private $photos    = true;
+    private $visibility;
 
     public function __construct($photos = true, $freetext = null)
     {
         PlVCard::$folding = false;
+        $this->visibility = Visibility::defaultForRead(Visibility::VIEW_PRIVATE);
         $this->freetext = $freetext;
         $this->photos   = $photos;
     }
 
-    public function addUser($user)
+    public function addProfile($profile)
     {
-        $user = Profile::get($user);
-        if ($user) {
-            $this->user_list[] = $user;
+        $profile = Profile::get($profile, Profile::FETCH_ALL, $this->visibility);
+        if ($profile) {
+            $this->profile_list[] = $profile;
             $this->count++;
         }
     }
 
-    public function addUsers(array $users) {
-        foreach ($users as $user) {
-            $this->addUser($user);
+    public function addProfiles(array $profiles) {
+        foreach ($profiles as $profile) {
+            $this->addProfile($profile);
         }
     }
 
     protected function fetch()
     {
-        return PlIteratorUtils::fromArray($this->user_list);
+        return PlIteratorUtils::fromArray($this->profile_list);
     }
 
-    protected function buildEntry($entry)
+    protected function buildEntry($pf)
     {
         global $globals;
-        $login = $entry['value'];
-        $user  = get_user_details($login->hrid());
+        $pf = $pf['value'];
 
-        if (empty($user['nom_usage'])) {
-            $entry = new PlVCardEntry($user['prenom'], $user['nom'], null, null, @$user['nickname']);
-        } else {
-            $entry = new PlVCardEntry($user['prenom'], array($user['nom'], $user['nom_usage']), null, null, @$user['nickname']);
-        }
+        $entry = new PlVCardEntry($pf->firstNames(), $pf->lastNames(), null, null, $pf->nickname);
+
+        $user = $pf->owner();
 
         // Free text
-        $freetext = '(' . $user['promo'] . ')';
+        $freetext = '(' . $pf->promo . ')';
         if ($this->freetext) {
             $freetext .= "\n" . $this->freetext;
         }
-        if (strlen(trim($user['freetext']))) {
-            $freetext .= "\n" . MiniWiki::WikiToText($user['freetext']);
-        }
         $entry->set('NOTE', $freetext);
-
-        // Mobile
-        if (!empty($user['mobile'])) {
-            $entry->addTel(null, $user['mobile'], false, true, true, false, true, true);
+        if ($pf->mobile) {
+            $entry->addTel(null, $pf->mobile, false, true, true, false, true, true);
         }
 
         // Emails
-        // TODO: this logic is not hruid-compatible; replace it.
-        $entry->addMail(null, $user['bestalias'] . '@' . $globals->mail->domain, true);
-        $entry->addMail(null, $user['bestalias'] . '@' . $globals->mail->domain2);
-        if ($user['bestalias'] != $user['forlife']) {
-            $entry->addMail(null, $user['forlife'] . '@' . $globals->mail->domain);
-            $entry->addMail(null, $user['forlife'] . '@' . $globals->mail->domain2);
+        if (!is_null($user)) {
+            $entry->addMail(null, $user->bestalias, true);
+            if ($user->forlife != $user->bestalias) {
+                $entry->addMail(null, $user->forlife);
+            }
+            if ($user->forlife_alternate != $user->bestalias) {
+                $entry->addMail(null, $user->forlife_alternate);
+            }
         }
 
         // Homes
-        foreach ($user['adr'] as $adr) {
-            $street = array($adr['adr1']);
-            if (!empty($adr['adr2'])) {
-                $street[] = $adr['adr2'];
+        $adrs = $pf->iterAddresses(Profile::ADDRESS_PERSO);
+        while ($adr = $adrs->next()) {
+            if (!$adr->postalCode || !$adr->locality || !$adr->country) {
+                $group = $entry->addHome($adr->text, null, null, null,
+                                null, $adr->administrativeArea, null,
+                                $adr->hasFlag('current'), $adr->hasFlag('mail'), $adr->hasFlag('mail'));
+            } else {
+                $group = $entry->addHome(trim(Geocoder::getFirstLines($adr->text, $adr->postalCode, 4)), null, null, $adr->postalCode,
+                                $adr->locality, $adr->administrativeArea, $adr->country,
+                                $adr->hasFlag('current'), $adr->hasFlag('mail'), $adr->hasFlag('mail'));
             }
-            if (!empty($adr['adr3'])) {
-                $street[] = $adr['adr3'];
-            }
-            $group = $entry->addHome($street, null, null, $adr['postcode'], $adr['city'], $adr['region'], @$adr['country'],
-                                     $adr['active'], $adr['courier'], $adr['courier']);
-            if (!empty($adr['tels'])) {
-                foreach ($adr['tels'] as $tel) {
-                    $fax = $tel['tel_type'] == 'Fax';
-                    $entry->addTel($group, $tel['tel'], $fax, !$fax, !$fax, false, false, !$fax && $adr['active'] && empty($user['mobile']));
+            foreach ($adr->phones() as $phone) {
+                if ($phone->link_type == Phone::TYPE_FIXED) {
+                    $entry->addTel($group, $phone->display, false, true, true, false, false,
+                                   $adr->hasFlag('current') && empty($pf->mobile));
+                } else if ($phone->link_type == Phone::TYPE_FAX) {
+                    $entry->addTel($group, $phone->display, true, false, false, false, false, false);
                 }
             }
         }
 
         // Pro
-        foreach ($user['adr_pro'] as $pro) {
-            $street = array($adr['adr1']);
-            if (!empty($pro['adr2'])) {
-                $street[] = $pro['adr2'];
-            }
-            if (!empty($pro['adr3'])) {
-                $street[] = $pro['adr3'];
+        $jobs = $pf->getJobs();
+        foreach ($jobs as $job) {
+            $terms_array = array();
+            foreach ($job->terms as $term) {
+               $terms_array[] = $term->full_name;
             }
-            $group = $entry->addWork($pro['entreprise'], null, $pro['poste'], $pro['fonction'],
-                                     $street, null, null, $pro['postcode'], $pro['city'], $pro['region'], @$pro['country']);
-            if (!empty($pro['tel'])) {
-                $entry->addTel($group, $pro['tel']);
+            $terms = implode(', ', $terms_array);
+            if ($job->address) {
+                if (!$job->address->postalCode || !$job->address->locality || !$job->address->country) {
+                    $group = $entry->addWork($job->company->name, null, $job->description, $terms,
+                                             $job->address->text, null, null, null,
+                                             null, $job->address->administrativeArea, null);
+                } else {
+                    $group = $entry->addWork($job->company->name, null, $job->description, $terms,
+                                             trim(Geocoder::getFirstLines($job->address->text, $job->address->postalCode, 4)),
+                                             null, null, $job->address->postalCode,
+                                             $job->address->locality, $job->address->administrativeArea, $job->address->country);
+                }
+            } else {
+                $group = $entry->addWork($job->company->name, null, $job->description, $terms,
+                                         null, null, null, null,
+                                         null, null, null);
             }
-            if (!empty($pro['fax'])) {
-                $entry->addTel($group, $pro['fax'], true);
+            if ($job->user_email) {
+                $entry->addMail($group, $job->user_email);
             }
-            if (!empty($pro['email'])) {
-                $entry->addMail($group, $pro['email']);
+            foreach ($job->phones as $phone) {
+                if ($phone->type == Phone::TYPE_MOBILE) {
+                    $entry->addTel($group, $phone->display, false, true, true, false, true);
+                } else if ($phone->type == Phone::TYPE_FAX) {
+                    $entry->addTel($group, $phone->display, true);
+                } else {
+                    $entry->addTel($group, $phone->display, false, true, true);
+                }
             }
         }
 
         // Melix
-        $res = XDB::query(
-                "SELECT alias
-                   FROM virtual AS v
-             INNER JOIN virtual_redirect AS vr ON (v.vid = vr.vid)
-             INNER JOIN auth_user_quick  ON ( user_id = {?} AND emails_alias_pub = 'public' )
-                  WHERE ( redirect={?} OR redirect={?} )
-                        AND alias LIKE '%@{$globals->mail->alias_dom}'",
-                $user['user_id'],
-                $user['forlife'].'@'.$globals->mail->domain,
-                $user['forlife'].'@'.$globals->mail->domain2);
-        if ($res->numRows()) {
-            $entry->addMail(null, $res->fetchOneCell());
+        if (!is_null($user)) {
+            $alias = $user->emailAlias();
+            if (!is_null($alias) && $pf->alias_pub == 'public') {
+                $entry->addMail(null, $alias);
+            }
         }
 
         // Custom fields
-        if (count($user['gpxs_name'])) {
-            $entry->set('X-GROUPS', join(', ', $user['gpxs_name']));
+        if (!is_null($user)) {
+            $groups = $user->groups(true, true);
+            if (count($groups)) {
+                $gn = DirEnum::getOptions(DirEnum::GROUPESX);
+                $gns = array();
+                foreach (array_keys($groups) as $gid) {
+                    $gns[$gid] = $gn[$gid];
+                }
+                $entry->set('X-GROUPS', join(', ', $gns));
+            }
         }
-        if (count($user['binets'])) {
-            $entry->set('X-BINETS', join(', ', $user['binets']));
+
+        $binets = $pf->getBinets();
+
+        if (count($binets)) {
+            $bn = DirEnum::getOptions(DirEnum::BINETS);
+            $bns = array();
+            foreach ($binets as $bid) {
+                $bns[$bid] = $bn[$bid];
+            }
+            $entry->set('X-BINETS', join(', ', $bns));
         }
-        if (!empty($user['section'])) {
-            $entry->set('X-SECTION', $user['section']);
+        if (!empty($pf->section)) {
+            $entry->set('X-SECTION', $pf->section);
         }
 
         // Photo
         if ($this->photos) {
             $res = XDB::query(
                     "SELECT  attach, attachmime
-                       FROM  photo AS p
-                      WHERE  p.uid = {?}", $login->id());
+                       FROM  profile_photos
+                      WHERE  pid = {?} AND pub IN ('public', {?})",
+                    $pf->id(), $this->visibility->level());
             if ($res->numRows()) {
                 list($data, $type) = $res->fetchOneRow();
                 $entry->setPhoto($data, strtoupper($type));
@@ -173,5 +196,5 @@ class VCard extends PlVCard
     }
 }
 
-// vim:set et sw=4 sts=4 sws=4 foldmethod=marker enc=utf-8:
+// vim:set et sw=4 sts=4 sws=4 foldmethod=marker fenc=utf-8:
 ?>