diff --git a/htdocs/societe/card.php b/htdocs/societe/card.php
index 97ce9aebbc1..b2fee95952e 100644
--- a/htdocs/societe/card.php
+++ b/htdocs/societe/card.php
@@ -2933,7 +2933,11 @@ if (is_object($objcanvas) && $objcanvas->displayCanvasExists($canvasdisplayactio
$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 565e11767c9..990c6730061 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 @@ if (!$user->hasRight('societe', 'contact', 'lire')) {
* 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 @@ print dol_get_fiche_head($head, 'contact', $langs->trans("ThirdParty"), 0, 'comp
$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 00000000000..4531a012894
--- /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;