dolibarr 21.0.3
virement_request.php
1<?php
2/* Copyright (C) 2005-2015 Laurent Destailleur <eldy@users.sourceforge.net>
3 * Copyright (C) 2015 Charlie BENKE <charlie@patas-monkey.com>
4 * Copyright (C) 2017-2019 Alexandre Spangaro <aspangaro@open-dsi.fr>
5 * Copyright (C) 2021 Gauthier VERDOL <gauthier.verdol@atm-consulting.fr>
6 * Copyright (C) 2024 MDW <mdeweerd@users.noreply.github.com>
7 * Copyright (C) 2024 Frédéric France <frederic.france@free.fr>
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.'/core/lib/date.lib.php';
32require_once DOL_DOCUMENT_ROOT.'/core/lib/files.lib.php';
33require_once DOL_DOCUMENT_ROOT.'/salaries/class/salary.class.php';
34require_once DOL_DOCUMENT_ROOT.'/salaries/class/paymentsalary.class.php';
35require_once DOL_DOCUMENT_ROOT.'/compta/bank/class/account.class.php';
36require_once DOL_DOCUMENT_ROOT.'/core/lib/salaries.lib.php';
37require_once DOL_DOCUMENT_ROOT.'/core/class/extrafields.class.php';
38require_once DOL_DOCUMENT_ROOT.'/accountancy/class/accountingjournal.class.php';
39require_once DOL_DOCUMENT_ROOT.'/core/class/html.formfile.class.php';
40require_once DOL_DOCUMENT_ROOT.'/compta/prelevement/class/bonprelevement.class.php';
41
42require_once DOL_DOCUMENT_ROOT.'/societe/class/companybankaccount.class.php';
43require_once DOL_DOCUMENT_ROOT.'/fourn/class/fournisseur.class.php';
44require_once DOL_DOCUMENT_ROOT.'/fourn/class/fournisseur.facture.class.php';
45
46require_once DOL_DOCUMENT_ROOT.'/core/lib/invoice.lib.php';
47require_once DOL_DOCUMENT_ROOT.'/core/lib/fourn.lib.php';
48require_once DOL_DOCUMENT_ROOT.'/compta/facture/class/facture.class.php';
49require_once DOL_DOCUMENT_ROOT.'/compta/prelevement/class/bonprelevement.class.php';
50require_once DOL_DOCUMENT_ROOT.'/core/class/discount.class.php';
51require_once DOL_DOCUMENT_ROOT.'/projet/class/project.class.php';
52require_once DOL_DOCUMENT_ROOT.'/societe/class/companybankaccount.class.php';
53require_once DOL_DOCUMENT_ROOT.'/fourn/class/fournisseur.class.php';
54require_once DOL_DOCUMENT_ROOT.'/fourn/class/fournisseur.facture.class.php';
55if (isModEnabled('project')) {
56 require_once DOL_DOCUMENT_ROOT.'/projet/class/project.class.php';
57 require_once DOL_DOCUMENT_ROOT.'/core/class/html.formprojet.class.php';
58}
59
69// Load translation files required by the page
70$langs->loadLangs(array("compta", "bills", "users", "salaries", "hrm", "withdrawals"));
71
72$id = GETPOSTINT('id');
73$ref = GETPOST('ref', 'alpha');
74$action = GETPOST('action', 'aZ09');
75$type = 'salaire';
76
77$label = GETPOST('label', 'alphanohtml');
78$projectid = (GETPOSTINT('projectid') ? GETPOSTINT('projectid') : GETPOSTINT('fk_project'));
79
80// Security check
81$socid = GETPOSTINT('socid');
82if ($user->socid) {
83 $socid = $user->socid;
84}
85
86
87$object = new Salary($db);
88$extrafields = new ExtraFields($db);
89
90$childids = $user->getAllChildIds(1);
91
92// fetch optionals attributes and labels
93$extrafields->fetch_name_optionals_label($object->table_element);
94
95// Initialize a technical object to manage hooks of page. Note that conf->hooks_modules contains an array of hook context
96$hookmanager->initHooks(array('salaryinfo', 'globalcard'));
97
98$object = new Salary($db);
99if ($id > 0 || !empty($ref)) {
100 $object->fetch($id, $ref);
101
102 // Check current user can read this salary
103 $canread = 0;
104 if ($user->hasRight('salaries', 'readall')) {
105 $canread = 1;
106 }
107 if ($user->hasRight('salaries', 'read') && $object->fk_user > 0 && in_array($object->fk_user, $childids)) {
108 $canread = 1;
109 }
110 if (!$canread) {
112 }
113}
114
115$permissiontoread = $user->hasRight('salaries', 'read');
116$permissiontoadd = $user->hasRight('salaries', 'write'); // Used by the include of actions_addupdatedelete.inc.php and actions_linkedfiles
117$permissiontodelete = $user->hasRight('salaries', 'delete') || ($permissiontoadd && isset($object->status) && $object->status == $object::STATUS_UNPAID);
118
119$moreparam = '';
120if ($type == 'bank-transfer') {
121 $obj = new FactureFournisseur($db);
122 $moreparam = '&type='.$type;
123} else {
124 $obj = new Facture($db);
125}
126
127// Load object
128if ($id > 0 || !empty($ref)) {
129 $ret = $object->fetch($id, $ref);
130 $isdraft = (($obj->status == FactureFournisseur::STATUS_DRAFT) ? 1 : 0);
131 if ($ret > 0) {
132 $object->fetch_thirdparty();
133 }
134}
135
136$hookmanager->initHooks(array('directdebitcard', 'globalcard'));
137
138restrictedArea($user, 'salaries', $object->id, 'salary', '');
139
140
141/*
142 * Actions
143 */
144
145// Link to a project
146if ($action == 'classin' && $user->hasRight('banque', 'modifier')) {
147 $object->fetch($id);
148 $object->setProject($projectid);
149}
150
151// set label
152if ($action == 'setlabel' && $user->hasRight('salaries', 'write')) {
153 $object->fetch($id);
154 $object->label = $label;
155 $object->update($user);
156}
157
158$parameters = array('socid' => $socid);
159$reshook = $hookmanager->executeHooks('doActions', $parameters, $obj, $action); // Note that $action and $object may have been modified by some hooks
160if ($reshook < 0) {
161 setEventMessages($hookmanager->error, $hookmanager->errors, 'errors');
162}
163
164// payment mode
165if ($action == 'setmode' && $permissiontoadd) {
166 $object->fetch($id);
167 $result = $object->setPaymentMethods(GETPOSTINT('mode_reglement_id'));
168 if ($result < 0) {
169 setEventMessages($object->error, $object->errors, 'errors');
170 }
171}
172
173// bank account
174if ($action == 'setbankaccount' && $permissiontoadd) {
175 $object->fetch($id);
176 $result = $object->setBankAccount(GETPOSTINT('fk_account'));
177 if ($result < 0) {
178 setEventMessages($object->error, $object->errors, 'errors');
179 }
180}
181
182if ($action == "add" && $permissiontoadd) {
183 //var_dump($object);exit;
184 if ($object->id > 0) {
185 $db->begin();
186
187 $sourcetype = 'salaire';
188 $newtype = 'salaire';
189 $paymentservice = GETPOST('paymentservice'); // value can be 'stripesepa'. not used yet.
190
191 $result = $object->demande_prelevement($user, price2num(GETPOST('request_transfer', 'alpha')), $newtype, $sourcetype);
192
193 if ($result > 0) {
194 $db->commit();
195
196 setEventMessages($langs->trans("RecordSaved"), null, 'mesgs');
197 } else {
198 dol_print_error($db, $error);
199 $db->rollback();
200 setEventMessages($obj->error, $obj->errors, 'errors');
201 }
202 }
203 $action = '';
204}
205
206if ($action == "delete" && $permissiontodelete) {
207 if ($object->id > 0) {
208 $result = $object->demande_prelevement_delete($user, GETPOSTINT('did'));
209 if ($result == 0) {
210 header("Location: ".$_SERVER['PHP_SELF']."?id=".$object->id);
211 exit;
212 }
213 }
214}
215
216
217/*
218 * View
219 */
220
221if (isModEnabled('project')) {
222 $formproject = new FormProjets($db);
223}
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="'.$_SERVER['PHP_SELF'].'?action=classify&token='.newToken().'&id='.$object->id.'">'.img_edit($langs->transnoentitiesnoconv('SetProject')).'</a> ';
270 }
271 $morehtmlref .= $form->form_project($_SERVER['PHP_SELF'].'?id='.$object->id, $object->socid, $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
286dol_banner_tab($object, 'id', $linkback, 1, 'rowid', 'ref', $morehtmlref, '', 0, '', '');
287
288print '<div class="fichecenter">';
289print '<div class="fichehalfleft">';
290
291print '<div class="underbanner clearboth"></div>';
292
293
294print '<table class="border centpercent tableforfield">';
295
296if ($action == 'edit') {
297 print '<tr><td class="titlefieldmiddle">'.$langs->trans("DateStartPeriod")."</td><td>";
298 print $form->selectDate($object->datesp, 'datesp', 0, 0, 0, 'datesp', 1);
299 print "</td></tr>";
300} else {
301 print "<tr>";
302 print '<td class="titlefieldmiddle">' . $langs->trans("DateStartPeriod") . '</td><td>';
303 print dol_print_date($object->datesp, 'day');
304 print '</td></tr>';
305}
306
307if ($action == 'edit') {
308 print '<tr><td>'.$langs->trans("DateEndPeriod")."</td><td>";
309 print $form->selectDate($object->dateep, 'dateep', 0, 0, 0, 'dateep', 1);
310 print "</td></tr>";
311} else {
312 print "<tr>";
313 print '<td>' . $langs->trans("DateEndPeriod") . '</td><td>';
314 print dol_print_date($object->dateep, 'day');
315 print '</td></tr>';
316}
317if ($action == 'edit') {
318 print '<tr><td class="fieldrequired">' . $langs->trans("Amount") . '</td><td><input name="amount" size="10" value="' . price($object->amount) . '"></td></tr>';
319} else {
320 print '<tr><td>' . $langs->trans("Amount") . '</td><td><span class="amount">' . price($object->amount, 0, $langs, 1, -1, -1, $conf->currency) . '</span></td></tr>';
321}
322
323// Default mode of payment
324print '<tr><td>';
325print '<table class="nobordernopadding" width="100%"><tr><td>';
326print $langs->trans('DefaultPaymentMode');
327print '</td>';
328if ($action != 'editmode') {
329 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>';
330}
331print '</tr></table>';
332print '</td><td>';
333
334if ($action == 'editmode') {
335 $form->form_modes_reglement($_SERVER['PHP_SELF'].'?id='.$object->id, $object->type_payment, 'mode_reglement_id');
336} else {
337 $form->form_modes_reglement($_SERVER['PHP_SELF'].'?id='.$object->id, $object->type_payment, 'none');
338}
339print '</td></tr>';
340
341// Default Bank Account
342if (isModEnabled("bank")) {
343 print '<tr><td class="nowrap">';
344 print '<table width="100%" class="nobordernopadding"><tr><td class="nowrap">';
345 print $langs->trans('DefaultBankAccount');
346 print '<td>';
347 if ($action != 'editbankaccount' && $user->hasRight('salaries', 'write')) {
348 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>';
349 }
350 print '</tr></table>';
351 print '</td><td>';
352 if ($action == 'editbankaccount') {
353 $form->formSelectAccount($_SERVER['PHP_SELF'].'?id='.$object->id, $object->fk_account, 'fk_account', 1);
354 } else {
355 $form->formSelectAccount($_SERVER['PHP_SELF'].'?id='.$object->id, $object->fk_account, 'none');
356 }
357 print '</td>';
358 print '</tr>';
359}
360
361// Other attributes
362include DOL_DOCUMENT_ROOT.'/core/tpl/extrafields_view.tpl.php';
363
364print '</table>';
365print '</div>';
366
367$user_perms = $user->hasRight('virement', 'bons', 'creer');
368$buttonlabel = $langs->trans("MakeTransferRequest");
369$user_perms = $user->hasRight('paymentbybanktransfer', 'create');
370
371print '<div class="fichehalfright">';
372/*
373 * Payments
374 */
375$sql = "SELECT p.rowid, p.num_payment as num_payment, p.datep as dp, p.amount,";
376$sql .= " c.code as type_code,c.libelle as paiement_type,";
377$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';
378$sql .= " FROM ".MAIN_DB_PREFIX."payment_salary as p";
379$sql .= ' LEFT JOIN '.MAIN_DB_PREFIX.'bank as b ON p.fk_bank = b.rowid';
380$sql .= ' LEFT JOIN '.MAIN_DB_PREFIX.'bank_account as ba ON b.fk_account = ba.rowid';
381$sql .= " LEFT JOIN ".MAIN_DB_PREFIX."c_paiement as c ON p.fk_typepayment = c.id";
382$sql .= ", ".MAIN_DB_PREFIX."salary as s";
383$sql .= " WHERE p.fk_salary = ".((int) $id);
384$sql .= " AND p.fk_salary = s.rowid";
385$sql .= " AND s.entity IN (".getEntity('tax').")";
386$sql .= " ORDER BY dp DESC";
387
388//print $sql;
389$resql = $db->query($sql);
390if ($resql) {
391 $totalpaid = 0;
392
393 $num = $db->num_rows($resql);
394
395 $i = 0;
396 $total = 0;
397
398 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
399 print '<table class="noborder paymenttable">';
400 print '<tr class="liste_titre">';
401 print '<td>'.$langs->trans("RefPayment").'</td>';
402 print '<td>'.$langs->trans("Date").'</td>';
403 print '<td>'.$langs->trans("Type").'</td>';
404 if (isModEnabled("bank")) {
405 print '<td class="liste_titre right">'.$langs->trans('BankAccount').'</td>';
406 }
407 print '<td class="right">'.$langs->trans("Amount").'</td>';
408 print '</tr>';
409
410 if ($num > 0) {
411 $bankaccountstatic = new Account($db);
412 while ($i < $num) {
413 $objp = $db->fetch_object($resql);
414
415 print '<tr class="oddeven"><td>';
416 print '<a href="'.DOL_URL_ROOT.'/salaries/payment_salary/card.php?id='.$objp->rowid.'">'.img_object($langs->trans("Payment"), "payment").' '.$objp->rowid.'</a></td>';
417 print '<td>'.dol_print_date($db->jdate($objp->dp), 'dayhour', 'tzuserrel')."</td>\n";
418 $labeltype = $langs->trans("PaymentType".$objp->type_code) != "PaymentType".$objp->type_code ? $langs->trans("PaymentType".$objp->type_code) : $objp->paiement_type;
419 print "<td>".$labeltype.' '.$objp->num_payment."</td>\n";
420 if (isModEnabled("bank")) {
421 $bankaccountstatic->id = $objp->baid;
422 $bankaccountstatic->ref = $objp->baref;
423 $bankaccountstatic->label = $objp->baref;
424 $bankaccountstatic->number = $objp->banumber;
425 $bankaccountstatic->currency_code = $objp->bacurrency_code;
426
427 if (isModEnabled('accounting')) {
428 $bankaccountstatic->account_number = $objp->account_number;
429
430 $accountingjournal = new AccountingJournal($db);
431 $accountingjournal->fetch($objp->fk_accountancy_journal);
432 $bankaccountstatic->accountancy_journal = $accountingjournal->getNomUrl(0, 1, 1, '', 1);
433 }
434
435 print '<td class="right">';
436 if ($bankaccountstatic->id) {
437 print $bankaccountstatic->getNomUrl(1, 'transactions');
438 }
439 print '</td>';
440 }
441 print '<td class="right nowrap amountcard">'.price($objp->amount)."</td>\n";
442 print "</tr>";
443 $totalpaid += $objp->amount;
444 $i++;
445 }
446 } else {
447 print '<tr class="oddeven"><td><span class="opacitymedium">'.$langs->trans("None").'</span></td>';
448 print '<td></td><td></td><td></td><td></td>';
449 print '</tr>';
450 }
451
452 // print '<tr><td colspan="'.$nbcols.'" class="right">'.$langs->trans("AlreadyPaid").' :</td><td class="right nowrap amountcard">'.price($totalpaid)."</td></tr>\n";
453 // print '<tr><td colspan="'.$nbcols.'" class="right">'.$langs->trans("AmountExpected").' :</td><td class="right nowrap amountcard">'.price($object->amount)."</td></tr>\n";
454
455 $resteapayer = (float) $object->amount - $totalpaid;
456 // $cssforamountpaymentcomplete = 'amountpaymentcomplete';
457
458 // print '<tr><td colspan="'.$nbcols.'" class="right">'.$langs->trans("RemainderToPay")." :</td>";
459 // print '<td class="right nowrap'.($resteapayer ? ' amountremaintopay' : (' '.$cssforamountpaymentcomplete)).'">'.price($resteapayer)."</td></tr>\n";
460
461 print "</table>";
462 print '</div>';
463
464 $db->free($resql);
465} else {
466 dol_print_error($db);
467}
468print '</div>';
469print '</div>';
470print '<div class="clearboth"></div>';
471
472
473print dol_get_fiche_end();
474
476print '<div class="tabsAction">'."\n";
477
478$sql = "SELECT pfd.rowid, pfd.traite, pfd.date_demande as date_demande,";
479$sql .= " pfd.date_traite as date_traite, pfd.amount, pfd.fk_prelevement_bons,";
480$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,";
481$sql .= " u.rowid as user_id, u.email, u.lastname, u.firstname, u.login, u.statut as user_status";
482$sql .= " FROM ".MAIN_DB_PREFIX."prelevement_demande as pfd";
483$sql .= " LEFT JOIN ".MAIN_DB_PREFIX."user as u on pfd.fk_user_demande = u.rowid";
484$sql .= " LEFT JOIN ".MAIN_DB_PREFIX."prelevement_bons as pb ON pb.rowid = pfd.fk_prelevement_bons";
485if ($type == 'salaire') {
486 $sql .= " WHERE pfd.fk_salary = ".((int) $object->id);
487} else {
488 $sql .= " WHERE fk_facture = ".((int) $object->id);
489}
490$sql .= " AND pfd.traite = 0";
491$sql .= " AND pfd.type = 'ban'";
492$sql .= " ORDER BY pfd.date_demande DESC";
493$resql = $db->query($sql);
494
495$hadRequest = $db->num_rows($resql);
496if ($object->paye == 0 && $hadRequest == 0) {
497 if ($resteapayer > 0) {
498 if ($user_perms) {
499 print '<form method="POST" action="'.$_SERVER['PHP_SELF'].'?id='.$object->id.'">';
500 print '<input type="hidden" name="token" value="'.newToken().'" />';
501 print '<input type="hidden" name="id" value="'.$object->id.'" />';
502 print '<input type="hidden" name="type" value="'.$type.'" />';
503 print '<input type="hidden" name="action" value="add" />';
504 print '<label for="withdraw_request_amount">'.$langs->trans('BankTransferAmount').' </label>';
505 print '<input type="text" id="withdraw_request_amount" name="request_transfer" value="'.price($resteapayer, 0, $langs, 1, -1, -1).'" size="9" />';
506 print '<input type="submit" class="butAction" value="'.$buttonlabel.'" />';
507 print '</form>';
508
509 if (getDolGlobalString('STRIPE_SEPA_DIRECT_DEBIT_SHOW_OLD_BUTTON')) { // This is hidden, prefer to use mode enabled with STRIPE_SEPA_DIRECT_DEBIT
510 // TODO Replace this with a checkbox for each payment mode: "Send request to XXX immediately..."
511 print "<br>";
512 //add stripe sepa button
513 $buttonlabel = $langs->trans("MakeWithdrawRequestStripe");
514 print '<form method="POST" action="'.$_SERVER['PHP_SELF'].'?id='.$object->id.'">';
515 print '<input type="hidden" name="token" value="'.newToken().'" />';
516 print '<input type="hidden" name="id" value="'.$object->id.'" />';
517 print '<input type="hidden" name="type" value="'.$type.'" />';
518 print '<input type="hidden" name="action" value="add" />';
519 print '<input type="hidden" name="paymenservice" value="stripesepa" />';
520 print '<label for="withdraw_request_amount">'.$langs->trans('BankTransferAmount').' </label>';
521 print '<input type="text" id="withdraw_request_amount" name="request_transfer" value="'.price($resteapayer, 0, $langs, 1, -1, -1).'" size="9" />';
522 print '<input type="submit" class="butAction" value="'.$buttonlabel.'" />';
523 print '</form>';
524 }
525 } else {
526 print '<a class="butActionRefused classfortooltip" href="#" title="'.dol_escape_htmltag($langs->trans("NotEnoughPermissions")).'">'.$buttonlabel.'</a>';
527 }
528 } else {
529 print '<a class="butActionRefused classfortooltip" href="#" title="'.dol_escape_htmltag($langs->trans("AmountMustBePositive")).'">'.$buttonlabel.'</a>';
530 }
531} else {
532 if ($hadRequest == 0) {
533 if ($object->paye > 0) {
534 print '<a class="butActionRefused classfortooltip" href="#" title="'.dol_escape_htmltag($langs->trans("AlreadyPaid")).'">'.$buttonlabel.'</a>';
535 } else {
536 print '<a class="butActionRefused classfortooltip" href="#" title="'.dol_escape_htmltag($langs->trans("Draft")).'">'.$buttonlabel.'</a>';
537 }
538 } else {
539 print '<a class="butActionRefused classfortooltip" href="#" title="'.dol_escape_htmltag($langs->trans("RequestAlreadyDone")).'">'.$buttonlabel.'</a>';
540 }
541}
542
543print '</div>';
544
545print '<div>';
546
547
548$bprev = new BonPrelevement($db);
549
550
551print '<div class="div-table-responsive-no-min">';
552print '<table class="noborder centpercent">';
553
554print '<tr class="liste_titre">';
555// Action column
556if (getDolGlobalString('MAIN_CHECKBOX_LEFT_COLUMN')) {
557 print '<td>&nbsp;</td>';
558}
559print '<td class="left">'.$langs->trans("DateRequest").'</td>';
560print '<td>'.$langs->trans("User").'</td>';
561print '<td class="center">'.$langs->trans("Amount").'</td>';
562print '<td class="center">'.$langs->trans("DateProcess").'</td>';
563if ($type == 'bank-transfer') {
564 print '<td class="center">'.$langs->trans("BankTransferReceipt").'</td>';
565} else {
566 print '<td class="center">'.$langs->trans("WithdrawalReceipt").'</td>';
567}
568print '<td>&nbsp;</td>';
569// Action column
570if (!getDolGlobalString('MAIN_CHECKBOX_LEFT_COLUMN')) {
571 print '<td>&nbsp;</td>';
572}
573print '</tr>';
574
575$num = 0;
576if ($resql) {
577 $i = 0;
578
579 $tmpuser = new User($db);
580
581 $num = $db->num_rows($result);
582 if ($num > 0) {
583 while ($i < $num) {
584 $obj = $db->fetch_object($resql);
585
586 $tmpuser->id = $obj->user_id;
587 $tmpuser->login = $obj->login;
588 $tmpuser->ref = $obj->login;
589 $tmpuser->email = $obj->email;
590 $tmpuser->lastname = $obj->lastname;
591 $tmpuser->firstname = $obj->firstname;
592 $tmpuser->statut = $obj->user_status;
593 $tmpuser->status = $obj->user_status;
594
595 print '<tr class="oddeven">';
596
597 // Action column
598 if (getDolGlobalString('MAIN_CHECKBOX_LEFT_COLUMN')) {
599 print '<td class="right">';
600 print '<a href="'.$_SERVER['PHP_SELF'].'?id='.$object->id.'&action=delete&token='.newToken().'&did='.$obj->rowid.'&type='.urlencode($type).'">';
601 print img_delete();
602 print '</a></td>';
603 }
604
605 // Date
606 print '<td class="nowraponall">'.dol_print_date($db->jdate($obj->date_demande), 'dayhour')."</td>\n";
607
608 // User
609 print '<td class="tdoverflowmax125">';
610 print $tmpuser->getNomUrl(-1, '', 0, 0, 0, 0, 'login');
611 print '</td>';
612
613 // Amount
614 print '<td class="center"><span class="amount">'.price($obj->amount).'</span></td>';
615
616 // Date process
617 print '<td class="center"><span class="opacitymedium">'.$langs->trans("OrderWaiting").'</span></td>';
618
619 // Link to make payment now
620 print '<td class="minwidth75">';
621 if ($obj->fk_prelevement_bons > 0) {
622 $withdrawreceipt = new BonPrelevement($db);
623 $withdrawreceipt->id = $obj->fk_prelevement_bons;
624 $withdrawreceipt->ref = $obj->ref;
625 $withdrawreceipt->date_trans = $db->jdate($obj->date_trans);
626 $withdrawreceipt->date_credit = $db->jdate($obj->date_credit);
627 $withdrawreceipt->date_creation = $db->jdate($obj->datec);
628 $withdrawreceipt->statut = $obj->status;
629 $withdrawreceipt->status = $obj->status;
630 $withdrawreceipt->amount = $obj->pb_amount;
631 //$withdrawreceipt->credite = $db->jdate($obj->credite);
632
633 print $withdrawreceipt->getNomUrl(1);
634 }
635
636 if (!in_array($type, array('bank-transfer', 'salaire', 'salary'))) {
637 if (getDolGlobalString('STRIPE_SEPA_DIRECT_DEBIT')) {
638 $langs->load("stripe");
639 if ($obj->fk_prelevement_bons > 0) {
640 print ' &nbsp; ';
641 }
642 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>';
643 }
644 } else {
645 if (getDolGlobalString('STRIPE_SEPA_CREDIT_TRANSFER')) {
646 $langs->load("stripe");
647 if ($obj->fk_prelevement_bons > 0) {
648 print ' &nbsp; ';
649 }
650 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>';
651 }
652 }
653 print '</td>';
654
655 //
656 print '<td class="center">-</td>';
657
658 // Action column
659 if (!getDolGlobalString('MAIN_CHECKBOX_LEFT_COLUMN')) {
660 print '<td class="right">';
661 print '<a href="'.$_SERVER['PHP_SELF'].'?id='.$object->id.'&action=delete&token='.newToken().'&did='.$obj->rowid.'&type='.urlencode($type).'">';
662 print img_delete();
663 print '</a></td>';
664 }
665
666 print "</tr>\n";
667 $i++;
668 }
669 }
670
671 $db->free($resql);
672} else {
673 dol_print_error($db);
674}
675
676// Past requests when bon prelevement
677
678$sql = "SELECT pfd.rowid, pfd.traite, pfd.date_demande as date_demande,";
679$sql .= " pfd.date_traite as date_traite, pfd.amount, pfd.fk_prelevement_bons,";
680$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,";
681$sql .= " u.rowid as user_id, u.email, u.lastname, u.firstname, u.login, u.statut as user_status";
682$sql .= " FROM ".MAIN_DB_PREFIX."prelevement_demande as pfd";
683$sql .= " LEFT JOIN ".MAIN_DB_PREFIX."user as u on pfd.fk_user_demande = u.rowid";
684$sql .= " LEFT JOIN ".MAIN_DB_PREFIX."prelevement_bons as pb ON pb.rowid = pfd.fk_prelevement_bons";
685if ($type == 'salaire') {
686 $sql .= " WHERE pfd.fk_salary = ".((int) $object->id);
687} else {
688 $sql .= " WHERE fk_facture = ".((int) $object->id);
689}
690$sql .= " AND pfd.traite = 1";
691$sql .= " AND pfd.type = 'ban'";
692$sql .= " ORDER BY pfd.date_demande DESC";
693
694$resql = $db->query($sql);
695if ($resql) {
696 $numOfBp = $db->num_rows($resql);
697 $i = 0;
698 $tmpuser = new User($db);
699 if ($numOfBp > 0) {
700 while ($i < $numOfBp) {
701 $obj = $db->fetch_object($resql);
702
703 $tmpuser->id = $obj->user_id;
704 $tmpuser->login = $obj->login;
705 $tmpuser->ref = $obj->login;
706 $tmpuser->email = $obj->email;
707 $tmpuser->lastname = $obj->lastname;
708 $tmpuser->firstname = $obj->firstname;
709 $tmpuser->statut = $obj->user_status;
710 $tmpuser->status = $obj->user_status;
711
712 print '<tr class="oddeven">';
713
714 // Action column
715 if (getDolGlobalString('MAIN_CHECKBOX_LEFT_COLUMN')) {
716 print '<td>&nbsp;</td>';
717 }
718
719 // Date
720 print '<td class="nowraponall">'.dol_print_date($db->jdate($obj->date_demande), 'dayhour')."</td>\n";
721
722 // User
723 print '<td class="tdoverflowmax125">';
724 print $tmpuser->getNomUrl(-1, '', 0, 0, 0, 0, 'login');
725 print '</td>';
726
727 // Amount
728 print '<td class="center"><span class="amount">'.price($obj->amount).'</span></td>';
729
730 // Date process
731 print '<td class="center nowraponall">'.dol_print_date($db->jdate($obj->date_traite), 'dayhour', 'tzuserrel')."</td>\n";
732
733 // Link to payment request done
734 print '<td class="center minwidth75">';
735 if ($obj->fk_prelevement_bons > 0) {
736 $withdrawreceipt = new BonPrelevement($db);
737 $withdrawreceipt->id = $obj->fk_prelevement_bons;
738 $withdrawreceipt->ref = $obj->ref;
739 $withdrawreceipt->date_trans = $db->jdate($obj->date_trans);
740 $withdrawreceipt->date_credit = $db->jdate($obj->date_credit);
741 $withdrawreceipt->date_creation = $db->jdate($obj->datec);
742 $withdrawreceipt->statut = $obj->status;
743 $withdrawreceipt->status = $obj->status;
744 $withdrawreceipt->fk_bank_account = $obj->fk_bank_account;
745 $withdrawreceipt->amount = $obj->pb_amount;
746 //$withdrawreceipt->credite = $db->jdate($obj->credite);
747
748 print $withdrawreceipt->getNomUrl(1);
749 print ' ';
750 print $withdrawreceipt->getLibStatut(2);
751
752 // Show the bank account
753 $fk_bank_account = $withdrawreceipt->fk_bank_account;
754 if (empty($fk_bank_account)) {
755 $fk_bank_account = ($object->type == 'bank-transfer' ? $conf->global->PAYMENTBYBANKTRANSFER_ID_BANKACCOUNT : $conf->global->PRELEVEMENT_ID_BANKACCOUNT);
756 }
757 if ($fk_bank_account > 0) {
758 $bankaccount = new Account($db);
759 $result = $bankaccount->fetch($fk_bank_account);
760 if ($result > 0) {
761 print ' - ';
762 print $bankaccount->getNomUrl(1);
763 }
764 }
765 }
766 print "</td>\n";
767
768 //
769 print '<td>&nbsp;</td>';
770
771 // Action column
772 if (!getDolGlobalString('MAIN_CHECKBOX_LEFT_COLUMN')) {
773 print '<td>&nbsp;</td>';
774 }
775
776 print "</tr>\n";
777 $i++;
778 }
779 }
780 $db->free($resql);
781} else {
782 dol_print_error($db);
783}
784
785if ($num == 0 && $numOfBp == 0) {
786 print '<tr class="oddeven"><td colspan="7"><span class="opacitymedium">'.$langs->trans("None").'</span></td></tr>';
787}
788
789print "</table>";
790print '</div>';
791
792// End of page
793llxFooter();
794$db->close();
$id
Definition account.php:48
if( $user->socid > 0) if(! $user->hasRight('accounting', 'chartofaccount')) $object
Definition card.php:66
llxFooter($comment='', $zone='private', $disabledoutputofmessages=0)
Empty footer.
Definition wrapper.php:87
if(!defined('NOREQUIRESOC')) if(!defined( 'NOREQUIRETRAN')) if(!defined('NOTOKENRENEWAL')) if(!defined( 'NOREQUIREMENU')) if(!defined('NOREQUIREHTML')) if(!defined( 'NOREQUIREAJAX')) llxHeader($head='', $title='', $help_url='', $target='', $disablejs=0, $disablehead=0, $arrayofjs='', $arrayofcss='', $morequerystring='', $morecssonbody='', $replacemainareaby='', $disablenofollow=0, $disablenoindex=0)
Empty header.
Definition wrapper.php:71
Class to manage 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 building of HTML components.
Class to manage projects.
Class to manage salary payments.
Class to manage Dolibarr users.
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)
Show tabs of a record.
price2num($amount, $rounding='', $option=0)
Function that return a number with universal decimal format (decimal separator is '.
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.
dol_print_date($time, $format='', $tzoutput='auto', $outputlangs=null, $encodetooutput=false)
Output date in a string format according to outputlangs (or langs if not defined).
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)
Return value of a param into GET or POST supervariable.
dol_print_error($db=null, $error='', $errors=null)
Displays error message system with all the information to facilitate the diagnosis and the escalation...
getDolGlobalString($key, $default='')
Return a Dolibarr global constant string value.
img_edit($titlealt='default', $float=0, $other='')
Show logo edit/modify fiche.
global $conf
The following vars must be defined: $type2label $form $conf, $lang, The following vars may also be de...
Definition member.php:79
restrictedArea(User $user, $features, $object=0, $tableandshare='', $feature2='', $dbt_keyfield='fk_soc', $dbt_select='rowid', $isdraft=0, $mode=0)
Check permissions of a user to show a page and an object.
accessforbidden($message='', $printheader=1, $printfooter=1, $showonlymessage=0, $params=null)
Show a message to say access is forbidden and stop program.