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