Add logic for mobile receiving if product not in batch and/or system

This commit is contained in:
Lance Edgar 2017-07-11 00:59:51 -05:00
parent 7bbdf38551
commit af0eea76e2
3 changed files with 59 additions and 13 deletions

View file

@ -26,6 +26,11 @@
margin-bottom: 1em; margin-bottom: 1em;
} }
/* receiving warning flash messages */
.receiving-warning {
color: red;
}
.replacement-header { .replacement-header {
display: none; display: none;
} }

View file

@ -4,13 +4,17 @@
## TODO: this is broken for actual page (header) title ## TODO: this is broken for actual page (header) title
<%def name="title()">${h.link_to("Receiving", url('mobile.receiving'))} &raquo; ${h.link_to(instance.batch.id_str, url('mobile.receiving.view', uuid=instance.batch_uuid))} &raquo; ${row.upc.pretty()}</%def> <%def name="title()">${h.link_to("Receiving", url('mobile.receiving'))} &raquo; ${h.link_to(instance.batch.id_str, url('mobile.receiving.view', uuid=instance.batch_uuid))} &raquo; ${row.upc.pretty()}</%def>
<% unit_uom = 'LB' if row.product.weighed else 'EA' %> <% unit_uom = 'LB' if row.product and row.product.weighed else 'EA' %>
<div class="ui-grid-a"> <div class="ui-grid-a">
<div class="ui-block-a"> <div class="ui-block-a">
<h3>${instance.brand_name}</h3> % if instance.product:
<h3>${instance.description} ${instance.size}</h3> <h3>${instance.brand_name or ""}</h3>
<h3>${h.pretty_quantity(row.case_quantity)} ${unit_uom} per CS</h3> <h3>${instance.description} ${instance.size}</h3>
<h3>${h.pretty_quantity(row.case_quantity)} ${unit_uom} per CS</h3>
% else:
<h3>${instance.description}</h3>
% endif
</div> </div>
<div class="ui-block-b"> <div class="ui-block-b">
${h.image(product_image_url, "product image")} ${h.image(product_image_url, "product image")}
@ -38,6 +42,12 @@
</tbody> </tbody>
</table> </table>
% if request.session.peek_flash('receiving-warning'):
% for error in request.session.pop_flash('receiving-warning'):
<div class="receiving-warning">${error}</div>
% endfor
% endif
<table id="receiving-quantity-keypad-thingy" data-changed="false"> <table id="receiving-quantity-keypad-thingy" data-changed="false">
<tbody> <tbody>
<tr> <tr>

View file

@ -31,7 +31,7 @@ import re
import sqlalchemy as sa import sqlalchemy as sa
from rattail import pod from rattail import pod
from rattail.db import model from rattail.db import model, api
from rattail.gpc import GPC from rattail.gpc import GPC
from rattail.util import pretty_quantity, prettify from rattail.util import pretty_quantity, prettify
@ -71,13 +71,23 @@ class MobileBatchStatusFilter(grids.filters.MobileFilter):
class MobileItemStatusFilter(grids.filters.MobileFilter): class MobileItemStatusFilter(grids.filters.MobileFilter):
value_choices = ['incomplete', 'damaged', 'expired', 'all'] value_choices = ['incomplete', 'unexpected', 'damaged', 'expired', 'all']
def filter_equal(self, query, value): def filter_equal(self, query, value):
# TODO: is this accurate (enough) ? # TODO: is this accurate (enough) ?
if value == 'incomplete': if value == 'incomplete':
return query.filter(model.PurchaseBatchRow.status_code != model.PurchaseBatchRow.STATUS_OK) return query.filter(sa.or_(model.PurchaseBatchRow.cases_ordered != 0, model.PurchaseBatchRow.units_ordered != 0))\
.filter(model.PurchaseBatchRow.status_code != model.PurchaseBatchRow.STATUS_OK)
if value == 'unexpected':
return query.filter(sa.and_(
sa.or_(
model.PurchaseBatchRow.cases_ordered == None,
model.PurchaseBatchRow.cases_ordered == 0),
sa.or_(
model.PurchaseBatchRow.units_ordered == None,
model.PurchaseBatchRow.units_ordered == 0)))
if value == 'damaged': if value == 'damaged':
return query.filter(sa.or_( return query.filter(sa.or_(
@ -207,16 +217,18 @@ class ReceivingBatchView(PurchasingBatchView):
def render_mobile_row_listitem(self, row, **kwargs): def render_mobile_row_listitem(self, row, **kwargs):
if row is None: if row is None:
return '' return ''
title = "({}) {}".format(row.upc.pretty(), row.product.full_description) description = row.product.full_description if row.product else row.description
title = "({}) {}".format(row.upc.pretty(), description)
url = self.request.route_url('mobile.receiving.rows.view', uuid=row.uuid) url = self.request.route_url('mobile.receiving.rows.view', uuid=row.uuid)
return tags.link_to(title, url) return tags.link_to(title, url)
def mobile_lookup(self): def mobile_lookup(self):
""" """
Try to locate a product by UPC, and validate it in the context of Locate and/or create a row within the batch, according to the given
current batch, returning some data for client JS. product UPC, then redirect to the row view page.
""" """
batch = self.get_instance() batch = self.get_instance()
row = None
upc = self.request.GET.get('upc', '').strip() upc = self.request.GET.get('upc', '').strip()
upc = re.sub(r'\D', '', upc) upc = re.sub(r'\D', '', upc)
if upc: if upc:
@ -234,10 +246,27 @@ class ReceivingBatchView(PurchasingBatchView):
log.warning("found multiple UPC matches for {} in batch {}: {}".format( log.warning("found multiple UPC matches for {} in batch {}: {}".format(
upc, batch.id_str, batch)) upc, batch.id_str, batch))
row = rows[0] row = rows[0]
return self.redirect(self.request.route_url('mobile.{}.view'.format(self.get_row_route_prefix()), uuid=row.uuid))
# TODO: how to handle product not found in system / purchase ? # try to locate general product by UPC; add to batch if found
raise NotImplementedError 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
batch.add_row(row)
self.handler.refresh_row(row)
# if product not even in system, add to batch anyway..
if not row:
row = model.PurchaseBatchRow()
row.upc = provided # TODO: why not checked? how to know?
row.description = "(unknown product)"
batch.add_row(row)
self.handler.refresh_row(row)
self.Session.flush()
return self.redirect(self.request.route_url('mobile.{}.view'.format(self.get_row_route_prefix()), uuid=row.uuid))
def mobile_view_row(self): def mobile_view_row(self):
""" """
@ -285,6 +314,8 @@ class ReceivingBatchView(PurchasingBatchView):
return self.redirect(self.request.route_url('mobile.{}.view'.format(self.get_route_prefix()), uuid=row.batch_uuid)) return self.redirect(self.request.route_url('mobile.{}.view'.format(self.get_route_prefix()), uuid=row.batch_uuid))
if not row.cases_ordered and not row.units_ordered:
self.request.session.flash("This item was NOT on the original purchase order.", 'receiving-warning')
return self.render_to_response('view_row', context, mobile=True) return self.render_to_response('view_row', context, mobile=True)
def attach_credit(self, row, credit_type, cases, units, expiration_date=None, discarded=None, mispick_product=None): def attach_credit(self, row, credit_type, cases, units, expiration_date=None, discarded=None, mispick_product=None):