add orders

This commit is contained in:
Aditya Siregar
2025-08-06 00:42:57 +07:00
parent 0a44135fb6
commit 3696451dc6
6 changed files with 326 additions and 82 deletions
+72
View File
@@ -0,0 +1,72 @@
package util
import (
"time"
)
const DateFormatDDMMYYYY = "02-01-2006"
// ParseDateToJakartaTime parses a date string in DD-MM-YYYY format and converts it to Jakarta timezone
// Returns start of day (00:00:00) in Jakarta timezone
func ParseDateToJakartaTime(dateStr string) (*time.Time, error) {
if dateStr == "" {
return nil, nil
}
date, err := time.Parse(DateFormatDDMMYYYY, dateStr)
if err != nil {
return nil, err
}
jakartaLoc, err := time.LoadLocation("Asia/Jakarta")
if err != nil {
return nil, err
}
jakartaTime := time.Date(date.Year(), date.Month(), date.Day(), 0, 0, 0, 0, jakartaLoc)
return &jakartaTime, nil
}
// ParseDateToJakartaTimeEndOfDay parses a date string in DD-MM-YYYY format and converts it to Jakarta timezone
// Returns end of day (23:59:59.999999999) in Jakarta timezone
func ParseDateToJakartaTimeEndOfDay(dateStr string) (*time.Time, error) {
if dateStr == "" {
return nil, nil
}
date, err := time.Parse(DateFormatDDMMYYYY, dateStr)
if err != nil {
return nil, err
}
jakartaLoc, err := time.LoadLocation("Asia/Jakarta")
if err != nil {
return nil, err
}
jakartaTime := time.Date(date.Year(), date.Month(), date.Day(), 23, 59, 59, 999999999, jakartaLoc)
return &jakartaTime, nil
}
// ParseDateRangeToJakartaTime parses date_from and date_to strings and returns them in Jakarta timezone
// date_from will be start of day (00:00:00), date_to will be end of day (23:59:59.999999999)
func ParseDateRangeToJakartaTime(dateFrom, dateTo string) (*time.Time, *time.Time, error) {
var fromTime, toTime *time.Time
var err error
if dateFrom != "" {
fromTime, err = ParseDateToJakartaTime(dateFrom)
if err != nil {
return nil, nil, err
}
}
if dateTo != "" {
toTime, err = ParseDateToJakartaTimeEndOfDay(dateTo)
if err != nil {
return nil, nil, err
}
}
return fromTime, toTime, nil
}
+211
View File
@@ -0,0 +1,211 @@
package util
import (
"testing"
"time"
)
func TestParseDateToJakartaTime(t *testing.T) {
tests := []struct {
name string
dateStr string
expected *time.Time
hasError bool
}{
{
name: "valid date",
dateStr: "06-08-2025",
expected: nil, // Will be set during test
hasError: false,
},
{
name: "empty string",
dateStr: "",
expected: nil,
hasError: false,
},
{
name: "invalid date format",
dateStr: "2025-08-06",
hasError: true,
},
}
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
result, err := ParseDateToJakartaTime(tt.dateStr)
if tt.hasError {
if err == nil {
t.Errorf("Expected error but got none")
}
return
}
if err != nil {
t.Errorf("Unexpected error: %v", err)
return
}
if tt.expected == nil && tt.dateStr == "" {
if result != nil {
t.Errorf("Expected nil but got %v", result)
}
return
}
if result == nil && tt.dateStr != "" {
t.Errorf("Expected time but got nil")
return
}
// Check if it's in Jakarta timezone
jakartaLoc, _ := time.LoadLocation("Asia/Jakarta")
if result.Location().String() != jakartaLoc.String() {
t.Errorf("Expected Jakarta timezone but got %v", result.Location())
}
// Check if it's start of day
if result.Hour() != 0 || result.Minute() != 0 || result.Second() != 0 {
t.Errorf("Expected start of day but got %v", result.Format("15:04:05"))
}
})
}
}
func TestParseDateToJakartaTimeEndOfDay(t *testing.T) {
tests := []struct {
name string
dateStr string
expected *time.Time
hasError bool
}{
{
name: "valid date",
dateStr: "06-08-2025",
expected: nil, // Will be set during test
hasError: false,
},
{
name: "empty string",
dateStr: "",
expected: nil,
hasError: false,
},
}
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
result, err := ParseDateToJakartaTimeEndOfDay(tt.dateStr)
if tt.hasError {
if err == nil {
t.Errorf("Expected error but got none")
}
return
}
if err != nil {
t.Errorf("Unexpected error: %v", err)
return
}
if tt.expected == nil && tt.dateStr == "" {
if result != nil {
t.Errorf("Expected nil but got %v", result)
}
return
}
if result == nil && tt.dateStr != "" {
t.Errorf("Expected time but got nil")
return
}
// Check if it's in Jakarta timezone
jakartaLoc, _ := time.LoadLocation("Asia/Jakarta")
if result.Location().String() != jakartaLoc.String() {
t.Errorf("Expected Jakarta timezone but got %v", result.Location())
}
// Check if it's end of day
if result.Hour() != 23 || result.Minute() != 59 || result.Second() != 59 {
t.Errorf("Expected end of day but got %v", result.Format("15:04:05"))
}
})
}
}
func TestParseDateRangeToJakartaTime(t *testing.T) {
tests := []struct {
name string
dateFrom string
dateTo string
hasError bool
}{
{
name: "valid date range",
dateFrom: "06-08-2025",
dateTo: "06-08-2025",
hasError: false,
},
{
name: "empty strings",
dateFrom: "",
dateTo: "",
hasError: false,
},
{
name: "only date_from",
dateFrom: "06-08-2025",
dateTo: "",
hasError: false,
},
{
name: "only date_to",
dateFrom: "",
dateTo: "06-08-2025",
hasError: false,
},
}
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
fromTime, toTime, err := ParseDateRangeToJakartaTime(tt.dateFrom, tt.dateTo)
if tt.hasError {
if err == nil {
t.Errorf("Expected error but got none")
}
return
}
if err != nil {
t.Errorf("Unexpected error: %v", err)
return
}
// If dateFrom is provided, check it's start of day
if tt.dateFrom != "" && fromTime != nil {
jakartaLoc, _ := time.LoadLocation("Asia/Jakarta")
if fromTime.Location().String() != jakartaLoc.String() {
t.Errorf("Expected Jakarta timezone for date_from but got %v", fromTime.Location())
}
if fromTime.Hour() != 0 || fromTime.Minute() != 0 || fromTime.Second() != 0 {
t.Errorf("Expected start of day for date_from but got %v", fromTime.Format("15:04:05"))
}
}
// If dateTo is provided, check it's end of day
if tt.dateTo != "" && toTime != nil {
jakartaLoc, _ := time.LoadLocation("Asia/Jakarta")
if toTime.Location().String() != jakartaLoc.String() {
t.Errorf("Expected Jakarta timezone for date_to but got %v", toTime.Location())
}
if toTime.Hour() != 23 || toTime.Minute() != 59 || toTime.Second() != 59 {
t.Errorf("Expected end of day for date_to but got %v", toTime.Format("15:04:05"))
}
}
})
}
}