Added --date, similar to --account and --payee
This lets you do things like store a date as the value of a tag, then
run:
ledger --date='has_tag("Foo") ? to_date(tag("Foo")) : date' reg
This commit is contained in:
parent
c22b8457ef
commit
67c9cf134d
7 changed files with 31 additions and 5 deletions
|
|
@ -159,6 +159,11 @@ post_handler_ptr chain_post_handlers(report_t& report,
|
|||
handler.reset(new sort_posts(handler, "date"));
|
||||
}
|
||||
|
||||
if (report.HANDLED(date_))
|
||||
handler.reset(new transfer_details(handler, transfer_details::SET_DATE,
|
||||
report.session.journal->master,
|
||||
report.HANDLER(date_).str(),
|
||||
report));
|
||||
if (report.HANDLED(account_))
|
||||
handler.reset(new transfer_details(handler, transfer_details::SET_ACCOUNT,
|
||||
report.session.journal->master,
|
||||
|
|
|
|||
|
|
@ -706,22 +706,27 @@ void transfer_details::operator()(post_t& post)
|
|||
temp.set_state(post.state());
|
||||
|
||||
bind_scope_t bound_scope(scope, temp);
|
||||
value_t substitute(expr.calc(bound_scope));
|
||||
|
||||
switch (which_element) {
|
||||
case SET_PAYEE:
|
||||
xact.payee = expr.calc(bound_scope).to_string();
|
||||
case SET_DATE:
|
||||
xact.set_date(substitute.to_date());
|
||||
break;
|
||||
|
||||
case SET_ACCOUNT: {
|
||||
std::list<string> account_names;
|
||||
temp.account->remove_post(&temp);
|
||||
split_string(expr.calc(bound_scope).to_string(), ':', account_names);
|
||||
split_string(substitute.to_string(), ':', account_names);
|
||||
temp.account = create_temp_account_from_path(account_names, temps,
|
||||
xact.journal->master);
|
||||
temp.account->add_post(&temp);
|
||||
break;
|
||||
}
|
||||
|
||||
case SET_PAYEE:
|
||||
xact.payee = substitute.to_string();
|
||||
break;
|
||||
|
||||
default:
|
||||
assert(false);
|
||||
break;
|
||||
|
|
|
|||
|
|
@ -550,8 +550,9 @@ class transfer_details : public item_handler<post_t>
|
|||
|
||||
public:
|
||||
enum element_t {
|
||||
SET_PAYEE,
|
||||
SET_ACCOUNT
|
||||
SET_DATE,
|
||||
SET_ACCOUNT,
|
||||
SET_PAYEE
|
||||
} which_element;
|
||||
|
||||
transfer_details(post_handler_ptr handler,
|
||||
|
|
|
|||
|
|
@ -172,6 +172,12 @@ public:
|
|||
virtual optional<date_t> effective_date() const {
|
||||
return _date_eff;
|
||||
}
|
||||
virtual void set_date(const date_t& date) {
|
||||
if (use_effective_date)
|
||||
_date_eff = date;
|
||||
else
|
||||
_date = date;
|
||||
}
|
||||
|
||||
void set_state(state_t new_state) {
|
||||
_state = new_state;
|
||||
|
|
|
|||
|
|
@ -561,6 +561,7 @@ option_t<report_t> * report_t::lookup_option(const char * p)
|
|||
break;
|
||||
case 'd':
|
||||
OPT(daily);
|
||||
else OPT(date_);
|
||||
else OPT(date_format_);
|
||||
else OPT(datetime_format_);
|
||||
else OPT(depth_);
|
||||
|
|
|
|||
|
|
@ -217,6 +217,7 @@ public:
|
|||
HANDLER(csv_format_).report(out);
|
||||
HANDLER(current).report(out);
|
||||
HANDLER(daily).report(out);
|
||||
HANDLER(date_).report(out);
|
||||
HANDLER(date_format_).report(out);
|
||||
HANDLER(datetime_format_).report(out);
|
||||
HANDLER(depth_).report(out);
|
||||
|
|
@ -450,6 +451,7 @@ public:
|
|||
parent->HANDLER(period_).on(string("--daily"), "daily");
|
||||
});
|
||||
|
||||
OPTION(report_t, date_);
|
||||
OPTION(report_t, date_format_);
|
||||
OPTION(report_t, datetime_format_);
|
||||
|
||||
|
|
|
|||
|
|
@ -1146,6 +1146,12 @@ void value_t::in_place_cast(type_t cast_type)
|
|||
case AMOUNT:
|
||||
set_amount(amount_t(as_string()));
|
||||
return;
|
||||
case DATE:
|
||||
set_date(parse_date(as_string()));
|
||||
return;
|
||||
case DATETIME:
|
||||
set_datetime(parse_datetime(as_string()));
|
||||
return;
|
||||
case MASK:
|
||||
set_mask(as_string());
|
||||
return;
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue