initial commit
This commit is contained in:
@@ -0,0 +1,3 @@
|
||||
from django.contrib import admin
|
||||
|
||||
# Register your models here.
|
||||
@@ -0,0 +1,5 @@
|
||||
from django.apps import AppConfig
|
||||
|
||||
|
||||
class MonitorConfig(AppConfig):
|
||||
name = 'monitor'
|
||||
@@ -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)
|
||||
@@ -0,0 +1,3 @@
|
||||
from django.db import models
|
||||
|
||||
# Create your models here.
|
||||
@@ -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 %}
|
||||
@@ -0,0 +1,3 @@
|
||||
from django.test import TestCase
|
||||
|
||||
# Create your tests here.
|
||||
@@ -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})
|
||||
Reference in New Issue
Block a user