Misc. fixes for CORE API -> Theo importers

based on a certain sample data set, not sure why these didn't come up
before?  oh well
This commit is contained in:
Lance Edgar 2024-05-09 20:52:08 -05:00
parent 421a58efc2
commit 76b183676d

View file

@ -2,7 +2,7 @@
################################################################################ ################################################################################
# #
# Rattail -- Retail Software Framework # Rattail -- Retail Software Framework
# Copyright © 2010-2023 Lance Edgar # Copyright © 2010-2024 Lance Edgar
# #
# This file is part of Rattail. # This file is part of Rattail.
# #
@ -32,9 +32,6 @@ from collections import OrderedDict
from sqlalchemy import orm from sqlalchemy import orm
from rattail import importing from rattail import importing
from rattail.gpc import GPC
from rattail.time import localtime, make_utc
from rattail.core import get_uuid
from rattail.db.util import normalize_full_name from rattail.db.util import normalize_full_name
from rattail_corepos import importing as corepos_importing from rattail_corepos import importing as corepos_importing
from rattail_corepos.corepos.util import get_core_members from rattail_corepos.corepos.util import get_core_members
@ -68,7 +65,7 @@ class FromCOREPOSToRattail(importing.ToRattailHandler):
return importers return importers
def get_default_keys(self): def get_default_keys(self):
keys = super(FromCOREPOSToRattail, self).get_default_keys() keys = super().get_default_keys()
if 'ProductMovement' in keys: if 'ProductMovement' in keys:
keys.remove('ProductMovement') keys.remove('ProductMovement')
@ -410,7 +407,7 @@ class SubdepartmentImporter(FromCOREPOSAPI, corepos_importing.model.Subdepartmen
return { return {
'corepos_number': int(subdepartment['subdept_no']), 'corepos_number': int(subdepartment['subdept_no']),
'number': int(subdepartment['subdept_no']), 'number': int(subdepartment['subdept_no']),
'name': subdepartment['subdept_name'], 'name': subdepartment.get('subdept_name'),
'department_number': department_number, 'department_number': department_number,
} }
@ -438,7 +435,7 @@ class VendorImporter(FromCOREPOSAPI, corepos_importing.model.VendorImporter):
return { return {
'corepos_id': int(vendor['vendorID']), 'corepos_id': int(vendor['vendorID']),
'id': str(vendor['vendorID']), 'id': str(vendor['vendorID']),
'name': vendor['vendorName'], 'name': vendor.get('vendorName'),
'abbreviation': vendor.get('vendorAbbreviation') or None, 'abbreviation': vendor.get('vendorAbbreviation') or None,
'special_discount': decimal.Decimal(vendor['discountRate']), 'special_discount': decimal.Decimal(vendor['discountRate']),
'phone_number': vendor.get('phone') or None, 'phone_number': vendor.get('phone') or None,
@ -476,7 +473,7 @@ class ProductImporter(FromCOREPOSAPI, corepos_importing.model.ProductImporter):
] ]
def setup(self): def setup(self):
super(ProductImporter, self).setup() super().setup()
model = self.model model = self.model
query = self.session.query(model.Product)\ query = self.session.query(model.Product)\
@ -496,6 +493,8 @@ class ProductImporter(FromCOREPOSAPI, corepos_importing.model.ProductImporter):
self.progress_loop(cache, self.api.get_vendor_items(), self.progress_loop(cache, self.api.get_vendor_items(),
message="Caching CORE Vendor Items") message="Caching CORE Vendor Items")
self.maxval_unit_size = self.app.maxval(model.Product.unit_size)
def get_host_objects(self): def get_host_objects(self):
return self.api.get_products() return self.api.get_products()
@ -528,7 +527,7 @@ class ProductImporter(FromCOREPOSAPI, corepos_importing.model.ProductImporter):
product = self.identify_product(corepos_product) product = self.identify_product(corepos_product)
if product: if product:
return product.uuid return product.uuid
return get_uuid() return self.app.make_uuid()
def get_vendor_items(self, api_product): def get_vendor_items(self, api_product):
if hasattr(self, 'vendor_items_by_upc'): if hasattr(self, 'vendor_items_by_upc'):
@ -537,8 +536,12 @@ class ProductImporter(FromCOREPOSAPI, corepos_importing.model.ProductImporter):
return self.api.get_vendor_items(upc=api_product['upc']) return self.api.get_vendor_items(upc=api_product['upc'])
def normalize_host_object(self, product): def normalize_host_object(self, product):
if 'upc' not in product:
log.warning("CORE-POS product has no UPC: %s", product)
return
try: try:
upc = GPC(product['upc'], calc_check_digit='upc') upc = self.app.make_gpc(product['upc'], calc_check_digit='upc')
except (TypeError, ValueError): except (TypeError, ValueError):
log.debug("CORE POS product has invalid UPC: %s", product['upc']) log.debug("CORE POS product has invalid UPC: %s", product['upc'])
if len(self.key) == 1 and self.key[0] == 'upc': if len(self.key) == 1 and self.key[0] == 'upc':
@ -587,9 +590,14 @@ class ProductImporter(FromCOREPOSAPI, corepos_importing.model.ProductImporter):
'size': size_info['size'], 'size': size_info['size'],
'unit_size': size_info['unit_size'], 'unit_size': size_info['unit_size'],
'unit_of_measure': size_info['uom_code'], 'unit_of_measure': size_info['uom_code'],
'uom_abbreviation': size_info['uom_abbrev'], 'uom_abbreviation': (size_info['uom_abbrev'] or '').strip() or None,
}) })
if data['unit_size'] and data['unit_size'] >= self.maxval_unit_size:
log.warning("unit_size too large (%s) for product %s, will use null instead: %s",
data['unit_size'], data['upc'], product)
data['unit_size'] = None
if 'case_size' in self.fields: if 'case_size' in self.fields:
case_size = None case_size = None
items = self.get_vendor_items(product) items = self.get_vendor_items(product)
@ -633,8 +641,8 @@ class ProductMovementImporter(FromCOREPOSAPI, corepos_importing.model.ProductImp
last_sold = None last_sold = None
if 'last_sold' in product: if 'last_sold' in product:
last_sold = datetime.datetime.strptime(product['last_sold'], '%Y-%m-%d %H:%M:%S') last_sold = datetime.datetime.strptime(product['last_sold'], '%Y-%m-%d %H:%M:%S')
last_sold = localtime(self.config, last_sold) last_sold = self.app.localtime(last_sold)
last_sold = make_utc(last_sold) last_sold = self.app.make_utc(last_sold)
return { return {
'corepos_id': int(product['id']), 'corepos_id': int(product['id']),
@ -662,7 +670,7 @@ class ProductCostImporter(FromCOREPOSAPI, corepos_importing.model.ProductCostImp
] ]
def setup(self): def setup(self):
super(ProductCostImporter, self).setup() super().setup()
model = self.config.get_model() model = self.config.get_model()
query = self.session.query(model.Vendor)\ query = self.session.query(model.Vendor)\
@ -676,7 +684,8 @@ class ProductCostImporter(FromCOREPOSAPI, corepos_importing.model.ProductCostImp
self.corepos_products = {} self.corepos_products = {}
def cache(product, i): def cache(product, i):
self.corepos_products[product['upc']] = product if 'upc' in product:
self.corepos_products[product['upc']] = product
self.progress_loop(cache, self.api.get_products(), self.progress_loop(cache, self.api.get_products(),
message="Caching Products from CORE-POS API") message="Caching Products from CORE-POS API")
@ -881,10 +890,10 @@ class MemberImporter(FromCOREPOSAPI, corepos_importing.model.MemberImporter):
if withdrew == datetime.date(1900, 1, 1): if withdrew == datetime.date(1900, 1, 1):
withdrew = None withdrew = None
typeno = int(member['customerTypeID']) typeno = int(member['customerTypeID'] or 0)
memtype = self.get_membership_type_by_number(typeno) memtype = self.get_membership_type_by_number(typeno)
if not memtype: if not memtype:
log.warning("unknown customerTypeID (membership_type_number) %s for: %s", log.warning("unknown customerTypeID (membership_type_number) '%s' for: %s",
member['customerTypeID'], member) member['customerTypeID'], member)
typeno = None typeno = None