From 17b92a706a60ffa48069a680b41e683fdf91ad7c Mon Sep 17 00:00:00 2001 From: bronkuu Date: Mon, 15 Jun 2026 18:49:49 +0200 Subject: [PATCH] status workflow and seed with special cakes Change terminal status from 'done' to 'picked_up' in all queries. Add dateRangeParams helper, GetOrderCounts, GetCakeCounts. Load special cakes in getOrdersFromQuery, save in UpdateOrderContents. Seed: 5 tags, 3 special cakes, Maria status 'done'->'ready'. Test: 'Done'->'ready'. --- seed.go | 22 ++++++++++++++-- store/order.go | 61 +++++++++++++++++++++++++++++++++++++++------ store/store_test.go | 2 +- 3 files changed, 75 insertions(+), 10 deletions(-) diff --git a/seed.go b/seed.go index dde69ec..88ddbb4 100644 --- a/seed.go +++ b/seed.go @@ -24,6 +24,12 @@ func seed(s *store.Store) { plesniak := models.Cake{Name: "Pleśniak", Price: 20000} plesniak.ID, _ = s.SaveCake(plesniak) + czekoladowy, _ := s.CreateTag("czekoladowy") + owocowy, _ := s.CreateTag("owocowy") + weselny, _ := s.CreateTag("weselny") + urodzinowy, _ := s.CreateTag("urodzinowy") + bezowy, _ := s.CreateTag("bezowy") + now := time.Now() orders := []models.Order{ @@ -32,17 +38,25 @@ func seed(s *store.Store) { Location: "Kartuzy", Accepted: now, Date: now.Add(48 * time.Hour), Status: "pending", Paid: 0, Cakes: []models.Cake{{ID: malinowa.ID, Amount: 2}}, + SpecialCakes: []models.SpecialCake{ + {Name: "Tort weselny", Price: 35000, Size: "30cm", Shape: "round", Flavour: "malinowy", Notes: "3 piętra, krem maślany", + Tags: []models.Tag{{ID: weselny}, {ID: owocowy}}}, + }, }, { Name: "Jan", Surname: "Kowalski", Phone: "987-654-321", Location: "Gdańsk", Accepted: now.Add(-24 * time.Hour), Date: now.Add(72 * time.Hour), Status: "accepted", Paid: 1000, Cakes: []models.Cake{{ID: sernik.ID, Amount: 1}, {ID: mleczna.ID, Amount: 1}}, + SpecialCakes: []models.SpecialCake{ + {Name: "Tort urodzinowy", Price: 22000, Size: "25cm", Shape: "round", Flavour: "czekoladowy", Notes: "z napisem 'Sto lat!'", + Tags: []models.Tag{{ID: czekoladowy}, {ID: urodzinowy}}}, + }, }, { Name: "Maria", Surname: "Wiśniewska", Phone: "555-123-456", Location: "Sopot", Accepted: now.Add(-72 * time.Hour), Date: now.Add(-24 * time.Hour), - Status: "done", Paid: 5600, + Status: "ready", Paid: 5600, Cakes: []models.Cake{{ID: malinowa.ID, Amount: 1}, {ID: trzy.ID, Amount: 3}}, }, { @@ -56,6 +70,10 @@ func seed(s *store.Store) { Location: "Kartuzy", Accepted: now.Add(-48 * time.Hour), Date: now.Add(24 * time.Hour), Status: "accepted", Paid: 2000, Cakes: []models.Cake{{ID: mleczna.ID, Amount: 2}, {ID: sernik.ID, Amount: 1}}, + SpecialCakes: []models.SpecialCake{ + {Name: "Tort bezowo-owocowy", Price: 18000, Size: "22cm", Shape: "round", Flavour: "beza z owocami", Notes: "bez glutenu", + Tags: []models.Tag{{ID: bezowy}, {ID: owocowy}}}, + }, }, } @@ -66,5 +84,5 @@ func seed(s *store.Store) { } } - log.Printf("seed: loaded %d cakes and %d orders", 5, len(orders)) + log.Printf("seed: loaded %d cakes, %d tags, and %d orders", 5, 5, len(orders)) } diff --git a/store/order.go b/store/order.go index de5e65c..f992f58 100644 --- a/store/order.go +++ b/store/order.go @@ -10,6 +10,15 @@ import ( "git.bronku.xyz/bronku/cake-order-tracker/models" ) +func dateRangeParams(from, to time.Time) (start, end string) { + start = from.Format(config.DateFormat) + " 00:00" + end = to.Format(config.DateFormat) + " 99:99" + if to.IsZero() { + end = "9999-99-99 99:99" + } + return +} + func (s *Store) scanOrderRow(row *sql.Rows) (models.Order, error) { var out models.Order var orderDate, deliveryDate string @@ -68,6 +77,10 @@ func (s *Store) getOrdersFromQuery(query string, args ...any) ([]models.Order, e if err != nil { continue } + order.SpecialCakes, err = s.GetSpecialCakes(order.ID) + if err != nil { + continue + } out = append(out, order) } @@ -87,15 +100,48 @@ func (s *Store) GetOrder(id int) (models.Order, error) { } func (s *Store) GetOrders(from, to time.Time) ([]models.Order, error) { - start := from.Format(config.DateFormat) + " 00:00" - end := to.Format(config.DateFormat) + " 99:99" - if to.IsZero() { - end = "9999-99-99 99:99" - } - query := "select * from customer_order where status != 'done' and delivery_date >= ? and delivery_date <= ? ;" + start, end := dateRangeParams(from, to) + query := "select * from customer_order where status != 'picked_up' and delivery_date >= ? and delivery_date <= ? ;" return s.getOrdersFromQuery(query, start, end) } +func (s *Store) GetOrderCounts() (models.OrderCounts, error) { + var c models.OrderCounts + err := s.db.QueryRow(` + SELECT COUNT(*), + COALESCE(SUM(CASE WHEN substr(delivery_date, 1, 10) = date('now') THEN 1 ELSE 0 END), 0) + FROM customer_order WHERE status != 'picked_up' + `).Scan(&c.Active, &c.DueToday) + return c, err +} + +func (s *Store) GetCakeCounts(from, to time.Time) ([]models.CakeCount, error) { + start, end := dateRangeParams(from, to) + rows, err := s.db.Query(` + SELECT c.id, c.name, COALESCE(SUM(oc.amount), 0) + FROM ordered_cake oc + JOIN customer_order co ON oc.customer_order = co.id + JOIN cake c ON oc.cake = c.id + WHERE co.status != 'picked_up' AND co.delivery_date >= ? AND co.delivery_date <= ? + GROUP BY oc.cake + ORDER BY SUM(oc.amount) DESC + `, start, end) + if err != nil { + return nil, err + } + defer rows.Close() + + var out []models.CakeCount + for rows.Next() { + var cc models.CakeCount + if err := rows.Scan(&cc.ID, &cc.Name, &cc.Amount); err != nil { + return nil, err + } + out = append(out, cc) + } + return out, rows.Err() +} + func (s *Store) UpdateOrderContents(tx *sql.Tx, newOrder models.Order) error { q := "delete from ordered_cake where customer_order = ?;" _, err := tx.Exec(q, newOrder.ID) @@ -110,7 +156,8 @@ func (s *Store) UpdateOrderContents(tx *sql.Tx, newOrder models.Order) error { return err } } - return nil + + return s.SaveSpecialCakes(tx, newOrder.ID, newOrder.SpecialCakes) } func (s *Store) UpdateOrder(newOrder models.Order) error { diff --git a/store/store_test.go b/store/store_test.go index 9f02ae8..91b8e84 100644 --- a/store/store_test.go +++ b/store/store_test.go @@ -152,7 +152,7 @@ func TestStore(t *testing.T) { // update existing order newOrder.Name = "James" - newOrder.Status = "Done" + newOrder.Status = "ready" newOrder.Cakes = newOrder.Cakes[1:] newID, err = s.SaveOrder(newOrder) if newID != newOrder.ID {