diff --git a/frontend/src/citizen-frontend/children/sections/service-need-and-daily-service-time/AttendanceSummaryTable.tsx b/frontend/src/citizen-frontend/children/sections/service-need-and-daily-service-time/AttendanceSummaryTable.tsx
index f4dd756076f..7dc5251a552 100644
--- a/frontend/src/citizen-frontend/children/sections/service-need-and-daily-service-time/AttendanceSummaryTable.tsx
+++ b/frontend/src/citizen-frontend/children/sections/service-need-and-daily-service-time/AttendanceSummaryTable.tsx
@@ -83,7 +83,9 @@ export default React.memo(function AttendanceSummaryTable({
(sn) =>
attendanceSummaryRange.overlaps(
new FiniteDateRange(sn.startDate, sn.endDate)
- ) && sn.contractDaysPerMonth !== null
+ ) &&
+ sn.contractDaysPerMonth !== null &&
+ sn.reservationsEnabled
)}
attendanceSummary={attendanceSummary}
/>
diff --git a/frontend/src/citizen-frontend/children/sections/service-need-and-daily-service-time/ServiceNeedAndDailyServiceTimeSection.tsx b/frontend/src/citizen-frontend/children/sections/service-need-and-daily-service-time/ServiceNeedAndDailyServiceTimeSection.tsx
index c4005edaf5d..2ad7fbf04d6 100644
--- a/frontend/src/citizen-frontend/children/sections/service-need-and-daily-service-time/ServiceNeedAndDailyServiceTimeSection.tsx
+++ b/frontend/src/citizen-frontend/children/sections/service-need-and-daily-service-time/ServiceNeedAndDailyServiceTimeSection.tsx
@@ -6,10 +6,9 @@ import React, { useState } from 'react'
import ResponsiveWholePageCollapsible from 'citizen-frontend/children/ResponsiveWholePageCollapsible'
import { useTranslation } from 'citizen-frontend/localization'
-import { combine, Failure, Result, Success, wrapResult } from 'lib-common/api'
+import { combine, Failure, Result, Success } from 'lib-common/api'
import { ChildId } from 'lib-common/generated/api-types/shared'
-import { useQueryResult } from 'lib-common/query'
-import { useApiState } from 'lib-common/utils/useRestApi'
+import { constantQuery, useQueryResult } from 'lib-common/query'
import HorizontalLine from 'lib-components/atoms/HorizontalLine'
import ErrorSegment from 'lib-components/atoms/state/ErrorSegment'
import Spinner from 'lib-components/atoms/state/Spinner'
@@ -22,50 +21,44 @@ import { Gap } from 'lib-components/white-space'
import { featureFlags } from 'lib-customizations/citizen'
import { renderResult } from '../../../async-rendering'
-import {
- getChildDailyServiceTimes,
- getChildServiceNeeds
-} from '../../../generated/api-clients/children'
import { childrenQuery, childServiceApplicationsQuery } from '../../queries'
import AttendanceSummaryTable from './AttendanceSummaryTable'
import DailyServiceTimeTable from './DailyServiceTimeTable'
import ServiceApplications from './ServiceApplications'
import ServiceNeedTable from './ServiceNeedTable'
+import { childDailyServiceTimesQuery, childServiceNeedsQuery } from './queries'
interface ServiceNeedProps {
childId: ChildId
showServiceTimes: boolean
}
-const getChildServiceNeedsResult = wrapResult(getChildServiceNeeds)
-const getChildDailyServiceTimesResult = wrapResult(getChildDailyServiceTimes)
-
export default React.memo(function ServiceNeedAndDailyServiceTimeSection({
childId,
showServiceTimes
}: ServiceNeedProps) {
const t = useTranslation()
const [open, setOpen] = useState(false)
- const [serviceNeedsResponse] = useApiState(
- () => getChildServiceNeedsResult({ childId }),
- [childId]
+ const serviceNeedsResponse = useQueryResult(
+ childServiceNeedsQuery({ childId })
)
- const [dailyServiceTimesResponse] = useApiState(
- () =>
- showServiceTimes
- ? getChildDailyServiceTimesResult({ childId })
- : Promise.resolve(Success.of([])),
- [childId, showServiceTimes]
+ const dailyServiceTimesResponse = useQueryResult(
+ showServiceTimes
+ ? childDailyServiceTimesQuery({ childId })
+ : constantQuery([])
)
- const hasContractDays = serviceNeedsResponse
- .map((serviceNeeds) =>
- serviceNeeds.some(
- ({ contractDaysPerMonth }) => contractDaysPerMonth !== null
+ const showAttendanceSummary =
+ featureFlags.citizenAttendanceSummary &&
+ serviceNeedsResponse
+ .map((serviceNeeds) =>
+ serviceNeeds.some(
+ ({ contractDaysPerMonth, reservationsEnabled }) =>
+ contractDaysPerMonth !== null && reservationsEnabled
+ )
)
- )
- .getOrElse(false)
+ .getOrElse(false)
const serviceApplications = useQueryResult(
childServiceApplicationsQuery({ childId })
@@ -101,7 +94,7 @@ export default React.memo(function ServiceNeedAndDailyServiceTimeSection({
)
})}
- {featureFlags.citizenAttendanceSummary && hasContractDays && (
+ {showAttendanceSummary && (
<>
ServiceNeedOptionPublicInfo.of(sno) },
defaultServiceNeedOption?.contractDaysPerMonth,
placement.unit.name,
+ placement.reservationsEnabled,
)
}
}
diff --git a/service/src/main/kotlin/fi/espoo/evaka/placement/Placement.kt b/service/src/main/kotlin/fi/espoo/evaka/placement/Placement.kt
index 92f44b74101..566e7b2f591 100755
--- a/service/src/main/kotlin/fi/espoo/evaka/placement/Placement.kt
+++ b/service/src/main/kotlin/fi/espoo/evaka/placement/Placement.kt
@@ -34,4 +34,5 @@ data class PlacementSummary(
@Nested("unit") val unit: Unit,
val startDate: LocalDate,
val endDate: LocalDate,
+ val reservationsEnabled: Boolean,
)
diff --git a/service/src/main/kotlin/fi/espoo/evaka/placement/PlacementQueries.kt b/service/src/main/kotlin/fi/espoo/evaka/placement/PlacementQueries.kt
index ed5ff0ea07d..e759bc2b9bc 100644
--- a/service/src/main/kotlin/fi/espoo/evaka/placement/PlacementQueries.kt
+++ b/service/src/main/kotlin/fi/espoo/evaka/placement/PlacementQueries.kt
@@ -42,7 +42,7 @@ fun Database.Read.getPlacementSummary(childId: ChildId): List
return createQuery {
sql(
"""
-SELECT p.id, p.type, p.child_id, d.id AS unit_id, d.name AS unit_name, p.start_date, p.end_date
+SELECT p.id, p.type, p.child_id, d.id AS unit_id, d.name AS unit_name, p.start_date, p.end_date, 'RESERVATIONS' = ANY(d.enabled_pilot_features) AS reservations_enabled
FROM placement p
JOIN daycare d on p.unit_id = d.id
WHERE p.child_id = ${bind(childId)}
diff --git a/service/src/main/kotlin/fi/espoo/evaka/serviceneed/ServiceNeed.kt b/service/src/main/kotlin/fi/espoo/evaka/serviceneed/ServiceNeed.kt
index 820b2da054f..b557552ca68 100644
--- a/service/src/main/kotlin/fi/espoo/evaka/serviceneed/ServiceNeed.kt
+++ b/service/src/main/kotlin/fi/espoo/evaka/serviceneed/ServiceNeed.kt
@@ -66,6 +66,7 @@ data class ServiceNeedSummary(
@Nested("option") val option: ServiceNeedOptionPublicInfo?,
val contractDaysPerMonth: Int?,
val unitName: String,
+ val reservationsEnabled: Boolean,
)
data class ServiceNeedChildRange(val childId: ChildId, val dateRange: FiniteDateRange)
diff --git a/service/src/main/kotlin/fi/espoo/evaka/serviceneed/ServiceNeedQueries.kt b/service/src/main/kotlin/fi/espoo/evaka/serviceneed/ServiceNeedQueries.kt
index 5503f8c743f..b37867bdc1f 100644
--- a/service/src/main/kotlin/fi/espoo/evaka/serviceneed/ServiceNeedQueries.kt
+++ b/service/src/main/kotlin/fi/espoo/evaka/serviceneed/ServiceNeedQueries.kt
@@ -76,7 +76,8 @@ SELECT
sno.valid_from AS option_valid_from,
sno.valid_to AS option_valid_to,
sno.contract_days_per_month,
- u.name AS unit_name
+ u.name AS unit_name,
+ 'RESERVATIONS' = ANY(u.enabled_pilot_features) AS reservations_enabled
FROM service_need sn
JOIN service_need_option sno ON sno.id = sn.option_id
JOIN placement p ON p.id = sn.placement_id