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:
parent
421a58efc2
commit
76b183676d
|
@ -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
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue