package models import "time" const ( SYBInnerCodePending = "pending" SYBInnerCodeMatching = "matching" SYBInnerCodeReady = "ready" SYBInnerCodeAlreadyFilled = "already_filled" SYBInnerCodeSkipped = "skipped" SYBInnerCodeFailed = "failed" SYBInnerCodeQueued = "queued" SYBInnerCodeApplying = "applying" SYBInnerCodeUpdated = "updated" SYBInnerCodeNeedsCheck = "needs_check" ) // SYBInnerCodeRecord is one Excel business identity. Individual inbound codes // live in SYBInnerCodeItem so order and uniqueness do not depend on CSV text. type SYBInnerCodeRecord struct { ID uint64 `json:"id" gorm:"primaryKey;autoIncrement"` BusinessDate string `json:"businessDate" gorm:"size:10;not null;index;uniqueIndex:ux_syb_inner_code_business,priority:1"` OrderNumber string `json:"orderNumber" gorm:"size:64;not null;index;uniqueIndex:ux_syb_inner_code_business,priority:2"` Stall string `json:"stall" gorm:"size:191;not null;uniqueIndex:ux_syb_inner_code_business,priority:3"` SpecKey string `json:"specKey" gorm:"size:500;not null;uniqueIndex:ux_syb_inner_code_business,priority:4"` SpecRaw string `json:"specRaw" gorm:"size:500;not null"` SourceSKURaw string `json:"sourceSkuRaw" gorm:"size:500;not null"` ShopName string `json:"shopName" gorm:"size:191;not null"` SourceRow int `json:"sourceRow" gorm:"not null"` PrintSequence int `json:"printSequence" gorm:"not null;default:0"` Status string `json:"status" gorm:"size:24;not null;index"` ResultMessage string `json:"resultMessage" gorm:"size:1000;not null;default:''"` CreatedBy uint64 `json:"createdBy" gorm:"not null"` ImportRequestID string `json:"-" gorm:"size:36;not null;index"` LastDeleteRequestID *string `json:"-" gorm:"size:36;index"` ApplyBatchID *string `json:"applyBatchId" gorm:"size:36;index"` ApplyStartedAt *time.Time `json:"applyStartedAt"` AppliedAt *time.Time `json:"appliedAt"` Items []SYBInnerCodeItem `json:"items" gorm:"foreignKey:RecordID;references:ID;constraint:OnUpdate:CASCADE,OnDelete:CASCADE"` Plan *SYBInnerCodePlan `json:"plan,omitempty" gorm:"foreignKey:RecordID;references:ID;constraint:OnUpdate:CASCADE,OnDelete:CASCADE"` CreatedAt time.Time `json:"createdAt"` UpdatedAt time.Time `json:"updatedAt"` } func (SYBInnerCodeRecord) TableName() string { return "syb_inner_code_record" } type SYBInnerCodeItem struct { ID uint64 `json:"id" gorm:"primaryKey;autoIncrement"` RecordID uint64 `json:"recordId" gorm:"not null;index;uniqueIndex:ux_syb_inner_code_record_ordinal,priority:1"` BusinessDate string `json:"-" gorm:"size:10;not null;uniqueIndex:ux_syb_inner_code_date_code,priority:1"` Code string `json:"code" gorm:"size:128;not null;uniqueIndex:ux_syb_inner_code_date_code,priority:2"` Ordinal int `json:"ordinal" gorm:"not null;uniqueIndex:ux_syb_inner_code_record_ordinal,priority:2"` SourceRow int `json:"sourceRow" gorm:"not null"` CreatedAt time.Time `json:"createdAt"` } func (SYBInnerCodeItem) TableName() string { return "syb_inner_code_item" } // SYBInnerCodeApplyBatch is introduced with the import contract so later // writeback migrations never need to reshape imported records. type SYBInnerCodeApplyBatch struct { ID string `json:"id" gorm:"size:36;primaryKey"` RequestID string `json:"-" gorm:"size:36;not null;uniqueIndex:ux_syb_inner_code_apply_request"` Status string `json:"status" gorm:"size:24;not null;index"` Requested int `json:"requested" gorm:"not null"` Processed int `json:"processed" gorm:"not null;default:0"` CreatedBy uint64 `json:"createdBy" gorm:"not null"` StartedAt *time.Time `json:"startedAt"` FinishedAt *time.Time `json:"finishedAt"` CreatedAt time.Time `json:"createdAt"` UpdatedAt time.Time `json:"updatedAt"` } func (SYBInnerCodeApplyBatch) TableName() string { return "syb_inner_code_apply_batch" } type SYBInnerCodeApplyItem struct { ID uint64 `json:"id" gorm:"primaryKey;autoIncrement"` BatchID string `json:"batchId" gorm:"size:36;not null;index;uniqueIndex:ux_syb_inner_code_apply_item,priority:1"` Batch SYBInnerCodeApplyBatch `json:"-" gorm:"foreignKey:BatchID;references:ID;constraint:OnUpdate:CASCADE,OnDelete:CASCADE"` RecordID uint64 `json:"recordId" gorm:"not null;index;uniqueIndex:ux_syb_inner_code_apply_item,priority:2"` Record SYBInnerCodeRecord `json:"-" gorm:"foreignKey:RecordID;references:ID;constraint:OnUpdate:CASCADE,OnDelete:CASCADE"` Status string `json:"status" gorm:"size:24;not null;index"` Message string `json:"message" gorm:"size:1000;not null;default:''"` CreatedAt time.Time `json:"createdAt"` UpdatedAt time.Time `json:"updatedAt"` } func (SYBInnerCodeApplyItem) TableName() string { return "syb_inner_code_apply_item" } type SYBInnerCodeCheckpoint struct { ID uint64 `json:"id" gorm:"primaryKey;autoIncrement"` RecordID uint64 `json:"recordId" gorm:"not null;index;uniqueIndex:ux_syb_inner_code_checkpoint_seq,priority:1"` Record SYBInnerCodeRecord `json:"-" gorm:"foreignKey:RecordID;references:ID;constraint:OnUpdate:CASCADE,OnDelete:CASCADE"` Sequence int `json:"sequence" gorm:"not null;uniqueIndex:ux_syb_inner_code_checkpoint_seq,priority:2"` Phase string `json:"phase" gorm:"size:32;not null"` Action string `json:"action" gorm:"size:32;not null"` StateJSON string `json:"state" gorm:"type:text;not null"` CreatedAt time.Time `json:"createdAt"` } func (SYBInnerCodeCheckpoint) TableName() string { return "syb_inner_code_checkpoint" } type SYBInnerCodeWorkerLease struct { ID uint8 `json:"-" gorm:"primaryKey;autoIncrement:false"` OwnerID string `json:"-" gorm:"size:36;not null"` ExpiresAt time.Time `json:"-" gorm:"not null;index"` Version uint64 `json:"-" gorm:"not null;default:0"` UpdatedAt time.Time `json:"-"` } func (SYBInnerCodeWorkerLease) TableName() string { return "syb_inner_code_worker_lease" } // SYBInnerCodeMutation records idempotent import/delete request results. type SYBInnerCodeMutation struct { RequestID string `json:"-" gorm:"size:36;primaryKey"` Action string `json:"-" gorm:"size:16;not null"` ResultJSON string `json:"-" gorm:"type:text;not null"` CreatedAt time.Time `json:"-"` } func (SYBInnerCodeMutation) TableName() string { return "syb_inner_code_mutation" } type SYBInnerCodeMatchJob struct { ID string `json:"id" gorm:"size:36;primaryKey"` WorkKey string `json:"-" gorm:"size:128;not null;uniqueIndex:ux_syb_inner_code_match_work"` BusinessDate string `json:"businessDate" gorm:"size:10;not null;index"` RecordIDsJSON string `json:"-" gorm:"type:text;not null"` Status string `json:"status" gorm:"size:24;not null;index"` Total int `json:"total" gorm:"not null;default:0"` Processed int `json:"processed" gorm:"not null;default:0"` Ready int `json:"ready" gorm:"not null;default:0"` Failed int `json:"failed" gorm:"not null;default:0"` ErrorMessage string `json:"errorMessage" gorm:"size:1000;not null;default:''"` StartedAt *time.Time `json:"startedAt"` FinishedAt *time.Time `json:"finishedAt"` CreatedAt time.Time `json:"createdAt"` UpdatedAt time.Time `json:"updatedAt"` } func (SYBInnerCodeMatchJob) TableName() string { return "syb_inner_code_match_job" } type SYBInnerCodePlan struct { ID uint64 `json:"id" gorm:"primaryKey;autoIncrement"` RecordID uint64 `json:"recordId" gorm:"not null;uniqueIndex:ux_syb_inner_code_plan_record"` Record SYBInnerCodeRecord `json:"-" gorm:"foreignKey:RecordID;references:ID;constraint:OnUpdate:CASCADE,OnDelete:CASCADE"` MatchJobID string `json:"matchJobId" gorm:"size:36;not null;index"` StockID int64 `json:"stockId" gorm:"not null"` DetailID int64 `json:"detailId" gorm:"not null"` SYBSpec string `json:"sybSpec" gorm:"size:500;not null"` SYBSKU string `json:"sybSku" gorm:"size:500;not null"` SYBVariationSKU string `json:"sybVariationSku" gorm:"size:500;not null"` PurchasePlatform string `json:"purchasePlatform" gorm:"size:255;not null"` PurchaseCode string `json:"purchaseCode" gorm:"size:255;not null"` RemoteInnerCode string `json:"remoteInnerCode" gorm:"size:128;not null"` RemoteItemsJSON string `json:"remoteItems" gorm:"type:text;not null"` PlaceholderCount int `json:"placeholderCount" gorm:"not null;default:0"` ReplaceOldCodeCount int `json:"replaceOldCodeCount" gorm:"not null;default:0"` EvidenceHash string `json:"evidenceHash" gorm:"size:64;not null"` PlannedAt time.Time `json:"plannedAt" gorm:"not null"` } func (SYBInnerCodePlan) TableName() string { return "syb_inner_code_plan" }