Do quick lookup by vendor item code, alt code for mobile receiving

at least until we have to make that configurable etc.
This commit is contained in:
Lance Edgar 2018-09-19 18:22:59 -05:00
parent acd8c97afc
commit 66f1ed0e41

View file

@ -1006,6 +1006,47 @@ class ReceivingBatchView(PurchasingBatchView):
if row.item_id == entry] if row.item_id == entry]
return rows return rows
def quick_locate_product(self, batch, entry):
# try to locate product by uuid before other, more specific key
product = self.Session.query(model.Product).get(entry)
if product:
return product
key = self.rattail_config.product_key()
if key == 'upc':
# we first assume the user entry *does* include check digit
provided = GPC(entry, calc_check_digit=False)
product = api.get_product_by_upc(self.Session(), provided)
if product:
return product
# but we can also calculate a check digit and try that
checked = GPC(entry, calc_check_digit='upc')
product = api.get_product_by_upc(self.Session(), checked)
if product:
return product
elif key == 'item_id':
# try to locate product by item_id
product = api.get_product_by_item_id(self.Session(), entry)
if product:
return product
# if we made it this far, lookup by product key failed.
# now we'll attempt lookup by vendor item code
product = api.get_product_by_vendor_code(self.Session(), entry, vendor=batch.vendor)
if product:
return product
# okay then, let's attempt lookup by "alternate" code
product = api.get_product_by_code(self.Session(), entry)
if product:
return product
def save_quick_row_form(self, form): def save_quick_row_form(self, form):
batch = self.get_instance() batch = self.get_instance()
entry = form.validated['quick_entry'] entry = form.validated['quick_entry']
@ -1031,8 +1072,9 @@ class ReceivingBatchView(PurchasingBatchView):
self.handler.refresh_batch_status(batch) self.handler.refresh_batch_status(batch)
return row return row
# try to locate product by uuid before other, more specific key # if product is easily located, add new row for it
product = self.Session.query(model.Product).get(entry) product = self.quick_locate_product(batch, entry)
# TODO: probably should be smarter about how we handle deleted?
if product and not product.deleted: if product and not product.deleted:
row = model.PurchaseBatchRow() row = model.PurchaseBatchRow()
row.product = product row.product = product
@ -1044,24 +1086,13 @@ class ReceivingBatchView(PurchasingBatchView):
key = self.rattail_config.product_key() key = self.rattail_config.product_key()
if key == 'upc': if key == 'upc':
# try to locate product by upc
provided = GPC(entry, calc_check_digit=False)
checked = GPC(entry, calc_check_digit='upc')
product = api.get_product_by_upc(self.Session(), provided)
if not product:
product = api.get_product_by_upc(self.Session(), checked)
if product:
row = model.PurchaseBatchRow()
row.product = product
self.handler.add_row(batch, row)
self.Session.flush()
self.handler.refresh_batch_status(batch)
return row
# check for "bad" upc # check for "bad" upc
if len(entry) > 14: if len(entry) > 14:
return return
provided = GPC(entry, calc_check_digit=False)
checked = GPC(entry, calc_check_digit='upc')
# product not in system, but presumably sane upc, so add to batch anyway # product not in system, but presumably sane upc, so add to batch anyway
row = model.PurchaseBatchRow() row = model.PurchaseBatchRow()
add_check_digit = True # TODO: make this dynamic, of course add_check_digit = True # TODO: make this dynamic, of course
@ -1078,16 +1109,6 @@ class ReceivingBatchView(PurchasingBatchView):
elif key == 'item_id': elif key == 'item_id':
# try to locate product by item_id
product = api.get_product_by_item_id(self.Session(), entry)
if product:
row = model.PurchaseBatchRow()
row.product = product
self.handler.add_row(batch, row)
self.Session.flush()
self.handler.refresh_batch_status(batch)
return row
# check for "too long" item_id # check for "too long" item_id
if len(entry) > maxlen(model.PurchaseBatchRow.item_id): if len(entry) > maxlen(model.PurchaseBatchRow.item_id):
return return