28 require
'../../main.inc.php';
29 require_once DOL_DOCUMENT_ROOT.
'/core/lib/accounting.lib.php';
30 require_once DOL_DOCUMENT_ROOT.
'/accountancy/class/bookkeeping.class.php';
31 require_once DOL_DOCUMENT_ROOT.
'/core/class/html.formaccounting.class.php';
32 require_once DOL_DOCUMENT_ROOT.
'/compta/facture/class/facture.class.php';
33 require_once DOL_DOCUMENT_ROOT.
'/fourn/class/fournisseur.facture.class.php';
34 require_once DOL_DOCUMENT_ROOT.
'/accountancy/class/accountingjournal.class.php';
35 require_once DOL_DOCUMENT_ROOT.
'/accountancy/class/accountingaccount.class.php';
38 $langs->loadLangs(array(
"accountancy",
"bills",
"compta"));
40 $action =
GETPOST(
'action',
'aZ09');
41 $cancel =
GETPOST(
'cancel',
'aZ09');
43 $optioncss =
GETPOST(
'optioncss',
'aZ');
46 $mode =
GETPOST(
'mode',
'aZ09');
47 $piece_num =
GETPOST(
"piece_num",
'int');
52 $accountingaccount_number =
GETPOST(
'accountingaccount_number',
'alphanohtml');
53 $accountingaccount->fetch(
null, $accountingaccount_number,
true);
54 $accountingaccount_label = $accountingaccount->label;
56 $journal_code =
GETPOST(
'code_journal',
'alpha');
57 $accountingjournal->fetch(
null, $journal_code);
58 $journal_label = $accountingjournal->label;
60 $subledger_account =
GETPOST(
'subledger_account',
'alphanohtml');
61 if ($subledger_account == -1) {
62 $subledger_account =
null;
64 $subledger_label =
GETPOST(
'subledger_label',
'alphanohtml');
66 $label_operation =
GETPOST(
'label_operation',
'alphanohtml');
70 $save =
GETPOST(
'save',
'alpha');
74 $update =
GETPOST(
'update',
'alpha');
75 if (!empty($update)) {
76 $action =
'confirm_update';
85 if ($user->socid > 0) {
88 if (empty($user->rights->accounting->mouvements->lire)) {
98 header(
"Location: ".DOL_URL_ROOT.
'/accountancy/bookkeeping/list.php');
102 if ($action ==
"confirm_update") {
105 if ((floatval($debit) != 0.0) && (floatval($credit) != 0.0)) {
110 if (empty($accountingaccount_number) || $accountingaccount_number ==
'-1') {
112 setEventMessages($langs->trans(
'ErrorFieldRequired', $langs->transnoentitiesnoconv(
"AccountAccountingShort")),
null,
'errors');
119 $result = $object->fetch($id,
null, $mode);
124 $object->numero_compte = $accountingaccount_number;
125 $object->subledger_account = $subledger_account;
126 $object->subledger_label = $subledger_label;
127 $object->label_compte = $accountingaccount_label;
128 $object->label_operation = $label_operation;
129 $object->debit = $debit;
130 $object->credit = $credit;
132 if (floatval($debit) != 0.0) {
133 $object->montant = $debit;
134 $object->amount = $debit;
137 if (floatval($credit) != 0.0) {
138 $object->montant = $credit;
139 $object->amount = $credit;
143 $result = $object->update($user,
false, $mode);
147 if ($mode !=
'_tmp') {
158 } elseif ($action ==
"add") {
161 if ((floatval($debit) != 0.0) && (floatval($credit) != 0.0)) {
166 if (empty($accountingaccount_number) || $accountingaccount_number ==
'-1') {
168 setEventMessages($langs->trans(
'ErrorFieldRequired', $langs->transnoentitiesnoconv(
"AccountAccountingShort")),
null,
'errors');
175 $object->numero_compte = $accountingaccount_number;
176 $object->subledger_account = $subledger_account;
177 $object->subledger_label = $subledger_label;
178 $object->label_compte = $accountingaccount_label;
179 $object->label_operation = $label_operation;
180 $object->debit = $debit;
181 $object->credit = $credit;
182 $object->doc_date = (string)
GETPOST(
'doc_date',
'alpha');
183 $object->doc_type = (string)
GETPOST(
'doc_type',
'alpha');
184 $object->piece_num = $piece_num;
185 $object->doc_ref = (string)
GETPOST(
'doc_ref',
'alpha');
186 $object->code_journal = $journal_code;
187 $object->journal_label = $journal_label;
191 if (floatval($debit) != 0.0) {
192 $object->montant = $debit;
193 $object->amount = $debit;
197 if (floatval($credit) != 0.0) {
198 $object->montant = $credit;
199 $object->amount = $credit;
203 $result = $object->createStd($user,
false, $mode);
207 if ($mode !=
'_tmp') {
217 } elseif ($action ==
"confirm_delete") {
220 $result = $object->fetch($id,
null, $mode);
221 $piece_num = $object->piece_num;
226 $result = $object->delete($user,
false, $mode);
232 } elseif ($action ==
"confirm_create") {
237 if (!$journal_code || $journal_code ==
'-1') {
238 setEventMessages($langs->trans(
'ErrorFieldRequired', $langs->transnoentitiesnoconv(
"Journal")),
null,
'errors');
242 if (!
GETPOST(
'doc_ref',
'alpha')) {
243 setEventMessages($langs->trans(
"ErrorFieldRequired", $langs->transnoentitiesnoconv(
"Piece")),
null,
'errors');
249 $object->label_compte =
'';
253 $object->doc_type =
GETPOST(
'doc_type',
'alpha');
254 $object->piece_num =
GETPOST(
'next_num_mvt',
'alpha');
255 $object->doc_ref =
GETPOST(
'doc_ref',
'alpha');
256 $object->code_journal = $journal_code;
257 $object->journal_label = $journal_label;
259 $object->fk_docdet = 0;
260 $object->montant = 0;
263 $result = $object->createStd($user, 0, $mode);
267 if ($mode !=
'_tmp') {
272 $piece_num = $object->piece_num;
277 if ($action ==
'setdate') {
279 $result = $object->updateByMvt($piece_num,
'doc_date', $db->idate($datedoc), $mode);
283 if ($mode !=
'_tmp') {
290 if ($action ==
'setjournal') {
291 $result = $object->updateByMvt($piece_num,
'code_journal', $journal_code, $mode);
292 $result = $object->updateByMvt($piece_num,
'journal_label', $journal_label, $mode);
296 if ($mode !=
'_tmp') {
303 if ($action ==
'setdocref') {
304 $refdoc =
GETPOST(
'doc_ref',
'alpha');
305 $result = $object->updateByMvt($piece_num,
'doc_ref', $refdoc, $mode);
309 if ($mode !=
'_tmp') {
317 if ($action ==
'valid') {
318 $result = $object->transformTransaction(0, $piece_num);
322 header(
"Location: list.php?sortfield=t.piece_num&sortorder=asc");
332 $html =
new Form($db);
335 llxHeader(
'', $langs->trans(
"CreateMvts"));
338 if ($action ==
'delete') {
339 $formconfirm = $html->formconfirm($_SERVER[
"PHP_SELF"].
'?id='.$id.
'&mode='.$mode, $langs->trans(
'DeleteMvt'), $langs->trans(
'ConfirmDeleteMvt', $langs->transnoentitiesnoconv(
"RegistrationInAccounting")),
'confirm_delete',
'', 0, 1);
343 if ($action ==
'create') {
347 $next_num_mvt = $object->getNextNumMvt(
'_tmp');
349 if (empty($next_num_mvt)) {
353 print
'<form action="'.$_SERVER[
"PHP_SELF"].
'" name="create_mvt" method="POST">';
354 if ($optioncss !=
'') {
355 print
'<input type="hidden" name="optioncss" value="'.$optioncss.
'">';
357 print
'<input type="hidden" name="token" value="'.newToken().
'">';
358 print
'<input type="hidden" name="action" value="confirm_create">'.
"\n";
359 print
'<input type="hidden" name="next_num_mvt" value="'.$next_num_mvt.
'">'.
"\n";
360 print
'<input type="hidden" name="mode" value="_tmp">'.
"\n";
364 print
'<table class="border centpercent">';
372 print
'<td class="titlefieldcreate fieldrequired">'.$langs->trans(
"Docdate").
'</td>';
374 print $html->selectDate(
'',
'doc_date',
'',
'',
'',
"create_mvt", 1, 1);
379 print
'<td class="fieldrequired">'.$langs->trans(
"Codejournal").
'</td>';
380 print
'<td>'.$formaccounting->select_journal($journal_code,
'code_journal', 0, 0, 1, 1).
'</td>';
384 print
'<td class="fieldrequired">'.$langs->trans(
"Piece").
'</td>';
385 print
'<td><input type="text" class="minwidth200" name="doc_ref" value="'.GETPOST(
'doc_ref',
'alpha').
'"></td>';
399 print
$form->buttonsSaveCancel(
"Create");
404 $result = $object->fetchPerMvt($piece_num, $mode);
409 if (!empty($object->piece_num)) {
410 $backlink =
'<a href="'.DOL_URL_ROOT.
'/accountancy/bookkeeping/list.php?restore_lastsearch_values=1">'.$langs->trans(
'BackToList').
'</a>';
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';
425 print
'<div class="fichecenter">';
426 print
'<div class="fichehalfleft">';
428 print
'<div class="underbanner clearboth"></div>';
429 print
'<table class="border tableforfield" width="100%">';
433 print
'<td class="titlefield">'.$langs->trans(
"NumMvts").
'</td>';
434 print
'<td>'.($mode ==
'_tmp' ?
'<span class="opacitymedium" title="Id tmp '.$object->piece_num.
'">'.$langs->trans(
"Draft").
'</span>' : $object->piece_num).
'</td>';
439 print
'<table class="nobordernopadding centpercent"><tr><td>';
440 print $langs->trans(
'Docdate');
442 if ($action !=
'editdate') {
443 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>';
445 print
'</tr></table>';
446 print
'</td><td colspan="3">';
447 if ($action ==
'editdate') {
448 print
'<form name="setdate" action="'.$_SERVER[
"PHP_SELF"].
'?piece_num='.$object->piece_num.
'" method="post">';
449 if ($optioncss !=
'') {
450 print
'<input type="hidden" name="optioncss" value="'.$optioncss.
'">';
452 print
'<input type="hidden" name="token" value="'.newToken().
'">';
453 print
'<input type="hidden" name="action" value="setdate">';
454 print
'<input type="hidden" name="mode" value="'.$mode.
'">';
455 print
$form->selectDate($object->doc_date ? $object->doc_date : - 1,
'doc_date',
'',
'',
'',
"setdate");
456 print
'<input type="submit" class="button button-edit" value="'.$langs->trans(
'Modify').
'">';
459 print $object->doc_date ?
dol_print_date($object->doc_date,
'day') :
' ';
466 print
'<table class="nobordernopadding" width="100%"><tr><td>';
467 print $langs->trans(
'Codejournal');
469 if ($action !=
'editjournal') {
470 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>';
472 print
'</tr></table>';
474 if ($action ==
'editjournal') {
475 print
'<form name="setjournal" action="'.$_SERVER[
"PHP_SELF"].
'?piece_num='.$object->piece_num.
'" method="post">';
476 if ($optioncss !=
'') {
477 print
'<input type="hidden" name="optioncss" value="'.$optioncss.
'">';
479 print
'<input type="hidden" name="token" value="'.newToken().
'">';
480 print
'<input type="hidden" name="action" value="setjournal">';
481 print
'<input type="hidden" name="mode" value="'.$mode.
'">';
482 print $formaccounting->select_journal($object->code_journal,
'code_journal', 0, 0, array(), 1, 1);
483 print
'<input type="submit" class="button button-edit" value="'.$langs->trans(
'Modify').
'">';
486 print $object->code_journal;
493 print
'<table class="nobordernopadding" width="100%"><tr><td>';
494 print $langs->trans(
'Piece');
496 if ($action !=
'editdocref') {
497 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>';
499 print
'</tr></table>';
501 if ($action ==
'editdocref') {
502 print
'<form name="setdocref" action="'.$_SERVER[
"PHP_SELF"].
'?piece_num='.$object->piece_num.
'" method="post">';
503 if ($optioncss !=
'') {
504 print
'<input type="hidden" name="optioncss" value="'.$optioncss.
'">';
506 print
'<input type="hidden" name="token" value="'.newToken().
'">';
507 print
'<input type="hidden" name="action" value="setdocref">';
508 print
'<input type="hidden" name="mode" value="'.$mode.
'">';
509 print
'<input type="text" size="20" name="doc_ref" value="'.dol_escape_htmltag($object->doc_ref).
'">';
510 print
'<input type="submit" class="button button-edit" value="'.$langs->trans(
'Modify').
'">';
513 print $object->doc_ref;
522 print
'<div class="fichehalfright">';
524 print
'<div class="underbanner clearboth"></div>';
525 print
'<table class="border tableforfield centpercent">';
528 if (!empty($object->doc_type)) {
530 print
'<td class="titlefield">'.$langs->trans(
"Doctype").
'</td>';
531 print
'<td>'.$object->doc_type.
'</td>';
537 print
'<td class="titlefield">'.$langs->trans(
"DateCreation").
'</td>';
539 print $object->date_creation ?
dol_print_date($object->date_creation,
'day') :
' ';
544 if ($mode !=
"_tmp") {
547 print
'<td class="titlefield">' . $langs->trans(
"DateExport") .
'</td>';
549 print $object->date_export ?
dol_print_date($object->date_export,
'dayhour') :
' ';
555 print
'<td class="titlefield">' . $langs->trans(
"DateValidation") .
'</td>';
557 print $object->date_validation ?
dol_print_date($object->date_validation,
'dayhour') :
' ';
608 print
'<div style="clear:both"></div>';
612 $result = $object->fetchAllPerMvt($piece_num, $mode);
619 print
'<form action="'.$_SERVER[
"PHP_SELF"].
'?piece_num='.$object->piece_num.
'" method="post">';
620 if ($optioncss !=
'') {
621 print
'<input type="hidden" name="optioncss" value="'.$optioncss.
'">';
623 print
'<input type="hidden" name="token" value="'.newToken().
'">';
624 print
'<input type="hidden" name="doc_date" value="'.$object->doc_date.
'">'.
"\n";
625 print
'<input type="hidden" name="doc_type" value="'.$object->doc_type.
'">'.
"\n";
626 print
'<input type="hidden" name="doc_ref" value="'.$object->doc_ref.
'">'.
"\n";
627 print
'<input type="hidden" name="code_journal" value="'.$object->code_journal.
'">'.
"\n";
628 print
'<input type="hidden" name="fk_doc" value="'.$object->fk_doc.
'">'.
"\n";
629 print
'<input type="hidden" name="fk_docdet" value="'.$object->fk_docdet.
'">'.
"\n";
630 print
'<input type="hidden" name="mode" value="'.$mode.
'">'.
"\n";
632 if (count($object->linesmvt) > 0) {
633 print
'<div class="div-table-responsive-no-min">';
634 print
'<table class="noborder centpercent">';
639 print
'<tr class="liste_titre">';
646 if (empty($object->date_validation)) {
655 if (!empty($object->linesmvt[0])) {
656 $tmpline = $object->linesmvt[0];
657 if (!empty($tmpline->numero_compte)) {
659 $object->linesmvt[] = $line;
663 foreach ($object->linesmvt as $line) {
664 print
'<tr class="oddeven">';
665 $total_debit += $line->debit;
666 $total_credit += $line->credit;
668 if ($action ==
'update' && $line->id == $id) {
669 print
'<!-- td columns in edit mode -->';
671 print $formaccounting->select_account((
GETPOSTISSET(
"accountingaccount_number") ?
GETPOST(
"accountingaccount_number",
"alpha") : $line->numero_compte),
'accountingaccount_number', 1, array(), 1, 1,
'');
678 if (!empty($conf->global->ACCOUNTANCY_COMBO_FOR_AUX)) {
679 print $formaccounting->select_auxaccount((
GETPOSTISSET(
"subledger_account") ?
GETPOST(
"subledger_account",
"alpha") : $line->subledger_account),
'subledger_account', 1,
'maxwidth250',
'',
'subledger_label');
681 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")).
'">';
684 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")).
'">';
686 print
'<td><input type="text" class="minwidth200" name="label_operation" value="'.(GETPOSTISSET(
"label_operation") ?
GETPOST(
"label_operation",
"alpha") : $line->label_operation).
'"></td>';
687 print
'<td class="right"><input type="text" size="6" class="right" name="debit" value="'.(GETPOSTISSET(
"debit") ?
GETPOST(
"debit",
"alpha") :
price($line->debit)).
'"></td>';
688 print
'<td class="right"><input type="text" size="6" class="right" name="credit" value="'.(GETPOSTISSET(
"credit") ?
GETPOST(
"credit",
"alpha") :
price($line->credit)).
'"></td>';
690 print
'<input type="hidden" name="id" value="'.$line->id.
'">'.
"\n";
691 print
'<input type="submit" class="button" name="update" value="'.$langs->trans(
"Update").
'">';
693 } elseif (empty($line->numero_compte) || (empty($line->debit) && empty($line->credit))) {
694 if ($action ==
"" || $action ==
'add') {
695 print
'<!-- td columns in add mode -->';
697 print $formaccounting->select_account(
'',
'accountingaccount_number', 1, array(), 1, 1,
'');
704 if (!empty($conf->global->ACCOUNTANCY_COMBO_FOR_AUX)) {
705 print $formaccounting->select_auxaccount(
'',
'subledger_account', 1,
'maxwidth250',
'',
'subledger_label');
707 print
'<input type="text" class="maxwidth150" name="subledger_account" value="" placeholder="' .
dol_escape_htmltag($langs->trans(
"SubledgerAccount")) .
'">';
709 print
'<br><input type="text" class="maxwidth150" name="subledger_label" value="" placeholder="' .
dol_escape_htmltag($langs->trans(
"SubledgerAccountLabel")) .
'">';
711 print
'<td><input type="text" class="minwidth200" name="label_operation" value="' . $label_operation .
'"/></td>';
712 print
'<td class="right"><input type="text" size="6" class="right" name="debit" value=""/></td>';
713 print
'<td class="right"><input type="text" size="6" class="right" name="credit" value=""/></td>';
714 print
'<td class="center"><input type="submit" class="button" name="save" value="' . $langs->trans(
"Add") .
'"></td>';
717 print
'<!-- td columns in display mode -->';
718 $resultfetch = $accountingaccount->fetch(
null, $line->numero_compte,
true);
720 if ($resultfetch > 0) {
721 print $accountingaccount->getNomUrl(0, 1, 1,
'', 0);
723 print $line->numero_compte.
' <span class="warning">('.$langs->trans(
"AccountRemovedFromCurrentChartOfAccount").
')</span>';
726 print
'<td>'.length_accounta($line->subledger_account);
727 if ($line->subledger_label) {
728 print
' - <span class="opacitymedium">'.$line->subledger_label.
'</span>';
731 print
'<td>'.$line->label_operation.
'</td>';
732 print
'<td class="right nowraponall amount">'.price($line->debit).
'</td>';
733 print
'<td class="right nowraponall amount">'.price($line->credit).
'</td>';
735 print
'<td class="center nowraponall">';
736 if (empty($line->date_export) && empty($line->date_validation)) {
737 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()) .
'">';
738 print
img_edit(
'', 0,
'class="marginrightonly"');
741 print
'<a class="editfielda nohover cursornotallowed reposition disabled" href="#" title="'.dol_escape_htmltag($langs->trans(
"ForbiddenTransactionAlreadyExported")).
'">';
742 print
img_edit($langs->trans(
"ForbiddenTransactionAlreadyExported"), 0,
'class="marginrightonly"');
746 if (empty($line->date_validation)) {
747 $actiontodelete =
'delete';
748 if ($mode ==
'_tmp' || $action !=
'delmouv') {
749 $actiontodelete =
'confirm_delete';
752 print
'<a href="' . $_SERVER[
"PHP_SELF"] .
'?action=' . $actiontodelete .
'&id=' . $line->id .
'&piece_num=' . urlencode($line->piece_num) .
'&mode=' . urlencode($mode) .
'&token=' . urlencode(
newToken()) .
'">';
756 print
'<a class="editfielda nohover cursornotallowed disabled" href="#" title="'.dol_escape_htmltag($langs->trans(
"ForbiddenTransactionAlreadyExported")).
'">';
757 print
img_delete($langs->trans(
"ForbiddenTransactionAlreadyValidated"));
766 $total_debit =
price2num($total_debit,
'MT');
767 $total_credit =
price2num($total_credit,
'MT');
769 if ($total_debit != $total_credit) {
770 setEventMessages(
null, array($langs->trans(
'MvtNotCorrectlyBalanced', $total_debit, $total_credit)),
'warnings');
776 if ($mode ==
'_tmp' && $action ==
'') {
778 print
'<div class="center">';
779 if ($total_debit == $total_credit) {
780 print
'<a class="button" href="'.$_SERVER[
"PHP_SELF"].
'?piece_num='.$object->piece_num.
'&action=valid">'.$langs->trans(
"ValidTransaction").
'</a>';
782 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")).
'">';
786 print
'<a class="button button-cancel" href="'.DOL_URL_ROOT.
'/accountancy/bookkeeping/list.php">'.$langs->trans(
"Cancel").
'</a>';