Passed
Push — master ( 0f9140...c4489d )
by Alxarafe
22:27
created

Base/Conf.php (8 issues)

1
<?php
2
/* Copyright (C) 2018       Alxarafe            <[email protected]>
3
 *
4
 * This program is free software; you can redistribute it and/or modify
5
 * it under the terms of the GNU General Public License as published by
6
 * the Free Software Foundation; either version 3 of the License, or
7
 * (at your option) any later version.
8
 *
9
 * This program is distributed in the hope that it will be useful,
10
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
11
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
12
 * GNU General Public License for more details.
13
 *
14
 * You should have received a copy of the GNU General Public License
15
 * along with this program. If not, see <http://www.gnu.org/licenses/>.
16
 */
17
namespace Alixar\Base;
18
19
class Conf
20
{
21
22
    /** \public */
23
    //! To store properties found in conf file
24
    var $file;
25
26
    /**
27
     * @var DoliDB Database handler.
0 ignored issues
show
The type Alixar\Base\DoliDB was not found. Did you mean DoliDB? If so, make sure to prefix the type with \.
Loading history...
28
     */
29
    public $db;
30
    //! To store properties found into database
31
    public $global;
32
    //! To store browser info
33
    var $browser;
34
    //! To store if javascript/ajax is enabked
35
    public $use_javascript_ajax;
36
    //! Used to store current currency (ISO code like 'USD', 'EUR', ...)
37
    public $currency;
38
    //! Used to store current css (from theme)
39
    public $theme;        // Contains current theme ("eldy", "auguria", ...)
40
    public $css;          // Contains full path of css page ("/theme/eldy/style.css.php", ...)
41
    //! Used to store current menu handler
42
    public $standard_menu;
43
    public $modules = array(); // List of activated modules
44
    public $modules_parts = array('css' => array(), 'js' => array(), 'tabs' => array(), 'triggers' => array(), 'login' => array(), 'substitutions' => array(), 'menus' => array(), 'theme' => array(), 'sms' => array(), 'tpl' => array(), 'barcode' => array(), 'models' => array(), 'societe' => array(), 'hooks' => array(), 'dir' => array(), 'syslog' => array());
45
    var $logbuffer = array();
46
47
    /**
48
     * @var LogHandlerInterface[]
49
     */
50
    var $loghandlers = array();
51
    //! To store properties of multi-company
52
    public $multicompany;
53
    //! Used to store running instance for multi-company (default 1)
54
    public $entity = 1;
55
    //! Used to store list of entities to use for each element
56
    public $entities = array();
57
    public $dol_hide_topmenu;   // Set if we force param dol_hide_topmenu into login url
58
    public $dol_hide_leftmenu;   // Set if we force param dol_hide_leftmenu into login url
59
    public $dol_optimize_smallscreen; // Set if we force param dol_optimize_smallscreen into login url or if browser is smartphone
60
    public $dol_no_mouse_hover;   // Set if we force param dol_no_mouse_hover into login url or if browser is smartphone
61
    public $dol_use_jmobile;   // Set if we force param dol_use_jmobile into login url
62
    public $user;
63
64
    /**
65
     * Constructor
66
     */
67
    function __construct()
68
    {
69
        // Properly declare multi-modules objects.
70
        $this->file = new \stdClass();
71
        $this->db = new \stdClass();
0 ignored issues
show
Documentation Bug introduced by
It seems like new stdClass() of type stdClass is incompatible with the declared type Alixar\Base\DoliDB of property $db.

Our type inference engine has found an assignment to a property that is incompatible with the declared type of that property.

Either this assignment is in error or the assigned type should be added to the documentation/type hint for that property..

Loading history...
72
        $this->global = new \stdClass();
73
        $this->mycompany = new \stdClass();
74
        $this->admin = new \stdClass();
75
        $this->user = new \stdClass();
76
        $this->syslog = new \stdClass();
77
        $this->browser = new \stdClass();
78
        $this->medias = new \stdClass();
79
        $this->multicompany = new \stdClass();
80
81
        //! Charset for HTML output and for storing data in memory
82
        $this->file->character_set_client = 'UTF-8';   // UTF-8, ISO-8859-1
83
        // First level object
84
        // TODO Remove this part.
85
        $this->expedition_bon = new \stdClass();
86
        $this->livraison_bon = new \stdClass();
87
        $this->fournisseur = new \stdClass();
88
        $this->product = new \stdClass();
89
        $this->service = new \stdClass();
90
        $this->contrat = new \stdClass();
91
        $this->actions = new \stdClass();
92
        $this->commande = new \stdClass();
93
        $this->propal = new \stdClass();
94
        $this->facture = new \stdClass();
95
        $this->contrat = new \stdClass();
96
        $this->usergroup = new \stdClass();
97
        $this->adherent = new \stdClass();
98
        $this->bank = new \stdClass();
99
        $this->notification = new \stdClass();
100
        $this->mailing = new \stdClass();
101
        $this->expensereport = new \stdClass();
102
        $this->productbatch = new \stdClass();
103
    }
104
105
    /**
106
     * 	Load setup values into conf object (read llx_const)
107
     *  Note that this->db->xxx, this->file->xxx and this->multicompany have been already loaded when setValues is called.
108
     *
109
     * 	@param      DoliDB		$db		Database handler
110
     * 	@return     int					< 0 if KO, >= 0 if OK
111
     */
112
    function setValues($dba)
113
    {
114
        // global $conf;
115
116
        var_dump($this);
0 ignored issues
show
Security Debugging Code introduced by
var_dump($this) looks like debug code. Are you sure you do not want to remove it?
Loading history...
117
        die('en setValues');
0 ignored issues
show
Using exit here is not recommended.

In general, usage of exit should be done with care and only when running in a scripting context like a CLI script.

Loading history...
118
119
        dol_syslog(get_class($this) . "::setValues");
0 ignored issues
show
dol_syslog(get_class($this) . '::setValues') is not reachable.

This check looks for unreachable code. It uses sophisticated control flow analysis techniques to find statements which will never be executed.

Unreachable code is most often the result of return, die or exit statements that have been added for debug purposes.

function fx() {
    try {
        doSomething();
        return true;
    }
    catch (\Exception $e) {
        return false;
    }

    return false;
}

In the above example, the last return false will never be executed, because a return statement has already been met in every possible execution path.

Loading history...
120
121
        //Define all global constants into Conf::$global->key=value
122
        $sql = "SELECT " . $db->decrypt('name') . " as name,";
123
        $sql .= " " . $db->decrypt('value') . " as value, entity";
124
        $sql .= " FROM " . MAIN_DB_PREFIX . "const";
125
        $sql .= " WHERE entity IN (0," . $this->entity . ")";
126
        $sql .= " ORDER BY entity"; // This is to have entity 0 first, then entity 1 that overwrite.
127
128
        $resql = $db->query($sql);
129
        if ($resql) {
130
            $i = 0;
131
            $numr = $db->num_rows($resql);
132
            while ($i < $numr) {
133
                $objp = $db->fetch_object($resql);
134
                $key = $objp->name;
135
                $value = $objp->value;
136
                if ($key) {
137
                    //if (! defined("$key")) define("$key", $value);	// In some cases, the constant might be already forced (Example: SYSLOG_HANDLERS during install)
138
                    Conf::$global->$key = $value;
139
140
                    if ($value && preg_match('/^MAIN_MODULE_/', $key)) {
141
                        // If this is constant for a new tab page activated by a module. It initializes modules_parts['tabs'].
142
                        if (preg_match('/^MAIN_MODULE_([0-9A-Z_]+)_TABS_/i', $key)) {
143
                            $partname = 'tabs';
144
                            $params = explode(':', $value, 2);
145
                            if (!isset($this->modules_parts[$partname]) || !is_array($this->modules_parts[$partname])) {
146
                                $this->modules_parts[$partname] = array();
147
                            }
148
                            $this->modules_parts[$partname][$params[0]][] = $value; // $value may be a string or an array
149
                        }
150
                        // If this is constant for all generic part activated by a module. It initializes
151
                        // modules_parts['login'], modules_parts['menus'], modules_parts['substitutions'], modules_parts['triggers'], modules_parts['tpl'],
152
                        // modules_parts['models'], modules_parts['theme']
153
                        // modules_parts['sms'],
154
                        // modules_parts['css'], ...
155
                        elseif (preg_match('/^MAIN_MODULE_([0-9A-Z_]+)_([A-Z]+)$/i', $key, $reg)) {
156
                            $modulename = strtolower($reg[1]);
157
                            $partname = strtolower($reg[2]);
158
                            if (!isset($this->modules_parts[$partname]) || !is_array($this->modules_parts[$partname])) {
159
                                $this->modules_parts[$partname] = array();
160
                            }
161
                            $arrValue = json_decode($value, true);
162
                            if (is_array($arrValue) && !empty($arrValue))
163
                                $value = $arrValue;
164
                            else if (in_array($partname, array('login', 'menus', 'substitutions', 'triggers', 'tpl')))
165
                                $value = '/' . $modulename . '/core/' . $partname . '/';
166
                            else if (in_array($partname, array('models', 'theme')))
167
                                $value = '/' . $modulename . '/';
168
                            else if (in_array($partname, array('sms')))
169
                                $value = '/' . $modulename . '/';
170
                            else if ($value == 1)
171
                                $value = '/' . $modulename . '/core/modules/' . $partname . '/'; // ex: partname = societe
172
                            $this->modules_parts[$partname] = array_merge($this->modules_parts[$partname], array($modulename => $value)); // $value may be a string or an array
173
                        }
174
                        // If this is a module constant (must be at end)
175
                        elseif (preg_match('/^MAIN_MODULE_([0-9A-Z_]+)$/i', $key, $reg)) {
176
                            $modulename = strtolower($reg[1]);
177
                            if ($modulename == 'propale')
178
                                $modulename = 'propal';
179
                            if ($modulename == 'supplierproposal')
180
                                $modulename = 'supplier_proposal';
181
                            if (!isset($this->$modulename) || !is_object($this->$modulename))
182
                                $this->$modulename = new \stdClass();
183
                            $this->$modulename->enabled = true;
184
                            $this->modules[] = $modulename;              // Add this module in list of enabled modules
185
                        }
186
                    }
187
                }
188
                $i++;
189
            }
190
191
            $db->free($resql);
192
        }
193
194
        // Include other local consts.php files and fetch their values to the corresponding database constants.
195
        if (!empty(Globals::$conf->$global->LOCAL_CONSTS_FILES)) {
196
            $filesList = explode(":", Conf::$global->LOCAL_CONSTS_FILES);
197
            foreach ($filesList as $file) {
198
                $file = dol_sanitizeFileName($file);
199
                include_once DOL_DOCUMENT_ROOT . "/" . $file . "/" . $file . "_consts.php";
200
                foreach ($file2bddconsts as $key => $value) {
201
                    Conf::$global->$key = $value;
202
                }
203
            }
204
        }
205
206
        //var_dump($this->modules);
207
        //var_dump($this->modules_parts['theme']);
208
        // If you can't set timezone of your PHP, set this constant. Better is to set it to UTC.
209
        // In future, this constant will be forced to 'UTC' so PHP server timezone will not have effect anymore.
210
        //Conf::$global->MAIN_SERVER_TZ='Europe/Paris';
211
        if (!empty(Globals::$conf->$global->MAIN_SERVER_TZ) && Conf::$global->MAIN_SERVER_TZ != 'auto') {
212
            try {
213
                date_default_timezone_set(Globals::$conf->$global->MAIN_SERVER_TZ);
214
            } catch (Exception $e) {
0 ignored issues
show
The type Alixar\Base\Exception was not found. Did you mean Exception? If so, make sure to prefix the type with \.
Loading history...
215
                dol_syslog("Error: Bad value for parameter MAIN_SERVER_TZ=" . Conf::$global->MAIN_SERVER_TZ, LOG_ERR);
216
            }
217
        }
218
219
        // Object $mc
220
        if (!defined('NOREQUIREMC') && !empty($this->multicompany->enabled)) {
221
            // global $mc;
222
            $ret = @dol_include_once('/multicompany/class/actions_multicompany.class.php');
223
            if ($ret) {
224
                Globals::$mc = new ActionsMulticompany($db);
225
            }
226
        }
227
228
        // Clean some variables
229
        if (empty(Globals::$conf->$global->MAIN_MENU_STANDARD))
230
            Conf::$global->MAIN_MENU_STANDARD = "eldy_menu.php";
231
        if (empty(Globals::$conf->$global->MAIN_MENUFRONT_STANDARD))
232
            Conf::$global->MAIN_MENUFRONT_STANDARD = "eldy_menu.php";
233
        if (empty(Globals::$conf->$global->MAIN_MENU_SMARTPHONE))
234
            Conf::$global->MAIN_MENU_SMARTPHONE = "eldy_menu.php"; // Use eldy by default because smartphone does not work on all phones
235
        if (empty(Globals::$conf->$global->MAIN_MENUFRONT_SMARTPHONE))
236
            Conf::$global->MAIN_MENUFRONT_SMARTPHONE = "eldy_menu.php"; // Use eldy by default because smartphone does not work on all phones
237
238
239
240
241
242
243
// Clean var use vat for company
244
        if (!isset(Globals::$conf->$global->FACTURE_TVAOPTION))
245
            Conf::$global->FACTURE_TVAOPTION = 1;
246
        else if (!empty(Globals::$conf->$global->FACTURE_TVAOPTION) && !is_numeric(Globals::$conf->$global->FACTURE_TVAOPTION)) {
247
            // Old value of option, we clean to use new value (0 or 1)
248
            if (Globals::$conf->$global->FACTURE_TVAOPTION != "franchise")
249
                Conf::$global->FACTURE_TVAOPTION = 1;
250
            else
251
                Conf::$global->FACTURE_TVAOPTION = 0;
252
        }
253
254
        // Variable globales LDAP
255
        if (empty(Globals::$conf->$global->LDAP_FIELD_FULLNAME))
256
            Conf::$global->LDAP_FIELD_FULLNAME = '';
257
        if (!isset(Globals::$conf->$global->LDAP_KEY_USERS))
258
            Conf::$global->LDAP_KEY_USERS = Conf::$global->LDAP_FIELD_FULLNAME;
259
        if (!isset(Globals::$conf->$global->LDAP_KEY_GROUPS))
260
            Conf::$global->LDAP_KEY_GROUPS = Conf::$global->LDAP_FIELD_FULLNAME;
261
        if (!isset(Globals::$conf->$global->LDAP_KEY_CONTACTS))
262
            Conf::$global->LDAP_KEY_CONTACTS = Conf::$global->LDAP_FIELD_FULLNAME;
263
        if (!isset(Globals::$conf->$global->LDAP_KEY_MEMBERS))
264
            Conf::$global->LDAP_KEY_MEMBERS = Conf::$global->LDAP_FIELD_FULLNAME;
265
        if (!isset(Globals::$conf->$global->LDAP_KEY_MEMBERS_TYPES))
266
            Conf::$global->LDAP_KEY_MEMBERS_TYPES = Conf::$global->LDAP_FIELD_FULLNAME;
267
268
        // Load translation object with current language
269
        if (empty(Globals::$conf->$global->MAIN_LANG_DEFAULT))
270
            Conf::$global->MAIN_LANG_DEFAULT = "en_US";
271
272
        $rootfordata = DOL_DATA_ROOT;
273
        $rootforuser = DOL_DATA_ROOT;
274
        // If multicompany module is enabled, we redefine the root of data
275
        if (!empty($this->multicompany->enabled) && !empty($this->entity) && $this->entity > 1) {
276
            $rootfordata .= '/' . $this->entity;
277
        }
278
279
        // Define default dir_output and dir_temp for directories of modules
280
        foreach ($this->modules as $module) {
281
            //var_dump($module);
282
            // For multicompany sharings
283
            $this->$module->multidir_output = array($this->entity => $rootfordata . "/" . $module);
284
            $this->$module->multidir_temp = array($this->entity => $rootfordata . "/" . $module . "/temp");
285
            // For backward compatibility
286
            $this->$module->dir_output = $rootfordata . "/" . $module;
287
            $this->$module->dir_temp = $rootfordata . "/" . $module . "/temp";
288
        }
289
290
        // External modules storage
291
        if (!empty($this->modules_parts['dir'])) {
292
            foreach ($this->modules_parts['dir'] as $module => $dirs) {
293
                if (!empty($this->$module->enabled)) {
294
                    foreach ($dirs as $type => $name) {
295
                        $subdir = ($type == 'temp' ? '/temp' : '');
296
                        // For multicompany sharings
297
                        $varname = 'multidir_' . $type;
298
                        $this->$module->$varname = array($this->entity => $rootfordata . "/" . $name . $subdir);
299
                        // For backward compatibility
300
                        $varname = 'dir_' . $type;
301
                        $this->$module->$varname = $rootfordata . "/" . $name . $subdir;
302
                    }
303
                }
304
            }
305
        }
306
307
        // For mycompany storage
308
        $this->mycompany->dir_output = $rootfordata . "/mycompany";
309
        $this->mycompany->dir_temp = $rootfordata . "/mycompany/temp";
310
311
        // For admin storage
312
        $this->admin->dir_output = $rootfordata . '/admin';
313
        $this->admin->dir_temp = $rootfordata . '/admin/temp';
314
315
        // For user storage
316
        $this->user->multidir_output = array($this->entity => $rootfordata . "/users");
317
        $this->user->multidir_temp = array($this->entity => $rootfordata . "/users/temp");
318
        // For backward compatibility
319
        $this->user->dir_output = $rootforuser . "/users";
320
        $this->user->dir_temp = $rootforuser . "/users/temp";
321
322
        // For usergroup storage
323
        $this->usergroup->dir_output = $rootforuser . "/usergroups";
324
        $this->usergroup->dir_temp = $rootforuser . "/usergroups/temp";
325
326
        // For proposal storage
327
        $this->propal->multidir_output = array($this->entity => $rootfordata . "/propale");
328
        $this->propal->multidir_temp = array($this->entity => $rootfordata . "/propale/temp");
329
        // For backward compatibility
330
        $this->propal->dir_output = $rootfordata . "/propale";
331
        $this->propal->dir_temp = $rootfordata . "/propale/temp";
332
333
        // For medias storage
334
        $this->medias->multidir_output = array($this->entity => $rootfordata . "/medias");
335
        $this->medias->multidir_temp = array($this->entity => $rootfordata . "/medias/temp");
336
337
        // Exception: Some dir are not the name of module. So we keep exception here for backward compatibility.
338
        // Sous module bons d'expedition
339
        $this->expedition_bon->enabled = (!empty(Globals::$conf->$global->MAIN_SUBMODULE_EXPEDITION) ? Conf::$global->MAIN_SUBMODULE_EXPEDITION : 0);
340
        // Sous module bons de livraison
341
        $this->livraison_bon->enabled = (!empty(Globals::$conf->$global->MAIN_SUBMODULE_LIVRAISON) ? Conf::$global->MAIN_SUBMODULE_LIVRAISON : 0);
342
343
        // Module fournisseur
344
        if (!empty($this->fournisseur)) {
345
            $this->fournisseur->commande = new \stdClass();
346
            $this->fournisseur->commande->multidir_output = array($this->entity => $rootfordata . "/fournisseur/commande");
347
            $this->fournisseur->commande->multidir_temp = array($this->entity => $rootfordata . "/fournisseur/commande/temp");
348
            $this->fournisseur->commande->dir_output = $rootfordata . "/fournisseur/commande";  // For backward compatibility
349
            $this->fournisseur->commande->dir_temp = $rootfordata . "/fournisseur/commande/temp"; // For backward compatibility
350
            $this->fournisseur->facture = new \stdClass();
351
            $this->fournisseur->facture->multidir_output = array($this->entity => $rootfordata . "/fournisseur/facture");
352
            $this->fournisseur->facture->multidir_temp = array($this->entity => $rootfordata . "/fournisseur/facture/temp");
353
            $this->fournisseur->facture->dir_output = $rootfordata . "/fournisseur/facture";  // For backward compatibility
354
            $this->fournisseur->facture->dir_temp = $rootfordata . "/fournisseur/facture/temp"; // For backward compatibility
355
            $this->supplierproposal = new \stdClass();
356
            $this->supplierproposal->multidir_output = array($this->entity => $rootfordata . "/supplier_proposal");
357
            $this->supplierproposal->multidir_temp = array($this->entity => $rootfordata . "/supplier_proposal/temp");
358
            $this->supplierproposal->dir_output = $rootfordata . "/supplier_proposal";    // For backward compatibility
359
            $this->supplierproposal->dir_temp = $rootfordata . "/supplier_proposal/temp";   // For backward compatibility
360
            $this->fournisseur->payment = new \stdClass();
361
            $this->fournisseur->payment->multidir_output = array($this->entity => $rootfordata . "/fournisseur/payment");
362
            $this->fournisseur->payment->multidir_temp = array($this->entity => $rootfordata . "/fournisseur/payment/temp");
363
            $this->fournisseur->payment->dir_output = $rootfordata . "/fournisseur/payment";  // For backward compatibility
364
            $this->fournisseur->payment->dir_temp = $rootfordata . "/fournisseur/payment/temp"; // For backward compatibility
365
            // To prepare split of module fournisseur into fournisseur + supplier_order + supplier_invoice
366
            if (!empty($this->fournisseur->enabled) && empty(Globals::$conf->$global->MAIN_USE_NEW_SUPPLIERMOD)) {  // By default, if module supplier is on, we set new properties
367
                $this->supplier_order = new \stdClass();
368
                $this->supplier_order->enabled = 1;
369
                $this->supplier_order->multidir_output = array($this->entity => $rootfordata . "/fournisseur/commande");
370
                $this->supplier_order->multidir_temp = array($this->entity => $rootfordata . "/fournisseur/commande/temp");
371
                $this->supplier_order->dir_output = $rootfordata . "/fournisseur/commande";   // For backward compatibility
372
                $this->supplier_order->dir_temp = $rootfordata . "/fournisseur/commande/temp";  // For backward compatibility
373
                $this->supplier_invoice = new \stdClass();
374
                $this->supplier_invoice->enabled = 1;
375
                $this->supplier_invoice->multidir_output = array($this->entity => $rootfordata . "/fournisseur/facture");
376
                $this->supplier_invoice->multidir_temp = array($this->entity => $rootfordata . "/fournisseur/facture/temp");
377
                $this->supplier_invoice->dir_output = $rootfordata . "/fournisseur/facture";  // For backward compatibility
378
                $this->supplier_invoice->dir_temp = $rootfordata . "/fournisseur/facture/temp";  // For backward compatibility
379
                $this->supplierproposal = new \stdClass();
380
                $this->supplierproposal->multidir_output = array($this->entity => $rootfordata . "/supplier_proposal");
381
                $this->supplierproposal->multidir_temp = array($this->entity => $rootfordata . "/supplier_proposal/temp");
382
                $this->supplierproposal->dir_output = $rootfordata . "/supplier_proposal";   // For backward compatibility
383
                $this->supplierproposal->dir_temp = $rootfordata . "/supplier_proposal/temp";  // For backward compatibility
384
            }
385
        }
386
387
        // Module product/service
388
        $this->product->multidir_output = array($this->entity => $rootfordata . "/produit");
389
        $this->product->multidir_temp = array($this->entity => $rootfordata . "/produit/temp");
390
        $this->service->multidir_output = array($this->entity => $rootfordata . "/produit");
391
        $this->service->multidir_temp = array($this->entity => $rootfordata . "/produit/temp");
392
        // For backward compatibility
393
        $this->product->dir_output = $rootfordata . "/produit";
394
        $this->product->dir_temp = $rootfordata . "/produit/temp";
395
        $this->service->dir_output = $rootfordata . "/produit";
396
        $this->service->dir_temp = $rootfordata . "/produit/temp";
397
398
        // Module productbatch
399
        $this->productbatch->multidir_output = array($this->entity => $rootfordata . "/produitlot");
400
        $this->productbatch->multidir_temp = array($this->entity => $rootfordata . "/produitlot/temp");
401
402
        // Module contrat
403
        $this->contrat->multidir_output = array($this->entity => $rootfordata . "/contract");
404
        $this->contrat->multidir_temp = array($this->entity => $rootfordata . "/contract/temp");
405
        // For backward compatibility
406
        $this->contrat->dir_output = $rootfordata . "/contract";
407
        $this->contrat->dir_temp = $rootfordata . "/contract/temp";
408
409
        // Module bank
410
        $this->bank->dir_output = $rootfordata . "/bank";
411
        $this->bank->dir_temp = $rootfordata . "/bank/temp";
412
413
414
        // Set some default values
415
        //Conf::$global->MAIN_LIST_FILTER_ON_DAY=1;		// On filter that show date, we must show input field for day before or after month
416
        Conf::$global->MAIN_ACTIVATE_HTML5 = 1;
417
        Conf::$global->MAIN_MAIL_USE_MULTI_PART = 1;
418
419
        // societe
420
        if (empty(Globals::$conf->$global->SOCIETE_CODECLIENT_ADDON))
421
            Conf::$global->SOCIETE_CODECLIENT_ADDON = "mod_codeclient_leopard";
422
        if (empty(Globals::$conf->$global->SOCIETE_CODECOMPTA_ADDON))
423
            Conf::$global->SOCIETE_CODECOMPTA_ADDON = "mod_codecompta_panicum";
424
425
        if (empty(Globals::$conf->$global->CHEQUERECEIPTS_ADDON))
426
            Conf::$global->CHEQUERECEIPTS_ADDON = 'mod_chequereceipt_mint';
427
        if (empty(Globals::$conf->global->TICKETSUP_ADDON))
428
            Conf::$global->TICKETSUP_ADDON = 'mod_ticket_simple';
429
430
        // Security
431
        if (empty(Globals::$conf->$global->USER_PASSWORD_GENERATED))
432
            Conf::$global->USER_PASSWORD_GENERATED = 'standard'; // Default password generator
433
        if (empty(Globals::$conf->$global->MAIN_UMASK))
434
            Conf::$global->MAIN_UMASK = '0664';         // Default mask
435
436
437
438
439
440
441
442
// conf->use_javascript_ajax
443
        $this->use_javascript_ajax = 1;
444
        if (isset(Globals::$conf->$global->MAIN_DISABLE_JAVASCRIPT))
445
            $this->use_javascript_ajax = !Conf::$global->MAIN_DISABLE_JAVASCRIPT;
446
        // If no javascript_ajax, Ajax features are disabled.
447
        if (empty($this->use_javascript_ajax)) {
448
            unset(Globals::$conf->$global->PRODUIT_USE_SEARCH_TO_SELECT);
449
            unset(Globals::$conf->$global->COMPANY_USE_SEARCH_TO_SELECT);
450
            unset(Globals::$conf->$global->CONTACT_USE_SEARCH_TO_SELECT);
451
            unset(Globals::$conf->$global->PROJECT_USE_SEARCH_TO_SELECT);
452
        }
453
454
        if (!empty($this->productbatch->enabled)) {
455
            Conf::$global->STOCK_CALCULATE_ON_BILL = 0;
456
            Conf::$global->STOCK_CALCULATE_ON_VALIDATE_ORDER = 0;
457
            Conf::$global->STOCK_CALCULATE_ON_SHIPMENT = 1;
458
            Conf::$global->STOCK_CALCULATE_ON_SHIPMENT_CLOSE = 0;
459
            Conf::$global->STOCK_CALCULATE_ON_SUPPLIER_BILL = 0;
460
            Conf::$global->STOCK_CALCULATE_ON_SUPPLIER_VALIDATE_ORDER = 0;
461
            if (empty($this->reception->enabled))
462
                Conf::$global->STOCK_CALCULATE_ON_SUPPLIER_DISPATCH_ORDER = 1;
463
            else {
464
                Conf::$global->STOCK_CALCULATE_ON_RECEPTION = 1;
465
                Conf::$global->STOCK_CALCULATE_ON_RECEPTION_CLOSE = 0;
466
            }
467
        }
468
469
        // conf->currency
470
        if (empty(Globals::$conf->$global->MAIN_MONNAIE))
471
            Conf::$global->MAIN_MONNAIE = 'EUR';
472
        $this->currency = Conf::$global->MAIN_MONNAIE;
473
474
        if (empty(Globals::$conf->$global->MAIN_BROWSER_NOTIFICATION_FREQUENCY))
475
            Conf::$global->MAIN_BROWSER_NOTIFICATION_FREQUENCY = 30;   // Less than 1 minutes to be sure
476
477
478
479
480
481
482
483
// conf->global->ACCOUNTING_MODE = Option des modules Comptabilites (simple ou expert). Defini le mode de calcul des etats comptables (CA,...)
484
        if (empty(Globals::$conf->$global->ACCOUNTING_MODE))
485
            Conf::$global->ACCOUNTING_MODE = 'RECETTES-DEPENSES';  // By default. Can be 'RECETTES-DEPENSES' ou 'CREANCES-DETTES'
486
487
488
489
490
491
492
493
// By default, suppliers objects can be linked to all projects
494
        Conf::$global->PROJECT_CAN_ALWAYS_LINK_TO_ALL_SUPPLIERS = 1;
495
496
        // MAIN_HTML_TITLE
497
        if (!isset(Globals::$conf->$global->MAIN_HTML_TITLE))
498
            Conf::$global->MAIN_HTML_TITLE = 'noapp,thirdpartynameonly,contactnameonly,projectnameonly';
499
500
        // conf->liste_limit = constante de taille maximale des listes
501
        if (empty(Globals::$conf->$global->MAIN_SIZE_LISTE_LIMIT))
502
            Conf::$global->MAIN_SIZE_LISTE_LIMIT = 25;
503
        $this->liste_limit = Conf::$global->MAIN_SIZE_LISTE_LIMIT;
504
505
        // conf->product->limit_size = constante de taille maximale des select de produit
506
        if (!isset(Globals::$conf->$global->PRODUIT_LIMIT_SIZE))
507
            Conf::$global->PRODUIT_LIMIT_SIZE = 1000;
508
        $this->product->limit_size = Conf::$global->PRODUIT_LIMIT_SIZE;
509
510
        // conf->theme et $this->css
511
        if (empty(Globals::$conf->$global->MAIN_THEME))
512
            Conf::$global->MAIN_THEME = "eldy";
513
        if (!empty(Globals::$conf->$global->MAIN_FORCETHEME))
514
            Conf::$global->MAIN_THEME = Conf::$global->MAIN_FORCETHEME;
515
        $this->theme = Conf::$global->MAIN_THEME;
516
        //$this->css  = "/theme/".$this->theme."/style.css.php";
517
        $this->css = '?controller=theme/' . $this->theme . '&method=style.css';
518
519
        // conf->email_from = email pour envoi par dolibarr des mails automatiques
520
        $this->email_from = "[email protected]";
521
        if (!empty(Globals::$conf->$global->MAIN_MAIL_EMAIL_FROM))
522
            $this->email_from = Conf::$global->MAIN_MAIL_EMAIL_FROM;
523
524
        // conf->notification->email_from = email pour envoi par Dolibarr des notifications
525
        $this->notification->email_from = $this->email_from;
526
        if (!empty(Globals::$conf->$global->NOTIFICATION_EMAIL_FROM))
527
            $this->notification->email_from = Conf::$global->NOTIFICATION_EMAIL_FROM;
528
529
        // conf->mailing->email_from = email pour envoi par Dolibarr des mailings
530
        $this->mailing->email_from = $this->email_from;
531
        if (!empty(Globals::$conf->$global->MAILING_EMAIL_FROM))
532
            $this->mailing->email_from = Conf::$global->MAILING_EMAIL_FROM;
533
        if (!isset(Globals::$conf->$global->MAIN_EMAIL_ADD_TRACK_ID))
534
            Conf::$global->MAIN_EMAIL_ADD_TRACK_ID = 1;
535
536
        // Format for date (used by default when not found or not searched in lang)
537
        $this->format_date_short = "%d/%m/%Y";            // Format of day with PHP/C tags (strftime functions)
538
        $this->format_date_short_java = "dd/MM/yyyy";     // Format of day with Java tags
539
        $this->format_hour_short = "%H:%M";
540
        $this->format_hour_short_duration = "%H:%M";
541
        $this->format_date_text_short = "%d %b %Y";
542
        $this->format_date_text = "%d %B %Y";
543
        $this->format_date_hour_short = "%d/%m/%Y %H:%M";
544
        $this->format_date_hour_sec_short = "%d/%m/%Y %H:%M:%S";
545
        $this->format_date_hour_text_short = "%d %b %Y %H:%M";
546
        $this->format_date_hour_text = "%d %B %Y %H:%M";
547
548
        // Duration of workday
549
        if (!isset(Globals::$conf->$global->MAIN_DURATION_OF_WORKDAY))
550
            Conf::$global->MAIN_DURATION_OF_WORKDAY = 86400;
551
552
        // Limites decimales si non definie (peuvent etre egale a 0)
553
        if (!isset(Globals::$conf->$global->MAIN_MAX_DECIMALS_UNIT))
554
            Conf::$global->MAIN_MAX_DECIMALS_UNIT = 5;
555
        if (!isset(Globals::$conf->$global->MAIN_MAX_DECIMALS_TOT))
556
            Conf::$global->MAIN_MAX_DECIMALS_TOT = 2;
557
        if (!isset(Globals::$conf->$global->MAIN_MAX_DECIMALS_SHOWN))
558
            Conf::$global->MAIN_MAX_DECIMALS_SHOWN = 8;
559
560
        // Default pdf option
561
        if (!isset(Globals::$conf->$global->MAIN_PDF_DASH_BETWEEN_LINES))
562
            Conf::$global->MAIN_PDF_DASH_BETWEEN_LINES = 1;    // use dash between lines
563
        if (!isset(Globals::$conf->$global->PDF_ALLOW_HTML_FOR_FREE_TEXT))
564
            Conf::$global->PDF_ALLOW_HTML_FOR_FREE_TEXT = 1;  // allow html content into free footer text
565
566
567
568
569
570
571
572
// Set default value to MAIN_SHOW_LOGO
573
        if (!isset(Globals::$conf->$global->MAIN_SHOW_LOGO))
574
            Conf::$global->MAIN_SHOW_LOGO = 1;
575
576
        // Default max file size for upload
577
        $this->maxfilesize = (empty(Globals::$conf->$global->MAIN_UPLOAD_DOC) ? 0 : (int) Conf::$global->MAIN_UPLOAD_DOC * 1024);
578
579
        // By default, we propagate contacts
580
        if (!isset(Globals::$conf->$global->MAIN_PROPAGATE_CONTACTS_FROM_ORIGIN))
581
            Conf::$global->MAIN_PROPAGATE_CONTACTS_FROM_ORIGIN = '*';  // Can be also '*' or '^(BILLING|SHIPPING|CUSTOMER|.*)$' (regex not yet implemented)
582
583
584
585
586
587
588
589
// By default, we do not use the zip town table but the table of third parties
590
        if (!isset(Globals::$conf->$global->MAIN_USE_ZIPTOWN_DICTIONNARY))
591
            Conf::$global->MAIN_USE_ZIPTOWN_DICTIONNARY = 0;
592
593
        // By default, we open card if one found
594
        if (!isset(Globals::$conf->$global->MAIN_SEARCH_DIRECT_OPEN_IF_ONLY_ONE))
595
            Conf::$global->MAIN_SEARCH_DIRECT_OPEN_IF_ONLY_ONE = 1;
596
597
        // By default, we show state code in combo list
598
        if (!isset(Globals::$conf->$global->MAIN_SHOW_STATE_CODE))
599
            Conf::$global->MAIN_SHOW_STATE_CODE = 1;
600
601
        // Define list of limited modules (value must be key found for "name" property of module, so for example 'supplierproposal' for Module "Supplier Proposal"
602
        if (!isset(Globals::$conf->$global->MAIN_MODULES_FOR_EXTERNAL))
603
            Conf::$global->MAIN_MODULES_FOR_EXTERNAL = 'user,societe,propal,commande,facture,categorie,supplierproposal,fournisseur,contact,projet,contrat,ficheinter,expedition,agenda,resource,adherent,blockedlog'; // '' means 'all'. Note that contact is added here as it should be a module later.
604
        if (!empty($this->modules_parts['moduleforexternal'])) {  // Module part to include an external module into the MAIN_MODULES_FOR_EXTERNAL list
605
            foreach ($this->modules_parts['moduleforexternal'] as $key => $value)
606
                Conf::$global->MAIN_MODULES_FOR_EXTERNAL .= "," . $key;
607
        }
608
609
        // Enable select2
610
        if (empty(Globals::$conf->$global->MAIN_USE_JQUERY_MULTISELECT) || Conf::$global->MAIN_USE_JQUERY_MULTISELECT == '1')
611
            Conf::$global->MAIN_USE_JQUERY_MULTISELECT = 'select2';
612
613
        // Timeouts
614
        if (empty(Globals::$conf->$global->MAIN_USE_CONNECT_TIMEOUT))
615
            Conf::$global->MAIN_USE_CONNECT_TIMEOUT = 10;
616
        if (empty(Globals::$conf->$global->MAIN_USE_RESPONSE_TIMEOUT))
617
            Conf::$global->MAIN_USE_RESPONSE_TIMEOUT = 30;
618
619
        // Set default variable to calculate VAT as if option tax_mode was 0 (standard)
620
        if (empty(Globals::$conf->$global->TAX_MODE_SELL_PRODUCT))
621
            Conf::$global->TAX_MODE_SELL_PRODUCT = 'invoice';
622
        if (empty(Globals::$conf->$global->TAX_MODE_BUY_PRODUCT))
623
            Conf::$global->TAX_MODE_BUY_PRODUCT = 'invoice';
624
        if (empty(Globals::$conf->$global->TAX_MODE_SELL_SERVICE))
625
            Conf::$global->TAX_MODE_SELL_SERVICE = 'payment';
626
        if (empty(Globals::$conf->$global->TAX_MODE_BUY_SERVICE))
627
            Conf::$global->TAX_MODE_BUY_SERVICE = 'payment';
628
629
        // Delay before warnings
630
        // Avoid strict errors. TODO: Replace xxx->warning_delay with a property ->warning_delay_xxx
631
        if (isset($this->agenda)) {
632
            $this->adherent->subscription = new \stdClass();
633
            $this->adherent->subscription->warning_delay = (isset(Globals::$conf->$global->MAIN_DELAY_MEMBERS) ? Conf::$global->MAIN_DELAY_MEMBERS : 0) * 24 * 60 * 60;
634
        }
635
        if (isset($this->agenda))
636
            $this->agenda->warning_delay = (isset(Globals::$conf->$global->MAIN_DELAY_ACTIONS_TODO) ? Conf::$global->MAIN_DELAY_ACTIONS_TODO : 7) * 24 * 60 * 60;
637
        if (isset($this->projet)) {
638
            $this->projet->warning_delay = (isset(Globals::$conf->$global->MAIN_DELAY_PROJECT_TO_CLOSE) ? Conf::$global->MAIN_DELAY_PROJECT_TO_CLOSE : 7) * 24 * 60 * 60;
639
            $this->projet->task = new StdClass();
0 ignored issues
show
The type Alixar\Base\StdClass was not found. Did you mean StdClass? If so, make sure to prefix the type with \.
Loading history...
640
            $this->projet->task->warning_delay = (isset(Globals::$conf->$global->MAIN_DELAY_TASKS_TODO) ? Conf::$global->MAIN_DELAY_TASKS_TODO : 7) * 24 * 60 * 60;
641
        }
642
643
        if (isset($this->commande)) {
644
            $this->commande->client = new \stdClass();
645
            $this->commande->fournisseur = new \stdClass();
646
            $this->commande->client->warning_delay = (isset(Globals::$conf->$global->MAIN_DELAY_ORDERS_TO_PROCESS) ? Conf::$global->MAIN_DELAY_ORDERS_TO_PROCESS : 2) * 24 * 60 * 60;
647
            $this->commande->fournisseur->warning_delay = (isset(Globals::$conf->$global->MAIN_DELAY_SUPPLIER_ORDERS_TO_PROCESS) ? Conf::$global->MAIN_DELAY_SUPPLIER_ORDERS_TO_PROCESS : 7) * 24 * 60 * 60;
648
        }
649
        if (isset($this->propal)) {
650
            $this->propal->cloture = new \stdClass();
651
            $this->propal->facturation = new \stdClass();
652
            $this->propal->cloture->warning_delay = (isset(Globals::$conf->$global->MAIN_DELAY_PROPALS_TO_CLOSE) ? Conf::$global->MAIN_DELAY_PROPALS_TO_CLOSE : 0) * 24 * 60 * 60;
653
            $this->propal->facturation->warning_delay = (isset(Globals::$conf->$global->MAIN_DELAY_PROPALS_TO_BILL) ? Conf::$global->MAIN_DELAY_PROPALS_TO_BILL : 0) * 24 * 60 * 60;
654
        }
655
        if (isset($this->facture)) {
656
            $this->facture->client = new \stdClass();
657
            $this->facture->fournisseur = new \stdClass();
658
            $this->facture->client->warning_delay = (isset(Globals::$conf->$global->MAIN_DELAY_CUSTOMER_BILLS_UNPAYED) ? Conf::$global->MAIN_DELAY_CUSTOMER_BILLS_UNPAYED : 0) * 24 * 60 * 60;
659
            $this->facture->fournisseur->warning_delay = (isset(Globals::$conf->$global->MAIN_DELAY_SUPPLIER_BILLS_TO_PAY) ? Conf::$global->MAIN_DELAY_SUPPLIER_BILLS_TO_PAY : 0) * 24 * 60 * 60;
660
        }
661
        if (isset($this->contrat)) {
662
            $this->contrat->services = new \stdClass();
663
            $this->contrat->services->inactifs = new \stdClass();
664
            $this->contrat->services->expires = new \stdClass();
665
            $this->contrat->services->inactifs->warning_delay = (isset(Globals::$conf->$global->MAIN_DELAY_NOT_ACTIVATED_SERVICES) ? Conf::$global->MAIN_DELAY_NOT_ACTIVATED_SERVICES : 0) * 24 * 60 * 60;
666
            $this->contrat->services->expires->warning_delay = (isset(Globals::$conf->$global->MAIN_DELAY_RUNNING_SERVICES) ? Conf::$global->MAIN_DELAY_RUNNING_SERVICES : 0) * 24 * 60 * 60;
667
        }
668
        if (isset($this->commande)) {
669
            $this->bank->rappro = new \stdClass();
670
            $this->bank->cheque = new \stdClass();
671
            $this->bank->rappro->warning_delay = (isset(Globals::$conf->$global->MAIN_DELAY_TRANSACTIONS_TO_CONCILIATE) ? Conf::$global->MAIN_DELAY_TRANSACTIONS_TO_CONCILIATE : 0) * 24 * 60 * 60;
672
            $this->bank->cheque->warning_delay = (isset(Globals::$conf->$global->MAIN_DELAY_CHEQUES_TO_DEPOSIT) ? Conf::$global->MAIN_DELAY_CHEQUES_TO_DEPOSIT : 0) * 24 * 60 * 60;
673
        }
674
        if (isset($this->expensereport)) {
675
            $this->expensereport->approve = new \stdClass();
676
            $this->expensereport->approve->warning_delay = (isset(Globals::$conf->$global->MAIN_DELAY_EXPENSEREPORTS) ? Conf::$global->MAIN_DELAY_EXPENSEREPORTS : 0) * 24 * 60 * 60;
677
            $this->expensereport->payment = new \stdClass();
678
            $this->expensereport->payment->warning_delay = (isset(Globals::$conf->$global->MAIN_DELAY_EXPENSEREPORTS_TO_PAY) ? Conf::$global->MAIN_DELAY_EXPENSEREPORTS_TO_PAY : 0) * 24 * 60 * 60;
679
        }
680
681
        if (!empty(Globals::$conf->$global->PRODUIT_MULTIPRICES) && empty(Globals::$conf->$global->PRODUIT_MULTIPRICES_LIMIT)) {
682
            Conf::$global->PRODUIT_MULTIPRICES_LIMIT = 5;
683
        }
684
685
        // For modules that want to disable top or left menu
686
        if (!empty(Globals::$conf->$global->MAIN_HIDE_TOP_MENU))
687
            $this->dol_hide_topmenu = Conf::$global->MAIN_HIDE_TOP_MENU;
688
        if (!empty(Globals::$conf->$global->MAIN_HIDE_LEFT_MENU))
689
            $this->dol_hide_leftmenu = Conf::$global->MAIN_HIDE_LEFT_MENU;
690
691
        if (empty(Globals::$conf->$global->MAIN_SIZE_SHORTLIST_LIMIT))
692
            Conf::$global->MAIN_SIZE_SHORTLIST_LIMIT = 3;
693
694
        if (!isset(Globals::$conf->$global->THEME_HIDE_BORDER_ON_INPUT))
695
            Conf::$global->THEME_HIDE_BORDER_ON_INPUT = 0;
696
697
        // Save inconsistent option
698
        if (empty(Globals::$conf->$global->AGENDA_USE_EVENT_TYPE) && (!isset(Globals::$conf->$global->AGENDA_DEFAULT_FILTER_TYPE) || Conf::$global->AGENDA_DEFAULT_FILTER_TYPE == 'AC_NON_AUTO')) {
699
            Conf::$global->AGENDA_DEFAULT_FILTER_TYPE = '0';    // 'AC_NON_AUTO' does not exists when AGENDA_DEFAULT_FILTER_TYPE is not on.
700
        }
701
702
        if (!isset(Globals::$conf->$global->MAIN_EXTRAFIELDS_IN_ONE_TD))
703
            Conf::$global->MAIN_EXTRAFIELDS_IN_ONE_TD = 1;
704
705
        Conf::$global->MAIN_MODULE_DOLISTORE_API_SRV = 'https://www.dolistore.com';
706
        Conf::$global->MAIN_MODULE_DOLISTORE_API_KEY = 'dolistorecatalogpublickey1234567';
707
708
        // For backward compatibility
709
        if (isset($this->product))
710
            $this->produit = $this->product;
711
        if (isset($this->facture))
712
            $this->invoice = $this->facture;
713
        if (isset($this->commande))
714
            $this->order = $this->commande;
715
        if (isset($this->contrat))
716
            $this->contract = $this->contrat;
717
        if (isset($this->categorie))
718
            $this->category = $this->categorie;
719
720
        // Object $mc
721
        if (!defined('NOREQUIREMC') && !empty($this->multicompany->enabled)) {
722
            if (is_object(Globals::$mc)) {
723
                Globals::$mc->setValues($this);
724
            }
725
        }
726
727
        // We init log handlers
728
        if (!empty(Globals::$conf->$global->SYSLOG_HANDLERS)) {
729
            $handlers = json_decode(Globals::$conf->$global->SYSLOG_HANDLERS);
730
        } else {
731
            $handlers = array();
732
        }
733
734
        foreach ($handlers as $handler) {
735
            $handler_files = array();
736
            $dirsyslogs = array_merge(array('/core/modules/syslog/'), $this->modules_parts['syslog']);
737
            foreach ($dirsyslogs as $reldir) {
738
                $dir = dol_buildpath($reldir, 0);
739
                $newdir = dol_osencode($dir);
740
                if (is_dir($newdir)) {
741
                    $file = $newdir . $handler . '.php';
742
                    if (file_exists($file)) {
743
                        $handler_files[] = $file;
744
                    }
745
                }
746
            }
747
748
            if (empty($handler_files)) {
749
                throw new Exception('Missing log handler file ' . $handler . '.php');
750
            }
751
752
            require_once $handler_files[0];
753
            $loghandlerinstance = new $handler();
754
            if (!$loghandlerinstance instanceof LogHandlerInterface) {
0 ignored issues
show
The type Alixar\Base\LogHandlerInterface was not found. Did you mean LogHandlerInterface? If so, make sure to prefix the type with \.
Loading history...
755
                throw new Exception('Log handler does not extend LogHandlerInterface');
756
            }
757
758
            if (empty($this->loghandlers[$handler])) {
759
                $this->loghandlers[$handler] = $loghandlerinstance;
760
            }
761
        }
762
    }
763
}
764