dolibarr 18.0.6
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-2022 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) 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 = GETPOST('default_account', 'int');
53
54// Select Box
55$mesCasesCochees = GETPOST('toselect', 'array');
56
57// Search Getpost
58$search_societe = GETPOST('search_societe', 'alpha');
59$search_lineid = GETPOST('search_lineid', 'int');
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 = GETPOST('search_date_startday', 'int');
69$search_date_startmonth = GETPOST('search_date_startmonth', 'int');
70$search_date_startyear = GETPOST('search_date_startyear', 'int');
71$search_date_endday = GETPOST('search_date_endday', 'int');
72$search_date_endmonth = GETPOST('search_date_endmonth', 'int');
73$search_date_endyear = GETPOST('search_date_endyear', 'int');
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', 'alpha');
77$search_tvaintra = GETPOST('search_tvaintra', 'alpha');
78
79// Load variable for pagination
80$limit = GETPOST('limit', 'int') ?GETPOST('limit', 'int') : (empty($conf->global->ACCOUNTING_LIMIT_LIST_VENTILATION) ? $conf->liste_limit : $conf->global->ACCOUNTING_LIMIT_LIST_VENTILATION);
81$sortfield = GETPOST('sortfield', 'aZ09comma');
82$sortorder = GETPOST('sortorder', 'aZ09comma');
83$page = GETPOSTISSET('pageplusone') ? (GETPOST('pageplusone') - 1) : GETPOST("page", 'int');
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 ($conf->global->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', 'mouvements', 'lire')) {
118}
119
120
121/*
122 * Actions
123 */
124
125if (GETPOST('cancel', 'alpha')) {
126 $action = 'list'; $massaction = '';
127}
128if (!GETPOST('confirmmassaction', 'alpha') && $massaction != 'presend' && $massaction != 'confirm_presend') {
129 $massaction = '';
130}
131
132$parameters = array();
133$reshook = $hookmanager->executeHooks('doActions', $parameters, $object, $action); // Note that $action and $object may have been modified by some hooks
134if ($reshook < 0) {
135 setEventMessages($hookmanager->error, $hookmanager->errors, 'errors');
136}
137
138if (empty($reshook)) {
139 // Purge search criteria
140 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
141 $search_societe = '';
142 $search_lineid = '';
143 $search_ref = '';
144 $search_ref_supplier = '';
145 $search_invoice = '';
146 $search_label = '';
147 $search_desc = '';
148 $search_amount = '';
149 $search_account = '';
150 $search_vat = '';
151 $search_date_startday = '';
152 $search_date_startmonth = '';
153 $search_date_startyear = '';
154 $search_date_endday = '';
155 $search_date_endmonth = '';
156 $search_date_endyear = '';
157 $search_date_start = '';
158 $search_date_end = '';
159 $search_country = '';
160 $search_tvaintra = '';
161 }
162
163 // Mass actions
164 $objectclass = 'AccountingAccount';
165 $permissiontoread = $user->hasRight('accounting', 'read');
166 $permissiontodelete = $user->hasRight('accounting', 'delete');
167 $uploaddir = $conf->accounting->dir_output;
168 include DOL_DOCUMENT_ROOT.'/core/actions_massactions.inc.php';
169}
170
171
172if ($massaction == 'ventil' && $user->hasRight('accounting', 'bind', 'write')) {
173 $msg = '';
174
175 if (!empty($mesCasesCochees)) {
176 $msg = '<div>'.$langs->trans("SelectedLines").': '.count($mesCasesCochees).'</div>';
177 $msg .= '<div class="detail">';
178 $cpt = 0;
179 $ok = 0;
180 $ko = 0;
181
182 foreach ($mesCasesCochees as $maLigneCochee) {
183 $maLigneCourante = explode("_", $maLigneCochee);
184 $monId = $maLigneCourante[0];
185 $monCompte = GETPOST('codeventil'.$monId);
186
187 if ($monCompte <= 0) {
188 $msg .= '<div><span class="error">'.$langs->trans("Lineofinvoice").' '.$monId.' - '.$langs->trans("NoAccountSelected").'</span></div>';
189 $ko++;
190 } else {
191 $sql = " UPDATE ".MAIN_DB_PREFIX."facture_fourn_det";
192 $sql .= " SET fk_code_ventilation = ".((int) $monCompte);
193 $sql .= " WHERE rowid = ".((int) $monId);
194
195 $accountventilated = new AccountingAccount($db);
196 $accountventilated->fetch($monCompte, '', 1);
197
198 dol_syslog('accountancy/supplier/list.php', LOG_DEBUG);
199 if ($db->query($sql)) {
200 $msg .= '<div><span class="green">'.$langs->trans("Lineofinvoice").' '.$monId.' - '.$langs->trans("VentilatedinAccount").' : '.length_accountg($accountventilated->account_number).'</span></div>';
201 $ok++;
202 } else {
203 $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>';
204 $ko++;
205 }
206 }
207
208 $cpt++;
209 }
210 $msg .= '</div>';
211 $msg .= '<div>'.$langs->trans("EndProcessing").'</div>';
212 }
213}
214
215if (GETPOST('sortfield') == 'f.datef, f.ref, l.rowid') {
216 $value = (GETPOST('sortorder') == 'asc,asc,asc' ? 0 : 1);
217 require_once DOL_DOCUMENT_ROOT.'/core/lib/admin.lib.php';
218 $res = dolibarr_set_const($db, "ACCOUNTING_LIST_SORT_VENTILATION_TODO", $value, 'yesno', 0, '', $conf->entity);
219}
220
221
222/*
223 * View
224 */
225
226$form = new Form($db);
227$formother = new FormOther($db);
228
229llxHeader('', $langs->trans("SuppliersVentilation"));
230
231if (empty($chartaccountcode)) {
232 print $langs->trans("ErrorChartOfAccountSystemNotSelected");
233 // End of page
234 llxFooter();
235 $db->close();
236 exit;
237}
238
239// Supplier Invoice Lines
240$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,";
241$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,";
242$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,";
243if (!empty($conf->global->MAIN_PRODUCT_PERENTITY_SHARED)) {
244 $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,";
245 $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,";
246} else {
247 $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,";
248 $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,";
249}
250$sql .= " p.tosell as status, p.tobuy as status_buy,";
251$sql .= " aa.rowid as aarowid, aa2.rowid as aarowid_intra, aa3.rowid as aarowid_export, aa4.rowid as aarowid_thirdparty,";
252$sql .= " co.code as country_code, co.label as country_label,";
253$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,";
254if (!empty($conf->global->MAIN_COMPANY_PERENTITY_SHARED)) {
255 $sql .= " spe.accountancy_code_customer as code_compta_client,";
256 $sql .= " spe.accountancy_code_supplier as code_compta_fournisseur,";
257 $sql .= " spe.accountancy_code_buy as company_code_buy";
258} else {
259 $sql .= " s.code_compta as code_compta_client,";
260 $sql .= " s.code_compta_fournisseur,";
261 $sql .= " s.accountancy_code_buy as company_code_buy";
262}
263$parameters = array();
264$reshook = $hookmanager->executeHooks('printFieldListSelect', $parameters); // Note that $action and $object may have been modified by hook
265$sql .= $hookmanager->resPrint;
266$sql .= " FROM ".MAIN_DB_PREFIX."facture_fourn as f";
267$sql .= " INNER JOIN ".MAIN_DB_PREFIX."societe as s ON s.rowid = f.fk_soc";
268if (!empty($conf->global->MAIN_COMPANY_PERENTITY_SHARED)) {
269 $sql .= " LEFT JOIN " . MAIN_DB_PREFIX . "societe_perentity as spe ON spe.fk_soc = s.rowid AND spe.entity = " . ((int) $conf->entity);
270}
271$sql .= " LEFT JOIN ".MAIN_DB_PREFIX."c_country as co ON co.rowid = s.fk_pays ";
272$sql .= " INNER JOIN ".MAIN_DB_PREFIX."facture_fourn_det as l ON f.rowid = l.fk_facture_fourn";
273$sql .= " LEFT JOIN ".MAIN_DB_PREFIX."product as p ON p.rowid = l.fk_product";
274if (!empty($conf->global->MAIN_PRODUCT_PERENTITY_SHARED)) {
275 $sql .= " LEFT JOIN " . MAIN_DB_PREFIX . "product_perentity as ppe ON ppe.fk_product = p.rowid AND ppe.entity = " . ((int) $conf->entity);
276}
277$alias_societe_perentity = empty($conf->global->MAIN_COMPANY_PERENTITY_SHARED) ? "s" : "spe";
278$alias_product_perentity = empty($conf->global->MAIN_PRODUCT_PERENTITY_SHARED) ? "p" : "ppe";
279$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;
280$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;
281$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;
282$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;
283$sql .= " WHERE f.fk_statut > 0 AND l.fk_code_ventilation <= 0";
284$sql .= " AND l.product_type <= 2";
285// Define begin binding date
286if (!empty($conf->global->ACCOUNTING_DATE_START_BINDING)) {
287 $sql .= " AND f.datef >= '".$db->idate($conf->global->ACCOUNTING_DATE_START_BINDING)."'";
288}
289// Add search filter like
290if ($search_societe) {
291 $sql .= natural_search('s.nom', $search_societe);
292}
293if ($search_lineid) {
294 $sql .= natural_search("l.rowid", $search_lineid, 1);
295}
296if (strlen(trim($search_invoice))) {
297 $sql .= natural_search(array("f.ref", "f.ref_supplier"), $search_invoice);
298}
299if (strlen(trim($search_ref))) {
300 $sql .= natural_search("p.ref", $search_ref);
301}
302/*if (strlen(trim($search_ref_supplier))) {
303 $sql .= natural_search("f.ref_supplier", $search_ref_supplier);
304}*/
305if (strlen(trim($search_label))) {
306 $sql .= natural_search(array("p.label", "f.libelle"), $search_label);
307}
308if (strlen(trim($search_desc))) {
309 $sql .= natural_search("l.description", $search_desc);
310}
311if (strlen(trim($search_amount))) {
312 $sql .= natural_search("l.total_ht", $search_amount, 1);
313}
314if (strlen(trim($search_account))) {
315 $sql .= natural_search("aa.account_number", $search_account);
316}
317if (strlen(trim($search_vat))) {
318 $sql .= natural_search("l.tva_tx", price2num($search_vat), 1);
319}
320if ($search_date_start) {
321 $sql .= " AND f.datef >= '".$db->idate($search_date_start)."'";
322}
323if ($search_date_end) {
324 $sql .= " AND f.datef <= '".$db->idate($search_date_end)."'";
325}
326if (strlen(trim($search_country))) {
327 $arrayofcode = getCountriesInEEC();
328 $country_code_in_EEC = $country_code_in_EEC_without_me = '';
329 foreach ($arrayofcode as $key => $value) {
330 $country_code_in_EEC .= ($country_code_in_EEC ? "," : "")."'".$value."'";
331 if ($value != $mysoc->country_code) {
332 $country_code_in_EEC_without_me .= ($country_code_in_EEC_without_me ? "," : "")."'".$value."'";
333 }
334 }
335 if ($search_country == 'special_allnotme') {
336 $sql .= " AND co.code <> '".$db->escape($mysoc->country_code)."'";
337 } elseif ($search_country == 'special_eec') {
338 $sql .= " AND co.code IN (".$db->sanitize($country_code_in_EEC, 1).")";
339 } elseif ($search_country == 'special_eecnotme') {
340 $sql .= " AND co.code IN (".$db->sanitize($country_code_in_EEC_without_me, 1).")";
341 } elseif ($search_country == 'special_noteec') {
342 $sql .= " AND co.code NOT IN (".$db->sanitize($country_code_in_EEC, 1).")";
343 } else {
344 $sql .= natural_search("co.code", $search_country);
345 }
346}
347if (strlen(trim($search_tvaintra))) {
348 $sql .= natural_search("s.tva_intra", $search_tvaintra);
349}
350if (!empty($conf->global->FACTURE_SUPPLIER_DEPOSITS_ARE_JUST_PAYMENTS)) {
351 $sql .= " AND f.type IN (".FactureFournisseur::TYPE_STANDARD.",".FactureFournisseur::TYPE_REPLACEMENT.",".FactureFournisseur::TYPE_CREDIT_NOTE.",".FactureFournisseur::TYPE_SITUATION.")";
352} else {
354}
355$sql .= " AND f.entity IN (".getEntity('facture_fourn', 0).")"; // We don't share object for accountancy
356
357// Add where from hooks
358$parameters = array();
359$reshook = $hookmanager->executeHooks('printFieldListWhere', $parameters); // Note that $action and $object may have been modified by hook
360$sql .= $hookmanager->resPrint;
361
362$sql .= $db->order($sortfield, $sortorder);
363
364// Count total nb of records
365$nbtotalofrecords = '';
366if (!getDolGlobalInt('MAIN_DISABLE_FULL_SCANLIST')) {
367 $result = $db->query($sql);
368 $nbtotalofrecords = $db->num_rows($result);
369 if (($page * $limit) > $nbtotalofrecords) { // if total resultset is smaller then paging size (filtering), goto and load page 0
370 $page = 0;
371 $offset = 0;
372 }
373}
374
375$sql .= $db->plimit($limit + 1, $offset);
376
377dol_syslog('accountancy/supplier/list.php', LOG_DEBUG);
378// MAX_JOIN_SIZE can be very low (ex: 300000) on some limited configurations (ex: https://www.online.net/fr/hosting/online-perso)
379// 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
380if ($db->type == 'mysqli') {
381 $db->query("SET SQL_BIG_SELECTS=1");
382}
383
384$result = $db->query($sql);
385if ($result) {
386 $num_lines = $db->num_rows($result);
387 $i = 0;
388
389 $arrayofselected = is_array($toselect) ? $toselect : array();
390
391 $param = '';
392 if (!empty($contextpage) && $contextpage != $_SERVER["PHP_SELF"]) {
393 $param .= '&contextpage='.urlencode($contextpage);
394 }
395 if ($limit > 0 && $limit != $conf->liste_limit) {
396 $param .= '&limit='.((int) $limit);
397 }
398 if ($search_societe) {
399 $param .= '&search_societe='.urlencode($search_societe);
400 }
401 if ($search_lineid) {
402 $param .= '&search_lineid='.urlencode($search_lineid);
403 }
404 if ($search_date_startday) {
405 $param .= '&search_date_startday='.urlencode($search_date_startday);
406 }
407 if ($search_date_startmonth) {
408 $param .= '&search_date_startmonth='.urlencode($search_date_startmonth);
409 }
410 if ($search_date_startyear) {
411 $param .= '&search_date_startyear='.urlencode($search_date_startyear);
412 }
413 if ($search_date_endday) {
414 $param .= '&search_date_endday='.urlencode($search_date_endday);
415 }
416 if ($search_date_endmonth) {
417 $param .= '&search_date_endmonth='.urlencode($search_date_endmonth);
418 }
419 if ($search_date_endyear) {
420 $param .= '&search_date_endyear='.urlencode($search_date_endyear);
421 }
422 if ($search_invoice) {
423 $param .= '&search_invoice='.urlencode($search_invoice);
424 }
425 if ($search_ref) {
426 $param .= '&search_ref='.urlencode($search_ref);
427 }
428 if ($search_ref_supplier) {
429 $param .= '&search_ref_supplier='.urlencode($search_ref_supplier);
430 }
431 if ($search_label) {
432 $param .= '&search_label='.urlencode($search_label);
433 }
434 if ($search_desc) {
435 $param .= '&search_desc='.urlencode($search_desc);
436 }
437 if ($search_amount) {
438 $param .= '&search_amount='.urlencode($search_amount);
439 }
440 if ($search_vat) {
441 $param .= '&search_vat='.urlencode($search_vat);
442 }
443 if ($search_country) {
444 $param .= "&search_country=".urlencode($search_country);
445 }
446 if ($search_tvaintra) {
447 $param .= "&search_tvaintra=".urlencode($search_tvaintra);
448 }
449
450 $arrayofmassactions = array(
451 'ventil'=>img_picto('', 'check', 'class="pictofixedwidth"').$langs->trans("Ventilate")
452 ,'set_default_account'=>img_picto('', 'check', 'class="pictofixedwidth"').$langs->trans("ConfirmPreselectAccount")
453 //'presend'=>img_picto('', 'email', 'class="pictofixedwidth"').$langs->trans("SendByMail"),
454 //'builddoc'=>img_picto('', 'pdf', 'class="pictofixedwidth"').$langs->trans("PDFMerge"),
455 );
456 //if ($user->hasRight('mymodule', 'supprimer')) $arrayofmassactions['predelete'] = img_picto('', 'delete', 'class="pictofixedwidth"').$langs->trans("Delete");
457 //if (in_array($massaction, array('presend','predelete'))) $arrayofmassactions=array();
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 print_barre_liste($langs->trans("InvoiceLines"), $page, $_SERVER["PHP_SELF"], $param, $sortfield, $sortorder, $massactionbutton, $num_lines, $nbtotalofrecords, 'title_accountancy', 0, '', '', $limit);
474
475 if ($massaction == 'set_default_account') {
476 $formquestion[]=array('type' => 'other',
477 'name' => 'set_default_account',
478 'label' => $langs->trans("AccountancyCode"),
479 'value' => $formaccounting->select_account('', 'default_account', 1, array(), 0, 0, 'maxwidth200 maxwidthonsmartphone', 'cachewithshowemptyone'));
480 print $form->formconfirm($_SERVER["PHP_SELF"], $langs->trans("ConfirmPreselectAccount"), $langs->trans("ConfirmPreselectAccountQuestion", count($toselect)), "confirm_set_default_account", $formquestion, 1, 0, 200, 500, 1);
481 }
482
483 print '<span class="opacitymedium">'.$langs->trans("DescVentilTodoCustomer").'</span></br><br>';
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"><input type="text" class="flat maxwidth50" name="search_ref_supplier" value="'.dol_escape_htmltag($search_ref_supplier).'"></td>';
499 print '<td class="liste_titre"><input type="text" class="flat maxwidth50" name="search_label" value="'.dol_escape_htmltag($search_label).'"></td>';
500 print '<td class="liste_titre center">';
501 print '<div class="nowrap">';
502 print $form->selectDate($search_date_start ? $search_date_start : -1, 'search_date_start', 0, 0, 1, '', 1, 0, 0, '', '', '', '', 1, '', $langs->trans('From'));
503 print '</div>';
504 print '<div class="nowrap">';
505 print $form->selectDate($search_date_end ? $search_date_end : -1, 'search_date_end', 0, 0, 1, '', 1, 0, 0, '', '', '', '', 1, '', $langs->trans('to'));
506 print '</div>';
507 print '</td>';
508 print '<td class="liste_titre"><input type="text" class="flat maxwidth50" name="search_ref" value="'.dol_escape_htmltag($search_ref).'"></td>';
509 print '<td class="liste_titre"><input type="text" class="flat maxwidth100" name="search_desc" value="'.dol_escape_htmltag($search_desc).'"></td>';
510 print '<td class="liste_titre right"><input type="text" class="flat maxwidth50 right" name="search_amount" value="'.dol_escape_htmltag($search_amount).'"></td>';
511 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>';
512 print '<td class="liste_titre"><input type="text" class="flat maxwidth75imp" name="search_societe" value="'.dol_escape_htmltag($search_societe).'"></td>';
513 print '<td class="liste_titre">';
514 print $form->select_country($search_country, 'search_country', '', 0, 'maxwidth100', 'code2', 1, 0, 1);
515 //print '<input type="text" class="flat maxwidth50" name="search_country" value="' . dol_escape_htmltag($search_country) . '">';
516 print '</td>';
517 print '<td class="liste_titre"><input type="text" class="flat maxwidth50" name="search_tvaintra" value="'.dol_escape_htmltag($search_tvaintra).'"></td>';
518 print '<td class="liste_titre"></td>';
519 print '<td class="liste_titre"></td>';
520 print '<td class="center liste_titre">';
521 $searchpicto = $form->showFilterButtons();
522 print $searchpicto;
523 print '</td>';
524 print "</tr>\n";
525
526 print '<tr class="liste_titre">';
527 print_liste_field_titre("LineId", $_SERVER["PHP_SELF"], "l.rowid", "", $param, '', $sortfield, $sortorder);
528 print_liste_field_titre("Invoice", $_SERVER["PHP_SELF"], "f.ref", "", $param, '', $sortfield, $sortorder);
529 //print_liste_field_titre("RefSupplier", $_SERVER["PHP_SELF"], "f.ref_supplier", "", $param, '', $sortfield, $sortorder);
530 print_liste_field_titre("InvoiceLabel", $_SERVER["PHP_SELF"], "f.libelle", "", $param, '', $sortfield, $sortorder);
531 print_liste_field_titre("Date", $_SERVER["PHP_SELF"], "f.datef, f.ref, l.rowid", "", $param, '', $sortfield, $sortorder, 'center ');
532 print_liste_field_titre("ProductRef", $_SERVER["PHP_SELF"], "p.ref", "", $param, '', $sortfield, $sortorder);
533 //print_liste_field_titre("ProductLabel", $_SERVER["PHP_SELF"], "p.label", "", $param, '', $sortfield, $sortorder);
534 print_liste_field_titre("ProductDescription", $_SERVER["PHP_SELF"], "l.description", "", $param, '', $sortfield, $sortorder);
535 print_liste_field_titre("Amount", $_SERVER["PHP_SELF"], "l.total_ht", "", $param, '', $sortfield, $sortorder, 'right maxwidth50 ');
536 print_liste_field_titre("VATRate", $_SERVER["PHP_SELF"], "l.tva_tx", "", $param, '', $sortfield, $sortorder, 'right ', '', 1);
537 print_liste_field_titre("ThirdParty", $_SERVER["PHP_SELF"], "s.nom", "", $param, '', $sortfield, $sortorder);
538 print_liste_field_titre("Country", $_SERVER["PHP_SELF"], "co.label", "", $param, '', $sortfield, $sortorder);
539 print_liste_field_titre("VATIntraShort", $_SERVER["PHP_SELF"], "s.tva_intra", "", $param, '', $sortfield, $sortorder);
540 print_liste_field_titre("DataUsedToSuggestAccount", '', '', '', '', '', '', '', 'nowraponall ');
541 print_liste_field_titre("AccountAccountingSuggest", '', '', '', '', '', '', '', 'center ');
542 $checkpicto = '';
543 if ($massactionbutton) {
544 $checkpicto = $form->showCheckAddButtons('checkforselect', 1);
545 }
546 print_liste_field_titre($checkpicto, '', '', '', '', '', '', '', 'center ');
547 print "</tr>\n";
548
549 $thirdpartystatic = new Societe($db);
550 $facturefourn_static = new FactureFournisseur($db);
551 $facturefourn_static_det = new SupplierInvoiceLine($db);
552 $product_static = new Product($db);
553
554
555 $accountingaccount_codetotid_cache = array();
556
557 while ($i < min($num_lines, $limit)) {
558 $objp = $db->fetch_object($result);
559
560 // product_type: 0 = service, 1 = product
561 // if product does not exist we use the value of product_type provided in facturedet to define if this is a product or service
562 // issue : if we change product_type value in product DB it should differ from the value stored in facturedet DB !
563 $code_buy_l = '';
564 $code_buy_p = '';
565 $code_buy_t = '';
566
567 $thirdpartystatic->id = $objp->socid;
568 $thirdpartystatic->name = $objp->name;
569 $thirdpartystatic->client = $objp->client;
570 $thirdpartystatic->fournisseur = $objp->fournisseur;
571 $thirdpartystatic->code_client = $objp->code_client;
572 $thirdpartystatic->code_compta_client = $objp->code_compta_client;
573 $thirdpartystatic->code_fournisseur = $objp->code_fournisseur;
574 $thirdpartystatic->code_compta_fournisseur = $objp->code_compta_fournisseur;
575 $thirdpartystatic->email = $objp->email;
576 $thirdpartystatic->country_code = $objp->country_code;
577 $thirdpartystatic->tva_intra = $objp->tva_intra;
578 $thirdpartystatic->code_compta_product = $objp->company_code_buy; // The accounting account for product stored on thirdparty object (for level3 suggestion)
579
580 $product_static->ref = $objp->product_ref;
581 $product_static->id = $objp->product_id;
582 $product_static->type = $objp->type;
583 $product_static->label = $objp->product_label;
584 $product_static->status = $objp->status;
585 $product_static->status_buy = $objp->status_buy;
586 $product_static->accountancy_code_sell = $objp->code_sell;
587 $product_static->accountancy_code_sell_intra = $objp->code_sell_intra;
588 $product_static->accountancy_code_sell_export = $objp->code_sell_export;
589 $product_static->accountancy_code_buy = $objp->code_buy;
590 $product_static->accountancy_code_buy_intra = $objp->code_buy_intra;
591 $product_static->accountancy_code_buy_export = $objp->code_buy_export;
592 $product_static->tva_tx = $objp->tva_tx_prod;
593
594 $facturefourn_static->ref = $objp->ref;
595 $facturefourn_static->id = $objp->facid;
596 $facturefourn_static->type = $objp->ftype;
597 $facturefourn_static->ref_supplier = $objp->ref_supplier;
598 $facturefourn_static->label = $objp->invoice_label;
599 $facturefourn_static->date = $db->jdate($objp->datef);
600 $facturefourn_static->fk_facture_source = $objp->fk_facture_source;
601
602 $facturefourn_static_det->id = $objp->rowid;
603 $facturefourn_static_det->total_ht = $objp->total_ht;
604 $facturefourn_static_det->tva_tx = $objp->tva_tx_line;
605 $facturefourn_static_det->vat_src_code = $objp->vat_src_code;
606 $facturefourn_static_det->product_type = $objp->type_l;
607 $facturefourn_static_det->desc = $objp->description;
608
609 $accountingAccountArray = array(
610 'dom'=>$objp->aarowid,
611 'intra'=>$objp->aarowid_intra,
612 'export'=>$objp->aarowid_export,
613 'thirdparty' =>$objp->aarowid_thirdparty);
614
615 $code_buy_p_notset = '';
616 $code_buy_t_notset = '';
617
618 $suggestedid = 0;
619
620 $return=$accountingAccount->getAccountingCodeToBind($mysoc, $thirdpartystatic, $product_static, $facturefourn_static, $facturefourn_static_det, $accountingAccountArray, 'supplier');
621 if (!is_array($return) && $return<0) {
622 setEventMessage($accountingAccount->error, 'errors');
623 } else {
624 $suggestedid=$return['suggestedid'];
625 $suggestedaccountingaccountfor=$return['suggestedaccountingaccountfor'];
626 $suggestedaccountingaccountbydefaultfor=$return['suggestedaccountingaccountbydefaultfor'];
627 $code_buy_l=$return['code_l'];
628 $code_buy_p=$return['code_p'];
629 $code_buy_t=$return['code_t'];
630 }
631 //var_dump($return);
632
633 if (!empty($code_buy_p)) {
634 // Value was defined previously
635 } else {
636 $code_buy_p_notset = 'color:orange';
637 }
638 if (empty($code_buy_l) && empty($code_buy_p)) {
639 $code_buy_p_notset = 'color:red';
640 }
641 /*if ($suggestedaccountingaccountfor == 'eecwithoutvatnumber' && empty($code_sell_p_notset)) {
642 $code_sell_p_notset = 'color:orange';
643 }*/
644
645 // $code_buy_l is now default code of product/service
646 // $code_buy_p is now code of product/service
647 // $code_buy_t is now code of thirdparty
648 //var_dump($code_buy_l.' - '.$code_buy_p.' - '.$code_buy_t.' -> '.$suggestedid.' ('.$suggestedaccountingaccountbydefaultfor.' '.$suggestedaccountingaccountfor.')');
649
650 print '<tr class="oddeven">';
651
652 // Line id
653 print '<td>'.$facturefourn_static_det->id.'</td>';
654
655 // Ref Invoice
656 print '<td class="nowraponall">'.$facturefourn_static->getNomUrl(1);
657 if ($objp->ref_supplier) {
658 print '<br><span class="opacitymedium small">'.dol_escape_htmltag($objp->ref_supplier).'</span>';
659 }
660 print '</td>';
661
662 // Ref supplier invoice
663 /*print '<td class="tdoverflowmax100" title="'.dol_escape_htmltag($objp->ref_supplier).'">';
664 print $objp->ref_supplier;
665 print '</td>';*/
666
667 // Supplier invoice label
668 print '<td class="tdoverflowmax100 small" title="'.dol_escape_htmltag($objp->invoice_label).'">';
669 print dol_escape_htmltag($objp->invoice_label);
670 print '</td>';
671
672 // Date
673 print '<td class="center">'.dol_print_date($facturefourn_static->date, 'day').'</td>';
674
675 // Ref Product
676 print '<td class="tdoverflowmax100">';
677 if ($product_static->id > 0) {
678 print $product_static->getNomUrl(1);
679 }
680 if ($product_static->label) {
681 print '<br><span class="opacitymedium small">'.dol_escape_htmltag($product_static->label).'</span>';
682 }
683 print '</td>';
684
685 // Description of line
686 print '<td class="tdoverflowonsmartphone small">';
687 $text = dolGetFirstLineOfText(dol_string_nohtmltag($facturefourn_static_det->desc, 1));
688 $trunclength = empty($conf->global->ACCOUNTING_LENGTH_DESCRIPTION) ? 32 : $conf->global->ACCOUNTING_LENGTH_DESCRIPTION;
689 print $form->textwithtooltip(dol_trunc($text, $trunclength), $facturefourn_static_det->desc);
690 print '</td>';
691
692 print '<td class="right nowraponall amount">';
693 print price($objp->total_ht);
694 print '</td>';
695
696 // Vat rate
697 $code_vat_differ = '';
698 //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
699 // $code_vat_differ = 'warning bold';
700 //}
701 print '<td class="right'.($code_vat_differ?' '.$code_vat_differ:'').'">';
702 print vatrate($facturefourn_static_det->tva_tx.($facturefourn_static_det->vat_src_code ? ' ('.$facturefourn_static_det->vat_src_code.')' : ''), false, 0, 0, 1);
703 print '</td>';
704
705 // Thirdparty
706 print '<td class="tdoverflowmax100">'.$thirdpartystatic->getNomUrl(1, 'supplier').'</td>';
707
708 // Country
709 $labelcountry = ($objp->country_code && ($langs->trans("Country".$objp->country_code) != "Country".$objp->country_code)) ? $langs->trans("Country".$objp->country_code) : $objp->country_label;
710 print '<td class="tdoverflowmax100" title="'.dol_escape_htmltag($labelcountry).'">';
711 print dol_escape_htmltag($labelcountry);
712 print '</td>';
713
714 // VAT Num
715 print '<td class="tdoverflowmax80" title="'.dol_escape_htmltag($objp->tva_intra).'">'.dol_escape_htmltag($objp->tva_intra).'</td>';
716
717 // Found accounts
718 print '<td class="small">';
719 $s = '1. '.(($facturefourn_static_det->product_type == 1) ? $langs->trans("DefaultForService") : $langs->trans("DefaultForProduct")).': ';
720 $shelp = ''; $ttype = 'help';
721 if ($suggestedaccountingaccountbydefaultfor == 'eec') {
722 $shelp .= $langs->trans("SaleEEC");
723 } elseif ($suggestedaccountingaccountbydefaultfor == 'eecwithvat') {
724 $shelp = $langs->trans("SaleEECWithVAT");
725 } elseif ($suggestedaccountingaccountbydefaultfor == 'eecwithoutvatnumber') {
726 $shelp = $langs->trans("SaleEECWithoutVATNumber");
727 $ttype = 'warning';
728 } elseif ($suggestedaccountingaccountbydefaultfor == 'export') {
729 $shelp .= $langs->trans("SaleExport");
730 }
731 $s .= ($code_buy_l > 0 ? length_accountg($code_buy_l) : '<span style="'.$code_buy_p_notset.'">'.$langs->trans("NotDefined").'</span>');
732 print $form->textwithpicto($s, $shelp, 1, $ttype, '', 0, 2, '', 1);
733 if ($product_static->id > 0) {
734 print '<br>';
735 $s = '2. '.(($facturefourn_static_det->product_type == 1) ? $langs->trans("ThisService") : $langs->trans("ThisProduct")).': ';
736 $shelp = ''; $ttype = 'help';
737 if ($suggestedaccountingaccountfor == 'eec') {
738 $shelp = $langs->trans("SaleEEC");
739 } elseif ($suggestedaccountingaccountfor == 'eecwithvat') {
740 $shelp = $langs->trans("SaleEECWithVAT");
741 } elseif ($suggestedaccountingaccountfor == 'eecwithoutvatnumber') {
742 $shelp = $langs->trans("SaleEECWithoutVATNumber");
743 $ttype = 'warning';
744 } elseif ($suggestedaccountingaccountfor == 'export') {
745 $shelp = $langs->trans("SaleExport");
746 }
747 $s .= (empty($code_buy_p) ? '<span style="'.$code_buy_p_notset.'">'.$langs->trans("NotDefined").'</span>' : length_accountg($code_buy_p));
748 print $form->textwithpicto($s, $shelp, 1, $ttype, '', 0, 2, '', 1);
749 } else {
750 print '<br>';
751 $s = '2. '.(($objp->type_l == 1) ? $langs->trans("ThisService") : $langs->trans("ThisProduct")).': ';
752 $shelp = '';
753 $s .= $langs->trans("NotDefined");
754 print $form->textwithpicto($s, $shelp, 1, 'help', '', 0, 2, '', 1);
755 }
756 if (!empty($conf->global->ACCOUNTANCY_USE_PRODUCT_ACCOUNT_ON_THIRDPARTY)) {
757 print '<br>';
758 $s = '3. '.(($facturefourn_static_det->product_type == 1) ? $langs->trans("ServiceForThisThirdparty") : $langs->trans("ProductForThisThirdparty")).': ';
759 $shelp = '';
760 $s .= ($code_buy_t > 0 ? length_accountg($code_buy_t) : '<span style="'.$code_buy_t_notset.'">'.$langs->trans("NotDefined").'</span>');
761 print $form->textwithpicto($s, $shelp, 1, 'help', '', 0, 2, '', 1);
762 }
763 print '</td>';
764
765 // Suggested accounting account
766 print '<td>';
767 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');
768 print '</td>';
769
770 // Column with checkbox
771 print '<td class="center">';
772 $ischecked = 0;
773 if (!empty($suggestedid) && $suggestedaccountingaccountfor != '' && $suggestedaccountingaccountfor != 'eecwithoutvatnumber') {
774 $ischecked = 1;
775 }
776
777 if (!empty($toselect)) {
778 $ischecked = 0;
779 if (in_array($objp->rowid."_".$i, $toselect)) {
780 $ischecked=1;
781 }
782 }
783
784 print '<input type="checkbox" class="flat checkforselect checkforselect'.$facturefourn_static_det->id.'" name="toselect[]" value="'.$facturefourn_static_det->id."_".$i.'"'.($ischecked ? " checked" : "").'/>';
785 print '</td>';
786
787 print '</tr>';
788 $i++;
789 }
790 if ($num_lines == 0) {
791 print '<tr><td colspan="14"><span class="opacitymedium">'.$langs->trans("NoRecordFound").'</span></td></tr>';
792 }
793
794 print '</table>';
795 print "</div>";
796
797 print '</form>';
798} else {
799 print $db->error();
800}
801if ($db->type == 'mysqli') {
802 $db->query("SET SQL_BIG_SELECTS=0"); // Enable MAX_JOIN_SIZE limitation
803}
804
805// Add code to auto check the box when we select an account
806print '<script type="text/javascript">
807jQuery(document).ready(function() {
808 jQuery(".codeventil").change(function() {
809 var s=$(this).attr("id").replace("codeventil", "")
810 console.log(s+" "+$(this).val());
811 if ($(this).val() == -1) jQuery(".checkforselect"+s).prop("checked", false);
812 else jQuery(".checkforselect"+s).prop("checked", true);
813 });
814});
815</script>';
816
817// End of page
818llxFooter();
819$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:56
llxFooter()
Empty footer.
Definition wrapper.php:70
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.
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...)
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 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.
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.