diff --git a/models/data.go b/models/data.go index 9fadf02..270d79c 100644 --- a/models/data.go +++ b/models/data.go @@ -5,7 +5,7 @@ import "time" type Cake struct { Name string ID int - Price int // increments of 0.01 + Price Price // increments of 0.01 Amount int } @@ -18,18 +18,22 @@ type Order struct { Date time.Time Accepted time.Time Status string - Paid int // increments of 0.01 + Paid Price // increments of 0.01 Cakes []Cake } -func (o *Order) Total() int { - out := o.Paid * (-1) +func (o *Order) Subtotal() Price { + var out Price for _, e := range o.Cakes { - out += e.Price * e.Amount + out += e.Price * Price(e.Amount) } return out + +} +func (o *Order) Total() Price { + return o.Subtotal() - o.Paid } -func (c *Cake) Total() int { - return c.Amount * c.Price +func (c *Cake) Total() Price { + return Price(c.Amount) * c.Price } diff --git a/models/price.go b/models/price.go new file mode 100644 index 0000000..83d0266 --- /dev/null +++ b/models/price.go @@ -0,0 +1,33 @@ +package models + +import ( + "fmt" + "strconv" + "strings" +) + +type Price int + +func (in Price) String() string { + if in%100 == 0 { + return strconv.Itoa(int(in) / 100) + } else { + price := strconv.Itoa(int(in)) + i := len(price) - 2 + price = price[:i] + "." + price[i:] + return price + } +} + +func ParsePrice(in string) (Price, error) { + if !strings.Contains(in, ".") { + price, err := strconv.Atoi(in) + return Price(price) * 100, err + } + before, after, _ := strings.Cut(in, ".") + if len(after) != 2 { + return 0, fmt.Errorf("Wrong format, requires exactly 2 decimal places after '.'") + } + price, err := strconv.Atoi(before + after) + return Price(price), err +} diff --git a/models/price_test.go b/models/price_test.go new file mode 100644 index 0000000..efe5557 --- /dev/null +++ b/models/price_test.go @@ -0,0 +1,55 @@ +package models + +import "testing" + +func TestFormatPrice(t *testing.T) { + var a Price + var s string + a = 12345678900 + s = a.String() + if s != "123456789" { + t.Fatal(a, s) + } + a = 123456789 + s = a.String() + if s != "1234567.89" { + t.Fatal(a, s) + } +} + +func TestParsePrice(t *testing.T) { + var p Price + var s string + var err error + s = "199" + p, err = ParsePrice(s) + if err != nil || p != 19900 { + t.Fatal(s, p) + } + s = "1.99" + p, err = ParsePrice(s) + if err != nil || p != 199 { + t.Fatal(s, p) + } + s = "1123" + p, err = ParsePrice(s) + if err != nil || p != 112300 { + t.Fatal(s, p) + } + s = "1123.123" + _, err = ParsePrice(s) + if err == nil { + t.Fatal(s, "should error") + } + s = "1123.3" + _, err = ParsePrice(s) + if err == nil { + t.Fatal(s, "should error") + } + + s = "1123,33" + _, err = ParsePrice(s) + if err == nil { + t.Fatal(s, "should error") + } +} diff --git a/seed.go b/seed.go index 7c07b23..dde69ec 100644 --- a/seed.go +++ b/seed.go @@ -9,19 +9,19 @@ import ( ) func seed(s *store.Store) { - malinowa := models.Cake{Name: "Malinowa Chmurka", Price: 2500} + malinowa := models.Cake{Name: "Malinowa Chmurka", Price: 25000} malinowa.ID, _ = s.SaveCake(malinowa) - sernik := models.Cake{Name: "Sernik", Price: 2200} + sernik := models.Cake{Name: "Sernik", Price: 22000} sernik.ID, _ = s.SaveCake(sernik) - mleczna := models.Cake{Name: "Mleczna Kanapka", Price: 2800} + mleczna := models.Cake{Name: "Mleczna Kanapka", Price: 28000} mleczna.ID, _ = s.SaveCake(mleczna) - trzy := models.Cake{Name: "3-Bit", Price: 1800} + trzy := models.Cake{Name: "3-Bit", Price: 18000} trzy.ID, _ = s.SaveCake(trzy) - plesniak := models.Cake{Name: "Pleśniak", Price: 2000} + plesniak := models.Cake{Name: "Pleśniak", Price: 20000} plesniak.ID, _ = s.SaveCake(plesniak) now := time.Now() diff --git a/server/post.go b/server/post.go index a5cd6a0..dde7f04 100644 --- a/server/post.go +++ b/server/post.go @@ -25,7 +25,7 @@ func (h *Server) postCake(r *http.Request) (templ.Component, int, error) { return nil, http.StatusBadRequest, err } n.Name = r.FormValue("name") - n.Price, err = strconv.Atoi(r.FormValue("price")) + n.Price, err = models.ParsePrice(r.FormValue("price")) if err != nil { return nil, http.StatusBadRequest, err } @@ -49,7 +49,7 @@ func (h *Server) postOrder(r *http.Request) (templ.Component, int, error) { if err != nil { return nil, http.StatusBadRequest, err } - n.Paid, err = strconv.Atoi(r.FormValue("paid")) + n.Paid, err = models.ParsePrice(r.FormValue("paid")) if err != nil { return nil, http.StatusBadRequest, err } diff --git a/server/templates/cake.templ b/server/templates/cake.templ index 83b6c46..362375a 100644 --- a/server/templates/cake.templ +++ b/server/templates/cake.templ @@ -24,14 +24,14 @@ templ CakeForm(cake models.Cake) {