コード例 #1
0
ファイル: ledger.py プロジェクト: ansarbek/commcare-hq
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
コード例 #2
0
ファイル: ledger.py プロジェクト: ye-man/commcare-hq
    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
コード例 #3
0
ファイル: ledger.py プロジェクト: ansarbek/commcare-hq
    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)
コード例 #4
0
ファイル: ledger.py プロジェクト: kkrampa/commcare-hq
    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
コード例 #5
0
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
コード例 #6
0
ファイル: ledger.py プロジェクト: dimagi/commcare-hq
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
コード例 #7
0
ファイル: ledger.py プロジェクト: ye-man/commcare-hq
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