Skip to content

Commit ac8c5c6

Browse files
authored
Bookings: Update payment status filter (#16339)
2 parents 9029e29 + 54716d9 commit ac8c5c6

File tree

9 files changed

+74
-30
lines changed

9 files changed

+74
-30
lines changed

Modules/Sources/Networking/Model/Bookings/Booking.swift

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -239,3 +239,12 @@ public enum BookingAttendanceStatus: String, CaseIterable, Codable {
239239
case noShow = "no-show"
240240
case unknown
241241
}
242+
243+
/// Represents the payment status for a booking.
244+
/// To be decoded from booking response once available.
245+
public enum BookingPaymentStatus: String, CaseIterable, Codable {
246+
case paid
247+
case unpaid
248+
case refunded
249+
case unknown
250+
}

Modules/Sources/Networking/Remote/BookingsRemote.swift

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -38,25 +38,25 @@ public struct BookingFilters {
3838
public let resourceIDs: [Int64]
3939
public let startDateBefore: String?
4040
public let startDateAfter: String?
41-
public let bookingStatuses: [String]
4241
public let attendanceStatuses: [String]
42+
public let paymentStatuses: [String]
4343

4444
public init(
4545
productIDs: [Int64] = [],
4646
customerIDs: [Int64] = [],
4747
resourceIDs: [Int64] = [],
4848
startDateBefore: String? = nil,
4949
startDateAfter: String? = nil,
50-
bookingStatuses: [String] = [],
51-
attendanceStatuses: [String] = []
50+
attendanceStatuses: [String] = [],
51+
paymentStatuses: [String] = []
5252
) {
5353
self.productIDs = productIDs
5454
self.customerIDs = customerIDs
5555
self.resourceIDs = resourceIDs
5656
self.startDateBefore = startDateBefore
5757
self.startDateAfter = startDateAfter
58-
self.bookingStatuses = bookingStatuses
5958
self.attendanceStatuses = attendanceStatuses
59+
self.paymentStatuses = paymentStatuses
6060
}
6161
}
6262

@@ -110,13 +110,13 @@ public final class BookingsRemote: Remote, BookingsRemoteProtocol {
110110
parameters[ParameterKey.startDateAfter] = startDateAfter
111111
}
112112

113-
if filters.bookingStatuses.isNotEmpty {
114-
parameters[ParameterKey.bookingStatus] = filters.bookingStatuses
115-
}
116-
117113
if filters.attendanceStatuses.isNotEmpty {
118114
parameters[ParameterKey.attendanceStatus] = filters.attendanceStatuses
119115
}
116+
117+
if filters.paymentStatuses.isNotEmpty {
118+
parameters[ParameterKey.paymentStatus] = filters.paymentStatuses
119+
}
120120
}
121121

122122
if let searchQuery = searchQuery, !searchQuery.isEmpty {
@@ -256,8 +256,8 @@ public extension BookingsRemote {
256256
static let product: String = "product"
257257
static let customer: String = "customer"
258258
static let resource: String = "resource"
259-
static let bookingStatus: String = "booking_status"
260259
static let attendanceStatus = "attendance_status"
260+
static let paymentStatus = "booking_status" // to be updated later when payment filtering is supported
261261
static let status: String = "status"
262262
}
263263
}

