Add importer for Printful Orders.csv file

This commit is contained in:
Ben Sturmfels 2023-10-13 19:56:37 +11:00
parent 5f1315b4e4
commit 579f6dde4b
Signed by: bsturmfels
GPG key ID: 023C05E2C9C068F0

View file

@ -0,0 +1,58 @@
import re
from . import _csv
from .. import strparse
class SalesImporter(_csv.CSVImporterBase):
DECIMAL_FIELDS = {
'Products': 'products',
'Shipping': 'shipping_fees',
'Tax': 'tax',
'VAT': 'vat',
'Total': 'amount',
'Discount': 'discount',
}
NEEDED_FIELDS = {'Printful ID', *DECIMAL_FIELDS}
COPIED_FIELDS = {}
CURRENCY_MAP = {
'$': 'USD',
'': 'EUR',
'£': 'GBP',
'AU$': 'AUD',
'C$': 'CAD',
}
currency_regexp = re.compile(r'-?(?P<currency>\D*)\d.*')
def __init__(self, input_file):
# Orders.csv file is in UTF-8-SIG encoding and begins with a byte order
# mark character \ufeff. This happens *after* NEEDED_FIELDS is
# checked. This encoding check is done conditionally to handle the
# situation where someone has modified the CSV and saved as UTF-8.
first_char = input_file.read(1)
input_file.seek(0)
if first_char == '\ufeff':
input_file.reconfigure(encoding='UTF-8-SIG')
super().__init__(input_file)
def _read_row(self, row):
if row['Date'].startswith('Total paid'):
return None
# Parse the currency values. A hyphen represents zero.
record = {
self.DECIMAL_FIELDS[key]: strparse.currency_decimal(row[key] if row[key] != '-' else '0')
for key in self.DECIMAL_FIELDS
}
# Most importers don't deal with multiple currencies. There are
# libraries that partly help with currency codes and symbols, but the
# codes/symbols Printful use have some quirks, so it's easier to do this
# ourselves.
currency_code = re.match(self.currency_regexp, row['Total']).group('currency')
record['currency'] = self.CURRENCY_MAP.get(currency_code, currency_code).replace('$', '')
record['date'] = strparse.date(row['Date'], '%B %d, %Y')
record['order_id'] = row['Order'].lstrip('Order ')
record['payee'] = 'Printful' # Not used but required to be set
return record