dolibarr 24.0.0-beta
html.formaccounting.class.php
Go to the documentation of this file.
1<?php
2/* Copyright (C) 2013-2016 Florian Henry <florian.henry@open-concept.pro>
3 * Copyright (C) 2013-2014 Olivier Geffroy <jeff@jeffinfo.com>
4 * Copyright (C) 2015 Ari Elbaz (elarifr) <github@accedinfo.com>
5 * Copyright (C) 2016 Marcos García <marcosgdf@gmail.com>
6 * Copyright (C) 2016-2026 Alexandre Spangaro <alexandre@inovea-conseil.com>
7 * Copyright (C) 2024-2026 MDW <mdeweerd@users.noreply.github.com>
8 * Copyright (C) 2024-2026 Frédéric France <frederic.france@free.fr>
9 *
10 * This program is free software; you can redistribute it and/or modify
11 * it under the terms of the GNU General Public License as published by
12 * the Free Software Foundation; either version 3 of the License, or
13 * (at your option) any later version.
14 *
15 * This program is distributed in the hope that it will be useful,
16 * but WITHOUT ANY WARRANTY; without even the implied warranty of
17 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
18 * GNU General Public License for more details.
19 *
20 * You should have received a copy of the GNU General Public License
21 * along with this program. If not, see <https://www.gnu.org/licenses/>.
22 */
23
29require_once DOL_DOCUMENT_ROOT.'/core/class/html.form.class.php';
30
31
35class FormAccounting extends Form
36{
40 private $options_cache = array();
41
45 public $db;
46
50 public $error = '';
51
55 public $nbaccounts;
59 public $nbaccounts_category;
60
61
67 public function __construct($db)
68 {
69 $this->db = $db;
70 }
71
72 // phpcs:disable PEAR.NamingConventions.ValidFunctionName.ScopeNotCamelCaps
87 public function select_journal($selectid, $htmlname = 'journal', $nature = 0, $showempty = 0, $select_in = 0, $select_out = 0, $morecss = 'maxwidth300 maxwidthonsmartphone', $usecache = '', $disabledajaxcombo = 0)
88 {
89 // phpcs:enable
90 global $conf, $langs;
91
92 $out = '';
93
94 $options = array();
95 if ($usecache && !empty($this->options_cache[$usecache])) {
96 $options = $this->options_cache[$usecache];
97 $selected = $selectid;
98 } else {
99 $sql = "SELECT rowid, code, label, nature, entity, active";
100 $sql .= " FROM ".$this->db->prefix()."accounting_journal";
101 $sql .= " WHERE active = 1";
102 $sql .= " AND entity = ".((int) $conf->entity);
103 if ($nature && is_numeric($nature)) {
104 $sql .= " AND nature = ".((int) $nature);
105 }
106 $sql .= " ORDER BY code";
107
108 dol_syslog(get_class($this)."::select_journal", LOG_DEBUG);
109 $resql = $this->db->query($sql);
110
111 if (!$resql) {
112 $this->error = "Error ".$this->db->lasterror();
113 dol_syslog(get_class($this)."::select_journal ".$this->error, LOG_ERR);
114 return -1;
115 }
116
117 $selected = 0;
118 $langs->load('accountancy');
119 while ($obj = $this->db->fetch_object($resql)) {
120 $label = $obj->code.' - '.$langs->trans($obj->label);
121
122 $select_value_in = $obj->rowid;
123 $select_value_out = $obj->rowid;
124
125 // Try to guess if we have found default value
126 if ($select_in == 1) {
127 $select_value_in = $obj->code;
128 }
129 if ($select_out == 1) {
130 $select_value_out = $obj->code;
131 }
132 // Remember guy's we store in database llx_accounting_bookkeeping the code of accounting_journal and not the rowid
133 if ($selectid != '' && $selectid == $select_value_in) {
134 //var_dump("Found ".$selectid." ".$select_value_in);
135 $selected = $select_value_out;
136 }
137
138 $options[$select_value_out] = $label;
139 }
140 $this->db->free($resql);
141
142 if ($usecache) {
143 $this->options_cache[$usecache] = $options;
144 }
145 }
146
147 $out .= Form::selectarray($htmlname, $options, $selected, $showempty, 0, 0, '', 0, 0, 0, '', $morecss, ($disabledajaxcombo ? 0 : 1));
148
149 return $out;
150 }
151
152 // phpcs:disable PEAR.NamingConventions.ValidFunctionName.ScopeNotCamelCaps
167 public function multi_select_journal($selectedIds = array(), $htmlname = 'journal', $nature = 0, $showempty = 0, $select_in = 0, $select_out = 0, $morecss = '', $usecache = '', $disabledajaxcombo = 0)
168 {
169 // phpcs:enable
170 global $conf, $langs;
171
172 $out = '';
173
174 $options = array();
175 if ($usecache && !empty($this->options_cache[$usecache])) {
176 $options = $this->options_cache[$usecache];
177 $selected = $selectedIds;
178 } else {
179 $sql = "SELECT rowid, code, label, nature, entity, active";
180 $sql .= " FROM ".$this->db->prefix()."accounting_journal";
181 $sql .= " WHERE active = 1";
182 $sql .= " AND entity = ".$conf->entity;
183 if ($nature && is_numeric($nature)) {
184 $sql .= " AND nature = ".((int) $nature);
185 }
186 $sql .= " ORDER BY code";
187
188 dol_syslog(get_class($this)."::multi_select_journal", LOG_DEBUG);
189 $resql = $this->db->query($sql);
190
191 if (!$resql) {
192 $this->error = "Error ".$this->db->lasterror();
193 dol_syslog(get_class($this)."::multi_select_journal ".$this->error, LOG_ERR);
194 return -1;
195 }
196
197 $selected = array();
198 $langs->load('accountancy');
199 while ($obj = $this->db->fetch_object($resql)) {
200 // Build the full text directly here
201 $translatedLabel = $langs->trans($obj->label);
202 if (empty($translatedLabel) || $translatedLabel === $obj->label) {
203 $translatedLabel = $obj->label; // fallback to the raw label
204 }
205 $label = $obj->code . ' - ' . $translatedLabel;
206
207 $select_value_in = ($select_in == 1 ? $obj->code : $obj->rowid);
208 $select_value_out = ($select_out == 1 ? $obj->code : $obj->rowid);
209
210 // Remember guy's we store in database llx_accounting_bookkeeping the code of accounting_journal and not the rowid
211 if (!empty($selectedIds) && in_array($select_value_in, $selectedIds)) {
212 $selected[] = $select_value_out;
213 }
214 $options[$select_value_out] = $label;
215 }
216 $this->db->free($resql);
217
218 if ($usecache) {
219 $this->options_cache[$usecache] = $options;
220 }
221 }
222
223 $out .= Form::multiselectarray($htmlname, $options, $selected, 0, 0, $morecss, 0, 0, '', 'code_journal', '', ($disabledajaxcombo ? 0 : 1));
224
225 return $out;
226 }
227
228 // phpcs:disable PEAR.NamingConventions.ValidFunctionName.ScopeNotCamelCaps
241 public function select_accounting_category($selected = 0, $htmlname = 'account_category', $useempty = 0, $maxlen = 0, $help = 1, $allcountries = 0)
242 {
243 // phpcs:enable
244 global $langs, $mysoc;
245
246 if (empty($mysoc->country_id) && empty($mysoc->country_code) && empty($allcountries)) {
247 dol_print_error(null, 'Call to select_accounting_account with mysoc country not yet defined');
248 exit;
249 }
250
251 $out = '';
252
253 if (!empty($mysoc->country_id)) {
254 $sql = "SELECT c.rowid, c.label as type, c.range_account";
255 $sql .= " FROM ".$this->db->prefix()."c_accounting_category as c";
256 $sql .= " WHERE c.active = 1";
257 $sql .= " AND c.category_type = 0";
258 if (empty($allcountries)) {
259 $sql .= " AND c.fk_country = ".((int) $mysoc->country_id);
260 }
261 $sql .= " ORDER BY c.label ASC";
262 } else {
263 $sql = "SELECT c.rowid, c.label as type, c.range_account";
264 $sql .= " FROM ".$this->db->prefix()."c_accounting_category as c, ".$this->db->prefix()."c_country as co";
265 $sql .= " WHERE c.active = 1";
266 $sql .= " AND c.category_type = 0";
267 $sql .= " AND c.fk_country = co.rowid";
268 if (empty($allcountries)) {
269 $sql .= " AND co.code = '".$this->db->escape($mysoc->country_code)."'";
270 }
271 $sql .= " ORDER BY c.label ASC";
272 }
273
274 $this->nbaccounts_category = 0;
275
276 dol_syslog(get_class($this).'::'.__METHOD__, LOG_DEBUG);
277 $resql = $this->db->query($sql);
278 if ($resql) {
279 $num = $this->db->num_rows($resql);
280 if ($num) {
281 $this->nbaccounts_category = $num;
282
283 $out .= '<select class="flat minwidth200" id="'.$htmlname.'" name="'.$htmlname.'">';
284 $i = 0;
285
286 if ($useempty) {
287 $out .= '<option value="0">&nbsp;</option>';
288 }
289 while ($i < $num) {
290 $obj = $this->db->fetch_object($resql);
291
292 $titletoshowhtml = ($maxlen ? dol_trunc($obj->type, $maxlen) : $obj->type).($obj->range_account ? ' <span class="opacitymedium">('.$obj->range_account.')</span>' : '');
293 $titletoshow = ($maxlen ? dol_trunc($obj->type, $maxlen) : $obj->type).($obj->range_account ? ' ('.$obj->range_account.')' : '');
294
295 $out .= '<option value="'.$obj->rowid.'"';
296 if ($obj->rowid == $selected) {
297 $out .= ' selected';
298 }
299 //$out .= ' data-html="'.dol_escape_htmltag(dol_string_onlythesehtmltags($titletoshowhtml, 1, 0, 0, 0, array('span'))).'"';
300 $out .= ' data-html="'.dolPrintHTMLForAttribute($titletoshowhtml).'"';
301 $out .= '>';
302 $out .= dol_escape_htmltag($titletoshow);
303 $out .= '</option>';
304 $i++;
305 }
306 $out .= '</select>';
307 //if ($user->admin && $help) $out .= info_admin($langs->trans("YouCanChangeValuesForThisListFromDictionarySetup"),1);
308
309 $out .= ajax_combobox($htmlname, array());
310 } else {
311 $out .= '<span class="opacitymedium">'.$langs->trans("ErrorNoAccountingCategoryForThisCountry", $mysoc->country_code, $langs->transnoentitiesnoconv("Accounting"), $langs->transnoentitiesnoconv("Setup"), $langs->transnoentitiesnoconv("AccountingCategories")).'</span>';
312 }
313 } else {
314 dol_print_error($this->db);
315 }
316
317 return $out;
318 }
319
320 // phpcs:disable PEAR.NamingConventions.ValidFunctionName.ScopeNotCamelCaps
328 public function select_bookkeeping_importkey($htmlname = 'importkey', $selectedkey = '')
329 {
330 // phpcs:enable
331 $options = array();
332
333 $sql = "SELECT DISTINCT import_key FROM ".$this->db->prefix()."accounting_bookkeeping";
334 $sql .= " WHERE entity IN (".getEntity('accountancy').")";
335 $sql .= ' ORDER BY import_key DESC';
336
337 dol_syslog(get_class($this)."::select_bookkeeping_importkey", LOG_DEBUG);
338 $resql = $this->db->query($sql);
339
340 if (!$resql) {
341 $this->error = "Error ".$this->db->lasterror();
342 dol_syslog(get_class($this)."::select_bookkeeping_importkey ".$this->error, LOG_ERR);
343 return -1;
344 }
345
346 while ($obj = $this->db->fetch_object($resql)) {
347 $options[$obj->import_key] = $obj->import_key;
348 }
349
350 return Form::selectarray($htmlname, $options, $selectedkey);
351 }
352
353 // phpcs:disable PEAR.NamingConventions.ValidFunctionName.ScopeNotCamelCaps
369 public function select_account($selectid, $htmlname = 'account', $showempty = 0, $event = array(), $select_in = 0, $select_out = 0, $morecss = 'minwidth100 maxwidth300 maxwidthonsmartphone', $usecache = '', $active = '1', $centralized = 0)
370 {
371 global $conf, $langs;
372 require_once DOL_DOCUMENT_ROOT.'/core/lib/accounting.lib.php';
373
374 $out = '';
375 $selected = '';
376 $options = [];
377
378 $selectid = (string) $selectid;
379
380 if ($showempty == 2) {
381 $options['0'] = '--- '.$langs->trans("None").' ---';
382 }
383
384 if ($usecache && !empty($this->options_cache[$usecache])) {
385 $options += $this->options_cache[$usecache];
386 $selected = (string) $selectid;
387 } else {
388 $trunclength = getDolGlobalInt('ACCOUNTING_LENGTH_DESCRIPTION_ACCOUNT', 50);
389
390 // Construct SQL request
391 $sql = "SELECT DISTINCT aa.account_number, aa.label, aa.labelshort, aa.rowid, aa.fk_pcg_version, aa.centralized";
392 $sql .= " FROM ".$this->db->prefix()."accounting_account as aa";
393 $sql .= " INNER JOIN ".$this->db->prefix()."accounting_system as asy ON aa.fk_pcg_version = asy.pcg_version";
394 $sql .= " AND asy.rowid = ".((int) getDolGlobalInt('CHARTOFACCOUNTS'));
395
396 if ($active === '1') {
397 $sql .= " AND aa.active = 1";
398 } elseif ($active === '0') {
399 $sql .= " AND aa.active = 0";
400 }
401
402 if ($centralized == 1) {
403 $sql .= " AND aa.centralized = 1";
404 }
405
406 $sql .= " AND aa.entity=".((int) $conf->entity);
407
408 // Sorting: centralized accounts first, then others
409 if ($centralized == 2) {
410 $sql .= " ORDER BY aa.centralized DESC, aa.account_number";
411 } else {
412 $sql .= " ORDER BY aa.account_number";
413 }
414
415 dol_syslog(get_class($this)."::select_account", LOG_DEBUG);
416 $resql = $this->db->query($sql);
417
418 if (!$resql) {
419 $this->error = "Error ".$this->db->lasterror();
420 dol_syslog(get_class($this)."::select_account ".$this->error, LOG_ERR);
421 return -1;
422 }
423
424 $num_rows = $this->db->num_rows($resql);
425
426 if ($num_rows == 0 && getDolGlobalInt('CHARTOFACCOUNTS') <= 0) {
427 $langs->load("errors");
428 $showempty = $langs->trans("ErrorYouMustFirstSetupYourChartOfAccount");
429 } elseif ($num_rows == 0) {
430 $langs->load("errors");
431 $showempty = $langs->trans("ErrorYouMustFirstSetupYourChartOfAccount");
432 } else {
433 $selected = $selectid;
434 $lastCentralized = null;
435
436 while ($obj = $this->db->fetch_object($resql)) {
437 // Insert a separator if you change category (centralized = 1 → 0)
438 if ($centralized == 2 && $lastCentralized !== null && $lastCentralized != $obj->centralized) {
439 $options['0'] = '-------------'; // Visual separator
440 }
441
442 $lastCentralized = $obj->centralized;
443
444 $labeltoshow = !empty($obj->labelshort) ? $obj->labelshort : $obj->label;
445 $label = length_accountg($obj->account_number).' - '.$labeltoshow;
446 $label = dol_trunc($label, $trunclength);
447
448 $select_value_in = $obj->rowid;
449 $select_value_out = $obj->rowid;
450
451 if ($select_in == 1) {
452 $select_value_in = $obj->account_number;
453 }
454 if ($select_out == 1) {
455 $select_value_out = $obj->account_number;
456 }
457
458 if ($selectid != '' && $selectid == (string) $select_value_in) {
459 $selected = (string) $select_value_out;
460 }
461
462 $options[$select_value_out] = array(
463 'label' => $label,
464 'data-centralized' => $obj->centralized ? 1 : 0
465 );
466 }
467 }
468
469 $this->db->free($resql);
470
471 if ($usecache) {
472 $this->options_cache[$usecache] = $options;
473 unset($this->options_cache[$usecache]['0']);
474 }
475 }
476
477 $out .= Form::selectarray($htmlname, $options, $selected, ($showempty ? (is_numeric($showempty) ? 1 : $showempty) : 0), 0, 0, '', 0, 0, 0, '', $morecss, 1);
478 $this->nbaccounts = count($options) - ($showempty == 2 ? 1 : 0);
479
480 return $out;
481 }
482
483 // phpcs:disable PEAR.NamingConventions.ValidFunctionName.ScopeNotCamelCaps
502 public function select_auxaccount($selectid, $htmlname = 'account_num_aux', $showempty = 0, $morecss = 'minwidth100 maxwidth300 maxwidthonsmartphone', $usecache = '', $labelhtmlname = '', $selected_input_value = '')
503 {
504 // phpcs:enable
505 global $conf, $langs;
506
507 $out = '';
508 $auxaccount_mode = getDolGlobalInt('ACCOUNTANCY_AUXACCOUNT_USE_SEARCH_TO_SELECT', 0);
509 $placeholder = (!empty($showempty) && !is_numeric($showempty)) ? $showempty : $langs->trans("SubledgerAccount");
510
511 // MODE 0: free text input - no list, no autocomplete
512 if ($auxaccount_mode == 0) {
513 $out .= '<input type="text" class="'.$morecss.'" name="'.$htmlname.'" id="'.$htmlname.'" value="'.dol_escape_htmltag($selectid).'" placeholder="'.dol_escape_htmltag($placeholder).'" />';
514 return $out;
515 }
516
517 // MODES 2/3/4: ajax - on-demand loading via endpoint
518 // minLength: mode 2 -> 1 char, mode 3 -> 2 chars, etc
519 if (!empty($conf->use_javascript_ajax) && $auxaccount_mode >= 2) {
520 require_once DOL_DOCUMENT_ROOT.'/core/lib/ajax.lib.php';
521
522 $minLength = $auxaccount_mode - 1;
523 $urloption = 'htmlname='.urlencode($htmlname).'&outjson=1';
524
525 // Resolve displayed text from selectid if no label was provided (e.g. on page reload)
526 if ($selectid && empty($selected_input_value)) {
527 // Search in thirdparties first
528 $sql = "SELECT nom AS name FROM ".$this->db->prefix()."societe";
529 $sql .= " WHERE entity IN (".getEntity('societe').")";
530 $sql .= " AND (code_compta = '".$this->db->escape($selectid)."'";
531 $sql .= " OR code_compta_fournisseur = '".$this->db->escape($selectid)."')";
532 $sql .= $this->db->plimit(1, 0);
533 $resql = $this->db->query($sql);
534 if ($resql && ($obj = $this->db->fetch_object($resql))) {
535 $selected_input_value = $selectid.' ('.$obj->name.')';
536 $this->db->free($resql);
537 } else {
538 // Fallback: search in users
539 $sql2 = "SELECT lastname, firstname FROM ".$this->db->prefix()."user";
540 $sql2 .= " WHERE entity IN (".getEntity('user').")";
541 $sql2 .= " AND accountancy_code = '".$this->db->escape($selectid)."'";
542 $sql2 .= $this->db->plimit(1, 0);
543 $resql2 = $this->db->query($sql2);
544 if ($resql2 && ($obj2 = $this->db->fetch_object($resql2))) {
545 $selected_input_value = $selectid.' ('.dolGetFirstLastname($obj2->firstname, $obj2->lastname).')';
546 $this->db->free($resql2);
547 } else {
548 $selected_input_value = $selectid;
549 }
550 }
551 }
552
553 // Visible text input — targeted by ajax_autocompleter() JavaScript via "input#search_$htmlname"
554 $out .= '<input type="text" class="'.$morecss.'" name="search_'.$htmlname.'" id="search_'.$htmlname.'" value="'.dol_escape_htmltag($selected_input_value).'" placeholder="'.dol_escape_htmltag($placeholder).'" />';
555
556 // Autofill subledger label — listen on "change" of the hidden field
557 // auxaccount.php returns 'label_name' = just the name without the account code
558 $ajaxoptions = array();
559 if (!empty($labelhtmlname)) {
560 $ajaxoptions['update'] = array($labelhtmlname => 'label_name');
561 }
562
563 // Hidden input + jQuery UI autocomplete JS
564 $out .= ajax_autocompleter($selectid, $htmlname, DOL_URL_ROOT.'/core/ajax/auxaccount.php', $urloption, $minLength, 0, $ajaxoptions);
565
566 return $out;
567 }
568
569 // MODE 1 (or ajax disabled): native HTML select with full list + select2 - original behavior
570 $aux_account = array();
571
572 if ($usecache && !empty($this->options_cache[$usecache])) {
573 $aux_account += $this->options_cache[$usecache]; // We use + instead of array_merge because we don't want to reindex key from 0
574 } else {
575 dol_syslog(get_class($this)."::select_auxaccount", LOG_DEBUG);
576
577 // Auxiliary thirdparties account
578 $sql = "SELECT code_compta as code_compta_client, code_compta_fournisseur, nom as name";
579 $sql .= " FROM ".$this->db->prefix()."societe";
580 $sql .= " WHERE entity IN (".getEntity('societe').")";
581 $sql .= " AND (client IN (1,3) OR fournisseur = 1)";
582
583 $resql = $this->db->query($sql);
584 if ($resql) {
585 while ($obj = $this->db->fetch_object($resql)) {
586 if (!empty($obj->code_compta_client)) {
587 $aux_account[$obj->code_compta_client] = $obj->code_compta_client.' <span class="opacitymedium">('.$obj->name.')</span>';
588 }
589 if (!empty($obj->code_compta_fournisseur)) {
590 $aux_account[$obj->code_compta_fournisseur] = $obj->code_compta_fournisseur.' <span class="opacitymedium">('.$obj->name.')</span>';
591 }
592 }
593 } else {
594 $this->error = "Error ".$this->db->lasterror();
595 dol_syslog(get_class($this)."::select_auxaccount ".$this->error, LOG_ERR);
596 return -1;
597 }
598 $this->db->free($resql);
599
600 // Auxiliary user account
601 $sql = "SELECT DISTINCT accountancy_code, lastname, firstname";
602 $sql .= " FROM ".$this->db->prefix()."user";
603 $sql .= " WHERE entity IN (".getEntity('user').")";
604 $sql .= " ORDER BY accountancy_code";
605
606 $resql = $this->db->query($sql);
607 if ($resql) {
608 while ($obj = $this->db->fetch_object($resql)) {
609 if (!empty($obj->accountancy_code)) {
610 $aux_account[$obj->accountancy_code] = $obj->accountancy_code.' <span class="opacitymedium">('.dolGetFirstLastname($obj->firstname, $obj->lastname).')</span>';
611 }
612 }
613 } else {
614 $this->error = "Error ".$this->db->lasterror();
615 dol_syslog(get_class($this)."::select_auxaccount ".$this->error, LOG_ERR);
616 return -1;
617 }
618 $this->db->free($resql);
619
620 ksort($aux_account);
621
622 if ($usecache) {
623 $this->options_cache[$usecache] = $aux_account;
624 }
625 }
626
627 // Build native select — select2 is automatically activated by Form::selectarray() with $useajax=1
628 $out .= Form::selectarray($htmlname, $aux_account, $selectid, $placeholder, 0, 0, '', 0, 0, 0, '', $morecss, 1);
629
630 // Autofill subledger label on select2 selection event (mode 1 only)
631 if (!empty($conf->use_javascript_ajax) && !empty($labelhtmlname)) {
632 $out .= '<script nonce="'.getNonce().'">
633 jQuery(document).ready(() => {
634 $("#'.dol_escape_js($htmlname).'").on("select2:select", function(e) {
635 var match = /\‍(([^)]+)\‍)/.exec(e.params.data.text);
636 if (match) { $("input[name=\"'.dol_escape_js($labelhtmlname).'\"]").val(match[1]); }
637 });
638 });
639 </script>';
640 }
641
642 return $out;
643 }
644
645 // phpcs:disable PEAR.NamingConventions.ValidFunctionName.ScopeNotCamelCaps
655 public function selectyear_accountancy_bookkepping($selected = '', $htmlname = 'yearid', $useempty = 0, $output_format = 'html')
656 {
657 // phpcs:enable
658 global $conf;
659
660 $out_array = array();
661
662 $sql = "SELECT DISTINCT date_format(doc_date, '%Y') as dtyear";
663 $sql .= " FROM ".$this->db->prefix()."accounting_bookkeeping";
664 $sql .= " WHERE entity IN (".getEntity('accountancy').")";
665 $sql .= " ORDER BY date_format(doc_date, '%Y')";
666 dol_syslog(__METHOD__, LOG_DEBUG);
667 $resql = $this->db->query($sql);
668
669 if (!$resql) {
670 $this->error = "Error ".$this->db->lasterror();
671 dol_syslog(__METHOD__.$this->error, LOG_ERR);
672 return -1;
673 }
674 while ($obj = $this->db->fetch_object($resql)) {
675 $out_array[$obj->dtyear] = $obj->dtyear;
676 }
677 $this->db->free($resql);
678
679 if ($output_format == 'html') {
680 return Form::selectarray($htmlname, $out_array, $selected, $useempty, 0, 0, 'placeholder="aa"');
681 } else {
682 return $out_array;
683 }
684 }
685
698 public function formAccountingAccount($page, $selected = '', $htmlname = 'none', $option = 0, $useempty = 1, $filter = '', $nooutput = 0)
699 {
700 global $langs;
701
702 $out = '';
703 if ($htmlname != "none") {
704 $out .= '<form method="post" action="' . $page . '">';
705 $out .= '<input type="hidden" name="action" value="set'.$htmlname.'">';
706 $out .= '<input type="hidden" name="token" value="' . newToken() . '">';
707 if ($option == 0) {
708 $out .= $this->select_account($selected, $htmlname, $useempty, array(), 1, 1, 'minwidth100 maxwidth300 maxwidthonsmartphone', 'accounts', $filter);
709 } else {
710 $out .= $this->select_auxaccount($selected, $htmlname, $useempty, 'minwidth100 maxwidth300 maxwidthonsmartphone', 'subaccounts');
711 }
712 $out .= '<input type="submit" class="button smallpaddingimp valignmiddle" name="modify" value="' . $langs->trans("Modify") . '">';
713 //$out .= '<input type="submit" class="button smallpaddingimp valignmiddle button-cancel" name="cancel" value="' . $langs->trans("Cancel") . '">';
714 $out .= '</form>';
715 } else {
716 $out .= "&nbsp;";
717 }
718
719 if ($nooutput) {
720 return $out;
721 } else {
722 print $out;
723 }
724 }
725
738 public static function printJournalLine($langs, $date, $ref, $accountAccounting, $labelOperation, $paymentMode, $amount)
739 {
740 $out = '<tr class="oddeven">';
741 $out .= '<td>'.$date.'</td>';
742 $out .= '<td>'.$ref.'</td>';
743 // Ledger account
744 $out .= '<td>';
745 $accounttoshow = length_accountg($accountAccounting);
746 if (empty($accounttoshow) || $accounttoshow == 'NotDefined') {
747 // Could be ProductAccountNotDefined, VATAccountNotDefined, ...
748 $out .= '<span class="error">'.$langs->trans('AccountNotDefined').'</span>';
749 } else {
750 $out .= $accounttoshow;
751 }
752 $out .= '</td>';
753 $out .= '<td>'.$labelOperation.'</td>';
754 $out .= '<td class="center">'.$paymentMode.'</td>';
755 $out .= '<td class="nowraponall right amount">'.($amount >= 0 ? price($amount) : '').'</td>';
756 $out .= '<td class="nowraponall right amount">'.($amount < 0 ? price(-$amount) : '').'</td>';
757 $out .= '</tr>';
758
759 print $out;
760 }
761}
length_accountg($account)
Return General accounting account with defined length (used for product and miscellaneous)
ajax_autocompleter($selected, $htmlname, $url, $urloption='', $minLength=2, $autoselect=0, $ajaxoptions=array(), $moreparams='')
Generic function that return javascript to add to transform a common input text or select field into ...
Definition ajax.lib.php:50
ajax_combobox($htmlname, $events=array(), $minLengthToAutocomplete=0, $forcefocus=0, $widthTypeOfAutocomplete='resolve', $idforemptyvalue='-1', $morecss='')
Convert a html select field into an ajax combobox.
Definition ajax.lib.php:476
Class to manage generation of HTML components for accounting management.
select_bookkeeping_importkey($htmlname='importkey', $selectedkey='')
Return select filter with date of transaction.
__construct($db)
Constructor.
select_auxaccount($selectid, $htmlname='account_num_aux', $showempty=0, $morecss='minwidth100 maxwidth300 maxwidthonsmartphone', $usecache='', $labelhtmlname='', $selected_input_value='')
Return list of auxiliary accounts.
select_account($selectid, $htmlname='account', $showempty=0, $event=array(), $select_in=0, $select_out=0, $morecss='minwidth100 maxwidth300 maxwidthonsmartphone', $usecache='', $active='1', $centralized=0)
Return list of accounts with label by chart of accounts.
select_journal($selectid, $htmlname='journal', $nature=0, $showempty=0, $select_in=0, $select_out=0, $morecss='maxwidth300 maxwidthonsmartphone', $usecache='', $disabledajaxcombo=0)
Return list of journals with label by nature.
selectyear_accountancy_bookkepping($selected='', $htmlname='yearid', $useempty=0, $output_format='html')
Return HTML combo list of years existing into book keepping.
formAccountingAccount($page, $selected='', $htmlname='none', $option=0, $useempty=1, $filter='', $nooutput=0)
Output html select to select accounting account.
multi_select_journal($selectedIds=array(), $htmlname='journal', $nature=0, $showempty=0, $select_in=0, $select_out=0, $morecss='', $usecache='', $disabledajaxcombo=0)
Return list of journals with label by nature.
select_accounting_category($selected=0, $htmlname='account_category', $useempty=0, $maxlen=0, $help=1, $allcountries=0)
Return list of accounting category.
static printJournalLine($langs, $date, $ref, $accountAccounting, $labelOperation, $paymentMode, $amount)
Print line into the journal table.
Class to manage generation of HTML components Only common components must be here.
static multiselectarray($htmlname, $array, $selected=array(), $key_in_label=0, $value_as_key=0, $morecss='', $translate=0, $width=0, $moreattrib='', $nu='', $placeholder='', $addjscombo=-1)
Show a multiselect form from an array.
static selectarray($htmlname, $array, $id='', $show_empty=0, $key_in_label=0, $value_as_key=0, $moreparam='', $translate=0, $maxlen=0, $disabled=0, $sort='', $morecss='minwidth75', $addjscombo=1, $moreparamonempty='', $disablebademail=0, $nohtmlescape=0)
Return a HTML select string, built from an array of key+value.
global $mysoc
if(!isModEnabled('ai')||!getDolGlobalString('AI_ASSISTANT_ENABLED')) global $conf
The main.inc.php has been included so the following variable are now defined:
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.
dol_escape_js($stringtoescape, $mode=0, $noescapebackslashn=0)
Returns text escaped for inclusion into JavaScript code.
dolGetFirstLastname($firstname, $lastname, $nameorder=-1)
Return firstname and lastname in correct order.
dol_print_error($db=null, $error='', $errors=null)
Displays error message system with all the information to facilitate the diagnosis and the escalation...
dol_trunc($string, $size=40, $trunc='right', $stringencoding='UTF-8', $nodot=0, $display=0)
Truncate a string to a particular length adding '…' if string larger than length.
dol_syslog($message, $level=LOG_INFO, $ident=0, $suffixinfilename='', $restricttologhandler='', $logcontext=null)
Write log message into outputs.
dol_escape_htmltag($stringtoescape, $keepb=0, $keepn=0, $noescapetags='', $escapeonlyhtmltags=0, $cleanalsojavascript=0)
Returns text escaped for inclusion in HTML alt or title or value tags, or into values of HTML input f...
print $langs trans("Show") . '< td style="' . $timeColor . '" align="center"> s</td > badge status0 badge status4 badge status3 Error badge status8< td align="center">< span class="badge ' . $badge . '"></span ></td >< td align="center">< a href="#" class="button button-small" onclick="openLogModal(this)" data-req="' . dol_escape_htmltag($reqSafe) . '" data-res="' . dol_escape_htmltag($resSafe) . '" data-err="' . dol_escape_htmltag($errSafe) . '">< span class="fa fa-search-plus"></span ></a ></td ></tr >< tr >< td colspan="' . $colspan . '" class="opacitymedium"></td ></tr ></table ></div ></form > logModal none logModal none s a JSON string
buildzip.php