From 0622ac2a89607c4af49e87ccb82287feb83a10b9 Mon Sep 17 00:00:00 2001 From: Yingtong Li Date: Sun, 30 Apr 2023 23:12:18 +1000 Subject: [PATCH] Allow customising ticketing fee calculation Existing ticketing fees can be preserved at database migration time --- selfserv/settings.example.py | 6 +++++- sstreasury/jinja2/sstreasury/budget_edit.html | 5 ++++- sstreasury/jinja2/sstreasury/budget_view.html | 6 +++++- sstreasury/models.py | 8 ++++++-- sstreasury/static/sstreasury/budget.js | 4 ++-- sstreasury/views.py | 4 ++++ 6 files changed, 26 insertions(+), 7 deletions(-) diff --git a/selfserv/settings.example.py b/selfserv/settings.example.py index bae5801..815e450 100644 --- a/selfserv/settings.example.py +++ b/selfserv/settings.example.py @@ -1,5 +1,6 @@ # Society Self-Service -# Copyright © 2018-2019 Yingtong Li (RunasSudo) +# Copyright © 2018-2023 Yingtong Li (RunasSudo) +# Copyright © 2023 MUMUS Inc. # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU Affero General Public License as published by @@ -32,6 +33,9 @@ PROMO_LOGO_URL = 'https://placehold.it/2000x500' PROMO_LOGO_LINK = 'https://example.com' PROMO_GROUPS_MANDATORY = ['All Years'] +TICKETING_FEE_PROPORTION = 0.0175 # Previous default was (1-1/1.01884) +TICKETING_FEE_FIXED = 0.30 # Previous default was 0.8133/1.01884 + ABA_USER_NAME = 'Society Name' ABA_BANK_NAME = 'CBA' ABA_BANK_CODE = 0 diff --git a/sstreasury/jinja2/sstreasury/budget_edit.html b/sstreasury/jinja2/sstreasury/budget_edit.html index e2a0087..cc3a8dd 100644 --- a/sstreasury/jinja2/sstreasury/budget_edit.html +++ b/sstreasury/jinja2/sstreasury/budget_edit.html @@ -225,9 +225,12 @@ } }); + const ticketingFeeProportion = {{ settings.TICKETING_FEE_PROPORTION }}; + const ticketingFeeFixed = {{ settings.TICKETING_FEE_FIXED }}; + const editing = true; + var revenue_data = JSON.parse({{ import('json').dumps(import('json').dumps(revision.revenue))|safe }}); var expense_data = JSON.parse({{ import('json').dumps(import('json').dumps(revision.expense))|safe }}); - var editing = true; makeGrid(); dragula([document.querySelector('#revenue_grid tbody')], { diff --git a/sstreasury/jinja2/sstreasury/budget_view.html b/sstreasury/jinja2/sstreasury/budget_view.html index af3ed75..ba50f55 100644 --- a/sstreasury/jinja2/sstreasury/budget_view.html +++ b/sstreasury/jinja2/sstreasury/budget_view.html @@ -385,9 +385,13 @@ diff --git a/sstreasury/models.py b/sstreasury/models.py index d58e969..96de61b 100644 --- a/sstreasury/models.py +++ b/sstreasury/models.py @@ -1,5 +1,6 @@ # Society Self-Service -# Copyright © 2018–2022 Yingtong Li (RunasSudo) +# Copyright © 2018–2023 Yingtong Li (RunasSudo) +# Copyright © 2023 MUMUS Inc. # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU Affero General Public License as published by @@ -78,6 +79,9 @@ class BudgetRevision(models.Model): expense_no_emergency_fund = models.BooleanField() expense_comments = models.TextField() + ticketing_fee_proportion = models.FloatField() + ticketing_fee_fixed = models.FloatField() + action = models.IntegerField(choices=[(v.value, v.description) for v in BudgetAction]) class Meta: @@ -103,7 +107,7 @@ class BudgetRevision(models.Model): try: total += Decimal(item['Unit price']) * Decimal(item['Units']) if item['IWT'] and item['Unit price'] > 0: - total -= (Decimal(item['Unit price']) - (Decimal(item['Unit price']) - Decimal('0.8133')) / Decimal('1.01884')) * item['Units'] + total -= (Decimal(item['Unit price']) * Decimal(self.ticketing_fee_proportion) + Decimal(self.ticketing_fee_fixed)) * item['Units'] except TypeError: # Invalid unit price, etc. pass diff --git a/sstreasury/static/sstreasury/budget.js b/sstreasury/static/sstreasury/budget.js index aa07095..7a569e9 100644 --- a/sstreasury/static/sstreasury/budget.js +++ b/sstreasury/static/sstreasury/budget.js @@ -30,7 +30,7 @@ function recalcRevTotal(args) { for (var row of args.grid.data) { revTotal += row['Unit price'] * row['Units']; if (row['Unit price'] > 0 && row['IWT']) { - revTotalIWT += (row['Unit price'] - (row['Unit price'] - 0.8133) / 1.01884) * row['Units']; + revTotalIWT += (row['Unit price'] * ticketingFeeProportion + ticketingFeeFixed) * row['Units']; } } @@ -38,7 +38,7 @@ function recalcRevTotal(args) { if (revTotalIWT > 0) { var totalrow = $(''); - totalrow.append($('Less IWT fees:').prop('colspan', args.grid.fields.length - (editing ? 2 : 1))); + totalrow.append($('Less ticketing fees:').prop('colspan', args.grid.fields.length - (editing ? 2 : 1))); totalrow.append($('').text('($' + revTotalIWT.toFixed(2) + ')')); if (editing) { totalrow.append($('')); diff --git a/sstreasury/views.py b/sstreasury/views.py index 4c857cf..98efecb 100644 --- a/sstreasury/views.py +++ b/sstreasury/views.py @@ -296,6 +296,8 @@ def budget_new(request): revision = models.BudgetRevision() revision.author = request.user revision.time = timezone.now() + revision.ticketing_fee_proportion = settings.TICKETING_FEE_PROPORTION + revision.ticketing_fee_fixed = settings.TICKETING_FEE_FIXED revision.action = models.BudgetAction.CREATE.value revision.state = models.BudgetState.DRAFT.value revision = revision_from_form(budget, revision, request.POST) @@ -335,6 +337,8 @@ def budget_edit(request, budget, revision): new_revision = models.BudgetRevision() new_revision.author = request.user new_revision.time = timezone.now() + new_revision.ticketing_fee_proportion = settings.TICKETING_FEE_PROPORTION + new_revision.ticketing_fee_fixed = settings.TICKETING_FEE_FIXED new_revision.action = models.BudgetAction.EDIT.value new_revision.state = revision.state new_revision = revision_from_form(budget, new_revision, request.POST)