Fix computing expected income based on actual fees and discounts.

This commit is contained in:
Dominik Pantůček 2024-02-09 14:28:17 +01:00
parent dc3044026c
commit 15888b7e3e
2 changed files with 40 additions and 29 deletions

View file

@ -30,6 +30,7 @@
( (
lookup-member-fee lookup-member-fee
member-calendar member-calendar
make-member-calendar-entry
member-calendar-first-month member-calendar-first-month
member-calendar-last-month member-calendar-last-month
member-calendar-query member-calendar-query
@ -82,15 +83,17 @@
(if (cal-month>? cm last-month) (if (cal-month>? cm last-month)
(reverse cal) (reverse cal)
(loop (cal-month-add cm) (loop (cal-month-add cm)
(cons (list cm (cons (with-current-month
(with-current-month cm
cm (make-member-calendar-entry mr))
(brmember-flags mr))
(with-current-month
cm
(brmember-spec-fee mr)))
cal)))))) cal))))))
;; Assumes current-month is specified correctly
(define (make-member-calendar-entry mr)
(list (*current-month*)
(brmember-flags mr)
(brmember-spec-fee mr)))
;; Returns the first month of the calendar ;; Returns the first month of the calendar
(define (member-calendar-first-month mc) (define (member-calendar-first-month mc)
(caar mc)) (caar mc))

View file

@ -500,7 +500,17 @@
(null? (cdr dsa))) (null? (cdr dsa)))
#f #f
(cadr dsa)))) (cadr dsa))))
(let* ((members ;; Pass 1 (let* ((raw-members
(sort
(if destroyed?
(find-members-by-predicate MB (lambda x #t))
(if only-active?
(find-members-by-predicate MB (lambda (mr)
(brmember-active? mr)))
(find-members-by-predicate MB (lambda (mr)
(not (brmember-destroyed? mr))))))
brmember<?))
(members ;; Pass 1
(map (map
(lambda (mr) (lambda (mr)
(let* ((balance (member-balance mr)) (let* ((balance (member-balance mr))
@ -522,15 +532,7 @@
total total
balance balance
))) )))
(sort raw-members))
(if destroyed?
(find-members-by-predicate MB (lambda x #t))
(if only-active?
(find-members-by-predicate MB (lambda (mr)
(brmember-active? mr)))
(find-members-by-predicate MB (lambda (mr)
(not (brmember-destroyed? mr))))))
brmember<?)))
(balances (map (lambda (m) (balances (map (lambda (m)
(list-ref m 6)) (list-ref m 6))
members))) members)))
@ -598,19 +600,25 @@
(map (lambda (member) (map (lambda (member)
(min 0 (list-ref member 5))) (min 0 (list-ref member 5)))
members))) members)))
(let* ((ns (foldl (lambda (acc member) (let* ((flst
(cons (+ (car acc) (if (eq? 'student (cadr member)) 1 0)) (map (compose member-calendar-entry->fee make-member-calendar-entry)
(+ (cdr acc) (if (eq? 'active (cadr member)) 1 0)))) (filter brmember-active? raw-members)))
(cons 0 0) (amts (sort (delete-duplicates flst) <))
members)) (sums
(students (car ns)) (map
(full (cdr ns))) (lambda (amt)
(cons amt
(length (filter (lambda (v) (= v amt)) flst))))
amts))
)
(print "Expected income: " (print "Expected income: "
(+ (* (lookup-member-fee 'normal) full) (string-intersperse (map
(* (lookup-member-fee 'student) students)) (lambda (p)
" (" full " full members + " students " students)")) (format "~A*~A" (cdr p) (car p)))
) sums)
)) " + ")
" = "
(foldl + 0 (map (lambda (p) (* (car p) (cdr p))) sums)))))))
(define (unpaired-table mb . args) (define (unpaired-table mb . args)
(apply (apply