dolibarr 18.0.6
multicurrency.class.php
Go to the documentation of this file.
1<?php
2/* Copyright (C) 2007-2020 Laurent Destailleur <eldy@users.sourceforge.net>
3 * Copyright (C) 2014 Juanjo Menent <jmenent@2byte.es>
4 * Copyright (C) 2015 Florian Henry <florian.henry@open-concept.pro>
5 * Copyright (C) 2015 Raphaƫl Doursenaud <rdoursenaud@gpcsolutions.fr>
6 * Copyright (C) 2016 Pierre-Henry Favre <phf@atm-consulting.fr>
7 *
8 * This program is free software; you can redistribute it and/or modify
9 * it under the terms of the GNU General Public License as published by
10 * the Free Software Foundation; either version 3 of the License, or
11 * (at your option) any later version.
12 *
13 * This program is distributed in the hope that it will be useful,
14 * but WITHOUT ANY WARRANTY; without even the implied warranty of
15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 * GNU General Public License for more details.
17 *
18 * You should have received a copy of the GNU General Public License
19 * along with this program. If not, see <https://www.gnu.org/licenses/>.
20 */
21
28// Put here all includes required by your class file
29require_once DOL_DOCUMENT_ROOT.'/core/class/commonobject.class.php';
30require_once DOL_DOCUMENT_ROOT.'/core/class/commonobjectline.class.php';
31
32
40{
44 public $element = 'multicurrency';
45
49 public $table_element = 'multicurrency';
50
54 public $table_element_line = "multicurrency_rate";
55
59 public $rates = array();
60
64 public $id;
65
69 public $code;
70
74 public $name;
75
79 public $entity;
80
84 public $date_create;
85
89 public $fk_user;
90
94 public $rate;
95
96
102 public function __construct(DoliDB $db)
103 {
104 $this->db = $db;
105
106 return 1;
107 }
108
116 public function create(User $user, $trigger = true)
117 {
118 global $conf, $langs;
119
120 dol_syslog('MultiCurrency::create', LOG_DEBUG);
121
122 $error = 0;
123
124 if (self::checkCodeAlreadyExists($this->code)) {
125 $error++;
126 $this->errors[] = $langs->trans('multicurrency_code_already_added');
127 return -1;
128 }
129
130 if (empty($this->entity) || $this->entity <= 0) {
131 $this->entity = $conf->entity;
132 }
133 $now = dol_now();
134
135 // Insert request
136 $sql = "INSERT INTO ".MAIN_DB_PREFIX.$this->table_element."(";
137 $sql .= ' code,';
138 $sql .= ' name,';
139 $sql .= ' entity,';
140 $sql .= ' date_create,';
141 $sql .= ' fk_user';
142 $sql .= ') VALUES (';
143 $sql .= " '".$this->db->escape($this->code)."',";
144 $sql .= " '".$this->db->escape($this->name)."',";
145 $sql .= " ".((int) $this->entity).",";
146 $sql .= " '".$this->db->idate($now)."',";
147 $sql .= " ".((int) $user->id);
148 $sql .= ')';
149
150 $this->db->begin();
151
152 dol_syslog(__METHOD__, LOG_DEBUG);
153 $resql = $this->db->query($sql);
154 if (!$resql) {
155 $error++;
156 $this->errors[] = 'Error '.$this->db->lasterror();
157 dol_syslog('MultiCurrency::create '.join(',', $this->errors), LOG_ERR);
158 }
159
160 if (!$error) {
161 $this->id = $this->db->last_insert_id(MAIN_DB_PREFIX.$this->table_element);
162 $this->date_create = $now;
163 $this->fk_user = $user->id;
164
165 if ($trigger) {
166 $result = $this->call_trigger('CURRENCY_CREATE', $user);
167 if ($result < 0) {
168 $error++;
169 }
170 }
171 }
172
173 if ($error) {
174 $this->db->rollback();
175
176 return -1 * $error;
177 } else {
178 $this->db->commit();
179
180 return $this->id;
181 }
182 }
183
191 public function fetch($id, $code = null)
192 {
193 dol_syslog('MultiCurrency::fetch', LOG_DEBUG);
194
195 global $conf;
196
197 $sql = "SELECT";
198 $sql .= ' c.rowid, c.name, c.code, c.entity, c.date_create, c.fk_user';
199 $sql .= ' FROM '.MAIN_DB_PREFIX.$this->table_element.' AS c';
200 if (!empty($code)) {
201 $sql .= ' WHERE c.code = \''.$this->db->escape($code).'\' AND c.entity = '.$conf->entity;
202 } else {
203 $sql .= ' WHERE c.rowid = '.((int) $id);
204 }
205
206 dol_syslog(__METHOD__, LOG_DEBUG);
207 $resql = $this->db->query($sql);
208
209 if ($resql) {
210 $numrows = $this->db->num_rows($resql);
211 if ($numrows) {
212 $obj = $this->db->fetch_object($resql);
213
214 $this->id = $obj->rowid;
215 $this->name = $obj->name;
216 $this->code = $obj->code;
217 $this->entity = $obj->entity;
218 $this->date_create = $obj->date_create;
219 $this->fk_user = $obj->fk_user;
220
221 $this->fetchAllCurrencyRate();
222 $this->getRate();
223 }
224 $this->db->free($resql);
225
226 if ($numrows) {
227 return 1;
228 } else {
229 return 0;
230 }
231 } else {
232 $this->errors[] = 'Error '.$this->db->lasterror();
233 dol_syslog('MultiCurrency::fetch '.join(',', $this->errors), LOG_ERR);
234
235 return -1;
236 }
237 }
238
244 public function fetchAllCurrencyRate()
245 {
246 $sql = "SELECT cr.rowid";
247 $sql .= ' FROM '.MAIN_DB_PREFIX.$this->table_element_line.' as cr';
248 $sql .= ' WHERE cr.fk_multicurrency = '.((int) $this->id);
249 $sql .= ' ORDER BY cr.date_sync DESC';
250
251 $this->rates = array();
252
253 dol_syslog(__METHOD__, LOG_DEBUG);
254 $resql = $this->db->query($sql);
255 if ($resql) {
256 $num = $this->db->num_rows($resql);
257
258 while ($obj = $this->db->fetch_object($resql)) {
259 $rate = new CurrencyRate($this->db);
260 $rate->fetch($obj->rowid);
261
262 $this->rates[] = $rate;
263 }
264 $this->db->free($resql);
265
266 return $num;
267 } else {
268 $this->errors[] = 'Error '.$this->db->lasterror();
269 dol_syslog('MultiCurrency::fetchAllCurrencyRate '.join(',', $this->errors), LOG_ERR);
270
271 return -1;
272 }
273 }
274
282 public function update(User $user, $trigger = true)
283 {
284 $error = 0;
285
286 dol_syslog('MultiCurrency::update', LOG_DEBUG);
287
288 // Clean parameters
289 $this->name = trim($this->name);
290 $this->code = trim($this->code);
291
292 // Check parameters
293 if (empty($this->code)) {
294 $error++;
295 dol_syslog('MultiCurrency::update $this->code can not be empty', LOG_ERR);
296
297 return -1;
298 }
299
300 // Update request
301 $sql = "UPDATE ".MAIN_DB_PREFIX.$this->table_element." SET";
302 $sql .= " name = '".$this->db->escape($this->name)."',";
303 $sql .= " code = '".$this->db->escape($this->code)."'";
304 $sql .= " WHERE rowid = ".((int) $this->id);
305
306 $this->db->begin();
307
308 $resql = $this->db->query($sql);
309 if (!$resql) {
310 $error++;
311 $this->errors[] = 'Error '.$this->db->lasterror();
312 dol_syslog('MultiCurrency::update '.join(',', $this->errors), LOG_ERR);
313 }
314
315 if (!$error && $trigger) {
316 $result = $this->call_trigger('CURRENCY_MODIFY', $user);
317 if ($result < 0) {
318 $error++;
319 }
320 }
321
322 // Commit or rollback
323 if ($error) {
324 $this->db->rollback();
325
326 return -1 * $error;
327 } else {
328 $this->db->commit();
329
330 return 1;
331 }
332 }
333
340 public function delete($trigger = true)
341 {
342 global $user;
343
344 dol_syslog('MultiCurrency::delete', LOG_DEBUG);
345
346 $error = 0;
347
348 $this->db->begin();
349
350 if ($trigger) {
351 $result = $this->call_trigger('CURRENCY_DELETE', $user);
352 if ($result < 0) {
353 $error++;
354 }
355 }
356
357 if (!$error) {
358 // Delete all rates before
359 if (!$this->deleteRates()) {
360 $error++;
361 $this->errors[] = 'Error '.$this->db->lasterror();
362 dol_syslog('Currency::delete '.join(',', $this->errors), LOG_ERR);
363 }
364
365 $sql = "DELETE FROM ".MAIN_DB_PREFIX.$this->table_element;
366 $sql .= " WHERE rowid = ".((int) $this->id);
367
368 dol_syslog(__METHOD__, LOG_DEBUG);
369 $resql = $this->db->query($sql);
370 if (!$resql) {
371 $error++;
372 $this->errors[] = 'Error '.$this->db->lasterror();
373 dol_syslog('MultiCurrency::delete '.join(',', $this->errors), LOG_ERR);
374 }
375 }
376
377 // Commit or rollback
378 if ($error) {
379 $this->db->rollback();
380
381 return -1 * $error;
382 } else {
383 $this->db->commit();
384
385 return 1;
386 }
387 }
388
394 public function deleteRates()
395 {
396 foreach ($this->rates as &$rate) {
397 if ($rate->delete() <= 0) {
398 return false;
399 }
400 }
401
402 return true;
403 }
404
411 public function addRate($rate)
412 {
413 $currencyRate = new CurrencyRate($this->db);
414 $currencyRate->rate = price2num($rate);
415
416 if ($currencyRate->create($this->id) > 0) {
417 $this->rate = $currencyRate;
418 return 1;
419 } else {
420 $this->rate = null;
421 $this->errors = $currencyRate->errors;
422 return -1;
423 }
424 }
425
433 public function addRateFromDolibarr($code, $rate)
434 {
435 global $user;
436
437 $currency = new MultiCurrency($this->db);
438 $currency->code = $code;
439 $currency->name = $code;
440
441 $sql = "SELECT label FROM ".MAIN_DB_PREFIX."c_currencies WHERE code_iso = '".$this->db->escape($code)."'";
442
443 dol_syslog(__METHOD__, LOG_DEBUG);
444 $resql = $this->db->query($sql);
445 if ($resql && ($line = $this->db->fetch_object($resql))) {
446 $currency->name = $line->label;
447 }
448
449 if ($currency->create($user) > 0) {
450 $currency->addRate($rate);
451
452 if (!empty($line)) {
453 return 2;
454 } else {
455 return 1;
456 }
457 }
458
459 return -1;
460 }
461
468 public function updateRate($rate)
469 {
470 return $this->addRate($rate);
471 }
472
478 public function getRate()
479 {
480 $sql = "SELECT cr.rowid";
481 $sql .= " FROM ".MAIN_DB_PREFIX.$this->table_element_line." as cr";
482 $sql .= " WHERE cr.fk_multicurrency = ".((int) $this->id);
483 $sql .= " AND cr.date_sync = (SELECT MAX(cr2.date_sync) FROM ".MAIN_DB_PREFIX.$this->table_element_line." AS cr2 WHERE cr2.fk_multicurrency = ".((int) $this->id).")";
484
485 dol_syslog(__METHOD__, LOG_DEBUG);
486 $resql = $this->db->query($sql);
487 if ($resql && ($obj = $this->db->fetch_object($resql))) {
488 $this->rate = new CurrencyRate($this->db);
489 return $this->rate->fetch($obj->rowid);
490 }
491
492 return -1;
493 }
494
503 public static function getIdFromCode($dbs, $code)
504 {
505 global $conf;
506
507 $sql = "SELECT rowid FROM ".MAIN_DB_PREFIX."multicurrency WHERE code = '".$dbs->escape($code)."' AND entity = ".((int) $conf->entity);
508
509 dol_syslog(__METHOD__, LOG_DEBUG);
510 $resql = $dbs->query($sql);
511 if ($resql && $obj = $dbs->fetch_object($resql)) {
512 return $obj->rowid;
513 } else {
514 return 0;
515 }
516 }
517
528 public static function getIdAndTxFromCode($dbs, $code, $date_document = '')
529 {
530 global $conf;
531
532 $sql1 = "SELECT m.rowid, mc.rate FROM ".MAIN_DB_PREFIX."multicurrency m";
533
534 $sql1 .= ' LEFT JOIN '.MAIN_DB_PREFIX.'multicurrency_rate mc ON (m.rowid = mc.fk_multicurrency)';
535 $sql1 .= " WHERE m.code = '".$dbs->escape($code)."'";
536 $sql1 .= " AND m.entity IN (".getEntity('multicurrency').")";
537 $sql2 = '';
538 if (!empty($conf->global->MULTICURRENCY_USE_RATE_ON_DOCUMENT_DATE) && !empty($date_document)) { // Use last known rate compared to document date
539 $tmparray = dol_getdate($date_document);
540 $sql2 .= " AND mc.date_sync <= '".$dbs->idate(dol_mktime(23, 59, 59, $tmparray['mon'], $tmparray['mday'], $tmparray['year'], true))."'";
541 }
542 $sql3 = " ORDER BY mc.date_sync DESC LIMIT 1";
543
544 dol_syslog(__METHOD__, LOG_DEBUG);
545 $resql = $dbs->query($sql1.$sql2.$sql3);
546
547 if ($resql && $obj = $dbs->fetch_object($resql)) {
548 return array($obj->rowid, $obj->rate);
549 } else {
550 if (!empty($conf->global->MULTICURRENCY_USE_RATE_ON_DOCUMENT_DATE)) {
551 $resql = $dbs->query($sql1.$sql3);
552 if ($resql && $obj = $dbs->fetch_object($resql)) {
553 return array($obj->rowid, $obj->rate);
554 }
555 }
556
557 return array(0, 1);
558 }
559 }
560
571 public static function getAmountConversionFromInvoiceRate($fk_facture, $amount, $way = 'dolibarr', $table = 'facture', $invoice_rate = null)
572 {
573 if (!is_null($invoice_rate)) {
574 $multicurrency_tx = $invoice_rate;
575 } else {
576 $multicurrency_tx = self::getInvoiceRate($fk_facture, $table);
577 }
578
579 if ($multicurrency_tx) {
580 if ($way == 'dolibarr') {
581 return price2num($amount * $multicurrency_tx, 'MU');
582 } else {
583 return price2num($amount / $multicurrency_tx, 'MU');
584 }
585 } else {
586 return false;
587 }
588 }
589
597 public static function getInvoiceRate($fk_facture, $table = 'facture')
598 {
599 global $db;
600
601 $sql = "SELECT multicurrency_tx FROM ".MAIN_DB_PREFIX.$table." WHERE rowid = ".((int) $fk_facture);
602
603 dol_syslog(__METHOD__, LOG_DEBUG);
604 $resql = $db->query($sql);
605 if ($resql && ($line = $db->fetch_object($resql))) {
606 return $line->multicurrency_tx;
607 }
608
609 return false;
610 }
611
619 public function recalculRates(&$TRate)
620 {
621 global $conf;
622
623 if ($conf->currency != getDolGlobalString('MULTICURRENCY_APP_SOURCE')) {
624 $alternate_source = 'USD'.$conf->currency;
625 if (!empty($TRate->$alternate_source)) {
626 $coef = $TRate->USDUSD / $TRate->$alternate_source;
627 foreach ($TRate as $attr => &$rate) {
628 $rate *= $coef;
629 }
630
631 return 1;
632 }
633
634 return -1; // Alternate souce not found
635 }
636
637 return 0; // Nothing to do
638 }
639
647 public function syncRates($key, $addifnotfound = 0)
648 {
649 global $conf, $db, $langs;
650
651 include_once DOL_DOCUMENT_ROOT.'/core/lib/geturl.lib.php';
652
653 $urlendpoint = 'http://api.currencylayer.com/live?access_key='.$key;
654 $urlendpoint .= '&source=' . (empty($conf->global->MULTICURRENCY_APP_SOURCE) ? 'USD' : $conf->global->MULTICURRENCY_APP_SOURCE);
655
656 dol_syslog("Call url endpoint ".$urlendpoint);
657
658 $resget = getURLContent($urlendpoint);
659
660 if ($resget['content']) {
661 $response = $resget['content'];
662 $response = json_decode($response);
663
664 if ($response->success) {
665 $TRate = $response->quotes;
666 //$timestamp = $response->timestamp;
667
668 if ($this->recalculRates($TRate) >= 0) {
669 foreach ($TRate as $currency_code => $rate) {
670 $code = substr($currency_code, 3, 3);
671 $obj = new MultiCurrency($db);
672 if ($obj->fetch(0, $code) > 0) {
673 $obj->updateRate($rate);
674 } elseif ($addifnotfound) {
675 $this->addRateFromDolibarr($code, $rate);
676 }
677 }
678 }
679
680 return 1;
681 } else {
682 dol_syslog("Failed to call endpoint ".$response->error->info, LOG_WARNING);
683 setEventMessages($langs->trans('multicurrency_syncronize_error', $response->error->info), null, 'errors');
684
685 return -1;
686 }
687 } else {
688 return -1;
689 }
690 }
691
698 public function checkCodeAlreadyExists($code)
699 {
700 $currencytmp = new MultiCurrency($this->db);
701 if ($currencytmp->fetch('', $code) > 0) {
702 return true;
703 } else {
704 return false;
705 }
706 }
707}
708
709
714{
718 public $element = 'multicurrency_rate';
719
723 public $table_element = 'multicurrency_rate';
724
728 public $id;
729
733 public $rate;
734
738 public $date_sync;
739
743 public $fk_multicurrency;
744
748 public $entity;
749
750
756 public function __construct(DoliDB $db)
757 {
758 $this->db = $db;
759
760 return 1;
761 }
762
770 public function create($fk_multicurrency, $trigger = true)
771 {
772 global $conf, $user;
773
774 dol_syslog('CurrencyRate::create', LOG_DEBUG);
775
776 $error = 0;
777 $this->rate = price2num($this->rate);
778 if (empty($this->entity) || $this->entity <= 0) {
779 $this->entity = $conf->entity;
780 }
781 $now = empty($this->date_sync) ? dol_now() : $this->date_sync;
782
783 // Insert request
784 $sql = "INSERT INTO ".MAIN_DB_PREFIX.$this->table_element."(";
785 $sql .= ' rate,';
786 $sql .= ' date_sync,';
787 $sql .= ' fk_multicurrency,';
788 $sql .= ' entity';
789 $sql .= ') VALUES (';
790 $sql .= ' '.((float) $this->rate).',';
791 $sql .= " '".$this->db->idate($now)."',";
792 $sql .= " ".((int) $fk_multicurrency).",";
793 $sql .= " ".((int) $this->entity);
794 $sql .= ')';
795
796 $this->db->begin();
797
798 dol_syslog(__METHOD__, LOG_DEBUG);
799 $resql = $this->db->query($sql);
800 if (!$resql) {
801 $error++;
802 $this->errors[] = 'Error '.$this->db->lasterror();
803 dol_syslog('CurrencyRate::create '.join(',', $this->errors), LOG_ERR);
804 }
805
806 if (!$error) {
807 $this->id = $this->db->last_insert_id(MAIN_DB_PREFIX.$this->table_element);
808 $this->fk_multicurrency = $fk_multicurrency;
809 $this->date_sync = $now;
810
811 if ($trigger) {
812 $result = $this->call_trigger('CURRENCYRATE_CREATE', $user);
813 if ($result < 0) {
814 $error++;
815 }
816 }
817 }
818
819 if ($error) {
820 $this->db->rollback();
821
822 return -1 * $error;
823 } else {
824 $this->db->commit();
825
826 return $this->id;
827 }
828 }
829
836 public function fetch($id)
837 {
838 dol_syslog('CurrencyRate::fetch', LOG_DEBUG);
839
840 $sql = "SELECT cr.rowid, cr.rate, cr.date_sync, cr.fk_multicurrency, cr.entity";
841 $sql .= " FROM ".MAIN_DB_PREFIX.$this->table_element." AS cr";
842 $sql .= " WHERE cr.rowid = ".((int) $id);
843
844 dol_syslog(__METHOD__, LOG_DEBUG);
845 $resql = $this->db->query($sql);
846 if ($resql) {
847 $numrows = $this->db->num_rows($resql);
848 if ($numrows) {
849 $obj = $this->db->fetch_object($resql);
850
851 $this->id = $obj->rowid;
852 $this->rate = $obj->rate;
853 $this->date_sync = $this->db->jdate($obj->date_sync);
854 $this->fk_multicurrency = $obj->fk_multicurrency;
855 $this->entity = $obj->entity;
856 }
857 $this->db->free($resql);
858
859 if ($numrows) {
860 return 1;
861 } else {
862 return 0;
863 }
864 } else {
865 $this->errors[] = 'Error '.$this->db->lasterror();
866 dol_syslog('CurrencyRate::fetch '.join(',', $this->errors), LOG_ERR);
867
868 return -1;
869 }
870 }
871
878 public function update($trigger = true)
879 {
880 global $user;
881
882 $error = 0;
883
884 dol_syslog('CurrencyRate::update', LOG_DEBUG);
885
886 $this->rate = price2num($this->rate);
887
888 // Update request
889 $sql = "UPDATE ".MAIN_DB_PREFIX.$this->table_element;
890 $sql .= "SET rate = ".((float) $this->rate);
891 if (!empty($this->date_sync)) {
892 $sql .= ", date_sync = '".$this->db->idate($this->date_sync)."'";
893 }
894 if (!empty($this->fk_multicurrency)) {
895 $sql .= ', fk_multicurrency = '.((int) $this->fk_multicurrency);
896 }
897 $sql .= " WHERE rowid =".((int) $this->id);
898
899 $this->db->begin();
900
901 dol_syslog(__METHOD__, LOG_DEBUG);
902 $resql = $this->db->query($sql);
903 if (!$resql) {
904 $error++;
905 $this->errors[] = 'Error '.$this->db->lasterror();
906 dol_syslog('CurrencyRate::update '.join(',', $this->errors), LOG_ERR);
907 }
908
909 if (!$error && $trigger) {
910 $result = $this->call_trigger('CURRENCYRATE_MODIFY', $user);
911 if ($result < 0) {
912 $error++;
913 }
914 }
915
916 // Commit or rollback
917 if ($error) {
918 $this->db->rollback();
919
920 return -1 * $error;
921 } else {
922 $this->db->commit();
923
924 return 1;
925 }
926 }
927
934 public function delete($trigger = true)
935 {
936 global $user;
937
938 dol_syslog('CurrencyRate::delete', LOG_DEBUG);
939
940 $error = 0;
941
942 $this->db->begin();
943
944 if ($trigger) {
945 $result = $this->call_trigger('CURRENCYRATE_DELETE', $user);
946 if ($result < 0) {
947 $error++;
948 }
949 }
950
951 if (!$error) {
952 $sql = 'DELETE FROM '.MAIN_DB_PREFIX.$this->table_element;
953 $sql .= ' WHERE rowid='.((int) $this->id);
954
955 dol_syslog(__METHOD__, LOG_DEBUG);
956 $resql = $this->db->query($sql);
957 if (!$resql) {
958 $error++;
959 $this->errors[] = 'Error '.$this->db->lasterror();
960 dol_syslog('CurrencyRate::delete '.join(',', $this->errors), LOG_ERR);
961 }
962 }
963
964 // Commit or rollback
965 if ($error) {
966 $this->db->rollback();
967
968 return -1 * $error;
969 } else {
970 $this->db->commit();
971
972 return 1;
973 }
974 }
975}
Parent class of all other business classes (invoices, contracts, proposals, orders,...
call_trigger($triggerName, $user)
Call trigger based on this instance.
Parent class for class inheritance lines of business objects This class is useless for the moment so ...
Class CurrencyRate.
fetch($id)
Load object in memory from the database.
update($trigger=true)
Update object into database.
create($fk_multicurrency, $trigger=true)
Create object into database.
__construct(DoliDB $db)
Constructor.
Class to manage Dolibarr database access.
Class Currency.
fetchAllCurrencyRate()
Load all rates in object from the database.
checkCodeAlreadyExists($code)
Check in database if the current code already exists.
__construct(DoliDB $db)
Constructor.
update(User $user, $trigger=true)
Update object into database.
delete($trigger=true)
Delete object in database.
addRateFromDolibarr($code, $rate)
Try get label of code in llx_currency then add rate.
create(User $user, $trigger=true)
Create object into database.
recalculRates(&$TRate)
With free account we can't set source then recalcul all rates to force another source.
fetch($id, $code=null)
Load object in memory from the database.
Class to manage Dolibarr users.
price2num($amount, $rounding='', $option=0)
Function that return a number with universal decimal format (decimal separator is '.
dol_now($mode='auto')
Return date for now.
setEventMessages($mesg, $mesgs, $style='mesgs', $messagekey='', $noduplicate=0)
Set event messages in dol_events session object.
dol_syslog($message, $level=LOG_INFO, $ident=0, $suffixinfilename='', $restricttologhandler='', $logcontext=null)
Write log message into outputs.
getURLContent($url, $postorget='GET', $param='', $followlocation=1, $addheaders=array(), $allowedschemes=array('http', 'https'), $localurl=0, $ssl_verifypeer=-1)
Function to get a content from an URL (use proxy if proxy defined).
$conf db name
Only used if Module[ID]Name translation string is not found.
Definition repair.php:123