diff options
Diffstat (limited to 'reconcile.cc')
-rw-r--r-- | reconcile.cc | 108 |
1 files changed, 0 insertions, 108 deletions
diff --git a/reconcile.cc b/reconcile.cc deleted file mode 100644 index 0ba571b7..00000000 --- a/reconcile.cc +++ /dev/null @@ -1,108 +0,0 @@ -#include "reconcile.h" -#include "walk.h" - -namespace ledger { - -#define xact_next(x) ((transaction_t *)transaction_xdata(*x).ptr) -#define xact_next_ptr(x) ((transaction_t **)&transaction_xdata(*x).ptr) - -static bool search_for_balance(amount_t& amount, - transaction_t ** prev, transaction_t * next) -{ - for (; next; next = xact_next(next)) { - transaction_t * temp = *prev; - *prev = next; - - amount -= next->amount; - if (! amount || - search_for_balance(amount, xact_next_ptr(next), xact_next(next))) - return true; - amount += next->amount; - - *prev = temp; - } - return false; -} - -void reconcile_transactions::push_to_handler(transaction_t * first) -{ - for (; first; first = xact_next(first)) - item_handler<transaction_t>::operator()(*first); - - item_handler<transaction_t>::flush(); -} - -void reconcile_transactions::flush() -{ - value_t cleared_balance; - value_t pending_balance; - - transaction_t * first = NULL; - transaction_t ** last_ptr = &first; - - bool found_pending = false; - for (transactions_list::iterator x = xacts.begin(); - x != xacts.end(); - x++) { - if (! cutoff || std::difftime((*x)->entry->date, cutoff) < 0) { - switch ((*x)->entry->state) { - case entry_t::CLEARED: - cleared_balance += (*x)->amount; - break; - case entry_t::UNCLEARED: - case entry_t::PENDING: - pending_balance += (*x)->amount; - *last_ptr = *x; - last_ptr = xact_next_ptr(*x); - break; - } - } - } - - if (cleared_balance.type >= value_t::BALANCE) - throw error("Cannot reconcile accounts with multiple commodities"); - - cleared_balance.cast(value_t::AMOUNT); - balance.cast(value_t::AMOUNT); - - commodity_t& cb_comm = ((amount_t *) cleared_balance.data)->commodity(); - commodity_t& b_comm = ((amount_t *) balance.data)->commodity(); - - balance -= cleared_balance; - if (balance.type >= value_t::BALANCE) - throw error(std::string("Reconcile balance is not of the same commodity ('") + - b_comm.symbol + "' != '" + cb_comm.symbol + "')"); - - // If the amount to reconcile is the same as the pending balance, - // then assume an exact match and return the results right away. - amount_t to_reconcile = *((amount_t *) balance.data); - pending_balance.cast(value_t::AMOUNT); - if (to_reconcile == *((amount_t *) pending_balance.data) || - search_for_balance(to_reconcile, &first, first)) { - push_to_handler(first); - } else { - throw error("Could not reconcile account!"); - } -} - -} // namespace ledger - -#ifdef USE_BOOST_PYTHON - -#include <boost/python.hpp> - -using namespace boost::python; -using namespace ledger; - -void export_reconcile() -{ - class_< reconcile_transactions, bases<item_handler<transaction_t> > > - ("ReconcileTransactions", - init<item_handler<transaction_t> *, const value_t&, time_t>() - [with_custodian_and_ward<1, 2>()]) - .def("flush", &reconcile_transactions::flush) - .def("__call__", &reconcile_transactions::operator()) - ; -} - -#endif // USE_BOOST_PYTHON |