Add initial support for 'costing' mode for purchase batches

This commit is contained in:
Lance Edgar 2016-11-21 03:36:41 -06:00
parent 4592c96fb5
commit d96d22ab68
2 changed files with 35 additions and 13 deletions

View file

@ -41,10 +41,12 @@ class PurchaseBatchHandler(BatchHandler):
def requires_prefill(self, batch): def requires_prefill(self, batch):
# TODO: this probably should change soon, for now this works.. # TODO: this probably should change soon, for now this works..
return batch.mode == self.enum.PURCHASE_BATCH_MODE_RECEIVING and batch.purchase return batch.purchase and batch.mode in (self.enum.PURCHASE_BATCH_MODE_RECEIVING,
self.enum.PURCHASE_BATCH_MODE_COSTING)
def make_initial_rows(self, batch, progress=None): def make_initial_rows(self, batch, progress=None):
assert batch.mode == self.enum.PURCHASE_BATCH_MODE_RECEIVING and batch.purchase assert batch.purchase and batch.mode in (self.enum.PURCHASE_BATCH_MODE_RECEIVING,
self.enum.PURCHASE_BATCH_MODE_COSTING)
def append(item, i): def append(item, i):
row = model.PurchaseBatchRow() row = model.PurchaseBatchRow()
@ -52,8 +54,13 @@ class PurchaseBatchHandler(BatchHandler):
row.product = item.product row.product = item.product
row.cases_ordered = item.cases_ordered or None row.cases_ordered = item.cases_ordered or None
row.units_ordered = item.units_ordered or None row.units_ordered = item.units_ordered or None
row.cases_received = item.cases_received or None
row.units_received = item.units_received or None
row.po_unit_cost = item.po_unit_cost row.po_unit_cost = item.po_unit_cost
row.po_total = item.po_total row.po_total = item.po_total
if batch.mode == self.enum.PURCHASE_BATCH_MODE_COSTING:
row.invoice_unit_cost = item.invoice_unit_cost
row.invoice_total = item.invoice_total
batch.add_row(row) batch.add_row(row)
self.refresh_row(row) self.refresh_row(row)
@ -63,7 +70,8 @@ class PurchaseBatchHandler(BatchHandler):
def refresh(self, batch, progress=None): def refresh(self, batch, progress=None):
if batch.mode == self.enum.PURCHASE_BATCH_MODE_NEW: if batch.mode == self.enum.PURCHASE_BATCH_MODE_NEW:
batch.po_total = 0 batch.po_total = 0
elif batch.mode == self.enum.PURCHASE_BATCH_MODE_RECEIVING: elif batch.mode in (self.enum.PURCHASE_BATCH_MODE_RECEIVING,
self.enum.PURCHASE_BATCH_MODE_COSTING):
batch.invoice_total = 0 batch.invoice_total = 0
return super(PurchaseBatchHandler, self).refresh(batch, progress=progress) return super(PurchaseBatchHandler, self).refresh(batch, progress=progress)
@ -96,7 +104,8 @@ class PurchaseBatchHandler(BatchHandler):
row.po_total = (row.po_unit_cost * (row.units_ordered or 0)) + ( row.po_total = (row.po_unit_cost * (row.units_ordered or 0)) + (
row.po_unit_cost * (row.cases_ordered or 0) * row.case_quantity) row.po_unit_cost * (row.cases_ordered or 0) * row.case_quantity)
batch.po_total = (batch.po_total or 0) + row.po_total batch.po_total = (batch.po_total or 0) + row.po_total
elif batch.mode == self.enum.PURCHASE_BATCH_MODE_RECEIVING: elif batch.mode in (self.enum.PURCHASE_BATCH_MODE_RECEIVING,
self.enum.PURCHASE_BATCH_MODE_COSTING):
row.invoice_unit_cost = cost.unit_cost row.invoice_unit_cost = cost.unit_cost
row.invoice_total = (row.invoice_unit_cost * (row.units_received or 0)) + ( row.invoice_total = (row.invoice_unit_cost * (row.units_received or 0)) + (
row.invoice_unit_cost * (row.cases_received or 0) * row.case_quantity) row.invoice_unit_cost * (row.cases_received or 0) * row.case_quantity)
@ -105,7 +114,8 @@ class PurchaseBatchHandler(BatchHandler):
if batch.mode == self.enum.PURCHASE_BATCH_MODE_NEW: if batch.mode == self.enum.PURCHASE_BATCH_MODE_NEW:
row.status_code = row.STATUS_OK row.status_code = row.STATUS_OK
elif batch.mode == self.enum.PURCHASE_BATCH_MODE_RECEIVING: elif batch.mode in (self.enum.PURCHASE_BATCH_MODE_RECEIVING,
self.enum.PURCHASE_BATCH_MODE_COSTING):
if row.cases_received is None and row.units_received is None: if row.cases_received is None and row.units_received is None:
row.status_code = row.STATUS_INCOMPLETE row.status_code = row.STATUS_INCOMPLETE
elif row.cases_received != row.cases_ordered or row.units_received != row.units_ordered: elif row.cases_received != row.cases_ordered or row.units_received != row.units_ordered:
@ -118,12 +128,24 @@ class PurchaseBatchHandler(BatchHandler):
Default behavior for executing a purchase batch will create a new Default behavior for executing a purchase batch will create a new
purchase, by invoking :meth:`make_purchase()`. purchase, by invoking :meth:`make_purchase()`.
""" """
session = orm.object_session(batch)
if batch.mode == self.enum.PURCHASE_BATCH_MODE_NEW: if batch.mode == self.enum.PURCHASE_BATCH_MODE_NEW:
return self.make_purchase(batch, user, progress=progress) return self.make_purchase(batch, user, progress=progress)
elif batch.mode == self.enum.PURCHASE_BATCH_MODE_RECEIVING: elif batch.mode == self.enum.PURCHASE_BATCH_MODE_RECEIVING:
session = orm.object_session(batch)
with session.no_autoflush: with session.no_autoflush:
return self.receive_purchase(batch, progress=progress) return self.receive_purchase(batch, progress=progress)
elif batch.mode == self.enum.PURCHASE_BATCH_MODE_COSTING:
# TODO: finish this...
# with session.no_autoflush:
# return self.cost_purchase(batch, progress=progress)
purchase = batch.purchase
purchase.invoice_date = batch.invoice_date
purchase.status = self.enum.PURCHASE_STATUS_COSTED
return purchase
assert False assert False
def make_purchase(self, batch, user, progress=None): def make_purchase(self, batch, user, progress=None):

