Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
21 changes: 5 additions & 16 deletions src/backoffice/management/commands/import_pos_sales_json.py
Original file line number Diff line number Diff line change
Expand Up @@ -5,27 +5,16 @@

from django.core.management.base import BaseCommand

from economy.utils import import_pos_sales_json
from economy.utils import import_pos_data

logger = logging.getLogger(f"bornhack.{__name__}")


class Command(BaseCommand):
args = "none"
help = "Import Pos sales JSON"

def add_arguments(self, parser) -> None:
parser.add_argument(
"jsonpath",
type=str,
help="The path to the Pos sales json file to import. The import is idempotent, no duplicates will be created.",
)
help = "Import Pos sales data"

def handle(self, *args, **options) -> None:
with open(options["jsonpath"]) as f:
data = json.load(f)
products, transactions, sales, costs = import_pos_sales_json(data)
self.stdout.write(f"{products} new products created")
self.stdout.write(f"{transactions} new transactions created")
self.stdout.write(f"{sales} new sales created")
self.stdout.write(f"{costs} new product_costs created")
"""Run the import for all write enabled camps."""
for camp in Camp.objects.filter(read_only=False):
import_pos_products(camp)
Original file line number Diff line number Diff line change
Expand Up @@ -55,6 +55,7 @@
<div class="btn-group-vertical">
<a href="{% url 'backoffice:event_detail' camp_slug=camp.slug slug=event.slug %}" class="btn btn-primary"><i class="fas fa-search"></i> Details</a>
<a href="{% url 'backoffice:event_update' camp_slug=camp.slug slug=event.slug %}" class="btn btn-primary"><i class="fas fa-edit"></i> Update</a>
<a href="{% url 'backoffice:event_schedule' camp_slug=camp.slug slug=event.slug %}" class="btn btn-primary"><i class="fas fa-calendar"></i> Schedule</a>
<a href="{% url 'backoffice:event_delete' camp_slug=camp.slug slug=event.slug %}" class="btn btn-danger"><i class="fas fa-times"></i> Delete</a>
</div>
</td>
Expand Down
2 changes: 1 addition & 1 deletion src/backoffice/templates/includes/index_pos.html
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,7 @@ <h4 class="list-group-item-heading">Point of Sale Product Costs</h4>
<h4 class="list-group-item-heading">Point of Sale Transactions</h4>
<p class="list-group-item-text">Use this view to see a list of Pos transactions.</p>
</a>
<a href="{% url 'backoffice:possale_list' camp_slug=camp.slug %}" class="list-group-item list-group-item-action">
<a href="{% url 'backoffice:possale_list_table' camp_slug=camp.slug %}" class="list-group-item list-group-item-action">
<h4 class="list-group-item-heading">Point of Sale Sales</h4>
<p class="list-group-item-text">Use this view to see a list of Pos sales.</p>
</a>
Expand Down
2 changes: 1 addition & 1 deletion src/backoffice/templates/includes/pos_list_table.html
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,7 @@
<td>{{ pos.team }}</td>
<td><a href="{% url 'backoffice:posreport_list' camp_slug=camp.slug pos_slug=pos.slug %}" class="btn btn-primary">{{ pos.pos_reports.count }} reports</a></td>
<td><a href="{% url 'backoffice:postransaction_list' camp_slug=camp.slug %}?pos={{ pos.name }}" class="btn btn-primary">{{ pos.pos_transactions.count }} transactions</a></td>
<td><a href="{% url 'backoffice:possale_list' camp_slug=camp.slug %}?pos={{ pos.name }}" class="btn btn-primary">{{ pos.sales.count }} sales for {{ pos.total_sales|default:0 }} HAX</a></td>
<td><a href="{% url 'backoffice:possale_list_table' camp_slug=camp.slug %}?pos={{ pos.name }}" class="btn btn-primary">{{ pos.sales.count }} sales for {{ pos.total_sales|default:0 }} HAX</a></td>
<td>
<div class="btn-group-vertical">
<a href="{% url 'backoffice:pos_detail' camp_slug=camp.slug pos_slug=pos.slug %}" class="btn btn-primary"><i class="fas fa-search"></i> Details</a>
Expand Down
8 changes: 8 additions & 0 deletions src/backoffice/templates/includes/pos_nav.html
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
<p>
<a href="{% url 'backoffice:index' camp_slug=camp.slug %}" class="btn btn-secondary"><i class="fas fa-undo"></i> Backoffice</a>
<a href="{% url 'backoffice:pos_list' camp_slug=camp.slug %}" class="btn btn-primary"><i class="fas fa-list"></i> Pos List</a>
<a href="{% url 'backoffice:posproduct_list' camp_slug=camp.slug %}" class="btn btn-primary"><i class="fas fa-list"></i> Pos Product List</a>
<a href="{% url 'backoffice:posproductcost_list' camp_slug=camp.slug %}" class="btn btn-primary"><i class="fas fa-list"></i> Pos Product Cost List</a>
<a href="{% url 'backoffice:postransaction_list' camp_slug=camp.slug %}" class="btn btn-primary"><i class="fas fa-list"></i> Pos Transaction List</a>
<a href="{% url 'backoffice:possale_list_table' camp_slug=camp.slug %}" class="btn btn-primary"><i class="fas fa-list"></i> Pos Sales List</a>
</p>
3 changes: 1 addition & 2 deletions src/backoffice/templates/pos_detail.html
Original file line number Diff line number Diff line change
Expand Up @@ -35,7 +35,7 @@ <h3 class="card-title">{{ pos.name }} | Pos | BackOffice</h3>
</tr>
<tr>
<th>Sales</th>
<td><a href="{% url 'backoffice:possale_list' camp_slug=camp.slug %}?pos={{ pos.name }}" class="btn btn-primary"><i class="fas fa-list"></i> {{ pos.sales.count }} products sold</a></p>
<td><a href="{% url 'backoffice:possale_list_table' camp_slug=camp.slug %}?pos={{ pos.name }}" class="btn btn-primary"><i class="fas fa-list"></i> {{ pos.sales.count }} products sold</a></p>
</tr>
<tr>
<th>Total Sales</th>
Expand All @@ -46,7 +46,6 @@ <h3 class="card-title">{{ pos.name }} | Pos | BackOffice</h3>
<br>
{% if perms.camps.orgateam_permission %}
<a href="{% url 'backoffice:posreport_create' camp_slug=camp.slug pos_slug=pos.slug %}" class="btn btn-success"><i class="fas fa-plus"></i> Create PosReport</a>
<a href="{% url 'backoffice:possale_import' camp_slug=camp.slug %}" class="btn btn-success"><i class="fas fa-plus"></i> Import Pos Sales JSON</a>
{% endif %}
</div>
</div>
Expand Down
9 changes: 1 addition & 8 deletions src/backoffice/templates/pos_list.html
Original file line number Diff line number Diff line change
Expand Up @@ -12,14 +12,7 @@
{% if not pos_list %}
<p class="lead">No Pos found.</p>
{% else %}
<p>
<a href="{% url 'backoffice:index' camp_slug=camp.slug %}" class="btn btn-secondary"><i class="fas fa-undo"></i> Backoffice</a>
<a href="{% url 'backoffice:pos_list' camp_slug=camp.slug %}" class="btn btn-primary"><i class="fas fa-list"></i> Pos List</a>
<a href="{% url 'backoffice:posproduct_list' camp_slug=camp.slug %}" class="btn btn-primary"><i class="fas fa-list"></i> Pos Product List</a>
<a href="{% url 'backoffice:posproductcost_list' camp_slug=camp.slug %}" class="btn btn-primary"><i class="fas fa-list"></i> Pos Product Cost List</a>
<a href="{% url 'backoffice:postransaction_list' camp_slug=camp.slug %}" class="btn btn-primary"><i class="fas fa-list"></i> Pos Transaction List</a>
<a href="{% url 'backoffice:possale_list' camp_slug=camp.slug %}" class="btn btn-primary"><i class="fas fa-list"></i> Pos Sales List</a>
</p>
{% include "includes/pos_nav.html" %}
<p class="lead">A <i>Pos</i> is a place where we sell stuff for DKK and/or HAX.</p>
{% include "includes/pos_list_table.html" %}
{% endif %}
Expand Down
57 changes: 37 additions & 20 deletions src/backoffice/templates/pos_product_cost_list.html
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@
{% load render_table from django_tables2 %}
{% load django_bootstrap5 %}
{% load django_tables2 %}
{% load bornhack %}

