If fixated price commodities are mixed, show them

For example, if a Ledger file contains transactions with the use of both
EUR and EUR {=PRICE}, then regular reports will always show the
{=PRICE}, disabling the by-name commodity merging that takes place.  In
brief, fixated and non-fixated commodities are now non-mergable.

If a file contains all of one, or all of the other, they will still be
merged, since these separate usages do not conflict the way that fixated
and non-fixated together do.
This commit is contained in:
John Wiegley 2010-06-20 18:54:21 -04:00
parent 6420390d36
commit 82e43fe125
4 changed files with 95 additions and 23 deletions

View file

@ -166,16 +166,28 @@ annotated_commodity_t::strip_annotations(const keep_details_t& what_to_keep)
commodity_t * new_comm;
bool keep_price = (what_to_keep.keep_price &&
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 &&
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 &&
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) ||
(keep_tag && details.tag))
@ -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);
}
assert(new_comm);
return *new_comm;
}
return referent();
}
void annotated_commodity_t::write_annotations

View file

@ -174,6 +174,9 @@ protected:
#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;

View file

@ -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)

View file

@ -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}