package xyz.driver.pdsuidomain.entities
import java.time.{LocalDateTime, ZoneId}
import xyz.driver.core.auth.User
import xyz.driver.pdsuicommon.domain._
import xyz.driver.pdsuicommon.logging._
import xyz.driver.pdsuicommon.utils.Utils
import xyz.driver.pdsuidomain.entities.MedicalRecordHistory._
object MedicalRecordHistory {
implicit def toPhiString(x: MedicalRecordHistory): PhiString = {
import x._
phi"MedicalRecordHistory(id=$id, executor=${Unsafe(executor)}, recordId=$recordId, state=$state, action=$action, " +
phi"created=$created)"
}
sealed trait State
object State {
case object New extends State
case object Clean extends State
case object Organize extends State
case object Review extends State
case object Done extends State
case object Flag extends State
case object Archive extends State
val All: Set[State] = Set(
State.New,
State.Clean,
State.Organize,
State.Review,
State.Done,
State.Flag,
State.Archive
)
private val stateToName: Map[State, String] =
All.map(s => s -> s.toString).toMap
val fromString: PartialFunction[String, State] =
for ((k, v) <- stateToName) yield (v, k)
def stateToString: State => String = stateToName
implicit def toPhiString(x: State): PhiString =
Unsafe(Utils.getClassSimpleName(x.getClass))
}
sealed trait Action extends Product with Serializable {
def oneOf(xs: Action*): Boolean = xs.contains(this)
def oneOf(xs: Set[Action]): Boolean = xs.contains(this)
}
object Action {
case object Start extends Action
case object Submit extends Action
case object Unassign extends Action
case object Resolve extends Action
case object Flag extends Action
case object Archive extends Action
case object SaveDuplicate extends Action
case object SaveReorder extends Action
case object SaveRotation extends Action
case object DeleteDuplicate extends Action
case object DeleteReorder extends Action
case object DeleteRotation extends Action
case object CreateDocument extends Action
case object DeleteDocument extends Action
case object CreateRecord extends Action
case object ReadRecord extends Action
val All: Set[Action] = Set(
Action.Start,
Action.Submit,
Action.Unassign,
Action.Resolve,
Action.Flag,
Action.Archive,
Action.SaveDuplicate,
Action.SaveReorder,
Action.SaveRotation,
Action.DeleteDuplicate,
Action.DeleteReorder,
Action.DeleteRotation,
Action.CreateDocument,
Action.DeleteDocument,
Action.CreateRecord,
Action.ReadRecord
)
private val actionToName: Map[Action, String] =
All.map(a => a -> a.toString).toMap
val fromString: PartialFunction[String, Action] =
for ((k, v) <- actionToName) yield (v, k)
def actionToString: Action => String = actionToName
implicit def toPhiString(x: Action): PhiString =
Unsafe(Utils.getClassSimpleName(x.getClass))
}
}
final case class MedicalRecordHistory(id: LongId[MedicalRecordHistory],
executor: xyz.driver.core.Id[User],
recordId: LongId[MedicalRecord],
state: State,
action: Action,
created: LocalDateTime = LocalDateTime.now(ZoneId.of("Z")))