{% block title %}
Pos Product Costs | BackOffice | {{ block.super }}
Expand All @@ -13,29 +14,45 @@
<h3 class="card-title">Pos Product Costs | BackOffice</h3>
</div>
<div class="card-body">
<p>
<a href="{% url 'backoffice:index' camp_slug=camp.slug %}" class="btn btn-secondary"><i class="fas fa-undo"></i> Backoffice</a>
<a href="{% url 'backoffice:pos_list' camp_slug=camp.slug %}" class="btn btn-primary"><i class="fas fa-list"></i> Pos List</a>
<a href="{% url 'backoffice:posproduct_list' camp_slug=camp.slug %}" class="btn btn-primary"><i class="fas fa-list"></i> Pos Product List</a>
<a href="{% url 'backoffice:posproductcost_list' camp_slug=camp.slug %}" class="btn btn-primary"><i class="fas fa-list"></i> Pos Product Cost List</a>
<a href="{% url 'backoffice:postransaction_list' camp_slug=camp.slug %}" class="btn btn-primary"><i class="fas fa-list"></i> Pos Transaction List</a>
<a href="{% url 'backoffice:possale_list' camp_slug=camp.slug %}" class="btn btn-primary"><i class="fas fa-list"></i> Pos Sales List</a>
</p>
{% include "includes/pos_nav.html" %}
<p class="lead">A Pos Product Cost shows the cost of selling one of a product. Pos Product Costs are applied to all sales after the timestamp, until a newer Pos Product Cost is created.</p>
<div class="card">
<div class="card-header">Filter Pos Product Costs</div>
<div class="card-body">
{% if filter %}
<form action="" method="get" class="form form-inline">
{% bootstrap_form filter.form layout='inline' %}
<br>
<button class="btn btn-success"><i class="fas fa-search"></i> Filter</button>
<a href="{% url 'backoffice:posproductcost_list' camp_slug=camp.slug %}" class="btn btn-danger"><i class="fas fa-times"></i> Clear</a>
</form>
{% endif %}

