vital-software/scala-redox

View on GitHub
src/main/scala/com/github/vitalsoftware/scalaredox/models/Patient.scala

Summary

Maintainability
A
0 mins
Test Coverage
package com.github.vitalsoftware.scalaredox.models

import org.joda.time.DateTime
import com.github.vitalsoftware.util.JsonImplicits.jodaISO8601Format
import com.github.vitalsoftware.macros._
import com.github.vitalsoftware.util.RobustPrimitives
import play.api.libs.json.Reads.DefaultJodaDateReads
import play.api.libs.json._

import scala.collection.Seq

/**
 * Patient identifier
 *
 * @param ID The actual identifier for the patient.
 * @param IDType An ID type associated with identifier (Medical Record Number, etc.)
 */
@jsonDefaults case class Identifier(
  ID: String,
  IDType: String
)

object Identifier extends RobustPrimitives

object SexType extends Enumeration {
  val Male, Female, Unknown, Other = Value

  @transient lazy val strictReads: Reads[SexType.Value] = Reads.enumNameReads(SexType)

  // Allow coversion of "M" and "F" into "Male" and "Female" types
  @transient implicit lazy val fuzzyReads: Reads[SexType.Value] = new Reads[SexType.Value] {
    def reads(json: JsValue) = {
      val transform = json match {
        case JsString(str) if str.equalsIgnoreCase("M") => JsString(Male.toString)
        case JsString(str) if str.equalsIgnoreCase("F") => JsString(Female.toString)
        case _                                          => json
      }
      strictReads.reads(transform)
    }
  }
  @transient implicit lazy val jsonFormat: Format[SexType.Value] = Format(fuzzyReads, Writes.enumNameWrites)

  def defaultValue: SexType.Value = Unknown
}

/**
 * About a patient.
 *
 * @param FirstName Required
 * @param LastName Required
 * @param DOB Partially reliable. Patient's date of birth. In ISO 8601 format
 * @param Sex Required
 * @param Language Patient's primary spoken language. In ISO 639-1 alpha values (e.g. 'en'). http://www.mathguide.de/info/tools/languagecode.html
 * @param Citizenship Patient's nation(s) of citizenship. *In ISO 3166 alpha 2 format (e.g. 'US').
 * @param Race List at http://phinvads.cdc.gov/vads/ViewValueSet.action?id=66D34BBC-617F-DD11-B38D-00188B398520
 * @param Ethnicity List at https://phinvads.cdc.gov/vads/ViewValueSet.action?id=35D34BBC-617F-DD11-B38D-00188B398520
 * @param Religion List at https://www.hl7.org/fhir/v3/ReligiousAffiliation/index.html
 * @param MaritalStatus List at http://www.hl7.org/FHIR/v2/0002/index.html
 */
@jsonDefaults case class Demographics(
  FirstName: String,
  LastName: String,
  DOB: Option[DateTime] = None,
  SSN: Option[String] = None,
  Sex: SexType.Value = SexType.Unknown,
  Address: Option[Address] = None,
  PhoneNumber: Option[PhoneNumber] = None,
  EmailAddresses: Seq[String] = Seq.empty,
  Language: Option[Language] = None,
  Citizenship: Seq[String] = Seq.empty, // TODO ISO 3166
  Race: Option[String] = None,
  Ethnicity: Option[String] = None,
  Religion: Option[String] = None,
  MaritalStatus: Option[String] = None
) extends WithContactDetails

object Demographics extends RobustPrimitives

/**
 * @param RelationToPatient Personal relationship to the patient. e.x. Father, Spouse
 * @param Roles E.g. "Emergency contact"
 */
@jsonDefaults case class Contact(
  FirstName: Option[String] = None,
  LastName: Option[String] = None,
  Address: Option[Address] = None,
  PhoneNumber: Option[PhoneNumber] = None,
  EmailAddresses: Seq[String] = Seq.empty,
  RelationToPatient: Option[String] = None,
  Roles: Seq[String] = Seq.empty
) extends WithContactDetails

object Contact extends RobustPrimitives

/**
 * Patient
 */
@jsonDefaults case class Patient(
  Identifiers: Seq[Identifier] = Seq.empty,
  Demographics: Option[Demographics] = None,
  Notes: Seq[String] = Seq.empty,
  Contacts: Seq[Contact] = Seq.empty,
  Guarantor: Option[Guarantor] = None,
  Insurances: Seq[Insurance] = Seq.empty,
  Diagnoses: Seq[CodesetWithName] = Seq.empty,
  PCP: Option[Provider] = None
)

object Patient extends RobustPrimitives