wms-be/database/entities/t_inventory_quarantine_enti...

75 lines
2.3 KiB
Go

package entities
import (
"fmt"
"strings"
"time"
"github.com/google/uuid"
"gorm.io/gorm"
)
type TInventoryQuarantineEntity struct {
ID uuid.UUID `gorm:"primaryKey;type:uuid;default:uuid_generate_v4()" json:"id"`
DocumentNumber string `gorm:"type:varchar(100);" json:"document_number"`
DocumentDate time.Time `gorm:"type:timestamp;" json:"document_date"`
Status string `gorm:"type:varchar(50);default:'draft'" json:"status"`
WarehouseID uuid.UUID `gorm:"type:uuid;index;" json:"warehouse_id"`
ZonaID uuid.UUID `gorm:"type:uuid;index;" json:"zona_id"`
ClientID uuid.UUID `gorm:"type:uuid;index;" json:"client_id"`
Warehouse MWarehouseEntity `gorm:"foreignKey:WarehouseID;references:ID"`
Zona MZonaEntity `gorm:"foreignKey:ZonaID;references:ID"`
Client M_Client `gorm:"foreignKey:ClientID;references:ID"`
QuarantineLines []TInventoryQuarantineLineEntity `gorm:"foreignKey:QuarantineID;references:ID"`
Assignment TAssignmentEntity `gorm:"-"`
FullAuditTrail
}
func (TInventoryQuarantineEntity) TableName() string {
return "t_inventory_quarantines"
}
// GenerateDocumentNumber generates a new document number for a client
func GenerateDocumentNumberInQuarantine(db *gorm.DB, clientId string) (string, error) {
prefix := "QRTN"
// 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 lastReceipt TInventoryIssueEntity
err := db.
Where("client_id = ?", clientId).
Order("document_number DESC").
First(&lastReceipt).Error
seq := 1
if err == nil && lastReceipt.DocumentNumber != "" {
parts := strings.Split(lastReceipt.DocumentNumber, "-")
if len(parts) == 3 {
fmt.Sscanf(parts[2], "%d", &seq)
seq++
}
}
docNum := fmt.Sprintf("%s-%s-%04d", prefix, initials, seq)
return docNum, nil
}