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
11 changes: 11 additions & 0 deletions src/backoffice/templates/chain_detail_backoffice.html
Original file line number Diff line number Diff line change
Expand Up @@ -55,6 +55,17 @@ <h3>{{ expenses.count }} Expenses for Chain {{ chain.name }}</h3>
<h3>{{ revenues.count }} Revenues for Chain {{ chain.name }}</h3>
{% include 'includes/revenue_list_panel.html' with revenue_list=revenues %}

<hr>

<h3>{{ past_expenses.count }} Expenses for Chain {{ chain.name }} in previous years</h3>
{% include 'includes/expense_list_panel.html' with expense_list=past_expenses past_camps=True %}

<hr>

<h3>{{ past_revenues.count }} Revenues for Chain {{ chain.name }} in previous years</h3>
{% include 'includes/revenue_list_panel.html' with revenue_list=past_revenues past_camps=True %}


</div>
</div>

Expand Down
1 change: 1 addition & 0 deletions src/backoffice/templates/expense_detail_backoffice.html
Original file line number Diff line number Diff line change
Expand Up @@ -25,5 +25,6 @@ <h3>Manage Expense</h3>
<a href="{% url 'admin:index' %}economy/expense/{{ expense.uuid }}/change/" class="btn btn-primary"><i class="fas fa-edit"></i> Open in Admin</a>
{% endif %}
<a href="{% url 'backoffice:expense_list' camp_slug=camp.slug %}" class="btn btn-primary"><i class="fas fa-undo"></i> Back to Expense List</a>
<a href="{% url 'backoffice:chain_detail' camp_slug=camp.slug chain_slug=expense.creditor.chain.slug %}" class="btn btn-primary"><i class="fas fa-undo"></i> Back to Chain Details</a>

{% endblock content %}
1 change: 1 addition & 0 deletions src/backoffice/templates/revenue_detail_backoffice.html
Original file line number Diff line number Diff line change
Expand Up @@ -24,5 +24,6 @@ <h3>Manage Revenue</h3>
<a href="{% url 'admin:index' %}economy/revenue/{{ revenue.uuid }}/change/" class="btn btn-primary"><i class="fas fa-edit"></i> Open in Admin</a>
{% endif %}
<a href="{% url 'backoffice:revenue_list' camp_slug=camp.slug %}" class="btn btn-primary"><i class="fas fa-undo"></i> Back to Revenue List</a>
<a href="{% url 'backoffice:chain_detail' camp_slug=camp.slug chain_slug=revenue.debtor.chain.slug %}" class="btn btn-primary"><i class="fas fa-undo"></i> Back to Chain Details</a>

{% endblock content %}
11 changes: 11 additions & 0 deletions src/backoffice/views/economy.py
Original file line number Diff line number Diff line change
Expand Up @@ -165,6 +165,17 @@ def get_context_data(self, *args, **kwargs):
camp=self.camp,
debtor__chain=self.get_object(),
).prefetch_related("responsible_team", "user", "debtor")

# Include past years expenses and revenues for the Chain in context as separate querysets
context["past_expenses"] = Expense.objects.filter(
camp__camp__lt=self.camp.camp,
creditor__chain=self.get_object(),
).prefetch_related("responsible_team", "user", "creditor")
context["past_revenues"] = Revenue.objects.filter(
camp__camp__lt=self.camp.camp,
debtor__chain=self.get_object(),
).prefetch_related("responsible_team", "user", "debtor")

return context


