diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/csv.cc | 18 | ||||
-rw-r--r-- | src/csv.h | 11 |
2 files changed, 21 insertions, 8 deletions
@@ -115,8 +115,10 @@ void csv_reader::read_index(std::istream& in) index.push_back(FIELD_CODE); else if (payee_mask.match(field)) index.push_back(FIELD_PAYEE); - else if (amount_mask.match(field)) - index.push_back(FIELD_AMOUNT); + else if (credit_mask.match(field)) + index.push_back(FIELD_CREDIT); + else if (debit_mask.match(field)) + index.push_back(FIELD_DEBIT); else if (cost_mask.match(field)) index.push_back(FIELD_COST); else if (total_mask.match(field)) @@ -199,12 +201,19 @@ xact_t * csv_reader::read_xact(bool rich_data) break; } - case FIELD_AMOUNT: { + case FIELD_DEBIT: + case FIELD_CREDIT: { + if (field.length() == 0) + break; std::istringstream amount_str(field); amt.parse(amount_str, PARSE_NO_REDUCE); if (! amt.has_commodity() && commodity_pool_t::current_pool->default_commodity) amt.set_commodity(*commodity_pool_t::current_pool->default_commodity); + if (index[n] == FIELD_DEBIT) + amt = -amt; + if (!post->amount.is_null()) + throw_(csv_error, _("Cannot have two values for a single transaction")); post->amount = amt; break; } @@ -214,8 +223,7 @@ xact_t * csv_reader::read_xact(bool rich_data) amt.parse(amount_str, PARSE_NO_REDUCE); if (! amt.has_commodity() && commodity_pool_t::current_pool->default_commodity) - amt.set_commodity - (*commodity_pool_t::current_pool->default_commodity); + amt.set_commodity(*commodity_pool_t::current_pool->default_commodity); post->cost = amt; break; } @@ -51,6 +51,8 @@ class xact_t; class journal_t; class account_t; +DECLARE_EXCEPTION(csv_error, std::runtime_error); + class csv_reader { parse_context_t context; @@ -60,7 +62,8 @@ class csv_reader FIELD_DATE_AUX, FIELD_CODE, FIELD_PAYEE, - FIELD_AMOUNT, + FIELD_CREDIT, + FIELD_DEBIT, FIELD_COST, FIELD_TOTAL, FIELD_NOTE, @@ -72,7 +75,8 @@ class csv_reader mask_t date_aux_mask; mask_t code_mask; mask_t payee_mask; - mask_t amount_mask; + mask_t credit_mask; + mask_t debit_mask; mask_t cost_mask; mask_t total_mask; mask_t note_mask; @@ -87,7 +91,8 @@ public: date_aux_mask("posted( ?date)?"), code_mask("code"), payee_mask("(payee|desc(ription)?|title)"), - amount_mask("amount"), + credit_mask("credit|amount"), + debit_mask("debit"), cost_mask("cost"), total_mask("total"), note_mask("note") { |