Add support for Customer data in CORE API -> Rattail import/sync
This commit is contained in:
parent
c44dba6456
commit
36b8afb03b
|
@ -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':
|
||||||
|
|
|
@ -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.
|
||||||
|
|
Loading…
Reference in a new issue