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