init push
This commit is contained in:
121
internal/domain/flight_data/completion.go
Normal file
121
internal/domain/flight_data/completion.go
Normal 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
|
||||
}
|
||||
Reference in New Issue
Block a user