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