1 package jp.ymir.taskReporter.core
2 import java.util.Calendar
3 import java.util.GregorianCalendar
4 import scala.language.reflectiveCalls
5 import scala.util.matching.Regex
11 ticketID: Option[Int],
13 expectedCompletionDate: Calendar,
14 deadline: Option[Calendar],
16 description: Option[String]
22 def endOfCurrentHalf: Calendar = {
23 val cal = new GregorianCalendar()
24 cal.set(Calendar.MONTH, ((cal.get(Calendar.MONTH) + 1 + 5) / 6) * 6 - 1)
25 cal.set(Calendar.DAY_OF_MONTH, cal.getActualMaximum(Calendar.DAY_OF_MONTH))
29 def apply(): Task = Task(
30 date = new GregorianCalendar(),
33 expectedCompletionDate = endOfCurrentHalf,
35 status = Status.DoingFine,
39 sealed abstract class Status
41 case object DoingFine extends Status { override def toString() = "順調"}
42 case object Lagging extends Status { override def toString() = "遅延"}
43 case object Completed extends Status { override def toString() = "完了"}
45 def all: Seq[Status] = Seq(DoingFine, Lagging, Completed)
48 implicit val CalendarFromField = new FromField[Calendar] {
49 val pattern = """^(\d{4})/(\d{2})/(\d{2})$""".r
51 def parseField(f: Field): Parser[Calendar] = f.value match {
52 case pattern(year, month, day) =>
53 new GregorianCalendar(year.toInt, month.toInt - 1, day.toInt).point[Parser]
55 ("date not in format yyyy/MM/dd: " + f).raiseError[Calendar]
59 implicit val StatusFromField = new FromField[Status] {
60 def parseField(f: Field): Parser[Status] = f.value match {
61 case "順調" => (Status.DoingFine: Status).point[Parser]
62 case "遅延" => (Status.Lagging: Status).point[Parser]
63 case "完了" => (Status.Completed: Status).point[Parser]
65 ("invalid status: " + f).raiseError[Status]
69 implicit val TaskFromRecord = new FromRecord[Task] {
70 def parseRecord(r: Record): Parser[Task] =
72 date <- r.lookup[Calendar ]('報告日)
73 ticketID <- r.lookup[Option[Int] ]('チケットID, "")
74 title <- r.lookup[String ]('作業名)
75 expectedCompletionDate <- r.lookup[Calendar ]('作業完了予定年月日)
76 deadline <- r.lookup[Option[Calendar]]('タスク期限, "")
77 status <- r.lookup[Status ]('状態)
78 description <- r.lookup[Option[String] ]('説明, "")
80 yield Task(date, ticketID, title, expectedCompletionDate,
81 deadline, status, description)