Skip to content

Commit b60a2f9

Browse files
authored
Merge pull request #5931 from selanthiraiyan/issue/5809-tax-lines-in-yosemite
Yosemite: Add tax lines to Orders
2 parents c2b280c + cb3593f commit b60a2f9

File tree

9 files changed

+135
-11
lines changed

9 files changed

+135
-11
lines changed

WooCommerce/WooCommerceTests/Tools/MockOrders.swift

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,8 @@ final class MockOrders {
4242
items: [OrderItem] = [],
4343
shippingLines: [ShippingLine] = sampleShippingLines(),
4444
refunds: [OrderRefundCondensed] = [],
45-
fees: [OrderFeeLine] = []) -> Order {
45+
fees: [OrderFeeLine] = [],
46+
taxes: [OrderTaxLine] = []) -> Order {
4647
return Order(siteID: siteID,
4748
orderID: orderID,
4849
parentID: 0,
@@ -70,8 +71,7 @@ final class MockOrders {
7071
coupons: [],
7172
refunds: refunds,
7273
fees: fees,
73-
taxes: [] // TODO: 5809 - Add sampleOrderTaxLines method
74-
)
74+
taxes: taxes)
7575
}
7676

7777
func sampleOrder() -> Order {
@@ -118,8 +118,7 @@ final class MockOrders {
118118
coupons: [],
119119
refunds: [],
120120
fees: [],
121-
taxes: [] // TODO: 5809 - Add sampleOrderTaxLines method
122-
)
121+
taxes: [])
123122
}
124123

125124
static func sampleShippingLines(cost: String = "133.00", tax: String = "0.00") -> [ShippingLine] {

Yosemite/Yosemite.xcodeproj/project.pbxproj

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -294,6 +294,7 @@
294294
B5EED1A820F4F3CF00652449 /* Account+ReadOnlyConvertible.swift in Sources */ = {isa = PBXBuildFile; fileRef = B5EED1A720F4F3CF00652449 /* Account+ReadOnlyConvertible.swift */; };
295295
B5F2AE9520EBAD6000FEDC59 /* ResultsControllerTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = B5F2AE9420EBAD6000FEDC59 /* ResultsControllerTests.swift */; };
296296
B5F2AE9720EBB54A00FEDC59 /* FetchedResultsControllerDelegateWrapper.swift in Sources */ = {isa = PBXBuildFile; fileRef = B5F2AE9620EBB54A00FEDC59 /* FetchedResultsControllerDelegateWrapper.swift */; };
297+
BAB3737927964A9500837B4A /* OrderTaxLine+ReadOnlyConvertible.swift in Sources */ = {isa = PBXBuildFile; fileRef = BAB3737827964A9500837B4A /* OrderTaxLine+ReadOnlyConvertible.swift */; };
297298
CC2C036C262F316600928C9C /* ShippingLabelAccountSettings+ReadOnlyConvertible.swift in Sources */ = {isa = PBXBuildFile; fileRef = CC2C036B262F316600928C9C /* ShippingLabelAccountSettings+ReadOnlyConvertible.swift */; };
298299
CC2C0372262F32D800928C9C /* ShippingLabelPaymentMethod+ReadonlyConvertible.swift in Sources */ = {isa = PBXBuildFile; fileRef = CC2C0371262F32D800928C9C /* ShippingLabelPaymentMethod+ReadonlyConvertible.swift */; };
299300
CC7D89F62767A9FB00046E8D /* Product+OrderItem.swift in Sources */ = {isa = PBXBuildFile; fileRef = CC7D89F52767A9FB00046E8D /* Product+OrderItem.swift */; };
@@ -686,6 +687,7 @@
686687
B5EED1A720F4F3CF00652449 /* Account+ReadOnlyConvertible.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "Account+ReadOnlyConvertible.swift"; sourceTree = "<group>"; };
687688
B5F2AE9420EBAD6000FEDC59 /* ResultsControllerTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ResultsControllerTests.swift; sourceTree = "<group>"; };
688689
B5F2AE9620EBB54A00FEDC59 /* FetchedResultsControllerDelegateWrapper.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FetchedResultsControllerDelegateWrapper.swift; sourceTree = "<group>"; };
690+
BAB3737827964A9500837B4A /* OrderTaxLine+ReadOnlyConvertible.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "OrderTaxLine+ReadOnlyConvertible.swift"; sourceTree = "<group>"; };
689691
C25501C7F936D2FD32FAF3F4 /* Pods_Yosemite.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_Yosemite.framework; sourceTree = BUILT_PRODUCTS_DIR; };
690692
CC2C036B262F316600928C9C /* ShippingLabelAccountSettings+ReadOnlyConvertible.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "ShippingLabelAccountSettings+ReadOnlyConvertible.swift"; sourceTree = "<group>"; };
691693
CC2C0371262F32D800928C9C /* ShippingLabelPaymentMethod+ReadonlyConvertible.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "ShippingLabelPaymentMethod+ReadonlyConvertible.swift"; sourceTree = "<group>"; };
@@ -1203,6 +1205,7 @@
12031205
02C255012563C76A00A04423 /* ShippingLabel+ReadOnlyConvertible.swift */,
12041206
DEFD6D962644423100E51E0D /* SitePlugin+ReadOnlyConvertible.swift */,
12051207
077F39E126A5AFCA00ABEADC /* SystemPlugin+ReadOnlyConvertible.swift */,
1208+
BAB3737827964A9500837B4A /* OrderTaxLine+ReadOnlyConvertible.swift */,
12061209
);
12071210
path = Storage;
12081211
sourceTree = "<group>";
@@ -1793,6 +1796,7 @@
17931796
B5C9DE152087FF0E006B910A /* Dispatcher.swift in Sources */,
17941797
247CE8402582F39900F9D9D1 /* MockActionHandler.swift in Sources */,
17951798
247CE7C82582DF5500F9D9D1 /* MockStoresManager.swift in Sources */,
1799+
BAB3737927964A9500837B4A /* OrderTaxLine+ReadOnlyConvertible.swift in Sources */,
17961800
D83B093525DECFCC00B21F45 /* CardPresentPaymentAction.swift in Sources */,
17971801
B52E0030211A439E00700FDE /* Account+ReadOnlyType.swift in Sources */,
17981802
4591A6B0274BB23000F51DCD /* OrderDateRangeFilter.swift in Sources */,

