@@ -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