override def reads()

in lib/holiday-stops/src/main/scala/com/gu/salesforce/holiday_stops/SalesforceHolidayStopRequest.scala [43:97]


    override def reads(jsValue: JsValue): JsResult[ZonedDateTime] =
      jsValue.validate[String].map(sfDate => ZonedDateTime.parse(sfDate, SALESFORCE_DATE_TIME_FORMATTER))

    override def writes(dateTime: ZonedDateTime): JsValue = JsString(dateTime.format(SALESFORCE_DATE_TIME_FORMATTER))
  }

  case class HolidayStopRequestStartDate(value: LocalDate) extends AnyVal
  implicit val formatHolidayStopRequestStartDate = Json.valueFormat[HolidayStopRequestStartDate]

  case class HolidayStopRequestEndDate(value: LocalDate) extends AnyVal
  implicit val formatHolidayStopRequestEndDate = Json.valueFormat[HolidayStopRequestEndDate]

  case class HolidayStopRequestActionedCount(value: Int) extends AnyVal
  implicit val formatHolidayStopRequestActionedCount = Json.valueFormat[HolidayStopRequestActionedCount]

  case class HolidayStopRequestWithdrawnTime(value: ZonedDateTime) extends AnyVal
  implicit val formatHolidayStopRequestWithdrawnTime = Json.valueFormat[HolidayStopRequestWithdrawnTime]

  case class HolidayStopRequestIsWithdrawn(value: Boolean) extends AnyVal
  implicit val formatHolidayStopRequestIsWithdrawn = Json.valueFormat[HolidayStopRequestIsWithdrawn]

  case class BulkSuspensionReason(value: String) extends AnyVal
  implicit val formatBulkSuspensionReason = Json.valueFormat[BulkSuspensionReason]

  def getHolidayStopRequestPrefixSOQL(productNamePrefixOption: Option[ProductName] = None) = s"""
      | SELECT Id, Start_Date__c, End_Date__c, Subscription_Name__c, Product_Name__c,
      | Actioned_Count__c, Pending_Count__c, Total_Issues_Publications_Impacted_Count__c,
      | Withdrawn_Time__c, Is_Withdrawn__c, Bulk_Suspension_Reason__c, (
      |   ${SalesforceHolidayStopRequestsDetail.SOQL_SELECT_CLAUSE}
      |   FROM Holiday_Stop_Request_Detail__r
      |   ${SalesforceHolidayStopRequestsDetail.SOQL_ORDER_BY_CLAUSE}
      | )
      | FROM $holidayStopRequestSfObjectRef
      | ${productNamePrefixOption.map(pn => s"WHERE Product_Name__c LIKE '${pn.value}%'").getOrElse("")}
      |""".stripMargin

  case class HolidayStopRequest(
      Id: HolidayStopRequestId,
      Start_Date__c: HolidayStopRequestStartDate,
      End_Date__c: HolidayStopRequestEndDate,
      Actioned_Count__c: HolidayStopRequestActionedCount,
      Pending_Count__c: Int,
      Total_Issues_Publications_Impacted_Count__c: Int,
      Subscription_Name__c: SubscriptionName,
      Product_Name__c: ProductName,
      Holiday_Stop_Request_Detail__r: Option[RecordsWrapperCaseClass[HolidayStopRequestsDetail]],
      Withdrawn_Time__c: Option[HolidayStopRequestWithdrawnTime],
      Is_Withdrawn__c: HolidayStopRequestIsWithdrawn,
      Bulk_Suspension_Reason__c: Option[BulkSuspensionReason],
  )
  implicit val format = Json.format[HolidayStopRequest]

  implicit val formatIds = Json.format[RecordsWrapperCaseClass[HolidayStopRequest]]

  class LookupByContactAndOptionalSubscriptionName(sfGet: HttpOp[RestRequestMaker.GetRequestWithParams, JsValue]) {