Files
2026-07-16 22:16:45 +07:00

129 lines
4.5 KiB
Go

package helicopter
import (
"gorm.io/gorm"
"time"
filemanager "wucher/internal/domain/file_manager"
"wucher/internal/shared/pkg/uuidv7"
)
const (
StatusAvailable = "available"
StatusBooked = "booked"
StatusAOG = "aog"
StatusMCF = "mcf"
)
const (
AOGSourceUnknown = ""
AOGSourceManual = "manual"
AOGSourceAuto = "auto"
AOGSourceComplaint = "complaint"
)
// StatusRank is the display order for fleet and hold/defect listings — most critical
// first: MCF, then AOG, then Booked, then Available (any unknown status sorts last).
func StatusRank(status string) int {
switch status {
case StatusMCF:
return 0
case StatusAOG:
return 1
case StatusBooked:
return 2
case StatusAvailable:
return 3
default:
return 4
}
}
func IsValidStatus(s string) bool {
switch s {
case StatusAvailable, StatusBooked, StatusAOG, StatusMCF:
return true
default:
return false
}
}
type StatusInput struct {
IsBook bool
IsMCF bool
ComplaintGrounded bool
}
func (h *Helicopter) DeriveStatus(in StatusInput) string {
switch {
case in.IsMCF:
return StatusMCF
case h.AirOnGround || in.ComplaintGrounded:
return StatusAOG
case in.IsBook:
return StatusBooked
default:
return StatusAvailable
}
}
func (h *Helicopter) EnforceAOGInactive() {
if h.AirOnGround {
h.IsActive = false
}
}
func (h *Helicopter) EnforceMCFInactive(mcf bool) {
if mcf {
h.IsActive = false
}
}
type SortKeyPatch struct {
Set bool
Value *int
}
type Helicopter struct {
ID []byte `gorm:"type:binary(16);primaryKey;column:id"`
Designation string `gorm:"type:varchar(100);not null;column:designation"`
Identifier string `gorm:"type:varchar(100);uniqueIndex;not null;column:identifier"`
ReportSequence int `gorm:"not null;default:0;column:report_sequence"`
Type string `gorm:"type:varchar(100);not null;column:type"`
SortKey *int `gorm:"column:sortkey"`
Engine1 string `gorm:"type:varchar(100);column:engine_1"`
Engine2 string `gorm:"type:varchar(100);column:engine_2"`
Consumption float64 `gorm:"type:decimal(10,2);not null;default:0;column:consumption_lt_min"`
NR1 bool `gorm:"type:tinyint(1);not null;default:0;column:nr1"`
NR2 bool `gorm:"type:tinyint(1);not null;default:0;column:nr2"`
LH bool `gorm:"type:tinyint(1);not null;default:0;column:lh"`
RH bool `gorm:"type:tinyint(1);not null;default:0;column:rh"`
MGB bool `gorm:"type:tinyint(1);not null;default:0;column:mgb"`
IGB bool `gorm:"type:tinyint(1);not null;default:0;column:igb"`
TGB bool `gorm:"type:tinyint(1);not null;default:0;column:tgb"`
UTCOffset int `gorm:"not null;default:0;column:utc_offset"`
FotoAttachmentID []byte `gorm:"type:binary(16);index;column:foto_attachment_id"`
Dry bool `gorm:"type:tinyint(1);not null;default:0;column:dry"`
AirOnGround bool `gorm:"type:tinyint(1);not null;default:0;column:air_on_ground"`
AOGReason string `gorm:"type:text;column:aog_reason"`
AOGSource string `gorm:"type:varchar(16);not null;default:'';column:aog_source"`
Note string `gorm:"type:text;column:note"`
IsActive bool `gorm:"type:tinyint(1);index;not null;default:1;column:is_active"`
CreatedBy []byte `gorm:"type:binary(16);column:created_by"`
UpdatedBy []byte `gorm:"type:binary(16);column:updated_by"`
DeletedAt *time.Time `gorm:"column:deleted_at"`
CreatedByName string `gorm:"->;column:created_by_name"`
UpdatedByName string `gorm:"->;column:updated_by_name"`
FotoAttachment *filemanager.Attachment `gorm:"foreignKey:FotoAttachmentID;references:ID;constraint:OnUpdate:CASCADE,OnDelete:SET NULL"`
CreatedAt time.Time
UpdatedAt time.Time
}
func (Helicopter) TableName() string { return "helicopters" }
func (h *Helicopter) BeforeCreate(tx *gorm.DB) error {
if len(h.ID) == 0 {
h.ID = uuidv7.MustBytes()
}
return nil
}