dolibarr 21.0.0-alpha
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) 2014 Juanjo Menent <jmenent@2byte.es>
7 * Copyright (C) 2016 Laurent Destailleur <eldy@users.sourceforge.net>
8 * Copyright (C) 2021 Gauthier VERDOL <gauthier.verdol@atm-consulting.fr>
9 * Copyright (C) 2024 Frédéric France <frederic.france@free.fr>
10 * Copyright (C) 2024 MDW <mdeweerd@users.noreply.github.com>
11 *
12 * This program is free software; you can redistribute it and/or modify
13 * it under the terms of the GNU General Public License as published by
14 * the Free Software Foundation; either version 3 of the License, or
15 * (at your option) any later version.
16 *
17 * This program is distributed in the hope that it will be useful,
18 * but WITHOUT ANY WARRANTY; without even the implied warranty of
19 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
20 * GNU General Public License for more details.
21 *
22 * You should have received a copy of the GNU General Public License
23 * along with this program. If not, see <https://www.gnu.org/licenses/>.
24 */
25
31require '../../main.inc.php';
32
33require_once DOL_DOCUMENT_ROOT.'/core/class/html.formaccounting.class.php';
34require_once DOL_DOCUMENT_ROOT.'/core/class/html.formother.class.php';
35require_once DOL_DOCUMENT_ROOT.'/core/class/html.formcompany.class.php';
36require_once DOL_DOCUMENT_ROOT.'/compta/facture/class/facture.class.php';
37require_once DOL_DOCUMENT_ROOT.'/product/class/product.class.php';
38require_once DOL_DOCUMENT_ROOT.'/accountancy/class/accountingaccount.class.php';
39require_once DOL_DOCUMENT_ROOT.'/core/lib/accounting.lib.php';
40require_once DOL_DOCUMENT_ROOT.'/core/lib/date.lib.php';
41require_once DOL_DOCUMENT_ROOT.'/core/lib/company.lib.php';
42
43// Load translation files required by the page
44$langs->loadLangs(array("bills", "companies", "compta", "accountancy", "other", "productbatch", "products"));
45
46$action = GETPOST('action', 'aZ09');
47$massaction = GETPOST('massaction', 'alpha');
48$confirm = GETPOST('confirm', 'alpha');
49$toselect = GETPOST('toselect', 'array');
50$contextpage = GETPOST('contextpage', 'aZ') ? GETPOST('contextpage', 'aZ') : 'accountancycustomerlist'; // To manage different context of search
51$optioncss = GETPOST('optioncss', 'alpha');
52
53$default_account = GETPOSTINT('default_account');
54
55// Select Box
56$mesCasesCochees = GETPOST('toselect', 'array');
57
58// Search Getpost
59$search_societe = GETPOST('search_societe', 'alpha');
60$search_lineid = GETPOST('search_lineid', 'alpha'); // Can be '> 100'
61$search_ref = GETPOST('search_ref', '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// Define begin binding date
80if (empty($search_date_start) && getDolGlobalString('ACCOUNTING_DATE_START_BINDING')) {
81 $search_date_start = $db->idate(getDolGlobalString('ACCOUNTING_DATE_START_BINDING'));
82}
83
84// Load variable for pagination
85$limit = GETPOSTINT('limit') ? GETPOSTINT('limit') : getDolGlobalString('ACCOUNTING_LIMIT_LIST_VENTILATION', $conf->liste_limit);
86$sortfield = GETPOST('sortfield', 'aZ09comma');
87$sortorder = GETPOST('sortorder', 'aZ09comma');
88$page = GETPOSTISSET('pageplusone') ? (GETPOSTINT('pageplusone') - 1) : GETPOSTINT("page");
89if (empty($page) || $page < 0) {
90 $page = 0;
91}
92$offset = $limit * $page;
93$pageprev = $page - 1;
94$pagenext = $page + 1;
95if (!$sortfield) {
96 $sortfield = "f.datef, f.ref, l.rowid";
97}
98if (!$sortorder) {
99 if (getDolGlobalInt('ACCOUNTING_LIST_SORT_VENTILATION_TODO') > 0) {
100 $sortorder = "DESC";
101 } else {
102 $sortorder = "ASC";
103 }
104}
105
106// Initialize a technical object to manage hooks of page. Note that conf->hooks_modules contains an array of hook context
107$hookmanager->initHooks(array('accountancycustomerlist'));
108
109$formaccounting = new FormAccounting($db);
110$accountingAccount = new AccountingAccount($db);
111
112$chartaccountcode = dol_getIdFromCode($db, getDolGlobalString('CHARTOFACCOUNTS'), 'accounting_system', 'rowid', 'pcg_version');
113
114// Security check
115if (!isModEnabled('accounting')) {
117}
118if ($user->socid > 0) {
120}
121if (!$user->hasRight('accounting', 'bind', 'write')) {
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_invoice = '';
151 $search_label = '';
152 $search_desc = '';
153 $search_amount = '';
154 $search_account = '';
155 $search_vat = '';
156 $search_date_startday = '';
157 $search_date_startmonth = '';
158 $search_date_startyear = '';
159 $search_date_endday = '';
160 $search_date_endmonth = '';
161 $search_date_endyear = '';
162 $search_date_start = '';
163 $search_date_end = '';
164 $search_country = '';
165 $search_tvaintra = '';
166 }
167
168 // Mass actions
169 $objectclass = 'AccountingAccount';
170 $permissiontoread = $user->hasRight('accounting', 'read');
171 $permissiontodelete = $user->hasRight('accounting', 'delete');
172 $uploaddir = $conf->accounting->dir_output;
173 include DOL_DOCUMENT_ROOT.'/core/actions_massactions.inc.php';
174}
175
176
177if ($massaction == 'ventil' && $user->hasRight('accounting', 'bind', 'write')) {
178 $msg = '';
179
180 //print '<div><span style="color:red">' . $langs->trans("Processing") . '...</span></div>';
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 style="color:red">'.$langs->trans("Lineofinvoice").' '.$monId.' - '.$langs->trans("NoAccountSelected").'</span></div>';
195 $ko++;
196 } else {
197 $sql = " UPDATE ".MAIN_DB_PREFIX."facturedet";
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/customer/list.php", LOG_DEBUG);
205 if ($db->query($sql)) {
206 $msg .= '<div><span style="color:green">'.$langs->trans("Lineofinvoice").' '.$monId.' - '.$langs->trans("VentilatedinAccount").' : '.length_accountg($accountventilated->account_number).'</span></div>';
207 $ok++;
208 } else {
209 $msg .= '<div><span style="color:red">'.$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("CustomersVentilation"), $help_url, '', 0, 0, '', '', '', 'bodyforlist mod-accountancy accountancy-customer 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// Customer Invoice lines
248$sql = "SELECT f.rowid as facid, f.ref, f.datef, f.type as ftype, f.situation_cycle_ref, f.fk_facture_source,";
249$sql .= " l.rowid, l.fk_product, l.description, l.total_ht, l.situation_percent, 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_sell as company_code_sell";
266} else {
267 $sql .= " s.code_compta as code_compta_client,";
268 $sql .= " s.code_compta_fournisseur,";
269 $sql .= " s.accountancy_code_sell as company_code_sell";
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 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."facturedet as l ON f.rowid = l.fk_facture";
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_sell = 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_sell_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_sell_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_sell = aa4.account_number AND aa4.active = 1 AND aa4.fk_pcg_version = '".$db->escape($chartaccountcode)."' AND aa4.entity = ".$conf->entity;
291
292$sql .= " WHERE f.fk_statut > 0 AND l.fk_code_ventilation <= 0";
293$sql .= " AND l.product_type <= 2";
294// Add search filter like
295if ($search_societe) {
296 $sql .= natural_search('s.nom', $search_societe);
297}
298if ($search_lineid) {
299 $sql .= natural_search("l.rowid", $search_lineid, 1);
300}
301if (strlen(trim($search_invoice))) {
302 $sql .= natural_search("f.ref", $search_invoice);
303}
304if (strlen(trim($search_ref))) {
305 $sql .= natural_search("p.ref", $search_ref);
306}
307if (strlen(trim($search_label))) {
308 $sql .= natural_search("p.label", $search_label);
309}
310if (strlen(trim($search_desc))) {
311 $sql .= natural_search("l.description", $search_desc);
312}
313if (strlen(trim($search_amount))) {
314 $sql .= natural_search("l.total_ht", $search_amount, 1);
315}
316if (strlen(trim($search_account))) {
317 $sql .= natural_search("aa.account_number", $search_account);
318}
319if (strlen(trim($search_vat))) {
320 $sql .= natural_search("l.tva_tx", price2num($search_vat), 1);
321}
322if ($search_date_start) {
323 $sql .= " AND f.datef >= '".$db->idate($search_date_start)."'";
324}
325if ($search_date_end) {
326 $sql .= " AND f.datef <= '".$db->idate($search_date_end)."'";
327}
328if (strlen(trim($search_country))) {
329 $arrayofcode = getCountriesInEEC();
330 $country_code_in_EEC = $country_code_in_EEC_without_me = '';
331 foreach ($arrayofcode as $key => $value) {
332 $country_code_in_EEC .= ($country_code_in_EEC ? "," : "")."'".$value."'";
333 if ($value != $mysoc->country_code) {
334 $country_code_in_EEC_without_me .= ($country_code_in_EEC_without_me ? "," : "")."'".$value."'";
335 }
336 }
337 if ($search_country == 'special_allnotme') {
338 $sql .= " AND co.code <> '".$db->escape($mysoc->country_code)."'";
339 } elseif ($search_country == 'special_eec') {
340 $sql .= " AND co.code IN (".$db->sanitize($country_code_in_EEC, 1).")";
341 } elseif ($search_country == 'special_eecnotme') {
342 $sql .= " AND co.code IN (".$db->sanitize($country_code_in_EEC_without_me, 1).")";
343 } elseif ($search_country == 'special_noteec') {
344 $sql .= " AND co.code NOT IN (".$db->sanitize($country_code_in_EEC, 1).")";
345 } else {
346 $sql .= natural_search("co.code", $search_country);
347 }
348}
349if (strlen(trim($search_tvaintra))) {
350 $sql .= natural_search("s.tva_intra", $search_tvaintra);
351}
352if (getDolGlobalString('FACTURE_DEPOSITS_ARE_JUST_PAYMENTS')) {
353 $sql .= " AND f.type IN (".Facture::TYPE_STANDARD.",".Facture::TYPE_REPLACEMENT.",".Facture::TYPE_CREDIT_NOTE.",".Facture::TYPE_SITUATION.")";
354} else {
355 $sql .= " AND f.type IN (".Facture::TYPE_STANDARD.",".Facture::TYPE_REPLACEMENT.",".Facture::TYPE_CREDIT_NOTE.",".Facture::TYPE_DEPOSIT.",".Facture::TYPE_SITUATION.")";
356}
357$sql .= " AND f.entity IN (".getEntity('invoice', 0).")"; // We don't share object for accountancy
358
359// Add where from hooks
360$parameters = array();
361$reshook = $hookmanager->executeHooks('printFieldListWhere', $parameters); // Note that $action and $object may have been modified by hook
362$sql .= $hookmanager->resPrint;
363
364$sql .= $db->order($sortfield, $sortorder);
365
366// Count total nb of records
367$nbtotalofrecords = '';
368if (!getDolGlobalInt('MAIN_DISABLE_FULL_SCANLIST')) {
369 $result = $db->query($sql);
370 $nbtotalofrecords = $db->num_rows($result);
371 if (($page * $limit) > $nbtotalofrecords) { // if total resultset is smaller then paging size (filtering), goto and load page 0
372 $page = 0;
373 $offset = 0;
374 }
375}
376
377$sql .= $db->plimit($limit + 1, $offset);
378
379dol_syslog("accountancy/customer/list.php", LOG_DEBUG);
380// MAX_JOIN_SIZE can be very low (ex: 300000) on some limited configurations (ex: https://www.online.net/fr/hosting/online-perso)
381// 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
382if ($db->type == 'mysqli') {
383 $db->query("SET SQL_BIG_SELECTS=1");
384}
385
386$result = $db->query($sql);
387if ($result) {
388 $num_lines = $db->num_rows($result);
389 $i = 0;
390
391 $arrayofselected = is_array($toselect) ? $toselect : array();
392
393 $param = '';
394 if (!empty($contextpage) && $contextpage != $_SERVER["PHP_SELF"]) {
395 $param .= '&contextpage='.urlencode($contextpage);
396 }
397 if ($limit > 0 && $limit != $conf->liste_limit) {
398 $param .= '&limit='.((int) $limit);
399 }
400 if ($search_societe) {
401 $param .= '&search_societe='.urlencode($search_societe);
402 }
403 if ($search_lineid) {
404 $param .= '&search_lineid='.urlencode((string) ($search_lineid));
405 }
406 if ($search_date_startday) {
407 $param .= '&search_date_startday='.urlencode((string) ($search_date_startday));
408 }
409 if ($search_date_startmonth) {
410 $param .= '&search_date_startmonth='.urlencode((string) ($search_date_startmonth));
411 }
412 if ($search_date_startyear) {
413 $param .= '&search_date_startyear='.urlencode((string) ($search_date_startyear));
414 }
415 if ($search_date_endday) {
416 $param .= '&search_date_endday='.urlencode((string) ($search_date_endday));
417 }
418 if ($search_date_endmonth) {
419 $param .= '&search_date_endmonth='.urlencode((string) ($search_date_endmonth));
420 }
421 if ($search_date_endyear) {
422 $param .= '&search_date_endyear='.urlencode((string) ($search_date_endyear));
423 }
424 if ($search_invoice) {
425 $param .= '&search_invoice='.urlencode($search_invoice);
426 }
427 if ($search_ref) {
428 $param .= '&search_ref='.urlencode($search_ref);
429 }
430 if ($search_label) {
431 $param .= '&search_label='.urlencode($search_label);
432 }
433 if ($search_desc) {
434 $param .= '&search_desc='.urlencode($search_desc);
435 }
436 if ($search_amount) {
437 $param .= '&search_amount='.urlencode($search_amount);
438 }
439 if ($search_vat) {
440 $param .= '&search_vat='.urlencode($search_vat);
441 }
442 if ($search_country) {
443 $param .= "&search_country=".urlencode($search_country);
444 }
445 if ($search_tvaintra) {
446 $param .= "&search_tvaintra=".urlencode($search_tvaintra);
447 }
448
449 $arrayofmassactions = array(
450 'set_default_account' => img_picto('', 'check', 'class="pictofixedwidth"').$langs->trans("ConfirmPreselectAccount"),
451 'ventil' => img_picto('', 'check', 'class="pictofixedwidth"').$langs->trans("Ventilate")
452 //'presend'=>img_picto('', 'email', 'class="pictofixedwidth"').$langs->trans("SendByMail"),
453 //'builddoc'=>img_picto('', 'pdf', 'class="pictofixedwidth"').$langs->trans("PDFMerge"),
454 );
455 //if ($user->hasRight('mymodule', 'supprimer')) $arrayofmassactions['predelete'] = img_picto('', 'delete', 'class="pictofixedwidth"').$langs->trans("Delete");
456 //if (in_array($massaction, array('presend','predelete'))) $arrayofmassactions=array();
457 $massactionbutton = '';
458 if ($massaction !== 'set_default_account') {
459 $massactionbutton = $form->selectMassAction('ventil', $arrayofmassactions, 1);
460 }
461
462 print '<form action="'.$_SERVER["PHP_SELF"].'" method="post">'."\n";
463 print '<input type="hidden" name="action" value="ventil">';
464 if ($optioncss != '') {
465 print '<input type="hidden" name="optioncss" value="'.$optioncss.'">';
466 }
467 print '<input type="hidden" name="token" value="'.newToken().'">';
468 print '<input type="hidden" name="formfilteraction" id="formfilteraction" value="list">';
469 print '<input type="hidden" name="sortfield" value="'.$sortfield.'">';
470 print '<input type="hidden" name="sortorder" value="'.$sortorder.'">';
471 print '<input type="hidden" name="page" value="'.$page.'">';
472
473 // @phan-suppress-next-line PhanPluginSuspiciousParamOrder
474 print_barre_liste($langs->trans("InvoiceLines").'<br><span class="opacitymedium small">'.$langs->trans("DescVentilTodoCustomer").'</span>', $page, $_SERVER["PHP_SELF"], $param, $sortfield, $sortorder, $massactionbutton, $num_lines, $nbtotalofrecords, 'title_accountancy', 0, '', '', $limit, 0, 0, 1);
475
476 if ($massaction == 'set_default_account') {
477 $formquestion = array();
478 $formquestion[] = array('type' => 'other',
479 'name' => 'set_default_account',
480 'label' => $langs->trans("AccountancyCode"),
481 'value' => $formaccounting->select_account('', 'default_account', 1, array(), 0, 0, 'maxwidth200 maxwidthonsmartphone', 'cachewithshowemptyone'));
482 print $form->formconfirm($_SERVER["PHP_SELF"], $langs->trans("ConfirmPreselectAccount"), $langs->trans("ConfirmPreselectAccountQuestion", count($toselect)), "confirm_set_default_account", $formquestion, 1, 0, 200, 500, 1);
483 }
484
485 if (!empty($msg)) {
486 print $msg.'<br>';
487 }
488
489 $moreforfilter = '';
490
491 print '<div class="div-table-responsive">';
492 print '<table class="tagtable liste'.($moreforfilter ? " listwithfilterbefore" : "").'">'."\n";
493
494 // We add search filter
495 print '<tr class="liste_titre_filter">';
496 print '<td class="liste_titre"><input type="text" class="flat maxwidth25" name="search_lineid" value="'.dol_escape_htmltag($search_lineid).'"></td>';
497 print '<td class="liste_titre"><input type="text" class="flat maxwidth50" name="search_invoice" value="'.dol_escape_htmltag($search_invoice).'"></td>';
498 print '<td class="liste_titre center">';
499 print '<div class="nowrapfordate">';
500 print $form->selectDate($search_date_start ? $search_date_start : -1, 'search_date_start', 0, 0, 1, '', 1, 0, 0, '', '', '', '', 1, '', $langs->trans('From'));
501 print '</div>';
502 print '<div class="nowrapfordate">';
503 print $form->selectDate($search_date_end ? $search_date_end : -1, 'search_date_end', 0, 0, 1, '', 1, 0, 0, '', '', '', '', 1, '', $langs->trans('to'));
504 print '</div>';
505 print '</td>';
506 print '<td class="liste_titre"><input type="text" class="flat maxwidth50" name="search_ref" value="'.dol_escape_htmltag($search_ref).'"></td>';
507 print '<td class="liste_titre"><input type="text" class="flat maxwidth100" name="search_desc" value="'.dol_escape_htmltag($search_desc).'"></td>';
508 print '<td class="liste_titre right"><input type="text" class="flat maxwidth50 right" name="search_amount" value="'.dol_escape_htmltag($search_amount).'"></td>';
509 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>';
510 print '<td class="liste_titre"><input type="text" class="flat maxwidth75imp" name="search_societe" value="'.dol_escape_htmltag($search_societe).'"></td>';
511 print '<td class="liste_titre">';
512 print $form->select_country($search_country, 'search_country', '', 0, 'maxwidth100', 'code2', 1, 0, 1);
513 //print '<input type="text" class="flat maxwidth50" name="search_country" value="' . dol_escape_htmltag($search_country) . '">';
514 print '</td>';
515 print '<td class="liste_titre"><input type="text" class="flat maxwidth50" name="search_tvaintra" value="'.dol_escape_htmltag($search_tvaintra).'"></td>';
516 print '<td class="liste_titre"></td>';
517 print '<td class="liste_titre"></td>';
518 print '<td class="center liste_titre">';
519 $searchpicto = $form->showFilterButtons();
520 print $searchpicto;
521 print '</td>';
522 print "</tr>\n";
523
524 print '<tr class="liste_titre">';
525 print_liste_field_titre("LineId", $_SERVER["PHP_SELF"], "l.rowid", "", $param, '', $sortfield, $sortorder);
526 print_liste_field_titre("Invoice", $_SERVER["PHP_SELF"], "f.ref", "", $param, '', $sortfield, $sortorder);
527 print_liste_field_titre("Date", $_SERVER["PHP_SELF"], "f.datef, f.ref, l.rowid", "", $param, '', $sortfield, $sortorder, 'center ');
528 print_liste_field_titre("ProductRef", $_SERVER["PHP_SELF"], "p.ref", "", $param, '', $sortfield, $sortorder);
529 //print_liste_field_titre("ProductLabel", $_SERVER["PHP_SELF"], "p.label", "", $param, '', $sortfield, $sortorder);
530 print_liste_field_titre("ProductDescription", $_SERVER["PHP_SELF"], "l.description", "", $param, '', $sortfield, $sortorder);
531 print_liste_field_titre("Amount", $_SERVER["PHP_SELF"], "l.total_ht", "", $param, '', $sortfield, $sortorder, 'right maxwidth50 ');
532 print_liste_field_titre("VATRate", $_SERVER["PHP_SELF"], "l.tva_tx", "", $param, '', $sortfield, $sortorder, 'right ', '', 1);
533 print_liste_field_titre("ThirdParty", $_SERVER["PHP_SELF"], "s.nom", "", $param, '', $sortfield, $sortorder);
534 print_liste_field_titre("Country", $_SERVER["PHP_SELF"], "co.label", "", $param, '', $sortfield, $sortorder);
535 print_liste_field_titre("VATIntraShort", $_SERVER["PHP_SELF"], "s.tva_intra", "", $param, '', $sortfield, $sortorder);
536 print_liste_field_titre("DataUsedToSuggestAccount", '', '', '', '', '', '', '', 'nowraponall ');
537 print_liste_field_titre("AccountAccountingSuggest", '', '', '', '', '', '', '', 'center ');
538 $checkpicto = '';
539 if ($massactionbutton) {
540 $checkpicto = $form->showCheckAddButtons('checkforselect', 1);
541 }
542 print_liste_field_titre($checkpicto, '', '', '', '', '', '', '', 'center ');
543 print "</tr>\n";
544
545 $thirdpartystatic = new Societe($db);
546 $facture_static = new Facture($db);
547 $facture_static_det = new FactureLigne($db);
548 $product_static = new Product($db);
549
550
551 $accountingaccount_codetotid_cache = array();
552 $suggestedaccountingaccountfor = ''; // Initialise (for static analysis)
553 $suggestedaccountingaccountbydefaultfor = '';
554
555 while ($i < min($num_lines, $limit)) {
556 $objp = $db->fetch_object($result);
557
558 // product_type: 0 = service, 1 = product
559 // if product does not exist we use the value of product_type provided in facturedet to define if this is a product or service
560 // issue : if we change product_type value in product DB it should differ from the value stored in facturedet DB !
561 $code_sell_l = '';
562 $code_sell_p = '';
563 $code_sell_t = '';
564
565 $thirdpartystatic->id = $objp->socid;
566 $thirdpartystatic->name = $objp->name;
567 $thirdpartystatic->client = $objp->client;
568 $thirdpartystatic->fournisseur = $objp->fournisseur;
569 $thirdpartystatic->code_client = $objp->code_client;
570 $thirdpartystatic->code_compta = $objp->code_compta_client; // For backward compatibility
571 $thirdpartystatic->code_compta_client = $objp->code_compta_client;
572 $thirdpartystatic->code_fournisseur = $objp->code_fournisseur;
573 $thirdpartystatic->code_compta_fournisseur = $objp->code_compta_fournisseur;
574 $thirdpartystatic->email = $objp->email;
575 $thirdpartystatic->country_code = $objp->country_code;
576 $thirdpartystatic->tva_intra = $objp->tva_intra;
577 $thirdpartystatic->code_compta_product = $objp->company_code_sell; // The accounting account for product stored on thirdparty object (for level3 suggestion)
578
579 $product_static->ref = $objp->product_ref;
580 $product_static->id = $objp->product_id;
581 $product_static->type = $objp->type;
582 $product_static->label = $objp->product_label;
583 $product_static->status = $objp->status;
584 $product_static->status_buy = $objp->status_buy;
585 $product_static->accountancy_code_sell = $objp->code_sell;
586 $product_static->accountancy_code_sell_intra = $objp->code_sell_intra;
587 $product_static->accountancy_code_sell_export = $objp->code_sell_export;
588 $product_static->accountancy_code_buy = $objp->code_buy;
589 $product_static->accountancy_code_buy_intra = $objp->code_buy_intra;
590 $product_static->accountancy_code_buy_export = $objp->code_buy_export;
591 $product_static->tva_tx = $objp->tva_tx_prod;
592
593 $facture_static->ref = $objp->ref;
594 $facture_static->id = $objp->facid;
595 $facture_static->type = $objp->ftype;
596 $facture_static->date = $db->jdate($objp->datef);
597 $facture_static->fk_facture_source = $objp->fk_facture_source;
598
599 $facture_static_det->id = $objp->rowid;
600 $facture_static_det->total_ht = $objp->total_ht;
601 $facture_static_det->tva_tx = $objp->tva_tx_line;
602 $facture_static_det->vat_src_code = $objp->vat_src_code;
603 $facture_static_det->product_type = $objp->type_l;
604 $facture_static_det->desc = $objp->description;
605
606 $accountingAccountArray = array(
607 'dom' => $objp->aarowid,
608 'intra' => $objp->aarowid_intra,
609 'export' => $objp->aarowid_export,
610 'thirdparty' => $objp->aarowid_thirdparty);
611
612 $code_sell_p_notset = '';
613 $code_sell_t_notset = '';
614
615 $suggestedid = 0;
616
617 $return = $accountingAccount->getAccountingCodeToBind($thirdpartystatic, $mysoc, $product_static, $facture_static, $facture_static_det, $accountingAccountArray, 'customer');
618 if (!is_array($return) && $return < 0) {
619 setEventMessage($accountingAccount->error, 'errors');
620 } else {
621 $suggestedid = $return['suggestedid'];
622 $suggestedaccountingaccountfor = $return['suggestedaccountingaccountfor'];
623 $suggestedaccountingaccountbydefaultfor = $return['suggestedaccountingaccountbydefaultfor'];
624 $code_sell_l = $return['code_l'];
625 $code_sell_p = $return['code_p'];
626 $code_sell_t = $return['code_t'];
627 }
628 //var_dump($return);
629
630 if (!empty($code_sell_p)) {
631 // Value was defined previously
632 } else {
633 $code_sell_p_notset = 'color:orange';
634 }
635 if (empty($code_sell_l) && empty($code_sell_p)) {
636 $code_sell_p_notset = 'color:red';
637 }
638 if ($suggestedaccountingaccountfor == 'eecwithoutvatnumber' && empty($code_sell_p_notset)) {
639 $code_sell_p_notset = 'color:orange';
640 }
641
642 // $code_sell_l is now default code of product/service
643 // $code_sell_p is now code of product/service
644 // $code_sell_t is now code of thirdparty
645 //var_dump($code_sell_l.' - '.$code_sell_p.' - '.$code_sell_t.' -> '.$suggestedid.' ('.$suggestedaccountingaccountbydefaultfor.' '.$suggestedaccountingaccountfor.')');
646
647 print '<tr class="oddeven">';
648
649 // Line id
650 print '<td>'.$facture_static_det->id.'</td>';
651
652 // Ref Invoice
653 print '<td class="nowraponall">'.$facture_static->getNomUrl(1).'</td>';
654
655 print '<td class="center">'.dol_print_date($facture_static->date, 'day').'</td>';
656
657 // Ref Product
658 print '<td class="tdoverflowmax100">';
659 if ($product_static->id > 0) {
660 print $product_static->getNomUrl(1);
661 }
662 if ($product_static->label) {
663 print '<br><span class="opacitymedium small">'.dol_escape_htmltag($product_static->label).'</span>';
664 }
665 print '</td>';
666
667 // Description of line
668 $text = dolGetFirstLineOfText(dol_string_nohtmltag($facture_static_det->desc, 1));
669 print '<td class="tdoverflowmax150 small classfortooltip" title="'.dol_escape_htmltag($text).'">';
670 $trunclength = getDolGlobalInt('ACCOUNTING_LENGTH_DESCRIPTION');
671 print dol_trunc($text, $trunclength);
672 print '</td>';
673
674 // Amount
675 print '<td class="right nowraponall amount">';
676
677 // Create a compensation rate for old situation invoice feature.
678 $situation_ratio = 1;
679 if (getDolGlobalInt('INVOICE_USE_SITUATION') == 1) {
680 if ($objp->situation_cycle_ref) {
681 // Avoid divide by 0
682 if ($objp->situation_percent == 0) {
683 $situation_ratio = 0;
684 } else {
685 $line = new FactureLigne($db);
686 $line->fetch($objp->rowid);
687
688 // Situation invoices handling
689 $prev_progress = $line->get_prev_progress($objp->facid);
690
691 $situation_ratio = ($objp->situation_percent - $prev_progress) / $objp->situation_percent;
692 }
693 }
694 print price($objp->total_ht * $situation_ratio);
695 } else {
696 print price($objp->total_ht);
697 }
698 print '</td>';
699
700 // Vat rate
701 $code_vat_differ = '';
702 if ($product_static->tva_tx !== $facture_static_det->tva_tx && price2num($product_static->tva_tx) && price2num($facture_static_det->tva_tx)) { // Note: having a vat rate of 0 is often the normal case when sells is intra b2b or to export
703 $code_vat_differ = 'warning bold';
704 }
705 print '<td class="right'.($code_vat_differ ? ' '.$code_vat_differ : '').'">';
706 print vatrate($facture_static_det->tva_tx.($facture_static_det->vat_src_code ? ' ('.$facture_static_det->vat_src_code.')' : ''));
707 print '</td>';
708
709 // Thirdparty
710 print '<td class="tdoverflowmax100">'.$thirdpartystatic->getNomUrl(1, 'customer').'</td>';
711
712 // Country
713 $labelcountry = ($objp->country_code && ($langs->trans("Country".$objp->country_code) != "Country".$objp->country_code)) ? $langs->trans("Country".$objp->country_code) : $objp->country_label;
714 print '<td class="tdoverflowmax100" title="'.dol_escape_htmltag($labelcountry).'">';
715 print dol_escape_htmltag($labelcountry);
716 print '</td>';
717
718 // VAT Num
719 print '<td class="tdoverflowmax80" title="'.dol_escape_htmltag($objp->tva_intra).'">'.dol_escape_htmltag($objp->tva_intra).'</td>';
720
721 // Found accounts
722 print '<td class="small">';
723 // First show default account for any products
724 $s = '1. '.(($facture_static_det->product_type == 1) ? $langs->trans("DefaultForService") : $langs->trans("DefaultForProduct")).': ';
725 $shelp = '';
726 $ttype = 'help';
727 if ($suggestedaccountingaccountbydefaultfor == 'eec') {
728 $shelp .= $langs->trans("SaleEEC");
729 } elseif ($suggestedaccountingaccountbydefaultfor == 'eecwithvat') {
730 $shelp = $langs->trans("SaleEECWithVAT");
731 } elseif ($suggestedaccountingaccountbydefaultfor == 'eecwithoutvatnumber') {
732 $shelp = $langs->trans("SaleEECWithoutVATNumber");
733 $ttype = 'warning';
734 } elseif ($suggestedaccountingaccountbydefaultfor == 'export') {
735 $shelp .= $langs->trans("SaleExport");
736 }
737 $s .= ($code_sell_l > 0 ? length_accountg($code_sell_l) : '<span style="'.$code_sell_p_notset.'">'.$langs->trans("NotDefined").'</span>');
738 print $form->textwithpicto($s, $shelp, 1, $ttype, '', 0, 2, '', 1);
739 // Now show account for product
740 if ($product_static->id > 0) {
741 print '<br>';
742 $s = '2. '.(($facture_static_det->product_type == 1) ? $langs->trans("ThisService") : $langs->trans("ThisProduct")).': ';
743 $shelp = '';
744 $ttype = 'help';
745 if ($suggestedaccountingaccountfor == 'eec') {
746 $shelp = $langs->trans("SaleEEC");
747 } elseif ($suggestedaccountingaccountfor == 'eecwithvat') {
748 $shelp = $langs->trans("SaleEECWithVAT");
749 } elseif ($suggestedaccountingaccountfor == 'eecwithoutvatnumber') {
750 $shelp = $langs->trans("SaleEECWithoutVATNumber");
751 $ttype = 'warning';
752 } elseif ($suggestedaccountingaccountfor == 'export') {
753 $shelp = $langs->trans("SaleExport");
754 }
755 $s .= (empty($code_sell_p) ? '<span style="'.$code_sell_p_notset.'">'.$langs->trans("NotDefined").'</span>' : length_accountg($code_sell_p));
756 print $form->textwithpicto($s, $shelp, 1, $ttype, '', 0, 2, '', 1);
757 } else {
758 print '<br>';
759 $s = '2. '.(($objp->type_l == 1) ? $langs->trans("ThisService") : $langs->trans("ThisProduct")).': ';
760 $shelp = '';
761 $s .= $langs->trans("NotDefined");
762 print $form->textwithpicto($s, $shelp, 1, 'help', '', 0, 2, '', 1);
763 }
764 if (getDolGlobalString('ACCOUNTANCY_USE_PRODUCT_ACCOUNT_ON_THIRDPARTY')) {
765 print '<br>';
766 $s = '3. '.(($facture_static_det->product_type == 1) ? $langs->trans("ServiceForThisThirdparty") : $langs->trans("ProductForThisThirdparty")).': ';
767 $shelp = '';
768 $s .= ($code_sell_t > 0 ? length_accountg($code_sell_t) : '<span style="'.$code_sell_t_notset.'">'.$langs->trans("NotDefined").'</span>');
769 print $form->textwithpicto($s, $shelp, 1, 'help', '', 0, 2, '', 1);
770 }
771 print '</td>';
772
773 // Suggested accounting account
774 print '<td>';
775 print $formaccounting->select_account(($default_account > 0 && $confirm === 'yes' && in_array($objp->rowid."_".$i, $toselect)) ? $default_account : $suggestedid, 'codeventil'.$facture_static_det->id, 1, array(), 0, 0, 'codeventil maxwidth150 maxwidthonsmartphone', 'cachewithshowemptyone');
776 print '</td>';
777
778 // Column with checkbox
779 print '<td class="center">';
780 $ischecked = 0;
781 if (!empty($suggestedid) && $suggestedaccountingaccountfor != '' && $suggestedaccountingaccountfor != 'eecwithoutvatnumber') {
782 $ischecked = 1;
783 }
784
785 if (!empty($toselect)) {
786 $ischecked = 0;
787 if (in_array($objp->rowid."_".$i, $toselect)) {
788 $ischecked = 1;
789 }
790 }
791
792 print '<input type="checkbox" class="flat checkforselect checkforselect'.$facture_static_det->id.'" name="toselect[]" value="'.$facture_static_det->id."_".$i.'"'.($ischecked ? " checked" : "").'/>';
793 print '</td>';
794
795 print '</tr>';
796 $i++;
797 }
798 if ($num_lines == 0) {
799 print '<tr><td colspan="13"><span class="opacitymedium">'.$langs->trans("NoRecordFound").'</span></td></tr>';
800 }
801
802 print '</table>';
803 print "</div>";
804
805 print '</form>';
806} else {
807 print $db->error();
808}
809if ($db->type == 'mysqli') {
810 $db->query("SET SQL_BIG_SELECTS=0"); // Enable MAX_JOIN_SIZE limitation
811}
812
813// Add code to auto check the box when we select an account
814print '<script type="text/javascript">
815jQuery(document).ready(function() {
816 jQuery(".codeventil").change(function() {
817 var s=$(this).attr("id").replace("codeventil", "")
818 console.log(s+" "+$(this).val());
819 if ($(this).val() == -1) jQuery(".checkforselect"+s).prop("checked", false);
820 else jQuery(".checkforselect"+s).prop("checked", true);
821 });
822});
823</script>';
824
825// End of page
826llxFooter();
827$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($head='', $title='', $help_url='', $target='', $disablejs=0, $disablehead=0, $arrayofjs='', $arrayofcss='', $morequerystring='', $morecssonbody='', $replacemainareaby='', $disablenofollow=0, $disablenoindex=0)
Empty header.
Definition wrapper.php:70
Class to manage accounting accounts.
Class to manage invoices.
const TYPE_REPLACEMENT
Replacement invoice.
const TYPE_SITUATION
Situation invoice.
const TYPE_DEPOSIT
Deposit invoice.
const TYPE_CREDIT_NOTE
Credit note invoice.
Class to manage invoice lines.
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...)
getCountriesInEEC()
Return list of countries that are inside the EEC (European Economic Community) Note: Try to keep this...
llxFooter()
Footer empty.
Definition document.php:107
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...
setEventMessages($mesg, $mesgs, $style='mesgs', $messagekey='', $noduplicate=0, $attop=0)
Set event messages in dol_events session object.
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.
print_barre_liste($title, $page, $file, $options='', $sortfield='', $sortorder='', $morehtmlcenter='', $num=-1, $totalnboflines='', $picto='generic', $pictoisfullpath=0, $morehtmlright='', $morecss='', $limit=-1, $selectlimitsuffix=0, $hidenavigation=0, $pagenavastextinput=0, $morehtmlrightbeforearrow='')
Print a title with navigation controls for pagination.
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 '.
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...
setEventMessage($mesgs, $style='mesgs', $noduplicate=0, $attop=0)
Set event message in dol_events session object.
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.
GETPOST($paramname, $check='alphanohtml', $method=0, $filter=null, $options=null, $noreplace=0)
Return value of a param into GET or POST supervariable.
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.
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.