dolibarr 21.0.0-alpha
payment.php
Go to the documentation of this file.
1<?php
2/* Copyright (C) 2015 Alexandre Spangaro <aspangaro@open-dsi.fr>
3 * Copyright (C) 2015 Laurent Destailleur <eldy@users.sourceforge.net>
4 * Copyright (C) 2018-2024 Frédéric France <frederic.france@free.fr>
5 * Copyright (C) 2024 MDW <mdeweerd@users.noreply.github.com>
6 *
7 * This program is free software; you can redistribute it and/or modify
8 * it under the terms of the GNU General Public License as published by
9 * the Free Software Foundation; either version 3 of the License, or
10 * (at your option) any later version.
11 *
12 * This program is distributed in the hope that it will be useful,
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 * GNU General Public License for more details.
16 *
17 * You should have received a copy of the GNU General Public License
18 * along with this program. If not, see <https://www.gnu.org/licenses/>.
19 */
20
27// Load Dolibarr environment
28require '../../main.inc.php';
29require_once DOL_DOCUMENT_ROOT.'/expensereport/class/expensereport.class.php';
30require_once DOL_DOCUMENT_ROOT.'/expensereport/class/paymentexpensereport.class.php';
31require_once DOL_DOCUMENT_ROOT.'/compta/bank/class/account.class.php';
32
33// Load translation files required by the page
34$langs->loadLangs(array('bills', 'banks', 'trips'));
35
36$id = GETPOSTINT('id');
37$ref = GETPOST('ref', 'alpha');
38$action = GETPOST('action', 'aZ09');
39$amounts = array();
40$accountid = GETPOSTINT('accountid');
41$cancel = GETPOST('cancel');
42
43// Security check
44$socid = 0;
45if ($user->socid > 0) {
46 $socid = $user->socid;
47}
48
49$permissiontoadd = $user->hasRight('expensereport', 'creer');
50
51
52/*
53 * Actions
54 */
55
56if ($action == 'add_payment' && $permissiontoadd) {
57 $error = 0;
58
59 if ($cancel) {
60 $loc = DOL_URL_ROOT.'/expensereport/card.php?id='.$id;
61 header("Location: ".$loc);
62 exit;
63 }
64
65 $expensereport = new ExpenseReport($db);
66 $result = $expensereport->fetch($id, $ref);
67 if (!$result) {
68 $error++;
69 setEventMessages($expensereport->error, $expensereport->errors, 'errors');
70 }
71
72 $datepaid = dol_mktime(12, 0, 0, GETPOSTINT("remonth"), GETPOSTINT("reday"), GETPOSTINT("reyear"));
73
74 if (!(GETPOSTINT("fk_typepayment") > 0)) {
75 setEventMessages($langs->trans("ErrorFieldRequired", $langs->transnoentities("PaymentMode")), null, 'errors');
76 $error++;
77 }
78 if ($datepaid == '') {
79 setEventMessages($langs->trans("ErrorFieldRequired", $langs->transnoentities("Date")), null, 'errors');
80 $error++;
81 }
82
83 if (isModEnabled("bank") && !($accountid > 0)) {
84 setEventMessages($langs->trans("ErrorFieldRequired", $langs->transnoentities("AccountToDebit")), null, 'errors');
85 $error++;
86 }
87
88 if (!$error) {
89 $paymentid = 0;
90 // $total = 0;
91
92 // Read possible payments
93 foreach ($_POST as $key => $value) {
94 if (substr($key, 0, 7) == 'amount_') {
95 if (GETPOST($key)) {
96 $amounts[$expensereport->fk_user_author] = (float) price2num(GETPOST($key));
97 // $total += price2num(GETPOST($key));
98 }
99 }
100 }
101
102 if (count($amounts) <= 0) {
103 $error++;
104 setEventMessages('ErrorNoPaymentDefined', null, 'errors');
105 }
106
107 if (!$error) {
108 $db->begin();
109
110 // Create a line of payments
111 $payment = new PaymentExpenseReport($db);
112 $payment->fk_expensereport = $expensereport->id;
113 $payment->datep = $datepaid;
114 $payment->amounts = $amounts; // array of amounts
115 // total is calculated in class
116 // $payment->total = $total;
117 $payment->fk_typepayment = GETPOSTINT("fk_typepayment");
118 $payment->num_payment = GETPOST("num_payment", 'alphanohtml');
119 $payment->note_public = GETPOST("note_public", 'restricthtml');
120 $payment->fk_bank = $accountid;
121
122 if (!$error) {
123 $paymentid = $payment->create($user);
124 if ($paymentid < 0) {
125 setEventMessages($payment->error, $payment->errors, 'errors');
126 $error++;
127 }
128 }
129
130 if (!$error) {
131 $result = $payment->addPaymentToBank($user, 'payment_expensereport', '(ExpenseReportPayment)', $accountid, '', '');
132 if ($result <= 0) {
133 setEventMessages($payment->error, $payment->errors, 'errors');
134 $error++;
135 }
136 }
137
138 if (!$error) {
139 $payment->fetch($paymentid);
140 if ($expensereport->total_ttc - $payment->amount == 0) {
141 $result = $expensereport->setPaid($expensereport->id, $user);
142 if (!($result > 0)) {
143 setEventMessages($payment->error, $payment->errors, 'errors');
144 $error++;
145 }
146 }
147 }
148
149 if (!$error) {
150 $db->commit();
151 $loc = DOL_URL_ROOT.'/expensereport/card.php?id='.$id;
152 header('Location: '.$loc);
153 exit;
154 } else {
155 $db->rollback();
156 }
157 }
158 }
159
160 $action = 'create';
161}
162
163
164/*
165 * View
166 */
167
168llxHeader();
169
170$form = new Form($db);
171
172
173// Form to create expense report payment
174if ($action == 'create' || empty($action)) {
175 $expensereport = new ExpenseReport($db);
176 $expensereport->fetch($id, $ref);
177
178 $total = $expensereport->total_ttc;
179
180 // autofill remainder amount
181 if (!empty($conf->use_javascript_ajax)) {
182 print "\n".'<script type="text/javascript">';
183 //Add js for AutoFill
184 print ' $(document).ready(function () {';
185 print ' $(".AutoFillAmount").on(\'click touchstart\', function(){
186 var amount = $(this).data("value");
187 document.getElementById($(this).data(\'rowid\')).value = amount ;
188 });';
189 print "\t});\n";
190 print "</script>\n";
191 }
192
193 print load_fiche_titre($langs->trans("DoPayment"));
194
195 print '<form name="add_payment" action="'.$_SERVER['PHP_SELF'].'" method="post">';
196 print '<input type="hidden" name="token" value="'.newToken().'">';
197 print '<input type="hidden" name="id" value="'.$expensereport->id.'">';
198 print '<input type="hidden" name="chid" value="'.$expensereport->id.'">';
199 print '<input type="hidden" name="action" value="add_payment">';
200
201 print dol_get_fiche_head([], '0', '', -1);
202
203 $linkback = '';
204 // $linkback = '<a href="' . DOL_URL_ROOT . '/expensereport/payment/list.php">' . $langs->trans("BackToList") . '</a>';
205
206 dol_banner_tab($expensereport, 'ref', $linkback, 1, 'ref', 'ref', '');
207
208 print '<div class="fichecenter">';
209 print '<div class="underbanner clearboth"></div>';
210
211 print '<table class="border centpercent">'."\n";
212
213 print '<tr><td class="titlefield">'.$langs->trans("Period").'</td><td>'.get_date_range($expensereport->date_debut, $expensereport->date_fin, "", $langs, 0).'</td></tr>';
214 print '<tr><td>'.$langs->trans("Amount").'</td><td><span class="amount">'.price($expensereport->total_ttc, 0, $langs, 1, -1, -1, $conf->currency).'</span></td></tr>';
215
216 $sql = "SELECT sum(p.amount) as total";
217 $sql .= " FROM ".MAIN_DB_PREFIX."payment_expensereport as p, ".MAIN_DB_PREFIX."expensereport as e";
218 $sql .= " WHERE p.fk_expensereport = e.rowid AND p.fk_expensereport = ".((int) $id);
219 $sql .= ' AND e.entity IN ('.getEntity('expensereport').')';
220 $resql = $db->query($sql);
221 if ($resql) {
222 $obj = $db->fetch_object($resql);
223 $sumpaid = $obj->total;
224 $db->free($resql);
225 }
226 print '<tr><td>'.$langs->trans("AlreadyPaid").'</td><td><span class="amount">'.price($sumpaid, 0, $langs, 1, -1, -1, $conf->currency).'</span></td></tr>';
227 print '<tr><td class="tdtop">'.$langs->trans("RemainderToPay").'</td><td><span class="amount">'.price($total - $sumpaid, 0, $langs, 1, -1, -1, $conf->currency).'</span></td></tr>';
228
229 print '</table>';
230
231 print '</div>';
232
233 print dol_get_fiche_end();
234
235 print '<br>';
236
237 print dol_get_fiche_head();
238
239 print '<table class="border centpercent">'."\n";
240
241 print '<tr><td class="titlefield fieldrequired">'.$langs->trans("Date").'</td><td colspan="2">';
242 $datepaid = dol_mktime(12, 0, 0, GETPOSTINT("remonth"), GETPOSTINT("reday"), GETPOSTINT("reyear"));
243 $datepayment = ($datepaid == '' ? (!getDolGlobalString('MAIN_AUTOFILL_DATE') ? -1 : '') : $datepaid);
244 print $form->selectDate($datepayment, '', 0, 0, 0, "add_payment", 1, 1);
245 print "</td>";
246 print '</tr>';
247
248 print '<tr><td class="fieldrequired">'.$langs->trans("PaymentMode").'</td><td colspan="2">';
249 $form->select_types_paiements(GETPOSTISSET("fk_typepayment") ? GETPOST("fk_typepayment", 'alpha') : $expensereport->fk_c_paiement, "fk_typepayment");
250 print "</td>\n";
251 print '</tr>';
252
253 if (isModEnabled("bank")) {
254 print '<tr>';
255 print '<td class="fieldrequired">'.$langs->trans('AccountToDebit').'</td>';
256 print '<td colspan="2">';
257 print img_picto('', 'bank_account', 'class="pictofixedwidth"');
258 $form->select_comptes(GETPOSTISSET("accountid") ? GETPOSTINT("accountid") : 0, "accountid", 0, '', 2); // Show open bank account list
259 print '</td></tr>';
260 }
261
262 // Number
263 print '<tr><td>'.$langs->trans('Numero');
264 print ' <em>('.$langs->trans("ChequeOrTransferNumber").')</em>';
265 print '</td>';
266 print '<td colspan="2"><input name="num_payment" type="text" value="'.GETPOST('num_payment').'"></td></tr>'."\n";
267
268 print '<tr>';
269 print '<td class="tdtop">'.$langs->trans("Comments").'</td>';
270 print '<td valign="top" colspan="2"><textarea name="note_public" wrap="soft" cols="60" rows="'.ROWS_3.'"></textarea></td>';
271 print '</tr>';
272
273 print '</table>';
274
275 print dol_get_fiche_end();
276
277 print '<br>';
278
279 // List of expenses ereport not already paid completely
280 $num = 1;
281 $i = 0;
282
283 print '<table class="noborder centpercent">';
284 print '<tr class="liste_titre">';
285 print '<td>'.$langs->trans("ExpenseReport").'</td>';
286 print '<td class="right">'.$langs->trans("Amount").'</td>';
287 print '<td class="right">'.$langs->trans("AlreadyPaid").'</td>';
288 print '<td class="right">'.$langs->trans("RemainderToPay").'</td>';
289 print '<td class="center">'.$langs->trans("Amount").'</td>';
290 print "</tr>\n";
291
292 $total_ttc = 0;
293 $totalrecu = 0;
294
295 while ($i < $num) {
296 $objp = $expensereport;
297
298 print '<tr class="oddeven">';
299
300 print '<td>'.$expensereport->getNomUrl(1)."</td>";
301 print '<td class="right">'.price($objp->total_ttc)."</td>";
302 print '<td class="right">'.price($sumpaid)."</td>";
303 print '<td class="right">'.price($objp->total_ttc - $sumpaid)."</td>";
304 print '<td class="center">';
305 if ($sumpaid < $objp->total_ttc) {
306 $namef = "amount_".$objp->id;
307 $nameRemain = "remain_".$objp->id; // autofill remainder amount
308 if (!empty($conf->use_javascript_ajax)) { // autofill remainder amount
309 print img_picto("Auto fill", 'rightarrow', "class='AutoFillAmount' data-rowid='".$namef."' data-value='".($objp->total_ttc - $sumpaid)."'"); // autofill remainder amount
310 }
311 $remaintopay = $objp->total_ttc - $sumpaid; // autofill remainder amount
312 print '<input type=hidden class="sum_remain" name="'.$nameRemain.'" value="'.$remaintopay.'">'; // autofill remainder amount
313 print '<input type="text" class="width75" name="'.$namef.'" id="'.$namef.'" value="'.GETPOST($namef).'">';
314 } else {
315 print '-';
316 }
317 print "</td>";
318
319 print "</tr>\n";
320
321 $total_ttc += $objp->total_ttc;
322 $totalrecu += $sumpaid;
323 $i++;
324 }
325 if ($i > 1) {
326 // Print total
327 print '<tr class="oddeven">';
328 print '<td colspan="2" class="left">'.$langs->trans("Total").':</td>';
329 print '<td class="right"><b>'.price($total_ttc).'</b></td>';
330 print '<td class="right"><b>'.price($totalrecu).'</b></td>';
331 print '<td class="right"><b>'.price($total_ttc - $totalrecu).'</b></td>';
332 print '<td class="center">&nbsp;</td>';
333 print "</tr>\n";
334 }
335
336 print "</table>";
337
338 print $form->buttonsSaveCancel();
339
340 print "</form>\n";
341}
342
343// End of page
344llxFooter();
345$db->close();
$id
Definition account.php:39
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:70
Class to manage Trips and Expenses.
Class to manage generation of HTML components Only common components must be here.
Class to manage payments of expense report.
llxFooter()
Footer empty.
Definition document.php:107
dol_mktime($hour, $minute, $second, $month, $day, $year, $gm='auto', $check=1)
Return a timestamp date built from detailed information (by default a local PHP server timestamp) Rep...
load_fiche_titre($title, $morehtmlright='', $picto='generic', $pictoisfullpath=0, $id='', $morecssontable='', $morehtmlcenter='')
Load a title with picto.
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)
Show picto whatever it's its name (generic function)
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.
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.
get_date_range($date_start, $date_end, $format='', $outputlangs=null, $withparenthesis=1)
Format output for start and end date.
GETPOST($paramname, $check='alphanohtml', $method=0, $filter=null, $options=null, $noreplace=0)
Return value of a param into GET or POST supervariable.
getDolGlobalString($key, $default='')
Return a Dolibarr global constant string value.