import java.util.GregorianCalendar
import scala.util.matching.Regex
+case class Task(
+ date: Calendar,
+ ticketID: Option[Int],
+ title: String,
+ expectedCompletionDate: Calendar,
+ deadline: Option[Calendar],
+ status: Task.Status,
+ description: Option[String]
+)
+
+object Task {
+ import TSV._
+
+ sealed abstract class Status
+ object Status {
+ case object DoingFine extends Status
+ case object Lagging extends Status
+ case object DeadlineChanged extends Status
+ case object Completed extends Status
+ }
+
+ implicit def CalendarFromField = new FromField[Calendar] {
+ val pattern = """^(\d{4})/(\d{2})/(\d{2})$""".r
+
+ def parseField(f: Field): Calendar = {
+ f match {
+ case pattern(year, month, day) =>
+ new GregorianCalendar(year.toInt, month.toInt, day.toInt)
+ }
+ }
+ }
+
+ implicit def StatusFromField = new FromField[Status] {
+ def parseField(f: Field): Status = f match {
+ case "順調" => Status.DoingFine
+ case "遅延" => Status.Lagging
+ case "期限変更" => Status.DeadlineChanged
+ case "完了" => Status.Completed
+ }
+ }
+
+ implicit def TaskFromRecord = new FromRecord[Task] {
+ def parseRecord(r: Record): Task = {
+ return Task(
+ date = parseField[Calendar](r('報告日)),
+ ticketID = parseField[Option[Int]](r('チケットID)),
+ title = parseField[String](r('作業名)),
+ expectedCompletionDate = parseField[Calendar](r('作業完了予定年月日)),
+ deadline = parseField[Option[Calendar]](r('タスク期限)),
+ status = parseField[Status](r('状態)),
+ description = parseField[Option[String]](r('説明))
+ )
+ }
+ }
+}
+
+/*
class Task(tsvLine: String) {
sealed abstract class Status
object Status {
case object DoingFine extends Status
case object Lagging extends Status
case object WillDelay extends Status
- case object DeadlinePostponed extends Status
+ case object DeadlineChanged extends Status
case object Completed extends Status
}
throw new InvalidNumberOfColumnsException(tsvLine)
}
- val date : Calendar = {
+ var date : Calendar = {
val pattern = """^(?:報告日:)?(\d{4})/(\d{2})/(\d{2})$""".r
cols(0) match {
case pattern(year, month, day) =>
}
}
- val ticketID : Int = {
+ var ticketID : Int = {
val pattern = """^(?:チケットID:)?(\d+)$""".r
cols(1) match {
case pattern(id) => id.toInt
}
}
- val title : String = {
+ var title : String = {
val pattern = """^(?:作業名:)?(.*)$""".r
- cols(1) match {
+ cols(2) match {
+ case pattern(title) => title
+ }
+ }
+
+ var tentativeDeadline : Option[Calendar] = {
+ val pattern = """^(?:仮期限:)?(\d{4})/(\d{2})/(\d{2})$""".r
+ cols(3) match {
+ case pattern(year, month, day) =>
+ Some(new GregorianCalendar(year.toInt, month.toInt, day.toInt))
+ case _ =>
+ None
+ }
+ }
+
+ var deadline : Option[Calendar] = {
+ val pattern = """^(?:期限:)?(\d{4})/(\d{2})/(\d{2})$""".r
+ cols(4) match {
+ case pattern(year, month, day) =>
+ Some(new GregorianCalendar(year.toInt, month.toInt, day.toInt))
+ case _ =>
+ None
+ }
+ }
+
+ var status : Status = {
+ val pattern = """^(?:状態:)?(.+)$""".r
+ cols(5) match {
+ case pattern(s) =>
+ s match {
+ case "未作業" => Status.NoProgress
+ case "順調" => Status.DoingFine
+ case "悪化" => Status.Lagging
+ case "遅延" => Status.WillDelay
+ case "期限変更" => Status.DeadlineChanged
+ case "完了" => Status.Completed
+ }
+ }
+ }
+
+ var supplement : String = {
+ val pattern = """^(?:補足:)?(.*)$""".r
+ cols(6) match {
case pattern(title) => title
}
}
}
+ */