Skip to content

Commit 0bf960e

Browse files
committed
SCHP-129 Fix indulásch api
1 parent fb79027 commit 0bf960e

File tree

2 files changed

+67
-42
lines changed

2 files changed

+67
-42
lines changed

src/main/kotlin/hu/kirdev/schpincer/web/ApiController.kt

+63-40
Original file line numberDiff line numberDiff line change
@@ -2,15 +2,18 @@ package hu.kirdev.schpincer.web
22

33
import hu.kirdev.schpincer.dto.ItemEntityDto
44
import hu.kirdev.schpincer.dto.ManualUserDetails
5+
import hu.kirdev.schpincer.model.ItemCategory
56
import hu.kirdev.schpincer.model.ItemEntity
67
import hu.kirdev.schpincer.model.OpeningEntity
8+
import hu.kirdev.schpincer.model.OrderStatus
79
import hu.kirdev.schpincer.service.*
810
import io.swagger.annotations.ApiOperation
911
import org.slf4j.LoggerFactory
1012
import org.springframework.beans.factory.annotation.Value
1113
import org.springframework.http.HttpStatus
1214
import org.springframework.http.ResponseEntity
1315
import org.springframework.web.bind.annotation.*
16+
import java.lang.Integer.min
1417
import java.text.SimpleDateFormat
1518
import java.util.concurrent.ConcurrentHashMap
1619
import java.util.stream.Collectors
@@ -143,19 +146,19 @@ open class ApiController(
143146
if (requestBody.id < 0 || requestBody.time < 0 || requestBody.detailsJson == "{}")
144147
return ResponseEntity(RESPONSE_INTERNAL_ERROR, HttpStatus.OK)
145148
val user = request.getUserIfPresent() ?: return responseOf("Error 403", HttpStatus.FORBIDDEN)
146-
try {
149+
return try {
147150
if (requestBody.manualOrderDetails != null) {
148151
log.info("{}:{} is making a manual order with details: {}, for {}",
149-
user.name, user.uid, requestBody.detailsJson, requestBody.manualOrderDetails?.toString() ?: "null")
150-
return orders.makeManualOrder(user, requestBody.id, requestBody.count, requestBody.time.toLong(),
151-
requestBody.comment, requestBody.detailsJson, requestBody.manualOrderDetails!!)
152+
user.name, user.uid, requestBody.detailsJson, requestBody.manualOrderDetails?.toString() ?: "null")
153+
orders.makeManualOrder(user, requestBody.id, requestBody.count, requestBody.time.toLong(),
154+
requestBody.comment, requestBody.detailsJson, requestBody.manualOrderDetails!!)
152155
} else {
153-
return orders.makeOrder(user, requestBody.id, requestBody.count, requestBody.time.toLong(),
154-
requestBody.comment, requestBody.detailsJson)
156+
orders.makeOrder(user, requestBody.id, requestBody.count, requestBody.time.toLong(),
157+
requestBody.comment, requestBody.detailsJson)
155158
}
156159
} catch (e: FailedOrderException) {
157160
log.warn("Failed to make new order by '${request.getUserIfPresent()?.uid ?: "n/a"}' reason: ${e.response}")
158-
return responseOf(e.response)
161+
responseOf(e.response)
159162
}
160163
}
161164

@@ -242,22 +245,44 @@ open class ApiController(
242245
return openings.findNextWeek()
243246
.filter { it.circle != null }
244247
.filter { it.orderStart <= System.currentTimeMillis() }
245-
.map { OpeningDetail(
246-
name = it.circle?.displayName ?: "n/a",
247-
icon = it.circle?.logoUrl?.let { url -> baseUrl + url },
248-
feeling = it.feeling ?: "",
249-
available = Math.max(0, Math.min(
250-
it.timeWindows.sumOf { tw -> tw.normalItemCount },
251-
it.maxOrder - it.timeWindows.sumOf { tw -> it.maxOrderPerInterval - tw.normalItemCount
252-
})),
253-
outOf = it.maxOrder,
254-
banner = it.prUrl.let { url -> baseUrl + url },
255-
day = timeService.format(it.dateStart, "u")?.toInt().let { daysOfTheWeek[it ?: 0] },
256-
comment = "${timeService.format(it.orderEnd, "u")?.toInt().let { daysOfTheWeek[it ?: 0] }} " +
257-
"${timeService.format(it.orderEnd, "HH:mm")}-ig rendelhető",
258-
circleUrl = it.circle?.alias?.let { alias -> baseUrl + "p/" + alias } ?: baseUrl + "p/" + (it.circle?.id ?: 0),
259-
circleColor = it.circle?.cssClassName ?: "none"
260-
) }
248+
.map { openingEntity ->
249+
OpeningDetail(
250+
name = openingEntity.circle?.displayName ?: "n/a",
251+
icon = openingEntity.circle?.logoUrl?.let { url -> baseUrl + url },
252+
feeling = openingEntity.feeling ?: "",
253+
available = calculateAvailable(openingEntity),
254+
outOf = openingEntity.maxOrder,
255+
banner = openingEntity.prUrl.let { url -> baseUrl + url },
256+
day = timeService.format(openingEntity.dateStart, "u")?.toInt().let { daysOfTheWeek[it ?: 0] },
257+
comment = "${
258+
timeService.format(openingEntity.orderEnd, "u")?.toInt().let { daysOfTheWeek[it ?: 0] }
259+
} " +
260+
"${timeService.format(openingEntity.orderEnd, "HH:mm")}-ig rendelhető",
261+
circleUrl = openingEntity.circle?.alias?.let { alias -> baseUrl + "p/" + alias }
262+
?: (baseUrl + "p/" + (openingEntity.circle?.id ?: 0)),
263+
circleColor = openingEntity.circle?.cssClassName ?: "none"
264+
) }
265+
}
266+
267+
private fun calculateAvailable(openingEntity: OpeningEntity): Int {
268+
val orders = orders.findAllByOpening(openingEntity.id)
269+
.filter { it.status == OrderStatus.ACCEPTED }
270+
271+
val maxOverall = openingEntity.maxOrder - orders.sumOf { it.count }
272+
val available = min(maxOverall, orders.groupBy { it.orderedItem?.category ?: 0 }
273+
.map { pair -> pair.key to pair.value.sumOf { it.count } }
274+
.map { pair ->
275+
when (ItemCategory.of(pair.first)) {
276+
ItemCategory.DEFAULT -> maxOverall
277+
ItemCategory.ALPHA -> openingEntity.maxAlpha - pair.second
278+
ItemCategory.BETA -> openingEntity.maxBeta - pair.second
279+
ItemCategory.GAMMA -> openingEntity.maxGamma - pair.second
280+
ItemCategory.DELTA -> openingEntity.maxDelta - pair.second
281+
ItemCategory.LAMBDA -> openingEntity.maxLambda - pair.second
282+
}
283+
}
284+
.maxOrNull() ?: 0)
285+
return available
261286
}
262287

