Skip to content

[POS Orders] Persist sales channel filter in order settings #15891

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 3 commits into from
Jul 15, 2025
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
1 change: 1 addition & 0 deletions Modules/Sources/Yosemite/Actions/AppSettingsAction.swift
Original file line number Diff line number Diff line change
Expand Up @@ -45,6 +45,7 @@ public enum AppSettingsAction: Action {
dateRangeFilter: OrderDateRangeFilter?,
productFilter: FilterOrdersByProduct?,
customerFilter: CustomerFilter?,
salesChannelFilter: SalesChannelFilter?,
onCompletion: (Error?) -> Void)

/// Clears all the orders settings
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -52,7 +52,8 @@ struct MockAppSettingsActionHandler: MockActionHandler {
orderStatusesFilter: nil,
dateRangeFilter: nil,
productFilter: nil,
customerFilter: nil)))
customerFilter: nil,
salesChannelFilter: nil)))
case .upsertProductsSettings(_, _, _, _, _, _, _, let onCompletion):
onCompletion(nil)
case .resetEligibilityErrorInfo,
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
import Foundation

/// Used to filter orders by sales channel
///
public enum SalesChannelFilter: String, Codable, Hashable {
case pointOfSale
case any
}
Original file line number Diff line number Diff line change
Expand Up @@ -12,17 +12,20 @@ public struct StoredOrderSettings: Codable, Equatable {
public let dateRangeFilter: OrderDateRangeFilter?
public let productFilter: FilterOrdersByProduct?
public let customerFilter: CustomerFilter?
public let salesChannelFilter: SalesChannelFilter?

public init(siteID: Int64,
orderStatusesFilter: [OrderStatusEnum]?,
dateRangeFilter: OrderDateRangeFilter?,
productFilter: FilterOrdersByProduct?,
customerFilter: CustomerFilter?) {
customerFilter: CustomerFilter?,
salesChannelFilter: SalesChannelFilter?) {
self.siteID = siteID
self.orderStatusesFilter = orderStatusesFilter
self.dateRangeFilter = dateRangeFilter
self.productFilter = productFilter
self.customerFilter = customerFilter
self.salesChannelFilter = salesChannelFilter
}

public func numberOfActiveFilters() -> Int {
Expand All @@ -39,6 +42,9 @@ public struct StoredOrderSettings: Codable, Equatable {
if customerFilter != nil {
total += 1
}
if let salesChannelFilter = salesChannelFilter, case .pointOfSale = salesChannelFilter {
total += 1
}

return total
}
Expand All @@ -51,6 +57,7 @@ public struct StoredOrderSettings: Codable, Equatable {
case dateRangeFilter = "date_range_filter"
case productFilter = "product_filter"
case customerFilter = "customer_filter"
case salesChannelFilter = "sales_channel_filter"
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

non-blocking 💭 do you think we might update our naming to match the definition in pfZP8i-c4-p2#comment-158 at some point? If so, we might want to call it checkout_channel_filter in the storage. Naming for the code structs/classes/enums/vars can be changed anytime, while the storage value would require a migration or duplicated values for backward compatibility. Not a big deal if we have a legacy naming though.

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Good question, this is something that I thought about when adding it. Since we do not know when we'll need these, or if the terms will change or evolve further before we do, I'd keep with sales_channel_filter for now. Later on we can decide if makes more sense to either keep the legacy naming or to make a migration if needed.

}
}

Expand Down
6 changes: 5 additions & 1 deletion Modules/Sources/Yosemite/Stores/AppSettingsStore.swift
Original file line number Diff line number Diff line change
Expand Up @@ -132,12 +132,14 @@ public class AppSettingsStore: Store {
let dateRangeFilter,
let productFilter,
let customerFilter,
let salesChannelFilter,
let onCompletion):
upsertOrdersSettings(siteID: siteID,
orderStatusesFilter: orderStatusesFilter,
dateRangeFilter: dateRangeFilter,
productFilter: productFilter,
customerFilter: customerFilter,
salesChannelFilter: salesChannelFilter,
onCompletion: onCompletion)
case .resetOrdersSettings:
resetOrdersSettings()
Expand Down Expand Up @@ -716,6 +718,7 @@ private extension AppSettingsStore {
dateRangeFilter: OrderDateRangeFilter?,
productFilter: FilterOrdersByProduct?,
customerFilter: CustomerFilter?,
salesChannelFilter: SalesChannelFilter?,
onCompletion: (Error?) -> Void) {
var existingSettings: [Int64: StoredOrderSettings.Setting] = [:]
if let storedSettings: StoredOrderSettings = try? fileStorage.data(for: ordersSettingsURL) {
Expand All @@ -726,7 +729,8 @@ private extension AppSettingsStore {
orderStatusesFilter: orderStatusesFilter,
dateRangeFilter: dateRangeFilter,
productFilter: productFilter,
customerFilter: customerFilter)
customerFilter: customerFilter,
salesChannelFilter: salesChannelFilter)
existingSettings[siteID] = newSettings

let newStoredOrderSettings = StoredOrderSettings(settings: existingSettings)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -155,11 +155,13 @@ private extension AppSettingsStoreTests_OrderFilterHistory {
let dateRange = OrderDateRangeFilter(filter: .custom, startDate: startDate, endDate: endDate)
let productFilter = FilterOrdersByProduct(id: 1, name: "Sample product")
let customerFilter = CustomerFilter(customer: Customer.fake().copy(customerID: 1))
let salesChannelFilter = SalesChannelFilter.pointOfSale
return StoredOrderSettings.Setting(siteID: siteID,
orderStatusesFilter: orderStatuses,
dateRangeFilter: dateRange,
productFilter: productFilter,
customerFilter: customerFilter)
customerFilter: customerFilter,
salesChannelFilter: salesChannelFilter)
}

func insertMockFilter(filter: StoredOrderSettings.Setting, using store: AppSettingsStore) async throws {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -51,11 +51,13 @@ final class AppSettingsStoreTests_OrdersSettings: XCTestCase {
let dateRange = OrderDateRangeFilter(filter: .custom, startDate: startDate, endDate: endDate)
let productFilter = FilterOrdersByProduct(id: 1, name: "Sample product")
let customerFilter = CustomerFilter(customer: Customer.fake().copy(customerID: 1))
let salesChannelFilter = SalesChannelFilter.pointOfSale
let orderSettings = StoredOrderSettings.Setting(siteID: siteID,
orderStatusesFilter: orderStatuses,
dateRangeFilter: dateRange,
productFilter: productFilter,
customerFilter: customerFilter
customerFilter: customerFilter,
salesChannelFilter: salesChannelFilter
)

// When
Expand All @@ -73,7 +75,8 @@ final class AppSettingsStoreTests_OrdersSettings: XCTestCase {
orderStatusesFilter: orderStatuses,
dateRangeFilter: dateRange,
productFilter: productFilter,
customerFilter: customerFilter) { error in
customerFilter: customerFilter,
salesChannelFilter: salesChannelFilter) { error in
XCTAssertNil(error)
}
subject.onAction(writeAction)
Expand Down Expand Up @@ -102,31 +105,36 @@ final class AppSettingsStoreTests_OrdersSettings: XCTestCase {
let dateRange = OrderDateRangeFilter(filter: .custom, startDate: startDate, endDate: endDate)
let productFilter = FilterOrdersByProduct(id: 1, name: "Sample product 1")
let customerFilter = CustomerFilter(customer: Customer.fake().copy(customerID: 1))
let salesChannelFilter = SalesChannelFilter.any

let orderStatuses2: [OrderStatusEnum] = [.pending, .cancelled]
let startDate2 = Date().yearStart
let endDate2 = Date().yearEnd
let dateRange2 = OrderDateRangeFilter(filter: .custom, startDate: startDate2, endDate: endDate2)
let productFilter2 = FilterOrdersByProduct(id: 2, name: "Sample product 2")
let customerFilter2 = CustomerFilter(customer: Customer.fake().copy(customerID: 2))
let salesChannelFilter2 = SalesChannelFilter.pointOfSale

let orderSettings1 = StoredOrderSettings.Setting(siteID: siteID1,
orderStatusesFilter: orderStatuses,
dateRangeFilter: dateRange,
orderStatusesFilter: orderStatuses,
dateRangeFilter: dateRange,
productFilter: productFilter,
customerFilter: customerFilter)
customerFilter: customerFilter,
salesChannelFilter: salesChannelFilter)
let orderSettings2 = StoredOrderSettings.Setting(siteID: siteID2,
orderStatusesFilter: orderStatuses2,
dateRangeFilter: dateRange2,
orderStatusesFilter: orderStatuses2,
dateRangeFilter: dateRange2,
productFilter: productFilter2,
customerFilter: customerFilter2)
customerFilter: customerFilter2,
salesChannelFilter: salesChannelFilter2)

// When
let writeAction1 = AppSettingsAction.upsertOrdersSettings(siteID: siteID1,
orderStatusesFilter: orderStatuses,
dateRangeFilter: dateRange,
productFilter: productFilter,
customerFilter: customerFilter) { error in
customerFilter: customerFilter,
salesChannelFilter: salesChannelFilter) { error in
XCTAssertNil(error)
}
subject.onAction(writeAction1)
Expand All @@ -135,7 +143,8 @@ final class AppSettingsStoreTests_OrdersSettings: XCTestCase {
orderStatusesFilter: orderStatuses2,
dateRangeFilter: dateRange2,
productFilter: productFilter2,
customerFilter: customerFilter2) { error in
customerFilter: customerFilter2,
salesChannelFilter: salesChannelFilter2) { error in
XCTAssertNil(error)
}
subject.onAction(writeAction2)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -77,7 +77,7 @@ private struct CurrentOrderListSyncUseCase {
dateRange: settings.dateRangeFilter,
product: settings.productFilter,
customer: settings.customerFilter,
salesChannel: nil, // TODO: Filter persistence WOOMOB-712
salesChannel: settings.salesChannelFilter,
numberOfActiveFilters: settings.numberOfActiveFilters())
continuation.resume(returning: filters)
case .failure:
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -142,7 +142,7 @@ final class FilterOrderListViewModel: FilterListViewModel {
dateRange: item.dateRangeFilter,
product: item.productFilter,
customer: item.customerFilter,
salesChannel: nil, // TODO: Filter persistence WOOMOB-712
salesChannel: item.salesChannelFilter,
numberOfActiveFilters: item.numberOfActiveFilters())
}
continuation.resume(returning: filters)
Expand All @@ -168,7 +168,8 @@ final class FilterOrderListViewModel: FilterListViewModel {
orderStatusesFilter: filter.orderStatus,
dateRangeFilter: filter.dateRange,
productFilter: filter.product,
customerFilter: filter.customer)
customerFilter: filter.customer,
salesChannelFilter: filter.salesChannel)
stores.dispatch(AppSettingsAction.upsertOrderFilterHistory(filter: settings, onCompletion: { error in
if let error {
DDLogError("⛔️ Error saving filter history: \(error)")
Expand All @@ -182,7 +183,8 @@ final class FilterOrderListViewModel: FilterListViewModel {
orderStatusesFilter: filter.orderStatus,
dateRangeFilter: filter.dateRange,
productFilter: filter.product,
customerFilter: filter.customer)
customerFilter: filter.customer,
salesChannelFilter: filter.salesChannel)
stores.dispatch(AppSettingsAction.removeFromOrderFilterHistory(filter: settings, onCompletion: { error in
if let error {
DDLogError("⛔️ Error removing from filter history: \(error)")
Expand Down Expand Up @@ -266,7 +268,7 @@ extension FilterOrderListViewModel.OrderListFilter {
listSelectorConfig: .customer(siteID: siteID),
selectedValue: filters.customer)
case .salesChannel:
let salesChannelOptions: [FilterOrderListViewModel.SalesChannelFilter] = [.any, .pointOfSale]
let salesChannelOptions: [SalesChannelFilter] = [.any, .pointOfSale]
return FilterTypeViewModel(title: title,
listSelectorConfig: .staticOptions(options: salesChannelOptions),
selectedValue: filters.salesChannel)
Expand Down Expand Up @@ -377,33 +379,28 @@ extension CustomerFilter: FilterType {
var isActive: Bool { true }
}

extension FilterOrderListViewModel {
enum SalesChannelFilter: FilterType {
case pointOfSale
case any

var description: String {
switch self {
case .pointOfSale:
return NSLocalizedString(
"salesChannelFilter.row.pos.description",
value: "Point of Sale",
comment: "Description for the Sales channel filter option, when selecting 'Point of Sale' orders")
case .any:
return NSLocalizedString(
"salesChannelFilter.row.any.description",
value: "Any",
comment: "Description for the Sales channel filter option, when selecting 'Any' order")
}
extension SalesChannelFilter: FilterType {
var description: String {
switch self {
case .pointOfSale:
return NSLocalizedString(
"salesChannelFilter.row.pos.description",
value: "Point of Sale",
comment: "Description for the Sales channel filter option, when selecting 'Point of Sale' orders")
case .any:
return NSLocalizedString(
"salesChannelFilter.row.any.description",
value: "Any",
comment: "Description for the Sales channel filter option, when selecting 'Any' order")
}
}

var isActive: Bool {
switch self {
case .pointOfSale:
return true
case .any:
return false
}
var isActive: Bool {
switch self {
case .pointOfSale:
return true
case .any:
return false
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -447,7 +447,7 @@ private extension OrdersRootViewController {
dateRange: settings.dateRangeFilter,
product: settings.productFilter,
customer: settings.customerFilter,
salesChannel: nil, // TODO: Filter persistence WOOMOB-712
salesChannel: settings.salesChannelFilter,
numberOfActiveFilters: settings.numberOfActiveFilters())
case .failure(let error):
print("It was not possible to sync local orders settings: \(String(describing: error))")
Expand All @@ -464,7 +464,8 @@ private extension OrdersRootViewController {
orderStatusesFilter: filters.orderStatus,
dateRangeFilter: filters.dateRange,
productFilter: filters.product,
customerFilter: filters.customer) { error in
customerFilter: filters.customer,
salesChannelFilter: filters.salesChannel) { error in
if error != nil {
assertionFailure("It was not possible to store order settings due to an error: \(String(describing: error))")
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -86,7 +86,12 @@ private extension PushNotificationBackgroundSynchronizerTests {
stores.whenReceivingAction(ofType: AppSettingsAction.self) { action in
switch action {
case let .loadOrdersSettings(_, onCompletion):
onCompletion(.success(.init(siteID: order.siteID, orderStatusesFilter: nil, dateRangeFilter: nil, productFilter: nil, customerFilter: nil)))
onCompletion(.success(.init(siteID: order.siteID,
orderStatusesFilter: nil,
dateRangeFilter: nil,
productFilter: nil,
customerFilter: nil,
salesChannelFilter: nil)))
default:
break
}
Expand Down
Loading