feat: queue and reconcile SYB purchase order numbers (#305)
This commit is contained in:
@@ -119,6 +119,7 @@ func run() error {
|
||||
}
|
||||
goautoreplacement.RecoverMatching(db)
|
||||
goautopurchase.RecoverPurchaseMatching(db)
|
||||
goautopurchase.RecoverOrderWritebacks(db)
|
||||
goautotask.RecoverReplacementActivations(db)
|
||||
}
|
||||
offlineMonitorContext, stopOfflineMonitors := context.WithCancel(context.Background())
|
||||
|
||||
@@ -0,0 +1,28 @@
|
||||
package version_local
|
||||
|
||||
import (
|
||||
"go-admin/app/goauto/models"
|
||||
"go-admin/cmd/migrate/migration"
|
||||
common "go-admin/common/models"
|
||||
"gorm.io/gorm"
|
||||
"gorm.io/gorm/clause"
|
||||
"runtime"
|
||||
)
|
||||
|
||||
func init() {
|
||||
_, file, _, _ := runtime.Caller(0)
|
||||
migration.Migrate.SetVersion(migration.GetFilename(file), migratePurchaseOrderWriteback)
|
||||
}
|
||||
|
||||
// Append-only schema. Never queues historical purchases or changes job switches.
|
||||
func migratePurchaseOrderWriteback(db *gorm.DB, version string) error {
|
||||
return db.Transaction(func(tx *gorm.DB) error {
|
||||
if err := tx.AutoMigrate(&models.PurchaseOrderWriteback{}, &models.PurchaseOrderWritebackCommand{}, &models.PurchaseOrderWritebackLease{}); err != nil {
|
||||
return err
|
||||
}
|
||||
if err := tx.Clauses(clause.OnConflict{DoNothing: true}).Create(&models.PurchaseOrderWritebackLease{ID: 1}).Error; err != nil {
|
||||
return err
|
||||
}
|
||||
return tx.Create(&common.Migration{Version: version}).Error
|
||||
})
|
||||
}
|
||||
+50
@@ -0,0 +1,50 @@
|
||||
package version_local
|
||||
|
||||
import (
|
||||
"go-admin/app/goauto/models"
|
||||
common "go-admin/common/models"
|
||||
"gorm.io/driver/sqlite"
|
||||
"gorm.io/gorm"
|
||||
"testing"
|
||||
)
|
||||
|
||||
func TestPurchaseOrderWritebackMigrationPreservesFacts(t *testing.T) {
|
||||
db, err := gorm.Open(sqlite.Open("file:"+t.Name()+"?mode=memory&cache=shared"), &gorm.Config{})
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
if err = db.AutoMigrate(&common.Migration{}); err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
if err = db.Exec("CREATE TABLE purchase_task (id integer primary key, status text)").Error; err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
if err = db.Exec("INSERT INTO purchase_task VALUES (1, 'order_created')").Error; err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
if err = migratePurchaseOrderWriteback(db, "1789800200000"); err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
if err = db.Model(&models.PurchaseOrderWritebackLease{}).Where("id = 1").Update("owner", "active-owner").Error; err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
// Repeating schema work must neither queue history nor reset an active lease.
|
||||
if err = migratePurchaseOrderWriteback(db, "repeat-schema-test"); err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
var lease models.PurchaseOrderWritebackLease
|
||||
if err = db.First(&lease, 1).Error; err != nil || lease.Owner != "active-owner" {
|
||||
t.Fatal("lease reset", err)
|
||||
}
|
||||
var count int64
|
||||
if err = db.Model(&models.PurchaseOrderWriteback{}).Count(&count).Error; err != nil || count != 0 {
|
||||
t.Fatal("history queued", err)
|
||||
}
|
||||
var status string
|
||||
if err = db.Table("purchase_task").Select("status").Where("id = 1").Scan(&status).Error; err != nil || status != "order_created" {
|
||||
t.Fatal("purchase changed", err)
|
||||
}
|
||||
if err = db.Model(&common.Migration{}).Where("version = ?", "1789800200000").Count(&count).Error; err != nil || count != 1 {
|
||||
t.Fatal("version missing", err)
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user