263288
data class UpcomingOpeningDetail(
@@ -286,23 +311,21 @@ open class ApiController(
286311

287312
return openings.findNextWeek()
288313
.filter { it.circle != null }
289-
.map { UpcomingOpeningDetail(
290-
name = it.circle?.displayName ?: "n/a",
291-
orderStart = it.orderStart,
292-
openingStart = it.dateStart,
293-
icon = it.circle?.logoUrl?.let { url -> baseUrl + url },
294-
feeling = it.feeling ?: "",
295-
available = Math.max(0, Math.min(
296-
it.timeWindows.sumOf { tw -> tw.normalItemCount },
297-
it.maxOrder - it.timeWindows.sumOf { tw -> it.maxOrderPerInterval - tw.normalItemCount
298-
})),
299-
outOf = it.maxOrder,
300-
banner = it.prUrl.let { url -> baseUrl + url },
301-
day = timeService.format(it.dateStart, "u")?.toInt().let { daysOfTheWeek[it ?: 0] },
302-
comment = "${timeService.format(it.orderEnd, "u")?.toInt().let { daysOfTheWeek[it ?: 0] }} " +
303-
"${timeService.format(it.orderEnd, "HH:mm")}-ig rendelhető",
304-
circleUrl = it.circle?.alias?.let { alias -> baseUrl + "p/" + alias } ?: baseUrl + "p/" + (it.circle?.id ?: 0),
305-
circleColor = it.circle?.cssClassName ?: "none"
314+
.map { openingEntity ->
315+
UpcomingOpeningDetail(
316+
name = openingEntity.circle?.displayName ?: "n/a",
317+
orderStart = openingEntity.orderStart,
318+
openingStart = openingEntity.dateStart,
319+
icon = openingEntity.circle?.logoUrl?.let { url -> baseUrl + url },
320+
feeling = openingEntity.feeling ?: "",
321+
available = calculateAvailable(openingEntity),
322+
outOf = openingEntity.maxOrder,
323+
banner = openingEntity.prUrl.let { url -> baseUrl + url },
324+
day = timeService.format(openingEntity.dateStart, "u")?.toInt().let { daysOfTheWeek[it ?: 0] },
325+
comment = "${timeService.format(openingEntity.orderEnd, "u")?.toInt().let { daysOfTheWeek[it ?: 0] }} " +
326+
"${timeService.format(openingEntity.orderEnd, "HH:mm")}-ig rendelhető",
327+
circleUrl = openingEntity.circle?.alias?.let { alias -> baseUrl + "p/" + alias } ?: (baseUrl + "p/" + (openingEntity.circle?.id ?: 0)),
328+
circleColor = openingEntity.circle?.cssClassName ?: "none"
306329
) }
307330
}
308331

src/main/kotlin/hu/kirdev/schpincer/web/ConfigureController.kt

+4-2
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@ import java.io.File
1919
import java.io.FileNotFoundException
2020
import java.io.FileOutputStream
2121
import java.lang.Integer.max
22+
import java.lang.Integer.min
2223
import java.util.*
2324
import java.util.stream.Collectors
2425
import javax.servlet.http.HttpServletRequest
@@ -442,7 +443,7 @@ open class ConfigureController {
442443
orderStart = parseDate(oed.orderStart),
443444
orderEnd = parseDate(oed.orderEnd),
444445
timeIntervals = oed.timeIntervals,
445-
maxOrder = oed.maxOrder,
446+
maxOrder = 0,
446447
maxOrderPerInterval = oed.maxOrderPerInterval,
447448
maxExtraPerInterval = oed.maxExtraPerInterval,
448449
intervalLength = oed.intervalLength,
@@ -456,6 +457,7 @@ open class ConfigureController {
456457
eo.prUrl = if (file == null) "image/blank-pr.jpg" else "cdn/pr/$file"
457458
openings.save(eo)
458459
eo.generateTimeWindows(openings)
460+
eo.maxOrder = min(oed.maxOrder, oed.maxOrderPerInterval * eo.timeWindows.size)
459461
openings.save(eo)
460462
return "redirect:/configure/$circleId"
461463
}
@@ -789,4 +791,4 @@ open class ConfigureController {
789791
}
790792
}
791793

792-
}
794+
}

0 commit comments

Comments
 (0)