Track items sold and graph profit for player shop inventory.
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

{% 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 %}