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