25 require_once DOL_DOCUMENT_ROOT.
'/core/class/commonobject.class.php';
35 public $module =
'asset';
40 public $element =
'asset';
45 public $table_element =
'asset';
51 public $ismultientitymanaged = 1;
56 public $isextrafieldmanaged = 1;
61 public $picto =
'asset';
63 const STATUS_DRAFT = 0;
64 const STATUS_DISPOSED = 9;
98 'rowid' => array(
'type'=>
'integer',
'label'=>
'TechnicalID',
'enabled'=>
'1',
'position'=>1,
'notnull'=>1,
'visible'=>0,
'noteditable'=>
'1',
'index'=>1,
'css'=>
'left',
'comment'=>
"Id"),
99 '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"),
100 'label' => array(
'type'=>
'varchar(255)',
'label'=>
'Label',
'enabled'=>
'1',
'position'=>30,
'notnull'=>1,
'visible'=>1,
'searchall'=>1,
'css'=>
'minwidth300',
'cssview'=>
'wordbreak',
'showoncombobox'=>
'2',
'validate'=>
'1',),
101 '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',),
102 'qty' => array(
'type'=>
'real',
'label'=>
'Qty',
'enabled'=>
'1',
'position'=>50,
'notnull'=>1,
'visible'=>0,
'default'=>
'1',
'isameasure'=>
'1',
'css'=>
'maxwidth75imp',
'validate'=>
'1',),
103 'acquisition_type' => array(
'type'=>
'smallint',
'label'=>
'AssetAcquisitionType',
'enabled'=>
'1',
'position'=>60,
'notnull'=>1,
'visible'=>1,
'arrayofkeyval'=>array(
'0'=>
'AssetAcquisitionTypeNew',
'1'=>
'AssetAcquisitionTypeOccasion'),
'validate'=>
'1',),
104 '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',),
105 'not_depreciated' => array(
'type'=>
'boolean',
'label'=>
'AssetNotDepreciated',
'enabled'=>
'1',
'position'=>80,
'notnull'=>0,
'default'=>
'0',
'visible'=>1,
'validate'=>
'1',),
106 'date_acquisition' => array(
'type'=>
'date',
'label'=>
'AssetDateAcquisition',
'enabled'=>
'1',
'position'=>90,
'notnull'=>1,
'visible'=>1,),
107 'date_start' => array(
'type'=>
'date',
'label'=>
'AssetDateStart',
'enabled'=>
'1',
'position'=>100,
'notnull'=>0,
'visible'=>-1,),
108 'acquisition_value_ht' => array(
'type'=>
'price',
'label'=>
'AssetAcquisitionValueHT',
'enabled'=>
'1',
'position'=>110,
'notnull'=>1,
'visible'=>1,
'isameasure'=>
'1',
'validate'=>
'1',),
109 'recovered_vat' => array(
'type'=>
'price',
'label'=>
'AssetRecoveredVAT',
'enabled'=>
'1',
'position'=>120,
'notnull'=>0,
'visible'=>1,
'isameasure'=>
'1',
'validate'=>
'1',),
110 'reversal_date' => array(
'type'=>
'date',
'label'=>
'AssetReversalDate',
'enabled'=>
'1',
'position'=>130,
'notnull'=>0,
'visible'=>1,),
111 'reversal_amount_ht' => array(
'type'=>
'price',
'label'=>
'AssetReversalAmountHT',
'enabled'=>
'1',
'position'=>140,
'notnull'=>0,
'visible'=>1,
'isameasure'=>
'1',
'validate'=>
'1',),
112 'disposal_date' => array(
'type'=>
'date',
'label'=>
'AssetDisposalDate',
'enabled'=>
'1',
'position'=>200,
'notnull'=>0,
'visible'=>-2,),
113 'disposal_amount_ht' => array(
'type'=>
'price',
'label'=>
'AssetDisposalAmount',
'enabled'=>
'1',
'position'=>210,
'notnull'=>0,
'visible'=>-2,
'default'=>
'0',
'isameasure'=>
'1',
'validate'=>
'1',),
114 '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',),
115 'disposal_depreciated' => array(
'type'=>
'boolean',
'label'=>
'AssetDisposalDepreciated',
'enabled'=>
'1',
'position'=>230,
'notnull'=>0,
'default'=>
'0',
'visible'=>-2,
'validate'=>
'1',),
116 'disposal_subject_to_vat' => array(
'type'=>
'boolean',
'label'=>
'AssetDisposalSubjectToVat',
'enabled'=>
'1',
'position'=>240,
'notnull'=>0,
'default'=>
'0',
'visible'=>-2,
'validate'=>
'1',),
117 'note_public' => array(
'type'=>
'html',
'label'=>
'NotePublic',
'enabled'=>
'1',
'position'=>300,
'notnull'=>0,
'visible'=>0,
'validate'=>
'1',),
118 'note_private' => array(
'type'=>
'html',
'label'=>
'NotePrivate',
'enabled'=>
'1',
'position'=>301,
'notnull'=>0,
'visible'=>0,
'validate'=>
'1',),
119 'date_creation' => array(
'type'=>
'datetime',
'label'=>
'DateCreation',
'enabled'=>
'1',
'position'=>500,
'notnull'=>1,
'visible'=>-2,),
120 'tms' => array(
'type'=>
'timestamp',
'label'=>
'DateModification',
'enabled'=>
'1',
'position'=>501,
'notnull'=>0,
'visible'=>-2,),
121 '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',),
122 'fk_user_modif' => array(
'type'=>
'integer:User:user/class/user.class.php',
'label'=>
'UserModif',
'enabled'=>
'1',
'position'=>511,
'notnull'=>-1,
'visible'=>-2,),
123 'last_main_doc' => array(
'type'=>
'varchar(255)',
'label'=>
'LastMainDoc',
'enabled'=>
'1',
'position'=>600,
'notnull'=>0,
'visible'=>0,),
124 'import_key' => array(
'type'=>
'varchar(14)',
'label'=>
'ImportId',
'enabled'=>
'1',
'position'=>1000,
'notnull'=>-1,
'visible'=>-2,),
125 'model_pdf' => array(
'type'=>
'varchar(255)',
'label'=>
'Model pdf',
'enabled'=>
'1',
'position'=>1010,
'notnull'=>-1,
'visible'=>0,),
126 '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',),
131 public $fk_asset_model;
132 public $reversal_amount_ht;
133 public $acquisition_value_ht;
134 public $recovered_vat;
135 public $reversal_date;
136 public $date_acquisition;
139 public $acquisition_type;
141 public $not_depreciated;
142 public $disposal_date;
143 public $disposal_amount_ht;
144 public $fk_disposal_type;
145 public $disposal_depreciated;
146 public $disposal_subject_to_vat;
147 public $supplier_invoice_id;
149 public $note_private;
150 public $date_creation;
152 public $fk_user_creat;
153 public $fk_user_modif;
154 public $last_main_doc;
158 public $user_cloture_id;
178 public $asset_depreciation_options;
182 public $depreciation_lines = array();
191 global $conf, $langs;
195 if (empty($conf->global->MAIN_SHOW_TECHNICAL_ID) && isset($this->fields[
'rowid'])) {
196 $this->fields[
'rowid'][
'visible'] = 0;
198 if (empty($conf->multicompany->enabled) && isset($this->fields[
'entity'])) {
199 $this->fields[
'entity'][
'enabled'] = 0;
203 foreach ($this->fields as $key => $val) {
204 if (isset($val[
'enabled']) && empty($val[
'enabled'])) {
205 unset($this->fields[$key]);
210 if (is_object($langs)) {
211 foreach ($this->fields as $key => $val) {
212 if (!empty($val[
'arrayofkeyval']) && is_array($val[
'arrayofkeyval'])) {
213 foreach ($val[
'arrayofkeyval'] as $key2 => $val2) {
214 $this->fields[$key][
'arrayofkeyval'][$key2] = $langs->trans($val2);
230 if (!isset($this->date_start) || $this->date_start ===
"") $this->date_start = $this->date_acquisition;
234 $result = $result_create = $this->
createCommon($user, $notrigger);
235 if ($result > 0 && $this->fk_asset_model > 0) $result = $this->
setDataFromAssetModel($user, $notrigger);
237 if ($this->supplier_invoice_id > 0) $this->
add_object_linked(
'invoice_supplier', $this->supplier_invoice_id);
241 $this->
db->rollback();
246 return $result > 0 ? $result_create : $result;
258 global $langs, $extrafields;
356 public function fetch($id, $ref =
null)
360 if (!empty($this->table_element_line)) $this->
fetchLines();
365 } elseif ($res > 0) {
366 $this->fields[
'date_acquisition'][
'noteditable'] =
'1';
367 $this->fields[
'date_start'][
'noteditable'] =
'1';
368 $this->fields[
'acquisition_value_ht'][
'noteditable'] =
'1';
369 $this->fields[
'recovered_vat'][
'noteditable'] =
'1';
370 $this->fields[
'reversal_date'][
'noteditable'] =
'1';
371 $this->fields[
'reversal_amount_ht'][
'noteditable'] =
'1';
384 $this->lines = array();
401 public function fetchAll($sortorder =
'', $sortfield =
'', $limit = 0, $offset = 0, array $filter = array(), $filtermode =
'AND')
411 $sql .=
" FROM ".MAIN_DB_PREFIX.$this->table_element.
" as t";
412 if (isset($this->ismultientitymanaged) && $this->ismultientitymanaged == 1) {
413 $sql .=
" WHERE t.entity IN (".getEntity($this->table_element).
")";
415 $sql .=
" WHERE 1 = 1";
419 if (count($filter) > 0) {
420 foreach ($filter as $key => $value) {
421 if ($key ==
't.rowid') {
422 $sqlwhere[] = $key.
" = ".((int) $value);
423 } elseif (in_array($this->fields[$key][
'type'], array(
'date',
'datetime',
'timestamp'))) {
424 $sqlwhere[] = $key.
" = '".$this->
db->idate($value).
"'";
425 } elseif ($key ==
'customsql') {
426 $sqlwhere[] = $value;
427 } elseif (strpos($value,
'%') ===
false) {
428 $sqlwhere[] = $key.
" IN (".$this->
db->sanitize($this->
db->escape($value)).
")";
430 $sqlwhere[] = $key.
" LIKE '%".$this->
db->escape($value).
"%'";
434 if (count($sqlwhere) > 0) {
435 $sql .=
" AND (".implode(
" ".$filtermode.
" ", $sqlwhere).
")";
438 if (!empty($sortfield)) {
439 $sql .= $this->
db->order($sortfield, $sortorder);
441 if (!empty($limit)) {
442 $sql .= $this->
db->plimit($limit, $offset);
449 while ($i < ($limit ? min($limit, $num) : $num)) {
450 $obj = $this->
db->fetch_object(
$resql);
452 $record =
new self($this->db);
453 $record->setVarsFromFetchObj($obj);
455 $records[$record->id] = $record;
463 $this->errors[] =
'Error '.$this->db->lasterror();
464 dol_syslog(__METHOD__.
' '.join(
',', $this->errors), LOG_ERR);
479 if (!isset($this->date_start) || $this->date_start ===
"") $this->date_start = $this->date_acquisition;
484 if ($result > 0 && $this->fk_asset_model > 0 && $this->fk_asset_model != $this->oldcopy->fk_asset_model) {
488 $this->date_start != $this->oldcopy->date_start ||
489 $this->acquisition_value_ht != $this->oldcopy->acquisition_value_ht ||
490 $this->reversal_date != $this->oldcopy->reversal_date ||
491 $this->reversal_amount_ht != $this->oldcopy->reversal_amount_ht ||
492 ($this->fk_asset_model > 0 && $this->fk_asset_model != $this->oldcopy->fk_asset_model)
499 $this->
db->rollback();
514 public function delete(
User $user, $notrigger =
false)
530 $langs->load(
'assets');
533 $this->
id = $this->
id > 0 ? $this->id : 0;
534 $this->fk_asset_model = $this->fk_asset_model > 0 ? $this->fk_asset_model : 0;
538 if (empty($this->
id)) {
539 $this->errors[] = $langs->trans(
"ErrorFieldRequired", $langs->transnoentitiesnoconv(
"Asset") .
' (' . $langs->transnoentitiesnoconv(
"TechnicalID") .
')');
542 if (empty($this->fk_asset_model)) {
543 $this->errors[] = $langs->trans(
"ErrorFieldRequired", $langs->transnoentitiesnoconv(
"AssetModel") .
' (' . $langs->transnoentitiesnoconv(
"TechnicalID") .
')');
554 require_once DOL_DOCUMENT_ROOT .
'/asset/class/assetdepreciationoptions.class.php';
556 $result = $options_model->fetchDeprecationOptions(0, $this->fk_asset_model);
558 $this->error = $options_model->error;
559 $this->errors = $options_model->errors;
561 } elseif ($result > 0) {
563 $result = $options->fetchDeprecationOptions($this->
id);
565 $this->error = $options->error;
566 $this->errors = $options->errors;
571 foreach ($options_model->deprecation_options as $mode_key => $fields) {
572 foreach ($fields as $field_key => $value) {
573 $options->deprecation_options[$mode_key][$field_key] = $value;
577 $result = $options->updateDeprecationOptions($user, $this->
id, 0, $notrigger);
579 $this->error = $options->error;
580 $this->errors = $options->errors;
589 require_once DOL_DOCUMENT_ROOT .
'/asset/class/assetaccountancycodes.class.php';
591 $result = $accountancy_codes_model->fetchAccountancyCodes(0, $this->fk_asset_model);
593 $this->error = $accountancy_codes_model->error;
594 $this->errors = $accountancy_codes_model->errors;
596 } elseif ($result > 0) {
598 $result = $accountancy_codes->fetchAccountancyCodes($this->
id);
600 $this->error = $accountancy_codes->error;
601 $this->errors = $accountancy_codes->errors;
606 foreach ($accountancy_codes_model->accountancy_codes as $mode_key => $fields) {
607 foreach ($fields as $field_key => $value) {
608 $accountancy_codes->accountancy_codes[$mode_key][$field_key] = $value;
612 $result = $accountancy_codes->updateAccountancyCodes($user, $this->
id, 0, $notrigger);
614 $this->error = $accountancy_codes->error;
615 $this->errors = $accountancy_codes->errors;
623 $this->
db->rollback();
639 $langs->load(
'assets');
640 $this->depreciation_lines = array();
643 $this->
id = $this->
id > 0 ? $this->id : 0;
647 if (empty($this->
id)) {
648 $this->errors[] = $langs->trans(
"ErrorFieldRequired", $langs->transnoentitiesnoconv(
"Asset") .
' (' . $langs->transnoentitiesnoconv(
"TechnicalID") .
')');
655 $sql =
"WITH in_accounting_bookkeeping(fk_docdet) AS (";
656 $sql .=
" SELECT DISTINCT fk_docdet";
657 $sql .=
" FROM " . MAIN_DB_PREFIX .
"accounting_bookkeeping";
658 $sql .=
" WHERE doc_type = 'asset'";
660 $sql .=
"SELECT ad.rowid, ad.depreciation_mode, ad.ref, ad.depreciation_date, ad.depreciation_ht, ad.cumulative_depreciation_ht";
661 $sql .=
", " . $this->
db->ifsql(
'iab.fk_docdet IS NOT NULL', 1, 0) .
" AS bookkeeping";
662 $sql .=
" FROM " . MAIN_DB_PREFIX .
"asset_depreciation AS ad";
663 $sql .=
" LEFT JOIN in_accounting_bookkeeping as iab ON iab.fk_docdet = ad.rowid";
664 $sql .=
" WHERE ad.fk_asset = " . (int) $this->
id;
665 $sql .=
" ORDER BY ad.depreciation_date ASC";
669 $this->errors[] = $langs->trans(
'AssetErrorFetchDepreciationLines') .
': ' . $this->
db->lasterror();
673 while ($obj = $this->
db->fetch_object(
$resql)) {
674 if (!isset($this->depreciation_lines[$obj->depreciation_mode])) $this->depreciation_lines[$obj->depreciation_mode] = array();
675 $this->depreciation_lines[$obj->depreciation_mode][] = array(
678 'depreciation_date' => $this->db->jdate($obj->depreciation_date),
679 'depreciation_ht' => $obj->depreciation_ht,
680 'cumulative_depreciation_ht' => $obj->cumulative_depreciation_ht,
681 'bookkeeping' => $obj->bookkeeping,
696 $langs->load(
'assets');
699 $this->
id = $this->
id > 0 ? $this->id : 0;
703 if (empty($this->
id)) {
704 $this->errors[] = $langs->trans(
"ErrorFieldRequired", $langs->transnoentitiesnoconv(
"Asset") .
' (' . $langs->transnoentitiesnoconv(
"TechnicalID") .
')');
711 $sql =
"WITH in_accounting_bookkeeping(fk_docdet) AS (";
712 $sql .=
" SELECT DISTINCT fk_docdet";
713 $sql .=
" FROM " . MAIN_DB_PREFIX .
"accounting_bookkeeping";
714 $sql .=
" WHERE doc_type = 'asset'";
716 $sql .=
"SELECT COUNT(*) AS has_bookkeeping";
717 $sql .=
" FROM " . MAIN_DB_PREFIX .
"asset_depreciation AS ad";
718 $sql .=
" LEFT JOIN in_accounting_bookkeeping as iab ON iab.fk_docdet = ad.rowid";
719 $sql .=
" WHERE ad.fk_asset = " . (int) $this->
id;
720 $sql .=
" AND iab.fk_docdet IS NOT NULL";
724 $this->errors[] = $langs->trans(
'AssetErrorFetchDepreciationLines') .
': ' . $this->
db->lasterror();
728 if ($obj = $this->
db->fetch_object(
$resql)) {
729 return $obj->has_bookkeeping > 0 ? 1 : 0;
747 public function addDepreciationLine($mode, $ref, $depreciation_date, $depreciation_ht, $cumulative_depreciation_ht, $accountancy_code_debit, $accountancy_code_credit)
750 $langs->load(
'assets');
753 $this->
id = $this->
id > 0 ? $this->id : 0;
754 $mode = strtolower(trim($mode));
756 $accountancy_code_debit = trim($accountancy_code_debit);
757 $accountancy_code_credit = trim($accountancy_code_credit);
761 if (empty($this->
id)) {
762 $this->errors[] = $langs->trans(
"ErrorFieldRequired", $langs->transnoentitiesnoconv(
"Asset") .
' (' . $langs->transnoentitiesnoconv(
"TechnicalID") .
')');
769 $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)";
770 $sql .=
" VALUES ( ";
771 $sql .=
" " . (int) $this->
id;
772 $sql .=
", '" . $this->
db->escape($mode) .
"'";
773 $sql .=
", '" . $this->
db->escape($ref) .
"'";
774 $sql .=
", '" . $this->
db->idate($depreciation_date) .
"'";
775 $sql .=
", " . (double) $depreciation_ht;
776 $sql .=
", " . (double) $cumulative_depreciation_ht;
777 $sql .=
", '" . $this->
db->escape($accountancy_code_debit) .
"'";
778 $sql .=
", '" . $this->
db->escape($accountancy_code_credit) .
"'";
783 $this->errors[] = $langs->trans(
'AssetErrorAddDepreciationLine') .
': ' . $this->
db->lasterror();
797 global $conf, $langs;
798 $langs->load(
'assets');
801 $this->
id = $this->
id > 0 ? $this->id : 0;
805 if (empty($this->
id)) {
806 $this->errors[] = $langs->trans(
"ErrorFieldRequired", $langs->transnoentitiesnoconv(
"Asset") .
' (' . $langs->transnoentitiesnoconv(
"TechnicalID") .
')');
815 require_once DOL_DOCUMENT_ROOT .
'/asset/class/assetdepreciationoptions.class.php';
817 $result = $options->fetchDeprecationOptions($this->
id);
819 $this->error = $options->error;
820 $this->errors = $options->errors;
826 require_once DOL_DOCUMENT_ROOT .
'/asset/class/assetaccountancycodes.class.php';
828 $result = $accountancy_codes->fetchAccountancyCodes($this->
id);
830 $this->error = $accountancy_codes->error;
831 $this->errors = $accountancy_codes->errors;
839 foreach ($options->deprecation_options as $mode_key => $fields) {
840 $modes[$mode_key] = $this->
db->escape($mode_key);
842 $sql =
"DELETE FROM " . MAIN_DB_PREFIX .
"asset_depreciation";
843 $sql .=
" WHERE fk_asset = " . (int) $this->
id;
844 $sql .=
" AND depreciation_mode NOT IN ('" . $this->
db->sanitize(implode(
"', '", $modes)) .
"')";
848 $this->errors[] = $langs->trans(
'AssetErrorClearDepreciationLines') .
': ' . $this->
db->lasterror();
854 require_once DOL_DOCUMENT_ROOT .
'/core/lib/date.lib.php';
855 require_once DOL_DOCUMENT_ROOT .
'/core/lib/accounting.lib.php';
857 $init_fiscal_period_start = $dates[
'date_start'];
858 $init_fiscal_period_end = $dates[
'date_end'];
859 if (empty($init_fiscal_period_start) || empty($init_fiscal_period_end)) {
860 $pastmonthyear = $dates[
'pastmonthyear'];
861 $pastmonth = $dates[
'pastmonth'];
862 $init_fiscal_period_start =
dol_get_first_day($pastmonthyear, $pastmonth,
false);
863 $init_fiscal_period_end =
dol_get_last_day($pastmonthyear, $pastmonth,
false);
866 foreach ($options->deprecation_options as $mode_key => $fields) {
869 $sql =
"WITH in_accounting_bookkeeping(fk_docdet) AS (";
870 $sql .=
" SELECT fk_docdet";
871 $sql .=
" FROM " . MAIN_DB_PREFIX .
"accounting_bookkeeping";
872 $sql .=
" WHERE doc_type = 'asset'";
874 $sql .=
"SELECT ad.depreciation_date, ad.cumulative_depreciation_ht";
875 $sql .=
" FROM " . MAIN_DB_PREFIX .
"asset_depreciation AS ad";
876 $sql .=
" LEFT JOIN in_accounting_bookkeeping as iab ON iab.fk_docdet = ad.rowid";
877 $sql .=
" WHERE ad.fk_asset = " . (int) $this->
id;
878 $sql .=
" AND ad.depreciation_mode = '" . $this->
db->escape($mode_key) .
"'";
879 $sql .=
" AND iab.fk_docdet IS NOT NULL";
880 $sql .=
" ORDER BY ad.depreciation_date DESC";
884 $this->errors[] = $langs->trans(
'AssetErrorFetchMaxDepreciationDateForMode', $mode_key) .
': ' . $this->
db->lasterror();
888 $last_depreciation_date =
'';
889 $last_cumulative_depreciation_ht = $this->reversal_amount_ht;
890 if ($obj = $this->
db->fetch_object(
$resql)) {
891 $last_depreciation_date = $this->
db->jdate($obj->depreciation_date);
892 $last_cumulative_depreciation_ht = $obj->cumulative_depreciation_ht;
896 $sql =
"UPDATE " . MAIN_DB_PREFIX . $options->deprecation_options_fields[$mode_key][
'table'];
897 $sql .=
" SET total_amount_last_depreciation_ht = " . (empty($last_cumulative_depreciation_ht) ? 0 : $last_cumulative_depreciation_ht);
898 $sql .=
" WHERE fk_asset = " . (int) $this->
id;
901 $this->errors[] = $langs->trans(
'AssetErrorSetLastCumulativeDepreciation') .
': ' . $this->
db->lasterror();
907 $sql =
"DELETE " . MAIN_DB_PREFIX .
"asset_depreciation FROM " . MAIN_DB_PREFIX .
"asset_depreciation";
908 $sql .=
" LEFT JOIN " . MAIN_DB_PREFIX .
"accounting_bookkeeping as ab ON ab.doc_type = 'asset' AND ab.fk_docdet = " . MAIN_DB_PREFIX .
"asset_depreciation.rowid";
909 $sql .=
" WHERE " . MAIN_DB_PREFIX .
"asset_depreciation.fk_asset = " . (int) $this->
id;
910 $sql .=
" AND " . MAIN_DB_PREFIX .
"asset_depreciation.depreciation_mode = '" . $this->
db->escape($mode_key) .
"'";
911 $sql .=
" AND ab.fk_docdet IS NULL";
912 if ($last_depreciation_date !==
"") $sql .=
" AND " . MAIN_DB_PREFIX .
"asset_depreciation.ref != ''";
915 $this->errors[] = $langs->trans(
'AssetErrorClearDepreciationLines') .
': ' . $this->
db->lasterror();
921 $depreciation_date_start = $this->date_start > $this->date_acquisition ? $this->date_start : $this->date_acquisition;
922 $depreciation_date_end =
dol_time_plus_duree($depreciation_date_start, $fields[
'duration'], $fields[
'duration_type'] == 1 ?
'm' : ($fields[
'duration_type'] == 2 ?
'd' :
'y'));
923 $depreciation_amount = $fields[
'amount_base_depreciation_ht'];
924 if ($fields[
'duration_type'] == 2) {
925 $fiscal_period_start = $depreciation_date_start;
926 $fiscal_period_end = $depreciation_date_start;
927 } elseif ($fields[
'duration_type'] == 1) {
928 $date_temp =
dol_getdate($depreciation_date_start);
929 $fiscal_period_start =
dol_get_first_day($date_temp[
'year'], $date_temp[
'mon'],
false);
930 $fiscal_period_end =
dol_get_last_day($date_temp[
'year'], $date_temp[
'mon'],
false);
932 $fiscal_period_start = $init_fiscal_period_start;
933 $fiscal_period_end = $init_fiscal_period_end;
935 $cumulative_depreciation_ht = $last_cumulative_depreciation_ht;
936 $depreciation_period_amount = $depreciation_amount - $this->reversal_amount_ht;
937 $start_date = $depreciation_date_start;
938 $disposal_date = isset($this->disposal_date) && $this->disposal_date !==
"" ? $this->disposal_date :
"";
939 $finish_date = $disposal_date !==
"" ? $disposal_date : $depreciation_date_end;
940 $accountancy_code_depreciation_debit_key = $accountancy_codes->accountancy_codes_fields[$mode_key][
'depreciation_debit'];
941 $accountancy_code_depreciation_debit = $accountancy_codes->accountancy_codes[$mode_key][$accountancy_code_depreciation_debit_key];
942 $accountancy_code_depreciation_credit_key = $accountancy_codes->accountancy_codes_fields[$mode_key][
'depreciation_credit'];
943 $accountancy_code_credit = $accountancy_codes->accountancy_codes[$mode_key][$accountancy_code_depreciation_credit_key];
947 if ($last_depreciation_date ===
"" && ($depreciation_date_start < $fiscal_period_start || is_numeric($this->reversal_date))) {
948 if (is_numeric($this->reversal_date)) {
949 if ($this->reversal_date < $fiscal_period_start) {
950 $this->errors[] = $langs->trans(
'AssetErrorReversalDateNotGreaterThanCurrentBeginFiscalDateForMode', $mode_key);
955 if (empty($this->reversal_amount_ht)) {
956 $this->errors[] = $langs->trans(
'AssetErrorReversalAmountNotProvidedForMode', $mode_key);
961 $start_date = $this->reversal_date;
962 $result = $this->
addDepreciationLine($mode_key,
'', $start_date, $this->reversal_amount_ht, $this->reversal_amount_ht, $accountancy_code_depreciation_debit, $accountancy_code_credit);
968 $this->errors[] = $langs->trans(
'AssetErrorReversalDateNotProvidedForMode', $mode_key);
976 $nb_days_in_year = !empty($conf->global->ASSET_DEPRECIATION_DURATION_PER_YEAR) ? $conf->global->ASSET_DEPRECIATION_DURATION_PER_YEAR : 365;
977 $nb_days_in_month = !empty($conf->global->ASSET_DEPRECIATION_DURATION_PER_MONTH) ? $conf->global->ASSET_DEPRECIATION_DURATION_PER_MONTH : 30;
978 $period_amount = (double)
price2num($depreciation_period_amount / $fields[
'duration'],
'MT');
979 $first_period_found =
false;
980 $first_period_date = isset($begin_period) && $begin_period > $fiscal_period_start ? $begin_period : $fiscal_period_start;
982 $ref_date_format =
"%Y" . ($fields[
'duration_type'] == 1 || $fields[
'duration_type'] == 2 ?
'-%m' :
'') . ($fields[
'duration_type'] == 2 ?
'-%d' :
'');
986 $max_loop = $fields[
'duration'] + 2;
990 if ($idx_loop > $max_loop)
break;
992 if ($last_depreciation_date < $fiscal_period_end && ($first_period_date <= $start_date || $first_period_found)) {
994 if ($fiscal_period_start <= $disposal_date && $disposal_date <= $fiscal_period_end && empty($this->disposal_depreciated)) {
998 $first_period_found =
true;
1000 $period_begin =
dol_print_date($fiscal_period_start, $ref_date_format);
1001 $period_end =
dol_print_date($fiscal_period_end, $ref_date_format);
1002 $ref = $period_begin . ($period_begin != $period_end ?
' - ' . $period_end :
'');
1003 if ($fiscal_period_start <= $disposal_date && $disposal_date <= $fiscal_period_end) {
1004 $ref .=
' - ' . $langs->transnoentitiesnoconv(
'AssetDisposal');
1007 $begin_date = $fiscal_period_start < $start_date && $start_date <= $fiscal_period_end ? $start_date : $fiscal_period_start;
1008 $end_date = $fiscal_period_start < $finish_date && $finish_date <= $fiscal_period_end ? $finish_date : $fiscal_period_end;
1009 if ($fields[
'duration_type'] == 2) {
1010 $depreciation_ht = $period_amount;
1011 } elseif ($fields[
'duration_type'] == 1) {
1012 $nb_days = min($nb_days_in_month,
num_between_day($begin_date, $end_date, 1));
1013 if ($nb_days >= 28) {
1015 if ($date_temp[
'mon'] == 2) {
1019 $depreciation_ht = (double)
price2num($period_amount * $nb_days / $nb_days_in_month,
'MT');
1021 $nb_days = min($nb_days_in_year,
num_between_day($begin_date, $end_date, 1));
1022 $depreciation_ht = (double)
price2num($period_amount * $nb_days / $nb_days_in_year,
'MT');
1025 if ($fiscal_period_start <= $depreciation_date_end && $depreciation_date_end <= $fiscal_period_end) {
1026 $depreciation_ht = (double)
price2num($depreciation_amount - $cumulative_depreciation_ht,
'MT');
1027 $cumulative_depreciation_ht = $depreciation_amount;
1029 $cumulative_depreciation_ht += $depreciation_ht;
1032 $result = $this->
addDepreciationLine($mode_key, $ref, $fiscal_period_end, $depreciation_ht, $cumulative_depreciation_ht, $accountancy_code_depreciation_debit, $accountancy_code_credit);
1041 if ($fields[
'duration_type'] == 2) {
1042 $fiscal_period_end = $fiscal_period_start;
1043 } elseif ($fields[
'duration_type'] == 1) {
1048 $last_period_date = $disposal_date !==
"" && $disposal_date < $depreciation_date_end ? $disposal_date : $depreciation_date_end;
1049 }
while ($fiscal_period_start < $last_period_date);
1058 $this->
db->rollback();
1061 $this->
db->commit();
1075 $langs->load(
'assets');
1078 $asset_depreciation_id = $asset_depreciation_id > 0 ? $asset_depreciation_id : 0;
1082 if (empty($asset_depreciation_id)) {
1083 $this->errors[] = $langs->trans(
"ErrorFieldRequired", $langs->transnoentitiesnoconv(
"AssetDepreciation") .
' (' . $langs->transnoentitiesnoconv(
"TechnicalID") .
')');
1092 require_once DOL_DOCUMENT_ROOT .
'/asset/class/assetdepreciationoptions.class.php';
1097 $sql =
"SELECT fk_asset, depreciation_mode, cumulative_depreciation_ht";
1098 $sql .=
" FROM " . MAIN_DB_PREFIX .
"asset_depreciation";
1099 $sql .=
" WHERE rowid = " . (int) $asset_depreciation_id;
1102 $this->errors[] = $langs->trans(
'AssetErrorFetchCumulativeDepreciation') .
': ' . $this->
db->lasterror();
1105 if ($obj = $this->
db->fetch_object(
$resql)) {
1106 $mode_key = $obj->depreciation_mode;
1107 if (!empty($options->deprecation_options_fields[$mode_key])) {
1108 $sql =
"UPDATE " . MAIN_DB_PREFIX . $options->deprecation_options_fields[$mode_key][
'table'];
1109 $sql .=
" SET total_amount_last_depreciation_ht = " . $obj->cumulative_depreciation_ht;
1110 $sql .=
" WHERE fk_asset = " . (int) $obj->fk_asset;
1111 $resql = $this->db->query($sql);
1113 $this->errors[] = $langs->trans(
'AssetErrorSetLastCumulativeDepreciation') .
': ' . $this->
db->lasterror();
1121 $this->
db->rollback();
1124 $this->
db->commit();
1137 public function dispose($user, $disposal_invoice_id, $notrigger = 0)
1139 global $conf, $langs;
1142 if ($this->status != self::STATUS_DRAFT || $this->status == self::STATUS_DISPOSED) {
1148 $required_fields = array(
'disposal_date',
'disposal_date',
'fk_disposal_type');
1149 foreach ($required_fields as $field) {
1150 $this->fields[$field][
'notnull'] = 1;
1152 $result = $this->
update($user, 1);
1153 foreach ($required_fields as $field) {
1154 $this->fields[$field][
'notnull'] = 0;
1157 if ($disposal_invoice_id > 0) $this->
add_object_linked(
'facture', $disposal_invoice_id);
1158 $result = $this->
setStatusCommon($user, self::STATUS_DISPOSED, $notrigger,
'ASSET_DISPOSED');
1163 $this->
db->rollback();
1165 $this->
db->commit();
1169 if ($result > 0 && empty($conf->global->MAIN_DISABLE_PDF_AUTOUPDATE)) {
1170 if (method_exists($this,
'generateDocument')) {
1171 global $hidedetails, $hidedesc, $hideref;
1172 $outputlangs = $langs;
1174 if ($conf->global->MAIN_MULTILANGS && empty($newlang) &&
GETPOST(
'lang_id',
'aZ09')) {
1175 $newlang =
GETPOST(
'lang_id',
'aZ09');
1177 if ($conf->global->MAIN_MULTILANGS && empty($newlang)) {
1178 $newlang = $this->thirdparty->default_lang;
1180 if (!empty($newlang)) {
1181 $outputlangs =
new Translate(
"", $conf);
1182 $outputlangs->setDefaultLang($newlang);
1184 $model = $this->model_pdf;
1185 $ret = $this->
fetch($this->
id);
1187 $this->generateDocument($model, $outputlangs, $hidedetails, $hidedesc, $hideref);
1201 public function reopen($user, $notrigger = 0)
1203 global $conf, $langs;
1206 if ($this->status != self::STATUS_DISPOSED || $this->status == self::STATUS_DRAFT) {
1213 $this->disposal_date =
null;
1214 $this->disposal_amount_ht =
null;
1215 $this->fk_disposal_type =
null;
1216 $this->disposal_depreciated =
null;
1217 $this->disposal_subject_to_vat =
null;
1218 $result = $this->
update($user, 1);
1221 $result = $this->
setStatusCommon($user, self::STATUS_DRAFT, $notrigger,
'ASSET_REOPEN');
1226 $this->
db->rollback();
1228 $this->
db->commit();
1232 if ($result > 0 && empty($conf->global->MAIN_DISABLE_PDF_AUTOUPDATE)) {
1233 if (method_exists($this,
'generateDocument')) {
1234 global $hidedetails, $hidedesc, $hideref;
1235 $outputlangs = $langs;
1237 if ($conf->global->MAIN_MULTILANGS && empty($newlang) &&
GETPOST(
'lang_id',
'aZ09')) {
1238 $newlang =
GETPOST(
'lang_id',
'aZ09');
1240 if ($conf->global->MAIN_MULTILANGS && empty($newlang)) {
1241 $newlang = $this->thirdparty->default_lang;
1243 if (!empty($newlang)) {
1244 $outputlangs =
new Translate(
"", $conf);
1245 $outputlangs->setDefaultLang($newlang);
1247 $model = $this->model_pdf;
1248 $ret = $this->
fetch($this->
id);
1250 $this->generateDocument($model, $outputlangs, $hidedetails, $hidedesc, $hideref);
1268 public function getNomUrl($withpicto = 0, $option =
'', $maxlen = 0, $notooltip = 0, $morecss =
'', $save_lastsearch_value = -1)
1270 global $db, $conf, $langs, $hookmanager;
1271 global $dolibarr_main_authentication, $dolibarr_main_demo;
1272 global $menumanager;
1274 if (!empty($conf->dol_no_mouse_hover)) {
1280 $label =
img_picto(
'', $this->picto).
' <u>'.$langs->trans(
"Asset").
'</u>';
1281 if (isset($this->status)) {
1282 $label .=
' '.$this->getLibStatut(5);
1285 $label .=
'<b>'.$langs->trans(
'Ref').
':</b> '.$this->ref;
1287 $url =
dol_buildpath(
'/asset/card.php', 1).
'?id='.$this->id;
1289 if ($option !=
'nolink') {
1291 $add_save_lastsearch_values = ($save_lastsearch_value == 1 ? 1 : 0);
1292 if ($save_lastsearch_value == -1 && preg_match(
'/list\.php/', $_SERVER[
"PHP_SELF"])) {
1293 $add_save_lastsearch_values = 1;
1295 if ($add_save_lastsearch_values) {
1296 $url .=
'&save_lastsearch_values=1';
1301 if (empty($notooltip)) {
1302 if (!empty($conf->global->MAIN_OPTIMIZEFORTEXTBROWSER)) {
1303 $label = $langs->trans(
"ShowAsset");
1304 $linkclose .=
' alt="'.dol_escape_htmltag($label, 1).
'"';
1306 $linkclose .=
' title="'.dol_escape_htmltag($label, 1).
'"';
1307 $linkclose .=
' class="classfortooltip'.($morecss ?
' '.$morecss :
'').
'"';
1309 $linkclose = ($morecss ?
' class="'.$morecss.
'"' :
'');
1312 if ($option ==
'nolink') {
1313 $linkstart =
'<span';
1315 $linkstart =
'<a href="'.$url.
'"';
1317 $linkstart .= $linkclose.
'>';
1318 if ($option ==
'nolink') {
1319 $linkend =
'</span>';
1324 $result .= $linkstart;
1326 if (empty($this->showphoto_on_popup)) {
1328 $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);
1332 require_once DOL_DOCUMENT_ROOT.
'/core/lib/files.lib.php';
1334 list($class, $module) = explode(
'@', $this->picto);
1337 $filename = $filearray[0][
'name'];
1338 if (!empty($filename)) {
1339 $pospoint = strpos($filearray[0][
'name'],
'.');
1341 $pathtophoto = $class.
'/'.$this->
ref.
'/thumbs/'.substr($filename, 0, $pospoint).
'_mini'.substr($filename, $pospoint);
1342 if (empty($conf->global->{strtoupper($module.
'_'.$class).
'_FORMATLISTPHOTOSASUSERS'})) {
1343 $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>';
1345 $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>';
1348 $result .=
'</div>';
1350 $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);
1355 if ($withpicto != 2) {
1357 if ($option ==
'label') $name = $this->label;
1358 elseif ($option ==
'with_label') $name .= ' - ' . $this->label;
1362 $result .= $linkend;
1366 $hookmanager->initHooks(array($this->element . 'dao'));
1367 $parameters = array('
id'=>$this->
id, 'getnomurl' => &$result);
1368 $reshook = $hookmanager->executeHooks('
getNomUrl', $parameters, $this, $action);
1370 $result = $hookmanager->resPrint;
1372 $result .= $hookmanager->resPrint;
1385 return $this->
LibStatut($this->status, $mode);
1396 return $this->
LibStatut($this->status, $mode);
1410 if (empty($this->labelStatus) || empty($this->labelStatusShort)) {
1413 $this->labelStatus[self::STATUS_DRAFT] = $langs->transnoentitiesnoconv(
'AssetInProgress');
1414 $this->labelStatus[self::STATUS_DISPOSED] = $langs->transnoentitiesnoconv(
'AssetDisposed');
1415 $this->labelStatusShort[self::STATUS_DRAFT] = $langs->transnoentitiesnoconv(
'AssetInProgress');
1416 $this->labelStatusShort[self::STATUS_DISPOSED] = $langs->transnoentitiesnoconv(
'AssetDisposed');
1419 $statusType =
'status4';
1420 if ($status == self::STATUS_DISPOSED) {
1421 $statusType =
'status6';
1424 return dolGetStatus($this->labelStatus[$status], $this->labelStatusShort[$status],
'', $statusType, $mode);
1435 $sql =
"SELECT rowid, date_creation as datec, tms as datem,";
1436 $sql .=
" fk_user_creat, fk_user_modif";
1437 $sql .=
" FROM ".MAIN_DB_PREFIX.$this->table_element.
" as t";
1438 $sql .=
" WHERE t.rowid = ".((int) $id);
1440 $result = $this->
db->query($sql);
1442 if ($this->
db->num_rows($result)) {
1443 $obj = $this->
db->fetch_object($result);
1444 $this->
id = $obj->rowid;
1446 $this->user_creation_id = $obj->fk_user_author;
1447 $this->user_validation_id = $obj->fk_user_valid;
1448 $this->user_cloture_id = $obj->fk_user_cloture;
1449 $this->date_creation = $this->
db->jdate($obj->datec);
1450 $this->date_modification = $this->
db->jdate($obj->datem);
1451 $this->date_validation = $this->
db->jdate($obj->datev);
1454 $this->
db->free($result);
1482 $this->lines = array();
1484 return $this->lines;
1494 global $langs, $conf;
1495 $langs->load(
"asset@asset");
1497 if (empty($conf->global->ASSET_ASSET_ADDON)) {
1498 $conf->global->ASSET_ASSET_ADDON =
'mod_asset_standard';
1501 if (!empty($conf->global->ASSET_ASSET_ADDON)) {
1504 $file = $conf->global->ASSET_ASSET_ADDON.
".php";
1505 $classname = $conf->global->ASSET_ASSET_ADDON;
1508 $dirmodels = array_merge(array(
'/'), (array) $conf->modules_parts[
'models']);
1509 foreach ($dirmodels as $reldir) {
1513 $mybool |= @include_once $dir.$file;
1516 if ($mybool ===
false) {
1521 if (class_exists($classname)) {
1522 $obj =
new $classname();
1523 $numref = $obj->getNextValue($this);
1525 if ($numref !=
'' && $numref !=
'-1') {
1528 $this->error = $obj->error;
1533 print $langs->trans(
"Error").
" ".$langs->trans(
"ClassNotFound").
' '.$classname;
1537 print $langs->trans(
"ErrorNumberingModuleNotSetup", $this->element);