Expand Down
14 changes: 14 additions & 0 deletions src/economy/templates/chain_list.html
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@ <h2>Chains</h2>
{% if chain_list %}
<div class="card">
<h3 class="card-header">Existing Chains</h3>
<span class="card-header"><i>Italic</i>: No current expenses for this year</span>
<div class="card-body">
<div class="list-group">
{% for chain in chain_list %}
Expand All @@ -25,6 +26,19 @@ <h4 class="list-group-item-heading">
{% endif %}
</a>
{% endfor %}
{% if past_year_chains %}
<hr>
{% for chain in past_year_chains %}
<a href="{% url 'economy:credebtor_list' camp_slug=camp.slug chain_slug=chain.slug %}" class="list-group-item list-group-item-action">
<h4 class="list-group-item-heading">
<i><b>{{ chain.name }}</b> ({{ chain.credebtors.count }} credebtors)</i>
</h4>
{% if chain.notes %}
<p>{{ chain.notes }}</p>
{% endif %}
</a>
{% endfor %}
{% endif %}
</div>
</div>
</div>
Expand Down
13 changes: 12 additions & 1 deletion src/economy/templates/credebtor_list.html
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,7 @@ <h3 class="card-header">Existing Credebtors</h3>
<div class="card-body">
<table class="table table-hover">
<tbody>
{% for credebtor in chain.credebtors.all %}
{% for credebtor in credebtor_list %}
<tr>
<td>
<h4>
Expand All @@ -29,6 +29,17 @@ <h4>
<b>Notes:</b>
<p>{{ credebtor.notes }}</p>
{% endif %}

<hr>

<h5>{{ credebtor.current_expenses.count }} Expenses</h5>
{% include 'includes/expense_list_panel.html' with expense_list=credebtor.current_expenses %}

<hr>

<h5>{{ credebtor.current_revenues.count }} Revenues</h5>
{% include 'includes/revenue_list_panel.html' with revenue_list=credebtor.current_revenues %}

<a href="{% url 'economy:expense_create' camp_slug=camp.slug chain_slug=chain.slug credebtor_slug=credebtor.slug %}" class="btn btn-primary"><i class="fas fa-coins"></i> <i class="fas fa-divide"></i> Create Expense</a>
<a href="{% url 'economy:revenue_create' camp_slug=camp.slug chain_slug=chain.slug credebtor_slug=credebtor.slug %}" class="btn btn-primary"><i class="fas fa-coins"></i> <i class="fas fa-plus"></i> Create Revenue</a>
</td>
Expand Down
22 changes: 14 additions & 8 deletions src/economy/templates/includes/expense_list_panel.html
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,9 @@
<thead>
<tr>
<th>ID</th>
{% if past_camps %}
<th>Camp</th>
{% endif %}
<th>Invoice Date</th>
<th>Created By</th>
{% if not reimbursement %}
Expand All @@ -24,9 +27,12 @@
{% for expense in expense_list %}
<tr>
{% if request.resolver_match.app_name == "backoffice" %}
<td><a href="{% url 'backoffice:expense_detail' camp_slug=camp.slug pk=expense.pk %}">{{ expense.pk }}</a></td>
<td><a href="{% url 'backoffice:expense_detail' camp_slug=expense.camp.slug pk=expense.pk %}">{{ expense.pk }}</a></td>
{% else %}
<td><a href="{% url 'economy:expense_detail' camp_slug=camp.slug pk=expense.pk %}">{{ expense.pk }}</a></td>
<td><a href="{% url 'economy:expense_detail' camp_slug=expense.camp.slug pk=expense.pk %}">{{ expense.pk }}</a></td>
{% endif %}
{% if past_camps %}
<td data-order="{{ expense.camp.title|sortable }}">{{ expense.camp.title }}</td>
{% endif %}
<td data-order="{{ expense.invoice_date|sortable }}">{{ expense.invoice_date }}</td>
<td>{{ expense.user.email }}</td>
Expand All @@ -43,9 +49,9 @@
<td>
{% if expense.reimbursement and not expense.paid_by_bornhack %}
{% if request.resolver_match.app_name == "backoffice" %}
<a href="{% url 'backoffice:reimbursement_detail' camp_slug=camp.slug pk=expense.reimbursement.pk %}" class="btn btn-primary"><i class="fas fa-search"></i> Details</a>
<a href="{% url 'backoffice:reimbursement_detail' camp_slug=expense.camp.slug pk=expense.reimbursement.pk %}" class="btn btn-primary"><i class="fas fa-search"></i> Details</a>
{% else %}
<a href="{% url 'economy:reimbursement_detail' camp_slug=camp.slug pk=expense.reimbursement.pk %}" class="btn btn-primary"><i class="fas fa-search"></i> Details</a>
<a href="{% url 'economy:reimbursement_detail' camp_slug=expense.camp.slug pk=expense.reimbursement.pk %}" class="btn btn-primary"><i class="fas fa-search"></i> Details</a>
{% endif %}
{% else %}
N/A
Expand All @@ -55,15 +61,15 @@

