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