You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
205 lines
6.9 KiB
205 lines
6.9 KiB
{% extends "layout.html" %}
|
|
|
|
{% block left_top_bar %}
|
|
<button class="uk-button uk-button-default uk-button-small uk-border-rounded"
|
|
uk-toggle="target: #charts-container">Show/Hide Charts</button>
|
|
{% endblock %}
|
|
|
|
{% block center_top_bar %}
|
|
Total Funds Earned:
|
|
<span id="total_funds_earned" class="uk-text-primary"></span>
|
|
{% endblock %}
|
|
|
|
{% block content %}
|
|
<div id="charts-container" uk-grid hidden>
|
|
<div class="uk-width-1-2">
|
|
<canvas id="sales-chart"></canvas>
|
|
</div>
|
|
<div class="uk-width-1-2">
|
|
<canvas id="stock-chart"></canvas>
|
|
</div>
|
|
</div>
|
|
<table id="products" class="uk-table uk-table-small uk-table-striped uk-table-hover">
|
|
<thead>
|
|
<tr>
|
|
<th class="uk-table-expand">Product Name</th>
|
|
<th>Current Stock</th>
|
|
<th>Total Stock</th>
|
|
<th>Total Sold</th>
|
|
<th>Total Earned</th>
|
|
<th>Latest Price</th>
|
|
<th>Last Update</th>
|
|
</tr>
|
|
</thead>
|
|
<tbody>
|
|
{% for product in products %}
|
|
{% if product.latest_entry != None %}
|
|
<tr>
|
|
<td class="uk-table-link">
|
|
<a href="/shop/product/{{ product.id }}">
|
|
{{ product.name }}
|
|
</a>
|
|
</td>
|
|
<td>{{ product.latest_entry.stock }}</td>
|
|
<td>{{ product.total_stocked }}</td>
|
|
<td>{{ product.total_sold }}</td>
|
|
<td>A${{ product.total_earned }}</td>
|
|
<td>
|
|
<span title="{{ product.latest_entry.raw_price}}">
|
|
A${{ product.latest_entry.price }}
|
|
</span>
|
|
</td>
|
|
<td class="uk-text-nowrap">{{ product.latest_entry.date.isoformat() }}</td>
|
|
</tr>
|
|
{% endif %}
|
|
{% endfor %}
|
|
</tbody>
|
|
</table>
|
|
{% endblock %}
|
|
|
|
{% block pagescripts %}
|
|
<script src="https://cdnjs.cloudflare.com/ajax/libs/Chart.js/2.7.1/Chart.js"></script>
|
|
<script>
|
|
function highlight_empty_stock() {
|
|
var rows = document.querySelectorAll('table#products > tbody > tr > td:nth-child(2)');
|
|
for(var row of rows) {
|
|
if(parseInt(row.textContent) == 0) {
|
|
row.parentElement.classList.add('uk-text-danger');
|
|
}
|
|
}
|
|
}
|
|
|
|
function calculate_total_earnings() {
|
|
var total_earnings = 0.00;
|
|
var earnings = document.querySelectorAll('table#products > tbody > tr > td:nth-child(5)');
|
|
for(var earning of earnings) {
|
|
total_earnings += parseFloat(earning.textContent.substring(2))
|
|
}
|
|
document.getElementById('total_funds_earned').textContent = "A$" + total_earnings.toFixed(2);
|
|
}
|
|
|
|
/* Chart.js */
|
|
var item_labels = [
|
|
{% for product in products %}
|
|
"{{ product.name }}",
|
|
{% endfor %}
|
|
];
|
|
var sale_data = [
|
|
{% for product in products %}
|
|
{{ product.total_sold }},
|
|
{% endfor %}
|
|
];
|
|
var earnings_data = [
|
|
{% for product in products %}
|
|
{{ product.total_earned }},
|
|
{% endfor %}
|
|
];
|
|
var total_stock_data = [
|
|
{% for product in products %}
|
|
{{ product.total_stocked }},
|
|
{% endfor %}
|
|
];
|
|
var current_stock_data = [
|
|
{% for product in products %}
|
|
{{ product.latest_entry.stock }},
|
|
{% endfor %}
|
|
];
|
|
|
|
function init_sales_chart(labels, sold_data, earned_data) {
|
|
var ctx = document.getElementById("sales-chart").getContext('2d');
|
|
var chart = new Chart(ctx, {
|
|
type: 'horizontalBar',
|
|
data: {
|
|
labels: labels,
|
|
datasets: [
|
|
{
|
|
label: 'Sold',
|
|
backgroundColor: 'rgb(93, 173, 226)',
|
|
borderColor: 'rgb(89, 131, 227)',
|
|
data: sold_data,
|
|
xAxisID: 'quantity'
|
|
},
|
|
{
|
|
label: 'Earned',
|
|
backgroundColor: 'rgb(173, 93, 226)',
|
|
borderColor: 'rgb(131, 89, 227)',
|
|
data: earned_data,
|
|
xAxisID: 'currency'
|
|
}
|
|
],
|
|
},
|
|
options: {
|
|
elements: { rectangle: { borderWidth: 2, } },
|
|
responsive: true,
|
|
legend: { position: 'bottom', },
|
|
title: { display: true, text: 'Sales & Earnings'},
|
|
scales: {
|
|
xAxes: [
|
|
{
|
|
id: 'quantity',
|
|
type: 'linear',
|
|
position: 'top'
|
|
},
|
|
{
|
|
id: 'currency',
|
|
type: 'linear',
|
|
position: 'bottom'
|
|
}
|
|
]
|
|
}
|
|
}
|
|
});
|
|
}
|
|
|
|
function init_stock_chart(labels, total_data, current_data) {
|
|
var ctx = document.getElementById("stock-chart").getContext('2d');
|
|
var chart = new Chart(ctx, {
|
|
type: 'horizontalBar',
|
|
data: {
|
|
labels: labels,
|
|
datasets: [
|
|
{
|
|
label: 'Total',
|
|
backgroundColor: 'rgb(54, 84, 126)',
|
|
data: total_data,
|
|
xAxisID: 'quantity'
|
|
},
|
|
{
|
|
label: 'Current',
|
|
backgroundColor: 'rgb(73, 133, 226)',
|
|
data: current_data,
|
|
xAxisID: 'big_quantity'
|
|
}
|
|
],
|
|
},
|
|
options: {
|
|
responsive: true,
|
|
legend: { position: 'bottom', },
|
|
title: { display: true, text: 'Total/Current Stock'},
|
|
scales: {
|
|
xAxes: [
|
|
{
|
|
id: 'quantity',
|
|
type: 'linear',
|
|
position: 'top'
|
|
},
|
|
{
|
|
id: 'big_quantity',
|
|
type: 'linear',
|
|
position: 'bottom'
|
|
}
|
|
]
|
|
}
|
|
}
|
|
});
|
|
}
|
|
|
|
/* On Page Ready */
|
|
document.addEventListener("DOMContentLoaded", function(event) {
|
|
highlight_empty_stock();
|
|
calculate_total_earnings();
|
|
init_sales_chart(item_labels, sale_data, earnings_data);
|
|
init_stock_chart(item_labels, total_stock_data, current_stock_data);
|
|
});
|
|
</script>
|
|
{% endblock %}
|