<!-- filter info -->
<div class="alert alert-info text-center" role="alert">
<p class="lead">
<button class="btn btn-primary" type="button" data-bs-toggle="collapse" data-bs-target="#filter" aria-expanded="false" aria-controls="filter"><i class="fas fa-filter"></i> Toggle Filter</button>
{% if filter.form.cleaned_data %}<a href="?" class="btn btn-danger"><i class="fas fa-times"></i> Clear</a>{% endif %}<br>
Showing {{ object_list.count }} costs out of {{ total_costs }} costs for {{ camp.title }}

<div id="filter" class="row collapse">
<div class="col">
<!-- filter collapse begin -->
<div class="card mb-2">
<div class="card-header">Filter Pos Sales</div>
<div class="card-body">
{% if filter %}
<form action="" method="get" class="form form-inline">
{% bootstrap_form filter.form layout='inline' %}
<br>
<button class="btn btn-success"><i class="fas fa-search"></i> Apply Filter</button>
{% if filter.form.cleaned_data %}<a href="?" class="btn btn-danger"><i class="fas fa-times"></i> Clear Filter</a>{% endif %}
</form>
{% endif %}
</div>
</div>
<!-- filter collapse end -->
</div>
<div class="col">
<div class="card">
<div class="card-header">Active Filters</div>
<div class="card-body">
{% format_django_filter filter %}
</div>
</div>
</div>
</div>
</div>
<div class="lead">Showing {{ object_list.count }} costs out of {{ total_costs }} costs for {{ camp.title }}</div>

{% include "includes/table_pagination.html" %}
{% render_table table %}
{% include "includes/table_pagination.html" %}
Expand Down
57 changes: 37 additions & 20 deletions src/backoffice/templates/pos_product_list.html
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
{% extends 'base.html' %}
{% load render_table from django_tables2 %}
{% load django_bootstrap5 %}
{% load bornhack %}

