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