From 598ae8a2f12203b0e7c3aec28eeaabd6e8ae4a23 Mon Sep 17 00:00:00 2001 From: =?utf8?q?Paul=20H=C3=A4nsch?= Date: Thu, 18 Apr 2024 15:12:46 +0200 Subject: [PATCH 01/16] typo in credit formating function --- ledgers/index.cgi | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ledgers/index.cgi b/ledgers/index.cgi index e9dea1f..621ef82 100755 --- a/ledgers/index.cgi +++ b/ledgers/index.cgi @@ -5,7 +5,7 @@ credit() { printf '%03i\n' "$1" \ - | sed -E 's;[0-9]{2}$;d&; :0 s;([0-9])([0-9]{3}[dm]);\1m\2;; t0; y;dm;,.;' + | sed -E 's;[0-9]{2}$;d&;; :0 s;([0-9])([0-9]{3}[dm]);\1m\2;; t0; y;dm;,.;' } { printf ' -- 2.39.2 From 2b221353de954b91a5a141af21b1816909fa7bc5 Mon Sep 17 00:00:00 2001 From: =?utf8?q?Paul=20H=C3=A4nsch?= Date: Thu, 18 Apr 2024 16:41:35 +0200 Subject: [PATCH 02/16] attendent list in transaction assignment --- ledgers/index.cgi | 8 +++++++- style.css | 20 +++++++++++--------- 2 files changed, 18 insertions(+), 10 deletions(-) diff --git a/ledgers/index.cgi b/ledgers/index.cgi index 621ef82..7cd3464 100755 --- a/ledgers/index.cgi +++ b/ledgers/index.cgi @@ -29,7 +29,7 @@ credit() { done printf ' ]' printf ' - [form .ledgers action="%s/ledgers/delete.sh" method=POST + [form .ibanassign action="%s/ledgers/iban_assign.sh" method=POST [input type=hidden name=session_id value="%s"] [h3 . %s] ' "${_BASE}" "$SESSION_ID" "$(l10n "IBAN Assignments")" @@ -43,11 +43,17 @@ credit() { : elif [ $state = guess ]; then record="$(UNSTRING "${data%% *}")" + cards="${data#* }" principal="${record#* * * }" principal="${principal%% *}" subject="${record#* * * * }" subject="${subject%% *}" amount="${record#* * * * * }" amount="${amount%% *}" printf '[p .principal . %s][p .amount %s][p .subject . %s]' \ "$(UNSTRING "$principal" |HTML)" "$(credit "$amount")" "$(UNSTRING "$subject" |HTML)" + printf '[h4 . %s]' "$(l10n Guesses)" + for card in $cards; do + uid="${card%%/*}" name="$(UNSTRING "${card#*/}")" + printf '[input .card key="cardfn" value="%s" placeholder="%s"]' "$(HTML "${name}")" "$(l10n attendent)" + done elif [ $state = unknown ]; then principal="${data#* * * }" principal="${principal%% *}" subject="${data#* * * * }" subject="${subject%% *}" diff --git a/style.css b/style.css index b56956f..98b839d 100644 --- a/style.css +++ b/style.css @@ -368,30 +368,32 @@ body.categories form.namelist ul.namelist > li ul li { display: inline-block; } +form.ibanassign, form.ledgers { padding: .125em 1em 0 1em; } -.ledgers fieldset.iban.sure { background-color: #DFD; } -.ledgers fieldset.iban.guess { background-color: #FFD; } -.ledgers fieldset.iban.unknown { background-color: #FDD; } +.ibanassign fieldset.iban.sure { background-color: #DFD; } +.ibanassign fieldset.iban.guess { background-color: #FFD; } +.ibanassign fieldset.iban.unknown { background-color: #FDD; } -.ledgers fieldset.iban { +.ibanassign fieldset.iban { padding: 0 .75em; margin-top: -.5em; box-shadow: .25em .25em .25em #AAA; } -.ledgers fieldset.iban legend { +.ibanassign fieldset.iban legend { top: .75em; } -.ledgers fieldset.iban p.principal { +.ibanassign fieldset.iban p.principal { font-size: .875em; } -.ledgers fieldset.iban p.amount, -.ledgers fieldset.iban p.subject { +.ibanassign fieldset.iban p.amount, +.ibanassign fieldset.iban p.subject { display: inline-block; vertical-align: top; } -.ledgers fieldset.iban p.amount { +.ibanassign fieldset.iban p.amount { font-weight: bold; + margin-right: .75em; } -- 2.39.2 From 7658855512f84528af734a2a90f48cfed8d48d5c Mon Sep 17 00:00:00 2001 From: =?utf8?q?Paul=20H=C3=A4nsch?= Date: Thu, 18 Apr 2024 20:25:04 +0200 Subject: [PATCH 03/16] auto complete in attendant fields --- ledgers/index.cgi | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/ledgers/index.cgi b/ledgers/index.cgi index 7cd3464..87af8b1 100755 --- a/ledgers/index.cgi +++ b/ledgers/index.cgi @@ -33,6 +33,12 @@ credit() { [input type=hidden name=session_id value="%s"] [h3 . %s] ' "${_BASE}" "$SESSION_ID" "$(l10n "IBAN Assignments")" + printf '[datalist id=lattendants .' + pdi_load "${_DATA}"/vcard/*.vcf |sed -n '/^FN\;:/!b; s;^FN\;:;;; p;' \ + | while read name; do + printf '[option value="%s"]' "$(HTML "$name")" + done + printf ']' { pdi_load "${_DATA}"/vcard/*.vcf cat "${_DATA}"/ledgers/????-??-??\ -\ ????-??-??\ -\ ????.tbl } | "${_EXEC}"/ledgers/iban_assign.awk \ @@ -52,7 +58,7 @@ credit() { printf '[h4 . %s]' "$(l10n Guesses)" for card in $cards; do uid="${card%%/*}" name="$(UNSTRING "${card#*/}")" - printf '[input .card key="cardfn" value="%s" placeholder="%s"]' "$(HTML "${name}")" "$(l10n attendent)" + printf '[input .card key="cardfn" value="%s" placeholder="%s" list=lattendants]' "$(HTML "${name}")" "$(l10n attendent)" done elif [ $state = unknown ]; then principal="${data#* * * }" principal="${principal%% *}" -- 2.39.2 From 809dd93745e557690152ed17d0b17f0582cf94dd Mon Sep 17 00:00:00 2001 From: =?utf8?q?Paul=20H=C3=A4nsch?= Date: Fri, 19 Apr 2024 02:01:08 +0200 Subject: [PATCH 04/16] enable IBAN field in card --- cards/l10n.sh | 1 + cards/list.sh | 9 ++++++--- cards/update_card.sh | 2 +- 3 files changed, 8 insertions(+), 4 deletions(-) diff --git a/cards/l10n.sh b/cards/l10n.sh index 2d9dc06..fde98e0 100755 --- a/cards/l10n.sh +++ b/cards/l10n.sh @@ -37,6 +37,7 @@ l10n(){ X-ZACK-LEAVEDATE) printf %s "Abmelde­datum";; X-ZACK-JOINDATE_short) printf %s "Anm.";; X-ZACK-LEAVEDATE_short) printf %s "Abm.";; + X-IBAN) printf %s "IBAN";; *) l10n_global "$word";; esac diff --git a/cards/list.sh b/cards/list.sh index 519005c..9511fc1 100755 --- a/cards/list.sh +++ b/cards/list.sh @@ -31,7 +31,10 @@ edit_card(){ [ $(pdi_count "$card" IMPP) -gt 0 ] && edit_item "$card" IMPP [ $(pdi_count "$card" URL ) -gt 0 ] && edit_item "$card" URL )] - [div .section .address $(edit_item "$card" ADR)] + [div .section .address $( + edit_item "$card" ADR + [ $(pdi_count "$card" X-IBAN) -gt 0 ] && edit_item "$card" X-IBAN + )] [div .section .note $(edit_item "$card" NOTE)] [div .section .attendance [h3 $(l10n course_attendance) ] [div .attendance $( @@ -65,7 +68,7 @@ edit_card(){ [div .item .newfield [select name="newfield" [option value="" disabled="disabled" selected="selected" $(l10n edit_addfieldtext)] - $(for f in NICKNAME EMAIL TEL IMPP ADR URL NOTE X-ZACK-LEAVEDATE; do + $(for f in NICKNAME EMAIL TEL IMPP ADR URL NOTE X-ZACK-LEAVEDATE X-IBAN; do printf '[option value="%s" %s] ' "$f" "$(l10n "$f")" done) ][button type="submit" name="action" value="addfield" $(l10n edit_addfield)] @@ -90,7 +93,7 @@ print_card(){ )] [div .section .phone . $(card_item "$card" TEL)] [div .section .message . $(card_item "$card" EMAIL IMPP URL)] - [div .section .address . $(card_item "$card" ADR)] + [div .section .address . $(card_item "$card" ADR X-IBAN)] [div .section .note . $(card_item "$card" NOTE)] [div .section .attendance [h3 $(l10n course_attendance) ] [ul $(grep -F " ${cardfile##*/}" "$_DATA/mappings/attendance" |while read each discard; do diff --git a/cards/update_card.sh b/cards/update_card.sh index 2b87632..d57f503 100755 --- a/cards/update_card.sh +++ b/cards/update_card.sh @@ -35,7 +35,7 @@ attfile="$_DATA/mappings/attendance" action="$(POST action)" newfield="$(POST newfield |grep -m 1 -xE '[A-Z][A-Z0-9-]*')" -if printf '%s\n' "$action" |grep -qxE 'addfield [A-Z][A-Z0-9]*'; then +if printf '%s\n' "$action" |grep -qxE 'addfield [A-Z][A-Z0-9-]*'; then newfield="${action##* }" action=addfield fi -- 2.39.2 From db5f678bd2105f998bda03345fbd28100412cf69 Mon Sep 17 00:00:00 2001 From: =?utf8?q?Paul=20H=C3=A4nsch?= Date: Fri, 19 Apr 2024 16:12:55 +0200 Subject: [PATCH 05/16] bugfix: do not guess known IBANs --- ledgers/iban_assign.awk | 13 ++++++------- 1 file changed, 6 insertions(+), 7 deletions(-) diff --git a/ledgers/iban_assign.awk b/ledgers/iban_assign.awk index 090d950..eac5b44 100755 --- a/ledgers/iban_assign.awk +++ b/ledgers/iban_assign.awk @@ -41,16 +41,15 @@ BEGIN { /^BEGIN;:VCARD$/ { fn = n = id = iban = tmp = ""; } - /^UID;[^:]*:/ { uid = $0; sub(/^[^;]+;[^:]*:/, "", uid); } - /^FN;[^:]*:/ { fn = $0; sub(/^[^;]+;[^:]*:/, "", fn); } - /^N;[^:]*:/ { n = $0; sub(/^[^;]+;[^:]*:/, "", n); sub(/;.*$/, "", n); } -/^X-IBAN;[^:]*:/ { tmp = $0; sub(/^[^;]+;[^:]*:/, "", tmp); iban = iban ? iban " " tmp : tmp; } + /^UID;[^:]*:/ { uid = $0; sub(/^[^;]+;[^:]*:/, "", uid); } + /^FN;[^:]*:/ { fn = $0; sub(/^[^;]+;[^:]*:/, "", fn); } + /^N;[^:]*:/ { n = $0; sub(/^[^;]+;[^:]*:/, "", n); sub(/;.*$/, "", n); } +/^X-IBAN;[^:]*:/ { iban = $0; sub(/^[^;]+;[^:]*:/, "", iban); ibans[length(ibans)] = iban; } /^END;:VCARD$/ { uid_n[uid] = n; uid_fn[uid] = fn; uid_iban[uid] = iban; - split(iban, ibans, / /); - for (iban in ibans) iban_uid[iban] = iban_uid[iban] ? iban_uid[iban] " " uid : uid; - fn = n = uid = iban = tmp = ""; + for (iban in ibans) iban_uid[ibans[iban]] = iban_uid[ibans[iban]] ? iban_uid[ibans[iban]] " " uid : uid; + fn = n = uid = iban = tmp = ""; split("", ibans); } strftime("%Y-%m-%d", $1, "UTC") == $2 && strftime("%Y-%m-%d", $3, "UTC") == $4 { ledger = 1; } -- 2.39.2 From 819aebfb5343f918d510ba65c56e84ea24496ae6 Mon Sep 17 00:00:00 2001 From: =?utf8?q?Paul=20H=C3=A4nsch?= Date: Sat, 20 Apr 2024 21:32:56 +0200 Subject: [PATCH 06/16] styling for iban assignment --- ledgers/iban_assign.awk | 4 ++-- ledgers/index.cgi | 43 +++++++++++++++++++++++++++++++--------- style.css | 44 ++++++++++++++++++++++++++++++++++++++--- 3 files changed, 77 insertions(+), 14 deletions(-) diff --git a/ledgers/iban_assign.awk b/ledgers/iban_assign.awk index eac5b44..68a5727 100755 --- a/ledgers/iban_assign.awk +++ b/ledgers/iban_assign.awk @@ -73,8 +73,8 @@ ledger && strftime("%Y-%m-%d", $2, "UTC") == $1 { END { for (iban in sure) { line = "sure " iban; - split(iban_uid[iban], uids, / /); - for (uid in uids) line = line " " STRING(uid "/" uid_fn[uid]); + split(sure[iban], uids, / /); + for (k in uids) line = line " " STRING(uids[k] "/" uid_fn[uids[k]]); print line; } for (iban in unsure) { diff --git a/ledgers/index.cgi b/ledgers/index.cgi index 87af8b1..dbf8ee8 100755 --- a/ledgers/index.cgi +++ b/ledgers/index.cgi @@ -39,33 +39,58 @@ credit() { printf '[option value="%s"]' "$(HTML "$name")" done printf ']' + l10n_attendant="$(l10n attendant)" { pdi_load "${_DATA}"/vcard/*.vcf cat "${_DATA}"/ledgers/????-??-??\ -\ ????-??-??\ -\ ????.tbl } | "${_EXEC}"/ledgers/iban_assign.awk \ | while read -r state iban data; do printf '[fieldset .iban .%s [legend . %s ]' \ "$state" "$iban" - if [ $state = sure ]; then + if [ $state = sure ]; then + for card in $data; do + uid="${card%%/*}" name="$(UNSTRING "${card#*/}")" + printf '[span .card . %s]' "$(HTML "${name}")" + done : elif [ $state = guess ]; then record="$(UNSTRING "${data%% *}")" cards="${data#* }" + date="${record%% *}" principal="${record#* * * }" principal="${principal%% *}" subject="${record#* * * * }" subject="${subject%% *}" amount="${record#* * * * * }" amount="${amount%% *}" - printf '[p .principal . %s][p .amount %s][p .subject . %s]' \ - "$(UNSTRING "$principal" |HTML)" "$(credit "$amount")" "$(UNSTRING "$subject" |HTML)" - printf '[h4 . %s]' "$(l10n Guesses)" - for card in $cards; do - uid="${card%%/*}" name="$(UNSTRING "${card#*/}")" - printf '[input .card key="cardfn" value="%s" placeholder="%s" list=lattendants]' "$(HTML "${name}")" "$(l10n attendent)" + printf '[p .principal . %s][p .date %s][p .amount %s][p .subject . %s]' \ + "$(UNSTRING "$principal" |HTML)" "$date" "$(credit "$amount")" "$(UNSTRING "$subject" |HTML)" + n=0; for card in $cards; do + n=$((n+1)); uid="${card%%/*}" name="$(UNSTRING "${card#*/}")" + cat <<-EOF + [input type=checkbox id="check_${iban}_$n" name="check_${iban}_$n" value=true checked=checked] + [input .card name="fn_${iban}_$n" value="$(HTML "$name")" disabled=disabled] + [label .del for="check_${iban}_$n" . -] + EOF + done + for m in 1 2 3 4 5 6 7 8; do + cat <<-EOF + [input type=checkbox id="check_${iban}_$((n+m))" name="check_${iban}_$((n+m))" value=false] + [input .card name="fn_${iban}_$((n+m))" value="" placeholder="${l10n_attendant}" list="lattendants"] + [label .add for="check_${iban}_$((n+m))" . +] + EOF done elif [ $state = unknown ]; then + date="${data%% *}" principal="${data#* * * }" principal="${principal%% *}" subject="${data#* * * * }" subject="${subject%% *}" amount="${data#* * * * * }" amount="${amount%% *}" - printf '[p .principal . %s][p .amount %s][p .subject . %s]' \ - "$(UNSTRING "$principal" |HTML)" "$(credit "$amount")" "$(UNSTRING "$subject" |HTML)" + printf '[p .principal . %s][p .date %s][p .amount %s][p .subject . %s]' \ + "$(UNSTRING "$principal" |HTML)" "$date" "$(credit "$amount")" "$(UNSTRING "$subject" |HTML)" + printf '[input name="check_" type=hidden][input type=hidden][label .del]' + n=0; for m in 1 2 3 4 5 6 7 8; do + cat <<-EOF + [input type=checkbox id="check_${iban}_$((n+m))" name="check_${iban}_$((n+m))" value=false] + [input .card name="fn_${iban}_$((n+m))" value="" placeholder="${l10n_attendant}" list="lattendants"] + [label .add for="check_${iban}_$((n+m))" . +] + EOF + done fi printf ']' done diff --git a/style.css b/style.css index 98b839d..742163b 100644 --- a/style.css +++ b/style.css @@ -368,6 +368,9 @@ body.categories form.namelist ul.namelist > li ul li { display: inline-block; } + +/* ======== Ledgers Page ======== */ + form.ibanassign, form.ledgers { padding: .125em 1em 0 1em; @@ -388,12 +391,47 @@ form.ledgers { .ibanassign fieldset.iban p.principal { font-size: .875em; } -.ibanassign fieldset.iban p.amount, -.ibanassign fieldset.iban p.subject { +.ibanassign fieldset.iban p.date, +.ibanassign fieldset.iban p.amount { + font-size: .875em; display: inline-block; vertical-align: top; + margin-right: .75em; + margin-bottom: 0; } .ibanassign fieldset.iban p.amount { font-weight: bold; - margin-right: .75em; +} + +.ibanassign fieldset.iban input[name^="check_"], +.ibanassign fieldset.iban input[name^="check_"] + input, +.ibanassign fieldset.iban input[name^="check_"] + input + label { + display: none; +} +.ibanassign fieldset.iban input[name^="check_"]:checked + input, +.ibanassign fieldset.iban input[name^="check_"]:checked + input + label.del, +.ibanassign fieldset.iban input[name^="check_"] + input + label.del + input + input + label.add, +.ibanassign fieldset.iban input[name^="check_"]:checked + input + label + input + input + label.add { + display: inline; +} +.ibanassign fieldset.iban input[name^="check_"]:checked + input + label.add, +.ibanassign fieldset.iban input[name^="check_"] + input + label.del + input:checked + input + label.add, +.ibanassign fieldset.iban input[name^="check_"]:checked + input + label + input:checked + input + label.add { + display: none; +} + +.ibanassign fieldset.iban input[name^="check_"] + input + label { + vertical-align: bottom; + line-height: 2.5em; + padding: .375em .625em; + border: .5pt solid; +} +.ibanassign fieldset.iban input[name^="check_"] + input + label.add { + background-color: #DFD; + border-radius: 2pt; +} +.ibanassign fieldset.iban input[name^="check_"] + input + label.del { + margin: 0 .5em 0 -.25em; + background-color: #FDD; + border-radius: 0 2pt 2pt 0; } -- 2.39.2 From acf7b97ca0deee3e2d2cf328e7c3951d57ea8a2f Mon Sep 17 00:00:00 2001 From: =?utf8?q?Paul=20H=C3=A4nsch?= Date: Sat, 11 May 2024 17:05:01 +0200 Subject: [PATCH 07/16] enable deletion of ledgers --- ledgers/delete.sh | 13 +++++++++++++ 1 file changed, 13 insertions(+) create mode 100755 ledgers/delete.sh diff --git a/ledgers/delete.sh b/ledgers/delete.sh new file mode 100755 index 0000000..7b41921 --- /dev/null +++ b/ledgers/delete.sh @@ -0,0 +1,13 @@ +#!/bin/sh + +delete="$(POST delete |PATH)" +dtable="${_DATA}/ledgers/${delete##*/}" + +if [ "$dtable" ]; then + rm -- "${dtable}" \ + || SET_COOKIE 0 message="Unable to delete ledger: \"$(HTML "$delete")\"" +else + SET_COOKIE 0 message="No such ledger: \"$(HTML "$delete")\"" +fi + +REDIRECT "${_BASE}/ledgers/" -- 2.39.2 From 9078cf1dcaa8de851315250a2a602cabced9f4fe Mon Sep 17 00:00:00 2001 From: =?utf8?q?Paul=20H=C3=A4nsch?= Date: Sat, 11 May 2024 17:05:49 +0200 Subject: [PATCH 08/16] form submit for IBAN Assignments --- ledgers/iban_assign.sh | 28 ++++++++++++++++++++++++++++ ledgers/index.cgi | 8 ++++++-- style.css | 36 ++++++++++++++++++++++++++++++++++++ 3 files changed, 70 insertions(+), 2 deletions(-) create mode 100755 ledgers/iban_assign.sh diff --git a/ledgers/iban_assign.sh b/ledgers/iban_assign.sh new file mode 100755 index 0000000..cabeae7 --- /dev/null +++ b/ledgers/iban_assign.sh @@ -0,0 +1,28 @@ +#!/bin/sh + +printf '%s\r\n' "Content-Type: text/plain" "" + +for key in $(POST_KEYS); do case $key in + use_*) + use_iban="${use_iban} ${key#use_} " + ;; +esac; done +echo Use IBANS: +echo "$use_iban" +echo + +[ "$use_iban" ] && for key in $(POST_KEYS); do case $key in + check_*_*) + iban="${key#check_}" iban="${iban%_*}" + [ ! "${use_iban##* "${iban}" *}" ] && check="${check} ${key#check_} " + ;; +esac; done +echo Checked: +echo "$check" +echo + +for use in $check; do + iban="${use%_*}" + fn="$(POST "fn_${use}")" + echo Assign $iban to $fn +done diff --git a/ledgers/index.cgi b/ledgers/index.cgi index dbf8ee8..685ee85 100755 --- a/ledgers/index.cgi +++ b/ledgers/index.cgi @@ -61,21 +61,24 @@ credit() { amount="${record#* * * * * }" amount="${amount%% *}" printf '[p .principal . %s][p .date %s][p .amount %s][p .subject . %s]' \ "$(UNSTRING "$principal" |HTML)" "$date" "$(credit "$amount")" "$(UNSTRING "$subject" |HTML)" + printf '[input type=checkbox id="use_%s" name="use_%s" value=true]' "$iban" "$iban" n=0; for card in $cards; do n=$((n+1)); uid="${card%%/*}" name="$(UNSTRING "${card#*/}")" cat <<-EOF [input type=checkbox id="check_${iban}_$n" name="check_${iban}_$n" value=true checked=checked] - [input .card name="fn_${iban}_$n" value="$(HTML "$name")" disabled=disabled] + [input .card name="fn_${iban}_$n" value="$(HTML "$name")" .disabled tabindex="-1"] [label .del for="check_${iban}_$n" . -] EOF done for m in 1 2 3 4 5 6 7 8; do cat <<-EOF - [input type=checkbox id="check_${iban}_$((n+m))" name="check_${iban}_$((n+m))" value=false] + [input type=checkbox id="check_${iban}_$((n+m))" name="check_${iban}_$((n+m))" value=true] [input .card name="fn_${iban}_$((n+m))" value="" placeholder="${l10n_attendant}" list="lattendants"] [label .add for="check_${iban}_$((n+m))" . +] EOF done + printf '[label for="use_%s" . %s]' "$iban" "$(l10n Accept Suggestions)" + printf '[label for="use_%s" . %s]' "$iban" "$(l10n Ignore Suggestions)" elif [ $state = unknown ]; then date="${data%% *}" principal="${data#* * * }" principal="${principal%% *}" @@ -94,5 +97,6 @@ credit() { fi printf ']' done + printf '[button type=submit . %s]' "$(l10n Submit Changes)" printf ' ]' } | yield_page ledgers diff --git a/style.css b/style.css index 742163b..13d41a0 100644 --- a/style.css +++ b/style.css @@ -403,6 +403,9 @@ form.ledgers { font-weight: bold; } +.ibanassign fieldset.iban input[name^="fn_"].disabled { + pointer-events: none; +} .ibanassign fieldset.iban input[name^="check_"], .ibanassign fieldset.iban input[name^="check_"] + input, .ibanassign fieldset.iban input[name^="check_"] + input + label { @@ -435,3 +438,36 @@ form.ledgers { background-color: #FDD; border-radius: 0 2pt 2pt 0; } + +.ibanassign fieldset.iban input[name^="use_"] { + display: none; +} +.ibanassign fieldset.iban input[name^="use_"]:checked ~ input { + background-color: #DFD; + pointer-events: none; + border-color: #888; +} +.ibanassign fieldset.iban input[name^="use_"]:checked ~ label.del, +.ibanassign fieldset.iban input[name^="use_"]:checked ~ label.add { + display: none !important; +} + +.ibanassign fieldset.iban label[for^="use_"] { + display: block; + float: right; + padding: .25em .5em; + background-color: #AAF; + border: 1pt solid; +} + +.ibanassign fieldset.iban input[name^="use_"] ~ label[for^="use_"] { display: block; } +.ibanassign fieldset.iban input[name^="use_"] ~ label[for^="use_"] + label[for^="use_"] { display: none; } +.ibanassign fieldset.iban input[name^="use_"]:checked ~ label[for^="use_"] { display: none; } +.ibanassign fieldset.iban input[name^="use_"]:checked ~ label[for^="use_"] + label[for^="use_"] { display: block; } + +.ibanassign > button { + position: sticky; + bottom: 0; + margin: auto; + display: block; +} -- 2.39.2 From 4e7da5b8a7edf35a5f0432c296ae8fcbcd9cf91c Mon Sep 17 00:00:00 2001 From: =?utf8?q?Paul=20H=C3=A4nsch?= Date: Sat, 11 May 2024 22:09:22 +0200 Subject: [PATCH 09/16] form submit of assignments --- ledgers/iban_assign.sh | 45 +++++++++++++++++++++++++++++++----------- 1 file changed, 33 insertions(+), 12 deletions(-) diff --git a/ledgers/iban_assign.sh b/ledgers/iban_assign.sh index cabeae7..9faf223 100755 --- a/ledgers/iban_assign.sh +++ b/ledgers/iban_assign.sh @@ -1,15 +1,22 @@ #!/bin/sh -printf '%s\r\n' "Content-Type: text/plain" "" +. "$_EXEC/pdiread.sh" +. "$_EXEC/session_lock.sh" + +UIDLIST="$( + pdi_load "$_DATA/vcard/"*.vcf \ + | sed -Ez ' + s/\nBEGIN;:VCARD\n([^\n]+\n)*FN;:([^\n]+)\n([^\n]+\n)*UID;:([^\n]+)\n([^\n]+\n)*END;:VCARD\n/UID:\4 FN:\2/g + ' +)" + +# printf '%s\r\n' "Content-Type: text/plain" "" for key in $(POST_KEYS); do case $key in use_*) use_iban="${use_iban} ${key#use_} " ;; esac; done -echo Use IBANS: -echo "$use_iban" -echo [ "$use_iban" ] && for key in $(POST_KEYS); do case $key in check_*_*) @@ -17,12 +24,26 @@ echo [ ! "${use_iban##* "${iban}" *}" ] && check="${check} ${key#check_} " ;; esac; done -echo Checked: -echo "$check" -echo -for use in $check; do - iban="${use%_*}" - fn="$(POST "fn_${use}")" - echo Assign $iban to $fn -done +{ printf '[ul .results' + for use in $check; do + iban="${use%_*}" + fn="$(POST "fn_${use}")" + uid="${UIDLIST%% FN:"$fn"${BR}*}" uid="${uid##*${BR}UID:}" + + cfile="${_DATA}/vcard/${uid}.vcf" + if SLOCK "$cfile" >/dev/null; then + card="$(pdi_load "$cfile")" + cnum="$(pdi_count "$card" X-IBAN)" + pdi_update_value "$card" X-IBAN "$((cnum + 1))" "$iban" >"$cfile" + printf '[li .success . [span .name . %s] [span .uid . (UID: %s)] assigned IBAN [span .iban . %s]]' \ + "$(HTML "$fn")" "$(HTML "$uid")" "$(HTML "$iban")" + RELEASE_SLOCK "$cfile" + else + printf '[li .error . [span .name . %s] [span .uid . (UID: %s)] is being edited elsewhere]' + "$(HTML "$fn")" "$(HTML "$uid")" + fi + done + printf ']' + printf '[a .button href=/ledgers/ . %s]' "$(l10n Back)" +} | yield_page ledgers_assign -- 2.39.2 From df20f046b4ff4e58a5b93ce152926325c7e15767 Mon Sep 17 00:00:00 2001 From: =?utf8?q?Paul=20H=C3=A4nsch?= Date: Sun, 12 May 2024 16:43:28 +0200 Subject: [PATCH 10/16] simplified pipeline protocol --- ledgers/iban_assign.awk | 4 +++- ledgers/index.cgi | 1 + 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/ledgers/iban_assign.awk b/ledgers/iban_assign.awk index 68a5727..57ab62d 100755 --- a/ledgers/iban_assign.awk +++ b/ledgers/iban_assign.awk @@ -1,5 +1,7 @@ #!/bin/awk -f +function dbg( text ) { print text >>"/dev/stderr"; } + function STRING( inp ) { gsub(/\\/, "\\\\", inp); gsub(/\n/, "\\n", inp); @@ -52,7 +54,7 @@ BEGIN { fn = n = uid = iban = tmp = ""; split("", ibans); } -strftime("%Y-%m-%d", $1, "UTC") == $2 && strftime("%Y-%m-%d", $3, "UTC") == $4 { ledger = 1; } +/^BEGIN:LEDGERS$/ { ledger = 1; } ledger && strftime("%Y-%m-%d", $2, "UTC") == $1 { if ($3 in iban_uid) { diff --git a/ledgers/index.cgi b/ledgers/index.cgi index 685ee85..f55850d 100755 --- a/ledgers/index.cgi +++ b/ledgers/index.cgi @@ -41,6 +41,7 @@ credit() { printf ']' l10n_attendant="$(l10n attendant)" { pdi_load "${_DATA}"/vcard/*.vcf + printf 'BEGIN:LEDGERS\n' cat "${_DATA}"/ledgers/????-??-??\ -\ ????-??-??\ -\ ????.tbl } | "${_EXEC}"/ledgers/iban_assign.awk \ | while read -r state iban data; do -- 2.39.2 From 50266fa18f563d8da371a7bf06c796db41b08ace Mon Sep 17 00:00:00 2001 From: =?utf8?q?Paul=20H=C3=A4nsch?= Date: Sun, 12 May 2024 17:47:56 +0200 Subject: [PATCH 11/16] put known IBANs at the bottom of list --- ledgers/iban_assign.awk | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/ledgers/iban_assign.awk b/ledgers/iban_assign.awk index 57ab62d..0491617 100755 --- a/ledgers/iban_assign.awk +++ b/ledgers/iban_assign.awk @@ -73,12 +73,6 @@ ledger && strftime("%Y-%m-%d", $2, "UTC") == $1 { } END { - for (iban in sure) { - line = "sure " iban; - split(sure[iban], uids, / /); - for (k in uids) line = line " " STRING(uids[k] "/" uid_fn[uids[k]]); - print line; - } for (iban in unsure) { line = "guess " iban " " STRING(unsure_rec[iban]); split(unsure[iban], uids, / /); @@ -89,4 +83,10 @@ END { line = "unknown " iban " " unknown[iban]; print line; } + for (iban in sure) { + line = "sure " iban; + split(sure[iban], uids, / /); + for (k in uids) line = line " " STRING(uids[k] "/" uid_fn[uids[k]]); + print line; + } } -- 2.39.2 From 1ddf37b85b097f69a0d59f5a04f14509d1dd8ec0 Mon Sep 17 00:00:00 2001 From: =?utf8?q?Paul=20H=C3=A4nsch?= Date: Sun, 12 May 2024 17:48:40 +0200 Subject: [PATCH 12/16] bugfix: find actual UID in files --- ledgers/iban_assign.sh | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/ledgers/iban_assign.sh b/ledgers/iban_assign.sh index 9faf223..8d9ae99 100755 --- a/ledgers/iban_assign.sh +++ b/ledgers/iban_assign.sh @@ -8,6 +8,7 @@ UIDLIST="$( | sed -Ez ' s/\nBEGIN;:VCARD\n([^\n]+\n)*FN;:([^\n]+)\n([^\n]+\n)*UID;:([^\n]+)\n([^\n]+\n)*END;:VCARD\n/UID:\4 FN:\2/g ' + echo )" # printf '%s\r\n' "Content-Type: text/plain" "" @@ -31,7 +32,8 @@ esac; done fn="$(POST "fn_${use}")" uid="${UIDLIST%% FN:"$fn"${BR}*}" uid="${uid##*${BR}UID:}" - cfile="${_DATA}/vcard/${uid}.vcf" + # cfile="${_DATA}/vcard/${uid}.vcf" + cfile="$(grep -lxF "UID;:${uid}" "${_DATA}/vcard/"*.vcf || grep -lxF "UID:${uid}" "${_DATA}/vcard/"*.vcf)" if SLOCK "$cfile" >/dev/null; then card="$(pdi_load "$cfile")" cnum="$(pdi_count "$card" X-IBAN)" -- 2.39.2 From 9631f7d188d59cc11fc14629a66583b07b187a72 Mon Sep 17 00:00:00 2001 From: =?utf8?q?Paul=20H=C3=A4nsch?= Date: Sun, 12 May 2024 17:50:22 +0200 Subject: [PATCH 13/16] Mark modified fieldsets visually --- ledgers/index.cgi | 10 +++++++--- style.css | 22 +++++++++++++--------- 2 files changed, 20 insertions(+), 12 deletions(-) diff --git a/ledgers/index.cgi b/ledgers/index.cgi index f55850d..f2c2bf0 100755 --- a/ledgers/index.cgi +++ b/ledgers/index.cgi @@ -45,6 +45,9 @@ credit() { cat "${_DATA}"/ledgers/????-??-??\ -\ ????-??-??\ -\ ????.tbl } | "${_EXEC}"/ledgers/iban_assign.awk \ | while read -r state iban data; do + iban="$(UNSTRING "$iban")" + [ ! "$iban" ] && iban="??????????" + printf '[input type=checkbox id="use_%s" name="use_%s" value=true]' "$iban" "$iban" printf '[fieldset .iban .%s [legend . %s ]' \ "$state" "$iban" if [ $state = sure ]; then @@ -62,7 +65,6 @@ credit() { amount="${record#* * * * * }" amount="${amount%% *}" printf '[p .principal . %s][p .date %s][p .amount %s][p .subject . %s]' \ "$(UNSTRING "$principal" |HTML)" "$date" "$(credit "$amount")" "$(UNSTRING "$subject" |HTML)" - printf '[input type=checkbox id="use_%s" name="use_%s" value=true]' "$iban" "$iban" n=0; for card in $cards; do n=$((n+1)); uid="${card%%/*}" name="$(UNSTRING "${card#*/}")" cat <<-EOF @@ -78,8 +80,8 @@ credit() { [label .add for="check_${iban}_$((n+m))" . +] EOF done - printf '[label for="use_%s" . %s]' "$iban" "$(l10n Accept Suggestions)" - printf '[label for="use_%s" . %s]' "$iban" "$(l10n Ignore Suggestions)" + printf '[label .button for="use_%s" . %s]' "$iban" "$(l10n Accept Suggestions)" + printf '[label .button for="use_%s" . %s]' "$iban" "$(l10n Ignore Suggestions)" elif [ $state = unknown ]; then date="${data%% *}" principal="${data#* * * }" principal="${principal%% *}" @@ -95,6 +97,8 @@ credit() { [label .add for="check_${iban}_$((n+m))" . +] EOF done + printf '[label .button for="use_%s" . %s]' "$iban" "$(l10n Accept Suggestions)" + printf '[label .button for="use_%s" . %s]' "$iban" "$(l10n Ignore Suggestions)" fi printf ']' done diff --git a/style.css b/style.css index 13d41a0..a8ebe90 100644 --- a/style.css +++ b/style.css @@ -403,6 +403,8 @@ form.ledgers { font-weight: bold; } +.ibanassign fieldset.iban.sure .card { margin-right: 1em; } + .ibanassign fieldset.iban input[name^="fn_"].disabled { pointer-events: none; } @@ -439,16 +441,18 @@ form.ledgers { border-radius: 0 2pt 2pt 0; } -.ibanassign fieldset.iban input[name^="use_"] { +.ibanassign input[name^="use_"] { display: none; } -.ibanassign fieldset.iban input[name^="use_"]:checked ~ input { +.ibanassign input[name^="use_"]:checked + fieldset.iban.guess { background-color: #EFD; } +.ibanassign input[name^="use_"]:checked + fieldset.iban.unknown { background-color: #FED; } +.ibanassign input[name^="use_"]:checked + fieldset.iban input { background-color: #DFD; pointer-events: none; border-color: #888; } -.ibanassign fieldset.iban input[name^="use_"]:checked ~ label.del, -.ibanassign fieldset.iban input[name^="use_"]:checked ~ label.add { +.ibanassign input[name^="use_"]:checked + fieldset.iban label.del, +.ibanassign input[name^="use_"]:checked + fieldset.iban label.add { display: none !important; } @@ -456,14 +460,14 @@ form.ledgers { display: block; float: right; padding: .25em .5em; - background-color: #AAF; + background-color: #DDF; border: 1pt solid; } -.ibanassign fieldset.iban input[name^="use_"] ~ label[for^="use_"] { display: block; } -.ibanassign fieldset.iban input[name^="use_"] ~ label[for^="use_"] + label[for^="use_"] { display: none; } -.ibanassign fieldset.iban input[name^="use_"]:checked ~ label[for^="use_"] { display: none; } -.ibanassign fieldset.iban input[name^="use_"]:checked ~ label[for^="use_"] + label[for^="use_"] { display: block; } +.ibanassign input[name^="use_"] + fieldset.iban label[for^="use_"] { display: block; } +.ibanassign input[name^="use_"] + fieldset.iban label[for^="use_"] + label[for^="use_"] { display: none; } +.ibanassign input[name^="use_"]:checked + fieldset.iban label[for^="use_"] { display: none; } +.ibanassign input[name^="use_"]:checked + fieldset.iban label[for^="use_"] + label[for^="use_"] { display: block; } .ibanassign > button { position: sticky; -- 2.39.2 From 785c5f7e7828e93a2c6629036d8808865a0eec11 Mon Sep 17 00:00:00 2001 From: =?utf8?q?Paul=20H=C3=A4nsch?= Date: Mon, 13 May 2024 20:56:19 +0200 Subject: [PATCH 14/16] link to ledgers from cards --- cards/list.sh | 1 + l10n.sh | 1 + 2 files changed, 2 insertions(+) diff --git a/cards/list.sh b/cards/list.sh index 9511fc1..e12d760 100755 --- a/cards/list.sh +++ b/cards/list.sh @@ -104,6 +104,7 @@ print_card(){ $(card_item "$card" CATEGORIES) ] [div .control + [a .button .item href="${_BASE}/ledgers/account.sh?card=${cardfile##*/}" $(l10n ledger)] [a .button .item href="${_BASE}/cards/edit_card.sh?card=${cardfile##*/}" $(l10n edit)] [a .button .item href="${_BASE}/cards/export_card.sh?card=${cardfile##*/}" $(l10n vcf_export)] ] diff --git a/l10n.sh b/l10n.sh index d9e01d0..9780a09 100755 --- a/l10n.sh +++ b/l10n.sh @@ -85,6 +85,7 @@ l10n_global() { edit) printf %s "Bearbeiten";; edit_categories) printf %s "Kategorien Bearbeiten";; vcf_export) printf %s "Vcard Exportieren";; + ledger) printf %s "Buchungen";; control) printf %s "Aktionen";; delete) printf %s "entfernen";; edit_update) printf %s "Daten übernehmen";; -- 2.39.2 From de473d4e02928b374781a1930e052dfb215a6201 Mon Sep 17 00:00:00 2001 From: =?utf8?q?Paul=20H=C3=A4nsch?= Date: Mon, 13 May 2024 20:57:59 +0200 Subject: [PATCH 15/16] Squashed 'cgilite/' changes from 397847d..ad6888a ad6888a style support for