Add initial support for "variance" inventory batch mode

probably incomplete yet; needs testing
This commit is contained in:
Lance Edgar 2018-05-30 11:48:39 -05:00
parent a557ec614a
commit 9ece43ce57

View file

@ -97,6 +97,9 @@ class InventoryBatchView(BatchMasterView):
# set to False to disable "zero all" batch count mode # set to False to disable "zero all" batch count mode
allow_zero_all = True allow_zero_all = True
# set to False to disable "variance" batch count mode
allow_variance = True
# set to False to prevent exposing case fields for user input, # set to False to prevent exposing case fields for user input,
# when the batch count mode is "adjust only" # when the batch count mode is "adjust only"
allow_adjustment_cases = True allow_adjustment_cases = True
@ -215,6 +218,9 @@ class InventoryBatchView(BatchMasterView):
if not self.allow_zero_all or not self.request.has_perm('{}.create.zero'.format(permission_prefix)): if not self.allow_zero_all or not self.request.has_perm('{}.create.zero'.format(permission_prefix)):
if hasattr(self.enum, 'INVENTORY_MODE_ZERO_ALL'): if hasattr(self.enum, 'INVENTORY_MODE_ZERO_ALL'):
modes.pop(self.enum.INVENTORY_MODE_ZERO_ALL, None) modes.pop(self.enum.INVENTORY_MODE_ZERO_ALL, None)
if not self.allow_variance or not self.request.has_perm('{}.create.variance'.format(permission_prefix)):
if hasattr(self.enum, 'INVENTORY_MODE_VARIANCE'):
modes.pop(self.enum.INVENTORY_MODE_VARIANCE, None)
return modes return modes
def configure_form(self, f): def configure_form(self, f):
@ -284,10 +290,11 @@ class InventoryBatchView(BatchMasterView):
if batch.executed: if batch.executed:
return self.redirect(self.get_action_url('view', batch)) return self.redirect(self.get_action_url('view', batch))
form = forms.Form(schema=DesktopForm(), request=self.request) schema = DesktopForm().bind(session=self.Session())
form = forms.Form(schema=schema, request=self.request)
if form.validate(newstyle=True): if form.validate(newstyle=True):
product = self.Session.merge(form.validated['product']) product = self.Session.query(model.Product).get(form.validated['product'])
row = model.InventoryBatchRow() row = model.InventoryBatchRow()
row.product = product row.product = product
row.upc = form.validated['upc'] row.upc = form.validated['upc']
@ -297,6 +304,7 @@ class InventoryBatchView(BatchMasterView):
row.case_quantity = form.validated['case_quantity'] row.case_quantity = form.validated['case_quantity']
row.cases = form.validated['cases'] row.cases = form.validated['cases']
row.units = form.validated['units'] row.units = form.validated['units']
self.handler.capture_current_units(row)
self.handler.add_row(batch, row) self.handler.add_row(batch, row)
description = make_full_description(form.validated['brand_name'], description = make_full_description(form.validated['brand_name'],
form.validated['description'], form.validated['description'],
@ -610,6 +618,9 @@ class InventoryBatchView(BatchMasterView):
if cls.allow_zero_all: if cls.allow_zero_all:
config.add_tailbone_permission(permission_prefix, '{}.create.zero'.format(permission_prefix), config.add_tailbone_permission(permission_prefix, '{}.create.zero'.format(permission_prefix),
"Create new {} with 'zero' mode".format(model_title)) "Create new {} with 'zero' mode".format(model_title))
if cls.allow_variance:
config.add_tailbone_permission(permission_prefix, '{}.create.variance'.format(permission_prefix),
"Create new {} with 'variance' mode".format(model_title))
# row UPC lookup, for desktop # row UPC lookup, for desktop
config.add_route('{}.desktop_lookup'.format(route_prefix), '{}/{{{}}}/desktop-form/lookup'.format(url_prefix, model_key)) config.add_route('{}.desktop_lookup'.format(route_prefix), '{}/{{{}}}/desktop-form/lookup'.format(url_prefix, model_key))
@ -648,9 +659,24 @@ class InventoryForm(colander.MappingSchema):
units = colander.SchemaNode(colander.Decimal(), missing=colander.null) units = colander.SchemaNode(colander.Decimal(), missing=colander.null)
# TODO: this is a stopgap measure to fix an obvious bug, which exists when the
# session is not provided by the view at runtime (i.e. when it was instead
# being provided by the type instance, which was created upon app startup).
@colander.deferred
def valid_product(node, kw):
session = kw['session']
def validate(node, value):
product = session.query(model.Product).get(value)
if not product:
raise colander.Invalid(node, "Product not found")
return product.uuid
return validate
class DesktopForm(colander.Schema): class DesktopForm(colander.Schema):
product = colander.SchemaNode(forms.types.ProductType()) product = colander.SchemaNode(colander.String(),
validator=valid_product)
upc = colander.SchemaNode(forms.types.GPCType()) upc = colander.SchemaNode(forms.types.GPCType())