forked from hswaw/hscloud
Merge "invoice: move validation to separate layer, validate GTU/SP codes"
This commit is contained in:
commit
ced43bef12
3 changed files with 126 additions and 36 deletions
|
@ -8,6 +8,7 @@ go_library(
|
|||
"model.go",
|
||||
"render.go",
|
||||
"statusz.go",
|
||||
"validation.go",
|
||||
],
|
||||
importpath = "code.hackerspace.pl/hscloud/bgpwtf/invoice",
|
||||
visibility = ["//visibility:private"],
|
||||
|
|
|
@ -23,42 +23,8 @@ type service struct {
|
|||
}
|
||||
|
||||
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)
|
||||
|
|
123
bgpwtf/invoice/validation.go
Normal file
123
bgpwtf/invoice/validation.go
Normal file
|
@ -0,0 +1,123 @@
|
|||
package main
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
|
||||
pb "code.hackerspace.pl/hscloud/bgpwtf/invoice/proto"
|
||||
)
|
||||
|
||||
// validateGTUCodde returns a non-nil error if the given GTU (Grupy Towarów i
|
||||
// Usług) code is invalid.
|
||||
func validateGTUCode(c pb.GTUCode) error {
|
||||
switch c {
|
||||
case pb.GTUCode_GTU_01:
|
||||
case pb.GTUCode_GTU_02:
|
||||
case pb.GTUCode_GTU_03:
|
||||
case pb.GTUCode_GTU_04:
|
||||
case pb.GTUCode_GTU_05:
|
||||
case pb.GTUCode_GTU_06:
|
||||
case pb.GTUCode_GTU_07:
|
||||
case pb.GTUCode_GTU_09:
|
||||
case pb.GTUCode_GTU_10:
|
||||
case pb.GTUCode_GTU_11:
|
||||
case pb.GTUCode_GTU_12:
|
||||
case pb.GTUCode_GTU_13:
|
||||
default:
|
||||
return fmt.Errorf("must be 1-13, is %d", c)
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
// validateGTUCodde returns a non-nil error if the given SP (Symbol Procedury)
|
||||
// code is invalid.
|
||||
func validateSPCode(c pb.SPCode) error {
|
||||
switch c {
|
||||
case pb.SPCode_SP_SW:
|
||||
case pb.SPCode_SP_EE:
|
||||
case pb.SPCode_SP_TP:
|
||||
case pb.SPCode_SP_TT_WNT:
|
||||
case pb.SPCode_SP_TT_D:
|
||||
case pb.SPCode_SP_MR_T:
|
||||
case pb.SPCode_SP_MR_UZ:
|
||||
case pb.SPCode_SP_I_42:
|
||||
case pb.SPCode_SP_I_63:
|
||||
case pb.SPCode_SP_B_SPV:
|
||||
case pb.SPCode_SP_B_SPV_DOSTAWA:
|
||||
case pb.SPCode_SP_B_MPV_PROWIZJA:
|
||||
case pb.SPCode_SP_MPP:
|
||||
default:
|
||||
return fmt.Errorf("unsupported value")
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
// validateItem returns a non-nil error if the given Item is invalid as part of
|
||||
// an InvoiceData when an invoice is being created.
|
||||
func validateItem(i *pb.Item) error {
|
||||
if i.Title == "" {
|
||||
return fmt.Errorf("must have title set")
|
||||
}
|
||||
if i.Count == 0 || i.Count > 1000000 {
|
||||
return fmt.Errorf("must have correct count")
|
||||
}
|
||||
if i.UnitPrice == 0 {
|
||||
return fmt.Errorf("must have correct unit price")
|
||||
}
|
||||
if i.Vat > 100000 {
|
||||
return fmt.Errorf("must have correct vat set")
|
||||
}
|
||||
for i, code := range i.GtuCode {
|
||||
if err := validateGTUCode(code); err != nil {
|
||||
return fmt.Errorf("GTU code %d: %v", i, err)
|
||||
}
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
// validateContactPoint returns a non-nil error if the given ContactPoint is
|
||||
// invalid as part of an InvoiceData when an invoice is being created.
|
||||
func validateContactPoint(cp *pb.ContactPoint) error {
|
||||
if cp.Medium == "" {
|
||||
return fmt.Errorf("must have medium set")
|
||||
}
|
||||
if cp.Contact == "" {
|
||||
return fmt.Errorf("must have contact set")
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
// validateInvoiceData returns a non-nil error if the given InvoiceData cannot
|
||||
// be used to createa new invoice.
|
||||
func validateInvoiceData(id *pb.InvoiceData) error {
|
||||
if id == nil {
|
||||
return fmt.Errorf("must be given")
|
||||
}
|
||||
if len(id.Item) < 1 {
|
||||
return fmt.Errorf("must contain at least one item")
|
||||
}
|
||||
for i, item := range id.Item {
|
||||
if err := validateItem(item); err != nil {
|
||||
return fmt.Errorf("invoice data item %d: %v", i, err)
|
||||
}
|
||||
}
|
||||
if len(id.CustomerBilling) < 1 {
|
||||
return fmt.Errorf("must contain at least one line of the customer's billing address")
|
||||
}
|
||||
if len(id.InvoicerBilling) < 1 {
|
||||
return fmt.Errorf("must contain at least one line of the invoicer's billing address")
|
||||
}
|
||||
for i, c := range id.InvoicerContact {
|
||||
if err := validateContactPoint(c); err != nil {
|
||||
return fmt.Errorf("contact point %d: %v", i, err)
|
||||
}
|
||||
}
|
||||
if id.InvoicerVatId == "" {
|
||||
return fmt.Errorf("must contain invoicer's vat id")
|
||||
}
|
||||
for i, code := range id.SpCode {
|
||||
if err := validateSPCode(code); err != nil {
|
||||
return fmt.Errorf("SP code %d: %v", i, err)
|
||||
}
|
||||
}
|
||||
return nil
|
||||
}
|
Loading…
Reference in a new issue