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']))
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']))
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)
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)