]> git.plutz.net Git - invoices/blob - invoices.sh
use transaction id for all updates
[invoices] / invoices.sh
1 #!/bin/sh
2
3 sender_list(){
4   local select="$1" n name
5   [ -d senders/ ] && for n in '' senders/*; do
6     [ "$n" ] && name="$(sed q "$n" |HTML)"
7     [ "${n#senders/}" = "$select" ] \
8     && printf '<option value="%s" selected=selected>%s</option>' "${n#senders/}" "$name" \
9     || printf '<option value="%s">%s</option>' "${n#senders/}" "$name"
10   done
11 }
12
13 client_list(){
14   local select="$1" n address hourly name
15   [ -d clients/ ] && for n in '' clients/*; do
16     [ "$n" ] && read -r address hourly <"$n"
17     name="$(UNSTRING "${address#address=}" |sed q |HTML)"
18     [ "${n#clients/}" = "$select" ] \
19     && printf '<option value="%s" selected=selected>%s</option>' "${n#clients/}" "$name" \
20     || printf '<option value="%s">%s</option>' "${n#clients/}" "$name"
21   done
22 }
23
24 list_invoices(){
25   [ -d invoices/ ] && for i in invoices/*; do
26     read -r sender client date number vat vatrate<<-EOF
27         $(sed q "$i")
28         EOF
29     [ -f "senders/${sender#sender=}" ] \
30     && sender="$(sed q "senders/${sender#sender=}")" \
31     || sender="(unset)"
32     [ ! -f "clients/${client#client=}" ] \
33     && client="(unset)" \
34     || read -r client hourly <"clients/${client#client=}"
35     [ "${date#date=}" -ge 0 ] 2>&- \
36     && date="$(date -d "@${date#date=}" +%x)" \
37     || date="(unset)"
38
39     printf '[div .invoice
40       [h2
41           %s]
42       [label From:] %s [label To:] %s [label on] %s
43       [a href="/invoice/%s" Edit]
44     ]' "$(UNSTRING "${number#number=}" |HTML)" \
45        "$(HTML "$sender")" \
46        "$(UNSTRING "${client#address=}" |sed q |HTML)" "$(HTML "$date")" \
47        "$(HTML ${i#invoices/})"
48   done
49 }
50
51 edit_invoice(){
52   id="$1"
53   if [ -f "invoices/$id" ]; then
54     read -r sender client date number vat vatrate<<-EOF
55         $(sed q "invoices/$id")
56         EOF
57   fi
58
59   [ "${date#date=}" -ge 0 ] 2>&- \
60   && date="$(date -d "@${date#date=}" +%F)" \
61   || date="$(date +%F)"
62   [ "${number#number=}" ] || number="number=$(date +%s)"
63   [ "${vatrate#vatrate=}" -ge 0 ] 2>&- || vatrate="vatrate=19"
64
65   cat <<-EOF 
66         [form method="POST" action="/update_invoice"
67           [hidden "id" "$(HTML "$id")"]
68
69           [label Sender:]
70           [select name=sender
71             $(sender_list "${sender#sender=}")
72           ]
73
74           [label Client:]
75           [select name=client
76             $(client_list "${client#client=}")
77           ]
78         
79           [label for=number Invoice Number:]
80           [input #number name=number value="$(UNSTRING "${number#number=}" |HTML)"]
81
82           [label for=date Date:]
83           [input #date name=date value="${date}" placeholder="YYYY-MM-TT"]
84
85           [radio "vat" "smallbusiness" #vatsb $([ "${vat#vat=}" = smallbusiness ] && printf checked) ]
86           [label for=vatsb Small business exemption from VAT]
87           [radio "vat" "nett" #vatnett $([ "${vat#vat=}" = nett ] && printf checked)]
88           [label for=vatnett Nett]
89           [radio "vat" "gross" #vatgross $([ "${vat#vat=}" = gross ] && printf checked)]
90           [label for=vatgross Gross]
91           [label for=vatrate VAT Rate: [input type=number name="vatrate" value="${vatrate#vatrate=}"]% ]
92
93           [table
94             [tr [th Date] [th Work] [th Hours] [th Price] ]
95 $({ sed 1d "invoices/$id"; printf 'time= work= hours=\n'; } \
96     | while read -r time work hours; do
97       hours="$(UNSTRING "${hours#hours=}" |grep -m1 -xE '[0-9]+' || printf 0)"
98       printf '[tr
99               [td [textarea name=date
100 %s] ]
101               [td [textarea name=work
102 %s] ]
103               [td [input type=number name=hours value="%s"] ]
104               [td %s]
105      ]' "$(UNSTRING "${time#time=}" |HTML)" \
106         "$(UNSTRING "${work#work=}" |HTML)" \
107         "$hours" "$((hours * hourly)) €"
108     done
109 )
110           ]
111           [submit "update" "update" Update]
112         ]
113         EOF
114 }
115
116 update_invoice(){
117   id="$(POST id |checkid)"
118   if [ "$(POST update)" = update -a "$id" ]; then
119     mkdir -p invoices
120     printf 'sender=%s   client=%s       date=%s number=%s       vat=%s  vatrate=%s\n' \
121       "$(POST sender)" "$(POST client)" \
122       "$(date -d "$(POST date)" +%s)" \
123       "$(POST number |STRING)" \
124       "$(POST vat |grep -m1 -xE 'smallbusiness|gross|nett')" \
125       "$(POST vatrate |grep -m1 -xE '[0-9]+')" \
126     >"invoices/$id"
127   fi
128 }