<td>
{% if request.resolver_match.app_name == "backoffice" %}
<a class="btn btn-primary" href="{% url 'backoffice:expense_detail' camp_slug=camp.slug pk=expense.uuid %}"><i class="fas fa-search"></i> Details</a>
<a class="btn btn-primary" href="{% url 'backoffice:expense_detail' camp_slug=expense.camp.slug pk=expense.uuid %}"><i class="fas fa-search"></i> Details</a>
{% if request.user.is_staff %}
<a class="btn btn-primary" href="{% url 'admin:index' %}economy/expense/{{ expense.uuid }}/change/"><i class="fas fa-edit"></i> Admin</a>
{% endif %}
{% else %}
<a class="btn btn-primary" href="{% url 'economy:expense_detail' camp_slug=camp.slug pk=expense.uuid %}"><i class="fas fa-search"></i> Details</a>
<a class="btn btn-primary" href="{% url 'economy:expense_detail' camp_slug=expense.camp.slug pk=expense.uuid %}"><i class="fas fa-search"></i> Details</a>
{% if not expense.approved %}
<a class="btn btn-primary" href="{% url 'economy:expense_update' camp_slug=camp.slug pk=expense.uuid %}"><i class="fas fa-edit"></i> Update</a>
<a class="btn btn-danger" href="{% url 'economy:expense_delete' camp_slug=camp.slug pk=expense.uuid %}"><i class="fas fa-times"></i> Delete</a>
<a class="btn btn-primary" href="{% url 'economy:expense_update' camp_slug=expense.camp.slug pk=expense.uuid %}"><i class="fas fa-edit"></i> Update</a>
<a class="btn btn-danger" href="{% url 'economy:expense_delete' camp_slug=expense.camp.slug pk=expense.uuid %}"><i class="fas fa-times"></i> Delete</a>
{% endif %}
{% endif %}
</td>
Expand Down
14 changes: 10 additions & 4 deletions src/economy/templates/includes/revenue_list_panel.html
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,9 @@
<thead>
<tr>
<th>ID</th>
{% if past_camps %}
<th>Camp</th>
{% endif %}
<th>Invoice Date</th>
<th>Created By</th>
<th>Debtor</th>
Expand All @@ -18,6 +21,9 @@
{% for revenue in revenue_list %}
<tr>
<td>{{ revenue.pk }}</td>
{% if past_camps %}
<td data-order="{{ revenue.camp.title|sortable }}">{{ revenue.camp.title }}</td>
{% endif %}
<td data-order="{{ revenue.invoice_date|sortable }}">{{ revenue.invoice_date }}</td>
<td>{{ revenue.user.email }}</td>
<td>{{ revenue.debtor }}</td>
Expand All @@ -27,14 +33,14 @@
<td>{{ revenue.approval_status }}</td>
<td>
{% if request.resolver_match.app_name == "backoffice" %}
<a class="btn btn-primary" href="{% url 'backoffice:revenue_detail' camp_slug=camp.slug pk=revenue.uuid %}"><i class="fas fa-search"></i> Details</a>
<a class="btn btn-primary" href="{% url 'backoffice:revenue_detail' camp_slug=revenue.camp.slug pk=revenue.uuid %}"><i class="fas fa-search"></i> Details</a>
{% if request.user.is_staff %}
<a class="btn btn-primary" href="{% url 'admin:index' %}economy/revenue/{{ revenue.uuid }}/change/"><i class="fas fa-edit"></i> Admin</a>
{% endif %}
{% else %}
<a class="btn btn-primary" href="{% url 'economy:revenue_detail' camp_slug=camp.slug pk=revenue.uuid %}"><i class="fas fa-search"></i> Details</a>
<a class="btn btn-primary" href="{% url 'economy:revenue_update' camp_slug=camp.slug pk=revenue.uuid %}"><i class="fas fa-edit"></i> Update</a>
<a class="btn btn-danger" href="{% url 'economy:revenue_delete' camp_slug=camp.slug pk=revenue.uuid %}"><i class="fas fa-times"></i> Delete</a>
<a class="btn btn-primary" href="{% url 'economy:revenue_detail' camp_slug=revenue.camp.slug pk=revenue.uuid %}"><i class="fas fa-search"></i> Details</a>
<a class="btn btn-primary" href="{% url 'economy:revenue_update' camp_slug=revenue.camp.slug pk=revenue.uuid %}"><i class="fas fa-edit"></i> Update</a>
<a class="btn btn-danger" href="{% url 'economy:revenue_delete' camp_slug=revenue.camp.slug pk=revenue.uuid %}"><i class="fas fa-times"></i> Delete</a>
{% endif %}
</td>
</tr>
Expand Down
49 changes: 42 additions & 7 deletions src/economy/views.py
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,9 @@
from django.conf import settings
from django.contrib import messages
from django.contrib.auth.mixins import LoginRequiredMixin
from django.db.models import OuterRef
from django.db.models import Q
from django.db.models import Prefetch
from django.db.models import Sum
from django.http import HttpResponse
from django.http import HttpResponseRedirect
Expand Down Expand Up @@ -64,8 +67,8 @@ def get_context_data(self, **kwargs):
).count()
reimbursement_total = 0
for reimbursement in Reimbursement.objects.filter(
reimbursement_user=self.request.user,
camp=self.camp,
reimbursement_user=self.request.user,
camp=self.camp,
):
reimbursement_total += reimbursement.amount
context["reimbursement_total"] = reimbursement_total
Expand Down Expand Up @@ -151,10 +154,24 @@ def form_valid(self, form):


