(value_expr_t::compute): Added new 'act_date' and 'eff_date' value
expressions, for getting at the explicit actual and effective dates of a transaction or entry. For accounts, these both refer to the present moment.
This commit is contained in:
parent
935f849c7d
commit
96acdec7b9
2 changed files with 41 additions and 19 deletions
58
valexpr.cc
58
valexpr.cc
|
|
@ -270,6 +270,30 @@ void value_expr_t::compute(value_t& result, const details_t& details,
|
||||||
result = long(terminus);
|
result = long(terminus);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
case ACT_DATE:
|
||||||
|
if (details.xact && transaction_has_xdata(*details.xact) &&
|
||||||
|
transaction_xdata_(*details.xact).date)
|
||||||
|
result = long(transaction_xdata_(*details.xact).date);
|
||||||
|
else if (details.xact)
|
||||||
|
result = long(details.xact->actual_date());
|
||||||
|
else if (details.entry)
|
||||||
|
result = long(details.entry->actual_date());
|
||||||
|
else
|
||||||
|
result = long(terminus);
|
||||||
|
break;
|
||||||
|
|
||||||
|
case EFF_DATE:
|
||||||
|
if (details.xact && transaction_has_xdata(*details.xact) &&
|
||||||
|
transaction_xdata_(*details.xact).date)
|
||||||
|
result = long(transaction_xdata_(*details.xact).date);
|
||||||
|
else if (details.xact)
|
||||||
|
result = long(details.xact->effective_date());
|
||||||
|
else if (details.entry)
|
||||||
|
result = long(details.entry->effective_date());
|
||||||
|
else
|
||||||
|
result = long(terminus);
|
||||||
|
break;
|
||||||
|
|
||||||
case CLEARED:
|
case CLEARED:
|
||||||
if (details.xact)
|
if (details.xact)
|
||||||
result = details.xact->state == transaction_t::CLEARED;
|
result = details.xact->state == transaction_t::CLEARED;
|
||||||
|
|
@ -513,28 +537,14 @@ void value_expr_t::compute(value_t& result, const details_t& details,
|
||||||
|
|
||||||
index = 0;
|
index = 0;
|
||||||
expr = find_leaf(context, 1, index);
|
expr = find_leaf(context, 1, index);
|
||||||
|
value_t temp;
|
||||||
|
expr->compute(temp, details, context);
|
||||||
|
|
||||||
std::time_t moment = terminus;
|
if (expr->kind == CONSTANT_T)
|
||||||
switch (expr->kind) {
|
result = result.value(expr->constant_t);
|
||||||
case F_NOW:
|
else
|
||||||
break; // already set to now
|
|
||||||
case DATE:
|
|
||||||
if (details.xact && transaction_has_xdata(*details.xact) &&
|
|
||||||
transaction_xdata_(*details.xact).date)
|
|
||||||
moment = transaction_xdata_(*details.xact).date;
|
|
||||||
else if (details.xact)
|
|
||||||
moment = details.xact->date();
|
|
||||||
else if (details.entry)
|
|
||||||
moment = details.entry->date();
|
|
||||||
break;
|
|
||||||
case CONSTANT_T:
|
|
||||||
moment = expr->constant_t;
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
throw compute_error("Invalid date passed to P(value,date)");
|
throw compute_error("Invalid date passed to P(value,date)");
|
||||||
}
|
|
||||||
|
|
||||||
result = result.value(moment);
|
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -1171,6 +1181,14 @@ void init_value_expr()
|
||||||
globals->define("d", node);
|
globals->define("d", node);
|
||||||
globals->define("date", node);
|
globals->define("date", node);
|
||||||
|
|
||||||
|
node = new value_expr_t(value_expr_t::ACT_DATE);
|
||||||
|
globals->define("act_date", node);
|
||||||
|
globals->define("actual_date", node);
|
||||||
|
|
||||||
|
node = new value_expr_t(value_expr_t::EFF_DATE);
|
||||||
|
globals->define("eff_date", node);
|
||||||
|
globals->define("effective_date", node);
|
||||||
|
|
||||||
node = new value_expr_t(value_expr_t::CLEARED);
|
node = new value_expr_t(value_expr_t::CLEARED);
|
||||||
globals->define("X", node);
|
globals->define("X", node);
|
||||||
globals->define("cleared", node);
|
globals->define("cleared", node);
|
||||||
|
|
@ -1362,6 +1380,8 @@ void dump_value_expr(std::ostream& out, const value_expr_t * node,
|
||||||
case value_expr_t::PRICE: out << "PRICE"; break;
|
case value_expr_t::PRICE: out << "PRICE"; break;
|
||||||
case value_expr_t::COST: out << "COST"; break;
|
case value_expr_t::COST: out << "COST"; break;
|
||||||
case value_expr_t::DATE: out << "DATE"; break;
|
case value_expr_t::DATE: out << "DATE"; break;
|
||||||
|
case value_expr_t::ACT_DATE: out << "ACT_DATE"; break;
|
||||||
|
case value_expr_t::EFF_DATE: out << "EFF_DATE"; break;
|
||||||
case value_expr_t::CLEARED: out << "CLEARED"; break;
|
case value_expr_t::CLEARED: out << "CLEARED"; break;
|
||||||
case value_expr_t::PENDING: out << "PENDING"; break;
|
case value_expr_t::PENDING: out << "PENDING"; break;
|
||||||
case value_expr_t::REAL: out << "REAL"; break;
|
case value_expr_t::REAL: out << "REAL"; break;
|
||||||
|
|
|
||||||
|
|
@ -72,6 +72,8 @@ struct value_expr_t
|
||||||
COST,
|
COST,
|
||||||
PRICE,
|
PRICE,
|
||||||
DATE,
|
DATE,
|
||||||
|
ACT_DATE,
|
||||||
|
EFF_DATE,
|
||||||
CLEARED,
|
CLEARED,
|
||||||
PENDING,
|
PENDING,
|
||||||
REAL,
|
REAL,
|
||||||
|
|
|
||||||
Loading…
Add table
Reference in a new issue