Allow @ and @@ cost specifiers on the xact command
This commit is contained in:
parent
a88a4c55b2
commit
451b0e9b76
1 changed files with 46 additions and 0 deletions
|
|
@ -54,6 +54,8 @@ namespace {
|
||||||
bool from;
|
bool from;
|
||||||
optional<mask_t> account_mask;
|
optional<mask_t> account_mask;
|
||||||
optional<amount_t> amount;
|
optional<amount_t> amount;
|
||||||
|
optional<string> cost_operator;
|
||||||
|
optional<amount_t> cost;
|
||||||
|
|
||||||
post_template_t() : from(false) {}
|
post_template_t() : from(false) {}
|
||||||
};
|
};
|
||||||
|
|
@ -111,6 +113,10 @@ namespace {
|
||||||
|
|
||||||
if (post.amount)
|
if (post.amount)
|
||||||
out << _(" Amount: ") << *post.amount << std::endl;
|
out << _(" Amount: ") << *post.amount << std::endl;
|
||||||
|
|
||||||
|
if (post.cost)
|
||||||
|
out << _(" Cost: ") << *post.cost_operator
|
||||||
|
<< " " << *post.cost << std::endl;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -148,6 +154,8 @@ namespace {
|
||||||
string arg = (*begin).to_string();
|
string arg = (*begin).to_string();
|
||||||
|
|
||||||
if (arg == "at") {
|
if (arg == "at") {
|
||||||
|
if (begin == end)
|
||||||
|
throw std::runtime_error(_("Invalid xact command arguments"));
|
||||||
tmpl.payee_mask = (*++begin).to_string();
|
tmpl.payee_mask = (*++begin).to_string();
|
||||||
}
|
}
|
||||||
else if (arg == "to" || arg == "from") {
|
else if (arg == "to" || arg == "from") {
|
||||||
|
|
@ -155,22 +163,41 @@ namespace {
|
||||||
tmpl.posts.push_back(xact_template_t::post_template_t());
|
tmpl.posts.push_back(xact_template_t::post_template_t());
|
||||||
post = &tmpl.posts.back();
|
post = &tmpl.posts.back();
|
||||||
}
|
}
|
||||||
|
if (begin == end)
|
||||||
|
throw std::runtime_error(_("Invalid xact command arguments"));
|
||||||
post->account_mask = mask_t((*++begin).to_string());
|
post->account_mask = mask_t((*++begin).to_string());
|
||||||
post->from = arg == "from";
|
post->from = arg == "from";
|
||||||
}
|
}
|
||||||
else if (arg == "on") {
|
else if (arg == "on") {
|
||||||
|
if (begin == end)
|
||||||
|
throw std::runtime_error(_("Invalid xact command arguments"));
|
||||||
tmpl.date = parse_date((*++begin).to_string());
|
tmpl.date = parse_date((*++begin).to_string());
|
||||||
check_for_date = false;
|
check_for_date = false;
|
||||||
}
|
}
|
||||||
else if (arg == "code") {
|
else if (arg == "code") {
|
||||||
|
if (begin == end)
|
||||||
|
throw std::runtime_error(_("Invalid xact command arguments"));
|
||||||
tmpl.code = (*++begin).to_string();
|
tmpl.code = (*++begin).to_string();
|
||||||
}
|
}
|
||||||
else if (arg == "note") {
|
else if (arg == "note") {
|
||||||
|
if (begin == end)
|
||||||
|
throw std::runtime_error(_("Invalid xact command arguments"));
|
||||||
tmpl.note = (*++begin).to_string();
|
tmpl.note = (*++begin).to_string();
|
||||||
}
|
}
|
||||||
else if (arg == "rest") {
|
else if (arg == "rest") {
|
||||||
; // just ignore this argument
|
; // just ignore this argument
|
||||||
}
|
}
|
||||||
|
else if (arg == "@" || arg == "@@") {
|
||||||
|
amount_t cost;
|
||||||
|
post->cost_operator = arg;
|
||||||
|
if (begin == end)
|
||||||
|
throw std::runtime_error(_("Invalid xact command arguments"));
|
||||||
|
arg = (*++begin).to_string();
|
||||||
|
if (! cost.parse(arg, amount_t::PARSE_SOFT_FAIL |
|
||||||
|
amount_t::PARSE_NO_MIGRATE))
|
||||||
|
throw std::runtime_error(_("Invalid xact command arguments"));
|
||||||
|
post->cost = cost;
|
||||||
|
}
|
||||||
else {
|
else {
|
||||||
// Without a preposition, it is either:
|
// Without a preposition, it is either:
|
||||||
//
|
//
|
||||||
|
|
@ -443,6 +470,25 @@ namespace {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (post.cost) {
|
||||||
|
if (post.cost->sign() < 0)
|
||||||
|
throw parse_error(_("A posting's cost may not be negative"));
|
||||||
|
|
||||||
|
post.cost->in_place_unround();
|
||||||
|
|
||||||
|
if (*post.cost_operator == "@") {
|
||||||
|
// For the sole case where the cost might be uncommoditized,
|
||||||
|
// guarantee that the commodity of the cost after multiplication
|
||||||
|
// is the same as it was before.
|
||||||
|
commodity_t& cost_commodity(post.cost->commodity());
|
||||||
|
*post.cost *= new_post->amount;
|
||||||
|
post.cost->set_commodity(cost_commodity);
|
||||||
|
}
|
||||||
|
|
||||||
|
new_post->cost = *post.cost;
|
||||||
|
DEBUG("derive.xact", "Copied over posting cost");
|
||||||
|
}
|
||||||
|
|
||||||
if (found_commodity &&
|
if (found_commodity &&
|
||||||
! new_post->amount.is_null() &&
|
! new_post->amount.is_null() &&
|
||||||
! new_post->amount.has_commodity()) {
|
! new_post->amount.has_commodity()) {
|
||||||
|
|
|
||||||
Loading…
Add table
Reference in a new issue