dolibarr 23.0.3
card.php
Go to the documentation of this file.
1<?php
2/* Copyright (C) 2001-2005 Rodolphe Quiedeville <rodolphe@quiedeville.org>
3 * Copyright (C) 2003 Eric Seigne <erics@rycks.com>
4 * Copyright (C) 2004-2016 Laurent Destailleur <eldy@users.sourceforge.net>
5 * Copyright (C) 2005-2010 Regis Houssin <regis.houssin@inodbox.com>
6 * Copyright (C) 2010-2015 Juanjo Menent <jmenent@2byte.es>
7 * Copyright (C) 2014 Jean Heimburger <jean@tiaris.info>
8 * Copyright (C) 2015 Marcos García <marcosgdf@gmail.com>
9 * Copyright (C) 2015 Raphaël Doursenaud <rdoursenaud@gpcsolutions.fr>
10 * Copyright (C) 2021-2025 Frédéric France <frederic.france@free.fr>
11 * Copyright (C) 2024-2025 MDW <mdeweerd@users.noreply.github.com>
12 * Copyright (C) 2024 Alexandre Spangaro <alexandre@inovea-conseil.com>
13 *
14 * This program is free software; you can redistribute it and/or modify
15 * it under the terms of the GNU General Public License as published by
16 * the Free Software Foundation; either version 3 of the License, or
17 * (at your option) any later version.
18 *
19 * This program is distributed in the hope that it will be useful,
20 * but WITHOUT ANY WARRANTY; without even the implied warranty of
21 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
22 * GNU General Public License for more details.
23 *
24 * You should have received a copy of the GNU General Public License
25 * along with this program. If not, see <https://www.gnu.org/licenses/>.
26 */
27
34// Load Dolibarr environment
35require '../main.inc.php';
36require_once DOL_DOCUMENT_ROOT.'/fourn/class/fournisseur.class.php';
37require_once DOL_DOCUMENT_ROOT.'/fourn/class/fournisseur.facture.class.php';
38require_once DOL_DOCUMENT_ROOT.'/fourn/class/fournisseur.facture-rec.class.php';
39require_once DOL_DOCUMENT_ROOT.'/supplier_proposal/class/supplier_proposal.class.php';
40require_once DOL_DOCUMENT_ROOT.'/categories/class/categorie.class.php';
41require_once DOL_DOCUMENT_ROOT.'/contact/class/contact.class.php';
42require_once DOL_DOCUMENT_ROOT.'/core/lib/company.lib.php';
43require_once DOL_DOCUMENT_ROOT.'/core/class/extrafields.class.php';
44if (isModEnabled('member')) {
45 require_once DOL_DOCUMENT_ROOT.'/adherents/class/adherent.class.php';
46}
47if (isModEnabled('accounting')) {
48 require_once DOL_DOCUMENT_ROOT.'/core/lib/accounting.lib.php';
49 require_once DOL_DOCUMENT_ROOT.'/accountancy/class/accountingaccount.class.php';
50}
51
61// Load translation files required by page
62$langs->loadLangs(array('accountancy', 'companies', 'suppliers', 'products', 'bills', 'orders', 'commercial'));
63
64$action = GETPOST('action', 'aZ09');
65$cancel = GETPOST('cancel', 'alpha');
66
67$id = (GETPOSTINT('socid') ? GETPOSTINT('socid') : GETPOSTINT('id'));
68if ($user->socid) {
69 $id = $user->socid;
70}
71
72// Initialize a technical object to manage hooks of page. Note that conf->hooks_modules contains an array of hook context
73$hookmanager->initHooks(array('thirdpartysupplier', 'globalcard'));
74
75$result = restrictedArea($user, 'societe&fournisseur', $id, '&societe', '', 'rowid');
76
77$object = new Fournisseur($db);
78$extrafields = new ExtraFields($db);
79
80// fetch optionals attributes and labels
81$extrafields->fetch_name_optionals_label($object->table_element);
82
83$permissiontoadd = $user->hasRight('societe', 'creer');
84$permissiontoeditextra = $permissiontoadd;
85if (GETPOST('attribute', 'aZ09') && isset($extrafields->attributes[$object->table_element]['perms'][GETPOST('attribute', 'aZ09')])) {
86 // For action 'update_extras', is there a specific permission set for the attribute to update
87 $permissiontoeditextra = dol_eval((string) $extrafields->attributes[$object->table_element]['perms'][GETPOST('attribute', 'aZ09')]);
88}
89
90// Security check
91$result = restrictedArea($user, 'societe', $id, '&societe', '', 'fk_soc', 'rowid', 0);
92
93if ($object->id > 0) {
94 if (!($object->fournisseur > 0) || !$user->hasRight("fournisseur", "lire")) {
96 }
97}
98
99
100/*
101 * Actions
102 */
103$error = 0;
104$parameters = array('id' => $id);
105$reshook = $hookmanager->executeHooks('doActions', $parameters, $object, $action); // Note that $action and $object may have been modified by some hooks
106if ($reshook < 0) {
107 setEventMessages($hookmanager->error, $hookmanager->errors, 'errors');
108}
109
110if (empty($reshook)) {
111 if ($cancel) {
112 $action = "";
113 }
114
115 // set general supplier accounting account
116 if ($action == 'setsupplieraccountancycodegeneral' && $user->hasRight('societe', 'creer')) {
117 $result = $object->fetch($id);
118 $object->accountancy_code_supplier_general = GETPOST("supplieraccountancycodegeneral");
119 $result = $object->update($object->id, $user, 1, 0, 1);
120 if ($result < 0) {
121 setEventMessages($object->error, $object->errors, 'errors');
122 $_GET['action'] = 'editsupplieraccountancycode';
123 }
124 }
125
126 // Set auxiliary supplier accounting account
127 if ($action == 'setsupplieraccountancycode' && $user->hasRight('societe', 'creer')) {
128 $result = $object->fetch($id);
129 $object->code_compta_fournisseur = GETPOST("supplieraccountancycode");
130 $result = $object->update($object->id, $user, 1, 0, 1);
131 if ($result < 0) {
132 setEventMessages($object->error, $object->errors, 'errors');
133 $action = 'editsupplieraccountancycode';
134 }
135 }
136 // Set vat number accounting account
137 if ($action == 'settva_intra' && $user->hasRight('societe', 'creer')) {
138 $result = $object->fetch($id);
139 $object->tva_intra = GETPOST("tva_intra");
140 $result = $object->update($object->id, $user, 1, 0, 0);
141 if ($result < 0) {
142 setEventMessages($object->error, $object->errors, 'errors');
143 }
144 }
145 // Set payment terms of the settlement
146 if ($action == 'setconditions' && $user->hasRight('societe', 'creer')) {
147 $object->fetch($id);
148 $result = $object->setPaymentTerms(GETPOSTINT('cond_reglement_supplier_id'), GETPOSTINT('cond_reglement_supplier_id_deposit_percent'));
149 if ($result < 0) {
150 dol_print_error($db, $object->error);
151 }
152 }
153 // Payment mode
154 if ($action == 'setmode' && $user->hasRight('societe', 'creer')) {
155 $object->fetch($id);
156 $result = $object->setPaymentMethods(GETPOSTINT('mode_reglement_supplier_id'));
157 if ($result < 0) {
158 dol_print_error($db, $object->error);
159 }
160 }
161
162 // Bank account
163 if ($action == 'setbankaccount' && $user->hasRight('societe', 'creer')) {
164 $object->fetch($id);
165 $result = $object->setBankAccount(GETPOSTINT('fk_account'));
166 if ($result < 0) {
167 setEventMessages($object->error, $object->errors, 'errors');
168 }
169 }
170
171 // update supplier order min amount
172 if ($action == 'setsupplier_order_min_amount' && $user->hasRight('societe', 'creer')) {
173 $object->fetch($id);
174 $object->supplier_order_min_amount = price2num(GETPOST('supplier_order_min_amount', 'alpha'));
175 $result = $object->update($object->id, $user);
176 if ($result < 0) {
177 setEventMessages($object->error, $object->errors, 'errors');
178 }
179 }
180
181 if ($action == 'update_extras' && $permissiontoeditextra) {
182 $object->fetch($id);
183
184 $object->oldcopy = dol_clone($object, 2); // @phan-suppress-current-line PhanTypeMismatchProperty
185
186 $attribute_name = GETPOST('attribute', 'aZ09');
187
188 // Fill array 'array_options' with data from update form
189 $ret = $extrafields->setOptionalsFromPost(null, $object, $attribute_name);
190 if ($ret < 0) {
191 $error++;
192 }
193
194 if (!$error) {
195 $result = $object->updateExtraField($attribute_name, 'COMPANY_MODIFY');
196 if ($result < 0) {
197 setEventMessages($object->error, $object->errors, 'errors');
198 $error++;
199 }
200 }
201
202 if ($error) {
203 $action = 'edit_extras';
204 }
205 }
206}
207
208
209/*
210 * View
211 */
212
213$contactstatic = new Contact($db);
214$form = new Form($db);
215
216if ($id > 0 && empty($object->id)) {
217 // Load data of third party
218 $res = $object->fetch($id);
219 if ($object->id <= 0) {
220 dol_print_error($db, $object->error);
221 exit(1);
222 }
223}
224
225if ($object->id > 0) {
226 $title = $langs->trans("ThirdParty")." - ".$langs->trans('Supplier');
227 if (getDolGlobalString('MAIN_HTML_TITLE') && preg_match('/thirdpartynameonly/', getDolGlobalString('MAIN_HTML_TITLE')) && $object->name) {
228 $title = $object->name." - ".$langs->trans('Supplier');
229 }
230 $help_url = '';
231 llxHeader('', $title, $help_url, '', 0, 0, '', '', '', 'mod-fourn page-card');
232
233 /*
234 * Show tabs
235 */
236 $head = societe_prepare_head($object);
237
238 print dol_get_fiche_head($head, 'supplier', $langs->trans("ThirdParty"), -1, 'company');
239
240 $linkback = '<a href="'.DOL_URL_ROOT.'/societe/list.php?restore_lastsearch_values=1">'.$langs->trans("BackToList").'</a>';
241
242 dol_banner_tab($object, 'socid', $linkback, ($user->socid ? 0 : 1), 'rowid', 'nom');
243
244 print '<div class="fichecenter"><div class="fichehalfleft">';
245
246 print '<div class="underbanner clearboth"></div>';
247 print '<table class="border centpercent tableforfield">';
248
249 // Nature Prospect/Customer/Supplier
250 print '<tr><td class="titlefield">'.$langs->trans('NatureOfThirdParty').'</td><td>';
251 print $object->getTypeUrl(1);
252 print '</td></tr>';
253
254 if ($object->fournisseur) {
255 $langs->load('compta');
256
257 print '<tr>';
258 print '<td class="titlefield">'.$langs->trans("SupplierCode").'</td><td>';
260 $tmpcheck = $object->check_codefournisseur();
261 if ($tmpcheck != 0 && $tmpcheck != -5) {
262 print ' <span class="error">('.$langs->trans("WrongSupplierCode").')</span>';
263 }
264 print '</td>';
265 print '</tr>';
266
267 if (isModEnabled('accounting')) {
268 $formaccounting = new FormAccounting($db);
269
270 print '<tr>';
271 print '<td>';
272 print $form->editfieldkey("SupplierAccountancyCodeGeneral", 'supplieraccountancycodegeneral', length_accountg($object->accountancy_code_supplier_general), $object, $user->hasRight('societe', 'creer'));
273 print '</td><td>';
274 if ($action == 'editsupplieraccountancycodegeneral' && $user->hasRight('societe', 'creer')) {
275 print $formaccounting->formAccountingAccount($_SERVER['PHP_SELF'].'?id='.$object->id, $object->accountancy_code_supplier_general, 'supplieraccountancycodegeneral', 0, 1, '', 1);
276 } else {
277 if ($object->accountancy_code_supplier_general > 0) {
278 $accountingaccount = new AccountingAccount($db);
279 $accountingaccount->fetch(0, $object->accountancy_code_supplier_general, 1);
280
281 print $accountingaccount->getNomUrl(0, 1, 1, '', 1);
282 }
283 if (getDolGlobalString('ACCOUNTING_ACCOUNT_SUPPLIER')) {
284 if ($object->accountancy_code_supplier_general > 0) {
285 print ' - ';
286 }
287 $accountingAccountByDefault = '<span class="opacitymedium">' . $langs->trans("AccountingAccountByDefaultShort") . ": " . length_accountg(getDolGlobalString('ACCOUNTING_ACCOUNT_SUPPLIER')) . '</span>';
288 print $accountingAccountByDefault;
289 }
290 }
291 print '</td>';
292 print '</tr>';
293 }
294
295 print '<tr>';
296 print '<td>';
297 print $form->editfieldkey("SupplierAccountancyCode", 'supplieraccountancycode', $object->code_compta_fournisseur, $object, $user->hasRight('societe', 'creer'));
298 print '</td><td>';
299 print $form->editfieldval("SupplierAccountancyCode", 'supplieraccountancycode', $object->code_compta_fournisseur, $object, $user->hasRight('societe', 'creer'));
300 print '</td>';
301 print '</tr>';
302 }
303
304 // VAT is used
305 print '<tr>';
306 print '<td class="titlefield">';
307 print $form->textwithpicto($langs->trans('VATIsUsed'), $langs->trans('VATIsUsedWhenSelling'));
308 print '</td><td>';
309 print yn($object->tva_assuj);
310 print '</td>';
311 print '</tr>';
312
313 // Local Taxes
314 if ($mysoc->useLocalTax(1)) {
315 print '<tr><td>'.$langs->transcountry("LocalTax1IsUsed", $mysoc->country_code).'</td><td>';
316 print yn($object->localtax1_assuj);
317 print '</td></tr>';
318 }
319 if ($mysoc->useLocalTax(2)) {
320 print '<tr><td>'.$langs->transcountry("LocalTax2IsUsed", $mysoc->country_code).'</td><td>';
321 print yn($object->localtax2_assuj);
322 print '</td></tr>';
323 }
324
325 // VAT reverse-charge by default on supplier invoice or not
326 if (getDolGlobalString('ACCOUNTING_FORCE_ENABLE_VAT_REVERSE_CHARGE')) {
327 print '<tr>';
328 print '<td class="titlefield">';
329 print $form->textwithpicto($langs->trans('VATReverseChargeByDefault'), $langs->trans('VATReverseChargeByDefaultDesc'));
330 print '</td><td>';
331 print '<input type="checkbox" name="vat_reverse_charge" ' . ($object->vat_reverse_charge == '1' ? ' checked' : '') . ' disabled>';
332 print '</td>';
333 print '</tr>';
334 }
335
336 // TVA Intra
337 print '<tr><td class="nowrap">';
338 //print $langs->trans('VATIntra').'</td><td>';
339 $vattoshow = ($object->tva_intra ? showValueWithClipboardCPButton(dol_escape_htmltag($object->tva_intra)) : '');
340 print $form->editfieldkey("VATIntra", 'tva_intra', $object->tva_intra, $object, $user->hasRight('societe', 'creer'));
341 print '</td><td>';
342 print $form->editfieldval("VATIntra", 'tva_intra', $vattoshow, $object, $user->hasRight('societe', 'creer'), 'string', $object->tva_intra, null, null, '', 1, '', 'id', 'auto', array('valuealreadyhtmlescaped' => 1));
343 print '</td></tr>';
344
345 // Default terms of the settlement
346 $langs->load('bills');
347 $form = new Form($db);
348 print '<tr><td>';
349 print '<table width="100%" class="nobordernopadding"><tr><td>';
350 print $langs->trans('PaymentConditions');
351 print '<td>';
352 if (($action != 'editconditions') && $user->hasRight('societe', 'creer')) {
353 print '<td class="right"><a class="editfielda" href="'.$_SERVER["PHP_SELF"].'?action=editconditions&token='.newToken().'&socid='.$object->id.'">'.img_edit($langs->trans('SetConditions'), 1).'</a></td>';
354 }
355 print '</tr></table>';
356 print '</td><td>';
357 if ($action == 'editconditions') {
358 $form->form_conditions_reglement($_SERVER['PHP_SELF'] . '?socid=' . $object->id, (string) $object->cond_reglement_supplier_id, 'cond_reglement_supplier_id', 1, '', 1, $object->deposit_percent);
359 } else {
360 $form->form_conditions_reglement($_SERVER['PHP_SELF'] . '?socid=' . $object->id, (string) $object->cond_reglement_supplier_id, 'none', 0, '', 1, $object->deposit_percent);
361 }
362 print "</td>";
363 print '</tr>';
364
365 // Default payment mode
366 print '<tr><td class="nowrap">';
367 print '<table width="100%" class="nobordernopadding"><tr><td class="nowrap">';
368 print $langs->trans('PaymentMode');
369 print '<td>';
370 if (($action != 'editmode') && $user->hasRight('societe', 'creer')) {
371 print '<td class="right"><a class="editfielda" href="'.$_SERVER["PHP_SELF"].'?action=editmode&token='.newToken().'&socid='.$object->id.'">'.img_edit($langs->trans('SetMode'), 1).'</a></td>';
372 }
373 print '</tr></table>';
374 print '</td><td>';
375 if ($action == 'editmode') {
376 $form->form_modes_reglement($_SERVER['PHP_SELF'].'?socid='.$object->id, (string) $object->mode_reglement_supplier_id, 'mode_reglement_supplier_id', 'DBIT', 1, 1);
377 } else {
378 $form->form_modes_reglement($_SERVER['PHP_SELF'].'?socid='.$object->id, (string) $object->mode_reglement_supplier_id, 'none');
379 }
380 print "</td>";
381 print '</tr>';
382
383 if (isModEnabled("bank")) {
384 // Default bank account for payments
385 print '<tr><td class="nowrap">';
386 print '<table width="100%" class="nobordernopadding"><tr><td class="nowrap">';
387 print $langs->trans('PaymentBankAccount');
388 print '<td>';
389 if (($action != 'editbankaccount') && $user->hasRight('societe', 'creer')) {
390 print '<td class="right"><a class="editfielda" href="'.$_SERVER["PHP_SELF"].'?action=editbankaccount&token='.newToken().'&socid='.$object->id.'">'.img_edit($langs->trans('SetBankAccount'), 1).'</a></td>';
391 }
392 print '</tr></table>';
393 print '</td><td>';
394 if ($action == 'editbankaccount') {
395 $form->formSelectAccount($_SERVER['PHP_SELF'].'?socid='.$object->id, (string) $object->fk_account, 'fk_account', 1);
396 } else {
397 $form->formSelectAccount($_SERVER['PHP_SELF'].'?socid='.$object->id, (string) $object->fk_account, 'none');
398 }
399 print "</td>";
400 print '</tr>';
401 }
402
403 // Relative discounts (Discounts-Drawbacks-Rebates)
404 print '<tr><td class="nowrap">';
405 print '<table width="100%" class="nobordernopadding"><tr><td class="nowrap">';
406 print $langs->trans("CustomerRelativeDiscountShort");
407 print '<td><td class="right">';
408 if ($user->hasRight('societe', 'creer') && !$user->socid > 0) {
409 print '<a class="editfielda" href="'.DOL_URL_ROOT.'/comm/remise.php?id='.$object->id.'&backtopage='.urlencode($_SERVER["PHP_SELF"].'?socid='.$object->id).'&action=create&token='.newToken().'">'.img_edit($langs->trans("Modify")).'</a>';
410 }
411 print '</td></tr></table>';
412 print '</td><td>'.($object->remise_supplier_percent ? '<a href="'.DOL_URL_ROOT.'/comm/remise.php?id='.$object->id.'">'.$object->remise_supplier_percent.'%</a>' : '').'</td>';
413 print '</tr>';
414
415 // Absolute discounts (Discounts-Drawbacks-Rebates)
416 print '<tr><td class="nowrap">';
417 print '<table width="100%" class="nobordernopadding">';
418 print '<tr><td class="nowrap">';
419 print $langs->trans("CustomerAbsoluteDiscountShort");
420 print '<td><td class="right">';
421 if ($user->hasRight('societe', 'creer') && !$user->socid > 0) {
422 print '<a class="editfielda" href="'.DOL_URL_ROOT.'/comm/remx.php?id='.$object->id.'&backtopage='.urlencode($_SERVER["PHP_SELF"].'?socid='.$object->id).'&action=create&token='.newToken().'">'.img_edit($langs->trans("Modify")).'</a>';
423 }
424 print '</td></tr></table>';
425 print '</td>';
426 print '<td>';
427 $amount_discount = $object->getAvailableDiscounts(null, '', 0, 1);
428 if ($amount_discount < 0) {
429 dol_print_error($db, $object->error);
430 }
431 if ($amount_discount > 0) {
432 print '<a href="'.DOL_URL_ROOT.'/comm/remx.php?id='.$object->id.'&backtopage='.urlencode($_SERVER["PHP_SELF"].'?socid='.$object->id).'&action=create&token='.newToken().'">'.price($amount_discount, 1, $langs, 1, -1, -1, $conf->currency).'</a>';
433 }
434 //else print $langs->trans("DiscountNone");
435 print '</td>';
436 print '</tr>';
437
438 if (isModEnabled("supplier_order") && getDolGlobalString('ORDER_MANAGE_MIN_AMOUNT')) {
439 print '<tr class="nowrap">';
440 print '<td>';
441 print $form->editfieldkey("OrderMinAmount", 'supplier_order_min_amount', $object->supplier_order_min_amount, $object, $user->hasRight("societe", "creer"));
442 print '</td><td>';
443 $limit_field_type = (getDolGlobalString('MAIN_USE_JQUERY_JEDITABLE')) ? 'numeric' : 'amount';
444 print $form->editfieldval("OrderMinAmount", 'supplier_order_min_amount', $object->supplier_order_min_amount, $object, $user->hasRight("societe", "creer"), $limit_field_type, ($object->supplier_order_min_amount != '' ? price($object->supplier_order_min_amount) : ''));
445 print '</td>';
446 print '</tr>';
447 }
448
449 // Categories
450 if (isModEnabled('category')) {
451 $langs->load("categories");
452 print '<tr><td>'.$langs->trans("SuppliersCategoriesShort").'</td>';
453 print '<td>';
454 print $form->showCategories($object->id, Categorie::TYPE_SUPPLIER, 1);
455 print "</td></tr>";
456 }
457
458 // Other attributes
459 $parameters = array('socid' => $object->id, 'colspan' => ' colspan="3"', 'colspanvalue' => '3');
460 include DOL_DOCUMENT_ROOT.'/core/tpl/extrafields_view.tpl.php';
461
462 // Module Adherent
463 if (isModEnabled('member')) {
464 $langs->load("members");
465 $langs->load("users");
466 print '<tr><td>'.$langs->trans("LinkedToDolibarrMember").'</td>';
467 print '<td>';
468 $adh = new Adherent($db);
469 $result = $adh->fetch(0, '', $object->id);
470 if ($result > 0) {
471 $adh->ref = $adh->getFullName($langs);
472 print $adh->getNomUrl(1);
473 } else {
474 print $langs->trans("ThirdpartyNotLinkedToMember");
475 }
476 print '</td>';
477 print "</tr>\n";
478 }
479
480 print '</table>';
481
482
483 print '</div><div class="fichehalfright">';
484
485 $boxstat = '';
486
487 // Nbre max d'elements des petites listes
488 $MAXLIST = getDolGlobalInt('MAIN_SIZE_SHORTLIST_LIMIT', 5);
489
490 print '<div class="underbanner underbanner-before-box clearboth"></div>';
491 print '<br>';
492
493 // Summary link
494 $boxstat .= '<div class="box divboxtable box-halfright">';
495 $boxstat .= '<table summary="'.dol_escape_htmltag($langs->trans("DolibarrStateBoard")).'" class="border boxtable boxtablenobottom boxtablenotop" width="100%">';
496 $boxstat .= '<tr class="impair nohover"><td colspan="2" class="tdboxstats nohover">';
497
498 if (isModEnabled('supplier_proposal')) {
499 // Box proposals
500 $tmp = $object->getOutstandingProposals('supplier');
501 $outstandingOpened = $tmp['opened'];
502 $outstandingTotal = $tmp['total_ht'];
503 $outstandingTotalIncTax = $tmp['total_ttc'];
504 $text = $langs->trans("OverAllSupplierProposals");
505 $link = DOL_URL_ROOT.'/supplier_proposal/list.php?socid='.$object->id;
506 $icon = 'bill';
507 if ($link) {
508 $boxstat .= '<a href="'.$link.'" class="boxstatsindicator thumbstat nobold nounderline">';
509 }
510 $boxstat .= '<div class="boxstats" title="'.dol_escape_htmltag($text).'">';
511 $boxstat .= '<span class="boxstatstext">'.img_object("", $icon).' <span>'.$text.'</span></span><br>';
512 $boxstat .= '<span class="boxstatsindicator">'.price($outstandingTotal, 1, $langs, 1, -1, -1, $conf->currency).'</span>';
513 $boxstat .= '</div>';
514 if ($link) {
515 $boxstat .= '</a>';
516 }
517 }
518
519 if (isModEnabled("supplier_order")) {
520 // Box proposals
521 $tmp = $object->getOutstandingOrders('supplier');
522 $outstandingOpened = $tmp['opened'];
523 $outstandingTotal = $tmp['total_ht'];
524 $outstandingTotalIncTax = $tmp['total_ttc'];
525 $text = $langs->trans("OverAllOrders");
526 $link = DOL_URL_ROOT.'/fourn/commande/list.php?socid='.$object->id;
527 $icon = 'bill';
528 if ($link) {
529 $boxstat .= '<a href="'.$link.'" class="boxstatsindicator thumbstat nobold nounderline">';
530 }
531 $boxstat .= '<div class="boxstats" title="'.dol_escape_htmltag($text).'">';
532 $boxstat .= '<span class="boxstatstext">'.img_object("", $icon).' <span>'.$text.'</span></span><br>';
533 $boxstat .= '<span class="boxstatsindicator">'.price($outstandingTotal, 1, $langs, 1, -1, -1, $conf->currency).'</span>';
534 $boxstat .= '</div>';
535 if ($link) {
536 $boxstat .= '</a>';
537 }
538 }
539
540 if (isModEnabled("supplier_invoice") && ($user->hasRight('fournisseur', 'facture', 'lire') || $user->hasRight('supplier_invoice', 'read'))) {
541 $warn = '';
542 $tmp = $object->getOutstandingBills('supplier');
543 $outstandingOpened = $tmp['opened'];
544 $outstandingTotal = $tmp['total_ht'];
545 $outstandingTotalIncTax = $tmp['total_ttc'];
546
547 $text = $langs->trans("OverAllInvoices");
548 $link = DOL_URL_ROOT.'/fourn/facture/list.php?socid='.$object->id;
549 $icon = 'bill';
550 if ($link) {
551 $boxstat .= '<a href="'.$link.'" class="boxstatsindicator thumbstat nobold nounderline">';
552 }
553 $boxstat .= '<div class="boxstats" title="'.dol_escape_htmltag($text).'">';
554 $boxstat .= '<span class="boxstatstext">'.img_object("", $icon).' <span>'.$text.'</span></span><br>';
555 $boxstat .= '<span class="boxstatsindicator">'.price($outstandingTotal, 1, $langs, 1, -1, -1, $conf->currency).'</span>';
556 $boxstat .= '</div>';
557 if ($link) {
558 $boxstat .= '</a>';
559 }
560
561 // Box outstanding bill
562 $text = $langs->trans("CurrentOutstandingBill");
563 $link = DOL_URL_ROOT.'/fourn/recap-fourn.php?socid='.$object->id;
564 $icon = 'bill';
565 if ($link) {
566 $boxstat .= '<a href="'.$link.'" class="boxstatsindicator thumbstat nobold nounderline">';
567 }
568 $boxstat .= '<div class="boxstats" title="'.dol_escape_htmltag($text).'">';
569 $boxstat .= '<span class="boxstatstext">'.img_object("", $icon).' <span>'.$text.'</span></span><br>';
570 $boxstat .= '<span class="boxstatsindicator'.($outstandingOpened > 0 ? ' amountremaintopay' : '').'">'.price($outstandingOpened, 1, $langs, 1, -1, -1, $conf->currency).$warn.'</span>';
571 $boxstat .= '</div>';
572 if ($link) {
573 $boxstat .= '</a>';
574 }
575
576 $tmp = $object->getOutstandingBills('supplier', 1);
577 $outstandingOpenedLate = $tmp['opened'];
578 if ($outstandingOpened != $outstandingOpenedLate && !empty($outstandingOpenedLate)) {
579 $text = $langs->trans("CurrentOutstandingBillLate");
580 $link = DOL_URL_ROOT.'/fourn/recap-fourn.php?socid='.$object->id;
581 $icon = 'bill';
582 if ($link) {
583 $boxstat .= '<a href="'.$link.'" class="boxstatsindicator thumbstat nobold nounderline">';
584 }
585 $boxstat .= '<div class="boxstats" title="'.dol_escape_htmltag($text).'">';
586 $boxstat .= '<span class="boxstatstext">'.img_object("", $icon).' <span>'.$text.'</span></span><br>';
587 $boxstat .= '<span class="boxstatsindicator'.($outstandingOpenedLate > 0 ? ' amountremaintopay' : '').'">'.price($outstandingOpenedLate, 1, $langs, 1, -1, -1, $conf->currency).$warn.'</span>';
588 $boxstat .= '</div>';
589 if ($link) {
590 $boxstat .= '</a>';
591 }
592 }
593 }
594
595
596 $parameters = array();
597 $reshook = $hookmanager->executeHooks('addMoreBoxStatsSupplier', $parameters, $object, $action);
598 if (empty($reshook)) {
599 $boxstat .= $hookmanager->resPrint;
600 }
601
602 $boxstat .= '</td></tr>';
603 $boxstat .= '</table>';
604 $boxstat .= '</div>';
605
606 print $boxstat;
607
608
609 $MAXLIST = getDolGlobalInt('MAIN_SIZE_SHORTLIST_LIMIT', 5);
610
611
612 /*
613 * List of products prices
614 */
615 if (isModEnabled("product") || isModEnabled("service")) {
616 $langs->load("products");
617 //Query from product/liste.php
618 $sql = 'SELECT p.rowid, p.ref, p.label, p.fk_product_type, p.entity, p.tosell as status, p.tobuy as status_buy, p.tobatch as status_batch,';
619 $sql .= ' pfp.tms, pfp.ref_fourn as supplier_ref, pfp.price, pfp.quantity, pfp.unitprice';
620 $sql .= ' FROM '.MAIN_DB_PREFIX.'product_fournisseur_price as pfp';
621 $sql .= " LEFT JOIN ".MAIN_DB_PREFIX."product as p ON p.rowid = pfp.fk_product";
622 $sql .= ' WHERE p.entity IN ('.getEntity('product').')';
623 $sql .= ' AND pfp.fk_soc = '.((int) $object->id);
624 $sql .= $db->order('pfp.tms', 'desc');
625 $sql .= $db->plimit($MAXLIST);
626
627 $query = $db->query($sql);
628 if (!$query) {
629 dol_print_error($db);
630 }
631
632 $num = $db->num_rows($query);
633
634 print '<div class="div-table-responsive-no-min">';
635 print '<table class="noborder centpercent lastrecordtable">';
636 print '<tr class="liste_titre'.(($num == 0) ? ' nobottom' : '').'">';
637 print '<td colspan="2">'.$langs->trans("ProductsAndServices").'</td><td class="right" colspan="2">';
638 print '<a class="notasortlink" href="'.DOL_URL_ROOT.'/fourn/product/list.php?fourn_id='.$object->id.'"><span class="hideonsmartphone">'.$langs->trans("AllProductReferencesOfSupplier").'</span><span class="badge marginleftonlyshort">'.$object->nbOfProductRefs().'</span>';
639 print '</a></td></tr>';
640
641 $return = array();
642 if ($num > 0) {
643 $productstatic = new Product($db);
644
645 while ($objp = $db->fetch_object($query)) {
646 $productstatic->id = $objp->rowid;
647 $productstatic->ref = $objp->ref;
648 $productstatic->label = $objp->label;
649 $productstatic->type = $objp->fk_product_type;
650 $productstatic->entity = $objp->entity;
651 $productstatic->status = $objp->status;
652 $productstatic->status_buy = $objp->status_buy;
653 $productstatic->status_batch = $objp->status_batch;
654
655 print '<tr class="oddeven">';
656 print '<td class="nowrap">';
657 print $productstatic->getNomUrl(1);
658 print '</td>';
659 print '<td>';
660 print dol_escape_htmltag($objp->supplier_ref);
661 print '</td>';
662 print '<td class="tdoverflowmax200">';
663 print dol_trunc(dol_htmlentities($objp->label), 30);
664 print '</td>';
665 //print '<td class="right" class="nowrap">'.dol_print_date($objp->tms, 'day').'</td>';
666 print '<td class="right">';
667 //print (isset($objp->unitprice) ? price($objp->unitprice) : '');
668 if (isset($objp->price)) {
669 print '<span class="amount">'.price($objp->price).'</span>';
670 if ($objp->quantity > 1) {
671 print ' / ';
672 print $objp->quantity;
673 }
674 }
675 print '</td>';
676 print '</tr>';
677 }
678 } else {
679 print '<tr><td colspan="4"><span class="opacitymedium">'.$langs->trans("NoProductPriceDefinedForThisSupplier").'</span></td></tr>';
680 }
681
682 print '</table>';
683 print '</div>';
684 }
685
686
687 /*
688 * Latest supplier proposal
689 */
690 $proposalstatic = new SupplierProposal($db);
691
692 if ($user->hasRight("supplier_proposal", "lire")) {
693 $langs->loadLangs(array("supplier_proposal"));
694
695 $sql = "SELECT p.rowid, p.ref, p.date_valid as dc, p.fk_statut, p.total_ht, p.total_tva, p.total_ttc";
696 $sql .= " FROM ".MAIN_DB_PREFIX."supplier_proposal as p ";
697 $sql .= " WHERE p.fk_soc = ".((int) $object->id);
698 $sql .= " AND p.entity IN (".getEntity('supplier_proposal').")";
699 $sql .= " ORDER BY p.date_valid DESC";
700 $sql .= $db->plimit($MAXLIST);
701
702 $resql = $db->query($sql);
703 if ($resql) {
704 $i = 0;
705 $num = $db->num_rows($resql);
706
707 if ($num > 0) {
708 print '<div class="div-table-responsive-no-min">';
709 print '<table class="noborder centpercent lastrecordtable">';
710
711 print '<tr class="liste_titre">';
712 print '<td colspan="3">';
713 print '<table class="nobordernopadding centpercent"><tr><td>'.$langs->trans("LastSupplierProposals", ($num < $MAXLIST ? "" : $MAXLIST)).'</td>';
714 print '<td class="right"><a class="notasortlink" href="'.DOL_URL_ROOT.'/supplier_proposal/list.php?socid='.$object->id.'"><span class="hideonsmartphone">'.$langs->trans("AllPriceRequests").'</span><span class="badge marginleftonlyshort">'.$num.'</span></td>';
715 // print '<td width="20px" class="right"><a href="'.DOL_URL_ROOT.'/supplier_proposal/stats/index.php?mode=supplier&socid='.$object->id.'">'.img_picto($langs->trans("Statistics"), 'stats').'</a></td>';
716 print '</tr></table>';
717 print '</td></tr>';
718 }
719
720 while ($i < $num && $i <= $MAXLIST) {
721 $obj = $db->fetch_object($resql);
722
723 print '<tr class="oddeven">';
724 print '<td class="nowrap">';
725 $proposalstatic->id = $obj->rowid;
726 $proposalstatic->ref = $obj->ref;
727 $proposalstatic->total_ht = $obj->total_ht;
728 $proposalstatic->total_tva = $obj->total_tva;
729 $proposalstatic->total_ttc = $obj->total_ttc;
730 print $proposalstatic->getNomUrl(1);
731 print '</td>';
732 print '<td class="center" width="80">';
733 if ($obj->dc) {
734 print dol_print_date($db->jdate($obj->dc), 'day');
735 } else {
736 print "-";
737 }
738 print '</td>';
739 print '<td class="right" class="nowrap">'.$proposalstatic->LibStatut($obj->fk_statut, 5).'</td>';
740 print '</tr>';
741 $i++;
742 }
743 $db->free($resql);
744
745 if ($num > 0) {
746 print "</table></div>";
747 }
748 } else {
749 dol_print_error($db);
750 }
751 }
752
753 /*
754 * Latest supplier orders
755 */
756 $orderstatic = new CommandeFournisseur($db);
757 $orders2invoice = 0;
758
759 if ($user->hasRight("fournisseur", "commande", "lire")) {
760 // TODO move to DAO class
761 // Check if there are supplier orders billable
762 $sql2 = 'SELECT s.nom, s.rowid as socid, s.client, c.rowid, c.ref, c.total_ht, c.ref_supplier,';
763 $sql2 .= ' c.date_valid, c.date_commande, c.date_livraison, c.fk_statut';
764 $sql2 .= ' FROM '.MAIN_DB_PREFIX.'societe as s';
765 $sql2 .= ', '.MAIN_DB_PREFIX.'commande_fournisseur as c';
766 $sql2 .= ' WHERE c.fk_soc = s.rowid';
767 $sql2 .= " AND c.entity IN (".getEntity('commande_fournisseur').")";
768 $sql2 .= ' AND s.rowid = '.((int) $object->id);
769 // Show orders we can bill
770 if (!getDolGlobalString('SUPPLIER_ORDER_TO_INVOICE_STATUS')) {
771 $sql2 .= " AND c.fk_statut IN (".$db->sanitize((string) CommandeFournisseur::STATUS_RECEIVED_COMPLETELY).")"; // Must match filter in htdocs/fourn/commande/list.php
772 } else {
773 // CommandeFournisseur::STATUS_ORDERSENT.", ".CommandeFournisseur::STATUS_RECEIVED_PARTIALLY.", ".CommandeFournisseur::STATUS_RECEIVED_COMPLETELY
774 $sql2 .= " AND c.fk_statut IN (".$db->sanitize(getDolGlobalString('SUPPLIER_ORDER_TO_INVOICE_STATUS')).")";
775 }
776 $sql2 .= " AND c.billed = 0";
777 // Find order that are not already invoiced
778 // just need to check received status because we have the billed status now
779 //$sql2 .= " AND c.rowid NOT IN (SELECT fk_source FROM " . MAIN_DB_PREFIX . "element_element WHERE targettype='invoice_supplier')";
780 $resql2 = $db->query($sql2);
781 if ($resql2) {
782 $orders2invoice = $db->num_rows($resql2);
783 $db->free($resql2);
784 } else {
785 setEventMessages($db->lasterror(), null, 'errors');
786 }
787
788 // TODO move to DAO class
789 $sql = "SELECT count(p.rowid) as total";
790 $sql .= " FROM ".MAIN_DB_PREFIX."commande_fournisseur as p";
791 $sql .= " WHERE p.fk_soc = ".((int) $object->id);
792 $sql .= " AND p.entity IN (".getEntity('commande_fournisseur').")";
793 $resql = $db->query($sql);
794 if ($resql) {
795 $object_count = $db->fetch_object($resql);
796 $num = $object_count->total;
797 }
798
799 $sql = "SELECT p.rowid,p.ref, p.date_commande as date, p.fk_statut, p.total_ht, p.total_tva, p.total_ttc";
800 $sql .= " FROM ".MAIN_DB_PREFIX."commande_fournisseur as p";
801 $sql .= " WHERE p.fk_soc = ".((int) $object->id);
802 $sql .= " AND p.entity IN (".getEntity('commande_fournisseur').")";
803 $sql .= " ORDER BY p.date_commande DESC";
804 $sql .= $db->plimit($MAXLIST);
805
806 $resql = $db->query($sql);
807 if ($resql) {
808 $i = 0;
809
810 if ($num > 0) {
811 print '<div class="div-table-responsive-no-min">';
812 print '<table class="noborder centpercent lastrecordtable">';
813
814 print '<tr class="liste_titre">';
815 print '<td colspan="4">';
816 print '<table class="nobordernopadding" width="100%"><tr><td>'.$langs->trans("LastSupplierOrders", ($num < $MAXLIST ? "" : $MAXLIST)).'</td>';
817 print '<td class="right"><a class="notasortlink" href="'.DOL_URL_ROOT.'/fourn/commande/list.php?socid='.$object->id.'"><span class="hideonsmartphone">'.$langs->trans("AllOrders").'</span><span class="badge marginleftonlyshort">'.$num.'</span></td>';
818 print '<td width="20px" class="right"><a href="'.DOL_URL_ROOT.'/commande/stats/index.php?mode=supplier&socid='.$object->id.'">'.img_picto($langs->trans("Statistics"), 'stats').'</a></td>';
819 print '</tr></table>';
820 print '</td></tr>';
821 }
822
823 while ($i < $num && $i < $MAXLIST) {
824 $obj = $db->fetch_object($resql);
825
826 $orderstatic->id = $obj->rowid;
827 $orderstatic->ref = $obj->ref;
828 $orderstatic->total_ht = $obj->total_ht;
829 $orderstatic->total_tva = $obj->total_tva;
830 $orderstatic->total_ttc = $obj->total_ttc;
831 $orderstatic->date = $db->jdate($obj->date);
832
833 print '<tr class="oddeven">';
834 print '<td class="nowraponall">';
835 print $orderstatic->getNomUrl(1);
836 print '</td>';
837 print '<td class="center" width="80">';
838 if ($obj->date) {
839 print dol_print_date($orderstatic->date, 'day');
840 }
841 print '</td>';
842 print '<td class="right nowrap"><span class="amount">'.price($orderstatic->total_ttc).'</span></td>';
843 print '<td class="right" class="nowrap">'.$orderstatic->LibStatut($obj->fk_statut, 5).'</td>';
844 print '</tr>';
845 $i++;
846 }
847 $db->free($resql);
848
849 if ($num > 0) {
850 print "</table></div>";
851 }
852 } else {
853 dol_print_error($db);
854 }
855 }
856
857
858 /*
859 * Latest invoices templates
860 */
861 if (isModEnabled("supplier_invoice") && ($user->hasRight('fournisseur', 'facture', 'lire') || $user->hasRight('supplier_invoice', 'read'))) {
862 $sql = 'SELECT f.rowid as id, f.titre as ref';
863 $sql .= ', f.total_ht';
864 $sql .= ', f.total_tva';
865 $sql .= ', f.total_ttc';
866 $sql .= ', f.datec as dc';
867 $sql .= ', f.date_last_gen, f.date_when';
868 $sql .= ', f.frequency';
869 $sql .= ', f.unit_frequency';
870 $sql .= ', f.suspended as suspended';
871 $sql .= ', s.nom, s.rowid as socid';
872 $sql .= " FROM ".MAIN_DB_PREFIX."societe as s,".MAIN_DB_PREFIX."facture_fourn_rec as f";
873 $sql .= " WHERE f.fk_soc = s.rowid AND s.rowid = ".((int) $object->id);
874 $sql .= " AND f.entity IN (".getEntity('invoice').")";
875 $sql .= ' GROUP BY f.rowid, f.titre, f.total_ht, f.total_tva, f.total_ttc,';
876 $sql .= ' f.date_last_gen, f.datec, f.frequency, f.unit_frequency,';
877 $sql .= ' f.suspended, f.date_when,';
878 $sql .= ' s.nom, s.rowid';
879 $sql .= $db->order("f.date_last_gen, f.datec", "DESC");
880
881 $resql = $db->query($sql);
882 if ($resql) {
883 $invoicetemplate = new FactureFournisseurRec($db);
884
885 $num = $db->num_rows($resql);
886 if ($num > 0) {
887 print '<div class="div-table-responsive-no-min">';
888 print '<table class="noborder centpercent lastrecordtable">';
889 print '<tr class="liste_titre">';
890 $colspan = 4;
891 if (getDolGlobalString('MAIN_SHOW_PRICE_WITH_TAX_IN_SUMMARIES')) {
892 $colspan++;
893 }
894 print '<td colspan="'.$colspan.'">';
895 print '<table class="centpercent nobordernopadding"><tr>';
896 print '<td>'.$langs->trans("LatestSupplierTemplateInvoices", ($num <= $MAXLIST ? "" : $MAXLIST)).'</td>';
897 print '<td class="right">';
898 print '<a class="notasortlink" href="'.DOL_URL_ROOT.'/fourn/facture/list-rec.php?socid='.$object->id.'">';
899 print '<span class="hideonsmartphone">'.$langs->trans("AllSupplierTemplateInvoices").'</span><span class="badge marginleftonlyshort">'.$num.'</span></a></td>';
900 print '</tr></table>';
901 print '</td>';
902 print '</tr>';
903 }
904
905 $i = 0;
906 while ($i < $num && $i < $MAXLIST) {
907 $objp = $db->fetch_object($resql);
908
909 $invoicetemplate->id = $objp->id;
910 $invoicetemplate->ref = $objp->ref;
911 $invoicetemplate->suspended = $objp->suspended;
912 $invoicetemplate->frequency = $objp->frequency;
913 $invoicetemplate->unit_frequency = $objp->unit_frequency;
914 $invoicetemplate->total_ht = $objp->total_ht;
915 $invoicetemplate->total_tva = $objp->total_tva;
916 $invoicetemplate->total_ttc = $objp->total_ttc;
917 $invoicetemplate->date_last_gen = $objp->date_last_gen;
918 $invoicetemplate->date_when = $objp->date_when;
919
920 print '<tr class="oddeven">';
921 print '<td class="tdoverflowmax250">';
922 print $invoicetemplate->getNomUrl(1);
923 print '</td>';
924
925 if ($objp->frequency && $objp->date_last_gen > 0) {
926 print '<td class="right" width="80px">'.dol_print_date($db->jdate($objp->date_last_gen), 'day').'</td>';
927 } else {
928 if ($objp->dc > 0) {
929 print '<td class="right" width="80px">'.dol_print_date($db->jdate($objp->dc), 'day').'</td>';
930 } else {
931 print '<td class="right"><b>!!!</b></td>';
932 }
933 }
934 print '<td class="right nowraponall">';
935 print price($objp->total_ht);
936 print '</td>';
937
938 if (getDolGlobalString('MAIN_SHOW_PRICE_WITH_TAX_IN_SUMMARIES')) {
939 print '<td class="right nowraponall">';
940 print price($objp->total_ttc);
941 print '</td>';
942 }
943
944 print '<td class="nowrap right" style="min-width: 60px">';
945 print $langs->trans('FrequencyPer_'.$invoicetemplate->unit_frequency, $invoicetemplate->frequency).' - ';
946 print($invoicetemplate->LibStatut($invoicetemplate->frequency, $invoicetemplate->suspended, 5, 0));
947 print '</td>';
948 print "</tr>\n";
949 $i++;
950 }
951 $db->free($resql);
952
953 if ($num > 0) {
954 print "</table>";
955 print '</div>';
956 }
957 } else {
958 dol_print_error($db);
959 }
960 }
961
962
963 /*
964 * Latest supplier invoices
965 */
966
967 $langs->load('bills');
968 $facturestatic = new FactureFournisseur($db);
969
970 if ($user->hasRight('fournisseur', 'facture', 'lire')) {
971 // TODO move to DAO class
972 $sql = 'SELECT f.rowid, f.libelle as label, f.ref, f.ref_supplier, f.fk_statut, f.datef as df, f.total_ht, f.total_tva, f.total_ttc, f.paye,';
973 $sql .= ' SUM(pf.amount) as am';
974 $sql .= ' FROM '.MAIN_DB_PREFIX.'facture_fourn as f';
975 $sql .= ' LEFT JOIN '.MAIN_DB_PREFIX.'paiementfourn_facturefourn as pf ON f.rowid=pf.fk_facturefourn';
976 $sql .= ' WHERE f.fk_soc = '.((int) $object->id);
977 $sql .= " AND f.entity IN (".getEntity('facture_fourn').")";
978 $sql .= ' GROUP BY f.rowid,f.libelle,f.ref,f.ref_supplier,f.fk_statut,f.datef,f.total_ht,f.total_tva,f.total_ttc,f.paye';
979 $sql .= ' ORDER BY f.datef DESC';
980 $resql = $db->query($sql);
981 if ($resql) {
982 $i = 0;
983 $num = $db->num_rows($resql);
984 if ($num > 0) {
985 print '<div class="div-table-responsive-no-min">';
986 print '<table class="noborder centpercent lastrecordtable">';
987
988 print '<tr class="liste_titre">';
989 print '<td colspan="4">';
990 print '<table class="nobordernopadding" width="100%"><tr><td>'.$langs->trans('LastSuppliersBills', ($num <= $MAXLIST ? "" : $MAXLIST)).'</td>';
991 print '<td class="right"><a class="notasortlink" href="'.DOL_URL_ROOT.'/fourn/facture/list.php?socid='.$object->id.'"><span class="hideonsmartphone">'.$langs->trans('AllBills').'</span><span class="badge marginleftonlyshort">'.$num.'</span></td>';
992 print '<td width="20px" class="right"><a href="'.DOL_URL_ROOT.'/compta/facture/stats/index.php?mode=supplier&socid='.$object->id.'">'.img_picto($langs->trans("Statistics"), 'stats').'</a></td>';
993 print '</tr></table>';
994 print '</td></tr>';
995 }
996
997 while ($i < min($num, $MAXLIST)) {
998 $obj = $db->fetch_object($resql);
999
1000 $facturestatic->id = $obj->rowid;
1001 $facturestatic->ref = ($obj->ref ? $obj->ref : $obj->rowid);
1002 $facturestatic->ref_supplier = $obj->ref_supplier;
1003 $facturestatic->libelle = $obj->label; // deprecated
1004 $facturestatic->label = $obj->label;
1005 $facturestatic->total_ht = $obj->total_ht;
1006 $facturestatic->total_tva = $obj->total_tva;
1007 $facturestatic->total_ttc = $obj->total_ttc;
1008 $facturestatic->date = $db->jdate($obj->df);
1009
1010 print '<tr class="oddeven">';
1011 print '<td class="tdoverflowmax200">';
1012 print '<span class="nowraponall">'.$facturestatic->getNomUrl(1).'</span>';
1013 print $obj->ref_supplier ? ' - '.$obj->ref_supplier : '';
1014 print($obj->label ? ' - ' : '').dol_trunc($obj->label, 14);
1015 print '</td>';
1016 print '<td class="center nowrap">'.dol_print_date($facturestatic->date, 'day').'</td>';
1017 print '<td class="right nowrap"><span class="amount">'.price($facturestatic->total_ttc).'</span></td>';
1018 print '<td class="right nowrap">';
1019 print $facturestatic->LibStatut($obj->paye, $obj->fk_statut, 5, $obj->am);
1020 print '</td>';
1021 print '</tr>';
1022 $i++;
1023 }
1024 $db->free($resql);
1025 if ($num > 0) {
1026 print '</table></div>';
1027 }
1028 } else {
1029 dol_print_error($db);
1030 }
1031 }
1032
1033 // Allow external modules to add their own shortlist of recent objects
1034 $parameters = array();
1035 $reshook = $hookmanager->executeHooks('addMoreRecentObjects', $parameters, $object, $action);
1036 if ($reshook < 0) {
1037 setEventMessages($hookmanager->error, $hookmanager->errors, 'errors');
1038 } else {
1039 print $hookmanager->resPrint;
1040 }
1041
1042 print '</div></div>';
1043 print '<div class="clearboth"></div>';
1044
1045 print dol_get_fiche_end();
1046
1047
1048 /*
1049 * Action bar
1050 */
1051 print '<div class="tabsAction">';
1052
1053 $parameters = array();
1054 $reshook = $hookmanager->executeHooks('addMoreActionsButtons', $parameters, $object, $action); // Note that $action and $object may have been
1055 // modified by hook
1056 if (empty($reshook)) {
1057 if ($object->status != 1) {
1058 print dolGetButtonAction($langs->trans('ThirdPartyIsClosed'), $langs->trans('ThirdPartyIsClosed'), 'default', $_SERVER['PHP_SELF'].'#', '', false);
1059 }
1060
1061 if (isModEnabled('supplier_proposal') && $user->hasRight("supplier_proposal", "creer")) {
1062 $langs->load("supplier_proposal");
1063 if ($object->status == 1) {
1064 print dolGetButtonAction('', $langs->trans('AddSupplierProposal'), 'default', DOL_URL_ROOT.'/supplier_proposal/card.php?action=create&amp;socid='.$object->id, '');
1065 } else {
1066 print dolGetButtonAction($langs->trans('ThirdPartyIsClosed'), $langs->trans('AddSupplierProposal'), 'default', $_SERVER['PHP_SELF'].'#', '', false);
1067 }
1068 }
1069
1070 if ($user->hasRight('fournisseur', 'commande', 'creer') || $user->hasRight('supplier_order', 'creer')) {
1071 $langs->load("orders");
1072 if ($object->status == 1) {
1073 print dolGetButtonAction('', $langs->trans('AddSupplierOrderShort'), 'default', DOL_URL_ROOT.'/fourn/commande/card.php?action=create&amp;token='.newToken().'&amp;socid='.$object->id, '');
1074 } else {
1075 print dolGetButtonAction($langs->trans('ThirdPartyIsClosed'), $langs->trans('AddSupplierOrderShort'), 'default', $_SERVER['PHP_SELF'].'#', '', false);
1076 }
1077 }
1078
1079 if ($user->hasRight('fournisseur', 'facture', 'creer') || $user->hasRight('supplier_invoice', 'creer')) {
1080 if (!empty($orders2invoice) && $orders2invoice > 0) {
1081 if ($object->status == 1) {
1082 // Company is open
1083 print dolGetButtonAction('', $langs->trans('CreateInvoiceForThisSupplier'), 'default', DOL_URL_ROOT.'/fourn/commande/list.php?socid='.$object->id.'&amp;search_billed=0&amp;autoselectall=1', '');
1084 } else {
1085 print dolGetButtonAction('', $langs->trans('CreateInvoiceForThisCustomer'), 'default', $_SERVER['PHP_SELF'].'#', '', false);
1086 }
1087 } else {
1088 print dolGetButtonAction($langs->trans("NoOrdersToInvoice").' ('.$langs->trans("WithReceptionFinished").')', $langs->trans('CreateInvoiceForThisCustomer'), 'default', $_SERVER['PHP_SELF'].'#', '', false);
1089 }
1090 }
1091
1092 if ($user->hasRight('fournisseur', 'facture', 'creer') || $user->hasRight('supplier_invoice', 'creer')) {
1093 $langs->load("bills");
1094 if ($object->status == 1) {
1095 print dolGetButtonAction('', $langs->trans('AddBill'), 'default', DOL_URL_ROOT.'/fourn/facture/card.php?action=create&amp;socid='.$object->id, '');
1096 } else {
1097 print dolGetButtonAction($langs->trans('ThirdPartyIsClosed'), $langs->trans('AddBill'), 'default', $_SERVER['PHP_SELF'].'#', '', false);
1098 }
1099 }
1100
1101 // Add action
1102 if (isModEnabled('agenda') && getDolGlobalString('MAIN_REPEATTASKONEACHTAB') && $object->status == 1) {
1103 if ($user->hasRight("agenda", "myactions", "create")) {
1104 print dolGetButtonAction('', $langs->trans('AddAction'), 'default', DOL_URL_ROOT.'/comm/action/card.php?action=create&amp;socid='.$object->id, '');
1105 } else {
1106 print dolGetButtonAction($langs->trans('NotAllowed'), $langs->trans('AddAction'), 'default', $_SERVER['PHP_SELF'].'#', '', false);
1107 }
1108 }
1109 }
1110
1111 print '</div>';
1112
1113
1114 if (getDolGlobalString('MAIN_DUPLICATE_CONTACTS_TAB_ON_MAIN_CARD')) {
1115 print '<br>';
1116 // List of contacts
1117 show_contacts($conf, $langs, $db, $object, $_SERVER["PHP_SELF"].'?socid='.$object->id);
1118 }
1119
1120 if (getDolGlobalString('MAIN_REPEATTASKONEACHTAB')) {
1121 print load_fiche_titre($langs->trans("ActionsOnCompany"), '', '');
1122
1123 // List of todo actions
1124 show_actions_todo($conf, $langs, $db, $object);
1125
1126 // List of done actions
1127 show_actions_done($conf, $langs, $db, $object);
1128 }
1129} else {
1130 dol_print_error($db);
1131}
1132
1133// End of page
1134llxFooter();
1135$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
length_accountg($account)
Return General accounting account with defined length (used for product and miscellaneous)
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 accounting accounts.
Class to manage members of a foundation.
Class to manage predefined suppliers products.
const STATUS_RECEIVED_COMPLETELY
Received completely.
Class to manage contact/addresses.
Class to manage standard extra fields.
Class to manage suppliers invoices.
Class to manage invoice templates.
Class to manage generation of HTML components for accounting management.
Class to manage generation of HTML components Only common components must be here.
Class to manage suppliers.
Class to manage products or services.
Class to manage price ask supplier.
show_contacts($conf, $langs, $db, $object, $backtopage='', $showuserlogin=0)
Show html area for list of contacts.
show_actions_done($conf, $langs, $db, $filterobj, $objcon=null, $noprint=0, $actioncode='', $donetodo='done', $filters=array(), $sortfield='a.datep, a.id', $sortorder='DESC', $module='')
Show html area with actions (done or not, ignore the name of function).
societe_prepare_head(Societe $object)
Return array of tabs to used on pages for third parties cards.
show_actions_todo($conf, $langs, $db, $filterobj, $objcon=null, $noprint=0, $actioncode='')
Show html area with actions to do.
global $mysoc
setEventMessages($mesg, $mesgs, $style='mesgs', $messagekey='', $noduplicate=0, $attop=0)
Set event messages in dol_events session object.
showValueWithClipboardCPButton($valuetocopy, $showonlyonhover=1, $texttoshow='')
Create a button to copy $valuetocopy in the clipboard (for copy and paste feature).
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.
price2num($amount, $rounding='', $option=0)
Function that return a number with universal decimal format (decimal separator is '.
dol_get_fiche_end($notab=0)
Return tab footer of a card.
dol_eval($s, $returnvalue=1, $hideerrors=1, $onlysimplestring='1')
Replace eval function to add more security.
price($amount, $form=0, $outlangs='', $trunc=1, $rounding=-1, $forcerounding=-1, $currency_code='')
Function to format a value into an amount for visual output Function used into PDF and HTML pages.
getDolGlobalInt($key, $default=0)
Return a Dolibarr global constant int value.
newToken()
Return the value of token currently saved into session with name 'newtoken'.
dolGetButtonAction($label, $text='', $actionType='default', $url='', $id='', $userRight=1, $params=array())
Function dolGetButtonAction.
dol_htmlentities($string, $flags=ENT_QUOTES|ENT_SUBSTITUTE, $encoding='UTF-8', $double_encode=false)
Replace htmlentities functions.
yn($yesno, $format=1, $color=0)
Return yes or no in current language.
GETPOST($paramname, $check='alphanohtml', $method=0, $filter=null, $options=null, $noreplace=0)
Return value of a param into GET or POST supervariable.
dol_clone($srcobject, $native=2)
Create a clone of instance of object (new instance with same value for each properties) With native =...
dol_print_date($time, $format='', $tzoutput='auto', $outputlangs=null, $encodetooutput=false, $decorate=0)
Output date in a string format according to outputlangs (or langs if not defined).
dol_print_error($db=null, $error='', $errors=null)
Displays error message system with all the information to facilitate the diagnosis and the escalation...
load_fiche_titre($title, $morehtmlright='', $picto='generic', $pictoisfullpath=0, $id='', $morecssontable='', $morehtmlcenter='', $morecssonpicto='widthpictotitle')
Load a title with picto.
dol_trunc($string, $size=40, $trunc='right', $stringencoding='UTF-8', $nodot=0, $display=0)
Truncate a string to a particular length adding '…' if string larger than length.
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.
dol_escape_htmltag($stringtoescape, $keepb=0, $keepn=0, $noescapetags='', $escapeonlyhtmltags=0, $cleanalsojavascript=0)
Returns text escaped for inclusion in HTML alt or title or value tags, or into values of HTML input f...
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.
accessforbidden($message='', $printheader=1, $printfooter=1, $showonlymessage=0, $params=null)
Show a message to say access is forbidden and stop program.