dolibarr 25.0.0-alpha
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-2026 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 $result = $object->update($user);
157 if ($result < 0) {
158 setEventMessages($object->error, $object->errors, 'errors');
159 }
160}
161
162$parameters = array('socid' => $socid);
163$reshook = $hookmanager->executeHooks('doActions', $parameters, $obj, $action); // Note that $action and $object may have been modified by some hooks
164if ($reshook < 0) {
165 setEventMessages($hookmanager->error, $hookmanager->errors, 'errors');
166}
167
168// payment mode
169if ($action == 'setmode' && $permissiontoadd) {
170 $object->fetch($id);
171 $result = $object->setPaymentMethods(GETPOSTINT('mode_reglement_id'));
172 if ($result < 0) {
173 setEventMessages($object->error, $object->errors, 'errors');
174 }
175}
176
177// bank account
178if ($action == 'setbankaccount' && $permissiontoadd) {
179 $object->fetch($id);
180 $result = $object->setBankAccount(GETPOSTINT('fk_account'));
181 if ($result < 0) {
182 setEventMessages($object->error, $object->errors, 'errors');
183 }
184}
185
186if ($action == "add" && $permissiontoadd) {
187 //var_dump($object);exit;
188 if ($object->id > 0) {
189 $db->begin();
190
191 $sourcetype = 'salaire';
192 $newtype = 'salaire';
193
194 $paymentservice = GETPOST('paymentservice'); // value can be 'stripesepa'. not used yet.
195
196 $result = $object->demande_prelevement($user, GETPOSTFLOAT('request_transfer'), $newtype, $sourcetype);
197
198 if ($result > 0) {
199 $db->commit();
200
201 setEventMessages($langs->trans("RecordSaved"), null, 'mesgs');
202 } else {
203 $db->rollback();
204
205 setEventMessages($obj->error, $obj->errors, 'errors');
206 }
207 }
208 $action = '';
209}
210
211if ($action == "delete" && $permissiontodelete) {
212 if ($object->id > 0) {
213 $result = $object->demande_prelevement_delete($user, GETPOSTINT('did'));
214 if ($result == 0) {
215 header("Location: ".$_SERVER['PHP_SELF']."?id=".$object->id);
216 exit;
217 }
218 }
219}
220
221
222/*
223 * View
224 */
225
226$form = new Form($db);
227
228$title = $langs->trans('Salary')." - ".$langs->trans('Info');
229$help_url = "";
230llxHeader("", $title, $help_url);
231
232$object->fetch($id);
233$object->info($id);
234
235$head = salaries_prepare_head($object);
236
237print dol_get_fiche_head($head, 'request_virement', $langs->trans("SalaryPayment"), -1, 'salary');
238
239$linkback = '<a href="'.DOL_URL_ROOT.'/salaries/list.php?restore_lastsearch_values=1'.(!empty($socid) ? '&socid='.$socid : '').'">'.$langs->trans("BackToList").'</a>';
240
241$morehtmlref = '<div class="refidno">';
242
243$userstatic = new User($db);
244$userstatic->fetch($object->fk_user);
245
246
247// Label
248if ($action != 'editlabel') {
249 $morehtmlref .= $form->editfieldkey("Label", 'label', $object->label, $object, $user->hasRight('salaries', 'write'), 'string', '', 0, 1);
250 $morehtmlref .= $object->label;
251} else {
252 $morehtmlref .= $langs->trans('Label').' :&nbsp;';
253 $morehtmlref .= '<form method="post" action="'.$_SERVER['PHP_SELF'].'?id='.$object->id.'">';
254 $morehtmlref .= '<input type="hidden" name="action" value="setlabel">';
255 $morehtmlref .= '<input type="hidden" name="token" value="'.newToken().'">';
256 $morehtmlref .= '<input type="text" name="label" value="'.$object->label.'"/>';
257 $morehtmlref .= '<input type="submit" class="button valignmiddle" value="'.$langs->trans("Modify").'">';
258 $morehtmlref .= '</form>';
259}
260
261$morehtmlref .= '<br>'.$langs->trans('Employee').' : '.$userstatic->getNomUrl(-1);
262
263$usercancreate = $permissiontoadd;
264
265// Project
266if (isModEnabled('project')) {
267 $langs->load("projects");
268 $morehtmlref .= '<br>';
269 if ($usercancreate) {
270 $morehtmlref .= img_picto($langs->trans("Project"), 'project', 'class="pictofixedwidth"');
271 if ($action != 'classify') {
272 $morehtmlref .= '<a class="editfielda" href="'.dolBuildUrl($_SERVER['PHP_SELF'], ['action' => 'classify', 'id' => $object->id], true).'">'.img_edit($langs->transnoentitiesnoconv('SetProject')).'</a> ';
273 }
274 $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');
275 } else {
276 if (!empty($object->fk_project)) {
277 $proj = new Project($db);
278 $proj->fetch($object->fk_project);
279 $morehtmlref .= $proj->getNomUrl(1);
280 if ($proj->title) {
281 $morehtmlref .= '<span class="opacitymedium"> - '.dol_escape_htmltag($proj->title).'</span>';
282 }
283 }
284 }
285}
286
287$morehtmlref .= '</div>';
288
289$totalpaid = $object->getSommePaiement();
290
291$object->totalpaid = $totalpaid;
292$object->alreadypaid = $totalpaid; // Same then $totalpaid because there is no amount of credit note or deposits for salary payments.
293
294dol_banner_tab($object, 'id', $linkback, 1, 'rowid', 'ref', $morehtmlref, '', 0, '', '');
295
296print '<div class="fichecenter">';
297print '<div class="fichehalfleft">';
298
299print '<div class="underbanner clearboth"></div>';
300
301
302print '<table class="border centpercent tableforfield">';
303
304if ($action == 'edit') {
305 print '<tr><td class="titlefieldmiddle">'.$langs->trans("DateStartPeriod")."</td><td>";
306 print $form->selectDate($object->datesp, 'datesp', 0, 0, 0, 'datesp', 1);
307 print "</td></tr>";
308} else {
309 print "<tr>";
310 print '<td class="titlefieldmiddle">' . $langs->trans("DateStartPeriod") . '</td><td>';
311 print dol_print_date($object->datesp, 'day');
312 print '</td></tr>';
313}
314
315if ($action == 'edit') {
316 print '<tr><td>'.$langs->trans("DateEndPeriod")."</td><td>";
317 print $form->selectDate($object->dateep, 'dateep', 0, 0, 0, 'dateep', 1);
318 print "</td></tr>";
319} else {
320 print "<tr>";
321 print '<td>' . $langs->trans("DateEndPeriod") . '</td><td>';
322 print dol_print_date($object->dateep, 'day');
323 print '</td></tr>';
324}
325if ($action == 'edit') {
326 print '<tr><td class="fieldrequired">' . $langs->trans("Amount") . '</td><td><input name="amount" size="10" value="' . price($object->amount) . '"></td></tr>';
327} else {
328 print '<tr><td>' . $langs->trans("Amount") . '</td><td><span class="amount">' . price($object->amount, 0, $langs, 1, -1, -1, $conf->currency) . '</span></td></tr>';
329}
330
331// Default mode of payment
332print '<tr><td>';
333print '<table class="nobordernopadding" width="100%"><tr><td>';
334print $langs->trans('DefaultPaymentMode');
335print '</td>';
336if ($action != 'editmode') {
337 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>';
338}
339print '</tr></table>';
340print '</td><td>';
341
342if ($action == 'editmode') {
343 $form->form_modes_reglement($_SERVER['PHP_SELF'].'?id='.$object->id, (string) $object->type_payment, 'mode_reglement_id');
344} else {
345 $form->form_modes_reglement($_SERVER['PHP_SELF'].'?id='.$object->id, (string) $object->type_payment, 'none');
346}
347print '</td></tr>';
348
349// Default Bank Account
350if (isModEnabled("bank")) {
351 print '<tr><td class="nowrap">';
352 print '<table width="100%" class="nobordernopadding"><tr><td class="nowrap">';
353 print $langs->trans('DefaultBankAccount');
354 print '<td>';
355 if ($action != 'editbankaccount' && $user->hasRight('salaries', 'write')) {
356 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>';
357 }
358 print '</tr></table>';
359 print '</td><td>';
360 if ($action == 'editbankaccount') {
361 $form->formSelectAccount($_SERVER['PHP_SELF'].'?id='.$object->id, (string) $object->fk_account, 'fk_account', 1);
362 } else {
363 $form->formSelectAccount($_SERVER['PHP_SELF'].'?id='.$object->id, (string) $object->fk_account, 'none');
364 }
365 print '</td>';
366 print '</tr>';
367}
368
369// Other attributes
370include DOL_DOCUMENT_ROOT.'/core/tpl/extrafields_view.tpl.php';
371
372print '</table>';
373print '</div>';
374
375$user_perms = $user->hasRight('virement', 'bons', 'creer');
376$buttonlabel = $langs->trans("MakeTransferRequest");
377$user_perms = $user->hasRight('paymentbybanktransfer', 'create');
378
379print '<div class="fichehalfright">';
380/*
381 * Payments
382 */
383$sql = "SELECT p.rowid, p.num_payment as num_payment, p.datep as dp, p.amount,";
384$sql .= " c.code as type_code,c.libelle as paiement_type,";
385$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';
386$sql .= " FROM ".MAIN_DB_PREFIX."payment_salary as p";
387$sql .= ' LEFT JOIN '.MAIN_DB_PREFIX.'bank as b ON p.fk_bank = b.rowid';
388$sql .= ' LEFT JOIN '.MAIN_DB_PREFIX.'bank_account as ba ON b.fk_account = ba.rowid';
389$sql .= " LEFT JOIN ".MAIN_DB_PREFIX."c_paiement as c ON p.fk_typepayment = c.id";
390$sql .= ", ".MAIN_DB_PREFIX."salary as s";
391$sql .= " WHERE p.fk_salary = ".((int) $id);
392$sql .= " AND p.fk_salary = s.rowid";
393$sql .= " AND s.entity IN (".getEntity('tax').")";
394$sql .= " ORDER BY dp DESC";
395
396$resteapayer = 0;
397//print $sql;
398$resql = $db->query($sql);
399if ($resql) {
400 $totalpaid = 0;
401
402 $num = $db->num_rows($resql);
403
404 $i = 0;
405 $total = 0;
406
407 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
408 print '<table class="noborder paymenttable">';
409 print '<tr class="liste_titre">';
410 print '<td>'.$langs->trans("RefPayment").'</td>';
411 print '<td>'.$langs->trans("Date").'</td>';
412 print '<td>'.$langs->trans("Type").'</td>';
413 if (isModEnabled("bank")) {
414 print '<td class="liste_titre right">'.$langs->trans('BankAccount').'</td>';
415 }
416 print '<td class="right">'.$langs->trans("Amount").'</td>';
417 print '</tr>';
418
419 if ($num > 0) {
420 $bankaccountstatic = new Account($db);
421 while ($i < $num) {
422 $objp = $db->fetch_object($resql);
423
424 print '<tr class="oddeven"><td>';
425 print '<a href="'.DOL_URL_ROOT.'/salaries/payment_salary/card.php?id='.$objp->rowid.'">'.img_object($langs->trans("Payment"), "payment").' '.$objp->rowid.'</a></td>';
426 print '<td>'.dol_print_date($db->jdate($objp->dp), 'dayhour', 'tzuserrel')."</td>\n";
427 $labeltype = $langs->trans("PaymentType".$objp->type_code) != "PaymentType".$objp->type_code ? $langs->trans("PaymentType".$objp->type_code) : $objp->paiement_type;
428 print "<td>".$labeltype.' '.$objp->num_payment."</td>\n";
429 if (isModEnabled("bank")) {
430 $bankaccountstatic->id = $objp->baid;
431 $bankaccountstatic->ref = $objp->baref;
432 $bankaccountstatic->label = $objp->baref;
433 $bankaccountstatic->number = $objp->banumber;
434 $bankaccountstatic->currency_code = $objp->bacurrency_code;
435
436 if (isModEnabled('accounting')) {
437 $bankaccountstatic->account_number = $objp->account_number;
438
439 $accountingjournal = new AccountingJournal($db);
440 $accountingjournal->fetch($objp->fk_accountancy_journal);
441 $bankaccountstatic->accountancy_journal = $accountingjournal->getNomUrl(0, 1, 1, '', 1);
442 }
443
444 print '<td class="right">';
445 if ($bankaccountstatic->id) {
446 print $bankaccountstatic->getNomUrl(1, 'transactions');
447 }
448 print '</td>';
449 }
450 print '<td class="right nowrap amountcard">'.price($objp->amount)."</td>\n";
451 print "</tr>";
452 $totalpaid += $objp->amount;
453 $i++;
454 }
455 } else {
456 print '<tr class="oddeven"><td><span class="opacitymedium">'.$langs->trans("None").'</span></td>';
457 print '<td></td><td></td><td></td><td></td>';
458 print '</tr>';
459 }
460
461 // print '<tr><td colspan="'.$nbcols.'" class="right">'.$langs->trans("AlreadyPaid").' :</td><td class="right nowrap amountcard">'.price($totalpaid)."</td></tr>\n";
462 // print '<tr><td colspan="'.$nbcols.'" class="right">'.$langs->trans("AmountExpected").' :</td><td class="right nowrap amountcard">'.price($object->amount)."</td></tr>\n";
463
464 $resteapayer = (float) $object->amount - $totalpaid;
465 // $cssforamountpaymentcomplete = 'amountpaymentcomplete';
466
467 // print '<tr><td colspan="'.$nbcols.'" class="right">'.$langs->trans("RemainderToPay")." :</td>";
468 // print '<td class="right nowrap'.($resteapayer ? ' amountremaintopay' : (' '.$cssforamountpaymentcomplete)).'">'.price($resteapayer)."</td></tr>\n";
469
470 print "</table>";
471 print '</div>';
472
473 $db->free($resql);
474} else {
475 dol_print_error($db);
476}
477print '</div>';
478print '</div>';
479print '<div class="clearboth"></div>';
480
481
483
485print '<div class="tabsAction">'."\n";
486
487$sql = "SELECT pfd.rowid, pfd.traite, pfd.date_demande as date_demande,";
488$sql .= " pfd.date_traite as date_traite, pfd.amount, pfd.fk_prelevement_bons,";
489$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,";
490$sql .= " u.rowid as user_id, u.email, u.lastname, u.firstname, u.login, u.statut as user_status";
491$sql .= " FROM ".MAIN_DB_PREFIX."prelevement_demande as pfd";
492$sql .= " LEFT JOIN ".MAIN_DB_PREFIX."user as u on pfd.fk_user_demande = u.rowid";
493$sql .= " LEFT JOIN ".MAIN_DB_PREFIX."prelevement_bons as pb ON pb.rowid = pfd.fk_prelevement_bons";
494if ($type == 'salaire') {
495 $sql .= " WHERE pfd.fk_salary = ".((int) $object->id);
496} else {
497 $sql .= " WHERE fk_facture = ".((int) $object->id);
498}
499$sql .= " AND pfd.traite = 0";
500$sql .= " AND pfd.type = 'ban'";
501$sql .= " ORDER BY pfd.date_demande DESC";
502$resql = $db->query($sql);
503
504$hadRequest = $db->num_rows($resql);
505if ($object->paye == 0 && $hadRequest == 0) {
506 if ($resteapayer > 0) {
507 if ($user_perms) {
508 print '<form method="POST" action="'.$_SERVER['PHP_SELF'].'?id='.$object->id.'">';
509 print '<input type="hidden" name="token" value="'.newToken().'" />';
510 print '<input type="hidden" name="id" value="'.$object->id.'" />';
511 print '<input type="hidden" name="type" value="'.$type.'" />';
512 print '<input type="hidden" name="action" value="add" />';
513 print '<label for="withdraw_request_amount">'.$langs->trans('BankTransferAmount').' </label>';
514 print '<input type="text" id="withdraw_request_amount" name="request_transfer" value="'.price($resteapayer, 0, $langs, 1, -1, -1).'" size="9" />';
515 print '<input type="submit" class="butAction" value="'.$buttonlabel.'" />';
516 print '</form>';
517
518 if (getDolGlobalString('STRIPE_SEPA_DIRECT_DEBIT_SHOW_OLD_BUTTON')) { // This is hidden, prefer to use mode enabled with STRIPE_SEPA_DIRECT_DEBIT
519 // TODO Replace this with a checkbox for each payment mode: "Send request to XXX immediately..."
520 print "<br>";
521 //add stripe sepa button
522 $buttonlabel = $langs->trans("MakeWithdrawRequestStripe");
523 print '<form method="POST" action="'.$_SERVER['PHP_SELF'].'?id='.$object->id.'">';
524 print '<input type="hidden" name="token" value="'.newToken().'" />';
525 print '<input type="hidden" name="id" value="'.$object->id.'" />';
526 print '<input type="hidden" name="type" value="'.$type.'" />';
527 print '<input type="hidden" name="action" value="add" />';
528 print '<input type="hidden" name="paymenservice" value="stripesepa" />';
529 print '<label for="withdraw_request_amount">'.$langs->trans('BankTransferAmount').' </label>';
530 print '<input type="text" id="withdraw_request_amount" name="request_transfer" value="'.price($resteapayer, 0, $langs, 1, -1, -1).'" size="9" />';
531 print '<input type="submit" class="butAction" value="'.$buttonlabel.'" />';
532 print '</form>';
533 }
534 } else {
535 print '<a class="butActionRefused classfortooltip" href="#" title="'.dol_escape_htmltag($langs->trans("NotEnoughPermissions")).'">'.$buttonlabel.'</a>';
536 }
537 } else {
538 print '<a class="butActionRefused classfortooltip" href="#" title="'.dol_escape_htmltag($langs->trans("AmountMustBePositive")).'">'.$buttonlabel.'</a>';
539 }
540} else {
541 if ($hadRequest == 0) {
542 if ($object->paye > 0) {
543 print '<a class="butActionRefused classfortooltip" href="#" title="'.dol_escape_htmltag($langs->trans("AlreadyPaid")).'">'.$buttonlabel.'</a>';
544 } else {
545 print '<a class="butActionRefused classfortooltip" href="#" title="'.dol_escape_htmltag($langs->trans("Draft")).'">'.$buttonlabel.'</a>';
546 }
547 } else {
548 print '<a class="butActionRefused classfortooltip" href="#" title="'.dol_escape_htmltag($langs->trans("RequestAlreadyDone")).'">'.$buttonlabel.'</a>';
549 }
550}
551
552print '</div>';
553
554print '<div>';
555
556
557$bprev = new BonPrelevement($db);
558
559
560print '<div class="div-table-responsive-no-min">';
561print '<table class="noborder centpercent">';
562
563print '<tr class="liste_titre">';
564// Action column
565if ($conf->main_checkbox_left_column) {
566 print '<td>&nbsp;</td>';
567}
568print '<td class="left">'.$langs->trans("DateRequest").'</td>';
569print '<td>'.$langs->trans("User").'</td>';
570print '<td class="center">'.$langs->trans("Amount").'</td>';
571print '<td class="center">'.$langs->trans("DateProcess").'</td>';
572if ($type == 'bank-transfer') {
573 print '<td class="center">'.$langs->trans("BankTransferReceipt").'</td>';
574} else {
575 print '<td class="center">'.$langs->trans("WithdrawalReceipt").'</td>';
576}
577print '<td>&nbsp;</td>';
578// Action column
579if (!$conf->main_checkbox_left_column) {
580 print '<td>&nbsp;</td>';
581}
582print '</tr>';
583
584$num = 0;
585if ($resql) {
586 $i = 0;
587
588 $tmpuser = new User($db);
589
590 $num = $db->num_rows($resql);
591 if ($num > 0) {
592 while ($i < $num) {
593 $obj = $db->fetch_object($resql);
594
595 $tmpuser->id = $obj->user_id;
596 $tmpuser->login = $obj->login;
597 $tmpuser->ref = $obj->login;
598 $tmpuser->email = $obj->email;
599 $tmpuser->lastname = $obj->lastname;
600 $tmpuser->firstname = $obj->firstname;
601 $tmpuser->status = $obj->user_status;
602
603 print '<tr class="oddeven">';
604
605 // Action column
606 if ($conf->main_checkbox_left_column) {
607 print '<td class="right">';
608 print '<a href="'.$_SERVER['PHP_SELF'].'?id='.$object->id.'&action=delete&token='.newToken().'&did='.$obj->rowid.'&type='.urlencode($type).'">';
609 print img_delete();
610 print '</a></td>';
611 }
612
613 // Date
614 print '<td class="nowraponall">'.dol_print_date($db->jdate($obj->date_demande), 'dayhour')."</td>\n";
615
616 // User
617 print '<td class="tdoverflowmax125">';
618 print $tmpuser->getNomUrl(-1, '', 0, 0, 0, 0, 'login');
619 print '</td>';
620
621 // Amount
622 print '<td class="center"><span class="amount">'.price($obj->amount).'</span></td>';
623
624 // Date process
625 print '<td class="center"><span class="opacitymedium">'.$langs->trans("OrderWaiting").'</span></td>';
626
627 // Link to make payment now
628 print '<td class="minwidth75">';
629 if ($obj->fk_prelevement_bons > 0) {
630 $withdrawreceipt = new BonPrelevement($db);
631 $withdrawreceipt->id = $obj->fk_prelevement_bons;
632 $withdrawreceipt->ref = $obj->ref;
633 $withdrawreceipt->date_trans = $db->jdate($obj->date_trans);
634 $withdrawreceipt->date_credit = $db->jdate($obj->date_credit);
635 $withdrawreceipt->date_creation = $db->jdate($obj->datec);
636 $withdrawreceipt->statut = $obj->status;
637 $withdrawreceipt->status = $obj->status;
638 $withdrawreceipt->amount = $obj->pb_amount;
639 //$withdrawreceipt->credite = $db->jdate($obj->credite);
640
641 print $withdrawreceipt->getNomUrl(1);
642 }
643
644 if (!in_array($type, array('bank-transfer', 'salaire', 'salary'))) {
645 if (getDolGlobalString('STRIPE_SEPA_DIRECT_DEBIT')) {
646 $langs->load("stripe");
647 if ($obj->fk_prelevement_bons > 0) {
648 print ' &nbsp; ';
649 }
650 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>';
651 }
652 } else {
653 if (getDolGlobalString('STRIPE_SEPA_CREDIT_TRANSFER')) {
654 $langs->load("stripe");
655 if ($obj->fk_prelevement_bons > 0) {
656 print ' &nbsp; ';
657 }
658 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>';
659 }
660 }
661 print '</td>';
662
663 //
664 print '<td class="center">-</td>';
665
666 // Action column
667 if (!$conf->main_checkbox_left_column) {
668 print '<td class="right">';
669 print '<a href="'.$_SERVER['PHP_SELF'].'?id='.$object->id.'&action=delete&token='.newToken().'&did='.$obj->rowid.'&type='.urlencode($type).'">';
670 print img_delete();
671 print '</a></td>';
672 }
673
674 print "</tr>\n";
675 $i++;
676 }
677 }
678
679 $db->free($resql);
680} else {
681 dol_print_error($db);
682}
683
684// Past requests when bon prelevement
685
686$sql = "SELECT pfd.rowid, pfd.traite, pfd.date_demande as date_demande,";
687$sql .= " pfd.date_traite as date_traite, pfd.amount, pfd.fk_prelevement_bons,";
688$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,";
689$sql .= " u.rowid as user_id, u.email, u.lastname, u.firstname, u.login, u.statut as user_status";
690$sql .= " FROM ".MAIN_DB_PREFIX."prelevement_demande as pfd";
691$sql .= " LEFT JOIN ".MAIN_DB_PREFIX."user as u on pfd.fk_user_demande = u.rowid";
692$sql .= " LEFT JOIN ".MAIN_DB_PREFIX."prelevement_bons as pb ON pb.rowid = pfd.fk_prelevement_bons";
693if ($type == 'salaire') {
694 $sql .= " WHERE pfd.fk_salary = ".((int) $object->id);
695} else {
696 $sql .= " WHERE fk_facture = ".((int) $object->id);
697}
698$sql .= " AND pfd.traite = 1";
699$sql .= " AND pfd.type = 'ban'";
700$sql .= " ORDER BY pfd.date_demande DESC";
701
702$numOfBp = 0;
703$resql = $db->query($sql);
704if ($resql) {
705 $numOfBp = $db->num_rows($resql);
706 $i = 0;
707 $tmpuser = new User($db);
708 if ($numOfBp > 0) {
709 while ($i < $numOfBp) {
710 $obj = $db->fetch_object($resql);
711
712 $tmpuser->id = $obj->user_id;
713 $tmpuser->login = $obj->login;
714 $tmpuser->ref = $obj->login;
715 $tmpuser->email = $obj->email;
716 $tmpuser->lastname = $obj->lastname;
717 $tmpuser->firstname = $obj->firstname;
718 $tmpuser->status = $obj->user_status;
719
720 print '<tr class="oddeven">';
721
722 // Action column
723 if ($conf->main_checkbox_left_column) {
724 print '<td>&nbsp;</td>';
725 }
726
727 // Date
728 print '<td class="nowraponall">'.dol_print_date($db->jdate($obj->date_demande), 'dayhour')."</td>\n";
729
730 // User
731 print '<td class="tdoverflowmax125">';
732 print $tmpuser->getNomUrl(-1, '', 0, 0, 0, 0, 'login');
733 print '</td>';
734
735 // Amount
736 print '<td class="center"><span class="amount">'.price($obj->amount).'</span></td>';
737
738 // Date process
739 print '<td class="center nowraponall">'.dol_print_date($db->jdate($obj->date_traite), 'dayhour', 'tzuserrel')."</td>\n";
740
741 // Link to payment request done
742 print '<td class="center minwidth75">';
743 if ($obj->fk_prelevement_bons > 0) {
744 $withdrawreceipt = new BonPrelevement($db);
745 $withdrawreceipt->id = $obj->fk_prelevement_bons;
746 $withdrawreceipt->ref = $obj->ref;
747 $withdrawreceipt->date_trans = $db->jdate($obj->date_trans);
748 $withdrawreceipt->date_credit = $db->jdate($obj->date_credit);
749 $withdrawreceipt->date_creation = $db->jdate($obj->datec);
750 $withdrawreceipt->statut = $obj->status;
751 $withdrawreceipt->status = $obj->status;
752 $withdrawreceipt->fk_bank_account = $obj->fk_bank_account;
753 $withdrawreceipt->amount = $obj->pb_amount;
754 //$withdrawreceipt->credite = $db->jdate($obj->credite);
755
756 print $withdrawreceipt->getNomUrl(1);
757 print ' ';
758 print $withdrawreceipt->getLibStatut(2);
759
760 // Show the bank account
761 $fk_bank_account = $withdrawreceipt->fk_bank_account;
762 if (empty($fk_bank_account)) {
763 $fk_bank_account = ($object->type == 'bank-transfer' ? $conf->global->PAYMENTBYBANKTRANSFER_ID_BANKACCOUNT : $conf->global->PRELEVEMENT_ID_BANKACCOUNT);
764 }
765 if ($fk_bank_account > 0) {
766 $bankaccount = new Account($db);
767 $result = $bankaccount->fetch($fk_bank_account);
768 if ($result > 0) {
769 print ' - ';
770 print $bankaccount->getNomUrl(1);
771 }
772 }
773 }
774 print "</td>\n";
775
776 //
777 print '<td>&nbsp;</td>';
778
779 // Action column
780 if (!$conf->main_checkbox_left_column) {
781 print '<td>&nbsp;</td>';
782 }
783
784 print "</tr>\n";
785 $i++;
786 }
787 }
788 $db->free($resql);
789} else {
790 dol_print_error($db);
791}
792
793if ($num == 0 && $numOfBp == 0) {
794 print '<tr class="oddeven"><td colspan="7"><span class="opacitymedium">'.$langs->trans("None").'</span></td></tr>';
795}
796
797print "</table>";
798print '</div>';
799
800// End of page
801llxFooter();
802$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:
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.
newToken()
Return the value of token currently saved into session with name 'newtoken'.
GETPOST($paramname, $check='alphanohtml', $method=0, $filter=null, $options=null, $noreplace=0, $nodefault=0)
Return value of a param into GET or POST supervariable.
GETPOSTFLOAT($paramname, $rounding='', $option=2)
Return the value of a $_GET or $_POST supervariable, converted into float.
GETPOSTINT($paramname, $method=0, $nodefault=0)
Return the value of a $_GET or $_POST supervariable, converted into integer.
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).
getDolGlobalString($key, $default='')
Return a Dolibarr global constant string value.
isModEnabled($module)
Is Dolibarr module enabled.
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.
Definition html.lib.php:540
dol_get_fiche_end($notab=0)
Return tab footer of a card.
Definition html.lib.php:738
restrictedArea(User $user, $features, $object=0, $tableandshare='', $feature2='', $dbt_keyfield='fk_soc', $dbt_select='rowid', $isdraft=0, $nodie=0, $mode='')
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