Yosemite/Yosemite/Model/Model.swift

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,7 @@ public typealias OrderCouponLine = Networking.OrderCouponLine
4343
public typealias OrderFeeLine = Networking.OrderFeeLine
4444
public typealias OrderFeeTaxStatus = Networking.OrderFeeTaxStatus
4545
public typealias OrderNote = Networking.OrderNote
46+
public typealias OrderTaxLine = Networking.OrderTaxLine
4647
public typealias OrderRefundCondensed = Networking.OrderRefundCondensed
4748
public typealias OrderStatsV4 = Networking.OrderStatsV4
4849
public typealias OrderStatsV4Interval = Networking.OrderStatsV4Interval

Yosemite/Yosemite/Model/Storage/Order+ReadOnlyConvertible.swift

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -70,6 +70,7 @@ extension Storage.Order: ReadOnlyConvertible {
7070
let orderRefunds = refunds?.map { $0.toReadOnly() } ?? [Yosemite.OrderRefundCondensed]()
7171
let orderShippingLines = shippingLines?.map { $0.toReadOnly() } ?? [Yosemite.ShippingLine]()
7272
let orderFeeLines = fees?.map { $0.toReadOnly() } ?? [Yosemite.OrderFeeLine]()
73+
let orderTaxLines = taxes?.map { $0.toReadOnly() } ?? [Yosemite.OrderTaxLine]()
7374

7475
return Order(siteID: siteID,
7576
orderID: orderID,
@@ -98,7 +99,7 @@ extension Storage.Order: ReadOnlyConvertible {
9899
coupons: orderCoupons,
99100
refunds: orderRefunds,
100101
fees: orderFeeLines,
101-
taxes: []) // TODO: 5809 - Handle OrderTaxLine
102+
taxes: orderTaxLines)
102103

103104
}
104105

Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
import Foundation
2+
import Storage
3+
4+
// MARK: - Storage.OrderTaxLine: ReadOnlyConvertible
5+
//
6+
extension Storage.OrderTaxLine: ReadOnlyConvertible {
7+
8+
/// Updates the `Storage.OrderTaxLine` using the ReadOnly representation (`Networking.OrderTaxLine`)
9+
///
10+
/// - Parameter taxLine: ReadOnly representation of OrderTaxLine
11+
///
12+
public func update(with taxLine: Yosemite.OrderTaxLine) {
13+
taxID = taxLine.taxID
14+
rateCode = taxLine.rateCode
15+
rateID = taxLine.rateID
16+
label = taxLine.label
17+
isCompoundTaxRate = taxLine.isCompoundTaxRate
18+
totalTax = taxLine.totalTax
19+
totalShippingTax = taxLine.totalShippingTax
20+
ratePercent = taxLine.ratePercent
21+
}
22+
23+
/// Returns a ReadOnly (`Networking.OrderTaxLine`) version of the `Storage.OrderTaxLine`
24+
///
25+
public func toReadOnly() -> Yosemite.OrderTaxLine {
26+
let taxAttributes = attributes?.map { $0.toReadOnly() } ?? [Yosemite.OrderItemAttribute]()
27+
28+
return OrderTaxLine(taxID: taxID,
29+
rateCode: rateCode ?? "",
30+
rateID: rateID,
31+
label: label ?? "",
32+
isCompoundTaxRate: isCompoundTaxRate,
33+
totalTax: totalTax ?? "",
34+
totalShippingTax: totalShippingTax ?? "",
35+
ratePercent: ratePercent,
36+
attributes: taxAttributes)
37+
}
38+
}

