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-2018  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
22/**
23 * \file		htdocs/accountancy/bookkeeping/card.php
24 * \ingroup		Accountancy (Double entries)
25 * \brief		Page to show book-entry
26 */
27
28require '../../main.inc.php';
29require_once DOL_DOCUMENT_ROOT.'/core/lib/accounting.lib.php';
30require_once DOL_DOCUMENT_ROOT.'/accountancy/class/bookkeeping.class.php';
31require_once DOL_DOCUMENT_ROOT.'/core/class/html.formaccounting.class.php';
32require_once DOL_DOCUMENT_ROOT.'/compta/facture/class/facture.class.php';
33require_once DOL_DOCUMENT_ROOT.'/fourn/class/fournisseur.facture.class.php';
34require_once DOL_DOCUMENT_ROOT.'/accountancy/class/accountingjournal.class.php';
35require_once DOL_DOCUMENT_ROOT.'/accountancy/class/accountingaccount.class.php';
36
37// Load translation files required by the page
38$langs->loadLangs(array("accountancy", "bills", "compta"));
39
40$action = GETPOST('action', 'aZ09');
41$optioncss = GETPOST('optioncss', 'aZ'); // Option for the css output (always '' except when 'print')
42
43$id = GETPOST('id', 'int'); // id of record
44$mode = GETPOST('mode', 'aZ09'); // '' or '_tmp'
45$piece_num = GETPOST("piece_num", 'int'); // id of transaction (several lines share the same transaction id)
46
47// Security check
48if ($user->socid > 0) {
49	accessforbidden();
50}
51
52$mesg = '';
53
54$accountingaccount = new AccountingAccount($db);
55$accountingjournal = new AccountingJournal($db);
56
57$accountingaccount_number = GETPOST('accountingaccount_number', 'alphanohtml');
58$accountingaccount->fetch(null, $accountingaccount_number, true);
59$accountingaccount_label = $accountingaccount->label;
60
61$journal_code = GETPOST('code_journal', 'alpha');
62$accountingjournal->fetch(null, $journal_code);
63$journal_label = $accountingjournal->label;
64
65$subledger_account = GETPOST('subledger_account', 'alphanohtml');
66if ($subledger_account == -1) {
67	$subledger_account = null;
68}
69$subledger_label = GETPOST('subledger_label', 'alphanohtml');
70
71$label_operation = GETPOST('label_operation', 'alphanohtml');
72$debit = price2num(GETPOST('debit', 'alpha'));
73$credit = price2num(GETPOST('credit', 'alpha'));
74
75$save = GETPOST('save', 'alpha');
76if (!empty($save)) $action = 'add';
77$update = GETPOST('update', 'alpha');
78if (!empty($update)) $action = 'confirm_update';
79
80$object = new BookKeeping($db);
81
82
83/*
84 * Actions
85 */
86
87if ($action == "confirm_update") {
88	$error = 0;
89
90	if ((floatval($debit) != 0.0) && (floatval($credit) != 0.0)) {
91		$error++;
92		setEventMessages($langs->trans('ErrorDebitCredit'), null, 'errors');
93		$action = 'update';
94	}
95	if (empty($accountingaccount_number) || $accountingaccount_number == '-1')
96	{
97		$error++;
98		setEventMessages($langs->trans('ErrorFieldRequired', $langs->transnoentitiesnoconv("AccountAccountingShort")), null, 'errors');
99		$action = 'update';
100	}
101
102	if (!$error)
103	{
104		$object = new BookKeeping($db);
105
106		$result = $object->fetch($id, null, $mode);
107		if ($result < 0) {
108			$error++;
109			setEventMessages($object->error, $object->errors, 'errors');
110		} else {
111			$object->numero_compte = $accountingaccount_number;
112			$object->subledger_account = $subledger_account;
113			$object->subledger_label = $subledger_label;
114			$object->label_compte = $accountingaccount_label;
115			$object->label_operation = $label_operation;
116			$object->debit = $debit;
117			$object->credit = $credit;
118
119			if (floatval($debit) != 0.0) {
120				$object->montant = $debit; // deprecated
121				$object->amount = $debit;
122				$object->sens = 'D';
123			}
124			if (floatval($credit) != 0.0) {
125				$object->montant = $credit; // deprecated
126				$object->amount = $credit;
127				$object->sens = 'C';
128			}
129
130			$result = $object->update($user, false, $mode);
131			if ($result < 0) {
132				setEventMessages($object->error, $object->errors, 'errors');
133			} else {
134				if ($mode != '_tmp') {
135					setEventMessages($langs->trans('RecordSaved'), null, 'mesgs');
136				}
137
138				$debit = 0;
139				$credit = 0;
140
141				$action = '';
142			}
143		}
144	}
145} elseif ($action == "add") {
146	$error = 0;
147
148	if ((floatval($debit) != 0.0) && (floatval($credit) != 0.0))
149	{
150		$error++;
151		setEventMessages($langs->trans('ErrorDebitCredit'), null, 'errors');
152		$action = '';
153	}
154	if (empty($accountingaccount_number) || $accountingaccount_number == '-1')
155	{
156		$error++;
157		setEventMessages($langs->trans('ErrorFieldRequired', $langs->transnoentitiesnoconv("AccountAccountingShort")), null, 'errors');
158		$action = '';
159	}
160
161	if (!$error) {
162		$object = new BookKeeping($db);
163
164		$object->numero_compte = $accountingaccount_number;
165		$object->subledger_account = $subledger_account;
166		$object->subledger_label = $subledger_label;
167		$object->label_compte = $accountingaccount_label;
168		$object->label_operation = $label_operation;
169		$object->debit = $debit;
170		$object->credit = $credit;
171		$object->doc_date = (string) GETPOST('doc_date', 'alpha');
172		$object->doc_type = (string) GETPOST('doc_type', 'alpha');
173		$object->piece_num = $piece_num;
174		$object->doc_ref = (string) GETPOST('doc_ref', 'alpha');
175		$object->code_journal = $journal_code;
176		$object->journal_label = $journal_label;
177		$object->fk_doc = GETPOSTINT('fk_doc');
178		$object->fk_docdet = GETPOSTINT('fk_docdet');
179
180		if (floatval($debit) != 0.0) {
181			$object->montant = $debit; // deprecated
182			$object->amount = $debit;
183			$object->sens = 'D';
184		}
185
186		if (floatval($credit) != 0.0) {
187			$object->montant = $credit; // deprecated
188			$object->amount = $credit;
189			$object->sens = 'C';
190		}
191
192		$result = $object->createStd($user, false, $mode);
193		if ($result < 0) {
194			setEventMessages($object->error, $object->errors, 'errors');
195		} else {
196			if ($mode != '_tmp') {
197				setEventMessages($langs->trans('RecordSaved'), null, 'mesgs');
198			}
199
200			$debit = 0;
201			$credit = 0;
202
203			$action = '';
204		}
205	}
206} elseif ($action == "confirm_delete") {
207	$object = new BookKeeping($db);
208
209	$result = $object->fetch($id, null, $mode);
210	$piece_num = $object->piece_num;
211
212	if ($result < 0) {
213		setEventMessages($object->error, $object->errors, 'errors');
214	} else {
215		$result = $object->delete($user, false, $mode);
216		if ($result < 0) {
217			setEventMessages($object->error, $object->errors, 'errors');
218		}
219	}
220	$action = '';
221} elseif ($action == "confirm_create") {
222	$error = 0;
223
224	$object = new BookKeeping($db);
225
226	if (!$journal_code || $journal_code == '-1') {
227		setEventMessages($langs->trans('ErrorFieldRequired', $langs->transnoentitiesnoconv("Journal")), null, 'errors');
228		$action = 'create';
229		$error++;
230	}
231	if (!GETPOST('doc_ref', 'alpha'))
232	{
233		setEventMessages($langs->trans("ErrorFieldRequired", $langs->transnoentitiesnoconv("Piece")), null, 'errors');
234		$action = 'create';
235		$error++;
236	}
237
238	if (!$error)
239	{
240		$object->label_compte = '';
241		$object->debit = 0;
242		$object->credit = 0;
243		$object->doc_date = $date_start = dol_mktime(0, 0, 0, GETPOST('doc_datemonth', 'int'), GETPOST('doc_dateday', 'int'), GETPOST('doc_dateyear', 'int'));
244		$object->doc_type = GETPOST('doc_type', 'alpha');
245		$object->piece_num = GETPOST('next_num_mvt', 'alpha');
246		$object->doc_ref = GETPOST('doc_ref', 'alpha');
247		$object->code_journal = $journal_code;
248		$object->journal_label = $journal_label;
249		$object->fk_doc = 0;
250		$object->fk_docdet = 0;
251		$object->montant = 0; // deprecated
252		$object->amount = 0;
253
254		$result = $object->createStd($user, 0, $mode);
255		if ($result < 0) {
256			setEventMessages($object->error, $object->errors, 'errors');
257		} else {
258			if ($mode != '_tmp')
259			{
260				setEventMessages($langs->trans('RecordSaved'), null, 'mesgs');
261			}
262			$action = 'update';
263			$id = $object->id;
264			$piece_num = $object->piece_num;
265		}
266	}
267}
268
269if ($action == 'setdate') {
270	$datedoc = dol_mktime(0, 0, 0, GETPOST('doc_datemonth', 'int'), GETPOST('doc_dateday', 'int'), GETPOST('doc_dateyear', 'int'));
271	$result = $object->updateByMvt($piece_num, 'doc_date', $db->idate($datedoc), $mode);
272	if ($result < 0) {
273		setEventMessages($object->error, $object->errors, 'errors');
274	} else {
275		if ($mode != '_tmp')
276		{
277			setEventMessages($langs->trans('RecordSaved'), null, 'mesgs');
278		}
279		$action = '';
280	}
281}
282
283if ($action == 'setjournal') {
284	$result = $object->updateByMvt($piece_num, 'code_journal', $journal_code, $mode);
285	$result = $object->updateByMvt($piece_num, 'journal_label', $journal_label, $mode);
286	if ($result < 0) {
287		setEventMessages($object->error, $object->errors, 'errors');
288	} else {
289		if ($mode != '_tmp')
290		{
291			setEventMessages($langs->trans('RecordSaved'), null, 'mesgs');
292		}
293		$action = '';
294	}
295}
296
297if ($action == 'setdocref') {
298	$refdoc = GETPOST('doc_ref', 'alpha');
299	$result = $object->updateByMvt($piece_num, 'doc_ref', $refdoc, $mode);
300	if ($result < 0) {
301		setEventMessages($object->error, $object->errors, 'errors');
302	} else {
303		if ($mode != '_tmp')
304		{
305			setEventMessages($langs->trans('RecordSaved'), null, 'mesgs');
306		}
307		$action = '';
308	}
309}
310
311// Validate transaction
312if ($action == 'valid') {
313	$result = $object->transformTransaction(0, $piece_num);
314	if ($result < 0) {
315		setEventMessages($object->error, $object->errors, 'errors');
316	} else {
317		header("Location: list.php?sortfield=t.piece_num&sortorder=asc");
318		exit;
319	}
320}
321
322
323/*
324 * View
325 */
326
327$html = new Form($db);
328$formaccounting = new FormAccounting($db);
329
330llxHeader('', $langs->trans("CreateMvts"));
331
332// Confirmation to delete the command
333if ($action == 'delete') {
334	$formconfirm = $html->formconfirm($_SERVER["PHP_SELF"].'?id='.$id.'&mode='.$mode, $langs->trans('DeleteMvt'), $langs->trans('ConfirmDeleteMvt', $langs->transnoentitiesnoconv("RegistrationInAccounting")), 'confirm_delete', '', 0, 1);
335	print $formconfirm;
336}
337
338if ($action == 'create')
339{
340	print load_fiche_titre($langs->trans("CreateMvts"));
341
342	$object = new BookKeeping($db);
343	$next_num_mvt = $object->getNextNumMvt('_tmp');
344
345	if (empty($next_num_mvt))
346	{
347		dol_print_error('', 'Failed to get next piece number');
348	}
349
350	print '<form action="'.$_SERVER["PHP_SELF"].'" name="create_mvt" method="POST">';
351	if ($optioncss != '') print '<input type="hidden" name="optioncss" value="'.$optioncss.'">';
352	print '<input type="hidden" name="token" value="'.newToken().'">';
353	print '<input type="hidden" name="action" value="confirm_create">'."\n";
354	print '<input type="hidden" name="next_num_mvt" value="'.$next_num_mvt.'">'."\n";
355	print '<input type="hidden" name="mode" value="_tmp">'."\n";
356
357	print dol_get_fiche_head();
358
359	print '<table class="border centpercent">';
360
361	/*print '<tr>';
362	print '<td class="titlefieldcreate fieldrequired">' . $langs->trans("NumPiece") . '</td>';
363	print '<td>' . $next_num_mvt . '</td>';
364	print '</tr>';*/
365
366	print '<tr>';
367	print '<td class="titlefieldcreate fieldrequired">'.$langs->trans("Docdate").'</td>';
368	print '<td>';
369	print $html->selectDate('', 'doc_date', '', '', '', "create_mvt", 1, 1);
370	print '</td>';
371	print '</tr>';
372
373	print '<tr>';
374	print '<td class="fieldrequired">'.$langs->trans("Codejournal").'</td>';
375	print '<td>'.$formaccounting->select_journal($journal_code, 'code_journal', 0, 0, 1, 1).'</td>';
376	print '</tr>';
377
378	print '<tr>';
379	print '<td class="fieldrequired">'.$langs->trans("Piece").'</td>';
380	print '<td><input type="text" class="minwidth200" name="doc_ref" value="'.GETPOST('doc_ref', 'alpha').'"></td>';
381	print '</tr>';
382
383	/*
384	print '<tr>';
385	print '<td>' . $langs->trans("Doctype") . '</td>';
386	print '<td><input type="text" class="minwidth200 name="doc_type" value=""/></td>';
387	print '</tr>';
388	*/
389
390	print '</table>';
391
392	print dol_get_fiche_end();
393
394	print '<div class="center">';
395	print '<input type="submit" class="button" value="'.$langs->trans("Create").'">';
396	print '&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;';
397	print '<input type="button" value="'.$langs->trans("Cancel").'" class="button button-cancel" onclick="history.go(-1)" />';
398	print '</div>';
399
400	print '</form>';
401} else {
402	$object = new BookKeeping($db);
403	$result = $object->fetchPerMvt($piece_num, $mode);
404	if ($result < 0) {
405		setEventMessages($object->error, $object->errors, 'errors');
406	}
407
408	if (!empty($object->piece_num))
409	{
410		$backlink = '<a href="'.DOL_URL_ROOT.'/accountancy/bookkeeping/list.php?restore_lastsearch_values=1">'.$langs->trans('BackToList').'</a>';
411
412		print load_fiche_titre($langs->trans("UpdateMvts"), $backlink);
413
414		$head = array();
415		$h = 0;
416		$head[$h][0] = $_SERVER['PHP_SELF'].'?piece_num='.$object->piece_num.($mode ? '&mode='.$mode : '');
417		$head[$h][1] = $langs->trans("Transaction");
418		$head[$h][2] = 'transaction';
419		$h++;
420
421		print dol_get_fiche_head($head, 'transaction', '', -1);
422
423		//dol_banner_tab($object, '', $backlink);
424
425		print '<div class="fichecenter">';
426		print '<div class="fichehalfleft">';
427
428		print '<div class="underbanner clearboth"></div>';
429		print '<table class="border tableforfield" width="100%">';
430
431		// Account movement
432		print '<tr>';
433		print '<td class="titlefield">'.$langs->trans("NumMvts").'</td>';
434		print '<td>'.$object->piece_num.'</td>';
435		print '</tr>';
436
437		// Date
438		print '<tr><td>';
439		print '<table class="nobordernopadding" width="100%"><tr><td>';
440		print $langs->trans('Docdate');
441		print '</td>';
442		if ($action != 'editdate')
443		print '<td class="right"><a class="editfielda reposition" href="'.$_SERVER["PHP_SELF"].'?action=editdate&amp;piece_num='.$object->piece_num.'&amp;mode='.$mode.'">'.img_edit($langs->transnoentitiesnoconv('SetDate'), 1).'</a></td>';
444		print '</tr></table>';
445		print '</td><td colspan="3">';
446		if ($action == 'editdate') {
447			print '<form name="setdate" action="'.$_SERVER["PHP_SELF"].'?piece_num='.$object->piece_num.'" method="post">';
448			if ($optioncss != '') print '<input type="hidden" name="optioncss" value="'.$optioncss.'">';
449			print '<input type="hidden" name="token" value="'.newToken().'">';
450			print '<input type="hidden" name="action" value="setdate">';
451			print '<input type="hidden" name="mode" value="'.$mode.'">';
452			print $form->selectDate($object->doc_date ? $object->doc_date : - 1, 'doc_date', '', '', '', "setdate");
453			print '<input type="submit" class="button" value="'.$langs->trans('Modify').'">';
454			print '</form>';
455		} else {
456			print $object->doc_date ? dol_print_date($object->doc_date, 'day') : '&nbsp;';
457		}
458		print '</td>';
459		print '</tr>';
460
461		// Journal
462		print '<tr><td>';
463		print '<table class="nobordernopadding" width="100%"><tr><td>';
464		print $langs->trans('Codejournal');
465		print '</td>';
466		if ($action != 'editjournal')
467		print '<td class="right"><a class="editfielda reposition" href="'.$_SERVER["PHP_SELF"].'?action=editjournal&amp;piece_num='.$object->piece_num.'&amp;mode='.$mode.'">'.img_edit($langs->transnoentitiesnoconv('Edit'), 1).'</a></td>';
468		print '</tr></table>';
469		print '</td><td>';
470		if ($action == 'editjournal') {
471			print '<form name="setjournal" action="'.$_SERVER["PHP_SELF"].'?piece_num='.$object->piece_num.'" method="post">';
472			if ($optioncss != '') print '<input type="hidden" name="optioncss" value="'.$optioncss.'">';
473			print '<input type="hidden" name="token" value="'.newToken().'">';
474			print '<input type="hidden" name="action" value="setjournal">';
475			print '<input type="hidden" name="mode" value="'.$mode.'">';
476			print $formaccounting->select_journal($object->code_journal, 'code_journal', 0, 0, array(), 1, 1);
477			print '<input type="submit" class="button" value="'.$langs->trans('Modify').'">';
478			print '</form>';
479		} else {
480			print $object->code_journal;
481		}
482		print '</td>';
483		print '</tr>';
484
485		// Ref document
486		print '<tr><td>';
487		print '<table class="nobordernopadding" width="100%"><tr><td>';
488		print $langs->trans('Piece');
489		print '</td>';
490		if ($action != 'editdocref')
491		print '<td class="right"><a class="editfielda reposition" href="'.$_SERVER["PHP_SELF"].'?action=editdocref&amp;piece_num='.$object->piece_num.'&amp;mode='.$mode.'">'.img_edit($langs->transnoentitiesnoconv('Edit'), 1).'</a></td>';
492		print '</tr></table>';
493		print '</td><td>';
494		if ($action == 'editdocref') {
495			print '<form name="setdocref" action="'.$_SERVER["PHP_SELF"].'?piece_num='.$object->piece_num.'" method="post">';
496			if ($optioncss != '') print '<input type="hidden" name="optioncss" value="'.$optioncss.'">';
497			print '<input type="hidden" name="token" value="'.newToken().'">';
498			print '<input type="hidden" name="action" value="setdocref">';
499			print '<input type="hidden" name="mode" value="'.$mode.'">';
500			print '<input type="text" size="20" name="doc_ref" value="'.dol_escape_htmltag($object->doc_ref).'">';
501			print '<input type="submit" class="button" value="'.$langs->trans('Modify').'">';
502			print '</form>';
503		} else {
504			print $object->doc_ref;
505		}
506		print '</td>';
507		print '</tr>';
508
509		print '</table>';
510
511		print '</div>';
512
513		print '<div class="fichehalfright"><div class="ficheaddleft">';
514
515		print '<div class="underbanner clearboth"></div>';
516		print '<table class="border tableforfield" width="100%">';
517
518		// Doc type
519		if (!empty($object->doc_type))
520		{
521			print '<tr>';
522			print '<td class="titlefield">'.$langs->trans("Doctype").'</td>';
523			print '<td>'.$object->doc_type.'</td>';
524			print '</tr>';
525		}
526
527		// Date document creation
528		print '<tr>';
529		print '<td class="titlefield">'.$langs->trans("DateCreation").'</td>';
530		print '<td>';
531		print $object->date_creation ? dol_print_date($object->date_creation, 'day') : '&nbsp;';
532		print '</td>';
533		print '</tr>';
534
535		// Validate
536		/*
537		print '<tr>';
538		print '<td class="titlefield">' . $langs->trans("Status") . '</td>';
539		print '<td>';
540			if (empty($object->validated)) {
541				print '<a class="reposition" href="' . $_SERVER["PHP_SELF"] . '?piece_num=' . $line->id . '&action=enable">';
542				print img_picto($langs->trans("Disabled"), 'switch_off');
543				print '</a>';
544			} else {
545				print '<a class="reposition" href="' . $_SERVER["PHP_SELF"] . '?piece_num=' . $line->id . '&action=disable">';
546				print img_picto($langs->trans("Activated"), 'switch_on');
547				print '</a>';
548			}
549			print '</td>';
550		print '</tr>';
551		*/
552
553		// check data
554		/*
555		print '<tr>';
556		print '<td class="titlefield">' . $langs->trans("Control") . '</td>';
557		if ($object->doc_type == 'customer_invoice')
558		{
559		 $sqlmid = 'SELECT rowid as ref';
560			$sqlmid .= " FROM ".MAIN_DB_PREFIX."facture as fac";
561			$sqlmid .= " WHERE fac.rowid=" . $object->fk_doc;
562			dol_syslog("accountancy/bookkeeping/card.php::sqlmid=" . $sqlmid, LOG_DEBUG);
563			$resultmid = $db->query($sqlmid);
564			if ($resultmid) {
565				$objmid = $db->fetch_object($resultmid);
566				$invoicestatic = new Facture($db);
567				$invoicestatic->fetch($objmid->ref);
568				$ref=$langs->trans("Invoice").' '.$invoicestatic->getNomUrl(1);
569			}
570			else dol_print_error($db);
571		}
572		print '<td>' . $ref .'</td>';
573		print '</tr>';
574		*/
575		print "</table>\n";
576
577		print '</div></div><!-ee-->';
578
579		print dol_get_fiche_end();
580
581		print '<div style="clear:both"></div>';
582
583		print '<br>';
584
585		$result = $object->fetchAllPerMvt($piece_num, $mode);	// This load $object->linesmvt
586		if ($result < 0) {
587			setEventMessages($object->error, $object->errors, 'errors');
588		} else {
589			print load_fiche_titre($langs->trans("ListeMvts"), '', '');
590
591			print '<form action="'.$_SERVER["PHP_SELF"].'?piece_num='.$object->piece_num.'" method="post">';
592			if ($optioncss != '') print '<input type="hidden" name="optioncss" value="'.$optioncss.'">';
593			print '<input type="hidden" name="token" value="'.newToken().'">';
594			print '<input type="hidden" name="doc_date" value="'.$object->doc_date.'">'."\n";
595			print '<input type="hidden" name="doc_type" value="'.$object->doc_type.'">'."\n";
596			print '<input type="hidden" name="doc_ref" value="'.$object->doc_ref.'">'."\n";
597			print '<input type="hidden" name="code_journal" value="'.$object->code_journal.'">'."\n";
598			print '<input type="hidden" name="fk_doc" value="'.$object->fk_doc.'">'."\n";
599			print '<input type="hidden" name="fk_docdet" value="'.$object->fk_docdet.'">'."\n";
600			print '<input type="hidden" name="mode" value="'.$mode.'">'."\n";
601
602			print '<table class="noborder centpercent">';
603
604			if (count($object->linesmvt) > 0) {
605				$total_debit = 0;
606				$total_credit = 0;
607
608				print '<tr class="liste_titre">';
609
610				print_liste_field_titre("AccountAccountingShort");
611				print_liste_field_titre("SubledgerAccount");
612				print_liste_field_titre("LabelOperation");
613				print_liste_field_titre("Debit", "", "", "", "", 'class="right"');
614				print_liste_field_titre("Credit", "", "", "", "", 'class="right"');
615				print_liste_field_titre("Action", "", "", "", "", 'width="60" class="center"');
616
617				print "</tr>\n";
618
619				foreach ($object->linesmvt as $line) {
620					print '<tr class="oddeven">';
621					$total_debit += $line->debit;
622					$total_credit += $line->credit;
623
624					if ($action == 'update' && $line->id == $id) {
625						print '<!-- td columns in edit mode -->';
626						print '<td>';
627						print $formaccounting->select_account((GETPOSTISSET("accountingaccount_number") ? GETPOST("accountingaccount_number", "alpha") : $line->numero_compte), 'accountingaccount_number', 1, array(), 1, 1, '');
628						print '</td>';
629						print '<td>';
630						// TODO For the moment we keep a free input text instead of a combo. The select_auxaccount has problem because:
631						// It does not use the setup of "key pressed" to select a thirdparty and this hang browser on large databases.
632						// Also, it is not possible to use a value that is not in the list.
633						// Also, the label is not automatically filled when a value is selected.
634						if (!empty($conf->global->ACCOUNTANCY_COMBO_FOR_AUX)) {
635							print $formaccounting->select_auxaccount((GETPOSTISSET("subledger_account") ? GETPOST("subledger_account", "alpha") : $line->subledger_account), 'subledger_account', 1);
636						} else {
637							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")).'">';
638						}
639						// Add also input for subledger label
640						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")).'">';
641						print '</td>';
642						print '<td><input type="text" class="minwidth200" name="label_operation" value="'.(GETPOSTISSET("label_operation") ? GETPOST("label_operation", "alpha") : $line->label_operation).'"></td>';
643						print '<td class="right"><input type="text" size="6" class="right" name="debit" value="'.(GETPOSTISSET("debit") ? GETPOST("debit", "alpha") : price($line->debit)).'"></td>';
644						print '<td class="right"><input type="text" size="6" class="right" name="credit" value="'.(GETPOSTISSET("credit") ? GETPOST("credit", "alpha") : price($line->credit)).'"></td>';
645						print '<td>';
646						print '<input type="hidden" name="id" value="'.$line->id.'">'."\n";
647						print '<input type="submit" class="button" name="update" value="'.$langs->trans("Update").'">';
648						print '</td>';
649					} else {
650						$accountingaccount->fetch(null, $line->numero_compte, true);
651						print '<td>'.$accountingaccount->getNomUrl(0, 1, 1, '', 0).'</td>';
652						print '<td>'.length_accounta($line->subledger_account);
653						if ($line->subledger_label) {
654							print ' - <span class="opacitymedium">'.$line->subledger_label.'</span>';
655						}
656						print '</td>';
657						print '<td>'.$line->label_operation.'</td>';
658						print '<td class="nowrap right">'.price($line->debit).'</td>';
659						print '<td class="nowrap right">'.price($line->credit).'</td>';
660
661						print '<td class="center">';
662						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()).'">';
663						print img_edit('', 0, 'class="marginrightonly"');
664						print '</a> &nbsp;';
665
666						$actiontodelete = 'delete';
667						if ($mode == '_tmp' || $action != 'delmouv') $actiontodelete = 'confirm_delete';
668
669						print '<a href="'.$_SERVER["PHP_SELF"].'?action='.$actiontodelete.'&id='.$line->id.'&piece_num='.urlencode($line->piece_num).'&mode='.urlencode($mode).'&token='.urlencode(newToken()).'">';
670						print img_delete();
671
672						print '</a>';
673						print '</td>';
674					}
675					print "</tr>\n";
676				}
677
678				$total_debit = price2num($total_debit, 'MT');
679				$total_credit = price2num($total_credit, 'MT');
680
681				if ($total_debit != $total_credit)
682				{
683					setEventMessages(null, array($langs->trans('MvtNotCorrectlyBalanced', $total_debit, $total_credit)), 'warnings');
684				}
685
686				if ($action == "" || $action == 'add') {
687					print '<tr class="oddeven">';
688					print '<!-- td columns in add mode -->';
689					print '<td>';
690					print $formaccounting->select_account('', 'accountingaccount_number', 1, array(), 1, 1, '');
691					print '</td>';
692					print '<td>';
693					// TODO For the moment we keep a free input text instead of a combo. The select_auxaccount has problem because:
694					// It does not use the setup of "key pressed" to select a thirdparty and this hang browser on large databases.
695					// Also, it is not possible to use a value that is not in the list.
696					// Also, the label is not automatically filled when a value is selected.
697					if (!empty($conf->global->ACCOUNTANCY_COMBO_FOR_AUX)) {
698						print $formaccounting->select_auxaccount('', 'subledger_account', 1);
699					} else {
700						print '<input type="text" class="maxwidth150" name="subledger_account" value="" placeholder="'.dol_escape_htmltag($langs->trans("SubledgerAccount")).'">';
701					}
702					print '<br><input type="text" class="maxwidth150" name="subledger_label" value="" placeholder="'.dol_escape_htmltag($langs->trans("SubledgerAccountLabel")).'">';
703					print '</td>';
704					print '<td><input type="text" class="minwidth200" name="label_operation" value="'.$label_operation.'"/></td>';
705					print '<td class="right"><input type="text" size="6" class="right" name="debit" value=""/></td>';
706					print '<td class="right"><input type="text" size="6" class="right" name="credit" value=""/></td>';
707					print '<td><input type="submit" class="button" name="save" value="'.$langs->trans("Add").'"></td>';
708					print '</tr>';
709				}
710				print '</table>';
711
712
713				if ($mode == '_tmp' && $action == '')
714				{
715					print '<br>';
716					print '<div class="center">';
717					if ($total_debit == $total_credit)
718					{
719						print '<a class="button" href="'.$_SERVER["PHP_SELF"].'?piece_num='.$object->piece_num.'&action=valid">'.$langs->trans("ValidTransaction").'</a>';
720					} else {
721						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")).'">';
722					}
723
724					print ' &nbsp; ';
725					print '<a class="button button-cancel" href="'.DOL_URL_ROOT.'/accountancy/bookkeeping/list.php">'.$langs->trans("Cancel").'</a>';
726
727					print "</div>";
728				}
729				print '</form>';
730			}
731		}
732	} else {
733		print load_fiche_titre($langs->trans("NoRecords"));
734	}
735}
736
737print dol_get_fiche_end();
738
739// End of page
740llxFooter();
741$db->close();
742