init push

This commit is contained in:
2026-07-16 22:16:45 +07:00
commit 8b068bdb10
1021 changed files with 332816 additions and 0 deletions

View File

@@ -0,0 +1,121 @@
package flightdata
import (
"strings"
sharedconst "wucher/internal/shared/const"
)
const (
StatusInProgress = "in_progress"
StatusCompleted = "completed"
)
// IsComplete reports whether the persisted flight-data status is complete.
func IsComplete(row *FlightData) bool {
if row == nil {
return false
}
return strings.EqualFold(strings.TrimSpace(row.Status), StatusCompleted)
}
func DeriveStatus(row *FlightData, details *SPODetails) string {
if !isBaseComplete(row) {
return StatusInProgress
}
switch missionType(row) {
case sharedconst.MissionTypeCAT, sharedconst.MissionTypeNCO, sharedconst.MissionTypeSPO:
return StatusCompleted
case sharedconst.MissionTypeHEMS:
return StatusCompleted
}
return StatusInProgress
}
func hasExactlyOneLocation(a, b []byte) bool {
hasA := len(a) == 16
hasB := len(b) == 16
return hasA != hasB
}
func missionType(row *FlightData) string {
if row == nil || row.Mission == nil {
return ""
}
return strings.ToUpper(strings.TrimSpace(row.Mission.Type))
}
func isBaseComplete(row *FlightData) bool {
if row == nil {
return false
}
requiresRotorBrakeCycle := true
switch missionType(row) {
case sharedconst.MissionTypeCAT, sharedconst.MissionTypeNCO, sharedconst.MissionTypeSPO:
requiresRotorBrakeCycle = false
}
return len(row.MissionID) == 16 &&
hasExactlyOneLocation(row.FromICAOID, row.FromHospitalID) &&
hasExactlyOneLocation(row.ToICAOID, row.ToHospitalID) &&
!row.FlightTakeOff.IsZero() &&
!row.FlightLanding.IsZero() &&
row.FlightDuration > 0 &&
row.LandingCount > 0 &&
(!requiresRotorBrakeCycle || row.RotorBrakeCycle > 0)
}
func isHESLOComplete(details SPOHESLODetails) bool {
if len(details.Flights) == 0 || len(details.Slings) == 0 {
return false
}
for i := range details.Flights {
if details.Flights[i].ROT <= 0 || len(details.Flights[i].FuelTruckID) != 16 || len(details.Flights[i].LoggingSlingID) != 16 {
return false
}
}
for i := range details.Slings {
if len(details.Slings[i].HESLOFlightID) != 16 || len(details.Slings[i].SlingID) != 16 {
return false
}
}
return true
}
func isLoggingComplete(details SPOLoggingDetails) bool {
if len(details.Slings) == 0 {
return false
}
for i := range details.Slings {
if len(details.Slings[i].SlingID) != 16 {
return false
}
}
return true
}
func isHECComplete(details SPOHECDetails) bool {
if len(details.Flights) == 0 || len(details.Slings) == 0 || len(details.Loads) == 0 {
return false
}
for i := range details.Flights {
if details.Flights[i].ROT <= 0 || details.Flights[i].HECCycle <= 0 || len(details.Flights[i].EquipmentID) != 16 {
return false
}
}
for i := range details.Slings {
if len(details.Slings[i].SlingID) != 16 {
return false
}
}
for i := range details.Loads {
if strings.TrimSpace(details.Loads[i].LoadCategory) == "" || details.Loads[i].Quantity <= 0 {
return false
}
}
return true
}