dolibarr  19.0.0-dev
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-2021 Alexandre Spangaro <aspangaro@open-dsi.fr>
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  *
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 
29 require '../../main.inc.php';
30 
31 require_once DOL_DOCUMENT_ROOT.'/core/class/html.formaccounting.class.php';
32 require_once DOL_DOCUMENT_ROOT.'/core/class/html.formother.class.php';
33 require_once DOL_DOCUMENT_ROOT.'/core/class/html.formcompany.class.php';
34 require_once DOL_DOCUMENT_ROOT.'/compta/facture/class/facture.class.php';
35 require_once DOL_DOCUMENT_ROOT.'/product/class/product.class.php';
36 require_once DOL_DOCUMENT_ROOT.'/accountancy/class/accountingaccount.class.php';
37 require_once DOL_DOCUMENT_ROOT.'/core/lib/accounting.lib.php';
38 require_once DOL_DOCUMENT_ROOT.'/core/lib/date.lib.php';
39 require_once DOL_DOCUMENT_ROOT.'/core/lib/company.lib.php';
40 
41 // Load translation files required by the page
42 $langs->loadLangs(array("bills", "companies", "compta", "accountancy", "other", "productbatch", "products"));
43 
44 $action = GETPOST('action', 'aZ09');
45 $massaction = GETPOST('massaction', 'alpha');
46 $confirm = GETPOST('confirm', 'alpha');
47 $toselect = GETPOST('toselect', 'array');
48 $contextpage = GETPOST('contextpage', 'aZ') ? GETPOST('contextpage', 'aZ') : 'accountancycustomerlist'; // To manage different context of search
49 $optioncss = GETPOST('optioncss', 'alpha');
50 
51 $default_account = GETPOST('default_account', 'int');
52 
53 // Select Box
54 $mesCasesCochees = GETPOST('toselect', 'array');
55 
56 // Search Getpost
57 $search_societe = GETPOST('search_societe', 'alpha');
58 $search_lineid = GETPOST('search_lineid', 'int');
59 $search_ref = GETPOST('search_ref', 'alpha');
60 $search_invoice = GETPOST('search_invoice', 'alpha');
61 $search_label = GETPOST('search_label', 'alpha');
62 $search_desc = GETPOST('search_desc', 'alpha');
63 $search_amount = GETPOST('search_amount', 'alpha');
64 $search_account = GETPOST('search_account', 'alpha');
65 $search_vat = GETPOST('search_vat', 'alpha');
66 $search_date_startday = GETPOST('search_date_startday', 'int');
67 $search_date_startmonth = GETPOST('search_date_startmonth', 'int');
68 $search_date_startyear = GETPOST('search_date_startyear', 'int');
69 $search_date_endday = GETPOST('search_date_endday', 'int');
70 $search_date_endmonth = GETPOST('search_date_endmonth', 'int');
71 $search_date_endyear = GETPOST('search_date_endyear', 'int');
72 $search_date_start = dol_mktime(0, 0, 0, $search_date_startmonth, $search_date_startday, $search_date_startyear); // Use tzserver
73 $search_date_end = dol_mktime(23, 59, 59, $search_date_endmonth, $search_date_endday, $search_date_endyear);
74 $search_country = GETPOST('search_country', 'alpha');
75 $search_tvaintra = GETPOST('search_tvaintra', 'alpha');
76 
77 // Load variable for pagination
78 $limit = GETPOST('limit', 'int') ?GETPOST('limit', 'int') : (empty($conf->global->ACCOUNTING_LIMIT_LIST_VENTILATION) ? $conf->liste_limit : $conf->global->ACCOUNTING_LIMIT_LIST_VENTILATION);
79 $sortfield = GETPOST('sortfield', 'aZ09comma');
80 $sortorder = GETPOST('sortorder', 'aZ09comma');
81 $page = GETPOSTISSET('pageplusone') ? (GETPOST('pageplusone') - 1) : GETPOST("page", 'int');
82 if (empty($page) || $page < 0) {
83  $page = 0;
84 }
85 $offset = $limit * $page;
86 $pageprev = $page - 1;
87 $pagenext = $page + 1;
88 if (!$sortfield) {
89  $sortfield = "f.datef, f.ref, l.rowid";
90 }
91 if (!$sortorder) {
92  if ($conf->global->ACCOUNTING_LIST_SORT_VENTILATION_TODO > 0) {
93  $sortorder = "DESC";
94  } else {
95  $sortorder = "ASC";
96  }
97 }
98 
99 // Initialize technical object to manage hooks of page. Note that conf->hooks_modules contains array of hook context
100 $hookmanager->initHooks(array('accountancycustomerlist'));
101 
102 $formaccounting = new FormAccounting($db);
103 $accountingAccount = new AccountingAccount($db);
104 
105 $chartaccountcode = dol_getIdFromCode($db, getDolGlobalInt('CHARTOFACCOUNTS'), 'accounting_system', 'rowid', 'pcg_version');
106 
107 // Security check
108 if (!isModEnabled('accounting')) {
109  accessforbidden();
110 }
111 if ($user->socid > 0) {
112  accessforbidden();
113 }
114 if (!$user->hasRight('accounting', 'mouvements', 'lire')) {
115  accessforbidden();
116 }
117 
118 
119 /*
120  * Actions
121  */
122 
123 if (GETPOST('cancel', 'alpha')) {
124  $action = 'list'; $massaction = '';
125 }
126 if (!GETPOST('confirmmassaction', 'alpha') && $massaction != 'presend' && $massaction != 'confirm_presend') {
127  $massaction = '';
128 }
129 
130 $parameters = array();
131 $reshook = $hookmanager->executeHooks('doActions', $parameters, $object, $action); // Note that $action and $object may have been modified by some hooks
132 if ($reshook < 0) {
133  setEventMessages($hookmanager->error, $hookmanager->errors, 'errors');
134 }
135 
136 if (empty($reshook)) {
137  // Purge search criteria
138  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
139  $search_societe = '';
140  $search_lineid = '';
141  $search_ref = '';
142  $search_invoice = '';
143  $search_label = '';
144  $search_desc = '';
145  $search_amount = '';
146  $search_account = '';
147  $search_vat = '';
148  $search_date_startday = '';
149  $search_date_startmonth = '';
150  $search_date_startyear = '';
151  $search_date_endday = '';
152  $search_date_endmonth = '';
153  $search_date_endyear = '';
154  $search_date_start = '';
155  $search_date_end = '';
156  $search_country = '';
157  $search_tvaintra = '';
158  }
159 
160  // Mass actions
161  $objectclass = 'AccountingAccount';
162  $permissiontoread = $user->hasRight('accounting', 'read');
163  $permissiontodelete = $user->hasRight('accounting', 'delete');
164  $uploaddir = $conf->accounting->dir_output;
165  include DOL_DOCUMENT_ROOT.'/core/actions_massactions.inc.php';
166 }
167 
168 
169 if ($massaction == 'ventil' && $user->hasRight('accounting', 'bind', 'write')) {
170  $msg = '';
171 
172  //print '<div><span style="color:red">' . $langs->trans("Processing") . '...</span></div>';
173  if (!empty($mesCasesCochees)) {
174  $msg = '<div>'.$langs->trans("SelectedLines").': '.count($mesCasesCochees).'</div>';
175  $msg .= '<div class="detail">';
176  $cpt = 0;
177  $ok = 0;
178  $ko = 0;
179 
180  foreach ($mesCasesCochees as $maLigneCochee) {
181  $maLigneCourante = explode("_", $maLigneCochee);
182  $monId = $maLigneCourante[0];
183  $monCompte = GETPOST('codeventil'.$monId);
184 
185  if ($monCompte <= 0) {
186  $msg .= '<div><span style="color:red">'.$langs->trans("Lineofinvoice").' '.$monId.' - '.$langs->trans("NoAccountSelected").'</span></div>';
187  $ko++;
188  } else {
189  $sql = " UPDATE ".MAIN_DB_PREFIX."facturedet";
190  $sql .= " SET fk_code_ventilation = ".((int) $monCompte);
191  $sql .= " WHERE rowid = ".((int) $monId);
192 
193  $accountventilated = new AccountingAccount($db);
194  $accountventilated->fetch($monCompte, '', 1);
195 
196  dol_syslog("accountancy/customer/list.php", LOG_DEBUG);
197  if ($db->query($sql)) {
198  $msg .= '<div><span style="color:green">'.$langs->trans("Lineofinvoice").' '.$monId.' - '.$langs->trans("VentilatedinAccount").' : '.length_accountg($accountventilated->account_number).'</span></div>';
199  $ok++;
200  } else {
201  $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>';
202  $ko++;
203  }
204  }
205 
206  $cpt++;
207  }
208  $msg .= '</div>';
209  $msg .= '<div>'.$langs->trans("EndProcessing").'</div>';
210  }
211 }
212 
213 if (GETPOST('sortfield') == 'f.datef, f.ref, l.rowid') {
214  $value = (GETPOST('sortorder') == 'asc,asc,asc' ? 0 : 1);
215  require_once DOL_DOCUMENT_ROOT.'/core/lib/admin.lib.php';
216  $res = dolibarr_set_const($db, "ACCOUNTING_LIST_SORT_VENTILATION_TODO", $value, 'yesno', 0, '', $conf->entity);
217 }
218 
219 
220 /*
221  * View
222  */
223 
224 $form = new Form($db);
225 $formother = new FormOther($db);
226 
227 llxHeader('', $langs->trans("Ventilation"));
228 
229 if (empty($chartaccountcode)) {
230  print $langs->trans("ErrorChartOfAccountSystemNotSelected");
231  // End of page
232  llxFooter();
233  $db->close();
234  exit;
235 }
236 
237 // Customer Invoice lines
238 $sql = "SELECT f.rowid as facid, f.ref, f.datef, f.type as ftype, f.situation_cycle_ref, f.fk_facture_source,";
239 $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,";
240 $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,";
241 if (!empty($conf->global->MAIN_PRODUCT_PERENTITY_SHARED)) {
242  $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,";
243  $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,";
244 } else {
245  $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,";
246  $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,";
247 }
248 $sql .= " p.tosell as status, p.tobuy as status_buy,";
249 $sql .= " aa.rowid as aarowid, aa2.rowid as aarowid_intra, aa3.rowid as aarowid_export, aa4.rowid as aarowid_thirdparty,";
250 $sql .= " co.code as country_code, co.label as country_label,";
251 $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,";
252 if (!empty($conf->global->MAIN_COMPANY_PERENTITY_SHARED)) {
253  $sql .= " spe.accountancy_code_customer as code_compta_client,";
254  $sql .= " spe.accountancy_code_supplier as code_compta_fournisseur,";
255  $sql .= " spe.accountancy_code_sell as company_code_sell";
256 } else {
257  $sql .= " s.code_compta as code_compta_client,";
258  $sql .= " s.code_compta_fournisseur,";
259  $sql .= " s.accountancy_code_sell as company_code_sell";
260 }
261 $parameters = array();
262 $reshook = $hookmanager->executeHooks('printFieldListSelect', $parameters); // Note that $action and $object may have been modified by hook
263 $sql .= $hookmanager->resPrint;
264 $sql .= " FROM ".MAIN_DB_PREFIX."facture as f";
265 $sql .= " INNER JOIN ".MAIN_DB_PREFIX."societe as s ON s.rowid = f.fk_soc";
266 if (!empty($conf->global->MAIN_COMPANY_PERENTITY_SHARED)) {
267  $sql .= " LEFT JOIN " . MAIN_DB_PREFIX . "societe_perentity as spe ON spe.fk_soc = s.rowid AND spe.entity = " . ((int) $conf->entity);
268 }
269 $sql .= " LEFT JOIN ".MAIN_DB_PREFIX."c_country as co ON co.rowid = s.fk_pays ";
270 $sql .= " INNER JOIN ".MAIN_DB_PREFIX."facturedet as l ON f.rowid = l.fk_facture";
271 $sql .= " LEFT JOIN ".MAIN_DB_PREFIX."product as p ON p.rowid = l.fk_product";
272 if (!empty($conf->global->MAIN_PRODUCT_PERENTITY_SHARED)) {
273  $sql .= " LEFT JOIN " . MAIN_DB_PREFIX . "product_perentity as ppe ON ppe.fk_product = p.rowid AND ppe.entity = " . ((int) $conf->entity);
274 }
275 $alias_societe_perentity = empty($conf->global->MAIN_COMPANY_PERENTITY_SHARED) ? "s" : "spe";
276 $alias_product_perentity = empty($conf->global->MAIN_PRODUCT_PERENTITY_SHARED) ? "p" : "ppe";
277 $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;
278 $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;
279 $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;
280 $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;
281 
282 $sql .= " WHERE f.fk_statut > 0 AND l.fk_code_ventilation <= 0";
283 $sql .= " AND l.product_type <= 2";
284 // Define begin binding date
285 if (!empty($conf->global->ACCOUNTING_DATE_START_BINDING)) {
286  $sql .= " AND f.datef >= '".$db->idate($conf->global->ACCOUNTING_DATE_START_BINDING)."'";
287 }
288 // Add search filter like
289 if ($search_societe) {
290  $sql .= natural_search('s.nom', $search_societe);
291 }
292 if ($search_lineid) {
293  $sql .= natural_search("l.rowid", $search_lineid, 1);
294 }
295 if (strlen(trim($search_invoice))) {
296  $sql .= natural_search("f.ref", $search_invoice);
297 }
298 if (strlen(trim($search_ref))) {
299  $sql .= natural_search("p.ref", $search_ref);
300 }
301 if (strlen(trim($search_label))) {
302  $sql .= natural_search("p.label", $search_label);
303 }
304 if (strlen(trim($search_desc))) {
305  $sql .= natural_search("l.description", $search_desc);
306 }
307 if (strlen(trim($search_amount))) {
308  $sql .= natural_search("l.total_ht", $search_amount, 1);
309 }
310 if (strlen(trim($search_account))) {
311  $sql .= natural_search("aa.account_number", $search_account);
312 }
313 if (strlen(trim($search_vat))) {
314  $sql .= natural_search("l.tva_tx", price2num($search_vat), 1);
315 }
316 if ($search_date_start) {
317  $sql .= " AND f.datef >= '".$db->idate($search_date_start)."'";
318 }
319 if ($search_date_end) {
320  $sql .= " AND f.datef <= '".$db->idate($search_date_end)."'";
321 }
322 if (strlen(trim($search_country))) {
323  $arrayofcode = getCountriesInEEC();
324  $country_code_in_EEC = $country_code_in_EEC_without_me = '';
325  foreach ($arrayofcode as $key => $value) {
326  $country_code_in_EEC .= ($country_code_in_EEC ? "," : "")."'".$value."'";
327  if ($value != $mysoc->country_code) {
328  $country_code_in_EEC_without_me .= ($country_code_in_EEC_without_me ? "," : "")."'".$value."'";
329  }
330  }
331  if ($search_country == 'special_allnotme') {
332  $sql .= " AND co.code <> '".$db->escape($mysoc->country_code)."'";
333  } elseif ($search_country == 'special_eec') {
334  $sql .= " AND co.code IN (".$db->sanitize($country_code_in_EEC, 1).")";
335  } elseif ($search_country == 'special_eecnotme') {
336  $sql .= " AND co.code IN (".$db->sanitize($country_code_in_EEC_without_me, 1).")";
337  } elseif ($search_country == 'special_noteec') {
338  $sql .= " AND co.code NOT IN (".$db->sanitize($country_code_in_EEC, 1).")";
339  } else {
340  $sql .= natural_search("co.code", $search_country);
341  }
342 }
343 if (strlen(trim($search_tvaintra))) {
344  $sql .= natural_search("s.tva_intra", $search_tvaintra);
345 }
346 if (!empty($conf->global->FACTURE_DEPOSITS_ARE_JUST_PAYMENTS)) {
347  $sql .= " AND f.type IN (".Facture::TYPE_STANDARD.",".Facture::TYPE_REPLACEMENT.",".Facture::TYPE_CREDIT_NOTE.",".Facture::TYPE_SITUATION.")";
348 } else {
349  $sql .= " AND f.type IN (".Facture::TYPE_STANDARD.",".Facture::TYPE_REPLACEMENT.",".Facture::TYPE_CREDIT_NOTE.",".Facture::TYPE_DEPOSIT.",".Facture::TYPE_SITUATION.")";
350 }
351 $sql .= " AND f.entity IN (".getEntity('invoice', 0).")"; // We don't share object for accountancy
352 
353 // Add where from hooks
354 $parameters = array();
355 $reshook = $hookmanager->executeHooks('printFieldListWhere', $parameters); // Note that $action and $object may have been modified by hook
356 $sql .= $hookmanager->resPrint;
357 
358 $sql .= $db->order($sortfield, $sortorder);
359 
360 // Count total nb of records
361 $nbtotalofrecords = '';
362 if (!getDolGlobalInt('MAIN_DISABLE_FULL_SCANLIST')) {
363  $result = $db->query($sql);
364  $nbtotalofrecords = $db->num_rows($result);
365  if (($page * $limit) > $nbtotalofrecords) { // if total resultset is smaller then paging size (filtering), goto and load page 0
366  $page = 0;
367  $offset = 0;
368  }
369 }
370 
371 $sql .= $db->plimit($limit + 1, $offset);
372 
373 dol_syslog("accountancy/customer/list.php", LOG_DEBUG);
374 // MAX_JOIN_SIZE can be very low (ex: 300000) on some limited configurations (ex: https://www.online.net/fr/hosting/online-perso)
375 // 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
376 if ($db->type == 'mysqli') {
377  $db->query("SET SQL_BIG_SELECTS=1");
378 }
379 
380 $result = $db->query($sql);
381 if ($result) {
382  $num_lines = $db->num_rows($result);
383  $i = 0;
384 
385  $arrayofselected = is_array($toselect) ? $toselect : array();
386 
387  $param = '';
388  if (!empty($contextpage) && $contextpage != $_SERVER["PHP_SELF"]) {
389  $param .= '&contextpage='.urlencode($contextpage);
390  }
391  if ($limit > 0 && $limit != $conf->liste_limit) {
392  $param .= '&limit='.((int) $limit);
393  }
394  if ($search_societe) {
395  $param .= '&search_societe='.urlencode($search_societe);
396  }
397  if ($search_lineid) {
398  $param .= '&search_lineid='.urlencode($search_lineid);
399  }
400  if ($search_date_startday) {
401  $param .= '&search_date_startday='.urlencode($search_date_startday);
402  }
403  if ($search_date_startmonth) {
404  $param .= '&search_date_startmonth='.urlencode($search_date_startmonth);
405  }
406  if ($search_date_startyear) {
407  $param .= '&search_date_startyear='.urlencode($search_date_startyear);
408  }
409  if ($search_date_endday) {
410  $param .= '&search_date_endday='.urlencode($search_date_endday);
411  }
412  if ($search_date_endmonth) {
413  $param .= '&search_date_endmonth='.urlencode($search_date_endmonth);
414  }
415  if ($search_date_endyear) {
416  $param .= '&search_date_endyear='.urlencode($search_date_endyear);
417  }
418  if ($search_invoice) {
419  $param .= '&search_invoice='.urlencode($search_invoice);
420  }
421  if ($search_ref) {
422  $param .= '&search_ref='.urlencode($search_ref);
423  }
424  if ($search_label) {
425  $param .= '&search_label='.urlencode($search_label);
426  }
427  if ($search_desc) {
428  $param .= '&search_desc='.urlencode($search_desc);
429  }
430  if ($search_amount) {
431  $param .= '&search_amount='.urlencode($search_amount);
432  }
433  if ($search_vat) {
434  $param .= '&search_vat='.urlencode($search_vat);
435  }
436  if ($search_country) {
437  $param .= "&search_country=".urlencode($search_country);
438  }
439  if ($search_tvaintra) {
440  $param .= "&search_tvaintra=".urlencode($search_tvaintra);
441  }
442 
443  $arrayofmassactions = array(
444  'ventil'=>img_picto('', 'check', 'class="pictofixedwidth"').$langs->trans("Ventilate")
445  ,'set_default_account'=>img_picto('', 'check', 'class="pictofixedwidth"').$langs->trans("ConfirmPreselectAccount")
446  //'presend'=>img_picto('', 'email', 'class="pictofixedwidth"').$langs->trans("SendByMail"),
447  //'builddoc'=>img_picto('', 'pdf', 'class="pictofixedwidth"').$langs->trans("PDFMerge"),
448  );
449  //if ($user->hasRight('mymodule', 'supprimer')) $arrayofmassactions['predelete'] = img_picto('', 'delete', 'class="pictofixedwidth"').$langs->trans("Delete");
450  //if (in_array($massaction, array('presend','predelete'))) $arrayofmassactions=array();
451  if ($massaction !== 'set_default_account') {
452  $massactionbutton = $form->selectMassAction('ventil', $arrayofmassactions, 1);
453  }
454 
455  print '<form action="'.$_SERVER["PHP_SELF"].'" method="post">'."\n";
456  print '<input type="hidden" name="action" value="ventil">';
457  if ($optioncss != '') {
458  print '<input type="hidden" name="optioncss" value="'.$optioncss.'">';
459  }
460  print '<input type="hidden" name="token" value="'.newToken().'">';
461  print '<input type="hidden" name="formfilteraction" id="formfilteraction" value="list">';
462  print '<input type="hidden" name="sortfield" value="'.$sortfield.'">';
463  print '<input type="hidden" name="sortorder" value="'.$sortorder.'">';
464  print '<input type="hidden" name="page" value="'.$page.'">';
465 
466  print_barre_liste($langs->trans("InvoiceLines"), $page, $_SERVER["PHP_SELF"], $param, $sortfield, $sortorder, $massactionbutton, $num_lines, $nbtotalofrecords, 'title_accountancy', 0, '', '', $limit);
467 
468  if ($massaction == 'set_default_account') {
469  $formquestion[]=array('type' => 'other',
470  'name' => 'set_default_account',
471  'label' => $langs->trans("AccountancyCode"),
472  'value' => $formaccounting->select_account('', 'default_account', 1, array(), 0, 0, 'maxwidth200 maxwidthonsmartphone', 'cachewithshowemptyone'));
473  print $form->formconfirm($_SERVER["PHP_SELF"], $langs->trans("ConfirmPreselectAccount"), $langs->trans("ConfirmPreselectAccountQuestion", count($toselect)), "confirm_set_default_account", $formquestion, 1, 0, 200, 500, 1);
474  }
475 
476  print '<span class="opacitymedium">'.$langs->trans("DescVentilTodoCustomer").'</span></br><br>';
477 
478  if (!empty($msg)) {
479  print $msg.'<br>';
480  }
481 
482  $moreforfilter = '';
483 
484  print '<div class="div-table-responsive">';
485  print '<table class="tagtable liste'.($moreforfilter ? " listwithfilterbefore" : "").'">'."\n";
486 
487  // We add search filter
488  print '<tr class="liste_titre_filter">';
489  print '<td class="liste_titre"><input type="text" class="flat maxwidth25" name="search_lineid" value="'.dol_escape_htmltag($search_lineid).'"></td>';
490  print '<td class="liste_titre"><input type="text" class="flat maxwidth50" name="search_invoice" value="'.dol_escape_htmltag($search_invoice).'"></td>';
491  print '<td class="liste_titre center">';
492  print '<div class="nowrap">';
493  print $form->selectDate($search_date_start ? $search_date_start : -1, 'search_date_start', 0, 0, 1, '', 1, 0, 0, '', '', '', '', 1, '', $langs->trans('From'));
494  print '</div>';
495  print '<div class="nowrap">';
496  print $form->selectDate($search_date_end ? $search_date_end : -1, 'search_date_end', 0, 0, 1, '', 1, 0, 0, '', '', '', '', 1, '', $langs->trans('to'));
497  print '</div>';
498  print '</td>';
499  print '<td class="liste_titre"><input type="text" class="flat maxwidth50" name="search_ref" value="'.dol_escape_htmltag($search_ref).'"></td>';
500  print '<td class="liste_titre"><input type="text" class="flat maxwidth100" name="search_desc" value="'.dol_escape_htmltag($search_desc).'"></td>';
501  print '<td class="liste_titre right"><input type="text" class="flat maxwidth50 right" name="search_amount" value="'.dol_escape_htmltag($search_amount).'"></td>';
502  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>';
503  print '<td class="liste_titre"><input type="text" class="flat maxwidth75imp" name="search_societe" value="'.dol_escape_htmltag($search_societe).'"></td>';
504  print '<td class="liste_titre">';
505  print $form->select_country($search_country, 'search_country', '', 0, 'maxwidth100', 'code2', 1, 0, 1);
506  //print '<input type="text" class="flat maxwidth50" name="search_country" value="' . dol_escape_htmltag($search_country) . '">';
507  print '</td>';
508  print '<td class="liste_titre"><input type="text" class="flat maxwidth50" name="search_tvaintra" value="'.dol_escape_htmltag($search_tvaintra).'"></td>';
509  print '<td class="liste_titre"></td>';
510  print '<td class="liste_titre"></td>';
511  print '<td class="center liste_titre">';
512  $searchpicto = $form->showFilterButtons();
513  print $searchpicto;
514  print '</td>';
515  print "</tr>\n";
516 
517  print '<tr class="liste_titre">';
518  print_liste_field_titre("LineId", $_SERVER["PHP_SELF"], "l.rowid", "", $param, '', $sortfield, $sortorder);
519  print_liste_field_titre("Invoice", $_SERVER["PHP_SELF"], "f.ref", "", $param, '', $sortfield, $sortorder);
520  print_liste_field_titre("Date", $_SERVER["PHP_SELF"], "f.datef, f.ref, l.rowid", "", $param, '', $sortfield, $sortorder, 'center ');
521  print_liste_field_titre("ProductRef", $_SERVER["PHP_SELF"], "p.ref", "", $param, '', $sortfield, $sortorder);
522  //print_liste_field_titre("ProductLabel", $_SERVER["PHP_SELF"], "p.label", "", $param, '', $sortfield, $sortorder);
523  print_liste_field_titre("ProductDescription", $_SERVER["PHP_SELF"], "l.description", "", $param, '', $sortfield, $sortorder);
524  print_liste_field_titre("Amount", $_SERVER["PHP_SELF"], "l.total_ht", "", $param, '', $sortfield, $sortorder, 'right maxwidth50 ');
525  print_liste_field_titre("VATRate", $_SERVER["PHP_SELF"], "l.tva_tx", "", $param, '', $sortfield, $sortorder, 'right ', '', 1);
526  print_liste_field_titre("ThirdParty", $_SERVER["PHP_SELF"], "s.nom", "", $param, '', $sortfield, $sortorder);
527  print_liste_field_titre("Country", $_SERVER["PHP_SELF"], "co.label", "", $param, '', $sortfield, $sortorder);
528  print_liste_field_titre("VATIntraShort", $_SERVER["PHP_SELF"], "s.tva_intra", "", $param, '', $sortfield, $sortorder);
529  print_liste_field_titre("DataUsedToSuggestAccount", '', '', '', '', '', '', '', 'nowraponall ');
530  print_liste_field_titre("AccountAccountingSuggest", '', '', '', '', '', '', '', 'center ');
531  $checkpicto = '';
532  if ($massactionbutton) {
533  $checkpicto = $form->showCheckAddButtons('checkforselect', 1);
534  }
535  print_liste_field_titre($checkpicto, '', '', '', '', '', '', '', 'center ');
536  print "</tr>\n";
537 
538  $thirdpartystatic = new Societe($db);
539  $facture_static = new Facture($db);
540  $facture_static_det = new FactureLigne($db);
541  $product_static = new Product($db);
542 
543 
544  $accountingaccount_codetotid_cache = array();
545 
546  while ($i < min($num_lines, $limit)) {
547  $objp = $db->fetch_object($result);
548 
549  // product_type: 0 = service, 1 = product
550  // if product does not exist we use the value of product_type provided in facturedet to define if this is a product or service
551  // issue : if we change product_type value in product DB it should differ from the value stored in facturedet DB !
552  $code_sell_l = '';
553  $code_sell_p = '';
554  $code_sell_t = '';
555 
556  $thirdpartystatic->id = $objp->socid;
557  $thirdpartystatic->name = $objp->name;
558  $thirdpartystatic->client = $objp->client;
559  $thirdpartystatic->fournisseur = $objp->fournisseur;
560  $thirdpartystatic->code_client = $objp->code_client;
561  $thirdpartystatic->code_compta = $objp->code_compta_client; // For backward compatibility
562  $thirdpartystatic->code_compta_client = $objp->code_compta_client;
563  $thirdpartystatic->code_fournisseur = $objp->code_fournisseur;
564  $thirdpartystatic->code_compta_fournisseur = $objp->code_compta_fournisseur;
565  $thirdpartystatic->email = $objp->email;
566  $thirdpartystatic->country_code = $objp->country_code;
567  $thirdpartystatic->tva_intra = $objp->tva_intra;
568  $thirdpartystatic->code_compta_product = $objp->company_code_sell; // The accounting account for product stored on thirdparty object (for level3 suggestion)
569 
570  $product_static->ref = $objp->product_ref;
571  $product_static->id = $objp->product_id;
572  $product_static->type = $objp->type;
573  $product_static->label = $objp->product_label;
574  $product_static->status = $objp->status;
575  $product_static->status_buy = $objp->status_buy;
576  $product_static->accountancy_code_sell = $objp->code_sell;
577  $product_static->accountancy_code_sell_intra = $objp->code_sell_intra;
578  $product_static->accountancy_code_sell_export = $objp->code_sell_export;
579  $product_static->accountancy_code_buy = $objp->code_buy;
580  $product_static->accountancy_code_buy_intra = $objp->code_buy_intra;
581  $product_static->accountancy_code_buy_export = $objp->code_buy_export;
582  $product_static->tva_tx = $objp->tva_tx_prod;
583 
584  $facture_static->ref = $objp->ref;
585  $facture_static->id = $objp->facid;
586  $facture_static->type = $objp->ftype;
587  $facture_static->date = $db->jdate($objp->datef);
588  $facture_static->fk_facture_source = $objp->fk_facture_source;
589 
590  $facture_static_det->id = $objp->rowid;
591  $facture_static_det->total_ht = $objp->total_ht;
592  $facture_static_det->tva_tx = $objp->tva_tx_line;
593  $facture_static_det->vat_src_code = $objp->vat_src_code;
594  $facture_static_det->product_type = $objp->type_l;
595  $facture_static_det->desc = $objp->description;
596 
597  $accountingAccountArray = array(
598  'dom'=>$objp->aarowid,
599  'intra'=>$objp->aarowid_intra,
600  'export'=>$objp->aarowid_export,
601  'thirdparty' =>$objp->aarowid_thirdparty);
602 
603  $code_sell_p_notset = '';
604  $code_sell_t_notset = '';
605 
606  $suggestedid = 0;
607 
608  $return=$accountingAccount->getAccountingCodeToBind($thirdpartystatic, $mysoc, $product_static, $facture_static, $facture_static_det, $accountingAccountArray, 'customer');
609  if (!is_array($return) && $return<0) {
610  setEventMessage($accountingAccount->error, 'errors');
611  } else {
612  $suggestedid=$return['suggestedid'];
613  $suggestedaccountingaccountfor=$return['suggestedaccountingaccountfor'];
614  $suggestedaccountingaccountbydefaultfor=$return['suggestedaccountingaccountbydefaultfor'];
615  $code_sell_l=$return['code_l'];
616  $code_sell_p=$return['code_p'];
617  $code_sell_t=$return['code_t'];
618  }
619  //var_dump($return);
620 
621  if (!empty($code_sell_p)) {
622  // Value was defined previously
623  } else {
624  $code_sell_p_notset = 'color:orange';
625  }
626  if (empty($code_sell_l) && empty($code_sell_p)) {
627  $code_sell_p_notset = 'color:red';
628  }
629  if ($suggestedaccountingaccountfor == 'eecwithoutvatnumber' && empty($code_sell_p_notset)) {
630  $code_sell_p_notset = 'color:orange';
631  }
632 
633  // $code_sell_l is now default code of product/service
634  // $code_sell_p is now code of product/service
635  // $code_sell_t is now code of thirdparty
636  //var_dump($code_sell_l.' - '.$code_sell_p.' - '.$code_sell_t.' -> '.$suggestedid.' ('.$suggestedaccountingaccountbydefaultfor.' '.$suggestedaccountingaccountfor.')');
637 
638  print '<tr class="oddeven">';
639 
640  // Line id
641  print '<td>'.$facture_static_det->id.'</td>';
642 
643  // Ref Invoice
644  print '<td class="nowraponall">'.$facture_static->getNomUrl(1).'</td>';
645 
646  print '<td class="center">'.dol_print_date($facture_static->date, 'day').'</td>';
647 
648  // Ref Product
649  print '<td class="tdoverflowmax100">';
650  if ($product_static->id > 0) {
651  print $product_static->getNomUrl(1);
652  }
653  if ($product_static->label) {
654  print '<br><span class="opacitymedium small">'.dol_escape_htmltag($product_static->label).'</span>';
655  }
656  print '</td>';
657 
658  // Description of line
659  print '<td class="tdoverflowonsmartphone small">';
660  $text = dolGetFirstLineOfText(dol_string_nohtmltag($facture_static_det->desc, 1));
661  $trunclength = empty($conf->global->ACCOUNTING_LENGTH_DESCRIPTION) ? 32 : $conf->global->ACCOUNTING_LENGTH_DESCRIPTION;
662  print $form->textwithtooltip(dol_trunc($text, $trunclength), $facture_static_det->desc);
663  print '</td>';
664 
665  // Amount
666  print '<td class="right nowraponall amount">';
667 
668  // Create a compensation rate for old situation invoice feature.
669  $situation_ratio = 1;
670  if (getDolGlobalInt('INVOICE_USE_SITUATION') == 1) {
671  if ($objp->situation_cycle_ref) {
672  // Avoid divide by 0
673  if ($objp->situation_percent == 0) {
674  $situation_ratio = 0;
675  } else {
676  $line = new FactureLigne($db);
677  $line->fetch($objp->rowid);
678 
679  // Situation invoices handling
680  $prev_progress = $line->get_prev_progress($objp->facid);
681 
682  $situation_ratio = ($objp->situation_percent - $prev_progress) / $objp->situation_percent;
683  }
684  }
685  print price($objp->total_ht * $situation_ratio);
686  } else {
687  print price($objp->total_ht);
688  }
689  print '</td>';
690 
691  // Vat rate
692  $code_vat_differ = '';
693  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
694  $code_vat_differ = 'warning bold';
695  }
696  print '<td class="right'.($code_vat_differ?' '.$code_vat_differ:'').'">';
697  print vatrate($facture_static_det->tva_tx.($facture_static_det->vat_src_code ? ' ('.$facture_static_det->vat_src_code.')' : ''));
698  print '</td>';
699 
700  // Thirdparty
701  print '<td class="tdoverflowmax100">'.$thirdpartystatic->getNomUrl(1, 'customer').'</td>';
702 
703  // Country
704  $labelcountry = ($objp->country_code && ($langs->trans("Country".$objp->country_code) != "Country".$objp->country_code)) ? $langs->trans("Country".$objp->country_code) : $objp->country_label;
705  print '<td class="tdoverflowmax100" title="'.dol_escape_htmltag($labelcountry).'">';
706  print dol_escape_htmltag($labelcountry);
707  print '</td>';
708 
709  // VAT Num
710  print '<td class="tdoverflowmax80" title="'.dol_escape_htmltag($objp->tva_intra).'">'.dol_escape_htmltag($objp->tva_intra).'</td>';
711 
712  // Found accounts
713  print '<td class="small">';
714  // First show default account for any products
715  $s = '1. '.(($facture_static_det->product_type == 1) ? $langs->trans("DefaultForService") : $langs->trans("DefaultForProduct")).': ';
716  $shelp = ''; $ttype = 'help';
717  if ($suggestedaccountingaccountbydefaultfor == 'eec') {
718  $shelp .= $langs->trans("SaleEEC");
719  } elseif ($suggestedaccountingaccountbydefaultfor == 'eecwithvat') {
720  $shelp = $langs->trans("SaleEECWithVAT");
721  } elseif ($suggestedaccountingaccountbydefaultfor == 'eecwithoutvatnumber') {
722  $shelp = $langs->trans("SaleEECWithoutVATNumber");
723  $ttype = 'warning';
724  } elseif ($suggestedaccountingaccountbydefaultfor == 'export') {
725  $shelp .= $langs->trans("SaleExport");
726  }
727  $s .= ($code_sell_l > 0 ? length_accountg($code_sell_l) : '<span style="'.$code_sell_p_notset.'">'.$langs->trans("NotDefined").'</span>');
728  print $form->textwithpicto($s, $shelp, 1, $ttype, '', 0, 2, '', 1);
729  // Now show account for product
730  if ($product_static->id > 0) {
731  print '<br>';
732  $s = '2. '.(($facture_static_det->product_type == 1) ? $langs->trans("ThisService") : $langs->trans("ThisProduct")).': ';
733  $shelp = ''; $ttype = 'help';
734  if ($suggestedaccountingaccountfor == 'eec') {
735  $shelp = $langs->trans("SaleEEC");
736  } elseif ($suggestedaccountingaccountfor == 'eecwithvat') {
737  $shelp = $langs->trans("SaleEECWithVAT");
738  } elseif ($suggestedaccountingaccountfor == 'eecwithoutvatnumber') {
739  $shelp = $langs->trans("SaleEECWithoutVATNumber");
740  $ttype = 'warning';
741  } elseif ($suggestedaccountingaccountfor == 'export') {
742  $shelp = $langs->trans("SaleExport");
743  }
744  $s .= (empty($code_sell_p) ? '<span style="'.$code_sell_p_notset.'">'.$langs->trans("NotDefined").'</span>' : length_accountg($code_sell_p));
745  print $form->textwithpicto($s, $shelp, 1, $ttype, '', 0, 2, '', 1);
746  } else {
747  print '<br>';
748  $s = '2. '.(($objp->type_l == 1) ? $langs->trans("ThisService") : $langs->trans("ThisProduct")).': ';
749  $shelp = '';
750  $s .= $langs->trans("NotDefined");
751  print $form->textwithpicto($s, $shelp, 1, 'help', '', 0, 2, '', 1);
752  }
753  if (!empty($conf->global->ACCOUNTANCY_USE_PRODUCT_ACCOUNT_ON_THIRDPARTY)) {
754  print '<br>';
755  $s = '3. '.(($facture_static_det->product_type == 1) ? $langs->trans("ServiceForThisThirdparty") : $langs->trans("ProductForThisThirdparty")).': ';
756  $shelp = '';
757  $s .= ($code_sell_t > 0 ? length_accountg($code_sell_t) : '<span style="'.$code_sell_t_notset.'">'.$langs->trans("NotDefined").'</span>');
758  print $form->textwithpicto($s, $shelp, 1, 'help', '', 0, 2, '', 1);
759  }
760  print '</td>';
761 
762  // Suggested accounting account
763  print '<td>';
764  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');
765  print '</td>';
766 
767  // Column with checkbox
768  print '<td class="center">';
769  $ischecked = 0;
770  if (!empty($suggestedid) && $suggestedaccountingaccountfor != '' && $suggestedaccountingaccountfor != 'eecwithoutvatnumber') {
771  $ischecked = 1;
772  }
773 
774  if (!empty($toselect)) {
775  $ischecked = 0;
776  if (in_array($objp->rowid."_".$i, $toselect)) {
777  $ischecked=1;
778  }
779  }
780 
781  print '<input type="checkbox" class="flat checkforselect checkforselect'.$facture_static_det->id.'" name="toselect[]" value="'.$facture_static_det->id."_".$i.'"'.($ischecked ? " checked" : "").'/>';
782  print '</td>';
783 
784  print '</tr>';
785  $i++;
786  }
787  if ($num_lines == 0) {
788  print '<tr><td colspan="13"><span class="opacitymedium">'.$langs->trans("NoRecordFound").'</span></td></tr>';
789  }
790 
791  print '</table>';
792  print "</div>";
793 
794  print '</form>';
795 } else {
796  print $db->error();
797 }
798 if ($db->type == 'mysqli') {
799  $db->query("SET SQL_BIG_SELECTS=0"); // Enable MAX_JOIN_SIZE limitation
800 }
801 
802 // Add code to auto check the box when we select an account
803 print '<script type="text/javascript">
804 jQuery(document).ready(function() {
805  jQuery(".codeventil").change(function() {
806  var s=$(this).attr("id").replace("codeventil", "")
807  console.log(s+" "+$(this).val());
808  if ($(this).val() == -1) jQuery(".checkforselect"+s).prop("checked", false);
809  else jQuery(".checkforselect"+s).prop("checked", true);
810  });
811 });
812 </script>';
813 
814 // End of page
815 llxFooter();
816 $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).
Definition: admin.lib.php:638
if(!defined('NOREQUIRESOC')) if(!defined('NOREQUIRETRAN')) if(!defined('NOTOKENRENEWAL')) if(!defined('NOREQUIREMENU')) if(!defined('NOREQUIREHTML')) if(!defined('NOREQUIREAJAX')) llxHeader()
Empty header.
Definition: wrapper.php:56
llxFooter()
Empty footer.
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.
Classe 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...
if(isModEnabled('facture') && $user->hasRight('facture', 'lire')) if((isModEnabled('fournisseur') &&empty($conf->global->MAIN_USE_NEW_SUPPLIERMOD) && $user->hasRight("fournisseur", "facture", "lire"))||(isModEnabled('supplier_invoice') && $user->hasRight("supplier_invoice", "lire"))) if(isModEnabled('don') && $user->hasRight('don', 'lire')) if(isModEnabled('tax') &&!empty($user->rights->tax->charges->lire)) if(isModEnabled('facture') &&isModEnabled('commande') && $user->hasRight("commande", "lire") &&empty($conf->global->WORKFLOW_DISABLE_CREATE_INVOICE_FROM_ORDER)) $sql
Social contributions to pay.
Definition: index.php:746
if($cancel &&! $id) if($action=='add' &&! $cancel) if($action=='delete') if($id) $form
Actions.
Definition: card.php:143
dol_mktime($hour, $minute, $second, $month, $day, $year, $gm='auto', $check=1)
Return a timestamp date built from detailed informations (by default a local PHP server timestamp) Re...
vatrate($rate, $addpercent=false, $info_bits=0, $usestarfornpr=0, $html=0)
Return a string with VAT rate label formated for view output Used into pdf and HTML pages.
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 dolibarr global constant int value.
img_picto($titlealt, $picto, $moreatt='', $pictoisfullpath=false, $srconly=0, $notitle=0, $alt='', $morecss='', $marginleftonlyshort=2)
Show picto whatever it's its name (generic function)
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.
setEventMessages($mesg, $mesgs, $style='mesgs', $messagekey='', $noduplicate=0)
Set event messages in dol_events session object.
print_barre_liste($titre, $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.
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.
GETPOSTISSET($paramname)
Return true if we are in a context of submitting the parameter $paramname from a POST of a form.
isModEnabled($module)
Is Dolibarr module enabled.
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...
if(!defined( 'CSRFCHECK_WITH_TOKEN'))
accessforbidden($message='', $printheader=1, $printfooter=1, $showonlymessage=0, $params=null)
Show a message to say access is forbidden and stop program.