Skip to content

Commit 78d01d7

Browse files
authored
Fix expense counting in login message about missing reimbursement (#2053)
1 parent 60f770e commit 78d01d7

File tree

6 files changed

+49
-61
lines changed

6 files changed

+49
-61
lines changed

src/bornhack/environment_settings.py.dist.dev

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -63,6 +63,10 @@ IRCBOT_CHANNELS = {
6363
IRCBOT_PUBLIC_CHANNEL = "#my-bornhack-channel"
6464
IRCBOT_VOLUNTEER_CHANNEL = "#my-bornhack-channel"
6565

66+
ACCOUNTINGSYSTEM_EMAIL = "accounting_system@example.com"
67+
ECONOMYTEAM_EMAIL = "economy@example.com"
68+
ECONOMYTEAM_NAME = "Economy"
69+
6670
BANKACCOUNT_IBAN = "LOL"
6771
BANKACCOUNT_SWIFTBIC = "lol"
6872
BANKACCOUNT_REG = "lol"

src/economy/views.py

Lines changed: 7 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -6,8 +6,8 @@
66
from django.conf import settings
77
from django.contrib import messages
88
from django.contrib.auth.mixins import LoginRequiredMixin
9-
from django.db.models import Prefetch
109
from django.core.exceptions import ValidationError
10+
from django.db.models import Prefetch
1111
from django.db.models import Q
1212
from django.db.models import Sum
1313
from django.http import HttpResponse
@@ -415,16 +415,8 @@ class ReimbursementCreateView(CampViewMixin, ExpensePermissionMixin, CreateView)
415415

416416
def dispatch(self, request, *args, **kwargs):
417417
"""Get any approved and un-reimbursed expenses and revenues, or return error."""
418-
self.expenses = request.user.expenses.filter(
419-
reimbursement__isnull=True,
420-
approved=True,
421-
payment_status="PAID_NEEDS_REIMBURSEMENT",
422-
)
423-
self.revenues = request.user.revenues.filter(
424-
reimbursement__isnull=True,
425-
approved=True,
426-
payment_status="PAID_NEEDS_REDISBURSEMENT",
427-
)
418+
self.expenses = request.user.profile.paid_expenses_needs_reimbursement
419+
self.revenues = request.user.profile.paid_revenues_needs_redisbursement
428420
if not self.expenses and not self.revenues:
429421
messages.error(
430422
request,
@@ -458,28 +450,8 @@ def form_valid(self, form):
458450
reverse("economy:dashboard", kwargs={"camp_slug": self.camp.slug}),
459451
)
460452

461-
# get the expenses for this user
462-
expenses = Expense.objects.filter(
463-
user=self.request.user,
464-
approved=True,
465-
reimbursement__isnull=True,
466-
payment_status="PAID_NEEDS_REIMBURSEMENT",
467-
)
468-
expenses_total = expenses.aggregate(Sum("amount"))["amount__sum"] or 0
469-
470-
# get the revenues for this user
471-
revenues = Revenue.objects.filter(
472-
user=self.request.user,
473-
approved=True,
474-
reimbursement__isnull=True,
475-
payment_status="PAID_NEEDS_REDISBURSEMENT",
476-
)
477-
revenues_total = revenues.aggregate(Sum("amount"))["amount__sum"] or 0
478-
if not expenses and not revenues:
479-
messages.error(self.request, "No approved unhandled expenses or revenues found")
480-
return redirect(
481-
reverse("economy:dashboard", kwargs={"camp_slug": self.camp.slug}),
482-
)
453+
expenses_total = self.expenses.aggregate(Sum("amount"))["amount__sum"] or 0
454+
revenues_total = self.revenues.aggregate(Sum("amount"))["amount__sum"] or 0
483455

484456
# calculate the reimbursement total
485457
reimbursement_total = expenses_total - revenues_total
@@ -502,12 +474,12 @@ def form_valid(self, form):
502474
reimbursement.save()
503475

504476
# add all expenses to reimbursement
505-
for expense in expenses:
477+
for expense in self.expenses:
506478
expense.reimbursement = reimbursement
507479
expense.save()
508480

509481
# add all revenues to reimbursement
510-
for revenue in revenues:
482+
for revenue in self.revenues:
511483
revenue.reimbursement = reimbursement
512484
revenue.save()
513485

src/profiles/apps.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,8 +9,8 @@
99

1010
from .signal_handlers import create_profile
1111
from .signal_handlers import profile_pre_save
12-
from .signal_handlers import set_session_on_login
1312
from .signal_handlers import reimbursement_msg_on_login
13+
from .signal_handlers import set_session_on_login
1414

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

src/profiles/models.py

Lines changed: 24 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,8 @@
77
from django.utils.translation import gettext_lazy as _
88
from django_prometheus.models import ExportModelOperationsMixin
99

10+
from economy.models import Expense
11+
from economy.models import Revenue
1012
from camps.models import Camp
1113
from teams.models import TeamMember
1214
from utils.models import CreatedUpdatedModel
@@ -81,8 +83,8 @@ def __str__(self) -> str:
8183
return self.user.username
8284

8385
def approve_public_credit_name(self) -> None:
84-
"""This method just sets profile.public_credit_name_approved=True and calls save()
85-
It is used in an admin action.
86+
"""This method just sets profile.public_credit_name_approved=True
87+
and calls save(). It is used in an admin action.
8688
"""
8789
self.public_credit_name_approved = True
8890
self.save()
@@ -109,6 +111,26 @@ def get_display_name(self, user: User, camp: Camp) -> str:
109111

110112
return self.public_name
111113

114+
@property
115+
def paid_expenses_needs_reimbursement(self) -> models.QuerySet:
116+
"""The paid_expense_needs_reimbursement property."""
117+
return Expense.objects.filter(
118+
user=self.user,
119+
approved=True,
120+
reimbursement__isnull=True,
121+
payment_status="PAID_NEEDS_REIMBURSEMENT",
122+
)
123+
124+
@property
125+
def paid_revenues_needs_redisbursement(self) -> models.QuerySet:
126+
"""The paid_revenues_needs_redisbursement property."""
127+
return Revenue.objects.filter(
128+
user=self.user,
129+
approved=True,
130+
reimbursement__isnull=True,
131+
payment_status="PAID_NEEDS_REDISBURSEMENT",
132+
)
133+
112134
@property
113135
def public_name(self) -> str:
114136
"""Return `public_credit_name` if it is approved or else `Unnamed`.

src/profiles/signal_handlers.py

Lines changed: 11 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -79,15 +79,16 @@ def set_session_on_login(sender, request, user, **kwargs) -> None:
7979
"""Signal handler called on_login to set session["theme"] from the user profile."""
8080
request.session["theme"] = request.user.profile.theme
8181

82-
def reimbursement_msg_on_login(sender, request, user, **kwargs) -> None:
83-
"""
84-
Add message when user has approved expenses without matching reimbursement.
85-
"""
86-
approved_expenses = user.expenses.all().filter(approved=True, reimbursement=None)
8782

88-
if approved_expenses.exists():
89-
messages.info(
90-
request,
91-
f"NOTE: You have {approved_expenses.count()} expenses with a missing reimbursement. Please create a reimbursement once all your expenses have been approved."
83+
def reimbursement_msg_on_login(sender, request, user, **kwargs) -> None:
84+
"""Add message for reminding user about missing reimbursement."""
85+
expenses = user.profile.paid_expenses_needs_reimbursement
86+
revenues = user.profile.paid_revenues_needs_redisbursement
87+
if expenses.exists() or revenues.exists():
88+
msg = (
89+
f"NOTE: You have {expenses.count()} expense(s) and "
90+
f"{revenues.count()} revenues(s) with missing "
91+
"reimbursement. Please create a reimbursement once all your "
92+
"expenses and revenues have been created and approved."
9293
)
93-
94+
messages.info(request, msg)

src/utils/bootstrap/base.py

Lines changed: 2 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -51,7 +51,6 @@
5151
from economy.models import Expense
5252
from economy.models import Pos
5353
from economy.models import Reimbursement
54-
from economy.models import Revenue
5554
from events.factories import EventProposalFactory
5655
from events.factories import EventProposalUrlFactory
5756
from events.factories import SpeakerProposalFactory
@@ -2155,18 +2154,8 @@ def create_camp_reimbursements(self, camp: Camp) -> None:
21552154
.distinct(),
21562155
)
21572156
for user in users:
2158-
expenses = Expense.objects.filter(
2159-
user=user,
2160-
approved=True,
2161-
reimbursement__isnull=True,
2162-
payment_status="PAID_NEEDS_REIMBURSEMENT",
2163-
)
2164-
revenues = Revenue.objects.filter(
2165-
user=user,
2166-
approved=True,
2167-
reimbursement__isnull=True,
2168-
payment_status="PAID_NEEDS_REDISBURSEMENT",
2169-
)
2157+
expenses = user.profile.paid_expenses_needs_reimbursement
2158+
revenues = user.profile.paid_revenues_needs_redisbursement
21702159
if not expenses and not revenues:
21712160
continue
21722161
reimbursement = Reimbursement.objects.create(

0 commit comments

Comments
 (0)