more fixes

This commit is contained in:
John Wiegley 2004-08-11 03:39:58 -04:00
parent cd8f61fb2d
commit 33b6cfa801
2 changed files with 37 additions and 20 deletions

36
walk.cc
View file

@ -71,15 +71,26 @@ void changed_value_transactions::operator()(transaction_t * xact)
last_xact->entry->date = prev_date;
if (balance_t diff = cur_bal - prev_bal) {
modified_entry.date = current;
entry_t * entry = new entry_t;
// jww (2004-08-07): What if there are multiple commodities?
assert(diff.amounts.size() == 1);
modified_xact.amount = diff.amount();
modified_xact.total = diff;
modified_xact.total.negate();
entry->payee = "Commodities revalued";
entry->date = current;
(*handler)(&modified_xact);
entry_temps.push_back(entry);
for (amounts_map::const_iterator i = diff.amounts.begin();
i != diff.amounts.end();
i++) {
transaction_t * temp_xact = new transaction_t(entry, NULL);
temp_xact->amount = (*i).second;
temp_xact->total = (*i).second;
temp_xact->total.negate();
xact_temps.push_back(temp_xact);
(*handler)(temp_xact);
}
}
}
@ -92,7 +103,6 @@ void changed_value_transactions::operator()(transaction_t * xact)
void subtotal_transactions::flush()
{
entry_t * entry = new entry_t;
entry->date = start;
char buf[256];
// jww (2004-08-10): allow for a format string here
@ -104,22 +114,22 @@ void subtotal_transactions::flush()
for (balances_map::iterator i = balances.begin();
i != balances.end();
i++) {
entry->date = finish;
transaction_t * xact = new transaction_t(entry, (*i).first);
xact->total = (*i).second;
balance_t result;
format_t::compute_total(result, details_t(xact));
xact->total = 0;
entry->date = start;
xact_temps.push_back(xact);
for (amounts_map::const_iterator j = result.amounts.begin();
j != result.amounts.end();
j++) {
xact->amount = (*j).second;
xact->cost = (*j).second;
xact->amount = xact->cost = (*j).second;
(*handler)(xact);
}
xact_temps.push_back(xact);
}
balances.clear();

21
walk.h
View file

@ -191,24 +191,31 @@ class collapse_transactions : public item_handler<transaction_t>
class changed_value_transactions : public item_handler<transaction_t>
{
entry_t modified_entry;
transaction_t modified_xact;
transaction_t * last_xact;
item_handler<transaction_t> * handler;
entries_deque entry_temps;
transactions_deque xact_temps;
public:
changed_value_transactions(item_handler<transaction_t> * _handler)
: modified_xact(&modified_entry, NULL), last_xact(NULL),
handler(_handler) {
assert(handler);
modified_entry.payee = "Commodities revalued";
}
: last_xact(NULL), handler(_handler) {}
virtual ~changed_value_transactions() {
flush();
handler->flush();
delete handler;
for (entries_deque::iterator i = entry_temps.begin();
i != entry_temps.end();
i++)
delete *i;
for (transactions_deque::iterator i = xact_temps.begin();
i != xact_temps.end();
i++)
delete *i;
}
virtual void flush() {