fix: include person_uuid for Member import from CORE API

so we correctly associate Customer / Person / Member
This commit is contained in:
Lance Edgar 2024-07-02 13:58:47 -05:00
parent 6f7fa65c09
commit eb9a1ae4f0

View file

@ -29,6 +29,7 @@ import decimal
import logging
from collections import OrderedDict
import sqlalchemy as sa
from sqlalchemy import orm
from rattail import importing
@ -800,14 +801,13 @@ class MemberImporter(FromCOREPOSAPI, corepos_importing.model.MemberImporter):
"""
Importer for member data from CORE POS API.
"""
# TODO use this key instead
#key = 'corepos_card_number'
key = 'number'
key = 'corepos_card_number'
supported_fields = [
'number',
'corepos_account_id',
'corepos_card_number',
'customer_uuid',
'person_uuid',
'person_first_name',
'person_last_name',
'membership_type_number',
@ -837,9 +837,57 @@ class MemberImporter(FromCOREPOSAPI, corepos_importing.model.MemberImporter):
model.Customer,
key='number')
query = self.session.query(model.Person)\
.outerjoin(model.Customer,
model.Customer.account_holder_uuid == model.Person.uuid)\
.outerjoin(model.CoreCustomer)\
.outerjoin(model.Member,
model.Member.person_uuid == model.Person.uuid)\
.outerjoin(model.CoreMember)\
.filter(sa.or_(
model.CoreCustomer.corepos_card_number != None,
model.CoreMember.corepos_card_number != None))\
.options(orm.joinedload(model.Person.customer_accounts)\
.joinedload(model.Customer._corepos))
def card_number(person, normal):
customer = self.app.get_customer(person)
if customer and customer.corepos_card_number:
return customer.corepos_card_number
member = self.app.get_member(person)
if member and member.corepos_card_number:
return member.corepos_card_number
self.people_by_card_number = self.cache_model(model.Person, query=query,
key=card_number)
def get_host_objects(self):
return self.get_core_members()
def get_person(self, card_number):
if hasattr(self, 'people_by_card_number'):
return self.people_by_card_number.get(card_number)
model = self.model
try:
return self.session.query(model.Person)\
.join(model.Customer,
model.Customer.account_holder_uuid == model.Person.uuid)\
.join(model.CoreCustomer)\
.filter(model.CoreCustomer.corepos_card_number == card_number)\
.one()
except orm.exc.NoResultFound:
pass
try:
return self.session.query(model.Person)\
.join(model.Member,
model.Member.person_uuid == model.Person.uuid)\
.join(model.CoreMember)\
.filter(model.CoreMember.corepos_card_number == card_number)\
.one()
except orm.exc.NoResultFound:
pass
def get_customer_by_number(self, number):
if hasattr(self, 'customers_by_number'):
return self.customers_by_number.get(number)
@ -860,6 +908,7 @@ class MemberImporter(FromCOREPOSAPI, corepos_importing.model.MemberImporter):
def normalize_host_object(self, member):
card_number = member['cardNo']
customer = self.get_customer_by_number(card_number)
person = self.get_person(card_number)
# TODO: at first i was *skipping* non-member status records,
# but since CORE sort of assumes all customers are members,
@ -902,6 +951,7 @@ class MemberImporter(FromCOREPOSAPI, corepos_importing.model.MemberImporter):
'corepos_account_id': int(member['customerAccountID']),
'corepos_card_number': card_number,
'customer_uuid': customer.uuid if customer else None,
'person_uuid': person.uuid if person else None,
'person_first_name': None,
'person_last_name': None,
'membership_type_number': typeno,