Add support for Customer data in CORE API -> Rattail import/sync

This commit is contained in:
Lance Edgar 2020-03-15 19:29:47 -05:00
parent c44dba6456
commit 36b8afb03b
2 changed files with 68 additions and 0 deletions

View file

@ -47,6 +47,8 @@ class FromCOREAPIToRattail(NewDataSyncImportConsumer):
self.api = CoreWebAPI(url) self.api = CoreWebAPI(url)
def get_host_object(self, session, change): def get_host_object(self, session, change):
if change.payload_type == 'Customer':
return self.api.get_customer(change.payload_key)
if change.payload_type == 'Department': if change.payload_type == 'Department':
return self.api.get_department(change.payload_key) return self.api.get_department(change.payload_key)
if change.payload_type == 'Subdepartment': if change.payload_type == 'Subdepartment':

View file

@ -28,10 +28,12 @@ import decimal
import logging import logging
from corepos.api import CoreWebAPI from corepos.api import CoreWebAPI
from corepos.db.office_op import Session as CoreSession, model as corepos
from rattail import importing from rattail import importing
from rattail.gpc import GPC from rattail.gpc import GPC
from rattail.util import OrderedDict from rattail.util import OrderedDict
from rattail.db.util import normalize_full_name, short_session
from rattail_corepos import importing as corepos_importing from rattail_corepos import importing as corepos_importing
@ -46,6 +48,7 @@ class FromCOREPOSToRattail(importing.ToRattailHandler):
def get_importers(self): def get_importers(self):
importers = OrderedDict() importers = OrderedDict()
importers['Customer'] = CustomerImporter
importers['Department'] = DepartmentImporter importers['Department'] = DepartmentImporter
importers['Subdepartment'] = SubdepartmentImporter importers['Subdepartment'] = SubdepartmentImporter
importers['Vendor'] = VendorImporter importers['Vendor'] = VendorImporter
@ -67,6 +70,69 @@ class FromCOREPOSAPI(importing.Importer):
self.api = CoreWebAPI(url) self.api = CoreWebAPI(url)
class CustomerImporter(FromCOREPOSAPI, importing.model.CustomerImporter):
"""
Importer for customer data from CORE POS API.
"""
key = 'number'
supported_fields = [
'id',
'number',
'name',
'first_name',
'last_name',
]
def get_host_objects(self):
# TODO: ideally could do this, but API doesn't let us fetch "all"
# return self.api.get_customers()
# first we fetch all customer records from CORE DB
with short_session(Session=CoreSession) as s:
db_customers = s.query(corepos.Customer).all()
s.expunge_all()
# now we must fetch each customer account individually from API
customers = OrderedDict()
def fetch(dbcust, i):
if dbcust.card_number in customers:
return # already fetched this one
customer = self.api.get_customer(dbcust.card_number)
if customer:
customers[dbcust.card_number] = customer
else:
logger = log.warning if dbcust.person_number == 1 else log.debug
logger("could not fetch customer from CORE API: %s",
dbcust.card_number)
self.progress_loop(fetch, db_customers,
message="Fetching Customer data from CORE-POS API")
return list(customers.values())
def normalize_host_object(self, customer):
# figure out the "account holder" person for the customer
people = customer['customers']
account_holders = [person for person in people
if person['accountHolder']]
if len(account_holders) > 1:
log.warning("customer %s has %s account holders in CORE: %s",
customer['cardNo'], len(account_holders), customer)
elif not account_holders:
raise NotImplementedError("TODO: how to handle customer with no account holders?")
person = account_holders[0]
return {
'id': customer['customerAccountID'],
'number': int(customer['cardNo']),
'name': normalize_full_name(person['firstName'],
person['lastName']),
'first_name': person['firstName'],
'last_name': person['lastName'],
}
class DepartmentImporter(FromCOREPOSAPI, importing.model.DepartmentImporter): class DepartmentImporter(FromCOREPOSAPI, importing.model.DepartmentImporter):
""" """
Importer for department data from CORE POS API. Importer for department data from CORE POS API.