Skip to content

Commit d3a542c

Browse files
author
Sharma Elanthiriayan
committed
Merge branch 'develop' into issue/5369-install-jetpack-row-in-settings
2 parents e988a81 + f322d9c commit d3a542c

File tree

99 files changed

+2362
-327
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

99 files changed

+2362
-327
lines changed

.github/PULL_REQUEST_TEMPLATE.md

Lines changed: 15 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,19 @@
1+
<!-- Remember about a good descriptive title. -->
12

3+
Closes: #
4+
<!-- Id number of the GitHub issue this PR addresses. -->
25

6+
### Description
7+
<!-- Take the time to write a good summary. Why is it needed? What does it do? When fixing bugs try to avoid just writing “See original issue” – clarify what the problem was and how you’ve fixed it. -->
38

4-
Update release notes:
9+
### Testing instructions
10+
<!-- Step by step testing instructions. When necessary break out individual scenarios that need testing, consider including a checklist for the reviewer to go through. -->
11+
12+
### Screenshots
13+
<!-- Include before and after images or gifs when appropriate. -->
14+
15+
16+
---
517
- [ ] I have considered if this change warrants user-facing release notes and have added them to `RELEASE-NOTES.txt` if necessary.
18+
19+
<!-- Pull request guidelines: https://github.com/woocommerce/woocommerce-android/blob/develop/docs/pull-request-guidelines.md -->

Hardware/Hardware/CardReader/CardReaderConfigProvider.swift

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -3,14 +3,14 @@
33
/// It is meant to abstract an implementation of the [adapter pattern](https://en.wikipedia.org/wiki/Adapter_pattern)
44

55
public protocol ReaderTokenProvider {
6-
func fetchToken(completion: @escaping(String?, Error?) -> Void)
6+
func fetchToken(completion: @escaping(Result<String, Error>) -> Void)
77
}
88

99
public protocol ReaderLocationProvider {
10-
func fetchDefaultLocationID(completion: @escaping(String?, Error?) -> Void)
10+
func fetchDefaultLocationID(completion: @escaping(Result<String, Error>) -> Void)
1111
}
1212

