def _get_model_for_stock_transaction(report, transaction_helper, ledger_db): assert report.type in const.VALID_REPORT_TYPES txn = StockTransaction( report=report, case_id=transaction_helper.case_id, section_id=transaction_helper.section_id, product_id=transaction_helper.product_id, type=transaction_helper.action, subtype=transaction_helper.subaction, ) def lazy_original_balance(): return ledger_db.get_current_balance(_stock_transaction_to_unique_ledger_reference(txn)) new_ledger_values = compute_ledger_values( lazy_original_balance, report.type, transaction_helper.relative_quantity) txn.stock_on_hand = new_ledger_values.balance txn.quantity = new_ledger_values.delta if report.domain: # set this as a shortcut for post save signal receivers txn.domain = report.domain # update the ledger DB in case later transactions reference the same ledger item ledger_db.set_current_balance(_stock_transaction_to_unique_ledger_reference(txn), txn.stock_on_hand) return txn
def _process_transaction(stock_report_helper, stock_trans, ledger_db): def _lazy_original_balance(): # needs to be in closures because it's zero-argument. # see compute_ledger_values for more information reference = stock_trans.ledger_reference return ledger_db.get_current_ledger_value(reference) new_ledger_values = compute_ledger_values( _lazy_original_balance, stock_report_helper.report_type, stock_trans.relative_quantity) ledger_value = ledger_db.get_ledger(stock_trans.ledger_reference) if not ledger_value: ledger_value = LedgerValue( **stock_trans.ledger_reference._asdict()) ledger_value.domain = stock_report_helper.domain ledger_db.set_ledger(ledger_value) transaction = _get_ledger_transaction(_lazy_original_balance, stock_report_helper, stock_trans, new_ledger_values.balance) ledger_value.track_create(transaction) # only do this after we've created the transaction otherwise we'll get the wrong delta ledger_value.balance = new_ledger_values.balance ledger_value.last_modified = stock_report_helper.server_date # form.received_on ledger_value.last_modified_form_id = stock_report_helper.form_id return ledger_value
def get_models_to_update(self, stock_report_helper, ledger_db=None): latest_values = {} for stock_trans in stock_report_helper.transactions: def _lazy_original_balance(): # needs to be in closures because it's zero-argument. # see compute_ledger_values for more information if stock_trans.ledger_reference in latest_values: return latest_values[stock_trans.ledger_reference] else: return self.get_current_ledger_value(stock_trans.ledger_reference) new_ledger_values = compute_ledger_values( _lazy_original_balance, stock_report_helper.report_type, stock_trans.relative_quantity ) latest_values[stock_trans.ledger_reference] = new_ledger_values.balance to_save = [] for touched_ledger_reference, quantity in latest_values.items(): try: ledger_value = LedgerAccessorSQL.get_ledger_value(**touched_ledger_reference._asdict()) except LedgerValue.DoesNotExist: ledger_value = LedgerValue(**touched_ledger_reference._asdict()) ledger_value.balance = quantity to_save.append(ledger_value) return StockModelUpdateResult(to_save=to_save)
def _process_transaction(stock_report_helper, stock_trans, ledger_db): def _lazy_original_balance(): # needs to be in closures because it's zero-argument. # see compute_ledger_values for more information reference = stock_trans.ledger_reference return ledger_db.get_current_ledger_value(reference) new_ledger_values = compute_ledger_values( _lazy_original_balance, stock_report_helper.report_type, stock_trans.relative_quantity ) ledger_value = ledger_db.get_ledger(stock_trans.ledger_reference) if not ledger_value: ledger_value = LedgerValue(**stock_trans.ledger_reference._asdict()) ledger_value.domain = stock_report_helper.domain ledger_db.set_ledger(ledger_value) transaction = _get_ledger_transaction( _lazy_original_balance, stock_report_helper, stock_trans, new_ledger_values.balance ) ledger_value.track_create(transaction) # only do this after we've created the transaction otherwise we'll get the wrong delta ledger_value.balance = new_ledger_values.balance ledger_value.last_modified = stock_report_helper.server_date # form.received_on ledger_value.last_modified_form_id = stock_report_helper.form_id return ledger_value
def _get_model_for_stock_transaction(report, transaction_helper, ledger_db): assert report.type in const.VALID_REPORT_TYPES txn = StockTransaction( report=report, case_id=transaction_helper.case_id, section_id=transaction_helper.section_id, product_id=transaction_helper.product_id, type=transaction_helper.action, subtype=transaction_helper.subaction, ) def lazy_original_balance(): return ledger_db.get_current_ledger_value(txn.ledger_reference) new_ledger_values = compute_ledger_values( lazy_original_balance, report.type, transaction_helper.relative_quantity) txn.stock_on_hand = new_ledger_values.balance txn.quantity = new_ledger_values.delta if report.domain: # set this as a shortcut for post save signal receivers txn.__domain = report.domain # update the ledger DB in case later transactions reference the same ledger item ledger_db.set_ledger(txn) return txn
def _compute_ledger_values(original_balance, transaction): if transaction.type == LedgerTransaction.TYPE_BALANCE: quantity = transaction.updated_balance elif transaction.type == LedgerTransaction.TYPE_TRANSFER: quantity = transaction.delta else: raise ValueError() ledger_values = compute_ledger_values(lambda: original_balance, transaction.readable_type, quantity) return ledger_values