Fixed the use of --effective and --date-format (-y).
This commit is contained in:
parent
cad86ed87f
commit
6ca01af594
8 changed files with 53 additions and 51 deletions
|
|
@ -11,7 +11,7 @@ N $
|
||||||
Assets:Bank:Checking $1,000.00
|
Assets:Bank:Checking $1,000.00
|
||||||
Equity:Opening Balances
|
Equity:Opening Balances
|
||||||
|
|
||||||
2004/05/01 * Investment balance
|
2004/05/03=2004/05/01 * Investment balance
|
||||||
Assets:Brokerage 50 AAPL @ $30.00
|
Assets:Brokerage 50 AAPL @ $30.00
|
||||||
Equity:Opening Balances
|
Equity:Opening Balances
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -420,10 +420,12 @@ void subtotal_xacts::report_subtotal(const char * spec_fmt)
|
||||||
|
|
||||||
void subtotal_xacts::operator()(xact_t& xact)
|
void subtotal_xacts::operator()(xact_t& xact)
|
||||||
{
|
{
|
||||||
if (! is_valid(start) || xact.date() < start)
|
date_t when = xact.date();
|
||||||
start = xact.date();
|
|
||||||
if (! is_valid(finish) || xact.date() > finish)
|
if (! is_valid(start) || when < start)
|
||||||
finish = xact.date();
|
start = when;
|
||||||
|
if (! is_valid(finish) || when > finish)
|
||||||
|
finish = when;
|
||||||
|
|
||||||
account_t * acct = xact.reported_account();
|
account_t * acct = xact.reported_account();
|
||||||
assert(acct);
|
assert(acct);
|
||||||
|
|
@ -466,7 +468,7 @@ void interval_xacts::report_subtotal(const date_t& date)
|
||||||
|
|
||||||
void interval_xacts::operator()(xact_t& xact)
|
void interval_xacts::operator()(xact_t& xact)
|
||||||
{
|
{
|
||||||
const date_t& date(xact.date());
|
date_t date = xact.date();
|
||||||
|
|
||||||
if ((is_valid(interval.begin) && date < interval.begin) ||
|
if ((is_valid(interval.begin) && date < interval.begin) ||
|
||||||
(is_valid(interval.end) && date >= interval.end))
|
(is_valid(interval.end) && date >= interval.end))
|
||||||
|
|
|
||||||
|
|
@ -377,6 +377,14 @@ void global_scope_t::normalize_report_options(const string& verb)
|
||||||
|
|
||||||
report_t& rep(report());
|
report_t& rep(report());
|
||||||
|
|
||||||
|
// jww (2009-02-09): These global are a hack, but hard to avoid
|
||||||
|
item_t::use_effective_date = rep.HANDLED(effective);
|
||||||
|
|
||||||
|
if (rep.HANDLED(date_format_)) {
|
||||||
|
output_datetime_format = rep.HANDLER(date_format_).str() + " %H:%M:%S";
|
||||||
|
output_date_format = rep.HANDLER(date_format_).str();
|
||||||
|
}
|
||||||
|
|
||||||
// jww (2008-08-14): This code really needs to be rationalized away
|
// jww (2008-08-14): This code really needs to be rationalized away
|
||||||
// for 3.0.
|
// for 3.0.
|
||||||
|
|
||||||
|
|
|
||||||
17
src/item.cc
17
src/item.cc
|
|
@ -33,6 +33,8 @@
|
||||||
|
|
||||||
namespace ledger {
|
namespace ledger {
|
||||||
|
|
||||||
|
bool item_t::use_effective_date = false;
|
||||||
|
|
||||||
bool item_t::has_tag(const string& tag) const
|
bool item_t::has_tag(const string& tag) const
|
||||||
{
|
{
|
||||||
if (! metadata)
|
if (! metadata)
|
||||||
|
|
@ -136,12 +138,8 @@ namespace {
|
||||||
}
|
}
|
||||||
|
|
||||||
value_t get_date(item_t& item) {
|
value_t get_date(item_t& item) {
|
||||||
if (optional<date_t> date = item.date())
|
return item.date();
|
||||||
return *date;
|
|
||||||
else
|
|
||||||
return 0L;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
value_t get_note(item_t& item) {
|
value_t get_note(item_t& item) {
|
||||||
return string_value(item.note ? *item.note : empty_string);
|
return string_value(item.note ? *item.note : empty_string);
|
||||||
}
|
}
|
||||||
|
|
@ -334,6 +332,13 @@ string item_context(const item_t& item, const string& desc)
|
||||||
assert(len > 0);
|
assert(len > 0);
|
||||||
assert(len < 2048);
|
assert(len < 2048);
|
||||||
|
|
||||||
|
std::ostringstream out;
|
||||||
|
|
||||||
|
if (item.pathname == path("/dev/stdin")) {
|
||||||
|
out << desc << " from standard input:";
|
||||||
|
return out.str();
|
||||||
|
}
|
||||||
|
|
||||||
ifstream in(item.pathname);
|
ifstream in(item.pathname);
|
||||||
in.seekg(item.beg_pos, std::ios::beg);
|
in.seekg(item.beg_pos, std::ios::beg);
|
||||||
|
|
||||||
|
|
@ -342,8 +347,6 @@ string item_context(const item_t& item, const string& desc)
|
||||||
assert(static_cast<std::size_t>(in.gcount()) == len);
|
assert(static_cast<std::size_t>(in.gcount()) == len);
|
||||||
buf[len] = '\0';
|
buf[len] = '\0';
|
||||||
|
|
||||||
std::ostringstream out;
|
|
||||||
|
|
||||||
out << desc << " from \"" << item.pathname.string() << "\"";
|
out << desc << " from \"" << item.pathname.string() << "\"";
|
||||||
|
|
||||||
if (item.beg_line != item.end_line)
|
if (item.beg_line != item.end_line)
|
||||||
|
|
|
||||||
|
|
@ -126,8 +126,13 @@ public:
|
||||||
virtual void parse_tags(const char * p, int current_year = -1);
|
virtual void parse_tags(const char * p, int current_year = -1);
|
||||||
virtual void append_note(const char * p, int current_year = -1);
|
virtual void append_note(const char * p, int current_year = -1);
|
||||||
|
|
||||||
|
static bool use_effective_date;
|
||||||
|
|
||||||
virtual date_t date() const {
|
virtual date_t date() const {
|
||||||
assert(_date);
|
assert(_date);
|
||||||
|
if (use_effective_date)
|
||||||
|
if (optional<date_t> effective = effective_date())
|
||||||
|
return *effective;
|
||||||
return *_date;
|
return *_date;
|
||||||
}
|
}
|
||||||
virtual optional<date_t> effective_date() const {
|
virtual optional<date_t> effective_date() const {
|
||||||
|
|
|
||||||
|
|
@ -44,7 +44,7 @@ report_t::report_t(session_t& _session) : session(_session)
|
||||||
HANDLER(date_format_).on("%y-%b-%d");
|
HANDLER(date_format_).on("%y-%b-%d");
|
||||||
|
|
||||||
HANDLER(register_format_).on(
|
HANDLER(register_format_).on(
|
||||||
"%-.9(display_date) %-.20(payee)"
|
"%-.9(date) %-.20(payee)"
|
||||||
" %-.23(truncate(account, 23, 2))"
|
" %-.23(truncate(account, 23, 2))"
|
||||||
" %!12(print_balance(strip(display_amount), 12, 67))"
|
" %!12(print_balance(strip(display_amount), 12, 67))"
|
||||||
" %!12(print_balance(strip(display_total), 12, 80, true))\n%/"
|
" %!12(print_balance(strip(display_total), 12, 80, true))\n%/"
|
||||||
|
|
@ -82,7 +82,7 @@ report_t::report_t(session_t& _session) : session(_session)
|
||||||
HANDLER(pricesdb_format_).on("P %[%Y/%m/%d %H:%M:%S] %A %t\n");
|
HANDLER(pricesdb_format_).on("P %[%Y/%m/%d %H:%M:%S] %A %t\n");
|
||||||
|
|
||||||
HANDLER(csv_format_).on(
|
HANDLER(csv_format_).on(
|
||||||
"%(quoted(display_date)),"
|
"%(quoted(date)),"
|
||||||
"%(quoted(payee)),"
|
"%(quoted(payee)),"
|
||||||
"%(quoted(account)),"
|
"%(quoted(account)),"
|
||||||
"%(quoted(display_amount)),"
|
"%(quoted(display_amount)),"
|
||||||
|
|
@ -151,28 +151,6 @@ value_t report_t::fn_total_expr(call_scope_t& scope)
|
||||||
return HANDLER(total_).expr.calc(scope);
|
return HANDLER(total_).expr.calc(scope);
|
||||||
}
|
}
|
||||||
|
|
||||||
value_t report_t::fn_display_date(call_scope_t& args)
|
|
||||||
{
|
|
||||||
item_t& item(find_scope<item_t>(args));
|
|
||||||
|
|
||||||
// jww (2009-02-06): Should we be calling reported_date here?
|
|
||||||
|
|
||||||
date_t when;
|
|
||||||
if (HANDLED(effective)) {
|
|
||||||
if (optional<date_t> date = item.effective_date())
|
|
||||||
when = *date;
|
|
||||||
else
|
|
||||||
when = item.date();
|
|
||||||
} else {
|
|
||||||
when = item.date();
|
|
||||||
}
|
|
||||||
|
|
||||||
if (HANDLED(date_format_))
|
|
||||||
return string_value(format_date(when, HANDLER(date_format_).str()));
|
|
||||||
else
|
|
||||||
return string_value(format_date(when));
|
|
||||||
}
|
|
||||||
|
|
||||||
value_t report_t::fn_display_amount(call_scope_t& scope)
|
value_t report_t::fn_display_amount(call_scope_t& scope)
|
||||||
{
|
{
|
||||||
return HANDLER(display_amount_).expr.calc(scope);
|
return HANDLER(display_amount_).expr.calc(scope);
|
||||||
|
|
@ -570,9 +548,7 @@ expr_t::ptr_op_t report_t::lookup(const string& name)
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 'd':
|
case 'd':
|
||||||
if (is_eq(p, "display_date"))
|
if (is_eq(p, "display_amount"))
|
||||||
return MAKE_FUNCTOR(report_t::fn_display_date);
|
|
||||||
else if (is_eq(p, "display_amount"))
|
|
||||||
return MAKE_FUNCTOR(report_t::fn_display_amount);
|
return MAKE_FUNCTOR(report_t::fn_display_amount);
|
||||||
else if (is_eq(p, "display_total"))
|
else if (is_eq(p, "display_total"))
|
||||||
return MAKE_FUNCTOR(report_t::fn_display_total);
|
return MAKE_FUNCTOR(report_t::fn_display_total);
|
||||||
|
|
|
||||||
|
|
@ -33,6 +33,10 @@
|
||||||
|
|
||||||
namespace ledger {
|
namespace ledger {
|
||||||
|
|
||||||
|
optional<std::string> input_date_format;
|
||||||
|
std::string output_datetime_format = "%Y-%m-%d %H:%M:%S";
|
||||||
|
std::string output_date_format = "%Y-%m-%d";
|
||||||
|
|
||||||
namespace {
|
namespace {
|
||||||
const char * formats[] = {
|
const char * formats[] = {
|
||||||
"%y/%m/%d",
|
"%y/%m/%d",
|
||||||
|
|
@ -53,8 +57,6 @@ namespace {
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
optional<string> input_date_format;
|
|
||||||
|
|
||||||
namespace {
|
namespace {
|
||||||
bool parse_date_mask(const char * date_str, std::tm& result)
|
bool parse_date_mask(const char * date_str, std::tm& result)
|
||||||
{
|
{
|
||||||
|
|
|
||||||
24
src/times.h
24
src/times.h
|
|
@ -70,17 +70,17 @@ inline bool is_valid(const date_t& moment) {
|
||||||
#endif
|
#endif
|
||||||
#define CURRENT_DATE() boost::gregorian::day_clock::universal_day()
|
#define CURRENT_DATE() boost::gregorian::day_clock::universal_day()
|
||||||
|
|
||||||
extern optional<string> input_date_format;
|
extern optional<std::string> input_date_format;
|
||||||
|
|
||||||
datetime_t parse_datetime(const char * str, int current_year = -1);
|
datetime_t parse_datetime(const char * str, int current_year = -1);
|
||||||
|
|
||||||
inline datetime_t parse_datetime(const string& str, int current_year = -1) {
|
inline datetime_t parse_datetime(const std::string& str, int current_year = -1) {
|
||||||
return parse_datetime(str.c_str(), current_year);
|
return parse_datetime(str.c_str(), current_year);
|
||||||
}
|
}
|
||||||
|
|
||||||
date_t parse_date(const char * str, int current_year = -1);
|
date_t parse_date(const char * str, int current_year = -1);
|
||||||
|
|
||||||
inline date_t parse_date(const string& str, int current_year = -1) {
|
inline date_t parse_date(const std::string& str, int current_year = -1) {
|
||||||
return parse_date(str.c_str(), current_year);
|
return parse_date(str.c_str(), current_year);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -94,21 +94,27 @@ inline std::time_t to_time_t(const ptime& t)
|
||||||
return (t-start).total_seconds();
|
return (t-start).total_seconds();
|
||||||
}
|
}
|
||||||
|
|
||||||
inline string format_datetime(const datetime_t& when,
|
extern std::string output_datetime_format;
|
||||||
const string format = "%Y-%m-%d %H:%M:%S")
|
|
||||||
|
inline std::string format_datetime(const datetime_t& when,
|
||||||
|
const optional<std::string>& format = none)
|
||||||
{
|
{
|
||||||
char buf[256];
|
char buf[256];
|
||||||
time_t moment = to_time_t(when);
|
time_t moment = to_time_t(when);
|
||||||
std::strftime(buf, 255, format.c_str(), std::localtime(&moment));
|
std::strftime(buf, 255, format ? format->c_str() :
|
||||||
|
output_datetime_format.c_str(), std::localtime(&moment));
|
||||||
return buf;
|
return buf;
|
||||||
}
|
}
|
||||||
|
|
||||||
inline string format_date(const date_t& when,
|
extern std::string output_date_format;
|
||||||
const string format = "%Y-%m-%d")
|
|
||||||
|
inline std::string format_date(const date_t& when,
|
||||||
|
const optional<std::string>& format = none)
|
||||||
{
|
{
|
||||||
char buf[256];
|
char buf[256];
|
||||||
std::tm moment = gregorian::to_tm(when);
|
std::tm moment = gregorian::to_tm(when);
|
||||||
std::strftime(buf, 255, format.c_str(), &moment);
|
std::strftime(buf, 255, format ? format->c_str() :
|
||||||
|
output_date_format.c_str(), &moment);
|
||||||
return buf;
|
return buf;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Add table
Reference in a new issue