diff --git a/htdocs/contact/vcard.php b/htdocs/contact/vcard.php index 297cadac0be..75362491424 100644 --- a/htdocs/contact/vcard.php +++ b/htdocs/contact/vcard.php @@ -2,6 +2,7 @@ /* Copyright (C) 2004 Rodolphe Quiedeville * Copyright (C) 2004-2010 Laurent Destailleur * Copyright (C) 2005-2012 Regis Houssin + * Copyright (C) 2020 Tobias Sekan * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -57,29 +58,58 @@ $v = new vCard(); $v->setProdId('Dolibarr '.DOL_VERSION); $v->setUid('DOLIBARR-CONTACTID-'.$contact->id); -$v->setName($contact->lastname, $contact->firstname, "", "", ""); -$v->setFormattedName($contact->getFullName($langs)); +$v->setName($contact->lastname, $contact->firstname, "", $contact->civility, ""); +$v->setFormattedName($contact->getFullName($langs, 1)); -// By default, all informations are for work (except phone_perso and phone_mobile) $v->setPhoneNumber($contact->phone_pro, "TYPE=WORK;VOICE"); +//$v->setPhoneNumber($contact->phone_perso,"TYPE=HOME;VOICE"); $v->setPhoneNumber($contact->phone_mobile, "TYPE=CELL;VOICE"); $v->setPhoneNumber($contact->fax, "TYPE=WORK;FAX"); -$v->setAddress("", "", $contact->address, $contact->town, "", $contact->zip, ($contact->country_code ? $contact->country : ''), "TYPE=WORK;POSTAL"); -$v->setLabel("", "", $contact->address, $contact->town, "", $contact->zip, ($contact->country_code ? $contact->country : ''), "TYPE=WORK"); -$v->setEmail($contact->email, 'TYPE=PREF,INTERNET'); -$v->setNote($contact->note); +$country = $contact->country_code ? $contact->country : '' ; +$v->setAddress("", "", $contact->address, $contact->town, $contact->state, $contact->zip, $country, "TYPE=WORK;POSTAL"); +$v->setLabel("", "", $contact->address, $contact->town, $contact->state, $contact->zip, $country, "TYPE=WORK"); + +$v->setEmail($contact->email); +$v->setNote($contact->note); $v->setTitle($contact->poste); // Data from linked company if ($company->id) { $v->setURL($company->url, "TYPE=WORK"); - if (!$contact->phone_pro) $v->setPhoneNumber($company->phone, "TYPE=WORK;VOICE"); - if (!$contact->fax) $v->setPhoneNumber($company->fax, "TYPE=WORK;FAX"); - if (!$contact->zip) $v->setAddress("", "", $company->address, $company->town, "", $company->zip, $company->country, "TYPE=WORK;POSTAL"); - if (empty($contact->email)) $v->setEmail($company->email, 'TYPE=PREF,INTERNET'); + if (! $contact->phone_pro) $v->setPhoneNumber($company->phone, "TYPE=WORK;VOICE"); + if (! $contact->fax) $v->setPhoneNumber($company->fax, "TYPE=WORK;FAX"); + if (! $contact->zip) $v->setAddress("", "", $company->address, $company->town, $company->state, $company->zip, $company->country, "TYPE=WORK;POSTAL"); + + // when company e-mail is empty, use only contact e-mail + if (empty(trim($company->email))) + { + // was set before, don't set twice + } + // when contact e-mail is empty, use only company e-mail + elseif (empty(trim($contact->email))) + { + $v->setEmail($company->email); + } + // when e-mail domain of contact and company are the same, use contact e-mail at first (and company e-mail at second) + elseif (strtolower(end(explode("@", $contact->email))) == strtolower(end(explode("@", $company->email)))) + { + $v->setEmail($contact->email); + + // support by Microsoft Outlook (2019 and possible earlier) + $v->setEmail($company->email, 'INTERNET'); + } + // when e-mail of contact and company complete different use company e-mail at first (and contact e-mail at second) + else + { + $v->setEmail($company->email); + + // support by Microsoft Outlook (2019 and possible earlier) + $v->setEmail($contact->email, 'INTERNET'); + } + // Si contact lie a un tiers non de type "particulier" if ($contact->typent_code != 'TE_PRIVATE') $v->setOrg($company->name); } @@ -95,7 +125,7 @@ $db->close(); $output = $v->getVCard(); -$filename = trim(urldecode($v->getFileName())); // "Nom prenom.vcf" +$filename = trim(urldecode($v->getFileName())); // "Nom prenom.vcf" $filenameurlencoded = dol_sanitizeFileName(urlencode($filename)); //$filename = dol_sanitizeFileName($filename); diff --git a/htdocs/core/class/vcard.class.php b/htdocs/core/class/vcard.class.php index a3948bdeed6..fc67eb2f2a0 100644 --- a/htdocs/core/class/vcard.class.php +++ b/htdocs/core/class/vcard.class.php @@ -1,6 +1,7 @@ * Copyright (C) 2005-2017 Laurent Destailleur + * Copyright (C) 2020 Tobias Sekan * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -135,11 +136,11 @@ class vCard /** * mise en forme du nom complet * - * @param string $family Family - * @param string $first First - * @param string $additional Additionnal - * @param string $prefix Prefix - * @param string $suffix Suffix + * @param string $family Family name + * @param string $first First name + * @param string $additional Additional (e.g. second name, nick name) + * @param string $prefix Prefix (e.g. "Mr.", "Ms.", "Prof.") + * @param string $suffix Suffix (e.g. "sen." for senior, "jun." for junior) * @return void */ public function setName($family = "", $first = "", $additional = "", $prefix = "", $suffix = "") @@ -216,15 +217,17 @@ class vCard } /** - * mise en forme de l'email + * Add a e-mail address to this vCard * - * @param string $address EMail - * @param string $type Vcard type + * @param string $address E-mail address + * @param string $type (optional) The type of the e-mail (typical "PREF;INTERNET" or "INTERNET") * @return void */ - public function setEmail($address, $type = "internet,pref") + public function setEmail($address, $type = "TYPE=INTERNET;PREF") { - $this->properties["EMAIL;TYPE=".$type] = $address; + $key = "EMAIL"; + if ($type != "") $key .= ";".$type; + $this->properties[$key] = $address; } /** @@ -330,4 +333,32 @@ class vCard { return $this->filename; } + + /* Example from Microsoft Outlook 2019 + + BEGIN:VCARD + VERSION:2.1 + + N;LANGUAGE=de:surename;forename;secondname;Sir;jun. + FN:Sir surename secondname forename jun. + ORG:Companyname + TITLE:position + TEL;WORK;VOICE:work-phone-number + TEL;HOME;VOICE:private-phone-number + TEL;CELL;VOICE:mobile-phone-number + TEL;WORK;FAX:fax-phone-number + ADR;WORK;PREF:;;street and number;town;region;012345;Deutschland + LABEL;WORK;PREF;ENCODING=QUOTED-PRINTABLE:street and number=0D=0A= + =0D=0A= + 012345 town region + X-MS-OL-DEFAULT-POSTAL-ADDRESS:2 + URL;WORK:www.mywebpage.de + EMAIL;PREF;INTERNET:test1@test1.de + EMAIL;INTERNET:test2@test2.de + EMAIL;INTERNET:test3@test3.de + X-MS-IMADDRESS:test@jabber.org + REV:20200424T104242Z + + END:VCARD + */ }