dolibarr 24.0.0-beta
virement_request.php
Go to the documentation of this file.
1<?php
2
3/* Copyright (C) 2005-2015 Laurent Destailleur <eldy@users.sourceforge.net>
4 * Copyright (C) 2015 Charlie BENKE <charlie@patas-monkey.com>
5 * Copyright (C) 2017-2019 Alexandre Spangaro <aspangaro@open-dsi.fr>
6 * Copyright (C) 2021 Gauthier VERDOL <gauthier.verdol@atm-consulting.fr>
7 * Copyright (C) 2024-2025 MDW <mdeweerd@users.noreply.github.com>
8 * Copyright (C) 2024-2025 Frédéric France <frederic.france@free.fr>
9 *
10 * This program is free software; you can redistribute it and/or modify
11 * it under the terms of the GNU General Public License as published by
12 * the Free Software Foundation; either version 3 of the License, or
13 * (at your option) any later version.
14 *
15 * This program is distributed in the hope that it will be useful,
16 * but WITHOUT ANY WARRANTY; without even the implied warranty of
17 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
18 * GNU General Public License for more details.
19 *
20 * You should have received a copy of the GNU General Public License
21 * along with this program. If not, see <https://www.gnu.org/licenses/>.
22 */
23
30// Load Dolibarr environment
31require '../main.inc.php';
32require_once DOL_DOCUMENT_ROOT.'/core/lib/date.lib.php';
33require_once DOL_DOCUMENT_ROOT.'/core/lib/files.lib.php';
34require_once DOL_DOCUMENT_ROOT.'/salaries/class/salary.class.php';
35require_once DOL_DOCUMENT_ROOT.'/salaries/class/paymentsalary.class.php';
36require_once DOL_DOCUMENT_ROOT.'/compta/bank/class/account.class.php';
37require_once DOL_DOCUMENT_ROOT.'/core/lib/salaries.lib.php';
38require_once DOL_DOCUMENT_ROOT.'/core/class/extrafields.class.php';
39require_once DOL_DOCUMENT_ROOT.'/accountancy/class/accountingjournal.class.php';
40require_once DOL_DOCUMENT_ROOT.'/core/class/html.formfile.class.php';
41require_once DOL_DOCUMENT_ROOT.'/compta/prelevement/class/bonprelevement.class.php';
42
43require_once DOL_DOCUMENT_ROOT.'/societe/class/companybankaccount.class.php';
44require_once DOL_DOCUMENT_ROOT.'/fourn/class/fournisseur.class.php';
45require_once DOL_DOCUMENT_ROOT.'/fourn/class/fournisseur.facture.class.php';
46
47require_once DOL_DOCUMENT_ROOT.'/core/lib/invoice.lib.php';
48require_once DOL_DOCUMENT_ROOT.'/core/lib/fourn.lib.php';
49require_once DOL_DOCUMENT_ROOT.'/compta/facture/class/facture.class.php';
50require_once DOL_DOCUMENT_ROOT.'/compta/prelevement/class/bonprelevement.class.php';
51require_once DOL_DOCUMENT_ROOT.'/core/class/discount.class.php';
52require_once DOL_DOCUMENT_ROOT.'/projet/class/project.class.php';
53require_once DOL_DOCUMENT_ROOT.'/societe/class/companybankaccount.class.php';
54require_once DOL_DOCUMENT_ROOT.'/fourn/class/fournisseur.class.php';
55require_once DOL_DOCUMENT_ROOT.'/fourn/class/fournisseur.facture.class.php';
56if (isModEnabled('project')) {
57 require_once DOL_DOCUMENT_ROOT.'/projet/class/project.class.php';
58 require_once DOL_DOCUMENT_ROOT.'/core/class/html.formprojet.class.php';
59}
60
70// Load translation files required by the page
71$langs->loadLangs(array("compta", "bills", "users", "salaries", "hrm", "withdrawals"));
72
73$id = GETPOSTINT('id');
74$ref = GETPOST('ref', 'alpha');
75$action = GETPOST('action', 'aZ09');
76$type = 'salaire';
77
78$label = GETPOST('label', 'alphanohtml');
79$projectid = (GETPOSTINT('projectid') ? GETPOSTINT('projectid') : GETPOSTINT('fk_project'));
80
81// Security check
82$socid = GETPOSTINT('socid');
83if ($user->socid) {
84 $socid = $user->socid;
85}
86
87
88$object = new Salary($db);
89$extrafields = new ExtraFields($db);
90
91$childids = $user->getAllChildIds(1);
92
93// fetch optionals attributes and labels
94$extrafields->fetch_name_optionals_label($object->table_element);
95
96// Initialize a technical object to manage hooks of page. Note that conf->hooks_modules contains an array of hook context
97$hookmanager->initHooks(array('salaryinfo', 'globalcard'));
98
99$object = new Salary($db);
100if ($id > 0) {
101 $object->fetch($id);
102
103 // Check current user can read this salary
104 $canread = 0;
105 if ($user->hasRight('salaries', 'readall')) {
106 $canread = 1;
107 }
108 if ($user->hasRight('salaries', 'read') && $object->fk_user > 0 && in_array($object->fk_user, $childids)) {
109 $canread = 1;
110 }
111 if (!$canread) {
113 }
114}
115
116$permissiontoread = $user->hasRight('salaries', 'read');
117$permissiontoadd = $user->hasRight('salaries', 'write'); // Used by the include of actions_addupdatedelete.inc.php and actions_linkedfiles
118$permissiontodelete = $user->hasRight('salaries', 'delete') || ($permissiontoadd && isset($object->status) && $object->status == $object::STATUS_UNPAID);
119
120$moreparam = '';
121if ($type == 'bank-transfer') {
122 $obj = new FactureFournisseur($db);
123 $moreparam = '&type='.$type;
124} else {
125 $obj = new Facture($db);
126}
127
128// Load object
129if ($id > 0) {
130 $ret = $object->fetch($id);
131 $isdraft = (($obj->status == FactureFournisseur::STATUS_DRAFT) ? 1 : 0);
132 if ($ret > 0) {
133 $object->fetch_thirdparty();
134 }
135}
136
137$hookmanager->initHooks(array('directdebitcard', 'globalcard'));
138
139restrictedArea($user, 'salaries', $object->id, 'salary', '');
140
141
142/*
143 * Actions
144 */
145
146// Link to a project
147if ($action == 'classin' && $user->hasRight('banque', 'modifier')) {
148 $object->fetch($id);
149 $object->setProject($projectid);
150}
151
152// set label
153if ($action == 'setlabel' && $user->hasRight('salaries', 'write')) {
154 $object->fetch($id);
155 $object->label = $label;
156 $object->update($user);
157}
158
159$parameters = array('socid' => $socid);
160$reshook = $hookmanager->executeHooks('doActions', $parameters, $obj, $action); // Note that $action and $object may have been modified by some hooks
161if ($reshook < 0) {
162 setEventMessages($hookmanager->error, $hookmanager->errors, 'errors');
163}
164
165// payment mode
166if ($action == 'setmode' && $permissiontoadd) {
167 $object->fetch($id);
168 $result = $object->setPaymentMethods(GETPOSTINT('mode_reglement_id'));
169 if ($result < 0) {
170 setEventMessages($object->error, $object->errors, 'errors');
171 }
172}
173
174// bank account
175if ($action == 'setbankaccount' && $permissiontoadd) {
176 $object->fetch($id);
177 $result = $object->setBankAccount(GETPOSTINT('fk_account'));
178 if ($result < 0) {
179 setEventMessages($object->error, $object->errors, 'errors');
180 }
181}
182
183if ($action == "add" && $permissiontoadd) {
184 //var_dump($object);exit;
185 if ($object->id > 0) {
186 $db->begin();
187
188 $sourcetype = 'salaire';
189 $newtype = 'salaire';
190
191 $paymentservice = GETPOST('paymentservice'); // value can be 'stripesepa'. not used yet.
192
193 $result = $object->demande_prelevement($user, GETPOSTFLOAT('request_transfer'), $newtype, $sourcetype);
194
195 if ($result > 0) {
196 $db->commit();
197
198 setEventMessages($langs->trans("RecordSaved"), null, 'mesgs');
199 } else {
200 $db->rollback();
201
202 setEventMessages($obj->error, $obj->errors, 'errors');
203 }
204 }
205 $action = '';
206}
207
208if ($action == "delete" && $permissiontodelete) {
209 if ($object->id > 0) {
210 $result = $object->demande_prelevement_delete($user, GETPOSTINT('did'));
211 if ($result == 0) {
212 header("Location: ".$_SERVER['PHP_SELF']."?id=".$object->id);
213 exit;
214 }
215 }
216}
217
218
219/*
220 * View
221 */
222
223$form = new Form($db);
224
225$title = $langs->trans('Salary')." - ".$langs->trans('Info');
226$help_url = "";
227llxHeader("", $title, $help_url);
228
229$object->fetch($id);
230$object->info($id);
231
232$head = salaries_prepare_head($object);
233
234print dol_get_fiche_head($head, 'request_virement', $langs->trans("SalaryPayment"), -1, 'salary');
235
236$linkback = '<a href="'.DOL_URL_ROOT.'/salaries/list.php?restore_lastsearch_values=1'.(!empty($socid) ? '&socid='.$socid : '').'">'.$langs->trans("BackToList").'</a>';
237
238$morehtmlref = '<div class="refidno">';
239
240$userstatic = new User($db);
241$userstatic->fetch($object->fk_user);
242
243
244// Label
245if ($action != 'editlabel') {
246 $morehtmlref .= $form->editfieldkey("Label", 'label', $object->label, $object, $user->hasRight('salaries', 'write'), 'string', '', 0, 1);
247 $morehtmlref .= $object->label;
248} else {
249 $morehtmlref .= $langs->trans('Label').' :&nbsp;';
250 $morehtmlref .= '<form method="post" action="'.$_SERVER['PHP_SELF'].'?id='.$object->id.'">';
251 $morehtmlref .= '<input type="hidden" name="action" value="setlabel">';
252 $morehtmlref .= '<input type="hidden" name="token" value="'.newToken().'">';
253 $morehtmlref .= '<input type="text" name="label" value="'.$object->label.'"/>';
254 $morehtmlref .= '<input type="submit" class="button valignmiddle" value="'.$langs->trans("Modify").'">';
255 $morehtmlref .= '</form>';
256}
257
258$morehtmlref .= '<br>'.$langs->trans('Employee').' : '.$userstatic->getNomUrl(-1);
259
260$usercancreate = $permissiontoadd;
261
262// Project
263if (isModEnabled('project')) {
264 $langs->load("projects");
265 $morehtmlref .= '<br>';
266 if ($usercancreate) {
267 $morehtmlref .= img_picto($langs->trans("Project"), 'project', 'class="pictofixedwidth"');
268 if ($action != 'classify') {
269 $morehtmlref .= '<a class="editfielda" href="'.dolBuildUrl($_SERVER['PHP_SELF'], ['action' => 'classify', 'id' => $object->id], true).'">'.img_edit($langs->transnoentitiesnoconv('SetProject')).'</a> ';
270 }
271 $morehtmlref .= $form->form_project($_SERVER['PHP_SELF'].'?id='.$object->id, $object->socid, (string) $object->fk_project, ($action == 'classify' ? 'projectid' : 'none'), 0, 0, 0, 1, '', 'maxwidth300');
272 } else {
273 if (!empty($object->fk_project)) {
274 $proj = new Project($db);
275 $proj->fetch($object->fk_project);
276 $morehtmlref .= $proj->getNomUrl(1);
277 if ($proj->title) {
278 $morehtmlref .= '<span class="opacitymedium"> - '.dol_escape_htmltag($proj->title).'</span>';
279 }
280 }
281 }
282}
283
284$morehtmlref .= '</div>';
285
286$totalpaid = $object->getSommePaiement();
287
288$object->totalpaid = $totalpaid;
289$object->alreadypaid = $totalpaid; // Same then $totalpaid because there is no amount of credit note or deposits for salary payments.
290
291dol_banner_tab($object, 'id', $linkback, 1, 'rowid', 'ref', $morehtmlref, '', 0, '', '');
292
293print '<div class="fichecenter">';
294print '<div class="fichehalfleft">';
295
296print '<div class="underbanner clearboth"></div>';
297
298
299print '<table class="border centpercent tableforfield">';
300
301if ($action == 'edit') {
302 print '<tr><td class="titlefieldmiddle">'.$langs->trans("DateStartPeriod")."</td><td>";
303 print $form->selectDate($object->datesp, 'datesp', 0, 0, 0, 'datesp', 1);
304 print "</td></tr>";
305} else {
306 print "<tr>";
307 print '<td class="titlefieldmiddle">' . $langs->trans("DateStartPeriod") . '</td><td>';
308 print dol_print_date($object->datesp, 'day');
309 print '</td></tr>';
310}
311
312if ($action == 'edit') {
313 print '<tr><td>'.$langs->trans("DateEndPeriod")."</td><td>";
314 print $form->selectDate($object->dateep, 'dateep', 0, 0, 0, 'dateep', 1);
315 print "</td></tr>";
316} else {
317 print "<tr>";
318 print '<td>' . $langs->trans("DateEndPeriod") . '</td><td>';
319 print dol_print_date($object->dateep, 'day');
320 print '</td></tr>';
321}
322if ($action == 'edit') {
323 print '<tr><td class="fieldrequired">' . $langs->trans("Amount") . '</td><td><input name="amount" size="10" value="' . price($object->amount) . '"></td></tr>';
324} else {
325 print '<tr><td>' . $langs->trans("Amount") . '</td><td><span class="amount">' . price($object->amount, 0, $langs, 1, -1, -1, $conf->currency) . '</span></td></tr>';
326}
327
328// Default mode of payment
329print '<tr><td>';
330print '<table class="nobordernopadding" width="100%"><tr><td>';
331print $langs->trans('DefaultPaymentMode');
332print '</td>';
333if ($action != 'editmode') {
334 print '<td class="right"><a class="editfielda" href="'.$_SERVER["PHP_SELF"].'?action=editmode&token='.newToken().'&id='.$object->id.'">'.img_edit($langs->trans('SetMode'), 1).'</a></td>';
335}
336print '</tr></table>';
337print '</td><td>';
338
339if ($action == 'editmode') {
340 $form->form_modes_reglement($_SERVER['PHP_SELF'].'?id='.$object->id, (string) $object->type_payment, 'mode_reglement_id');
341} else {
342 $form->form_modes_reglement($_SERVER['PHP_SELF'].'?id='.$object->id, (string) $object->type_payment, 'none');
343}
344print '</td></tr>';
345
346// Default Bank Account
347if (isModEnabled("bank")) {
348 print '<tr><td class="nowrap">';
349 print '<table width="100%" class="nobordernopadding"><tr><td class="nowrap">';
350 print $langs->trans('DefaultBankAccount');
351 print '<td>';
352 if ($action != 'editbankaccount' && $user->hasRight('salaries', 'write')) {
353 print '<td class="right"><a class="editfielda" href="'.$_SERVER["PHP_SELF"].'?action=editbankaccount&token='.newToken().'&id='.$object->id.'">'.img_edit($langs->trans('SetBankAccount'), 1).'</a></td>';
354 }
355 print '</tr></table>';
356 print '</td><td>';
357 if ($action == 'editbankaccount') {
358 $form->formSelectAccount($_SERVER['PHP_SELF'].'?id='.$object->id, (string) $object->fk_account, 'fk_account', 1);
359 } else {
360 $form->formSelectAccount($_SERVER['PHP_SELF'].'?id='.$object->id, (string) $object->fk_account, 'none');
361 }
362 print '</td>';
363 print '</tr>';
364}
365
366// Other attributes
367include DOL_DOCUMENT_ROOT.'/core/tpl/extrafields_view.tpl.php';
368
369print '</table>';
370print '</div>';
371
372$user_perms = $user->hasRight('virement', 'bons', 'creer');
373$buttonlabel = $langs->trans("MakeTransferRequest");
374$user_perms = $user->hasRight('paymentbybanktransfer', 'create');
375
376print '<div class="fichehalfright">';
377/*
378 * Payments
379 */
380$sql = "SELECT p.rowid, p.num_payment as num_payment, p.datep as dp, p.amount,";
381$sql .= " c.code as type_code,c.libelle as paiement_type,";
382$sql .= ' ba.rowid as baid, ba.ref as baref, ba.label, ba.number as banumber, ba.account_number, ba.currency_code as bacurrency_code, ba.fk_accountancy_journal';
383$sql .= " FROM ".MAIN_DB_PREFIX."payment_salary as p";
384$sql .= ' LEFT JOIN '.MAIN_DB_PREFIX.'bank as b ON p.fk_bank = b.rowid';
385$sql .= ' LEFT JOIN '.MAIN_DB_PREFIX.'bank_account as ba ON b.fk_account = ba.rowid';
386$sql .= " LEFT JOIN ".MAIN_DB_PREFIX."c_paiement as c ON p.fk_typepayment = c.id";
387$sql .= ", ".MAIN_DB_PREFIX."salary as s";
388$sql .= " WHERE p.fk_salary = ".((int) $id);
389$sql .= " AND p.fk_salary = s.rowid";
390$sql .= " AND s.entity IN (".getEntity('tax').")";
391$sql .= " ORDER BY dp DESC";
392
393$resteapayer = 0;
394//print $sql;
395$resql = $db->query($sql);
396if ($resql) {
397 $totalpaid = 0;
398
399 $num = $db->num_rows($resql);
400
401 $i = 0;
402 $total = 0;
403
404 print '<div class="div-table-responsive-no-min">'; // You can use div-table-responsive-no-min if you don't need reserved height for your table
405 print '<table class="noborder paymenttable">';
406 print '<tr class="liste_titre">';
407 print '<td>'.$langs->trans("RefPayment").'</td>';
408 print '<td>'.$langs->trans("Date").'</td>';
409 print '<td>'.$langs->trans("Type").'</td>';
410 if (isModEnabled("bank")) {
411 print '<td class="liste_titre right">'.$langs->trans('BankAccount').'</td>';
412 }
413 print '<td class="right">'.$langs->trans("Amount").'</td>';
414 print '</tr>';
415
416 if ($num > 0) {
417 $bankaccountstatic = new Account($db);
418 while ($i < $num) {
419 $objp = $db->fetch_object($resql);
420
421 print '<tr class="oddeven"><td>';
422 print '<a href="'.DOL_URL_ROOT.'/salaries/payment_salary/card.php?id='.$objp->rowid.'">'.img_object($langs->trans("Payment"), "payment").' '.$objp->rowid.'</a></td>';
423 print '<td>'.dol_print_date($db->jdate($objp->dp), 'dayhour', 'tzuserrel')."</td>\n";
424 $labeltype = $langs->trans("PaymentType".$objp->type_code) != "PaymentType".$objp->type_code ? $langs->trans("PaymentType".$objp->type_code) : $objp->paiement_type;
425 print "<td>".$labeltype.' '.$objp->num_payment."</td>\n";
426 if (isModEnabled("bank")) {
427 $bankaccountstatic->id = $objp->baid;
428 $bankaccountstatic->ref = $objp->baref;
429 $bankaccountstatic->label = $objp->baref;
430 $bankaccountstatic->number = $objp->banumber;
431 $bankaccountstatic->currency_code = $objp->bacurrency_code;
432
433 if (isModEnabled('accounting')) {
434 $bankaccountstatic->account_number = $objp->account_number;
435
436 $accountingjournal = new AccountingJournal($db);
437 $accountingjournal->fetch($objp->fk_accountancy_journal);
438 $bankaccountstatic->accountancy_journal = $accountingjournal->getNomUrl(0, 1, 1, '', 1);
439 }
440
441 print '<td class="right">';
442 if ($bankaccountstatic->id) {
443 print $bankaccountstatic->getNomUrl(1, 'transactions');
444 }
445 print '</td>';
446 }
447 print '<td class="right nowrap amountcard">'.price($objp->amount)."</td>\n";
448 print "</tr>";
449 $totalpaid += $objp->amount;
450 $i++;
451 }
452 } else {
453 print '<tr class="oddeven"><td><span class="opacitymedium">'.$langs->trans("None").'</span></td>';
454 print '<td></td><td></td><td></td><td></td>';
455 print '</tr>';
456 }
457
458 // print '<tr><td colspan="'.$nbcols.'" class="right">'.$langs->trans("AlreadyPaid").' :</td><td class="right nowrap amountcard">'.price($totalpaid)."</td></tr>\n";
459 // print '<tr><td colspan="'.$nbcols.'" class="right">'.$langs->trans("AmountExpected").' :</td><td class="right nowrap amountcard">'.price($object->amount)."</td></tr>\n";
460
461 $resteapayer = (float) $object->amount - $totalpaid;
462 // $cssforamountpaymentcomplete = 'amountpaymentcomplete';
463
464 // print '<tr><td colspan="'.$nbcols.'" class="right">'.$langs->trans("RemainderToPay")." :</td>";
465 // print '<td class="right nowrap'.($resteapayer ? ' amountremaintopay' : (' '.$cssforamountpaymentcomplete)).'">'.price($resteapayer)."</td></tr>\n";
466
467 print "</table>";
468 print '</div>';
469
470 $db->free($resql);
471} else {
473}
474print '</div>';
475print '</div>';
476print '<div class="clearboth"></div>';
477
478
480
482print '<div class="tabsAction">'."\n";
483
484$sql = "SELECT pfd.rowid, pfd.traite, pfd.date_demande as date_demande,";
485$sql .= " pfd.date_traite as date_traite, pfd.amount, pfd.fk_prelevement_bons,";
486$sql .= " pb.ref, pb.date_trans, pb.method_trans, pb.credite, pb.date_credit, pb.datec, pb.statut as status, pb.amount as pb_amount,";
487$sql .= " u.rowid as user_id, u.email, u.lastname, u.firstname, u.login, u.statut as user_status";
488$sql .= " FROM ".MAIN_DB_PREFIX."prelevement_demande as pfd";
489$sql .= " LEFT JOIN ".MAIN_DB_PREFIX."user as u on pfd.fk_user_demande = u.rowid";
490$sql .= " LEFT JOIN ".MAIN_DB_PREFIX."prelevement_bons as pb ON pb.rowid = pfd.fk_prelevement_bons";
491if ($type == 'salaire') {
492 $sql .= " WHERE pfd.fk_salary = ".((int) $object->id);
493} else {
494 $sql .= " WHERE fk_facture = ".((int) $object->id);
495}
496$sql .= " AND pfd.traite = 0";
497$sql .= " AND pfd.type = 'ban'";
498$sql .= " ORDER BY pfd.date_demande DESC";
499$resql = $db->query($sql);
500
501$hadRequest = $db->num_rows($resql);
502if ($object->paye == 0 && $hadRequest == 0) {
503 if ($resteapayer > 0) {
504 if ($user_perms) {
505 print '<form method="POST" action="'.$_SERVER['PHP_SELF'].'?id='.$object->id.'">';
506 print '<input type="hidden" name="token" value="'.newToken().'" />';
507 print '<input type="hidden" name="id" value="'.$object->id.'" />';
508 print '<input type="hidden" name="type" value="'.$type.'" />';
509 print '<input type="hidden" name="action" value="add" />';
510 print '<label for="withdraw_request_amount">'.$langs->trans('BankTransferAmount').' </label>';
511 print '<input type="text" id="withdraw_request_amount" name="request_transfer" value="'.price($resteapayer, 0, $langs, 1, -1, -1).'" size="9" />';
512 print '<input type="submit" class="butAction" value="'.$buttonlabel.'" />';
513 print '</form>';
514
515 if (getDolGlobalString('STRIPE_SEPA_DIRECT_DEBIT_SHOW_OLD_BUTTON')) { // This is hidden, prefer to use mode enabled with STRIPE_SEPA_DIRECT_DEBIT
516 // TODO Replace this with a checkbox for each payment mode: "Send request to XXX immediately..."
517 print "<br>";
518 //add stripe sepa button
519 $buttonlabel = $langs->trans("MakeWithdrawRequestStripe");
520 print '<form method="POST" action="'.$_SERVER['PHP_SELF'].'?id='.$object->id.'">';
521 print '<input type="hidden" name="token" value="'.newToken().'" />';
522 print '<input type="hidden" name="id" value="'.$object->id.'" />';
523 print '<input type="hidden" name="type" value="'.$type.'" />';
524 print '<input type="hidden" name="action" value="add" />';
525 print '<input type="hidden" name="paymenservice" value="stripesepa" />';
526 print '<label for="withdraw_request_amount">'.$langs->trans('BankTransferAmount').' </label>';
527 print '<input type="text" id="withdraw_request_amount" name="request_transfer" value="'.price($resteapayer, 0, $langs, 1, -1, -1).'" size="9" />';
528 print '<input type="submit" class="butAction" value="'.$buttonlabel.'" />';
529 print '</form>';
530 }
531 } else {
532 print '<a class="butActionRefused classfortooltip" href="#" title="'.dol_escape_htmltag($langs->trans("NotEnoughPermissions")).'">'.$buttonlabel.'</a>';
533 }
534 } else {
535 print '<a class="butActionRefused classfortooltip" href="#" title="'.dol_escape_htmltag($langs->trans("AmountMustBePositive")).'">'.$buttonlabel.'</a>';
536 }
537} else {
538 if ($hadRequest == 0) {
539 if ($object->paye > 0) {
540 print '<a class="butActionRefused classfortooltip" href="#" title="'.dol_escape_htmltag($langs->trans("AlreadyPaid")).'">'.$buttonlabel.'</a>';
541 } else {
542 print '<a class="butActionRefused classfortooltip" href="#" title="'.dol_escape_htmltag($langs->trans("Draft")).'">'.$buttonlabel.'</a>';
543 }
544 } else {
545 print '<a class="butActionRefused classfortooltip" href="#" title="'.dol_escape_htmltag($langs->trans("RequestAlreadyDone")).'">'.$buttonlabel.'</a>';
546 }
547}
548
549print '</div>';
550
551print '<div>';
552
553
554$bprev = new BonPrelevement($db);
555
556
557print '<div class="div-table-responsive-no-min">';
558print '<table class="noborder centpercent">';
559
560print '<tr class="liste_titre">';
561// Action column
562if ($conf->main_checkbox_left_column) {
563 print '<td>&nbsp;</td>';
564}
565print '<td class="left">'.$langs->trans("DateRequest").'</td>';
566print '<td>'.$langs->trans("User").'</td>';
567print '<td class="center">'.$langs->trans("Amount").'</td>';
568print '<td class="center">'.$langs->trans("DateProcess").'</td>';
569if ($type == 'bank-transfer') {
570 print '<td class="center">'.$langs->trans("BankTransferReceipt").'</td>';
571} else {
572 print '<td class="center">'.$langs->trans("WithdrawalReceipt").'</td>';
573}
574print '<td>&nbsp;</td>';
575// Action column
576if (!$conf->main_checkbox_left_column) {
577 print '<td>&nbsp;</td>';
578}
579print '</tr>';
580
581$num = 0;
582if ($resql) {
583 $i = 0;
584
585 $tmpuser = new User($db);
586
587 $num = $db->num_rows($resql);
588 if ($num > 0) {
589 while ($i < $num) {
590 $obj = $db->fetch_object($resql);
591
592 $tmpuser->id = $obj->user_id;
593 $tmpuser->login = $obj->login;
594 $tmpuser->ref = $obj->login;
595 $tmpuser->email = $obj->email;
596 $tmpuser->lastname = $obj->lastname;
597 $tmpuser->firstname = $obj->firstname;
598 $tmpuser->statut = $obj->user_status;
599 $tmpuser->status = $obj->user_status;
600
601 print '<tr class="oddeven">';
602
603 // Action column
604 if ($conf->main_checkbox_left_column) {
605 print '<td class="right">';
606 print '<a href="'.$_SERVER['PHP_SELF'].'?id='.$object->id.'&action=delete&token='.newToken().'&did='.$obj->rowid.'&type='.urlencode($type).'">';
608 print '</a></td>';
609 }
610
611 // Date
612 print '<td class="nowraponall">'.dol_print_date($db->jdate($obj->date_demande), 'dayhour')."</td>\n";
613
614 // User
615 print '<td class="tdoverflowmax125">';
616 print $tmpuser->getNomUrl(-1, '', 0, 0, 0, 0, 'login');
617 print '</td>';
618
619 // Amount
620 print '<td class="center"><span class="amount">'.price($obj->amount).'</span></td>';
621
622 // Date process
623 print '<td class="center"><span class="opacitymedium">'.$langs->trans("OrderWaiting").'</span></td>';
624
625 // Link to make payment now
626 print '<td class="minwidth75">';
627 if ($obj->fk_prelevement_bons > 0) {
628 $withdrawreceipt = new BonPrelevement($db);
629 $withdrawreceipt->id = $obj->fk_prelevement_bons;
630 $withdrawreceipt->ref = $obj->ref;
631 $withdrawreceipt->date_trans = $db->jdate($obj->date_trans);
632 $withdrawreceipt->date_credit = $db->jdate($obj->date_credit);
633 $withdrawreceipt->date_creation = $db->jdate($obj->datec);
634 $withdrawreceipt->statut = $obj->status;
635 $withdrawreceipt->status = $obj->status;
636 $withdrawreceipt->amount = $obj->pb_amount;
637 //$withdrawreceipt->credite = $db->jdate($obj->credite);
638
639 print $withdrawreceipt->getNomUrl(1);
640 }
641
642 if (!in_array($type, array('bank-transfer', 'salaire', 'salary'))) {
643 if (getDolGlobalString('STRIPE_SEPA_DIRECT_DEBIT')) {
644 $langs->load("stripe");
645 if ($obj->fk_prelevement_bons > 0) {
646 print ' &nbsp; ';
647 }
648 print '<a href="'.$_SERVER["PHP_SELF"].'?action=sepastripedirectdebit&paymentservice=stripesepa&token='.newToken().'&did='.$obj->rowid.'&id='.$object->id.'&type='.urlencode($type).'">'.img_picto('', 'stripe', 'class="pictofixedwidth"').$langs->trans("RequestDirectDebitWithStripe").'</a>';
649 }
650 } else {
651 if (getDolGlobalString('STRIPE_SEPA_CREDIT_TRANSFER')) {
652 $langs->load("stripe");
653 if ($obj->fk_prelevement_bons > 0) {
654 print ' &nbsp; ';
655 }
656 print '<a href="'.$_SERVER["PHP_SELF"].'?action=sepastripecredittransfer&paymentservice=stripesepa&token='.newToken().'&did='.$obj->rowid.'&id='.$object->id.'&type='.urlencode($type).'">'.img_picto('', 'stripe', 'class="pictofixedwidth"').$langs->trans("RequesCreditTransferWithStripe").'</a>';
657 }
658 }
659 print '</td>';
660
661 //
662 print '<td class="center">-</td>';
663
664 // Action column
665 if (!$conf->main_checkbox_left_column) {
666 print '<td class="right">';
667 print '<a href="'.$_SERVER['PHP_SELF'].'?id='.$object->id.'&action=delete&token='.newToken().'&did='.$obj->rowid.'&type='.urlencode($type).'">';
669 print '</a></td>';
670 }
671
672 print "</tr>\n";
673 $i++;
674 }
675 }
676
677 $db->free($resql);
678} else {
680}
681
682// Past requests when bon prelevement
683
684$sql = "SELECT pfd.rowid, pfd.traite, pfd.date_demande as date_demande,";
685$sql .= " pfd.date_traite as date_traite, pfd.amount, pfd.fk_prelevement_bons,";
686$sql .= " pb.ref, pb.date_trans, pb.method_trans, pb.credite, pb.date_credit, pb.datec, pb.statut as status, pb.amount as pb_amount,";
687$sql .= " u.rowid as user_id, u.email, u.lastname, u.firstname, u.login, u.statut as user_status";
688$sql .= " FROM ".MAIN_DB_PREFIX."prelevement_demande as pfd";
689$sql .= " LEFT JOIN ".MAIN_DB_PREFIX."user as u on pfd.fk_user_demande = u.rowid";
690$sql .= " LEFT JOIN ".MAIN_DB_PREFIX."prelevement_bons as pb ON pb.rowid = pfd.fk_prelevement_bons";
691if ($type == 'salaire') {
692 $sql .= " WHERE pfd.fk_salary = ".((int) $object->id);
693} else {
694 $sql .= " WHERE fk_facture = ".((int) $object->id);
695}
696$sql .= " AND pfd.traite = 1";
697$sql .= " AND pfd.type = 'ban'";
698$sql .= " ORDER BY pfd.date_demande DESC";
699
700$numOfBp = 0;
701$resql = $db->query($sql);
702if ($resql) {
703 $numOfBp = $db->num_rows($resql);
704 $i = 0;
705 $tmpuser = new User($db);
706 if ($numOfBp > 0) {
707 while ($i < $numOfBp) {
708 $obj = $db->fetch_object($resql);
709
710 $tmpuser->id = $obj->user_id;
711 $tmpuser->login = $obj->login;
712 $tmpuser->ref = $obj->login;
713 $tmpuser->email = $obj->email;
714 $tmpuser->lastname = $obj->lastname;
715 $tmpuser->firstname = $obj->firstname;
716 $tmpuser->statut = $obj->user_status;
717 $tmpuser->status = $obj->user_status;
718
719 print '<tr class="oddeven">';
720
721 // Action column
722 if ($conf->main_checkbox_left_column) {
723 print '<td>&nbsp;</td>';
724 }
725
726 // Date
727 print '<td class="nowraponall">'.dol_print_date($db->jdate($obj->date_demande), 'dayhour')."</td>\n";
728
729 // User
730 print '<td class="tdoverflowmax125">';
731 print $tmpuser->getNomUrl(-1, '', 0, 0, 0, 0, 'login');
732 print '</td>';
733
734 // Amount
735 print '<td class="center"><span class="amount">'.price($obj->amount).'</span></td>';
736
737 // Date process
738 print '<td class="center nowraponall">'.dol_print_date($db->jdate($obj->date_traite), 'dayhour', 'tzuserrel')."</td>\n";
739
740 // Link to payment request done
741 print '<td class="center minwidth75">';
742 if ($obj->fk_prelevement_bons > 0) {
743 $withdrawreceipt = new BonPrelevement($db);
744 $withdrawreceipt->id = $obj->fk_prelevement_bons;
745 $withdrawreceipt->ref = $obj->ref;
746 $withdrawreceipt->date_trans = $db->jdate($obj->date_trans);
747 $withdrawreceipt->date_credit = $db->jdate($obj->date_credit);
748 $withdrawreceipt->date_creation = $db->jdate($obj->datec);
749 $withdrawreceipt->statut = $obj->status;
750 $withdrawreceipt->status = $obj->status;
751 $withdrawreceipt->fk_bank_account = $obj->fk_bank_account;
752 $withdrawreceipt->amount = $obj->pb_amount;
753 //$withdrawreceipt->credite = $db->jdate($obj->credite);
754
755 print $withdrawreceipt->getNomUrl(1);
756 print ' ';
757 print $withdrawreceipt->getLibStatut(2);
758
759 // Show the bank account
760 $fk_bank_account = $withdrawreceipt->fk_bank_account;
761 if (empty($fk_bank_account)) {
762 $fk_bank_account = ($object->type == 'bank-transfer' ? $conf->global->PAYMENTBYBANKTRANSFER_ID_BANKACCOUNT : $conf->global->PRELEVEMENT_ID_BANKACCOUNT);
763 }
764 if ($fk_bank_account > 0) {
765 $bankaccount = new Account($db);
766 $result = $bankaccount->fetch($fk_bank_account);
767 if ($result > 0) {
768 print ' - ';
769 print $bankaccount->getNomUrl(1);
770 }
771 }
772 }
773 print "</td>\n";
774
775 //
776 print '<td>&nbsp;</td>';
777
778 // Action column
779 if (!$conf->main_checkbox_left_column) {
780 print '<td>&nbsp;</td>';
781 }
782
783 print "</tr>\n";
784 $i++;
785 }
786 }
787 $db->free($resql);
788} else {
790}
791
792if ($num == 0 && $numOfBp == 0) {
793 print '<tr class="oddeven"><td colspan="7"><span class="opacitymedium">'.$langs->trans("None").'</span></td></tr>';
794}
795
796print "</table>";
797print '</div>';
798
799// End of page
800llxFooter();
801$db->close();
$id
Support class for third parties, contacts, members, users or resources.
Definition account.php:47
if(! $sortfield) if(! $sortorder) $object
Definition account.php:100
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 accounting journals.
Class to manage withdrawal receipts.
Class to manage standard extra fields.
Class to manage suppliers invoices.
Class to manage invoices.
Class to manage generation of HTML components Only common components must be here.
Class to manage projects.
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.
setEventMessages($mesg, $mesgs, $style='mesgs', $messagekey='', $noduplicate=0, $attop=0)
Set event messages in dol_events session object.
img_picto($titlealt, $picto, $moreatt='', $pictoisfullpath=0, $srconly=0, $notitle=0, $alt='', $morecss='', $marginleftonlyshort=2, $allowothertags=array())
Show picto whatever it's its name (generic function)
img_delete($titlealt='default', $other='class="pictodelete"', $morecss='')
Show delete logo.
GETPOSTINT($paramname, $method=0)
Return the value of a $_GET or $_POST supervariable, converted into integer.
dol_get_fiche_head($links=array(), $active='', $title='', $notab=0, $picto='', $pictoisfullpath=0, $morehtmlright='', $morecss='', $limittoshow=0, $moretabssuffix='', $dragdropfile=0, $morecssdiv='')
Show tabs of a record.
dol_get_fiche_end($notab=0)
Return tab footer of a card.
img_object($titlealt, $picto, $moreatt='', $pictoisfullpath=0, $srconly=0, $notitle=0, $allowothertags=array())
Show a picto called object_picto (generic function)
price($amount, $form=0, $outlangs='', $trunc=1, $rounding=-1, $forcerounding=-1, $currency_code='')
Function to format a value into an amount for visual output Function used into PDF and HTML pages.
GETPOSTFLOAT($paramname, $rounding='', $option=2)
Return the value of a $_GET or $_POST supervariable, converted into float.
GETPOST($paramname, $check='alphanohtml', $method=0, $filter=null, $options=null, $noreplace=0)
Return value of a param into GET or POST supervariable.
dol_print_date($time, $format='', $tzoutput='auto', $outputlangs=null, $encodetooutput=false, $decorate=0)
Output date in a string format according to outputlangs (or langs if not defined).
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.
img_edit($titlealt='default', $float=0, $other='')
Show logo edit/modify fiche.
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.
accessforbidden($message='', $printheader=1, $printfooter=1, $showonlymessage=0, $params=null)
Show a message to say access is forbidden and stop program.
print
button