Report sought magnitude when balancing errors occur
This commit is contained in:
parent
1bdb9330e5
commit
5e3f3d7f47
8 changed files with 63 additions and 16 deletions
|
|
@ -480,6 +480,13 @@ public:
|
||||||
optional<amount_t>
|
optional<amount_t>
|
||||||
commodity_amount(const optional<const commodity_t&>& commodity = none) const;
|
commodity_amount(const optional<const commodity_t&>& commodity = none) const;
|
||||||
|
|
||||||
|
balance_t number() const {
|
||||||
|
balance_t temp;
|
||||||
|
foreach (const amounts_map::value_type& pair, amounts)
|
||||||
|
temp += pair.second.number();
|
||||||
|
return temp;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Annotated commodity methods. The amounts contained by a balance
|
* Annotated commodity methods. The amounts contained by a balance
|
||||||
* may use annotated commodities. The `strip_annotations' method
|
* may use annotated commodities. The `strip_annotations' method
|
||||||
|
|
|
||||||
|
|
@ -209,6 +209,8 @@ void export_balance()
|
||||||
.def("commodity_amount", py_commodity_amount_0)
|
.def("commodity_amount", py_commodity_amount_0)
|
||||||
.def("commodity_amount", py_commodity_amount_1)
|
.def("commodity_amount", py_commodity_amount_1)
|
||||||
|
|
||||||
|
.def("number", &balance_t::number)
|
||||||
|
|
||||||
.def("strip_annotations", &balance_t::strip_annotations)
|
.def("strip_annotations", &balance_t::strip_annotations)
|
||||||
|
|
||||||
.def("valid", &balance_t::valid)
|
.def("valid", &balance_t::valid)
|
||||||
|
|
|
||||||
|
|
@ -285,6 +285,8 @@ void export_value()
|
||||||
.def("simplified", &value_t::simplified)
|
.def("simplified", &value_t::simplified)
|
||||||
.def("in_place_simplify", &value_t::in_place_simplify)
|
.def("in_place_simplify", &value_t::in_place_simplify)
|
||||||
|
|
||||||
|
.def("number", &value_t::number)
|
||||||
|
|
||||||
.def("annotate", &value_t::annotate)
|
.def("annotate", &value_t::annotate)
|
||||||
.def("is_annotated", &value_t::is_annotated)
|
.def("is_annotated", &value_t::is_annotated)
|
||||||
#if 0
|
#if 0
|
||||||
|
|
|
||||||
29
src/value.cc
29
src/value.cc
|
|
@ -279,6 +279,35 @@ void value_t::in_place_simplify()
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
|
value_t value_t::number() const
|
||||||
|
{
|
||||||
|
switch (type()) {
|
||||||
|
case VOID:
|
||||||
|
return 0L;
|
||||||
|
case BOOLEAN:
|
||||||
|
return as_boolean() ? 1L : 0L;
|
||||||
|
case INTEGER:
|
||||||
|
return as_long();
|
||||||
|
case AMOUNT:
|
||||||
|
return as_amount().number();
|
||||||
|
case BALANCE:
|
||||||
|
return as_balance().number();
|
||||||
|
case SEQUENCE:
|
||||||
|
if (! as_sequence().empty()) {
|
||||||
|
value_t temp;
|
||||||
|
foreach (const value_t& value, as_sequence())
|
||||||
|
temp += value.number();
|
||||||
|
return temp;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
throw_(value_error, _("Cannot determine numeric value of %1") << label());
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
value_t& value_t::operator+=(const value_t& val)
|
value_t& value_t::operator+=(const value_t& val)
|
||||||
{
|
{
|
||||||
if (is_string()) {
|
if (is_string()) {
|
||||||
|
|
|
||||||
|
|
@ -761,6 +761,8 @@ public:
|
||||||
}
|
}
|
||||||
void in_place_simplify();
|
void in_place_simplify();
|
||||||
|
|
||||||
|
value_t number() const;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Annotated commodity methods.
|
* Annotated commodity methods.
|
||||||
*/
|
*/
|
||||||
|
|
|
||||||
32
src/xact.cc
32
src/xact.cc
|
|
@ -83,6 +83,20 @@ void xact_base_t::clear_xdata()
|
||||||
post->clear_xdata();
|
post->clear_xdata();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
value_t xact_base_t::magnitude() const
|
||||||
|
{
|
||||||
|
value_t halfbal = 0L;
|
||||||
|
foreach (const post_t * post, posts) {
|
||||||
|
if (post->amount.sign() > 0) {
|
||||||
|
if (post->cost)
|
||||||
|
halfbal += *post->cost;
|
||||||
|
else
|
||||||
|
halfbal += post->amount;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return halfbal;
|
||||||
|
}
|
||||||
|
|
||||||
bool xact_base_t::finalize()
|
bool xact_base_t::finalize()
|
||||||
{
|
{
|
||||||
// Scan through and compute the total balance for the xact. This is used
|
// Scan through and compute the total balance for the xact. This is used
|
||||||
|
|
@ -321,6 +335,8 @@ bool xact_base_t::finalize()
|
||||||
add_error_context(item_context(*this, _("While balancing transaction")));
|
add_error_context(item_context(*this, _("While balancing transaction")));
|
||||||
add_error_context(_("Unbalanced remainder is:"));
|
add_error_context(_("Unbalanced remainder is:"));
|
||||||
add_error_context(value_context(balance));
|
add_error_context(value_context(balance));
|
||||||
|
add_error_context(_("Amount to balance against:"));
|
||||||
|
add_error_context(value_context(magnitude()));
|
||||||
throw_(balance_error, _("Transaction does not balance"));
|
throw_(balance_error, _("Transaction does not balance"));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -368,26 +384,12 @@ void xact_t::add_post(post_t * post)
|
||||||
xact_base_t::add_post(post);
|
xact_base_t::add_post(post);
|
||||||
}
|
}
|
||||||
|
|
||||||
value_t xact_t::magnitude() const
|
|
||||||
{
|
|
||||||
value_t halfbal = 0L;
|
|
||||||
foreach (const post_t * post, posts) {
|
|
||||||
if (post->amount.sign() > 0) {
|
|
||||||
if (post->cost)
|
|
||||||
halfbal += post->cost->number();
|
|
||||||
else
|
|
||||||
halfbal += post->amount.number();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return halfbal;
|
|
||||||
}
|
|
||||||
|
|
||||||
string xact_t::idstring() const
|
string xact_t::idstring() const
|
||||||
{
|
{
|
||||||
std::ostringstream buf;
|
std::ostringstream buf;
|
||||||
buf << format_date(*_date, FMT_WRITTEN);
|
buf << format_date(*_date, FMT_WRITTEN);
|
||||||
buf << payee;
|
buf << payee;
|
||||||
magnitude().print(buf);
|
magnitude().number().print(buf);
|
||||||
return buf.str();
|
return buf.str();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -84,6 +84,8 @@ public:
|
||||||
return posts.end();
|
return posts.end();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
value_t magnitude() const;
|
||||||
|
|
||||||
virtual bool finalize();
|
virtual bool finalize();
|
||||||
|
|
||||||
void clear_xdata();
|
void clear_xdata();
|
||||||
|
|
@ -129,7 +131,6 @@ public:
|
||||||
|
|
||||||
virtual void add_post(post_t * post);
|
virtual void add_post(post_t * post);
|
||||||
|
|
||||||
value_t magnitude() const;
|
|
||||||
string idstring() const;
|
string idstring() const;
|
||||||
string id() const;
|
string id() const;
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -14,5 +14,7 @@ While balancing transaction from "$FILE", lines 3-5:
|
||||||
> Account2 -1000 EUR @ 1.5 USD
|
> Account2 -1000 EUR @ 1.5 USD
|
||||||
Unbalanced remainder is:
|
Unbalanced remainder is:
|
||||||
100.00 USD
|
100.00 USD
|
||||||
|
Amount to balance against:
|
||||||
|
1,600.0 USD
|
||||||
Error: Transaction does not balance
|
Error: Transaction does not balance
|
||||||
=== 1
|
=== 1
|
||||||
|
|
|
||||||
Loading…
Add table
Reference in a new issue