dolibarr  18.0.0
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-2022 Alexandre Spangaro <aspangaro@open-dsi.fr>
5  * Copyright (C) 2017 Laurent Destailleur <eldy@users.sourceforge.net>
6  * Copyright (C) 2018-2020 Frédéric France <frederic.france@netlogic.fr>
7  *
8  * This program is free software; you can redistribute it and/or modify
9  * it under the terms of the GNU General Public License as published by
10  * the Free Software Foundation; either version 3 of the License, or
11  * (at your option) any later version.
12  *
13  * This program is distributed in the hope that it will be useful,
14  * but WITHOUT ANY WARRANTY; without even the implied warranty of
15  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16  * GNU General Public License for more details.
17  *
18  * You should have received a copy of the GNU General Public License
19  * along with this program. If not, see <https://www.gnu.org/licenses/>.
20  */
21 
28 // Load Dolibarr environment
29 require '../../main.inc.php';
30 require_once DOL_DOCUMENT_ROOT.'/core/lib/accounting.lib.php';
31 require_once DOL_DOCUMENT_ROOT.'/accountancy/class/bookkeeping.class.php';
32 require_once DOL_DOCUMENT_ROOT.'/core/class/html.formaccounting.class.php';
33 require_once DOL_DOCUMENT_ROOT.'/compta/facture/class/facture.class.php';
34 require_once DOL_DOCUMENT_ROOT.'/fourn/class/fournisseur.facture.class.php';
35 require_once DOL_DOCUMENT_ROOT.'/accountancy/class/accountingjournal.class.php';
36 require_once DOL_DOCUMENT_ROOT.'/accountancy/class/accountingaccount.class.php';
37 
38 // Load translation files required by the page
39 $langs->loadLangs(array("accountancy", "bills", "compta"));
40 
41 $action = GETPOST('action', 'aZ09');
42 $cancel = GETPOST('cancel', 'aZ09');
43 
44 $optioncss = GETPOST('optioncss', 'aZ'); // Option for the css output (always '' except when 'print')
45 
46 $id = GETPOST('id', 'int'); // id of record
47 $mode = GETPOST('mode', 'aZ09'); // '' or '_tmp'
48 $piece_num = GETPOST("piece_num", 'int'); // id of transaction (several lines share the same transaction id)
49 
50 $accountingaccount = new AccountingAccount($db);
51 $accountingjournal = new AccountingJournal($db);
52 
53 $accountingaccount_number = GETPOST('accountingaccount_number', 'alphanohtml');
54 $accountingaccount->fetch(null, $accountingaccount_number, true);
55 $accountingaccount_label = $accountingaccount->label;
56 
57 $journal_code = GETPOST('code_journal', 'alpha');
58 $accountingjournal->fetch(null, $journal_code);
59 $journal_label = $accountingjournal->label;
60 
61 $subledger_account = GETPOST('subledger_account', 'alphanohtml');
62 if ($subledger_account == -1) {
63  $subledger_account = null;
64 }
65 $subledger_label = GETPOST('subledger_label', 'alphanohtml');
66 
67 $label_operation = GETPOST('label_operation', 'alphanohtml');
68 $debit = price2num(GETPOST('debit', 'alpha'));
69 $credit = price2num(GETPOST('credit', 'alpha'));
70 
71 $save = GETPOST('save', 'alpha');
72 if (!empty($save)) {
73  $action = 'add';
74 }
75 $update = GETPOST('update', 'alpha');
76 if (!empty($update)) {
77  $action = 'confirm_update';
78 }
79 
80 $object = new BookKeeping($db);
81 
82 // Security check
83 if (!isModEnabled('accounting')) {
85 }
86 if ($user->socid > 0) {
88 }
89 if (!$user->hasRight('accounting', 'mouvements', 'lire')) {
91 }
92 
93 
94 /*
95  * Actions
96  */
97 
98 if ($cancel) {
99  header("Location: ".DOL_URL_ROOT.'/accountancy/bookkeeping/list.php');
100  exit;
101 }
102 
103 if ($action == "confirm_update") {
104  $error = 0;
105 
106  if ((floatval($debit) != 0.0) && (floatval($credit) != 0.0)) {
107  $error++;
108  setEventMessages($langs->trans('ErrorDebitCredit'), null, 'errors');
109  $action = 'update';
110  }
111  if (empty($accountingaccount_number) || $accountingaccount_number == '-1') {
112  $error++;
113  setEventMessages($langs->trans('ErrorFieldRequired', $langs->transnoentitiesnoconv("AccountAccountingShort")), null, 'errors');
114  $action = 'update';
115  }
116 
117  if (!$error) {
118  $object = new BookKeeping($db);
119 
120  $result = $object->fetch($id, null, $mode);
121  if ($result < 0) {
122  $error++;
123  setEventMessages($object->error, $object->errors, 'errors');
124  } else {
125  $object->numero_compte = $accountingaccount_number;
126  $object->subledger_account = $subledger_account;
127  $object->subledger_label = $subledger_label;
128  $object->label_compte = $accountingaccount_label;
129  $object->label_operation = $label_operation;
130  $object->debit = $debit;
131  $object->credit = $credit;
132 
133  if (floatval($debit) != 0.0) {
134  $object->montant = $debit; // deprecated
135  $object->amount = $debit;
136  $object->sens = 'D';
137  }
138  if (floatval($credit) != 0.0) {
139  $object->montant = $credit; // deprecated
140  $object->amount = $credit;
141  $object->sens = 'C';
142  }
143 
144  $result = $object->update($user, false, $mode);
145  if ($result < 0) {
146  setEventMessages($object->error, $object->errors, 'errors');
147  } else {
148  if ($mode != '_tmp') {
149  setEventMessages($langs->trans('RecordSaved'), null, 'mesgs');
150  }
151 
152  $debit = 0;
153  $credit = 0;
154 
155  $action = '';
156  }
157  }
158  }
159 } elseif ($action == "add") {
160  $error = 0;
161 
162  if ((floatval($debit) != 0.0) && (floatval($credit) != 0.0)) {
163  $error++;
164  setEventMessages($langs->trans('ErrorDebitCredit'), null, 'errors');
165  $action = '';
166  }
167  if (empty($accountingaccount_number) || $accountingaccount_number == '-1') {
168  $error++;
169  setEventMessages($langs->trans('ErrorFieldRequired', $langs->transnoentitiesnoconv("AccountAccountingShort")), null, 'errors');
170  $action = '';
171  }
172 
173  if (!$error) {
174  $object = new BookKeeping($db);
175 
176  $object->numero_compte = $accountingaccount_number;
177  $object->subledger_account = $subledger_account;
178  $object->subledger_label = $subledger_label;
179  $object->label_compte = $accountingaccount_label;
180  $object->label_operation = $label_operation;
181  $object->debit = $debit;
182  $object->credit = $credit;
183  $object->doc_date = (string) GETPOST('doc_date', 'alpha');
184  $object->doc_type = (string) GETPOST('doc_type', 'alpha');
185  $object->piece_num = $piece_num;
186  $object->doc_ref = (string) GETPOST('doc_ref', 'alpha');
187  $object->code_journal = $journal_code;
188  $object->journal_label = $journal_label;
189  $object->fk_doc = GETPOSTINT('fk_doc');
190  $object->fk_docdet = GETPOSTINT('fk_docdet');
191 
192  if (floatval($debit) != 0.0) {
193  $object->montant = $debit; // deprecated
194  $object->amount = $debit;
195  $object->sens = 'D';
196  }
197 
198  if (floatval($credit) != 0.0) {
199  $object->montant = $credit; // deprecated
200  $object->amount = $credit;
201  $object->sens = 'C';
202  }
203 
204  $result = $object->createStd($user, false, $mode);
205  if ($result < 0) {
206  setEventMessages($object->error, $object->errors, 'errors');
207  } else {
208  if ($mode != '_tmp') {
209  setEventMessages($langs->trans('RecordSaved'), null, 'mesgs');
210  }
211 
212  $debit = 0;
213  $credit = 0;
214 
215  $action = '';
216  }
217  }
218 } elseif ($action == "confirm_delete") {
219  $object = new BookKeeping($db);
220 
221  $result = $object->fetch($id, null, $mode);
222  $piece_num = $object->piece_num;
223 
224  if ($result < 0) {
225  setEventMessages($object->error, $object->errors, 'errors');
226  } else {
227  $result = $object->delete($user, false, $mode);
228  if ($result < 0) {
229  setEventMessages($object->error, $object->errors, 'errors');
230  }
231  }
232  $action = '';
233 } elseif ($action == "confirm_create") {
234  $error = 0;
235 
236  $object = new BookKeeping($db);
237 
238  if (!$journal_code || $journal_code == '-1') {
239  setEventMessages($langs->trans('ErrorFieldRequired', $langs->transnoentitiesnoconv("Journal")), null, 'errors');
240  $action = 'create';
241  $error++;
242  }
243  if (!GETPOST('doc_ref', 'alpha')) {
244  setEventMessages($langs->trans("ErrorFieldRequired", $langs->transnoentitiesnoconv("Piece")), null, 'errors');
245  $action = 'create';
246  $error++;
247  }
248 
249  if (!$error) {
250  $object->label_compte = '';
251  $object->debit = 0;
252  $object->credit = 0;
253  $object->doc_date = $date_start = dol_mktime(0, 0, 0, GETPOST('doc_datemonth', 'int'), GETPOST('doc_dateday', 'int'), GETPOST('doc_dateyear', 'int'));
254  $object->doc_type = GETPOST('doc_type', 'alpha');
255  $object->piece_num = GETPOST('next_num_mvt', 'alpha');
256  $object->doc_ref = GETPOST('doc_ref', 'alpha');
257  $object->code_journal = $journal_code;
258  $object->journal_label = $journal_label;
259  $object->fk_doc = 0;
260  $object->fk_docdet = 0;
261  $object->montant = 0; // deprecated
262  $object->amount = 0;
263 
264  $result = $object->createStd($user, 0, $mode);
265  if ($result < 0) {
266  setEventMessages($object->error, $object->errors, 'errors');
267  } else {
268  if ($mode != '_tmp') {
269  setEventMessages($langs->trans('RecordSaved'), null, 'mesgs');
270  }
271  $action = '';
272  $id = $object->id;
273  $piece_num = $object->piece_num;
274  }
275  }
276 }
277 
278 if ($action == 'setdate') {
279  $datedoc = dol_mktime(0, 0, 0, GETPOST('doc_datemonth', 'int'), GETPOST('doc_dateday', 'int'), GETPOST('doc_dateyear', 'int'));
280  $result = $object->updateByMvt($piece_num, 'doc_date', $db->idate($datedoc), $mode);
281  if ($result < 0) {
282  setEventMessages($object->error, $object->errors, 'errors');
283  } else {
284  if ($mode != '_tmp') {
285  setEventMessages($langs->trans('RecordSaved'), null, 'mesgs');
286  }
287  $action = '';
288  }
289 }
290 
291 if ($action == 'setjournal') {
292  $result = $object->updateByMvt($piece_num, 'code_journal', $journal_code, $mode);
293  $result = $object->updateByMvt($piece_num, 'journal_label', $journal_label, $mode);
294  if ($result < 0) {
295  setEventMessages($object->error, $object->errors, 'errors');
296  } else {
297  if ($mode != '_tmp') {
298  setEventMessages($langs->trans('RecordSaved'), null, 'mesgs');
299  }
300  $action = '';
301  }
302 }
303 
304 if ($action == 'setdocref') {
305  $refdoc = GETPOST('doc_ref', 'alpha');
306  $result = $object->updateByMvt($piece_num, 'doc_ref', $refdoc, $mode);
307  if ($result < 0) {
308  setEventMessages($object->error, $object->errors, 'errors');
309  } else {
310  if ($mode != '_tmp') {
311  setEventMessages($langs->trans('RecordSaved'), null, 'mesgs');
312  }
313  $action = '';
314  }
315 }
316 
317 // Validate transaction
318 if ($action == 'valid') {
319  $result = $object->transformTransaction(0, $piece_num);
320  if ($result < 0) {
321  setEventMessages($object->error, $object->errors, 'errors');
322  } else {
323  header("Location: list.php?sortfield=t.piece_num&sortorder=asc");
324  exit;
325  }
326 }
327 
328 
329 /*
330  * View
331  */
332 
333 $html = new Form($db);
334 $formaccounting = new FormAccounting($db);
335 
336 $title = $langs->trans("CreateMvts");
337 
338 llxHeader('', $title);
339 
340 // Confirmation to delete the command
341 if ($action == 'delete') {
342  $formconfirm = $html->formconfirm($_SERVER["PHP_SELF"].'?id='.$id.'&mode='.$mode, $langs->trans('DeleteMvt'), $langs->trans('ConfirmDeleteMvt', $langs->transnoentitiesnoconv("RegistrationInAccounting")), 'confirm_delete', '', 0, 1);
343  print $formconfirm;
344 }
345 
346 if ($action == 'create') {
347  print load_fiche_titre($title);
348 
349  $object = new BookKeeping($db);
350  $next_num_mvt = $object->getNextNumMvt('_tmp');
351 
352  if (empty($next_num_mvt)) {
353  dol_print_error('', 'Failed to get next piece number');
354  }
355 
356  print '<form action="'.$_SERVER["PHP_SELF"].'" name="create_mvt" method="POST">';
357  if ($optioncss != '') {
358  print '<input type="hidden" name="optioncss" value="'.$optioncss.'">';
359  }
360  print '<input type="hidden" name="token" value="'.newToken().'">';
361  print '<input type="hidden" name="action" value="confirm_create">'."\n";
362  print '<input type="hidden" name="next_num_mvt" value="'.$next_num_mvt.'">'."\n";
363  print '<input type="hidden" name="mode" value="_tmp">'."\n";
364 
365  print dol_get_fiche_head();
366 
367  print '<table class="border centpercent">';
368 
369  /*print '<tr>';
370  print '<td class="titlefieldcreate fieldrequired">' . $langs->trans("NumPiece") . '</td>';
371  print '<td>' . $next_num_mvt . '</td>';
372  print '</tr>';*/
373 
374  print '<tr>';
375  print '<td class="titlefieldcreate fieldrequired">'.$langs->trans("Docdate").'</td>';
376  print '<td>';
377  print $html->selectDate('', 'doc_date', '', '', '', "create_mvt", 1, 1);
378  print '</td>';
379  print '</tr>';
380 
381  print '<tr>';
382  print '<td class="fieldrequired">'.$langs->trans("Codejournal").'</td>';
383  print '<td>'.$formaccounting->select_journal($journal_code, 'code_journal', 0, 0, 1, 1).'</td>';
384  print '</tr>';
385 
386  print '<tr>';
387  print '<td class="fieldrequired">'.$langs->trans("Piece").'</td>';
388  print '<td><input type="text" class="minwidth200" name="doc_ref" value="'.GETPOST('doc_ref', 'alpha').'"></td>';
389  print '</tr>';
390 
391  /*
392  print '<tr>';
393  print '<td>' . $langs->trans("Doctype") . '</td>';
394  print '<td><input type="text" class="minwidth200 name="doc_type" value=""/></td>';
395  print '</tr>';
396  */
397 
398  print '</table>';
399 
400  print dol_get_fiche_end();
401 
402  print $form->buttonsSaveCancel("Create");
403 
404  print '</form>';
405 } else {
406  $object = new BookKeeping($db);
407  $result = $object->fetchPerMvt($piece_num, $mode);
408  if ($result < 0) {
409  setEventMessages($object->error, $object->errors, 'errors');
410  }
411 
412  if (!empty($object->piece_num)) {
413  $backlink = '<a href="'.DOL_URL_ROOT.'/accountancy/bookkeeping/list.php?restore_lastsearch_values=1">'.$langs->trans('BackToList').'</a>';
414 
415  if ($mode == '_tmp') {
416  print load_fiche_titre($langs->trans("CreateMvts"), $backlink);
417  } else {
418  print load_fiche_titre($langs->trans("UpdateMvts"), $backlink);
419  }
420 
421  $head = array();
422  $h = 0;
423  $head[$h][0] = $_SERVER['PHP_SELF'].'?piece_num='.$object->piece_num.($mode ? '&mode='.$mode : '');
424  $head[$h][1] = $langs->trans("Transaction");
425  $head[$h][2] = 'transaction';
426  $h++;
427 
428  print dol_get_fiche_head($head, 'transaction', '', -1);
429 
430  //dol_banner_tab($object, '', $backlink);
431 
432  print '<div class="fichecenter">';
433  print '<div class="fichehalfleft">';
434 
435  print '<div class="underbanner clearboth"></div>';
436  print '<table class="border tableforfield" width="100%">';
437 
438  // Account movement
439  print '<tr>';
440  print '<td class="titlefield">'.$langs->trans("NumMvts").'</td>';
441  print '<td>'.($mode == '_tmp' ? '<span class="opacitymedium" title="Id tmp '.$object->piece_num.'">'.$langs->trans("Draft").'</span>' : $object->piece_num).'</td>';
442  print '</tr>';
443 
444  // Date
445  print '<tr><td>';
446  print '<table class="nobordernopadding centpercent"><tr><td>';
447  print $langs->trans('Docdate');
448  print '</td>';
449  if ($action != 'editdate') {
450  print '<td class="right"><a class="editfielda reposition" href="'.$_SERVER["PHP_SELF"].'?action=editdate&token='.newToken().'&piece_num='.urlencode($object->piece_num).'&mode='.urlencode($mode).'">'.img_edit($langs->transnoentitiesnoconv('SetDate'), 1).'</a></td>';
451  }
452  print '</tr></table>';
453  print '</td><td colspan="3">';
454  if ($action == 'editdate') {
455  print '<form name="setdate" action="'.$_SERVER["PHP_SELF"].'?piece_num='.$object->piece_num.'" method="post">';
456  if ($optioncss != '') {
457  print '<input type="hidden" name="optioncss" value="'.$optioncss.'">';
458  }
459  print '<input type="hidden" name="token" value="'.newToken().'">';
460  print '<input type="hidden" name="action" value="setdate">';
461  print '<input type="hidden" name="mode" value="'.$mode.'">';
462  print $form->selectDate($object->doc_date ? $object->doc_date : - 1, 'doc_date', '', '', '', "setdate");
463  print '<input type="submit" class="button button-edit" value="'.$langs->trans('Modify').'">';
464  print '</form>';
465  } else {
466  print $object->doc_date ? dol_print_date($object->doc_date, 'day') : '&nbsp;';
467  }
468  print '</td>';
469  print '</tr>';
470 
471  // Journal
472  print '<tr><td>';
473  print '<table class="nobordernopadding" width="100%"><tr><td>';
474  print $langs->trans('Codejournal');
475  print '</td>';
476  if ($action != 'editjournal') {
477  print '<td class="right"><a class="editfielda reposition" href="'.$_SERVER["PHP_SELF"].'?action=editjournal&token='.newToken().'&piece_num='.urlencode($object->piece_num).'&mode='.urlencode($mode).'">'.img_edit($langs->transnoentitiesnoconv('Edit'), 1).'</a></td>';
478  }
479  print '</tr></table>';
480  print '</td><td>';
481  if ($action == 'editjournal') {
482  print '<form name="setjournal" action="'.$_SERVER["PHP_SELF"].'?piece_num='.$object->piece_num.'" method="post">';
483  if ($optioncss != '') {
484  print '<input type="hidden" name="optioncss" value="'.$optioncss.'">';
485  }
486  print '<input type="hidden" name="token" value="'.newToken().'">';
487  print '<input type="hidden" name="action" value="setjournal">';
488  print '<input type="hidden" name="mode" value="'.$mode.'">';
489  print $formaccounting->select_journal($object->code_journal, 'code_journal', 0, 0, array(), 1, 1);
490  print '<input type="submit" class="button button-edit" value="'.$langs->trans('Modify').'">';
491  print '</form>';
492  } else {
493  print $object->code_journal;
494  }
495  print '</td>';
496  print '</tr>';
497 
498  // Ref document
499  print '<tr><td>';
500  print '<table class="nobordernopadding" width="100%"><tr><td>';
501  print $langs->trans('Piece');
502  print '</td>';
503  if ($action != 'editdocref') {
504  print '<td class="right"><a class="editfielda reposition" href="'.$_SERVER["PHP_SELF"].'?action=editdocref&token='.newToken().'&piece_num='.urlencode($object->piece_num).'&mode='.urlencode($mode).'">'.img_edit($langs->transnoentitiesnoconv('Edit'), 1).'</a></td>';
505  }
506  print '</tr></table>';
507  print '</td><td>';
508  if ($action == 'editdocref') {
509  print '<form name="setdocref" action="'.$_SERVER["PHP_SELF"].'?piece_num='.$object->piece_num.'" method="post">';
510  if ($optioncss != '') {
511  print '<input type="hidden" name="optioncss" value="'.$optioncss.'">';
512  }
513  print '<input type="hidden" name="token" value="'.newToken().'">';
514  print '<input type="hidden" name="action" value="setdocref">';
515  print '<input type="hidden" name="mode" value="'.$mode.'">';
516  print '<input type="text" size="20" name="doc_ref" value="'.dol_escape_htmltag($object->doc_ref).'">';
517  print '<input type="submit" class="button button-edit" value="'.$langs->trans('Modify').'">';
518  print '</form>';
519  } else {
520  print $object->doc_ref;
521  }
522  print '</td>';
523  print '</tr>';
524 
525  print '</table>';
526 
527  print '</div>';
528 
529  print '<div class="fichehalfright">';
530 
531  print '<div class="underbanner clearboth"></div>';
532  print '<table class="border tableforfield centpercent">';
533 
534  // Doc type
535  if (!empty($object->doc_type)) {
536  print '<tr>';
537  print '<td class="titlefield">'.$langs->trans("Doctype").'</td>';
538  print '<td>'.$object->doc_type.'</td>';
539  print '</tr>';
540  }
541 
542  // Date document creation
543  print '<tr>';
544  print '<td class="titlefield">'.$langs->trans("DateCreation").'</td>';
545  print '<td>';
546  print $object->date_creation ? dol_print_date($object->date_creation, 'day') : '&nbsp;';
547  print '</td>';
548  print '</tr>';
549 
550  // Don't show in tmp mode, inevitably empty
551  if ($mode != "_tmp") {
552  // Date document export
553  print '<tr>';
554  print '<td class="titlefield">' . $langs->trans("DateExport") . '</td>';
555  print '<td>';
556  print $object->date_export ? dol_print_date($object->date_export, 'dayhour') : '&nbsp;';
557  print '</td>';
558  print '</tr>';
559 
560  // Date document validation
561  print '<tr>';
562  print '<td class="titlefield">' . $langs->trans("DateValidation") . '</td>';
563  print '<td>';
564  print $object->date_validation ? dol_print_date($object->date_validation, 'dayhour') : '&nbsp;';
565  print '</td>';
566  print '</tr>';
567  }
568 
569  // Validate
570  /*
571  print '<tr>';
572  print '<td class="titlefield">' . $langs->trans("Status") . '</td>';
573  print '<td>';
574  if (empty($object->validated)) {
575  print '<a class="reposition" href="' . $_SERVER["PHP_SELF"] . '?piece_num=' . $line->id . '&action=enable&token='.newToken().'">';
576  print img_picto($langs->trans("Disabled"), 'switch_off');
577  print '</a>';
578  } else {
579  print '<a class="reposition" href="' . $_SERVER["PHP_SELF"] . '?piece_num=' . $line->id . '&action=disable&token='.newToken().'">';
580  print img_picto($langs->trans("Activated"), 'switch_on');
581  print '</a>';
582  }
583  print '</td>';
584  print '</tr>';
585  */
586 
587  // check data
588  /*
589  print '<tr>';
590  print '<td class="titlefield">' . $langs->trans("Control") . '</td>';
591  if ($object->doc_type == 'customer_invoice')
592  {
593  $sqlmid = 'SELECT rowid as ref';
594  $sqlmid .= " FROM ".MAIN_DB_PREFIX."facture as fac";
595  $sqlmid .= " WHERE fac.rowid=" . ((int) $object->fk_doc);
596  dol_syslog("accountancy/bookkeeping/card.php::sqlmid=" . $sqlmid, LOG_DEBUG);
597  $resultmid = $db->query($sqlmid);
598  if ($resultmid) {
599  $objmid = $db->fetch_object($resultmid);
600  $invoicestatic = new Facture($db);
601  $invoicestatic->fetch($objmid->ref);
602  $ref=$langs->trans("Invoice").' '.$invoicestatic->getNomUrl(1);
603  }
604  else dol_print_error($db);
605  }
606  print '<td>' . $ref .'</td>';
607  print '</tr>';
608  */
609  print "</table>\n";
610 
611  print '</div>';
612 
613  print dol_get_fiche_end();
614 
615  print '<div class="clearboth"></div>';
616 
617  print '<br>';
618 
619  $result = $object->fetchAllPerMvt($piece_num, $mode); // This load $object->linesmvt
620 
621  if ($result < 0) {
622  setEventMessages($object->error, $object->errors, 'errors');
623  } else {
624  // List of movements
625  print load_fiche_titre($langs->trans("ListeMvts"), '', '');
626 
627  print '<form action="'.$_SERVER["PHP_SELF"].'?piece_num='.$object->piece_num.'" method="post">';
628  if ($optioncss != '') {
629  print '<input type="hidden" name="optioncss" value="'.$optioncss.'">';
630  }
631  print '<input type="hidden" name="token" value="'.newToken().'">';
632  print '<input type="hidden" name="doc_date" value="'.$object->doc_date.'">'."\n";
633  print '<input type="hidden" name="doc_type" value="'.$object->doc_type.'">'."\n";
634  print '<input type="hidden" name="doc_ref" value="'.$object->doc_ref.'">'."\n";
635  print '<input type="hidden" name="code_journal" value="'.$object->code_journal.'">'."\n";
636  print '<input type="hidden" name="fk_doc" value="'.$object->fk_doc.'">'."\n";
637  print '<input type="hidden" name="fk_docdet" value="'.$object->fk_docdet.'">'."\n";
638  print '<input type="hidden" name="mode" value="'.$mode.'">'."\n";
639 
640  if (count($object->linesmvt) > 0) {
641  print '<div class="div-table-responsive-no-min">';
642  print '<table class="noborder centpercent">';
643 
644  $total_debit = 0;
645  $total_credit = 0;
646 
647  print '<tr class="liste_titre">';
648 
649  print_liste_field_titre("AccountAccountingShort");
650  print_liste_field_titre("SubledgerAccount");
651  print_liste_field_titre("LabelOperation");
652  print_liste_field_titre("AccountingDebit", "", "", "", "", 'class="right"');
653  print_liste_field_titre("AccountingCredit", "", "", "", "", 'class="right"');
654  if (empty($object->date_validation)) {
655  print_liste_field_titre("Action", "", "", "", "", 'width="60"', "", "", 'center ');
656  } else {
658  }
659 
660  print "</tr>\n";
661 
662  // Add an empty line if there is not yet
663  if (!empty($object->linesmvt[0])) {
664  $tmpline = $object->linesmvt[0];
665  if (!empty($tmpline->numero_compte)) {
666  $line = new BookKeepingLine();
667  $object->linesmvt[] = $line;
668  }
669  }
670 
671  foreach ($object->linesmvt as $line) {
672  print '<tr class="oddeven" data-lineid="'.((int) $line->id).'">';
673  $total_debit += $line->debit;
674  $total_credit += $line->credit;
675 
676  if ($action == 'update' && $line->id == $id) {
677  print '<!-- td columns in edit mode -->';
678  print '<td>';
679  print $formaccounting->select_account((GETPOSTISSET("accountingaccount_number") ? GETPOST("accountingaccount_number", "alpha") : $line->numero_compte), 'accountingaccount_number', 1, array(), 1, 1, 'minwidth200 maxwidth500');
680  print '</td>';
681  print '<td>';
682  // TODO For the moment we keep a free input text instead of a combo. The select_auxaccount has problem because:
683  // It does not use the setup of "key pressed" to select a thirdparty and this hang browser on large databases.
684  // Also, it is not possible to use a value that is not in the list.
685  // Also, the label is not automatically filled when a value is selected.
686  if (!empty($conf->global->ACCOUNTANCY_COMBO_FOR_AUX)) {
687  print $formaccounting->select_auxaccount((GETPOSTISSET("subledger_account") ? GETPOST("subledger_account", "alpha") : $line->subledger_account), 'subledger_account', 1, 'maxwidth250', '', 'subledger_label');
688  } else {
689  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")).'">';
690  }
691  // Add also input for subledger label
692  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")).'">';
693  print '</td>';
694  print '<td><input type="text" class="minwidth200" name="label_operation" value="'.(GETPOSTISSET("label_operation") ? GETPOST("label_operation", "alpha") : $line->label_operation).'"></td>';
695  print '<td class="right"><input type="text" size="6" class="right" name="debit" value="'.(GETPOSTISSET("debit") ? GETPOST("debit", "alpha") : price($line->debit)).'"></td>';
696  print '<td class="right"><input type="text" size="6" class="right" name="credit" value="'.(GETPOSTISSET("credit") ? GETPOST("credit", "alpha") : price($line->credit)).'"></td>';
697  print '<td>';
698  print '<input type="hidden" name="id" value="'.$line->id.'">'."\n";
699  print '<input type="submit" class="button" name="update" value="'.$langs->trans("Update").'">';
700  print '</td>';
701  } elseif (empty($line->numero_compte) || (empty($line->debit) && empty($line->credit))) {
702  if ($action == "" || $action == 'add') {
703  print '<!-- td columns in add mode -->';
704  print '<td>';
705  print $formaccounting->select_account('', 'accountingaccount_number', 1, array(), 1, 1, 'minwidth200 maxwidth500');
706  print '</td>';
707  print '<td>';
708  // TODO For the moment we keep a free input text instead of a combo. The select_auxaccount has problem because:
709  // It does not use the setup of "key pressed" to select a thirdparty and this hang browser on large databases.
710  // Also, it is not possible to use a value that is not in the list.
711  // Also, the label is not automatically filled when a value is selected.
712  if (!empty($conf->global->ACCOUNTANCY_COMBO_FOR_AUX)) {
713  print $formaccounting->select_auxaccount('', 'subledger_account', 1, 'maxwidth250', '', 'subledger_label');
714  } else {
715  print '<input type="text" class="maxwidth150" name="subledger_account" value="" placeholder="' . dol_escape_htmltag($langs->trans("SubledgerAccount")) . '">';
716  }
717  print '<br><input type="text" class="maxwidth150" name="subledger_label" value="" placeholder="' . dol_escape_htmltag($langs->trans("SubledgerAccountLabel")) . '">';
718  print '</td>';
719  print '<td><input type="text" class="minwidth200" name="label_operation" value="' . $label_operation . '"/></td>';
720  print '<td class="right"><input type="text" size="6" class="right" name="debit" value=""/></td>';
721  print '<td class="right"><input type="text" size="6" class="right" name="credit" value=""/></td>';
722  print '<td class="center"><input type="submit" class="button small" name="save" value="' . $langs->trans("Add") . '"></td>';
723  }
724  } else {
725  print '<!-- td columns in display mode -->';
726  $resultfetch = $accountingaccount->fetch(null, $line->numero_compte, true);
727  print '<td>';
728  if ($resultfetch > 0) {
729  print $accountingaccount->getNomUrl(0, 1, 1, '', 0);
730  } else {
731  print $line->numero_compte.' <span class="warning">('.$langs->trans("AccountRemovedFromCurrentChartOfAccount").')</span>';
732  }
733  print '</td>';
734  print '<td>'.length_accounta($line->subledger_account);
735  if ($line->subledger_label) {
736  print ' - <span class="opacitymedium">'.$line->subledger_label.'</span>';
737  }
738  print '</td>';
739  print '<td>'.$line->label_operation.'</td>';
740  print '<td class="right nowraponall amount">'.($line->debit != 0 ? price($line->debit) : '').'</td>';
741  print '<td class="right nowraponall amount">'.($line->credit != 0 ? price($line->credit) : '').'</td>';
742 
743  print '<td class="center nowraponall">';
744  if (empty($line->date_export) && empty($line->date_validation)) {
745  print '<a class="editfielda reposition" href="' . $_SERVER["PHP_SELF"] . '?action=update&id=' . $line->id . '&piece_num=' . urlencode($line->piece_num) . '&mode=' . urlencode($mode) . '&token=' . urlencode(newToken()) . '">';
746  print img_edit('', 0, 'class="marginrightonly"');
747  print '</a> &nbsp;';
748  } else {
749  print '<a class="editfielda nohover cursornotallowed reposition disabled" href="#" title="'.dol_escape_htmltag($langs->trans("ForbiddenTransactionAlreadyExported")).'">';
750  print img_edit($langs->trans("ForbiddenTransactionAlreadyExported"), 0, 'class="marginrightonly"');
751  print '</a> &nbsp;';
752  }
753 
754  if (empty($line->date_validation)) {
755  $actiontodelete = 'delete';
756  if ($mode == '_tmp' || $action != 'delmouv') {
757  $actiontodelete = 'confirm_delete';
758  }
759 
760  print '<a href="' . $_SERVER["PHP_SELF"] . '?action=' . $actiontodelete . '&id=' . $line->id . '&piece_num=' . urlencode($line->piece_num) . '&mode=' . urlencode($mode) . '&token=' . urlencode(newToken()) . '">';
761  print img_delete();
762  print '</a>';
763  } else {
764  print '<a class="editfielda nohover cursornotallowed disabled" href="#" title="'.dol_escape_htmltag($langs->trans("ForbiddenTransactionAlreadyExported")).'">';
765  print img_delete($langs->trans("ForbiddenTransactionAlreadyValidated"));
766  print '</a>';
767  }
768 
769  print '</td>';
770  }
771  print "</tr>\n";
772  }
773 
774  $total_debit = price2num($total_debit, 'MT');
775  $total_credit = price2num($total_credit, 'MT');
776 
777  if ($total_debit != $total_credit) {
778  setEventMessages(null, array($langs->trans('MvtNotCorrectlyBalanced', $total_debit, $total_credit)), 'warnings');
779  }
780 
781  print '</table>';
782  print '</div>';
783 
784  if ($mode == '_tmp' && $action == '') {
785  print '<br>';
786  print '<div class="center">';
787  if ($total_debit == $total_credit) {
788  print '<a class="button" href="'.$_SERVER["PHP_SELF"].'?piece_num='.$object->piece_num.'&action=valid">'.$langs->trans("ValidTransaction").'</a>';
789  } else {
790  print '<input type="submit" class="button" disabled="disabled" href="#" title="'.dol_escape_htmltag($langs->trans("MvtNotCorrectlyBalanced", $debit, $credit)).'" value="'.dol_escape_htmltag($langs->trans("ValidTransaction")).'">';
791  }
792 
793  print ' &nbsp; ';
794  print '<a class="button button-cancel" href="'.DOL_URL_ROOT.'/accountancy/bookkeeping/list.php">'.$langs->trans("Cancel").'</a>';
795 
796  print "</div>";
797  }
798  }
799 
800  print '</form>';
801  }
802  } else {
803  print load_fiche_titre($langs->trans("NoRecords"));
804  }
805 }
806 
807 print dol_get_fiche_end();
808 
809 // End of page
810 llxFooter();
811 $db->close();
llxFooter
llxFooter()
Empty footer.
Definition: wrapper.php:70
dol_escape_htmltag
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...
Definition: functions.lib.php:1600
load_fiche_titre
load_fiche_titre($titre, $morehtmlright='', $picto='generic', $pictoisfullpath=0, $id='', $morecssontable='', $morehtmlcenter='')
Load a title with picto.
Definition: functions.lib.php:5477
GETPOST
GETPOST($paramname, $check='alphanohtml', $method=0, $filter=null, $options=null, $noreplace=0)
Return value of a param into GET or POST supervariable.
Definition: functions.lib.php:609
dol_print_error
dol_print_error($db='', $error='', $errors=null)
Displays error message system with all the information to facilitate the diagnosis and the escalation...
Definition: functions.lib.php:5107
BookKeepingLine
Class BookKeepingLine.
Definition: bookkeeping.class.php:2171
$form
if($cancel &&! $id) if($action=='add' &&! $cancel) if($action=='delete') if($id) $form
Actions.
Definition: card.php:143
img_edit
img_edit($titlealt='default', $float=0, $other='')
Show logo editer/modifier fiche.
Definition: functions.lib.php:4652
FormAccounting
Class to manage generation of HTML components for accounting management.
Definition: html.formaccounting.class.php:33
price2num
price2num($amount, $rounding='', $option=0)
Function that return a number with universal decimal format (decimal separator is '.
Definition: functions.lib.php:5955
dol_print_date
dol_print_date($time, $format='', $tzoutput='auto', $outputlangs='', $encodetooutput=false)
Output date in a string format according to outputlangs (or langs if not defined).
Definition: functions.lib.php:2675
llxHeader
if(!defined('NOREQUIRESOC')) if(!defined('NOREQUIRETRAN')) if(!defined('NOTOKENRENEWAL')) if(!defined('NOREQUIREMENU')) if(!defined('NOREQUIREHTML')) if(!defined('NOREQUIREAJAX')) llxHeader()
Empty header.
Definition: wrapper.php:56
img_delete
img_delete($titlealt='default', $other='class="pictodelete"', $morecss='')
Show delete logo.
Definition: functions.lib.php:4692
$formconfirm
$formconfirm
if ($action == 'delbookkeepingyear') {
Definition: listbyaccount.php:634
AccountingJournal
Class to manage accounting accounts.
Definition: accountingjournal.class.php:27
GETPOSTINT
GETPOSTINT($paramname, $method=0)
Return value of a param into GET or POST supervariable.
Definition: functions.lib.php:926
setEventMessages
setEventMessages($mesg, $mesgs, $style='mesgs', $messagekey='', $noduplicate=0)
Set event messages in dol_events session object.
Definition: functions.lib.php:8673
newToken
newToken()
Return the value of token currently saved into session with name 'newtoken'.
Definition: functions.lib.php:11654
dol_get_fiche_end
dol_get_fiche_end($notab=0)
Return tab footer of a card.
Definition: functions.lib.php:2177
isModEnabled
isModEnabled($module)
Is Dolibarr module enabled.
Definition: functions.lib.php:207
dol_get_fiche_head
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.
Definition: functions.lib.php:1979
BookKeeping
Class to manage Ledger (General Ledger and Subledger)
Definition: bookkeeping.class.php:33
AccountingAccount
Class to manage accounting accounts.
Definition: accountingaccount.class.php:36
GETPOSTISSET
GETPOSTISSET($paramname)
Return true if we are in a context of submitting the parameter $paramname from a POST of a form.
Definition: functions.lib.php:509
print_liste_field_titre
print_liste_field_titre($name, $file="", $field="", $begin="", $moreparam="", $moreattrib="", $sortfield="", $sortorder="", $prefix="", $tooltip="", $forcenowrapcolumntitle=0)
Show title line of an array.
Definition: functions.lib.php:5295
Form
Class to manage generation of HTML components Only common components must be here.
Definition: html.form.class.php:53
price
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.
Definition: functions.lib.php:5829
accessforbidden
accessforbidden($message='', $printheader=1, $printfooter=1, $showonlymessage=0, $params=null)
Show a message to say access is forbidden and stop program.
Definition: security.lib.php:1164
dol_mktime
dol_mktime($hour, $minute, $second, $month, $day, $year, $gm='auto', $check=1)
Return a timestamp date built from detailed informations (by default a local PHP server timestamp) Re...
Definition: functions.lib.php:2968