def create_models(self, domain=None): # todo: this function should probably move to somewhere in casexml.apps.stock if self.tag not in stockconst.VALID_REPORT_TYPES: return report = DbStockReport.objects.create( form_id=self.form_id, date=self.timestamp, type=self.tag, domain=self._form.domain, ) for txn in self.transactions: db_txn = DbStockTransaction( report=report, case_id=txn.case_id, section_id=txn.section_id, product_id=txn.product_id, ) if domain: # set this as a shortcut for post save signal receivers db_txn.domain = domain db_txn.type = txn.action db_txn.subtype = txn.subaction if self.tag == stockconst.REPORT_TYPE_BALANCE: db_txn.stock_on_hand = txn.quantity db_txn.quantity = 0 else: assert self.tag == stockconst.REPORT_TYPE_TRANSFER previous_transaction = db_txn.get_previous_transaction() db_txn.quantity = txn.relative_quantity db_txn.stock_on_hand = (previous_transaction.stock_on_hand if previous_transaction else 0) + db_txn.quantity db_txn.save()
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 _create_model_for_stock_transaction(report, transaction_helper): assert report.type in stockconst.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(): previous_transaction = txn.get_previous_transaction() if previous_transaction: return previous_transaction.stock_on_hand else: return None 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 txn.save() return txn
def create_models_for_stock_report(domain, stock_report_helper): """ Save stock report and stock transaction models to the database. """ assert stock_report_helper._form.domain == domain domain = domain if stock_report_helper.tag not in stockconst.VALID_REPORT_TYPES: return report = StockReport.objects.create( form_id=stock_report_helper.form_id, date=stock_report_helper.timestamp, type=stock_report_helper.tag, domain=domain, ) for txn in stock_report_helper.transactions: db_txn = StockTransaction( report=report, case_id=txn.case_id, section_id=txn.section_id, product_id=txn.product_id, ) if domain: # set this as a shortcut for post save signal receivers db_txn.domain = domain db_txn.type = txn.action db_txn.subtype = txn.subaction if stock_report_helper.tag == stockconst.REPORT_TYPE_BALANCE: db_txn.stock_on_hand = txn.quantity db_txn.quantity = 0 else: assert stock_report_helper.tag == stockconst.REPORT_TYPE_TRANSFER previous_transaction = db_txn.get_previous_transaction() db_txn.quantity = txn.relative_quantity db_txn.stock_on_hand = db_txn.quantity + ( previous_transaction.stock_on_hand if previous_transaction else 0 ) db_txn.save()