summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMagnus Hagander2025-12-03 21:32:05 +0000
committerMagnus Hagander2025-12-03 23:08:43 +0000
commit9a3866ba14fa596ec14c38bf6008c9e118b1864e (patch)
tree6e858969c1ba6deab3848cac2d169e819ea00c4e
parentabee61f235868269ec914891aa85bdade41f7b43 (diff)
Add warning messages for badly configured refund patterns
For refund patterns to work well, there should be no gaps (a day in between two defined patterns where there are suddenly no refunds would be strange) and it should have something open-ended at the beginning.
-rw-r--r--postgresqleu/confreg/backendforms.py31
1 files changed, 30 insertions, 1 deletions
diff --git a/postgresqleu/confreg/backendforms.py b/postgresqleu/confreg/backendforms.py
index a094836f..8a05714c 100644
--- a/postgresqleu/confreg/backendforms.py
+++ b/postgresqleu/confreg/backendforms.py
@@ -19,7 +19,7 @@ from urllib.parse import urlparse
from psycopg2.extras import DateTimeTZRange
import zoneinfo
-from postgresqleu.util.db import exec_to_single_list, exec_to_scalar
+from postgresqleu.util.db import exec_to_single_list, exec_to_scalar, exec_to_list
from postgresqleu.util.crypto import generate_rsa_keypair
from postgresqleu.util.forms import SelectSetValueField
from postgresqleu.util.widgets import StaticTextWidget, EmailTextWidget, MonospaceTextarea
@@ -769,6 +769,35 @@ class BackendRefundPatternForm(BackendForm):
p.todate + xform if p.todate else '<empty>',
) for p in patterns]
+ @classmethod
+ def get_warning_text(cls, conference):
+ patterns = list(RefundPattern.objects.filter(conference=conference))
+ if not patterns:
+ return None
+
+ issues = []
+ if not next((r for r in patterns if r.todate and not r.fromdate), None):
+ issues.append('There is no refund pattern with an open-ended start')
+
+ for fromdate, todate, lagdate, lagdays in exec_to_list("""WITH t AS (
+ SELECT fromdate, todate, lag(todate) OVER (w) AS prevdate, fromdate - lag(todate) OVER (w) as lag
+ FROM confreg_refundpattern
+ WHERE conference_id=%(confid)s AND (fromdate IS NOT NULL OR todate IS NOT NULL)
+ WINDOW w AS (ORDER BY fromdate NULLS FIRST)
+) SELECT * FROM t WHERE lag > 1""", {'confid': conference.id}):
+ issues.append('There is a gap of {} days between {} and {}'.format(lagdays, lagdate, fromdate))
+
+ for r1, r2 in exec_to_list("""WITH t AS (
+ SELECT daterange(fromdate, todate, '[]') AS dr
+ FROM confreg_refundpattern
+ WHERE conference_id=%(confid)s AND (fromdate IS NOT NULL OR todate IS NOT NULL)
+) SELECT a.dr, b.dr FROM t a INNER JOIN t b ON a.dr && b.dr AND a.dr != b.dr ORDER BY 1""", {'confid': conference.id}):
+ issues.append('Date range {} overlaps with {}'.format(r1, r2))
+
+ if issues:
+ return "<ul>{}</ul>".format("".join("<li>{}</li>".format(i) for i in issues))
+ return None
+
class ConferenceSessionSlideForm(BackendForm):
helplink = 'callforpapers#slides'