diff --git a/api/src/main/scala/com/lbs/api/json/JsonSerializer.scala b/api/src/main/scala/com/lbs/api/json/JsonSerializer.scala index 1fbe949..17fed21 100644 --- a/api/src/main/scala/com/lbs/api/json/JsonSerializer.scala +++ b/api/src/main/scala/com/lbs/api/json/JsonSerializer.scala @@ -1,13 +1,14 @@ package com.lbs.api.json -import com.lbs.api.json.model.SerializableJsonObject +import com.lbs.api.json.model.{LuxmedFunnyDateTime, SerializableJsonObject} import com.lbs.common.Logger import org.json4s._ import org.json4s.jackson.JsonMethods._ import java.time.format.DateTimeFormatter import java.time.{LocalDateTime, LocalTime, ZonedDateTime} +import scala.util.Try object JsonSerializer extends Logger { @@ -33,7 +34,19 @@ object JsonSerializer extends Logger { } )) - private implicit val formats: Formats = DefaultFormats.withStrictArrayExtraction + zonedDateTimeSerializer + localTimeSerializer + localDateTimeSerializer + private val luxmedFunnyDateTimeSerializer = new CustomSerializer[LuxmedFunnyDateTime](_ => ( { + case JString(str) => + Try(LocalDateTime.parse(str)) + .map(v => LuxmedFunnyDateTime(dateTimeLocal = Some(v))) + .recoverWith{case _ => Try(ZonedDateTime.parse(str)).map(v => LuxmedFunnyDateTime(dateTimeTz = Some(v)))} + .getOrElse(sys.error(s"can't parse date $str")) + }, { + case time: LocalDateTime => JString(time.toString) + case time: ZonedDateTime => JString(time.toString) + } + )) + + private implicit val formats: Formats = DefaultFormats.withStrictArrayExtraction + zonedDateTimeSerializer + localTimeSerializer + localDateTimeSerializer + luxmedFunnyDateTimeSerializer def extract[T](jsonString: String)(implicit mf: scala.reflect.Manifest[T]): T = { parse(jsonString).camelizeKeys.extract[T] diff --git a/api/src/main/scala/com/lbs/api/json/model/TermsIndexResponse.scala b/api/src/main/scala/com/lbs/api/json/model/TermsIndexResponse.scala index eb34fd1..474f97b 100644 --- a/api/src/main/scala/com/lbs/api/json/model/TermsIndexResponse.scala +++ b/api/src/main/scala/com/lbs/api/json/model/TermsIndexResponse.scala @@ -1,7 +1,7 @@ package com.lbs.api.json.model -import java.time.LocalDateTime +import java.time.{LocalDateTime, ZonedDateTime} /** * @@ -28,7 +28,7 @@ import java.time.LocalDateTime *"clinicGroup": "ul. Fabryczna 6", *"clinicGroupId": 11, *"clinicId": 2222, - *"dateTimeFrom": "2021-05-21T18:45:00", + *"dateTimeFrom": "2021-05-21T18:45:00", or 2021-05-21T18:45:00+02:00 sometimes!!!! *"dateTimeTo": "2021-05-21T19:00:00", *"doctor": { *"academicTitle": "lek. med.", @@ -126,9 +126,13 @@ case class AdditionalData(isPreparationRequired: Boolean, preparationItems: List case class TermsForDay(day: LocalDateTime, terms: List[Term]) extends SerializableJsonObject -case class Term(clinic: String, clinicId: Long, dateTimeFrom: LocalDateTime, dateTimeTo: LocalDateTime, doctor: Doctor, +case class Term(clinic: String, clinicId: Long, dateTimeFrom: LuxmedFunnyDateTime, dateTimeTo: LuxmedFunnyDateTime, doctor: Doctor, impedimentText: String, isAdditional: Boolean, isImpediment: Boolean, isTelemedicine: Boolean, roomId: Long, scheduleId: Long, serviceId: Long) extends SerializableJsonObject case class TermExt(additionalData: AdditionalData, term: Term) extends SerializableJsonObject +case class LuxmedFunnyDateTime(dateTimeTz: Option[ZonedDateTime] = None, dateTimeLocal: Option[LocalDateTime] = None) { + def get: LocalDateTime = dateTimeLocal.getOrElse(dateTimeTz.map(_.toLocalDateTime).get) +} + diff --git a/server/src/main/scala/com/lbs/server/lang/En.scala b/server/src/main/scala/com/lbs/server/lang/En.scala index c281b0c..599968d 100644 --- a/server/src/main/scala/com/lbs/server/lang/En.scala +++ b/server/src/main/scala/com/lbs/server/lang/En.scala @@ -262,7 +262,7 @@ object En extends Lang { |${capitalizeFirstLetter(service)}: ${monitoring.serviceName} |${capitalizeFirstLetter(clinic)}: ${term.term.clinic} |${capitalizeFirstLetter(city)}: ${monitoring.cityName} - |/reserve_${monitoring.recordId}_${term.term.scheduleId}_${minutesSinceBeginOf2018(term.term.dateTimeFrom)} + |/reserve_${monitoring.recordId}_${term.term.scheduleId}_${minutesSinceBeginOf2018(term.term.dateTimeFrom.get)} | |""".stripMargin diff --git a/server/src/main/scala/com/lbs/server/lang/Pl.scala b/server/src/main/scala/com/lbs/server/lang/Pl.scala index e08f313..79b7086 100644 --- a/server/src/main/scala/com/lbs/server/lang/Pl.scala +++ b/server/src/main/scala/com/lbs/server/lang/Pl.scala @@ -262,7 +262,7 @@ object Pl extends Lang { |${capitalizeFirstLetter(service)}: ${monitoring.serviceName} |${capitalizeFirstLetter(clinic)}: ${term.term.clinic} |${capitalizeFirstLetter(city)}: ${monitoring.cityName} - |/reserve_${monitoring.recordId}_${term.term.scheduleId}_${minutesSinceBeginOf2018(term.term.dateTimeFrom)} + |/reserve_${monitoring.recordId}_${term.term.scheduleId}_${minutesSinceBeginOf2018(term.term.dateTimeFrom.get)} | |""".stripMargin diff --git a/server/src/main/scala/com/lbs/server/lang/Ua.scala b/server/src/main/scala/com/lbs/server/lang/Ua.scala index 8bccc7d..e3a7f7d 100644 --- a/server/src/main/scala/com/lbs/server/lang/Ua.scala +++ b/server/src/main/scala/com/lbs/server/lang/Ua.scala @@ -261,7 +261,7 @@ object Ua extends Lang { |${capitalizeFirstLetter(service)}: ${monitoring.serviceName} |${capitalizeFirstLetter(clinic)}: ${term.term.clinic} |${capitalizeFirstLetter(city)}: ${monitoring.cityName} - |/reserve_${monitoring.recordId}_${term.term.scheduleId}_${minutesSinceBeginOf2018(term.term.dateTimeFrom)} + |/reserve_${monitoring.recordId}_${term.term.scheduleId}_${minutesSinceBeginOf2018(term.term.dateTimeFrom.get)} | |""".stripMargin diff --git a/server/src/main/scala/com/lbs/server/service/ApiService.scala b/server/src/main/scala/com/lbs/server/service/ApiService.scala index 8797464..b550c22 100644 --- a/server/src/main/scala/com/lbs/server/service/ApiService.scala +++ b/server/src/main/scala/com/lbs/server/service/ApiService.scala @@ -56,8 +56,8 @@ class ApiService extends SessionSupport { ) termsEither.map { terms => terms.filter { term => - val time = term.term.dateTimeFrom.toLocalTime - val date = term.term.dateTimeFrom + val time = term.term.dateTimeFrom.get.toLocalTime + val date = term.term.dateTimeFrom.get (doctorId.isEmpty || doctorId.contains(term.term.doctor.id)) && (clinicId.isEmpty || clinicId.contains(term.term.clinicId)) && (time == timeFrom || time == timeTo || (time.isAfter(timeFrom) && time.isBefore(timeTo))) && diff --git a/server/src/main/scala/com/lbs/server/service/MonitoringService.scala b/server/src/main/scala/com/lbs/server/service/MonitoringService.scala index dfb6ccb..560b96b 100644 --- a/server/src/main/scala/com/lbs/server/service/MonitoringService.scala +++ b/server/src/main/scala/com/lbs/server/service/MonitoringService.scala @@ -221,7 +221,7 @@ class MonitoringService extends Logger { monitoring.doctorId, monitoring.dateFrom.toLocalDateTime, monitoring.dateTo.toLocalDateTime, timeFrom = monitoring.timeFrom, timeTo = monitoring.timeTo) termsEither match { case Right(terms) => - val termMaybe = terms.find(term => term.term.scheduleId == scheduleId && minutesSinceBeginOf2018(term.term.dateTimeFrom) == time) + val termMaybe = terms.find(term => term.term.scheduleId == scheduleId && minutesSinceBeginOf2018(term.term.dateTimeFrom.get) == time) termMaybe match { case Some(term) => bookAppointment(term, monitoring, rebookIfExists = true) diff --git a/server/src/main/scala/com/lbs/server/util/package.scala b/server/src/main/scala/com/lbs/server/util/package.scala index e68829c..35cef5e 100644 --- a/server/src/main/scala/com/lbs/server/util/package.scala +++ b/server/src/main/scala/com/lbs/server/util/package.scala @@ -53,14 +53,14 @@ package object util { val (reservationLocktermResponse, termExt) = data val term = termExt.term ReservationConfirmRequest( - date = term.dateTimeFrom.minusHours(2).toString + ":00.000Z", + date = term.dateTimeFrom.get.minusHours(2).toString + ":00.000Z", doctorId = term.doctor.id, facilityId = term.clinicId, roomId = term.roomId, scheduleId = term.scheduleId, serviceVariantId = term.serviceId, temporaryReservationId = reservationLocktermResponse.value.temporaryReservationId, - timeFrom = term.dateTimeFrom.toLocalTime, + timeFrom = term.dateTimeFrom.get.toLocalTime, valuation = reservationLocktermResponse.value.valuations.head ) } @@ -74,7 +74,7 @@ package object util { ReservationChangetermRequest( existingReservationId = existingReservationId, term = NewTerm( - date = term.dateTimeFrom.minusHours(2).toString + ":00.000Z", + date = term.dateTimeFrom.get.minusHours(2).toString + ":00.000Z", doctorId = term.doctor.id, facilityId = term.clinicId, parentReservationId = existingReservationId, @@ -83,7 +83,7 @@ package object util { scheduleId = term.scheduleId, serviceVariantId = term.serviceId, temporaryReservationId = reservationLocktermResponse.value.temporaryReservationId, - timeFrom = term.dateTimeFrom.toLocalTime, + timeFrom = term.dateTimeFrom.get.toLocalTime, valuation = reservationLocktermResponse.value.valuations.head ) ) @@ -95,7 +95,7 @@ package object util { val term = termExt.term val additionalData = termExt.additionalData ReservationLocktermRequest( - date = term.dateTimeFrom.minusHours(2).toString + ":00.000Z", + date = term.dateTimeFrom.get.minusHours(2).toString + ":00.000Z", doctor = term.doctor, doctorId = term.doctor.id, facilityId = term.clinicId, @@ -108,8 +108,8 @@ package object util { roomId = term.roomId, scheduleId = term.scheduleId, serviceVariantId = term.serviceId, - timeFrom = term.dateTimeFrom.toLocalTime.toString, - timeTo = term.dateTimeTo.toLocalTime.toString + timeFrom = term.dateTimeFrom.get.toLocalTime.toString, + timeTo = term.dateTimeTo.get.toLocalTime.toString ) } @@ -167,7 +167,7 @@ package object util { def formatDateTime(date: ZonedDateTime, locale: Locale): String = date.format(DateTimeFormat(locale)) - def formatDateTime(date: LocalDateTime, locale: Locale): String = date.format(DateTimeFormat(locale)) + def formatDateTime(date: LuxmedFunnyDateTime, locale: Locale): String = date.get.format(DateTimeFormat(locale)) private val EpochMinutesTillBeginOf2022: Long = epochMinutes(LocalDateTime.of(2022, 1, 1, 0, 0, 0, 0))