62 lines
2 KiB
Python
62 lines
2 KiB
Python
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
|