show re-pricing history in register report

This commit is contained in:
John Wiegley 2004-06-22 01:48:16 -04:00 committed by johnw
parent 7894005d28
commit 48db20547a
3 changed files with 116 additions and 18 deletions

View file

@ -2,9 +2,9 @@ CODE = amount.cc ledger.cc parse.cc reports.cc
OBJS = $(patsubst %.cc,%.o,$(CODE)) OBJS = $(patsubst %.cc,%.o,$(CODE))
#CXX = cc #CXX = cc
CXX = g++ CXX = g++
CFLAGS = #-Wall -ansi -pedantic CFLAGS = -Wall -ansi -pedantic
DFLAGS = -O3 -fomit-frame-pointer #DFLAGS = -O3 -fomit-frame-pointer
#DFLAGS = -g -DDEBUG=1 DFLAGS = -g -DDEBUG=1
INCS = -I/sw/include -I/usr/include/gcc/darwin/3.3/c++ -I/usr/include/gcc/darwin/3.3/c++/ppc-darwin INCS = -I/sw/include -I/usr/include/gcc/darwin/3.3/c++ -I/usr/include/gcc/darwin/3.3/c++/ppc-darwin
LIBS = -L/sw/lib -lgmpxx -lgmp -lpcre LIBS = -L/sw/lib -lgmpxx -lgmp -lpcre

View file

