From c00b0f82834435e50cdb04cb16cd642bf5464c07 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Dominik=20Pant=C5=AF=C4=8Dek?= Date: Mon, 18 Dec 2023 10:42:29 +0100 Subject: [PATCH 01/11] Increase membership fees starting 2024-01. --- src/specification.scm | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/specification.scm b/src/specification.scm index 310d8d4..b2bc5bf 100644 --- a/src/specification.scm +++ b/src/specification.scm @@ -39,7 +39,8 @@ ;; Convert into lookups - a list of (list period regular student) (define member-fees-lookup-table (make-cal-period-lookup-table - '(((2010 1) 500 250)))) + '(((2010 1) 500 250) + ((2024 1) 1000 250)))) ;; Exchange rates (define exchange-rates-lookup-table From 259a2664a00e058c85d1aa04492f6fba0af9066f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Dominik=20Pant=C5=AF=C4=8Dek?= Date: Mon, 18 Dec 2023 22:39:52 +0100 Subject: [PATCH 02/11] Parse feestart/feestop as generic start/stop. --- src/brmember-parser.scm | 15 +++++++++++---- src/members-print.scm | 2 +- 2 files changed, 12 insertions(+), 5 deletions(-) diff --git a/src/brmember-parser.scm b/src/brmember-parser.scm index 8068404..4ad58a4 100644 --- a/src/brmember-parser.scm +++ b/src/brmember-parser.scm @@ -59,7 +59,8 @@ councilstart councilstop revisionstart revisionstop grantstart grantstop - joined destroyed)) + joined destroyed + feestart feestop)) (define ignored-keys '(mail2)) (define known-keys (append mandatory-keys optional-keys)) @@ -83,6 +84,9 @@ (joined member start) (destroyed member stop) + + (feestart fee start) + (feestop fee stop) )) (define start-stop-markers (map car start-stop-markers-lookup)) @@ -109,7 +113,7 @@ (info ,(lambda (mr output key value) (case key - ((student suspend member revision chair council grant) + ((student suspend member revision chair council grant fee) (let* ((res (period-markers->cal-periods value)) (ok? (car res)) (periods (cadr res)) @@ -159,7 +163,10 @@ mr0 (cdr value) "Whitespace not allowed in nick" 3 'error) mr0))) (else - (brmember-sub-set mr output key (car value)))))))) + (brmember-sub-set mr output key (car value)))))) + (fee + ,(lambda (mr output key value) + mr)))) ;; Pass 4: Final checks - add defaults (define (member-schema-finalize mr) @@ -253,7 +260,7 @@ (caar passes) (interpreter-pass mr pass-name (ldict-ref mr prev-name) pass-proc))))))) - ;; Loads member file source. Performs passes 0, 1 and 2. + ;; Loads member file source. Performs passes 0-4 (define (load-brmember-file mr) (let* ((mrif (brmember-input-file mr)) (source (read-lines mrif)) diff --git a/src/members-print.scm b/src/members-print.scm index 86e14c1..adf90c4 100644 --- a/src/members-print.scm +++ b/src/members-print.scm @@ -114,7 +114,7 @@ (caddr c))) (brmember-credit mr)) #:border '(((#:right light) ... none) ...)))) - ((suspend student member council chair revision grant) + ((suspend student member council chair revision grant fee) (let* ((pdata (cons (list "Since" "Until") (map (lambda (p) From 055f7ba030a035c54d1c946aa3d87394f2ef2dd4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Dominik=20Pant=C5=AF=C4=8Dek?= Date: Mon, 18 Dec 2023 22:56:23 +0100 Subject: [PATCH 03/11] Parsing of amount in fee period specification. --- src/brmember-parser.scm | 31 ++++++++++++++++++++++--------- src/cal-period.scm | 10 ++++++++++ 2 files changed, 32 insertions(+), 9 deletions(-) diff --git a/src/brmember-parser.scm b/src/brmember-parser.scm index 4ad58a4..71e5637 100644 --- a/src/brmember-parser.scm +++ b/src/brmember-parser.scm @@ -116,7 +116,23 @@ ((student suspend member revision chair council grant fee) (let* ((res (period-markers->cal-periods value)) (ok? (car res)) - (periods (cadr res)) + (periods0 (cadr res)) + (periods + (if (eq? key 'fee) + (let ((ps + (map + (lambda (p) + (let* ((sc (cal-period-scomment p)) + (scp (string-first+rest sc)) + (amts (car scp)) + (amt (string->number amts)) + (rc (cdr scp))) + (set-cal-period-scomment + p + (list amt rc)))) + periods0))) + ps) + periods0)) (msg (caddr res)) (line-number (cadddr res)) (mr1 (brmember-sub-set mr output key periods))) @@ -125,10 +141,10 @@ (brmember-add-highlight mr1 line-number msg 3 'error)))) ((card desfire) (brmember-sub-set mr output key - (map - (lambda (rec) - (string-first+rest (car rec))) - value))) + (map + (lambda (rec) + (string-first+rest (car rec))) + value))) ((credit) (let loop ((mr mr) (src-credits value) @@ -163,10 +179,7 @@ mr0 (cdr value) "Whitespace not allowed in nick" 3 'error) mr0))) (else - (brmember-sub-set mr output key (car value)))))) - (fee - ,(lambda (mr output key value) - mr)))) + (brmember-sub-set mr output key (car value)))))))) ;; Pass 4: Final checks - add defaults (define (member-schema-finalize mr) diff --git a/src/cal-period.scm b/src/cal-period.scm index 74c6e15..48c29ba 100644 --- a/src/cal-period.scm +++ b/src/cal-period.scm @@ -43,6 +43,8 @@ cal-period-before cal-period-scomment cal-period-bcomment + + set-cal-period-scomment period-markers->cal-periods @@ -142,6 +144,14 @@ (define cal-period-scomment cadddr) (define cal-period-bcomment (compose cadddr cdr)) + ;; Direct updater + (define (set-cal-period-scomment p c) + (list TAG-CAL-PERIOD + (cal-period-since p) + (cal-period-before p) + c + (cal-period-bcomment p))) + ;; Type predicate (define (cal-period? p) (and (pair? p) From b9030db455a0e3c364e0c055cbd185384dee21c4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Dominik=20Pant=C5=AF=C4=8Dek?= Date: Mon, 18 Dec 2023 23:02:35 +0100 Subject: [PATCH 04/11] Formatting of new fee period amounts. --- src/members-print.scm | 23 ++++++++++++++++++++++- 1 file changed, 22 insertions(+), 1 deletion(-) diff --git a/src/members-print.scm b/src/members-print.scm index adf90c4..cc16605 100644 --- a/src/members-print.scm +++ b/src/members-print.scm @@ -114,7 +114,7 @@ (caddr c))) (brmember-credit mr)) #:border '(((#:right light) ... none) ...)))) - ((suspend student member council chair revision grant fee) + ((suspend student member council chair revision grant) (let* ((pdata (cons (list "Since" "Until") (map (lambda (p) @@ -132,6 +132,27 @@ ;;(print pdata) ;;(write ptbl)(newline) (list k ptbl))) + ((fee) + (let* ((pdata + (cons + (list "Amount" "Since" "Until") + (map + (lambda (p) + (list + (format "\t~A" (car (cal-period-scomment p))) + (string-append (cal-day/month->string + (cal-period-since p)) " " + (or (cadr (cal-period-scomment p)) "")) + (string-append (cal-day/month->string + (cal-period-before p)) " " + (or (cal-period-bcomment p) "")))) + v))) + (ptbl (table->string + pdata + #:border '(((#:right light) ... none) ...)))) + ;;(print pdata) + ;;(write ptbl)(newline) + (list k ptbl))) (else (if v (list k v) From 28dd25998b2840ef938a2ef7504b80cc5c2729b3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Dominik=20Pant=C5=AF=C4=8Dek?= Date: Sat, 23 Dec 2023 19:48:43 +0100 Subject: [PATCH 05/11] Match fee periods properly. --- src/brmember.scm | 14 ++++++++++++++ src/cal-period.scm | 15 +++++++++++++++ src/members-fees.scm | 6 +++++- 3 files changed, 34 insertions(+), 1 deletion(-) diff --git a/src/brmember.scm b/src/brmember.scm index 8603e36..51db8bd 100644 --- a/src/brmember.scm +++ b/src/brmember.scm @@ -85,6 +85,8 @@ brmember-mailman brmember-add-mailman + brmember-spec-fee + brmember-tests! ) @@ -478,6 +480,18 @@ (cons ml (brmember-mailman mr)))) + ;; Returns special fee for current month or #f if it should be default + (define (brmember-spec-fee mr) + (let ((fee-periods (brmember-info mr 'fee #f))) + (if fee-periods + (let ((fee-period (cal-month-find-period fee-periods))) + (if fee-period + (let () + (print fee-period) + #t) + #f)) + #f))) + ;; Self-tests (define (brmember-tests!) (run-tests diff --git a/src/cal-period.scm b/src/cal-period.scm index 48c29ba..ea1cf3d 100644 --- a/src/cal-period.scm +++ b/src/cal-period.scm @@ -53,6 +53,8 @@ cal-month-in-period? cal-month-in-periods? + cal-month-find-period + cal-day-in-period? cal-day-in-periods? @@ -265,6 +267,19 @@ #t (loop (cdr ps))))))) + ;; Returns true if given month is in at least one of the periods + ;; given. Defaults to current month. + (define (cal-month-find-period ps . ml) + (let ((m (if (null? ml) + (*current-month*) + (car ml)))) + (let loop ((ps ps)) + (if (null? ps) + #f + (if (cal-month-in-period? (car ps) m) + (car ps) + (loop (cdr ps))))))) + ;; Checks whether given day belongs to day or month period (define (cal-day-in-period? p . dl) (let ((d (if (null? dl) diff --git a/src/members-fees.scm b/src/members-fees.scm index 1d92ab9..6659fcb 100644 --- a/src/members-fees.scm +++ b/src/members-fees.scm @@ -85,7 +85,11 @@ (cons (list cm (with-current-month cm - (brmember-flags mr))) + (brmember-flags mr)) + ;; TODO: the following needs to be handled everywhere + (with-current-month + cm + (brmember-spec-fee mr))) cal)))))) ;; Returns the first month of the calendar From c987ac6c8104e5c96e2c42be8b3d67f3eb56300e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Dominik=20Pant=C5=AF=C4=8Dek?= Date: Sat, 23 Dec 2023 19:57:40 +0100 Subject: [PATCH 06/11] Use specific fee in all computations. --- src/brmember.scm | 3 +-- src/members-fees.scm | 9 ++++++--- 2 files changed, 7 insertions(+), 5 deletions(-) diff --git a/src/brmember.scm b/src/brmember.scm index 51db8bd..fb9e07e 100644 --- a/src/brmember.scm +++ b/src/brmember.scm @@ -487,8 +487,7 @@ (let ((fee-period (cal-month-find-period fee-periods))) (if fee-period (let () - (print fee-period) - #t) + (car (cal-period-scomment fee-period))) #f)) #f))) diff --git a/src/members-fees.scm b/src/members-fees.scm index 6659fcb..a77affd 100644 --- a/src/members-fees.scm +++ b/src/members-fees.scm @@ -86,7 +86,6 @@ (with-current-month cm (brmember-flags mr)) - ;; TODO: the following needs to be handled everywhere (with-current-month cm (brmember-spec-fee mr))) @@ -115,7 +114,9 @@ (ansi-string #:bgblack "\xc2\xa0\xc2\xa0") ; Destroyed (if (member 'student (cadr e)) (ansi-string #:bgyellow "\xc2\xa0\xc2\xa0") ; Student - (ansi-string #:bggreen "\xc2\xa0\xc2\xa0")))) ; Normal + (if (caddr e) + (ansi-string #:bgblue (format "~a" (caddr e))) + (ansi-string #:bggreen "\xc2\xa0\xc2\xa0"))))) ; Normal "\xc2\xa0\xc2\xa0") ; Nonexistent - should not happen "\xc2\xa0\xc2\xa0")) ; Nonexistent @@ -129,7 +130,9 @@ 0 ; Destroyed (if (member 'student (cadr e)) (lookup-member-fee 'student) ; Student - (lookup-member-fee 'regular)))) ; Normal + (if (caddr e) + (caddr e) + (lookup-member-fee 'regular))))) ; Normal 0) ; Nonexistent - should not happen 0)) ; Nonexistent From af5976ad436b7313a83d2200266d8103ccfe0873 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Dominik=20Pant=C5=AF=C4=8Dek?= Date: Sat, 23 Dec 2023 20:52:01 +0100 Subject: [PATCH 07/11] Add changelog. --- CHANGELOG.md | 136 +++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 136 insertions(+) create mode 100644 CHANGELOG.md diff --git a/CHANGELOG.md b/CHANGELOG.md new file mode 100644 index 0000000..6c593ff --- /dev/null +++ b/CHANGELOG.md @@ -0,0 +1,136 @@ +ChangeLog +========= + +1.15 +---- + +* increase membership fees starting 2024-01 (specification.rkt) +* add support for explicit fee amounts for specified period + +1.14 +---- + +* add support for dynamic terminal size +* use table cell formatting instead of paragraph formatting everywhere +* fix sqlite3 database locking issue +* allow limiting -fees output to -active only + +1.13 +---- + +* add dokuwiki problems to summary emails +* handle more SEPA payments + +1.12 +---- + +* switch to eggs: srfi-1, sqlite3 +* semi-automatic export for brmdoor +* improvements of summary emails for council +* redirect dokuwiki plugin to login page if not logged in +* sync council and revision mailing lists + +1.11 +---- + +* add support for CC in emails +* update manual page +* setup new cron jobs + +1.10 +---- + +* direct access of mailman 3 database + +1.9 +--- + +* implement support for mailman 3 +* add total debt to long-term debtors listings + +1.8 +--- + +* remove old compatibility static web pages generator +* update documentation +* update Fio fetcher to handle new limits imposed by the bank +* output plain list of active members (used by BrmBar project) + +1.7 +--- + +* include current month in stats +* right-alignment in table cells +* functionality improvements of dokuwiki plugin +* checking council group between dokuwiki and members database + +1.6 +--- + +* dokuwiki plugin +* delete generated files for destroyed members +* verify dokuwiki users information + +1.5 +--- + +* improved table renderer +* show membership fees and payments balances history +* improved generator of static web pages + +1.4 +--- + +* vim and joe syntax highlighting support +* improved Fio bank statement fetcher and merger + +1.3 +--- + +* organizational bodies membership + +1.2 +--- + +* split configuration and action command-line options +* support for git annotate +* show suspended members that are about to expire +* optimized utf-8 support + +1.1 +--- + +* support for suppressing output (used in cron jobs) +* sorted members in notifications +* report missing keys in member files +* internal ML membership synchronization + +1.0 +--- + +This was the first oficially released version which contains all the +functionality required to take over the original solution. + +* parsing and interpreting member files with specified grammar +* basic support for start/stop periods +* command-line arguments support with integrated help display +* static builds +* cards export for BrmDoor project +* data validation and error reporting +* improved manual credit handling +* member id validation and generation +* export of gnuplot-compatible statistics +* static web data generation +* table formatting with color support +* member fees and payments accounting +* support for multiple join/destroy periods +* period-based exchange rates lookups +* unpaired transactions handling +* internal ML membership check +* notifications for both council and members with debts +* universal Fio bank account statement fetcher +* preliminary SEPA payment parsing +* programming modules documentation +* git status support +* sample configuration +* manual page From 0b70563b101ff7b12dcc0748b3563f2e82817841 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Dominik=20Pant=C5=AF=C4=8Dek?= Date: Sun, 24 Dec 2023 21:25:22 +0100 Subject: [PATCH 08/11] Support for multiple phones. --- src/brmember-parser.scm | 7 ++++--- src/members-print.scm | 2 +- 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/src/brmember-parser.scm b/src/brmember-parser.scm index 71e5637..4c35225 100644 --- a/src/brmember-parser.scm +++ b/src/brmember-parser.scm @@ -48,7 +48,7 @@ cal-day) ;; Pass 2: known keys - (define mandatory-keys '(nick name mail phone)) + (define mandatory-keys '(nick name mail)) (define optional-keys '(born)) (define known-multikeys '(card desfire @@ -60,7 +60,8 @@ revisionstart revisionstop grantstart grantstop joined destroyed - feestart feestop)) + feestart feestop + phone)) (define ignored-keys '(mail2)) (define known-keys (append mandatory-keys optional-keys)) @@ -139,7 +140,7 @@ (if ok? mr1 (brmember-add-highlight mr1 line-number msg 3 'error)))) - ((card desfire) + ((card desfire phone) (brmember-sub-set mr output key (map (lambda (rec) diff --git a/src/members-print.scm b/src/members-print.scm index cc16605..fad53e6 100644 --- a/src/members-print.scm +++ b/src/members-print.scm @@ -97,7 +97,7 @@ (body (map (lambda (k) (let ((v (ldict-ref info k))) (case k - ((card desfire) + ((card desfire phone) (list k (table->string (map From 4f59fbc6cf1c4b68b96b3d4520510e0c33f3ae38 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Dominik=20Pant=C5=AF=C4=8Dek?= Date: Sun, 24 Dec 2023 21:27:36 +0100 Subject: [PATCH 09/11] Document member file format changes. --- doc/formats.md | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/doc/formats.md b/doc/formats.md index ac5ccb8..36f8a73 100644 --- a/doc/formats.md +++ b/doc/formats.md @@ -56,7 +56,6 @@ Processed source is scanned for known keys. Known keys are: * nick * name * mail -* phone * born Multiple instances of single key are considered an error. @@ -83,6 +82,7 @@ line numbers as the value for such key. Multikeys are: * revisionstop * grantstart * grantstop +* phone The result is a valid dictionary of keys and multikeys. @@ -104,7 +104,8 @@ periods. The joined key is converted into a month value. Card and desfire lists are parsed to get lists of card id and optional -comment. +comment. The same processing is used for phone to support multiple +phone numbers. Credit list is parsed to get a list of amounts and optional comments. From 5f03e0c251bdf790a7cf9ad2c130f32d5ee5e5d7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Dominik=20Pant=C5=AF=C4=8Dek?= Date: Sun, 24 Dec 2023 21:33:53 +0100 Subject: [PATCH 10/11] Another SEPA parser. --- src/members-payments.scm | 15 ++++++++++++--- 1 file changed, 12 insertions(+), 3 deletions(-) diff --git a/src/members-payments.scm b/src/members-payments.scm index bf2c416..8c8fc41 100644 --- a/src/members-payments.scm +++ b/src/members-payments.scm @@ -90,12 +90,21 @@ (substring msg 0 ci2) msg)) (ci3 (substring-index "NULL" msg)) - (vs3 (if ci3 + (vs3 (if (and ci3 + (>= (string-length msg) (+ ci3 8))) (substring msg (+ ci3 4) (+ ci3 4 4)) - msg))) + msg)) + (ci4 (substring-index "VS" msg)) + (vs4 (if (and ci4 + (>= (string-length msg) (+ ci4 6))) + (substring msg (+ ci4 2) (+ ci4 6)) + msg)) + ) (or (string->number vs1) (string->number vs2) - (string->number vs3)))))) + (string->number vs3) + (string->number vs4) + ))))) varsym-id))) ;; Special comparator (originally with JendaSAP hack) From 778f89717f31ab02db866ad6d08570c1fee349f1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Dominik=20Pant=C5=AF=C4=8Dek?= Date: Sun, 24 Dec 2023 21:35:38 +0100 Subject: [PATCH 11/11] Bump version to 1.15 --- src/texts.scm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/texts.scm b/src/texts.scm index 2ee52b7..6108737 100644 --- a/src/texts.scm +++ b/src/texts.scm @@ -39,7 +39,7 @@ (chicken format)) ;; Short banner - (define banner-line "HackerBase 1.14 (c) 2023 Brmlab, z.s.") + (define banner-line "HackerBase 1.15 (c) 2023 Brmlab, z.s.") ;; Banner source with numbers for ANSI CSI SGR (define banner-source "