dolibarr 24.0.2
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-2026 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-2025 MDW <mdeweerd@users.noreply.github.com>
8 * Copyright (C) 2025 Nicolas Barrouillet <nicolas@pragma-tech.fr>
9 *
10 * This program is free software; you can redistribute it and/or modify
11 * it under the terms of the GNU General Public License as published by
12 * the Free Software Foundation; either version 3 of the License, or
13 * (at your option) any later version.
14 *
15 * This program is distributed in the hope that it will be useful,
16 * but WITHOUT ANY WARRANTY; without even the implied warranty of
17 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
18 * GNU General Public License for more details.
19 *
20 * You should have received a copy of the GNU General Public License
21 * along with this program. If not, see <https://www.gnu.org/licenses/>.
22 */
23
30// Load Dolibarr environment
31require '../../main.inc.php';
32require_once DOL_DOCUMENT_ROOT.'/core/lib/accounting.lib.php';
33require_once DOL_DOCUMENT_ROOT.'/accountancy/class/bookkeeping.class.php';
34require_once DOL_DOCUMENT_ROOT.'/core/class/html.formaccounting.class.php';
35require_once DOL_DOCUMENT_ROOT.'/compta/facture/class/facture.class.php';
36require_once DOL_DOCUMENT_ROOT.'/fourn/class/fournisseur.facture.class.php';
37require_once DOL_DOCUMENT_ROOT.'/expensereport/class/expensereport.class.php';
38require_once DOL_DOCUMENT_ROOT.'/accountancy/class/accountingjournal.class.php';
39require_once DOL_DOCUMENT_ROOT.'/accountancy/class/accountingaccount.class.php';
40require_once DOL_DOCUMENT_ROOT.'/accountancy/class/lettering.class.php';
41require_once DOL_DOCUMENT_ROOT.'/accountancy/class/bookkeepingtemplate.class.php';
42require_once DOL_DOCUMENT_ROOT.'/accountancy/class/bookkeepingtemplateline.class.php';
43
52// Load translation files required by the page
53$langs->loadLangs(array("accountancy", "bills", "compta", "errors"));
54
55$action = GETPOST('action', 'aZ09');
56$cancel = GETPOST('cancel', 'alpha');
57$confirm = GETPOST('confirm', 'alpha');
58
59$type = GETPOST('type', 'alpha');
60$backtopage = GETPOST('backtopage', 'alpha');
61if (empty($backtopage)) {
62 $backtopage = DOL_URL_ROOT . '/accountancy/bookkeeping/list.php';
63}
64
65$optioncss = GETPOST('optioncss', 'aZ'); // Option for the css output (always '' except when 'print')
66
67$id = GETPOSTINT('id'); // id of record
68$mode = GETPOST('mode', 'aZ09'); // '' or '_tmp'
69$piece_num = GETPOSTINT("piece_num") ? GETPOSTINT("piece_num") : GETPOST('ref'); // id of transaction (several lines share the same transaction id)
70$clonedate = (int) GETPOSTINT('clonedate');
71
72$accountingaccount = new AccountingAccount($db);
73$accountingjournal = new AccountingJournal($db);
74
75$accountingaccount_number = GETPOST('accountingaccount_number', 'alphanohtml');
76$accountingaccount->fetch(0, $accountingaccount_number, true);
77$accountingaccount_label = $accountingaccount->label;
78
79$journal_code = GETPOST('code_journal', 'alpha');
80$accountingjournal->fetch(0, $journal_code);
81$journal_label = $accountingjournal->label;
82
83$subledger_account = GETPOST('subledger_account', 'alphanohtml');
84if ($subledger_account == -1) {
85 $subledger_account = null;
86}
87$subledger_label = GETPOST('subledger_label', 'alphanohtml');
88
89$label_operation = GETPOST('label_operation', 'alphanohtml');
90$debit = (float) price2num(GETPOST('debit', 'alpha'));
91$credit = (float) price2num(GETPOST('credit', 'alpha'));
92
93$save = GETPOST('save', 'alpha');
94if (!empty($save)) {
95 $action = 'add';
96}
97$update = GETPOST('update', 'alpha');
98if (!empty($update)) {
99 $action = 'confirm_update';
100}
101
102// Initialize a technical object to manage hooks of page. Note that conf->hooks_modules contains an array of hook context
103$hookmanager->initHooks(array('bookkeepingcard', 'globalcard'));
104
105$object = new BookKeeping($db);
106
107// Security check
108if (!isModEnabled('accounting')) {
110}
111if ($user->socid > 0) {
113}
114if (!$user->hasRight('accounting', 'mouvements', 'lire')) {
116}
117
118$permissiontoadd = $user->hasRight('accounting', 'mouvements', 'creer');
119$permissiontodelete = $user->hasRight('accounting', 'mouvements', 'supprimer');
120$numRefModel = getDolGlobalString('BOOKKEEPING_ADDON', 'mod_bookkeeping_neon');
121
122/*
123 * Actions
124 */
125
126$parameters = array();
127$reshook = $hookmanager->executeHooks('doActions', $parameters, $object, $action);
128if ($reshook < 0) {
129 setEventMessages($hookmanager->error, $hookmanager->errors, 'errors');
130}
131if (empty($reshook)) {
132 $error = 0;
133
134 if ($cancel) {
135 header("Location: ". $backtopage . (!empty($type) ? '?type=sub' : ''));
136 exit;
137 }
138
139 if ($action == "confirm_update" && $permissiontoadd) {
140 if (((float) $debit != 0.0) && ((float) $credit != 0.0)) {
141 $error++;
142 setEventMessages($langs->trans('ErrorDebitCredit'), null, 'errors');
143 $action = 'update';
144 }
145 if (empty($accountingaccount_number) || $accountingaccount_number == '-1') {
146 $error++;
147 setEventMessages($langs->trans('ErrorFieldRequired', $langs->transnoentitiesnoconv("AccountAccountingShort")), null, 'errors');
148 $action = 'update';
149 }
150
151 if (!$error) {
152 $object = new BookKeeping($db);
153
154 $result = $object->fetch($id, null, $mode);
155 if ($result < 0) {
156 $error++;
157 setEventMessages($object->error, $object->errors, 'errors');
158 } else {
159 $object->numero_compte = $accountingaccount_number;
160 $object->subledger_account = $subledger_account;
161 $object->subledger_label = $subledger_label;
162 $object->label_compte = $accountingaccount_label;
163 $object->label_operation = $label_operation;
164 $object->debit = $debit;
165 $object->credit = $credit;
166
167 if ((float) $debit != 0.0) {
168 $object->montant = $debit; // deprecated
169 $object->amount = $debit;
170 $object->sens = 'D';
171 }
172 if ((float) $credit != 0.0) {
173 $object->montant = $credit; // deprecated
174 $object->amount = $credit;
175 $object->sens = 'C';
176 }
177
178 $result = $object->update($user, 0, $mode);
179 if ($result < 0) {
180 setEventMessages($object->error, $object->errors, 'errors');
181 } else {
182 if ($mode != '_tmp') {
183 setEventMessages($langs->trans('RecordSaved'), null, 'mesgs');
184 }
185
186 $debit = 0;
187 $credit = 0;
188
189 $action = '';
190 }
191 }
192 }
193 } elseif ($action == "add" && $permissiontoadd) {
194 if (((float) $debit != 0.0) && ((float) $credit != 0.0)) {
195 $error++;
196 setEventMessages($langs->trans('ErrorDebitCredit'), null, 'errors');
197 $action = '';
198 }
199 if (empty($accountingaccount_number) || $accountingaccount_number == '-1') {
200 $error++;
201 setEventMessages($langs->trans('ErrorFieldRequired', $langs->transnoentitiesnoconv("AccountAccountingShort")), null, 'errors');
202 $action = '';
203 }
204 $subledger_account_str = is_array($subledger_account) ? reset($subledger_account) : (string) $subledger_account;
205 if (!checkGeneralAccountAllowsAuxiliary($db, $accountingaccount_number, $subledger_account_str)) {
206 $error++;
207 setEventMessages($langs->trans("ErrorAccountNotCentralized"). ". " . $langs->trans("RemoveSubsidiaryAccountOrAdjustTheGeneralAccount"), null, 'errors');
208 }
209
210 if (!$error) {
211 if (GETPOSTINT('doc_datemonth') && GETPOSTINT('doc_dateday') && GETPOSTINT('doc_dateyear')) {
212 $datedoc = dol_mktime(0, 0, 0, GETPOSTINT('doc_datemonth'), GETPOSTINT('doc_dateday'), GETPOSTINT('doc_dateyear'));
213 } else {
214 $datedoc = (int) GETPOSTINT('doc_date'); // TODO Use instead the mode day-month-year
215 }
216
217 $object = new BookKeeping($db);
218
219 $object->numero_compte = $accountingaccount_number;
220 $object->subledger_account = $subledger_account;
221 $object->subledger_label = $subledger_label;
222 $object->label_compte = $accountingaccount_label;
223 $object->label_operation = $label_operation;
224 $object->debit = $debit;
225 $object->credit = $credit;
226 $object->doc_date = $datedoc;
227 $object->doc_type = (string) GETPOST('doc_type', 'alpha');
228 $object->piece_num = $piece_num;
229 $object->doc_ref = (string) GETPOST('doc_ref', 'alpha');
230 $object->ref = (string) GETPOST('ref', 'alpha');
231 $object->code_journal = $journal_code;
232 $object->journal_label = $journal_label;
233 $object->fk_doc = GETPOSTINT('fk_doc');
234 $object->fk_docdet = GETPOSTINT('fk_docdet');
235
236 if ((float) $debit != 0.0) {
237 $object->montant = $debit; // deprecated
238 $object->amount = $debit;
239 $object->sens = 'D';
240 }
241
242 if ((float) $credit != 0.0) {
243 $object->montant = $credit; // deprecated
244 $object->amount = $credit;
245 $object->sens = 'C';
246 }
247
248 $result = $object->createStd($user, 0, $mode);
249
250 if ($result < 0) {
251 setEventMessages($object->error, $object->errors, 'errors');
252 } else {
253 if ($mode != '_tmp') {
254 setEventMessages($langs->trans('RecordSaved'), null, 'mesgs');
255 }
256
257 $debit = 0;
258 $credit = 0;
259
260 $action = '';
261 }
262 }
263 } elseif ($action == "confirm_delete" && $permissiontoadd) { // Delete line
264 $object = new BookKeeping($db);
265
266 $result = $object->fetch($id, null, $mode);
267 $piece_num = (int) $object->piece_num;
268 if ($result < 0) {
269 setEventMessages($object->error, $object->errors, 'errors');
270
271 $action = 'create';
272 } elseif ($result > 0) {
273 $result = $object->delete($user, 0, $mode);
274 if ($result < 0) {
275 setEventMessages($object->error, $object->errors, 'errors');
276 }
277 }
278 $action = '';
279 } elseif ($action == "confirm_create" && $permissiontoadd) {
280 $object = new BookKeeping($db);
281
282 if (!$journal_code || $journal_code == '-1') {
283 setEventMessages($langs->trans('ErrorFieldRequired', $langs->transnoentitiesnoconv("Journal")), null, 'errors');
284 $action = 'create';
285 $error++;
286 }
287 if (!GETPOST('doc_ref', 'alpha')) {
288 setEventMessages($langs->trans("ErrorFieldRequired", $langs->transnoentitiesnoconv("Piece")), null, 'errors');
289 $action = 'create';
290 $error++;
291 }
292 if (dol_strlen(GETPOST('ref', 'alpha')) > 30) { // Size of field ref in database
293 setEventMessages($langs->trans("ErrorFieldTooLong", $langs->transnoentitiesnoconv("Ref")), null, 'errors');
294 $action = 'create';
295 $error++;
296 }
297
298 if (!$error) {
299 $date_start = dol_mktime(0, 0, 0, GETPOSTINT('doc_datemonth'), GETPOSTINT('doc_dateday'), GETPOSTINT('doc_dateyear'));
300
301 $object->label_compte = '';
302 $object->debit = 0;
303 $object->credit = 0;
304 $object->doc_date = $date_start;
305 $object->doc_type = GETPOST('doc_type', 'alpha');
306 $object->piece_num = GETPOSTINT('next_num_mvt');
307 $object->doc_ref = GETPOST('doc_ref', 'alpha');
308 $object->code_journal = $journal_code;
309 $object->journal_label = $journal_label;
310 $object->fk_doc = 0;
311 $object->fk_docdet = 0;
312 $object->ref = (GETPOST('ref', 'alpha') ? GETPOST('ref', 'alpha') : $object->getNextNumRef());
313 $object->montant = 0; // deprecated
314 $object->amount = 0;
315
316 $result = $object->createStd($user, 0, $mode);
317
318 if ($result < 0) {
319 setEventMessages($object->error, $object->errors, 'errors');
320
321 $action = 'create';
322 } else {
323 // Transaction created successfully
324 $piece_num = $object->piece_num;
325
326 // Check if a template was selected
327 $template_id = GETPOSTINT('template_id');
328
329 if ($template_id > 0) {
330 require_once DOL_DOCUMENT_ROOT.'/accountancy/class/bookkeepingtemplate.class.php';
331 require_once DOL_DOCUMENT_ROOT.'/accountancy/class/bookkeepingtemplateline.class.php';
332
333 $template = new BookkeepingTemplate($db);
334 $result_template = $template->fetch($template_id);
335
336 if ($result_template > 0 && !empty($template->lines)) {
337 $db->begin();
338 $error_template = 0;
339
340 foreach ($template->lines as $templateline) {
341 $bookkeeping = new BookKeeping($db);
342
343 // Set common fields from the form
344 $bookkeeping->doc_date = $date_start;
345 $bookkeeping->doc_type = GETPOST('doctype', 'alpha');
346 $bookkeeping->piece_num = $piece_num;
347 $bookkeeping->doc_ref = GETPOST('docref', 'alpha');
348 $bookkeeping->code_journal = $journal_code;
349 $bookkeeping->journal_label = $journal_label;
350 $bookkeeping->fk_doc = 0;
351 $bookkeeping->fk_docdet = 0;
352 $bookkeeping->ref = GETPOST('ref', 'alpha') ? GETPOST('ref', 'alpha') : $object->ref;
353
354 // Set fields from template line
355 $bookkeeping->numero_compte = $templateline->general_account;
356 $bookkeeping->label_compte = $templateline->general_label;
357 $bookkeeping->subledger_account = $templateline->subledger_account;
358 $bookkeeping->subledger_label = $templateline->subledger_label;
359 $bookkeeping->label_operation = $templateline->operation_label;
360 $bookkeeping->debit = (float) $templateline->debit;
361 $bookkeeping->credit = (float) $templateline->credit;
362
363 // Backward compatibility
364 if ((float) $bookkeeping->debit != 0.0) {
365 $bookkeeping->montant = $bookkeeping->debit;
366 $bookkeeping->amount = $bookkeeping->debit;
367 $bookkeeping->sens = 'D';
368 }
369 if ((float) $bookkeeping->credit != 0.0) {
370 $bookkeeping->montant = $bookkeeping->credit;
371 $bookkeeping->amount = $bookkeeping->credit;
372 $bookkeeping->sens = 'C';
373 }
374
375 $result_line = $bookkeeping->createStd($user, 0, '_tmp');
376
377 if ($result_line < 0) {
378 $error_template++;
379 setEventMessages($bookkeeping->error, $bookkeeping->errors, 'errors');
380 break;
381 }
382 }
383
384 if (!$error_template) {
385 $db->commit();
386 setEventMessages($langs->trans('TemplateLinesLoaded', count($template->lines)), null, 'mesgs');
387 } else {
388 $db->rollback();
389 }
390 }
391 }
392
393 // Redirect to the transaction
394 header("Location: ".$_SERVER["PHP_SELF"]."?piece_num=".$piece_num."&mode=_tmp");
395 exit;
396 }
397 }
398 }
399
400 if ($action == 'setdate' && $permissiontoadd) {
401 $datedoc = dol_mktime(0, 0, 0, GETPOSTINT('doc_datemonth'), GETPOSTINT('doc_dateday'), GETPOSTINT('doc_dateyear'));
402 $result = $object->updateByMvt($piece_num, 'doc_date', $db->idate($datedoc), $mode);
403 if ($result < 0) {
404 setEventMessages($object->error, $object->errors, 'errors');
405 } else {
406 if ($mode != '_tmp') {
407 setEventMessages($langs->trans('RecordSaved'), null, 'mesgs');
408 }
409 $action = '';
410 }
411 }
412
413 if ($action == 'setjournal' && $permissiontoadd) {
414 $result = $object->updateByMvt($piece_num, 'code_journal', $journal_code, $mode);
415 $result = $object->updateByMvt($piece_num, 'journal_label', $journal_label, $mode);
416 if ($result < 0) {
417 setEventMessages($object->error, $object->errors, 'errors');
418 } else {
419 if ($mode != '_tmp') {
420 setEventMessages($langs->trans('RecordSaved'), null, 'mesgs');
421 }
422 $action = '';
423 }
424 }
425
426 if ($action == 'setdocref' && $permissiontoadd) {
427 $refdoc = GETPOST('doc_ref', 'alpha');
428 $result = $object->updateByMvt($piece_num, 'doc_ref', $refdoc, $mode);
429 if ($result < 0) {
430 setEventMessages($object->error, $object->errors, 'errors');
431 } else {
432 if ($mode != '_tmp') {
433 setEventMessages($langs->trans('RecordSaved'), null, 'mesgs');
434 }
435 $action = '';
436 }
437 }
438
439 if ($action == 'setref' && $permissiontoadd && $numRefModel === 'mod_bookkeeping_neon') {
440 $newref = GETPOST('ref', 'alpha');
441 if (dol_strlen($newref) > 30) { // Size of field ref in database
442 $result = -1;
443 $object->error = $langs->trans("ErrorFieldTooLong", $langs->transnoentitiesnoconv("Ref"));
444 $object->errors = array();
445 } else {
446 $result = $object->updateByMvt($piece_num, 'ref', $newref, $mode);
447 }
448 if ($result < 0) {
449 setEventMessages($object->error, $object->errors, 'errors');
450 } else {
451 if ($mode != '_tmp') {
452 setEventMessages($langs->trans('RecordSaved'), null, 'mesgs');
453 }
454 $action = '';
455 }
456 }
457
458 // Validate transaction
459 if ($action == 'valid' && $permissiontoadd) {
460 $result = $object->transformTransaction(0, $piece_num);
461 if ($result < 0) {
462 setEventMessages($object->error, $object->errors, 'errors');
463 } else {
464 // Retrieve the actual final part number (not the temporary number)
465 $piece_num = $object->piece_num;
466
467 $linkEntry = '<a href="'.$_SERVER["PHP_SELF"].'?piece_num='.(int) $piece_num.'">'.$langs->trans('NumMvts').': '.(int) $piece_num.'</a>';
468 setEventMessages($langs->trans('RecordSaved').' - '.$linkEntry, null, 'mesgs', '', 1);
469
470 if (getDolGlobalInt('ACCOUNTANCY_VALID_REDIRECT_TO_CARD')) {
471 // Redirection to the validated entry record
472 header("Location: ".$_SERVER["PHP_SELF"]."?piece_num=".(int) $piece_num);
473 } else {
474 // Default behavior: return on journal view
475 header("Location: ".$backtopage."?sortfield=t.piece_num&sortorder=asc".($type ? '&type='.$type : ''));
476 }
477 exit;
478 }
479 }
480
481 // Delete all lines into the transaction
482 $toselect_str = explode(',', GETPOST('toselect', 'alphanohtml'));
483 $toselect = array();
484 foreach ($toselect_str as $i) {
485 $toselect[] = (int) $i;
486 }
487
488 if ($action == 'deletebookkeepingwriting' && $confirm == "yes" && $permissiontodelete) {
489 $db->begin();
490
491 if (getDolGlobalInt('ACCOUNTING_ENABLE_LETTERING')) {
492 $lettering = new Lettering($db);
493 $nb_lettering = $lettering->bookkeepingLetteringAll($toselect, true);
494 if ($nb_lettering < 0) {
495 setEventMessages('', $lettering->errors, 'errors');
496 $error++;
497 }
498 }
499
500 $nbok = 0;
501 $result = 0;
502 if (!$error) {
503 foreach ($toselect as $toselectid) {
504 $result = $object->fetch($toselectid);
505 if ($result >= 0 && (!isset($object->date_validation) || $object->date_validation === '')) {
506 $result = $object->deleteMvtNum($object->piece_num);
507 if ($result >= 0) {
508 $nbok += $result;
509 } else {
510 setEventMessages($object->error, $object->errors, 'errors');
511 $error++;
512 break;
513 }
514 } elseif ($result < 0) {
515 setEventMessages($object->error, $object->errors, 'errors');
516 $error++;
517 break;
518 } elseif (isset($object->date_validation) && $object->date_validation != '') {
519 setEventMessages($langs->trans("ValidatedRecordWhereFound"), null, 'errors');
520 $error++;
521 break;
522 }
523 }
524 }
525
526 if (!$error) {
527 $db->commit();
528
529 // Message for elements well deleted
530 if ($nbok > 1) {
531 setEventMessages($langs->trans("RecordsDeleted", $nbok), null, 'mesgs');
532 } elseif ($nbok > 0) {
533 setEventMessages($langs->trans("RecordDeleted", $nbok), null, 'mesgs');
534 } else {
535 setEventMessages($langs->trans("NoRecordDeleted"), null, 'mesgs');
536 }
537
538 header("Location: ".DOL_URL_ROOT.'/accountancy/bookkeeping/list.php?noreset=1');
539 exit;
540 } else {
541 $db->rollback();
542 }
543 }
544
545 if ($action == 'clonebookkeepingwriting' && $confirm == "yes" && $permissiontoadd) {
546 // Reread the values sent by the validated form
547 $piece_num = GETPOST('piece_num', 'alpha');
548 $journal_code = GETPOST('code_journal', 'alpha');
549
550 // Reconstruct the selected date
551 $clonedate = dol_mktime(0, 0, 0, GETPOSTINT('clonedatemonth'), GETPOSTINT('clonedateday'), GETPOSTINT('clonedateyear'));
552
553 $result = $object->newClone($piece_num, $journal_code, $clonedate);
554
555 if ($result == -1) {
556 $error++;
557 }
558
559 if (!$error) {
560 $db->commit();
561 header("Location: " . $_SERVER['PHP_SELF'] . "?piece_num=" . ($object->getNextNumMvt() - 1));
562 exit();
563 } else {
564 $db->rollback();
565 }
566 }
567}
568
569
570
571/*
572 * View
573 */
574
575$form = new Form($db);
576$formaccounting = new FormAccounting($db);
577
578$title = $langs->trans("CreateMvts");
579$help_url = 'EN:Module_Double_Entry_Accounting|FR:Module_Comptabilit&eacute;_en_Partie_Double';
580
581llxHeader('', $title, $help_url, '', 0, 0, '', '', '', 'mod-accountancy accountancy-consultation page-card');
582
583// Confirmation to delete the command
584if ($action == 'delete') {
585 $formconfirm = $form->formconfirm($_SERVER["PHP_SELF"].'?id='.$id.'&mode='.$mode, $langs->trans('DeleteMvt'), $langs->trans('ConfirmDeleteMvt', $langs->transnoentitiesnoconv("RegistrationInAccounting")), 'confirm_delete', '', 0, 1);
586 print $formconfirm;
587}
588
589// Update fields properties in realtime
590if (!empty($conf->use_javascript_ajax)) {
591 print "\n" . '<script type="text/javascript">';
592 print '$(document).ready(function () {
593 function toggleSubledger() {
594 var isCentral = $("#accountingaccount_number option:selected").data("centralized");
595 console.log("the selected general ledger account is centralised?", isCentral);
596
597 var isAjaxMode = $("#search_subledger_account").length > 0;
598 var $visibleSubledger = isAjaxMode
599 ? $("#search_subledger_account")
600 : $("#subledger_account");
601
602 if (isCentral) {
603 $visibleSubledger.prop("disabled", false);
604 if (!isAjaxMode) {
605 $("#subledger_account").prop("disabled", false).trigger("change");
606 }
607 $("#subledger_label").prop("disabled", false);
608 } else {
609 $visibleSubledger.prop("disabled", true).val("");
610 if (!isAjaxMode) {
611 $("#subledger_account").val("").prop("disabled", true).trigger("change");
612 } else {
613 $("#subledger_account").val("");
614 }
615 $("#subledger_label").val("").prop("disabled", true);
616 }
617 }
618
619 toggleSubledger();
620
621 $("#accountingaccount_number").on("change", toggleSubledger);
622 $("#accountingaccount_number").on("select2:select", toggleSubledger);
623 ';
624 print ' });' . "\n";
625 print ' </script>' . "\n";
626}
627
628if ($action == 'create') {
629 print load_fiche_titre($title);
630
631 $object = new BookKeeping($db);
632 $next_num_mvt = $object->getNextNumMvt('_tmp');
633
634 if (empty($next_num_mvt)) {
635 dol_print_error(null, 'Failed to get next piece number');
636 }
637
638 print '<form action="'.$_SERVER["PHP_SELF"].'" name="create_mvt" method="POST">';
639 if ($optioncss != '') {
640 print '<input type="hidden" name="optioncss" value="'.$optioncss.'">';
641 }
642 print '<input type="hidden" name="token" value="'.newToken().'">';
643 print '<input type="hidden" name="action" value="confirm_create">'."\n";
644 print '<input type="hidden" name="next_num_mvt" value="'.$next_num_mvt.'">'."\n";
645 print '<input type="hidden" name="backtopage" value="'.$backtopage.'">';
646 print '<input type="hidden" name="type" value="'.$type.'">';
647 print '<input type="hidden" name="mode" value="_tmp">'."\n";
648
649 print dol_get_fiche_head();
650
651 print '<table class="border centpercent">';
652
653 print '<tr>';
654 print '<td class="fieldrequired">'.$langs->trans("Docdate").'</td>';
655 print '<td>';
656 print $form->selectDate('', 'doc_date', 0, 0, 0, "create_mvt", 1, 1);
657 print '</td>';
658 print '</tr>';
659
660 print '<tr>';
661 print '<td class="fieldrequired">'.$langs->trans("Codejournal").'</td>';
662 print '<td>'.$formaccounting->select_journal($journal_code, 'code_journal', 0, 0, 1, 1).'</td>';
663 print '</tr>';
664
665 print '<tr>';
666 print '<td class="fieldrequired">'.$form->textwithpicto($langs->trans("Piece"), $langs->trans("PieceDesc")).'</td>';
667 print '<td><input type="text" class="minwidth200" name="doc_ref" value="'.GETPOST('doc_ref', 'alpha').'"></td>';
668 print '</tr>';
669
670 // Piece number
671 print '<tr>';
672 print '<td>'.$form->textwithpicto($langs->trans("Ref"), $langs->trans("BankTransactionRef")).'</td>';
673 print '<td>';
674 if ($numRefModel === 'mod_bookkeeping_neon') {
675 print '<input type="text" class="minwidth200" name="ref" maxlength="30" value="">';
676 } else {
677 print '<span class="opacitymedium">'.$langs->trans("Automatic").'</span>';
678 }
679 print '</td>';
680
681 // Template
682 print '<tr>';
683 print '<td>'.$langs->trans("BookkeepingTemplate").'</td>';
684 print '<td>';
685 require_once DOL_DOCUMENT_ROOT.'/accountancy/class/bookkeepingtemplate.class.php';
686
687 $sql = "SELECT rowid, code, label";
688 $sql .= " FROM ".MAIN_DB_PREFIX."accounting_transaction_template";
689 $sql .= " WHERE entity IN (".getEntity('accounting').")";
690 $sql .= " ORDER BY code ASC";
691
692 $resql = $db->query($sql);
693 $templates = array();
694
695 if ($resql) {
696 $num = $db->num_rows($resql);
697 $i = 0;
698 while ($i < $num) {
699 $obj = $db->fetch_object($resql);
700 $templates[$obj->rowid] = $obj->code.' - '.$obj->label;
701 $i++;
702 }
703 $db->free($resql);
704 }
705
706 if (count($templates) > 0) {
707 print '<select class="flat minwidth300" name="template_id" id="template_id">';
708 print '<option value=""></option>';
709 foreach ($templates as $key => $label) {
710 print '<option value="'.$key.'">'.dol_escape_htmltag($label).'</option>';
711 }
712 print '</select>';
713 } else {
714 print '<span class="opacitymedium">'.$langs->trans("NoTemplateAvailable").'</span>';
715 }
716
717 print '</td>';
718 print '</tr>';
719
720 $reshookAddLine = $hookmanager->executeHooks('bookkeepingAddLine', $parameters, $object, $action);
721
722 print '</table>';
723
724 print dol_get_fiche_end();
725
726 print $form->buttonsSaveCancel("Create");
727
728 print '</form>';
729} else {
730 $object = new BookKeeping($db);
731
732 $result = $object->fetchPerMvt($piece_num, $mode);
733 if ($result < 0) {
734 setEventMessages($object->error, $object->errors, 'errors');
735 }
736
737 if (!empty($object->piece_num)) {
738 $backlink = '<a href="'.DOL_URL_ROOT.'/accountancy/bookkeeping/list.php?restore_lastsearch_values=1">'.$langs->trans('BackToList').'</a>';
739
740 /*if ($mode == '_tmp') {
741 print load_fiche_titre($langs->trans("CreateMvts"), $backlink);
742 } else {
743 print load_fiche_titre($langs->trans("UpdateMvts"), $backlink);
744 }*/
745
746 $head = accounting_transaction_prepare_head($object, $mode, $type, $backtopage);
747
748 print dol_get_fiche_head($head, 'transaction', '', -1);
749
750 //$object->label = $object->doc_ref;
751 if ($mode == '_tmp') {
752 $object->context['mode'] = $mode;
753 $object->next_prev_filter = '1=0'; // Add a test always false to disable navigation into the dol_banner_tab. In tmp mode, we just want to create/edit lines of bank transaction.
754 }
755 $object->label = $object->ref;
756
757 $morehtmlref = '<div style="clear: both;"></div>';
758 $morehtmlref .= '<div class="refidno opacitymedium">';
759 $morehtmlref .= $object->label;
760 $morehtmlref .= '</div>';
761
762 dol_banner_tab($object, 'ref', $backlink, 1, 'piece_num', 'piece_num', $morehtmlref);
763
764
765 if ($action == 'clonebookkeepingwriting' && $confirm != 'yes' && $permissiontoadd) {
766 $piece_num = GETPOST('piece_num', 'alpha');
767 $formaccounting = new FormAccounting($db);
768
769 $form = new Form($db);
770 $input1 = $form->selectDate('', 'clonedate', 0, 0, 0, "", 1, 1);
771 $input2 = $formaccounting->select_journal($journal_code, 'code_journal', 0, 0, 1, 1);
772
773 $formquestion = array(
774 array(
775 'type' => 'other',
776 'name' => 'clonedate',
777 'label' => '<span class="fieldrequired">' . $langs->trans("Docdate") . '</span>',
778 'value' => $input1
779 )
780 );
781
782 $formquestion[] = array('type' => 'hidden', 'name' => 'piece_num', 'value' => $piece_num);
783
784 if (getDolGlobalString('ACCOUNTING_CLONING_ENABLE_INPUT_JOURNAL')) {
785 $formquestion[] = array(
786 'type' => 'text',
787 'name' => 'code_journal',
788 'label' => '<span class="fieldrequired">' . $langs->trans("Codejournal") . '</span>',
789 'value' => $input2
790 );
791 }
792
793 print $form->formconfirm(
794 $_SERVER["PHP_SELF"],
795 $langs->trans("ConfirmMassCloneBookkeepingWriting"),
796 $langs->trans("ConfirmMassCloneBookkeepingWritingQuestion", 1),
797 "clonebookkeepingwriting",
798 $formquestion,
799 '', 0, 300, 1000, 0
800 );
801 }
802
803
804 print '<div class="fichecenter">';
805
806 print '<div class="fichehalfleft">';
807
808 print '<div class="underbanner clearboth"></div>';
809 print '<table class="border tableforfield centpercent">';
810
811 // Account movement
812 /*
813 print '<tr>';
814 print '<td class="titlefieldmiddle">'.$langs->trans("NumMvts").'</td>';
815 print '<td>'.($mode == '_tmp' ? '<span class="opacitymedium" title="Id tmp '.$object->piece_num.'">'.$langs->trans("Draft").'</span>' : $object->piece_num).'</td>';
816 print '</tr>';
817 */
818
819 // Account movement ref. Edit allowed only for free ref num model.
820 print '<tr><td class="titlefieldmiddle">';
821 print '<table class="nobordernopadding centpercent"><tr><td>';
822 print $langs->trans('Ref');
823 print '</td>';
824 if ($action != 'editref' && empty($object->date_validation)) {
825 print '<td class="right">';
826 if ($permissiontoadd && $numRefModel === 'mod_bookkeeping_neon') {
827 print '<a class="editfielda reposition" href="'.$_SERVER["PHP_SELF"].'?action=editref&token='.newToken().'&piece_num='.((int) $object->piece_num).'&mode='.urlencode((string) $mode).'">'.img_edit($langs->transnoentitiesnoconv('Edit'), 1).'</a>';
828 }
829 print '</td>';
830 }
831 print '</tr></table>';
832 print '</td><td>';
833 if ($action == 'editref' && empty($object->date_validation)) {
834 print '<form name="setref" action="'.$_SERVER["PHP_SELF"].'?piece_num='.((int) $object->piece_num).'" method="POST">';
835 if ($optioncss != '') {
836 print '<input type="hidden" name="optioncss" value="'.$optioncss.'">';
837 }
838 print '<input type="hidden" name="token" value="'.newToken().'">';
839 print '<input type="hidden" name="action" value="setref">';
840 print '<input type="hidden" name="mode" value="'.$mode.'">';
841 print '<input type="hidden" name="backtopage" value="'.$backtopage.'">';
842 print '<input type="hidden" name="type" value="'.$type.'">';
843 print '<input type="text" size="20" name="ref" maxlength="30" value="'.dol_escape_htmltag($object->ref).'">';
844 print '<input type="submit" class="button button-edit smallpaddingimp" value="'.$langs->trans('Modify').'">';
845 print '</form>';
846 } else {
847 print $object->ref;
848 }
849 print '</td>';
850 print '</tr>';
851
852 // Ref document
853 print '<tr><td>';
854 print '<table class="nobordernopadding centpercent"><tr><td>';
855 print $form->textwithpicto($langs->trans('Piece'), $langs->trans('PieceDesc'));
856 print '</td>';
857 if ($action != 'editdocref') {
858 print '<td class="right">';
859 if ($permissiontoadd && empty($object->date_validation)) {
860 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>';
861 }
862 print '</td>';
863 }
864 print '</tr></table>';
865 print '</td><td>';
866 if ($action == 'editdocref' && empty($object->date_validation)) {
867 print '<form name="setdocref" action="'.$_SERVER["PHP_SELF"].'?piece_num='.((int) $object->piece_num).'" method="POST">';
868 if ($optioncss != '') {
869 print '<input type="hidden" name="optioncss" value="'.$optioncss.'">';
870 }
871 print '<input type="hidden" name="token" value="'.newToken().'">';
872 print '<input type="hidden" name="action" value="setdocref">';
873 print '<input type="hidden" name="mode" value="'.$mode.'">';
874 print '<input type="hidden" name="backtopage" value="'.$backtopage.'">';
875 print '<input type="hidden" name="type" value="'.$type.'">';
876 print '<input type="text" size="20" name="doc_ref" value="'.dol_escape_htmltag($object->doc_ref).'">';
877 print '<input type="submit" class="button button-edit smallpaddingimp" value="'.$langs->trans('Modify').'">';
878 print '</form>';
879 } else {
880 // Get information of an element
881 if ($object->doc_type === 'customer_invoice' && !empty($object->fk_doc)) {
882 $invoicestatic = new Facture($db);
883 $result = $invoicestatic->fetch($object->fk_doc);
884
885 if ($result > 0) {
886 $label_element = $invoicestatic->getNomUrl(1);
887 } else {
888 $label_element = $object->doc_ref;
889 }
890 } elseif ($object->doc_type === 'supplier_invoice' && !empty($object->fk_doc)) {
891 $supplierinvoicestatic = new FactureFournisseur($db);
892 $result = $supplierinvoicestatic->fetch($object->fk_doc);
893
894 if ($result > 0) {
895 $label_element = $supplierinvoicestatic->getNomUrl(1);
896 } else {
897 $label_element = $object->doc_ref;
898 }
899 } elseif ($object->doc_type === 'expense_report' && !empty($object->fk_doc)) {
900 $expensereportstatic = new ExpenseReport($db);
901 $result = $expensereportstatic->fetch($object->fk_doc);
902
903 if ($result > 0) {
904 $label_element = $expensereportstatic->getNomUrl(1);
905 } else {
906 $label_element = $object->doc_ref;
907 }
908 } else {
909 $label_element = $object->doc_ref;
910 }
911 print $label_element;
912 }
913 print '</td>';
914 print '</tr>';
915
916 // Date
917 print '<tr><td>';
918 print '<table class="nobordernopadding centpercent"><tr><td>';
919 print $langs->trans('Docdate');
920 print '</td>';
921 if ($action != 'editdate') {
922 print '<td class="right">';
923 if ($permissiontoadd && empty($object->date_validation)) {
924 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>';
925 }
926 print '</td>';
927 }
928 print '</tr></table>';
929 print '</td><td colspan="3">';
930 if ($action == 'editdate' && empty($object->date_validation)) {
931 print '<form name="setdate" action="'.$_SERVER["PHP_SELF"].'?piece_num='.((int) $object->piece_num).'" method="POST">';
932 if ($optioncss != '') {
933 print '<input type="hidden" name="optioncss" value="'.$optioncss.'">';
934 }
935 print '<input type="hidden" name="token" value="'.newToken().'">';
936 print '<input type="hidden" name="action" value="setdate">';
937 print '<input type="hidden" name="mode" value="'.$mode.'">';
938 print '<input type="hidden" name="backtopage" value="'.$backtopage.'">';
939 print '<input type="hidden" name="type" value="'.$type.'">';
940 print $form->selectDate($object->doc_date ? $object->doc_date : -1, 'doc_date', 0, 0, 0, "setdate");
941 print '<input type="submit" class="button button-edit" value="'.$langs->trans('Modify').'">';
942 print '</form>';
943 } else {
944 print $object->doc_date ? dol_print_date($object->doc_date, 'day') : '&nbsp;';
945 }
946 print '</td>';
947 print '</tr>';
948
949 // Journal
950 print '<tr><td>';
951 print '<table class="nobordernopadding centpercent"><tr><td>';
952 print $langs->trans('Codejournal');
953 print '</td>';
954 if ($action != 'editjournal') {
955 print '<td class="right">';
956 if ($permissiontoadd && empty($object->date_validation)) {
957 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>';
958 }
959 print '</td>';
960 }
961 print '</tr></table>';
962 print '</td><td>';
963 if ($action == 'editjournal' && empty($object->date_validation)) {
964 print '<form name="setjournal" action="'.$_SERVER["PHP_SELF"].'?piece_num='.((int) $object->piece_num).'" method="POST">';
965 if ($optioncss != '') {
966 print '<input type="hidden" name="optioncss" value="'.$optioncss.'">';
967 }
968 print '<input type="hidden" name="token" value="'.newToken().'">';
969 print '<input type="hidden" name="action" value="setjournal">';
970 print '<input type="hidden" name="mode" value="'.$mode.'">';
971 print '<input type="hidden" name="backtopage" value="'.$backtopage.'">';
972 print '<input type="hidden" name="type" value="'.$type.'">';
973 print $formaccounting->select_journal($object->code_journal, 'code_journal', 0, 0, 0, 1, '');
974 print '<input type="submit" class="button button-edit" value="'.$langs->trans('Modify').'">';
975 print '</form>';
976 } else {
977 // Get information of a journal
978 $accountingjournalstatic = new AccountingJournal($db);
979 $accountingjournalstatic->fetch(0, $object->code_journal);
980 $journal = $accountingjournalstatic->code;
981 $journal_label = $accountingjournalstatic->label;
982
983 print $accountingjournalstatic->getNomUrl(1, 1, 1);
984 }
985 print '</td>';
986 print '</tr>';
987
988 print '</table>';
989
990 print '</div>';
991
992
993 print '<div class="fichehalfright">';
994
995 print '<div class="underbanner clearboth"></div>';
996 print '<table class="border tableforfield centpercent">';
997
998 // Doc type
999 if (!empty($object->doc_type)) {
1000 print '<tr>';
1001 print '<td class="titlefield">'.$langs->trans("Doctype").'</td>';
1002 print '<td>'.$object->doc_type.'</td>';
1003 print '</tr>';
1004 }
1005
1006 // Date document creation
1007 print '<tr>';
1008 print '<td class="titlefield">'.$langs->trans("DateCreation").'</td>';
1009 print '<td>';
1010 print $object->date_creation ? dol_print_date($object->date_creation, 'day') : '&nbsp;';
1011 print '</td>';
1012 print '</tr>';
1013
1014 // Due date (if invoice)
1015 //if (in_array($object->doc_type, array('customer_invoice', 'supplier_invoice'))) {
1016 print '<tr>';
1017 print '<td class="titlefield">' . $form->textwithpicto($langs->trans('DateDue'), $langs->trans("IfTransactionHasDueDate")) . '</td>';
1018 print '<td>';
1019 print $object->date_lim_reglement ? dol_print_date($object->date_lim_reglement, 'day') : '&nbsp;';
1020 print '</td>';
1021 print '</tr>';
1022 //}
1023
1024 // Don't show in tmp mode, inevitably empty
1025 if ($mode != "_tmp") {
1026 // Date document export
1027 print '<tr>';
1028 print '<td class="titlefield">' . $langs->trans("DateExport") . '</td>';
1029 print '<td>';
1030 print $object->date_export ? img_picto($langs->trans("TransactionExportDesc"), 'fa-file-export', 'class="pictofixedwidth opacitymedium"').dol_print_date($object->date_export, 'dayhour') : '&nbsp;';
1031 print '</td>';
1032 print '</tr>';
1033
1034 // Date document validation
1035 print '<tr>';
1036 print '<td class="titlefield">' . $langs->trans("DateValidation") . '</td>';
1037 print '<td>';
1038 print $object->date_validation ? img_picto($langs->trans("TransactionBlockedLockedDesc"), 'fa-lock', 'class="pictofixedwidth opacitymedium"').dol_print_date($object->date_validation, 'dayhour') : '&nbsp;';
1039 print '</td>';
1040 print '</tr>';
1041
1042 // Id_import
1043 if (!empty($object->import_key)) {
1044 print '<tr>';
1045 print '<td class="titlefield">' . $langs->trans("ImportId") . '</td>';
1046 print '<td>';
1047 print $object->import_key;
1048 print '</td>';
1049 print '</tr>';
1050 }
1051 }
1052
1053 // Validate
1054 /*
1055 print '<tr>';
1056 print '<td class="titlefield">' . $langs->trans("Status") . '</td>';
1057 print '<td>';
1058 if (empty($object->validated)) {
1059 print '<a class="reposition" href="' . $_SERVER["PHP_SELF"] . '?piece_num=' . $line->id . '&action=enable&token='.newToken().'">';
1060 print img_picto($langs->trans("Disabled"), 'switch_off');
1061 print '</a>';
1062 } else {
1063 print '<a class="reposition" href="' . $_SERVER["PHP_SELF"] . '?piece_num=' . $line->id . '&action=disable&token='.newToken().'">';
1064 print img_picto($langs->trans("Activated"), 'switch_on');
1065 print '</a>';
1066 }
1067 print '</td>';
1068 print '</tr>';
1069 */
1070
1071 // check data
1072 /*
1073 print '<tr>';
1074 print '<td class="titlefield">' . $langs->trans("Control") . '</td>';
1075 if ($object->doc_type == 'customer_invoice')
1076 {
1077 $sqlmid = 'SELECT rowid as ref';
1078 $sqlmid .= " FROM ".MAIN_DB_PREFIX."facture as fac";
1079 $sqlmid .= " WHERE fac.rowid=" . ((int) $object->fk_doc);
1080 dol_syslog("accountancy/bookkeeping/card.php::sqlmid=" . $sqlmid, LOG_DEBUG);
1081 $resultmid = $db->query($sqlmid);
1082 if ($resultmid) {
1083 $objmid = $db->fetch_object($resultmid);
1084 $invoicestatic = new Facture($db);
1085 $invoicestatic->fetch($objmid->ref);
1086 $ref=$langs->trans("Invoice").' '.$invoicestatic->getNomUrl(1);
1087 }
1088 else dol_print_error($db);
1089 }
1090 print '<td>' . $ref .'</td>';
1091 print '</tr>';
1092 */
1093 print "</table>\n";
1094
1095 print '</div>';
1096
1097 print '</div>';
1098 print '<div class="clearboth"></div>';
1099
1100
1101 print dol_get_fiche_end();
1102
1103
1104 $result = $object->fetchAllPerMvt($piece_num, $mode); // This load $object->linesmvt
1105
1106 if ($result < 0) {
1107 setEventMessages($object->error, $object->errors, 'errors');
1108 } else {
1109 // Variable that contains all transaction lines
1110 $tmptoselect = array();
1111 $atleastonevalidated = 0;
1112 $atleastoneexported = 0;
1113 foreach ($object->linesmvt as $line) {
1114 $tmptoselect[] = $line->id;
1115 if (!empty($line->date_validation)) {
1116 $atleastonevalidated = 1;
1117 }
1118 if (!empty($line->date_export) || !empty($line->date_validation)) {
1119 $atleastoneexported = 1;
1120 }
1121 }
1122
1123 if ($mode != '_tmp' && !$atleastonevalidated) {
1124 print "\n".'<div class="tabsAction">'."\n";
1125
1126 $parameters = array();
1127 $reshook = $hookmanager->executeHooks('addMoreActionsButtons', $parameters, $object, $action); // Note that $action and $object may have been modified by hook
1128 if (empty($reshook)) {
1129 if ($permissiontodelete) {
1130 if (!isset($hookmanager->resArray['no_button_edit']) || $hookmanager->resArray['no_button_edit'] != 1) {
1131 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);
1132 }
1133 }
1134 if ($permissiontoadd) {
1135 print dolGetButtonAction('', $langs->trans('Clone'), 'clone', DOL_URL_ROOT.'/accountancy/bookkeeping/card.php?action=clonebookkeepingwriting&token=' . newToken() . '&piece_num=' . ((int) $object->piece_num) . '&toselect=' . implode(',', $tmptoselect), 'action-clone', $permissiontoadd);
1136 }
1137 }
1138
1139 print '</div>';
1140 }
1141
1142 // List of movements
1143 print load_fiche_titre($langs->trans("ListeMvts"), '', '');
1144
1145 if (empty($object->date_validation)) {
1146 print '<form action="' . $_SERVER["PHP_SELF"] . '?piece_num=' . ((int) $object->piece_num) . '" method="POST">';
1147 if ($optioncss != '') {
1148 print '<input type="hidden" name="optioncss" value="' . $optioncss . '">';
1149 }
1150 print '<input type="hidden" name="token" value="' . newToken() . '">';
1151 print '<input type="hidden" name="doc_date" value="' . $object->doc_date . '">' . "\n";
1152 print '<input type="hidden" name="doc_type" value="' . $object->doc_type . '">' . "\n";
1153 print '<input type="hidden" name="doc_ref" value="' . $object->doc_ref . '">' . "\n";
1154 print '<input type="hidden" name="ref" value="' . $object->ref . '">' . "\n";
1155 print '<input type="hidden" name="code_journal" value="' . $object->code_journal . '">' . "\n";
1156 print '<input type="hidden" name="fk_doc" value="' . $object->fk_doc . '">' . "\n";
1157 print '<input type="hidden" name="fk_docdet" value="' . $object->fk_docdet . '">' . "\n";
1158 print '<input type="hidden" name="mode" value="' . $mode . '">' . "\n";
1159 print '<input type="hidden" name="backtopage" value="' . $backtopage . '">';
1160 print '<input type="hidden" name="type" value="' . $type . '">';
1161 }
1162
1163 if (count($object->linesmvt) > 0) {
1164 print '<div class="div-table-responsive-no-min">';
1165 print '<table class="noborder centpercent">';
1166
1167 $total_debit = 0;
1168 $total_credit = 0;
1169
1170 print '<tr class="liste_titre">';
1171
1172 print_liste_field_titre("AccountAccountingShort");
1173 print_liste_field_titre("SubledgerAccount");
1174 print_liste_field_titre("LabelOperation");
1175 print_liste_field_titre("AccountingDebit", "", "", "", "", 'class="right"');
1176 print_liste_field_titre("AccountingCredit", "", "", "", "", 'class="right"');
1177 if (empty($object->date_validation)) {
1178 print_liste_field_titre("Action", "", "", "", "", 'width="60"', "", "", 'center ');
1179 } else {
1181 }
1182
1183 print "</tr>\n";
1184
1185 // Add an empty line if there is not yet
1186 if (!empty($object->linesmvt[0]) && empty($object->date_validation)) {
1187 $tmpline = $object->linesmvt[0];
1188 if (!empty($tmpline->numero_compte)) {
1189 $line = new BookKeepingLine($db);
1190 $object->linesmvt[] = $line;
1191 }
1192 }
1193
1194 foreach ($object->linesmvt as $line) {
1195 $total_debit += $line->debit;
1196 $total_credit += $line->credit;
1197
1198 if ($action == 'update' && $line->id == $id && empty($object->date_validation)) {
1199 print '<tr class="oddeven" data-lineid="'.((int) $line->id).'">';
1200 print '<!-- td columns in edit mode -->';
1201 print '<td>';
1202 print $formaccounting->select_account((GETPOSTISSET("accountingaccount_number") ? GETPOST("accountingaccount_number", "alpha") : $line->numero_compte), 'accountingaccount_number', 1, array(), 1, 1, 'minwidth200 maxwidth500');
1203 print '</td>';
1204 print '<td>';
1205 print $formaccounting->select_auxaccount((GETPOSTISSET("subledger_account") ? GETPOST("subledger_account", "alpha") : $line->subledger_account), 'subledger_account', 1, 'maxwidth250', '', 'subledger_label');
1206 // Add also input for subledger label
1207 print '<br><input type="text" class="maxwidth150" name="subledger_label" id="subledger_label" value="'.(GETPOSTISSET("subledger_label") ? GETPOST("subledger_label", "alpha") : $line->subledger_label).'" placeholder="'.dol_escape_htmltag($langs->trans("SubledgerAccountLabel")).'">';
1208 print '</td>';
1209 print '<td><input type="text" class="minwidth200" name="label_operation" value="'.(GETPOSTISSET("label_operation") ? GETPOST("label_operation", "alpha") : $line->label_operation).'"></td>';
1210 print '<td class="right"><input type="text" class="right width50" name="debit" value="'.(GETPOSTISSET("debit") ? GETPOST("debit", "alpha") : price($line->debit)).'"></td>';
1211 print '<td class="right"><input type="text" class="right width50" name="credit" value="'.(GETPOSTISSET("credit") ? GETPOST("credit", "alpha") : price($line->credit)).'"></td>';
1212 print '<td>';
1213 print '<input type="hidden" name="id" value="'.$line->id.'">'."\n";
1214 print '<input type="submit" class="button" name="update" value="'.$langs->trans("Update").'">';
1215 print '</td>';
1216 print "</tr>\n";
1217 } elseif ((empty($line->numero_compte) || (empty($line->debit) && empty($line->credit))) && empty($object->date_validation)) {
1218 if (($action == "" || $action == 'add') && $permissiontoadd) {
1219 print '<tr class="oddeven" data-lineid="'.((int) $line->id).'">';
1220 print '<!-- td columns in add mode -->';
1221 print '<td>';
1222 print $formaccounting->select_account($action == 'add' ? GETPOST('accountingaccount_number') : '', 'accountingaccount_number', 1, array(), 1, 1, 'minwidth200 maxwidth500');
1223 print '</td>';
1224 print '<td>';
1225 print $formaccounting->select_auxaccount('', 'subledger_account', 1, 'maxwidth250', '', 'subledger_label');
1226 print '<br><input type="text" class="maxwidth150" name="subledger_label" id="subledger_label" value="" placeholder="' . dol_escape_htmltag($langs->trans("SubledgerAccountLabel")) . '">';
1227 print '</td>';
1228 print '<td><input type="text" class="minwidth200" name="label_operation" value="' . dol_escape_htmltag($label_operation) . '"/></td>';
1229 print '<td class="right"><input type="text" class="right width50" name="debit" value=""/></td>';
1230 print '<td class="right"><input type="text" class="right width50" name="credit" value=""/></td>';
1231 print '<td class="center"><input type="submit" class="button small" name="save" value="' . $langs->trans("Add") . '"></td>';
1232 print "</tr>\n";
1233 }
1234 } else {
1235 print '<tr class="oddeven" data-lineid="'.((int) $line->id).'">';
1236 print '<!-- td columns in display mode -->';
1237 $resultfetch = $accountingaccount->fetch(0, $line->numero_compte, true);
1238 print '<td>';
1239 if ($resultfetch > 0) {
1240 print $accountingaccount->getNomUrl(0, 1, 1, '', 0);
1241 } else {
1242 print dol_escape_htmltag($line->numero_compte).' <span class="warning">('.$langs->trans("AccountRemovedFromCurrentChartOfAccount").')</span>';
1243 }
1244 print '</td>';
1245 print '<td>'.length_accounta($line->subledger_account);
1246 if ($line->subledger_label) {
1247 print ' - <span class="opacitymedium">'.dol_escape_htmltag($line->subledger_label).'</span>';
1248 }
1249 print '</td>';
1250 print '<td>'.$line->label_operation.'</td>';
1251 print '<td class="right nowraponall amount">'.($line->debit != 0 ? price($line->debit) : '').'</td>';
1252 print '<td class="right nowraponall amount">'.($line->credit != 0 ? price($line->credit) : '').'</td>';
1253
1254 print '<td class="center nowraponall">';
1255 if ($permissiontoadd) {
1256 if (empty($line->date_export) && empty($line->date_validation)) {
1257 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()) . '">';
1258 print img_edit('', 0, 'class="marginrightonly"');
1259 print '</a> &nbsp;';
1260 } else {
1261 print '<a class="editfielda nohover cursornotallowed reposition disabled" href="#" title="'.dol_escape_htmltag($langs->trans("ForbiddenTransactionAlreadyExported")).'">';
1262 print img_edit($langs->trans("ForbiddenTransactionAlreadyExported"), 0, 'class="marginrightonly"');
1263 print '</a> &nbsp;';
1264 }
1265
1266 if (empty($line->date_validation)) {
1267 $actiontodelete = 'delete';
1268 if ($mode == '_tmp' || $action != 'delmouv') {
1269 $actiontodelete = 'confirm_delete';
1270 }
1271
1272 print '<a href="' . $_SERVER["PHP_SELF"] . '?action=' . $actiontodelete . '&id=' . $line->id . '&piece_num=' . ((int) $line->piece_num) . '&mode=' . urlencode((string) $mode) . '&token=' . urlencode(newToken()) . '">';
1273 print img_delete();
1274 print '</a>';
1275 } else {
1276 print '<a class="editfielda nohover cursornotallowed disabled" href="#" title="'.dol_escape_htmltag($langs->trans("ForbiddenTransactionAlreadyExported")).'">';
1277 print img_delete($langs->trans("ForbiddenTransactionAlreadyValidated"));
1278 print '</a>';
1279 }
1280 }
1281 print '</td>';
1282 print "</tr>\n";
1283 }
1284 }
1285
1286 $total_debit = price2num($total_debit, 'MT');
1287 $total_credit = price2num($total_credit, 'MT');
1288
1289 if ($total_debit != $total_credit) {
1290 setEventMessages(null, array($langs->trans('MvtNotCorrectlyBalanced', $total_debit, $total_credit)), 'warnings');
1291 }
1292
1293 print '</table>';
1294 print '</div>';
1295
1296 if ($mode == '_tmp' && $action == '' && $permissiontoadd) {
1297 print '<br>';
1298 print '<div class="center">';
1299 if (empty($total_debit) && empty($total_credit)) {
1300 print '<a class="button disabled cursornotallowed" disabled="disabled" href="#" title="'.dol_escape_htmltag($langs->trans("EnterNonEmptyLinesFirst")).'">'.dol_escape_htmltag($langs->trans("ValidTransaction")).'</a>';
1301 } elseif ($total_debit == $total_credit) {
1302 print '<a class="button" href="'.$_SERVER["PHP_SELF"].'?piece_num='.((int) $object->piece_num).(!empty($type) ? '&type=sub' : '').'&backtopage='.urlencode($backtopage).'&action=valid&token='.newToken().'">'.$langs->trans("ValidTransaction").'</a>';
1303 } else {
1304 print '<a class="button disabled cursornotallowed" disabled="disabled" href="#" title="'.dol_escape_htmltag($langs->trans("MvtNotCorrectlyBalanced", $total_debit, $total_credit)).'">'.dol_escape_htmltag($langs->trans("ValidTransaction")).'</a>';
1305 }
1306
1307 print ' &nbsp; ';
1308 print '<a class="button button-cancel" href="'.$backtopage.(!empty($type) ? '?type=sub' : '').'">'.$langs->trans("Cancel").'</a>';
1309
1310 print "</div>";
1311 }
1312 }
1313
1314 print '</form>';
1315 }
1316 } else {
1317 print $langs->trans("NoRecordFound");
1318 }
1319}
1320
1321print dol_get_fiche_end();
1322
1323// End of page
1324llxFooter();
1325$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
accounting_transaction_prepare_head(BookKeeping $object, $mode='', $type='', $backtopage='/accountancy/bookkeeping/listbyaccount.php')
Prepare array with list of tabs for accounting transaction.
checkGeneralAccountAllowsAuxiliary($db, $general_account, $auxiliary_account, $general_account_id=0)
Check if a general accounting account allows the use of an auxiliary account.
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
$object ref
Definition info.php:90
Class to manage accounting accounts.
Class to manage accounting journals.
Class to manage Ledger (General Ledger and Subledger)
Class BookKeepingLine.
Class for BookkeepingTemplate.
Class to manage Trips and Expenses.
Class to manage suppliers invoices.
Class to manage invoices.
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.
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.
$date_start
Variables from include:
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.
print_liste_field_titre($name, $file="", $field="", $begin="", $param="", $moreattrib="", $sortfield="", $sortorder="", $prefix="", $tooltip="", $forcenowrapcolumntitle=0)
Show title line of an array.
img_picto($titlealt, $picto, $moreatt='', $pictoisfullpath=0, $srconly=0, $notitle=0, $alt='', $morecss='', $marginleftonlyshort=2, $allowothertags=array())
Show picto whatever it's its name (generic function)
img_delete($titlealt='default', $other='class="pictodelete"', $morecss='')
Show delete logo.
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.
dol_strlen($string, $stringencoding='UTF-8')
Make a strlen call.
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.
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, $nodefault=0)
Return value of a param into GET or POST supervariable.
dolGetButtonAction($label, $text='', $actionType='default', $url='', $id='', $userRight=1, $params=array())
Function dolGetButtonAction.
GETPOSTINT($paramname, $method=0, $nodefault=0)
Return the value of a $_GET or $_POST supervariable, converted into integer.
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.
GETPOSTISSET($paramname)
Return true if we are in a context of submitting the parameter $paramname from a POST of a form.
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...
print $langs trans("Show") . '< td style="' . $timeColor . '" align="center"> s</td > badge status0 badge status4 badge status3 Error badge status8< td align="center">< span class="badge ' . $badge . '"></span ></td >< td align="center">< a href="#" class="button button-small" onclick="openLogModal(this)" data-req="' . dol_escape_htmltag($reqSafe) . '" data-res="' . dol_escape_htmltag($resSafe) . '" data-err="' . dol_escape_htmltag($errSafe) . '">< span class="fa fa-search-plus"></span ></a ></td ></tr >< tr >< td colspan="' . $colspan . '" class="opacitymedium"></td ></tr ></table ></div ></form > logModal none logModal none s a JSON string
buildzip.php
accessforbidden($message='', $printheader=1, $printfooter=1, $showonlymessage=0, $params=null)
Show a message to say access is forbidden and stop program.