]> git.plutz.net Git - confetti/blob - ledgers/iban_assign.awk
styling for iban assignment
[confetti] / ledgers / iban_assign.awk
1 #!/bin/awk -f
2
3 function STRING( inp ) {
4   gsub(/\\/, "\\\\", inp);
5   gsub(/\n/, "\\n",  inp);
6   gsub(/\r/, "\\r",  inp);
7   gsub(/\t/, "\\t",  inp);
8   gsub(/\+/, "\\+",  inp);
9   gsub(/ /,  "+",    inp);
10   return inp ? inp : "\\";
11 }
12
13 function UNSTRING( inp,    out, tmp ) {
14   while ( inp ) {
15          if ( inp ~ /^\\\\/) { out = out "\\"; sub(/^\\\\/, "", inp); }
16     else if ( inp ~ /^\\n/)  { out = out "\n"; sub(/^\\n/,  "", inp); }
17     else if ( inp ~ /^\\r/)  { out = out "\r"; sub(/^\\r/,  "", inp); }
18     else if ( inp ~ /^\\t/)  { out = out "\t"; sub(/^\\t/,  "", inp); }
19     else if ( inp ~ /^\\+/)  { out = out "+";  sub(/^\\+/,  "", inp); }
20     else if ( inp ~ /^\+/)   { out = out " ";  sub(/^\+/,   "", inp); }
21     else if ( inp ~ /^\\/)   { out = out "";   sub(/^\+/,   "", inp); }
22     else { tmp = inp; sub(/[\\+].*$/, "", tmp); out = out tmp; sub(/^[^\\+]*/, "", inp); }
23   }
24   return out;
25 }
26
27 function rx( regex ) {
28   gsub(/[].*+?^${}()|\\[]/, "\\\\&", regex);
29   return regex;
30 }
31
32 BEGIN {
33   FS = "        "; ledger = 0;
34   fn = n = uid = iban = tmp = "";
35   split("", uid_n); split("", uid_fn); split("", uid_iban);
36   split("", iban_uid); split("", ibans); split("", uids);
37
38   split("", sure); split("", unsure); split("", unknown);
39   split("", unsure_rec)
40 }
41
42 /^BEGIN;:VCARD$/ { fn = n = id = iban = tmp = ""; }
43
44    /^UID;[^:]*:/ {  uid = $0; sub(/^[^;]+;[^:]*:/, "",  uid); }
45     /^FN;[^:]*:/ {   fn = $0; sub(/^[^;]+;[^:]*:/, "",   fn); }
46      /^N;[^:]*:/ {    n = $0; sub(/^[^;]+;[^:]*:/, "",    n); sub(/;.*$/, "", n); }
47 /^X-IBAN;[^:]*:/ { iban = $0; sub(/^[^;]+;[^:]*:/, "", iban); ibans[length(ibans)] = iban; }
48
49 /^END;:VCARD$/ {
50   uid_n[uid] = n; uid_fn[uid] = fn; uid_iban[uid] = iban;
51   for (iban in ibans) iban_uid[ibans[iban]] = iban_uid[ibans[iban]] ? iban_uid[ibans[iban]] " " uid : uid;
52   fn = n = uid = iban = tmp = ""; split("", ibans);
53 }
54
55 strftime("%Y-%m-%d", $1, "UTC") == $2 && strftime("%Y-%m-%d", $3, "UTC") == $4 { ledger = 1; }
56
57 ledger && strftime("%Y-%m-%d", $2, "UTC") == $1 {
58   if ($3 in iban_uid) {
59     sure[$3] = iban_uid[$3];
60   } else {
61     for (uid in uid_fn) if ( match(UNSTRING($5), rx(uid_fn[uid])) ) {
62       if (! match(unsure[$3], rx(uid))) unsure[$3] = unsure[$3] ? unsure[$3] " " uid : uid;
63       unsure_rec[$3] = $0
64     }
65     for (uid in uid_n) if ( uid_n[uid] && match(UNSTRING($4), rx(uid_n[uid])) ) {
66       if (! match(unsure[$3], rx(uid))) unsure[$3] = unsure[$3] ? unsure[$3] " " uid : uid;
67       unsure_rec[$3] = $0
68     }
69   }
70   if (!($3 in sure) && !($3 in unsure)) unknown[$3] = $0;
71 }
72
73 END {
74   for (iban in sure) {
75     line = "sure        " iban;
76     split(iban_uid[iban], uids, / /);
77     for (uid in uids) line = line "     " STRING(uid "/" uid_fn[uid]);
78     print line;
79   }
80   for (iban in unsure) {
81     line = "guess       " iban " " STRING(unsure_rec[iban]);
82     split(unsure[iban], uids, / /);
83     for (k in uids) line = line "       " STRING(uids[k] "/" uid_fn[uids[k]]);
84     print line;
85   }
86   for (iban in unknown) {
87     line = "unknown     " iban " " unknown[iban];
88     print line;
89   }
90 }