Yosemite/Yosemite/Stores/Order/OrdersUpsertUseCase.swift

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -57,6 +57,7 @@ struct OrdersUpsertUseCase {
5757
handleOrderFees(readOnlyOrder, storageOrder, storage)
5858
handleOrderShippingLines(readOnlyOrder, storageOrder, storage)
5959
handleOrderRefundsCondensed(readOnlyOrder, storageOrder, storage)
60+
handleOrderTaxes(readOnlyOrder, storageOrder, storage)
6061

6162
return storageOrder
6263
}
@@ -258,4 +259,27 @@ struct OrdersUpsertUseCase {
258259
}
259260
}
260261
}
262+
263+
/// Updates, inserts, or prunes the provided `storageOrder`'s taxes using the provided `readOnlyOrder`'s taxes
264+
///
265+
private func handleOrderTaxes(_ readOnlyOrder: Networking.Order, _ storageOrder: Storage.Order, _ storage: StorageType) {
266+
// Upsert the `taxes` from the `readOnlyOrder`
267+
readOnlyOrder.taxes.forEach { readOnlyTax in
268+
if let existingStorageTax = storage.loadOrderTaxLine(siteID: readOnlyOrder.siteID, taxID: readOnlyTax.taxID) {
269+
existingStorageTax.update(with: readOnlyTax)
270+
} else {
271+
let newStorageTax = storage.insertNewObject(ofType: Storage.OrderTaxLine.self)
272+
newStorageTax.update(with: readOnlyTax)
273+
storageOrder.addToTaxes(newStorageTax)
274+
}
275+
}
276+
277+
// Now, remove any objects that exist in `storageOrder.taxes` but not in `readOnlyOrder.taxes`
278+
storageOrder.taxes?.forEach { storageTax in
279+
if readOnlyOrder.taxes.first(where: { $0.taxID == storageTax.taxID } ) == nil {
280+
storageOrder.removeFromTaxes(storageTax)
281+
storage.deleteObject(storageTax)
282+
}
283+
}
284+
}
261285
}

Yosemite/YosemiteTests/Stores/Order/OrdersUpsertUseCaseTests.swift

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -121,6 +121,36 @@ final class OrdersUpsertUseCaseTests: XCTestCase {
121121
XCTAssertEqual(tax2.toReadOnly(), taxes[1])
122122
}
123123

