Add logic for mobile receiving if product not in batch and/or system
This commit is contained in:
		
							parent
							
								
									7bbdf38551
								
							
						
					
					
						commit
						af0eea76e2
					
				
					 3 changed files with 59 additions and 13 deletions
				
			
		| 
						 | 
					@ -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;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -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'))} » ${h.link_to(instance.batch.id_str, url('mobile.receiving.view', uuid=instance.batch_uuid))} » ${row.upc.pretty()}</%def>
 | 
					<%def name="title()">${h.link_to("Receiving", url('mobile.receiving'))} » ${h.link_to(instance.batch.id_str, url('mobile.receiving.view', uuid=instance.batch_uuid))} » ${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.brand_name or ""}</h3>
 | 
				
			||||||
        <h3>${instance.description} ${instance.size}</h3>
 | 
					        <h3>${instance.description} ${instance.size}</h3>
 | 
				
			||||||
        <h3>${h.pretty_quantity(row.case_quantity)} ${unit_uom} per CS</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>
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -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):
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue