Show number of invoiced registrations on admin dashboard
authorMagnus Hagander <magnus@hagander.net>
Wed, 12 Sep 2018 10:44:32 +0000 (12:44 +0200)
committerMagnus Hagander <magnus@hagander.net>
Wed, 12 Sep 2018 10:44:32 +0000 (12:44 +0200)
This separates out the count of invoiced (which includes both directly
invoiced and invoiced through bulk payment) registrations from unconfirmed.

postgresqleu/confreg/views.py

index 90070e6816b29b316daf8d6ffaf6f5e88fa51320..04bce4c377335226573f778390c54f8c70481a00 100644 (file)
@@ -2503,26 +2503,49 @@ def admin_registration_dashboard(request, urlname):
        tables = []
 
        # Registrations by reg type
-       curs.execute("SELECT regtype, count(payconfirmedat) AS confirmed, count(r.id) FILTER (WHERE payconfirmedat IS NULL) AS unconfirmed, count(r.id) AS total FROM confreg_conferenceregistration r RIGHT JOIN confreg_registrationtype rt ON rt.id=r.regtype_id WHERE rt.conference_id={0} GROUP BY rt.id ORDER BY rt.sortkey".format(conference.id))
+       curs.execute("""SELECT regtype,
+ count(payconfirmedat) AS confirmed,
+ count(r.id) FILTER (WHERE payconfirmedat IS NULL AND (r.invoice_id IS NOT NULL OR bp.invoice_id IS NOT NULL)) AS invoiced,
+ count(r.id) FILTER (WHERE payconfirmedat IS NULL AND (r.invoice_id IS NULL AND bp.invoice_id IS NULL)) AS unconfirmed,
+ count(r.id) AS total
+FROM confreg_conferenceregistration r
+RIGHT JOIN confreg_registrationtype rt ON rt.id=r.regtype_id
+LEFT JOIN confreg_bulkpayment bp ON bp.id=r.bulkpayment_id
+WHERE rt.conference_id={0}
+GROUP BY rt.id ORDER BY rt.sortkey""".format(conference.id))
        tables.append({'title': 'Registration types',
-                                  'columns': ['Type', 'Confirmed', 'Unconfirmed', 'Total'],
+                                  'columns': ['Type', 'Confirmed', 'Invoiced', 'Unconfirmed', 'Total'],
                                   'fixedcols': 1,
                                   'rows': curs.fetchall()},)
 
        # Copy/paste string to get the reg status
-       statusstr = "{0}, count(payconfirmedat) AS confirmed, count(r.id) FILTER (WHERE payconfirmedat IS NULL) AS unconfirmed, count(r.id) AS total, CASE WHEN {0} > 0 THEN {0}-count(r.id) ELSE NULL END AS remaining"
+       statusstr = """{0},
+ count(payconfirmedat) AS confirmed,
+ count(r.id) FILTER (WHERE payconfirmedat IS NULL AND (r.invoice_id IS NOT NULL)) AS invoiced,
+ count(r.id) FILTER (WHERE payconfirmedat IS NULL AND (r.invoice_id IS NULL)) AS unconfirmed,
+ count(r.id) AS total,
+ CASE WHEN {0} > 0 THEN {0}-count(r.id) ELSE NULL END AS remaining"""
 
        # Additional options
-       curs.execute("SELECT ao.name, {0} FROM confreg_conferenceregistration r INNER JOIN confreg_conferenceregistration_additionaloptions rao ON rao.conferenceregistration_id=r.id RIGHT JOIN confreg_conferenceadditionaloption ao ON ao.id=rao.conferenceadditionaloption_id WHERE ao.conference_id={1} GROUP BY ao.name, ao.maxcount ORDER BY ao.name".format(statusstr.format('ao.maxcount'), conference.id))
+       curs.execute("""SELECT ao.name, {0}
+FROM confreg_conferenceregistration r
+INNER JOIN confreg_conferenceregistration_additionaloptions rao ON rao.conferenceregistration_id=r.id
+RIGHT JOIN confreg_conferenceadditionaloption ao ON ao.id=rao.conferenceadditionaloption_id
+LEFT JOIN confreg_bulkpayment bp ON bp.id=r.bulkpayment_id
+WHERE ao.conference_id={1} GROUP BY ao.name, ao.maxcount ORDER BY ao.name""".format(statusstr.format('ao.maxcount'), conference.id))
        tables.append({'title': 'Additional options',
-                                  'columns': ['Name', 'Max uses', 'Confirmed', 'Unconfirmed', 'Total', 'Remaining'],
+                                  'columns': ['Name', 'Max uses', 'Confirmed', 'Invoiced', 'Unconfirmed', 'Total', 'Remaining'],
                                   'fixedcols': 1,
                                   'rows': curs.fetchall()})
 
        # Discount codes
-       curs.execute("SELECT code, validuntil, {0} FROM confreg_conferenceregistration r RIGHT JOIN confreg_discountcode dc ON dc.code=r.vouchercode WHERE dc.conference_id={1} AND (r.conference_id={1} OR r.conference_id IS NULL) GROUP BY dc.id ORDER BY code".format(statusstr.format('maxuses'), conference.id))
+       curs.execute("""SELECT code, validuntil, {0}
+FROM confreg_conferenceregistration r
+RIGHT JOIN confreg_discountcode dc ON dc.code=r.vouchercode
+LEFT JOIN confreg_bulkpayment bp ON bp.id=r.bulkpayment_id
+WHERE dc.conference_id={1} AND (r.conference_id={1} OR r.conference_id IS NULL) GROUP BY dc.id ORDER BY code""".format(statusstr.format('maxuses'), conference.id))
        tables.append({'title': 'Discount codes',
-                                  'columns': ['Code', 'Expires', 'Max uses', 'Confirmed', 'Unconfirmed','Total', 'Remaining'],
+                                  'columns': ['Code', 'Expires', 'Max uses', 'Confirmed', 'Invoiced', 'Unconfirmed','Total', 'Remaining'],
                                   'fixedcols': 2,
                                   'rows': curs.fetchall()})