fix: GET /hub/dashboard now honors from/to date range
Previously always scoped parcels_received_today, batches_sent_today, exceptions, and parcels_sorted to "since midnight today", ignoring any from/to query params — so any non-default range silently returned zeros. Now parses optional from/to (YYYY-MM-DD, same semantics as GET /hub/report) and defaults to today when omitted. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
This commit is contained in:
@@ -100,6 +100,36 @@ func todayMidnight() time.Time {
|
|||||||
return time.Date(now.Year(), now.Month(), now.Day(), 0, 0, 0, 0, now.Location())
|
return time.Date(now.Year(), now.Month(), now.Day(), 0, 0, 0, 0, now.Location())
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// parseHubDashboardRange parses optional from/to (YYYY-MM-DD) query params
|
||||||
|
// for GetHubDashboardStats, defaulting to "today so far" when both are
|
||||||
|
// omitted. Mirrors GetHubReport's range semantics: to is inclusive of the
|
||||||
|
// whole day.
|
||||||
|
func parseHubDashboardRange(c *fiber.Ctx) (time.Time, time.Time, error) {
|
||||||
|
fromStr := c.Query("from")
|
||||||
|
toStr := c.Query("to")
|
||||||
|
|
||||||
|
if fromStr == "" && toStr == "" {
|
||||||
|
return todayMidnight(), time.Now(), nil
|
||||||
|
}
|
||||||
|
if fromStr == "" || toStr == "" {
|
||||||
|
return time.Time{}, time.Time{}, fmt.Errorf("both from and to query params are required (YYYY-MM-DD)")
|
||||||
|
}
|
||||||
|
|
||||||
|
from, err := time.ParseInLocation("2006-01-02", fromStr, time.Local)
|
||||||
|
if err != nil {
|
||||||
|
return time.Time{}, time.Time{}, fmt.Errorf("invalid from date, expected YYYY-MM-DD")
|
||||||
|
}
|
||||||
|
toDate, err := time.ParseInLocation("2006-01-02", toStr, time.Local)
|
||||||
|
if err != nil {
|
||||||
|
return time.Time{}, time.Time{}, fmt.Errorf("invalid to date, expected YYYY-MM-DD")
|
||||||
|
}
|
||||||
|
to := toDate.Add(24*time.Hour - time.Nanosecond)
|
||||||
|
if to.Before(from) {
|
||||||
|
return time.Time{}, time.Time{}, fmt.Errorf("to date must not be before from date")
|
||||||
|
}
|
||||||
|
return from, to, nil
|
||||||
|
}
|
||||||
|
|
||||||
// hubPincodePrefix returns the first 3 digits of a hub's pincode, following
|
// hubPincodePrefix returns the first 3 digits of a hub's pincode, following
|
||||||
// the same zone-prefix convention used in pricing_helpers.go and city_gate.go.
|
// the same zone-prefix convention used in pricing_helpers.go and city_gate.go.
|
||||||
func hubPincodePrefix(hubID int) string {
|
func hubPincodePrefix(hubID int) string {
|
||||||
@@ -183,12 +213,16 @@ func isDoormileStaff(staff *models.HubStaffAccount) bool {
|
|||||||
|
|
||||||
func GetHubDashboardStats(c *fiber.Ctx) error {
|
func GetHubDashboardStats(c *fiber.Ctx) error {
|
||||||
hubID := c.Locals("hubid").(int)
|
hubID := c.Locals("hubid").(int)
|
||||||
midnight := todayMidnight()
|
|
||||||
prefix := hubPincodePrefix(hubID)
|
prefix := hubPincodePrefix(hubID)
|
||||||
|
|
||||||
|
from, to, err := parseHubDashboardRange(c)
|
||||||
|
if err != nil {
|
||||||
|
return utils.BadRequest(c, err.Error())
|
||||||
|
}
|
||||||
|
|
||||||
var parcelsReceivedToday int64
|
var parcelsReceivedToday int64
|
||||||
db.DB.Model(&models.Consignment{}).
|
db.DB.Model(&models.Consignment{}).
|
||||||
Where("currenthubid = ? AND status = ? AND updatedat >= ?", hubID, constants.ConsignmentInwardedAtHub, midnight).
|
Where("currenthubid = ? AND status = ? AND updatedat BETWEEN ? AND ?", hubID, constants.ConsignmentInwardedAtHub, from, to).
|
||||||
Count(&parcelsReceivedToday)
|
Count(&parcelsReceivedToday)
|
||||||
|
|
||||||
var milersAvailable int64
|
var milersAvailable int64
|
||||||
@@ -210,12 +244,12 @@ func GetHubDashboardStats(c *fiber.Ctx) error {
|
|||||||
|
|
||||||
var batchesSentToday int64
|
var batchesSentToday int64
|
||||||
db.DB.Model(&models.Tripsheet{}).
|
db.DB.Model(&models.Tripsheet{}).
|
||||||
Where("sourcehubid = ? AND dispatchtime >= ?", hubID, midnight).
|
Where("sourcehubid = ? AND dispatchtime BETWEEN ? AND ?", hubID, from, to).
|
||||||
Count(&batchesSentToday)
|
Count(&batchesSentToday)
|
||||||
|
|
||||||
var exceptions int64
|
var exceptions int64
|
||||||
db.DB.Model(&models.ConsignmentException{}).
|
db.DB.Model(&models.ConsignmentException{}).
|
||||||
Where("hubid = ? AND createdat >= ?", hubID, midnight).
|
Where("hubid = ? AND createdat BETWEEN ? AND ?", hubID, from, to).
|
||||||
Count(&exceptions)
|
Count(&exceptions)
|
||||||
|
|
||||||
// Sorting happens at inbound scan (CreateInboundScan assigns a shelf), so
|
// Sorting happens at inbound scan (CreateInboundScan assigns a shelf), so
|
||||||
|
|||||||
Reference in New Issue
Block a user