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';
53$langs->loadLangs(array(
"accountancy",
"bills",
"compta",
"errors"));
55$action =
GETPOST(
'action',
'aZ09');
56$cancel =
GETPOST(
'cancel',
'alpha');
57$confirm =
GETPOST(
'confirm',
'alpha');
59$type =
GETPOST(
'type',
'alpha');
60$backtopage =
GETPOST(
'backtopage',
'alpha');
61if (empty($backtopage)) {
62 $backtopage = DOL_URL_ROOT .
'/accountancy/bookkeeping/list.php';
65$optioncss =
GETPOST(
'optioncss',
'aZ');
75$accountingaccount_number =
GETPOST(
'accountingaccount_number',
'alphanohtml');
76$accountingaccount->fetch(0, $accountingaccount_number,
true);
77$accountingaccount_label = $accountingaccount->label;
79$journal_code =
GETPOST(
'code_journal',
'alpha');
80$accountingjournal->fetch(0, $journal_code);
81$journal_label = $accountingjournal->label;
83$subledger_account =
GETPOST(
'subledger_account',
'alphanohtml');
84if ($subledger_account == -1) {
85 $subledger_account =
null;
87$subledger_label =
GETPOST(
'subledger_label',
'alphanohtml');
89$label_operation =
GETPOST(
'label_operation',
'alphanohtml');
93$save =
GETPOST(
'save',
'alpha');
97$update =
GETPOST(
'update',
'alpha');
99 $action =
'confirm_update';
103$hookmanager->initHooks(array(
'bookkeepingcard',
'globalcard'));
111if ($user->socid > 0) {
114if (!$user->hasRight(
'accounting',
'mouvements',
'lire')) {
118$permissiontoadd = $user->hasRight(
'accounting',
'mouvements',
'creer');
119$permissiontodelete = $user->hasRight(
'accounting',
'mouvements',
'supprimer');
126$parameters = array();
127$reshook = $hookmanager->executeHooks(
'doActions', $parameters, $object, $action);
129 setEventMessages($hookmanager->error, $hookmanager->errors,
'errors');
131if (empty($reshook)) {
135 header(
"Location: ". $backtopage . (!empty($type) ?
'?type=sub' :
''));
139 if ($action ==
"confirm_update" && $permissiontoadd) {
140 if (((
float) $debit != 0.0) && ((
float) $credit != 0.0)) {
142 setEventMessages($langs->trans(
'ErrorDebitCredit'),
null,
'errors');
145 if (empty($accountingaccount_number) || $accountingaccount_number ==
'-1') {
147 setEventMessages($langs->trans(
'ErrorFieldRequired', $langs->transnoentitiesnoconv(
"AccountAccountingShort")),
null,
'errors');
154 $result =
$object->fetch($id,
null, $mode);
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;
167 if ((
float) $debit != 0.0) {
172 if ((
float) $credit != 0.0) {
178 $result =
$object->update($user, 0, $mode);
182 if ($mode !=
'_tmp') {
183 setEventMessages($langs->trans(
'RecordSaved'),
null,
'mesgs');
193 } elseif ($action ==
"add" && $permissiontoadd) {
194 if (((
float) $debit != 0.0) && ((
float) $credit != 0.0)) {
196 setEventMessages($langs->trans(
'ErrorDebitCredit'),
null,
'errors');
199 if (empty($accountingaccount_number) || $accountingaccount_number ==
'-1') {
201 setEventMessages($langs->trans(
'ErrorFieldRequired', $langs->transnoentitiesnoconv(
"AccountAccountingShort")),
null,
'errors');
204 $subledger_account_str = is_array($subledger_account) ? reset($subledger_account) : (string) $subledger_account;
207 setEventMessages($langs->trans(
"ErrorAccountNotCentralized").
". " . $langs->trans(
"RemoveSubsidiaryAccountOrAdjustTheGeneralAccount"),
null,
'errors');
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;
228 $object->piece_num = $piece_num;
231 $object->code_journal = $journal_code;
232 $object->journal_label = $journal_label;
236 if ((
float) $debit != 0.0) {
242 if ((
float) $credit != 0.0) {
248 $result =
$object->createStd($user, 0, $mode);
253 if ($mode !=
'_tmp') {
254 setEventMessages($langs->trans(
'RecordSaved'),
null,
'mesgs');
263 } elseif ($action ==
"confirm_delete" && $permissiontoadd) {
266 $result =
$object->fetch($id,
null, $mode);
267 $piece_num = (int)
$object->piece_num;
272 } elseif ($result > 0) {
274 $result =
$object->delete($user, 0, $mode);
280 } elseif ($action ==
"confirm_create" && $permissiontoadd) {
283 if (!$journal_code || $journal_code ==
'-1') {
284 setEventMessages($langs->trans(
'ErrorFieldRequired', $langs->transnoentitiesnoconv(
"Journal")),
null,
'errors');
288 if (!
GETPOST(
'doc_ref',
'alpha')) {
289 setEventMessages($langs->trans(
"ErrorFieldRequired", $langs->transnoentitiesnoconv(
"Piece")),
null,
'errors');
294 setEventMessages($langs->trans(
"ErrorFieldTooLong", $langs->transnoentitiesnoconv(
"Ref")),
null,
'errors');
309 $object->code_journal = $journal_code;
310 $object->journal_label = $journal_label;
317 $result =
$object->createStd($user, 0, $mode);
325 $piece_num =
$object->piece_num;
330 if ($template_id > 0) {
331 require_once DOL_DOCUMENT_ROOT.
'/accountancy/class/bookkeepingtemplate.class.php';
332 require_once DOL_DOCUMENT_ROOT.
'/accountancy/class/bookkeepingtemplateline.class.php';
335 $result_template = $template->fetch($template_id);
337 if ($result_template > 0 && !empty($template->lines)) {
341 foreach ($template->lines as $templateline) {
346 $bookkeeping->doc_type =
GETPOST(
'doctype',
'alpha');
347 $bookkeeping->piece_num = $piece_num;
348 $bookkeeping->doc_ref =
GETPOST(
'docref',
'alpha');
349 $bookkeeping->code_journal = $journal_code;
350 $bookkeeping->journal_label = $journal_label;
351 $bookkeeping->fk_doc = 0;
352 $bookkeeping->fk_docdet = 0;
356 $bookkeeping->numero_compte = $templateline->general_account;
357 $bookkeeping->label_compte = $templateline->general_label;
358 $bookkeeping->subledger_account = $templateline->subledger_account;
359 $bookkeeping->subledger_label = $templateline->subledger_label;
360 $bookkeeping->label_operation = $templateline->operation_label;
361 $bookkeeping->debit = (float) $templateline->debit;
362 $bookkeeping->credit = (float) $templateline->credit;
365 if ((
float) $bookkeeping->debit != 0.0) {
366 $bookkeeping->montant = $bookkeeping->debit;
367 $bookkeeping->amount = $bookkeeping->debit;
368 $bookkeeping->sens =
'D';
370 if ((
float) $bookkeeping->credit != 0.0) {
371 $bookkeeping->montant = $bookkeeping->credit;
372 $bookkeeping->amount = $bookkeeping->credit;
373 $bookkeeping->sens =
'C';
376 $result_line = $bookkeeping->createStd($user, 0,
'_tmp');
378 if ($result_line < 0) {
380 setEventMessages($bookkeeping->error, $bookkeeping->errors,
'errors');
385 if (!$error_template) {
387 setEventMessages($langs->trans(
'TemplateLinesLoaded', count($template->lines)),
null,
'mesgs');
395 header(
"Location: ".$_SERVER[
"PHP_SELF"].
"?piece_num=".$piece_num.
"&mode=_tmp");
401 if ($action ==
'setdate' && $permissiontoadd) {
403 $result =
$object->updateByMvt($piece_num,
'doc_date', $db->idate($datedoc), $mode);
407 if ($mode !=
'_tmp') {
408 setEventMessages($langs->trans(
'RecordSaved'),
null,
'mesgs');
414 if ($action ==
'setjournal' && $permissiontoadd) {
415 $result =
$object->updateByMvt($piece_num,
'code_journal', $journal_code, $mode);
416 $result =
$object->updateByMvt($piece_num,
'journal_label', $journal_label, $mode);
420 if ($mode !=
'_tmp') {
421 setEventMessages($langs->trans(
'RecordSaved'),
null,
'mesgs');
427 if ($action ==
'setdocref' && $permissiontoadd) {
428 $refdoc =
GETPOST(
'doc_ref',
'alpha');
429 $result =
$object->updateByMvt($piece_num,
'doc_ref', $refdoc, $mode);
433 if ($mode !=
'_tmp') {
434 setEventMessages($langs->trans(
'RecordSaved'),
null,
'mesgs');
440 if ($action ==
'setref' && $permissiontoadd && $numRefModel ===
'mod_bookkeeping_neon') {
441 $newref =
GETPOST(
'ref',
'alpha');
444 $object->error = $langs->trans(
"ErrorFieldTooLong", $langs->transnoentitiesnoconv(
"Ref"));
447 $result =
$object->updateByMvt($piece_num,
'ref', $newref, $mode);
452 if ($mode !=
'_tmp') {
453 setEventMessages($langs->trans(
'RecordSaved'),
null,
'mesgs');
460 if ($action ==
'valid' && $permissiontoadd) {
461 $result =
$object->transformTransaction(0, $piece_num);
466 $piece_num =
$object->piece_num;
468 $linkEntry =
'<a href="'.$_SERVER[
"PHP_SELF"].
'?piece_num='.(int) $piece_num.
'">'.$langs->trans(
'NumMvts').
': '.(int) $piece_num.
'</a>';
469 setEventMessages($langs->trans(
'RecordSaved').
' - '.$linkEntry,
null,
'mesgs',
'', 1);
473 header(
"Location: ".$_SERVER[
"PHP_SELF"].
"?piece_num=".(
int) $piece_num);
476 header(
"Location: ".$backtopage.
"?sortfield=t.piece_num&sortorder=asc".($type ?
'&type='.$type :
''));
483 $toselect_str = explode(
',',
GETPOST(
'toselect',
'alphanohtml'));
485 foreach ($toselect_str as $i) {
486 $toselect[] = (int) $i;
489 if ($action ==
'deletebookkeepingwriting' && $confirm ==
"yes" && $permissiontodelete) {
494 $nb_lettering = $lettering->bookkeepingLetteringAll($toselect,
true);
495 if ($nb_lettering < 0) {
496 setEventMessages(
'', $lettering->errors,
'errors');
504 foreach ($toselect as $toselectid) {
505 $result =
$object->fetch($toselectid);
506 if ($result >= 0 && (!isset(
$object->date_validation) ||
$object->date_validation ===
'')) {
515 } elseif ($result < 0) {
519 } elseif (isset(
$object->date_validation) &&
$object->date_validation !=
'') {
520 setEventMessages($langs->trans(
"ValidatedRecordWhereFound"),
null,
'errors');
532 setEventMessages($langs->trans(
"RecordsDeleted", $nbok),
null,
'mesgs');
533 } elseif ($nbok > 0) {
534 setEventMessages($langs->trans(
"RecordDeleted", $nbok),
null,
'mesgs');
536 setEventMessages($langs->trans(
"NoRecordDeleted"),
null,
'mesgs');
539 header(
"Location: ".DOL_URL_ROOT.
'/accountancy/bookkeeping/list.php?noreset=1');
546 if ($action ==
'clonebookkeepingwriting' && $confirm ==
"yes" && $permissiontoadd) {
548 $piece_num =
GETPOST(
'piece_num',
'alpha');
549 $journal_code =
GETPOST(
'code_journal',
'alpha');
554 $result =
$object->newClone($piece_num, $journal_code, $clonedate);
563 header(
"Location: " . $_SERVER[
'PHP_SELF'] .
"?piece_num=" . (
$object->getNextNumMvt() - 1));
577$form =
new Form($db);
580$title = $langs->trans(
"CreateMvts");
581$help_url =
'EN:Module_Double_Entry_Accounting|FR:Module_Comptabilité_en_Partie_Double';
583llxHeader(
'', $title, $help_url,
'', 0, 0,
'',
'',
'',
'mod-accountancy accountancy-consultation page-card');
586if ($action ==
'delete') {
587 $formconfirm = $form->formconfirm($_SERVER[
"PHP_SELF"].
'?id='.
$id.
'&mode='.$mode, $langs->trans(
'DeleteMvt'), $langs->trans(
'ConfirmDeleteMvt', $langs->transnoentitiesnoconv(
"RegistrationInAccounting")),
'confirm_delete',
'', 0, 1);
592if (!empty(
$conf->use_javascript_ajax)) {
593 print
"\n" .
'<script type="text/javascript">';
594 print
'$(document).ready(function () {
595 function toggleSubledger() {
596 var isCentral = $("#accountingaccount_number option:selected").data("centralized");
597 console.log("the selected general ledger account is centralised?", isCentral);
599 var isAjaxMode = $("#search_subledger_account").length > 0;
600 var $visibleSubledger = isAjaxMode
601 ? $("#search_subledger_account")
602 : $("#subledger_account");
605 $visibleSubledger.prop("disabled", false);
607 $("#subledger_account").prop("disabled", false).trigger("change");
609 $("#subledger_label").prop("disabled", false);
611 $visibleSubledger.prop("disabled", true).val("");
613 $("#subledger_account").val("").prop("disabled", true).trigger("change");
615 $("#subledger_account").val("");
617 $("#subledger_label").val("").prop("disabled", true);
623 $("#accountingaccount_number").on("change", toggleSubledger);
624 $("#accountingaccount_number").on("select2:select", toggleSubledger);
627 print
' </script>' .
"\n";
630if ($action ==
'create') {
634 $next_num_mvt =
$object->getNextNumMvt(
'_tmp');
636 if (empty($next_num_mvt)) {
637 dol_print_error(
null,
'Failed to get next piece number');
640 print
'<form action="'.$_SERVER[
"PHP_SELF"].
'" name="create_mvt" method="POST">';
641 if ($optioncss !=
'') {
642 print
'<input type="hidden" name="optioncss" value="'.$optioncss.
'">';
644 print
'<input type="hidden" name="token" value="'.newToken().
'">';
645 print
'<input type="hidden" name="action" value="confirm_create">'.
"\n";
646 print
'<input type="hidden" name="next_num_mvt" value="'.$next_num_mvt.
'">'.
"\n";
647 print
'<input type="hidden" name="backtopage" value="'.$backtopage.
'">';
648 print
'<input type="hidden" name="type" value="'.$type.
'">';
649 print
'<input type="hidden" name="mode" value="_tmp">'.
"\n";
653 print
'<table class="border centpercent">';
656 print
'<td class="fieldrequired">'.$langs->trans(
"Docdate").
'</td>';
658 print $form->selectDate(
'',
'doc_date', 0, 0, 0,
"create_mvt", 1, 1);
663 print
'<td class="fieldrequired">'.$langs->trans(
"Codejournal").
'</td>';
664 print
'<td>'.$formaccounting->select_journal($journal_code,
'code_journal', 0, 0, 1, 1).
'</td>';
668 print
'<td class="fieldrequired">'.$form->textwithpicto($langs->trans(
"Piece"), $langs->trans(
"PieceDesc")).
'</td>';
669 print
'<td><input type="text" class="minwidth200" name="doc_ref" value="'.GETPOST(
'doc_ref',
'alpha').
'"></td>';
674 print
'<td>'.$form->textwithpicto($langs->trans(
"Ref"), $langs->trans(
"BankTransactionRef")).
'</td>';
676 if ($numRefModel ===
'mod_bookkeeping_neon') {
677 print
'<input type="text" class="minwidth200" name="ref" maxlength="30" value="">';
679 print
'<span class="opacitymedium">'.$langs->trans(
"Automatic").
'</span>';
685 print
'<td>'.$langs->trans(
"BookkeepingTemplate").
'</td>';
687 require_once DOL_DOCUMENT_ROOT.
'/accountancy/class/bookkeepingtemplate.class.php';
689 $sql =
"SELECT rowid, code, label";
690 $sql .=
" FROM ".MAIN_DB_PREFIX.
"accounting_transaction_template";
691 $sql .=
" WHERE entity IN (".getEntity(
'accounting').
")";
692 $sql .=
" ORDER BY code ASC";
694 $resql = $db->query($sql);
695 $templates = array();
698 $num = $db->num_rows($resql);
701 $obj = $db->fetch_object($resql);
702 $templates[$obj->rowid] = $obj->code.
' - '.$obj->label;
708 if (count($templates) > 0) {
709 print
'<select class="flat minwidth300" name="template_id" id="template_id">';
710 print
'<option value=""></option>';
711 foreach ($templates as $key => $label) {
716 print
'<span class="opacitymedium">'.$langs->trans(
"NoTemplateAvailable").
'</span>';
722 $reshookAddLine = $hookmanager->executeHooks(
'bookkeepingAddLine', $parameters, $object, $action);
728 print $form->buttonsSaveCancel(
"Create");
734 $result =
$object->fetchPerMvt($piece_num, $mode);
739 if (!empty(
$object->piece_num)) {
740 $backlink =
'<a href="'.DOL_URL_ROOT.
'/accountancy/bookkeeping/list.php?restore_lastsearch_values=1">'.$langs->trans(
'BackToList').
'</a>';
753 if ($mode ==
'_tmp') {
754 $object->context[
'mode'] = $mode;
755 $object->next_prev_filter =
'1=0';
759 $morehtmlref =
'<div style="clear: both;"></div>';
760 $morehtmlref .=
'<div class="refidno opacitymedium">';
761 $morehtmlref .=
$object->label;
762 $morehtmlref .=
'</div>';
764 dol_banner_tab($object,
'ref', $backlink, 1,
'piece_num',
'piece_num', $morehtmlref);
767 if ($action ==
'clonebookkeepingwriting' && $confirm !=
'yes' && $permissiontoadd) {
768 $piece_num =
GETPOST(
'piece_num',
'alpha');
771 $form =
new Form($db);
772 $input1 = $form->selectDate(
'',
'clonedate', 0, 0, 0,
"", 1, 1);
773 $input2 = $formaccounting->select_journal($journal_code,
'code_journal', 0, 0, 1, 1);
775 $formquestion = array(
778 'name' =>
'clonedate',
779 'label' =>
'<span class="fieldrequired">' . $langs->trans(
"Docdate") .
'</span>',
784 $formquestion[] = array(
'type' =>
'hidden',
'name' =>
'piece_num',
'value' => $piece_num);
787 $formquestion[] = array(
789 'name' =>
'code_journal',
790 'label' =>
'<span class="fieldrequired">' . $langs->trans(
"Codejournal") .
'</span>',
795 print $form->formconfirm(
796 $_SERVER[
"PHP_SELF"],
797 $langs->trans(
"ConfirmMassCloneBookkeepingWriting"),
798 $langs->trans(
"ConfirmMassCloneBookkeepingWritingQuestion", 1),
799 "clonebookkeepingwriting",
806 print
'<div class="fichecenter">';
808 print
'<div class="fichehalfleft">';
810 print
'<div class="underbanner clearboth"></div>';
811 print
'<table class="border tableforfield centpercent">';
822 print
'<tr><td class="titlefieldmiddle">';
823 print
'<table class="nobordernopadding centpercent"><tr><td>';
824 print $langs->trans(
'Ref');
826 if ($action !=
'editref' && empty(
$object->date_validation)) {
827 print
'<td class="right">';
828 if ($permissiontoadd && $numRefModel ===
'mod_bookkeeping_neon') {
829 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>';
833 print
'</tr></table>';
835 if ($action ==
'editref' && empty(
$object->date_validation)) {
836 print
'<form name="setref" action="'.$_SERVER[
"PHP_SELF"].
'?piece_num='.((int)
$object->piece_num).
'" method="POST">';
837 if ($optioncss !=
'') {
838 print
'<input type="hidden" name="optioncss" value="'.$optioncss.
'">';
840 print
'<input type="hidden" name="token" value="'.newToken().
'">';
841 print
'<input type="hidden" name="action" value="setref">';
842 print
'<input type="hidden" name="mode" value="'.$mode.
'">';
843 print
'<input type="hidden" name="backtopage" value="'.$backtopage.
'">';
844 print
'<input type="hidden" name="type" value="'.$type.
'">';
845 print
'<input type="text" size="20" name="ref" maxlength="30" value="'.dol_escape_htmltag(
$object->ref).
'">';
846 print
'<input type="submit" class="button button-edit smallpaddingimp" value="'.$langs->trans(
'Modify').
'">';
856 print
'<table class="nobordernopadding centpercent"><tr><td>';
857 print $form->textwithpicto($langs->trans(
'Piece'), $langs->trans(
'PieceDesc'));
859 if ($action !=
'editdocref') {
860 print
'<td class="right">';
861 if ($permissiontoadd && empty(
$object->date_validation)) {
862 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>';
866 print
'</tr></table>';
868 if ($action ==
'editdocref' && empty(
$object->date_validation)) {
869 print
'<form name="setdocref" action="'.$_SERVER[
"PHP_SELF"].
'?piece_num='.((int)
$object->piece_num).
'" method="POST">';
870 if ($optioncss !=
'') {
871 print
'<input type="hidden" name="optioncss" value="'.$optioncss.
'">';
873 print
'<input type="hidden" name="token" value="'.newToken().
'">';
874 print
'<input type="hidden" name="action" value="setdocref">';
875 print
'<input type="hidden" name="mode" value="'.$mode.
'">';
876 print
'<input type="hidden" name="backtopage" value="'.$backtopage.
'">';
877 print
'<input type="hidden" name="type" value="'.$type.
'">';
878 print
'<input type="text" size="20" name="doc_ref" value="'.dol_escape_htmltag(
$object->doc_ref).
'">';
879 print
'<input type="submit" class="button button-edit smallpaddingimp" value="'.$langs->trans(
'Modify').
'">';
883 if (
$object->doc_type ===
'customer_invoice' && !empty(
$object->fk_doc)) {
884 $invoicestatic =
new Facture($db);
885 $result = $invoicestatic->fetch(
$object->fk_doc);
888 $label_element = $invoicestatic->getNomUrl(1);
890 $label_element =
$object->doc_ref;
892 } elseif (
$object->doc_type ===
'supplier_invoice' && !empty(
$object->fk_doc)) {
894 $result = $supplierinvoicestatic->fetch(
$object->fk_doc);
897 $label_element = $supplierinvoicestatic->getNomUrl(1);
899 $label_element =
$object->doc_ref;
901 } elseif (
$object->doc_type ===
'expense_report' && !empty(
$object->fk_doc)) {
903 $result = $expensereportstatic->fetch(
$object->fk_doc);
906 $label_element = $expensereportstatic->getNomUrl(1);
908 $label_element =
$object->doc_ref;
911 $label_element =
$object->doc_ref;
913 print $label_element;
920 print
'<table class="nobordernopadding centpercent"><tr><td>';
921 print $langs->trans(
'Docdate');
923 if ($action !=
'editdate') {
924 print
'<td class="right">';
925 if ($permissiontoadd && empty(
$object->date_validation)) {
926 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>';
930 print
'</tr></table>';
931 print
'</td><td colspan="3">';
932 if ($action ==
'editdate' && empty(
$object->date_validation)) {
933 print
'<form name="setdate" action="'.$_SERVER[
"PHP_SELF"].
'?piece_num='.((int)
$object->piece_num).
'" method="POST">';
934 if ($optioncss !=
'') {
935 print
'<input type="hidden" name="optioncss" value="'.$optioncss.
'">';
937 print
'<input type="hidden" name="token" value="'.newToken().
'">';
938 print
'<input type="hidden" name="action" value="setdate">';
939 print
'<input type="hidden" name="mode" value="'.$mode.
'">';
940 print
'<input type="hidden" name="backtopage" value="'.$backtopage.
'">';
941 print
'<input type="hidden" name="type" value="'.$type.
'">';
942 print $form->selectDate(
$object->doc_date ?
$object->doc_date : -1,
'doc_date', 0, 0, 0,
"setdate");
943 print
'<input type="submit" class="button button-edit" value="'.$langs->trans(
'Modify').
'">';
953 print
'<table class="nobordernopadding centpercent"><tr><td>';
954 print $langs->trans(
'Codejournal');
956 if ($action !=
'editjournal') {
957 print
'<td class="right">';
958 if ($permissiontoadd && empty(
$object->date_validation)) {
959 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>';
963 print
'</tr></table>';
965 if ($action ==
'editjournal' && empty(
$object->date_validation)) {
966 print
'<form name="setjournal" action="'.$_SERVER[
"PHP_SELF"].
'?piece_num='.((int)
$object->piece_num).
'" method="POST">';
967 if ($optioncss !=
'') {
968 print
'<input type="hidden" name="optioncss" value="'.$optioncss.
'">';
970 print
'<input type="hidden" name="token" value="'.newToken().
'">';
971 print
'<input type="hidden" name="action" value="setjournal">';
972 print
'<input type="hidden" name="mode" value="'.$mode.
'">';
973 print
'<input type="hidden" name="backtopage" value="'.$backtopage.
'">';
974 print
'<input type="hidden" name="type" value="'.$type.
'">';
975 print $formaccounting->select_journal(
$object->code_journal,
'code_journal', 0, 0, 0, 1,
'');
976 print
'<input type="submit" class="button button-edit" value="'.$langs->trans(
'Modify').
'">';
981 $accountingjournalstatic->fetch(0,
$object->code_journal);
982 $journal = $accountingjournalstatic->code;
983 $journal_label = $accountingjournalstatic->label;
985 print $accountingjournalstatic->getNomUrl(1, 1, 1);
995 print
'<div class="fichehalfright">';
997 print
'<div class="underbanner clearboth"></div>';
998 print
'<table class="border tableforfield centpercent">';
1001 if (!empty(
$object->doc_type)) {
1003 print
'<td class="titlefield">'.$langs->trans(
"Doctype").
'</td>';
1004 print
'<td>'.$object->doc_type.
'</td>';
1010 print
'<td class="titlefield">'.$langs->trans(
"DateCreation").
'</td>';
1019 print
'<td class="titlefield">' . $form->textwithpicto($langs->trans(
'DateDue'), $langs->trans(
"IfTransactionHasDueDate")) .
'</td>';
1027 if ($mode !=
"_tmp") {
1030 print
'<td class="titlefield">' . $langs->trans(
"DateExport") .
'</td>';
1032 print
$object->date_export ? img_picto($langs->trans(
"TransactionExportDesc"),
'fa-file-export',
'class="pictofixedwidth opacitymedium"').dol_print_date(
$object->date_export,
'dayhour') :
' ';
1038 print
'<td class="titlefield">' . $langs->trans(
"DateValidation") .
'</td>';
1040 print
$object->date_validation ? img_picto($langs->trans(
"TransactionBlockedLockedDesc"),
'fa-lock',
'class="pictofixedwidth opacitymedium"').dol_print_date(
$object->date_validation,
'dayhour') :
' ';
1045 if (!empty(
$object->import_key)) {
1047 print
'<td class="titlefield">' . $langs->trans(
"ImportId") .
'</td>';
1100 print
'<div class="clearboth"></div>';
1106 $result =
$object->fetchAllPerMvt($piece_num, $mode);
1112 $tmptoselect = array();
1113 $atleastonevalidated = 0;
1114 $atleastoneexported = 0;
1115 foreach (
$object->linesmvt as $line) {
1116 $tmptoselect[] = $line->id;
1117 if (!empty($line->date_validation)) {
1118 $atleastonevalidated = 1;
1120 if (!empty($line->date_export) || !empty($line->date_validation)) {
1121 $atleastoneexported = 1;
1125 if ($mode !=
'_tmp' && !$atleastonevalidated) {
1126 print
"\n".
'<div class="tabsAction">'.
"\n";
1128 $parameters = array();
1129 $reshook = $hookmanager->executeHooks(
'addMoreActionsButtons', $parameters, $object, $action);
1130 if (empty($reshook)) {
1131 if ($permissiontodelete) {
1132 if (!isset($hookmanager->resArray[
'no_button_edit']) || $hookmanager->resArray[
'no_button_edit'] != 1) {
1133 print dolGetButtonAction($langs->trans(
'Delete'), $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, array(
'attr' => array(
'class' =>
'reposition'))).
"\n";
1136 if ($permissiontoadd) {
1137 print dolGetButtonAction($langs->trans(
'ToClone'), $langs->trans(
'ToClone'),
'clone', DOL_URL_ROOT.
'/accountancy/bookkeeping/card.php?action=clonebookkeepingwriting&token=' .
newToken() .
'&piece_num=' . ((
int)
$object->piece_num) .
'&toselect=' . implode(
',', $tmptoselect),
'action-clone', $permissiontoadd, array(
'attr' => array(
'class' =>
'reposition')));
1147 if (empty(
$object->date_validation)) {
1148 print
'<form action="' . $_SERVER[
"PHP_SELF"] .
'?piece_num=' . ((int)
$object->piece_num) .
'" method="POST">';
1149 if ($optioncss !=
'') {
1150 print
'<input type="hidden" name="optioncss" value="' . $optioncss .
'">';
1152 print
'<input type="hidden" name="token" value="' .
newToken() .
'">';
1153 print
'<input type="hidden" name="doc_date" value="' .
$object->doc_date .
'">' .
"\n";
1154 print
'<input type="hidden" name="doc_type" value="' .
$object->doc_type .
'">' .
"\n";
1155 print
'<input type="hidden" name="doc_ref" value="' .
$object->doc_ref .
'">' .
"\n";
1156 print
'<input type="hidden" name="ref" value="' .
$object->ref .
'">' .
"\n";
1157 print
'<input type="hidden" name="code_journal" value="' .
$object->code_journal .
'">' .
"\n";
1158 print
'<input type="hidden" name="fk_doc" value="' .
$object->fk_doc .
'">' .
"\n";
1159 print
'<input type="hidden" name="fk_docdet" value="' .
$object->fk_docdet .
'">' .
"\n";
1160 print
'<input type="hidden" name="mode" value="' . $mode .
'">' .
"\n";
1161 print
'<input type="hidden" name="backtopage" value="' . $backtopage .
'">';
1162 print
'<input type="hidden" name="type" value="' . $type .
'">';
1165 if (count(
$object->linesmvt) > 0) {
1166 print
'<div class="div-table-responsive-no-min">';
1167 print
'<table class="noborder centpercent">';
1172 print
'<tr class="liste_titre">';
1179 if (empty(
$object->date_validation)) {
1188 if (!empty(
$object->linesmvt[0]) && empty(
$object->date_validation)) {
1189 $tmpline =
$object->linesmvt[0];
1190 if (!empty($tmpline->numero_compte)) {
1196 foreach (
$object->linesmvt as $line) {
1197 $total_debit += $line->debit;
1198 $total_credit += $line->credit;
1200 if ($action ==
'update' && $line->id == $id && empty(
$object->date_validation)) {
1201 print
'<tr class="oddeven" data-lineid="'.((int) $line->id).
'">';
1202 print
'<!-- td columns in edit mode -->';
1204 print $formaccounting->select_account((
GETPOSTISSET(
"accountingaccount_number") ?
GETPOST(
"accountingaccount_number",
"alpha") : $line->numero_compte),
'accountingaccount_number', 1, array(), 1, 1,
'minwidth200 maxwidth500');
1207 print $formaccounting->select_auxaccount((
GETPOSTISSET(
"subledger_account") ?
GETPOST(
"subledger_account",
"alpha") : $line->subledger_account),
'subledger_account', 1,
'maxwidth250',
'',
'subledger_label');
1209 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")).
'">';
1211 print
'<td><input type="text" class="minwidth200" name="label_operation" value="'.(GETPOSTISSET(
"label_operation") ?
GETPOST(
"label_operation",
"alpha") : $line->label_operation).
'"></td>';
1212 print
'<td class="right"><input type="text" class="right width50" name="debit" value="'.(GETPOSTISSET(
"debit") ?
GETPOST(
"debit",
"alpha") :
price($line->debit)).
'"></td>';
1213 print
'<td class="right"><input type="text" class="right width50" name="credit" value="'.(GETPOSTISSET(
"credit") ?
GETPOST(
"credit",
"alpha") :
price($line->credit)).
'"></td>';
1215 print
'<input type="hidden" name="id" value="'.$line->id.
'">'.
"\n";
1216 print
'<input type="submit" class="button" name="update" value="'.$langs->trans(
"Update").
'">';
1219 } elseif ((empty($line->numero_compte) || (empty($line->debit) && empty($line->credit))) && empty(
$object->date_validation)) {
1220 if (($action ==
"" || $action ==
'add') && $permissiontoadd) {
1221 print
'<tr class="oddeven" data-lineid="'.((int) $line->id).
'">';
1222 print
'<!-- td columns in add mode -->';
1224 print $formaccounting->select_account($action ==
'add' ?
GETPOST(
'accountingaccount_number') :
'',
'accountingaccount_number', 1, array(), 1, 1,
'minwidth200 maxwidth500');
1227 print $formaccounting->select_auxaccount(
'',
'subledger_account', 1,
'maxwidth250',
'',
'subledger_label');
1228 print
'<br><input type="text" class="maxwidth150" name="subledger_label" id="subledger_label" value="" placeholder="' .
dol_escape_htmltag($langs->trans(
"SubledgerAccountLabel")) .
'">';
1230 print
'<td><input type="text" class="minwidth200" name="label_operation" value="' .
dol_escape_htmltag($label_operation) .
'"/></td>';
1231 print
'<td class="right"><input type="text" class="right width50" name="debit" value=""/></td>';
1232 print
'<td class="right"><input type="text" class="right width50" name="credit" value=""/></td>';
1233 print
'<td class="center"><input type="submit" class="button small" name="save" value="' . $langs->trans(
"Add") .
'"></td>';
1237 print
'<tr class="oddeven" data-lineid="'.((int) $line->id).
'">';
1238 print
'<!-- td columns in display mode -->';
1239 $resultfetch = $accountingaccount->fetch(0, $line->numero_compte,
true);
1241 if ($resultfetch > 0) {
1242 print $accountingaccount->getNomUrl(0, 1, 1,
'', 0);
1244 print
dol_escape_htmltag($line->numero_compte).
' <span class="warning">('.$langs->trans(
"AccountRemovedFromCurrentChartOfAccount").
')</span>';
1247 print
'<td>'.length_accounta($line->subledger_account);
1248 if ($line->subledger_label) {
1249 print
' - <span class="opacitymedium">'.dol_escape_htmltag($line->subledger_label).
'</span>';
1252 print
'<td>'.$line->label_operation.
'</td>';
1253 print
'<td class="right nowraponall amount">'.($line->debit != 0 ?
price($line->debit) :
'').
'</td>';
1254 print
'<td class="right nowraponall amount">'.($line->credit != 0 ?
price($line->credit) :
'').
'</td>';
1256 print
'<td class="center nowraponall">';
1257 if ($permissiontoadd) {
1258 if (empty($line->date_export) && empty($line->date_validation)) {
1259 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()) .
'">';
1260 print img_edit(
'', 0,
'class="marginrightonly"');
1261 print
'</a> ';
1263 print
'<a class="editfielda nohover cursornotallowed reposition disabled" href="#" title="'.dol_escape_htmltag($langs->trans(
"ForbiddenTransactionAlreadyExported")).
'">';
1264 print img_edit($langs->trans(
"ForbiddenTransactionAlreadyExported"), 0,
'class="marginrightonly"');
1265 print
'</a> ';
1268 if (empty($line->date_validation)) {
1269 $actiontodelete =
'delete';
1270 if ($mode ==
'_tmp' || $action !=
'delmouv') {
1271 $actiontodelete =
'confirm_delete';
1274 print
'<a href="' . $_SERVER[
"PHP_SELF"] .
'?action=' . $actiontodelete .
'&id=' . $line->id .
'&piece_num=' . ((int) $line->piece_num) .
'&mode=' . urlencode((
string) $mode) .
'&token=' . urlencode(
newToken()) .
'">';
1278 print
'<a class="editfielda nohover cursornotallowed disabled" href="#" title="'.dol_escape_htmltag($langs->trans(
"ForbiddenTransactionAlreadyExported")).
'">';
1279 print img_delete($langs->trans(
"ForbiddenTransactionAlreadyValidated"));
1288 $total_debit =
price2num($total_debit,
'MT');
1289 $total_credit =
price2num($total_credit,
'MT');
1291 if ($total_debit != $total_credit) {
1292 setEventMessages(
null, array($langs->trans(
'MvtNotCorrectlyBalanced', $total_debit, $total_credit)),
'warnings');
1298 if ($mode ==
'_tmp' && $action ==
'' && $permissiontoadd) {
1300 print
'<div class="center">';
1301 if (empty($total_debit) && empty($total_credit)) {
1302 print
'<a class="button disabled cursornotallowed" disabled="disabled" href="#" title="'.dol_escape_htmltag($langs->trans(
"EnterNonEmptyLinesFirst")).
'">'.
dol_escape_htmltag($langs->trans(
"ValidTransaction")).
'</a>';
1303 } elseif ($total_debit == $total_credit) {
1304 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>';
1306 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>';
1310 print
'<a class="button button-cancel" href="'.$backtopage.(!empty($type) ?
'?type=sub' :
'').
'">'.$langs->trans(
"Cancel").
'</a>';
1319 print $langs->trans(
"NoRecordFound");
$id
Support class for third parties, contacts, members, users or resources.
if(! $sortfield) if(! $sortorder) $object
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.
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.
Class to manage accounting accounts.
Class to manage accounting journals.
Class to manage Ledger (General Ledger and Subledger)
Class for BookkeepingTemplate.
Class to manage Trips and Expenses.
Class to manage suppliers invoices.
Class to manage invoices.
$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...
price2num($amount, $rounding='', $option=0)
Function that return a number with universal decimal format (decimal separator is '.
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.
GETPOSTINT($paramname, $method=0, $nodefault=0)
Return the value of a $_GET or $_POST supervariable, converted into integer.
dol_clone($srcobject, $native=2)
Create a clone of instance of object (new instance with same value for each properties) With native =...
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).
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.
print_liste_field_titre($name, $file="", $field="", $begin="", $param="", $moreattrib="", $sortfield="", $sortorder="", $prefix="", $tooltip="", $forcenowrapcolumntitle=0)
Show title line of an array.
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.
dol_get_fiche_end($notab=0)
Return tab footer of a card.
load_fiche_titre($title, $morehtmlright='', $picto='generic', $pictoisfullpath=0, $id='', $morecssontable='', $morehtmlcenter='', $morecssonpicto='widthpictotitle')
Load a title with picto.
dol_escape_htmltag($stringtoescape, $keepb=0, $keepn=0, $noescapetags='', $escapeonlyhtmltags=0, $cleanalsojavascript=0)
accessforbidden($message='', $printheader=1, $printfooter=1, $showonlymessage=0, $params=null)
Show a message to say access is forbidden and stop program.