From bb833561aa74f02970aee13cdc75973b29716491 Mon Sep 17 00:00:00 2001 From: leshe4ka46 Date: Mon, 27 Oct 2025 20:36:28 +0300 Subject: # This is a combination of 2 commits. # This is the 1st commit message: unmarshal all formats, merge them in the single table, users are truly unique # This is the commit message #2: i --- pkg/adapters/xlsx/registry.go | 91 +++++++++++++++++++++++++++++-------------- 1 file changed, 62 insertions(+), 29 deletions(-) (limited to 'pkg/adapters/xlsx/registry.go') diff --git a/pkg/adapters/xlsx/registry.go b/pkg/adapters/xlsx/registry.go index 46c395e..6b98c0b 100644 --- a/pkg/adapters/xlsx/registry.go +++ b/pkg/adapters/xlsx/registry.go @@ -1,69 +1,102 @@ package xlsx import ( + "errors" "fmt" + "strconv" "strings" + "time" "airlines/pkg/model" "airlines/pkg/names" - "github.com/leonm1/airports-go" + "airlines/pkg/airports" ) -func (t Ticket) ToUser() (model.User, error) { +func (t Ticket) ToUser() (*model.User, error) { fio, err := names.ParseLatinName(t.Passenger) if err != nil { - return model.User{}, fmt.Errorf("%v %s", t.Sheet, err.Error()) + return nil, fmt.Errorf("%v %s", t.Sheet, err.Error()) } sex := names.GenderFromTitle(t.Title) - u := model.User{ + u := &model.User{ Nick: "", - Name: fio.First, - Surname: fio.Last, - Fathersname: fio.Patronymic, + 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 := parseCardLine(t.Card) +func (t Ticket) ToCard() (*model.Card, error) { + prefix, number, bonus := model.ParseCardLine(t.Card) if number == 0 && prefix == "" && bonus == "" { - return model.Card{}, nil + return nil, errors.New("do not have card") } - return model.Card{ + return &model.Card{ Prefix: prefix, Number: number, Bonusprogramm: "", }, nil } -func (t Ticket) ToFlight() (model.Flight, error) { - // Resolve IATA records +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) - toRec, _ := airports.LookupIATA(toIATA) - fromCity := firstNonEmpty(strings.TrimSpace(t.FromCity), fromRec.City) - toCity := firstNonEmpty(strings.TrimSpace(t.ToCity), toRec.City) + dateStr := strings.TrimLeft(strings.TrimSpace(t.FlightDate), "'") + timeStr := strings.TrimLeft(strings.TrimSpace(t.FlightTime), "'") + timeStr = strings.ReplaceAll(timeStr, "-", ":") - fromCountry := fromRec.Country - toCountry := toRec.Country - departUTC, _, err := t.DateTime() + 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 model.Flight{}, err + return nil, err } - return model.Flight{ - Number: strings.TrimSpace(t.FlightNumber), - From: fromIATA, - FromCity: fromCity, - FromCountry: fromCountry, - To: toIATA, - ToCity: toCity, - ToCountry: toCountry, - Date: departUTC, + + 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 +} -- cgit v1.2.3