show re-pricing history in register report
This commit is contained in:
parent
7894005d28
commit
48db20547a
3 changed files with 116 additions and 18 deletions
6
Makefile
6
Makefile
|
|
@ -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
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -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
|
||||||
|
|
|
||||||
125
reports.cc
125
reports.cc
|
|
@ -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");
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Add table
Reference in a new issue