dolibarr 21.0.0-beta
card.php
Go to the documentation of this file.
1<?php
2/* Copyright (C) 2013-2017 Olivier Geffroy <jeff@jeffinfo.com>
3 * Copyright (C) 2013-2017 Florian Henry <florian.henry@open-concept.pro>
4 * Copyright (C) 2013-2024 Alexandre Spangaro <alexandre@inovea-conseil.com>
5 * Copyright (C) 2017 Laurent Destailleur <eldy@users.sourceforge.net>
6 * Copyright (C) 2018-2024 Frédéric France <frederic.france@free.fr>
7 * Copyright (C) 2024 MDW <mdeweerd@users.noreply.github.com>
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/accounting.lib.php';
32require_once DOL_DOCUMENT_ROOT.'/accountancy/class/bookkeeping.class.php';
33require_once DOL_DOCUMENT_ROOT.'/core/class/html.formaccounting.class.php';
34require_once DOL_DOCUMENT_ROOT.'/compta/facture/class/facture.class.php';
35require_once DOL_DOCUMENT_ROOT.'/fourn/class/fournisseur.facture.class.php';
36require_once DOL_DOCUMENT_ROOT.'/accountancy/class/accountingjournal.class.php';
37require_once DOL_DOCUMENT_ROOT.'/accountancy/class/accountingaccount.class.php';
38require_once DOL_DOCUMENT_ROOT.'/accountancy/class/lettering.class.php';
39
48// Load translation files required by the page
49$langs->loadLangs(array("accountancy", "bills", "compta"));
50
51$action = GETPOST('action', 'aZ09');
52$cancel = GETPOST('cancel', 'aZ09');
53$confirm = GETPOST('confirm', 'alpha');
54
55$optioncss = GETPOST('optioncss', 'aZ'); // Option for the css output (always '' except when 'print')
56
57$id = GETPOSTINT('id'); // id of record
58$mode = GETPOST('mode', 'aZ09'); // '' or '_tmp'
59$piece_num = GETPOSTINT("piece_num") ? GETPOSTINT("piece_num") : GETPOST('ref'); // id of transaction (several lines share the same transaction id)
60
61$accountingaccount = new AccountingAccount($db);
62$accountingjournal = new AccountingJournal($db);
63
64$accountingaccount_number = GETPOST('accountingaccount_number', 'alphanohtml');
65$accountingaccount->fetch(0, $accountingaccount_number, true);
66$accountingaccount_label = $accountingaccount->label;
67
68$journal_code = GETPOST('code_journal', 'alpha');
69$accountingjournal->fetch(0, $journal_code);
70$journal_label = $accountingjournal->label;
71
72$subledger_account = GETPOST('subledger_account', 'alphanohtml');
73if ($subledger_account == -1) {
74 $subledger_account = null;
75}
76$subledger_label = GETPOST('subledger_label', 'alphanohtml');
77
78$label_operation = GETPOST('label_operation', 'alphanohtml');
79$debit = (float) price2num(GETPOST('debit', 'alpha'));
80$credit = (float) price2num(GETPOST('credit', 'alpha'));
81
82$save = GETPOST('save', 'alpha');
83if (!empty($save)) {
84 $action = 'add';
85}
86$update = GETPOST('update', 'alpha');
87if (!empty($update)) {
88 $action = 'confirm_update';
89}
90
91// Initialize a technical object to manage hooks of page. Note that conf->hooks_modules contains an array of hook context
92$hookmanager->initHooks(array('bookkeepingcard', 'globalcard'));
93
94$object = new BookKeeping($db);
95
96// Security check
97if (!isModEnabled('accounting')) {
99}
100if ($user->socid > 0) {
102}
103if (!$user->hasRight('accounting', 'mouvements', 'lire')) {
105}
106
107$permissiontoadd = $user->hasRight('accounting', 'mouvements', 'creer');
108$permissiontodelete = $user->hasRight('accounting', 'mouvements', 'supprimer');
109
110
111/*
112 * Actions
113 */
114
115$parameters = array();
116$reshook = $hookmanager->executeHooks('doActions', $parameters, $object, $action);
117if ($reshook < 0) {
118 setEventMessages($hookmanager->error, $hookmanager->errors, 'errors');
119}
120if (empty($reshook)) {
121 $error = 0;
122
123 if ($cancel) {
124 header("Location: ".DOL_URL_ROOT.'/accountancy/bookkeeping/list.php');
125 exit;
126 }
127
128 if ($action == "confirm_update" && $permissiontoadd) {
129 if (((float) $debit != 0.0) && ((float) $credit != 0.0)) {
130 $error++;
131 setEventMessages($langs->trans('ErrorDebitCredit'), null, 'errors');
132 $action = 'update';
133 }
134 if (empty($accountingaccount_number) || $accountingaccount_number == '-1') {
135 $error++;
136 setEventMessages($langs->trans('ErrorFieldRequired', $langs->transnoentitiesnoconv("AccountAccountingShort")), null, 'errors');
137 $action = 'update';
138 }
139
140 if (!$error) {
141 $object = new BookKeeping($db);
142
143 $result = $object->fetch($id, null, $mode);
144 if ($result < 0) {
145 $error++;
146 setEventMessages($object->error, $object->errors, 'errors');
147 } else {
148 $object->numero_compte = $accountingaccount_number;
149 $object->subledger_account = $subledger_account;
150 $object->subledger_label = $subledger_label;
151 $object->label_compte = $accountingaccount_label;
152 $object->label_operation = $label_operation;
153 $object->debit = $debit;
154 $object->credit = $credit;
155
156 if ((float) $debit != 0.0) {
157 $object->montant = $debit; // deprecated
158 $object->amount = $debit;
159 $object->sens = 'D';
160 }
161 if ((float) $credit != 0.0) {
162 $object->montant = $credit; // deprecated
163 $object->amount = $credit;
164 $object->sens = 'C';
165 }
166
167 $result = $object->update($user, false, $mode);
168 if ($result < 0) {
169 setEventMessages($object->error, $object->errors, 'errors');
170 } else {
171 if ($mode != '_tmp') {
172 setEventMessages($langs->trans('RecordSaved'), null, 'mesgs');
173 }
174
175 $debit = 0;
176 $credit = 0;
177
178 $action = '';
179 }
180 }
181 }
182 } elseif ($action == "add" && $permissiontoadd) {
183 if (((float) $debit != 0.0) && ((float) $credit != 0.0)) {
184 $error++;
185 setEventMessages($langs->trans('ErrorDebitCredit'), null, 'errors');
186 $action = '';
187 }
188 if (empty($accountingaccount_number) || $accountingaccount_number == '-1') {
189 $error++;
190 setEventMessages($langs->trans('ErrorFieldRequired', $langs->transnoentitiesnoconv("AccountAccountingShort")), null, 'errors');
191 $action = '';
192 }
193
194 if (!$error) {
195 if (GETPOSTINT('doc_datemonth') && GETPOSTINT('doc_dateday') && GETPOSTINT('doc_dateyear')) {
196 $datedoc = dol_mktime(0, 0, 0, GETPOSTINT('doc_datemonth'), GETPOSTINT('doc_dateday'), GETPOSTINT('doc_dateyear'));
197 } else {
198 $datedoc = (int) GETPOSTINT('doc_date'); // TODO Use instead the mode day-month-year
199 }
200
201 $object = new BookKeeping($db);
202
203 $object->numero_compte = $accountingaccount_number;
204 $object->subledger_account = $subledger_account;
205 $object->subledger_label = $subledger_label;
206 $object->label_compte = $accountingaccount_label;
207 $object->label_operation = $label_operation;
208 $object->debit = $debit;
209 $object->credit = $credit;
210 $object->doc_date = $datedoc;
211 $object->doc_type = (string) GETPOST('doc_type', 'alpha');
212 $object->piece_num = $piece_num;
213 $object->doc_ref = (string) GETPOST('doc_ref', 'alpha');
214 $object->code_journal = $journal_code;
215 $object->journal_label = $journal_label;
216 $object->fk_doc = GETPOSTINT('fk_doc');
217 $object->fk_docdet = GETPOSTINT('fk_docdet');
218
219 if ((float) $debit != 0.0) {
220 $object->montant = $debit; // deprecated
221 $object->amount = $debit;
222 $object->sens = 'D';
223 }
224
225 if ((float) $credit != 0.0) {
226 $object->montant = $credit; // deprecated
227 $object->amount = $credit;
228 $object->sens = 'C';
229 }
230
231 $result = $object->createStd($user, false, $mode);
232
233 if ($result < 0) {
234 setEventMessages($object->error, $object->errors, 'errors');
235 } else {
236 if ($mode != '_tmp') {
237 setEventMessages($langs->trans('RecordSaved'), null, 'mesgs');
238 }
239
240 $debit = 0;
241 $credit = 0;
242
243 $action = '';
244 }
245 }
246 } elseif ($action == "confirm_delete" && $permissiontoadd) { // Delete line
247 $object = new BookKeeping($db);
248
249 $result = $object->fetch($id, null, $mode);
250 $piece_num = (int) $object->piece_num;
251
252 if ($result < 0) {
253 setEventMessages($object->error, $object->errors, 'errors');
254
255 $action = 'create';
256 } else {
257 $result = $object->delete($user, 0, $mode);
258 if ($result < 0) {
259 setEventMessages($object->error, $object->errors, 'errors');
260 }
261 }
262 $action = '';
263 } elseif ($action == "confirm_create" && $permissiontoadd) {
264 $object = new BookKeeping($db);
265
266 if (!$journal_code || $journal_code == '-1') {
267 setEventMessages($langs->trans('ErrorFieldRequired', $langs->transnoentitiesnoconv("Journal")), null, 'errors');
268 $action = 'create';
269 $error++;
270 }
271 if (!GETPOST('doc_ref', 'alpha')) {
272 setEventMessages($langs->trans("ErrorFieldRequired", $langs->transnoentitiesnoconv("Piece")), null, 'errors');
273 $action = 'create';
274 $error++;
275 }
276
277 if (!$error) {
278 $date_start = dol_mktime(0, 0, 0, GETPOSTINT('doc_datemonth'), GETPOSTINT('doc_dateday'), GETPOSTINT('doc_dateyear'));
279
280 $object->label_compte = '';
281 $object->debit = 0;
282 $object->credit = 0;
283 $object->doc_date = $date_start;
284 $object->doc_type = GETPOST('doc_type', 'alpha');
285 $object->piece_num = GETPOSTINT('next_num_mvt');
286 $object->doc_ref = GETPOST('doc_ref', 'alpha');
287 $object->code_journal = $journal_code;
288 $object->journal_label = $journal_label;
289 $object->fk_doc = 0;
290 $object->fk_docdet = 0;
291 $object->montant = 0; // deprecated
292 $object->amount = 0;
293
294 $result = $object->createStd($user, 0, $mode);
295
296 if ($result < 0) {
297 setEventMessages($object->error, $object->errors, 'errors');
298
299 $action = 'create';
300 } else {
301 $reshook = $hookmanager->executeHooks('afterCreateBookkeeping', $parameters, $object, $action);
302
303 if ($mode != '_tmp') {
304 setEventMessages($langs->trans('RecordSaved'), null, 'mesgs');
305 }
306 $action = '';
307 $id = $object->id;
308 $piece_num = (int) $object->piece_num;
309 }
310 }
311 }
312
313 if ($action == 'setdate' && $permissiontoadd) {
314 $datedoc = dol_mktime(0, 0, 0, GETPOSTINT('doc_datemonth'), GETPOSTINT('doc_dateday'), GETPOSTINT('doc_dateyear'));
315 $result = $object->updateByMvt($piece_num, 'doc_date', $db->idate($datedoc), $mode);
316 if ($result < 0) {
317 setEventMessages($object->error, $object->errors, 'errors');
318 } else {
319 if ($mode != '_tmp') {
320 setEventMessages($langs->trans('RecordSaved'), null, 'mesgs');
321 }
322 $action = '';
323 }
324 }
325
326 if ($action == 'setjournal' && $permissiontoadd) {
327 $result = $object->updateByMvt($piece_num, 'code_journal', $journal_code, $mode);
328 $result = $object->updateByMvt($piece_num, 'journal_label', $journal_label, $mode);
329 if ($result < 0) {
330 setEventMessages($object->error, $object->errors, 'errors');
331 } else {
332 if ($mode != '_tmp') {
333 setEventMessages($langs->trans('RecordSaved'), null, 'mesgs');
334 }
335 $action = '';
336 }
337 }
338
339 if ($action == 'setdocref' && $permissiontoadd) {
340 $refdoc = GETPOST('doc_ref', 'alpha');
341 $result = $object->updateByMvt($piece_num, 'doc_ref', $refdoc, $mode);
342 if ($result < 0) {
343 setEventMessages($object->error, $object->errors, 'errors');
344 } else {
345 if ($mode != '_tmp') {
346 setEventMessages($langs->trans('RecordSaved'), null, 'mesgs');
347 }
348 $action = '';
349 }
350 }
351
352 // Validate transaction
353 if ($action == 'valid' && $permissiontoadd) {
354 $result = $object->transformTransaction(0, $piece_num);
355 if ($result < 0) {
356 setEventMessages($object->error, $object->errors, 'errors');
357 } else {
358 header("Location: list.php?sortfield=t.piece_num&sortorder=asc");
359 exit;
360 }
361 }
362
363 // Delete all lines into the transaction
364 $toselect = explode(',', GETPOST('toselect', 'alphanohtml'));
365
366 if ($action == 'deletebookkeepingwriting' && $confirm == "yes" && $permissiontodelete) {
367 $db->begin();
368
369 if (getDolGlobalInt('ACCOUNTING_ENABLE_LETTERING')) {
370 $lettering = new Lettering($db);
371 $nb_lettering = $lettering->bookkeepingLetteringAll($toselect, true);
372 if ($nb_lettering < 0) {
373 setEventMessages('', $lettering->errors, 'errors');
374 $error++;
375 }
376 }
377
378 $nbok = 0;
379 $result = 0;
380 if (!$error) {
381 foreach ($toselect as $toselectid) {
382 $result = $object->fetch($toselectid);
383 if ($result >= 0 && (!isset($object->date_validation) || $object->date_validation === '')) {
384 $result = $object->deleteMvtNum($object->piece_num);
385 if ($result >= 0) {
386 $nbok += $result;
387 } else {
388 setEventMessages($object->error, $object->errors, 'errors');
389 $error++;
390 break;
391 }
392 } elseif ($result < 0) {
393 setEventMessages($object->error, $object->errors, 'errors');
394 $error++;
395 break;
396 } elseif (isset($object->date_validation) && $object->date_validation != '') {
397 setEventMessages($langs->trans("ValidatedRecordWhereFound"), null, 'errors');
398 $error++;
399 break;
400 }
401 }
402 }
403
404 if (!$error) {
405 $db->commit();
406
407 // Message for elements well deleted
408 if ($nbok > 1) {
409 setEventMessages($langs->trans("RecordsDeleted", $nbok), null, 'mesgs');
410 } elseif ($nbok > 0) {
411 setEventMessages($langs->trans("RecordDeleted", $nbok), null, 'mesgs');
412 } else {
413 setEventMessages($langs->trans("NoRecordDeleted"), null, 'mesgs');
414 }
415
416 header("Location: ".DOL_URL_ROOT.'/accountancy/bookkeeping/list.php?noreset=1');
417 exit;
418 } else {
419 $db->rollback();
420 }
421 }
422}
423
424
425
426/*
427 * View
428 */
429
430$form = new Form($db);
431$formaccounting = new FormAccounting($db);
432
433$title = $langs->trans("CreateMvts");
434$help_url = 'EN:Module_Double_Entry_Accounting|FR:Module_Comptabilit&eacute;_en_Partie_Double';
435
436llxHeader('', $title, $help_url, '', 0, 0, '', '', '', 'mod-accountancy accountancy-consultation page-card');
437
438// Confirmation to delete the command
439if ($action == 'delete') {
440 $formconfirm = $form->formconfirm($_SERVER["PHP_SELF"].'?id='.$id.'&mode='.$mode, $langs->trans('DeleteMvt'), $langs->trans('ConfirmDeleteMvt', $langs->transnoentitiesnoconv("RegistrationInAccounting")), 'confirm_delete', '', 0, 1);
441 print $formconfirm;
442}
443
444if ($action == 'create') {
445 print load_fiche_titre($title);
446
447 $object = new BookKeeping($db);
448 $next_num_mvt = $object->getNextNumMvt('_tmp');
449
450 if (empty($next_num_mvt)) {
451 dol_print_error(null, 'Failed to get next piece number');
452 }
453
454 print '<form action="'.$_SERVER["PHP_SELF"].'" name="create_mvt" method="POST">';
455 if ($optioncss != '') {
456 print '<input type="hidden" name="optioncss" value="'.$optioncss.'">';
457 }
458 print '<input type="hidden" name="token" value="'.newToken().'">';
459 print '<input type="hidden" name="action" value="confirm_create">'."\n";
460 print '<input type="hidden" name="next_num_mvt" value="'.$next_num_mvt.'">'."\n";
461 print '<input type="hidden" name="mode" value="_tmp">'."\n";
462
463 print dol_get_fiche_head();
464
465 print '<table class="border centpercent">';
466
467 /*print '<tr>';
468 print '<td class="titlefieldcreate fieldrequired">' . $langs->trans("NumPiece") . '</td>';
469 print '<td>' . $next_num_mvt . '</td>';
470 print '</tr>';*/
471
472 print '<tr>';
473 print '<td class="titlefieldcreate fieldrequired">'.$langs->trans("Docdate").'</td>';
474 print '<td>';
475 print $form->selectDate('', 'doc_date', 0, 0, 0, "create_mvt", 1, 1);
476 print '</td>';
477 print '</tr>';
478
479 print '<tr>';
480 print '<td class="fieldrequired">'.$langs->trans("Codejournal").'</td>';
481 print '<td>'.$formaccounting->select_journal($journal_code, 'code_journal', 0, 0, 1, 1).'</td>';
482 print '</tr>';
483
484 print '<tr>';
485 print '<td class="fieldrequired">'.$langs->trans("Piece").'</td>';
486 print '<td><input type="text" class="minwidth200" name="doc_ref" value="'.GETPOST('doc_ref', 'alpha').'"></td>';
487 print '</tr>';
488
489 /*
490 print '<tr>';
491 print '<td>' . $langs->trans("Doctype") . '</td>';
492 print '<td><input type="text" class="minwidth200 name="doc_type" value=""/></td>';
493 print '</tr>';
494 */
495 $reshookAddLine = $hookmanager->executeHooks('bookkeepingAddLine', $parameters, $object, $action);
496
497 print '</table>';
498
499 print dol_get_fiche_end();
500
501 print $form->buttonsSaveCancel("Create");
502
503 print '</form>';
504} else {
505 $object = new BookKeeping($db);
506
507 $result = $object->fetchPerMvt($piece_num, $mode);
508 if ($result < 0) {
509 setEventMessages($object->error, $object->errors, 'errors');
510 }
511
512 if (!empty($object->piece_num)) {
513 $backlink = '<a href="'.DOL_URL_ROOT.'/accountancy/bookkeeping/list.php?restore_lastsearch_values=1">'.$langs->trans('BackToList').'</a>';
514
515 /*if ($mode == '_tmp') {
516 print load_fiche_titre($langs->trans("CreateMvts"), $backlink);
517 } else {
518 print load_fiche_titre($langs->trans("UpdateMvts"), $backlink);
519 }*/
520
521 $head = array();
522 $h = 0;
523 $head[$h][0] = $_SERVER['PHP_SELF'].'?piece_num='.((int) $object->piece_num).($mode ? '&mode='.$mode : '');
524 $head[$h][1] = $langs->trans("Transaction");
525 $head[$h][2] = 'transaction';
526 $h++;
527
528 print dol_get_fiche_head($head, 'transaction', '', -1);
529
530 $object->ref = (string) $object->piece_num;
531 $object->label = $object->doc_ref;
532
533 $morehtmlref = '<div style="clear: both;"></div>';
534 $morehtmlref .= '<div class="refidno opacitymedium">';
535 $morehtmlref .= $object->label;
536 $morehtmlref .= '</div>';
537
538 dol_banner_tab($object, 'ref', $backlink, 1, 'piece_num', 'piece_num', $morehtmlref);
539
540 print '<div class="fichecenter">';
541
542 print '<div class="fichehalfleft">';
543
544 print '<div class="underbanner clearboth"></div>';
545 print '<table class="border tableforfield centpercent">';
546
547 // Account movement
548 print '<tr>';
549 print '<td class="titlefield">'.$langs->trans("NumMvts").'</td>';
550 print '<td>'.($mode == '_tmp' ? '<span class="opacitymedium" title="Id tmp '.$object->piece_num.'">'.$langs->trans("Draft").'</span>' : $object->piece_num).'</td>';
551 print '</tr>';
552
553 // Ref document
554 print '<tr><td>';
555 print '<table class="nobordernopadding centpercent"><tr><td>';
556 print $langs->trans('Piece');
557 print '</td>';
558 if ($action != 'editdocref') {
559 print '<td class="right">';
560 if ($permissiontoadd) {
561 print '<a class="editfielda reposition" href="'.$_SERVER["PHP_SELF"].'?action=editdocref&token='.newToken().'&piece_num='.((int) $object->piece_num).'&mode='.urlencode((string) $mode).'">'.img_edit($langs->transnoentitiesnoconv('Edit'), 1).'</a>';
562 }
563 print '</td>';
564 }
565 print '</tr></table>';
566 print '</td><td>';
567 if ($action == 'editdocref') {
568 print '<form name="setdocref" action="'.$_SERVER["PHP_SELF"].'?piece_num='.((int) $object->piece_num).'" method="POST">';
569 if ($optioncss != '') {
570 print '<input type="hidden" name="optioncss" value="'.$optioncss.'">';
571 }
572 print '<input type="hidden" name="token" value="'.newToken().'">';
573 print '<input type="hidden" name="action" value="setdocref">';
574 print '<input type="hidden" name="mode" value="'.$mode.'">';
575 print '<input type="text" size="20" name="doc_ref" value="'.dol_escape_htmltag($object->doc_ref).'">';
576 print '<input type="submit" class="button button-edit" value="'.$langs->trans('Modify').'">';
577 print '</form>';
578 } else {
579 print $object->doc_ref;
580 }
581 print '</td>';
582 print '</tr>';
583
584 // Date
585 print '<tr><td>';
586 print '<table class="nobordernopadding centpercent"><tr><td>';
587 print $langs->trans('Docdate');
588 print '</td>';
589 if ($action != 'editdate') {
590 print '<td class="right">';
591 if ($permissiontoadd) {
592 print '<a class="editfielda reposition" href="'.$_SERVER["PHP_SELF"].'?action=editdate&token='.newToken().'&piece_num='.((int) $object->piece_num).'&mode='.urlencode((string) $mode).'">'.img_edit($langs->transnoentitiesnoconv('SetDate'), 1).'</a>';
593 }
594 print '</td>';
595 }
596 print '</tr></table>';
597 print '</td><td colspan="3">';
598 if ($action == 'editdate') {
599 print '<form name="setdate" action="'.$_SERVER["PHP_SELF"].'?piece_num='.((int) $object->piece_num).'" method="POST">';
600 if ($optioncss != '') {
601 print '<input type="hidden" name="optioncss" value="'.$optioncss.'">';
602 }
603 print '<input type="hidden" name="token" value="'.newToken().'">';
604 print '<input type="hidden" name="action" value="setdate">';
605 print '<input type="hidden" name="mode" value="'.$mode.'">';
606 print $form->selectDate($object->doc_date ? $object->doc_date : -1, 'doc_date', 0, 0, 0, "setdate");
607 print '<input type="submit" class="button button-edit" value="'.$langs->trans('Modify').'">';
608 print '</form>';
609 } else {
610 print $object->doc_date ? dol_print_date($object->doc_date, 'day') : '&nbsp;';
611 }
612 print '</td>';
613 print '</tr>';
614
615 // Journal
616 print '<tr><td>';
617 print '<table class="nobordernopadding" width="100%"><tr><td>';
618 print $langs->trans('Codejournal');
619 print '</td>';
620 if ($action != 'editjournal') {
621 print '<td class="right">';
622 if ($permissiontoadd) {
623 print '<a class="editfielda reposition" href="'.$_SERVER["PHP_SELF"].'?action=editjournal&token='.newToken().'&piece_num='.((int) $object->piece_num).'&mode='.urlencode((string) $mode).'">'.img_edit($langs->transnoentitiesnoconv('Edit'), 1).'</a>';
624 }
625 print '</td>';
626 }
627 print '</tr></table>';
628 print '</td><td>';
629 if ($action == 'editjournal') {
630 print '<form name="setjournal" action="'.$_SERVER["PHP_SELF"].'?piece_num='.((int) $object->piece_num).'" method="POST">';
631 if ($optioncss != '') {
632 print '<input type="hidden" name="optioncss" value="'.$optioncss.'">';
633 }
634 print '<input type="hidden" name="token" value="'.newToken().'">';
635 print '<input type="hidden" name="action" value="setjournal">';
636 print '<input type="hidden" name="mode" value="'.$mode.'">';
637 print $formaccounting->select_journal($object->code_journal, 'code_journal', 0, 0, 0, 1, 1);
638 print '<input type="submit" class="button button-edit" value="'.$langs->trans('Modify').'">';
639 print '</form>';
640 } else {
641 print $object->code_journal;
642 }
643 print '</td>';
644 print '</tr>';
645
646 print '</table>';
647
648 print '</div>';
649
650
651 print '<div class="fichehalfright">';
652
653 print '<div class="underbanner clearboth"></div>';
654 print '<table class="border tableforfield centpercent">';
655
656 // Doc type
657 if (!empty($object->doc_type)) {
658 print '<tr>';
659 print '<td class="titlefield">'.$langs->trans("Doctype").'</td>';
660 print '<td>'.$object->doc_type.'</td>';
661 print '</tr>';
662 }
663
664 // Date document creation
665 print '<tr>';
666 print '<td class="titlefield">'.$langs->trans("DateCreation").'</td>';
667 print '<td>';
668 print $object->date_creation ? dol_print_date($object->date_creation, 'day') : '&nbsp;';
669 print '</td>';
670 print '</tr>';
671
672 // Due date (if invoice)
673 //if (in_array($object->doc_type, array('customer_invoice', 'supplier_invoice'))) {
674 print '<tr>';
675 print '<td class="titlefield">' . $form->textwithpicto($langs->trans('DateDue'), $langs->trans("IfTransactionHasDueDate")) . '</td>';
676 print '<td>';
677 print $object->date_lim_reglement ? dol_print_date($object->date_lim_reglement, 'day') : '&nbsp;';
678 print '</td>';
679 print '</tr>';
680 //}
681
682 // Don't show in tmp mode, inevitably empty
683 if ($mode != "_tmp") {
684 // Date document export
685 print '<tr>';
686 print '<td class="titlefield">' . $langs->trans("DateExport") . '</td>';
687 print '<td>';
688 print $object->date_export ? dol_print_date($object->date_export, 'dayhour') : '&nbsp;';
689 print '</td>';
690 print '</tr>';
691
692 // Date document validation
693 print '<tr>';
694 print '<td class="titlefield">' . $langs->trans("DateValidation") . '</td>';
695 print '<td>';
696 print $object->date_validation ? dol_print_date($object->date_validation, 'dayhour') : '&nbsp;';
697 print '</td>';
698 print '</tr>';
699
700 // Id_import
701 if (!empty($object->import_key)) {
702 print '<tr>';
703 print '<td class="titlefield">' . $langs->trans("ImportId") . '</td>';
704 print '<td>';
705 print $object->import_key;
706 print '</td>';
707 print '</tr>';
708 }
709 }
710
711 // Validate
712 /*
713 print '<tr>';
714 print '<td class="titlefield">' . $langs->trans("Status") . '</td>';
715 print '<td>';
716 if (empty($object->validated)) {
717 print '<a class="reposition" href="' . $_SERVER["PHP_SELF"] . '?piece_num=' . $line->id . '&action=enable&token='.newToken().'">';
718 print img_picto($langs->trans("Disabled"), 'switch_off');
719 print '</a>';
720 } else {
721 print '<a class="reposition" href="' . $_SERVER["PHP_SELF"] . '?piece_num=' . $line->id . '&action=disable&token='.newToken().'">';
722 print img_picto($langs->trans("Activated"), 'switch_on');
723 print '</a>';
724 }
725 print '</td>';
726 print '</tr>';
727 */
728
729 // check data
730 /*
731 print '<tr>';
732 print '<td class="titlefield">' . $langs->trans("Control") . '</td>';
733 if ($object->doc_type == 'customer_invoice')
734 {
735 $sqlmid = 'SELECT rowid as ref';
736 $sqlmid .= " FROM ".MAIN_DB_PREFIX."facture as fac";
737 $sqlmid .= " WHERE fac.rowid=" . ((int) $object->fk_doc);
738 dol_syslog("accountancy/bookkeeping/card.php::sqlmid=" . $sqlmid, LOG_DEBUG);
739 $resultmid = $db->query($sqlmid);
740 if ($resultmid) {
741 $objmid = $db->fetch_object($resultmid);
742 $invoicestatic = new Facture($db);
743 $invoicestatic->fetch($objmid->ref);
744 $ref=$langs->trans("Invoice").' '.$invoicestatic->getNomUrl(1);
745 }
746 else dol_print_error($db);
747 }
748 print '<td>' . $ref .'</td>';
749 print '</tr>';
750 */
751 print "</table>\n";
752
753 print '</div>';
754
755 print '</div>';
756 print '<div class="clearboth"></div>';
757
758
759 print dol_get_fiche_end();
760
761
762 $result = $object->fetchAllPerMvt($piece_num, $mode); // This load $object->linesmvt
763
764 if ($result < 0) {
765 setEventMessages($object->error, $object->errors, 'errors');
766 } else {
767 // Variable that contains all transaction lines
768 $tmptoselect = array();
769 $atleastonevalidated = 0;
770 $atleastoneexported = 0;
771 foreach ($object->linesmvt as $line) {
772 $tmptoselect[] = $line->id;
773 if (!empty($line->date_validation)) {
774 $atleastonevalidated = 1;
775 }
776 if (!empty($line->date_export) || !empty($line->date_validation)) {
777 $atleastoneexported = 1;
778 }
779 }
780
781 if ($mode != '_tmp' && !$atleastonevalidated) {
782 print "\n".'<div class="tabsAction">'."\n";
783
784 $parameters = array();
785 $reshook = $hookmanager->executeHooks('addMoreActionsButtons', $parameters, $object, $action); // Note that $action and $object may have been modified by hook
786 if (empty($reshook)) {
787 if ($permissiontodelete) {
788 if (!isset($hookmanager->resArray['no_button_edit']) || $hookmanager->resArray['no_button_edit'] != 1) {
789 print dolGetButtonAction('', $langs->trans('Delete'), 'delete', DOL_URL_ROOT.'/accountancy/bookkeeping/card.php?action=deletebookkeepingwriting&confirm=yes&token='.newToken().'&piece_num='.((int) $object->piece_num).'&toselect='.implode(',', $tmptoselect), '', $permissiontodelete);
790 }
791 }
792 }
793
794 print '</div>';
795 }
796
797 // List of movements
798 print load_fiche_titre($langs->trans("ListeMvts"), '', '');
799
800 print '<form action="'.$_SERVER["PHP_SELF"].'?piece_num='.((int) $object->piece_num).'" method="POST">';
801 if ($optioncss != '') {
802 print '<input type="hidden" name="optioncss" value="'.$optioncss.'">';
803 }
804 print '<input type="hidden" name="token" value="'.newToken().'">';
805 print '<input type="hidden" name="doc_date" value="'.$object->doc_date.'">'."\n";
806 print '<input type="hidden" name="doc_type" value="'.$object->doc_type.'">'."\n";
807 print '<input type="hidden" name="doc_ref" value="'.$object->doc_ref.'">'."\n";
808 print '<input type="hidden" name="code_journal" value="'.$object->code_journal.'">'."\n";
809 print '<input type="hidden" name="fk_doc" value="'.$object->fk_doc.'">'."\n";
810 print '<input type="hidden" name="fk_docdet" value="'.$object->fk_docdet.'">'."\n";
811 print '<input type="hidden" name="mode" value="'.$mode.'">'."\n";
812
813 if (count($object->linesmvt) > 0) {
814 print '<div class="div-table-responsive-no-min">';
815 print '<table class="noborder centpercent">';
816
817 $total_debit = 0;
818 $total_credit = 0;
819
820 print '<tr class="liste_titre">';
821
822 print_liste_field_titre("AccountAccountingShort");
823 print_liste_field_titre("SubledgerAccount");
824 print_liste_field_titre("LabelOperation");
825 print_liste_field_titre("AccountingDebit", "", "", "", "", 'class="right"');
826 print_liste_field_titre("AccountingCredit", "", "", "", "", 'class="right"');
827 if (empty($object->date_validation)) {
828 print_liste_field_titre("Action", "", "", "", "", 'width="60"', "", "", 'center ');
829 } else {
831 }
832
833 print "</tr>\n";
834
835 // Add an empty line if there is not yet
836 if (!empty($object->linesmvt[0])) {
837 $tmpline = $object->linesmvt[0];
838 if (!empty($tmpline->numero_compte)) {
839 $line = new BookKeepingLine($db);
840 $object->linesmvt[] = $line;
841 }
842 }
843
844 foreach ($object->linesmvt as $line) {
845 $total_debit += $line->debit;
846 $total_credit += $line->credit;
847
848 if ($action == 'update' && $line->id == $id) {
849 print '<tr class="oddeven" data-lineid="'.((int) $line->id).'">';
850 print '<!-- td columns in edit mode -->';
851 print '<td>';
852 print $formaccounting->select_account((GETPOSTISSET("accountingaccount_number") ? GETPOST("accountingaccount_number", "alpha") : $line->numero_compte), 'accountingaccount_number', 1, array(), 1, 1, 'minwidth200 maxwidth500');
853 print '</td>';
854 print '<td>';
855 // TODO For the moment we keep a free input text instead of a combo. The select_auxaccount has problem because:
856 // - It does not use the setup of "key pressed" to select a thirdparty and this hang browser on large databases.
857 // - Also, it is not possible to use a value that is not in the list.
858 // - Also, the label is not automatically filled when a value is selected.
859 if (getDolGlobalString('ACCOUNTANCY_COMBO_FOR_AUX')) {
860 print $formaccounting->select_auxaccount((GETPOSTISSET("subledger_account") ? GETPOST("subledger_account", "alpha") : $line->subledger_account), 'subledger_account', 1, 'maxwidth250', '', 'subledger_label');
861 } else {
862 print '<input type="text" class="maxwidth150" name="subledger_account" value="'.(GETPOSTISSET("subledger_account") ? GETPOST("subledger_account", "alpha") : $line->subledger_account).'" placeholder="'.dol_escape_htmltag($langs->trans("SubledgerAccount")).'">';
863 }
864 // Add also input for subledger label
865 print '<br><input type="text" class="maxwidth150" name="subledger_label" value="'.(GETPOSTISSET("subledger_label") ? GETPOST("subledger_label", "alpha") : $line->subledger_label).'" placeholder="'.dol_escape_htmltag($langs->trans("SubledgerAccountLabel")).'">';
866 print '</td>';
867 print '<td><input type="text" class="minwidth200" name="label_operation" value="'.(GETPOSTISSET("label_operation") ? GETPOST("label_operation", "alpha") : $line->label_operation).'"></td>';
868 print '<td class="right"><input type="text" class="right width50" name="debit" value="'.(GETPOSTISSET("debit") ? GETPOST("debit", "alpha") : price($line->debit)).'"></td>';
869 print '<td class="right"><input type="text" class="right width50" name="credit" value="'.(GETPOSTISSET("credit") ? GETPOST("credit", "alpha") : price($line->credit)).'"></td>';
870 print '<td>';
871 print '<input type="hidden" name="id" value="'.$line->id.'">'."\n";
872 print '<input type="submit" class="button" name="update" value="'.$langs->trans("Update").'">';
873 print '</td>';
874 print "</tr>\n";
875 } elseif (empty($line->numero_compte) || (empty($line->debit) && empty($line->credit))) {
876 if (($action == "" || $action == 'add') && $permissiontoadd) {
877 print '<tr class="oddeven" data-lineid="'.((int) $line->id).'">';
878 print '<!-- td columns in add mode -->';
879 print '<td>';
880 print $formaccounting->select_account($action == 'add' ? GETPOST('accountingaccount_number') : '', 'accountingaccount_number', 1, array(), 1, 1, 'minwidth200 maxwidth500');
881 print '</td>';
882 print '<td>';
883 // TODO For the moment we keep a free input text instead of a combo. The select_auxaccount has problem because:
884 // It does not use the setup of "key pressed" to select a thirdparty and this hang browser on large databases.
885 // Also, it is not possible to use a value that is not in the list.
886 // Also, the label is not automatically filled when a value is selected.
887 if (getDolGlobalString('ACCOUNTANCY_COMBO_FOR_AUX')) {
888 print $formaccounting->select_auxaccount('', 'subledger_account', 1, 'maxwidth250', '', 'subledger_label');
889 } else {
890 print '<input type="text" class="maxwidth150" name="subledger_account" value="" placeholder="' . dol_escape_htmltag($langs->trans("SubledgerAccount")) . '">';
891 }
892 print '<br><input type="text" class="maxwidth150" name="subledger_label" value="" placeholder="' . dol_escape_htmltag($langs->trans("SubledgerAccountLabel")) . '">';
893 print '</td>';
894 print '<td><input type="text" class="minwidth200" name="label_operation" value="' . dol_escape_htmltag($label_operation) . '"/></td>';
895 print '<td class="right"><input type="text" class="right width50" name="debit" value=""/></td>';
896 print '<td class="right"><input type="text" class="right width50" name="credit" value=""/></td>';
897 print '<td class="center"><input type="submit" class="button small" name="save" value="' . $langs->trans("Add") . '"></td>';
898 print "</tr>\n";
899 }
900 } else {
901 print '<tr class="oddeven" data-lineid="'.((int) $line->id).'">';
902 print '<!-- td columns in display mode -->';
903 $resultfetch = $accountingaccount->fetch(0, $line->numero_compte, true);
904 print '<td>';
905 if ($resultfetch > 0) {
906 print $accountingaccount->getNomUrl(0, 1, 1, '', 0);
907 } else {
908 print dol_escape_htmltag($line->numero_compte).' <span class="warning">('.$langs->trans("AccountRemovedFromCurrentChartOfAccount").')</span>';
909 }
910 print '</td>';
911 print '<td>'.length_accounta($line->subledger_account);
912 if ($line->subledger_label) {
913 print ' - <span class="opacitymedium">'.dol_escape_htmltag($line->subledger_label).'</span>';
914 }
915 print '</td>';
916 print '<td>'.$line->label_operation.'</td>';
917 print '<td class="right nowraponall amount">'.($line->debit != 0 ? price($line->debit) : '').'</td>';
918 print '<td class="right nowraponall amount">'.($line->credit != 0 ? price($line->credit) : '').'</td>';
919
920 print '<td class="center nowraponall">';
921 if ($permissiontoadd) {
922 if (empty($line->date_export) && empty($line->date_validation)) {
923 print '<a class="editfielda reposition" href="' . $_SERVER["PHP_SELF"] . '?action=update&id=' . $line->id . '&piece_num=' . ((int) $line->piece_num) . '&mode=' . urlencode((string) $mode) . '&token=' . urlencode(newToken()) . '">';
924 print img_edit('', 0, 'class="marginrightonly"');
925 print '</a> &nbsp;';
926 } else {
927 print '<a class="editfielda nohover cursornotallowed reposition disabled" href="#" title="'.dol_escape_htmltag($langs->trans("ForbiddenTransactionAlreadyExported")).'">';
928 print img_edit($langs->trans("ForbiddenTransactionAlreadyExported"), 0, 'class="marginrightonly"');
929 print '</a> &nbsp;';
930 }
931
932 if (empty($line->date_validation)) {
933 $actiontodelete = 'delete';
934 if ($mode == '_tmp' || $action != 'delmouv') {
935 $actiontodelete = 'confirm_delete';
936 }
937
938 print '<a href="' . $_SERVER["PHP_SELF"] . '?action=' . $actiontodelete . '&id=' . $line->id . '&piece_num=' . ((int) $line->piece_num) . '&mode=' . urlencode((string) $mode) . '&token=' . urlencode(newToken()) . '">';
939 print img_delete();
940 print '</a>';
941 } else {
942 print '<a class="editfielda nohover cursornotallowed disabled" href="#" title="'.dol_escape_htmltag($langs->trans("ForbiddenTransactionAlreadyExported")).'">';
943 print img_delete($langs->trans("ForbiddenTransactionAlreadyValidated"));
944 print '</a>';
945 }
946 }
947 print '</td>';
948 print "</tr>\n";
949 }
950 }
951
952 $total_debit = price2num($total_debit, 'MT');
953 $total_credit = price2num($total_credit, 'MT');
954
955 if ($total_debit != $total_credit) {
956 setEventMessages(null, array($langs->trans('MvtNotCorrectlyBalanced', $total_debit, $total_credit)), 'warnings');
957 }
958
959 print '</table>';
960 print '</div>';
961
962 if ($mode == '_tmp' && $action == '' && $permissiontoadd) {
963 print '<br>';
964 print '<div class="center">';
965 if (empty($total_debit) && empty($total_credit)) {
966 print '<input type="submit" class="button" disabled="disabled" href="#" title="'.dol_escape_htmltag($langs->trans("EnterNonEmptyLinesFirst")).'" value="'.dol_escape_htmltag($langs->trans("ValidTransaction")).'">';
967 } elseif ($total_debit == $total_credit) {
968 print '<a class="button" href="'.$_SERVER["PHP_SELF"].'?piece_num='.((int) $object->piece_num).'&action=valid&token='.newToken().'">'.$langs->trans("ValidTransaction").'</a>';
969 } else {
970 print '<input type="submit" class="button" disabled="disabled" href="#" title="'.dol_escape_htmltag($langs->trans("MvtNotCorrectlyBalanced", $total_debit, $total_credit)).'" value="'.dol_escape_htmltag($langs->trans("ValidTransaction")).'">';
971 }
972
973 print ' &nbsp; ';
974 print '<a class="button button-cancel" href="'.DOL_URL_ROOT.'/accountancy/bookkeeping/list.php">'.$langs->trans("Cancel").'</a>';
975
976 print "</div>";
977 }
978 }
979
980 print '</form>';
981 }
982 } else {
983 print load_fiche_titre($langs->trans("NoRecords"));
984 }
985}
986
987print dol_get_fiche_end();
988
989// End of page
990llxFooter();
991$db->close();
$id
Definition account.php:48
if( $user->socid > 0) if(! $user->hasRight('accounting', 'chartofaccount')) $object
Definition card.php:66
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 accounting accounts.
Class to manage accounting journals.
Class to manage Ledger (General Ledger and Subledger)
Class BookKeepingLine.
Class to manage generation of HTML components for accounting management.
Class to manage generation of HTML components Only common components must be here.
Class Lettering.
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_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.
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.
getDolGlobalInt($key, $default=0)
Return a Dolibarr global constant int value.
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'.
dolGetButtonAction($label, $text='', $actionType='default', $url='', $id='', $userRight=1, $params=array())
Function dolGetButtonAction.
print_liste_field_titre($name, $file="", $field="", $begin="", $moreparam="", $moreattrib="", $sortfield="", $sortorder="", $prefix="", $tooltip="", $forcenowrapcolumntitle=0)
Show title line of an array.
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.
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...
accessforbidden($message='', $printheader=1, $printfooter=1, $showonlymessage=0, $params=null)
Show a message to say access is forbidden and stop program.