summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorJohn Wiegley <johnw@newartisans.com>2012-03-13 03:41:00 -0500
committerJohn Wiegley <johnw@newartisans.com>2012-03-13 03:41:00 -0500
commitcfe8142b2b371dd40867e010b6b6c58fe864ba21 (patch)
treee5a024f8a61281db8225acb3576b0137e9ec9a83 /src
parentcb317f9d395f44b2c2fc48f02869c3ed0f5ebcd0 (diff)
downloadfork-ledger-cfe8142b2b371dd40867e010b6b6c58fe864ba21.tar.gz
fork-ledger-cfe8142b2b371dd40867e010b6b6c58fe864ba21.tar.bz2
fork-ledger-cfe8142b2b371dd40867e010b6b6c58fe864ba21.zip
Access to checkin/checkout of timelog entries
Diffstat (limited to 'src')
-rw-r--r--src/post.cc13
-rw-r--r--src/post.h16
-rw-r--r--src/timelog.cc7
3 files changed, 28 insertions, 8 deletions
diff --git a/src/post.cc b/src/post.cc
index babb1292..d5e0d9bc 100644
--- a/src/post.cc
+++ b/src/post.cc
@@ -351,7 +351,14 @@ namespace {
return post.date();
}
value_t get_datetime(post_t& post) {
- return post.xdata().datetime;
+ return (! post.xdata().datetime.is_not_a_date_time() ?
+ post.xdata().datetime : datetime_t(post.date()));
+ }
+ value_t get_checkin(post_t& post) {
+ return post.checkin ? *post.checkin : NULL_VALUE;
+ }
+ value_t get_checkout(post_t& post) {
+ return post.checkout ? *post.checkout : NULL_VALUE;
}
template <value_t (*Func)(post_t&)>
@@ -444,6 +451,10 @@ expr_t::ptr_op_t post_t::lookup(const symbol_t::kind_t kind,
return WRAP_FUNCTOR(get_wrapper<&get_is_calculated>);
else if (name == "commodity")
return WRAP_FUNCTOR(&get_commodity);
+ else if (name == "checkin")
+ return WRAP_FUNCTOR(get_wrapper<&get_checkin>);
+ else if (name == "checkout")
+ return WRAP_FUNCTOR(get_wrapper<&get_checkout>);
break;
case 'd':
diff --git a/src/post.h b/src/post.h
index aecd65cf..d6004c9f 100644
--- a/src/post.h
+++ b/src/post.h
@@ -61,13 +61,15 @@ public:
#define POST_COST_VIRTUAL 0x0400 // cost is virtualized: (@)
#define POST_ANONYMIZED 0x0800 // a temporary, anonymous posting
- xact_t * xact; // only set for posts of regular xacts
- account_t * account;
-
- amount_t amount; // can be null until finalization
- optional<expr_t> amount_expr;
- optional<amount_t> cost;
- optional<amount_t> assigned_amount;
+ xact_t * xact; // only set for posts of regular xacts
+ account_t * account;
+
+ amount_t amount; // can be null until finalization
+ optional<expr_t> amount_expr;
+ optional<amount_t> cost;
+ optional<amount_t> assigned_amount;
+ optional<datetime_t> checkin;
+ optional<datetime_t> checkout;
post_t(account_t * _account = NULL,
flags_t _flags = ITEM_NORMAL)
diff --git a/src/timelog.cc b/src/timelog.cc
index b46d3922..00cefe10 100644
--- a/src/timelog.cc
+++ b/src/timelog.cc
@@ -76,6 +76,11 @@ namespace {
(_("Timelog check-out event does not match any current check-ins"));
}
+ if (event.checkin.is_not_a_date_time())
+ throw parse_error(_("Timelog check-in has no corresponding check-out"));
+ if (out_event.checkin.is_not_a_date_time())
+ throw parse_error(_("Timelog check-out has no corresponding check-in"));
+
if (out_event.checkin < event.checkin)
throw parse_error
(_("Timelog check-out date less than corresponding check-in"));
@@ -107,6 +112,8 @@ namespace {
post_t * post = new post_t(event.account, amt, POST_VIRTUAL);
post->set_state(item_t::CLEARED);
post->pos = event.position;
+ post->checkin = event.checkin;
+ post->checkout = out_event.checkin;
curr->add_post(post);
event.account->add_post(post);