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")) }