assetaccountancycodes.class.php 9.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269
  1. <?php
  2. /* Copyright (C) 2021 Open-Dsi <support@open-dsi.fr>
  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 <https://www.gnu.org/licenses/>.
  16. */
  17. /**
  18. * \file asset/class/assetaccountancycodes.class.php
  19. * \ingroup asset
  20. * \brief This file is a class file for AssetAccountancyCodes
  21. */
  22. require_once DOL_DOCUMENT_ROOT.'/core/class/commonobject.class.php';
  23. /**
  24. * Class for AssetAccountancyCodes
  25. */
  26. class AssetAccountancyCodes extends CommonObject
  27. {
  28. /**
  29. * @var array Array with all accountancy codes info by mode.
  30. * Note : 'economic' mode is mandatory and is the primary accountancy codes
  31. * 'depreciation_asset' and 'depreciation_expense' is mandatory and is used for write depreciation in bookkeeping
  32. */
  33. public $accountancy_codes_fields = array(
  34. 'economic' => array(
  35. 'label' => 'AssetAccountancyCodeDepreciationEconomic',
  36. 'table' => 'asset_accountancy_codes_economic',
  37. 'depreciation_debit' => 'depreciation_asset',
  38. 'depreciation_credit' => 'depreciation_expense',
  39. 'fields' => array(
  40. 'asset' => array('label' => 'AssetAccountancyCodeAsset'),
  41. 'depreciation_asset' => array('label' => 'AssetAccountancyCodeDepreciationAsset'),
  42. 'depreciation_expense' => array('label' => 'AssetAccountancyCodeDepreciationExpense'),
  43. 'value_asset_sold' => array('label' => 'AssetAccountancyCodeValueAssetSold'),
  44. 'receivable_on_assignment' => array('label' => 'AssetAccountancyCodeReceivableOnAssignment'),
  45. 'proceeds_from_sales' => array('label' => 'AssetAccountancyCodeProceedsFromSales'),
  46. 'vat_collected' => array('label' => 'AssetAccountancyCodeVatCollected'),
  47. 'vat_deductible' => array('label' => 'AssetAccountancyCodeVatDeductible'),
  48. ),
  49. ),
  50. 'accelerated_depreciation' => array(
  51. 'label' => 'AssetAccountancyCodeDepreciationAcceleratedDepreciation',
  52. 'table' => 'asset_accountancy_codes_fiscal',
  53. 'depreciation_debit' => 'accelerated_depreciation',
  54. 'depreciation_credit' => 'endowment_accelerated_depreciation',
  55. 'fields' => array(
  56. 'accelerated_depreciation' => array('label' => 'AssetAccountancyCodeAcceleratedDepreciation'),
  57. 'endowment_accelerated_depreciation' => array('label' => 'AssetAccountancyCodeEndowmentAcceleratedDepreciation'),
  58. 'provision_accelerated_depreciation' => array('label' => 'AssetAccountancyCodeProvisionAcceleratedDepreciation'),
  59. ),
  60. ),
  61. );
  62. /**
  63. * @var array Array with all accountancy codes by mode.
  64. */
  65. public $accountancy_codes = array();
  66. /**
  67. * Constructor
  68. *
  69. * @param DoliDb $db Database handler
  70. */
  71. public function __construct(DoliDB $db)
  72. {
  73. $this->db = $db;
  74. }
  75. /**
  76. * Fill accountancy_codes property of object (using for data sent by forms)
  77. *
  78. * @return array Array of values
  79. */
  80. public function setAccountancyCodesFromPost()
  81. {
  82. $this->accountancy_codes = array();
  83. foreach ($this->accountancy_codes_fields as $mode_key => $mode_info) {
  84. $this->accountancy_codes[$mode_key] = array();
  85. foreach ($mode_info['fields'] as $field_key => $field_info) {
  86. $accountancy_code = GETPOST($mode_key . '_' . $field_key, 'aZ09');
  87. if (empty($accountancy_code) || $accountancy_code == '-1') $accountancy_code = '';
  88. $this->accountancy_codes[$mode_key][$field_key] = $accountancy_code;
  89. }
  90. }
  91. }
  92. /**
  93. * Load accountancy codes of a asset or a asset model
  94. *
  95. * @param int $asset_id Asset ID to set
  96. * @param int $asset_model_id Asset model ID to set
  97. * @return int <0 if KO, >0 if OK
  98. */
  99. public function fetchAccountancyCodes($asset_id = 0, $asset_model_id = 0)
  100. {
  101. global $langs, $hookmanager;
  102. dol_syslog(__METHOD__ . " asset_id=$asset_id, asset_model_id=$asset_model_id");
  103. $error = 0;
  104. $this->errors = array();
  105. $this->accountancy_codes = array();
  106. // Clean parameters
  107. $asset_id = $asset_id > 0 ? $asset_id : 0;
  108. $asset_model_id = $asset_model_id > 0 ? $asset_model_id : 0;
  109. $hookmanager->initHooks(array('assetaccountancycodesdao'));
  110. $parameters = array('asset_id' => $asset_id, 'asset_model_id' => $asset_model_id);
  111. $reshook = $hookmanager->executeHooks('fetchAccountancyCodes', $parameters, $this); // Note that $action and $object may have been modified by some hooks
  112. if (!empty($reshook)) {
  113. return $reshook;
  114. }
  115. // Check parameters
  116. if (empty($asset_id) && empty($asset_model_id)) {
  117. $this->errors[] = $langs->trans('AssetErrorAssetOrAssetModelIDNotProvide');
  118. $error++;
  119. }
  120. if ($error) {
  121. dol_syslog(__METHOD__ . " Error check parameters: " . $this->errorsToString(), LOG_ERR);
  122. return -1;
  123. }
  124. $accountancy_codes = array();
  125. foreach ($this->accountancy_codes_fields as $mode_key => $mode_info) {
  126. $sql = "SELECT " . implode(',', array_keys($mode_info['fields']));
  127. $sql .= " FROM " . MAIN_DB_PREFIX . $mode_info['table'];
  128. $sql .= " WHERE " . ($asset_id > 0 ? " fk_asset = " . (int) $asset_id : " fk_asset_model = " . (int) $asset_model_id);
  129. $resql = $this->db->query($sql);
  130. if ($resql) {
  131. if ($obj = $this->db->fetch_object($resql)) {
  132. $accountancy_codes[$mode_key] = array();
  133. foreach ($mode_info['fields'] as $field_key => $field_info) {
  134. $accountancy_codes[$mode_key][$field_key] = $obj->$field_key;
  135. }
  136. }
  137. } else {
  138. $this->errors[] = $langs->trans('AssetErrorFetchAccountancyCodesForMode', $mode_key) . ': ' . $this->db->lasterror();
  139. $error++;
  140. }
  141. }
  142. if ($error) {
  143. dol_syslog(__METHOD__ . " Error fetch accountancy codes: " . $this->errorsToString(), LOG_ERR);
  144. return -1;
  145. } else {
  146. $this->accountancy_codes = $accountancy_codes;
  147. return 1;
  148. }
  149. }
  150. /**
  151. * Update accountancy codes of a asset or a asset model
  152. *
  153. * @param User $user User making update
  154. * @param int $asset_id Asset ID to set
  155. * @param int $asset_model_id Asset model ID to set
  156. * @param int $notrigger 1=disable trigger UPDATE (when called by create)
  157. * @return int <0 if KO, >0 if OK
  158. */
  159. public function updateAccountancyCodes($user, $asset_id = 0, $asset_model_id = 0, $notrigger = 0)
  160. {
  161. global $langs, $hookmanager;
  162. dol_syslog(__METHOD__ . " user_id=".$user->id.", asset_id=".$asset_id.", asset_model_id=".$asset_model_id.", notrigger=".$notrigger);
  163. $error = 0;
  164. $this->errors = array();
  165. // Clean parameters
  166. $asset_id = $asset_id > 0 ? $asset_id : 0;
  167. $asset_model_id = $asset_model_id > 0 ? $asset_model_id : 0;
  168. $hookmanager->initHooks(array('assetaccountancycodesdao'));
  169. $parameters = array('user' => $user, 'asset_id' => $asset_id, 'asset_model_id' => $asset_model_id);
  170. $reshook = $hookmanager->executeHooks('updateAccountancyCodes', $parameters, $this); // Note that $action and $object may have been modified by some hooks
  171. if (!empty($reshook)) {
  172. return $reshook;
  173. }
  174. // Check parameters
  175. if (empty($asset_id) && empty($asset_model_id)) {
  176. $this->errors[] = $langs->trans('AssetErrorAssetOrAssetModelIDNotProvide');
  177. $error++;
  178. }
  179. if ($error) {
  180. dol_syslog(__METHOD__ . " Error check parameters: " . $this->errorsToString(), LOG_ERR);
  181. return -1;
  182. }
  183. $this->db->begin();
  184. $now = dol_now();
  185. foreach ($this->accountancy_codes_fields as $mode_key => $mode_info) {
  186. // Delete old accountancy codes
  187. $sql = "DELETE FROM " . MAIN_DB_PREFIX . $mode_info['table'];
  188. $sql .= " WHERE " . ($asset_id > 0 ? " fk_asset = " . (int) $asset_id : " fk_asset_model = " . (int) $asset_model_id);
  189. $resql = $this->db->query($sql);
  190. if (!$resql) {
  191. $this->errors[] = $langs->trans('AssetErrorDeleteAccountancyCodesForMode', $mode_key) . ': ' . $this->db->lasterror();
  192. $error++;
  193. }
  194. if (!$error && !empty($this->accountancy_codes[$mode_key])) {
  195. // Insert accountancy codes
  196. $sql = "INSERT INTO " . MAIN_DB_PREFIX . $mode_info['table'] . "(";
  197. $sql .= $asset_id > 0 ? "fk_asset," : "fk_asset_model,";
  198. $sql .= implode(',', array_keys($mode_info['fields']));
  199. $sql .= ", tms, fk_user_modif";
  200. $sql .= ") VALUES(";
  201. $sql .= $asset_id > 0 ? $asset_id : $asset_model_id;
  202. foreach ($mode_info['fields'] as $field_key => $field_info) {
  203. $sql .= ', ' . (empty($this->accountancy_codes[$mode_key][$field_key]) ? 'NULL' : "'" . $this->db->escape($this->accountancy_codes[$mode_key][$field_key]) . "'");
  204. }
  205. $sql .= ", '" . $this->db->idate($now) . "'";
  206. $sql .= ", " . $user->id;
  207. $sql .= ")";
  208. $resql = $this->db->query($sql);
  209. if (!$resql) {
  210. $this->errors[] = $langs->trans('AssetErrorInsertAccountancyCodesForMode', $mode_key) . ': ' . $this->db->lasterror();
  211. $error++;
  212. }
  213. }
  214. }
  215. if (!$error && $asset_id > 0) {
  216. // Calculation of depreciation lines (reversal and future)
  217. require_once DOL_DOCUMENT_ROOT . '/asset/class/asset.class.php';
  218. $asset = new Asset($this->db);
  219. $result = $asset->fetch($asset_id);
  220. if ($result > 0) $result = $asset->calculationDepreciation();
  221. if ($result < 0) {
  222. $this->errors[] = $langs->trans('AssetErrorCalculationDepreciationLines');
  223. $this->errors[] = $asset->errorsToString();
  224. $error++;
  225. }
  226. }
  227. if (!$error && !$notrigger) {
  228. // Call trigger
  229. $result = $this->call_trigger('ASSET_ACCOUNTANCY_CODES_MODIFY', $user);
  230. if ($result < 0) {
  231. $error++;
  232. }
  233. // End call triggers
  234. }
  235. if (!$error) {
  236. $this->db->commit();
  237. return 1;
  238. } else {
  239. $this->db->rollback();
  240. return -1;
  241. }
  242. }
  243. }