107 lines
3.2 KiB
HTML
107 lines
3.2 KiB
HTML
{% extends "base.html" %}
|
|
|
|
{% block header %}
|
|
{# Show the setup name, as set in the config file, as page title. Don't escape HTML entities. #}
|
|
<h1>{{ setupname|safe }} Sales Statistics</h1>
|
|
<style>
|
|
@media all {
|
|
svg g text {
|
|
display: none;
|
|
}
|
|
svg g:hover text {
|
|
display: block;
|
|
}
|
|
span.input-replacement {
|
|
display: none;
|
|
}
|
|
}
|
|
@media print {
|
|
svg g text {
|
|
display: block;
|
|
}
|
|
input {
|
|
display: none;
|
|
}
|
|
span.input-replacement {
|
|
display: inline;
|
|
}
|
|
}
|
|
</style>
|
|
{{ super() }}
|
|
{% endblock %}
|
|
|
|
{% block main %}
|
|
|
|
<section id="statistics-range">
|
|
|
|
<h2>Time Range</h2>
|
|
|
|
<form action="/statistics" method="get" accept-charset="utf-8">
|
|
<label for="statistics-range-from">From:</label>
|
|
<input type="date" id="statistics-range-from" name="fromdate" value="{{fromdate}}" />
|
|
<span class="input-replacement">{{fromdate}}</span>
|
|
|
|
<label for="statistics-range-to">To:</label>
|
|
<input type="date" id="statistics-range-to" name="todate" value="{{todate}}" />
|
|
<span class="input-replacement">{{todate}}</span>
|
|
|
|
<input type="submit" value="Update">
|
|
</form>
|
|
|
|
</section>
|
|
|
|
<section id="statistics-total">
|
|
|
|
<h2>Totals</h2>
|
|
|
|
<ul>
|
|
<li>Total products purchased: {{ total_consumption }}</li>
|
|
<li>Total income: {{ total_income|chf }}</li>
|
|
<li>Total deposited: {{ total_deposits|chf }}</li>
|
|
<li>Total accounts balance: {{ total_balance|chf }}</li>
|
|
</ul>
|
|
|
|
</section>
|
|
|
|
<section>
|
|
|
|
<h2>Purchases</h2>
|
|
|
|
<table>
|
|
<tr class="head"><td>Product</td><td>Income</td><td>Units</td></tr>
|
|
{% for prod, data in consumptions.items() %}
|
|
<tr class="{{ loop.cycle('odd', '') }}"><td><b>{{ prod }}</b></td><td>{{ -data[0]|chf }}</td><td>{{ data[1] }}</td></tr>
|
|
{% endfor %}
|
|
<tr class="foot"><td>Total</td><td>{{ total_income|chf }}</td><td>{{ total_consumption }}</td></tr>
|
|
</table>
|
|
|
|
{# Really hacky pie chart implementation. #}
|
|
<svg width="400" height="400">
|
|
{% for s in product_slices %}
|
|
<g>
|
|
<path d="M 200 200 L {{ s[1]+200 }} {{ s[2]+200 }} A 100 100 0 {{ s[5] }} 1 {{ s[3]+200 }} {{ s[4]+200 }} L 200 200"
|
|
fill="{{ loop.cycle('green', 'red', 'blue', 'yellow', 'purple', 'orange') }}"></path>
|
|
<text text-anchor="middle"
|
|
x="{{ 200 + s[6] }}"
|
|
y="{{ 200 + s[7] }}">{{ s[0] }} ({{ s[8] }})</text>
|
|
</g>
|
|
{% endfor %}
|
|
</svg>
|
|
|
|
</section>
|
|
|
|
<section id="statistics-balances">
|
|
|
|
<h2>Account Balances</h2>
|
|
|
|
<ul>
|
|
<li>Total account balances: {{ total_balance|chf }}</li>
|
|
<li>Total positive account balances: {{ positive_balance|chf }}</li>
|
|
<li>Total negative account balances: {{ negative_balance|chf }}</li>
|
|
</ul>
|
|
|
|
</section>
|
|
|
|
{{ super() }}
|
|
|
|
{% endblock %}
|