Add schema, logic for importing CORE VendorItem -> ProductCost
This commit is contained in:
parent
b96a4bc7b9
commit
580f2093ae
5 changed files with 200 additions and 1 deletions
|
@ -61,6 +61,7 @@ class FromCOREPOSToRattail(importing.ToRattailHandler):
|
|||
importers['Subdepartment'] = SubdepartmentImporter
|
||||
importers['Vendor'] = VendorImporter
|
||||
importers['Product'] = ProductImporter
|
||||
importers['ProductCost'] = ProductCostImporter
|
||||
importers['ProductMovement'] = ProductMovementImporter
|
||||
return importers
|
||||
|
||||
|
@ -570,6 +571,99 @@ class ProductMovementImporter(FromCOREPOSAPI, corepos_importing.model.ProductImp
|
|||
}
|
||||
|
||||
|
||||
class ProductCostImporter(FromCOREPOSAPI, corepos_importing.model.ProductCostImporter):
|
||||
"""
|
||||
Importer for product cost data from CORE POS API.
|
||||
"""
|
||||
key = 'corepos_id'
|
||||
supported_fields = [
|
||||
'corepos_id',
|
||||
'product_upc',
|
||||
'vendor_uuid',
|
||||
'code',
|
||||
'case_size',
|
||||
'case_cost',
|
||||
'unit_cost',
|
||||
'preferred',
|
||||
]
|
||||
|
||||
def setup(self):
|
||||
super(ProductCostImporter, self).setup()
|
||||
model = self.config.get_model()
|
||||
|
||||
query = self.session.query(model.Vendor)\
|
||||
.join(model.CoreVendor)\
|
||||
.filter(model.CoreVendor.corepos_id != None)
|
||||
self.vendors = self.cache_model(model.Vendor, query=query,
|
||||
key='corepos_id')
|
||||
|
||||
self.corepos_products = {}
|
||||
|
||||
def cache(product, i):
|
||||
self.corepos_products[product['upc']] = product
|
||||
|
||||
self.progress_loop(cache, self.api.get_products(),
|
||||
message="Caching Products from CORE-POS API")
|
||||
|
||||
def get_host_objects(self):
|
||||
return self.api.get_vendor_items()
|
||||
|
||||
def get_vendor(self, item):
|
||||
corepos_id = int(item['vendorID'])
|
||||
|
||||
if hasattr(self, 'vendors'):
|
||||
return self.vendors.get(corepos_id)
|
||||
|
||||
try:
|
||||
return self.session.query(model.Vendor)\
|
||||
.join(model.CoreVendor)\
|
||||
.filter(model.CoreVendor.corepos_id == corepos_id)\
|
||||
.one()
|
||||
except orm.exc.NoResultFound:
|
||||
pass
|
||||
|
||||
def get_corepos_product(self, item):
|
||||
if hasattr(self, 'corepos_products'):
|
||||
return self.corepos_products.get(item['upc'])
|
||||
|
||||
return self.api.get_vendor_item(item['upc'], item['vendorID'])
|
||||
|
||||
def normalize_host_object(self, item):
|
||||
try:
|
||||
upc = GPC(item['upc'], calc_check_digit='upc')
|
||||
except (TypeError, ValueError):
|
||||
log.warning("CORE POS vendor item has invalid UPC: %s", item['upc'])
|
||||
return
|
||||
|
||||
vendor = self.get_vendor(item)
|
||||
if not vendor:
|
||||
log.warning("CORE POS vendor not found for item: %s", item)
|
||||
return
|
||||
|
||||
product = self.get_corepos_product(item)
|
||||
# if not product:
|
||||
# log.warning("CORE POS product not found for item: %s", item)
|
||||
# return
|
||||
|
||||
preferred = False
|
||||
if product and product['default_vendor_id'] == item['vendorID']:
|
||||
preferred = True
|
||||
|
||||
case_size = decimal.Decimal(item['units'])
|
||||
unit_cost = decimal.Decimal(item['cost'])
|
||||
|
||||
return {
|
||||
'corepos_id': int(item['vendorItemID']),
|
||||
'product_upc': upc,
|
||||
'vendor_uuid': vendor.uuid,
|
||||
'code': (item['sku'] or '').strip() or None,
|
||||
'case_size': case_size,
|
||||
'case_cost': case_size * unit_cost,
|
||||
'unit_cost': unit_cost,
|
||||
'preferred': preferred,
|
||||
}
|
||||
|
||||
|
||||
class MemberImporter(FromCOREPOSAPI, corepos_importing.model.MemberImporter):
|
||||
"""
|
||||
Importer for member data from CORE POS API.
|
||||
|
|
|
@ -107,3 +107,22 @@ class ProductImporter(importing.model.ProductImporter):
|
|||
.filter(model.CoreProduct.corepos_id != None)
|
||||
|
||||
return query
|
||||
|
||||
|
||||
class ProductCostImporter(importing.model.ProductCostImporter):
|
||||
|
||||
extension_attr = '_corepos'
|
||||
extension_fields = [
|
||||
'corepos_id',
|
||||
]
|
||||
|
||||
def cache_query(self):
|
||||
query = super(ProductCostImporter, self).cache_query()
|
||||
model = self.config.get_model()
|
||||
|
||||
# we want to ignore items with no CORE ID, if that's (part of) our key
|
||||
if 'corepos_id' in self.key:
|
||||
query = query.join(model.CoreProductCost)\
|
||||
.filter(model.CoreProductCost.corepos_id != None)
|
||||
|
||||
return query
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue