feat: give the console customer page a flat address to edit
The admin customer page collected an address (door no, street, suburb, city, state, postcode, landmark, lat/lng) that the backend had nowhere to store, so it was silently dropped on save. Add those fields flat onto appcustomers, matching the reference console's shape, plus an applocationid for zone scoping. - GET /admin/customers: add ?applocationid= filter; emit firstname/lastname split and the address fields alongside the existing joined name. - GET /admin/customers/summary (new): stat-tile counts (total/active/blocked) scoped like the list, so the client stops deriving them from the full page. - PATCH /admin/customers/🆔 accept firstname/lastname directly (single name still splits as a fallback) and persist every address field; pointer fields so an omitted field is not confused with one cleared to empty. Pagination and keyword search were already present. Additive, nullable columns — AutoMigrate handles it, no data rewrite. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
@@ -117,21 +117,36 @@ func (MilerProfile) TableName() string {
|
||||
}
|
||||
|
||||
type AppCustomer struct {
|
||||
Appcustomerid int `json:"appcustomerid" gorm:"primaryKey;column:appcustomerid"`
|
||||
Firstname string `json:"firstname" gorm:"column:firstname;not null"`
|
||||
Lastname string `json:"lastname" gorm:"column:lastname"`
|
||||
Phone string `json:"phone" gorm:"column:phone;unique;not null"`
|
||||
Email string `json:"email" gorm:"column:email"`
|
||||
Loginpinhash string `json:"-" gorm:"column:loginpinhash"`
|
||||
Defaultlatitude float64 `json:"defaultlatitude" gorm:"column:defaultlatitude"`
|
||||
Defaultlongitude float64 `json:"defaultlongitude" gorm:"column:defaultlongitude"`
|
||||
Defaultpincode string `json:"defaultpincode" gorm:"column:defaultpincode"`
|
||||
Devicetoken string `json:"device_token,omitempty" gorm:"column:device_token"`
|
||||
Status string `json:"status" gorm:"column:status;default:Active"` // Active, Blocked, Deleted
|
||||
Configid int `json:"configid" gorm:"column:configid;default:1"`
|
||||
Lastloginat *time.Time `json:"lastloginat" gorm:"column:lastloginat"`
|
||||
Createdat time.Time `json:"createdat" gorm:"column:createdat;default:CURRENT_TIMESTAMP"`
|
||||
Updatedat time.Time `json:"updatedat" gorm:"column:updatedat;default:CURRENT_TIMESTAMP"`
|
||||
Appcustomerid int `json:"appcustomerid" gorm:"primaryKey;column:appcustomerid"`
|
||||
Firstname string `json:"firstname" gorm:"column:firstname;not null"`
|
||||
Lastname string `json:"lastname" gorm:"column:lastname"`
|
||||
Phone string `json:"phone" gorm:"column:phone;unique;not null"`
|
||||
Email string `json:"email" gorm:"column:email"`
|
||||
Loginpinhash string `json:"-" gorm:"column:loginpinhash"`
|
||||
Defaultlatitude float64 `json:"defaultlatitude" gorm:"column:defaultlatitude"`
|
||||
Defaultlongitude float64 `json:"defaultlongitude" gorm:"column:defaultlongitude"`
|
||||
Defaultpincode string `json:"defaultpincode" gorm:"column:defaultpincode"`
|
||||
// Flat address on the customer record, kept for parity with the console's
|
||||
// customer page (the reference stored the address this way). Separate from
|
||||
// the normalized appcustomerlocations table, which holds a customer's many
|
||||
// saved delivery addresses; this is the single profile address the console
|
||||
// edits.
|
||||
Doorno string `json:"doorno" gorm:"column:doorno"`
|
||||
Address string `json:"address" gorm:"column:address"`
|
||||
Suburb string `json:"suburb" gorm:"column:suburb"`
|
||||
City string `json:"city" gorm:"column:city"`
|
||||
State string `json:"state" gorm:"column:state"`
|
||||
Postcode string `json:"postcode" gorm:"column:postcode"`
|
||||
Landmark string `json:"landmark" gorm:"column:landmark"`
|
||||
Latitude float64 `json:"latitude" gorm:"column:latitude"`
|
||||
Longitude float64 `json:"longitude" gorm:"column:longitude"`
|
||||
Applocationid int `json:"applocationid" gorm:"column:applocationid"` // city/zone, for console scoping
|
||||
Devicetoken string `json:"device_token,omitempty" gorm:"column:device_token"`
|
||||
Status string `json:"status" gorm:"column:status;default:Active"` // Active, Blocked, Deleted
|
||||
Configid int `json:"configid" gorm:"column:configid;default:1"`
|
||||
Lastloginat *time.Time `json:"lastloginat" gorm:"column:lastloginat"`
|
||||
Createdat time.Time `json:"createdat" gorm:"column:createdat;default:CURRENT_TIMESTAMP"`
|
||||
Updatedat time.Time `json:"updatedat" gorm:"column:updatedat;default:CURRENT_TIMESTAMP"`
|
||||
}
|
||||
|
||||
func (AppCustomer) TableName() string {
|
||||
|
||||
Reference in New Issue
Block a user