Return average rate for calendar range
All checks were successful
build-and-deploy / build-deploy (push) Successful in 1m34s

This commit is contained in:
androidlover5842
2026-01-29 11:28:58 +05:30
parent 173d3fa9ea
commit ff301d80fa
2 changed files with 30 additions and 2 deletions

View File

@@ -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<RateCalendarResponse> {
): 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}")

View File

@@ -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,