summaryrefslogtreecommitdiff
path: root/src/pool.cc
diff options
context:
space:
mode:
authorJohn Wiegley <johnw@newartisans.com>2010-06-04 02:52:36 -0400
committerJohn Wiegley <johnw@newartisans.com>2010-06-04 02:53:18 -0400
commitdbac09405f1dede27d21f91dddc991f76e0f7438 (patch)
treecf63db890b72a95f424ccc9fe7df4e7c39adec13 /src/pool.cc
parent946534b102da5bd9bc1e26e1c0f3869dc81457d7 (diff)
downloadfork-ledger-dbac09405f1dede27d21f91dddc991f76e0f7438.tar.gz
fork-ledger-dbac09405f1dede27d21f91dddc991f76e0f7438.tar.bz2
fork-ledger-dbac09405f1dede27d21f91dddc991f76e0f7438.zip
Added new command: "pricemap [DATE]"
This outputs the pricing relationship of commodities in your data file, as of DATE (optional), using the DOT language. If you have graphviz installed, it can be viewed quite simply using: ledger pricemap | dotty - Each relationship in the graph shows the conversion factor to exchange one commodity for another, and the date at which this factor was determined.
Diffstat (limited to 'src/pool.cc')
-rw-r--r--src/pool.cc72
1 files changed, 72 insertions, 0 deletions
diff --git a/src/pool.cc b/src/pool.cc
index 6b422351..ad97a9c6 100644
--- a/src/pool.cc
+++ b/src/pool.cc
@@ -364,4 +364,76 @@ commodity_pool_t::parse_price_expression(const std::string& str,
return NULL;
}
+void commodity_pool_t::print_pricemap(std::ostream& out,
+ const keep_details_t& keep,
+ const optional<datetime_t>& moment)
+{
+ typedef std::map<commodity_t *, commodity_t *> comm_map_t;
+
+ comm_map_t comm_map;
+
+ foreach (const commodities_map::value_type& comm_pair, commodities) {
+ commodity_t * comm(&comm_pair.second->strip_annotations(keep));
+ comm_map.insert(comm_map_t::value_type(comm, NULL));
+ }
+
+ out << "digraph commodities {\n";
+
+ foreach (const comm_map_t::value_type& comm_pair, comm_map) {
+ commodity_t * comm(comm_pair.first);
+ if (comm->has_flags(COMMODITY_BUILTIN))
+ continue;
+
+ out << " ";
+ if (commodity_t::symbol_needs_quotes(comm->symbol()))
+ out << comm->symbol() << ";\n";
+ else
+ out << "\"" << comm->symbol() << "\";\n";
+
+ if (! comm->has_flags(COMMODITY_NOMARKET) &&
+ (! commodity_pool_t::current_pool->default_commodity ||
+ comm != commodity_pool_t::current_pool->default_commodity)) {
+ if (optional<commodity_t::varied_history_t&> vhist =
+ comm->varied_history()) {
+ foreach (const commodity_t::history_by_commodity_map::value_type& pair,
+ vhist->histories) {
+ datetime_t most_recent;
+ amount_t most_recent_amt;
+ foreach (const commodity_t::history_map::value_type& inner_pair,
+ pair.second.prices) {
+ if ((most_recent.is_not_a_date_time() ||
+ inner_pair.first > most_recent) &&
+ (! moment || inner_pair.first <= moment)) {
+ most_recent = inner_pair.first;
+ most_recent_amt = inner_pair.second;
+ }
+ }
+
+ if (! most_recent.is_not_a_date_time()) {
+ out << " ";
+ if (commodity_t::symbol_needs_quotes(comm->symbol()))
+ out << comm->symbol();
+ else
+ out << "\"" << comm->symbol() << "\"";
+
+ out << " -> ";
+
+ if (commodity_t::symbol_needs_quotes(pair.first->symbol()))
+ out << pair.first->symbol();
+ else
+ out << "\"" << pair.first->symbol() << "\"";
+
+ out << " [label=\""
+ << most_recent_amt.number() << "\\n"
+ << format_date(most_recent.date(), FMT_WRITTEN)
+ << "\" fontcolor=\"#008e28\"];\n";
+ }
+ }
+ }
+ }
+ }
+
+ out << "}\n";
+}
+
} // namespace ledger