Fix for tim.Time change to tickets model includes date helper.
This commit is contained in:
@@ -145,16 +145,24 @@ func SyndicateLogTicketHandler(app *bootstrap.App) http.HandlerFunc {
|
|||||||
|
|
||||||
case http.MethodPost:
|
case http.MethodPost:
|
||||||
gameType := r.FormValue("game_type")
|
gameType := r.FormValue("game_type")
|
||||||
drawDate := r.FormValue("draw_date")
|
drawDateStr := r.FormValue("draw_date")
|
||||||
method := r.FormValue("purchase_method")
|
method := r.FormValue("purchase_method")
|
||||||
|
|
||||||
err := ticketStorage.InsertTicket(app.DB, models.Ticket{
|
dt, err := helpers.ParseDrawDate(drawDateStr)
|
||||||
|
if err != nil {
|
||||||
|
templateHelpers.SetFlash(r, "Invalid draw date")
|
||||||
|
http.Redirect(w, r, fmt.Sprintf("/syndicate/view?id=%d", syndicateId), http.StatusSeeOther)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
err = ticketStorage.InsertTicket(app.DB, models.Ticket{
|
||||||
UserId: userID,
|
UserId: userID,
|
||||||
GameType: gameType,
|
GameType: gameType,
|
||||||
DrawDate: drawDate,
|
DrawDate: dt,
|
||||||
PurchaseMethod: method,
|
PurchaseMethod: method,
|
||||||
SyndicateId: &syndicateId,
|
SyndicateId: &syndicateId,
|
||||||
})
|
})
|
||||||
|
|
||||||
if err != nil {
|
if err != nil {
|
||||||
templateHelpers.SetFlash(r, "Failed to add ticket.")
|
templateHelpers.SetFlash(r, "Failed to add ticket.")
|
||||||
} else {
|
} else {
|
||||||
|
|||||||
@@ -74,10 +74,18 @@ func AddTicket(app *bootstrap.App) http.HandlerFunc {
|
|||||||
}
|
}
|
||||||
|
|
||||||
game := r.FormValue("game_type")
|
game := r.FormValue("game_type")
|
||||||
drawDate := r.FormValue("draw_date")
|
drawDateStr := r.FormValue("draw_date")
|
||||||
purchaseMethod := r.FormValue("purchase_method")
|
purchaseMethod := r.FormValue("purchase_method")
|
||||||
purchaseDate := r.FormValue("purchase_date")
|
purchaseDate := r.FormValue("purchase_date")
|
||||||
purchaseTime := r.FormValue("purchase_time")
|
purchaseTime := r.FormValue("purchase_time")
|
||||||
|
|
||||||
|
dt, err := helpers.ParseDrawDate(drawDateStr)
|
||||||
|
if err != nil {
|
||||||
|
http.Error(w, "Invalid draw date", http.StatusBadRequest)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
drawDateDB := helpers.FormatDrawDate(dt) // "YYYY-MM-DD"
|
||||||
|
|
||||||
if purchaseTime != "" {
|
if purchaseTime != "" {
|
||||||
purchaseDate += "T" + purchaseTime
|
purchaseDate += "T" + purchaseTime
|
||||||
}
|
}
|
||||||
@@ -165,7 +173,7 @@ func AddTicket(app *bootstrap.App) http.HandlerFunc {
|
|||||||
purchase_method, purchase_date, image_path
|
purchase_method, purchase_date, image_path
|
||||||
) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
|
) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
|
||||||
`,
|
`,
|
||||||
userID, game, drawDate,
|
userID, game, drawDateDB,
|
||||||
b[0], b[1], b[2], b[3], b[4], b[5],
|
b[0], b[1], b[2], b[3], b[4], b[5],
|
||||||
bo[0], bo[1],
|
bo[0], bo[1],
|
||||||
purchaseMethod, purchaseDate, imagePath,
|
purchaseMethod, purchaseDate, imagePath,
|
||||||
@@ -195,10 +203,18 @@ func SubmitTicket(app *bootstrap.App) http.HandlerFunc {
|
|||||||
}
|
}
|
||||||
|
|
||||||
game := r.FormValue("game_type")
|
game := r.FormValue("game_type")
|
||||||
drawDate := r.FormValue("draw_date")
|
drawDateStr := r.FormValue("draw_date")
|
||||||
purchaseMethod := r.FormValue("purchase_method")
|
purchaseMethod := r.FormValue("purchase_method")
|
||||||
purchaseDate := r.FormValue("purchase_date")
|
purchaseDate := r.FormValue("purchase_date")
|
||||||
purchaseTime := r.FormValue("purchase_time")
|
purchaseTime := r.FormValue("purchase_time")
|
||||||
|
|
||||||
|
dt, err := helpers.ParseDrawDate(drawDateStr)
|
||||||
|
if err != nil {
|
||||||
|
http.Error(w, "Invalid draw date", http.StatusBadRequest)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
drawDateDB := helpers.FormatDrawDate(dt)
|
||||||
|
|
||||||
if purchaseTime != "" {
|
if purchaseTime != "" {
|
||||||
purchaseDate += "T" + purchaseTime
|
purchaseDate += "T" + purchaseTime
|
||||||
}
|
}
|
||||||
@@ -253,7 +269,7 @@ func SubmitTicket(app *bootstrap.App) http.HandlerFunc {
|
|||||||
purchase_method, purchase_date, image_path
|
purchase_method, purchase_date, image_path
|
||||||
) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
|
) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
|
||||||
`,
|
`,
|
||||||
userID, game, drawDate,
|
userID, game, drawDateDB,
|
||||||
b[0], b[1], b[2], b[3], b[4], b[5],
|
b[0], b[1], b[2], b[3], b[4], b[5],
|
||||||
bo[0], bo[1],
|
bo[0], bo[1],
|
||||||
purchaseMethod, purchaseDate, imagePath,
|
purchaseMethod, purchaseDate, imagePath,
|
||||||
@@ -299,6 +315,7 @@ func GetMyTickets(app *bootstrap.App) http.HandlerFunc {
|
|||||||
|
|
||||||
for rows.Next() {
|
for rows.Next() {
|
||||||
var t models.Ticket
|
var t models.Ticket
|
||||||
|
var drawDateStr string // ← add
|
||||||
var b1, b2, b3, b4, b5, b6, bo1, bo2 sql.NullInt64
|
var b1, b2, b3, b4, b5, b6, bo1, bo2 sql.NullInt64
|
||||||
var matchedMain, matchedBonus sql.NullInt64
|
var matchedMain, matchedBonus sql.NullInt64
|
||||||
var prizeTier sql.NullString
|
var prizeTier sql.NullString
|
||||||
@@ -307,7 +324,7 @@ func GetMyTickets(app *bootstrap.App) http.HandlerFunc {
|
|||||||
var prizeAmount sql.NullFloat64
|
var prizeAmount sql.NullFloat64
|
||||||
|
|
||||||
if err := rows.Scan(
|
if err := rows.Scan(
|
||||||
&t.Id, &t.GameType, &t.DrawDate,
|
&t.Id, &t.GameType, &drawDateStr, // ← was &t.DrawDate
|
||||||
&b1, &b2, &b3, &b4, &b5, &b6,
|
&b1, &b2, &b3, &b4, &b5, &b6,
|
||||||
&bo1, &bo2,
|
&bo1, &bo2,
|
||||||
&t.PurchaseMethod, &t.PurchaseDate, &t.ImagePath, &t.Duplicate,
|
&t.PurchaseMethod, &t.PurchaseDate, &t.ImagePath, &t.Duplicate,
|
||||||
@@ -317,6 +334,11 @@ func GetMyTickets(app *bootstrap.App) http.HandlerFunc {
|
|||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Parse into time.Time (UTC)
|
||||||
|
if dt, err := helpers.ParseDrawDate(drawDateStr); err == nil {
|
||||||
|
t.DrawDate = dt
|
||||||
|
}
|
||||||
|
|
||||||
// Normalize fields
|
// Normalize fields
|
||||||
t.Ball1 = int(b1.Int64)
|
t.Ball1 = int(b1.Int64)
|
||||||
t.Ball2 = int(b2.Int64)
|
t.Ball2 = int(b2.Int64)
|
||||||
@@ -351,7 +373,7 @@ func GetMyTickets(app *bootstrap.App) http.HandlerFunc {
|
|||||||
t.BonusBalls = helpers.BuildBonusSlice(t)
|
t.BonusBalls = helpers.BuildBonusSlice(t)
|
||||||
|
|
||||||
// Fetch matching draw info
|
// Fetch matching draw info
|
||||||
draw := draws.GetDrawResultForTicket(app.DB, t.GameType, t.DrawDate)
|
draw := draws.GetDrawResultForTicket(app.DB, t.GameType, helpers.FormatDrawDate(t.DrawDate))
|
||||||
t.MatchedDraw = draw
|
t.MatchedDraw = draw
|
||||||
|
|
||||||
tickets = append(tickets, t)
|
tickets = append(tickets, t)
|
||||||
|
|||||||
31
internal/helpers/dates.go
Normal file
31
internal/helpers/dates.go
Normal file
@@ -0,0 +1,31 @@
|
|||||||
|
package helpers
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"time"
|
||||||
|
)
|
||||||
|
|
||||||
|
var drawDateLayouts = []string{
|
||||||
|
time.RFC3339, // 2006-01-02T15:04:05Z07:00
|
||||||
|
"2006-01-02", // 2025-10-29
|
||||||
|
"2006-01-02 15:04", // 2025-10-29 20:30
|
||||||
|
"2006-01-02 15:04:05", // 2025-10-29 20:30:59
|
||||||
|
}
|
||||||
|
|
||||||
|
// ParseDrawDate tries multiple layouts and returns UTC.
|
||||||
|
func ParseDrawDate(s string) (time.Time, error) {
|
||||||
|
for _, l := range drawDateLayouts {
|
||||||
|
if t, err := time.ParseInLocation(l, s, time.Local); err == nil {
|
||||||
|
return t.UTC(), nil
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return time.Time{}, fmt.Errorf("cannot parse draw date: %q", s)
|
||||||
|
}
|
||||||
|
|
||||||
|
// FormatDrawDate normalizes a time to the storage format you use in SQL (date only).
|
||||||
|
func FormatDrawDate(t time.Time) string {
|
||||||
|
if t.IsZero() {
|
||||||
|
return ""
|
||||||
|
}
|
||||||
|
return t.UTC().Format("2006-01-02")
|
||||||
|
}
|
||||||
@@ -32,6 +32,10 @@ func RunTicketMatching(db *sql.DB, triggeredBy string) (models.MatchRunStats, er
|
|||||||
var pending []models.Ticket
|
var pending []models.Ticket
|
||||||
for rows.Next() {
|
for rows.Next() {
|
||||||
var t models.Ticket
|
var t models.Ticket
|
||||||
|
var drawDateStr string
|
||||||
|
if dt, err := helpers.ParseDrawDate(drawDateStr); err == nil {
|
||||||
|
t.DrawDate = dt
|
||||||
|
}
|
||||||
var b1, b2, b3, b4, b5, b6, bo1, bo2 sql.NullInt64
|
var b1, b2, b3, b4, b5, b6, bo1, bo2 sql.NullInt64
|
||||||
if err := rows.Scan(
|
if err := rows.Scan(
|
||||||
&t.Id, &t.GameType, &t.DrawDate,
|
&t.Id, &t.GameType, &t.DrawDate,
|
||||||
@@ -58,7 +62,7 @@ func RunTicketMatching(db *sql.DB, triggeredBy string) (models.MatchRunStats, er
|
|||||||
BonusBalls: helpers.BuildBonusSlice(t),
|
BonusBalls: helpers.BuildBonusSlice(t),
|
||||||
}
|
}
|
||||||
|
|
||||||
draw := drawsSvc.GetDrawResultForTicket(db, t.GameType, t.DrawDate)
|
draw := drawsSvc.GetDrawResultForTicket(db, t.GameType, helpers.FormatDrawDate(t.DrawDate))
|
||||||
if draw.DrawID == 0 {
|
if draw.DrawID == 0 {
|
||||||
// No draw yet → skip
|
// No draw yet → skip
|
||||||
continue
|
continue
|
||||||
|
|||||||
Reference in New Issue
Block a user