invoice: move validation to separate layer, validate GTU/SP codes

Change-Id: I0af85b054356eaae81b528e5e64bf74c10bd3ae4
diff --git a/bgpwtf/invoice/main.go b/bgpwtf/invoice/main.go
index d93034c..5133010 100644
--- a/bgpwtf/invoice/main.go
+++ b/bgpwtf/invoice/main.go
@@ -23,42 +23,8 @@
 }
 
 func (s *service) CreateInvoice(ctx context.Context, req *pb.CreateInvoiceRequest) (*pb.CreateInvoiceResponse, error) {
-	if req.InvoiceData == nil {
-		return nil, status.Error(codes.InvalidArgument, "invoice data must be given")
-	}
-	if len(req.InvoiceData.Item) < 1 {
-		return nil, status.Error(codes.InvalidArgument, "invoice data must contain at least one item")
-	}
-	for i, item := range req.InvoiceData.Item {
-		if item.Title == "" {
-			return nil, status.Errorf(codes.InvalidArgument, "invoice data item %d must have title set", i)
-		}
-		if item.Count == 0 || item.Count > 1000000 {
-			return nil, status.Errorf(codes.InvalidArgument, "invoice data item %d must have correct count", i)
-		}
-		if item.UnitPrice == 0 {
-			return nil, status.Errorf(codes.InvalidArgument, "invoice data item %d must have correct unit price", i)
-		}
-		if item.Vat > 100000 {
-			return nil, status.Errorf(codes.InvalidArgument, "invoice data item %d must have correct vat set", i)
-		}
-	}
-	if len(req.InvoiceData.CustomerBilling) < 1 {
-		return nil, status.Error(codes.InvalidArgument, "invoice data must contain at least one line of the customer's billing address")
-	}
-	if len(req.InvoiceData.InvoicerBilling) < 1 {
-		return nil, status.Error(codes.InvalidArgument, "invoice data must contain at least one line of the invoicer's billing address")
-	}
-	for i, c := range req.InvoiceData.InvoicerContact {
-		if c.Medium == "" {
-			return nil, status.Errorf(codes.InvalidArgument, "contact point %d must have medium set", i)
-		}
-		if c.Contact == "" {
-			return nil, status.Errorf(codes.InvalidArgument, "contact point %d must have contact set", i)
-		}
-	}
-	if req.InvoiceData.InvoicerVatId == "" {
-		return nil, status.Error(codes.InvalidArgument, "invoice data must contain invoicer's vat id")
+	if err := validateInvoiceData(req.InvoiceData); err != nil {
+		return nil, status.Errorf(codes.InvalidArgument, "invoice data: %v", err)
 	}
 
 	uid, err := s.m.createInvoice(ctx, req.InvoiceData)