dolibarr 24.0.0-beta
contact.php
Go to the documentation of this file.
1<?php
2/* Copyright (C) 2005 Patrick Rouillon <patrick@rouillon.net>
3 * Copyright (C) 2005-2015 Laurent Destailleur <eldy@users.sourceforge.net>
4 * Copyright (C) 2005-2012 Regis Houssin <regis.houssin@inodbox.com>
5 * Copyright (C) 2017 Ferran Marcet <fmarcet@2byte.es>
6 * Copyright (C) 2021-2025 Frédéric France <frederic.france@free.fr>
7 * Copyright (C) 2023 Christian Foellmann <christian@foellmann.de>
8 * Copyright (C) 2025 MDW <mdeweerd@users.noreply.github.com>
9 * Copyright (C) 2026 Serhii Bondarenko <serhiilabs@gmail.com>
10 *
11 * This program is free software; you can redistribute it and/or modify
12 * it under the terms of the GNU General Public License as published by
13 * the Free Software Foundation; either version 3 of the License, or
14 * (at your option) any later version.
15 *
16 * This program is distributed in the hope that it will be useful,
17 * but WITHOUT ANY WARRANTY; without even the implied warranty of
18 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
19 * GNU General Public License for more details.
20 *
21 * You should have received a copy of the GNU General Public License
22 * along with this program. If not, see <https://www.gnu.org/licenses/>.
23 */
24
31// Load Dolibarr environment
32require '../../main.inc.php';
33
42require_once DOL_DOCUMENT_ROOT.'/fourn/class/fournisseur.class.php';
43require_once DOL_DOCUMENT_ROOT.'/fourn/class/fournisseur.facture.class.php';
44require_once DOL_DOCUMENT_ROOT.'/contact/class/contact.class.php';
45require_once DOL_DOCUMENT_ROOT.'/core/lib/fourn.lib.php';
46require_once DOL_DOCUMENT_ROOT.'/core/class/html.formcompany.class.php';
47if (isModEnabled('project')) {
48 require_once DOL_DOCUMENT_ROOT.'/projet/class/project.class.php';
49}
50
51$langs->loadLangs(array("bills", "other", "companies"));
52
53$id = (GETPOSTINT('id') ? GETPOSTINT('id') : GETPOSTINT('facid'));
54$ref = GETPOST('ref', 'alpha');
55$action = GETPOST('action', 'aZ09');
56$socid = GETPOSTINT('socid');
57
58// Security check
59if ($user->socid) {
60 $socid = $user->socid;
61}
62$hookmanager->initHooks(array('invoicesuppliercardcontact','invoicesuppliercontactcard', 'globalcard'));
63$result = restrictedArea($user, 'fournisseur', $id, 'facture_fourn', 'facture');
64
66
67$usercancreate = ($user->hasRight("fournisseur", "facture", "creer") || $user->hasRight("supplier_invoice", "creer"));
68$permissiontoadd = $usercancreate;
69
70/*
71 * Actions
72 */
73
74$parameters = array('id' => $id);
75$reshook = $hookmanager->executeHooks('doActions', $parameters, $object, $action);
76if ($reshook < 0) {
77 setEventMessages($hookmanager->error, $hookmanager->errors, 'errors');
78}
79
80/*
81 * Add a new contact
82 */
83
84if (empty($reshook)) {
85 if ($action == 'addcontact' && ($user->hasRight("fournisseur", "facture", "creer") || $user->hasRight("supplier_invoice", "creer"))) {
86 $result = $object->fetch($id, $ref);
87
88 if ($result > 0 && $id > 0) {
89 $contactid = (GETPOST('userid') ? GETPOSTINT('userid') : GETPOSTINT('contactid'));
90 $typeid = (GETPOST('typecontact') ? GETPOSTINT('typecontact') : GETPOSTINT('type'));
91 $result = $object->add_contact($contactid, $typeid, GETPOST("source", 'aZ09'));
92 }
93
94 if ($result >= 0) {
95 header("Location: ".$_SERVER['PHP_SELF']."?id=".$object->id);
96 exit;
97 } else {
98 if ($object->error == 'DB_ERROR_RECORD_ALREADY_EXISTS') {
99 $langs->load("errors");
100 setEventMessages($langs->trans("ErrorThisContactIsAlreadyDefinedAsThisType"), null, 'errors');
101 } else {
102 setEventMessages($object->error, $object->errors, 'errors');
103 }
104 }
105 } elseif ($action == 'swapstatut' && ($user->hasRight("fournisseur", "facture", "creer") || $user->hasRight("supplier_invoice", "creer"))) {
106 // bascule du statut d'un contact
107 if ($object->fetch($id)) {
108 $result = $object->swapContactStatus(GETPOSTINT('ligne'));
109 } else {
111 }
112 } elseif ($action == 'deletecontact' && ($user->hasRight("fournisseur", "facture", "creer") || $user->hasRight("supplier_invoice", "creer"))) {
113 // Efface un contact
114 $object->fetch($id);
115 $result = $object->delete_contact(GETPOSTINT("lineid"));
116
117 if ($result >= 0) {
118 header("Location: ".$_SERVER['PHP_SELF']."?id=".$object->id);
119 exit;
120 } else {
122 }
123 }
124}
125
126
127/*
128 * View
129 */
130$form = new Form($db);
131$formcompany = new FormCompany($db);
132$contactstatic = new Contact($db);
133$userstatic = new User($db);
134
135
136/* *************************************************************************** */
137/* */
138/* Card view and edit mode */
139/* */
140/* *************************************************************************** */
141
142if ($id > 0 || !empty($ref)) {
143 if ($object->fetch($id, $ref) > 0) {
144 $object->fetch_thirdparty();
145
146 $alreadypaid = $object->getSommePaiement();
147
148 $title = $object->ref." - ".$langs->trans('ContactsAddresses');
149 $helpurl = "EN:Module_Suppliers_Invoices|FR:Module_Fournisseurs_Factures|ES:Módulo_Facturas_de_proveedores";
150 llxHeader('', $title, $helpurl, '', 0, 0, '', '', '', 'mod-fourn-facture page-card_contact');
151
152 $head = facturefourn_prepare_head($object);
153
154 print dol_get_fiche_head($head, 'contact', $langs->trans('SupplierInvoice'), -1, $object->picto);
155
156 $linkback = '<a href="'.DOL_URL_ROOT.'/fourn/facture/list.php?restore_lastsearch_values=1'.(!empty($socid) ? '&socid='.$socid : '').'">'.$langs->trans("BackToList").'</a>';
157
158 $morehtmlref = '<div class="refidno">';
159 // Ref supplier
160 $morehtmlref .= $form->editfieldkey("RefSupplierBill", 'ref_supplier', $object->ref_supplier, $object, 0, 'string', '', 0, 1);
161 $morehtmlref .= $form->editfieldval("RefSupplierBill", 'ref_supplier', $object->ref_supplier, $object, 0, 'string', '', null, null, '', 1);
162 // Thirdparty
163 $morehtmlref .= '<br>'.$object->thirdparty->getNomUrl(1);
164 if (!getDolGlobalString('MAIN_DISABLE_OTHER_LINK') && $object->thirdparty->id > 0) {
165 $morehtmlref .= ' <div class="inline-block valignmiddle">(<a class="valignmiddle" href="'.DOL_URL_ROOT.'/fourn/facture/list.php?socid='.$object->thirdparty->id.'&search_company='.urlencode($object->thirdparty->name).'">'.$langs->trans("OtherBills").'</a>)</div>';
166 }
167 // Project
168 if (isModEnabled('project')) {
169 $langs->load("projects");
170 $morehtmlref .= '<br>';
171 if (0) { // @phpstan-ignore-line
172 $morehtmlref .= img_picto($langs->trans("Project"), 'project', 'class="pictofixedwidth"');
173 if ($action != 'classify') {
174 $morehtmlref .= '<a class="editfielda" href="'.dolBuildUrl($_SERVER['PHP_SELF'], ['action' => 'classify', 'id' => $object->id], true).'">'.img_edit($langs->transnoentitiesnoconv('SetProject')).'</a> ';
175 }
176 $morehtmlref .= $form->form_project($_SERVER['PHP_SELF'].'?id='.$object->id, (!getDolGlobalString('PROJECT_CAN_ALWAYS_LINK_TO_ALL_SUPPLIERS') ? $object->socid : -1), (string) $object->fk_project, ($action == 'classify' ? 'projectid' : 'none'), 0, 0, 0, 1, '', 'maxwidth300');
177 } else {
178 if (!empty($object->fk_project)) {
179 $proj = new Project($db);
180 $proj->fetch($object->fk_project);
181 $morehtmlref .= $proj->getNomUrl(1);
182 if ($proj->title) {
183 $morehtmlref .= '<span class="opacitymedium"> - '.dol_escape_htmltag($proj->title).'</span>';
184 }
185 }
186 }
187 }
188 $morehtmlref .= '</div>';
189
190 $object->totalpaid = $alreadypaid; // To give a chance to dol_banner_tab to use already paid amount to show correct status
191
192 dol_banner_tab($object, 'ref', $linkback, 1, 'ref', 'ref', $morehtmlref);
193
194 /*
195 print '<div class="fichecenter">';
196 print '<div class="fichehalfleft">';
197 print '<div class="underbanner clearboth"></div>';
198
199 print '<table class="border centpercent tableforfield">';
200
201 // Type
202 print '<tr><td class="titlefield">'.$langs->trans('Type').'</td><td colspan="4">';
203 print '<span class="badgeneutral">';
204 print $object->getLibType();
205 print '</span>';
206 if ($object->type == FactureFournisseur::TYPE_REPLACEMENT) {
207 $facreplaced = new FactureFournisseur($db);
208 $facreplaced->fetch($object->fk_facture_source);
209 print ' '.$langs->transnoentities("ReplaceInvoice", $facreplaced->getNomUrl(1));
210 }
211 if ($object->type == FactureFournisseur::TYPE_CREDIT_NOTE) {
212 $facusing = new FactureFournisseur($db);
213 $facusing->fetch($object->fk_facture_source);
214 print ' '.$langs->transnoentities("CorrectInvoice", $facusing->getNomUrl(1));
215 }
216
217 // Retrieve credit note ids
218 $object->getListIdAvoirFromInvoice();
219
220 if (!empty($object->creditnote_ids)) {
221 $invoicecredits = array();
222 foreach ($object->creditnote_ids as $invoiceid) {
223 $creditnote = new FactureFournisseur($db);
224 $creditnote->fetch($invoiceid);
225 $invoicecredits[] = $creditnote->getNomUrl(1);
226 }
227 print ' '.$langs->transnoentities("InvoiceHasAvoir") . (count($invoicecredits) ? ' ' : '') . implode(',', $invoicecredits);
228 }
229 //if ($facidnext > 0) {
230 // $facthatreplace = new FactureFournisseur($db);
231 // $facthatreplace->fetch($facidnext);
232 // print ' '.$langs->transnoentities("ReplacedByInvoice", $facthatreplace->getNomUrl(1));
233 //}
234 print '</td></tr>';
235
236 // Label
237 print '<tr><td>'.$form->editfieldkey("Label", 'label', $object->label, $object, 0).'</td><td>';
238 print $form->editfieldval("Label", 'label', $object->label, $object, 0);
239 print '</td></tr>';
240
241 print '</table>';
242
243 print '</div><div class="fichehalfright">';
244 print '<div class="underbanner clearboth"></div>';
245
246 print '<table class="border centpercent tableforfield">';
247
248 // Amount
249 print '<tr><td>'.$langs->trans('AmountHT').'</td><td>'.price($object->total_ht, 1, $langs, 0, -1, -1, $conf->currency).'</td></tr>';
250 print '<tr><td>'.$langs->trans('AmountVAT').'</td><td>'.price($object->total_tva, 1, $langs, 0, -1, -1, $conf->currency).'</td></tr>';
251
252 // Amount Local Taxes
253 //TODO: Place into a function to control showing by country or study better option
254 if ($mysoc->localtax1_assuj == "1" || $object->total_localtax1 != 0) { //Localtax1
255 print '<tr><td>'.$langs->transcountry("AmountLT1", $mysoc->country_code).'</td>';
256 print '<td>'.price($object->total_localtax1, 1, $langs, 0, -1, -1, $conf->currency).'</td>';
257 print '</tr>';
258 }
259 if ($mysoc->localtax2_assuj == "1" || $object->total_localtax2 != 0) { //Localtax2
260 print '<tr><td>'.$langs->transcountry("AmountLT2", $mysoc->country_code).'</td>';
261 print '<td>'.price($object->total_localtax2, 1, $langs, 0, -1, -1, $conf->currency).'</td>';
262 print '</tr>';
263 }
264 print '<tr><td>'.$langs->trans('AmountTTC').'</td><td>'.price($object->total_ttc, 1, $langs, 0, -1, -1, $conf->currency).'</td></tr>';
265
266 print "</table>";
267 print '</div>';
268
269 print '</div>';
270 */
271
272 print dol_get_fiche_end();
273
274 //print '<div class="clearboth"></div>';
275 //print '<br>';
276
277 // Contacts lines (modules that overwrite templates must declare this into descriptor)
278 $dirtpls = array_merge($conf->modules_parts['tpl'], array('/core/tpl'));
279 foreach ($dirtpls as $reldir) {
280 $res = @include dol_buildpath($reldir.'/contacts.tpl.php');
281 if ($res) {
282 break;
283 }
284 }
285 } else {
286 recordNotFound('', 0);
287 }
288}
289
290// End of page
291llxFooter();
292$db->close();
$id
Support class for third parties, contacts, members, users or resources.
Definition account.php:47
if(! $sortfield) if(! $sortorder) $object
Definition account.php:100
llxFooter($comment='', $zone='private', $disabledoutputofmessages=0)
Empty footer.
Definition wrapper.php:91
if(!defined('NOREQUIRESOC')) if(!defined( 'NOREQUIRETRAN')) if(!defined('NOTOKENRENEWAL')) if(!defined( 'NOREQUIREMENU')) if(!defined('NOREQUIREHTML')) if(!defined( 'NOREQUIREAJAX')) llxHeader($head='', $title='', $help_url='', $target='', $disablejs=0, $disablehead=0, $arrayofjs='', $arrayofcss='', $morequerystring='', $morecssonbody='', $replacemainareaby='', $disablenofollow=0, $disablenoindex=0)
Empty header.
Definition wrapper.php:73
Class to manage contact/addresses.
Class to manage suppliers invoices.
Class to build HTML component for third parties management Only common components are here.
Class to manage generation of HTML components Only common components must be here.
Class to manage projects.
Class to manage Dolibarr users.
if(!isModEnabled('ai')||!getDolGlobalString('AI_ASSISTANT_ENABLED')) global $conf
The main.inc.php has been included so the following variable are now defined:
if(!isModEnabled('ai')||!getDolGlobalString('AI_ASSISTANT_ENABLED')) global $db
API class for accounts.
facturefourn_prepare_head(FactureFournisseur $object)
Prepare array with list of tabs.
Definition fourn.lib.php:38
setEventMessages($mesg, $mesgs, $style='mesgs', $messagekey='', $noduplicate=0, $attop=0)
Set event messages in dol_events session object.
img_picto($titlealt, $picto, $moreatt='', $pictoisfullpath=0, $srconly=0, $notitle=0, $alt='', $morecss='', $marginleftonlyshort=2, $allowothertags=array())
Show picto whatever it's its name (generic function)
GETPOSTINT($paramname, $method=0)
Return the value of a $_GET or $_POST supervariable, converted into integer.
dol_get_fiche_head($links=array(), $active='', $title='', $notab=0, $picto='', $pictoisfullpath=0, $morehtmlright='', $morecss='', $limittoshow=0, $moretabssuffix='', $dragdropfile=0, $morecssdiv='')
Show tabs of a record.
dol_get_fiche_end($notab=0)
Return tab footer of a card.
GETPOST($paramname, $check='alphanohtml', $method=0, $filter=null, $options=null, $noreplace=0)
Return value of a param into GET or POST supervariable.
dol_buildpath($path, $type=0, $returnemptyifnotfound=0)
Return path of url or filesystem.
dol_print_error($db=null, $error='', $errors=null)
Displays error message system with all the information to facilitate the diagnosis and the escalation...
getDolGlobalString($key, $default='')
Return a Dolibarr global constant string value.
isModEnabled($module)
Is Dolibarr module enabled.
img_edit($titlealt='default', $float=0, $other='')
Show logo edit/modify fiche.
print $langs trans("Show") . '< td style="' . $timeColor . '" align="center"> s</td > badge status0 badge status4 badge status3 Error badge status8< td align="center">< span class="badge ' . $badge . '"></span ></td >< td align="center">< a href="#" class="button button-small" onclick="openLogModal(this)" data-req="' . dol_escape_htmltag($reqSafe) . '" data-res="' . dol_escape_htmltag($resSafe) . '" data-err="' . dol_escape_htmltag($errSafe) . '">< span class="fa fa-search-plus"></span ></a ></td ></tr >< tr >< td colspan="' . $colspan . '" class="opacitymedium"></td ></tr ></table ></div ></form > logModal none logModal none s a JSON string
buildzip.php
restrictedArea(User $user, $features, $object=0, $tableandshare='', $feature2='', $dbt_keyfield='fk_soc', $dbt_select='rowid', $isdraft=0, $mode=0)
Check permissions of a user to show a page and an object.