diff options
-rw-r--r-- | src/annotate.cc | 50 | ||||
-rw-r--r-- | src/commodity.h | 23 | ||||
-rw-r--r-- | src/pool.cc | 12 | ||||
-rw-r--r-- | test/regress/C0212EAC.test | 33 |
4 files changed, 95 insertions, 23 deletions
diff --git a/src/annotate.cc b/src/annotate.cc index 08b73443..33c0aebb 100644 --- a/src/annotate.cc +++ b/src/annotate.cc @@ -166,15 +166,27 @@ annotated_commodity_t::strip_annotations(const keep_details_t& what_to_keep) commodity_t * new_comm; - bool keep_price = (what_to_keep.keep_price && - (! what_to_keep.only_actuals || - ! details.has_flags(ANNOTATION_PRICE_CALCULATED))); - bool keep_date = (what_to_keep.keep_date && - (! what_to_keep.only_actuals || - ! details.has_flags(ANNOTATION_DATE_CALCULATED))); - bool keep_tag = (what_to_keep.keep_tag && - (! what_to_keep.only_actuals || - ! details.has_flags(ANNOTATION_TAG_CALCULATED))); + bool keep_price = + ((what_to_keep.keep_price || + (details.has_flags(ANNOTATION_PRICE_FIXATED) && + has_flags(COMMODITY_SAW_ANN_PRICE_FLOAT) && + has_flags(COMMODITY_SAW_ANN_PRICE_FIXATED))) && + (! what_to_keep.only_actuals || + ! details.has_flags(ANNOTATION_PRICE_CALCULATED))); + bool keep_date = + (what_to_keep.keep_date && + (! what_to_keep.only_actuals || + ! details.has_flags(ANNOTATION_DATE_CALCULATED))); + bool keep_tag = + (what_to_keep.keep_tag && + (! what_to_keep.only_actuals || + ! details.has_flags(ANNOTATION_TAG_CALCULATED))); + + DEBUG("commodity.annotated.strip", + "Reducing commodity " << *this << std::endl + << " keep price " << keep_price << " " + << " keep date " << keep_date << " " + << " keep tag " << keep_tag); if ((keep_price && details.price) || (keep_date && details.date) || @@ -184,12 +196,24 @@ annotated_commodity_t::strip_annotations(const keep_details_t& what_to_keep) (referent(), annotation_t(keep_price ? details.price : none, keep_date ? details.date : none, keep_tag ? details.tag : none)); - } else { - new_comm = &referent(); + + // Transfer over any relevant annotation flags, as they still apply. + if (new_comm->annotated) { + annotation_t& new_details(as_annotated_commodity(*new_comm).details); + if (keep_price) + new_details.add_flags(details.flags() & + (ANNOTATION_PRICE_CALCULATED | + ANNOTATION_PRICE_FIXATED)); + if (keep_date) + new_details.add_flags(details.flags() & ANNOTATION_DATE_CALCULATED); + if (keep_tag) + new_details.add_flags(details.flags() & ANNOTATION_TAG_CALCULATED); + } + + return *new_comm; } - assert(new_comm); - return *new_comm; + return referent(); } void annotated_commodity_t::write_annotations diff --git a/src/commodity.h b/src/commodity.h index 24cd5a08..fcd26da0 100644 --- a/src/commodity.h +++ b/src/commodity.h @@ -164,16 +164,19 @@ protected: class base_t : public noncopyable, public supports_flags<uint_least16_t> { public: -#define COMMODITY_STYLE_DEFAULTS 0x000 -#define COMMODITY_STYLE_SUFFIXED 0x001 -#define COMMODITY_STYLE_SEPARATED 0x002 -#define COMMODITY_STYLE_DECIMAL_COMMA 0x004 -#define COMMODITY_STYLE_THOUSANDS 0x008 -#define COMMODITY_NOMARKET 0x010 -#define COMMODITY_BUILTIN 0x020 -#define COMMODITY_WALKED 0x040 -#define COMMODITY_KNOWN 0x080 -#define COMMODITY_PRIMARY 0x100 +#define COMMODITY_STYLE_DEFAULTS 0x000 +#define COMMODITY_STYLE_SUFFIXED 0x001 +#define COMMODITY_STYLE_SEPARATED 0x002 +#define COMMODITY_STYLE_DECIMAL_COMMA 0x004 +#define COMMODITY_STYLE_THOUSANDS 0x008 +#define COMMODITY_NOMARKET 0x010 +#define COMMODITY_BUILTIN 0x020 +#define COMMODITY_WALKED 0x040 +#define COMMODITY_KNOWN 0x080 +#define COMMODITY_PRIMARY 0x100 +#define COMMODITY_SAW_ANNOTATED 0x200 +#define COMMODITY_SAW_ANN_PRICE_FLOAT 0x400 +#define COMMODITY_SAW_ANN_PRICE_FIXATED 0x800 string symbol; amount_t::precision_t precision; diff --git a/src/pool.cc b/src/pool.cc index df20d179..20b585dd 100644 --- a/src/pool.cc +++ b/src/pool.cc @@ -172,12 +172,21 @@ commodity_pool_t::create(commodity_t& comm, const string& mapping_key) { assert(comm); + assert(! comm.has_annotation()); assert(details); assert(! mapping_key.empty()); std::auto_ptr<commodity_t> commodity (new annotated_commodity_t(&comm, details)); + comm.add_flags(COMMODITY_SAW_ANNOTATED); + if (details.price) { + if (details.has_flags(ANNOTATION_PRICE_FIXATED)) + comm.add_flags(COMMODITY_SAW_ANN_PRICE_FIXATED); + else + comm.add_flags(COMMODITY_SAW_ANN_PRICE_FLOAT); + } + commodity->qualified_symbol = comm.symbol(); assert(! commodity->qualified_symbol->empty()); @@ -282,6 +291,9 @@ commodity_pool_t::exchange(const amount_t& amount, moment->date() : optional<date_t>(), tag); annotation.add_flags(ANNOTATION_PRICE_CALCULATED); + if (current_annotation && + current_annotation->has_flags(ANNOTATION_PRICE_FIXATED)) + annotation.add_flags(ANNOTATION_PRICE_FIXATED); if (moment) annotation.add_flags(ANNOTATION_DATE_CALCULATED); if (tag) diff --git a/test/regress/C0212EAC.test b/test/regress/C0212EAC.test new file mode 100644 index 00000000..da178054 --- /dev/null +++ b/test/regress/C0212EAC.test @@ -0,0 +1,33 @@ +reg +<<< +2007-01-01 Opening balances + Assets:Cash 10.00 EUR + Equity:Opening balances + +2008-01-01 Buy 5.00 GBP + Assets:Cash 5.00 GBP @ 1.4 EUR + Assets:Checking + +2009-01-01 Sell 5.00 GBP for 7.50 EUR that I bought for 7.00 EUR + Assets:Cash -5.00 GBP {=1.4 EUR} @ 1.5 EUR + Assets:Checking 7.50 EUR + Income:Gain + +P 2009-02-01 00:00:00 GBP 1.5 EUR +>>> +07-Jan-01 Opening balances Assets:Cash 10.00 EUR 10.00 EUR + Equit:Opening balances -10.00 EUR 0 +08-Jan-01 Buy 5.00 GBP Assets:Cash 5.00 GBP 5.00 GBP + Assets:Checking -7.00 EUR -7.00 EUR + 5.00 GBP +09-Jan-01 Sell 5.00 GBP for 7.. Assets:Cash -5.00 GBP {=1.40 EUR} -7.00 EUR + 5.00 GBP + -5.00 GBP {=1.40 EUR} + Assets:Checking 7.50 EUR 0.50 EUR + 5.00 GBP + -5.00 GBP {=1.40 EUR} + Income:Gain -0.50 EUR 5.00 GBP + -5.00 GBP {=1.40 EUR} + Equity:Capital Gains 0.50 EUR 0.50 EUR + 5.00 GBP + -5.00 GBP {=1.40 EUR} |