dolibarr 20.0.0
invoicetemplate_list.php
Go to the documentation of this file.
1<?php
2/* Copyright (C) 2002-2003 Rodolphe Quiedeville <rodolphe@quiedeville.org>
3 * Copyright (C) 2004-2016 Laurent Destailleur <eldy@users.sourceforge.net>
4 * Copyright (C) 2005-2012 Regis Houssin <regis.houssin@inodbox.com>
5 * Copyright (C) 2013 Florian Henry <florian.henry@open-concept.pro>
6 * Copyright (C) 2013 Juanjo Menent <jmenent@2byte.es>
7 * Copyright (C) 2015 Jean-François Ferry <jfefe@aternatik.fr>
8 * Copyright (C) 2012 Cedric Salvador <csalvador@gpcsolutions.fr>
9 * Copyright (C) 2015-2021 Alexandre Spangaro <aspangaro@open-dsi.fr>
10 * Copyright (C) 2016 Meziane Sof <virtualsof@yahoo.fr>
11 * Copyright (C) 2023 William Mead <william.mead@manchenumerique.fr>
12 * Copyright (C) 2024 MDW <mdeweerd@users.noreply.github.com>
13 *
14 * This program is free software; you can redistribute it and/or modify
15 * it under the terms of the GNU General Public License as published by
16 * the Free Software Foundation; either version 3 of the License, or
17 * (at your option) any later version.
18 *
19 * This program is distributed in the hope that it will be useful,
20 * but WITHOUT ANY WARRANTY; without even the implied warranty of
21 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
22 * GNU General Public License for more details.
23 *
24 * You should have received a copy of the GNU General Public License
25 * along with this program. If not, see <https://www.gnu.org/licenses/>.
26 */
27
34// Load Dolibarr environment
35require '../../main.inc.php';
36require_once DOL_DOCUMENT_ROOT.'/compta/facture/class/facture-rec.class.php';
37require_once DOL_DOCUMENT_ROOT.'/product/class/product.class.php';
38require_once DOL_DOCUMENT_ROOT.'/core/class/html.formother.class.php';
39require_once DOL_DOCUMENT_ROOT.'/projet/class/project.class.php';
40require_once DOL_DOCUMENT_ROOT.'/core/class/html.formprojet.class.php';
41require_once DOL_DOCUMENT_ROOT.'/core/class/doleditor.class.php';
42require_once DOL_DOCUMENT_ROOT.'/core/lib/invoice.lib.php';
43require_once DOL_DOCUMENT_ROOT.'/core/lib/date.lib.php';
44require_once DOL_DOCUMENT_ROOT.'/core/class/extrafields.class.php';
45
46// Load translation files required by the page
47$langs->loadLangs(array('companies', 'bills', 'compta', 'admin', 'other'));
48
49$action = GETPOST('action', 'alpha');
50$massaction = GETPOST('massaction', 'alpha');
51$show_files = GETPOSTINT('show_files');
52$confirm = GETPOST('confirm', 'alpha');
53$cancel = GETPOST('cancel', 'alpha');
54$toselect = GETPOST('toselect', 'array');
55$contextpage = GETPOST('contextpage', 'aZ') ? GETPOST('contextpage', 'aZ') : 'invoicetemplatelist'; // To manage different context of search
56$optioncss = GETPOST('optioncss', 'aZ'); // Option for the css output (always '' except when 'print')
57$mode = GETPOST('mode', 'aZ'); // The output mode ('list', 'kanban', 'hierarchy', 'calendar', ...)
58
59$socid = GETPOSTINT('socid');
60
61$id = (GETPOSTINT('facid') ? GETPOSTINT('facid') : GETPOSTINT('id'));
62$lineid = GETPOSTINT('lineid');
63$ref = GETPOST('ref', 'alpha');
64if ($user->socid) {
65 $socid = $user->socid;
66}
67$objecttype = 'facture_rec';
68if ($action == "create" || $action == "add") {
69 $objecttype = '';
70}
71
72$search_ref = GETPOST('search_ref');
73$search_societe = GETPOST('search_societe');
74$search_montant_ht = GETPOST('search_montant_ht');
75$search_montant_vat = GETPOST('search_montant_vat');
76$search_montant_ttc = GETPOST('search_montant_ttc');
77$search_payment_mode = GETPOST('search_payment_mode');
78$search_payment_term = GETPOST('search_payment_term');
79$search_date_startday = GETPOSTINT('search_date_startday');
80$search_date_startmonth = GETPOSTINT('search_date_startmonth');
81$search_date_startyear = GETPOSTINT('search_date_startyear');
82$search_date_endday = GETPOSTINT('search_date_endday');
83$search_date_endmonth = GETPOSTINT('search_date_endmonth');
84$search_date_endyear = GETPOSTINT('search_date_endyear');
85$search_date_start = dol_mktime(0, 0, 0, $search_date_startmonth, $search_date_startday, $search_date_startyear); // Use tzserver
86$search_date_end = dol_mktime(23, 59, 59, $search_date_endmonth, $search_date_endday, $search_date_endyear);
87$search_date_when_startday = GETPOSTINT('search_date_when_startday');
88$search_date_when_startmonth = GETPOSTINT('search_date_when_startmonth');
89$search_date_when_startyear = GETPOSTINT('search_date_when_startyear');
90$search_date_when_endday = GETPOSTINT('search_date_when_endday');
91$search_date_when_endmonth = GETPOSTINT('search_date_when_endmonth');
92$search_date_when_endyear = GETPOSTINT('search_date_when_endyear');
93$search_date_when_start = dol_mktime(0, 0, 0, $search_date_when_startmonth, $search_date_when_startday, $search_date_when_startyear); // Use tzserver
94$search_date_when_end = dol_mktime(23, 59, 59, $search_date_when_endmonth, $search_date_when_endday, $search_date_when_endyear);
95$search_recurring = GETPOST('search_recurring', 'intcomma');
96$search_frequency = GETPOST('search_frequency', 'alpha');
97$search_unit_frequency = GETPOST('search_unit_frequency', 'alpha');
98$search_nb_gen_done = GETPOST('search_nb_gen_done', 'alpha');
99$search_status = GETPOST('search_status', 'intcomma');
100
101$limit = GETPOSTINT('limit') ? GETPOSTINT('limit') : $conf->liste_limit;
102$sortfield = GETPOST('sortfield', 'aZ09comma');
103$sortorder = GETPOST('sortorder', 'aZ09comma');
104$page = GETPOSTISSET('pageplusone') ? (GETPOSTINT('pageplusone') - 1) : GETPOSTINT("page");
105if (empty($page) || $page < 0 || GETPOST('button_search', 'alpha') || GETPOST('button_removefilter', 'alpha')) {
106 // If $page is not defined, or '' or -1 or if we click on clear filters
107 $page = 0;
108}
109$offset = $limit * $page;
110$pageprev = $page - 1;
111$pagenext = $page + 1;
112
113// Initialize technical objects
114$object = new FactureRec($db);
115$extrafields = new ExtraFields($db);
116
117if (($id > 0 || $ref) && $action != 'create' && $action != 'add') {
118 $ret = $object->fetch($id, $ref);
119 if (!$ret) {
120 setEventMessages($langs->trans("ErrorRecordNotFound"), null, 'errors');
121 }
122}
123
124// Initialize technical object to manage hooks of page. Note that conf->hooks_modules contains array of hook context
125$hookmanager->initHooks(array('invoicereclist'));
126
127// Fetch optionals attributes and labels
128$extrafields->fetch_name_optionals_label($object->table_element);
129
130$search_array_options = $extrafields->getOptionalsFromPost($object->table_element, '', 'search_');
131
132// Default sort order (if not yet defined by previous GETPOST)
133if (!$sortorder) {
134 $sortorder = 'DESC';
135}
136if (!$sortfield) {
137 $sortfield = 'f.titre';
138}
139
140$arrayfields = array(
141 'f.titre' => array('label' => "Ref", 'checked' => 1),
142 's.nom' => array('label' => "ThirdParty", 'checked' => 1),
143 'f.total_ht' => array('label' => "AmountHT", 'checked' => 1),
144 'f.total_tva' => array('label' => "AmountVAT", 'checked' => -1),
145 'f.total_ttc' => array('label' => "AmountTTC", 'checked' => 1),
146 'f.fk_mode_reglement' => array('label' => "PaymentMode", 'checked' => 0),
147 'f.fk_cond_reglement' => array('label' => "PaymentTerm", 'checked' => 0),
148 'recurring' => array('label' => "RecurringInvoice", 'checked' => 1),
149 'f.frequency' => array('label' => "Frequency", 'checked' => 1),
150 'f.unit_frequency' => array('label' => "FrequencyUnit", 'checked' => 1),
151 'f.nb_gen_done' => array('label' => "NbOfGenerationDoneShort", 'checked' => 1),
152 'f.date_last_gen' => array('label' => "DateLastGenerationShort", 'checked' => 1),
153 'f.date_when' => array('label' => "NextDateToExecutionShort", 'checked' => 1),
154 'f.fk_user_author' => array('label' => "UserCreation", 'checked' => 0, 'position' => 500),
155 'f.fk_user_modif' => array('label' => "UserModification", 'checked' => 0, 'position' => 505),
156 'f.datec' => array('label' => "DateCreation", 'checked' => 0, 'position' => 520),
157 'f.tms' => array('label' => "DateModificationShort", 'checked' => 0, 'position' => 525),
158 'status' => array('label' => "Status", 'checked' => 1, 'position' => 1000),
159);
160// Extra fields
161include DOL_DOCUMENT_ROOT.'/core/tpl/extrafields_list_array_fields.tpl.php';
162
163$object->fields = dol_sort_array($object->fields, 'position');
164$arrayfields = dol_sort_array($arrayfields, 'position');
165'@phan-var-force array<string,array{label:string,checked?:int<0,1>,position?:int,help?:string}> $arrayfields'; // dol_sort_array looses type for Phan
166
167if ($socid > 0) {
168 $tmpthirdparty = new Societe($db);
169 $res = $tmpthirdparty->fetch($socid);
170 if ($res > 0) {
171 $search_societe = $tmpthirdparty->name;
172 }
173}
174
175$objecttype = 'facture_rec';
176
177$permissionnote = $user->hasRight('facture', 'creer'); // Used by the include of actions_setnotes.inc.php
178$permissiondellink = $user->hasRight('facture', 'creer'); // Used by the include of actions_dellink.inc.php
179$permissiontoedit = $user->hasRight('facture', 'creer'); // Used by the include of actions_lineupdonw.inc.php
180
181// Security check
182$result = restrictedArea($user, 'facture', $object->id, $objecttype);
183
184
185/*
186 * Actions
187 */
188
189if (GETPOST('cancel', 'alpha')) {
190 $action = 'list';
191 $massaction = '';
192}
193if (!GETPOST('confirmmassaction', 'alpha') && $massaction != 'presend' && $massaction != 'confirm_presend') {
194 $massaction = '';
195}
196
197$parameters = array('socid' => $socid);
198$reshook = $hookmanager->executeHooks('doActions', $parameters, $object, $action); // Note that $action and $object may have been modified by some hooks
199if ($reshook < 0) {
200 setEventMessages($hookmanager->error, $hookmanager->errors, 'errors');
201}
202
203if (empty($reshook)) {
204 /*if (GETPOST('cancel', 'alpha')) {
205 $action = '';
206 }*/
207
208 // Selection of new fields
209 include DOL_DOCUMENT_ROOT.'/core/actions_changeselectedfields.inc.php';
210
211 // Purge search criteria
212 if (GETPOST('button_removefilter_x', 'alpha') || GETPOST('button_removefilter.x', 'alpha') || GETPOST('button_removefilter', 'alpha')) { // All tests are required to be compatible with all browsers
213 $search_ref = '';
214 $search_societe = '';
215 $search_montant_ht = '';
216 $search_montant_vat = '';
217 $search_montant_ttc = '';
218 $search_payment_mode = '';
219 $search_payment_term = '';
220 $search_date_startday = '';
221 $search_date_startmonth = '';
222 $search_date_startyear = '';
223 $search_date_endday = '';
224 $search_date_endmonth = '';
225 $search_date_endyear = '';
226 $search_date_start = '';
227 $search_date_end = '';
228 $search_date_when_startday = '';
229 $search_date_when_startmonth = '';
230 $search_date_when_startyear = '';
231 $search_date_when_endday = '';
232 $search_date_when_endmonth = '';
233 $search_date_when_endyear = '';
234 $search_date_when_start = '';
235 $search_date_when_end = '';
236 $search_recurring = '';
237 $search_frequency = '';
238 $search_unit_frequency = '';
239 $search_nb_gen_done = '';
240 $search_status = '';
241 $toselect = array();
242 $search_array_options = array();
243 }
244 if (GETPOST('button_removefilter_x', 'alpha') || GETPOST('button_removefilter.x', 'alpha') || GETPOST('button_removefilter', 'alpha')
245 || GETPOST('button_search_x', 'alpha') || GETPOST('button_search.x', 'alpha') || GETPOST('button_search', 'alpha')) {
246 $massaction = ''; // Protection to avoid mass action if we force a new search during a mass action confirmation
247 }
248
249 // Mass actions
250 /*$objectclass='MyObject';
251 $objectlabel='MyObject';
252 $permissiontoread = $user->hasRight("mymodule", "read");
253 $permissiontodelete = $user->hasRight("mymodule", "delete");
254 $uploaddir = $conf->mymodule->dir_output;
255 include DOL_DOCUMENT_ROOT.'/core/actions_massactions.inc.php';*/
256}
257
258
259/*
260 * View
261 */
262
263$form = new Form($db);
264$formother = new FormOther($db);
265if (isModEnabled('project')) {
266 $formproject = new FormProjets($db);
267}
268$companystatic = new Societe($db);
269$invoicerectmp = new FactureRec($db);
270$tmpuser = new User($db);
271
272$now = dol_now();
273
274$help_url = '';
275$title = $langs->trans("RepeatableInvoices");
276$morejs = array();
277$morecss = array();
278
279$tmparray = dol_getdate($now);
280$today = dol_mktime(23, 59, 59, $tmparray['mon'], $tmparray['mday'], $tmparray['year']); // Today is last second of current day
281
282// Build and execute select
283// --------------------------------------------------------------------
284
285$sql = "SELECT s.nom as name, s.rowid as socid, f.rowid as facid, f.titre as title, f.total_ht, f.total_tva, f.total_ttc, f.frequency, f.unit_frequency,";
286$sql .= " f.nb_gen_done, f.nb_gen_max, f.date_last_gen, f.date_when, f.suspended,";
287$sql .= " f.datec, f.fk_user_author, f.tms, f.fk_user_modif,";
288$sql .= " f.fk_cond_reglement, f.fk_mode_reglement";
289// Add fields from extrafields
290if (!empty($extrafields->attributes[$object->table_element]['label'])) {
291 foreach ($extrafields->attributes[$object->table_element]['label'] as $key => $val) {
292 $sql .= ($extrafields->attributes[$object->table_element]['type'][$key] != 'separate' ? ", ef.".$key." as options_".$key : '');
293 }
294}
295// Add fields from hooks
296$parameters = array();
297$reshook = $hookmanager->executeHooks('printFieldListSelect', $parameters, $object); // Note that $action and $object may have been modified by hook
298$sql .= $hookmanager->resPrint;
299$sql = preg_replace('/,\s*$/', '', $sql);
300
301$sqlfields = $sql; // $sql fields to remove for count total
302
303$sql .= " FROM ".MAIN_DB_PREFIX."societe as s, ".MAIN_DB_PREFIX."facture_rec as f";
304$sql .= " LEFT JOIN ".MAIN_DB_PREFIX."facture_rec_extrafields as ef ON ef.fk_object = f.rowid";
305if (!$user->hasRight('societe', 'client', 'voir')) {
306 $sql .= ", ".MAIN_DB_PREFIX."societe_commerciaux as sc";
307}
308// Add table from hooks
309$parameters = array();
310$reshook = $hookmanager->executeHooks('printFieldListFrom', $parameters, $object); // Note that $action and $object may have been modified by hook
311$sql .= $hookmanager->resPrint;
312
313$sql .= " WHERE f.fk_soc = s.rowid";
314$sql .= ' AND f.entity IN ('.getEntity('invoice').')';
315if (!$user->hasRight("societe", "client", "voir") && !$socid) {
316 $sql .= " AND s.rowid = sc.fk_soc AND sc.fk_user = ".((int) $user->id);
317}
318if ($search_ref) {
319 $sql .= natural_search('f.titre', $search_ref);
320}
321if ($socid) {
322 $sql .= ' AND s.rowid = '.(int) $socid;
323}
324if ($search_societe) {
325 $sql .= natural_search('s.nom', $search_societe);
326}
327if ($search_montant_ht != '') {
328 $sql .= natural_search('f.total_ht', $search_montant_ht, 1);
329}
330if ($search_montant_vat != '') {
331 $sql .= natural_search('f.total_tva', $search_montant_vat, 1);
332}
333if ($search_montant_ttc != '') {
334 $sql .= natural_search('f.total_ttc', $search_montant_ttc, 1);
335}
336if (!empty($search_payment_mode) && $search_payment_mode != '-1') {
337 $sql .= natural_search('f.fk_mode_reglement', $search_payment_mode, 1);
338}
339if (!empty($search_payment_term) && $search_payment_term != '-1') {
340 $sql .= natural_search('f.fk_cond_reglement', $search_payment_term, 1);
341}
342if ($search_recurring == '1') {
343 $sql .= ' AND f.frequency > 0';
344}
345if ($search_recurring == '0') {
346 $sql .= ' AND (f.frequency IS NULL or f.frequency = 0)';
347}
348if ($search_frequency != '') {
349 $sql .= natural_search('f.frequency', $search_frequency, 1);
350}
351if ($search_unit_frequency != '') {
352 $sql .= ' AND f.frequency > 0';
353 $sql .= natural_search('f.unit_frequency', $search_unit_frequency);
354}
355if ($search_nb_gen_done != '') {
356 $sql .= natural_search("f.nb_gen_done", $search_nb_gen_done, 1);
357}
358if ($search_status != '' && $search_status >= -1) {
359 if ($search_status == 0) {
360 $sql .= ' AND frequency = 0 AND suspended = 0';
361 }
362 if ($search_status == 1) {
363 $sql .= ' AND frequency != 0 AND suspended = 0';
364 }
365 if ($search_status == -1) {
366 $sql .= ' AND suspended = 1';
367 }
368}
369if ($search_date_start) {
370 $sql .= " AND f.date_last_gen >= '".$db->idate($search_date_start)."'";
371}
372if ($search_date_end) {
373 $sql .= " AND f.date_last_gen <= '".$db->idate($search_date_end)."'";
374}
375if ($search_date_when_start) {
376 $sql .= " AND f.date_when >= '".$db->idate($search_date_when_start)."'";
377}
378if ($search_date_when_end) {
379 $sql .= " AND f.date_when <= '".$db->idate($search_date_when_end)."'";
380}
381// Add where from extra fields
382include DOL_DOCUMENT_ROOT.'/core/tpl/extrafields_list_search_sql.tpl.php';
383
384// Count total nb of records
385$nbtotalofrecords = '';
386if (!getDolGlobalInt('MAIN_DISABLE_FULL_SCANLIST')) {
387 /* The fast and low memory method to get and count full list converts the sql into a sql count */
388 $sqlforcount = preg_replace('/^'.preg_quote($sqlfields, '/').'/', 'SELECT COUNT(*) as nbtotalofrecords', $sql);
389 $sqlforcount = preg_replace('/GROUP BY .*$/', '', $sqlforcount);
390 $resql = $db->query($sqlforcount);
391 if ($resql) {
392 $objforcount = $db->fetch_object($resql);
393 $nbtotalofrecords = $objforcount->nbtotalofrecords;
394 } else {
395 dol_print_error($db);
396 }
397
398 if (($page * $limit) > $nbtotalofrecords) { // if total resultset is smaller then paging size (filtering), goto and load page 0
399 $page = 0;
400 $offset = 0;
401 }
402 $db->free($resql);
403}
404
405$tmpsortfield = $sortfield;
406if ($tmpsortfield == 'recurring') {
407 $tmpsortfield = 'f.frequency';
408}
409
410// Complete request and execute it with limit
411$sql .= $db->order($tmpsortfield, $sortorder);
412if ($limit) {
413 $sql .= $db->plimit($limit + 1, $offset);
414}
415
416$resql = $db->query($sql);
417if (!$resql) {
418 dol_print_error($db);
419 exit;
420}
421
422$num = $db->num_rows($resql);
423
424
425// Output page
426// --------------------------------------------------------------------
427
428llxHeader('', $title, $help_url, '', 0, 0, $morejs, $morecss, '', 'bodyforlist');
429
430$arrayofselected = is_array($toselect) ? $toselect : array();
431
432$param = '';
433if (!empty($mode)) {
434 $param .= '&mode='.urlencode($mode);
435}
436if (!empty($contextpage) && $contextpage != $_SERVER["PHP_SELF"]) {
437 $param .= '&contextpage='.urlencode($contextpage);
438}
439if ($limit > 0 && $limit != $conf->liste_limit) {
440 $param .= '&limit='.((int) $limit);
441}
442if ($socid > 0) {
443 $param .= '&socid='.urlencode((string) ($socid));
444}
445if ($search_date_startday) {
446 $param .= '&search_date_startday='.urlencode((string) ($search_date_startday));
447}
448if ($search_date_startmonth) {
449 $param .= '&search_date_startmonth='.urlencode((string) ($search_date_startmonth));
450}
451if ($search_date_startyear) {
452 $param .= '&search_date_startyear='.urlencode((string) ($search_date_startyear));
453}
454if ($search_date_endday) {
455 $param .= '&search_date_endday='.urlencode((string) ($search_date_endday));
456}
457if ($search_date_endmonth) {
458 $param .= '&search_date_endmonth='.urlencode((string) ($search_date_endmonth));
459}
460if ($search_date_endyear) {
461 $param .= '&search_date_endyear='.urlencode((string) ($search_date_endyear));
462}
463if ($search_date_when_startday) {
464 $param .= '&search_date_when_startday='.urlencode((string) ($search_date_when_startday));
465}
466if ($search_date_when_startmonth) {
467 $param .= '&search_date_when_startmonth='.urlencode((string) ($search_date_when_startmonth));
468}
469if ($search_date_when_startyear) {
470 $param .= '&search_date_when_startyear='.urlencode((string) ($search_date_when_startyear));
471}
472if ($search_date_when_endday) {
473 $param .= '&search_date_when_endday='.urlencode((string) ($search_date_when_endday));
474}
475if ($search_date_when_endmonth) {
476 $param .= '&search_date_when_endmonth='.urlencode((string) ($search_date_when_endmonth));
477}
478if ($search_date_when_endyear) {
479 $param .= '&search_date_when_endyear='.urlencode((string) ($search_date_when_endyear));
480}
481if ($search_ref) {
482 $param .= '&search_ref='.urlencode($search_ref);
483}
484if ($search_societe) {
485 $param .= '&search_societe='.urlencode($search_societe);
486}
487if ($search_montant_ht != '') {
488 $param .= '&search_montant_ht='.urlencode($search_montant_ht);
489}
490if ($search_montant_vat != '') {
491 $param .= '&search_montant_vat='.urlencode($search_montant_vat);
492}
493if ($search_montant_ttc != '') {
494 $param .= '&search_montant_ttc='.urlencode($search_montant_ttc);
495}
496if ($search_payment_mode != '') {
497 $param .= '&search_payment_mode='.urlencode($search_payment_mode);
498}
499if ($search_payment_term != '') {
500 $param .= '&search_payment_term='.urlencode($search_payment_term);
501}
502if ($search_recurring != '' && $search_recurring != '-1') {
503 $param .= '&search_recurring='.urlencode($search_recurring);
504}
505if ($search_frequency > 0) {
506 $param .= '&search_frequency='.urlencode($search_frequency);
507}
508if ($search_unit_frequency != '') {
509 $param .= '&search_unit_frequency='.urlencode($search_unit_frequency);
510}
511if ($search_nb_gen_done != '') {
512 $param .= '&search_nb_gen_done='.urlencode($search_nb_gen_done);
513}
514if ($search_status != '') {
515 $param .= '&search_status='.urlencode($search_status);
516}
517if ($optioncss != '') {
518 $param .= '&optioncss='.urlencode($optioncss);
519}
520// Add $param from extra fields
521include DOL_DOCUMENT_ROOT.'/core/tpl/extrafields_list_search_param.tpl.php';
522// Add $param from hooks
523$parameters = array('param' => &$param);
524$reshook = $hookmanager->executeHooks('printFieldListSearchParam', $parameters, $object); // Note that $action and $object may have been modified by hook
525$param .= $hookmanager->resPrint;
526
527// List of mass actions available
528$arrayofmassactions = array(
529 //'validate'=>img_picto('', 'check', 'class="pictofixedwidth"').$langs->trans("Validate"),
530 //'generate_doc'=>img_picto('', 'pdf', 'class="pictofixedwidth"').$langs->trans("ReGeneratePDF"),
531 //'builddoc'=>img_picto('', 'pdf', 'class="pictofixedwidth"').$langs->trans("PDFMerge"),
532 //'presend'=>img_picto('', 'email', 'class="pictofixedwidth"').$langs->trans("SendByMail"),
533);
534
535$massactionbutton = $form->selectMassAction('', $massaction == 'presend' ? array() : array('presend' => $langs->trans("SendByMail"), 'builddoc' => $langs->trans("PDFMerge")));
536
537$varpage = empty($contextpage) ? $_SERVER["PHP_SELF"] : $contextpage;
538$htmlofselectarray = $form->multiSelectArrayWithCheckbox('selectedfields', $arrayfields, $varpage, getDolGlobalString('MAIN_CHECKBOX_LEFT_COLUMN')); // This also change content of $arrayfields with user setup
539$selectedfields = ($mode != 'kanban' ? $htmlofselectarray : '');
540//$selectedfields.=$form->showCheckAddButtons('checkforselect', 1);
541
542print '<form method="POST" id="searchFormList" action="'.$_SERVER["PHP_SELF"].'">'."\n";
543if ($optioncss != '') {
544 print '<input type="hidden" name="optioncss" value="'.$optioncss.'">';
545}
546print '<input type="hidden" name="token" value="'.newToken().'">';
547print '<input type="hidden" name="formfilteraction" id="formfilteraction" value="list">';
548print '<input type="hidden" name="action" value="list">';
549print '<input type="hidden" name="sortfield" value="'.$sortfield.'">';
550print '<input type="hidden" name="sortorder" value="'.$sortorder.'">';
551print '<input type="hidden" name="page" value="'.$page.'">';
552print '<input type="hidden" name="contextpage" value="'.$contextpage.'">';
553print '<input type="hidden" name="page_y" value="">';
554print '<input type="hidden" name="mode" value="'.$mode.'">';
555
556
557print_barre_liste($title, $page, $_SERVER["PHP_SELF"], $param, $sortfield, $sortorder, $massactionbutton, $num, $nbtotalofrecords, 'bill', 0, '', '', $limit, 0, 0, 1);
558
559print '<span class="opacitymedium">'.$langs->trans("ToCreateAPredefinedInvoice", $langs->transnoentitiesnoconv("ChangeIntoRepeatableInvoice")).'</span><br><br>';
560
561$i = 0;
562
563$moreforfilter = '';
564
565$parameters = array();
566$reshook = $hookmanager->executeHooks('printFieldPreListTitle', $parameters, $object, $action); // Note that $action and $object may have been modified by hook
567if (empty($reshook)) {
568 $moreforfilter .= $hookmanager->resPrint;
569} else {
570 $moreforfilter = $hookmanager->resPrint;
571}
572
573if (!empty($moreforfilter)) {
574 print '<div class="liste_titre liste_titre_bydiv centpercent">';
575 print $moreforfilter;
576 print '</div>';
577}
578
579$varpage = empty($contextpage) ? $_SERVER["PHP_SELF"] : $contextpage;
580$selectedfields = $form->multiSelectArrayWithCheckbox('selectedfields', $arrayfields, $varpage, getDolGlobalString('MAIN_CHECKBOX_LEFT_COLUMN')); // This also change content of $arrayfields
581$selectedfields .= (count($arrayofmassactions) ? $form->showCheckAddButtons('checkforselect', 1) : '');
582
583print '<div class="div-table-responsive">'; // You can use div-table-responsive-no-min if you don't need reserved height for your table
584print '<table class="tagtable nobottomiftotal liste'.($moreforfilter ? " listwithfilterbefore" : "").'">'."\n";
585
586
587// Fields title search
588// --------------------------------------------------------------------
589print '<tr class="liste_titre_filter">';
590// Action column
591if (getDolGlobalString('MAIN_CHECKBOX_LEFT_COLUMN')) {
592 print '<td class="liste_titre maxwidthsearch center">';
593 $searchpicto = $form->showFilterButtons('left');
594 print $searchpicto;
595 print '</td>';
596}
597// Ref
598if (!empty($arrayfields['f.titre']['checked'])) {
599 print '<td class="liste_titre left">';
600 print '<input class="flat maxwidth100" type="text" name="search_ref" value="'.dol_escape_htmltag($search_ref).'">';
601 print '</td>';
602}
603// Thirdparty
604if (!empty($arrayfields['s.nom']['checked'])) {
605 print '<td class="liste_titre left"><input class="flat" type="text" size="8" name="search_societe" value="'.dol_escape_htmltag($search_societe).'"></td>';
606}
607if (!empty($arrayfields['f.total_ht']['checked'])) {
608 // Amount net
609 print '<td class="liste_titre right">';
610 print '<input class="flat width50" type="text"" name="search_montant_ht" value="'.dol_escape_htmltag($search_montant_ht).'">';
611 print '</td>';
612}
613if (!empty($arrayfields['f.total_tva']['checked'])) {
614 // Amount Vat
615 print '<td class="liste_titre right">';
616 print '<input class="flat width50" type="text" name="search_montant_vat" value="'.dol_escape_htmltag($search_montant_vat).'">';
617 print '</td>';
618}
619if (!empty($arrayfields['f.total_ttc']['checked'])) {
620 // Amount
621 print '<td class="liste_titre right">';
622 print '<input class="flat width50" type="text" name="search_montant_ttc" value="'.dol_escape_htmltag($search_montant_ttc).'">';
623 print '</td>';
624}
625if (!empty($arrayfields['f.fk_cond_reglement']['checked'])) {
626 // Payment term
627 print '<td class="liste_titre">';
628 print $form->getSelectConditionsPaiements($search_payment_term, 'search_payment_term', -1, 1, 1, 'maxwidth100');
629 print "</td>";
630}
631if (!empty($arrayfields['f.fk_mode_reglement']['checked'])) {
632 // Payment mode
633 print '<td class="liste_titre">';
634 print $form->select_types_paiements($search_payment_mode, 'search_payment_mode', '', 0, 1, 1, 0, 1, 'maxwidth100', 1);
635 print '</td>';
636}
637if (!empty($arrayfields['recurring']['checked'])) {
638 // Recurring or not
639 print '<td class="liste_titre center">';
640 print $form->selectyesno('search_recurring', $search_recurring, 1, false, 1);
641 print '</td>';
642}
643if (!empty($arrayfields['f.frequency']['checked'])) {
644 // Recurring or not
645 print '<td class="liste_titre center">';
646 print '<input class="flat" type="text" size="1" name="search_frequency" value="'.dol_escape_htmltag($search_frequency).'">';
647 print '</td>';
648}
649if (!empty($arrayfields['f.unit_frequency']['checked'])) {
650 // Frequency unit
651 print '<td class="liste_titre center">';
652 print '<input class="flat" type="text" size="1" name="search_unit_frequency" value="'.dol_escape_htmltag($search_unit_frequency).'">';
653 print '</td>';
654}
655if (!empty($arrayfields['f.nb_gen_done']['checked'])) {
656 // Nb generation
657 print '<td class="liste_titre" align="center">';
658 print '<input class="flat" type="text" size="1" name="search_nb_gen_done" value="'.dol_escape_htmltag($search_nb_gen_done).'">';
659 print '</td>';
660}
661// Date invoice
662if (!empty($arrayfields['f.date_last_gen']['checked'])) {
663 print '<td class="liste_titre center">';
664 print '<div class="nowrapfordate">';
665 print $form->selectDate($search_date_start ? $search_date_start : -1, 'search_date_start', 0, 0, 1, '', 1, 0, 0, '', '', '', '', 1, '', $langs->trans('From'));
666 print '</div>';
667 print '<div class="nowrapfordate">';
668 print $form->selectDate($search_date_end ? $search_date_end : -1, 'search_date_end', 0, 0, 1, '', 1, 0, 0, '', '', '', '', 1, '', $langs->trans('to'));
669 print '</div>';
670 print '</td>';
671}
672// Date next generation
673if (!empty($arrayfields['f.date_when']['checked'])) {
674 print '<td class="liste_titre center">';
675 print '<div class="nowrapfordate">';
676 print $form->selectDate($search_date_when_start ? $search_date_when_start : -1, 'search_date_when_start', 0, 0, 1, '', 1, 0, 0, '', '', '', '', 1, '', $langs->trans('From'));
677 print '</div>';
678 print '<div class="nowrapfordate">';
679 print $form->selectDate($search_date_when_end ? $search_date_when_end : -1, 'search_date_when_end', 0, 0, 1, '', 1, 0, 0, '', '', '', '', 1, '', $langs->trans('to'));
680 print '</div>';
681 print '</td>';
682}
683// Extra fields
684include DOL_DOCUMENT_ROOT.'/core/tpl/extrafields_list_search_input.tpl.php';
685
686// Fields from hook
687$parameters = array('arrayfields' => $arrayfields);
688$reshook = $hookmanager->executeHooks('printFieldListOption', $parameters, $object); // Note that $action and $object may have been modified by hook
689print $hookmanager->resPrint;
690// User creation
691if (!empty($arrayfields['f.fk_user_author']['checked'])) {
692 print '<td class="liste_titre">';
693 print '</td>';
694}
695// User modification
696if (!empty($arrayfields['f.fk_user_modif']['checked'])) {
697 print '<td class="liste_titre">';
698 print '</td>';
699}
700// Date creation
701if (!empty($arrayfields['f.datec']['checked'])) {
702 print '<td class="liste_titre">';
703 print '</td>';
704}
705// Date modification
706if (!empty($arrayfields['f.tms']['checked'])) {
707 print '<td class="liste_titre">';
708 print '</td>';
709}
710// Status
711if (!empty($arrayfields['status']['checked'])) {
712 print '<td class="liste_titre center minwidth75imp parentonrightofpage">';
713 $liststatus = array(
714 0 => $langs->trans("Draft"),
715 1 => $langs->trans("Active"),
716 -1 => $langs->trans("Disabled"),
717 );
718 // @phan-suppress-next-line PhanPluginSuspiciousParamOrder
719 print $form->selectarray('search_status', $liststatus, $search_status, -2, 0, 0, '', 0, 0, 0, '', 'width100 onrightofpage');
720 print '</td>';
721}
722// Action column
723if (!getDolGlobalString('MAIN_CHECKBOX_LEFT_COLUMN')) {
724 print '<td class="liste_titre maxwidthsearch center">';
725 $searchpicto = $form->showFilterButtons();
726 print $searchpicto;
727 print '</td>';
728}
729print '</tr>'."\n";
730
731$totalarray = array();
732$totalarray['nbfield'] = 0;
733
734// Fields title label
735// --------------------------------------------------------------------
736print '<tr class="liste_titre">';
737// Action column
738if (getDolGlobalString('MAIN_CHECKBOX_LEFT_COLUMN')) {
739 print getTitleFieldOfList(($mode != 'kanban' ? $selectedfields : ''), 0, $_SERVER["PHP_SELF"], '', '', '', '', $sortfield, $sortorder, 'center maxwidthsearch ')."\n";
740 $totalarray['nbfield']++;
741}
742if (!empty($arrayfields['f.titre']['checked'])) {
743 print_liste_field_titre($arrayfields['f.titre']['label'], $_SERVER['PHP_SELF'], "f.titre", "", $param, "", $sortfield, $sortorder);
744 $totalarray['nbfield']++;
745}
746if (!empty($arrayfields['s.nom']['checked'])) {
747 print_liste_field_titre($arrayfields['s.nom']['label'], $_SERVER['PHP_SELF'], "s.nom", "", $param, "", $sortfield, $sortorder);
748 $totalarray['nbfield']++;
749}
750if (!empty($arrayfields['f.total_ht']['checked'])) {
751 print_liste_field_titre($arrayfields['f.total_ht']['label'], $_SERVER['PHP_SELF'], "f.total_ht", "", $param, '', $sortfield, $sortorder, 'right ');
752 $totalarray['nbfield']++;
753}
754if (!empty($arrayfields['f.total_tva']['checked'])) {
755 print_liste_field_titre($arrayfields['f.total_tva']['label'], $_SERVER['PHP_SELF'], "f.total_tva", "", $param, '', $sortfield, $sortorder, 'right ');
756 $totalarray['nbfield']++;
757}
758if (!empty($arrayfields['f.total_ttc']['checked'])) {
759 print_liste_field_titre($arrayfields['f.total_ttc']['label'], $_SERVER['PHP_SELF'], "f.total_ttc", "", $param, '', $sortfield, $sortorder, 'right ');
760 $totalarray['nbfield']++;
761}
762if (!empty($arrayfields['f.fk_cond_reglement']['checked'])) {
763 print_liste_field_titre($arrayfields['f.fk_cond_reglement']['label'], $_SERVER['PHP_SELF'], "f.fk_cond_reglement", "", $param, '', $sortfield, $sortorder);
764 $totalarray['nbfield']++;
765}
766if (!empty($arrayfields['f.fk_mode_reglement']['checked'])) {
767 print_liste_field_titre($arrayfields['f.fk_mode_reglement']['label'], $_SERVER['PHP_SELF'], "f.fk_mode_reglement", "", $param, '', $sortfield, $sortorder);
768 $totalarray['nbfield']++;
769}
770if (!empty($arrayfields['recurring']['checked'])) {
771 print_liste_field_titre($arrayfields['recurring']['label'], $_SERVER['PHP_SELF'], "recurring", "", $param, '', $sortfield, $sortorder, 'center ');
772 $totalarray['nbfield']++;
773}
774if (!empty($arrayfields['f.frequency']['checked'])) {
775 print_liste_field_titre($arrayfields['f.frequency']['label'], $_SERVER['PHP_SELF'], "f.frequency", "", $param, '', $sortfield, $sortorder, 'center ');
776 $totalarray['nbfield']++;
777}
778if (!empty($arrayfields['f.unit_frequency']['checked'])) {
779 print_liste_field_titre($arrayfields['f.unit_frequency']['label'], $_SERVER['PHP_SELF'], "f.unit_frequency", "", $param, '', $sortfield, $sortorder, 'center ');
780 $totalarray['nbfield']++;
781}
782if (!empty($arrayfields['f.nb_gen_done']['checked'])) {
783 print_liste_field_titre($arrayfields['f.nb_gen_done']['label'], $_SERVER['PHP_SELF'], "f.nb_gen_done", "", $param, '', $sortfield, $sortorder, 'center ');
784 $totalarray['nbfield']++;
785}
786if (!empty($arrayfields['f.date_last_gen']['checked'])) {
787 print_liste_field_titre($arrayfields['f.date_last_gen']['label'], $_SERVER['PHP_SELF'], "f.date_last_gen", "", $param, '', $sortfield, $sortorder, 'center ');
788 $totalarray['nbfield']++;
789}
790if (!empty($arrayfields['f.date_when']['checked'])) {
791 print_liste_field_titre($arrayfields['f.date_when']['label'], $_SERVER['PHP_SELF'], "f.date_when", "", $param, '', $sortfield, $sortorder, 'center ');
792 $totalarray['nbfield']++;
793}
794if (!empty($arrayfields['f.fk_user_author']['checked'])) {
795 print_liste_field_titre($arrayfields['f.fk_user_author']['label'], $_SERVER['PHP_SELF'], "f.fk_user_author", "", $param, '', $sortfield, $sortorder, 'center ');
796 $totalarray['nbfield']++;
797}
798if (!empty($arrayfields['f.fk_user_modif']['checked'])) {
799 print_liste_field_titre($arrayfields['f.fk_user_modif']['label'], $_SERVER['PHP_SELF'], "f.fk_user_modif", "", $param, '', $sortfield, $sortorder, 'center ');
800 $totalarray['nbfield']++;
801}
802if (!empty($arrayfields['f.datec']['checked'])) {
803 print_liste_field_titre($arrayfields['f.datec']['label'], $_SERVER['PHP_SELF'], "f.datec", "", $param, '', $sortfield, $sortorder, 'center ');
804 $totalarray['nbfield']++;
805}
806if (!empty($arrayfields['f.tms']['checked'])) {
807 print_liste_field_titre($arrayfields['f.tms']['label'], $_SERVER['PHP_SELF'], "f.tms", "", $param, '', $sortfield, $sortorder, 'center ');
808 $totalarray['nbfield']++;
809}
810// Extra fields
811include DOL_DOCUMENT_ROOT.'/core/tpl/extrafields_list_search_title.tpl.php';
812if (!empty($arrayfields['status']['checked'])) {
813 print_liste_field_titre($arrayfields['status']['label'], $_SERVER['PHP_SELF'], "f.suspended,f.frequency", "", $param, '', $sortfield, $sortorder, 'center ');
814 $totalarray['nbfield']++;
815}
816// Action column
817if (!getDolGlobalString('MAIN_CHECKBOX_LEFT_COLUMN')) {
818 print getTitleFieldOfList(($mode != 'kanban' ? $selectedfields : ''), 0, $_SERVER["PHP_SELF"], '', '', '', '', $sortfield, $sortorder, 'center maxwidthsearch ')."\n";
819 $totalarray['nbfield']++;
820}
821print '</tr>'."\n";
822
823$i = 0;
824$savnbfield = $totalarray['nbfield'];
825$totalarray = array();
826$totalarray['nbfield'] = 0;
827$totalarray['val']['f.total_ht'] = 0;
828$totalarray['val']['f.total_tva'] = 0;
829$totalarray['val']['f.total_ttc'] = 0;
830$imaxinloop = ($limit ? min($num, $limit) : $num);
831while ($i < $imaxinloop) {
832 $objp = $db->fetch_object($resql);
833 if (empty($objp)) {
834 break;
835 }
836
837 $companystatic->id = $objp->socid;
838 $companystatic->name = $objp->name;
839
840 $invoicerectmp->id = !empty($objp->id) ? $objp->id : $objp->facid;
841 $invoicerectmp->frequency = $objp->frequency;
842 $invoicerectmp->suspended = $objp->suspended;
843 $invoicerectmp->unit_frequency = $objp->unit_frequency;
844 $invoicerectmp->nb_gen_max = $objp->nb_gen_max;
845 $invoicerectmp->nb_gen_done = $objp->nb_gen_done;
846 $invoicerectmp->ref = $objp->title;
847 $invoicerectmp->total_ht = $objp->total_ht;
848 $invoicerectmp->total_tva = $objp->total_tva;
849 $invoicerectmp->total_ttc = $objp->total_ttc;
850
851 // Show here line of result
852 $j = 0;
853 print '<tr data-rowid="'.$object->id.'" class="oddeven">';
854 // Action column
855 if (getDolGlobalString('MAIN_CHECKBOX_LEFT_COLUMN')) {
856 print '<td class="center tdoverflowmax125">';
857 if ($user->hasRight('facture', 'creer') && empty($invoicerectmp->suspended)) {
858 if ($invoicerectmp->isMaxNbGenReached()) {
859 print $langs->trans("MaxNumberOfGenerationReached");
860 } elseif (empty($objp->frequency) || $db->jdate($objp->date_when) <= $today) {
861 print '<a href="'.DOL_URL_ROOT.'/compta/facture/card.php?action=create&amp;socid='.$objp->socid.'&amp;fac_rec='.$objp->facid.'">';
862 print img_picto($langs->trans("CreateBill"), 'add', 'class="none"');
863 print '</a>';
864 } else {
865 print $form->textwithpicto('', $langs->trans("DateIsNotEnough"));
866 }
867 }
868 print '</td>';
869 if (!$i) {
870 $totalarray['nbfield']++;
871 }
872 }
873 if (!empty($arrayfields['f.titre']['checked'])) {
874 print '<td class="nowrap tdoverflowmax200">';
875 print $invoicerectmp->getNomUrl(1);
876 print "</td>\n";
877 if (!$i) {
878 $totalarray['nbfield']++;
879 }
880 }
881 if (!empty($arrayfields['s.nom']['checked'])) {
882 print '<td class="tdoverflowmax150">'.$companystatic->getNomUrl(1, 'customer').'</td>';
883 if (!$i) {
884 $totalarray['nbfield']++;
885 }
886 }
887 if (!empty($arrayfields['f.total_ht']['checked'])) {
888 print '<td class="nowrap right amount">'.price($objp->total_ht).'</td>'."\n";
889 if (!$i) {
890 $totalarray['nbfield']++;
891 }
892 if (!$i) {
893 $totalarray['pos'][$totalarray['nbfield']] = 'f.total_ht';
894 }
895 $totalarray['val']['f.total_ht'] += $objp->total_ht;
896 }
897 if (!empty($arrayfields['f.total_tva']['checked'])) {
898 print '<td class="nowrap right amount">'.price($objp->total_tva).'</td>'."\n";
899 if (!$i) {
900 $totalarray['nbfield']++;
901 }
902 if (!$i) {
903 $totalarray['pos'][$totalarray['nbfield']] = 'f.total_tva';
904 }
905 $totalarray['val']['f.total_tva'] += $objp->total_tva;
906 }
907 if (!empty($arrayfields['f.total_ttc']['checked'])) {
908 print '<td class="nowrap right amount">'.price($objp->total_ttc).'</td>'."\n";
909 if (!$i) {
910 $totalarray['nbfield']++;
911 }
912 if (!$i) {
913 $totalarray['pos'][$totalarray['nbfield']] = 'f.total_ttc';
914 }
915 $totalarray['val']['f.total_ttc'] += $objp->total_ttc;
916 }
917 // Payment term
918 if (!empty($arrayfields['f.fk_cond_reglement']['checked'])) {
919 print '<td class="tdoverflowmax150">';
920 $form->form_conditions_reglement('', $objp->fk_cond_reglement, 'none');
921 print '</td>'."\n";
922 if (!$i) {
923 $totalarray['nbfield']++;
924 }
925 }
926 // Payment mode
927 if (!empty($arrayfields['f.fk_mode_reglement']['checked'])) {
928 print '<td class="tdoverflowmax150">';
929 $form->form_modes_reglement('', $objp->fk_mode_reglement, 'none');
930 print '</td>'."\n";
931 if (!$i) {
932 $totalarray['nbfield']++;
933 }
934 }
935 // Is it a recurring invoice
936 if (!empty($arrayfields['recurring']['checked'])) {
937 print '<td class="center">'.($objp->frequency ? img_picto($langs->trans("Frequency").': '.$objp->frequency.' '.$objp->unit_frequency, 'recurring', 'class="opacitymedium"').' ' : '').yn($objp->frequency ? 1 : 0).'</td>';
938 if (!$i) {
939 $totalarray['nbfield']++;
940 }
941 }
942 if (!empty($arrayfields['f.frequency']['checked'])) {
943 print '<td class="center">';
944 print($objp->frequency > 0 ? $objp->frequency : '');
945 print '</td>';
946 if (!$i) {
947 $totalarray['nbfield']++;
948 }
949 }
950 if (!empty($arrayfields['f.unit_frequency']['checked'])) {
951 print '<td class="center">';
952 if ($objp->frequency > 1) {
953 $dur = array("i" => $langs->trans("Minutes"), "h" => $langs->trans("Hours"), "d" => $langs->trans("Days"), "w" => $langs->trans("Weeks"), "m" => $langs->trans("Months"), "y" => $langs->trans("Years"));
954 } else {
955 $dur = array("i" => $langs->trans("Minute"), "h" => $langs->trans("Hour"), "d" => $langs->trans("Day"), "w" => $langs->trans("Week"), "m" => $langs->trans("Month"), "y" => $langs->trans("Year"));
956 }
957 print($objp->frequency > 0 ? $dur[$objp->unit_frequency] : '');
958 print '</td>';
959 if (!$i) {
960 $totalarray['nbfield']++;
961 }
962 }
963 if (!empty($arrayfields['f.nb_gen_done']['checked'])) {
964 print '<td class="center">';
965 print($objp->frequency > 0 ? $objp->nb_gen_done.($objp->nb_gen_max > 0 ? ' / '.$objp->nb_gen_max : '') : '<span class="opacitymedium">'.$langs->trans('NA').'</span>');
966 print '</td>';
967 if (!$i) {
968 $totalarray['nbfield']++;
969 }
970 }
971 // Date last generation
972 if (!empty($arrayfields['f.date_last_gen']['checked'])) {
973 print '<td class="center">';
974 print($objp->frequency > 0 ? dol_print_date($db->jdate($objp->date_last_gen), 'day') : '<span class="opacitymedium">'.$langs->trans('NA').'</span>');
975 print '</td>';
976 if (!$i) {
977 $totalarray['nbfield']++;
978 }
979 }
980 // Date next generation
981 if (!empty($arrayfields['f.date_when']['checked'])) {
982 print '<td class="center">';
983 print '<div class="nowraponall">';
984 print($objp->frequency ? ($invoicerectmp->isMaxNbGenReached() ? '<strike>' : '').dol_print_date($db->jdate($objp->date_when), 'day').($invoicerectmp->isMaxNbGenReached() ? '</strike>' : '') : '<span class="opacitymedium">'.$langs->trans('NA').'</span>');
985 if (!$invoicerectmp->isMaxNbGenReached()) {
986 if (!$objp->suspended && $objp->frequency > 0 && $db->jdate($objp->date_when) && $db->jdate($objp->date_when) < $now) {
987 print img_warning($langs->trans("Late"));
988 }
989 } else {
990 print img_info($langs->trans("MaxNumberOfGenerationReached"));
991 }
992 print '</div>';
993 print '</td>';
994 if (!$i) {
995 $totalarray['nbfield']++;
996 }
997 }
998 if (!empty($arrayfields['f.fk_user_author']['checked'])) {
999 print '<td class="center tdoverflowmax150">';
1000 if ($objp->fk_user_author > 0) {
1001 $tmpuser->fetch($objp->fk_user_author);
1002 print $tmpuser->getNomUrl(1);
1003 }
1004 print '</td>';
1005 if (!$i) {
1006 $totalarray['nbfield']++;
1007 }
1008 }
1009 if (!empty($arrayfields['f.fk_user_modif']['checked'])) {
1010 print '<td class="center tdoverflowmax150">';
1011 if ($objp->fk_user_author > 0) {
1012 $tmpuser->fetch($objp->fk_user_author);
1013 print $tmpuser->getNomUrl(1);
1014 }
1015 print '</td>';
1016 if (!$i) {
1017 $totalarray['nbfield']++;
1018 }
1019 }
1020 if (!empty($arrayfields['f.datec']['checked'])) {
1021 print '<td class="center nowraponall">';
1022 print dol_print_date($db->jdate($objp->datec), 'dayhour');
1023 print '</td>';
1024 if (!$i) {
1025 $totalarray['nbfield']++;
1026 }
1027 }
1028 if (!empty($arrayfields['f.tms']['checked'])) {
1029 print '<td class="center nowraponall">';
1030 print dol_print_date($db->jdate($objp->tms), 'dayhour');
1031 print '</td>';
1032 if (!$i) {
1033 $totalarray['nbfield']++;
1034 }
1035 }
1036
1037 $obj = $objp;
1038 // Extra fields
1039 include DOL_DOCUMENT_ROOT.'/core/tpl/extrafields_list_print_fields.tpl.php';
1040 // Fields from hook
1041 $parameters = array('arrayfields' => $arrayfields, 'object' => $object, 'obj' => $obj, 'i' => $i, 'totalarray' => &$totalarray);
1042 $reshook = $hookmanager->executeHooks('printFieldListValue', $parameters, $object); // Note that $action and $object may have been modified by hook
1043 print $hookmanager->resPrint;
1044 // Status
1045 if (!empty($arrayfields['status']['checked'])) {
1046 print '<td class="center">';
1047 print $invoicerectmp->getLibStatut(5, 0);
1048 print '</td>';
1049 if (!$i) {
1050 $totalarray['nbfield']++;
1051 }
1052 }
1053 // Action column
1054 if (!getDolGlobalString('MAIN_CHECKBOX_LEFT_COLUMN')) {
1055 print '<td class="nowrap center tdoverflowmax125">';
1056 if ($user->hasRight('facture', 'creer') && empty($invoicerectmp->suspended)) {
1057 if ($invoicerectmp->isMaxNbGenReached()) {
1058 print $langs->trans("MaxNumberOfGenerationReached");
1059 } elseif (empty($objp->frequency) || $db->jdate($objp->date_when) <= $today) {
1060 print '<a href="'.DOL_URL_ROOT.'/compta/facture/card.php?action=create&amp;socid='.$objp->socid.'&amp;fac_rec='.$objp->facid.'">';
1061 print img_picto($langs->trans("CreateBill"), 'add', 'class="paddingrightonly"');
1062 //print $langs->trans("CreateBill");
1063 print '</a>';
1064 } else {
1065 print $form->textwithpicto('', $langs->trans("DateIsNotEnough"));
1066 }
1067 }
1068 print '</td>';
1069 if (!$i) {
1070 $totalarray['nbfield']++;
1071 }
1072 }
1073
1074 print '</tr>'."\n";
1075
1076 $i++;
1077}
1078
1079// Show total line
1080include DOL_DOCUMENT_ROOT.'/core/tpl/list_print_total.tpl.php';
1081
1082// If no record found
1083if ($num == 0) {
1084 $colspan = 1;
1085 foreach ($arrayfields as $key => $val) {
1086 if (!empty($val['checked'])) {
1087 $colspan++;
1088 }
1089 }
1090 print '<tr><td colspan="'.$colspan.'"><span class="opacitymedium">'.$langs->trans("NoRecordFound").'</span></td></tr>';
1091}
1092
1093$db->free($resql);
1094
1095
1096$parameters = array('arrayfields' => $arrayfields, 'sql' => $sql);
1097$reshook = $hookmanager->executeHooks('printFieldListFooter', $parameters, $object, $action); // Note that $action and $object may have been modified by hook
1098print $hookmanager->resPrint;
1099
1100print '</table>'."\n";
1101print '</div>'."\n";
1102
1103print '</form>'."\n";
1104
1105
1106// End of page
1107llxFooter();
1108$db->close();
if( $user->socid > 0) if(! $user->hasRight('accounting', 'chartofaccount')) $object
Definition card.php:58
if(!defined('NOREQUIRESOC')) if(!defined( 'NOREQUIRETRAN')) if(!defined('NOTOKENRENEWAL')) if(!defined( 'NOREQUIREMENU')) if(!defined('NOREQUIREHTML')) if(!defined( 'NOREQUIREAJAX')) llxHeader()
Empty header.
Definition wrapper.php:55
llxFooter()
Empty footer.
Definition wrapper.php:69
Class to manage standard extra fields.
Class to manage invoice templates.
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 building of HTML components.
Class to manage third parties objects (customers, suppliers, prospects...)
Class to manage Dolibarr users.
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...
img_warning($titlealt='default', $moreatt='', $morecss='pictowarning')
Show warning logo.
img_picto($titlealt, $picto, $moreatt='', $pictoisfullpath=0, $srconly=0, $notitle=0, $alt='', $morecss='', $marginleftonlyshort=2)
Show picto whatever it's its name (generic function)
GETPOSTINT($paramname, $method=0)
Return the value of a $_GET or $_POST supervariable, converted into integer.
yn($yesno, $case=1, $color=0)
Return yes or no in current language.
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...
dol_now($mode='auto')
Return date for now.
getDolGlobalInt($key, $default=0)
Return a Dolibarr global constant int value.
dol_print_date($time, $format='', $tzoutput='auto', $outputlangs=null, $encodetooutput=false)
Output date in a string format according to outputlangs (or langs if not defined).
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...
print_liste_field_titre($name, $file="", $field="", $begin="", $moreparam="", $moreattrib="", $sortfield="", $sortorder="", $prefix="", $tooltip="", $forcenowrapcolumntitle=0)
Show title line of an array.
getTitleFieldOfList($name, $thead=0, $file="", $field="", $begin="", $moreparam="", $moreattrib="", $sortfield="", $sortorder="", $prefix="", $disablesortlink=0, $tooltip='', $forcenowrapcolumntitle=0)
Get 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, $hideselectlimit=0, $hidenavigation=0, $pagenavastextinput=0, $morehtmlrightbeforearrow='')
Print a title with navigation controls for pagination.
GETPOST($paramname, $check='alphanohtml', $method=0, $filter=null, $options=null, $noreplace=0)
Return value of a param into GET or POST supervariable.
setEventMessages($mesg, $mesgs, $style='mesgs', $messagekey='', $noduplicate=0)
Set event messages in dol_events session object.
dol_print_error($db=null, $error='', $errors=null)
Displays error message system with all the information to facilitate the diagnosis and the escalation...
getDolGlobalString($key, $default='')
Return dolibarr global constant string value.
dol_getdate($timestamp, $fast=false, $forcetimezone='')
Return an array with locale date info.
img_info($titlealt='default')
Show info logo.
restrictedArea(User $user, $features, $object=0, $tableandshare='', $feature2='', $dbt_keyfield='fk_soc', $dbt_select='rowid', $isdraft=0, $mode=0)
Check permissions of a user to show a page and an object.