class ChainListView(CampViewMixin, RaisePermissionRequiredMixin, ListView):
model = Chain
template_name = "chain_list.html"
permission_required = "camps.expense_create_permission"

def get_queryset(self):
queryset = (Chain.objects
.filter(credebtors__expenses__camp=self.camp)
.order_by('name'))

return queryset

def get_context_data(self, **kwargs):
"""Add chains with expenses in past years"""
context = super().get_context_data(**kwargs)
context['past_year_chains'] = (Chain.objects
.filter(~Q(credebtors__expenses__camp=self.camp))
.order_by('name'))
return context


class CredebtorCreateView(
CampViewMixin,
Expand Down Expand Up @@ -198,10 +215,28 @@ class CredebtorListView(
RaisePermissionRequiredMixin,
ListView,
):
model = Credebtor
template_name = "credebtor_list.html"
permission_required = "camps.expense_create_permission"

def get_queryset(self):
expenses=Expense.objects.filter(camp=self.camp)
revenues=Revenue.objects.filter(camp=self.camp)
return (Credebtor.objects.filter(
chain=self.chain
).prefetch_related(
Prefetch(
'expenses',
queryset=expenses,
to_attr="current_expenses",
)
).prefetch_related(
Prefetch(
'revenues',
queryset=revenues,
to_attr="current_revenues",
)
))

def get_context_data(self, **kwargs):
"""Add chain to context."""
context = super().get_context_data(**kwargs)
Expand Down Expand Up @@ -387,9 +422,9 @@ class ReimbursementCreateView(CampViewMixin, ExpensePermissionMixin, CreateView)
def get(self, request, *args, **kwargs):
"""Check if this user has any approved and un-reimbursed expenses."""
if not request.user.expenses.filter(
reimbursement__isnull=True,
approved=True,
paid_by_bornhack=False,
reimbursement__isnull=True,
approved=True,
paid_by_bornhack=False,
):
messages.error(
request,
Expand Down
Loading