Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -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)
)
}

Expand Down Expand Up @@ -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? {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand All @@ -17,14 +18,15 @@ 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
)
}

sealed interface BookingStatus {
data object PayAtLocation : BookingStatus
data object Unpaid : BookingStatus
data object PendingConfirmation : BookingStatus
data object Confirmed : BookingStatus
Expand All @@ -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 {
Expand All @@ -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
)
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -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) {
Expand Down
1 change: 1 addition & 0 deletions WooCommerce/src/main/res/values/strings.xml
Original file line number Diff line number Diff line change
Expand Up @@ -4212,6 +4212,7 @@
<string name="booking_payment_status_cancelled">Cancelled</string>
<string name="booking_payment_status_confirmed">Confirmed</string>
<string name="booking_payment_status_complete">Complete</string>
<string name="booking_payment_status_pay_at_location">Pay at location</string>
<string name="booking_attendance_status_booked">Booked</string>
<string name="booking_attendance_status_checked_in">Checked-in</string>
<string name="booking_attendance_status_cancelled">Cancelled</string>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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"),
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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"))
}

Expand Down