Skip to content

Commit db568f9

Browse files
authored
Merge pull request #8207 from woocommerce/issue/8150-revenue-data-formatting
[Analytics Hub] Add formatters for net revenue stats data
2 parents ce05727 + a8fb169 commit db568f9

File tree

2 files changed

+61
-0
lines changed

2 files changed

+61
-0
lines changed

WooCommerce/Classes/ViewRelated/Dashboard/Factories/StatsDataTextFormatter.swift

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,28 @@ struct StatsDataTextFormatter {
3232
return createDeltaPercentage(from: previousRevenue, to: currentRevenue)
3333
}
3434

35+
/// Creates the text to display for the net revenue.
36+
///
37+
static func createNetRevenueText(orderStats: OrderStatsV4?,
38+
currencyFormatter: CurrencyFormatter = CurrencyFormatter(currencySettings: ServiceLocator.currencySettings),
39+
currencyCode: String = ServiceLocator.currencySettings.currencyCode.rawValue) -> String {
40+
guard let revenue = orderStats?.totals.netRevenue else {
41+
return Constants.placeholderText
42+
}
43+
44+
// If revenue is an integer, no decimal points are shown.
45+
let numberOfDecimals: Int? = revenue.isInteger ? 0 : nil
46+
return currencyFormatter.formatAmount(revenue, with: currencyCode, numberOfDecimals: numberOfDecimals) ?? String()
47+
}
48+
49+
/// Creates the text to display for the net revenue delta.
50+
///
51+
static func createNetRevenueDelta(from previousPeriod: OrderStatsV4?, to currentPeriod: OrderStatsV4?) -> DeltaPercentage {
52+
let previousRevenue = previousPeriod?.totals.netRevenue
53+
let currentRevenue = currentPeriod?.totals.netRevenue
54+
return createDeltaPercentage(from: previousRevenue, to: currentRevenue)
55+
}
56+
3557
// MARK: Orders Stats
3658

3759
/// Creates the text to display for the order count.

WooCommerce/WooCommerceTests/ViewRelated/Dashboard/StatsDataTextFormatterTests.swift

Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -75,6 +75,45 @@ final class StatsDataTextFormatterTests: XCTestCase {
7575
XCTAssertEqual(totalRevenueDelta.direction, .positive)
7676
}
7777

78+
func test_createNetRevenueText_does_not_return_decimal_points_for_integer_value() {
79+
// Given
80+
let orderStats = OrderStatsV4.fake().copy(totals: .fake().copy(netRevenue: 62))
81+
82+
// When
83+
let netRevenue = StatsDataTextFormatter.createNetRevenueText(orderStats: orderStats,
84+
currencyFormatter: currencyFormatter,
85+
currencyCode: currencyCode.rawValue)
86+
87+
// Then
88+
XCTAssertEqual(netRevenue, "$62")
89+
}
90+
91+
func test_createNetRevenueText_returns_decimal_points_from_currency_settings_for_noninteger_value() {
92+
// Given
93+
let orderStats = OrderStatsV4.fake().copy(totals: .fake().copy(netRevenue: 62.856))
94+
95+
// When
96+
let netRevenue = StatsDataTextFormatter.createNetRevenueText(orderStats: orderStats,
97+
currencyFormatter: currencyFormatter,
98+
currencyCode: currencyCode.rawValue)
99+
100+
// Then
101+
XCTAssertEqual(netRevenue, "$62.86")
102+
}
103+
104+
func test_createNetRevenueDelta_returns_expected_delta() {
105+
// Given
106+
let previousOrderStats = OrderStatsV4.fake().copy(totals: .fake().copy(netRevenue: 10))
107+
let currentOrderStats = OrderStatsV4.fake().copy(totals: .fake().copy(netRevenue: 15))
108+
109+
// When
110+
let netRevenueDelta = StatsDataTextFormatter.createNetRevenueDelta(from: previousOrderStats, to: currentOrderStats)
111+
112+
// Then
113+
XCTAssertEqual(netRevenueDelta.string, "+50%")
114+
XCTAssertEqual(netRevenueDelta.direction, .positive)
115+
}
116+
78117
// MARK: Orders Stats
79118

80119
func test_createOrderCountText_returns_expected_order_count() {

0 commit comments

Comments
 (0)