Pulls events off the new order_events table and shows them as a timeline block in the order detail view: Paid, Label created, In transit, Delivered (etc) with timestamps. Filters out ops-only events like payment_critical, label_orphaned, and tracking_marked_manually so the customer never sees internal plumbing. DisplayLabel on OrderEvent decides what's customer-visible and what's redacted, so the same order_events rows can later power an admin view with no filter.
64 lines
1.4 KiB
Go
64 lines
1.4 KiB
Go
package models
|
|
|
|
import (
|
|
"encoding/json"
|
|
"time"
|
|
)
|
|
|
|
type OrderEvent struct {
|
|
ID uint `gorm:"primaryKey" json:"id"`
|
|
OrderID uint `gorm:"not null;index" json:"order_id"`
|
|
Type string `gorm:"size:100;not null;index" json:"type"`
|
|
Payload string `gorm:"type:text" json:"payload"`
|
|
Actor string `gorm:"size:255" json:"actor"`
|
|
CreatedAt time.Time `json:"created_at"`
|
|
}
|
|
|
|
func (OrderEvent) TableName() string {
|
|
return "order_events"
|
|
}
|
|
|
|
func (e *OrderEvent) PayloadMap() map[string]any {
|
|
if e.Payload == "" {
|
|
return nil
|
|
}
|
|
var m map[string]any
|
|
if err := json.Unmarshal([]byte(e.Payload), &m); err != nil {
|
|
return nil
|
|
}
|
|
return m
|
|
}
|
|
|
|
func (e *OrderEvent) DisplayLabel() (string, bool) {
|
|
switch e.Type {
|
|
case "order_paid":
|
|
return "Paid", true
|
|
case "label_purchased":
|
|
return "Label created", true
|
|
case "order_delivered":
|
|
return "Delivered", true
|
|
case "order_refunded":
|
|
return "Refunded", true
|
|
case "order_failed":
|
|
return "Payment failed", true
|
|
case "tracking_updated":
|
|
status, _ := e.PayloadMap()["status"].(string)
|
|
return trackingLabel(status)
|
|
}
|
|
return "", false
|
|
}
|
|
|
|
func trackingLabel(status string) (string, bool) {
|
|
switch status {
|
|
case "transit":
|
|
return "In transit", true
|
|
case "failure":
|
|
return "Delivery issue", true
|
|
case "returned":
|
|
return "Returned to sender", true
|
|
case "pre_transit":
|
|
return "Label scanned by carrier", true
|
|
}
|
|
return "", false
|
|
}
|