Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
9 changes: 9 additions & 0 deletions Modules/Sources/Networking/Model/Bookings/Booking.swift
Original file line number Diff line number Diff line change
Expand Up @@ -233,3 +233,12 @@ public enum BookingAttendanceStatus: String, CaseIterable, Codable {
case noShow = "no-show"
case unknown
}

/// Represents the payment status for a booking.
/// To be decoded from booking response once available.
public enum BookingPaymentStatus: String, CaseIterable, Codable {
case paid
case unpaid
case refunded
case unknown
}
18 changes: 9 additions & 9 deletions Modules/Sources/Networking/Remote/BookingsRemote.swift
Original file line number Diff line number Diff line change
Expand Up @@ -38,25 +38,25 @@ public struct BookingFilters {
public let resourceIDs: [Int64]
public let startDateBefore: String?
public let startDateAfter: String?
public let bookingStatuses: [String]
public let attendanceStatuses: [String]
public let paymentStatuses: [String]

public init(
productIDs: [Int64] = [],
customerIDs: [Int64] = [],
resourceIDs: [Int64] = [],
startDateBefore: String? = nil,
startDateAfter: String? = nil,
bookingStatuses: [String] = [],
attendanceStatuses: [String] = []
attendanceStatuses: [String] = [],
paymentStatuses: [String] = []
) {
self.productIDs = productIDs
self.customerIDs = customerIDs
self.resourceIDs = resourceIDs
self.startDateBefore = startDateBefore
self.startDateAfter = startDateAfter
self.bookingStatuses = bookingStatuses
self.attendanceStatuses = attendanceStatuses
self.paymentStatuses = paymentStatuses
}
}

Expand Down Expand Up @@ -110,13 +110,13 @@ public final class BookingsRemote: Remote, BookingsRemoteProtocol {
parameters[ParameterKey.startDateAfter] = startDateAfter
}

if filters.bookingStatuses.isNotEmpty {
parameters[ParameterKey.bookingStatus] = filters.bookingStatuses
}

if filters.attendanceStatuses.isNotEmpty {
parameters[ParameterKey.attendanceStatus] = filters.attendanceStatuses
}

if filters.paymentStatuses.isNotEmpty {
parameters[ParameterKey.paymentStatus] = filters.paymentStatuses
}
}

