package xlsx import ( "errors" "fmt" "strconv" "strings" "time" "airlines/pkg/model" "airlines/pkg/names" "airlines/pkg/airports" ) func (t Ticket) ToUser() (*model.User, error) { fio, err := names.ParseLatinName(t.Passenger) if err != nil { return nil, fmt.Errorf("%v %s", t.Sheet, err.Error()) } sex := names.GenderFromTitle(t.Title) u := &model.User{ Nick: "", Name: strings.ToUpper(fio.First), Surname: strings.ToUpper(fio.Last), Fathersname: strings.ToUpper(fio.Patronymic), Sex: sex, } return u, nil } func (t Ticket) ToCard() (*model.Card, error) { prefix, number, bonus := model.ParseCardLine(t.Card) if number == 0 && prefix == "" && bonus == "" { return nil, errors.New("do not have card") } return &model.Card{ Prefix: prefix, Number: number, Bonusprogramm: "", }, nil } func (t Ticket) ToFlight() (*model.Flight, error) { fromIATA := strings.ToUpper(strings.TrimSpace(t.FromAirport)) toIATA := strings.ToUpper(strings.TrimSpace(t.ToAirport)) fromRec, _ := airports.LookupIATA(fromIATA) dateStr := strings.TrimLeft(strings.TrimSpace(t.FlightDate), "'") timeStr := strings.TrimLeft(strings.TrimSpace(t.FlightTime), "'") timeStr = strings.ReplaceAll(timeStr, "-", ":") if dateStr == "" || timeStr == "" { return nil, errors.New("missing FlightDate or FlightTime") } hh, mm, err := parseHHMM(timeStr) if err != nil { return nil, err } day, err := time.Parse("2006-01-02", dateStr) if err != nil { return nil, err } loc := model.TzFromAirportRecord(fromRec) departLocal := time.Date(day.Year(), day.Month(), day.Day(), hh, mm, 0, 0, loc) departUTC := departLocal.UTC() return &model.Flight{ Number: strings.TrimSpace(t.FlightNumber), From: fromIATA, FromCoords: t.FromCoords, To: toIATA, ToCoords: t.ToCoords, Date: departUTC, HasTime: true, }, nil } func parseHHMM(s string) (int, int, error) { // Accept "H:MM", "HH:MM" parts := strings.Split(s, ":") if len(parts) != 2 { return 0, 0, errors.New("invalid FlightTime, expected HH:MM") } hh, err := strconv.Atoi(parts[0]) if err != nil { return 0, 0, err } mm, err := strconv.Atoi(parts[1]) if err != nil { return 0, 0, err } if hh < 0 || hh > 23 || mm < 0 || mm > 59 { return 0, 0, errors.New("invalid FlightTime range") } return hh, mm, nil }