]> gitweb @ CieloNegro.org - task-reporter.git/blobdiff - src/main/scala/jp/ymir/taskReporter/core/Task.scala
new tsv
[task-reporter.git] / src / main / scala / jp / ymir / taskReporter / core / Task.scala
index ebc869385de41335797d1b6eabc34ee6f22d7c29..53e813d7b0c5079bed38816c010f5cc9be1c02c5 100644 (file)
@@ -3,6 +3,63 @@ import java.util.Calendar
 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 {
@@ -10,7 +67,7 @@ class Task(tsvLine: String) {
     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
   }
 
@@ -24,7 +81,7 @@ class Task(tsvLine: String) {
     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) =>
@@ -32,17 +89,60 @@ class Task(tsvLine: String) {
     }
   }
 
-  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
     }
   }
 }
+ */