From ee10c6f10bddaeea0c351de407e0f0302467646f Mon Sep 17 00:00:00 2001 From: Anthony Berton Date: Fri, 5 Jun 2020 17:57:13 +0200 Subject: [PATCH] vcard --- htdocs/adherents/card.php | 9 +++ htdocs/adherents/vcard.php | 137 +++++++++++++++++++++++++++++++++++ htdocs/user/card.php | 9 +++ htdocs/user/vcard.php | 141 +++++++++++++++++++++++++++++++++++++ 4 files changed, 296 insertions(+) create mode 100644 htdocs/adherents/vcard.php create mode 100644 htdocs/user/vcard.php diff --git a/htdocs/adherents/card.php b/htdocs/adherents/card.php index 727a99e060c..77f2db89e71 100644 --- a/htdocs/adherents/card.php +++ b/htdocs/adherents/card.php @@ -1577,6 +1577,15 @@ if (is_object($objcanvas) && $objcanvas->displayCanvasExists($action)) { print ''; } + //VCard + print ''; + print $langs->trans("VCard").''; + print ''; + print img_picto($langs->trans("Download"), 'vcard.png', 'class="paddingrightonly"'); + print $langs->trans("Download"); + print ''; + print ''; + // Other attributes include DOL_DOCUMENT_ROOT.'/core/tpl/extrafields_view.tpl.php'; diff --git a/htdocs/adherents/vcard.php b/htdocs/adherents/vcard.php new file mode 100644 index 00000000000..6f2a274aed9 --- /dev/null +++ b/htdocs/adherents/vcard.php @@ -0,0 +1,137 @@ + + * 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 + * the Free Software Foundation; either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +/** + * \file htdocs/adherent/vcard.php + * \ingroup societe + * \brief Onglet vcard d'un adherent + */ + +require '../main.inc.php'; +require_once DOL_DOCUMENT_ROOT.'/adherents/class/adherent.class.php'; +require_once DOL_DOCUMENT_ROOT.'/societe/class/societe.class.php'; +require_once DOL_DOCUMENT_ROOT.'/core/class/vcard.class.php'; + +$adherent = new adherent($db); + + +$id = GETPOST('id', 'int'); + +// Security check +$result = restrictedArea($user, 'adherent', $id, '', '', 'socid', 'rowid', $objcanvas); + + +$result = $adherent->fetch($id); +if ($result <= 0) +{ + dol_print_error($adherent->error); + exit; +} + +$physicalperson = 1; + +$company = new Societe($db); +if ($adherent->socid) +{ + $result = $company->fetch($adherent->socid); +} + +// We create VCard +$v = new vCard(); +$v->setProdId('Dolibarr '.DOL_VERSION); + +$v->setUid('DOLIBARR-ADHERENTID-'.$adherent->id); +$v->setName($adherent->lastname, $adherent->firstname, "", $adherent->civility, ""); +$v->setFormattedName($adherent->getFullName($langs, 1)); + +$v->setPhoneNumber($adherent->phone_pro, "TYPE=WORK;VOICE"); +//$v->setPhoneNumber($adherent->phone_perso,"TYPE=HOME;VOICE"); +$v->setPhoneNumber($adherent->phone_mobile, "TYPE=CELL;VOICE"); +$v->setPhoneNumber($adherent->fax, "TYPE=WORK;FAX"); + +$country = $adherent->country_code ? $adherent->country : '' ; + +$v->setAddress("", "", $adherent->address, $adherent->town, $adherent->state, $adherent->zip, $country, "TYPE=WORK;POSTAL"); +$v->setLabel("", "", $adherent->address, $adherent->town, $adherent->state, $adherent->zip, $country, "TYPE=WORK"); + +$v->setEmail($adherent->email); +$v->setNote($adherent->note); +$v->setTitle($adherent->poste); + +// Data from linked company +if ($company->id) +{ + $v->setURL($company->url, "TYPE=WORK"); + if (! $adherent->phone_pro) $v->setPhoneNumber($company->phone, "TYPE=WORK;VOICE"); + if (! $adherent->fax) $v->setPhoneNumber($company->fax, "TYPE=WORK;FAX"); + if (! $adherent->zip) $v->setAddress("", "", $company->address, $company->town, $company->state, $company->zip, $company->country, "TYPE=WORK;POSTAL"); + + // when company e-mail is empty, use only adherent e-mail + if (empty(trim($company->email))) + { + // was set before, don't set twice + } + // when adherent e-mail is empty, use only company e-mail + elseif (empty(trim($adherent->email))) + { + $v->setEmail($company->email); + } + // when e-mail domain of adherent and company are the same, use adherent e-mail at first (and company e-mail at second) + elseif (strtolower(end(explode("@", $adherent->email))) == strtolower(end(explode("@", $company->email)))) + { + $v->setEmail($adherent->email); + + // support by Microsoft Outlook (2019 and possible earlier) + $v->setEmail($company->email, 'INTERNET'); + } + // when e-mail of adherent and company complete different use company e-mail at first (and adherent e-mail at second) + else { + $v->setEmail($company->email); + + // support by Microsoft Outlook (2019 and possible earlier) + $v->setEmail($adherent->email, 'INTERNET'); + } + + // Si adherent lie a un tiers non de type "particulier" + if ($adherent->typent_code != 'TE_PRIVATE') $v->setOrg($company->name); +} + +// Personal informations +$v->setPhoneNumber($adherent->phone_perso, "TYPE=HOME;VOICE"); +if ($adherent->birthday) $v->setBirthday($adherent->birthday); + +$db->close(); + + +// Renvoi la VCard au navigateur + +$output = $v->getVCard(); + +$filename = trim(urldecode($v->getFileName())); // "Nom prenom.vcf" +$filenameurlencoded = dol_sanitizeFileName(urlencode($filename)); +//$filename = dol_sanitizeFileName($filename); + + +header("Content-Disposition: attachment; filename=\"".$filename."\""); +header("Content-Length: ".dol_strlen($output)); +header("Connection: close"); +header("Content-Type: text/x-vcard; name=\"".$filename."\""); + +print $output; diff --git a/htdocs/user/card.php b/htdocs/user/card.php index 85d4ce5a41d..c0e97d6d4e1 100644 --- a/htdocs/user/card.php +++ b/htdocs/user/card.php @@ -1798,6 +1798,15 @@ if ($action == 'create' || $action == 'adduserldap') print dol_htmlentitiesbr($object->signature); print "\n"; + //VCard + print ''.$langs->trans("VCard").''; + print ''; + print ''; + print img_picto($langs->trans("Download"), 'vcard.png', 'class="paddingrightonly"'); + print $langs->trans("Download"); + print ''; + print "\n"; + print "\n"; print ''; diff --git a/htdocs/user/vcard.php b/htdocs/user/vcard.php new file mode 100644 index 00000000000..5d99a4a9e89 --- /dev/null +++ b/htdocs/user/vcard.php @@ -0,0 +1,141 @@ + + * 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 + * the Free Software Foundation; either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +/** + * \file htdocs/user/vcard.php + * \ingroup societe + * \brief Onglet vcard d'un user + */ + +require '../main.inc.php'; +require_once DOL_DOCUMENT_ROOT.'/user/class/user.class.php'; +require_once DOL_DOCUMENT_ROOT.'/societe/class/societe.class.php'; +require_once DOL_DOCUMENT_ROOT.'/core/class/vcard.class.php'; + +$user2 = new user($db); + + +$id = GETPOST('id', 'int'); + +// Security check +$socid = 0; +if ($user->socid > 0) $socid = $user->socid; +$feature2 = 'user'; +$result = restrictedArea($user, 'user', $id, 'user', $feature2); + +if ($user->id <> $id && !$canreaduser) accessforbidden(); + + +$result = $user2->fetch($id); +if ($result <= 0) +{ + dol_print_error($user2->error); + exit; +} + +$physicalperson = 1; + +$company = new Societe($db); +if ($user2->socid) +{ + $result = $company->fetch($user2->socid); +} + +// We create VCard +$v = new vCard(); +$v->setProdId('Dolibarr '.DOL_VERSION); + +$v->setUid('DOLIBARR-USERID-'.$user2->id); +$v->setName($user2->lastname, $user2->firstname, "", $user2->civility, ""); +$v->setFormattedName($user2->getFullName($langs, 1)); + +$v->setPhoneNumber($user2->phone_pro, "TYPE=WORK;VOICE"); +//$v->setPhoneNumber($user2->phone_perso,"TYPE=HOME;VOICE"); +$v->setPhoneNumber($user2->phone_mobile, "TYPE=CELL;VOICE"); +$v->setPhoneNumber($user2->fax, "TYPE=WORK;FAX"); + +$country = $user2->country_code ? $user2->country : '' ; + +$v->setAddress("", "", $user2->address, $user2->town, $user2->state, $user2->zip, $country, "TYPE=WORK;POSTAL"); +$v->setLabel("", "", $user2->address, $user2->town, $user2->state, $user2->zip, $country, "TYPE=WORK"); + +$v->setEmail($user2->email); +$v->setNote($user2->note); +$v->setTitle($user2->poste); + +// Data from linked company +if ($company->id) +{ + $v->setURL($company->url, "TYPE=WORK"); + if (! $user2->phone_pro) $v->setPhoneNumber($company->phone, "TYPE=WORK;VOICE"); + if (! $user2->fax) $v->setPhoneNumber($company->fax, "TYPE=WORK;FAX"); + if (! $user2->zip) $v->setAddress("", "", $company->address, $company->town, $company->state, $company->zip, $company->country, "TYPE=WORK;POSTAL"); + + // when company e-mail is empty, use only user e-mail + if (empty(trim($company->email))) + { + // was set before, don't set twice + } + // when user e-mail is empty, use only company e-mail + elseif (empty(trim($user2->email))) + { + $v->setEmail($company->email); + } + // when e-mail domain of user and company are the same, use user e-mail at first (and company e-mail at second) + elseif (strtolower(end(explode("@", $user2->email))) == strtolower(end(explode("@", $company->email)))) + { + $v->setEmail($user2->email); + + // support by Microsoft Outlook (2019 and possible earlier) + $v->setEmail($company->email, 'INTERNET'); + } + // when e-mail of user and company complete different use company e-mail at first (and user e-mail at second) + else { + $v->setEmail($company->email); + + // support by Microsoft Outlook (2019 and possible earlier) + $v->setEmail($user2->email, 'INTERNET'); + } + + // Si user lie a un tiers non de type "particulier" + if ($user2->typent_code != 'TE_PRIVATE') $v->setOrg($company->name); +} + +// Personal informations +$v->setPhoneNumber($user2->phone_perso, "TYPE=HOME;VOICE"); +if ($user2->birth) $v->setBirthday($user2->birth); + +$db->close(); + +// Renvoi la VCard au navigateur + +$output = $v->getVCard(); + +$filename = trim(urldecode($v->getFileName())); // "Nom prenom.vcf" +$filenameurlencoded = dol_sanitizeFileName(urlencode($filename)); +//$filename = dol_sanitizeFileName($filename); + + +header("Content-Disposition: attachment; filename=\"".$filename."\""); +header("Content-Length: ".dol_strlen($output)); +header("Connection: close"); +header("Content-Type: text/x-vcard; name=\"".$filename."\""); + +print $output;