View file

@ -144,14 +144,14 @@ PRICE_TYPE = {
} }
PURCHASE_BATCH_MODE_NEW = 10 PURCHASE_BATCH_MODE_NEW = 10
PURCHASE_BATCH_MODE_RECEIVING = 20 PURCHASE_BATCH_MODE_RECEIVING = 20
PURCHASE_BATCH_MODE_COSTING = 30 PURCHASE_BATCH_MODE_COSTING = 30
PURCHASE_BATCH_MODE = { PURCHASE_BATCH_MODE = {
PURCHASE_BATCH_MODE_NEW : "create/new", PURCHASE_BATCH_MODE_NEW : "ordering",
PURCHASE_BATCH_MODE_RECEIVING : "receiving", PURCHASE_BATCH_MODE_RECEIVING : "receiving",
PURCHASE_BATCH_MODE_COSTING : "costing", PURCHASE_BATCH_MODE_COSTING : "invoicing",
} }
@ -165,7 +165,7 @@ PURCHASE_STATUS = {
PURCHASE_STATUS_NEW : "new/pending", PURCHASE_STATUS_NEW : "new/pending",
PURCHASE_STATUS_ORDERED : "ordered", PURCHASE_STATUS_ORDERED : "ordered",
PURCHASE_STATUS_RECEIVED : "received", PURCHASE_STATUS_RECEIVED : "received",
PURCHASE_STATUS_COSTED : "costed", PURCHASE_STATUS_COSTED : "invoiced",
PURCHASE_STATUS_PAID : "paid", PURCHASE_STATUS_PAID : "paid",
} }