@ -40,13 +40,12 @@ amount * commodity::price(std::time_t * when,
for (price_map::reverse_iterator i = history.rbegin(); for (price_map::reverse_iterator i = history.rbegin();
i != history.rend(); i != history.rend();
i++) { i++)
if (std::difftime(*when, (*i).first) >= 0) { if (std::difftime(*when, (*i).first) >= 0) {
age = (*i).first; age = (*i).first;
price = (*i).second; price = (*i).second;
break; break;
} }
}
extern long pricing_leeway; extern long pricing_leeway;
time_t now = time(NULL); // the time of the query time_t now = time(NULL); // the time of the query

View file

@ -20,7 +20,6 @@ static bool gnuplot_safe = false;
static bool cost_basis = false; static bool cost_basis = false;
static bool use_history = false; static bool use_history = false;
static bool read_prices = false;
static bool get_quotes = false; static bool get_quotes = false;
long pricing_leeway = 24 * 3600; long pricing_leeway = 24 * 3600;
std::string price_db; std::string price_db;
@ -392,18 +391,94 @@ enum periodicity_t {
PERIOD_WEEKLY_MON PERIOD_WEEKLY_MON
}; };
void print_register_transaction(std::ostream& out, entry *ent, static totals * compute_street_balance(totals& balance, std::time_t * date)
transaction *xact, totals& balance)
{ {
totals * prev_street_balance = new totals;
for (totals::const_iterator i = balance.amounts.begin();
i != balance.amounts.end();
i++)
if (! (*i).second->is_zero()) {
amount * street = (*i).second->street(date, use_history, get_quotes);
prev_street_balance->credit(street);
delete street;
}
return prev_street_balance;
}
static totals * prev_balance = NULL;
static std::time_t prev_date;
void print_register_transaction(std::ostream& out, entry * ent,
transaction * xact, totals& balance);
static void report_change_in_asset_value(std::ostream& out, std::time_t date,
account * acct, totals& balance)
{
totals * prev_street_balance =
compute_street_balance(*prev_balance, &prev_date);
totals * curr_street_balance =
compute_street_balance(*prev_balance, &date);
delete prev_balance;
prev_balance = NULL;
prev_street_balance->negate();
curr_street_balance->credit(*prev_street_balance);
if (! curr_street_balance->is_zero()) {
for (totals::const_iterator i = curr_street_balance->amounts.begin();
i != curr_street_balance->amounts.end();
i++) {
if ((*i).second->is_zero())
continue;
entry change(main_ledger);
change.date = date;
change.cleared = true;
change.desc = "Assets revalued";
transaction * trans = new transaction();
trans->acct = const_cast<account *>(acct);
trans->cost = (*i).second->copy();
change.xacts.push_back(trans);
transaction * trans2 = new transaction();
trans2->acct = main_ledger->find_account("Equity:Asset Gain");
trans2->cost = (*i).second->copy();
trans2->cost->negate();
change.xacts.push_back(trans2);
balance.credit(trans2->cost);
print_register_transaction(out, &change, trans, balance);
delete prev_balance;
prev_balance = NULL;
}
}
delete prev_street_balance;
delete curr_street_balance;
}
void print_register_transaction(std::ostream& out, entry * ent,
transaction * xact, totals& balance)
{
if (prev_balance)
report_change_in_asset_value(out, ent->date, xact->acct, balance);
char buf[32]; char buf[32];
std::strftime(buf, 31, "%m/%d ", std::localtime(&ent->date)); std::strftime(buf, 31, "%Y/%m/%d ", std::localtime(&ent->date));
out << buf; out << buf;
out.width(25); out.width(20);
if (ent->desc.empty()) if (ent->desc.empty())
out << " "; out << " ";
else else
out << std::left << truncated(ent->desc, 25); out << std::left << truncated(ent->desc, 20);
out << " "; out << " ";
// Always display the street value, if prices have been // Always display the street value, if prices have been
@ -442,6 +517,11 @@ void print_register_transaction(std::ostream& out, entry *ent,
out << std::endl; out << std::endl;
assert(! prev_balance);
prev_balance = new totals;
prev_balance->credit(balance);
prev_date = ent->date;
if (! show_children || xp != xact) if (! show_children || xp != xact)
return; return;
@ -466,6 +546,14 @@ void print_register_transaction(std::ostream& out, entry *ent,
void print_register_period(std::ostream& out, std::time_t date, void print_register_period(std::ostream& out, std::time_t date,
account * acct, amount& sum, totals& balance) account * acct, amount& sum, totals& balance)
{ {
if (! gnuplot_safe && prev_balance) {
sum.negate();
balance.credit(&sum);
report_change_in_asset_value(out, date, acct, balance);
sum.negate();
balance.credit(&sum);
}
char buf[32]; char buf[32];
std::strftime(buf, 31, "%Y/%m/%d ", std::localtime(&date)); std::strftime(buf, 31, "%Y/%m/%d ", std::localtime(&date));
out << buf; out << buf;
@ -489,9 +577,15 @@ void print_register_period(std::ostream& out, std::time_t date,
out.width(12); out.width(12);
out << std::right << sum.as_str(); out << std::right << sum.as_str();
if (! gnuplot_safe) if (! gnuplot_safe) {
print_resolved_balance(out, &date, balance, true); print_resolved_balance(out, &date, balance, true);
assert(! prev_balance);
prev_balance = new totals;
prev_balance->credit(balance);
prev_date = date;
}
out << std::endl; out << std::endl;
} }
@ -547,19 +641,24 @@ void print_register(std::ostream& out, const std::string& acct_name,
period_sum = street; period_sum = street;
} }
last_acct = (*x)->acct;
last_date = (*i)->date;
last_mon = entry_mon; last_mon = entry_mon;
} }
last_date = (*i)->date;
last_acct = (*x)->acct;
} }
} }
if (period_sum) { if (period_sum) {
if (last_acct) if (last_acct)
print_register_period(out, last_date, last_acct, print_register_period(out, last_date, last_acct, *period_sum, balance);
*period_sum, balance);
delete period_sum; delete period_sum;
} }
if (! gnuplot_safe && prev_balance) {
report_change_in_asset_value(out, have_ending ? end_date : std::time(NULL),
last_acct, balance);
}
} }
////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////
@ -953,7 +1052,7 @@ int main(int argc, char * argv[])
break; break;
case 'P': case 'P':
price_db = optarg; price_db = optarg;
break; break;
case 'Q': case 'Q':
@ -1048,7 +1147,7 @@ int main(int argc, char * argv[])
} }
} }
if (read_prices && ! price_db.empty()) if (use_history && ! price_db.empty())
entry_count += parse_ledger_file(main_ledger, price_db, regexps, entry_count += parse_ledger_file(main_ledger, price_db, regexps,
command == "equity"); command == "equity");