Add initial support for "variance" inventory batch mode
probably incomplete yet; needs testing
This commit is contained in:
parent
a557ec614a
commit
9ece43ce57
|
@ -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())
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue