dolibarr 24.0.0-beta
card.php
Go to the documentation of this file.
1<?php
2/* Copyright (C) 2014-2025 Alexandre Spangaro <alexandre@inovea-conseil.com>
3 * Copyright (C) 2015-2026 Frédéric France <frederic.france@free.fr>
4 * Copyright (C) 2017 Laurent Destailleur <eldy@users.sourceforge.net>
5 * Copyright (C) 2020 Maxime DEMAREST <maxime@indelog.fr>
6 * Copyright (C) 2024-2025 MDW <mdeweerd@users.noreply.github.com>
7 *
8 * This program is free software; you can redistribute it and/or modify
9 * it under the terms of the GNU General Public License as published by
10 * the Free Software Foundation; either version 3 of the License, or
11 * (at your option) any later version.
12 *
13 * This program is distributed in the hope that it will be useful,
14 * but WITHOUT ANY WARRANTY; without even the implied warranty of
15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 * GNU General Public License for more details.
17 *
18 * You should have received a copy of the GNU General Public License
19 * along with this program. If not, see <https://www.gnu.org/licenses/>.
20 */
21
28// Load Dolibarr environment
29require '../main.inc.php';
37require_once DOL_DOCUMENT_ROOT.'/compta/bank/class/account.class.php';
38require_once DOL_DOCUMENT_ROOT.'/core/class/html.formprojet.class.php';
39require_once DOL_DOCUMENT_ROOT.'/core/lib/date.lib.php';
40require_once DOL_DOCUMENT_ROOT.'/core/lib/files.lib.php';
41require_once DOL_DOCUMENT_ROOT.'/core/lib/loan.lib.php';
42require_once DOL_DOCUMENT_ROOT.'/loan/class/loan.class.php';
43
44if (isModEnabled('accounting')) {
45 require_once DOL_DOCUMENT_ROOT.'/core/class/html.formaccounting.class.php';
46 require_once DOL_DOCUMENT_ROOT.'/accountancy/class/accountingaccount.class.php';
47}
48
49if (isModEnabled('project')) {
50 require_once DOL_DOCUMENT_ROOT.'/projet/class/project.class.php';
51}
52
53// Load translation files required by the page
54$langs->loadLangs(array("banks", "bills", "compta", "loan"));
55
56$id = GETPOSTINT('id');
57$action = GETPOST('action', 'aZ09');
58$confirm = GETPOST('confirm');
59$cancel = GETPOST('cancel', 'alpha');
60
61$projectid = GETPOSTINT('projectid');
62
63// Security check
64/*
65$socid = GETPOSTINT('socid');
66if ($user->socid) {
67 $socid = $user->socid;
68} */
69$hookmanager->initHooks(array('loancard', 'globalcard'));
70$result = restrictedArea($user, 'loan', $id, '', '');
71
72$object = new Loan($db);
73
74$permissiontoadd = $user->hasRight('loan', 'write');
75
76$error = 0;
77$staytopay = 0;
78
79
80/*
81 * Actions
82 */
83
84$parameters = array();
85$reshook = $hookmanager->executeHooks('doActions', $parameters, $object, $action); // Note that $action and $object may have been modified by some hooks
86if ($reshook < 0) {
87 setEventMessages($hookmanager->error, $hookmanager->errors, 'errors');
88}
89if (empty($reshook)) {
90 // Classify paid
91 if ($action == 'confirm_paid' && $confirm == 'yes' && $permissiontoadd) {
92 $object->fetch($id);
93 $result = $object->setPaid($user);
94 if ($result > 0) {
95 setEventMessages($langs->trans('LoanPaid'), null, 'mesgs');
96 } else {
97 setEventMessages($object->error, $object->errors, 'errors');
98 }
99 }
100
101 // Delete loan
102 if ($action == 'confirm_delete' && $confirm == 'yes' && $permissiontoadd) {
103 $object->fetch($id);
104 $result = $object->delete($user);
105 if ($result > 0) {
106 setEventMessages($langs->trans('LoanDeleted'), null, 'mesgs');
107 header("Location: list.php");
108 exit;
109 } else {
110 setEventMessages($object->error, $object->errors, 'errors');
111 }
112 }
113
114 // Add loan
115 if ($action == 'add' && $permissiontoadd) {
116 if (!$cancel) {
117 $datestart = dol_mktime(12, 0, 0, GETPOSTINT('startmonth'), GETPOSTINT('startday'), GETPOSTINT('startyear'));
118 $dateend = dol_mktime(12, 0, 0, GETPOSTINT('endmonth'), GETPOSTINT('endday'), GETPOSTINT('endyear'));
119
120 $capital = GETPOSTFLOAT('capital');
121 $rate = GETPOSTFLOAT('rate');
122
123 if (!$capital) {
124 $error++;
125 $action = 'create';
126 setEventMessages($langs->trans("ErrorFieldRequired", $langs->transnoentities("LoanCapital")), null, 'errors');
127 }
128 if (!$datestart) {
129 $error++;
130 $action = 'create';
131 setEventMessages($langs->trans("ErrorFieldRequired", $langs->transnoentities("DateStart")), null, 'errors');
132 }
133 if (!$dateend) {
134 $error++;
135 $action = 'create';
136 setEventMessages($langs->trans("ErrorFieldRequired", $langs->transnoentities("DateEnd")), null, 'errors');
137 }
138 if ($rate == '') {
139 $error++;
140 $action = 'create';
141 setEventMessages($langs->trans("ErrorFieldRequired", $langs->transnoentities("Rate")), null, 'errors');
142 }
143
144 if (!$error) {
145 $object->label = GETPOST('label');
146 $object->fk_bank = GETPOSTINT('accountid');
147 $object->capital = $capital;
148 $object->datestart = $datestart;
149 $object->dateend = $dateend;
150 $object->nbterm = (float) price2num(GETPOST('nbterm'));
151 $object->rate = $rate;
152 $object->note_private = GETPOST('note_private', 'restricthtml');
153 $object->note_public = GETPOST('note_public', 'restricthtml');
154 $object->fk_project = GETPOSTINT('projectid');
155 $object->insurance_amount = GETPOSTFLOAT('insurance_amount');
156
157 $accountancy_account_capital = GETPOST('accountancy_account_capital');
158 $accountancy_account_insurance = GETPOST('accountancy_account_insurance');
159 $accountancy_account_interest = GETPOST('accountancy_account_interest');
160
161 if ($accountancy_account_capital <= 0) {
162 $object->account_capital = '';
163 } else {
164 $object->account_capital = $accountancy_account_capital;
165 }
166 if ($accountancy_account_insurance <= 0) {
167 $object->account_insurance = '';
168 } else {
169 $object->account_insurance = $accountancy_account_insurance;
170 }
171 if ($accountancy_account_interest <= 0) {
172 $object->account_interest = '';
173 } else {
174 $object->account_interest = $accountancy_account_interest;
175 }
176
177 $id = $object->create($user);
178 if ($id <= 0) {
179 $error++;
180 setEventMessages($object->error, $object->errors, 'errors');
181 $action = 'create';
182 }
183 }
184 } else {
185 header("Location: list.php");
186 exit();
187 }
188 } elseif ($action == 'update' && $permissiontoadd) {
189 // Update record
190 if (!$cancel) {
191 $result = $object->fetch($id);
192
193 $datestart = dol_mktime(12, 0, 0, GETPOSTINT('startmonth'), GETPOSTINT('startday'), GETPOSTINT('startyear'));
194 $dateend = dol_mktime(12, 0, 0, GETPOSTINT('endmonth'), GETPOSTINT('endday'), GETPOSTINT('endyear'));
195
196 $capital = GETPOSTFLOAT('capital');
197
198 if (!$capital) {
199 setEventMessages($langs->trans("ErrorFieldRequired", $langs->transnoentities("LoanCapital")), null, 'errors');
200 $action = 'edit';
201 } else {
202 $object->datestart = $datestart;
203 $object->dateend = $dateend;
204 $object->capital = $capital;
205
206 $object->nbterm = GETPOSTINT("nbterm");
207 $object->rate = GETPOSTFLOAT("rate");
208 $object->insurance_amount = GETPOSTFLOAT('insurance_amount');
209
210 $accountancy_account_capital = GETPOST('accountancy_account_capital');
211 $accountancy_account_insurance = GETPOST('accountancy_account_insurance');
212 $accountancy_account_interest = GETPOST('accountancy_account_interest');
213
214 if ($accountancy_account_capital <= 0) {
215 $object->account_capital = '';
216 } else {
217 $object->account_capital = $accountancy_account_capital;
218 }
219 if ($accountancy_account_insurance <= 0) {
220 $object->account_insurance = '';
221 } else {
222 $object->account_insurance = $accountancy_account_insurance;
223 }
224 if ($accountancy_account_interest <= 0) {
225 $object->account_interest = '';
226 } else {
227 $object->account_interest = $accountancy_account_interest;
228 }
229 }
230
231 $result = $object->update($user);
232
233 if ($result > 0) {
234 header("Location: ".$_SERVER["PHP_SELF"]."?id=".$id);
235 exit;
236 } else {
237 $error++;
238 setEventMessages($object->error, $object->errors, 'errors');
239 }
240 } else {
241 header("Location: ".$_SERVER["PHP_SELF"]."?id=".$id);
242 exit;
243 }
244 }
245
246 // Link to a project
247 if ($action == 'classin' && $permissiontoadd) {
248 $object->fetch($id);
249 $result = $object->setProject($projectid);
250 if ($result < 0) {
251 setEventMessages($object->error, $object->errors, 'errors');
252 }
253 }
254
255 if ($action == 'setlabel' && $permissiontoadd) {
256 $object->fetch($id);
257 $result = $object->setValueFrom('label', GETPOST('label'), '', null, 'text', '', $user, 'LOAN_MODIFY');
258 if ($result < 0) {
259 setEventMessages($object->error, $object->errors, 'errors');
260 }
261 }
262
263 // Actions to build doc
264 include DOL_DOCUMENT_ROOT.'/core/actions_builddoc.inc.php';
265}
266
267
268/*
269 * View
270 */
271
272$form = new Form($db);
273$formproject = new FormProjets($db);
274$morehtmlstatus = '';
275$outputlangs = $langs;
276$formaccounting = null;
277if (isModEnabled('accounting')) {
278 $formaccounting = new FormAccounting($db);
279}
280$title = $langs->trans("Loan").' - '.$langs->trans("Card");
281$help_url = 'EN:Module_Loan|FR:Module_Emprunt';
282
283llxHeader("", $title, $help_url, '', 0, 0, '', '', '', 'mod-loan page-card');
284
285
286// Create mode
287if ($action == 'create') {
288 //WYSIWYG Editor
289 require_once DOL_DOCUMENT_ROOT.'/core/class/doleditor.class.php';
290
291 print load_fiche_titre($langs->trans("NewLoan"), '', 'money-bill-alt');
292
293 print '<form name="loan" method="POST" action="'.$_SERVER["PHP_SELF"].'">'."\n";
294 print '<input type="hidden" name="token" value="'.newToken().'">';
295 print '<input type="hidden" name="action" value="add">';
296
297 print dol_get_fiche_head();
298
299 print '<table class="border centpercent">';
300
301 // Label
302 print '<tr><td class="fieldrequired titlefieldcreate">'.$langs->trans("Label").'</td><td><input name="label" class="minwidth300" maxlength="255" value="'.dol_escape_htmltag(GETPOST('label')).'" autofocus="autofocus"></td></tr>';
303
304 // Bank account
305 if (isModEnabled("bank")) {
306 print '<tr><td class="fieldrequired">'.$langs->trans("BankAccount").'</td><td>';
307 $form->select_comptes(GETPOST("accountid"), "accountid", 0, "(courant:=:1)", 1); // Show list of bank account with courant
308 print '</td></tr>';
309 } else {
310 print '<tr><td>'.$langs->trans("BankAccount").'</td><td>';
311 print $langs->trans("NoBankAccountDefined");
312 print '</td></tr>';
313 }
314
315 // Capital
316 print '<tr><td class="fieldrequired">'.$langs->trans("LoanCapital").'</td><td><input name="capital" size="10" value="'.dol_escape_htmltag(GETPOST("capital")).'"></td></tr>';
317
318 // Date Start
319 print "<tr>";
320 print '<td class="fieldrequired">'.$langs->trans("DateStart").'</td><td>';
321 print $form->selectDate(!empty($datestart) ? $datestart : -1, 'start', 0, 0, 0, 'add', 1, 1);
322 print '</td></tr>';
323
324 // Date End
325 print "<tr>";
326 print '<td class="fieldrequired">'.$langs->trans("DateEnd").'</td><td>';
327 print $form->selectDate(!empty($dateend) ? $dateend : -1, 'end', 0, 0, 0, 'add', 1, 1);
328 print '</td></tr>';
329
330 // Number of terms
331 print '<tr><td class="fieldrequired">'.$langs->trans("Nbterms").'</td><td><input name="nbterm" size="5" value="'.dol_escape_htmltag(GETPOST('nbterm')).'"></td></tr>';
332
333 // Rate
334 print '<tr><td class="fieldrequired">'.$langs->trans("Rate").'</td><td><input name="rate" size="5" value="'.dol_escape_htmltag(GETPOST("rate")).'"> %</td></tr>';
335
336 // Insurance amount
337 print '<tr><td>'.$langs->trans("Insurance").'</td><td><input name="insurance_amount" size="10" value="'.dol_escape_htmltag(GETPOST("insurance_amount")).'" placeholder="'.$langs->trans('Amount').'"></td></tr>';
338
339 // Project
340 if (isModEnabled('project')) {
341 $formproject = new FormProjets($db);
342
343 // Linked Project
344 $langs->loadLangs(array("projects"));
345
346 print '<tr><td>'.$langs->trans("Project").'</td><td>';
347
348 $formproject->select_projects(-1, (string) $projectid, 'projectid', 16, 0, 1, 1);
349
350 print '</td></tr>';
351 }
352
353 // Note Private
354 print '<tr>';
355 print '<td class="tdtop">'.$langs->trans('NotePrivate').'</td>';
356 print '<td>';
357
358 $doleditor = new DolEditor('note_private', GETPOST('note_private', 'alpha'), '', 160, 'dolibarr_notes', 'In', false, true, !getDolGlobalString('FCKEDITOR_ENABLE_NOTE_PUBLIC') ? 0 : 1, ROWS_6, '90%');
359 print $doleditor->Create(1);
360
361 print '</td></tr>';
362
363 // Note Public
364 print '<tr>';
365 print '<td class="tdtop">'.$langs->trans('NotePublic').'</td>';
366 print '<td>';
367 $doleditor = new DolEditor('note_public', GETPOST('note_public', 'alpha'), '', 160, 'dolibarr_notes', 'In', false, true, !getDolGlobalString('FCKEDITOR_ENABLE_NOTE_PRIVATE') ? 0 : 1, ROWS_6, '90%');
368 print $doleditor->Create(1);
369 print '</td></tr>';
370
371 // Accountancy
372 if (isModEnabled('accounting') && $formaccounting !== null) {
374 // Accountancy_account_capital
375 print '<tr><td class="titlefieldcreate fieldrequired">'.$langs->trans("LoanAccountancyCapitalCode").'</td>';
376 print '<td>';
377 print $formaccounting->select_account(GETPOST('accountancy_account_capital') ? GETPOST('accountancy_account_capital') : getDolGlobalString('LOAN_ACCOUNTING_ACCOUNT_CAPITAL'), 'accountancy_account_capital', 1, array(), 1, 1);
378 print '</td></tr>';
379
380 // Accountancy_account_insurance
381 print '<tr><td class="fieldrequired">'.$langs->trans("LoanAccountancyInsuranceCode").'</td>';
382 print '<td>';
383 print $formaccounting->select_account(GETPOST('accountancy_account_insurance') ? GETPOST('accountancy_account_insurance') : getDolGlobalString('LOAN_ACCOUNTING_ACCOUNT_INSURANCE'), 'accountancy_account_insurance', 1, array(), 1, 1);
384 print '</td></tr>';
385
386 // Accountancy_account_interest
387 print '<tr><td class="fieldrequired">'.$langs->trans("LoanAccountancyInterestCode").'</td>';
388 print '<td>';
389 print $formaccounting->select_account(GETPOST('accountancy_account_interest') ? GETPOST('accountancy_account_interest') : getDolGlobalString('LOAN_ACCOUNTING_ACCOUNT_INTEREST'), 'accountancy_account_interest', 1, array(), 1, 1);
390 print '</td></tr>';
391 } else {
392 // For external software
393 // Accountancy_account_capital
394 print '<tr><td class="titlefieldcreate">'.$langs->trans("LoanAccountancyCapitalCode").'</td>';
395 print '<td><input name="accountancy_account_capital" size="16" value="'.$object->accountancy_account_capital.'">';
396 print '</td></tr>';
397
398 // Accountancy_account_insurance
399 print '<tr><td>'.$langs->trans("LoanAccountancyInsuranceCode").'</td>';
400 print '<td><input name="accountancy_account_insurance" size="16" value="'.$object->accountancy_account_insurance.'">';
401 print '</td></tr>';
402
403 // Accountancy_account_interest
404 print '<tr><td>'.$langs->trans("LoanAccountancyInterestCode").'</td>';
405 print '<td><input name="accountancy_account_interest" size="16" value="'.$object->accountancy_account_interest.'">';
406 print '</td></tr>';
407 }
408 print '</table>';
409
410 print dol_get_fiche_end();
411
412 print $form->buttonsSaveCancel("Add");
413
414 print '</form>';
415}
416
417// View
418if ($id > 0) {
419 $object = new Loan($db);
420 $result = $object->fetch($id);
421
422 if ($result > 0) {
423 $head = loan_prepare_head($object);
424
425 $totalpaid = $object->getSumPayment();
426
427 // Confirm for loan
428 if ($action == 'paid') {
429 $text = $langs->trans('ConfirmPayLoan');
430 print $form->formconfirm($_SERVER["PHP_SELF"]."?id=".$object->id, $langs->trans('PayLoan'), $text, "confirm_paid", '', '', 2);
431 }
432
433 if ($action == 'delete') {
434 $text = $langs->trans('ConfirmDeleteLoan');
435 print $form->formconfirm($_SERVER['PHP_SELF'].'?id='.$object->id, $langs->trans('DeleteLoan'), $text, 'confirm_delete', '', '', 2);
436 }
437
438 if ($action == 'edit') {
439 print '<form name="update" action="'.$_SERVER["PHP_SELF"].'" method="POST">'."\n";
440 print '<input type="hidden" name="token" value="'.newToken().'">';
441 print '<input type="hidden" name="action" value="update">';
442 print '<input type="hidden" name="id" value="'.$id.'">';
443 }
444
445 print dol_get_fiche_head($head, 'card', $langs->trans("Loan"), -1, 'money-bill-alt', 0, '', '', 0, '', 1);
446
447 // Loan card
448 $linkback = '<a href="'.DOL_URL_ROOT.'/loan/list.php?restore_lastsearch_values=1">'.$langs->trans("BackToList").'</a>';
449
450 $morehtmlref = '<div class="refidno">';
451 // Ref loan
452 $morehtmlref .= $form->editfieldkey("Label", 'label', $object->label, $object, $user->hasRight('loan', 'write'), 'string', '', 0, 1);
453 $morehtmlref .= $form->editfieldval("Label", 'label', $object->label, $object, $user->hasRight('loan', 'write'), 'string', '', null, null, '', 1);
454 // Project
455 if (isModEnabled('project')) {
456 $langs->loadLangs(array("projects"));
457 $morehtmlref .= '<br>'.$langs->trans('Project').' ';
458 if ($user->hasRight('loan', 'write')) {
459 if ($action != 'classify') {
460 $morehtmlref .= '<a class="editfielda" href="'.dolBuildUrl($_SERVER['PHP_SELF'], ['action' => 'classify', 'id' => $object->id], true).'">'.img_edit($langs->transnoentitiesnoconv('SetProject')).'</a> : ';
461 }
462 if ($action == 'classify') {
463 $maxlength = 0;
464 //$morehtmlref.=$form->form_project($_SERVER['PHP_SELF'] . '?id=' . $object->id, $object->socid, $object->fk_project, 'projectid', 0, 0, 1, 1);
465 $morehtmlref .= '<form method="post" action="'.$_SERVER['PHP_SELF'].'?id='.$object->id.'">';
466 $morehtmlref .= '<input type="hidden" name="action" value="classin">';
467 $morehtmlref .= '<input type="hidden" name="token" value="'.newToken().'">';
468 $morehtmlref .= $formproject->select_projects(-1, (string) $object->fk_project, 'projectid', $maxlength, 0, 1, 0, 1, 0, 0, '', 1);
469 $morehtmlref .= '<input type="submit" class="button valignmiddle" value="'.$langs->trans("Modify").'">';
470 $morehtmlref .= '</form>';
471 } else {
472 $morehtmlref .= $form->form_project($_SERVER['PHP_SELF'].'?id='.$object->id, -1, (string) $object->fk_project, 'none', 0, 0, 0, 1, '', 'maxwidth300');
473 }
474 } else {
475 if (!empty($object->fk_project)) {
476 $proj = new Project($db);
477 $proj->fetch($object->fk_project);
478 $morehtmlref .= ' : '.$proj->getNomUrl(1);
479 if ($proj->title) {
480 $morehtmlref .= ' - '.$proj->title;
481 }
482 } else {
483 $morehtmlref .= '';
484 }
485 }
486 }
487 $morehtmlref .= '</div>';
488
489 $object->totalpaid = $totalpaid; // To give a chance to dol_banner_tab to use already paid amount to show correct status
490
491 dol_banner_tab($object, 'id', $linkback, 1, 'rowid', 'ref', $morehtmlref, '', 0, '', $morehtmlstatus);
492
493 print '<div class="fichecenter">';
494 print '<div class="fichehalfleft">';
495 print '<div class="underbanner clearboth"></div>';
496
497 print '<table class="border centpercent tableforfield">';
498
499 // Capital
500 if ($action == 'edit') {
501 print '<tr><td class="fieldrequired titlefield">'.$langs->trans("LoanCapital").'</td><td>';
502 print '<input name="capital" size="10" value="'.$object->capital.'"></td></tr>';
503 print '</td></tr>';
504 } else {
505 print '<tr><td class="titlefield">'.$langs->trans("LoanCapital").'</td><td><span class="amount">'.price($object->capital, 0, $outputlangs, 1, -1, -1, $conf->currency).'</span></td></tr>';
506 }
507
508 // Insurance
509 if ($action == 'edit') {
510 print '<tr><td class="titlefield">'.$langs->trans("Insurance").'</td><td>';
511 print '<input name="insurance_amount" size="10" value="'.$object->insurance_amount.'"></td></tr>';
512 print '</td></tr>';
513 } else {
514 print '<tr><td class="titlefield">'.$langs->trans("Insurance").'</td><td><span class="amount">'.price($object->insurance_amount, 0, $outputlangs, 1, -1, -1, $conf->currency).'</span></td></tr>';
515 }
516
517 // Date start
518 print '<tr><td>'.$langs->trans("DateStart")."</td>";
519 print "<td>";
520 if ($action == 'edit') {
521 print $form->selectDate($object->datestart, 'start', 0, 0, 0, 'update', 1, 0);
522 } else {
523 print dol_print_date($object->datestart, "day");
524 }
525 print "</td></tr>";
526
527 // Date end
528 print '<tr><td>'.$langs->trans("DateEnd")."</td>";
529 print "<td>";
530 if ($action == 'edit') {
531 print $form->selectDate($object->dateend, 'end', 0, 0, 0, 'update', 1, 0);
532 } else {
533 print dol_print_date($object->dateend, "day");
534 }
535 print "</td></tr>";
536
537 // Nbterms
538 print '<tr><td>'.$langs->trans("Nbterms").'</td>';
539 print '<td>';
540 if ($action == 'edit') {
541 print '<input name="nbterm" size="4" value="'.$object->nbterm.'">';
542 } else {
543 print $object->nbterm;
544 }
545 print '</td></tr>';
546
547 // Rate
548 print '<tr><td>'.$langs->trans("Rate").'</td>';
549 print '<td>';
550 if ($action == 'edit') {
551 print '<input name="rate" size="4" value="'.$object->rate.'">%';
552 } else {
553 print price($object->rate).'%';
554 }
555 print '</td></tr>';
556
557 // Accountancy account capital
558 print '<tr>';
559 if ($action == 'edit') {
560 print '<td class="nowrap fieldrequired">';
561 print $langs->trans("LoanAccountancyCapitalCode");
562 print '</td><td>';
563
564 if (isModEnabled('accounting') && $formaccounting !== null) {
566 print $formaccounting->select_account($object->account_capital, 'accountancy_account_capital', 1, array(), 1, 1);
567 } else {
568 print '<input name="accountancy_account_capital" size="16" value="'.$object->account_capital.'">';
569 }
570 print '</td>';
571 } else {
572 print '<td class="nowrap">';
573 print $langs->trans("LoanAccountancyCapitalCode");
574 print '</td><td>';
575
576 if (isModEnabled('accounting')) {
577 $accountingaccount = new AccountingAccount($db);
578 $accountingaccount->fetch(0, $object->account_capital, 1);
579
580 print $accountingaccount->getNomUrl(0, 1, 1, '', 1);
581 } else {
582 print $object->account_capital;
583 }
584
585 print '</td>';
586 }
587 print '</tr>';
588
589 // Accountancy account insurance
590 print '<tr>';
591 if ($action == 'edit') {
592 print '<td class="nowrap fieldrequired">';
593 print $langs->trans("LoanAccountancyInsuranceCode");
594 print '</td><td>';
595
596 if (isModEnabled('accounting') && $formaccounting !== null) {
598 print $formaccounting->select_account($object->account_insurance, 'accountancy_account_insurance', 1, array(), 1, 1);
599 } else {
600 print '<input name="accountancy_account_insurance" size="16" value="'.$object->account_insurance.'">';
601 }
602 print '</td>';
603 } else {
604 print '<td class="nowrap">';
605 print $langs->trans("LoanAccountancyInsuranceCode");
606 print '</td><td>';
607
608 if (isModEnabled('accounting')) {
609 $accountingaccount = new AccountingAccount($db);
610 $accountingaccount->fetch(0, $object->account_insurance, 1);
611
612 print $accountingaccount->getNomUrl(0, 1, 1, '', 1);
613 } else {
614 print $object->account_insurance;
615 }
616
617 print '</td>';
618 }
619 print '</tr>';
620
621 // Accountancy account interest
622 print '<tr>';
623 if ($action == 'edit') {
624 print '<td class="nowrap fieldrequired">';
625 print $langs->trans("LoanAccountancyInterestCode");
626 print '</td><td>';
627
628 if (isModEnabled('accounting') && $formaccounting !== null) {
630 print $formaccounting->select_account($object->account_interest, 'accountancy_account_interest', 1, array(), 1, 1);
631 } else {
632 print '<input name="accountancy_account_interest" size="16" value="'.$object->account_interest.'">';
633 }
634 print '</td>';
635 } else {
636 print '<td class="nowrap">';
637 print $langs->trans("LoanAccountancyInterestCode");
638 print '</td><td>';
639
640 if (isModEnabled('accounting')) {
641 $accountingaccount = new AccountingAccount($db);
642 $accountingaccount->fetch(0, $object->account_interest, 1);
643
644 print $accountingaccount->getNomUrl(0, 1, 1, '', 1);
645 } else {
646 print $object->account_interest;
647 }
648
649 print '</td>';
650 }
651 print '</tr>';
652
653 // Other attributes
654 $parameters = array();
655 $reshook = $hookmanager->executeHooks('formObjectOptions', $parameters, $object, $action); // Note that $action and $object may have been modified by hook
656 print $hookmanager->resPrint;
657
658 print '</table>';
659
660 print '</div>';
661 print '<div class="fichehalfright">';
662
663 /*
664 * Payments
665 */
666 $sql = "SELECT p.rowid, p.num_payment, p.datep as dp,";
667 $sql .= " p.amount_capital, p.amount_insurance, p.amount_interest,";
668 $sql .= " b.fk_account,";
669 $sql .= " c.libelle as paiement_type";
670 $sql .= " FROM ".MAIN_DB_PREFIX."payment_loan as p";
671 $sql .= " LEFT JOIN ".MAIN_DB_PREFIX."bank as b ON p.fk_bank = b.rowid";
672 $sql .= " LEFT JOIN ".MAIN_DB_PREFIX."c_paiement as c ON p.fk_typepayment = c.id,";
673 $sql .= " ".MAIN_DB_PREFIX."loan as l";
674 $sql .= " WHERE p.fk_loan = ".((int) $id);
675 $sql .= " AND p.fk_loan = l.rowid";
676 $sql .= " AND l.entity IN ( ".getEntity('loan').")";
677 $sql .= " ORDER BY dp DESC";
678
679 //print $sql;
680 $resql = $db->query($sql);
681 if ($resql) {
682 $num = $db->num_rows($resql);
683 $i = 0;
684 $total_capital = 0;
685
686 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
687 print '<table class="noborder paymenttable">';
688 print '<tr class="liste_titre">';
689 print '<td>'.$langs->trans("RefPayment").'</td>';
690 print '<td>'.$langs->trans("Date").'</td>';
691 print '<td>'.$langs->trans("Type").'</td>';
692 print '<td>'.$langs->trans("BankAccount").'</td>';
693 print '<td class="right">'.$langs->trans("Insurance").'</td>';
694 print '<td class="right">'.$langs->trans("Interest").'</td>';
695 print '<td class="right">'.$langs->trans("LoanCapital").'</td>';
696 print '<td class="right">'.$langs->trans("Total").'</td>';
697 print '</tr>';
698
699 $conf->cache['bankaccount'] = array();
700
701 while ($i < $num) {
702 $objp = $db->fetch_object($resql);
703
704 print '<tr class="oddeven">';
705 print '<td><a href="'.DOL_URL_ROOT.'/loan/payment/card.php?id='.$objp->rowid.'">'.img_object($langs->trans("Payment"), "payment").' '.$objp->rowid.'</a></td>';
706 print '<td>'.dol_print_date($db->jdate($objp->dp), 'day')."</td>\n";
707 print "<td>".$objp->paiement_type.' '.$objp->num_payment."</td>\n";
708 print "<td>";
709 if (!empty($conf->cache['bankaccount'][$objp->fk_account])) {
710 $tmpbank = $conf->cache['bankaccount'][$objp->fk_account];
711 } else {
712 $tmpbank = new Account($db);
713 $tmpbank->fetch($objp->fk_account);
714 $conf->cache['bankaccount'][$objp->fk_account] = $tmpbank;
715 }
716 print $tmpbank->getNomUrl(1);
717 print "</td>\n";
718 print '<td class="nowrap right"><span class="amount">'.price($objp->amount_insurance, 0, $outputlangs, 1, -1, -1, $conf->currency)."</span></td>\n";
719 print '<td class="nowrap right"><span class="amount">'.price($objp->amount_interest, 0, $outputlangs, 1, -1, -1, $conf->currency)."</span></td>\n";
720 print '<td class="nowrap right"><span class="amount">'.price($objp->amount_capital, 0, $outputlangs, 1, -1, -1, $conf->currency)."</span></td>\n";
721 print '<td class="nowrap right"><span class="amount">'.price($objp->amount_insurance + $objp->amount_interest + $objp->amount_capital, 0, $outputlangs, 1, -1, -1, $conf->currency)."</span></td>\n";
722 print "</tr>";
723 $total_capital += $objp->amount_capital;
724 $i++;
725 }
726
727 $totalpaid = $total_capital;
728
729 if ($object->paid == 0 || $object->paid == 2) {
730 print '<tr><td colspan="6" class="right">'.$langs->trans("AlreadyPaid").' :</td><td class="nowrap right">'.price($totalpaid, 0, $langs, 0, -1, -1, $conf->currency).'</td><td>&nbsp;</td></tr>';
731 print '<tr><td colspan="6" class="right">'.$langs->trans("AmountExpected").' :</td><td class="nowrap right">'.price($object->capital, 0, $outputlangs, 1, -1, -1, $conf->currency).'</td><td>&nbsp;</td></tr>';
732
733 $staytopay = $object->capital - $totalpaid;
734
735 print '<tr><td colspan="6" class="right">'.$langs->trans("RemainderToPay").' :</td>';
736 print '<td class="nowrap right'.($staytopay ? ' amountremaintopay' : ' amountpaymentcomplete').'">';
737 print price($staytopay, 0, $langs, 0, -1, -1, $conf->currency);
738 print '</td>';
739 print '<td>&nbsp;</td>';
740 print '</tr>';
741 }
742 print "</table>";
743 print '</div>';
744
745 $db->free($resql);
746 } else {
748 }
749
750 print '</div>';
751 print '</div>';
752
753 print '<div class="clearboth"></div>';
754
755 print dol_get_fiche_end();
756
757 if ($action == 'edit') {
758 print $form->buttonsSaveCancel();
759
760 print '</form>';
761 }
762
763 /*
764 * Buttons actions
765 */
766 if ($action != 'edit') {
767 $reshook = $hookmanager->executeHooks('addMoreActionsButtons', $parameters, $object, $action); // Note that $action and $object may have been modified by hook
768 if (empty($reshook)) {
769 print '<div class="tabsAction">';
770
771 // Edit
772 if (($object->paid == 0 || $object->paid == 2) && $user->hasRight('loan', 'write')) {
773 print '<div class="inline-block divButAction"><a class="butAction" href="'.DOL_URL_ROOT.'/loan/card.php?id='.$object->id.'&action=edit&token='.newToken().'">'.$langs->trans("Modify").'</a></div>';
774 }
775
776 // Emit payment
777 // TODO check if loan schedule is created ($echeances->lines > 0)
778 if (($object->paid == 0 || $object->paid == 2) && ((price2num($object->capital) > 0 && round($staytopay) < 0) || (price2num($object->capital) > 0 && round($staytopay) > 0)) && $user->hasRight('loan', 'write')) {
779 print '<div class="inline-block divButAction"><a class="butAction" href="'.DOL_URL_ROOT.'/loan/payment/payment.php?id='.$object->id.'&action=create&token='.newToken().'">'.$langs->trans("DoPayment").'</a></div>';
780 }
781
782 // Classify 'paid'
783 if (($object->paid == 0 || $object->paid == 2) && round($staytopay) <= 0 && $user->hasRight('loan', 'write')) {
784 print '<div class="inline-block divButAction"><a class="butAction" href="'.DOL_URL_ROOT.'/loan/card.php?id='.$object->id.'&action=paid&token='.newToken().'">'.$langs->trans("ClassifyPaid").'</a></div>';
785 }
786
787 // Delete
788 if (($object->paid == 0 || $object->paid == 2) && $user->hasRight('loan', 'delete')) {
789 print '<div class="inline-block divButAction"><a class="butActionDelete" href="'.DOL_URL_ROOT.'/loan/card.php?id='.$object->id.'&action=delete&token='.newToken().'">'.$langs->trans("Delete").'</a></div>';
790 }
791
792 print "</div>";
793 }
794 }
795 } else {
796 // Loan not found
797 dol_print_error(null, $object->error);
798 }
799}
800
801// End of page
802llxFooter();
803$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 accounts.
Class to manage a WYSIWYG editor.
Class to manage generation of HTML components for accounting management.
Class to manage generation of HTML components Only common components must be here.
Class to manage building of HTML components.
Loan.
Class to manage projects.
if(!isModEnabled('ai')||!getDolGlobalString('AI_ASSISTANT_ENABLED')) global $conf
The main.inc.php has been included so the following variable are now defined:
if(!isModEnabled('ai')||!getDolGlobalString('AI_ASSISTANT_ENABLED')) global $db
API class for accounts.
dol_mktime($hour, $minute, $second, $month, $day, $year, $gm='auto', $check=1)
Return a timestamp date built from detailed information (by default a local PHP server timestamp) Rep...
setEventMessages($mesg, $mesgs, $style='mesgs', $messagekey='', $noduplicate=0, $attop=0)
Set event messages in dol_events session object.
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.
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.
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...
load_fiche_titre($title, $morehtmlright='', $picto='generic', $pictoisfullpath=0, $id='', $morecssontable='', $morehtmlcenter='', $morecssonpicto='widthpictotitle')
Load a title with picto.
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.
dol_escape_htmltag($stringtoescape, $keepb=0, $keepn=0, $noescapetags='', $escapeonlyhtmltags=0, $cleanalsojavascript=0)
Returns text escaped for inclusion in HTML alt or title or value tags, or into values of HTML input f...
loan_prepare_head($object)
Prepare array with list of tabs.
Definition loan.lib.php:34
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.