dolibarr 23.0.3
payments.php
Go to the documentation of this file.
1<?php
2/* Copyright (C) 2011-2022 Alexandre Spangaro <aspangaro@open-dsi.fr>
3 * Copyright (C) 2015-2016 Laurent Destailleur <eldy@users.sourceforge.net>
4 * Copyright (C) 2015 Jean-François Ferry <jfefe@aternatik.fr>
5 * Copyright (C) 2021 Gauthier VERDOL <gauthier.verdol@atm-consulting.fr>
6 * Copyright (C) 2024-2025 Frédéric France <frederic.france@free.fr>
7 *
8 * This program is free software; you can redistribute it and/or modify
9 * it under the terms of the GNU General Public License as published by
10 * the Free Software Foundation; either version 3 of the License, or
11 * (at your option) any later version.
12 *
13 * This program is distributed in the hope that it will be useful,
14 * but WITHOUT ANY WARRANTY; without even the implied warranty of
15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 * GNU General Public License for more details.
17 *
18 * You should have received a copy of the GNU General Public License
19 * along with this program. If not, see <https://www.gnu.org/licenses/>.
20 */
21
28// Load Dolibarr environment
29require '../main.inc.php';
30require_once DOL_DOCUMENT_ROOT.'/salaries/class/salary.class.php';
31require_once DOL_DOCUMENT_ROOT.'/salaries/class/paymentsalary.class.php';
32require_once DOL_DOCUMENT_ROOT.'/compta/bank/class/account.class.php';
33if (isModEnabled('accounting')) {
34 require_once DOL_DOCUMENT_ROOT.'/accountancy/class/accountingjournal.class.php';
35}
36
45// Load translation files required by the page
46$langs->loadLangs(array("compta", "salaries", "bills", "hrm"));
47
48$action = GETPOST('action', 'aZ09') ? GETPOST('action', 'aZ09') : 'view'; // The action 'add', 'create', 'edit', 'update', 'view', ...
49$massaction = GETPOST('massaction', 'alpha'); // The bulk action (combo box choice into lists)
50$show_files = GETPOSTINT('show_files'); // Show files area generated by bulk actions ?
51$confirm = GETPOST('confirm', 'alpha'); // Result of a confirmation
52$cancel = GETPOST('cancel', 'alpha'); // We click on a Cancel button
53$toselect = GETPOST('toselect', 'array:int'); // Array of ids of elements selected into a list
54$contextpage = GETPOST('contextpage', 'aZ') ? GETPOST('contextpage', 'aZ') : 'bomlist'; // To manage different context of search
55$backtopage = GETPOST('backtopage', 'alpha'); // Go back to a dedicated page
56$optioncss = GETPOST('optioncss', 'aZ'); // Option for the css output (always '' except when 'print')
57$mode = GETPOST('mode', 'alpha'); // mode view for result
58
59
60// Load variable for pagination
61$limit = GETPOSTINT('limit') ? GETPOSTINT('limit') : $conf->liste_limit;
62$sortfield = GETPOST('sortfield', 'aZ09comma');
63$sortorder = GETPOST('sortorder', 'aZ09comma');
64$page = GETPOSTISSET('pageplusone') ? (GETPOSTINT('pageplusone') - 1) : GETPOSTINT("page");
65if (empty($page) || $page == -1 || GETPOST('button_search', 'alpha') || GETPOST('button_removefilter', 'alpha') || (empty($toselect) && $massaction === '0')) {
66 $page = 0;
67} // If $page is not defined, or '' or -1 or if we click on clear filters or if we select empty mass action
68$offset = $limit * $page;
69$pageprev = $page - 1;
70$pagenext = $page + 1;
71if (!$sortfield) {
72 $sortfield = "s.datep,s.rowid";
73}
74if (!$sortorder) {
75 $sortorder = "DESC,DESC";
76}
77
78// Initialize a technical objects
79$object = new PaymentSalary($db);
80$extrafields = new ExtraFields($db);
81$diroutputmassaction = $conf->user->dir_output.'/temp/massgeneration/'.$user->id;
82$hookmanager->initHooks(array('salarieslist')); // Note that conf->hooks_modules contains array
83
84// Fetch optionals attributes and labels
85$extrafields->fetch_name_optionals_label($object->table_element);
86
87$search_array_options = $extrafields->getOptionalsFromPost($object->table_element, '', 'search_');
88
89if (!$sortfield) {
90 $sortfield = "s.datep,s.rowid";
91}
92if (!$sortorder) {
93 $sortorder = "DESC,DESC";
94}
95
96$search_ref = GETPOST('search_ref', 'alpha');
97$search_ref_salary = GETPOST('search_ref_salary', 'alpha');
98$search_user = GETPOST('search_user', 'alpha');
99$search_label = GETPOST('search_label', 'alpha');
100$search_date_start = dol_mktime(0, 0, 0, GETPOSTINT('search_date_startmonth'), GETPOSTINT('search_date_startday'), GETPOSTINT('search_date_startyear'));
101$search_date_end = dol_mktime(23, 59, 59, GETPOSTINT('search_date_endmonth'), GETPOSTINT('search_date_endday'), GETPOSTINT('search_date_endyear'));
102$search_dateep_start = dol_mktime(0, 0, 0, GETPOSTINT('search_dateep_startmonth'), GETPOSTINT('search_dateep_startday'), GETPOSTINT('search_dateep_startyear'));
103$search_dateep_end = dol_mktime(23, 59, 59, GETPOSTINT('search_dateep_endmonth'), GETPOSTINT('search_dateep_endday'), GETPOSTINT('search_dateep_endyear'));
104$search_amount = GETPOST('search_amount', 'alpha');
105$search_account = GETPOST('search_account', 'alpha');
106$search_fk_bank = GETPOST('search_fk_bank', 'alpha');
107$search_chq_number = GETPOST('search_chq_number', 'alpha');
108
109$search_type_id = GETPOST('search_type_id', 'int');
110if (!$search_type_id) { // fallback on filtre (deprecated)
111 $filtre = GETPOST("filtre", 'restricthtml');
112 $newfiltre = str_replace('filtre=', '', $filtre);
113 $filterarray = explode('-', $newfiltre);
114 foreach ($filterarray as $val) {
115 $part = explode(':', $val);
116 if ($part[0] == 's.fk_typepayment') {
117 $search_type_id = (int) $part[1];
118 }
119 }
120}
121
122$childids = $user->getAllChildIds(1);
123
124// Initialize array of search criteria
125$search_all = GETPOST("search_all", 'alpha');
126$search = array();
127foreach ($object->fields as $key => $val) {
128 if (GETPOST('search_'.$key, 'alpha') !== '') {
129 $search[$key] = GETPOST('search_'.$key, 'alpha');
130 }
131}
132
133// List of fields to search into when doing a "search in all"
134$fieldstosearchall = array();
135foreach ($object->fields as $key => $val) {
136 if (!empty($val['searchall'])) {
137 $fieldstosearchall['t.'.$key] = $val['label'];
138 }
139}
140
141// Definition of array of fields for columns
142$arrayfields = array();
143foreach ($object->fields as $key => $val) {
144 // If $val['visible']==0, then we never show the field
145 if (!empty($val['visible'])) {
146 $visible = (int) dol_eval((string) $val['visible'], 1, 1, '1');
147 $arrayfields['t.'.$key] = array(
148 'label' => $val['label'],
149 'checked' => (($visible < 0) ? 0 : 1),
150 'enabled' => (abs($visible) != 3 && (bool) dol_eval((string) $val['enabled'], 1)),
151 'position' => $val['position'],
152 'help' => isset($val['help']) ? $val['help'] : ''
153 );
154 }
155}
156
157$permissiontoread = $user->hasRight('salaries', 'read');
158$permissiontoadd = $user->hasRight('salaries', 'write');
159$permissiontodelete = $user->hasRight('salaries', 'delete');
160
161// Security check
162$socid = GETPOSTINT("socid");
163if ($user->socid > 0) {
164 $socid = $user->socid;
165}
166restrictedArea($user, 'salaries', 0, 'salary', '');
167
168
169/*
170 * Actions
171 */
172$error = 0;
173
174if (GETPOST('cancel', 'alpha')) {
175 $action = 'list';
176 $massaction = '';
177}
178if (!GETPOST('confirmmassaction', 'alpha') && $massaction != 'presend' && $massaction != 'confirm_presend') {
179 $massaction = '';
180}
181
182$parameters = array();
183$reshook = $hookmanager->executeHooks('doActions', $parameters, $object, $action); // Note that $action and $object may have been modified by some hooks
184if ($reshook < 0) {
185 setEventMessages($hookmanager->error, $hookmanager->errors, 'errors');
186}
187
188if (empty($reshook)) {
189 // Selection of new fields
190 include DOL_DOCUMENT_ROOT.'/core/actions_changeselectedfields.inc.php';
191
192 // Purge search criteria
193 if (GETPOST('button_removefilter_x', 'alpha') || GETPOST('button_removefilter.x', 'alpha') || GETPOST('button_removefilter', 'alpha')) { // All test are required to be compatible with all browsers
194 $search_ref = "";
195 $search_ref_salary = "";
196 $search_user = "";
197 $search_label = "";
198 $search_date_start = '';
199 $search_date_end = '';
200 $search_dateep_start = '';
201 $search_dateep_end = '';
202 $search_amount = "";
203 $search_account = '';
204 $search_fk_bank = '';
205 $search_chq_number = '';
206 $search_type_id = "";
207 }
208 if (GETPOST('button_removefilter_x', 'alpha') || GETPOST('button_removefilter.x', 'alpha') || GETPOST('button_removefilter', 'alpha')
209 || GETPOST('button_search_x', 'alpha') || GETPOST('button_search.x', 'alpha') || GETPOST('button_search', 'alpha')) {
210 $massaction = ''; // Protection to avoid mass action if we force a new search during a mass action confirmation
211 }
212
213 // Mass actions
214 $objectclass = 'PaymentSalary';
215 $objectlabel = 'SalariesPayments';
216 $uploaddir = $conf->salaries->dir_output;
217
218 global $error;
219 include DOL_DOCUMENT_ROOT.'/core/actions_massactions.inc.php';
220
221 // Validate records
222 if (!$error && $massaction == 'buildsepa' && $permissiontoadd) {
223 $objecttmp = new $objectclass($db);
224
225 // TODO
226 }
227}
228
229/*
230 * View
231 */
232
233$form = new Form($db);
234$salstatic = new Salary($db);
235$paymentsalstatic = new PaymentSalary($db);
236$userstatic = new User($db);
237$accountstatic = new Account($db);
238$accountlinestatic = new AccountLine($db);
239
240$now = dol_now();
241
242//$help_url="EN:Module_BillOfMaterials|FR:Module_BillOfMaterials_FR|ES:Módulo_BillOfMaterials";
243$help_url = '';
244$title = $langs->trans('SalariesPayments');
245
246$sql = "SELECT u.rowid as uid, u.lastname, u.firstname, u.login, u.email, u.admin, u.photo, u.gender, u.salary as current_salary, u.fk_soc as fk_soc, u.statut as status,";
247$sql .= " s.rowid, s.fk_user, s.amount, s.salary, sal.rowid as id_salary, sal.label, s.datep as datep, sal.dateep, b.datev as datev, s.fk_typepayment as type, s.num_payment, s.fk_bank,";
248$sql .= " ba.rowid as bid, ba.ref as bref, ba.number as bnumber, ba.account_number, ba.fk_accountancy_journal, ba.label as blabel, ba.iban_prefix as iban, ba.bic, ba.currency_code, ba.clos,";
249$sql .= " pst.code as payment_code";
250$sql .= " FROM ".MAIN_DB_PREFIX."payment_salary as s";
251$sql .= " INNER JOIN ".MAIN_DB_PREFIX."salary as sal ON (sal.rowid = s.fk_salary)";
252$sql .= " LEFT JOIN ".MAIN_DB_PREFIX."c_paiement as pst ON s.fk_typepayment = pst.id";
253$sql .= " LEFT JOIN ".MAIN_DB_PREFIX."bank as b ON s.fk_bank = b.rowid";
254$sql .= " LEFT JOIN ".MAIN_DB_PREFIX."bank_account as ba ON b.fk_account = ba.rowid,";
255$sql .= " ".MAIN_DB_PREFIX."user as u";
256$sql .= " WHERE u.rowid = sal.fk_user";
257$sql .= " AND s.entity IN (".getEntity('payment_salaries').")";
258if (!$user->hasRight('salaries', 'readchild')) {
259 $sql .= " AND s.fk_user = ".(int) $user->id;
260}
261if (!$user->hasRight('salaries', 'readall')) {
262 $sql .= " AND s.fk_user IN (".$db->sanitize(implode(',', $childids)).")";
263}
264
265// Search criteria
266if ($search_ref) {
267 $sql .= " AND s.rowid=".((int) $search_ref);
268}
269if ($search_ref_salary) {
270 $sql .= " AND sal.rowid=".((int) $search_ref_salary);
271}
272if ($search_user) {
273 $sql .= natural_search(array('u.login', 'u.lastname', 'u.firstname', 'u.email'), $search_user);
274}
275if ($search_label) {
276 $sql .= natural_search(array('sal.label'), $search_label);
277}
278if ($search_date_start) {
279 $sql .= " AND s.datep >= '".$db->idate($search_date_start)."'";
280}
281if ($search_date_end) {
282 $sql .= " AND s.datep <= '".$db->idate($search_date_end)."'";
283}
284if ($search_dateep_start) {
285 $sql .= " AND sal.dateep >= '".$db->idate($search_dateep_start)."'";
286}
287if ($search_dateep_end) {
288 $sql .= " AND sal.dateep <= '".$db->idate($search_dateep_end)."'";
289}
290if ($search_amount) {
291 $sql .= natural_search("s.amount", $search_amount, 1);
292}
293if ($search_account > 0) {
294 $sql .= " AND b.fk_account=".((int) $search_account);
295}
296if ($search_fk_bank) {
297 $sql .= " AND s.fk_bank=".((int) $search_fk_bank);
298}
299if ($search_chq_number) {
300 $sql .= natural_search(array('s.num_payment'), $search_chq_number);
301}
302
303if ($search_type_id > 0) {
304 $sql .= " AND s.fk_typepayment=".((int) $search_type_id);
305}
306$sql .= $db->order($sortfield, $sortorder);
307
308// Count total nb of records
309$nbtotalofrecords = '';
310if (!getDolGlobalInt('MAIN_DISABLE_FULL_SCANLIST')) {
311 $resql = $db->query($sql);
312 if ($resql) {
313 $nbtotalofrecords = $db->num_rows($resql);
314 } else {
315 dol_print_error($db);
316 }
317
318 if (($page * $limit) > (int) $nbtotalofrecords) { // if total of record found is smaller than page * limit, goto and load page 0
319 $page = 0;
320 $offset = 0;
321 }
322}
323// if total of record found is smaller than limit, no need to do paging and to restart another select with limits set.
324if (is_numeric($nbtotalofrecords) && ($limit > $nbtotalofrecords || empty($limit))) {
325 $num = $nbtotalofrecords;
326} else {
327 if ($limit) {
328 $sql .= $db->plimit($limit + 1, $offset);
329 }
330
331 $resql = $db->query($sql);
332 if (!$resql) {
333 dol_print_error($db);
334 exit;
335 }
336
337 $num = $db->num_rows($resql);
338}
339
340// Output page
341// --------------------------------------------------------------------
342
343llxHeader('', $title, $help_url, '', 0, 0, '', '', '', 'bodyforlist');
344
345$arrayofselected = is_array($toselect) ? $toselect : array();
346
347$param = '';
348if (!empty($mode)) {
349 $param .= '&mode='.urlencode($mode);
350}
351if (!empty($contextpage) && $contextpage != $_SERVER["PHP_SELF"]) {
352 $param .= '&contextpage='.urlencode($contextpage);
353}
354if ($limit > 0 && $limit != $conf->liste_limit) {
355 $param .= '&limit='.((int) $limit);
356}
357if ($search_type_id) {
358 $param .= '&search_type_id='.urlencode($search_type_id);
359}
360if ($optioncss != '') {
361 $param .= '&optioncss='.urlencode($optioncss);
362}
363if ($search_ref) {
364 $param .= '&search_ref='.urlencode($search_ref);
365}
366if ($search_ref_salary) {
367 $param .= '&search_ref_salary='.urlencode($search_ref_salary);
368}
369if ($search_user) {
370 $param .= '&search_user='.urlencode($search_user);
371}
372if ($search_label) {
373 $param .= '&search_label='.urlencode($search_label);
374}
375if ($search_fk_bank) {
376 $param .= '&search_fk_bank='.urlencode((string) ($search_fk_bank));
377}
378if ($search_chq_number) {
379 $param .= '&search_chq_number='.urlencode((string) ($search_chq_number));
380}
381if ($search_account) {
382 $param .= '&search_account='.urlencode((string) ($search_account));
383}
384if ($search_date_start) {
385 $param .= '&search_date_startday='.GETPOSTINT('search_date_startday').'&search_date_startmonth='.GETPOSTINT('search_date_startmonth').'&search_date_startyear='.GETPOSTINT('search_date_startyear');
386}
387if ($search_dateep_start) {
388 $param .= '&search_dateep_startday='.GETPOSTINT('search_dateep_startday').'&search_dateep_startmonth='.GETPOSTINT('search_dateep_startmonth').'&search_dateep_startyear='.GETPOSTINT('search_dateep_startyear');
389}
390if ($search_date_end) {
391 $param .= '&search_date_endday='.GETPOSTINT('search_date_endday').'&search_date_endmonth='.GETPOSTINT('search_date_endmonth').'&search_date_endyear='.GETPOSTINT('search_date_endyear');
392}
393if ($search_dateep_end) {
394 $param .= '&search_dateep_endday='.urlencode((string) (GETPOSTINT('search_dateep_endday'))).'&search_dateep_endmonth='.urlencode((string) (GETPOSTINT('search_dateep_endmonth'))).'&search_dateep_endyear='.urlencode((string) (GETPOSTINT('search_dateep_endyear')));
395}
396// Add $param from extra fields
397include DOL_DOCUMENT_ROOT.'/core/tpl/extrafields_list_search_param.tpl.php';
398
399// List of mass actions available
400$arrayofmassactions = array(
401 //'presend'=>$langs->trans("SendByMail"),
402 //'buildsepa'=>$langs->trans("BuildSepa"), // TODO
403);
404//if ($permissiontodelete) $arrayofmassactions['predelete'] = '<span class="fa fa-trash paddingrightonly"></span>'.$langs->trans("Delete");
405if (GETPOSTINT('nomassaction') || in_array($massaction, array('presend', 'predelete'))) {
406 $arrayofmassactions = array();
407}
408$massactionbutton = $form->selectMassAction('', $arrayofmassactions);
409
410print '<form method="POST" id="searchFormList" action="'.dolBuildUrl($_SERVER["PHP_SELF"]).'">';
411if ($optioncss != '') {
412 print '<input type="hidden" name="optioncss" value="'.$optioncss.'">';
413}
414print '<input type="hidden" name="token" value="'.newToken().'">';
415print '<input type="hidden" name="formfilteraction" id="formfilteraction" value="list">';
416print '<input type="hidden" name="action" value="list">';
417print '<input type="hidden" name="sortfield" value="'.$sortfield.'">';
418print '<input type="hidden" name="sortorder" value="'.$sortorder.'">';
419print '<input type="hidden" name="contextpage" value="'.$contextpage.'">';
420print '<input type="hidden" name="mode" value="'.$mode.'">';
421
422
423$url = DOL_URL_ROOT.'/salaries/card.php?action=create';
424if (!empty($socid)) {
425 $url .= '&socid='.$socid;
426}
427$newcardbutton = '';
428$newcardbutton .= dolGetButtonTitle($langs->trans('ViewList'), '', 'fa fa-bars imgforviewmode', $_SERVER["PHP_SELF"].'?mode=common'.preg_replace('/(&|\?)*mode=[^&]+/', '', $param), '', ((empty($mode) || $mode == 'common') ? 2 : 1), array('morecss' => 'reposition'));
429$newcardbutton .= dolGetButtonTitle($langs->trans('ViewKanban'), '', 'fa fa-th-list imgforviewmode', $_SERVER["PHP_SELF"].'?mode=kanban'.preg_replace('/(&|\?)*mode=[^&]+/', '', $param), '', ($mode == 'kanban' ? 2 : 1), array('morecss' => 'reposition'));
430$newcardbutton .= dolGetButtonTitleSeparator();
431$newcardbutton = dolGetButtonTitle($langs->trans('NewSalaryPayment'), '', 'fa fa-plus-circle', $url, '', $user->hasRight('salaries', 'write'));
432
433print_barre_liste($title, $page, $_SERVER["PHP_SELF"], $param, $sortfield, $sortorder, $massactionbutton, $num, $nbtotalofrecords, 'object_payment', 0, $newcardbutton, '', $limit, 0, 0, 1);
434
435$moreforfilter = '';
436
437$varpage = empty($contextpage) ? $_SERVER["PHP_SELF"] : $contextpage;
438//$selectedfields = $form->multiSelectArrayWithCheckbox('selectedfields', $arrayfields, $varpage); // This also change content of $arrayfields
439$selectedfields = '';
440$selectedfields .= (count($arrayofmassactions) ? $form->showCheckAddButtons('checkforselect', 1) : '');
441
442print '<div class="div-table-responsive">';
443print '<table class="tagtable nobottomiftotal liste'.($moreforfilter ? " listwithfilterbefore" : "").'">'."\n";
444
445// Fields title search
446// --------------------------------------------------------------------
447print '<tr class="liste_titre_filter">';
448// Action column
449if (getDolGlobalString('MAIN_CHECKBOX_LEFT_COLUMN')) {
450 print '<td class="liste_titre maxwidthsearch">';
451 $searchpicto = $form->showFilterButtons();
452 print $searchpicto;
453 print '</td>';
454}
455// Ref
456print '<td class="liste_titre left">';
457print '<input class="flat" type="text" size="3" name="search_ref" value="'.$db->escape($search_ref).'">';
458print '</td>';
459// Salary
460print '<td class="liste_titre center">';
461print '<input class="flat" type="text" size="3" name="search_ref_salary" value="'.$db->escape($search_ref_salary).'">';
462print '</td>';
463// Label
464print '<td class="liste_titre"><input type="text" class="flat width150" name="search_label" value="'.$db->escape($search_label).'"></td>';
465// Date end period
466print '<td class="liste_titre center">';
467print '<div class="nowrapfordate">';
468print $form->selectDate($search_dateep_start ? $search_dateep_start : -1, 'search_dateep_start', 0, 0, 1, '', 1, 0, 0, '', '', '', '', 1, '', $langs->trans('From'));
469print '</div>';
470print '<div class="nowrapfordate">';
471print $form->selectDate($search_dateep_end ? $search_dateep_end : -1, 'search_dateep_end', 0, 0, 1, '', 1, 0, 0, '', '', '', '', 1, '', $langs->trans('to'));
472print '</div>';
473print '</td>';
474// Date payment
475print '<td class="liste_titre center">';
476print '<div class="nowrapfordate">';
477print $form->selectDate($search_date_start ? $search_date_start : -1, 'search_date_start', 0, 0, 1, '', 1, 0, 0, '', '', '', '', 1, '', $langs->trans('From'));
478print '</div>';
479print '<div class="nowrapfordate">';
480print $form->selectDate($search_date_end ? $search_date_end : -1, 'search_date_end', 0, 0, 1, '', 1, 0, 0, '', '', '', '', 1, '', $langs->trans('to'));
481print '</div>';
482print '</td>';
483// Date value
484/*print '<td class="liste_titre center">';
485print '</td>';*/
486// Employee
487print '<td class="liste_titre">';
488print '<input class="flat" type="text" size="6" name="search_user" value="'.$db->escape($search_user).'">';
489print '</td>';
490// Type
491print '<td class="liste_titre">';
492print $form->select_types_paiements($search_type_id, 'search_type_id', '', 0, 1, 1, 16, 1, 'maxwidth150', 1);
493print '</td>';
494// Chq number
495print '<td class="liste_titre"><input name="search_chq_number" class="flat width50" type="text" value="'.$db->escape($search_chq_number).'"></td>';
496
497if (isModEnabled("bank")) {
498 // Bank transaction
499 print '<td class="liste_titre">';
500 print '<input class="flat width50" type="text" name="search_fk_bank" value="'.$db->escape($search_fk_bank).'">';
501 print '</td>';
502
503 // Account
504 print '<td class="liste_titre">';
505 $form->select_comptes($search_account, 'search_account', 0, '', 1);
506 print '</td>';
507}
508// Amount
509print '<td class="liste_titre right"><input name="search_amount" class="flat" type="text" size="8" value="'.$db->escape($search_amount).'"></td>';
510
511// Extra fields
512include DOL_DOCUMENT_ROOT.'/core/tpl/extrafields_list_search_input.tpl.php';
513
514// Fields from hook
515$parameters = array('arrayfields' => $arrayfields);
516$reshook = $hookmanager->executeHooks('printFieldListOption', $parameters, $object); // Note that $action and $object may have been modified by hook
517print $hookmanager->resPrint;
518// Action column
519if (!getDolGlobalString('MAIN_CHECKBOX_LEFT_COLUMN')) {
520 print '<td class="liste_titre maxwidthsearch">';
521 $searchpicto = $form->showFilterButtons();
522 print $searchpicto;
523 print '</td>';
524}
525print '</tr>'."\n";
526
527$totalarray = array();
528$totalarray['nbfield'] = 0;
529
530// Fields title label
531// --------------------------------------------------------------------
532print '<tr class="liste_titre">';
533// Action column
534if (getDolGlobalString('MAIN_CHECKBOX_LEFT_COLUMN')) {
535 print getTitleFieldOfList($selectedfields, 0, $_SERVER["PHP_SELF"], '', '', '', '', $sortfield, $sortorder, 'center maxwidthsearch ')."\n";
536 $totalarray['nbfield']++;
537}
538print_liste_field_titre("RefPayment", $_SERVER["PHP_SELF"], "s.rowid", "", $param, "", $sortfield, $sortorder);
539$totalarray['nbfield']++;
540print_liste_field_titre("Salary", $_SERVER["PHP_SELF"], "sal.rowid", "", $param, '', $sortfield, $sortorder);
541$totalarray['nbfield']++;
542print_liste_field_titre("Label", $_SERVER["PHP_SELF"], "s.label", "", $param, '', $sortfield, $sortorder);
543$totalarray['nbfield']++;
544print_liste_field_titre("PeriodEndDate", $_SERVER["PHP_SELF"], "sal.dateep", "", $param, '', $sortfield, $sortorder, 'center ');
545$totalarray['nbfield']++;
546print_liste_field_titre("DatePayment", $_SERVER["PHP_SELF"], "s.datep,s.rowid", "", $param, '', $sortfield, $sortorder, 'center ');
547$totalarray['nbfield']++;
548print_liste_field_titre("Employee", $_SERVER["PHP_SELF"], "u.rowid", "", $param, "", $sortfield, $sortorder);
549$totalarray['nbfield']++;
550print_liste_field_titre("PaymentMode", $_SERVER["PHP_SELF"], "pst.code", "", $param, '', $sortfield, $sortorder);
551$totalarray['nbfield']++;
552print_liste_field_titre("Numero", $_SERVER["PHP_SELF"], "s.num_payment", "", $param, '', $sortfield, $sortorder, '', 'ChequeOrTransferNumber');
553$totalarray['nbfield']++;
554if (isModEnabled("bank")) {
555 print_liste_field_titre("BankTransactionLine", $_SERVER["PHP_SELF"], "s.fk_bank", "", $param, '', $sortfield, $sortorder);
556 $totalarray['nbfield']++;
557 print_liste_field_titre("BankAccount", $_SERVER["PHP_SELF"], "ba.label", "", $param, "", $sortfield, $sortorder);
558 $totalarray['nbfield']++;
559}
560print_liste_field_titre("PayedByThisPayment", $_SERVER["PHP_SELF"], "s.amount", "", $param, 'class="right"', $sortfield, $sortorder);
561$totalarray['nbfield']++;
562// Extra fields
563include DOL_DOCUMENT_ROOT.'/core/tpl/extrafields_list_search_title.tpl.php';
564// Hook fields
565$parameters = array('arrayfields' => $arrayfields, 'param' => $param, 'sortfield' => $sortfield, 'sortorder' => $sortorder);
566$reshook = $hookmanager->executeHooks('printFieldListTitle', $parameters, $object); // Note that $action and $object may have been modified by hook
567print $hookmanager->resPrint;
568// Action column
569if (!getDolGlobalString('MAIN_CHECKBOX_LEFT_COLUMN')) {
570 print getTitleFieldOfList($selectedfields, 0, $_SERVER["PHP_SELF"], '', '', '', '', $sortfield, $sortorder, 'center maxwidthsearch ')."\n";
571 $totalarray['nbfield']++;
572}
573print '</tr>'."\n";
574
575
576// Detect if we need a fetch on each output line
577$needToFetchEachLine = 0;
578if (isset($extrafields->attributes[$object->table_element]['computed']) && is_array($extrafields->attributes[$object->table_element]['computed']) && count($extrafields->attributes[$object->table_element]['computed']) > 0) {
579 foreach ($extrafields->attributes[$object->table_element]['computed'] as $key => $val) {
580 if (!is_null($val) && preg_match('/\$object/', $val)) {
581 $needToFetchEachLine++;
582 }
583 // There is at least one compute field that use $object
584 }
585}
586
587// Loop on record
588// --------------------------------------------------------------------
589$i = 0;
590$savnbfield = $totalarray['nbfield'];
591$totalarray = array();
592$totalarray['nbfield'] = 0;
593$imaxinloop = ($limit ? min($num, $limit) : $num);
594while ($i < $imaxinloop) {
595 $obj = $db->fetch_object($resql);
596 if (empty($obj)) {
597 break;
598 }
599 // Should not happen
600
601 // Store properties in $object
602 $object->setVarsFromFetchObj($obj);
603
604 $userstatic->id = $obj->uid;
605 $userstatic->lastname = $obj->lastname;
606 $userstatic->firstname = $obj->firstname;
607 $userstatic->admin = $obj->admin;
608 $userstatic->login = $obj->login;
609 $userstatic->email = $obj->email;
610 $userstatic->socid = $obj->fk_soc;
611 $userstatic->statut = $obj->status;
612 $userstatic->status = $obj->status;
613 $userstatic->gender = $obj->gender;
614 $userstatic->photo = $obj->photo;
615
616 $salstatic->id = $obj->id_salary;
617 $salstatic->ref = $obj->id_salary;
618
619 $paymentsalstatic->id = $obj->rowid;
620 $paymentsalstatic->ref = (string) $obj->rowid;
621 $paymentsalstatic->amount = $obj->amount;
622 $paymentsalstatic->fk_typepayment = $obj->payment_code;
623 $paymentsalstatic->datec = $obj->dateep;
624 $paymentsalstatic->datep = $obj->datep;
625
626 $accountlinestatic->id = $obj->fk_bank;
627 $accountlinestatic->ref = $obj->fk_bank;
628 $paymentsalstatic->fk_bank = $accountlinestatic->id;
629 $paymentsalstatic->fk_user_author = $userstatic->id;
630
631 if ($mode == 'kanban') {
632 if ($i == 0) {
633 print '<tr class="trkanban"><td colspan="'.$savnbfield.'">';
634 print '<div class="box-flex-container kanban">';
635 }
636 // Output Kanban
637 print $paymentsalstatic->getKanbanView('', array('selected' => in_array($object->id, $arrayofselected)));
638 if ($i == ($imaxinloop - 1)) {
639 print '</div>';
640 print '</td></tr>';
641 }
642 } else {
643 // Show here line of result
644 print '<tr class="oddeven">';
645
646 // Action column
647 if (getDolGlobalString('MAIN_CHECKBOX_LEFT_COLUMN')) {
648 print '<td class="nowrap center">';
649 if ($massactionbutton || $massaction) { // If we are in select mode (massactionbutton defined) or if we have already selected and sent an action ($massaction) defined
650 $selected = 0;
651 if (in_array($object->id, $arrayofselected)) {
652 $selected = 1;
653 }
654 print '<input id="cb'.$object->id.'" class="flat checkforselect" type="checkbox" name="toselect[]" value="'.$object->id.'"'.($selected ? ' checked="checked"' : '').'>';
655 }
656 print '</td>';
657 if (!$i) {
658 $totalarray['nbfield']++;
659 }
660 }
661
662 // Ref
663 print "<td>".$paymentsalstatic->getNomUrl(1)."</td>\n";
664 if (!$i) {
665 $totalarray['nbfield']++;
666 }
667
668 // Ref salary
669 print "<td>".$salstatic->getNomUrl(1)."</td>\n";
670 if (!$i) {
671 $totalarray['nbfield']++;
672 }
673
674 // Label payment
675 print "<td>".dol_trunc($obj->label, 40)."</td>\n";
676 if (!$i) {
677 $totalarray['nbfield']++;
678 }
679
680 // Date end period
681 print '<td class="center">'.dol_print_date($db->jdate($obj->dateep), 'day')."</td>\n";
682 if (!$i) {
683 $totalarray['nbfield']++;
684 }
685
686 // Date payment
687 print '<td class="center">'.dol_print_date($db->jdate($obj->datep), 'day')."</td>\n";
688 if (!$i) {
689 $totalarray['nbfield']++;
690 }
691
692 // Date value
693 /*print '<td class="center">'.dol_print_date($db->jdate($obj->datev), 'day')."</td>\n";
694 if (!$i) $totalarray['nbfield']++;*/
695
696 // Employee
697 print '<td class="tdoverflowmax150">'.$userstatic->getNomUrl(-1)."</td>\n";
698 if (!$i) {
699 $totalarray['nbfield']++;
700 }
701
702 // Type
703 print '<td>';
704 print $langs->trans("PaymentTypeShort".$obj->payment_code);
705 print '</td>';
706 if (!$i) {
707 $totalarray['nbfield']++;
708 }
709
710 // Chq number
711 print '<td>'.$obj->num_payment.'</td>';
712 if (!$i) {
713 $totalarray['nbfield']++;
714 }
715
716 // Account
717 if (isModEnabled("bank")) {
718 // Bank transaction
719 print '<td>';
720 $accountlinestatic->id = $obj->fk_bank;
721 print $accountlinestatic->getNomUrl(1);
722 print '</td>';
723 if (!$i) {
724 $totalarray['nbfield']++;
725 }
726
727 print '<td>';
728 if ($obj->fk_bank > 0) {
729 //$accountstatic->fetch($obj->fk_bank);
730 $accountstatic->id = $obj->bid;
731 $accountstatic->ref = $obj->bref;
732 $accountstatic->number = $obj->bnumber;
733 $accountstatic->iban = $obj->iban;
734 $accountstatic->bic = $obj->bic;
735 $accountstatic->currency_code = $langs->trans("Currency".$obj->currency_code);
736 $accountstatic->clos = $obj->clos;
737
738 if (isModEnabled('accounting')) {
739 $accountstatic->account_number = $obj->account_number;
740
741 $accountingjournal = new AccountingJournal($db);
742 $accountingjournal->fetch($obj->fk_accountancy_journal);
743
744 $accountstatic->accountancy_journal = $accountingjournal->getNomUrl(0, 1, 1, '', 1);
745 }
746 $accountstatic->label = $obj->blabel;
747 if ($accountstatic->id > 0) {
748 print $accountstatic->getNomUrl(1);
749 }
750 } else {
751 print '&nbsp;';
752 }
753 print '</td>';
754 if (!$i) {
755 $totalarray['nbfield']++;
756 }
757 }
758
759 // Amount
760 print '<td class="nowrap right"><span class="amount">'.price($obj->amount).'</span></td>';
761 if (!$i) {
762 $totalarray['nbfield']++;
763 }
764 if (!$i) {
765 $totalarray['pos'][$totalarray['nbfield']] = 'totalttcfield';
766 }
767 if (!$i) {
768 $totalarray['val']['totalttcfield'] = $obj->amount;
769 } else {
770 $totalarray['val']['totalttcfield'] += $obj->amount;
771 }
772
773
774 // Extra fields
775 include DOL_DOCUMENT_ROOT.'/core/tpl/extrafields_list_print_fields.tpl.php';
776 // Fields from hook
777 $parameters = array('arrayfields' => $arrayfields, 'object' => $object, 'obj' => $obj, 'i' => $i, 'totalarray' => &$totalarray);
778 $reshook = $hookmanager->executeHooks('printFieldListValue', $parameters, $object); // Note that $action and $object may have been modified by hook
779 print $hookmanager->resPrint;
780
781 // Action column
782 if (!getDolGlobalString('MAIN_CHECKBOX_LEFT_COLUMN')) {
783 print '<td class="nowrap center">';
784 if ($massactionbutton || $massaction) { // If we are in select mode (massactionbutton defined) or if we have already selected and sent an action ($massaction) defined
785 $selected = 0;
786 if (in_array($object->id, $arrayofselected)) {
787 $selected = 1;
788 }
789 print '<input id="cb'.$object->id.'" class="flat checkforselect" type="checkbox" name="toselect[]" value="'.$object->id.'"'.($selected ? ' checked="checked"' : '').'>';
790 }
791 print '</td>';
792 if (!$i) {
793 $totalarray['nbfield']++;
794 }
795 }
796
797 print '</tr>'."\n";
798 }
799 $i++;
800}
801
802// Show total line
803include DOL_DOCUMENT_ROOT.'/core/tpl/list_print_total.tpl.php';
804
805
806// If no record found
807if ($num == 0) {
808 /*$colspan = 1;
809 foreach ($arrayfields as $key => $val) {
810 if (!empty($val['checked'])) {
811 $colspan++;
812 }
813 }*/
814 $colspan = 12;
815 print '<tr><td colspan="'.$colspan.'"><span class="opacitymedium">'.$langs->trans("NoRecordFound").'</span></td></tr>';
816}
817
818
819$db->free($resql);
820
821$parameters = array('arrayfields' => $arrayfields, 'sql' => $sql);
822$reshook = $hookmanager->executeHooks('printFieldListFooter', $parameters, $object); // Note that $action and $object may have been modified by hook
823print $hookmanager->resPrint;
824
825print '</table>'."\n";
826print '</div>'."\n";
827
828print '</form>'."\n";
829
830// End of page
831llxFooter();
832$db->close();
if(! $sortfield) if(! $sortorder) $object
Definition account.php:100
$totalarray
Definition export.php:1216
llxFooter($comment='', $zone='private', $disabledoutputofmessages=0)
Empty footer.
Definition wrapper.php:91
if(!defined('NOREQUIRESOC')) if(!defined( 'NOREQUIRETRAN')) if(!defined('NOTOKENRENEWAL')) if(!defined( 'NOREQUIREMENU')) if(!defined('NOREQUIREHTML')) if(!defined( 'NOREQUIREAJAX')) llxHeader($head='', $title='', $help_url='', $target='', $disablejs=0, $disablehead=0, $arrayofjs='', $arrayofcss='', $morequerystring='', $morecssonbody='', $replacemainareaby='', $disablenofollow=0, $disablenoindex=0)
Empty header.
Definition wrapper.php:73
Class to manage bank accounts.
Class to manage bank transaction lines.
Class to manage accounting journals.
Class to manage standard extra fields.
Class to manage generation of HTML components Only common components must be here.
Class to manage payments of salaries.
Class to manage salary payments.
Class to manage Dolibarr users.
dol_now($mode='gmt')
Return date for now.
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_liste_field_titre($name, $file="", $field="", $begin="", $param="", $moreattrib="", $sortfield="", $sortorder="", $prefix="", $tooltip="", $forcenowrapcolumntitle=0)
Show title line of an array.
print_barre_liste($title, $page, $file, $options='', $sortfield='', $sortorder='', $morehtmlcenter='', $num=-1, $totalnboflines='', $picto='generic', $pictoisfullpath=0, $morehtmlright='', $morecss='', $limit=-1, $selectlimitsuffix=0, $hidenavigation=0, $pagenavastextinput=0, $morehtmlrightbeforearrow='')
Print a title with navigation controls for pagination.
GETPOSTINT($paramname, $method=0)
Return the value of a $_GET or $_POST supervariable, converted into integer.
dolGetButtonTitle($label, $helpText='', $iconClass='fa fa-file', $url='', $id='', $status=1, $params=array())
Function dolGetButtonTitle : this kind of buttons are used in title in list.
dol_eval($s, $returnvalue=1, $hideerrors=1, $onlysimplestring='1')
Replace eval function to add more security.
natural_search($fields, $value, $mode=0, $nofirstand=0, $sqltoadd='')
Generate natural SQL search string for a criteria (this criteria can be tested on one or several fiel...
getDolGlobalInt($key, $default=0)
Return a Dolibarr global constant int value.
getTitleFieldOfList($name, $thead=0, $file="", $field="", $begin="", $moreparam="", $moreattrib="", $sortfield="", $sortorder="", $prefix="", $disablesortlink=0, $tooltip='', $forcenowrapcolumntitle=0)
Get title line of an array.
dolGetButtonTitleSeparator($moreClass="")
Add space between dolGetButtonTitle.
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.
isModEnabled($module)
Is Dolibarr module enabled.
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.