Skip to content

Commit 57b629c

Browse files
committed
Adds support to add & edit products
1 parent 0c7a6b7 commit 57b629c

File tree

1 file changed

+62
-0
lines changed

1 file changed

+62
-0
lines changed

WooCommerce/Classes/ViewRelated/Orders/Order Creation/Synchronizer/LocalOrderSynchronizer.swift

Lines changed: 62 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -64,5 +64,67 @@ private extension LocalOrderSynchronizer {
6464
order.copy(status: newStatus)
6565
}
6666
.assign(to: &$order)
67+
68+
setProduct.withLatestFrom(orderPublisher)
69+
.map { productInput, order in
70+
ProductInputTransformer.addOrReplace(input: productInput, on: order)
71+
}
72+
.assign(to: &$order)
6773
}
6874
}
75+
76+
private struct ProductInputTransformer {
77+
78+
struct OrderItemParameters {
79+
let quantity: Decimal
80+
let price: Decimal
81+
let productID: Int64
82+
let variationID: Int64?
83+
var subtotal: String {
84+
"\(price * quantity)"
85+
}
86+
}
87+
88+
static func addOrReplace(input: OrderSyncProductInput, on order: Order) -> Order {
89+
let newItem = createOrderItem(using: input)
90+
91+
var items = order.items
92+
if let itemIndex = order.items.firstIndex(where: { $0.itemID == newItem.itemID }) {
93+
items[itemIndex] = newItem
94+
} else {
95+
items.append(newItem)
96+
}
97+
98+
return order.copy(items: items)
99+
}
100+
101+
static func createOrderItem(using input: OrderSyncProductInput) -> OrderItem {
102+
let quantity = Decimal(input.quantity)
103+
let parameters: OrderItemParameters = {
104+
switch input.product {
105+
case .product(let product):
106+
let price = Decimal(string: product.price) ?? .zero
107+
return OrderItemParameters(quantity: quantity, price: price, productID: product.productID, variationID: nil)
108+
case .variation(let variation):
109+
let price = Decimal(string: variation.price) ?? .zero
110+
return OrderItemParameters(quantity: quantity, price: price, productID: variation.productID, variationID: variation.productVariationID)
111+
}
112+
}()
113+
114+
return OrderItem(itemID: Int64(input.id.hashValue),
115+
name: "",
116+
productID: parameters.productID,
117+
variationID: parameters.variationID ?? 0,
118+
quantity: quantity,
119+
price: parameters.price as NSDecimalNumber,
120+
sku: nil,
121+
subtotal: parameters.subtotal,
122+
subtotalTax: "",
123+
taxClass: "",
124+
taxes: [],
125+
total: "",
126+
totalTax: "",
127+
attributes: [])
128+
}
129+
}
130+

0 commit comments

Comments
 (0)