diff --git a/src/main/kotlin/com/android/trisolarisserver/controller/RatePlans.kt b/src/main/kotlin/com/android/trisolarisserver/controller/RatePlans.kt index 74632aa..48a624e 100644 --- a/src/main/kotlin/com/android/trisolarisserver/controller/RatePlans.kt +++ b/src/main/kotlin/com/android/trisolarisserver/controller/RatePlans.kt @@ -2,6 +2,7 @@ package com.android.trisolarisserver.controller import com.android.trisolarisserver.component.PropertyAccess import com.android.trisolarisserver.controller.dto.RateCalendarResponse +import com.android.trisolarisserver.controller.dto.RateCalendarAverageResponse import com.android.trisolarisserver.controller.dto.RateCalendarRangeUpsertRequest import com.android.trisolarisserver.controller.dto.RatePlanCreateRequest import com.android.trisolarisserver.controller.dto.RatePlanResponse @@ -169,14 +170,32 @@ class RatePlans( @AuthenticationPrincipal principal: MyPrincipal?, @RequestParam from: String, @RequestParam to: String - ): List { + ): RateCalendarAverageResponse { requireMember(propertyAccess, propertyId, principal) val plan = ratePlanRepo.findByIdAndPropertyId(ratePlanId, propertyId) ?: throw ResponseStatusException(HttpStatus.NOT_FOUND, "Rate plan not found") val fromDate = parseDate(from) val toDate = parseDate(to) + if (toDate.isBefore(fromDate)) { + throw ResponseStatusException(HttpStatus.BAD_REQUEST, "to must be on/after from") + } val items = rateCalendarRepo.findByRatePlanIdAndRateDateBetweenOrderByRateDateAsc(plan.id!!, fromDate, toDate) - return items.map { it.toResponse() } + val overrides = items.associateBy { it.rateDate } + var total = 0L + var days = 0 + for (date in datesBetween(fromDate, toDate)) { + days += 1 + total += overrides[date]?.rate ?: plan.baseRate + } + val average = if (days == 0) 0.0 else total.toDouble() / days + return RateCalendarAverageResponse( + ratePlanId = plan.id!!, + from = fromDate, + to = toDate, + averageRate = average, + days = days, + currency = plan.currency + ) } @DeleteMapping("/{ratePlanId}/calendar/{rateDate}") diff --git a/src/main/kotlin/com/android/trisolarisserver/controller/dto/RateDtos.kt b/src/main/kotlin/com/android/trisolarisserver/controller/dto/RateDtos.kt index 61750c9..3ef9894 100644 --- a/src/main/kotlin/com/android/trisolarisserver/controller/dto/RateDtos.kt +++ b/src/main/kotlin/com/android/trisolarisserver/controller/dto/RateDtos.kt @@ -41,6 +41,15 @@ data class RateCalendarResponse( val rate: Long ) +data class RateCalendarAverageResponse( + val ratePlanId: UUID, + val from: LocalDate, + val to: LocalDate, + val averageRate: Double, + val days: Int, + val currency: String +) + data class RoomStayRateChangeRequest( val effectiveAt: String, val nightlyRate: Long,