git.iko.soy/dashared/hookah-tau
on develop help sign in
Добавила put на изменение брони + расширяю возможности второго экрана для админа (период для брони)
e8a990cDarya Rednikina
Hookah Tau.xcodeproj/project.pbxproj+4
@@ -16,6 +16,7 @@
16 12118B9C23682022006BAEE3 /* RegistrationResolver.swift in Sources */ = {isa = PBXBuildFile; fileRef = 12118B9B23682022006BAEE3 /* RegistrationResolver.swift */; };
16 12118B9C23682022006BAEE3 /* RegistrationResolver.swift in Sources */ = {isa = PBXBuildFile; fileRef = 12118B9B23682022006BAEE3 /* RegistrationResolver.swift */; };
17 12118B9E23682049006BAEE3 /* PhoneCodeResolver.swift in Sources */ = {isa = PBXBuildFile; fileRef = 12118B9D23682049006BAEE3 /* PhoneCodeResolver.swift */; };
17 12118B9E23682049006BAEE3 /* PhoneCodeResolver.swift in Sources */ = {isa = PBXBuildFile; fileRef = 12118B9D23682049006BAEE3 /* PhoneCodeResolver.swift */; };
18 1212048C23914CFD00CAF162 /* DeleteReservationResolver.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1212048B23914CFD00CAF162 /* DeleteReservationResolver.swift */; };
18 1212048C23914CFD00CAF162 /* DeleteReservationResolver.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1212048B23914CFD00CAF162 /* DeleteReservationResolver.swift */; };
19+ 1212048E23915A0A00CAF162 /* ChangeReservationResolver.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1212048D23915A0A00CAF162 /* ChangeReservationResolver.swift */; };
19 12219CEF2353A63F0057DDEE /* ReservationsCoordinator.swift in Sources */ = {isa = PBXBuildFile; fileRef = 12219CEE2353A63E0057DDEE /* ReservationsCoordinator.swift */; };
20 12219CEF2353A63F0057DDEE /* ReservationsCoordinator.swift in Sources */ = {isa = PBXBuildFile; fileRef = 12219CEE2353A63E0057DDEE /* ReservationsCoordinator.swift */; };
20 12230AEA238FD8B3004A01E5 /* MapView2.xib in Resources */ = {isa = PBXBuildFile; fileRef = 12230AE9238FD8B3004A01E5 /* MapView2.xib */; };
21 12230AEA238FD8B3004A01E5 /* MapView2.xib in Resources */ = {isa = PBXBuildFile; fileRef = 12230AE9238FD8B3004A01E5 /* MapView2.xib */; };
21 12230AEC238FD8C5004A01E5 /* MapView2.swift in Sources */ = {isa = PBXBuildFile; fileRef = 12230AEB238FD8C5004A01E5 /* MapView2.swift */; };
22 12230AEC238FD8C5004A01E5 /* MapView2.swift in Sources */ = {isa = PBXBuildFile; fileRef = 12230AEB238FD8C5004A01E5 /* MapView2.swift */; };
@@ -135,6 +136,7 @@
135 12118B9B23682022006BAEE3 /* RegistrationResolver.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RegistrationResolver.swift; sourceTree = "<group>"; };
136 12118B9B23682022006BAEE3 /* RegistrationResolver.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RegistrationResolver.swift; sourceTree = "<group>"; };
136 12118B9D23682049006BAEE3 /* PhoneCodeResolver.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PhoneCodeResolver.swift; sourceTree = "<group>"; };
137 12118B9D23682049006BAEE3 /* PhoneCodeResolver.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PhoneCodeResolver.swift; sourceTree = "<group>"; };
137 1212048B23914CFD00CAF162 /* DeleteReservationResolver.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DeleteReservationResolver.swift; sourceTree = "<group>"; };
138 1212048B23914CFD00CAF162 /* DeleteReservationResolver.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DeleteReservationResolver.swift; sourceTree = "<group>"; };
139+ 1212048D23915A0A00CAF162 /* ChangeReservationResolver.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ChangeReservationResolver.swift; sourceTree = "<group>"; };
138 12219CEE2353A63E0057DDEE /* ReservationsCoordinator.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ReservationsCoordinator.swift; sourceTree = "<group>"; };
140 12219CEE2353A63E0057DDEE /* ReservationsCoordinator.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ReservationsCoordinator.swift; sourceTree = "<group>"; };
139 12230AE9238FD8B3004A01E5 /* MapView2.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = MapView2.xib; sourceTree = "<group>"; };
141 12230AE9238FD8B3004A01E5 /* MapView2.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = MapView2.xib; sourceTree = "<group>"; };
140 12230AEB238FD8C5004A01E5 /* MapView2.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MapView2.swift; sourceTree = "<group>"; };
142 12230AEB238FD8C5004A01E5 /* MapView2.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MapView2.swift; sourceTree = "<group>"; };
@@ -413,6 +415,7 @@
413 124D007E237222B200AE76B9 /* ReservationsResolver.swift */,
415 124D007E237222B200AE76B9 /* ReservationsResolver.swift */,
414 12B4447B238EF25C000B6B16 /* CreateReservationResolver.swift */,
416 12B4447B238EF25C000B6B16 /* CreateReservationResolver.swift */,
415 1212048B23914CFD00CAF162 /* DeleteReservationResolver.swift */,
417 1212048B23914CFD00CAF162 /* DeleteReservationResolver.swift */,
418+ 1212048D23915A0A00CAF162 /* ChangeReservationResolver.swift */,
416 );
419 );
417 path = Resolvers;
420 path = Resolvers;
418 sourceTree = "<group>";
421 sourceTree = "<group>";
@@ -949,6 +952,7 @@
949 1205056B2380588C00801618 /* Extenstions+IBDesignable.swift in Sources */,
952 1205056B2380588C00801618 /* Extenstions+IBDesignable.swift in Sources */,
950 12C72EE1235380D400AD7004 /* ProfileClientViewController.swift in Sources */,
953 12C72EE1235380D400AD7004 /* ProfileClientViewController.swift in Sources */,
951 F31E20C92348E0F300BEA215 /* AuthorizationViewController.swift in Sources */,
954 F31E20C92348E0F300BEA215 /* AuthorizationViewController.swift in Sources */,
955+ 1212048E23915A0A00CAF162 /* ChangeReservationResolver.swift in Sources */,
952 12230AFC239034D3004A01E5 /* SecondStepReservationViewController.swift in Sources */,
956 12230AFC239034D3004A01E5 /* SecondStepReservationViewController.swift in Sources */,
953 F3851B2923409F8A009EE0B6 /* PhoneView.swift in Sources */,
957 F3851B2923409F8A009EE0B6 /* PhoneView.swift in Sources */,
954 12C72EE3235380EB00AD7004 /* ReservationsViewController.swift in Sources */,
958 12C72EE3235380EB00AD7004 /* ReservationsViewController.swift in Sources */,
Hookah Tau/API/Reservations api/ReservationsService.swift+23−4
@@ -56,14 +56,33 @@ class ReservationsService {
56 }
56 }
57 }
57 }
58
58
59− func updateReservation() {
59+ func updateReservation(startTime: Date,
60+ numberOfGuests: Int,
61+ endTime: Date,
62+ uuid: String,
63+ completion: @escaping ((Bool) -> Void)) {
60
64
61− }
65+ let reservation = ChangeReservationResolver.Request(startTime: startTime,
62−
66+ uuid: uuid,
63− func createReservation() {
67+ numberOfGuests: numberOfGuests,
68+ endTime: endTime)
64
69
70+ let resolver = ChangeReservationResolver(data: reservation)
71+ let request = ApiRequest(resolver: resolver, httpMethod: .put)
72+
73+ apiClient.load(request: request.request) { result in
74+ switch result {
75+ case .failure:
76+ completion(false)
77+ return
78+ case .success:
79+ completion(true)
80+ return
81+ }
82+ }
65 }
83 }
66
84
85+
67 func getAllReservations(establishmentID: Int,
86 func getAllReservations(establishmentID: Int,
68 completion: @escaping ((Result<AllReservations, GeneralError>) -> Void)) {
87 completion: @escaping ((Result<AllReservations, GeneralError>) -> Void)) {
69 let resolver = AllReservationsResolver<AllReservations>(establishmentID: establishmentID)
88 let resolver = AllReservationsResolver<AllReservations>(establishmentID: establishmentID)
Hookah Tau/API/Reservations api/Resolvers/ChangeReservationResolver.swiftnew file+35
@@ -0,0 +1,35 @@
1+//
2+// ChangeReservationResolver.swift
3+// Hookah Tau
4+//
5+// Created by cstore on 29/11/2019.
6+// Copyright © 2019 Daria Rednikina. All rights reserved.
7+//
8+
9+import Foundation
10+
11+class ChangeReservationResolver: ApiResolver {
12+
13+ /// Структура запроса с возможными данными для
14+ /// изменением бронирования
15+ struct Request: MyCodable {
16+ var startTime: Date
17+ var uuid: String
18+ var numberOfGuests: Int
19+ var endTime: Date
20+ }
21+
22+ var name: String {
23+ return "/reservations"
24+ }
25+
26+ var data: Request
27+
28+ init(data: Request) {
29+ self.data = data
30+ }
31+
32+ func parameters() -> MyCodable? {
33+ return data
34+ }
35+}
Hookah Tau/Controllers/Client/Reservations/Steps/2/SecondStepView.swift+16−6
@@ -35,7 +35,8 @@ class SecondStepView: UIView {
35 didSet {
35 didSet {
36 guard let model = model else { return }
36 guard let model = model else { return }
37 totalBookingLabel.text = "Забронировать \(model.table) столик на \(Int(guestSlider.value)) человека \(model.startTime)?"
37 totalBookingLabel.text = "Забронировать \(model.table) столик на \(Int(guestSlider.value)) человека \(model.startTime)?"
38−
38+
39+ setUpIntervals(model.startTime)
39 setUpReservedIntervals(model.reservedintervals)
40 setUpReservedIntervals(model.reservedintervals)
40 setUpBookingPeriod(model.startTime)
41 setUpBookingPeriod(model.startTime)
41 }
42 }
@@ -75,8 +76,6 @@ class SecondStepView: UIView {
75 scrollView.delegate = self
76 scrollView.delegate = self
76
77
77 scrollView.showsHorizontalScrollIndicator = false
78 scrollView.showsHorizontalScrollIndicator = false
78−
79− setUpIntervals()
80 }
79 }
81
80
82 @IBAction func sliderValueChanged(_ sender: UISlider) {
81 @IBAction func sliderValueChanged(_ sender: UISlider) {
@@ -92,8 +91,15 @@ class SecondStepView: UIView {
92
91
93 // MARK: - Setup
92 // MARK: - Setup
94
93
95− func setUpIntervals() {
94+ func setUpIntervals(_ stTime: Date) {
96− for period in 0...Constants.day10MinPeriods {
95+ let isAdmin = DataStorage.standard.getUserModel()?.isAdmin ?? false
96+
97+ let (startPoint, _) = isAdmin ? stTime.getAdminStartingAndEndPoint() : stTime.getClientStartingAndEndPoint()
98+
99+ let startingPoint = isAdmin ? startPoint.getAdminsStartingPoint() : Constants.clientStartingPoint
100+ let endingPoint = startingPoint + (isAdmin ? Constants.adminDuration : Constants.clientDuration)
101+
102+ for period in startingPoint...endingPoint {
97 let timePointView = TimePointView.loadFromNib()
103 let timePointView = TimePointView.loadFromNib()
98 timePointView?.setUp(withTimePoint: period)
104 timePointView?.setUp(withTimePoint: period)
99 let view = UIView(frame: CGRect(x: 0, y: 0, width: 35, height: 106))
105 let view = UIView(frame: CGRect(x: 0, y: 0, width: 35, height: 106))
@@ -188,7 +194,11 @@ extension SecondStepView: UIScrollViewDelegate {
188
194
189extension SecondStepView {
195extension SecondStepView {
190 enum Constants {
196 enum Constants {
191− static let day10MinPeriods = 90
192 static let timepointWidth = 11
197 static let timepointWidth = 11
198+
199+ static let adminDuration = 288
200+ static let clientDuration = 90
201+ // 12:00 = 12 * 6
202+ static let clientStartingPoint = 72
193 }
203 }
194}
204}
Hookah Tau/Extensions+Date.swift+41
@@ -145,3 +145,44 @@ extension Date {
145 return (prev, current, next)
145 return (prev, current, next)
146 }
146 }
147}
147}
148+
149+// MARK: - Admin vs Client
150+
151+extension Date {
152+
153+ /// Идем на день назад, чтобы найти точку начала с которой может забронировать администратор
154+ func getAdminStartingAndEndPoint() -> (Date, Date) {
155+ let utcDate = self.getUTCDate()
156+
157+ let startDate = Calendar.current.date(byAdding: .day, value: -1, to: utcDate)!
158+ let endDate = Calendar.current.date(byAdding: .day, value: 1, to: utcDate)!
159+
160+ return (startDate, endDate)
161+ }
162+
163+ func getAdminsStartingPoint() -> Int {
164+ let comp = Calendar.current.dateComponents([.hour, .minute], from: self)
165+ return (comp.hour! * 6 + comp.minute! / 10)
166+ }
167+
168+ func getClientStartingAndEndPoint() -> (Date, Date) {
169+ let utcDate = self.getUTCDate()
170+
171+ // час
172+ let hour = Calendar.current.dateComponents([.hour], from: utcDate).hour!
173+
174+ if hour >= 0 && hour <= 3 { // [ 00:00 ... 3:00 ]
175+ let endDate = utcDate.set(hours: 3, minutes: 0, seconds: 0)! // 3 00
176+ let start = Calendar.current.date(byAdding: .day, value: -1, to: utcDate)!
177+ let startDate = start.set(hours: 12, minutes: 0, seconds: 0)! // 12 00
178+
179+ return (startDate, endDate)
180+ } else { // [12:00 ... 23:50]
181+ let startDate = utcDate.set(hours: 12, minutes: 0, seconds: 0)! // 12 00
182+ let end = Calendar.current.date(byAdding: .day, value: 1, to: utcDate)!
183+ let endDate = end.set(hours: 3, minutes: 0, seconds: 0)! // 3 00
184+
185+ return (startDate, endDate)
186+ }
187+ }
188+}