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