aboutsummaryrefslogtreecommitdiff
path: root/pkg/adapters/xlsx/registry.go
blob: 6b98c0b2b302941b51f8d08d8e4cee248e9e7679 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
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
}