package entities import ( "fmt" "strings" "time" "github.com/google/uuid" "gorm.io/gorm" ) type TInventoryRequestEntity struct { ID uuid.UUID `gorm:"primaryKey;type:uuid;default:uuid_generate_v4()" json:"id"` ReferenceNumber string `gorm:"type:varchar(100);" json:"reference_number"` DocumentNumber string `gorm:"type:varchar(100);" json:"document_number"` DocumentDate time.Time `gorm:"type:timestamp;" json:"document_date"` DueDate time.Time `gorm:"type:timestamp;" json:"due_date"` RequestType string `gorm:"type:varchar(50);" json:"request_type"` Note string `gorm:"type:text;" json:"note"` Status string `gorm:"type:varchar(50);default:'draft'" json:"status"` ClientID uuid.UUID `gorm:"type:uuid;index;" json:"client_id"` RequestLines []TInventoryRequestLineEntity `gorm:"foreignKey:InvRequestID;references:ID"` Assignment TAssignmentEntity `gorm:"-"` Client M_Client `gorm:"foreignKey:ClientID;references:ID"` FullAuditTrail } func (TInventoryRequestEntity) TableName() string { return "t_inventory_requests" } // GenerateDocumentNumber generates a new document number for a client func GenerateDocumentNumberInventoryRequest(db *gorm.DB, clientId string) (string, error) { prefix := "RQST" // Ambil nama client berdasarkan clientId var client struct { Name string } if err := db.Table("m_clients").Select("name").Where("id = ?", clientId).First(&client).Error; err != nil { return "", fmt.Errorf("client not found") } if client.Name == "" { return "", fmt.Errorf("client name is empty") } words := strings.Fields(client.Name) initials := "" for _, w := range words { if len(w) > 0 { initials += strings.ToUpper(string(w[0])) } } // Cari document number terakhir untuk client ini var lastRequest TInventoryRequestEntity err := db. Where("client_id = ?", clientId). Order("document_number DESC"). First(&lastRequest).Error seq := 1 if err == nil && lastRequest.DocumentNumber != "" { parts := strings.Split(lastRequest.DocumentNumber, "-") if len(parts) == 3 { fmt.Sscanf(parts[2], "%d", &seq) seq++ } } docNum := fmt.Sprintf("%s-%s-%04d", prefix, initials, seq) return docNum, nil }