initial commit

This commit is contained in:
2021-01-07 22:12:05 +01:00
commit e385650802
51 changed files with 1048 additions and 0 deletions
View File
+3
View File
@@ -0,0 +1,3 @@
from django.contrib import admin
# Register your models here.
+5
View File
@@ -0,0 +1,5 @@
from django.apps import AppConfig
class MonitorConfig(AppConfig):
name = 'monitor'
+90
View File
@@ -0,0 +1,90 @@
from django.db import connection
from apps.transactions.models import Transaction
from apps.rates.models import ExchangeRate
from decimal import Decimal
import datetime
class Calc:
def ShowDiffRate(self, DayDiff, CurrentRate, Crypto, Fiat):
with connection.cursor() as cursor:
sql = """SELECT rate, datetime_valid FROM exchangerate WHERE crypto_currency = %s AND fiat_currency = %s
AND datetime_valid BETWEEN %s AND %s
ORDER BY datetime_valid DESC"""
startDate = datetime.datetime.now() - datetime.timedelta(days=int(DayDiff))
endDate = startDate + datetime.timedelta(days=1)
cursor.execute(sql, [Crypto, Fiat, startDate, endDate])
rateMinusXDay = cursor.fetchone()
if rateMinusXDay:
return {"dateRelative": "%s days ago" % (DayDiff,), "date" : rateMinusXDay[1], "rateEUR": rateMinusXDay[0],
"diffPercentage": (CurrentRate.rate-Decimal(rateMinusXDay[0]))/Decimal(rateMinusXDay[0])*100, "rateUSD": None}
return None
def GetCurrentValue(self, userid, crypto, total_investment, current_value, total_tax_free):
amount_kept = 0
out = {}
out["crypto"] = crypto
with connection.cursor() as cursor:
sql = """SELECT SUM(amount_after_fee) as after_fee, SUM(amount) as amount FROM `transaction` WHERE amount >= 0 and crypto_currency=%s and owner_id=%s"""
cursor.execute(sql, [crypto, userid])
bought = cursor.fetchone()
if bought[1]:
out["bought"] = bought[1]
total_investment += Decimal(bought[1])
amount_kept += Decimal(bought[0])
else:
out["bought"] = None
with connection.cursor() as cursor:
sql = """SELECT SUM(amount_before_fee) as before_fee, SUM(amount) as amount FROM `transaction` WHERE amount < 0 and crypto_currency=%s and owner_id=%s"""
cursor.execute(sql, [crypto, userid])
sold = cursor.fetchone()
if sold[1]:
out["sold"] = sold[1]
total_investment += Decimal(sold[1])
amount_kept += Decimal(sold[0])
else:
out["sold"] = None
rateEUR = ExchangeRate.objects.filter(crypto_currency=crypto, fiat_currency='EUR').order_by('-datetime_valid').first()
rateUSD = ExchangeRate.objects.filter(crypto_currency=crypto, fiat_currency='USD').order_by('-datetime_valid').first()
if rateEUR:
cv = Decimal(rateEUR.rate) * amount_kept
current_value += cv
out["current_value"] = cv
out["amount_kept"] = amount_kept
out["rateEUR"] = rateEUR.rate
else:
out["current_value"] = None
out["amount_kept"] = None
out["rateEUR"] = None
out["rates"] = []
if rateUSD and rateEUR:
out["rates"].append({"dateRelative": "Now", "date" : rateEUR.datetime_valid, "rateEUR": rateEUR.rate, "diffPercentage": None, "rateUSD": rateUSD.rate})
if rateEUR:
for daydiff in ["1", "3", "7", "14", "30"]:
diffrate = self.ShowDiffRate(daydiff, rateEUR, crypto, 'EUR')
if diffrate:
out["rates"].append(diffrate)
amount_within_past_year = 0
with connection.cursor() as cursor:
sql = """SELECT SUM(amount_after_fee) as amount FROM `transaction` WHERE amount > 0 and crypto_currency=%s and owner_id=%s and date_valid>%s"""
cursor.execute(sql, [crypto, userid, datetime.datetime.now() - datetime.timedelta(days=365)])
bought = cursor.fetchone()
out["bought_recently"] = None
if bought[0]:
out["bought_recently"] = bought[0]
amount_within_past_year = Decimal(bought[0])
amount_available_to_sell = amount_kept - amount_within_past_year
out["bought_tax_free"] = None
out["value_tax_free"] = None
if rateEUR:
out["bought_tax_free"] = amount_available_to_sell
out["value_tax_free"] = amount_available_to_sell * rateEUR.rate
total_tax_free += out["value_tax_free"]
return (total_investment, current_value, total_tax_free, rateEUR.rate, rateUSD.rate, out)
View File
+3
View File
@@ -0,0 +1,3 @@
from django.db import models
# Create your models here.
+64
View File
@@ -0,0 +1,64 @@
{% extends 'base.html' %}
{% block content %}
<div class="form-box">
<h2>Monitor</h2>
<p>Hint: these numbers are not very accurate.</p>
{% for c in cryptos %}
<input type="checkbox" id="acc{{ c.crypto }}" />
<label for="acc{{ c.crypto }}">
{{ c.crypto }}
{% if c.rateEUR %}{{c.rateEUR|floatformat:0}} EUR{% endif %}
{% if c.rateUSD %}{{c.rateUSD|floatformat:0}} USD{% endif %}
</label>
<div class="content">
{% if c.bought %}
We have bought {{ c.crypto }} for {{ c.bought|floatformat:2 }} EUR<br/>
{% endif %}
{% if c.sold %}
We have sold {{ c.crypto }} for {{ c.sold|floatformat:2 }} EUR<br/>
{% endif %}
{% if c.amount_kept %}
Current value of our {{ c.amount_kept|floatformat:3 }} {{ c.crypto }} is {{ c.current_value|floatformat:2 }} EUR<br/>
{% endif %}
{% if c.bought_recently %}
We have bought within the last 12 months: {{ c.bought_recently|floatformat:3 }} {{ c.crypto }}<br/>
{% endif %}
{% if c.bought_tax_free %}
We can sell without paying taxes: {{ c.bought_tax_free|floatformat:3 }} {{ c.crypto }} for {{ c.value_tax_free|floatformat:2 }} EUR<br/>
{% endif %}
{% if c.rates %}
<table>
{% for r in c.rates %}
<tr>
<td>{{ r.dateRelative }}</td>
<td>{{ r.date|date:'Y-m-d' }}</td>
<td>{{ r.rateEUR|floatformat:0 }} EUR/{{ c.crypto }}
{% if r.rateUSD %}
<br/>
{{ r.rateUSD|floatformat:0 }} USD/{{ c.crypto }}
{% endif %}
</td>
<td>{% if r.diffPercentage %}
{{ r.diffPercentage|floatformat:1 }}%
{% endif %}
</td>
</tr>
{% endfor %}
</table>
{% endif %}
<br/><a href="/transactions/show?crypto={{ c.crypto }}">My transactions</a><br/>
<br/>
Google: <br/>
<a href='https://www.google.com/search?channel=crow2&client=firefox-b-d&q={{ c.crypto }}+in+eur%3D' target='_blank'>{{ c.crypto }} in EUR</a><br/>
<a href='https://www.google.com/search?channel=crow2&client=firefox-b-d&q={{ c.crypto }}+in+usd%3D' target='_blank'>{{ c.crypto }} in USD</a><br/>
</div>
{% endfor %}
</div>
{% endblock %}
+3
View File
@@ -0,0 +1,3 @@
from django.test import TestCase
# Create your tests here.
+22
View File
@@ -0,0 +1,22 @@
from django.shortcuts import render, redirect
from django.contrib.auth.decorators import login_required
from apps.transactions.models import Transaction
from apps.rates.models import ExchangeRate
from apps.monitor.calc import Calc
@login_required
def monitor(request):
transactions = Transaction.objects.filter(owner=request.user)
crypto_currencies = {tr.crypto_currency for tr in transactions}
cryptos = []
total_investment = 0
current_value = 0
total_tax_free = 0
calc = Calc()
for crypto in crypto_currencies:
(total_investment, current_value, total_tax_free, rateEUR, rateUSD, out2) = calc.GetCurrentValue(request.user.id, crypto, total_investment, current_value, total_tax_free)
cryptos.append({"crypto": crypto, "rateEUR": rateEUR, "rateUSD": rateUSD, **out2})
return render(request,"monitor.html",{'cryptos':cryptos})