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中被重新计算。