go/svc/invoice: add statusz
diff --git a/go/svc/invoice/statusz.go b/go/svc/invoice/statusz.go
new file mode 100644
index 0000000..dbc59f1
--- /dev/null
+++ b/go/svc/invoice/statusz.go
@@ -0,0 +1,93 @@
+package main
+
+import (
+	"context"
+	"fmt"
+	"net/http"
+
+	"code.hackerspace.pl/hscloud/go/mirko"
+	"code.hackerspace.pl/hscloud/go/statusz"
+	"github.com/golang/glog"
+)
+
+const invoicesFragment = `
+    <style type="text/css">
+		.table td,th {
+			background-color: #eee;
+			padding: 0.2em 0.4em 0.2em 0.4em;
+		}
+		.table th {
+			background-color: #c0c0c0;
+		}
+		.table {
+			background-color: #fff;
+			border-spacing: 0.2em;
+			margin-left: auto;
+			margin-right: auto;
+		}
+	</style>
+    <div>
+		{{ .Msg }}
+        <table class="table">
+            <tr>
+                <th>Internal ID</th>
+                <th>Number</th>
+				<th>Customer</th>
+				<th>Amount (net)</th>
+				<th>Actions</th>
+            </tr>
+            {{ range .Invoices }}
+				{{ if .Sealed }}
+				<tr>
+				{{ else }}
+				<tr style="opacity: 0.5">
+				{{ end }}
+				    <td>{{ .ID }}</td>
+				    <td>{{ .Number }}</td>
+					<td>{{ index .Proto.CustomerBilling 0 }}</td>
+					<td>{{ .TotalNetPretty }}</td>
+				    <td>
+						<a href="/debug/view?id={{ .ID }}">View</a>
+					</td>
+				</tr>
+			{{ end }}
+        </table>
+    </div>
+`
+
+type templateInvoice struct {
+	invoice
+	TotalNetPretty string
+}
+
+func (s *service) setupStatusz(m *mirko.Mirko) {
+	statusz.AddStatusPart("Invoices", invoicesFragment, func(ctx context.Context) interface{} {
+		var res struct {
+			Invoices []templateInvoice
+			Msg      string
+		}
+		invoices, err := s.m.getInvoices(ctx)
+		res.Invoices = make([]templateInvoice, len(invoices))
+		for i, inv := range invoices {
+			res.Invoices[i] = templateInvoice{
+				invoice:        inv,
+				TotalNetPretty: fmt.Sprintf("%.2f %s", float64(inv.TotalNet)/100, inv.Proto.Unit),
+			}
+		}
+
+		if err != nil {
+			glog.Errorf("Could not get invoices for statusz: %v", err)
+			res.Msg = fmt.Sprintf("Could not get invoices: %v", err)
+		}
+		return res
+	})
+
+	m.HTTPMux().HandleFunc("/debug/view", func(w http.ResponseWriter, r *http.Request) {
+		rendered, err := s.invoicePDF(r.Context(), r.URL.Query().Get("id"))
+		if err != nil {
+			fmt.Fprintf(w, "error: %v", err)
+		}
+		w.Header().Set("Content-type", "application/pdf")
+		w.Write(rendered)
+	})
+}