diff options
-rw-r--r-- | src/post.cc | 13 | ||||
-rw-r--r-- | src/post.h | 16 | ||||
-rw-r--r-- | src/timelog.cc | 7 |
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': @@ -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); |