[trac]勤務状況をレポートしてみる

「規則正しい生活をしよう」などと、ひと月程前に書いたような記憶もあるが...
ブログにはりつけている「早起き生活」のグラフを見ればわかるとおり、ここ一ヶ月は惨澹たる状況でした。

うちの会社はプロジェクトごとに収益管理を行っていて、2週ごとに各プロジェクトに関わった工数を申告する仕組みになっている。
一つのプロジェクトに集中できれば「労働時間=工数」となり問題はないが、複数のプロジェクトに関わっていたりすると、申告のときにどのくらいの比率で関わったか、とか、いろいろ調整するのが面倒だったりするので、今月から労働時間をtracに実績時間として入力するようにしてみた*1

で、tracでレポート出力するとこんなイメージになる。

上から4,5番めが僕の本来の業務、ここ二週間は他のプロジェクトサポートが多かったことがわかる。
ちなみに、この業界、普通一週間は40Hだよね?

このレポートを出力するSQLを以下に示す(PostgreSQL用)。5:00を一日の区切りとしてある(爆)。変更するには「3600*5」の部分を修正してください。また、長くなるため横軸の週数は3週にしてあるので、必要であれば同じ要領でカラムを増やしてくださいな(interval 'n week'の部分を変更する)。
あと、以前のエントリで書いたように複数リポジトリ参照可能としてあるので、単一リポジトリの場合は以下の箇所を変更する必要があります。

    • all_ticket, all_ticket_change のかわりに ticket, ticket_changeを使用
    • schemaカラムを無視
SELECT
  author as __group__,
  schema as "リポジトリ",
  component as "JOB",
  TO_CHAR(SUM(CASE WHEN date_trunc('week', to_timestamp(tbl.time - 3600*5))
              = date_trunc('week', CURRENT_DATE)
           THEN hours ELSE 0 END),'90.00') as "今週",
  TO_CHAR(SUM(CASE WHEN date_trunc('week', to_timestamp(tbl.time - 3600*5))
              = date_trunc('week', CURRENT_DATE) - interval '1 week'
           THEN hours ELSE 0 END),'90.00') as "前週",
  TO_CHAR(SUM(CASE WHEN date_trunc('week', to_timestamp(tbl.time - 3600*5))
              = date_trunc('week', CURRENT_DATE) - interval '2 week'
           THEN hours ELSE 0 END),'90.00') as "2週前"
FROM(
  SELECT author, 
     c.time,
     t.schema, t.component,
     to_number(
       case newvalue
         when '' then '0'
         else newvalue
       end,'99.99') as hours
  FROM all_ticket_change c
    INNER JOIN all_ticket t ON c.schema = t.schema AND c.id = t.id
  WHERE field = 'hours'
)  as tbl
GROUP BY author, schema, component
ORDER BY author, schema, component

それでは。また来月からがんばる。

*1:ていうか、入力し忘れたときはDBを直接操作して強引に勤怠の労働時間にあわせた。ちゃんと工数管理するにはここら辺のリカバー手段を設ける必要がありますね。