Beispiel #1
0
 def test_compute_locks_with_overdraft(self):
     balance = self._initial_balance()
     balance.real_amount = 10
     balance.virtual_amount = 20
     balance.overdraft_limit = 10
     self.assertEqual({'real_amount': 15, 'virtual_amount': 20},
         compute_locks(balance, 35, ['virtual_amount', 'real_amount']))
     self.assertEqual({'real_amount': 15, 'virtual_amount': 0},
         compute_locks(balance, 15, ['real_amount', 'virtual_amount']))
Beispiel #2
0
 def test_compute_locks(self):
     balance = self._initial_balance()
     balance.real_amount = 10
     balance.virtual_amount = 20
     self.assertEqual({'real_amount': 10, 'virtual_amount': 5},
         compute_locks(balance, 15, ['real_amount', 'virtual_amount']))
     self.assertEqual({'virtual_amount': 15, 'real_amount': 0},
         compute_locks(balance, 15, ['virtual_amount', 'real_amount']))
     self.assertEqual({'real_amount': 10, 'virtual_amount': 11},
         compute_locks(balance, 21, ['real_amount', 'virtual_amount']))
     self.assertEqual({'virtual_amount': 10},
         compute_locks(balance, 10, ['virtual_amount']))
Beispiel #3
0
    def lock(self, data, session, curs=None):
        balance = self._get_active_balance(session, curs, data)

        currs_id_idx = self._get_currs_idx(curs, 'id')
        currency = currs_id_idx[balance.currency_id]

        lock_amount_dec = Decimal(data['amount'])
        lock_amount = decimal_to_cents(currency, lock_amount_dec)

        if lock_amount < 0:
            lock_amount *= -1

        locking_order = data['locking_order']
        amounts_to_lock = compute_locks(balance, lock_amount, locking_order)
        lock_real = amounts_to_lock.get('real_amount', 0)
        lock_virtual = amounts_to_lock.get('virtual_amount', 0)
        order_id = data['order_id']
        info = data.get('info', {})
        info['locking_order'] = locking_order

        trans_data = {
            'environment_id': session.environment_id,
            'user_id': balance.user_id,
            'balance_id': balance.id,
            'currency_code': currency.code,
            'type': 'lock',
            'real_amount': cents_to_decimal(currency, lock_real),
            'virtual_amount': cents_to_decimal(currency, lock_virtual),
            'order_id': order_id,
            'info': info
        }
        lock_data = {
            'environment_id': session.environment_id,
            'user_id': balance.user_id,
            'balance_id': balance.id,
            'real_amount': lock_real,
            'locking_order': locking_order,
            'order_id': order_id,
            'currency_id': currency.id,
            'virtual_amount': lock_virtual,
            'info': info
        }

        lock = BalanceLock(**lock_data)
        balance.real_amount -= lock_real
        balance.virtual_amount -= lock_virtual
        balance.locked_amount += lock_real + lock_virtual
        mapping.update(curs, balance)

        trans = Transaction(**trans_data)
        mapping.insert(curs, lock)
        mapping.insert(curs, trans)
        return response_ok(transaction_id=trans.id, lock_id=lock.id)
Beispiel #4
0
    def lock(self, data, session, curs=None):
        balance = self._get_active_balance(session, curs, data)

        currs_id_idx = self._get_currs_idx(curs, 'id')
        currency = currs_id_idx[balance.currency_id]

        lock_amount_dec = Decimal(data['amount'])
        lock_amount = decimal_to_cents(currency, lock_amount_dec)

        if lock_amount < 0:
            lock_amount *= -1

        locking_order = data['locking_order']
        amounts_to_lock = compute_locks(balance, lock_amount, locking_order)
        lock_real = amounts_to_lock.get('real_amount', 0)
        lock_virtual = amounts_to_lock.get('virtual_amount', 0)
        order_id = data['order_id']
        info = data.get('info', {})
        info['locking_order'] = locking_order

        trans_data = {'environment_id': session.environment_id, 'user_id': balance.user_id,
            'balance_id': balance.id, 'currency_code': currency.code,
            'type': 'lock', 'real_amount': cents_to_decimal(currency, lock_real),
            'virtual_amount': cents_to_decimal(currency, lock_virtual),
            'order_id': order_id, 'info': info}
        lock_data = {'environment_id': session.environment_id, 'user_id': balance.user_id,
            'balance_id': balance.id, 'real_amount': lock_real, 'locking_order': locking_order,
            'order_id': order_id, 'currency_id': currency.id, 'virtual_amount': lock_virtual,
            'info': info}

        lock = BalanceLock(**lock_data)
        balance.real_amount -= lock_real
        balance.virtual_amount -= lock_virtual
        balance.locked_amount += lock_real + lock_virtual
        mapping.update(curs, balance)

        trans = Transaction(**trans_data)
        mapping.insert(curs, lock)
        mapping.insert(curs, trans)
        return response_ok(transaction_id=trans.id, lock_id=lock.id)