|
@@ -248,10 +248,10 @@ def get_user_id_by_name(username):
|
|
|
|
|
|
|
|
|
|
def get_user_ownership(user_id):
|
|
def get_user_ownership(user_id):
|
|
- execute('''
|
|
|
|
|
|
+ data = execute('''
|
|
SELECT
|
|
SELECT
|
|
ownables.name,
|
|
ownables.name,
|
|
- ownership.amount,
|
|
|
|
|
|
+ ownable_id, -- this is used for computing the available amount
|
|
COALESCE (
|
|
COALESCE (
|
|
CASE -- sum score for each of the users ownables
|
|
CASE -- sum score for each of the users ownables
|
|
WHEN ownership.ownable_id = ? THEN 1
|
|
WHEN ownership.ownable_id = ? THEN 1
|
|
@@ -275,12 +275,19 @@ def get_user_ownership(user_id):
|
|
AND NOT stop_loss) AS ask
|
|
AND NOT stop_loss) AS ask
|
|
FROM ownership, ownables
|
|
FROM ownership, ownables
|
|
WHERE user_id = ?
|
|
WHERE user_id = ?
|
|
- AND (ownership.amount >= 0.01 OR ownership.ownable_id = ?)
|
|
|
|
|
|
+ AND (ownership.amount >= 0.01 OR ownership.amount <= -0.01 OR ownership.ownable_id = ?)
|
|
AND ownership.ownable_id = ownables.rowid
|
|
AND ownership.ownable_id = ownables.rowid
|
|
ORDER BY ownables.rowid ASC
|
|
ORDER BY ownables.rowid ASC
|
|
- ''', (currency_id(), user_id, currency_id(),))
|
|
|
|
|
|
+ ''', (currency_id(), user_id, currency_id(),)).fetchall()
|
|
|
|
|
|
- return current_cursor.fetchall()
|
|
|
|
|
|
+ data = [list(row) for row in data]
|
|
|
|
+
|
|
|
|
+ for row in data:
|
|
|
|
+ ownable_id = row[1]
|
|
|
|
+ available_amount = user_available_ownable(user_id, ownable_id)
|
|
|
|
+ row[1] = available_amount
|
|
|
|
+
|
|
|
|
+ return data
|
|
|
|
|
|
|
|
|
|
def bank_id():
|
|
def bank_id():
|
|
@@ -441,17 +448,6 @@ def sell_ordered_amount(user_id, ownable_id):
|
|
return current_cursor.fetchone()[0]
|
|
return current_cursor.fetchone()[0]
|
|
|
|
|
|
|
|
|
|
-def available_amount(user_id, ownable_id):
|
|
|
|
- execute('''
|
|
|
|
- SELECT amount
|
|
|
|
- FROM ownership
|
|
|
|
- WHERE user_id = ?
|
|
|
|
- AND ownable_id = ?
|
|
|
|
- ''', (user_id, ownable_id))
|
|
|
|
-
|
|
|
|
- return current_cursor.fetchone()[0] - sell_ordered_amount(user_id, ownable_id)
|
|
|
|
-
|
|
|
|
-
|
|
|
|
def is_bond_of_user(ownable_id, user_id):
|
|
def is_bond_of_user(ownable_id, user_id):
|
|
execute('''
|
|
execute('''
|
|
SELECT EXISTS(
|
|
SELECT EXISTS(
|
|
@@ -483,7 +479,6 @@ def user_available_ownable(user_id, ownable_id):
|
|
return current_cursor.fetchone()[0] - minimum_reserve
|
|
return current_cursor.fetchone()[0] - minimum_reserve
|
|
|
|
|
|
|
|
|
|
-
|
|
|
|
def user_has_at_least_available(amount, user_id, ownable_id):
|
|
def user_has_at_least_available(amount, user_id, ownable_id):
|
|
if not isinstance(amount, float) and not isinstance(amount, int):
|
|
if not isinstance(amount, float) and not isinstance(amount, int):
|
|
# comparison of float with strings does not work so well in sql
|
|
# comparison of float with strings does not work so well in sql
|
|
@@ -492,7 +487,6 @@ def user_has_at_least_available(amount, user_id, ownable_id):
|
|
return user_available_ownable(user_id, ownable_id) >= amount
|
|
return user_available_ownable(user_id, ownable_id) >= amount
|
|
|
|
|
|
|
|
|
|
-
|
|
|
|
def news():
|
|
def news():
|
|
execute('''
|
|
execute('''
|
|
SELECT dt, title FROM
|
|
SELECT dt, title FROM
|
|
@@ -585,7 +579,7 @@ def currency_id():
|
|
return current_cursor.fetchone()[0]
|
|
return current_cursor.fetchone()[0]
|
|
|
|
|
|
|
|
|
|
-def user_money(user_id):
|
|
|
|
|
|
+def user_available_money(user_id):
|
|
return user_available_ownable(user_id, currency_id())
|
|
return user_available_ownable(user_id, currency_id())
|
|
|
|
|
|
|
|
|
|
@@ -724,7 +718,7 @@ def execute_orders(ownable_id):
|
|
else:
|
|
else:
|
|
price = sell_limit
|
|
price = sell_limit
|
|
|
|
|
|
- buyer_money = user_money(buyer_id)
|
|
|
|
|
|
+ buyer_money = user_available_money(buyer_id)
|
|
|
|
|
|
def _my_division(x, y):
|
|
def _my_division(x, y):
|
|
try:
|
|
try:
|
|
@@ -986,10 +980,19 @@ def user_wealth(user_id):
|
|
), 0)
|
|
), 0)
|
|
FROM loans
|
|
FROM loans
|
|
WHERE loans.user_id = ?)
|
|
WHERE loans.user_id = ?)
|
|
|
|
+ -
|
|
|
|
+ ( SELECT COALESCE(SUM(
|
|
|
|
+ amount
|
|
|
|
+ ), 0)
|
|
|
|
+ FROM credits
|
|
|
|
+ JOIN ownership o on credits.ownable_id = o.ownable_id
|
|
|
|
+ WHERE credits.issuer_id = ?
|
|
|
|
+ AND o.user_id != ?
|
|
|
|
+ )
|
|
'''
|
|
'''
|
|
execute(f'''
|
|
execute(f'''
|
|
SELECT ({score_expression}) AS score
|
|
SELECT ({score_expression}) AS score
|
|
- ''', (currency_id(), user_id, user_id,))
|
|
|
|
|
|
+ ''', (currency_id(), user_id, user_id, user_id, user_id,))
|
|
|
|
|
|
return current_cursor.fetchone()[0]
|
|
return current_cursor.fetchone()[0]
|
|
|
|
|
|
@@ -1337,6 +1340,10 @@ def pay_bond_interest(until=None):
|
|
)
|
|
)
|
|
''', (current_dt,))
|
|
''', (current_dt,))
|
|
execute('''
|
|
execute('''
|
|
|
|
+ DELETE FROM credits
|
|
|
|
+ WHERE ? > maturity_dt
|
|
|
|
+ ''', (current_dt,))
|
|
|
|
+ execute('''
|
|
DELETE FROM ownables
|
|
DELETE FROM ownables
|
|
WHERE rowid IN (
|
|
WHERE rowid IN (
|
|
SELECT ownable_id
|
|
SELECT ownable_id
|
|
@@ -1344,10 +1351,6 @@ def pay_bond_interest(until=None):
|
|
WHERE ? > maturity_dt
|
|
WHERE ? > maturity_dt
|
|
)
|
|
)
|
|
''', (current_dt,))
|
|
''', (current_dt,))
|
|
- execute('''
|
|
|
|
- DELETE FROM credits
|
|
|
|
- WHERE ? > maturity_dt
|
|
|
|
- ''', (current_dt,))
|
|
|
|
|
|
|
|
|
|
|
|
def pay_loan_interest(until=None):
|
|
def pay_loan_interest(until=None):
|
|
@@ -1378,6 +1381,32 @@ def pay_loan_interest(until=None):
|
|
''', (current_dt, current_dt, MIN_INTEREST_INTERVAL,))
|
|
''', (current_dt, current_dt, MIN_INTEREST_INTERVAL,))
|
|
|
|
|
|
|
|
|
|
|
|
+def pay_deposit_facility(until=None):
|
|
|
|
+ if until is None:
|
|
|
|
+ current_dt = current_db_timestamp()
|
|
|
|
+ else:
|
|
|
|
+ current_dt = until
|
|
|
|
+ sec_per_year = 3600 * 24 * 365
|
|
|
|
+ interest_rate = global_control_value('deposit_facility')
|
|
|
|
+ banks = execute('''
|
|
|
|
+ SELECT
|
|
|
|
+ banks.user_id,
|
|
|
|
+ o.amount * ? * (CAST(? AS FLOAT) - last_deposit_facility_pay_dt) / ?
|
|
|
|
+ FROM banks
|
|
|
|
+ JOIN ownership o on banks.user_id = o.user_id
|
|
|
|
+ WHERE o.rowid = ?
|
|
|
|
+ AND ? - last_deposit_facility_pay_dt > ?''', (interest_rate, current_dt, sec_per_year, currency_id(), current_dt, MIN_INTEREST_INTERVAL)).fetchall()
|
|
|
|
+
|
|
|
|
+ for user_id, interest_amount in banks:
|
|
|
|
+ send_ownable(user_id, bank_id(), currency_id(), interest_amount)
|
|
|
|
+
|
|
|
|
+ execute('''
|
|
|
|
+ UPDATE banks
|
|
|
|
+ SET last_deposit_facility_pay_dt = ?
|
|
|
|
+ WHERE ? - last_deposit_facility_pay_dt > ?
|
|
|
|
+ ''', (current_dt, current_dt, MIN_INTEREST_INTERVAL,))
|
|
|
|
+
|
|
|
|
+
|
|
def triggered_mros():
|
|
def triggered_mros():
|
|
return execute('''
|
|
return execute('''
|
|
SELECT
|
|
SELECT
|
|
@@ -1393,7 +1422,7 @@ def triggered_mros():
|
|
|
|
|
|
def mro(mro_id, expiry, min_interest):
|
|
def mro(mro_id, expiry, min_interest):
|
|
qualified_credits = execute('''
|
|
qualified_credits = execute('''
|
|
- SELECT credits.ownable_id
|
|
|
|
|
|
+ SELECT credits.ownable_id, SUM(amount)
|
|
FROM credits
|
|
FROM credits
|
|
JOIN banks b ON credits.issuer_id = b.user_id
|
|
JOIN banks b ON credits.issuer_id = b.user_id
|
|
JOIN ownership o ON o.ownable_id = credits.ownable_id -- AND credits.issuer_id = o.user_id
|
|
JOIN ownership o ON o.ownable_id = credits.ownable_id -- AND credits.issuer_id = o.user_id
|
|
@@ -1401,8 +1430,12 @@ def mro(mro_id, expiry, min_interest):
|
|
WHERE maturity_dt = ?
|
|
WHERE maturity_dt = ?
|
|
AND coupon >= ?
|
|
AND coupon >= ?
|
|
AND "limit" IS NULL or "limit" <= 1
|
|
AND "limit" IS NULL or "limit" <= 1
|
|
|
|
+ GROUP BY credits.ownable_id
|
|
''', (expiry, min_interest)).fetchall()
|
|
''', (expiry, min_interest)).fetchall()
|
|
for ownable_id, amount in qualified_credits:
|
|
for ownable_id, amount in qualified_credits:
|
|
|
|
+ if amount == 0:
|
|
|
|
+ continue
|
|
|
|
+ assert amount > 0
|
|
bank_order(buy=True,
|
|
bank_order(buy=True,
|
|
ownable_id=ownable_id,
|
|
ownable_id=ownable_id,
|
|
limit=1,
|
|
limit=1,
|