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