From c40e5f0a7452b3612ee28117a82af4a8a54f5728 Mon Sep 17 00:00:00 2001
From: "daniel.naude" <danieln@bob.co.za>
Date: Thu, 16 May 2024 13:51:04 +0200
Subject: [PATCH] Refactor TradingHours to allow for closed days where trading
 does not take place

---
 date_utils/date_utils.go | 33 ++++++++++++++++++++++-----------
 1 file changed, 22 insertions(+), 11 deletions(-)

diff --git a/date_utils/date_utils.go b/date_utils/date_utils.go
index 76f4dfc..68be30f 100644
--- a/date_utils/date_utils.go
+++ b/date_utils/date_utils.go
@@ -289,6 +289,11 @@ func (t TradingHours) Validate() error {
 	}
 
 	for _, day := range t {
+		if day.StartTime == "" || day.EndTime == "" {
+			// Allow empty trading hours for a day to represent closed
+			continue
+		}
+
 		if !TimeBefore(day.StartTime, day.EndTime) {
 			return errors.Error("Start time must be before end time")
 		}
@@ -336,19 +341,25 @@ func (t TradingHours) String() string {
 
 	rangeStartIndex := 1
 	for i := 1; i < len(t); i++ {
-		startTime, err := time.Parse("15:04", t[i].StartTime)
-		if err != nil {
-			return ""
-		}
+		var times string
 
-		endTime, err := time.Parse("15:04", t[i].EndTime)
-		if err != nil {
-			return ""
-		}
+		if t[i].StartTime != "" && t[i].EndTime != "" {
+			startTime, err := time.Parse("15:04", t[i].StartTime)
+			if err != nil {
+				return ""
+			}
+
+			endTime, err := time.Parse("15:04", t[i].EndTime)
+			if err != nil {
+				return ""
+			}
 
-		times := startTime.Format("3:04pm") + "-" + endTime.Format("3:04pm")
-		if t[i].StartTime == "00:00" && t[i].EndTime == "23:59" {
-			times = "All day"
+			times = startTime.Format("3:04pm") + "-" + endTime.Format("3:04pm")
+			if t[i].StartTime == "00:00" && t[i].EndTime == "23:59" {
+				times = "All day"
+			}
+		} else {
+			times = "Closed"
 		}
 
 		// If we're at the last element or the next day doesn't have the same times, we end the current range
-- 
GitLab