Files
fm_be/internal/domain/easa_release/model.go
2026-07-16 22:16:45 +07:00

78 lines
3.4 KiB
Go

package easarelease
import (
"time"
"gorm.io/gorm"
complaint "wucher/internal/domain/complaint"
flightdomain "wucher/internal/domain/flight"
helicopter "wucher/internal/domain/helicopter"
"wucher/internal/shared/pkg/uuidv7"
)
type EASARelease struct {
ID []byte `gorm:"type:binary(16);primaryKey;column:id"`
HelicopterID []byte `gorm:"type:binary(16);not null;index;column:helicopter_id"`
// ComplaintID scopes the release to the specific complaint it closes (optional).
// When set, the release is fetched via get-by-complaint and closes that complaint.
// When NULL the release is standalone (aircraft cleared with no open defect).
ComplaintID []byte `gorm:"type:binary(16);index;column:complaint_id"`
// FlightID — optional flight context. Retained for the standalone (no-complaint)
// sign-off gate, which is still flight-scoped. Not required for complaint releases.
FlightID []byte `gorm:"type:binary(16);index;column:flight_id"`
EASADate *time.Time `gorm:"type:date;column:easa_date"`
EASAACHours *string `gorm:"type:varchar(20);column:easa_ac_hours"`
EASALocation *string `gorm:"type:varchar(255);column:easa_location"`
EASAWONo *string `gorm:"type:varchar(100);column:easa_wo_no"`
EASAMaintManualRevAirframe *string `gorm:"type:varchar(100);column:easa_maint_manual_rev_airframe"`
EASAMaintManualRevEngine *string `gorm:"type:varchar(100);column:easa_maint_manual_rev_engine"`
EASASignerID *string `gorm:"type:varchar(100);column:easa_signer_id"`
EASAPermitNo *string `gorm:"type:varchar(100);column:easa_permit_no"`
SignedAt *time.Time `gorm:"type:datetime(3);column:signed_at"`
SignedBy []byte `gorm:"type:binary(16);column:signed_by"`
Helicopter *helicopter.Helicopter `gorm:"foreignKey:HelicopterID;references:ID"`
Flight *flightdomain.Flight `gorm:"foreignKey:FlightID;references:ID;constraint:OnUpdate:CASCADE,OnDelete:SET NULL"`
Complaint *complaint.Complaint `gorm:"foreignKey:ComplaintID;references:ID;constraint:OnUpdate:CASCADE,OnDelete:SET NULL"`
CreatedAt time.Time `gorm:"type:datetime(3);column:created_at"`
CreatedBy []byte `gorm:"type:binary(16);column:created_by"`
UpdatedAt time.Time `gorm:"type:datetime(3);column:updated_at"`
UpdatedBy []byte `gorm:"type:binary(16);column:updated_by"`
DeletedAt *time.Time `gorm:"type:datetime(3);index;column:deleted_at"`
DeletedBy []byte `gorm:"type:binary(16);column:deleted_by"`
}
func (EASARelease) TableName() string { return "easa_releases" }
func (e *EASARelease) BeforeCreate(_ *gorm.DB) error {
if len(e.ID) == 0 {
e.ID = uuidv7.MustBytes()
}
return nil
}
func (e *EASARelease) IsSigned() bool { return e != nil && e.SignedAt != nil }
func (e *EASARelease) IsActive() bool { return e.IsSigned() }
// MissingSignFields reports which mandatory fields are still empty for signing.
// Only the signer is required — it is auto-filled from the duty pilot. The other
// document fields (date, A/C hours, location, WO no, manual revisions) are
// adjustable free text and optional, so a release can be signed without them.
func (e *EASARelease) MissingSignFields() []string {
if e == nil {
return []string{"easa_signer_id"}
}
var missing []string
if e.EASASignerID == nil || *e.EASASignerID == "" {
missing = append(missing, "easa_signer_id")
}
return missing
}