Files @ 13c316acf6e1
Branch filter:

Location: NPO-Accounting/import2ledger/import2ledger/importers/oreilly.py

Brett Smith
tests: More tests for positive results for last commit.
import itertools

from . import _csv
from .. import strparse

DATE_FMT = '%B %d, %Y'

class PaymentsImporter(_csv.CSVImporterBase):
    NEEDED_FIELDS = frozenset(['Date', 'Payment Amount', 'Paid Date'])
    ENTRY_SEED = {
        'currency': 'USD',
        'payee': "O'Reilly Media, Inc.",
    }

    def _read_row(self, row):
        return {
            'amount': strparse.currency_decimal(row['Payment Amount']),
            'date': strparse.date(row['Date'], DATE_FMT),
            'paid_date': strparse.date(row['Paid Date'], DATE_FMT),
        }


class RoyaltiesImporter(_csv.CSVImporterBase):
    SENTINEL_ROW = {
        'Start date': 'January 2, 1979',
        'End date': 'January 3, 1979',
        'Amount': '$0.00',
        'Paid Date': 'January 4, 1979',
    }
    NEEDED_FIELDS = frozenset(SENTINEL_ROW.keys())
    ENTRY_SEED = {
        'currency': 'USD',
        'payee': "O'Reilly Media, Inc.",
    }

    def _paid_date(self, date_s):
        return None if (date_s == 'null') else strparse.date(date_s, DATE_FMT)

    def __init__(self, input_file):
        super().__init__(input_file)
        self.in_csv = itertools.chain(self.in_csv, [self.SENTINEL_ROW])
        self.last_row = next(self.in_csv)
        self.last_amount = strparse.currency_decimal(self.last_row['Amount'])
        self.last_paid_date = self._paid_date(self.last_row['Paid Date'])

    def _read_row(self, row):
        row_amount = strparse.currency_decimal(row['Amount'])
        row_paid_date = self._paid_date(row['Paid Date'])
        if row_paid_date is None:
            amount = self.last_amount - row_amount
        else:
            amount = self.last_amount
        retval = {
            'amount': amount,
            'date': strparse.date(self.last_row['End date'], DATE_FMT),
            'paid_date': self.last_paid_date,
            'start_date': strparse.date(self.last_row['Start date'], DATE_FMT),
        }
        self.last_row = row
        self.last_amount = row_amount
        self.last_paid_date = row_paid_date or self.last_paid_date
        return retval