124+
func test_it_persists_order_tax_line_in_storage() throws {
125+
// Given
126+
let taxLine = OrderTaxLine.fake().copy(taxID: 1)
127+
let order = makeOrder().copy(siteID: 3, taxes: [taxLine])
128+
let useCase = OrdersUpsertUseCase(storage: viewStorage)
129+
130+
// When
131+
useCase.upsert([order])
132+
133+
// Then
134+
let storageTaxLine = try XCTUnwrap(viewStorage.loadOrderTaxLine(siteID: 3, taxID: 1))
135+
XCTAssertEqual(storageTaxLine.toReadOnly(), taxLine)
136+
}
137+
138+
func test_it_replaces_existing_order_tax_line_in_storage() throws {
139+
// Given
140+
let originalTaxLine = OrderTaxLine.fake().copy(taxID: 1, ratePercent: 0.0)
141+
let order = makeOrder().copy(siteID: 3, taxes: [originalTaxLine])
142+
let useCase = OrdersUpsertUseCase(storage: viewStorage)
143+
useCase.upsert([order])
144+
145+
// When
146+
let taxLine = OrderTaxLine.fake().copy(taxID: 1, ratePercent: 5.0)
147+
useCase.upsert([order.copy(taxes: [taxLine])])
148+
149+
// Then
150+
let storageTaxLine = try XCTUnwrap(viewStorage.loadOrderTaxLine(siteID: 3, taxID: 1))
151+
XCTAssertEqual(storageTaxLine.toReadOnly(), taxLine)
152+
}
153+
124154
func test_it_persists_order_item_attributes_in_storage() throws {
125155
// Given
126156
let attributes = [

Yosemite/YosemiteTests/Stores/OrderStoreTests.swift

Lines changed: 29 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -340,12 +340,14 @@ final class OrderStoreTests: XCTestCase {
340340
XCTAssertEqual(viewStorage.countObjects(ofType: Storage.OrderItem.self), 0)
341341
XCTAssertEqual(viewStorage.countObjects(ofType: Storage.OrderItemTax.self), 0)
342342
XCTAssertEqual(viewStorage.countObjects(ofType: Storage.OrderCoupon.self), 0)
343+
XCTAssertEqual(viewStorage.countObjects(ofType: Storage.OrderTaxLine.self), 0)
343344

344345
orderStore.upsertStoredOrder(readOnlyOrder: sampleOrder(), in: viewStorage)
345346
XCTAssertEqual(viewStorage.countObjects(ofType: Storage.Order.self), 1)
346347
XCTAssertEqual(viewStorage.countObjects(ofType: Storage.OrderItem.self), 2)
347348
XCTAssertEqual(viewStorage.countObjects(ofType: Storage.OrderItemTax.self), 2)
348349
XCTAssertEqual(viewStorage.countObjects(ofType: Storage.OrderCoupon.self), 1)
350+
XCTAssertEqual(viewStorage.countObjects(ofType: Storage.OrderTaxLine.self), 1)
349351

350352
orderStore.upsertStoredOrder(readOnlyOrder: sampleOrderMutated(), in: viewStorage)
351353
let storageOrder1 = viewStorage.loadOrder(siteID: sampleSiteID, orderID: sampleOrderMutated().orderID)
@@ -354,6 +356,7 @@ final class OrderStoreTests: XCTestCase {
354356
XCTAssertEqual(viewStorage.countObjects(ofType: Storage.OrderItem.self), 3)
355357
XCTAssertEqual(viewStorage.countObjects(ofType: Storage.OrderItemTax.self), 3)
356358
XCTAssertEqual(viewStorage.countObjects(ofType: Storage.OrderCoupon.self), 2)
359+
XCTAssertEqual(viewStorage.countObjects(ofType: Storage.OrderTaxLine.self), 2)
357360

358361
orderStore.upsertStoredOrder(readOnlyOrder: sampleOrderMutated2(), in: viewStorage)
359362
let storageOrder2 = viewStorage.loadOrder(siteID: sampleSiteID, orderID: sampleOrderMutated2().orderID)
@@ -362,6 +365,7 @@ final class OrderStoreTests: XCTestCase {
362365
XCTAssertEqual(viewStorage.countObjects(ofType: Storage.OrderItem.self), 1)
363366
XCTAssertEqual(viewStorage.countObjects(ofType: Storage.OrderItemTax.self), 4)
364367
XCTAssertEqual(viewStorage.countObjects(ofType: Storage.OrderCoupon.self), 0)
368+
XCTAssertEqual(viewStorage.countObjects(ofType: Storage.OrderTaxLine.self), 0)
365369
}
366370

367371
/// Verifies that `upsertStoredOrder` effectively inserts a new Order, with the specified payload.
@@ -571,12 +575,14 @@ final class OrderStoreTests: XCTestCase {
571575
XCTAssertEqual(viewStorage.countObjects(ofType: Storage.Order.self), 1)
572576
XCTAssertEqual(viewStorage.countObjects(ofType: Storage.OrderItem.self), 2)
573577
XCTAssertEqual(viewStorage.countObjects(ofType: Storage.OrderCoupon.self), 1)
578+
XCTAssertEqual(viewStorage.countObjects(ofType: Storage.OrderTaxLine.self), 1)
574579

575580
let expectation = self.expectation(description: "Stored Orders Reset")
576581
let action = OrderAction.resetStoredOrders {
577582
XCTAssertEqual(self.viewStorage.countObjects(ofType: Storage.Order.self), 0)
578583
XCTAssertEqual(self.viewStorage.countObjects(ofType: Storage.OrderItem.self), 0)
579584
XCTAssertEqual(self.viewStorage.countObjects(ofType: Storage.OrderCoupon.self), 0)
585+
XCTAssertEqual(self.viewStorage.countObjects(ofType: Storage.OrderTaxLine.self), 0)
580586

581587
expectation.fulfill()
582588
}
@@ -796,7 +802,7 @@ private extension OrderStoreTests {
796802
coupons: sampleCoupons(),
797803
refunds: [],
798804
fees: [],
799-
taxes: []) // TODO: 5809 - Add sampleOrderTaxLines method and update tests
805+
taxes: sampleOrderTaxLines())
800806
}
801807

802808
func sampleOrderMutated() -> Networking.Order {
@@ -827,7 +833,7 @@ private extension OrderStoreTests {
827833
coupons: sampleCouponsMutated(),
828834
refunds: [],
829835
fees: [],
830-
taxes: []) // TODO: 5809 - Add sampleOrderTaxLinesMutated method and update tests
836+
taxes: sampleOrderTaxLinesMutated())
831837
}
832838

833839
func sampleOrderMutated2() -> Networking.Order {
@@ -858,7 +864,7 @@ private extension OrderStoreTests {
858864
coupons: [],
859865
refunds: [],
860866
fees: [],
861-
taxes: []) // TODO: 5809 - Add sampleOrderTaxLinesMutated2 method and update tests
867+
taxes: [])
862868
}
863869

864870
func sampleAddress() -> Networking.Address {
@@ -906,6 +912,26 @@ private extension OrderStoreTests {
906912
return [coupon1, coupon2]
907913
}
908914

915+
func sampleOrderTaxLine() -> Networking.OrderTaxLine {
916+
OrderTaxLine.fake().copy(taxID: 1330,
917+
rateCode: "US-NY-STATE-2",
918+
rateID: 6,
919+
label: "State",
920+
totalTax: "7.71",
921+
ratePercent: 4.5)
922+
}
923+
924+
func sampleOrderTaxLines() -> [Networking.OrderTaxLine] {
925+
[sampleOrderTaxLine()]
926+
}
927+
928+
func sampleOrderTaxLinesMutated() -> [Networking.OrderTaxLine] {
929+
[
930+
sampleOrderTaxLine().copy(totalTax: "55", ratePercent: 5.5),
931+
OrderTaxLine.fake()
932+
]
933+
}
934+
909935
func sampleItems() -> [Networking.OrderItem] {
910936
let item1 = OrderItem(itemID: 890,
911937
name: "Fruits Basket (Mix & Match Product)",

Yosemite/YosemiteTests/Stores/ReceiptStoreTests.swift

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -406,7 +406,8 @@ private extension ReceiptStoreTests {
406406
totalTax: String = "",
407407
items: [Yosemite.OrderItem] = [],
408408
coupons: [OrderCouponLine] = [],
409-
fees: [Yosemite.OrderFeeLine] = []) -> Networking.Order {
409+
fees: [Yosemite.OrderFeeLine] = [],
410+
taxes: [Yosemite.OrderTaxLine] = []) -> Networking.Order {
410411
Order(siteID: 1234,
411412
orderID: 0,
412413
parentID: 0,
@@ -434,7 +435,7 @@ private extension ReceiptStoreTests {
434435
coupons: coupons,
435436
refunds: [],
436437
fees: fees,
437-
taxes: []) // TODO: 5809 - Add makeOrderTaxLine method
438+
taxes: taxes)
438439
}
439440

440441
func expectedDiscountLineDescription() -> String {

0 commit comments

Comments
 (0)