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