summaryrefslogtreecommitdiff
path: root/src/post.cc
diff options
context:
space:
mode:
Diffstat (limited to 'src/post.cc')
-rw-r--r--src/post.cc49
1 files changed, 49 insertions, 0 deletions
diff --git a/src/post.cc b/src/post.cc
index 191a9142..babb1292 100644
--- a/src/post.cc
+++ b/src/post.cc
@@ -36,6 +36,7 @@
#include "account.h"
#include "journal.h"
#include "format.h"
+#include "pool.h"
namespace ledger {
@@ -239,6 +240,15 @@ namespace {
return post.amount;
}
+ value_t get_price(post_t& post) {
+ if (post.amount.is_null())
+ return 0L;
+ if (post.amount.has_annotation() && post.amount.annotation().price)
+ return *post.amount.price();
+ else
+ return get_cost(post);
+ }
+
value_t get_total(post_t& post) {
if (post.xdata_ && ! post.xdata_->total.is_null())
return post.xdata_->total;
@@ -474,6 +484,8 @@ expr_t::ptr_op_t post_t::lookup(const symbol_t::kind_t kind,
return WRAP_FUNCTOR(get_wrapper<&get_payee>);
else if (name == "primary")
return WRAP_FUNCTOR(get_wrapper<&get_commodity_is_primary>);
+ else if (name == "price")
+ return WRAP_FUNCTOR(get_wrapper<&get_price>);
else if (name == "parent")
return WRAP_FUNCTOR(get_wrapper<&get_xact>);
break;
@@ -638,6 +650,43 @@ void post_t::set_reported_account(account_t * acct)
acct->xdata().reported_posts.push_back(this);
}
+void extend_post(post_t& post, journal_t& journal)
+{
+ commodity_t& comm(post.amount.commodity());
+
+ annotation_t * details =
+ (comm.has_annotation() ?
+ &as_annotated_commodity(comm).details : NULL);
+
+ if (! details || ! details->value_expr) {
+ optional<expr_t> value_expr;
+
+ if (optional<value_t> data = post.get_tag(_("Value")))
+ value_expr = expr_t(data->to_string());
+
+ if (! value_expr)
+ value_expr = post.account->value_expr;
+
+ if (! value_expr)
+ value_expr = post.amount.commodity().value_expr();
+
+ if (! value_expr)
+ value_expr = journal.value_expr;
+
+ if (value_expr) {
+ if (! details) {
+ annotation_t new_details;
+ new_details.value_expr = value_expr;
+ commodity_t * new_comm =
+ commodity_pool_t::current_pool->find_or_create(comm, new_details);
+ post.amount.set_commodity(*new_comm);
+ } else {
+ details->value_expr = value_expr;
+ }
+ }
+ }
+}
+
void to_xml(std::ostream& out, const post_t& post)
{
push_xml x(out, "posting", true);