Drupal:计算折旧和评价
来自站长百科
这里有不少被用来计算直线折旧(straight-line depreciation)和给定节点当前估算价格的代码片段。
用户输入CCK字段(user input CCK fields)为2个日期(需要日期模块(date module))和2个价格: 1. purchase_date (iso日期格式) 2. expire_date (iso日期格式) 3. purchase_value (小数格式) 4. expire_value (小数格式) - 当物品达到使用寿命时这是它的 'scrap value(残余价格)' 。
第一个函数计算折旧的年比率(annual rate of depreciation):
<?php if (!$node->nid) node_save($node); $start_date = date_make_date($node->field_purchase_date[0]['value']); $start = $start_date->db->parts; $end_date = date_make_date($node->field_expire_date[0]['value']); $end = $end_date->db->parts; $start_decimal = $start['year'] + ($start['mon'] / 12); // 此给出年折旧 $end_decimal = $end['year'] + ($end['mon'] / 12); // $start_decimal = ($start['year'] * 12) + $start['mon']; // 此给出月折旧 // $end_decimal = ($end['year'] * 12) + $end['mon']; $useful_life = $end_decimal - $start_decimal; $start_value = ($node->field_purchase_value[0]['value']); $end_value = ($node->field_expire_value[0]['value']); $useful_value = ($start_value - $end_value); $node_field[0]['value'] = ($useful_value / $useful_life); ?>
结果应以浮点类型被保存在数据库中,数据长度为10,2 而且允许 NULL价格。它仅当可编辑节点字段(node-editable field)改变时才会更新(节点就被重新提交了)。
第二个函数是第一个函数的衍生(但不依赖第一个函数)。它根据相同的线状折旧计算(linear depreciation calculation)来计算当前数价格(current value)。
<?php if (!$node->nid) node_save($node); // 读取日期并设置为小数格式 $today = time(); // 读取当前时间,我们可以代之使用$node->updated... 见后文的注解 $start_date = date_make_date($node->field_purchase_date[0]['value']); $start = $start_date->db->parts; $end_date = date_make_date($node->field_expire_date[0]['value']); $end = $end_date->db->parts; $today_decimal = ($today / 31556952) + 1970.083; // 将unix时间转换为小数形式(很粗略,但是用作估算还是不错的 ;) $start_decimal = $start['year'] + ($start['mon'] / 12); // 将iso格式转换为小数形式 $end_decimal = $end['year'] + ($end['mon'] / 12); $useful_life = $end_decimal - $start_decimal; $used_life = $today_decimal - $start_decimal; // 读取购买价格和残余价格并计算出折旧价格 $start_value = ($node->field_purchase_value[0]['value']); $end_value = ($node->field_expire_value[0]['value']); $useful_value = ($start_value - $end_value); // 计算经估算的当前价格并四舍五入 $est_value = round(($useful_value / $useful_life) * $used_life); // 确定估算价格永不能低于残余价格. if ($today_decimal > $end_decimal) { $node_field[0]['value'] = ($end_value . ' (expired)'); } else { $node_field[0]['value'] = ($est_value . ' (estimated)'); } ?>
如果这被保存在了数据库中,它仅当节点从节点编辑表中提交时才会更新(即根据当前日期重新进行计算)--仅当节点(重新)提交时。我正探寻让当前价格可以在Views中被重新计算。