28require_once DOL_DOCUMENT_ROOT.
'/core/class/commonobject.class.php';
38 public $module =
'asset';
43 public $element =
'asset';
48 public $table_element =
'asset';
53 public $picto =
'asset';
55 const STATUS_DRAFT = 0;
56 const STATUS_DISPOSED = 9;
89 public $fields = array(
90 'rowid' => array(
'type' =>
'integer',
'label' =>
'TechnicalID',
'enabled' => 1,
'position' => 1,
'notnull' => 1,
'visible' => 0,
'noteditable' => 1,
'index' => 1,
'css' =>
'left',
'comment' =>
"Id"),
91 'ref' => array(
'type' =>
'varchar(128)',
'label' =>
'Ref',
'enabled' => 1,
'position' => 20,
'notnull' => 1,
'visible' => 1,
'noteditable' => 0,
'index' => 1,
'searchall' => 1,
'showoncombobox' => 1,
'validate' => 1,
'comment' =>
"Reference of object",
"css" =>
"maxwidth150"),
92 'label' => array(
'type' =>
'varchar(255)',
'label' =>
'Label',
'enabled' => 1,
'position' => 30,
'notnull' => 1,
'visible' => 1,
'searchall' => 1,
'csslist' =>
'tdoverflowmax125',
'css' =>
'minwidth300',
'cssview' =>
'wordbreak',
'showoncombobox' => 2,
'validate' => 1,),
93 'fk_asset_model' => array(
'type' =>
'integer:AssetModel:asset/class/assetmodel.class.php:1:((status:=:1) and (entity:IN:__SHARED_ENTITIES__))',
'label' =>
'AssetModel',
'enabled' => 1,
'position' => 40,
'notnull' => 0,
'visible' => 1,
'index' => 1,
'validate' => 1,
'csslist' =>
'tdoverflowmax75',
'css' =>
'maxwidth300'),
94 'qty' => array(
'type' =>
'real',
'label' =>
'Qty',
'enabled' => 1,
'position' => 50,
'notnull' => 1,
'visible' => 0,
'default' =>
'1',
'isameasure' => 1,
'css' =>
'maxwidth75imp',
'validate' => 1,),
95 'acquisition_type' => array(
'type' =>
'smallint',
'label' =>
'AssetAcquisitionType',
'enabled' => 1,
'position' => 60,
'notnull' => 1,
'visible' => 1,
'arrayofkeyval' => array(0 =>
'AssetAcquisitionTypeNew', 1 =>
'AssetAcquisitionTypeOccasion'),
'validate' => 1,
'csslist' =>
'tdoverflowmax75'),
96 'asset_type' => array(
'type' =>
'smallint',
'label' =>
'AssetType',
'enabled' => 1,
'position' => 70,
'notnull' => 1,
'visible' => 1,
'arrayofkeyval' => array(0 =>
'AssetTypeIntangible', 1 =>
'AssetTypeTangible', 2 =>
'AssetTypeInProgress', 3 =>
'AssetTypeFinancial'),
'validate' => 1,
'csslist' =>
'tdoverflowmax75'),
97 'not_depreciated' => array(
'type' =>
'boolean',
'label' =>
'AssetNotDepreciated',
'enabled' => 1,
'position' => 80,
'notnull' => 0,
'default' =>
'0',
'visible' => 1,
'validate' => 1,
'csslist' =>
'maxwidth50 tdoverflowmax50',
'css' =>
'maxwidth50imp'),
98 'date_acquisition' => array(
'type' =>
'date',
'label' =>
'AssetDateAcquisition',
'enabled' => 1,
'position' => 90,
'notnull' => 1,
'visible' => 1,),
99 'date_start' => array(
'type' =>
'date',
'label' =>
'AssetDateStart',
'enabled' => 1,
'position' => 100,
'notnull' => 0,
'visible' => -1,),
100 'acquisition_value_ht' => array(
'type' =>
'price',
'label' =>
'AssetAcquisitionValueHT',
'enabled' => 1,
'position' => 110,
'notnull' => 1,
'visible' => 1,
'isameasure' => 1,
'validate' => 1,),
101 'recovered_vat' => array(
'type' =>
'price',
'label' =>
'AssetRecoveredVAT',
'enabled' => 1,
'position' => 120,
'notnull' => 0,
'visible' => 1,
'isameasure' => 1,
'validate' => 1,),
102 'reversal_date' => array(
'type' =>
'date',
'label' =>
'AssetReversalDate',
'enabled' => 1,
'position' => 130,
'notnull' => 0,
'visible' => 1,),
103 'reversal_amount_ht' => array(
'type' =>
'price',
'label' =>
'AssetReversalAmountHT',
'enabled' => 1,
'position' => 140,
'notnull' => 0,
'visible' => 1,
'isameasure' => 1,
'validate' => 1,
'csslist' =>
'maxwidth50'),
104 'disposal_date' => array(
'type' =>
'date',
'label' =>
'AssetDisposalDate',
'enabled' => 1,
'position' => 200,
'notnull' => 0,
'visible' => -2,),
105 'disposal_amount_ht' => array(
'type' =>
'price',
'label' =>
'AssetDisposalAmount',
'enabled' => 1,
'position' => 210,
'notnull' => 0,
'visible' => -2,
'default' =>
'0',
'isameasure' => 1,
'validate' => 1,),
106 'fk_disposal_type' => array(
'type' =>
'sellist:c_asset_disposal_type:label:rowid::active=1',
'label' =>
'AssetDisposalType',
'enabled' => 1,
'position' => 220,
'notnull' => 0,
'visible' => -2,
'index' => 1,
'validate' => 1,),
107 'disposal_depreciated' => array(
'type' =>
'boolean',
'label' =>
'AssetDisposalDepreciated',
'enabled' => 1,
'position' => 230,
'notnull' => 0,
'default' =>
'0',
'visible' => -2,
'validate' => 1,),
108 'disposal_subject_to_vat' => array(
'type' =>
'boolean',
'label' =>
'AssetDisposalSubjectToVat',
'enabled' => 1,
'position' => 240,
'notnull' => 0,
'default' =>
'0',
'visible' => -2,
'validate' => 1,),
109 'note_public' => array(
'type' =>
'html',
'label' =>
'NotePublic',
'enabled' => 1,
'position' => 300,
'notnull' => 0,
'visible' => 0,
'validate' => 1,),
110 'note_private' => array(
'type' =>
'html',
'label' =>
'NotePrivate',
'enabled' => 1,
'position' => 301,
'notnull' => 0,
'visible' => 0,
'validate' => 1,),
111 'date_creation' => array(
'type' =>
'datetime',
'label' =>
'DateCreation',
'enabled' => 1,
'position' => 500,
'notnull' => 1,
'visible' => -2,),
112 'tms' => array(
'type' =>
'timestamp',
'label' =>
'DateModification',
'enabled' => 1,
'position' => 501,
'notnull' => 0,
'visible' => -2,),
113 'fk_user_creat' => array(
'type' =>
'integer:User:user/class/user.class.php',
'label' =>
'UserAuthor',
'enabled' => 1,
'position' => 510,
'notnull' => 1,
'visible' => -2,
'foreignkey' =>
'user.rowid',),
114 'fk_user_modif' => array(
'type' =>
'integer:User:user/class/user.class.php',
'label' =>
'UserModif',
'enabled' => 1,
'position' => 511,
'notnull' => -1,
'visible' => -2,),
115 'last_main_doc' => array(
'type' =>
'varchar(255)',
'label' =>
'LastMainDoc',
'enabled' => 1,
'position' => 600,
'notnull' => 0,
'visible' => 0,),
116 'import_key' => array(
'type' =>
'varchar(14)',
'label' =>
'ImportId',
'enabled' => 1,
'position' => 1000,
'notnull' => -1,
'visible' => -2,),
117 'model_pdf' => array(
'type' =>
'varchar(255)',
'label' =>
'Model pdf',
'enabled' => 1,
'position' => 1010,
'notnull' => -1,
'visible' => 0,),
118 'status' => array(
'type' =>
'smallint',
'label' =>
'Status',
'enabled' => 1,
'position' => 1000,
'notnull' => 1,
'default' =>
'0',
'visible' => 2,
'index' => 1,
'arrayofkeyval' => array(0 =>
'Draft', 1 =>
'Validated', 9 =>
'Canceled'),
'validate' => 1,),
136 public $fk_asset_model;
140 public $reversal_amount_ht;
144 public $acquisition_value_ht;
148 public $recovered_vat;
152 public $reversal_date;
156 public $date_acquisition;
168 public $acquisition_type;
176 public $not_depreciated;
180 public $disposal_date;
184 public $disposal_amount_ht;
188 public $fk_disposal_type;
192 public $disposal_depreciated;
196 public $disposal_subject_to_vat;
200 public $supplier_invoice_id;
208 public $note_private;
212 public $fk_user_creat;
216 public $fk_user_modif;
220 public $last_main_doc;
237 public $asset_depreciation_options;
241 public $asset_accountancy_codes;
245 public $depreciation_lines = array();
258 $this->ismultientitymanaged = 1;
259 $this->isextrafieldmanaged = 1;
262 $this->fields[
'rowid'][
'visible'] = 0;
264 if (!isModEnabled(
'multicompany') && isset($this->fields[
'entity'])) {
265 $this->fields[
'entity'][
'enabled'] = 0;
269 foreach ($this->fields as $key => $val) {
270 if (isset($val[
'enabled']) && empty($val[
'enabled'])) {
271 unset($this->fields[$key]);
276 if (is_object($langs)) {
277 foreach ($this->fields as $key => $val) {
278 if (!empty($val[
'arrayofkeyval']) && is_array($val[
'arrayofkeyval'])) {
279 foreach ($val[
'arrayofkeyval'] as $key2 => $val2) {
280 $this->fields[$key][
'arrayofkeyval'][$key2] = $langs->trans($val2);
296 if (!isset($this->date_start) || $this->date_start ===
"") {
297 $this->date_start = $this->date_acquisition;
302 $result = $result_create = $this->
createCommon($user, $notrigger);
303 if ($result > 0 && $this->fk_asset_model > 0) {
307 if ($this->supplier_invoice_id > 0) {
313 $this->db->rollback();
318 return $result > 0 ? $result_create : $result;
330 global $langs, $extrafields;
423 public function fetch($id, $ref =
null)
430 } elseif ($res > 0) {
431 $this->fields[
'date_acquisition'][
'noteditable'] = 1;
432 $this->fields[
'date_start'][
'noteditable'] = 1;
433 $this->fields[
'acquisition_value_ht'][
'noteditable'] = 1;
434 $this->fields[
'recovered_vat'][
'noteditable'] = 1;
435 $this->fields[
'reversal_date'][
'noteditable'] = 1;
436 $this->fields[
'reversal_amount_ht'][
'noteditable'] = 1;
456 public function fetchAll($sortorder =
'', $sortfield =
'', $limit = 0, $offset = 0, $filter =
'', $filtermode =
'AND')
464 $sql .=
" FROM ".MAIN_DB_PREFIX.$this->table_element.
" as t";
465 if (isset($this->ismultientitymanaged) && $this->ismultientitymanaged == 1) {
466 $sql .=
" WHERE t.entity IN (".getEntity($this->element).
")";
468 $sql .=
" WHERE 1 = 1";
475 $this->errors[] = $errormessage;
476 dol_syslog(__METHOD__.
' '.implode(
',', $this->errors), LOG_ERR);
481 if (!empty($sortfield)) {
482 $sql .= $this->db->order($sortfield, $sortorder);
484 if (!empty($limit)) {
485 $sql .= $this->db->plimit($limit, $offset);
488 $resql = $this->db->query($sql);
490 $num = $this->db->num_rows($resql);
492 while ($i < ($limit ? min($limit, $num) : $num)) {
493 $obj = $this->db->fetch_object($resql);
495 $record =
new self($this->db);
496 $record->setVarsFromFetchObj($obj);
498 $records[$record->id] = $record;
502 $this->db->free($resql);
506 $this->errors[] =
'Error '.$this->db->lasterror();
507 dol_syslog(__METHOD__.
' '.implode(
',', $this->errors), LOG_ERR);
522 if (!isset($this->date_start) || $this->date_start ===
"") {
523 $this->date_start = $this->date_acquisition;
529 if ($result > 0 && $this->fk_asset_model > 0 && $this->fk_asset_model != $this->oldcopy->fk_asset_model) {
533 $this->date_start != $this->oldcopy->date_start ||
534 $this->acquisition_value_ht != $this->oldcopy->acquisition_value_ht ||
535 $this->reversal_date != $this->oldcopy->reversal_date ||
536 $this->reversal_amount_ht != $this->oldcopy->reversal_amount_ht ||
537 ($this->fk_asset_model > 0 && $this->fk_asset_model != $this->oldcopy->fk_asset_model)
544 $this->db->rollback();
559 public function delete(
User $user, $notrigger = 0)
575 $langs->load(
'assets');
578 $this->
id = $this->
id > 0 ? $this->id : 0;
579 $this->fk_asset_model = $this->fk_asset_model > 0 ? $this->fk_asset_model : 0;
583 if (empty($this->
id)) {
584 $this->errors[] = $langs->trans(
"ErrorFieldRequired", $langs->transnoentitiesnoconv(
"Asset") .
' (' . $langs->transnoentitiesnoconv(
"TechnicalID") .
')');
587 if (empty($this->fk_asset_model)) {
588 $this->errors[] = $langs->trans(
"ErrorFieldRequired", $langs->transnoentitiesnoconv(
"AssetModel") .
' (' . $langs->transnoentitiesnoconv(
"TechnicalID") .
')');
599 require_once DOL_DOCUMENT_ROOT .
'/asset/class/assetdepreciationoptions.class.php';
601 $result = $options_model->fetchDeprecationOptions(0, $this->fk_asset_model);
603 $this->error = $options_model->error;
604 $this->errors = $options_model->errors;
606 } elseif ($result > 0) {
608 $result = $options->fetchDeprecationOptions($this->
id);
610 $this->error = $options->error;
611 $this->errors = $options->errors;
616 foreach ($options_model->deprecation_options as $mode_key => $fields) {
617 foreach ($fields as $field_key => $value) {
618 $options->deprecation_options[$mode_key][$field_key] = $value;
622 $result = $options->updateDeprecationOptions($user, $this->
id, 0, $notrigger);
624 $this->error = $options->error;
625 $this->errors = $options->errors;
634 require_once DOL_DOCUMENT_ROOT .
'/asset/class/assetaccountancycodes.class.php';
636 $result = $accountancy_codes_model->fetchAccountancyCodes(0, $this->fk_asset_model);
638 $this->error = $accountancy_codes_model->error;
639 $this->errors = $accountancy_codes_model->errors;
641 } elseif ($result > 0) {
643 $result = $accountancy_codes->fetchAccountancyCodes($this->
id);
645 $this->error = $accountancy_codes->error;
646 $this->errors = $accountancy_codes->errors;
651 foreach ($accountancy_codes_model->accountancy_codes as $mode_key => $fields) {
652 foreach ($fields as $field_key => $value) {
653 $accountancy_codes->accountancy_codes[$mode_key][$field_key] = $value;
657 $result = $accountancy_codes->updateAccountancyCodes($user, $this->
id, 0, $notrigger);
659 $this->error = $accountancy_codes->error;
660 $this->errors = $accountancy_codes->errors;
668 $this->db->rollback();
684 $langs->load(
'assets');
685 $this->depreciation_lines = array();
688 $this->
id = $this->
id > 0 ? $this->id : 0;
692 if (empty($this->
id)) {
693 $this->errors[] = $langs->trans(
"ErrorFieldRequired", $langs->transnoentitiesnoconv(
"Asset") .
' (' . $langs->transnoentitiesnoconv(
"TechnicalID") .
')');
715 $sql =
"SELECT ad.rowid, ad.depreciation_mode, ad.ref, ad.depreciation_date, ad.depreciation_ht, ad.cumulative_depreciation_ht";
716 $sql .=
", " . $this->db->ifsql(
'iab.fk_docdet IS NOT NULL', 1, 0) .
" AS bookkeeping";
717 $sql .=
" FROM " . MAIN_DB_PREFIX .
"asset_depreciation AS ad";
718 $sql .=
" LEFT JOIN (SELECT DISTINCT fk_docdet FROM " . MAIN_DB_PREFIX .
"accounting_bookkeeping WHERE doc_type = 'asset') AS iab ON iab.fk_docdet = ad.rowid";
719 $sql .=
" WHERE ad.fk_asset = " . (int) $this->
id;
720 $sql .=
" ORDER BY ad.depreciation_date ASC";
722 $resql = $this->db->query($sql);
724 $this->errors[] = $langs->trans(
'AssetErrorFetchDepreciationLines') .
': ' . $this->db->lasterror();
728 while ($obj = $this->db->fetch_object($resql)) {
729 if (!isset($this->depreciation_lines[$obj->depreciation_mode])) {
730 $this->depreciation_lines[$obj->depreciation_mode] = array();
732 $this->depreciation_lines[$obj->depreciation_mode][] = array(
735 'depreciation_date' => $this->db->jdate($obj->depreciation_date),
736 'depreciation_ht' => $obj->depreciation_ht,
737 'cumulative_depreciation_ht' => $obj->cumulative_depreciation_ht,
738 'bookkeeping' => $obj->bookkeeping,
753 $langs->load(
'assets');
756 $this->
id = $this->
id > 0 ? $this->id : 0;
760 if (empty($this->
id)) {
761 $this->errors[] = $langs->trans(
"ErrorFieldRequired", $langs->transnoentitiesnoconv(
"Asset") .
' (' . $langs->transnoentitiesnoconv(
"TechnicalID") .
')');
782 $sql =
"SELECT COUNT(*) AS has_bookkeeping";
783 $sql .=
" FROM " . MAIN_DB_PREFIX .
"asset_depreciation AS ad";
784 $sql .=
" LEFT JOIN (SELECT DISTINCT fk_docdet FROM " . MAIN_DB_PREFIX .
"accounting_bookkeeping WHERE doc_type = 'asset') AS iab ON iab.fk_docdet = ad.rowid";
785 $sql .=
" WHERE ad.fk_asset = " . (int) $this->
id;
786 $sql .=
" AND iab.fk_docdet IS NOT NULL";
788 $resql = $this->db->query($sql);
790 $this->errors[] = $langs->trans(
'AssetErrorFetchDepreciationLines') .
': ' . $this->db->lasterror();
794 if ($obj = $this->db->fetch_object($resql)) {
795 return $obj->has_bookkeeping > 0 ? 1 : 0;
813 public function addDepreciationLine($mode, $ref, $depreciation_date, $depreciation_ht, $cumulative_depreciation_ht, $accountancy_code_debit, $accountancy_code_credit)
816 $langs->load(
'assets');
819 $this->
id = $this->
id > 0 ? $this->id : 0;
820 $mode = strtolower(trim($mode));
822 $accountancy_code_debit = trim($accountancy_code_debit);
823 $accountancy_code_credit = trim($accountancy_code_credit);
827 if (empty($this->
id)) {
828 $this->errors[] = $langs->trans(
"ErrorFieldRequired", $langs->transnoentitiesnoconv(
"Asset") .
' (' . $langs->transnoentitiesnoconv(
"TechnicalID") .
')');
835 $sql =
"INSERT INTO " . MAIN_DB_PREFIX .
"asset_depreciation(fk_asset, depreciation_mode, ref, depreciation_date, depreciation_ht, cumulative_depreciation_ht, accountancy_code_debit, accountancy_code_credit)";
836 $sql .=
" VALUES ( ";
837 $sql .=
" " . (int) $this->
id;
838 $sql .=
", '" . $this->db->escape($mode) .
"'";
839 $sql .=
", '" . $this->db->escape($ref) .
"'";
840 $sql .=
", '" . $this->db->idate($depreciation_date) .
"'";
841 $sql .=
", " . (float) $depreciation_ht;
842 $sql .=
", " . (float) $cumulative_depreciation_ht;
843 $sql .=
", '" . $this->db->escape($accountancy_code_debit) .
"'";
844 $sql .=
", '" . $this->db->escape($accountancy_code_credit) .
"'";
847 $resql = $this->db->query($sql);
849 $this->errors[] = $langs->trans(
'AssetErrorAddDepreciationLine') .
': ' . $this->db->lasterror();
863 global
$conf, $langs;
864 $langs->load(
'assets');
867 $this->
id = $this->
id > 0 ? $this->id : 0;
871 if (empty($this->
id)) {
872 $this->errors[] = $langs->trans(
"ErrorFieldRequired", $langs->transnoentitiesnoconv(
"Asset") .
' (' . $langs->transnoentitiesnoconv(
"TechnicalID") .
')');
879 if (! empty($this->not_depreciated)) {
885 require_once DOL_DOCUMENT_ROOT .
'/asset/class/assetdepreciationoptions.class.php';
887 $result = $options->fetchDeprecationOptions($this->
id);
889 $this->error = $options->error;
890 $this->errors = $options->errors;
896 require_once DOL_DOCUMENT_ROOT .
'/asset/class/assetaccountancycodes.class.php';
898 $result = $accountancy_codes->fetchAccountancyCodes($this->
id);
900 $this->error = $accountancy_codes->error;
901 $this->errors = $accountancy_codes->errors;
909 foreach ($options->deprecation_options as $mode_key => $fields) {
910 $modes[$mode_key] = $this->db->escape($mode_key);
912 $sql =
"DELETE FROM " . MAIN_DB_PREFIX .
"asset_depreciation";
913 $sql .=
" WHERE fk_asset = " . (int) $this->
id;
914 $sql .=
" AND depreciation_mode NOT IN ('" . $this->db->sanitize(implode(
"', '", $modes)) .
"')";
916 $resql = $this->db->query($sql);
918 $this->errors[] = $langs->trans(
'AssetErrorClearDepreciationLines') .
': ' . $this->db->lasterror();
924 require_once DOL_DOCUMENT_ROOT .
'/core/lib/date.lib.php';
925 require_once DOL_DOCUMENT_ROOT .
'/core/lib/accounting.lib.php';
928 $init_fiscal_period_start = $dates[
'date_start'];
929 $init_fiscal_period_end = $dates[
'date_end'];
930 if (empty($init_fiscal_period_start) || empty($init_fiscal_period_end)) {
931 $pastmonthyear = $dates[
'pastmonthyear'];
932 $pastmonth = $dates[
'pastmonth'];
933 $init_fiscal_period_start =
dol_get_first_day($pastmonthyear, $pastmonth,
false);
934 $init_fiscal_period_end =
dol_get_last_day($pastmonthyear, $pastmonth,
false);
937 foreach ($options->deprecation_options as $mode_key => $fields) {
958 $sql =
"SELECT ad.depreciation_date, ad.cumulative_depreciation_ht";
959 $sql .=
" FROM " . MAIN_DB_PREFIX .
"asset_depreciation AS ad";
960 $sql .=
" LEFT JOIN (SELECT DISTINCT fk_docdet FROM " . MAIN_DB_PREFIX .
"accounting_bookkeeping WHERE doc_type = 'asset') AS iab ON iab.fk_docdet = ad.rowid";
961 $sql .=
" WHERE ad.fk_asset = " . (int) $this->
id;
962 $sql .=
" AND ad.depreciation_mode = '" . $this->db->escape($mode_key) .
"'";
963 $sql .=
" AND iab.fk_docdet IS NOT NULL";
964 $sql .=
" ORDER BY ad.depreciation_date DESC";
967 $resql = $this->db->query($sql);
969 $this->errors[] = $langs->trans(
'AssetErrorFetchMaxDepreciationDateForMode', $mode_key) .
': ' . $this->db->lasterror();
973 $last_depreciation_date =
'';
974 $last_cumulative_depreciation_ht = $this->reversal_amount_ht;
975 if ($obj = $this->db->fetch_object($resql)) {
976 $last_depreciation_date = $this->db->jdate($obj->depreciation_date);
977 $last_cumulative_depreciation_ht = $obj->cumulative_depreciation_ht;
981 $sql =
"UPDATE " . MAIN_DB_PREFIX . $options->deprecation_options_fields[$mode_key][
'table'];
982 $sql .=
" SET total_amount_last_depreciation_ht = " . (empty($last_cumulative_depreciation_ht) ? 0 : $last_cumulative_depreciation_ht);
983 $sql .=
" WHERE fk_asset = " . (int) $this->
id;
984 $resql = $this->db->query($sql);
986 $this->errors[] = $langs->trans(
'AssetErrorSetLastCumulativeDepreciation') .
': ' . $this->db->lasterror();
992 $sql =
"DELETE FROM " . MAIN_DB_PREFIX .
"asset_depreciation";
993 $sql .=
" WHERE fk_asset = " . (int) $this->
id;
994 $sql .=
" AND depreciation_mode = '" . $this->db->escape($mode_key) .
"'";
995 $sql .=
" AND NOT EXISTS (SELECT fk_docdet FROM " . MAIN_DB_PREFIX .
"accounting_bookkeeping WHERE doc_type = 'asset' AND fk_docdet = " . MAIN_DB_PREFIX .
"asset_depreciation.rowid)";
996 if ($last_depreciation_date !==
"") {
997 $sql .=
" AND ref <> ''";
999 $resql = $this->db->query($sql);
1001 $this->errors[] = $langs->trans(
'AssetErrorClearDepreciationLines') .
': ' . $this->db->lasterror();
1007 $depreciation_date_start = $this->date_start > $this->date_acquisition ? $this->date_start : $this->date_acquisition;
1008 $depreciation_date_end =
dol_time_plus_duree(
dol_time_plus_duree((
int) $depreciation_date_start, $fields[
'duration'], $fields[
'duration_type'] == 1 ?
'm' : ($fields[
'duration_type'] == 2 ?
'd' :
'y')), -1,
'd');
1009 $depreciation_amount = $fields[
'amount_base_depreciation_ht'];
1010 if ($fields[
'duration_type'] == 2) {
1011 $fiscal_period_start = $depreciation_date_start;
1012 $fiscal_period_end = $depreciation_date_start;
1013 } elseif ($fields[
'duration_type'] == 1) {
1014 $date_temp =
dol_getdate((
int) $depreciation_date_start);
1015 $fiscal_period_start =
dol_get_first_day($date_temp[
'year'], $date_temp[
'mon'],
false);
1016 $fiscal_period_end =
dol_get_last_day($date_temp[
'year'], $date_temp[
'mon'],
false);
1018 $fiscal_period_start = $init_fiscal_period_start;
1019 $fiscal_period_end = $init_fiscal_period_end;
1021 $cumulative_depreciation_ht = (float) $last_cumulative_depreciation_ht;
1022 $depreciation_period_amount = $depreciation_amount - (float) $this->reversal_amount_ht;
1023 $start_date = $depreciation_date_start;
1024 $disposal_date = isset($this->disposal_date) && $this->disposal_date !==
"" ? $this->disposal_date :
"";
1025 $finish_date = $disposal_date !==
"" ? $disposal_date : $depreciation_date_end;
1026 $accountancy_code_depreciation_debit_key = $accountancy_codes->accountancy_codes_fields[$mode_key][
'depreciation_debit'];
1027 $accountancy_code_depreciation_debit = $accountancy_codes->accountancy_codes[$mode_key][$accountancy_code_depreciation_debit_key];
1028 $accountancy_code_depreciation_credit_key = $accountancy_codes->accountancy_codes_fields[$mode_key][
'depreciation_credit'];
1029 $accountancy_code_credit = $accountancy_codes->accountancy_codes[$mode_key][$accountancy_code_depreciation_credit_key];
1033 if ($last_depreciation_date ===
"" && ($depreciation_date_start < $fiscal_period_start || is_numeric($this->reversal_date))) {
1034 if (is_numeric($this->reversal_date)) {
1035 if ($this->reversal_date < $fiscal_period_start) {
1036 $this->errors[] = $langs->trans(
'AssetErrorReversalDateNotGreaterThanCurrentBeginFiscalDateForMode', $mode_key);
1041 if (empty($this->reversal_amount_ht)) {
1042 $this->errors[] = $langs->trans(
'AssetErrorReversalAmountNotProvidedForMode', $mode_key);
1047 $start_date = $this->reversal_date;
1048 $result = $this->
addDepreciationLine($mode_key,
'', $start_date, $this->reversal_amount_ht, $this->reversal_amount_ht, $accountancy_code_depreciation_debit, $accountancy_code_credit);
1054 $this->errors[] = $langs->trans(
'AssetErrorReversalDateNotProvidedForMode', $mode_key);
1062 $nb_days_in_year =
getDolGlobalInt(
'ASSET_DEPRECIATION_DURATION_PER_YEAR', 360);
1063 $nb_days_in_month =
getDolGlobalInt(
'ASSET_DEPRECIATION_DURATION_PER_MONTH', 30);
1064 $period_amount = (float) ($fields[
'duration'] > 0 ?
price2num($depreciation_period_amount / $fields[
'duration'],
'MT') : 0);
1065 $first_period_found =
false;
1067 $first_period_date = isset($begin_period) && $begin_period > $fiscal_period_start ? $begin_period : $fiscal_period_start;
1069 $ref_date_format =
"%Y" . ($fields[
'duration_type'] == 1 || $fields[
'duration_type'] == 2 ?
'-%m' :
'') . ($fields[
'duration_type'] == 2 ?
'-%d' :
'');
1073 $max_loop = $fields[
'duration'] + 2;
1077 if ($idx_loop > $max_loop) {
1081 if ($last_depreciation_date < $fiscal_period_end && ($first_period_date <= $start_date || $first_period_found)) {
1083 if ($fiscal_period_start <= $disposal_date && $disposal_date <= $fiscal_period_end && empty($this->disposal_depreciated)) {
1087 $first_period_found =
true;
1089 $period_begin =
dol_print_date($fiscal_period_start, $ref_date_format);
1090 $period_end =
dol_print_date($fiscal_period_end, $ref_date_format);
1091 $ref = $period_begin . ($period_begin != $period_end ?
' - ' . $period_end :
'');
1092 if ($fiscal_period_start <= $disposal_date && $disposal_date <= $fiscal_period_end) {
1093 $ref .=
' - ' . $langs->transnoentitiesnoconv(
'AssetDisposal');
1096 $begin_date = $fiscal_period_start < $start_date && $start_date <= $fiscal_period_end ? $start_date : $fiscal_period_start;
1097 $end_date = $fiscal_period_start < $finish_date && $finish_date <= $fiscal_period_end ? $finish_date : $fiscal_period_end;
1098 if ($fields[
'duration_type'] == 2) {
1099 $depreciation_ht = $period_amount;
1100 } elseif ($fields[
'duration_type'] == 1) {
1101 $nb_days = min($nb_days_in_month,
num_between_day($begin_date, $end_date, 1));
1102 if ($nb_days >= 28) {
1104 if ($date_temp[
'mon'] == 2) {
1108 $depreciation_ht = (float)
price2num($period_amount * $nb_days / $nb_days_in_month,
'MT');
1111 if (($nb_days_real > 366) || (
num_between_day($fiscal_period_start, $fiscal_period_end, 1) < $nb_days_in_year)) {
1112 $nb_days = $nb_days_real;
1114 $nb_days = min($nb_days_in_year, $nb_days_real);
1116 $depreciation_ht = (float)
price2num($period_amount * $nb_days / $nb_days_in_year,
'MT');
1119 if ($idx_loop < $max_loop) {
1120 $depreciation_ht = ceil($depreciation_ht);
1124 if ($fiscal_period_start <= $depreciation_date_end && $depreciation_date_end <= $fiscal_period_end) {
1125 $depreciation_ht = (float)
price2num($depreciation_amount - (
float) $cumulative_depreciation_ht,
'MT');
1126 $cumulative_depreciation_ht = $depreciation_amount;
1128 $cumulative_depreciation_ht += $depreciation_ht;
1131 $result = $this->
addDepreciationLine($mode_key, $ref, $fiscal_period_end, $depreciation_ht, $cumulative_depreciation_ht, $accountancy_code_depreciation_debit, $accountancy_code_credit);
1141 if ($fields[
'duration_type'] == 2) {
1142 $fiscal_period_end = $fiscal_period_start;
1143 } elseif ($fields[
'duration_type'] == 1) {
1146 $fiscal_period_end = $dates_fiscal_period[
'date_end'];
1148 $last_period_date = $disposal_date !==
"" && $disposal_date < $depreciation_date_end ? $disposal_date : $depreciation_date_end;
1149 }
while ($fiscal_period_start < $last_period_date);
1158 $this->db->rollback();
1161 $this->db->commit();
1175 $langs->load(
'assets');
1178 $asset_depreciation_id = $asset_depreciation_id > 0 ? $asset_depreciation_id : 0;
1182 if (empty($asset_depreciation_id)) {
1183 $this->errors[] = $langs->trans(
"ErrorFieldRequired", $langs->transnoentitiesnoconv(
"AssetDepreciation") .
' (' . $langs->transnoentitiesnoconv(
"TechnicalID") .
')');
1192 require_once DOL_DOCUMENT_ROOT .
'/asset/class/assetdepreciationoptions.class.php';
1197 $sql =
"SELECT fk_asset, depreciation_mode, cumulative_depreciation_ht";
1198 $sql .=
" FROM " . MAIN_DB_PREFIX .
"asset_depreciation";
1199 $sql .=
" WHERE rowid = " . (int) $asset_depreciation_id;
1200 $resql = $this->db->query($sql);
1202 $this->errors[] = $langs->trans(
'AssetErrorFetchCumulativeDepreciation') .
': ' . $this->db->lasterror();
1205 if ($obj = $this->db->fetch_object($resql)) {
1206 $mode_key = $obj->depreciation_mode;
1207 if (!empty($options->deprecation_options_fields[$mode_key])) {
1208 $sql =
"UPDATE " . MAIN_DB_PREFIX . $options->deprecation_options_fields[$mode_key][
'table'];
1209 $sql .=
" SET total_amount_last_depreciation_ht = " . $obj->cumulative_depreciation_ht;
1210 $sql .=
" WHERE fk_asset = " . (int) $obj->fk_asset;
1211 $resql = $this->db->query($sql);
1213 $this->errors[] = $langs->trans(
'AssetErrorSetLastCumulativeDepreciation') .
': ' . $this->db->lasterror();
1221 $this->db->rollback();
1224 $this->db->commit();
1237 public function dispose($user, $disposal_invoice_id, $notrigger = 0)
1239 global
$conf, $langs;
1242 if ($this->
status != self::STATUS_DRAFT || $this->
status == self::STATUS_DISPOSED) {
1248 $required_fields = array(
'disposal_date',
'disposal_date',
'fk_disposal_type');
1249 foreach ($required_fields as $field) {
1250 $this->fields[$field][
'notnull'] = 1;
1252 $result = $this->
update($user, 1);
1253 foreach ($required_fields as $field) {
1254 $this->fields[$field][
'notnull'] = 0;
1257 if ($disposal_invoice_id > 0) {
1260 $result = $this->
setStatusCommon($user, self::STATUS_DISPOSED, $notrigger,
'ASSET_DISPOSED');
1267 $this->db->rollback();
1269 $this->db->commit();
1274 if (method_exists($this,
'generateDocument')) {
1275 global $hidedetails, $hidedesc, $hideref;
1276 $outputlangs = $langs;
1279 $newlang =
GETPOST(
'lang_id',
'aZ09');
1282 $newlang = $this->thirdparty->default_lang;
1284 if (!empty($newlang)) {
1286 $outputlangs->setDefaultLang($newlang);
1288 $model = $this->model_pdf;
1289 $ret = $this->
fetch($this->
id);
1291 $this->generateDocument($model, $outputlangs, $hidedetails, $hidedesc, $hideref);
1305 public function reopen($user, $notrigger = 0)
1307 global
$conf, $langs;
1310 if ($this->
status != self::STATUS_DISPOSED || $this->
status == self::STATUS_DRAFT) {
1317 $this->disposal_date =
null;
1318 $this->disposal_amount_ht =
null;
1319 $this->fk_disposal_type =
null;
1320 $this->disposal_depreciated = 0;
1321 $this->disposal_subject_to_vat = 0;
1322 $result = $this->
update($user, 1);
1325 $result = $this->
setStatusCommon($user, self::STATUS_DRAFT, $notrigger,
'ASSET_REOPEN');
1332 $this->db->rollback();
1334 $this->db->commit();
1339 if (method_exists($this,
'generateDocument')) {
1340 global $hidedetails, $hidedesc, $hideref;
1341 $outputlangs = $langs;
1344 $newlang =
GETPOST(
'lang_id',
'aZ09');
1347 $newlang = $this->thirdparty->default_lang;
1349 if (!empty($newlang)) {
1351 $outputlangs->setDefaultLang($newlang);
1353 $model = $this->model_pdf;
1354 $ret = $this->
fetch($this->
id);
1356 $this->generateDocument($model, $outputlangs, $hidedetails, $hidedesc, $hideref);
1374 public function getNomUrl($withpicto = 0, $option =
'', $maxlen = 0, $notooltip = 0, $morecss =
'', $save_lastsearch_value = -1)
1376 global $db,
$conf, $langs, $hookmanager;
1377 global $dolibarr_main_authentication, $dolibarr_main_demo;
1378 global $menumanager;
1380 if (!empty(
$conf->dol_no_mouse_hover)) {
1386 $label =
img_picto(
'', $this->picto).
' <u>'.$langs->trans(
"Asset").
'</u>';
1387 if (isset($this->
status)) {
1388 $label .=
' '.$this->getLibStatut(5);
1391 $label .=
'<b>'.$langs->trans(
'Ref').
':</b> '.$this->ref;
1393 $url =
dol_buildpath(
'/asset/card.php', 1).
'?id='.$this->id;
1395 if ($option !=
'nolink') {
1397 $add_save_lastsearch_values = ($save_lastsearch_value == 1 ? 1 : 0);
1398 if ($save_lastsearch_value == -1 && isset($_SERVER[
"PHP_SELF"]) && preg_match(
'/list\.php/', $_SERVER[
"PHP_SELF"])) {
1399 $add_save_lastsearch_values = 1;
1401 if ($add_save_lastsearch_values) {
1402 $url .=
'&save_lastsearch_values=1';
1407 if (empty($notooltip)) {
1409 $label = $langs->trans(
"ShowAsset");
1410 $linkclose .=
' alt="'.dolPrintHTMLForAttribute($label).
'"';
1412 $linkclose .=
' title="'.dolPrintHTMLForAttribute($label).
'"';
1413 $linkclose .=
' class="classfortooltip'.($morecss ?
' '.$morecss :
'').
'"';
1415 $linkclose = ($morecss ?
' class="'.$morecss.
'"' :
'');
1418 if ($option ==
'nolink') {
1419 $linkstart =
'<span';
1421 $linkstart =
'<a href="'.$url.
'"';
1423 $linkstart .= $linkclose.
'>';
1424 if ($option ==
'nolink') {
1425 $linkend =
'</span>';
1430 $result .= $linkstart;
1432 if (empty($this->showphoto_on_popup)) {
1434 $result .=
img_object(($notooltip ?
'' : $label), ($this->picto ? $this->picto :
'generic'), ($notooltip ? (($withpicto != 2) ?
'class="paddingright"' :
'') :
'class="'.(($withpicto != 2) ?
'paddingright ' :
'').
'classfortooltip"'), 0, 0, $notooltip ? 0 : 1);
1438 require_once DOL_DOCUMENT_ROOT.
'/core/lib/files.lib.php';
1440 list($class, $module) = explode(
'@', $this->picto);
1443 $filename = $filearray[0][
'name'];
1444 if (!empty($filename)) {
1445 $pospoint = strpos($filearray[0][
'name'],
'.');
1447 $pathtophoto = $class.
'/'.$this->
ref.
'/thumbs/'.substr($filename, 0, $pospoint).
'_mini'.substr($filename, $pospoint);
1448 if (!
getDolGlobalString(strtoupper($module.
'_'.$class).
'_FORMATLISTPHOTOSASUSERS')) {
1449 $result .=
'<div class="floatleft inline-block valignmiddle divphotoref"><div class="photoref"><img class="photo'.$module.
'" alt="No photo" border="0" src="'.DOL_URL_ROOT.
'/viewimage.php?modulepart='.$module.
'&entity='.
$conf->entity.
'&file='.urlencode($pathtophoto).
'"></div></div>';
1451 $result .=
'<div class="floatleft inline-block valignmiddle divphotoref"><img class="photouserphoto userphoto" alt="No photo" border="0" src="'.DOL_URL_ROOT.
'/viewimage.php?modulepart='.$module.
'&entity='.
$conf->entity.
'&file='.urlencode($pathtophoto).
'"></div>';
1454 $result .=
'</div>';
1456 $result .=
img_object(($notooltip ?
'' : $label), ($this->picto ? $this->picto :
'generic'), ($notooltip ? (($withpicto != 2) ?
'class="paddingright"' :
'') :
'class="'.(($withpicto != 2) ?
'paddingright ' :
'').
'classfortooltip"'), 0, 0, $notooltip ? 0 : 1);
1461 if ($withpicto != 2) {
1463 if ($option ==
'label') {
1464 $name = $this->label;
1465 } elseif ($option ==
'with_label') {
1466 $name .=
' - ' . $this->label;
1471 $result .= $linkend;
1475 $hookmanager->initHooks(array($this->element .
'dao'));
1476 $parameters = array(
'id' => $this->
id,
'getnomurl' => &$result);
1477 $reshook = $hookmanager->executeHooks(
'getNomUrl', $parameters, $this, $action);
1479 $result = $hookmanager->resPrint;
1481 $result .= $hookmanager->resPrint;
1519 if (empty($this->labelStatus) || empty($this->labelStatusShort)) {
1522 $this->labelStatus[self::STATUS_DRAFT] = $langs->transnoentitiesnoconv(
'AssetInProgress');
1523 $this->labelStatus[self::STATUS_DISPOSED] = $langs->transnoentitiesnoconv(
'AssetDisposed');
1524 $this->labelStatusShort[self::STATUS_DRAFT] = $langs->transnoentitiesnoconv(
'AssetInProgress');
1525 $this->labelStatusShort[self::STATUS_DISPOSED] = $langs->transnoentitiesnoconv(
'AssetDisposed');
1528 $statusType =
'status4';
1529 if ($status == self::STATUS_DISPOSED) {
1530 $statusType =
'status6';
1533 return dolGetStatus($this->labelStatus[$status], $this->labelStatusShort[$status],
'', $statusType, $mode);
1544 $sql =
"SELECT rowid, date_creation as datec, tms as datem,";
1545 $sql .=
" fk_user_creat, fk_user_modif";
1546 $sql .=
" FROM ".MAIN_DB_PREFIX.$this->table_element.
" as t";
1547 $sql .=
" WHERE t.rowid = ".((int) $id);
1549 $result = $this->db->query($sql);
1551 if ($this->db->num_rows($result)) {
1552 $obj = $this->db->fetch_object($result);
1553 $this->
id = $obj->rowid;
1555 $this->user_creation_id = $obj->fk_user_creat;
1556 $this->user_modification_id = $obj->fk_user_modif;
1557 $this->date_creation = $this->db->jdate($obj->datec);
1558 $this->date_modification = $this->db->jdate($obj->datem);
1561 $this->db->free($result);
1589 global $langs,
$conf;
1590 $langs->load(
"assets");
1593 $conf->global->ASSET_ASSET_ADDON =
'mod_asset_standard';
1603 $dirmodels = array_merge(array(
'/'), (array)
$conf->modules_parts[
'models']);
1604 foreach ($dirmodels as $reldir) {
1608 $mybool = ((bool) @include_once $dir.$file) || $mybool;
1616 if (class_exists($classname)) {
1617 $obj =
new $classname();
1619 '@phan-var-force ModeleNumRefAsset $obj';
1621 $numref = $obj->getNextValue($this);
1623 if ($numref !=
'' && $numref !=
'-1') {
1626 $this->error = $obj->error;
1631 print $langs->trans(
"Error").
" ".$langs->trans(
"ClassNotFound").
' '.$classname;
1635 print $langs->trans(
"ErrorNumberingModuleNotSetup", $this->element);
getCurrentPeriodOfFiscalYear($db, $conf, $from_time=null, $gm='tzserver', $withenddateonly=1)
Get current period of fiscal year?
Class for AssetAccountancyCodes.
Class for AssetDepreciationOptions.
getNomUrl($withpicto=0, $option='', $maxlen=0, $notooltip=0, $morecss='', $save_lastsearch_value=-1)
Return a link to the object card (with optionally the picto)
hasDepreciationLinesInBookkeeping()
If has depreciation lines in bookkeeping.
dispose($user, $disposal_invoice_id, $notrigger=0)
Set dispose status.
createFromClone(User $user, $fromid)
Clone an object into another one.
calculationDepreciation()
Calculation depreciation lines (reversal and future) for each mode.
__construct(DoliDB $db)
Constructor.
create(User $user, $notrigger=0)
Create object into database.
info($id)
Load the info information in the object.
getLabelStatus($mode=0)
Return the label of the status.
fetchAll($sortorder='', $sortfield='', $limit=0, $offset=0, $filter='', $filtermode='AND')
Load list of objects in memory from the database.
fetch($id, $ref=null)
Load object in memory from the database.
LibStatut($status, $mode=0)
Return the status.
reopen($user, $notrigger=0)
Set back to validated status.
getLibStatut($mode=0)
Return the label of the status.
initAsSpecimen()
Initialise object with example values Id must be 0 if object instance is a specimen.
addDepreciationLine($mode, $ref, $depreciation_date, $depreciation_ht, $cumulative_depreciation_ht, $accountancy_code_debit, $accountancy_code_credit)
Add depreciation line for a mode.
fetchDepreciationLines()
Fetch depreciation lines for each mode in $this->depreciation_lines (sort by depreciation date)
setLastCumulativeDepreciation($asset_depreciation_id)
Set last cumulative depreciation for each mode.
update(User $user, $notrigger=0)
Update object into database.
setDataFromAssetModel(User $user, $notrigger=0)
Set asset model.
getNextNumRef()
Returns the reference to the following non used object depending on the active numbering module.
Parent class of all other business classes (invoices, contracts, proposals, orders,...
add_object_linked($origin=null, $origin_id=null, $f_user=null, $notrigger=0)
Add an object link into llx_element_element.
deleteObjectLinked($sourceid=null, $sourcetype='', $targetid=null, $targettype='', $rowid=0, $f_user=null, $notrigger=0)
Delete all links between an object $this.
createCommon(User $user, $notrigger=0)
Create object in the database.
getFieldList($alias='', $excludefields=array())
Function to concat keys of fields.
updateCommon(User $user, $notrigger=0)
Update object into database.
setStatusCommon($user, $status, $notrigger=0, $triggercode='')
Set to a status.
initAsSpecimenCommon()
Initialise object with example values Id must be 0 if object instance is a specimen.
fetchCommon($id, $ref=null, $morewhere='', $noextrafields=0)
Load object in memory from the database.
deleteCommon(User $user, $notrigger=0, $forcechilddeletion=0)
Delete object in database.
Class to manage Dolibarr database access.
Class to manage translations.
Class to manage Dolibarr users.
print $langs trans("Ref").' m titre as m m statut as status
Or an array listing all the potential status of the object: array: int of the status => translated la...
dol_get_first_day($year, $month=1, $gm=false)
Return GMT time for first day of a month or year.
num_between_day($timestampStart, $timestampEnd, $lastday=0)
Function to return number of days between two dates (date must be UTC date !) Example: 2012-01-01 201...
dol_time_plus_duree($time, $duration_value, $duration_unit, $ruleforendofmonth=0)
Add a delay to a date.
dol_get_last_day($year, $month=12, $gm=false)
Return GMT time for last day of a month or year.
dol_dir_list($utf8_path, $types="all", $recursive=0, $filter="", $excludefilter=null, $sortcriteria="name", $sortorder=SORT_ASC, $mode=0, $nohook=0, $relativename="", $donotfollowsymlinks=0, $nbsecondsold=0)
Scan a directory and return a list of files/directories.
img_picto($titlealt, $picto, $moreatt='', $pictoisfullpath=0, $srconly=0, $notitle=0, $alt='', $morecss='', $marginleftonlyshort=2, $allowothertags=array())
Show picto whatever it's its name (generic function)
price2num($amount, $rounding='', $option=0)
Function that return a number with universal decimal format (decimal separator is '.
img_object($titlealt, $picto, $moreatt='', $pictoisfullpath=0, $srconly=0, $notitle=0, $allowothertags=array())
Show a picto called object_picto (generic function)
forgeSQLFromUniversalSearchCriteria($filter, &$errorstr='', $noand=0, $nopar=0, $noerror=0)
forgeSQLFromUniversalSearchCriteria
getDolGlobalInt($key, $default=0)
Return a Dolibarr global constant int value.
dol_print_date($time, $format='', $tzoutput='auto', $outputlangs=null, $encodetooutput=false)
Output date in a string format according to outputlangs (or langs if not defined).
dolGetStatus($statusLabel='', $statusLabelShort='', $html='', $statusType='status0', $displayMode=0, $url='', $params=array())
Output the badge of a status.
GETPOST($paramname, $check='alphanohtml', $method=0, $filter=null, $options=null, $noreplace=0)
Return value of a param into GET or POST supervariable.
dol_buildpath($path, $type=0, $returnemptyifnotfound=0)
Return path of url or filesystem.
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_sanitizeFileName($str, $newstr='_', $unaccent=1, $includequotes=0)
Clean a string to use it as a file name.
getDolGlobalString($key, $default='')
Return a Dolibarr global constant string value.
dol_syslog($message, $level=LOG_INFO, $ident=0, $suffixinfilename='', $restricttologhandler='', $logcontext=null)
Write log message into outputs.
dol_getdate($timestamp, $fast=false, $forcetimezone='')
Return an array with locale date info.
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...
global $conf
The following vars must be defined: $type2label $form $conf, $lang, The following vars may also be de...