Modules/Sources/Yosemite/Model/Bookings/StoredBookingFilters.swift

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -17,15 +17,15 @@ public struct StoredBookingFilters: Codable, Equatable, GeneratedFakeable {
1717
public let teamMembers: [BookingTeamMemberFilter]
1818
public let products: [BookingProductFilter]
1919
public let attendanceStatuses: [BookingAttendanceStatus]
20-
public let paymentStatuses: [BookingStatus]
20+
public let paymentStatuses: [BookingPaymentStatus]
2121
public let customers: [BookingCustomerFilter]
2222
public let dateRange: BookingDateRangeFilter?
2323
public let numberOfActiveFilters: Int
2424

2525
public init(teamMembers: [BookingTeamMemberFilter],
2626
products: [BookingProductFilter],
2727
attendanceStatuses: [BookingAttendanceStatus],
28-
paymentStatuses: [BookingStatus],
28+
paymentStatuses: [BookingPaymentStatus],
2929
customers: [BookingCustomerFilter],
3030
dateRange: BookingDateRangeFilter?) {
3131
self.teamMembers = teamMembers

Modules/Sources/Yosemite/Model/Model.swift

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,7 @@ public typealias BookingPaymentInfo = Networking.BookingPaymentInfo
3434
public typealias BookingProductInfo = Networking.BookingProductInfo
3535
public typealias BookingResource = Networking.BookingResource
3636
public typealias BookingAttendanceStatus = Networking.BookingAttendanceStatus
37+
public typealias BookingPaymentStatus = Networking.BookingPaymentStatus
3738
public typealias CreateBlazeCampaign = Networking.CreateBlazeCampaign
3839
public typealias FallibleCancelable = Hardware.FallibleCancelable
3940
public typealias CommentStatus = Networking.CommentStatus

Modules/Sources/Yosemite/Tools/Bookings/ResultsController+FilterBookings.swift

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,8 @@ extension NSPredicate {
2020
return NSPredicate(format: "startDate > %@", date as NSDate)
2121
}
2222

23-
let bookingStatusesPredicate = filters.bookingStatuses.isNotEmpty ? NSPredicate(format: "statusKey IN %@", filters.bookingStatuses) : nil
23+
// TODO: update `statusKey` to paymentStatusKey once available
24+
let paymentStatusesPredicate = filters.paymentStatuses.isNotEmpty ? NSPredicate(format: "statusKey IN %@", filters.paymentStatuses) : nil
2425

2526
let attendanceStatusesPredicate = filters.attendanceStatuses.isNotEmpty ?
2627
NSPredicate(format: "attendanceStatusKey IN %@", filters.attendanceStatuses) : nil
@@ -32,7 +33,7 @@ extension NSPredicate {
3233
resourceIDsPredicate,
3334
startDateBeforePredicate,
3435
startDateAfterPredicate,
35-
bookingStatusesPredicate,
36+
paymentStatusesPredicate,
3637
attendanceStatusesPredicate
3738
].compactMap({ $0 })
3839

Modules/Tests/YosemiteTests/Stores/AppSettingsStoreTests+BookingFilters.swift

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -56,7 +56,7 @@ struct AppSettingsStoreTests_BookingFilters {
5656
teamMembers: [BookingTeamMemberFilter(resourceID: 100, name: "Team Member 1")],
5757
products: [BookingProductFilter(productID: 1, name: "Product 1")],
5858
attendanceStatuses: [.booked, .noShow],
59-
paymentStatuses: [.confirmed, .paid],
59+
paymentStatuses: [.unpaid, .paid],
6060
customers: [BookingCustomerFilter(customerID: 10, name: "Customer 1")],
6161
dateRange: nil
6262
)
@@ -97,7 +97,7 @@ struct AppSettingsStoreTests_BookingFilters {
9797
teamMembers: [BookingTeamMemberFilter(resourceID: 100, name: "Team Member 1")],
9898
products: [BookingProductFilter(productID: 1, name: "Product 1")],
9999
attendanceStatuses: [.booked],
100-
paymentStatuses: [.confirmed],
100+
paymentStatuses: [.unpaid],
101101
customers: [BookingCustomerFilter(customerID: 10, name: "Customer 1")],
102102
dateRange: nil
103103
)
@@ -106,7 +106,7 @@ struct AppSettingsStoreTests_BookingFilters {
106106
teamMembers: [BookingTeamMemberFilter(resourceID: 200, name: "Team Member 2")],
107107
products: [BookingProductFilter(productID: 2, name: "Product 2")],
108108
attendanceStatuses: [.noShow],
109-
paymentStatuses: [.paid, .cancelled],
109+
paymentStatuses: [.paid, .refunded],
110110
customers: [],
111111
dateRange: nil
112112
)
@@ -162,7 +162,7 @@ struct AppSettingsStoreTests_BookingFilters {
162162
teamMembers: [BookingTeamMemberFilter(resourceID: 100, name: "Team Member 1")],
163163
products: [BookingProductFilter(productID: 1, name: "Product 1")],
164164
attendanceStatuses: [],
165-
paymentStatuses: [.confirmed],
165+
paymentStatuses: [.unpaid],
166166
customers: [BookingCustomerFilter(customerID: 10, name: "Customer 1")],
167167
dateRange: nil
168168
)
@@ -221,7 +221,7 @@ struct AppSettingsStoreTests_BookingFilters {
221221
teamMembers: [BookingTeamMemberFilter(resourceID: 100, name: "Team Member 1")],
222222
products: [],
223223
attendanceStatuses: [.booked],
224-
paymentStatuses: [.confirmed],
224+
paymentStatuses: [.refunded],
225225
customers: [],
226226
dateRange: nil
227227
)

WooCommerce/Classes/Bookings/BookingFilters/BookingFiltersViewModel.swift

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,7 @@ final class BookingFiltersViewModel: FilterListViewModel {
3939
let products = (productFilterViewModel.selectedValue as? MultipleFilterSelection)?.items as? [BookingProductFilter] ?? []
4040
let customers = (customerFilterViewModel.selectedValue as? MultipleFilterSelection)?.items as? [BookingCustomerFilter] ?? []
4141
let attendanceStatuses = (attendanceStatusFilterViewModel.selectedValue as? MultipleFilterSelection)?.items as? [BookingAttendanceStatus] ?? []
42-
let paymentStatuses = (paymentStatusFilterViewModel.selectedValue as? MultipleFilterSelection)?.items as? [BookingStatus] ?? []
42+
let paymentStatuses = (paymentStatusFilterViewModel.selectedValue as? MultipleFilterSelection)?.items as? [BookingPaymentStatus] ?? []
4343
let dateRange = dateTimeFilterViewModel.selectedValue as? BookingDateRangeFilter
4444
let numberOfActiveFilters = filterTypeViewModels.numberOfActiveFilters
4545

@@ -78,7 +78,7 @@ final class BookingFiltersViewModel: FilterListViewModel {
7878
productFilterViewModel.selectedValue = BookingProductFilter?.none
7979
customerFilterViewModel.selectedValue = CustomerFilter?.none
8080
attendanceStatusFilterViewModel.selectedValue = BookingAttendanceStatus?.none
81-
paymentStatusFilterViewModel.selectedValue = BookingStatus?.none
81+
paymentStatusFilterViewModel.selectedValue = BookingPaymentStatus?.none
8282
dateTimeFilterViewModel.selectedValue = BookingDateRangeFilter?.none
8383
}
8484

@@ -89,7 +89,7 @@ final class BookingFiltersViewModel: FilterListViewModel {
8989
let teamMembers: [BookingTeamMemberFilter]
9090
let products: [BookingProductFilter]
9191
let attendanceStatuses: [BookingAttendanceStatus]
92-
let paymentStatuses: [BookingStatus]
92+
let paymentStatuses: [BookingPaymentStatus]
9393
let customers: [BookingCustomerFilter]
9494
let dateRange: BookingDateRangeFilter?
9595

@@ -108,7 +108,7 @@ final class BookingFiltersViewModel: FilterListViewModel {
108108
init(teamMembers: [BookingTeamMemberFilter],
109109
products: [BookingProductFilter],
110110
attendanceStatuses: [BookingAttendanceStatus],
111-
paymentStatuses: [BookingStatus],
111+
paymentStatuses: [BookingPaymentStatus],
112112
customers: [BookingCustomerFilter],
113113
dateRange: BookingDateRangeFilter?,
114114
numberOfActiveFilters: Int) {
@@ -143,8 +143,8 @@ final class BookingFiltersViewModel: FilterListViewModel {
143143
resourceIDs: teamMembers.map { $0.resourceID },
144144
startDateBefore: dateRange?.endDate?.ISO8601Format(),
145145
startDateAfter: dateRange?.startDate?.ISO8601Format(),
146-
bookingStatuses: paymentStatuses.map { $0.rawValue },
147-
attendanceStatuses: attendanceStatuses.map { $0.rawValue }
146+
attendanceStatuses: attendanceStatuses.map { $0.rawValue },
147+
paymentStatuses: paymentStatuses.map { $0.rawValue }
148148
)
149149
}
150150
}
@@ -198,12 +198,12 @@ extension BookingFiltersViewModel.BookingListFilter {
198198
listSelectorConfig: .bookingCustomers(siteID: siteID),
199199
selectedValue: MultipleFilterSelection(items: filters.customers))
200200
case .attendanceStatus:
201-
let options: [BookingAttendanceStatus?] = [.booked, .checkedIn, .cancelled, .noShow]
201+
let options: [BookingAttendanceStatus?] = [.booked, .checkedIn, .noShow, .cancelled]
202202
return FilterTypeViewModel(title: title,
203203
listSelectorConfig: .multiSelectStaticOptions(options: options),
204204
selectedValue: MultipleFilterSelection(items: filters.attendanceStatuses))
205205
case .paymentStatus:
206-
let options: [BookingStatus?] = [.complete, .paid, .unpaid, .cancelled, .pendingConfirmation, .confirmed]
206+
let options: [BookingPaymentStatus?] = [.paid, .unpaid, .refunded]
207207
return FilterTypeViewModel(title: title,
208208
listSelectorConfig: .multiSelectStaticOptions(options: options),
209209
selectedValue: MultipleFilterSelection(items: filters.paymentStatuses))
@@ -234,12 +234,12 @@ extension BookingAttendanceStatus: FilterType {
234234
}
235235
}
236236

237-
extension BookingStatus: FilterType {
237+
extension BookingPaymentStatus: FilterType {
238238
var description: String { localizedTitle }
239239

240240
var isActive: Bool {
241241
switch self {
242-
case .complete, .paid, .unpaid, .cancelled, .pendingConfirmation, .confirmed:
242+
case .paid, .unpaid, .refunded:
243243
return true
244244
case .unknown:
245245
return false
Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
import Foundation
2+
import enum Yosemite.BookingPaymentStatus
3+
4+
extension BookingPaymentStatus {
5+
var localizedTitle: String {
6+
switch self {
7+
case .paid:
8+
NSLocalizedString(
9+
"bookingPaymentStatus.title.paid",
10+
value: "Paid",
11+
comment: "Status of a paid booking"
12+
)
13+
case .unpaid:
14+
NSLocalizedString(
15+
"bookingPaymentStatus.title.unpaid",
16+
value: "Unpaid",
17+
comment: "Status of an unpaid booking"
18+
)
19+
case .refunded:
20+
NSLocalizedString(
21+
"bookingPaymentStatus.title.refunded",
22+
value: "Refunded",
23+
comment: "Status of a refunded booking"
24+
)
25+
case .unknown:
26+
NSLocalizedString(
27+
"bookingPaymentStatus.title.unknown",
28+
value: "Unknown",
29+
comment: "Status of a booking with unexpected payment status"
30+
)
31+
}
32+
}
33+
}

WooCommerce/Classes/ViewModels/Booking Details/BookingAttendanceStatus+Localization.swift

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -18,8 +18,8 @@ extension BookingAttendanceStatus {
1818
)
1919
case .cancelled:
2020
return NSLocalizedString(
21-
"BookingAttendanceStatus.cancelled",
22-
value: "Cancelled",
21+
"BookingAttendanceStatus.canceled",
22+
value: "Canceled",
2323
comment: "Title for 'Cancelled' booking attendance status."
2424
)
2525
case .noShow:

0 commit comments

Comments
 (0)