13-
public protocol CardReaderConfigProvider: ReaderLocationProvider {
14-
func fetchToken(completion: @escaping(String?, Error?) -> Void)
15-
func fetchDefaultLocationID(completion: @escaping(String?, Error?) -> Void)
13+
public protocol CardReaderConfigProvider: ReaderLocationProvider, ReaderTokenProvider {
14+
func fetchToken(completion: @escaping(Result<String, Error>) -> Void)
15+
func fetchDefaultLocationID(completion: @escaping(Result<String, Error>) -> Void)
1616
}

Hardware/Hardware/CardReader/CardReaderService.swift

Lines changed: 0 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -10,15 +10,6 @@ public protocol CardReaderService {
1010
/// The Publisher that emits the connected readers
1111
var connectedReaders: AnyPublisher<[CardReader], Never> { get }
1212

13-
/// The Publisher that emits the service status
14-
var serviceStatus: AnyPublisher<CardReaderServiceStatus, Never> { get }
15-
16-
/// The Publisher that emits the service discovery status
17-
var discoveryStatus: AnyPublisher<CardReaderServiceDiscoveryStatus, Never> { get }
18-
19-
/// The Publisher that emits the payment status
20-
var paymentStatus: AnyPublisher<PaymentStatus, Never> { get }
21-
2213
/// The Publisher that emits reader events
2314
var readerEvents: AnyPublisher<CardReaderEvent, Never> { get }
2415

Hardware/Hardware/CardReader/StripeCardReader/DefaultConnectionTokenProvider.swift

Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4,13 +4,20 @@ import StripeTerminal
44
/// uses the networking adapter provided by clients of Hardware
55
/// to fetch a connection token
66
final class DefaultConnectionTokenProvider: ConnectionTokenProvider {
7-
private let provider: CardReaderConfigProvider
7+
private let provider: ReaderTokenProvider
88

9-
init(provider: CardReaderConfigProvider) {
9+
init(provider: ReaderTokenProvider) {
1010
self.provider = provider
1111
}
1212

1313
public func fetchConnectionToken(_ completion: @escaping ConnectionTokenCompletionBlock) {
14-
provider.fetchToken(completion: completion)
14+
provider.fetchToken() { result in
15+
switch result {
16+
case .success(let token):
17+
completion(token, nil)
18+
case .failure(let error):
19+
completion(nil, error)
20+
}
21+
}
1522
}
1623
}

Hardware/Hardware/CardReader/StripeCardReader/StripeCardReaderService.swift

Lines changed: 7 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -10,9 +10,7 @@ public final class StripeCardReaderService: NSObject {
1010

1111
private var discoveredReadersSubject = CurrentValueSubject<[CardReader], Error>([])
1212
private let connectedReadersSubject = CurrentValueSubject<[CardReader], Never>([])
13-
private let serviceStatusSubject = CurrentValueSubject<CardReaderServiceStatus, Never>(.ready)
1413
private let discoveryStatusSubject = CurrentValueSubject<CardReaderServiceDiscoveryStatus, Never>(.idle)
15-
private let paymentStatusSubject = CurrentValueSubject<PaymentStatus, Never>(.notReady)
1614
private let readerEventsSubject = PassthroughSubject<CardReaderEvent, Never>()
1715
private let softwareUpdateSubject = CurrentValueSubject<CardReaderSoftwareUpdateState, Never>(.none)
1816

@@ -46,19 +44,6 @@ extension StripeCardReaderService: CardReaderService {
4644
connectedReadersSubject.eraseToAnyPublisher()
4745
}
4846

49-
public var serviceStatus: AnyPublisher<CardReaderServiceStatus, Never> {
50-
serviceStatusSubject.eraseToAnyPublisher()
51-
}
52-
53-
public var discoveryStatus: AnyPublisher<CardReaderServiceDiscoveryStatus, Never> {
54-
discoveryStatusSubject.removeDuplicates().eraseToAnyPublisher()
55-
}
56-
57-
/// The Publisher that emits the payment status
58-
public var paymentStatus: AnyPublisher<PaymentStatus, Never> {
59-
paymentStatusSubject.eraseToAnyPublisher()
60-
}
61-
6247
/// The Publisher that emits reader events
6348
public var readerEvents: AnyPublisher<CardReaderEvent, Never> {
6449
readerEventsSubject.eraseToAnyPublisher()
@@ -291,17 +276,14 @@ extension StripeCardReaderService: CardReaderService {
291276

292277
// TODO - If we've recently connected to this reader, use the cached locationId from the
293278
// Terminal SDK instead of making this fetch. See #5116 and #5087
294-
self.readerLocationProvider?.fetchDefaultLocationID { (locationId, error) in
295-
if let error = error {
279+
self.readerLocationProvider?.fetchDefaultLocationID { result in
280+
switch result {
281+
case .success(let locationId):
282+
return promise(.success(BluetoothConnectionConfiguration(locationId: locationId)))
283+
case .failure(let error):
296284
let underlyingError = UnderlyingError(with: error)
297285
return promise(.failure(CardReaderServiceError.connection(underlyingError: underlyingError)))
298286
}
299-
300-
if let locationId = locationId {
301-
return promise(.success(BluetoothConnectionConfiguration(locationId: locationId)))
302-
}
303-
304-
promise(.failure(CardReaderServiceError.connection()))
305287
}
306288
}
307289
}
@@ -408,12 +390,12 @@ private extension StripeCardReaderService {
408390
/// https://stripe.dev/stripe-terminal-ios/docs/Classes/SCPTerminal.html#/c:objc(cs)SCPTerminal(im)collectPaymentMethod:delegate:completion:
409391

410392
if underlyingError != .commandCancelled {
411-
print("==== collect payment method was not cancelled. this is an actual error ", underlyingError)
393+
DDLogError("💳 Error: collect payment method \(underlyingError)")
412394
promise(.failure(CardReaderServiceError.paymentMethodCollection(underlyingError: underlyingError)))
413395
}
414396

415397
if underlyingError == .commandCancelled {
416-
print("==== collect payment method cancelled. this is an error we ignore ", error)
398+
DDLogWarn("💳 Warning: collect payment error cancelled. We actively ignore this error \(error)")
417399
}
418400

419401
}
@@ -488,12 +470,10 @@ extension StripeCardReaderService: BluetoothReaderDelegate {
488470
}
489471

490472
public func reader(_ reader: Reader, didStartInstallingUpdate update: ReaderSoftwareUpdate, cancelable: StripeTerminal.Cancelable?) {
491-
print("==== started software update")
492473
softwareUpdateSubject.send(.started(cancelable: cancelable.map(StripeCancelable.init(cancelable:))))
493474
}
494475

495476
public func reader(_ reader: Reader, didReportReaderSoftwareUpdateProgress progress: Float) {
496-
print("==== did repost software update progress ", progress)
497477
softwareUpdateSubject.send(.installing(progress: progress))
498478
}
499479

Hardware/HardwareTests/AirPrintReceipt/ReceiptRendererTest.swift

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -24,8 +24,6 @@ final class ReceiptRendererTest: XCTestCase {
2424

2525
let renderer = ReceiptRenderer(content: content)
2626

27-
print(renderer.htmlContent())
28-
2927
XCTAssertEqual(
3028
Insecure.MD5.hash(data: renderer.htmlContent().data(using: .utf8)!).description,
3129
expectedResultWithHtmlSymbolsMd5Description

Networking/Networking.xcodeproj/project.pbxproj

Lines changed: 16 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -47,11 +47,15 @@
4747
029BA4F0255D7282006171FD /* ShippingLabelRemote.swift in Sources */ = {isa = PBXBuildFile; fileRef = 029BA4EF255D7282006171FD /* ShippingLabelRemote.swift */; };
4848
029BA4F4255D72EC006171FD /* ShippingLabelPrintData.swift in Sources */ = {isa = PBXBuildFile; fileRef = 029BA4F3255D72EC006171FD /* ShippingLabelPrintData.swift */; };
4949
029BA53B255DFABD006171FD /* ShippingLabelPrintDataMapper.swift in Sources */ = {isa = PBXBuildFile; fileRef = 029BA53A255DFABD006171FD /* ShippingLabelPrintDataMapper.swift */; };
50+
02A26F1B2744F5FC008E4EDB /* wc-site-settings-partial.json in Resources */ = {isa = PBXBuildFile; fileRef = 02A26F192744F5FC008E4EDB /* wc-site-settings-partial.json */; };
51+
02A26F1C2744F5FC008E4EDB /* wp-site-settings.json in Resources */ = {isa = PBXBuildFile; fileRef = 02A26F1A2744F5FC008E4EDB /* wp-site-settings.json */; };
5052
02AAD53F250092A400BA1E26 /* product-add-or-delete.json in Resources */ = {isa = PBXBuildFile; fileRef = 02AAD53E250092A300BA1E26 /* product-add-or-delete.json */; };
5153
02BA23C922EEF62C009539E7 /* order-stats-v4-wcadmin-deactivated.json in Resources */ = {isa = PBXBuildFile; fileRef = 02BA23C722EEF62C009539E7 /* order-stats-v4-wcadmin-deactivated.json */; };
5254
02BA23CA22EEF62C009539E7 /* order-stats-v4-wcadmin-activated.json in Resources */ = {isa = PBXBuildFile; fileRef = 02BA23C822EEF62C009539E7 /* order-stats-v4-wcadmin-activated.json */; };
5355
02BDB83523EA98C800BCC63E /* String+HTML.swift in Sources */ = {isa = PBXBuildFile; fileRef = 02BDB83423EA98C800BCC63E /* String+HTML.swift */; };
5456
02BDB83723EA9C4D00BCC63E /* String+HTMLTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 02BDB83623EA9C4D00BCC63E /* String+HTMLTests.swift */; };
57+
02C11276274285FF00F4F0B4 /* WooCommerceAvailabilityMapper.swift in Sources */ = {isa = PBXBuildFile; fileRef = 02C11275274285FF00F4F0B4 /* WooCommerceAvailabilityMapper.swift */; };
58+
02C112782742862600F4F0B4 /* WordPressSiteSettingsMapper.swift in Sources */ = {isa = PBXBuildFile; fileRef = 02C112772742862600F4F0B4 /* WordPressSiteSettingsMapper.swift */; };
5559
02C1CEF424C6A02B00703EBA /* ProductVariationMapper.swift in Sources */ = {isa = PBXBuildFile; fileRef = 02C1CEF324C6A02B00703EBA /* ProductVariationMapper.swift */; };
5660
02C2548425635BD000A04423 /* ShippingLabelPaperSize.swift in Sources */ = {isa = PBXBuildFile; fileRef = 02C2548325635BD000A04423 /* ShippingLabelPaperSize.swift */; };
5761
02C2549A25636E1500A04423 /* ShippingLabelAddress.swift in Sources */ = {isa = PBXBuildFile; fileRef = 02C2549925636E1500A04423 /* ShippingLabelAddress.swift */; };
@@ -625,11 +629,15 @@
625629
029BA4EF255D7282006171FD /* ShippingLabelRemote.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ShippingLabelRemote.swift; sourceTree = "<group>"; };
626630
029BA4F3255D72EC006171FD /* ShippingLabelPrintData.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ShippingLabelPrintData.swift; sourceTree = "<group>"; };
627631
029BA53A255DFABD006171FD /* ShippingLabelPrintDataMapper.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ShippingLabelPrintDataMapper.swift; sourceTree = "<group>"; };
632+
02A26F192744F5FC008E4EDB /* wc-site-settings-partial.json */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.json; path = "wc-site-settings-partial.json"; sourceTree = "<group>"; };
633+
02A26F1A2744F5FC008E4EDB /* wp-site-settings.json */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.json; path = "wp-site-settings.json"; sourceTree = "<group>"; };
628634
02AAD53E250092A300BA1E26 /* product-add-or-delete.json */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.json; path = "product-add-or-delete.json"; sourceTree = "<group>"; };
629635
02BA23C722EEF62C009539E7 /* order-stats-v4-wcadmin-deactivated.json */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.json; path = "order-stats-v4-wcadmin-deactivated.json"; sourceTree = "<group>"; };
630636
02BA23C822EEF62C009539E7 /* order-stats-v4-wcadmin-activated.json */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.json; path = "order-stats-v4-wcadmin-activated.json"; sourceTree = "<group>"; };
631637
02BDB83423EA98C800BCC63E /* String+HTML.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "String+HTML.swift"; sourceTree = "<group>"; };
632638
02BDB83623EA9C4D00BCC63E /* String+HTMLTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "String+HTMLTests.swift"; sourceTree = "<group>"; };
639+
02C11275274285FF00F4F0B4 /* WooCommerceAvailabilityMapper.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = WooCommerceAvailabilityMapper.swift; sourceTree = "<group>"; };
640+
02C112772742862600F4F0B4 /* WordPressSiteSettingsMapper.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = WordPressSiteSettingsMapper.swift; sourceTree = "<group>"; };
633641
02C1CEF324C6A02B00703EBA /* ProductVariationMapper.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ProductVariationMapper.swift; sourceTree = "<group>"; };
634642
02C2548325635BD000A04423 /* ShippingLabelPaperSize.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ShippingLabelPaperSize.swift; sourceTree = "<group>"; };
635643
02C2549925636E1500A04423 /* ShippingLabelAddress.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ShippingLabelAddress.swift; sourceTree = "<group>"; };
@@ -1496,7 +1504,6 @@
14961504
029BA4EF255D7282006171FD /* ShippingLabelRemote.swift */,
14971505
D8EDFE1D25EE87F1003D2213 /* WCPayRemote.swift */,
14981506
FE28F6E5268429B6004465C7 /* UserRemote.swift */,
1499-
077F39D526A58E4500ABEADC /* SystemPluginsRemote.swift */,
15001507
077F39D526A58E4500ABEADC /* SystemStatusRemote.swift */,
15011508
AEF94584272974F2001DCCFB /* TelemetryRemote.swift */,
15021509
);
@@ -1737,6 +1744,7 @@
17371744
74ABA1C7213F19FE00FFAD30 /* top-performers-year.json */,
17381745
FE28F6E726842D57004465C7 /* user-complete.json */,
17391746
7495AACE225D366D00801A89 /* variation-as-product.json */,
1747+
02A26F192744F5FC008E4EDB /* wc-site-settings-partial.json */,
17401748
D800DA0D25EFEC21001E13CE /* wcpay-connection-token.json */,
17411749
318E8FD626C322EA00F519D7 /* wcpay-customer.json */,
17421750
318E8FD826C324D900F519D7 /* wcpay-customer-error.json */,
@@ -1767,6 +1775,7 @@
17671775
31B8D6B526583970008E3DB2 /* wcpay-account-implicitly-not-eligible.json */,
17681776
31799AFB2705189200D78179 /* wcpay-location.json */,
17691777
31799AFD270518AD00D78179 /* wcpay-location-error.json */,
1778+
02A26F1A2744F5FC008E4EDB /* wp-site-settings.json */,
17701779
077F39D726A58EB600ABEADC /* systemStatus.json */,
17711780
);
17721781
path = Responses;
@@ -1844,6 +1853,8 @@
18441853
CC0786C4267BAF0F00BA9AC1 /* ShippingLabelStatusMapper.swift */,
18451854
FE28F6E326842848004465C7 /* UserMapper.swift */,
18461855
077F39D326A58DE700ABEADC /* SystemStatusMapper.swift */,
1856+
02C11275274285FF00F4F0B4 /* WooCommerceAvailabilityMapper.swift */,
1857+
02C112772742862600F4F0B4 /* WordPressSiteSettingsMapper.swift */,
18471858
);
18481859
path = Mapper;
18491860
sourceTree = "<group>";
@@ -2147,6 +2158,7 @@
21472158
D88D5A43230BC668007B6E01 /* reviews-single.json in Resources */,
21482159
02DD6492248A3EC00082523E /* product-external.json in Resources */,
21492160
45A4B85C25D2FAB500776FB4 /* shipping-label-address-validation-error.json in Resources */,
2161+
02A26F1C2744F5FC008E4EDB /* wp-site-settings.json in Resources */,
21502162
740211DF2193985A002248DA /* comment-moderate-spam.json in Resources */,
21512163
B5147876211B9227007562E5 /* broken-orders-mark-2.json in Resources */,
21522164
3158FE6C26129D2E00E566B9 /* wcpay-account-rejected-terms-of-service.json in Resources */,
@@ -2157,6 +2169,7 @@
21572169
CE50346721B5DCBE007573C6 /* site-plan.json in Resources */,
21582170
743E84F322172D0A00FAC9D7 /* shipment_tracking_empty.json in Resources */,
21592171
B505F6D520BEE4E700BB1B69 /* me.json in Resources */,
2172+
02A26F1B2744F5FC008E4EDB /* wc-site-settings-partial.json in Resources */,
21602173
028FA474257E110700F88A48 /* shipping-label-refund-success.json in Resources */,
21612174
02BA23C922EEF62C009539E7 /* order-stats-v4-wcadmin-deactivated.json in Resources */,
21622175
CCB2CAA226209A1200285CA0 /* generic_success_data.json in Resources */,
@@ -2439,6 +2452,7 @@
24392452
743E84EC22171F4600FAC9D7 /* ShipmentTracking.swift in Sources */,
24402453
B56C1EB820EA76F500D749F9 /* Site.swift in Sources */,
24412454
26615473242D596B00A31661 /* ProductCategoriesRemote.swift in Sources */,
2455+
02C112782742862600F4F0B4 /* WordPressSiteSettingsMapper.swift in Sources */,
24422456
26615475242D7C9500A31661 /* ProductCategoryListMapper.swift in Sources */,
24432457
3178A49F2703E5CF00A8B4CA /* WCPayReaderLocationMapper.swift in Sources */,
24442458
45D685F823D0BC78005F87D0 /* ProductSkuMapper.swift in Sources */,
@@ -2517,6 +2531,7 @@
25172531
45152809257A7C6E0076B03C /* ProductAttributesRemote.swift in Sources */,
25182532
D8FBFF2222D5266E006E3336 /* OrderStatsV4Interval.swift in Sources */,
25192533
4568E2222459ADC60007E478 /* SitePostsRemote.swift in Sources */,
2534+
02C11276274285FF00F4F0B4 /* WooCommerceAvailabilityMapper.swift in Sources */,
25202535
CC0786C5267BAF0F00BA9AC1 /* ShippingLabelStatusMapper.swift in Sources */,
25212536
4515280D257A7EEC0076B03C /* ProductAttributeListMapper.swift in Sources */,
25222537
93D8BBFD226BBEE800AD2EB3 /* AccountSettingsMapper.swift in Sources */,
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
import Foundation
2+
3+
/// Mapper: From WooCommerce site settings response to a boolean that indicates whether WooCommerce is active on the site
4+
///
5+
struct WooCommerceAvailabilityMapper: Mapper {
6+
7+
/// Any store with valid WooCommerce site settings response data is considered to have an active WooCommerce plugin.
8+
///
9+
func map(response: Data) throws -> Bool {
10+
true
11+
}
12+
}
Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
import Foundation
2+
3+
/// Mapper: WordPress Site Settings
4+
///
5+
struct WordPressSiteSettingsMapper: Mapper {
6+
/// (Attempts) to convert a dictionary into `WordPressSiteSettings`.
7+
func map(response: Data) throws -> WordPressSiteSettings {
8+
let decoder = JSONDecoder()
9+
return try decoder.decode(WordPressSiteSettings.self, from: response)
10+
}
11+
}
12+
13+
/// Represents a WordPress Site Settings response.
14+
///
15+
public struct WordPressSiteSettings: Decodable, Equatable {
16+
/// Site's Name.
17+
public let name: String
18+
19+
/// Site's Description.
20+
public let description: String
21+
22+
/// Site's URL.
23+
public let url: String
24+
25+
private enum CodingKeys: String, CodingKey {
26+
case name = "title"
27+
case description
28+
case url
29+
}
30+
}

Networking/Networking/Model/Order.swift

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -183,6 +183,35 @@ public struct Order: Decodable, GeneratedCopiable, GeneratedFakeable {
183183
refunds: refunds,
184184
fees: fees)
185185
}
186+
187+
public static var empty: Order {
188+
self.init(siteID: 0,
189+
orderID: 0,
190+
parentID: 0,
191+
customerID: 0,
192+
number: "",
193+
status: .pending,
194+
currency: "",
195+
customerNote: "",
196+
dateCreated: Date(),
197+
dateModified: Date(),
198+
datePaid: Date(),
199+
discountTotal: "",
200+
discountTax: "",
201+
shippingTotal: "",
202+
shippingTax: "",
203+
total: "",
204+
totalTax: "",
205+
paymentMethodID: "",
206+
paymentMethodTitle: "",
207+
items: [],
208+
billingAddress: nil,
209+
shippingAddress: nil,
210+
shippingLines: [],
211+
coupons: [],
212+
refunds: [],
213+
fees: [])
214+
}
186215
}
187216

188217

0 commit comments

Comments
 (0)