Allow fixated costs, as well as prices

You can now establish a fixated price automatically by way of a fixated
cost.  The syntax for this is:

  2009/11/01 Sample
      Assets                1 apple @ =$0.10
      Equity
This commit is contained in:
John Wiegley 2010-06-10 12:29:58 -04:00
parent a2bcfe4338
commit 685b12d8d3
3 changed files with 24 additions and 6 deletions

View file

@ -52,12 +52,13 @@ class account_t;
class post_t : public item_t
{
public:
#define POST_VIRTUAL 0x04 // the account was specified with (parens)
#define POST_MUST_BALANCE 0x08 // posting must balance in the transaction
#define POST_CALCULATED 0x10 // posting's amount was calculated
#define POST_COST_CALCULATED 0x20 // posting's cost was calculated
#define POST_COST_IN_FULL 0x40 // cost specified using @@
#define POST_ANONYMIZED 0x80 // a temporary, anonymous posting
#define POST_VIRTUAL 0x0010 // the account was specified with (parens)
#define POST_MUST_BALANCE 0x0020 // posting must balance in the transaction
#define POST_CALCULATED 0x0040 // posting's amount was calculated
#define POST_COST_CALCULATED 0x0080 // posting's cost was calculated
#define POST_COST_IN_FULL 0x0100 // cost specified using @@
#define POST_COST_FIXATED 0x0200 // cost is fixed using = indicator
#define POST_ANONYMIZED 0x0400 // a temporary, anonymous posting
xact_t * xact; // only set for posts of regular xacts
account_t * account;

View file

@ -1096,6 +1096,14 @@ post_t * instance_t::parse_post(char * line,
if (*p) {
post->cost = amount_t();
bool fixed_cost = false;
if (*p == '=') {
p++;
fixed_cost = true;
if (*p == '\0')
throw parse_error(_("Posting is missing a cost amount"));
}
beg = p - line;
ptristream cstream(p, len - beg);
@ -1122,6 +1130,9 @@ post_t * instance_t::parse_post(char * line,
post->cost->in_place_negate();
}
if (fixed_cost)
post->add_flags(POST_COST_FIXATED);
DEBUG("textual.parse", "line " << linenum << ": "
<< "Total cost is " << *post->cost);
DEBUG("textual.parse", "line " << linenum << ": "

View file

@ -300,6 +300,12 @@ bool xact_base_t::finalize()
post->amount = breakdown.amount;
DEBUG("xact.finalize", "added breakdown, balance = " << balance);
}
if (post->has_flags(POST_COST_FIXATED) &&
post->amount.has_annotation() && post->amount.annotation().price) {
DEBUG("xact.finalize", "fixating annotation price");
post->amount.annotation().add_flags(ANNOTATION_PRICE_FIXATED);
}
}
if (null_post != NULL) {