if let searchQuery = searchQuery, !searchQuery.isEmpty {
Expand Down Expand Up @@ -256,8 +256,8 @@ public extension BookingsRemote {
static let product: String = "product"
static let customer: String = "customer"
static let resource: String = "resource"
static let bookingStatus: String = "booking_status"
static let attendanceStatus = "attendance_status"
static let paymentStatus = "booking_status" // to be updated later when payment filtering is supported
static let status: String = "status"
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -17,15 +17,15 @@ public struct StoredBookingFilters: Codable, Equatable, GeneratedFakeable {
public let teamMembers: [BookingTeamMemberFilter]
public let products: [BookingProductFilter]
public let attendanceStatuses: [BookingAttendanceStatus]
public let paymentStatuses: [BookingStatus]
public let paymentStatuses: [BookingPaymentStatus]
public let customers: [BookingCustomerFilter]
public let dateRange: BookingDateRangeFilter?
public let numberOfActiveFilters: Int

public init(teamMembers: [BookingTeamMemberFilter],
products: [BookingProductFilter],
attendanceStatuses: [BookingAttendanceStatus],
paymentStatuses: [BookingStatus],
paymentStatuses: [BookingPaymentStatus],
customers: [BookingCustomerFilter],
dateRange: BookingDateRangeFilter?) {
self.teamMembers = teamMembers
Expand Down
1 change: 1 addition & 0 deletions Modules/Sources/Yosemite/Model/Model.swift
Original file line number Diff line number Diff line change
Expand Up @@ -34,6 +34,7 @@ public typealias BookingPaymentInfo = Networking.BookingPaymentInfo
public typealias BookingProductInfo = Networking.BookingProductInfo
public typealias BookingResource = Networking.BookingResource
public typealias BookingAttendanceStatus = Networking.BookingAttendanceStatus
public typealias BookingPaymentStatus = Networking.BookingPaymentStatus
public typealias CreateBlazeCampaign = Networking.CreateBlazeCampaign
public typealias FallibleCancelable = Hardware.FallibleCancelable
public typealias CommentStatus = Networking.CommentStatus
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,8 @@ extension NSPredicate {
return NSPredicate(format: "startDate > %@", date as NSDate)
}

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

let attendanceStatusesPredicate = filters.attendanceStatuses.isNotEmpty ?
NSPredicate(format: "attendanceStatusKey IN %@", filters.attendanceStatuses) : nil
Expand All @@ -32,7 +33,7 @@ extension NSPredicate {
resourceIDsPredicate,
startDateBeforePredicate,
startDateAfterPredicate,
bookingStatusesPredicate,
paymentStatusesPredicate,
attendanceStatusesPredicate
].compactMap({ $0 })

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -56,7 +56,7 @@ struct AppSettingsStoreTests_BookingFilters {
teamMembers: [BookingTeamMemberFilter(resourceID: 100, name: "Team Member 1")],
products: [BookingProductFilter(productID: 1, name: "Product 1")],
attendanceStatuses: [.booked, .noShow],
paymentStatuses: [.confirmed, .paid],
paymentStatuses: [.unpaid, .paid],
customers: [BookingCustomerFilter(customerID: 10, name: "Customer 1")],
dateRange: nil
)
Expand Down Expand Up @@ -97,7 +97,7 @@ struct AppSettingsStoreTests_BookingFilters {
teamMembers: [BookingTeamMemberFilter(resourceID: 100, name: "Team Member 1")],
products: [BookingProductFilter(productID: 1, name: "Product 1")],
attendanceStatuses: [.booked],
paymentStatuses: [.confirmed],
paymentStatuses: [.unpaid],
customers: [BookingCustomerFilter(customerID: 10, name: "Customer 1")],
dateRange: nil
)
Expand All @@ -106,7 +106,7 @@ struct AppSettingsStoreTests_BookingFilters {
teamMembers: [BookingTeamMemberFilter(resourceID: 200, name: "Team Member 2")],
products: [BookingProductFilter(productID: 2, name: "Product 2")],
attendanceStatuses: [.noShow],
paymentStatuses: [.paid, .cancelled],
paymentStatuses: [.paid, .refunded],
customers: [],
dateRange: nil
)
Expand Down Expand Up @@ -162,7 +162,7 @@ struct AppSettingsStoreTests_BookingFilters {
teamMembers: [BookingTeamMemberFilter(resourceID: 100, name: "Team Member 1")],
products: [BookingProductFilter(productID: 1, name: "Product 1")],
attendanceStatuses: [],
paymentStatuses: [.confirmed],
paymentStatuses: [.unpaid],
customers: [BookingCustomerFilter(customerID: 10, name: "Customer 1")],
dateRange: nil
)
Expand Down Expand Up @@ -221,7 +221,7 @@ struct AppSettingsStoreTests_BookingFilters {
teamMembers: [BookingTeamMemberFilter(resourceID: 100, name: "Team Member 1")],
products: [],
attendanceStatuses: [.booked],
paymentStatuses: [.confirmed],
paymentStatuses: [.refunded],
customers: [],
dateRange: nil
)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -39,7 +39,7 @@ final class BookingFiltersViewModel: FilterListViewModel {
let products = (productFilterViewModel.selectedValue as? MultipleFilterSelection)?.items as? [BookingProductFilter] ?? []
let customers = (customerFilterViewModel.selectedValue as? MultipleFilterSelection)?.items as? [BookingCustomerFilter] ?? []
let attendanceStatuses = (attendanceStatusFilterViewModel.selectedValue as? MultipleFilterSelection)?.items as? [BookingAttendanceStatus] ?? []
let paymentStatuses = (paymentStatusFilterViewModel.selectedValue as? MultipleFilterSelection)?.items as? [BookingStatus] ?? []
let paymentStatuses = (paymentStatusFilterViewModel.selectedValue as? MultipleFilterSelection)?.items as? [BookingPaymentStatus] ?? []
let dateRange = dateTimeFilterViewModel.selectedValue as? BookingDateRangeFilter
let numberOfActiveFilters = filterTypeViewModels.numberOfActiveFilters

Expand Down Expand Up @@ -78,7 +78,7 @@ final class BookingFiltersViewModel: FilterListViewModel {
productFilterViewModel.selectedValue = BookingProductFilter?.none
customerFilterViewModel.selectedValue = CustomerFilter?.none
attendanceStatusFilterViewModel.selectedValue = BookingAttendanceStatus?.none
paymentStatusFilterViewModel.selectedValue = BookingStatus?.none
paymentStatusFilterViewModel.selectedValue = BookingPaymentStatus?.none
dateTimeFilterViewModel.selectedValue = BookingDateRangeFilter?.none
}

Expand All @@ -89,7 +89,7 @@ final class BookingFiltersViewModel: FilterListViewModel {
let teamMembers: [BookingTeamMemberFilter]
let products: [BookingProductFilter]
let attendanceStatuses: [BookingAttendanceStatus]
let paymentStatuses: [BookingStatus]
let paymentStatuses: [BookingPaymentStatus]
let customers: [BookingCustomerFilter]
let dateRange: BookingDateRangeFilter?

Expand All @@ -108,7 +108,7 @@ final class BookingFiltersViewModel: FilterListViewModel {
init(teamMembers: [BookingTeamMemberFilter],
products: [BookingProductFilter],
attendanceStatuses: [BookingAttendanceStatus],
paymentStatuses: [BookingStatus],
paymentStatuses: [BookingPaymentStatus],
customers: [BookingCustomerFilter],
dateRange: BookingDateRangeFilter?,
numberOfActiveFilters: Int) {
Expand Down Expand Up @@ -143,8 +143,8 @@ final class BookingFiltersViewModel: FilterListViewModel {
resourceIDs: teamMembers.map { $0.resourceID },
startDateBefore: dateRange?.endDate?.ISO8601Format(),
startDateAfter: dateRange?.startDate?.ISO8601Format(),
bookingStatuses: paymentStatuses.map { $0.rawValue },
attendanceStatuses: attendanceStatuses.map { $0.rawValue }
attendanceStatuses: attendanceStatuses.map { $0.rawValue },
paymentStatuses: paymentStatuses.map { $0.rawValue }
)
}
}
Expand Down Expand Up @@ -198,12 +198,12 @@ extension BookingFiltersViewModel.BookingListFilter {
listSelectorConfig: .bookingCustomers(siteID: siteID),
selectedValue: MultipleFilterSelection(items: filters.customers))
case .attendanceStatus:
let options: [BookingAttendanceStatus?] = [.booked, .checkedIn, .cancelled, .noShow]
let options: [BookingAttendanceStatus?] = [.booked, .checkedIn, .noShow, .cancelled]
return FilterTypeViewModel(title: title,
listSelectorConfig: .multiSelectStaticOptions(options: options),
selectedValue: MultipleFilterSelection(items: filters.attendanceStatuses))
case .paymentStatus:
let options: [BookingStatus?] = [.complete, .paid, .unpaid, .cancelled, .pendingConfirmation, .confirmed]
let options: [BookingPaymentStatus?] = [.paid, .unpaid, .refunded]
return FilterTypeViewModel(title: title,
listSelectorConfig: .multiSelectStaticOptions(options: options),
selectedValue: MultipleFilterSelection(items: filters.paymentStatuses))
Expand Down Expand Up @@ -234,12 +234,12 @@ extension BookingAttendanceStatus: FilterType {
}
}

extension BookingStatus: FilterType {
extension BookingPaymentStatus: FilterType {
var description: String { localizedTitle }

var isActive: Bool {
switch self {
case .complete, .paid, .unpaid, .cancelled, .pendingConfirmation, .confirmed:
case .paid, .unpaid, .refunded:
return true
case .unknown:
return false
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
import Foundation
import enum Yosemite.BookingPaymentStatus

extension BookingPaymentStatus {
var localizedTitle: String {
switch self {
case .paid:
NSLocalizedString(
"bookingPaymentStatus.title.paid",
value: "Paid",
comment: "Status of a paid booking"
)
case .unpaid:
NSLocalizedString(
"bookingPaymentStatus.title.unpaid",
value: "Unpaid",
comment: "Status of an unpaid booking"
)
case .refunded:
NSLocalizedString(
"bookingPaymentStatus.title.refunded",
value: "Refunded",
comment: "Status of a refunded booking"
)
case .unknown:
NSLocalizedString(
"bookingPaymentStatus.title.unknown",
value: "Unknown",
comment: "Status of a booking with unexpected payment status"
)
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -18,8 +18,8 @@ extension BookingAttendanceStatus {
)
case .cancelled:
return NSLocalizedString(
"BookingAttendanceStatus.cancelled",
value: "Cancelled",
"BookingAttendanceStatus.canceled",
value: "Canceled",
comment: "Title for 'Cancelled' booking attendance status."
)
case .noShow:
Expand Down