dolibarr 24.0.0-beta
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-2025 Alexandre Spangaro <alexandre@inovea-conseil.com>
4 * Copyright (C) 2014-2015 Ari Elbaz (elarifr) <github@accedinfo.com>
5 * Copyright (C) 2013-2021 Florian Henry <florian.henry@open-concept.pro>
6 * Copyright (C) 2014 Juanjo Menent <jmenent@2byte.es>
7 * Copyright (C) 2016 Laurent Destailleur <eldy@users.sourceforge.net>
8 * Copyright (C) 2021 Gauthier VERDOL <gauthier.verdol@atm-consulting.fr>
9 * Copyright (C) 2024 Frédéric France <frederic.france@free.fr>
10 * Copyright (C) 2024-2025 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';
40require_once DOL_DOCUMENT_ROOT.'/core/class/html.formaccounting.class.php';
41require_once DOL_DOCUMENT_ROOT.'/core/class/html.formother.class.php';
42require_once DOL_DOCUMENT_ROOT.'/core/class/html.formcompany.class.php';
43require_once DOL_DOCUMENT_ROOT.'/compta/facture/class/facture.class.php';
44require_once DOL_DOCUMENT_ROOT.'/product/class/product.class.php';
45require_once DOL_DOCUMENT_ROOT.'/accountancy/class/accountingaccount.class.php';
46require_once DOL_DOCUMENT_ROOT.'/core/lib/accounting.lib.php';
47require_once DOL_DOCUMENT_ROOT.'/core/lib/date.lib.php';
48require_once DOL_DOCUMENT_ROOT.'/core/lib/company.lib.php';
49
50
51// Load translation files required by the page
52$langs->loadLangs(array("bills", "companies", "compta", "accountancy", "other", "productbatch", "products"));
53
54$action = GETPOST('action', 'aZ09');
55$massaction = GETPOST('massaction', 'alpha');
56$confirm = GETPOST('confirm', 'alpha');
57$toselect = GETPOST('toselect', 'array:aZ09'); // Value can be 'X_Y'
58$contextpage = GETPOST('contextpage', 'aZ') ? GETPOST('contextpage', 'aZ') : 'accountancycustomerlist'; // To manage different context of search
59$optioncss = GETPOST('optioncss', 'alpha');
60
61$default_account = GETPOSTINT('default_account');
62
63// Search Getpost
64$search_societe = GETPOST('search_societe', 'alpha');
65$search_lineid = GETPOST('search_lineid', 'alpha'); // Can be '> 100'
66$search_ref = GETPOST('search_ref', 'alpha');
67$search_invoice = GETPOST('search_invoice', 'alpha');
68$search_label = GETPOST('search_label', 'alpha');
69$search_desc = GETPOST('search_desc', 'alpha');
70$search_amount = GETPOST('search_amount', 'alpha');
71$search_account = GETPOST('search_account', 'alpha');
72$search_vat = GETPOST('search_vat', 'alpha');
73$search_date_startday = GETPOSTINT('search_date_startday');
74$search_date_startmonth = GETPOSTINT('search_date_startmonth');
75$search_date_startyear = GETPOSTINT('search_date_startyear');
76$search_date_endday = GETPOSTINT('search_date_endday');
77$search_date_endmonth = GETPOSTINT('search_date_endmonth');
78$search_date_endyear = GETPOSTINT('search_date_endyear');
79$search_date_start = dol_mktime(0, 0, 0, $search_date_startmonth, $search_date_startday, $search_date_startyear); // Use tzserver
80$search_date_end = dol_mktime(23, 59, 59, $search_date_endmonth, $search_date_endday, $search_date_endyear);
81$search_country = GETPOST('search_country', 'aZ09');
82$search_tvaintra = GETPOST('search_tvaintra', 'alpha');
83
84// Define begin binding date
85if (empty($search_date_start) && getDolGlobalInt('ACCOUNTING_DATE_START_BINDING')) {
86 $search_date_start = $db->idate(getDolGlobalInt('ACCOUNTING_DATE_START_BINDING'));
87}
88
89// Load variable for pagination
90$limit = GETPOSTINT('limit') ? GETPOSTINT('limit') : getDolGlobalString('ACCOUNTING_LIMIT_LIST_VENTILATION', $conf->liste_limit);
91$sortfield = GETPOST('sortfield', 'aZ09comma');
92$sortorder = GETPOST('sortorder', 'aZ09comma');
93$page = GETPOSTISSET('pageplusone') ? (GETPOSTINT('pageplusone') - 1) : GETPOSTINT("page");
94if (empty($page) || $page < 0) {
95 $page = 0;
96}
97$offset = $limit * $page;
98$pageprev = $page - 1;
99$pagenext = $page + 1;
100if (!$sortfield) {
101 $sortfield = "f.datef, f.ref, l.rowid";
102}
103if (!$sortorder) {
104 if (getDolGlobalInt('ACCOUNTING_LIST_SORT_VENTILATION_TODO') > 0) {
105 $sortorder = "DESC";
106 } else {
107 $sortorder = "ASC";
108 }
109}
110
111// Initialize a technical object to manage hooks of page. Note that conf->hooks_modules contains an array of hook context
112$hookmanager->initHooks(array($contextpage));
113
115
116$formaccounting = new FormAccounting($db);
117$accountingAccount = new AccountingAccount($db);
118
119$chartaccountcode = dol_getIdFromCode($db, getDolGlobalString('CHARTOFACCOUNTS'), 'accounting_system', 'rowid', 'pcg_version');
120
121// Security check
122if (!isModEnabled('accounting')) {
124}
125if ($user->socid > 0) {
127}
128if (!$user->hasRight('accounting', 'bind', 'write')) {
130}
131
132$arrayfields = array(
133 'l.rowid' => array('label' => "LineId", 'position' => 1, 'checked' => '1', 'enabled' => '1'),
134 'f.ref' => array('label' => "Invoice", 'position' => 1, 'checked' => '1', 'enabled' => '1'),
135 'f.datef' => array('label' => "Date", 'position' => 1, 'checked' => '1', 'enabled' => '1'), // f.datef, f.ref, l.rowid
136 'p.ref' => array('label' => "ProductRef", 'position' => 1, 'checked' => '1', 'enabled' => '1'),
137 'l.description' => array('label' => "ProductDescription", 'position' => 1, 'checked' => '-1', 'enabled' => '1'),
138 'l.total_ht' => array('label' => "Amount", 'position' => 1, 'checked' => '1', 'enabled' => '1'),
139 'l.tva_tx' => array('label' => "VATRate", 'position' => 1, 'checked' => '1', 'enabled' => '1'),
140 's.nom' => array('label' => "ThirdParty", 'position' => 1, 'checked' => '1', 'enabled' => '1'),
141 'co.label' => array('label' => "Country", 'position' => 1, 'checked' => '1', 'enabled' => '1'),
142 's.tva_intra' => array('label' => "VATIntraShort", 'position' => 1, 'checked' => '1', 'enabled' => '1'),
143 'aa.data_suggest' => array('label' => "DataUsedToSuggestAccount", 'position' => 1, 'checked' => '1', 'enabled' => '1'), // Seems not used in search.
144 'aa.account_number' => array('label' => "AccountAccountingSuggest", 'position' => 1, 'checked' => '1', 'enabled' => '1'),
145);
146// @phpstan-ignore-next-line
147$arrayfields = dol_sort_array($arrayfields, 'position');
148
149
150/*
151 * Actions
152 */
153
154if (GETPOST('cancel', 'alpha')) {
155 $action = 'list';
156 $massaction = '';
157}
158if (!GETPOST('confirmmassaction', 'alpha') && $massaction != 'presend' && $massaction != 'confirm_presend') {
159 $massaction = '';
160}
161
162$parameters = array('arrayfields' => &$arrayfields);
163$reshook = $hookmanager->executeHooks('doActions', $parameters, $object, $action); // Note that $action and $object may have been modified by some hooks
164if ($reshook < 0) {
165 setEventMessages($hookmanager->error, $hookmanager->errors, 'errors');
166}
167
168if (empty($reshook)) {
169 // Selection of new fields
170 include DOL_DOCUMENT_ROOT.'/core/actions_changeselectedfields.inc.php';
171
172 // Purge search criteria
173 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
174 $search_societe = '';
175 $search_lineid = '';
176 $search_ref = '';
177 $search_invoice = '';
178 $search_label = '';
179 $search_desc = '';
180 $search_amount = '';
181 $search_account = '';
182 $search_vat = '';
183 $search_date_startday = '';
184 $search_date_startmonth = '';
185 $search_date_startyear = '';
186 $search_date_endday = '';
187 $search_date_endmonth = '';
188 $search_date_endyear = '';
189 $search_date_start = '';
190 $search_date_end = '';
191 $search_country = '';
192 $search_tvaintra = '';
193 }
194
195 // Mass actions
196 $objectclass = 'AccountingAccount';
197 $permissiontoread = $user->hasRight('accounting', 'read');
198 $permissiontodelete = $user->hasRight('accounting', 'delete');
199 $uploaddir = $conf->accounting->dir_output;
200 include DOL_DOCUMENT_ROOT.'/core/actions_massactions.inc.php';
201}
202
203
204if ($massaction == 'ventil' && $user->hasRight('accounting', 'bind', 'write')) {
205 $msg = '';
206
207 if (!empty($toselect)) {
208 $msg = '<div>'.$langs->trans("SelectedLines").': '.count($toselect).'</div>';
209 $msg .= '<div class="detail">';
210 $cpt = 0;
211 $ok = 0;
212 $ko = 0;
213
214 foreach ($toselect as $maLigneCochee) {
215 $maLigneCourante = explode("_", $maLigneCochee);
216 $monId = $maLigneCourante[0];
217 $monCompte = GETPOSTINT('codeventil'.$monId);
218
219 if ($monCompte <= 0) {
220 $msg .= '<div><span class="error">'.$langs->trans("Lineofinvoice").' '.$monId.' - '.$langs->trans("NoAccountSelected").'</span></div>';
221 $ko++;
222 } else {
223 $sql = " UPDATE ".MAIN_DB_PREFIX."facturedet";
224 $sql .= " SET fk_code_ventilation = ".((int) $monCompte);
225 $sql .= " WHERE rowid = ".((int) $monId);
226
227 $accountventilated = new AccountingAccount($db);
228 $accountventilated->fetch($monCompte, '', 1);
229
230 dol_syslog("accountancy/customer/list.php", LOG_DEBUG);
231 if ($db->query($sql)) {
232 $msg .= '<div><span style="color:green">'.$langs->trans("Lineofinvoice").' '.$monId.' - '.$langs->trans("VentilatedinAccount").' : '.length_accountg($accountventilated->account_number).'</span></div>';
233 $ok++;
234 } else {
235 $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>';
236 $ko++;
237 }
238 }
239
240 $cpt++;
241 }
242 $msg .= '</div>';
243 $msg .= '<div>'.$langs->trans("EndProcessing").'</div>';
244 }
245}
246
247if (GETPOST('sortfield') == 'f.datef, f.ref, l.rowid') {
248 $value = (GETPOST('sortorder') == 'asc,asc,asc' ? 0 : 1);
249 require_once DOL_DOCUMENT_ROOT.'/core/lib/admin.lib.php';
250 $res = dolibarr_set_const($db, "ACCOUNTING_LIST_SORT_VENTILATION_TODO", $value, 'yesno', 0, '', $conf->entity);
251}
252
253
254/*
255 * View
256 */
257
258$form = new Form($db);
259
260$help_url = 'EN:Module_Double_Entry_Accounting|FR:Module_Comptabilit&eacute;_en_Partie_Double#Liaisons_comptables';
261
262llxHeader('', $langs->trans("CustomersVentilation"), $help_url, '', 0, 0, '', '', '', 'bodyforlist mod-accountancy accountancy-customer page-list');
263
264if (empty($chartaccountcode)) {
265 print $langs->trans("ErrorChartOfAccountSystemNotSelected");
266 // End of page
267 llxFooter();
268 $db->close();
269 exit;
270}
271
272// Customer Invoice lines
273$sql = "SELECT f.rowid as facid, f.ref, f.datef, f.type as ftype, f.situation_cycle_ref, f.fk_facture_source,";
274$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,";
275$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,";
276if (getDolGlobalString('MAIN_PRODUCT_PERENTITY_SHARED')) {
277 $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,";
278 $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,";
279} else {
280 $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,";
281 $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,";
282}
283$sql .= " p.tosell as status, p.tobuy as status_buy,";
284$sql .= " aa.rowid as aarowid, aa2.rowid as aarowid_intra, aa3.rowid as aarowid_export, aa4.rowid as aarowid_thirdparty,";
285$sql .= " co.code as country_code, co.label as country_label,";
286$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,";
287if (getDolGlobalString('MAIN_COMPANY_PERENTITY_SHARED')) {
288 $sql .= " spe.accountancy_code_customer as code_compta_client,";
289 $sql .= " spe.accountancy_code_supplier as code_compta_fournisseur,";
290 $sql .= " spe.accountancy_code_sell as company_code_sell";
291} else {
292 $sql .= " s.code_compta as code_compta_client,";
293 $sql .= " s.code_compta_fournisseur,";
294 $sql .= " s.accountancy_code_sell as company_code_sell";
295}
296$parameters = array();
297$reshook = $hookmanager->executeHooks('printFieldListSelect', $parameters); // Note that $action and $object may have been modified by hook
298$sql .= $hookmanager->resPrint;
299$sql .= " FROM ".MAIN_DB_PREFIX."facture as f";
300$sql .= " INNER JOIN ".MAIN_DB_PREFIX."societe as s ON s.rowid = f.fk_soc";
301if (getDolGlobalString('MAIN_COMPANY_PERENTITY_SHARED')) {
302 $sql .= " LEFT JOIN " . MAIN_DB_PREFIX . "societe_perentity as spe ON spe.fk_soc = s.rowid AND spe.entity = " . ((int) $conf->entity);
303}
304$sql .= " LEFT JOIN ".MAIN_DB_PREFIX."c_country as co ON co.rowid = s.fk_pays ";
305$sql .= " INNER JOIN ".MAIN_DB_PREFIX."facturedet as l ON f.rowid = l.fk_facture";
306$sql .= " LEFT JOIN ".MAIN_DB_PREFIX."product as p ON p.rowid = l.fk_product";
307if (getDolGlobalString('MAIN_PRODUCT_PERENTITY_SHARED')) {
308 $sql .= " LEFT JOIN " . MAIN_DB_PREFIX . "product_perentity as ppe ON ppe.fk_product = p.rowid AND ppe.entity = " . ((int) $conf->entity);
309}
310$alias_societe_perentity = !getDolGlobalString('MAIN_COMPANY_PERENTITY_SHARED') ? "s" : "spe";
311$alias_product_perentity = !getDolGlobalString('MAIN_PRODUCT_PERENTITY_SHARED') ? "p" : "ppe";
312$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;
313$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;
314$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;
315$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;
316// Add table from hooks
317$parameters = array();
318$reshook = $hookmanager->executeHooks('printFieldListFrom', $parameters, $object, $action); // Note that $action and $object may have been modified by hook
319$sql .= $hookmanager->resPrint;
320
321$sql .= " WHERE f.fk_statut > 0 AND l.fk_code_ventilation <= 0";
322$sql .= " AND l.product_type <= 2";
323// Add search filter like
324if ($search_societe) {
325 $sql .= natural_search('s.nom', $search_societe);
326}
327if ($search_lineid) {
328 $sql .= natural_search("l.rowid", $search_lineid, 1);
329}
330if (strlen(trim($search_invoice))) {
331 $sql .= natural_search("f.ref", $search_invoice);
332}
333if (strlen(trim($search_ref))) {
334 $sql .= natural_search("p.ref", $search_ref);
335}
336if (strlen(trim($search_label))) {
337 $sql .= natural_search("p.label", $search_label);
338}
339if (strlen(trim($search_desc))) {
340 $sql .= natural_search("l.description", $search_desc);
341}
342if (strlen(trim($search_amount))) {
343 $sql .= natural_search("l.total_ht", $search_amount, 1);
344}
345if (strlen(trim($search_account))) {
346 $sql .= natural_search("aa.account_number", $search_account);
347}
348if (strlen(trim($search_vat))) {
349 $sql .= natural_search("l.tva_tx", price2num($search_vat), 1);
350}
351if ($search_date_start) {
352 $sql .= " AND f.datef >= '".$db->idate($search_date_start)."'";
353}
354if ($search_date_end) {
355 $sql .= " AND f.datef <= '".$db->idate($search_date_end)."'";
356}
357if (strlen(trim($search_country))) {
358 $arrayofcode = getCountriesInEEC();
359 $country_code_in_EEC = $country_code_in_EEC_without_me = '';
360 foreach ($arrayofcode as $key => $value) {
361 $country_code_in_EEC .= ($country_code_in_EEC ? "," : "")."'".$value."'";
362 if ($value != $mysoc->country_code) {
363 $country_code_in_EEC_without_me .= ($country_code_in_EEC_without_me ? "," : "")."'".$value."'";
364 }
365 }
366 if ($search_country == 'special_allnotme') {
367 $sql .= " AND co.code <> '".$db->escape($mysoc->country_code)."'";
368 } elseif ($search_country == 'special_eec') {
369 $sql .= " AND co.code IN (".$db->sanitize($country_code_in_EEC, 1).")";
370 } elseif ($search_country == 'special_eecnotme') {
371 $sql .= " AND co.code IN (".$db->sanitize($country_code_in_EEC_without_me, 1).")";
372 } elseif ($search_country == 'special_noteec') {
373 $sql .= " AND co.code NOT IN (".$db->sanitize($country_code_in_EEC, 1).")";
374 } else {
375 $sql .= natural_search("co.code", $search_country);
376 }
377}
378if (strlen(trim($search_tvaintra))) {
379 $sql .= natural_search("s.tva_intra", $search_tvaintra);
380}
381if (getDolGlobalString('FACTURE_DEPOSITS_ARE_JUST_PAYMENTS')) {
382 $sql .= " AND f.type IN (".Facture::TYPE_STANDARD.",".Facture::TYPE_REPLACEMENT.",".Facture::TYPE_CREDIT_NOTE.",".Facture::TYPE_SITUATION.")";
383} else {
384 $sql .= " AND f.type IN (".Facture::TYPE_STANDARD.",".Facture::TYPE_REPLACEMENT.",".Facture::TYPE_CREDIT_NOTE.",".Facture::TYPE_DEPOSIT.",".Facture::TYPE_SITUATION.")";
385}
386$sql .= " AND f.entity IN (".getEntity('invoice', 0).")"; // We don't share object for accountancy
387
388// Add where from hooks
389$parameters = array();
390$reshook = $hookmanager->executeHooks('printFieldListWhere', $parameters); // Note that $action and $object may have been modified by hook
391$sql .= $hookmanager->resPrint;
392
393$sql .= $db->order($sortfield, $sortorder);
394
395// Count total nb of records
396$nbtotalofrecords = '';
397if (!getDolGlobalInt('MAIN_DISABLE_FULL_SCANLIST')) {
398 $result = $db->query($sql);
399 $nbtotalofrecords = $db->num_rows($result);
400 if (($page * $limit) > (int) $nbtotalofrecords) { // if total resultset is smaller then paging size (filtering), goto and load page 0
401 $page = 0;
402 $offset = 0;
403 }
404}
405
406$sql .= $db->plimit($limit + 1, $offset);
407
408dol_syslog("accountancy/customer/list.php", LOG_DEBUG);
409// MAX_JOIN_SIZE can be very low (ex: 300000) on some limited configurations (ex: https://www.online.net/fr/hosting/online-perso)
410// 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
411if ($db->type == 'mysqli') {
412 $db->query("SET SQL_BIG_SELECTS=1");
413}
414
415$result = $db->query($sql);
416if ($result) {
417 $num_lines = $db->num_rows($result);
418 $i = 0;
419
420 $arrayofselected = is_array($toselect) ? $toselect : array();
421
422 $param = '';
423 if ($contextpage != $_SERVER["PHP_SELF"]) {
424 $param .= '&contextpage='.urlencode($contextpage);
425 }
426 if ($limit > 0 && $limit != $conf->liste_limit) {
427 $param .= '&limit='.((int) $limit);
428 }
429 if ($search_societe) {
430 $param .= '&search_societe='.urlencode($search_societe);
431 }
432 if ($search_lineid) {
433 $param .= '&search_lineid='.urlencode((string) ($search_lineid));
434 }
435 if ($search_date_startday) {
436 $param .= '&search_date_startday='.urlencode((string) ($search_date_startday));
437 }
438 if ($search_date_startmonth) {
439 $param .= '&search_date_startmonth='.urlencode((string) ($search_date_startmonth));
440 }
441 if ($search_date_startyear) {
442 $param .= '&search_date_startyear='.urlencode((string) ($search_date_startyear));
443 }
444 if ($search_date_endday) {
445 $param .= '&search_date_endday='.urlencode((string) ($search_date_endday));
446 }
447 if ($search_date_endmonth) {
448 $param .= '&search_date_endmonth='.urlencode((string) ($search_date_endmonth));
449 }
450 if ($search_date_endyear) {
451 $param .= '&search_date_endyear='.urlencode((string) ($search_date_endyear));
452 }
453 if ($search_invoice) {
454 $param .= '&search_invoice='.urlencode($search_invoice);
455 }
456 if ($search_ref) {
457 $param .= '&search_ref='.urlencode($search_ref);
458 }
459 if ($search_label) {
460 $param .= '&search_label='.urlencode($search_label);
461 }
462 if ($search_desc) {
463 $param .= '&search_desc='.urlencode($search_desc);
464 }
465 if ($search_amount) {
466 $param .= '&search_amount='.urlencode($search_amount);
467 }
468 if ($search_vat) {
469 $param .= '&search_vat='.urlencode($search_vat);
470 }
471 if ($search_country) {
472 $param .= "&search_country=".urlencode($search_country);
473 }
474 if ($search_tvaintra) {
475 $param .= "&search_tvaintra=".urlencode($search_tvaintra);
476 }
477 // Add $param from hooks
478 $parameters = array('param' => &$param);
479 $reshook = $hookmanager->executeHooks('printFieldListSearchParam', $parameters, $object, $action); // Note that $action and $object may have been modified by hook
480 $param .= $hookmanager->resPrint;
481
482 $arrayofmassactions = array(
483 'set_default_account' => img_picto('', 'check', 'class="pictofixedwidth"').$langs->trans("ConfirmPreselectAccount"),
484 'ventil' => img_picto('', 'check', 'class="pictofixedwidth"').$langs->trans("Ventilate")
485 //'presend'=>img_picto('', 'email', 'class="pictofixedwidth"').$langs->trans("SendByMail"),
486 //'builddoc'=>img_picto('', 'pdf', 'class="pictofixedwidth"').$langs->trans("PDFMerge"),
487 );
488 //if ($user->hasRight('mymodule', 'supprimer')) $arrayofmassactions['predelete'] = img_picto('', 'delete', 'class="pictofixedwidth"').$langs->trans("Delete");
489 //if (in_array($massaction, array('presend','predelete'))) $arrayofmassactions=array();
490 $massactionbutton = '';
491 if ($massaction !== 'set_default_account') {
492 $massactionbutton = $form->selectMassAction('ventil', $arrayofmassactions, 1);
493 }
494
495 print '<form action="'.$_SERVER["PHP_SELF"].'" method="post">'."\n";
496 print '<input type="hidden" name="action" value="ventil">';
497 if ($optioncss != '') {
498 print '<input type="hidden" name="optioncss" value="'.$optioncss.'">';
499 }
500 print '<input type="hidden" name="token" value="'.newToken().'">';
501 print '<input type="hidden" name="formfilteraction" id="formfilteraction" value="list">';
502 print '<input type="hidden" name="sortfield" value="'.$sortfield.'">';
503 print '<input type="hidden" name="sortorder" value="'.$sortorder.'">';
504 print '<input type="hidden" name="page" value="'.$page.'">';
505
506 // @phan-suppress-next-line PhanPluginSuspiciousParamOrder
507 print_barre_liste($langs->trans("InvoiceLines").'<br><span class="opacityhigh small">'.$langs->trans("DescVentilTodoCustomer").'</span>', $page, $_SERVER["PHP_SELF"], $param, $sortfield, $sortorder, (string) $massactionbutton, $num_lines, $nbtotalofrecords, 'title_accountancy', 0, '', '', $limit, 0, 0, 1);
508 print '<br>';
509
510 if ($massaction == 'set_default_account') {
511 $formquestion = array();
512 $formquestion[] = array('type' => 'other',
513 'name' => 'set_default_account',
514 'label' => $langs->trans("AccountancyCode"),
515 'value' => $formaccounting->select_account('', 'default_account', 1, array(), 0, 0, 'maxwidth200 maxwidthonsmartphone', 'cachewithshowemptyone'));
516 print $form->formconfirm($_SERVER["PHP_SELF"], $langs->trans("ConfirmPreselectAccount"), $langs->trans("ConfirmPreselectAccountQuestion", count($toselect)), "confirm_set_default_account", $formquestion, 1, 0, 200, 500, 1);
517 }
518
519 if (!empty($msg)) {
520 print $msg.'<br>';
521 }
522
523 $moreforfilter = '';
524
525 $varpage = $contextpage;
526 $htmlofselectarray = $form->multiSelectArrayWithCheckbox('selectedfields', $arrayfields, $varpage, $conf->main_checkbox_left_column); // This also change content of $arrayfields with user setup
527 $selectedfields = $htmlofselectarray;
528 $selectedfields .= $form->showCheckAddButtons('checkforselect', 1);
529
530 print '<div class="div-table-responsive">';
531 print '<table class="tagtable liste'.($moreforfilter ? " listwithfilterbefore" : "").'">'."\n";
532
533 // We add search filter
534 print '<tr class="liste_titre_filter">';
535 // Action column
536 if ($conf->main_checkbox_left_column) {
537 print '<td class="liste_titre maxwidthsearch center actioncolumn">';
538 $searchpicto = $form->showFilterButtons('left');
539 print $searchpicto;
540 print '</td>';
541 }
542 // Line ID
543 if (!empty($arrayfields['l.rowid']['checked'])) {
544 print '<td class="liste_titre" data-key="lineid">';
545 print '<input type="text" class="flat maxwidth40" name="search_lineid" value="'.dol_escape_htmltag($search_lineid).'">';
546 print '</td>';
547 }
548 // Ref invoice
549 if (!empty($arrayfields['f.ref']['checked'])) {
550 print '<td class="liste_titre" data-key="invoice">';
551 print '<input type="text" class="flat maxwidth50" name="search_invoice" value="'.dol_escape_htmltag($search_invoice).'">';
552 print '</td>';
553 }
554 // Date
555 if (!empty($arrayfields['f.datef']['checked'])) {
556 print '<td class="liste_titre center">';
557 print '<div class="nowrapfordate">';
558 print $form->selectDate($search_date_start ? $search_date_start : -1, 'search_date_start', 0, 0, 1, '', 1, 0, 0, '', '', '', '', 1, '', $langs->trans('From'));
559 print '</div>';
560 print '<div class="nowrapfordate">';
561 print $form->selectDate($search_date_end ? $search_date_end : -1, 'search_date_end', 0, 0, 1, '', 1, 0, 0, '', '', '', '', 1, '', $langs->trans('to'));
562 print '</div>';
563 print '</td>';
564 }
565 // Product ref
566 if (!empty($arrayfields['p.ref']['checked'])) {
567 print '<td class="liste_titre" data-key="ref">';
568 print '<input type="text" class="flat maxwidth50" name="search_ref" value="'.dol_escape_htmltag($search_ref).'">';
569 print '</td>';
570 }
571 // Description
572 if (!empty($arrayfields['l.description']['checked'])) {
573 print '<td class="liste_titre" data-key="desc">';
574 print '<input type="text" class="flat maxwidth50" name="search_desc" value="'.dol_escape_htmltag($search_desc).'">';
575 print '</td>';
576 }
577 // Amount
578 if (!empty($arrayfields['l.total_ht']['checked'])) {
579 print '<td class="liste_titre" data-key="amount">';
580 print '<input type="text" class="right flat maxwidth50" name="search_amount" value="'.dol_escape_htmltag($search_amount).'">';
581 print '</td>';
582 }
583 // VAT
584 if (!empty($arrayfields['l.tva_tx']['checked'])) {
585 print '<td class="liste_titre" data-key="vat">';
586 print '<input type="text" class="right flat maxwidth50" placeholder="%" name="search_vat" size="1" value="'.dol_escape_htmltag($search_vat).'">';
587 print '</td>';
588 }
589 // Thirdparty
590 if (!empty($arrayfields['s.nom']['checked'])) {
591 print '<td class="liste_titre" data-key="societe">';
592 print '<input type="text" class="flat maxwidth75imp" name="search_societe" value="'.dol_escape_htmltag($search_societe).'">';
593 print '</td>';
594 }
595 // Country
596 if (!empty($arrayfields['co.label']['checked'])) {
597 print '<td class="liste_titre" data-key="country">';
598 print $form->select_country($search_country, 'search_country', '', 0, 'maxwidth125', 'code2', 1, 0, 1);
599 print '</td>';
600 }
601 // TVA Intracom
602 if (!empty($arrayfields['s.tva_intra']['checked'])) {
603 print '<td class="liste_titre">';
604 print '<input type="text" class="flat maxwidth50" name="search_tvaintra" value="'.dol_escape_htmltag($search_tvaintra).'">';
605 print '</td>';
606 }
607 // Data suggested
608 if (!empty($arrayfields['aa.data_suggest']['checked'])) {
609 print '<td class="liste_titre"></td>';
610 }
611 // Account
612 if (!empty($arrayfields['aa.account_number']['checked'])) {
613 print '<td class="liste_titre"></td>';
614 }
615 // Fields from hook
616 $parameters = array('arrayfields' => $arrayfields);
617 $reshook = $hookmanager->executeHooks('printFieldListOption', $parameters, $object, $action); // Note that $action and $object may have been modified by hook
618 print $hookmanager->resPrint;
619
620 // Action column
621 if (!$conf->main_checkbox_left_column) {
622 print '<td class="liste_titre center maxwidthsearch actioncolumn">';
623 $searchpicto = $form->showFilterButtons();
624 print $searchpicto;
625 print '</td>';
626 }
627 print "</tr>\n";
628
629 // Fields title label
630 // --------------------------------------------------------------------
631 $totalarray = array();
632 $totalarray['nbfield'] = 0;
633
634 print '<tr class="liste_titre">';
635 // Action column
636 if ($conf->main_checkbox_left_column) {
637 print getTitleFieldOfList($selectedfields, 0, $_SERVER["PHP_SELF"], '', '', '', '', $sortfield, $sortorder, 'center maxwidthsearch ')."\n";
638 $totalarray['nbfield']++;
639 }
640 // Line ID
641 if (!empty($arrayfields['l.rowid']['checked'])) {
642 print_liste_field_titre($arrayfields['l.rowid']['label'], $_SERVER["PHP_SELF"], "l.rowid", "", $param, '', $sortfield, $sortorder);
643 $totalarray['nbfield']++;
644 }
645 // Ref invoice
646 if (!empty($arrayfields['f.ref']['checked'])) {
647 print_liste_field_titre($arrayfields['f.ref']['label'], $_SERVER["PHP_SELF"], "f.ref", "", $param, '', $sortfield, $sortorder);
648 $totalarray['nbfield']++;
649 }
650 // Date
651 if (!empty($arrayfields['f.datef']['checked'])) {
652 print_liste_field_titre($arrayfields['f.datef']['label'], $_SERVER["PHP_SELF"], "f.datef, f.ref, l.rowid", "", $param, '', $sortfield, $sortorder, 'center ');
653 $totalarray['nbfield']++;
654 }
655 // Product ref
656 if (!empty($arrayfields['p.ref']['checked'])) {
657 print_liste_field_titre($arrayfields['p.ref']['label'], $_SERVER["PHP_SELF"], "p.ref", "", $param, '', $sortfield, $sortorder);
658 $totalarray['nbfield']++;
659 }
660 // product description
661 if (!empty($arrayfields['l.description']['checked'])) {
662 print_liste_field_titre($arrayfields['l.description']['label'], $_SERVER["PHP_SELF"], "l.description", "", $param, '', $sortfield, $sortorder);
663 $totalarray['nbfield']++;
664 }
665 // Amount
666 if (!empty($arrayfields['l.total_ht']['checked'])) {
667 print_liste_field_titre($arrayfields['l.total_ht']['label'], $_SERVER["PHP_SELF"], "l.total_ht", "", $param, '', $sortfield, $sortorder, 'right ');
668 $totalarray['nbfield']++;
669 }
670 // VAT
671 if (!empty($arrayfields['l.tva_tx']['checked'])) {
672 print_liste_field_titre($arrayfields['l.tva_tx']['label'], $_SERVER["PHP_SELF"], "l.tva_tx", "", $param, '', $sortfield, $sortorder, 'right ');
673 $totalarray['nbfield']++;
674 }
675 // Thirdparty
676 if (!empty($arrayfields['s.nom']['checked'])) {
677 print_liste_field_titre($arrayfields['s.nom']['label'], $_SERVER["PHP_SELF"], "s.nom", "", $param, '', $sortfield, $sortorder);
678 $totalarray['nbfield']++;
679 }
680 // Country
681 if (!empty($arrayfields['co.label']['checked'])) {
682 print_liste_field_titre($arrayfields['co.label']['label'], $_SERVER["PHP_SELF"], "co.label", "", $param, '', $sortfield, $sortorder);
683 $totalarray['nbfield']++;
684 }
685 // TVA Intracom
686 if (!empty($arrayfields['s.tva_intra']['checked'])) {
687 print_liste_field_titre($arrayfields['s.tva_intra']['label'], $_SERVER["PHP_SELF"], "s.tva_intra", "", $param, '', $sortfield, $sortorder);
688 $totalarray['nbfield']++;
689 }
690 // Data suggested
691 if (!empty($arrayfields['aa.data_suggest']['checked'])) {
692 print_liste_field_titre($arrayfields['aa.data_suggest']['label'], $_SERVER["PHP_SELF"], "aa.account_number", "", $param, '', $sortfield, $sortorder);
693 $totalarray['nbfield']++;
694 }
695 // Account
696 if (!empty($arrayfields['aa.account_number']['checked'])) {
697 print_liste_field_titre($arrayfields['aa.account_number']['label'], $_SERVER["PHP_SELF"], "aa.account_number", "", $param, '', $sortfield, $sortorder);
698 $totalarray['nbfield']++;
699 }
700 // Hook fields
701 $parameters = array('arrayfields' => $arrayfields, 'param' => $param, 'sortfield' => $sortfield, 'sortorder' => $sortorder);
702 $reshook = $hookmanager->executeHooks('printFieldListTitle', $parameters, $object, $action); // Note that $action and $object may have been modified by hook
703 print $hookmanager->resPrint;
704 // Action column
705 if (!$conf->main_checkbox_left_column) {
706 print getTitleFieldOfList($selectedfields, 0, $_SERVER["PHP_SELF"], '', '', '', '', $sortfield, $sortorder, 'center maxwidthsearch ')."\n";
707 $totalarray['nbfield']++;
708 }
709 print "</tr>\n";
710
711 $thirdpartystatic = new Societe($db);
712 $facture_static = new Facture($db);
713 $facture_static_det = new FactureLigne($db);
714 $product_static = new Product($db);
715
716
717 $accountingaccount_codetotid_cache = array();
718 $suggestedaccountingaccountfor = ''; // Initialise (for static analysis)
719 $suggestedaccountingaccountbydefaultfor = '';
720
721 while ($i < min($num_lines, $limit)) {
722 $objp = $db->fetch_object($result);
723
724 // product_type: 0 = service, 1 = product
725 // if product does not exist we use the value of product_type provided in facturedet to define if this is a product or service
726 // issue : if we change product_type value in product DB it should differ from the value stored in facturedet DB !
727 $code_sell_l = '';
728 $code_sell_p = '';
729 $code_sell_t = '';
730
731 $thirdpartystatic->id = $objp->socid;
732 $thirdpartystatic->name = $objp->name;
733 $thirdpartystatic->client = $objp->client;
734 $thirdpartystatic->fournisseur = $objp->fournisseur;
735 $thirdpartystatic->code_client = $objp->code_client;
736 $thirdpartystatic->code_compta = $objp->code_compta_client; // For backward compatibility
737 $thirdpartystatic->code_compta_client = $objp->code_compta_client;
738 $thirdpartystatic->code_fournisseur = $objp->code_fournisseur;
739 $thirdpartystatic->code_compta_fournisseur = $objp->code_compta_fournisseur;
740 $thirdpartystatic->email = $objp->email;
741 $thirdpartystatic->country_code = $objp->country_code;
742 $thirdpartystatic->tva_intra = $objp->tva_intra;
743 $thirdpartystatic->code_compta_product = $objp->company_code_sell; // The accounting account for product stored on thirdparty object (for level3 suggestion)
744
745 $product_static->ref = $objp->product_ref;
746 $product_static->id = $objp->product_id;
747 $product_static->type = $objp->type;
748 $product_static->label = $objp->product_label;
749 $product_static->status = $objp->status;
750 $product_static->status_buy = $objp->status_buy;
751 $product_static->accountancy_code_sell = $objp->code_sell;
752 $product_static->accountancy_code_sell_intra = $objp->code_sell_intra;
753 $product_static->accountancy_code_sell_export = $objp->code_sell_export;
754 $product_static->accountancy_code_buy = $objp->code_buy;
755 $product_static->accountancy_code_buy_intra = $objp->code_buy_intra;
756 $product_static->accountancy_code_buy_export = $objp->code_buy_export;
757 $product_static->tva_tx = $objp->tva_tx_prod;
758
759 $facture_static->ref = $objp->ref;
760 $facture_static->id = $objp->facid;
761 $facture_static->type = $objp->ftype;
762 $facture_static->date = $db->jdate($objp->datef);
763 $facture_static->fk_facture_source = $objp->fk_facture_source;
764
765 $facture_static_det->id = $objp->rowid;
766 $facture_static_det->total_ht = $objp->total_ht;
767 $facture_static_det->tva_tx = $objp->tva_tx_line;
768 $facture_static_det->vat_src_code = $objp->vat_src_code;
769 $facture_static_det->product_type = $objp->type_l;
770 $facture_static_det->desc = $objp->description;
771
772 $accountingAccountArray = array(
773 'dom' => $objp->aarowid,
774 'intra' => $objp->aarowid_intra,
775 'export' => $objp->aarowid_export,
776 'thirdparty' => $objp->aarowid_thirdparty);
777
778 $code_sell_p_notset = '';
779 $code_sell_t_notset = '';
780
781 $suggestedid = 0;
782
783 $return = $accountingAccount->getAccountingCodeToBind($thirdpartystatic, $mysoc, $product_static, $facture_static, $facture_static_det, $accountingAccountArray, 'customer');
784 if (!is_array($return) && $return < 0) {
785 setEventMessage($accountingAccount->error, 'errors');
786 } else {
787 $suggestedid = $return['suggestedid'];
788 $suggestedaccountingaccountfor = $return['suggestedaccountingaccountfor'];
789 $suggestedaccountingaccountbydefaultfor = $return['suggestedaccountingaccountbydefaultfor'];
790 $code_sell_l = $return['code_l'];
791 $code_sell_p = $return['code_p'];
792 $code_sell_t = $return['code_t'];
793 }
794 //var_dump($return);
795
796 if (!empty($code_sell_p)) {
797 // Value was defined previously
798 } else {
799 $code_sell_p_notset = 'color:orange';
800 }
801 if (empty($code_sell_l) && empty($code_sell_p)) {
802 $code_sell_p_notset = 'color:red';
803 }
804 if ($suggestedaccountingaccountfor == 'eecwithoutvatnumber' && empty($code_sell_p_notset)) {
805 $code_sell_p_notset = 'color:orange';
806 }
807
808 // $code_sell_l is now default code of product/service
809 // $code_sell_p is now code of product/service
810 // $code_sell_t is now code of thirdparty
811 //var_dump($code_sell_l.' - '.$code_sell_p.' - '.$code_sell_t.' -> '.$suggestedid.' ('.$suggestedaccountingaccountbydefaultfor.' '.$suggestedaccountingaccountfor.')');
812
813 print '<tr class="oddeven">';
814 // Action column
815 if ($conf->main_checkbox_left_column) {
816 print '<td class="nowrap center actioncolumn">';
817 $selected = in_array($objp->rowid."_".$i, $toselect);
818 print '<input type="checkbox" class="flat checkforselect checkforselect'.$facture_static_det->id.'" name="toselect[]" value="'.$facture_static_det->id."_".$i.'"'.($selected ? " checked" : "").'/>';
819 print '</td>';
820 if (!$i) {
821 $totalarray['nbfield']++;
822 }
823 }
824 // Line id
825 if (!empty($arrayfields['l.rowid']['checked'])) {
826 print '<td>'.$facture_static_det->id.'</td>';
827 $totalarray['nbfield']++;
828 }
829 // Ref Invoice
830 if (!empty($arrayfields['f.ref']['checked'])) {
831 print '<td class="nowraponall cell2linesheight">'.$facture_static->getNomUrl(1).'</td>';
832 $totalarray['nbfield']++;
833 }
834 // Invoice date
835 if (!empty($arrayfields['f.datef']['checked'])) {
836 print '<td class="center">'.dol_print_date($facture_static->date, 'day').'</td>';
837 $totalarray['nbfield']++;
838 }
839 // Ref Product
840 if (!empty($arrayfields['p.ref']['checked'])) {
841 print '<td class="tdoverflowmax125 cell2linesheight">';
842 if ($product_static->id > 0) {
843 print $product_static->getNomUrl(1);
844 }
845 if ($product_static->label) {
846 print '<br><span class="opacitymedium small">'.dol_escape_htmltag($product_static->label).'</span>';
847 }
848 print '</td>';
849 $totalarray['nbfield']++;
850 }
851 // Description of line
852 if (!empty($arrayfields['l.description']['checked'])) {
853 $text = dolGetFirstLineOfText(dol_string_nohtmltag($facture_static_det->desc, 1));
854 print '<td class="tdoverflowmax150 small classfortooltip" title="'.dol_escape_htmltag($text).'">';
855 $trunclength = getDolGlobalInt('ACCOUNTING_LENGTH_DESCRIPTION');
856 print dol_trunc($text, $trunclength);
857 print '</td>';
858 $totalarray['nbfield']++;
859 }
860 // Amount
861 if (!empty($arrayfields['l.total_ht']['checked'])) {
862 print '<td class="right nowraponall amount">';
863
864 // Create a compensation rate for old situation invoice feature.
865 $situation_ratio = 1;
866 if (getDolGlobalInt('INVOICE_USE_SITUATION') == 1) {
867 if ($objp->situation_cycle_ref) {
868 // Avoid divide by 0
869 if ($objp->situation_percent == 0) {
870 $situation_ratio = 0;
871 } else {
872 $line = new FactureLigne($db);
873 $line->fetch($objp->rowid);
874
875 // Situation invoices handling
876 $prev_progress = $line->get_prev_progress($objp->facid);
877
878 $situation_ratio = ($objp->situation_percent - $prev_progress) / $objp->situation_percent;
879 }
880 }
881 print price($objp->total_ht * $situation_ratio);
882 } else {
883 print price($objp->total_ht);
884 }
885 print '</td>';
886 $totalarray['nbfield']++;
887 }
888 // Vat rate
889 if (!empty($arrayfields['l.tva_tx']['checked'])) {
890 $code_vat_differ = '';
891 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
892 $code_vat_differ = 'warning bold';
893 }
894 print '<td class="right cell2linesheight'.($code_vat_differ ? ' '.$code_vat_differ : '').'">';
895 print vatrate($facture_static_det->tva_tx.($facture_static_det->vat_src_code ? ' ('.$facture_static_det->vat_src_code.')' : ''), false, 0, 0, 1);
896 print '</td>';
897 $totalarray['nbfield']++;
898 }
899 // Thirdparty
900 if (!empty($arrayfields['s.nom']['checked'])) {
901 print '<td class="tdoverflowmax125">'.$thirdpartystatic->getNomUrl(1, 'customer').'</td>';
902 $totalarray['nbfield']++;
903 }
904 // Country
905 if (!empty($arrayfields['co.label']['checked'])) {
906 $labelcountry = ($objp->country_code && ($langs->trans("Country".$objp->country_code) != "Country".$objp->country_code)) ? $langs->trans("Country".$objp->country_code) : $objp->country_label;
907 print '<td class="tdoverflowmax100" title="'.dol_escape_htmltag($labelcountry).'">';
908 print dol_escape_htmltag($labelcountry);
909 print '</td>';
910 $totalarray['nbfield']++;
911 }
912 // VAT Num
913 if (!empty($arrayfields['s.tva_intra']['checked'])) {
914 print '<td class="tdoverflowmax80" title="'.dol_escape_htmltag($objp->tva_intra).'">'.dol_escape_htmltag($objp->tva_intra).'</td>';
915 $totalarray['nbfield']++;
916 }
917 // Found accounts
918 if (!empty($arrayfields['aa.data_suggest']['checked'])) {
919 print '<td class="small cell2linesheight">';
920 // First show default account for any products
921 $s = '1. '.(($facture_static_det->product_type == 1) ? $langs->trans("DefaultForService") : $langs->trans("DefaultForProduct")).': ';
922 $shelp = '';
923 $ttype = 'help';
924 if ($suggestedaccountingaccountbydefaultfor == 'eec') {
925 $shelp .= $langs->trans("SaleEEC");
926 } elseif ($suggestedaccountingaccountbydefaultfor == 'eecwithvat') {
927 $shelp = $langs->trans("SaleEECWithVAT");
928 } elseif ($suggestedaccountingaccountbydefaultfor == 'eecwithoutvatnumber') {
929 $shelp = $langs->trans("SaleEECWithoutVATNumber");
930 $ttype = 'warning';
931 } elseif ($suggestedaccountingaccountbydefaultfor == 'export') {
932 $shelp .= $langs->trans("SaleExport");
933 }
934 $s .= ($code_sell_l > 0 ? length_accountg($code_sell_l) : '<span style="'.$code_sell_p_notset.'">'.$langs->trans("NotDefined").'</span>');
935 $textforrule = $form->textwithpicto($s, $shelp, 1, $ttype, '', 0, 2, '', 1);
936 // Now show account for product
937 if ($product_static->id > 0) {
938 $textforrule .= '<br>';
939 $s = '2. '.(($facture_static_det->product_type == 1) ? $langs->trans("ThisService") : $langs->trans("ThisProduct")).': ';
940 $shelp = '';
941 $ttype = 'help';
942 if ($suggestedaccountingaccountbydefaultfor == 'eec') {
943 $shelp .= $langs->trans("SaleEEC");
944 } elseif ($suggestedaccountingaccountbydefaultfor == 'eecwithvat') {
945 $shelp = $langs->trans("SaleEECWithVAT");
946 } elseif ($suggestedaccountingaccountbydefaultfor == 'eecwithoutvatnumber') {
947 $shelp = $langs->trans("SaleEECWithoutVATNumber");
948 $ttype = 'warning';
949 } elseif ($suggestedaccountingaccountbydefaultfor == 'export') {
950 $shelp .= $langs->trans("SaleExport");
951 }
952 $s .= (empty($code_sell_p) ? '<span style="'.$code_sell_p_notset.'">'.$langs->trans("NotDefined").'</span>' : length_accountg($code_sell_p));
953 $textforrule .= $form->textwithpicto($s, $shelp, 1, $ttype, '', 0, 2, '', 1);
954 } else {
955 $textforrule .= '<br>';
956 $s = '2. '.(($objp->type_l == 1) ? $langs->trans("ThisService") : $langs->trans("ThisProduct")).': ';
957 $shelp = '';
958 $s .= $langs->trans("NotDefined");
959 $textforrule .= $form->textwithpicto($s, $shelp, 1, 'help', '', 0, 2, '', 1);
960 }
961 if (getDolGlobalString('ACCOUNTANCY_USE_PRODUCT_ACCOUNT_ON_THIRDPARTY')) {
962 $textforrule .= '<br>';
963 $s = '3. '.(($facture_static_det->product_type == 1) ? $langs->trans("ServiceForThisThirdparty") : $langs->trans("ProductForThisThirdparty")).': ';
964 $shelp = '';
965 $s .= ($code_sell_t > 0 ? length_accountg($code_sell_t) : '<span style="'.$code_sell_t_notset.'">'.$langs->trans("NotDefined").'</span>');
966 $textforrule .= $form->textwithpicto($s, $shelp, 1, 'help', '', 0, 2, '', 1);
967 }
968 print $textforrule;
969 print '</td>';
970 $totalarray['nbfield']++;
971 }
972 // Suggested accounting account
973 if (!empty($arrayfields['aa.account_number']['checked'])) {
974 print '<td>';
975 print $formaccounting->select_account(($default_account > 0 && $confirm === 'yes' && in_array($objp->rowid."_".$i, $toselect)) ? (string) $default_account : (string) $suggestedid, 'codeventil'.$facture_static_det->id, 1, array(), 0, 0, 'codeventil minwidth125onall maxwidth150', 'cachewithshowemptyone');
976 print '</td>';
977 $totalarray['nbfield']++;
978 }
979 // Fields from hook
980 $parameters = array('arrayfields' => $arrayfields, 'obj' => $objp, 'i' => $i, 'totalarray' => &$totalarray);
981 $reshook = $hookmanager->executeHooks('printFieldListValue', $parameters, $object, $action); // Note that $action and $object may have been modified by hook
982 print $hookmanager->resPrint;
983 // Action column
984 if (!$conf->main_checkbox_left_column) {
985 print '<td class="nowrap center actioncolumn">';
986 $selected = in_array($objp->rowid."_".$i, $toselect);
987 print '<input type="checkbox" class="flat checkforselect checkforselect'.$facture_static_det->id.'" name="toselect[]" value="'.$facture_static_det->id."_".$i.'"'.($selected ? " checked" : "").'/>';
988 print '</td>';
989 if (!$i) {
990 $totalarray['nbfield']++;
991 }
992 }
993
994 print '</tr>';
995 $i++;
996 }
997 if ($num_lines == 0) {
998 $colspan = 1;
999 foreach ($arrayfields as $key => $val) {
1000 if (!empty($val['checked'])) {
1001 $colspan++;
1002 }
1003 }
1004 print '<tr><td colspan="'.$colspan.'"><span class="opacitymedium">'.$langs->trans("NoRecordFound").'</span></td></tr>';
1005 }
1006
1007 $parameters = array('arrayfields' => $arrayfields, 'sql' => $sql);
1008 $reshook = $hookmanager->executeHooks('printFieldListFooter', $parameters, $object, $action); // Note that $action and $object may have been modified by hook
1009 print $hookmanager->resPrint;
1010
1011 print '</table>';
1012 print "</div>";
1013
1014 print '</form>';
1015} else {
1016 print $db->error();
1017}
1018if ($db->type == 'mysqli') {
1019 $db->query("SET SQL_BIG_SELECTS=0"); // Enable MAX_JOIN_SIZE limitation
1020}
1021
1022// Add code to auto check the box when we select an account
1023print '<script type="text/javascript">
1024jQuery(document).ready(function() {
1025 jQuery(".codeventil").change(function() {
1026 var s=$(this).attr("id").replace("codeventil", "")
1027 console.log(s+" "+$(this).val());
1028 if ($(this).val() == -1) jQuery(".checkforselect"+s).prop("checked", false);
1029 else jQuery(".checkforselect"+s).prop("checked", true);
1030 });
1031});
1032</script>';
1033
1034// End of page
1035llxFooter();
1036$db->close();
if(! $sortfield) if(! $sortorder) $object
Definition account.php:100
$totalarray
Definition list.php:497
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).
llxFooter($comment='', $zone='private', $disabledoutputofmessages=0)
Empty footer.
Definition wrapper.php:91
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:73
Class to manage accounting accounts.
Class to manage invoices.
const TYPE_REPLACEMENT
Replacement invoice.
const TYPE_SITUATION
Situation invoice.
const TYPE_DEPOSIT
Deposit invoice.
const TYPE_CREDIT_NOTE
Credit note invoice.
Class to manage invoice lines.
Class to manage generation of HTML components for accounting management.
Class to manage generation of HTML components Only common components must be here.
Class 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...
global $mysoc
if(!isModEnabled('ai')||!getDolGlobalString('AI_ASSISTANT_ENABLED')) global $conf
The main.inc.php has been included so the following variable are now defined:
if(!isModEnabled('ai')||!getDolGlobalString('AI_ASSISTANT_ENABLED')) global $db
API class for accounts.
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...
dol_getIdFromCode($db, $key, $tablename, $fieldkey='code', $fieldid='id', $entityfilter=0, $filters='', $useCache=true)
Return an id or code from a code or id.
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_liste_field_titre($name, $file="", $field="", $begin="", $param="", $moreattrib="", $sortfield="", $sortorder="", $prefix="", $tooltip="", $forcenowrapcolumntitle=0)
Show title line of an array.
print_barre_liste($title, $page, $file, $options='', $sortfield='', $sortorder='', $morehtmlcenter='', $num=-1, $totalnboflines='', $picto='generic', $pictoisfullpath=0, $morehtmlright='', $morecss='', $limit=-1, $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, $allowothertags=array())
Show picto whatever it's its name (generic function)
GETPOSTINT($paramname, $method=0)
Return the value of a $_GET or $_POST supervariable, converted into integer.
dolGetFirstLineOfText($text, $nboflines=1, $charset='UTF-8')
Return first line of text.
dol_string_nohtmltag($stringtoclean, $removelinefeed=1, $pagecodeto='UTF-8', $strip_tags=0, $removedoublespaces=1)
Clean a string from all HTML tags and entities.
price2num($amount, $rounding='', $option=0)
Function that return a number with universal decimal format (decimal separator is '.
setEventMessage($mesgs, $style='mesgs', $noduplicate=0, $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.
natural_search($fields, $value, $mode=0, $nofirstand=0, $sqltoadd='')
Generate natural SQL search string for a criteria (this criteria can be tested on one or several fiel...
getDolGlobalInt($key, $default=0)
Return a Dolibarr global constant int value.
dol_sort_array(&$array, $index, $order='asc', $natsort=0, $case_sensitive=0, $keepindex=0)
Advanced sort array by the value of a given key, which produces ascending (default) or descending out...
getTitleFieldOfList($name, $thead=0, $file="", $field="", $begin="", $moreparam="", $moreattrib="", $sortfield="", $sortorder="", $prefix="", $disablesortlink=0, $tooltip='', $forcenowrapcolumntitle=0)
Get 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.
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...
print $langs trans("Show") . '< td style="' . $timeColor . '" align="center"> s</td > badge status0 badge status4 badge status3 Error badge status8< td align="center">< span class="badge ' . $badge . '"></span ></td >< td align="center">< a href="#" class="button button-small" onclick="openLogModal(this)" data-req="' . dol_escape_htmltag($reqSafe) . '" data-res="' . dol_escape_htmltag($resSafe) . '" data-err="' . dol_escape_htmltag($errSafe) . '">< span class="fa fa-search-plus"></span ></a ></td ></tr >< tr >< td colspan="' . $colspan . '" class="opacitymedium"></td ></tr ></table ></div ></form > logModal none logModal none s a JSON string
buildzip.php
accessforbidden($message='', $printheader=1, $printfooter=1, $showonlymessage=0, $params=null)
Show a message to say access is forbidden and stop program.