Add support for importing MemberEquityPayment from CORE-POS DB

SQL only, no API for now
This commit is contained in:
Lance Edgar 2023-09-07 17:49:28 -05:00
parent 35e24422a2
commit a57f29fe1a
8 changed files with 248 additions and 15 deletions

View file

@ -835,16 +835,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)
if not customer:
log.warning("Rattail customer not found for cardNo %s: %s",
card_number, member)
return
person = self.app.get_person(customer)
if not person:
log.warning("Rattail person not found for cardNo %s: %s",
card_number, member)
return
person = self.app.get_person(customer) if customer else None
# TODO: at first i was *skipping* non-member status records,
# but since CORE sort of assumes all customers are members,
@ -883,8 +874,8 @@ class MemberImporter(FromCOREPOSAPI, corepos_importing.model.MemberImporter):
return {
'number': card_number,
'corepos_account_id': int(member['customerAccountID']),
'customer_uuid': customer.uuid,
'person_uuid': person.uuid,
'customer_uuid': customer.uuid if customer else None,
'person_uuid': person.uuid if person else None,
'membership_type_number': typeno,
'joined': joined,
'withdrew': withdrew,

View file

@ -25,19 +25,27 @@ CORE POS (DB) -> Rattail data importing
"""
import decimal
import logging
from collections import OrderedDict
from sqlalchemy import orm
from corepos.db.office_op import model as corepos, Session as CoreSession
from corepos.db.office_trans import model as coretrans, Session as CoreTransSession
from rattail import importing
from rattail.gpc import GPC
from rattail_corepos import importing as corepos_importing
log = logging.getLogger(__name__)
class FromCOREPOSToRattail(importing.FromSQLAlchemyHandler, importing.ToRattailHandler):
"""
Import handler for data coming from a CORE POS database.
"""
# TODO: these should be changed, it now allows for "trans" DB too..
generic_host_title = 'CORE Office (DB "op")'
host_key = 'corepos_db_office_op'
corepos_dbkey = 'default'
@ -47,6 +55,12 @@ class FromCOREPOSToRattail(importing.FromSQLAlchemyHandler, importing.ToRattailH
return "CORE-POS (DB/{})".format(self.corepos_dbkey)
def make_host_session(self):
# session type depends on the --corepos-dbtype arg
if self.corepos_dbtype == 'office_trans':
return CoreTransSession(bind=self.config.coretrans_engines[self.corepos_dbkey])
# assume office_op by default
return CoreSession(bind=self.config.corepos_engines[self.corepos_dbkey])
def get_importers(self):
@ -55,8 +69,17 @@ class FromCOREPOSToRattail(importing.FromSQLAlchemyHandler, importing.ToRattailH
importers['Department'] = DepartmentImporter
importers['Subdepartment'] = SubdepartmentImporter
importers['Product'] = ProductImporter
importers['MemberEquityPayment'] = MemberEquityPaymentImporter
return importers
def get_default_keys(self):
keys = super().get_default_keys()
if 'MemberEquityPayment' in keys:
keys.remove('MemberEquityPayment')
return keys
class FromCOREPOS(importing.FromSQLAlchemy):
"""
@ -228,3 +251,84 @@ class ProductImporter(FromCOREPOS, corepos_importing.model.ProductImporter):
})
return data
class MemberEquityPaymentImporter(FromCOREPOS, corepos_importing.model.MemberEquityPaymentImporter):
"""
Imports equity payment data from CORE-POS
"""
host_model_class = coretrans.StockPurchase
# TODO: this is composite key for StockPurchase, but may need to change?
key = ('member_uuid', 'received', 'transaction_identifier')
supported_fields = [
'member_uuid',
'amount',
'received',
'transaction_identifier',
'corepos_card_number',
'corepos_transaction_number',
'corepos_transaction_id',
'corepos_department_number',
]
def setup(self):
super().setup()
model = self.model
query = self.session.query(model.Member)\
.join(model.Customer)\
.join(model.CoreCustomer)\
.options(orm.joinedload(model.Member.customer)\
.joinedload(model.Customer._corepos))
key = lambda member, normal: member.customer.corepos_card_number
self.members_by_card_number = self.cache_model(model.Member,
query=query,
key=key)
def get_member(self, card_number):
if hasattr(self, 'members_by_card_number'):
return self.members_by_card_number.get(card_number)
model = self.model
try:
return self.session.query(model.Member)\
.join(model.Customer)\
.join(model.CoreCustomer)\
.filter(model.CoreCustomer.corepos_card_number == card_number)\
.one()
except orm.exc.NoResultFound:
pass
def normalize_host_object(self, stock_purchase):
card_number = stock_purchase.card_number
member = self.get_member(card_number)
if not member:
log.warning("member not found for card number %s: %s",
card_number, stock_purchase)
return
received = stock_purchase.datetime
if received:
received = self.app.localtime(received)
received = self.app.make_utc(received)
return {
'member_uuid': member.uuid,
'amount': stock_purchase.amount,
'received': received,
'transaction_identifier': stock_purchase.transaction_number,
'corepos_card_number': stock_purchase.card_number,
'corepos_transaction_number': stock_purchase.transaction_number,
'corepos_transaction_id': stock_purchase.transaction_id,
'corepos_department_number': stock_purchase.department_number,
}
def create_object(self, key, host_data):
payment = super().create_object(key, host_data)
if payment:
# track where each payment comes from!
payment.source = 'corepos'
return payment

View file

@ -82,6 +82,18 @@ class MemberImporter(importing.model.MemberImporter):
}
class MemberEquityPaymentImporter(importing.model.MemberEquityPaymentImporter):
extensions = {
'_corepos': [
'corepos_card_number',
'corepos_transaction_number',
'corepos_transaction_id',
'corepos_department_number',
],
}
class StoreImporter(importing.model.StoreImporter):
extensions = {

View file

@ -37,6 +37,7 @@ class CoreposVersionMixin(object):
importers['CoreCustomer'] = CoreCustomerImporter
importers['CoreCustomerShopper'] = CoreCustomerShopperImporter
importers['CoreMember'] = CoreMemberImporter
importers['CoreMemberEquityPayment'] = CoreMemberEquityPaymentImporter
importers['CoreStore'] = CoreStoreImporter
importers['CoreDepartment'] = CoreDepartmentImporter
importers['CoreSubdepartment'] = CoreSubdepartmentImporter
@ -76,6 +77,14 @@ class CoreMemberImporter(base.VersionImporter):
return model.CoreMember
class CoreMemberEquityPaymentImporter(base.VersionImporter):
@property
def host_model_class(self):
model = self.config.get_model()
return model.CoreMemberEquityPayment
class CoreStoreImporter(base.VersionImporter):
@property