Add locate_product_for_entry()
method for purchase batch handler
this logic needs to be customized for a client, so breaking it out from the tailbone view code
This commit is contained in:
parent
0d0125f0a8
commit
f287636794
|
@ -32,6 +32,7 @@ import six
|
||||||
from sqlalchemy import orm
|
from sqlalchemy import orm
|
||||||
|
|
||||||
from rattail.db import model, api
|
from rattail.db import model, api
|
||||||
|
from rattail.gpc import GPC
|
||||||
from rattail.batch import BatchHandler
|
from rattail.batch import BatchHandler
|
||||||
from rattail.time import make_utc
|
from rattail.time import make_utc
|
||||||
from rattail.vendors.invoices import require_invoice_parser
|
from rattail.vendors.invoices import require_invoice_parser
|
||||||
|
@ -489,6 +490,54 @@ class PurchaseBatchHandler(BatchHandler):
|
||||||
else:
|
else:
|
||||||
batch.status_code = batch.STATUS_OK
|
batch.status_code = batch.STATUS_OK
|
||||||
|
|
||||||
|
def locate_product_for_entry(self, session, entry, lookup_by_code=True):
|
||||||
|
"""
|
||||||
|
Try to locate the product represented by the given "entry" - which is
|
||||||
|
assumed to be a "raw" string, e.g. as obtained from scanner or other
|
||||||
|
user input, or from a vendor-supplied spreadsheet etc. (In other words
|
||||||
|
this method is not told "what" sort of entry it is being given.)
|
||||||
|
|
||||||
|
:param lookup_by_code: If set to ``False``, then the method will
|
||||||
|
attempt a lookup *only* on the product key field (either ``upc`` or
|
||||||
|
``item_id`` depending on config). If set to ``True`` (the default)
|
||||||
|
then the method will also attempt a lookup in the ``ProductCode``
|
||||||
|
table, aka. alternate codes.
|
||||||
|
"""
|
||||||
|
# try to locate product by uuid before other, more specific key
|
||||||
|
product = session.query(model.Product).get(entry)
|
||||||
|
if product:
|
||||||
|
return product
|
||||||
|
|
||||||
|
product_key = self.config.product_key()
|
||||||
|
if product_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(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(session, checked)
|
||||||
|
if product:
|
||||||
|
return product
|
||||||
|
|
||||||
|
elif product_key == 'item_id':
|
||||||
|
|
||||||
|
# try to locate product by item_id
|
||||||
|
product = api.get_product_by_item_id(session, entry)
|
||||||
|
if product:
|
||||||
|
return product
|
||||||
|
|
||||||
|
# if we made it this far, lookup by product key failed.
|
||||||
|
|
||||||
|
# okay then, let's maybe attempt lookup by "alternate" code
|
||||||
|
if lookup_by_code:
|
||||||
|
product = api.get_product_by_code(session, entry)
|
||||||
|
if product:
|
||||||
|
return product
|
||||||
|
|
||||||
def locate_product(self, row):
|
def locate_product(self, row):
|
||||||
"""
|
"""
|
||||||
Try to locate the product represented by the given row. Default
|
Try to locate the product represented by the given row. Default
|
||||||
|
|
Loading…
Reference in a new issue