package models import ( "database/sql/driver" "encoding/json" "fmt" "strconv" "gorm.io/gorm" ) // FlexibleString handles JSON that could be either a number or a string, // and ensures it can be saved/read from the database as a string. type FlexibleString string func (fs *FlexibleString) UnmarshalJSON(b []byte) error { if len(b) == 0 { return nil } // If it's a string in JSON if b[0] == '"' { var s string if err := json.Unmarshal(b, &s); err != nil { return err } *fs = FlexibleString(s) return nil } // If it's a number in JSON var f float64 if err := json.Unmarshal(b, &f); err != nil { return err } *fs = FlexibleString(strconv.FormatFloat(f, 'f', -1, 64)) return nil } func (fs FlexibleString) MarshalJSON() ([]byte, error) { return json.Marshal(string(fs)) } // 🔥 Database Logic: Handle reading from DB func (fs *FlexibleString) Scan(value interface{}) error { if value == nil { *fs = "" return nil } switch v := value.(type) { case []byte: *fs = FlexibleString(v) case string: *fs = FlexibleString(v) case float64: *fs = FlexibleString(strconv.FormatFloat(v, 'f', -1, 64)) case int64: *fs = FlexibleString(strconv.FormatInt(v, 10)) default: *fs = FlexibleString(fmt.Sprintf("%v", v)) } return nil } // 🔥 Database Logic: Handle writing to DB func (fs FlexibleString) Value() (driver.Value, error) { return string(fs), nil } func (fs FlexibleString) String() string { return string(fs) } type OrderInfo struct { Orderheaderid int `json:"orderheaderid"` Applocationid int `json:"applocationid"` Applocation string `json:"applocation"` Tenantid int `json:"tenantid"` Partnerid int `json:"partnerid"` Locationid int `json:"locationid"` Categoryid int `json:"categoryid"` Subcategoryid int `json:"subcategoryid"` Moduleid int `json:"moduleid"` Configid int `json:"configid"` Orderid string `json:"orderid"` Orderdate string `json:"orderdate"` Deliverydate string `json:"deliverydate"` Orderstatus string `json:"orderstatus"` Deliverystatus string `json:"deliverystatus"` Deliveryamt float64 `json:"deliveryamt"` Itemcount int `json:"itemcount"` Ordernotes string `json:"ordernotes"` Kms FlexibleString `json:"kms"` Actualkms FlexibleString `json:"actualkms"` Pending string `json:"Pending"` Processing string `json:"processing"` Ready string `json:"ready"` Cancelled string `json:"cancelled"` Delivered string `json:"delivered"` Assigntime string `json:"assigntime"` Starttime string `json:"starttime"` Arrivaltime string `json:"arrivaltime"` Pickuptime string `json:"pickuptime"` Deliverytime string `json:"deliverytime"` Canceltime string `json:"canceltime"` Deliverycharge float32 `json:"deliverycharge"` Orderamount float32 `json:"orderamount"` Customerid int `json:"customerid"` Pickupcustomer string `json:"pickupcustomer"` Pickupcontactno string `json:"pickupcontactno"` Pickuplocationid int `json:"pickuplocationid"` Pickupaddress string `json:"pickupaddress"` Pickupsuburb string `json:"pickupsuburb"` Pickupcity string `json:"pickupcity"` Pickuplat FlexibleString `json:"pickuplat"` Pickuplong FlexibleString `json:"pickuplong"` Deliveryid int `json:"deliveryid"` Deliverycustomerid int `json:"deliverycustomerid"` Deliverycustomer string `json:"deliverycustomer"` Deliverycontactno string `json:"deliverycontactno"` Deliverylocationid int `json:"deliverylocationid"` Deliveryaddress string `json:"deliveryaddress"` Deliverysuburb string `json:"deliverysuburb"` Droplat FlexibleString `json:"droplat"` Droplon FlexibleString `json:"droplon"` Deliverylat FlexibleString `json:"deliverylat"` Deliverylong FlexibleString `json:"deliverylong"` Deliverytype string `json:"deliverytype"` Paymenttype int `json:"paymenttype"` Tenantname string `json:"tenantname"` Tenanttoken string `json:"tenanttoken"` Tenantsuburb string `json:"tenantsuburb"` Tenantcity string `json:"tenantcity"` Tenantcontactno string `json:"tenantcontactno"` Tenantpostcode string `json:"tenantpostcode"` Locationname string `json:"locationname"` Locationsuburb string `json:"locationsuburb"` Locationcity string `json:"locationcity"` Locationcontactno string `json:"locationcontactno"` Rider string `json:"rider"` Ridercontactno string `json:"ridercontactno"` Riderkms FlexibleString `json:"riderkms"` Smsdelivery int `json:"smsdelivery"` Customertoken string `json:"customertoken"` Ridertoken string `json:"ridertoken"` } type DeliveryQuery struct { Tenantid int Customerid int Partnerid int UserID int Appuserid int Applocationid int Moduleid int Locationid int Configid int Fromdate string ToDate string Status string Pageno int Pagesize int Conn *gorm.DB Keyword string `json:"keyword"` } type Ordersummary struct { Total int `json:"total"` Created int `json:"created"` Pending int `json:"pending"` Processing int `json:"processing"` Delivered int `json:"delivered"` Cancelled int `json:"cancelled"` // Locationid int `json:"locationid"` Locationname string `json:"locationname"` Applocationid string `json:"applocationid"` } type Ordersummarylocation struct { Total int `json:"total"` Created int `json:"created"` Pending int `json:"pending"` Processing int `json:"processing"` Delivered int `json:"delivered"` Cancelled int `json:"cancelled"` Locationid int `json:"locationid"` Locationname string `json:"locationname"` } type Ordersummarydaily struct { Total int `json:"total"` Created int `json:"created"` Pending int `json:"pending"` Processing int `json:"processing"` Delivered int `json:"delivered"` Cancelled int `json:"cancelled"` Tenantid int `json:"tenantid"` Tenantname string `json:"tenantname"` Locationid int `json:"locationid"` Locationname string `json:"locationname"` } type OrderInsight struct { Applocationid int `json:"applocationid" gorm:"Primary_Key"` Locationname string `json:"locationname"` Ordermonths *Ordermonths `json:"ordermonths" gorm:"-"` } type OrderInsightv1 struct { Locationid int `json:"locationid" gorm:"Primary_Key"` Locationname string `json:"locationname"` Ordermonths *Ordermonths `json:"ordermonths" gorm:"-"` } type Ordermonths struct { Jan int `json:"jan"` Feb int `json:"feb"` Mar int `json:"mar"` Apr int `json:"apr"` May int `json:"may"` Jun int `json:"jun"` Jul int `json:"jul"` Aug int `Json:"aug"` Sep int `Json:"sep"` Oct int `Json:"oct"` Nov int `Json:"nov"` Dece int `Json:"dece"` // Applocationid int `json:"applocationid"` } type Orders struct { Orderheaderid int `json:"orderheaderid" gorm:"Primary_Key"` Tenantid int `json:"tenantid"` Locationid int `json:"locationid"` Applocationid int `json:"applocationid"` Moduleid int `json:"moduleid"` Partnerid int `json:"partnerid"` Configid int `json:"configid"` Categoryid int `json:"categoryid"` Subcategoryid int `json:"subcategoryid"` Orderid string `json:"orderid"` Orderdate string `json:"orderdate,omitempty"` Deliverytime string `json:"deliverytime"` Deliverytype string `json:"deliverytype"` Orderstatus string `json:"orderstatus"` Pending string `json:"pending"` Processing string `json:"processing"` Ready string `json:"ready"` Delivered string `json:"delivered"` Cancelled string `json:"cancelled"` Customerid int `json:"customerid"` Pickupaddress string `json:"pickupaddress"` Pickuplat FlexibleString `json:"pickuplat"` Pickuplong FlexibleString `json:"pickuplong"` Pickupcustomer string `json:"pickupcustomer"` Pickupcontactno string `json:"pickupcontactno"` Pickuplocation string `json:"pickupsuburb"` // alias Pickupcity string `json:"pickupcity"` Deliveryid int `json:"deliverycustomerid"` // alias Deliverycustomer string `json:"deliverycustomer"` Deliverycontactno string `json:"deliverycontactno"` Deliveryaddress string `json:"deliveryaddress"` Deliverylocation string `json:"deliverylocation"` Deliverycity string `json:"deliverycity"` Deliverylocationid int `json:"deliverylocationid"` Deliverylat FlexibleString `json:"deliverylat"` Deliverylong FlexibleString `json:"deliverylong"` Promotionid int `json:"promotionid"` Promoname string `json:"promoname"` Promoterms string `json:"promoterms"` Promovalue int `json:"promovalue"` Promoamount float32 `json:"promoamount"` Orderamount float32 `json:"orderamount"` Taxamount float32 `json:"taxamount"` Ordercharges float32 `json:"ordercharges"` Ordervalue float32 `json:"ordervalue"` Itemcount int `json:"itemcount"` Paymenttype int `json:"paymenttype"` Paymentstatus int `json:"paymentstatus"` Deliverycharge float32 `json:"deliverycharge"` Ordernotes string `json:"ordernotes"` Kms FlexibleString `json:"kms"` Remarks string `json:"remarks"` Tenantuserid int `json:"tenantuserid"` Partneruserid int `json:"partneruserid"` Smsdelivery int `json:"smsdelivery" gorm:"default:0"` Items []OrderDetail `json:"items" gorm:"-"` } type OrderDetails struct { Orderdetailid int `json:"orderdetailid" gorm:"primaryKey;autoIncrement"` Orderheaderid int `json:"orderheaderid"` Tenantid int `json:"tenantid"` Locationid int `json:"locationid"` Productid int `json:"productid"` Productname string `json:"productname"` Productdescription string `json:"productdescription"` Supplyqty float64 `json:"supplyqty"` Balanceqty float64 `json:"balanceqty"` Orderqty float64 `json:"orderqty"` Price float64 `json:"price"` Unitid int `json:"unitid"` Unitname string `json:"unitname"` Productaddonid int `json:"productaddonid"` Addontypeid int `json:"addontypeid"` Productmapid int `json:"productmapid"` Productvariantid int `json:"productvariantid"` Productaddondescription string `json:"productaddondescription"` Discountid int `json:"discountid"` Discountname string `json:"discountname"` Discountcode string `json:"discountcode"` Discountterms string `json:"discountterms"` Discountpercentage float64 `json:"discountpercentage"` Discountamount float64 `json:"discountamount"` Landingamount float64 `json:"landingamount"` Taxpercentage float64 `json:"taxpercentage"` Taxamount float64 `json:"taxamount"` Totaltaxamount float64 `json:"totaltaxamount"` Productsumprice float64 `json:"productsumprice"` Itemstatus string `json:"itemstatus"` Delivered string `json:"delivered"` Orderamount float64 `json:"Orderamount"` Productimage string `json:"productimage"` } type OrderDetail struct { Orderdetailid int `json:"orderdetailid" gorm:"primaryKey;autoIncrement"` Orderheaderid int `json:"orderheaderid"` Tenantid int `json:"tenantid"` Locationid int `json:"locationid"` Productid int `json:"productid"` Productname string `json:"productname"` Productdescription string `json:"productdescription"` Supplyqty float64 `json:"supplyqty"` Balanceqty float64 `json:"balanceqty"` Orderqty float64 `json:"orderqty"` Price float64 `json:"price"` Unitid int `json:"unitid"` Unitname string `json:"unitname"` Productaddonid int `json:"productaddonid"` Addontypeid int `json:"addontypeid"` Productmapid int `json:"productmapid"` Productvariantid int `json:"productvariantid"` Productaddondescription string `json:"productaddondescription"` Discountid int `json:"discountid"` Discountname string `json:"discountname"` Discountcode string `json:"discountcode"` Discountterms string `json:"discountterms"` Discountpercentage float64 `json:"discountpercentage"` Discountamount float64 `json:"discountamount"` Landingamount float64 `json:"landingamount"` Taxpercentage float64 `json:"taxpercentage"` Taxamount float64 `json:"taxamount"` Productsumprice float64 `json:"productsumprice"` Itemstatus string `json:"itemstatus"` Delivered string `json:"delivered"` Orderamount float64 `json:"-" gorm:"-"` Productimage string `json:"productimage" gorm:"-"` // only for JSON } type CustomerOrder struct { Orderheaderid int `json:"orderheaderid" gorm:"Primary_Key"` Applocationid int `json:"applocationid"` Tenantid int `json:"tenantid"` Locationid int `json:"locationid"` Partnerid int `json:"partnerid"` Configid int `json:"configid"` Categoryid int `json:"categoryid"` Subcategoryid int `json:"subcategoryid"` Moduleid int `json:"moduleid"` Orderid string `json:"orderid"` Orderstatus string `json:"orderstatus"` Orderdate string `json:"orderdate,omitempty"` Ordernotes string `json:"ordernotes"` Itemcount int `json:"itemcount"` Deliverytime string `json:"deliverytime"` // alias for delivered Pending string `json:"pending"` Processing string `json:"processing"` Ready string `json:"ready"` Delivered string `json:"delivered"` // original delivered column Cancelled string `json:"cancelled"` Deliverycharge float32 `json:"deliverycharge"` Kms FlexibleString `json:"kms"` Smsdelivery int `json:"smsdelivery"` // Tenant Info Tenantname string `json:"tenantname"` Tenanttoken string `json:"tenanttoken"` Tenantcontactno string `json:"tenantcontactno"` Tenantpostcode string `json:"tenantpostcode"` Tenantsuburb string `json:"tenantsuburb"` Tenantcity string `json:"tenantcity"` Registrationno string `json:"registrationno"` // Location Info Locationname string `json:"locationname"` Locationcontactno string `json:"locationcontactno"` Locationpostcode string `json:"locationpostcode"` Locationsuburb string `json:"locationsuburb"` Locationcity string `json:"locationcity"` // App Location Applocation string `json:"applocation"` // Delivery Info (from `deliveries` table) Deliverystatus string `json:"deliverystatus"` DeliveryUserID int `json:"deliveryid"` // alias Assigntime string `json:"assigntime"` Starttime string `json:"starttime"` Arrivaltime string `json:"arrivaltime"` Pickuptime string `json:"pickuptime"` Finaldeliverytime string `json:"finaldeliverytime"` // alias for f.deliverytime Canceltime string `json:"canceltime"` Riderkms FlexibleString `json:"riderkms"` // Actualkms sql.NullFloat64 `json:"actualkms"` // Actualkms sql.NullFloat64 `json:"actualkms"` // Riderkms sql.NullFloat64 `json:"riderkms"` // Deliveryamt sql.NullFloat64 `json:"deliveryamt"` Droplat FlexibleString `json:"droplat"` Droplon FlexibleString `json:"droplon"` // Rider Rider string `json:"rider"` Orderamount float64 `json:"orderamount"` Taxamount float64 `json:"taxamount"` Totaltaxamount float64 `json:"totaltaxamount"` Riderkms_v2 FlexibleString `json:"-" gorm:"column:riderkms"` // Extra safety // Items if applicable OrderDetails []OrderDetails `json:"orderdetails" gorm:"-"` } type Ordersequences struct { Sequenceid int `json:"sequenceid" gorm:"Primary_Key"` Tenantid int `json:"tenantid"` Orderprefix string `json:"orderprefix" gorm:"default:ORD"` Customerprefix string `json:"customerprefix" gorm:"default:CUS"` Appointmentprefix string `json:"appointmentprefix" gorm:"default:ORD"` Receiptprefix string `json:"receiptprefix" gorm:"default:REC"` Paymentprefix string `json:"paymentprefix" gorm:"default:PAY"` }