Skip to content

Commit 02fb13b

Browse files
Merge pull request #14758 from woocommerce/issue/WOOMOB-1385_payment_status
[WOOMOB-1385] Booking Pay at location status
2 parents 4222251 + f0130fd commit 02fb13b

File tree

6 files changed

+62
-17
lines changed

6 files changed

+62
-17
lines changed

WooCommerce/src/main/kotlin/com/woocommerce/android/ui/bookings/BookingMapper.kt

Lines changed: 18 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -47,7 +47,7 @@ class BookingMapper @Inject constructor(
4747
name = order.productInfo?.name ?: "-",
4848
customerName = order.customerInfo?.fullName(),
4949
attendanceStatus = BookingAttendanceStatus.BOOKED,
50-
status = status.toUiModel()
50+
status = status.toUiModel(order.status, order.paymentInfo?.paymentMethodId)
5151
)
5252
}
5353

@@ -100,14 +100,23 @@ class BookingMapper @Inject constructor(
100100
)
101101
}
102102

103-
private fun BookingEntity.Status.toUiModel(): BookingStatus = when (this) {
104-
BookingEntity.Status.Paid -> BookingStatus.Paid
105-
BookingEntity.Status.PendingConfirmation -> BookingStatus.PendingConfirmation
106-
BookingEntity.Status.Cancelled -> BookingStatus.Cancelled
107-
BookingEntity.Status.Complete -> BookingStatus.Complete
108-
BookingEntity.Status.Confirmed -> BookingStatus.Confirmed
109-
BookingEntity.Status.Unpaid -> BookingStatus.Unpaid
110-
is BookingEntity.Status.Unknown -> BookingStatus.Unknown(this.key)
103+
private fun BookingEntity.Status.toUiModel(
104+
orderStatus: String?,
105+
paymentMethod: String?,
106+
): BookingStatus {
107+
return if (orderStatus != "completed" && paymentMethod == "cod") {
108+
BookingStatus.PayAtLocation
109+
} else {
110+
when (this) {
111+
BookingEntity.Status.Paid -> BookingStatus.Paid
112+
BookingEntity.Status.PendingConfirmation -> BookingStatus.PendingConfirmation
113+
BookingEntity.Status.Cancelled -> BookingStatus.Cancelled
114+
BookingEntity.Status.Complete -> BookingStatus.Complete
115+
BookingEntity.Status.Confirmed -> BookingStatus.Confirmed
116+
BookingEntity.Status.Unpaid -> BookingStatus.Unpaid
117+
is BookingEntity.Status.Unknown -> BookingStatus.Unknown(this.key)
118+
}
119+
}
111120
}
112121

113122
private fun BookingCustomerInfo.fullName(): String? {

WooCommerce/src/main/kotlin/com/woocommerce/android/ui/bookings/compose/BookingStatusTag.kt

Lines changed: 17 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -2,12 +2,13 @@ package com.woocommerce.android.ui.bookings.compose
22

33
import androidx.compose.runtime.Composable
44
import androidx.compose.ui.Modifier
5+
import androidx.compose.ui.graphics.Color
56
import androidx.compose.ui.res.colorResource
67
import androidx.compose.ui.res.stringResource
78
import androidx.compose.ui.text.font.FontWeight
8-
import androidx.compose.ui.tooling.preview.Preview
99
import com.woocommerce.android.R
1010
import com.woocommerce.android.ui.compose.component.WCTag
11+
import com.woocommerce.android.ui.compose.preview.LightDarkThemePreviews
1112
import com.woocommerce.android.ui.compose.theme.WooThemeWithBackground
1213

1314
@Composable
@@ -17,14 +18,15 @@ fun BookingStatusTag(
1718
) {
1819
WCTag(
1920
text = state.text(),
20-
backgroundColor = colorResource(R.color.tagView_bg),
21+
backgroundColor = state.backgroundColor(),
2122
textColor = colorResource(R.color.tagView_text),
2223
fontWeight = FontWeight.Normal,
2324
modifier = modifier
2425
)
2526
}
2627

2728
sealed interface BookingStatus {
29+
data object PayAtLocation : BookingStatus
2830
data object Unpaid : BookingStatus
2931
data object PendingConfirmation : BookingStatus
3032
data object Confirmed : BookingStatus
@@ -43,11 +45,20 @@ private fun BookingStatus.text(): String {
4345
BookingStatus.Paid -> stringResource(R.string.booking_payment_status_paid)
4446
BookingStatus.Cancelled -> stringResource(R.string.booking_payment_status_cancelled)
4547
BookingStatus.Complete -> stringResource(R.string.booking_payment_status_complete)
48+
BookingStatus.PayAtLocation -> stringResource(R.string.booking_payment_status_pay_at_location)
4649
is BookingStatus.Unknown -> key
4750
}
4851
}
4952

50-
@Preview
53+
@Composable
54+
fun BookingStatus.backgroundColor(): Color {
55+
return when (this) {
56+
BookingStatus.PayAtLocation -> R.color.tag_bg_booking_yellow
57+
else -> R.color.tagView_bg
58+
}.let { colorResource(it) }
59+
}
60+
61+
@LightDarkThemePreviews
5162
@Composable
5263
private fun PaymentStatusTagPreview() {
5364
WooThemeWithBackground {
@@ -57,12 +68,12 @@ private fun PaymentStatusTagPreview() {
5768
}
5869
}
5970

60-
@Preview(uiMode = android.content.res.Configuration.UI_MODE_NIGHT_YES)
71+
@LightDarkThemePreviews
6172
@Composable
62-
private fun PaymentStatusTagDarkPreview() {
73+
private fun PaymentStatusTagPayAtLocationPreview() {
6374
WooThemeWithBackground {
6475
BookingStatusTag(
65-
state = BookingStatus.Complete
76+
state = BookingStatus.PayAtLocation
6677
)
6778
}
6879
}

WooCommerce/src/main/kotlin/com/woocommerce/android/ui/bookings/list/BookingListFiltersBuilder.kt

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,8 @@ class BookingListFiltersBuilder @Inject constructor(
1919
* See p1759398245019489-slack-C09FHQNQERG
2020
*/
2121
fun BookingListTab.asDateRangeFilter(): BookingsFilterOption.DateRange? {
22-
fun todayAtMidnight() = LocalDate.now(clock).atTime(LocalTime.MIDNIGHT).atOffset(ZoneOffset.UTC).toInstant()
22+
fun todayAtMidnight() = LocalDate.now(clock).minusDays(1).atTime(LocalTime.MAX)
23+
.atOffset(ZoneOffset.UTC).toInstant()
2324
fun todayAtEndOfDay() = LocalDate.now(clock).atTime(LocalTime.MAX).atOffset(ZoneOffset.UTC).toInstant()
2425

2526
return when (this) {

WooCommerce/src/main/res/values/strings.xml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4230,6 +4230,7 @@
42304230
<string name="booking_payment_status_cancelled">Cancelled</string>
42314231
<string name="booking_payment_status_confirmed">Confirmed</string>
42324232
<string name="booking_payment_status_complete">Complete</string>
4233+
<string name="booking_payment_status_pay_at_location">Pay at location</string>
42334234
<string name="booking_attendance_status_booked">Booked</string>
42344235
<string name="booking_attendance_status_checked_in">Checked-in</string>
42354236
<string name="booking_attendance_status_cancelled">Cancelled</string>

WooCommerce/src/test/kotlin/com/woocommerce/android/ui/bookings/BookingMapperTest.kt

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -227,6 +227,29 @@ class BookingMapperTest : BaseUnitTest() {
227227
)
228228
}
229229

230+
@Test
231+
fun `given processing order with COD payment method, when mapped to summary model, then status is PayAtLocation`() {
232+
// GIVEN
233+
val booking = sampleBooking().let { original ->
234+
val paymentInfo = BookingPaymentInfo(
235+
paymentMethodId = "cod",
236+
paymentMethodTitle = "Cash on Delivery",
237+
subtotal = BigDecimal("55.00"),
238+
subtotalTax = BigDecimal("0.00"),
239+
total = BigDecimal("55.00"),
240+
totalTax = BigDecimal("0.00")
241+
)
242+
val orderWithPayment = original.order.copy(paymentInfo = paymentInfo, status = "processing")
243+
original.copy(order = orderWithPayment)
244+
}
245+
246+
// WHEN
247+
val model = mapper.run { booking.toBookingSummaryModel() }
248+
249+
// THEN
250+
assertThat(model.status).isEqualTo(BookingStatus.PayAtLocation)
251+
}
252+
230253
private fun sampleBooking(
231254
status: BookingEntity.Status = BookingEntity.Status.Confirmed,
232255
start: Instant = Instant.parse("2025-07-05T11:00:00Z"),

WooCommerce/src/test/kotlin/com/woocommerce/android/ui/bookings/list/BookingListFilterBuilderTest.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@ class BookingListFilterBuilderTest {
2121
}
2222

2323
assertThat(filter).isNotNull()
24-
assertThat(filter?.after).isEqualTo(Instant.parse("2025-01-01T00:00:00+00:00"))
24+
assertThat(filter?.after).isEqualTo(Instant.parse("2024-12-31T23:59:59.999999999Z"))
2525
assertThat(filter?.before).isEqualTo(Instant.parse("2025-01-01T23:59:59.999999999+00:00"))
2626
}
2727

0 commit comments

Comments
 (0)