{% block title %}
Pos Products | BackOffice | {{ block.super }}
Expand All @@ -12,29 +13,45 @@
<h3 class="card-title">Pos Products | BackOffice</h3>
</div>
<div class="card-body">
<p>
<a href="{% url 'backoffice:index' camp_slug=camp.slug %}" class="btn btn-secondary"><i class="fas fa-undo"></i> Backoffice</a>
<a href="{% url 'backoffice:pos_list' camp_slug=camp.slug %}" class="btn btn-primary"><i class="fas fa-list"></i> Pos List</a>
<a href="{% url 'backoffice:posproduct_list' camp_slug=camp.slug %}" class="btn btn-primary"><i class="fas fa-list"></i> Pos Product List</a>
<a href="{% url 'backoffice:posproductcost_list' camp_slug=camp.slug %}" class="btn btn-primary"><i class="fas fa-list"></i> Pos Product Cost List</a>
<a href="{% url 'backoffice:postransaction_list' camp_slug=camp.slug %}" class="btn btn-primary"><i class="fas fa-list"></i> Pos Transaction List</a>
<a href="{% url 'backoffice:possale_list' camp_slug=camp.slug %}" class="btn btn-primary"><i class="fas fa-list"></i> Pos Sales List</a>
</p>
{% include "includes/pos_nav.html" %}
<p class="lead">A Pos Product is something sold at a Pos. Price, name and other product details might change over time. The sales numbers shown in this table only include transactions related to {{ camp.title }}.</p>
<div class="card">
<div class="card-header">Filter Pos Products</div>
<div class="card-body">
{% if filter %}
<form action="" method="get" class="form form-inline">
{% bootstrap_form filter.form layout='inline' %}
<br>
<button class="btn btn-success"><i class="fas fa-search"></i> Filter</button>
<a href="{% url 'backoffice:posproduct_list' camp_slug=camp.slug %}" class="btn btn-danger"><i class="fas fa-times"></i> Clear</a>
</form>
{% endif %}

<!-- filter info -->
<div class="alert alert-info text-center" role="alert">
<p class="lead">
<button class="btn btn-primary" type="button" data-bs-toggle="collapse" data-bs-target="#filter" aria-expanded="false" aria-controls="filter"><i class="fas fa-filter"></i> Toggle Filter</button>
{% if filter.form.cleaned_data %}<a href="?" class="btn btn-danger"><i class="fas fa-times"></i> Clear</a>{% endif %}<br>
Showing {{ object_list|length }} products ({{ filtered_sales_count }} sales for {{ filtered_sales_sum }} HAX) out of total {{ total_products }} products ({{ total_sales_count }} sales for {{ total_sales_sum }} HAX) for {{ camp.title }}

<div id="filter" class="row collapse">
<div class="col">
<!-- filter collapse begin -->
<div class="card mb-2">
<div class="card-header">Filter Pos Sales</div>
<div class="card-body">
{% if filter %}
<form action="" method="get" class="form form-inline">
{% bootstrap_form filter.form layout='inline' %}
<br>
<button class="btn btn-success"><i class="fas fa-search"></i> Apply Filter</button>
{% if filter.form.cleaned_data %}<a href="?" class="btn btn-danger"><i class="fas fa-times"></i> Clear Filter</a>{% endif %}
</form>
{% endif %}
</div>
</div>
<!-- filter collapse end -->
</div>
<div class="col">
<div class="card">
<div class="card-header">Active Filters</div>
<div class="card-body">
{% format_django_filter filter %}
</div>
</div>
</div>
</div>
</div>
<div class="lead">Showing {{ object_list|length }} products ({{ filtered_sales_count }} sales for {{ filtered_sales_sum }} HAX) out of total {{ total_products }} products ({{ total_sales_count }} sales for {{ total_sales_sum }} HAX) for {{ camp.title }}</div>

{% include "includes/table_pagination.html" %}
{% render_table table %}
{% include "includes/table_pagination.html" %}
Expand Down
Loading
Loading