Add supplier info to Catapult export

This commit is contained in:
Lance Edgar 2020-03-30 11:34:17 -05:00
parent 6dc65f1aa5
commit e30cbf374e

View file

@ -92,10 +92,10 @@ class InventoryItemImporter(FromCore, catapult_importing.model.InventoryItemImpo
'alt_pkg_qty', 'alt_pkg_qty',
'alt_pkg_price', 'alt_pkg_price',
# 'auto_discount', # 'auto_discount',
# 'supplier_unit_id', 'supplier_unit_id',
# 'supplier_id', 'supplier_id',
# 'unit', 'unit',
# 'num_pkgs', 'num_pkgs',
# 'cs_pk_multiplier', # 'cs_pk_multiplier',
# 'dsd', # 'dsd',
'pf1', 'pf1',
@ -126,11 +126,22 @@ class InventoryItemImporter(FromCore, catapult_importing.model.InventoryItemImpo
'corepos', 'exporting.catapult_inventory.warn_truncated_receipt_alias', 'corepos', 'exporting.catapult_inventory.warn_truncated_receipt_alias',
default=True) default=True)
self.warn_multiple_vendor_items = self.config.getbool(
'corepos', 'exporting.catapult_inventory.warn_multiple_vendor_items',
default=True)
self.warn_no_valid_vendor_items = self.config.getbool(
'corepos', 'exporting.catapult_inventory.warn_no_valid_vendor_items',
default=True)
def query(self): def query(self):
query = self.host_session.query(corepos.Product)\ query = self.host_session.query(corepos.Product)\
.order_by(corepos.Product.upc)\ .order_by(corepos.Product.upc)\
.options(orm.joinedload(corepos.Product.department))\ .options(orm.joinedload(corepos.Product.department))\
.options(orm.joinedload(corepos.Product.subdepartment)) .options(orm.joinedload(corepos.Product.subdepartment))\
.options(orm.joinedload(corepos.Product.vendor_items)\
.joinedload(corepos.VendorItem.vendor))\
.options(orm.joinedload(corepos.Product.default_vendor))
return query return query
def normalize_host_object(self, product): def normalize_host_object(self, product):
@ -237,6 +248,60 @@ class InventoryItemImporter(FromCore, catapult_importing.model.InventoryItemImpo
alt_pkg_qty = product.quantity alt_pkg_qty = product.quantity
alt_pkg_price = product.group_price alt_pkg_price = product.group_price
# no supplier info by default
supplier_unit_id = None
supplier_id = None
supplier_unit = None
supplier_num_pkgs = None
# maybe add supplier info, for "default" `vendorItems` record. we'll
# have to get a little creative to figure out which is the default
vendor_items = []
# first we try to narrow down according to product's default vendor
if product.default_vendor:
vendor_items = [item for item in product.vendor_items
if item.vendor is product.default_vendor]
# but if that didn't work, just use any "valid" vendorItems
if not vendor_items:
# valid in this context means, not missing vendor
vendor_items = [item for item in product.vendor_items
if item.vendor]
if not vendor_items and product.vendor_items:
logger = log.warning if self.warn_no_valid_vendor_items else log.debug
logger("product %s has %s vendorItems but each is missing (valid) vendor: %s",
product.upc, len(product.vendor_items), product)
if vendor_items:
if len(vendor_items) > 1:
# try to narrow down a bit further, based on valid 'units' amount
valid_items = [item for item in vendor_items
if item.units]
if valid_items:
vendor_items = valid_items
# warn if we still have more than one "obvious" vendor item
if len(vendor_items) > 1:
logger = log.warning if self.warn_multiple_vendor_items else log.debug
logger("product %s has %s vendorItems to pick from: %s",
product.upc, len(vendor_items), product)
# sort the list so most recently modified is first
vendor_items.sort(key=lambda item: item.modified,
reverse=True)
# use the "first" vendor item available
item = vendor_items[0]
supplier_unit_id = item.sku
supplier_id = item.vendor.name
supplier_num_pkgs = item.units or 1
if supplier_num_pkgs == 1:
supplier_unit = 'LB' if product.scale else 'EA'
else:
supplier_unit = 'CS'
return { return {
'item_id': item_id, 'item_id': item_id,
'dept_id': department.number, 'dept_id': department.number,
@ -284,14 +349,13 @@ class InventoryItemImporter(FromCore, catapult_importing.model.InventoryItemImpo
# TODO: does CORE have this? # TODO: does CORE have this?
# 'auto_discount': None, # 'auto_discount': None,
# TODO: pretty sure CORE has these, but i'm not sure where 'supplier_unit_id': supplier_unit_id,
# 'supplier_unit_id': None, 'supplier_id': supplier_id,
# 'supplier_id': None, 'unit': supplier_unit,
# 'unit': None, 'num_pkgs': supplier_num_pkgs,
# 'num_pkgs': None,
# 'cs_pk_multiplier': None,
# TODO: does CORE have this? # TODO: does CORE have these?
# 'cs_pk_multiplier': None,
# 'dsd': None, # 'dsd': None,
'pf1': product.subdepartment.number if product.subdepartment else None, 'pf1': product.subdepartment.number if product.subdepartment else None,