From e7b07eb0e9ea9c79007294b32ced46f2b28be2cd Mon Sep 17 00:00:00 2001 From: MDW Date: Sun, 17 Nov 2024 12:32:01 +0100 Subject: [PATCH] NEW: vcard (vcf) download for third party (#31957) # NEW: vcard (vcf) download for third party (#31957) This adds a download link to fetch a vcard for a Third party. --- htdocs/societe/card.php | 6 +- htdocs/societe/contact.php | 11 +++- htdocs/societe/vcard.php | 120 +++++++++++++++++++++++++++++++++++++ 3 files changed, 133 insertions(+), 4 deletions(-) create mode 100644 htdocs/societe/vcard.php diff --git a/htdocs/societe/card.php b/htdocs/societe/card.php index 12675e6d3697c..8c52bb50d813d 100644 --- a/htdocs/societe/card.php +++ b/htdocs/societe/card.php @@ -2922,7 +2922,11 @@ function init_check_no_email(input) { $linkback = ''.$langs->trans("BackToList").''; - dol_banner_tab($object, 'socid', $linkback, ($user->socid ? 0 : 1), 'rowid', 'nom'); + $morehtmlref = ''; + $morehtmlref .= img_picto($langs->trans("Download").' '.$langs->trans("VCard"), 'vcard.png', 'class="valignmiddle marginleftonly paddingrightonly"'); + $morehtmlref .= ''; + + dol_banner_tab($object, 'socid', $linkback, ($user->socid ? 0 : 1), 'rowid', 'nom', $morehtmlref); // Call Hook tabContentViewThirdparty $parameters = array(); diff --git a/htdocs/societe/contact.php b/htdocs/societe/contact.php index 565e11767c917..990c67300610d 100644 --- a/htdocs/societe/contact.php +++ b/htdocs/societe/contact.php @@ -10,7 +10,8 @@ * Copyright (C) 2015 Jean-François Ferry * Copyright (C) 2015 Marcos García * Copyright (C) 2015 Raphaël Doursenaud - * Copyright (C) 2024 Frédéric France + * Copyright (C) 2024 Frédéric France + * Copyright (C) 2024 MDW * * 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 @@ -125,7 +126,7 @@ * Actions */ -$parameters = array('id'=>$socid, 'objcanvas'=>$objcanvas); +$parameters = array('id' => $socid, 'objcanvas' => $objcanvas); $reshook = $hookmanager->executeHooks('doActions', $parameters, $object, $action); // Note that $action and $object may have been modified by some hooks if ($reshook < 0) { setEventMessages($hookmanager->error, $hookmanager->errors, 'errors'); @@ -205,7 +206,11 @@ $linkback = ''.$langs->trans("BackToList").''; -dol_banner_tab($object, 'socid', $linkback, ($user->socid ? 0 : 1), 'rowid', 'nom', '', '', 0, '', '', 1); +$morehtmlref = ''; +$morehtmlref .= img_picto($langs->trans("Download").' '.$langs->trans("VCard"), 'vcard.png', 'class="valignmiddle marginleftonly paddingrightonly"'); +$morehtmlref .= ''; + +dol_banner_tab($object, 'socid', $linkback, ($user->socid ? 0 : 1), 'rowid', 'nom', $morehtmlref, '', 0, '', '', 1); print dol_get_fiche_end(); diff --git a/htdocs/societe/vcard.php b/htdocs/societe/vcard.php new file mode 100644 index 0000000000000..4531a01289480 --- /dev/null +++ b/htdocs/societe/vcard.php @@ -0,0 +1,120 @@ + + * Copyright (C) 2004-2010 Laurent Destailleur + * Copyright (C) 2005-2012 Regis Houssin + * Copyright (C) 2020 Tobias Sekan + * Copyright (C) 2024 MDW + * Copyright (C) 2024 Frédéric France + * + * 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/societe/vcard.php + * \ingroup societe + * \brief Third party vcard download + */ + +// Load Dolibarr environment +require '../main.inc.php'; +require_once DOL_DOCUMENT_ROOT.'/societe/class/societe.class.php'; +require_once DOL_DOCUMENT_ROOT.'/core/class/vcard.class.php'; + +/** + * @var Conf $conf + * @var DoliDB $db + * @var HookManager $hookmanager + * @var Translate $langs + * @var User $user + */ + +$company = new Societe($db); + + +$socid = GETPOSTINT('id'); + +// Security check +$result = restrictedArea($user, 'societe', $socid, '&societe'); + + +$result = $company->fetch($socid); +if ($result <= 0) { + dol_print_error($db, $company->error); + exit; +} + + +// Compute VCard +$v = new vCard(); +$v->setProdId('Dolibarr '.DOL_VERSION); + +$v->setUid('DOLIBARR-THIRDPARTYID-'.$company->id); + + +// Data from company +if (!empty($company->url)) { + $v->setURL($company->url, "TYPE=WORK"); +} +if (!empty($company->phone)) { + $v->setPhoneNumber($company->phone, "TYPE=WORK;VOICE"); +} +if (!empty($company->phone_mobile)) { + $v->setPhoneNumber($company->phone_mobile, "TYPE=CELL;VOICE"); +} +if (!empty($company->fax)) { + $v->setPhoneNumber($company->fax, "TYPE=WORK;FAX"); +} +$v->setAddress("", "", $company->address, $company->town, $company->state, $company->zip, $company->country, "TYPE=WORK;POSTAL"); +if (!empty(trim($company->email))) { + $v->setEmail($company->email); +} + +// If the company is not a private person +if ($company->typent_code != 'TE_PRIVATE') { + $v->setOrg($company->name); + $v->filename = $company->name.'.vcf'; + + $v->setFormattedName($company->name.(!empty($company->name_alias) ? ' ('.$company->name_alias.')' : '')); +} else { + $civility = (string) $company->civility_code; + if (!empty($civility)) { + $transKey = "Civility".$civility; + $trans = $langs->transnoentitiesnoconv($transKey); + if ($trans !== $transKey) { + $civility = $trans; + } + } + $v->setName($company->lastname, $company->firstname, "", $civility, ""); + $v->setFormattedName($company->getFullName($langs)); +} + + +$db->close(); + + +// Send the vCard to the web client + +$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;