Skip to content

Commit d6fc78c

Browse files
authored
Merge pull request #9803 from woocommerce/issue/9784-update-quantity-on-scan
Update quantity when scanning products already in order
2 parents 94f6548 + 31e3f04 commit d6fc78c

File tree

2 files changed

+62
-9
lines changed

2 files changed

+62
-9
lines changed

WooCommerce/Classes/ViewRelated/Orders/Order Creation/EditableOrderViewModel.swift

Lines changed: 24 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1322,16 +1322,23 @@ extension EditableOrderViewModel {
13221322
stores.dispatch(action)
13231323
}
13241324

1325-
/// Validates if the given product ID is a product or a productVariation, and updates the Order with the correspondent item
1326-
///
1327-
private func updateOrderWithProductID(_ productID: Int64) {
1328-
if let productVariation = allProductVariations.first(where: { $0.productVariationID == productID }) {
1329-
orderSynchronizer.setProduct.send(.init(product: .variation(productVariation), quantity: 1))
1330-
} else if let product = allProducts.first(where: { $0.productID == productID }) {
1331-
orderSynchronizer.setProduct.send(.init(product: .product(product), quantity: 1))
1332-
} else {
1333-
DDLogError("⛔️ID \(productID) not found")
1325+
/// Updates the Order with the given product
1326+
///
1327+
func updateOrderWithProductID(_ productID: Int64) {
1328+
guard currentOrderItems.contains(where: { $0.productOrVariationID == productID }) else {
1329+
// If it's not part of the current order, send the correct productType to the synchronizer
1330+
if let productVariation = retrieveVariation(for: productID) {
1331+
orderSynchronizer.setProduct.send(.init(product: .variation(productVariation), quantity: 1))
1332+
} else if let product = allProducts.first(where: { $0.productID == productID }) {
1333+
orderSynchronizer.setProduct.send(.init(product: .product(product), quantity: 1))
1334+
} else {
1335+
DDLogError("⛔️ID \(productID) not found")
1336+
}
1337+
return
13341338
}
1339+
// Increase quantity if exists
1340+
let match = productRows.first(where: { $0.productOrVariationID == productID })
1341+
match?.incrementQuantity()
13351342
}
13361343
}
13371344

@@ -1395,6 +1402,14 @@ private extension EditableOrderViewModel {
13951402
}
13961403
return variation
13971404
}
1405+
1406+
func retrieveVariation(for id: Int64) -> ProductVariation? {
1407+
guard let variation = allProductVariations.first(where: { $0.productVariationID == id }) else {
1408+
let product = allProducts.first(where: { $0.productID == id })
1409+
return product?.toProductVariation()
1410+
}
1411+
return variation
1412+
}
13981413
}
13991414

14001415
private extension EditableOrderViewModel {

WooCommerce/WooCommerceTests/ViewRelated/Orders/Order Creation/EditableOrderViewModelTests.swift

Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1770,6 +1770,44 @@ final class EditableOrderViewModelTests: XCTestCase {
17701770
XCTAssertEqual(orderItem.variationID, variationID)
17711771
XCTAssertEqual(orderItem.quantity, 1)
17721772
}
1773+
1774+
func test_order_with_no_products_when_updateOrderWithProduct_is_invoked_then_product_is_added() {
1775+
// Given
1776+
let product = Product.fake().copy(siteID: sampleSiteID, productID: sampleProductID, purchasable: true)
1777+
storageManager.insertSampleProduct(readOnlyProduct: product)
1778+
let viewModel = EditableOrderViewModel(siteID: sampleSiteID, storageManager: storageManager)
1779+
1780+
// Confidence check
1781+
let orderItem = viewModel.currentOrderItems.first
1782+
XCTAssertNil(orderItem)
1783+
1784+
// When
1785+
viewModel.updateOrderWithProductID(sampleProductID)
1786+
1787+
// Then
1788+
XCTAssertEqual(viewModel.currentOrderItems.count, 1)
1789+
XCTAssertEqual(viewModel.currentOrderItems.first?.quantity, 1)
1790+
XCTAssertEqual(viewModel.productRows[safe: 0]?.quantity, 1)
1791+
}
1792+
1793+
func test_order_with_products_when_updateOrderWithProduct_is_invoked_then_product_quantity_is_updated() {
1794+
// Given
1795+
let product = Product.fake().copy(siteID: sampleSiteID, productID: sampleProductID, purchasable: true)
1796+
storageManager.insertSampleProduct(readOnlyProduct: product)
1797+
let viewModel = EditableOrderViewModel(siteID: sampleSiteID, storageManager: storageManager, initialProductID: sampleProductID)
1798+
1799+
// Confidence check
1800+
let orderItem = viewModel.currentOrderItems.first
1801+
XCTAssertEqual(orderItem?.quantity, 1)
1802+
1803+
// When
1804+
viewModel.updateOrderWithProductID(sampleProductID)
1805+
1806+
// Then
1807+
XCTAssertEqual(viewModel.currentOrderItems.count, 1)
1808+
XCTAssertEqual(viewModel.currentOrderItems.first?.quantity, 2)
1809+
XCTAssertEqual(viewModel.productRows[safe: 0]?.quantity, 2)
1810+
}
17731811
}
17741812

17751813
private extension MockStorageManager {

0 commit comments

Comments
 (0)