diff --git a/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/bookings/BookingMapper.kt b/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/bookings/BookingMapper.kt
index ccc3e9b30bb..a75ef36b1a7 100644
--- a/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/bookings/BookingMapper.kt
+++ b/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/bookings/BookingMapper.kt
@@ -47,7 +47,7 @@ class BookingMapper @Inject constructor(
name = order.productInfo?.name ?: "-",
customerName = order.customerInfo?.fullName(),
attendanceStatus = BookingAttendanceStatus.BOOKED,
- status = status.toUiModel()
+ status = status.toUiModel(order.status, order.paymentInfo?.paymentMethodId)
)
}
@@ -100,14 +100,23 @@ class BookingMapper @Inject constructor(
)
}
- private fun BookingEntity.Status.toUiModel(): BookingStatus = when (this) {
- BookingEntity.Status.Paid -> BookingStatus.Paid
- BookingEntity.Status.PendingConfirmation -> BookingStatus.PendingConfirmation
- BookingEntity.Status.Cancelled -> BookingStatus.Cancelled
- BookingEntity.Status.Complete -> BookingStatus.Complete
- BookingEntity.Status.Confirmed -> BookingStatus.Confirmed
- BookingEntity.Status.Unpaid -> BookingStatus.Unpaid
- is BookingEntity.Status.Unknown -> BookingStatus.Unknown(this.key)
+ private fun BookingEntity.Status.toUiModel(
+ orderStatus: String?,
+ paymentMethod: String?,
+ ): BookingStatus {
+ return if (orderStatus != "completed" && paymentMethod == "cod") {
+ BookingStatus.PayAtLocation
+ } else {
+ when (this) {
+ BookingEntity.Status.Paid -> BookingStatus.Paid
+ BookingEntity.Status.PendingConfirmation -> BookingStatus.PendingConfirmation
+ BookingEntity.Status.Cancelled -> BookingStatus.Cancelled
+ BookingEntity.Status.Complete -> BookingStatus.Complete
+ BookingEntity.Status.Confirmed -> BookingStatus.Confirmed
+ BookingEntity.Status.Unpaid -> BookingStatus.Unpaid
+ is BookingEntity.Status.Unknown -> BookingStatus.Unknown(this.key)
+ }
+ }
}
private fun BookingCustomerInfo.fullName(): String? {
diff --git a/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/bookings/compose/BookingStatusTag.kt b/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/bookings/compose/BookingStatusTag.kt
index 87c3e49817f..6b550e89f81 100644
--- a/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/bookings/compose/BookingStatusTag.kt
+++ b/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/bookings/compose/BookingStatusTag.kt
@@ -2,12 +2,13 @@ package com.woocommerce.android.ui.bookings.compose
import androidx.compose.runtime.Composable
import androidx.compose.ui.Modifier
+import androidx.compose.ui.graphics.Color
import androidx.compose.ui.res.colorResource
import androidx.compose.ui.res.stringResource
import androidx.compose.ui.text.font.FontWeight
-import androidx.compose.ui.tooling.preview.Preview
import com.woocommerce.android.R
import com.woocommerce.android.ui.compose.component.WCTag
+import com.woocommerce.android.ui.compose.preview.LightDarkThemePreviews
import com.woocommerce.android.ui.compose.theme.WooThemeWithBackground
@Composable
@@ -17,7 +18,7 @@ fun BookingStatusTag(
) {
WCTag(
text = state.text(),
- backgroundColor = colorResource(R.color.tagView_bg),
+ backgroundColor = state.backgroundColor(),
textColor = colorResource(R.color.tagView_text),
fontWeight = FontWeight.Normal,
modifier = modifier
@@ -25,6 +26,7 @@ fun BookingStatusTag(
}
sealed interface BookingStatus {
+ data object PayAtLocation : BookingStatus
data object Unpaid : BookingStatus
data object PendingConfirmation : BookingStatus
data object Confirmed : BookingStatus
@@ -43,11 +45,20 @@ private fun BookingStatus.text(): String {
BookingStatus.Paid -> stringResource(R.string.booking_payment_status_paid)
BookingStatus.Cancelled -> stringResource(R.string.booking_payment_status_cancelled)
BookingStatus.Complete -> stringResource(R.string.booking_payment_status_complete)
+ BookingStatus.PayAtLocation -> stringResource(R.string.booking_payment_status_pay_at_location)
is BookingStatus.Unknown -> key
}
}
-@Preview
+@Composable
+fun BookingStatus.backgroundColor(): Color {
+ return when (this) {
+ BookingStatus.PayAtLocation -> R.color.tag_bg_booking_yellow
+ else -> R.color.tagView_bg
+ }.let { colorResource(it) }
+}
+
+@LightDarkThemePreviews
@Composable
private fun PaymentStatusTagPreview() {
WooThemeWithBackground {
@@ -57,12 +68,12 @@ private fun PaymentStatusTagPreview() {
}
}
-@Preview(uiMode = android.content.res.Configuration.UI_MODE_NIGHT_YES)
+@LightDarkThemePreviews
@Composable
-private fun PaymentStatusTagDarkPreview() {
+private fun PaymentStatusTagPayAtLocationPreview() {
WooThemeWithBackground {
BookingStatusTag(
- state = BookingStatus.Complete
+ state = BookingStatus.PayAtLocation
)
}
}
diff --git a/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/bookings/list/BookingListFiltersBuilder.kt b/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/bookings/list/BookingListFiltersBuilder.kt
index 53e1a8208d1..644a2f9b6f3 100644
--- a/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/bookings/list/BookingListFiltersBuilder.kt
+++ b/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/bookings/list/BookingListFiltersBuilder.kt
@@ -19,7 +19,8 @@ class BookingListFiltersBuilder @Inject constructor(
* See p1759398245019489-slack-C09FHQNQERG
*/
fun BookingListTab.asDateRangeFilter(): BookingsFilterOption.DateRange? {
- fun todayAtMidnight() = LocalDate.now(clock).atTime(LocalTime.MIDNIGHT).atOffset(ZoneOffset.UTC).toInstant()
+ fun todayAtMidnight() = LocalDate.now(clock).minusDays(1).atTime(LocalTime.MAX)
+ .atOffset(ZoneOffset.UTC).toInstant()
fun todayAtEndOfDay() = LocalDate.now(clock).atTime(LocalTime.MAX).atOffset(ZoneOffset.UTC).toInstant()
return when (this) {
diff --git a/WooCommerce/src/main/res/values/strings.xml b/WooCommerce/src/main/res/values/strings.xml
index e7e0d642b32..3a66f6fa48a 100644
--- a/WooCommerce/src/main/res/values/strings.xml
+++ b/WooCommerce/src/main/res/values/strings.xml
@@ -4212,6 +4212,7 @@
Cancelled
Confirmed
Complete
+ Pay at location
Booked
Checked-in
Cancelled
diff --git a/WooCommerce/src/test/kotlin/com/woocommerce/android/ui/bookings/BookingMapperTest.kt b/WooCommerce/src/test/kotlin/com/woocommerce/android/ui/bookings/BookingMapperTest.kt
index ee1081feb77..bca71bf3ab1 100644
--- a/WooCommerce/src/test/kotlin/com/woocommerce/android/ui/bookings/BookingMapperTest.kt
+++ b/WooCommerce/src/test/kotlin/com/woocommerce/android/ui/bookings/BookingMapperTest.kt
@@ -227,6 +227,29 @@ class BookingMapperTest : BaseUnitTest() {
)
}
+ @Test
+ fun `given processing order with COD payment method, when mapped to summary model, then status is PayAtLocation`() {
+ // GIVEN
+ val booking = sampleBooking().let { original ->
+ val paymentInfo = BookingPaymentInfo(
+ paymentMethodId = "cod",
+ paymentMethodTitle = "Cash on Delivery",
+ subtotal = BigDecimal("55.00"),
+ subtotalTax = BigDecimal("0.00"),
+ total = BigDecimal("55.00"),
+ totalTax = BigDecimal("0.00")
+ )
+ val orderWithPayment = original.order.copy(paymentInfo = paymentInfo, status = "processing")
+ original.copy(order = orderWithPayment)
+ }
+
+ // WHEN
+ val model = mapper.run { booking.toBookingSummaryModel() }
+
+ // THEN
+ assertThat(model.status).isEqualTo(BookingStatus.PayAtLocation)
+ }
+
private fun sampleBooking(
status: BookingEntity.Status = BookingEntity.Status.Confirmed,
start: Instant = Instant.parse("2025-07-05T11:00:00Z"),
diff --git a/WooCommerce/src/test/kotlin/com/woocommerce/android/ui/bookings/list/BookingListFilterBuilderTest.kt b/WooCommerce/src/test/kotlin/com/woocommerce/android/ui/bookings/list/BookingListFilterBuilderTest.kt
index b6a98bb0d37..057f93e030c 100644
--- a/WooCommerce/src/test/kotlin/com/woocommerce/android/ui/bookings/list/BookingListFilterBuilderTest.kt
+++ b/WooCommerce/src/test/kotlin/com/woocommerce/android/ui/bookings/list/BookingListFilterBuilderTest.kt
@@ -21,7 +21,7 @@ class BookingListFilterBuilderTest {
}
assertThat(filter).isNotNull()
- assertThat(filter?.after).isEqualTo(Instant.parse("2025-01-01T00:00:00+00:00"))
+ assertThat(filter?.after).isEqualTo(Instant.parse("2024-12-31T23:59:59.999999999Z"))
assertThat(filter?.before).isEqualTo(Instant.parse("2025-01-01T23:59:59.999999999+00:00"))
}