dolibarr 20.0.2
list.php
Go to the documentation of this file.
1<?php
2/* Copyright (C) 2013-2014 Olivier Geffroy <jeff@jeffinfo.com>
3 * Copyright (C) 2013-2024 Alexandre Spangaro <alexandre@inovea-conseil.com>
4 * Copyright (C) 2014-2015 Ari Elbaz (elarifr) <github@accedinfo.com>
5 * Copyright (C) 2013-2021 Florian Henry <florian.henry@open-concept.pro>
6 * Copyright (C) 2021 Gauthier VERDOL <gauthier.verdol@atm-consulting.fr>
7 * Copyright (C) 2014 Juanjo Menent <jmenent@2byte.es>s
8 * Copyright (C) 2016 Laurent Destailleur <eldy@users.sourceforge.net>
9 *
10 * This program is free software; you can redistribute it and/or modify
11 * it under the terms of the GNU General Public License as published by
12 * the Free Software Foundation; either version 3 of the License, or
13 * (at your option) any later version.
14 *
15 * This program is distributed in the hope that it will be useful,
16 * but WITHOUT ANY WARRANTY; without even the implied warranty of
17 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
18 * GNU General Public License for more details.
19 *
20 * You should have received a copy of the GNU General Public License
21 * along with this program. If not, see <https://www.gnu.org/licenses/>.
22 */
23
29require '../../main.inc.php';
30
31require_once DOL_DOCUMENT_ROOT.'/core/class/html.formaccounting.class.php';
32require_once DOL_DOCUMENT_ROOT.'/core/class/html.formother.class.php';
33require_once DOL_DOCUMENT_ROOT.'/core/class/html.formcompany.class.php';
34require_once DOL_DOCUMENT_ROOT.'/product/class/product.class.php';
35require_once DOL_DOCUMENT_ROOT.'/fourn/class/fournisseur.facture.class.php';
36require_once DOL_DOCUMENT_ROOT.'/fourn/class/fournisseur.product.class.php';
37require_once DOL_DOCUMENT_ROOT.'/accountancy/class/accountingaccount.class.php';
38require_once DOL_DOCUMENT_ROOT.'/core/lib/accounting.lib.php';
39require_once DOL_DOCUMENT_ROOT.'/core/lib/date.lib.php';
40require_once DOL_DOCUMENT_ROOT.'/core/lib/company.lib.php';
41
42// Load translation files required by the page
43$langs->loadLangs(array("bills", "companies", "compta", "accountancy", "other", "productbatch", "products"));
44
45$action = GETPOST('action', 'aZ09');
46$massaction = GETPOST('massaction', 'alpha');
47$confirm = GETPOST('confirm', 'alpha');
48$toselect = GETPOST('toselect', 'array');
49$contextpage = GETPOST('contextpage', 'aZ') ? GETPOST('contextpage', 'aZ') : 'accountancysupplierlist'; // To manage different context of search
50$optioncss = GETPOST('optioncss', 'alpha');
51
52$default_account = GETPOSTINT('default_account');
53
54// Select Box
55$mesCasesCochees = GETPOST('toselect', 'array');
56
57// Search Getpost
58$search_lineid = GETPOST('search_lineid', 'alpha'); // Can be '> 100'
59$search_societe = GETPOST('search_societe', 'alpha');
60$search_ref = GETPOST('search_ref', 'alpha');
61$search_ref_supplier = GETPOST('search_ref_supplier', 'alpha');
62$search_invoice = GETPOST('search_invoice', 'alpha');
63$search_label = GETPOST('search_label', 'alpha');
64$search_desc = GETPOST('search_desc', 'alpha');
65$search_amount = GETPOST('search_amount', 'alpha');
66$search_account = GETPOST('search_account', 'alpha');
67$search_vat = GETPOST('search_vat', 'alpha');
68$search_date_startday = GETPOSTINT('search_date_startday');
69$search_date_startmonth = GETPOSTINT('search_date_startmonth');
70$search_date_startyear = GETPOSTINT('search_date_startyear');
71$search_date_endday = GETPOSTINT('search_date_endday');
72$search_date_endmonth = GETPOSTINT('search_date_endmonth');
73$search_date_endyear = GETPOSTINT('search_date_endyear');
74$search_date_start = dol_mktime(0, 0, 0, $search_date_startmonth, $search_date_startday, $search_date_startyear); // Use tzserver
75$search_date_end = dol_mktime(23, 59, 59, $search_date_endmonth, $search_date_endday, $search_date_endyear);
76$search_country = GETPOST('search_country', 'aZ09');
77$search_tvaintra = GETPOST('search_tvaintra', 'alpha');
78
79// Load variable for pagination
80$limit = GETPOSTINT('limit') ? GETPOSTINT('limit') : getDolGlobalString('ACCOUNTING_LIMIT_LIST_VENTILATION', $conf->liste_limit);
81$sortfield = GETPOST('sortfield', 'aZ09comma');
82$sortorder = GETPOST('sortorder', 'aZ09comma');
83$page = GETPOSTISSET('pageplusone') ? (GETPOSTINT('pageplusone') - 1) : GETPOSTINT("page");
84if (empty($page) || $page < 0) {
85 $page = 0;
86}
87$offset = $limit * $page;
88$pageprev = $page - 1;
89$pagenext = $page + 1;
90if (!$sortfield) {
91 $sortfield = "f.datef, f.ref, l.rowid";
92}
93if (!$sortorder) {
94 if (getDolGlobalInt('ACCOUNTING_LIST_SORT_VENTILATION_TODO') > 0) {
95 $sortorder = "DESC";
96 } else {
97 $sortorder = "ASC";
98 }
99}
100
101// Initialize technical object to manage hooks of page. Note that conf->hooks_modules contains array of hook context
102$hookmanager->initHooks(array('accountancysupplierlist'));
103
104$formaccounting = new FormAccounting($db);
105$accountingAccount = new AccountingAccount($db);
106
107$chartaccountcode = dol_getIdFromCode($db, getDolGlobalInt('CHARTOFACCOUNTS'), 'accounting_system', 'rowid', 'pcg_version');
108
109// Security check
110if (!isModEnabled('accounting')) {
112}
113if ($user->socid > 0) {
115}
116if (!$user->hasRight('accounting', 'bind', 'write')) {
118}
119
120// Define begin binding date
121if (empty($search_date_start) && getDolGlobalString('ACCOUNTING_DATE_START_BINDING')) {
122 $search_date_start = $db->idate(getDolGlobalString('ACCOUNTING_DATE_START_BINDING'));
123}
124
125
126/*
127 * Actions
128 */
129
130if (GETPOST('cancel', 'alpha')) {
131 $action = 'list';
132 $massaction = '';
133}
134if (!GETPOST('confirmmassaction', 'alpha') && $massaction != 'presend' && $massaction != 'confirm_presend') {
135 $massaction = '';
136}
137
138$parameters = array();
139$reshook = $hookmanager->executeHooks('doActions', $parameters, $object, $action); // Note that $action and $object may have been modified by some hooks
140if ($reshook < 0) {
141 setEventMessages($hookmanager->error, $hookmanager->errors, 'errors');
142}
143
144if (empty($reshook)) {
145 // Purge search criteria
146 if (GETPOST('button_removefilter_x', 'alpha') || GETPOST('button_removefilter.x', 'alpha') || GETPOST('button_removefilter', 'alpha')) { // All test are required to be compatible with all browsers
147 $search_societe = '';
148 $search_lineid = '';
149 $search_ref = '';
150 $search_ref_supplier = '';
151 $search_invoice = '';
152 $search_label = '';
153 $search_desc = '';
154 $search_amount = '';
155 $search_account = '';
156 $search_vat = '';
157 $search_date_startday = '';
158 $search_date_startmonth = '';
159 $search_date_startyear = '';
160 $search_date_endday = '';
161 $search_date_endmonth = '';
162 $search_date_endyear = '';
163 $search_date_start = '';
164 $search_date_end = '';
165 $search_country = '';
166 $search_tvaintra = '';
167 }
168
169 // Mass actions
170 $objectclass = 'AccountingAccount';
171 $permissiontoread = $user->hasRight('accounting', 'read');
172 $permissiontodelete = $user->hasRight('accounting', 'delete');
173 $uploaddir = $conf->accounting->dir_output;
174 include DOL_DOCUMENT_ROOT.'/core/actions_massactions.inc.php';
175}
176
177
178if ($massaction == 'ventil' && $user->hasRight('accounting', 'bind', 'write')) {
179 $msg = '';
180
181 if (!empty($mesCasesCochees)) {
182 $msg = '<div>'.$langs->trans("SelectedLines").': '.count($mesCasesCochees).'</div>';
183 $msg .= '<div class="detail">';
184 $cpt = 0;
185 $ok = 0;
186 $ko = 0;
187
188 foreach ($mesCasesCochees as $maLigneCochee) {
189 $maLigneCourante = explode("_", $maLigneCochee);
190 $monId = $maLigneCourante[0];
191 $monCompte = GETPOST('codeventil'.$monId);
192
193 if ($monCompte <= 0) {
194 $msg .= '<div><span class="error">'.$langs->trans("Lineofinvoice").' '.$monId.' - '.$langs->trans("NoAccountSelected").'</span></div>';
195 $ko++;
196 } else {
197 $sql = " UPDATE ".MAIN_DB_PREFIX."facture_fourn_det";
198 $sql .= " SET fk_code_ventilation = ".((int) $monCompte);
199 $sql .= " WHERE rowid = ".((int) $monId);
200
201 $accountventilated = new AccountingAccount($db);
202 $accountventilated->fetch($monCompte, '', 1);
203
204 dol_syslog('accountancy/supplier/list.php', LOG_DEBUG);
205 if ($db->query($sql)) {
206 $msg .= '<div><span class="green">'.$langs->trans("Lineofinvoice").' '.$monId.' - '.$langs->trans("VentilatedinAccount").' : '.length_accountg($accountventilated->account_number).'</span></div>';
207 $ok++;
208 } else {
209 $msg .= '<div><span class="error">'.$langs->trans("ErrorDB").' : '.$langs->trans("Lineofinvoice").' '.$monId.' - '.$langs->trans("NotVentilatedinAccount").' : '.length_accountg($accountventilated->account_number).'<br> <pre>'.$sql.'</pre></span></div>';
210 $ko++;
211 }
212 }
213
214 $cpt++;
215 }
216 $msg .= '</div>';
217 $msg .= '<div>'.$langs->trans("EndProcessing").'</div>';
218 }
219}
220
221if (GETPOST('sortfield') == 'f.datef, f.ref, l.rowid') {
222 $value = (GETPOST('sortorder') == 'asc,asc,asc' ? 0 : 1);
223 require_once DOL_DOCUMENT_ROOT.'/core/lib/admin.lib.php';
224 $res = dolibarr_set_const($db, "ACCOUNTING_LIST_SORT_VENTILATION_TODO", $value, 'yesno', 0, '', $conf->entity);
225}
226
227
228/*
229 * View
230 */
231
232$form = new Form($db);
233$formother = new FormOther($db);
234
235$help_url = 'EN:Module_Double_Entry_Accounting|FR:Module_Comptabilit&eacute;_en_Partie_Double#Liaisons_comptables';
236
237llxHeader('', $langs->trans("SuppliersVentilation"), $help_url, '', 0, 0, '', '', '', 'bodyforlist mod-accountancy accountancy-supplier page-list');
238
239if (empty($chartaccountcode)) {
240 print $langs->trans("ErrorChartOfAccountSystemNotSelected");
241 // End of page
242 llxFooter();
243 $db->close();
244 exit;
245}
246
247// Supplier Invoice Lines
248$sql = "SELECT f.rowid as facid, f.ref, f.ref_supplier, f.libelle as invoice_label, f.datef, f.type as ftype, f.fk_facture_source,";
249$sql .= " l.rowid, l.fk_product, l.description, l.total_ht, l.fk_code_ventilation, l.product_type as type_l, l.tva_tx as tva_tx_line, l.vat_src_code,";
250$sql .= " p.rowid as product_id, p.ref as product_ref, p.label as product_label, p.fk_product_type as type, p.tva_tx as tva_tx_prod,";
251if (getDolGlobalString('MAIN_PRODUCT_PERENTITY_SHARED')) {
252 $sql .= " ppe.accountancy_code_sell as code_sell, ppe.accountancy_code_sell_intra as code_sell_intra, ppe.accountancy_code_sell_export as code_sell_export,";
253 $sql .= " ppe.accountancy_code_buy as code_buy, ppe.accountancy_code_buy_intra as code_buy_intra, ppe.accountancy_code_buy_export as code_buy_export,";
254} else {
255 $sql .= " p.accountancy_code_sell as code_sell, p.accountancy_code_sell_intra as code_sell_intra, p.accountancy_code_sell_export as code_sell_export,";
256 $sql .= " p.accountancy_code_buy as code_buy, p.accountancy_code_buy_intra as code_buy_intra, p.accountancy_code_buy_export as code_buy_export,";
257}
258$sql .= " p.tosell as status, p.tobuy as status_buy,";
259$sql .= " aa.rowid as aarowid, aa2.rowid as aarowid_intra, aa3.rowid as aarowid_export, aa4.rowid as aarowid_thirdparty,";
260$sql .= " co.code as country_code, co.label as country_label,";
261$sql .= " s.rowid as socid, s.nom as name, s.tva_intra, s.email, s.town, s.zip, s.fk_pays, s.client, s.fournisseur, s.code_client, s.code_fournisseur,";
262if (getDolGlobalString('MAIN_COMPANY_PERENTITY_SHARED')) {
263 $sql .= " spe.accountancy_code_customer as code_compta_client,";
264 $sql .= " spe.accountancy_code_supplier as code_compta_fournisseur,";
265 $sql .= " spe.accountancy_code_buy as company_code_buy";
266} else {
267 $sql .= " s.code_compta as code_compta_client,";
268 $sql .= " s.code_compta_fournisseur,";
269 $sql .= " s.accountancy_code_buy as company_code_buy";
270}
271$parameters = array();
272$reshook = $hookmanager->executeHooks('printFieldListSelect', $parameters); // Note that $action and $object may have been modified by hook
273$sql .= $hookmanager->resPrint;
274$sql .= " FROM ".MAIN_DB_PREFIX."facture_fourn as f";
275$sql .= " INNER JOIN ".MAIN_DB_PREFIX."societe as s ON s.rowid = f.fk_soc";
276if (getDolGlobalString('MAIN_COMPANY_PERENTITY_SHARED')) {
277 $sql .= " LEFT JOIN " . MAIN_DB_PREFIX . "societe_perentity as spe ON spe.fk_soc = s.rowid AND spe.entity = " . ((int) $conf->entity);
278}
279$sql .= " LEFT JOIN ".MAIN_DB_PREFIX."c_country as co ON co.rowid = s.fk_pays ";
280$sql .= " INNER JOIN ".MAIN_DB_PREFIX."facture_fourn_det as l ON f.rowid = l.fk_facture_fourn";
281$sql .= " LEFT JOIN ".MAIN_DB_PREFIX."product as p ON p.rowid = l.fk_product";
282if (getDolGlobalString('MAIN_PRODUCT_PERENTITY_SHARED')) {
283 $sql .= " LEFT JOIN " . MAIN_DB_PREFIX . "product_perentity as ppe ON ppe.fk_product = p.rowid AND ppe.entity = " . ((int) $conf->entity);
284}
285$alias_societe_perentity = !getDolGlobalString('MAIN_COMPANY_PERENTITY_SHARED') ? "s" : "spe";
286$alias_product_perentity = !getDolGlobalString('MAIN_PRODUCT_PERENTITY_SHARED') ? "p" : "ppe";
287$sql .= " LEFT JOIN ".MAIN_DB_PREFIX."accounting_account as aa ON " . $alias_product_perentity . ".accountancy_code_buy = aa.account_number AND aa.active = 1 AND aa.fk_pcg_version = '".$db->escape($chartaccountcode)."' AND aa.entity = ".$conf->entity;
288$sql .= " LEFT JOIN ".MAIN_DB_PREFIX."accounting_account as aa2 ON " . $alias_product_perentity . ".accountancy_code_buy_intra = aa2.account_number AND aa2.active = 1 AND aa2.fk_pcg_version = '".$db->escape($chartaccountcode)."' AND aa2.entity = ".$conf->entity;
289$sql .= " LEFT JOIN ".MAIN_DB_PREFIX."accounting_account as aa3 ON " . $alias_product_perentity . ".accountancy_code_buy_export = aa3.account_number AND aa3.active = 1 AND aa3.fk_pcg_version = '".$db->escape($chartaccountcode)."' AND aa3.entity = ".$conf->entity;
290$sql .= " LEFT JOIN ".MAIN_DB_PREFIX."accounting_account as aa4 ON " . $alias_societe_perentity . ".accountancy_code_buy = aa4.account_number AND aa4.active = 1 AND aa4.fk_pcg_version = '".$db->escape($chartaccountcode)."' AND aa4.entity = ".$conf->entity;
291$sql .= " WHERE f.fk_statut > 0 AND l.fk_code_ventilation <= 0";
292$sql .= " AND l.product_type <= 2";
293// Add search filter like
294if (strlen($search_lineid)) {
295 $sql .= natural_search("l.rowid", $search_lineid, 1);
296}
297if (strlen($search_societe)) {
298 $sql .= natural_search('s.nom', $search_societe);
299}
300if (strlen(trim($search_invoice))) {
301 $sql .= natural_search(array("f.ref", "f.ref_supplier"), $search_invoice);
302}
303if (strlen(trim($search_ref))) {
304 $sql .= natural_search("p.ref", $search_ref);
305}
306/*if (strlen(trim($search_ref_supplier))) {
307 $sql .= natural_search("f.ref_supplier", $search_ref_supplier);
308}*/
309if (strlen(trim($search_label))) {
310 $sql .= natural_search(array("p.label", "f.libelle"), $search_label);
311}
312if (strlen(trim($search_desc))) {
313 $sql .= natural_search("l.description", $search_desc);
314}
315if (strlen(trim($search_amount))) {
316 $sql .= natural_search("l.total_ht", $search_amount, 1);
317}
318if (strlen(trim($search_account))) {
319 $sql .= natural_search("aa.account_number", $search_account);
320}
321if (strlen(trim($search_vat))) {
322 $sql .= natural_search("l.tva_tx", price2num($search_vat), 1);
323}
324if ($search_date_start) {
325 $sql .= " AND f.datef >= '".$db->idate($search_date_start)."'";
326}
327if ($search_date_end) {
328 $sql .= " AND f.datef <= '".$db->idate($search_date_end)."'";
329}
330if (strlen(trim($search_country))) {
331 $arrayofcode = getCountriesInEEC();
332 $country_code_in_EEC = $country_code_in_EEC_without_me = '';
333 foreach ($arrayofcode as $key => $value) {
334 $country_code_in_EEC .= ($country_code_in_EEC ? "," : "")."'".$value."'";
335 if ($value != $mysoc->country_code) {
336 $country_code_in_EEC_without_me .= ($country_code_in_EEC_without_me ? "," : "")."'".$value."'";
337 }
338 }
339 if ($search_country == 'special_allnotme') {
340 $sql .= " AND co.code <> '".$db->escape($mysoc->country_code)."'";
341 } elseif ($search_country == 'special_eec') {
342 $sql .= " AND co.code IN (".$db->sanitize($country_code_in_EEC, 1).")";
343 } elseif ($search_country == 'special_eecnotme') {
344 $sql .= " AND co.code IN (".$db->sanitize($country_code_in_EEC_without_me, 1).")";
345 } elseif ($search_country == 'special_noteec') {
346 $sql .= " AND co.code NOT IN (".$db->sanitize($country_code_in_EEC, 1).")";
347 } else {
348 $sql .= natural_search("co.code", $search_country);
349 }
350}
351if (strlen(trim($search_tvaintra))) {
352 $sql .= natural_search("s.tva_intra", $search_tvaintra);
353}
354if (getDolGlobalString('FACTURE_SUPPLIER_DEPOSITS_ARE_JUST_PAYMENTS')) {
355 $sql .= " AND f.type IN (".FactureFournisseur::TYPE_STANDARD.",".FactureFournisseur::TYPE_REPLACEMENT.",".FactureFournisseur::TYPE_CREDIT_NOTE.",".FactureFournisseur::TYPE_SITUATION.")";
356} else {
358}
359$sql .= " AND f.entity IN (".getEntity('facture_fourn', 0).")"; // We don't share object for accountancy
360
361// Add where from hooks
362$parameters = array();
363$reshook = $hookmanager->executeHooks('printFieldListWhere', $parameters); // Note that $action and $object may have been modified by hook
364$sql .= $hookmanager->resPrint;
365
366$sql .= $db->order($sortfield, $sortorder);
367
368// Count total nb of records
369$nbtotalofrecords = '';
370if (!getDolGlobalInt('MAIN_DISABLE_FULL_SCANLIST')) {
371 $result = $db->query($sql);
372 $nbtotalofrecords = $db->num_rows($result);
373 if (($page * $limit) > $nbtotalofrecords) { // if total resultset is smaller then paging size (filtering), goto and load page 0
374 $page = 0;
375 $offset = 0;
376 }
377}
378
379$sql .= $db->plimit($limit + 1, $offset);
380
381dol_syslog('accountancy/supplier/list.php', LOG_DEBUG);
382// MAX_JOIN_SIZE can be very low (ex: 300000) on some limited configurations (ex: https://www.online.net/fr/hosting/online-perso)
383// This big SELECT command may exceed the MAX_JOIN_SIZE limit => Therefore we use SQL_BIG_SELECTS=1 to disable the MAX_JOIN_SIZE security
384if ($db->type == 'mysqli') {
385 $db->query("SET SQL_BIG_SELECTS=1");
386}
387
388$result = $db->query($sql);
389if ($result) {
390 $num_lines = $db->num_rows($result);
391 $i = 0;
392
393 $arrayofselected = is_array($toselect) ? $toselect : array();
394
395 $param = '';
396 if (!empty($contextpage) && $contextpage != $_SERVER["PHP_SELF"]) {
397 $param .= '&contextpage='.urlencode($contextpage);
398 }
399 if ($limit > 0 && $limit != $conf->liste_limit) {
400 $param .= '&limit='.((int) $limit);
401 }
402 if ($search_lineid) {
403 $param .= '&search_lineid='.urlencode((string) ($search_lineid));
404 }
405 if ($search_societe) {
406 $param .= '&search_societe='.urlencode($search_societe);
407 }
408 if ($search_date_startday) {
409 $param .= '&search_date_startday='.urlencode((string) ($search_date_startday));
410 }
411 if ($search_date_startmonth) {
412 $param .= '&search_date_startmonth='.urlencode((string) ($search_date_startmonth));
413 }
414 if ($search_date_startyear) {
415 $param .= '&search_date_startyear='.urlencode((string) ($search_date_startyear));
416 }
417 if ($search_date_endday) {
418 $param .= '&search_date_endday='.urlencode((string) ($search_date_endday));
419 }
420 if ($search_date_endmonth) {
421 $param .= '&search_date_endmonth='.urlencode((string) ($search_date_endmonth));
422 }
423 if ($search_date_endyear) {
424 $param .= '&search_date_endyear='.urlencode((string) ($search_date_endyear));
425 }
426 if ($search_invoice) {
427 $param .= '&search_invoice='.urlencode($search_invoice);
428 }
429 if ($search_ref) {
430 $param .= '&search_ref='.urlencode($search_ref);
431 }
432 if ($search_ref_supplier) {
433 $param .= '&search_ref_supplier='.urlencode($search_ref_supplier);
434 }
435 if ($search_label) {
436 $param .= '&search_label='.urlencode($search_label);
437 }
438 if ($search_desc) {
439 $param .= '&search_desc='.urlencode($search_desc);
440 }
441 if ($search_amount) {
442 $param .= '&search_amount='.urlencode($search_amount);
443 }
444 if ($search_vat) {
445 $param .= '&search_vat='.urlencode($search_vat);
446 }
447 if ($search_country) {
448 $param .= "&search_country=".urlencode($search_country);
449 }
450 if ($search_tvaintra) {
451 $param .= "&search_tvaintra=".urlencode($search_tvaintra);
452 }
453
454 $arrayofmassactions = array(
455 'set_default_account' => img_picto('', 'check', 'class="pictofixedwidth"').$langs->trans("ConfirmPreselectAccount"),
456 'ventil' => img_picto('', 'check', 'class="pictofixedwidth"').$langs->trans("Ventilate")
457 //'presend'=>img_picto('', 'email', 'class="pictofixedwidth"').$langs->trans("SendByMail"),
458 //'builddoc'=>img_picto('', 'pdf', 'class="pictofixedwidth"').$langs->trans("PDFMerge"),
459 );
460 //if ($user->hasRight('mymodule', 'supprimer')) $arrayofmassactions['predelete'] = img_picto('', 'delete', 'class="pictofixedwidth"').$langs->trans("Delete");
461 //if (in_array($massaction, array('presend','predelete'))) $arrayofmassactions=array();
462 $massactionbutton = '';
463 if ($massaction !== 'set_default_account') {
464 $massactionbutton = $form->selectMassAction('ventil', $arrayofmassactions, 1);
465 }
466
467 print '<form action="'.$_SERVER["PHP_SELF"].'" method="post">'."\n";
468 print '<input type="hidden" name="action" value="ventil">';
469 if ($optioncss != '') {
470 print '<input type="hidden" name="optioncss" value="'.$optioncss.'">';
471 }
472 print '<input type="hidden" name="token" value="'.newToken().'">';
473 print '<input type="hidden" name="formfilteraction" id="formfilteraction" value="list">';
474 print '<input type="hidden" name="sortfield" value="'.$sortfield.'">';
475 print '<input type="hidden" name="sortorder" value="'.$sortorder.'">';
476 print '<input type="hidden" name="page" value="'.$page.'">';
477
478 // @phan-suppress-next-line PhanPluginSuspiciousParamOrder
479 print_barre_liste($langs->trans("InvoiceLines"), $page, $_SERVER["PHP_SELF"], $param, $sortfield, $sortorder, $massactionbutton, $num_lines, $nbtotalofrecords, 'title_accountancy', 0, '', '', $limit);
480
481 if ($massaction == 'set_default_account') {
482 $formquestion = array();
483 $formquestion[] = array('type' => 'other',
484 'name' => 'set_default_account',
485 'label' => $langs->trans("AccountancyCode"),
486 'value' => $formaccounting->select_account('', 'default_account', 1, array(), 0, 0, 'maxwidth200 maxwidthonsmartphone', 'cachewithshowemptyone'));
487 print $form->formconfirm($_SERVER["PHP_SELF"], $langs->trans("ConfirmPreselectAccount"), $langs->trans("ConfirmPreselectAccountQuestion", count($toselect)), "confirm_set_default_account", $formquestion, 1, 0, 200, 500, 1);
488 }
489
490 print '<span class="opacitymedium">'.$langs->trans("DescVentilTodoCustomer").'</span></br><br>';
491
492 if (!empty($msg)) {
493 print $msg.'<br>';
494 }
495
496 $moreforfilter = '';
497
498 print '<div class="div-table-responsive">';
499 print '<table class="tagtable liste'.($moreforfilter ? " listwithfilterbefore" : "").'">'."\n";
500
501 // We add search filter
502 print '<tr class="liste_titre_filter">';
503 print '<td class="liste_titre"><input type="text" class="flat maxwidth25" name="search_lineid" value="'.dol_escape_htmltag($search_lineid).'"></td>';
504 print '<td class="liste_titre"><input type="text" class="flat maxwidth50" name="search_invoice" value="'.dol_escape_htmltag($search_invoice).'"></td>';
505 //print '<td class="liste_titre"><input type="text" class="flat maxwidth50" name="search_ref_supplier" value="'.dol_escape_htmltag($search_ref_supplier).'"></td>';
506 print '<td class="liste_titre"><input type="text" class="flat maxwidth50" name="search_label" value="'.dol_escape_htmltag($search_label).'"></td>';
507 print '<td class="liste_titre center">';
508 print '<div class="nowrapfordate">';
509 print $form->selectDate($search_date_start ? $search_date_start : -1, 'search_date_start', 0, 0, 1, '', 1, 0, 0, '', '', '', '', 1, '', $langs->trans('From'));
510 print '</div>';
511 print '<div class="nowrapfordate">';
512 print $form->selectDate($search_date_end ? $search_date_end : -1, 'search_date_end', 0, 0, 1, '', 1, 0, 0, '', '', '', '', 1, '', $langs->trans('to'));
513 print '</div>';
514 print '</td>';
515 print '<td class="liste_titre"><input type="text" class="flat maxwidth50" name="search_ref" value="'.dol_escape_htmltag($search_ref).'"></td>';
516 print '<td class="liste_titre"><input type="text" class="flat maxwidth100" name="search_desc" value="'.dol_escape_htmltag($search_desc).'"></td>';
517 print '<td class="liste_titre right"><input type="text" class="flat maxwidth50 right" name="search_amount" value="'.dol_escape_htmltag($search_amount).'"></td>';
518 print '<td class="liste_titre right"><input type="text" class="flat maxwidth50 right" name="search_vat" placeholder="%" size="1" value="'.dol_escape_htmltag($search_vat).'"></td>';
519 print '<td class="liste_titre"><input type="text" class="flat maxwidth75imp" name="search_societe" value="'.dol_escape_htmltag($search_societe).'"></td>';
520 print '<td class="liste_titre">';
521 print $form->select_country($search_country, 'search_country', '', 0, 'maxwidth100', 'code2', 1, 0, 1);
522 //print '<input type="text" class="flat maxwidth50" name="search_country" value="' . dol_escape_htmltag($search_country) . '">';
523 print '</td>';
524 print '<td class="liste_titre"><input type="text" class="flat maxwidth50" name="search_tvaintra" value="'.dol_escape_htmltag($search_tvaintra).'"></td>';
525 print '<td class="liste_titre"></td>';
526 print '<td class="liste_titre"></td>';
527 print '<td class="center liste_titre">';
528 $searchpicto = $form->showFilterButtons();
529 print $searchpicto;
530 print '</td>';
531 print "</tr>\n";
532
533 print '<tr class="liste_titre">';
534 print_liste_field_titre("LineId", $_SERVER["PHP_SELF"], "l.rowid", "", $param, '', $sortfield, $sortorder);
535 print_liste_field_titre("Invoice", $_SERVER["PHP_SELF"], "f.ref", "", $param, '', $sortfield, $sortorder);
536 //print_liste_field_titre("RefSupplier", $_SERVER["PHP_SELF"], "f.ref_supplier", "", $param, '', $sortfield, $sortorder);
537 print_liste_field_titre("InvoiceLabel", $_SERVER["PHP_SELF"], "f.libelle", "", $param, '', $sortfield, $sortorder);
538 print_liste_field_titre("Date", $_SERVER["PHP_SELF"], "f.datef, f.ref, l.rowid", "", $param, '', $sortfield, $sortorder, 'center ');
539 print_liste_field_titre("ProductRef", $_SERVER["PHP_SELF"], "p.ref", "", $param, '', $sortfield, $sortorder);
540 //print_liste_field_titre("ProductLabel", $_SERVER["PHP_SELF"], "p.label", "", $param, '', $sortfield, $sortorder);
541 print_liste_field_titre("ProductDescription", $_SERVER["PHP_SELF"], "l.description", "", $param, '', $sortfield, $sortorder);
542 print_liste_field_titre("Amount", $_SERVER["PHP_SELF"], "l.total_ht", "", $param, '', $sortfield, $sortorder, 'right maxwidth50 ');
543 print_liste_field_titre("VATRate", $_SERVER["PHP_SELF"], "l.tva_tx", "", $param, '', $sortfield, $sortorder, 'right ', '', 1);
544 print_liste_field_titre("ThirdParty", $_SERVER["PHP_SELF"], "s.nom", "", $param, '', $sortfield, $sortorder);
545 print_liste_field_titre("Country", $_SERVER["PHP_SELF"], "co.label", "", $param, '', $sortfield, $sortorder);
546 print_liste_field_titre("VATIntraShort", $_SERVER["PHP_SELF"], "s.tva_intra", "", $param, '', $sortfield, $sortorder);
547 print_liste_field_titre("DataUsedToSuggestAccount", '', '', '', '', '', '', '', 'nowraponall ');
548 print_liste_field_titre("AccountAccountingSuggest", '', '', '', '', '', '', '', 'center ');
549 $checkpicto = '';
550 if ($massactionbutton) {
551 $checkpicto = $form->showCheckAddButtons('checkforselect', 1);
552 }
553 print_liste_field_titre($checkpicto, '', '', '', '', '', '', '', 'center ');
554 print "</tr>\n";
555
556 $thirdpartystatic = new Societe($db);
557 $facturefourn_static = new FactureFournisseur($db);
558 $facturefourn_static_det = new SupplierInvoiceLine($db);
559 $product_static = new Product($db);
560
561
562 $accountingaccount_codetotid_cache = array();
563
564 while ($i < min($num_lines, $limit)) {
565 $objp = $db->fetch_object($result);
566
567 // product_type: 0 = service, 1 = product
568 // if product does not exist we use the value of product_type provided in facturedet to define if this is a product or service
569 // issue : if we change product_type value in product DB it should differ from the value stored in facturedet DB !
570 $code_buy_l = '';
571 $code_buy_p = '';
572 $code_buy_t = '';
573
574 $thirdpartystatic->id = $objp->socid;
575 $thirdpartystatic->name = $objp->name;
576 $thirdpartystatic->client = $objp->client;
577 $thirdpartystatic->fournisseur = $objp->fournisseur;
578 $thirdpartystatic->code_client = $objp->code_client;
579 $thirdpartystatic->code_compta_client = $objp->code_compta_client;
580 $thirdpartystatic->code_fournisseur = $objp->code_fournisseur;
581 $thirdpartystatic->code_compta_fournisseur = $objp->code_compta_fournisseur;
582 $thirdpartystatic->email = $objp->email;
583 $thirdpartystatic->country_code = $objp->country_code;
584 $thirdpartystatic->tva_intra = $objp->tva_intra;
585 $thirdpartystatic->code_compta_product = $objp->company_code_buy; // The accounting account for product stored on thirdparty object (for level3 suggestion)
586
587 $product_static->ref = $objp->product_ref;
588 $product_static->id = $objp->product_id;
589 $product_static->type = $objp->type;
590 $product_static->label = $objp->product_label;
591 $product_static->status = $objp->status;
592 $product_static->status_buy = $objp->status_buy;
593 $product_static->accountancy_code_sell = $objp->code_sell;
594 $product_static->accountancy_code_sell_intra = $objp->code_sell_intra;
595 $product_static->accountancy_code_sell_export = $objp->code_sell_export;
596 $product_static->accountancy_code_buy = $objp->code_buy;
597 $product_static->accountancy_code_buy_intra = $objp->code_buy_intra;
598 $product_static->accountancy_code_buy_export = $objp->code_buy_export;
599 $product_static->tva_tx = $objp->tva_tx_prod;
600
601 $facturefourn_static->ref = $objp->ref;
602 $facturefourn_static->id = $objp->facid;
603 $facturefourn_static->type = $objp->ftype;
604 $facturefourn_static->ref_supplier = $objp->ref_supplier;
605 $facturefourn_static->label = $objp->invoice_label;
606 $facturefourn_static->date = $db->jdate($objp->datef);
607 $facturefourn_static->fk_facture_source = $objp->fk_facture_source;
608
609 $facturefourn_static_det->id = $objp->rowid;
610 $facturefourn_static_det->total_ht = $objp->total_ht;
611 $facturefourn_static_det->tva_tx = $objp->tva_tx_line;
612 $facturefourn_static_det->vat_src_code = $objp->vat_src_code;
613 $facturefourn_static_det->product_type = $objp->type_l;
614 $facturefourn_static_det->desc = $objp->description;
615
616 $accountingAccountArray = array(
617 'dom' => $objp->aarowid,
618 'intra' => $objp->aarowid_intra,
619 'export' => $objp->aarowid_export,
620 'thirdparty' => $objp->aarowid_thirdparty);
621
622 $code_buy_p_notset = '';
623 $code_buy_t_notset = '';
624
625 $suggestedid = 0;
626
627 $return = $accountingAccount->getAccountingCodeToBind($mysoc, $thirdpartystatic, $product_static, $facturefourn_static, $facturefourn_static_det, $accountingAccountArray, 'supplier');
628 if (!is_array($return) && $return < 0) {
629 setEventMessage($accountingAccount->error, 'errors');
630 } else {
631 $suggestedid = $return['suggestedid'];
632 $suggestedaccountingaccountfor = $return['suggestedaccountingaccountfor'];
633 $suggestedaccountingaccountbydefaultfor = $return['suggestedaccountingaccountbydefaultfor'];
634 $code_buy_l = $return['code_l'];
635 $code_buy_p = $return['code_p'];
636 $code_buy_t = $return['code_t'];
637 }
638 //var_dump($return);
639
640 if (!empty($code_buy_p)) {
641 // Value was defined previously
642 } else {
643 $code_buy_p_notset = 'color:orange';
644 }
645 if (empty($code_buy_l) && empty($code_buy_p)) {
646 $code_buy_p_notset = 'color:red';
647 }
648 /*if ($suggestedaccountingaccountfor == 'eecwithoutvatnumber' && empty($code_sell_p_notset)) {
649 $code_sell_p_notset = 'color:orange';
650 }*/
651
652 // $code_buy_l is now default code of product/service
653 // $code_buy_p is now code of product/service
654 // $code_buy_t is now code of thirdparty
655 //var_dump($code_buy_l.' - '.$code_buy_p.' - '.$code_buy_t.' -> '.$suggestedid.' ('.$suggestedaccountingaccountbydefaultfor.' '.$suggestedaccountingaccountfor.')');
656
657 print '<tr class="oddeven">';
658
659 // Line id
660 print '<td>'.$facturefourn_static_det->id.'</td>';
661
662 // Ref Invoice
663 print '<td class="nowraponall">'.$facturefourn_static->getNomUrl(1);
664 if ($objp->ref_supplier) {
665 print '<br><span class="opacitymedium small">'.dol_escape_htmltag($objp->ref_supplier).'</span>';
666 }
667 print '</td>';
668
669 // Ref supplier invoice
670 /*print '<td class="tdoverflowmax100" title="'.dol_escape_htmltag($objp->ref_supplier).'">';
671 print $objp->ref_supplier;
672 print '</td>';*/
673
674 // Supplier invoice label
675 print '<td class="tdoverflowmax100 small" title="'.dol_escape_htmltag($objp->invoice_label).'">';
676 print dol_escape_htmltag($objp->invoice_label);
677 print '</td>';
678
679 // Date
680 print '<td class="center">'.dol_print_date($facturefourn_static->date, 'day').'</td>';
681
682 // Ref Product
683 print '<td class="tdoverflowmax100">';
684 if ($product_static->id > 0) {
685 print $product_static->getNomUrl(1);
686 }
687 if ($product_static->label) {
688 print '<br><span class="opacitymedium small">'.dol_escape_htmltag($product_static->label).'</span>';
689 }
690 print '</td>';
691
692 // Description of line
693 $text = dolGetFirstLineOfText(dol_string_nohtmltag($facturefourn_static_det->desc, 1));
694 print '<td class="tdoverflowmax150 small classfortooltip" title="'.dol_escape_htmltag($text).'">';
695 $trunclength = getDolGlobalInt('ACCOUNTING_LENGTH_DESCRIPTION');
696 print dol_trunc($text, $trunclength);
697 print '</td>';
698
699 print '<td class="right nowraponall amount">';
700 print price($objp->total_ht);
701 print '</td>';
702
703 // Vat rate
704 $code_vat_differ = '';
705 //if ($objp->vat_tx_l != $objp->vat_tx_p && price2num($objp->vat_tx_p) && price2num($objp->vat_tx_l)) { // Note: having a vat rate of 0 is often the normal case when sells is intra b2b or to export
706 // $code_vat_differ = 'warning bold';
707 //}
708 print '<td class="right'.($code_vat_differ ? ' '.$code_vat_differ : '').'">';
709 print vatrate($facturefourn_static_det->tva_tx.($facturefourn_static_det->vat_src_code ? ' ('.$facturefourn_static_det->vat_src_code.')' : ''), false, 0, 0, 1);
710 print '</td>';
711
712 // Thirdparty
713 print '<td class="tdoverflowmax100">'.$thirdpartystatic->getNomUrl(1, 'supplier').'</td>';
714
715 // Country
716 $labelcountry = ($objp->country_code && ($langs->trans("Country".$objp->country_code) != "Country".$objp->country_code)) ? $langs->trans("Country".$objp->country_code) : $objp->country_label;
717 print '<td class="tdoverflowmax100" title="'.dol_escape_htmltag($labelcountry).'">';
718 print dol_escape_htmltag($labelcountry);
719 print '</td>';
720
721 // VAT Num
722 print '<td class="tdoverflowmax80" title="'.dol_escape_htmltag($objp->tva_intra).'">'.dol_escape_htmltag($objp->tva_intra).'</td>';
723
724 // Found accounts
725 print '<td class="small">';
726 $s = '1. '.(($facturefourn_static_det->product_type == 1) ? $langs->trans("DefaultForService") : $langs->trans("DefaultForProduct")).': ';
727 $shelp = '';
728 $ttype = 'help';
729 if ($suggestedaccountingaccountbydefaultfor == 'eec') {
730 $shelp .= $langs->trans("SaleEEC");
731 } elseif ($suggestedaccountingaccountbydefaultfor == 'eecwithvat') {
732 $shelp = $langs->trans("SaleEECWithVAT");
733 } elseif ($suggestedaccountingaccountbydefaultfor == 'eecwithoutvatnumber') {
734 $shelp = $langs->trans("SaleEECWithoutVATNumber");
735 $ttype = 'warning';
736 } elseif ($suggestedaccountingaccountbydefaultfor == 'export') {
737 $shelp .= $langs->trans("SaleExport");
738 }
739 $s .= ($code_buy_l > 0 ? length_accountg($code_buy_l) : '<span style="'.$code_buy_p_notset.'">'.$langs->trans("NotDefined").'</span>');
740 print $form->textwithpicto($s, $shelp, 1, $ttype, '', 0, 2, '', 1);
741 if ($product_static->id > 0) {
742 print '<br>';
743 $s = '2. '.(($facturefourn_static_det->product_type == 1) ? $langs->trans("ThisService") : $langs->trans("ThisProduct")).': ';
744 $shelp = '';
745 $ttype = 'help';
746 if ($suggestedaccountingaccountfor == 'eec') {
747 $shelp = $langs->trans("SaleEEC");
748 } elseif ($suggestedaccountingaccountfor == 'eecwithvat') {
749 $shelp = $langs->trans("SaleEECWithVAT");
750 } elseif ($suggestedaccountingaccountfor == 'eecwithoutvatnumber') {
751 $shelp = $langs->trans("SaleEECWithoutVATNumber");
752 $ttype = 'warning';
753 } elseif ($suggestedaccountingaccountfor == 'export') {
754 $shelp = $langs->trans("SaleExport");
755 }
756 $s .= (empty($code_buy_p) ? '<span style="'.$code_buy_p_notset.'">'.$langs->trans("NotDefined").'</span>' : length_accountg($code_buy_p));
757 print $form->textwithpicto($s, $shelp, 1, $ttype, '', 0, 2, '', 1);
758 } else {
759 print '<br>';
760 $s = '2. '.(($objp->type_l == 1) ? $langs->trans("ThisService") : $langs->trans("ThisProduct")).': ';
761 $shelp = '';
762 $s .= $langs->trans("NotDefined");
763 print $form->textwithpicto($s, $shelp, 1, 'help', '', 0, 2, '', 1);
764 }
765 if (getDolGlobalString('ACCOUNTANCY_USE_PRODUCT_ACCOUNT_ON_THIRDPARTY')) {
766 print '<br>';
767 $s = '3. '.(($facturefourn_static_det->product_type == 1) ? $langs->trans("ServiceForThisThirdparty") : $langs->trans("ProductForThisThirdparty")).': ';
768 $shelp = '';
769 $s .= ($code_buy_t > 0 ? length_accountg($code_buy_t) : '<span style="'.$code_buy_t_notset.'">'.$langs->trans("NotDefined").'</span>');
770 print $form->textwithpicto($s, $shelp, 1, 'help', '', 0, 2, '', 1);
771 }
772 print '</td>';
773
774 // Suggested accounting account
775 print '<td>';
776 print $formaccounting->select_account(($default_account > 0 && $confirm === 'yes' && in_array($objp->rowid."_".$i, $toselect)) ? $default_account : $suggestedid, 'codeventil'.$facturefourn_static_det->id, 1, array(), 0, 0, 'codeventil maxwidth150 maxwidthonsmartphone', 'cachewithshowemptyone');
777 print '</td>';
778
779 // Column with checkbox
780 print '<td class="center">';
781 $ischecked = 0;
782 if (!empty($suggestedid) && $suggestedaccountingaccountfor != '' && $suggestedaccountingaccountfor != 'eecwithoutvatnumber') {
783 $ischecked = 1;
784 }
785
786 if (!empty($toselect)) {
787 $ischecked = 0;
788 if (in_array($objp->rowid."_".$i, $toselect)) {
789 $ischecked = 1;
790 }
791 }
792
793 print '<input type="checkbox" class="flat checkforselect checkforselect'.$facturefourn_static_det->id.'" name="toselect[]" value="'.$facturefourn_static_det->id."_".$i.'"'.($ischecked ? " checked" : "").'/>';
794 print '</td>';
795
796 print '</tr>';
797 $i++;
798 }
799 if ($num_lines == 0) {
800 print '<tr><td colspan="14"><span class="opacitymedium">'.$langs->trans("NoRecordFound").'</span></td></tr>';
801 }
802
803 print '</table>';
804 print "</div>";
805
806 print '</form>';
807} else {
808 print $db->error();
809}
810if ($db->type == 'mysqli') {
811 $db->query("SET SQL_BIG_SELECTS=0"); // Enable MAX_JOIN_SIZE limitation
812}
813
814// Add code to auto check the box when we select an account
815print '<script type="text/javascript">
816jQuery(document).ready(function() {
817 jQuery(".codeventil").change(function() {
818 var s=$(this).attr("id").replace("codeventil", "")
819 console.log(s+" "+$(this).val());
820 if ($(this).val() == -1) jQuery(".checkforselect"+s).prop("checked", false);
821 else jQuery(".checkforselect"+s).prop("checked", true);
822 });
823});
824</script>';
825
826// End of page
827llxFooter();
828$db->close();
length_accountg($account)
Return General accounting account with defined length (used for product and miscellaneous)
dolibarr_set_const($db, $name, $value, $type='chaine', $visible=0, $note='', $entity=1)
Insert a parameter (key,value) into database (delete old key then insert it again).
if(!defined('NOREQUIRESOC')) if(!defined( 'NOREQUIRETRAN')) if(!defined('NOTOKENRENEWAL')) if(!defined( 'NOREQUIREMENU')) if(!defined('NOREQUIREHTML')) if(!defined( 'NOREQUIREAJAX')) llxHeader()
Empty header.
Definition wrapper.php:55
llxFooter()
Empty footer.
Definition wrapper.php:69
Class to manage accounting accounts.
const TYPE_SITUATION
Situation invoice.
Class to manage suppliers invoices.
const TYPE_DEPOSIT
Deposit invoice.
const TYPE_CREDIT_NOTE
Credit note invoice.
const TYPE_REPLACEMENT
Replacement invoice.
Class to manage generation of HTML components for accounting management.
Class to manage generation of HTML components Only common components must be here.
Class permettant la generation de composants html autre Only common components are here.
Class to manage products or services.
Class to manage third parties objects (customers, suppliers, prospects...)
Class to manage line invoices.
getCountriesInEEC()
Return list of countries that are inside the EEC (European Economic Community) Note: Try to keep this...
dol_mktime($hour, $minute, $second, $month, $day, $year, $gm='auto', $check=1)
Return a timestamp date built from detailed information (by default a local PHP server timestamp) Rep...
vatrate($rate, $addpercent=false, $info_bits=0, $usestarfornpr=0, $html=0)
Return a string with VAT rate label formatted for view output Used into pdf and HTML pages.
img_picto($titlealt, $picto, $moreatt='', $pictoisfullpath=0, $srconly=0, $notitle=0, $alt='', $morecss='', $marginleftonlyshort=2)
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.
dolGetFirstLineOfText($text, $nboflines=1, $charset='UTF-8')
Return first line of text.
dol_string_nohtmltag($stringtoclean, $removelinefeed=1, $pagecodeto='UTF-8', $strip_tags=0, $removedoublespaces=1)
Clean a string from all HTML tags and entities.
price2num($amount, $rounding='', $option=0)
Function that return a number with universal decimal format (decimal separator is '.
setEventMessage($mesgs, $style='mesgs', $noduplicate=0)
Set event message in dol_events session object.
natural_search($fields, $value, $mode=0, $nofirstand=0)
Generate natural SQL search string for a criteria (this criteria can be tested on one or several fiel...
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.
dol_getIdFromCode($db, $key, $tablename, $fieldkey='code', $fieldid='id', $entityfilter=0, $filters='')
Return an id or code from a code or id.
print_liste_field_titre($name, $file="", $field="", $begin="", $moreparam="", $moreattrib="", $sortfield="", $sortorder="", $prefix="", $tooltip="", $forcenowrapcolumntitle=0)
Show title line of an array.
print_barre_liste($title, $page, $file, $options='', $sortfield='', $sortorder='', $morehtmlcenter='', $num=-1, $totalnboflines='', $picto='generic', $pictoisfullpath=0, $morehtmlright='', $morecss='', $limit=-1, $hideselectlimit=0, $hidenavigation=0, $pagenavastextinput=0, $morehtmlrightbeforearrow='')
Print a title with navigation controls for pagination.
GETPOST($paramname, $check='alphanohtml', $method=0, $filter=null, $options=null, $noreplace=0)
Return value of a param into GET or POST supervariable.
setEventMessages($mesg, $mesgs, $style='mesgs', $messagekey='', $noduplicate=0)
Set event messages in dol_events session object.
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 dolibarr global constant string value.
dol_syslog($message, $level=LOG_INFO, $ident=0, $suffixinfilename='', $restricttologhandler='', $logcontext=null)
Write log message into outputs.
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...
accessforbidden($message='', $printheader=1, $printfooter=1, $showonlymessage=0, $params=null)
Show a message to say access is forbidden and stop program.