summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorJohn Wiegley <johnw@newartisans.com>2009-03-02 16:39:26 -0400
committerJohn Wiegley <johnw@newartisans.com>2009-03-02 16:39:26 -0400
commit1c7de0f9e4d6372ab80a90f0ccd8ce7314466686 (patch)
tree48aa139446af98005c983b94de70d73acdf3d61c /src
parentc10c01e5a5eef1963d5ba7d97831e3185fb7cf30 (diff)
downloadledger-1c7de0f9e4d6372ab80a90f0ccd8ce7314466686.tar.gz
ledger-1c7de0f9e4d6372ab80a90f0ccd8ce7314466686.tar.bz2
ledger-1c7de0f9e4d6372ab80a90f0ccd8ce7314466686.zip
Added "fixated commodity pricing"
If you put '=' before an annotated commodity's price, it will cause any future market valuation of that commodity to use that price, and ignore whatever changes may have happened since in the market price. This can be useful if you are tracking gas expenses based on a standard rate which, although it changes over time, should not adjust the historical valuation of how much the gas cost at the time it was purchased: 2009/01/01 Payee Expenses:Gas 100 GAL {=$2} Liabilities:MasterCard $-200
Diffstat (limited to 'src')
-rw-r--r--src/amount.cc4
-rw-r--r--src/commodity.cc11
-rw-r--r--src/commodity.h5
3 files changed, 17 insertions, 3 deletions
diff --git a/src/amount.cc b/src/amount.cc
index cc568bb1..f6b3edfb 100644
--- a/src/amount.cc
+++ b/src/amount.cc
@@ -546,6 +546,10 @@ amount_t::value(const bool primary_only,
if (in_terms_of && commodity() == *in_terms_of) {
return *this;
}
+ else if (is_annotated() && annotation().price &&
+ annotation().has_flags(ANNOTATION_PRICE_FIXATED)) {
+ return (*annotation().price * number()).rounded();
+ }
else if (optional<price_point_t> point =
commodity().find_price(in_terms_of, moment)) {
return (point->price * number()).rounded();
diff --git a/src/commodity.cc b/src/commodity.cc
index 1c849624..08252cf4 100644
--- a/src/commodity.cc
+++ b/src/commodity.cc
@@ -638,6 +638,12 @@ void annotation_t::parse(std::istream& in)
throw_(amount_error, _("Commodity specifies more than one price"));
in.get(c);
+ c = peek_next_nonws(in);
+ if (c == '=') {
+ in.get(c);
+ add_flags(ANNOTATION_PRICE_FIXATED);
+ }
+
READ_INTO(in, buf, 255, c, c != '}');
if (c == '}')
in.get(c);
@@ -761,7 +767,10 @@ void annotated_commodity_t::write_annotations(std::ostream& out) const
void annotation_t::print(std::ostream& out, bool keep_base) const
{
if (price)
- out << " {" << (keep_base ? *price : price->unreduced()).rounded() << '}';
+ out << " {"
+ << (has_flags(ANNOTATION_PRICE_FIXATED) ? "=" : "")
+ << (keep_base ? *price : price->unreduced()).rounded()
+ << '}';
if (date)
out << " [" << format_date(*date, string("%Y/%m/%d")) << ']';
diff --git a/src/commodity.h b/src/commodity.h
index 310a0a89..c152dfc7 100644
--- a/src/commodity.h
+++ b/src/commodity.h
@@ -363,8 +363,9 @@ struct annotation_t : public supports_flags<>,
public equality_comparable<annotation_t>
{
#define ANNOTATION_PRICE_CALCULATED 0x01
-#define ANNOTATION_DATE_CALCULATED 0x02
-#define ANNOTATION_TAG_CALCULATED 0x04
+#define ANNOTATION_PRICE_FIXATED 0x02
+#define ANNOTATION_DATE_CALCULATED 0x04
+#define ANNOTATION_TAG_CALCULATED 0x08
optional<amount_t> price;
optional<date_t> date;