store based coustmers
This commit is contained in:
@@ -1,11 +1,13 @@
|
||||
package repositories
|
||||
|
||||
import (
|
||||
"errors"
|
||||
"fmt"
|
||||
"log"
|
||||
"nearle/models"
|
||||
"strconv"
|
||||
"strings"
|
||||
"time"
|
||||
|
||||
"github.com/jinzhu/copier"
|
||||
"gorm.io/gorm"
|
||||
@@ -147,18 +149,75 @@ func (r *deliveriesRepository) UpdateDelivery(data models.UpdateDeliveryStatus)
|
||||
var ord models.Updateorderstatus
|
||||
var cloc models.Customerlocations
|
||||
|
||||
if data.Deliveryid == 0 {
|
||||
return errors.New("deliveryid is required")
|
||||
}
|
||||
|
||||
tx := r.db.Begin()
|
||||
if tx.Error != nil {
|
||||
return tx.Error
|
||||
}
|
||||
|
||||
if err := tx.Table("deliveries").Where("deliveryid = ?", data.Deliveryid).Updates(&data).Error; err != nil {
|
||||
tx.Rollback()
|
||||
return err
|
||||
}
|
||||
|
||||
// The parent order is resolved from the delivery row rather than taken from
|
||||
// the request. Every status branch below writes the order with
|
||||
// "WHERE orderheaderid = ?", and a client that omits orderheaderid made that
|
||||
// "WHERE orderheaderid = 0", matching nothing. GORM reports no error for an
|
||||
// update that affects no rows, so the handler still answered 201 Success
|
||||
// while the order silently kept its old status — 635 deliveries are marked
|
||||
// delivered against an order still reading pending because of this.
|
||||
//
|
||||
// deliveryid is the one field every caller must send (it is how the row
|
||||
// above is found), so deriving the link from it makes the sync independent
|
||||
// of how complete the client's payload is.
|
||||
orderHeaderID := data.Orderheaderid
|
||||
if orderHeaderID == 0 {
|
||||
if err := tx.Table("deliveries").
|
||||
Select("orderheaderid").
|
||||
Where("deliveryid = ?", data.Deliveryid).
|
||||
Scan(&orderHeaderID).Error; err != nil {
|
||||
tx.Rollback()
|
||||
return err
|
||||
}
|
||||
}
|
||||
if orderHeaderID == 0 {
|
||||
tx.Rollback()
|
||||
return fmt.Errorf("delivery %d has no order attached", data.Deliveryid)
|
||||
}
|
||||
|
||||
// syncOrder applies the status to the parent order and fails loudly if the
|
||||
// row is not there, instead of reporting success for a write that landed
|
||||
// nowhere.
|
||||
syncOrder := func() error {
|
||||
res := tx.Table("orders").Where("orderheaderid = ?", orderHeaderID).Updates(&ord)
|
||||
if res.Error != nil {
|
||||
return res.Error
|
||||
}
|
||||
if res.RowsAffected == 0 {
|
||||
return fmt.Errorf("order %d not found for delivery %d", orderHeaderID, data.Deliveryid)
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
// The lifecycle timestamp mirrored onto the order. Clients frequently send
|
||||
// the status without one, and because Updates() skips zero-valued struct
|
||||
// fields the order's own column was left blank while its status moved on.
|
||||
stamp := func(supplied string) string {
|
||||
if strings.TrimSpace(supplied) != "" {
|
||||
return supplied
|
||||
}
|
||||
return time.Now().Format("2006-01-02 15:04:05")
|
||||
}
|
||||
|
||||
switch data.Orderstatus {
|
||||
case "pending":
|
||||
ord.Orderstatus = data.Orderstatus
|
||||
ord.Pending = data.Assigntime
|
||||
if err := tx.Table("orders").Where("orderheaderid = ?", data.Orderheaderid).Updates(&ord).Error; err != nil {
|
||||
ord.Pending = stamp(data.Assigntime)
|
||||
if err := syncOrder(); err != nil {
|
||||
tx.Rollback()
|
||||
return err
|
||||
}
|
||||
@@ -181,8 +240,8 @@ func (r *deliveriesRepository) UpdateDelivery(data models.UpdateDeliveryStatus)
|
||||
|
||||
case "delivered":
|
||||
ord.Orderstatus = data.Orderstatus
|
||||
ord.Delivered = data.Deliverytime
|
||||
if err := tx.Table("orders").Where("orderheaderid = ?", data.Orderheaderid).Updates(&ord).Error; err != nil {
|
||||
ord.Delivered = stamp(data.Deliverytime)
|
||||
if err := syncOrder(); err != nil {
|
||||
tx.Rollback()
|
||||
return err
|
||||
}
|
||||
@@ -204,8 +263,8 @@ func (r *deliveriesRepository) UpdateDelivery(data models.UpdateDeliveryStatus)
|
||||
|
||||
case "cancelled":
|
||||
ord.Orderstatus = data.Orderstatus
|
||||
ord.Cancelled = data.Canceltime
|
||||
if err := tx.Table("orders").Where("orderheaderid = ?", data.Orderheaderid).Updates(&ord).Error; err != nil {
|
||||
ord.Cancelled = stamp(data.Canceltime)
|
||||
if err := syncOrder(); err != nil {
|
||||
tx.Rollback()
|
||||
return err
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user