]> git.plutz.net Git - confetti/blob - ledgers/csv_upload.awk
styling for iban assignment
[confetti] / ledgers / csv_upload.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 isdate( date,    dt, y, m, d ) {
28          if ( match( date, 
29     /^[0-9]{4}-((01|03|05|07|08|10|12)-(0[1-9]|[12][0-9]|3[01])|(04|06|09|11)-(0[1-9]|[12][0-9]|30)|02-(0[1-9]|[12][0-9]))$/ )) {
30     split( date, dt, "-");
31     y = dt[1]; m = dt[2]; d = dt[3];
32
33   } else if ( match( date,
34     /^((0?1|0?3|0?5|0?7|0?8|10|12)\/(0?[1-9]|[12][0-9]|3[01])|(0?4|0?6|0?9|11)\/(0?[1-9]|[12][0-9]|30)|0?2\/(0[1-9]|[12][0-9]))\/([0-9]{2}|[0-9]{4})$/ )) {
35     split( date, dt, "/");
36     m = dt[1]; d = dt[2]; y = dt[3];
37
38   } else if ( match( date,
39     /^((0?[1-9]|[12][0-9]|3[01])[\.\/](0?1|0?3|0?5|0?7|0?8|10|12)|(0?[1-9]|[12][0-9]|30)[\.\/](0?4|0?6|0?9|11)|(0[1-9]|[12][0-9])[\.\/]0?2)[\.\/]([0-9]{2}|[0-9]{4})$/ )) {
40     split( date, dt, /[\.\/]/);
41     d = dt[1]; m = dt[2]; y = dt[3];
42
43   } else return "";
44
45   if ( y < 100 && y >  50 ) y = y + 1900;
46   if (            y <= 50 ) y = y + 2000;
47
48   # leap year
49   if ( m == 2 && d == 29 ) {
50          if ( y % 400 == 0 ) y = y;
51     else if ( y % 100 == 0 ) return "";
52     else if ( y %   4 == 0 ) y = y;
53     else return "";
54   }
55
56   return sprintf("%04i-%02i-%02i", y, m, d);
57 }
58
59 function cents( val ) {
60   gsub(/\./, "", val); sub(/,/, ".", val);
61   return val * 100;
62 }
63
64 BEGIN {
65   FS = ";";
66   dtrange_end = dt_from = dt_to = balance_start = balance_end = "";
67   split("", rec);
68   rec[0] = "Date        DateU   IBAN    Name    Subject Amount"
69 }
70
71 /^([012]?[0-9]|30|31).(0?[1-9]|1[012]).[0-9]{4} - ([012]?[0-9]|30|31).(0?[1-9]|1[012]).[0-9]{4}$/ {
72   dtrange_end = $0; sub(/^.* - /, "", dtrange_end);
73   dt_from = $0; sub(/ - .*$/, "", dt_from); dt_from = isdate(dt_from);
74   dt_to   = $0; sub(/^.* - /, "", dt_to  ); dt_to   = isdate(dt_to  );
75 }
76
77 /^Letzter Kontostand;;;;[0-9\.,]+;EUR$/ {
78   balance_start = cents($5);
79 }
80
81 /Kontostand;[^;]+;;;[0-9\.,]+;EUR/ {
82   if ( $2 = dtrange_end ) balance_end = cents($5)
83 }
84
85 $18 == "EUR" {
86   rec_date = isdate($1); gsub(/-/, " ", rec_date); rec_date = mktime(rec_date " 00 00 00", "UTC");
87   rec[length(rec)] = sprintf("%s        %i      %s      %s      %s      %i",
88                              isdate($1), rec_date, $6 ? $6 : "\\", STRING($4), STRING($5), cents($12));
89 }
90
91 END {
92   if ( dt_from && dt_to ) {
93     dtu_from = dt_from; gsub(/-/, " ", dtu_from); dtu_from = mktime( dtu_from " 00 00 00", "UTC");
94     dtu_to   = dt_to  ; gsub(/-/, " ", dtu_to  ); dtu_to   = mktime( dtu_to   " 00 00 00", "UTC");
95
96     printf "%i  %s      %i      %s      %i      %i\n",
97            dtu_from, dt_from, dtu_to, dt_to, balance_start, balance_end;
98     for ( k = 1; k < length(rec); k++ ) print rec[k];
99   }
100 }