/* * Aipo is a groupware program developed by TOWN, Inc. * Copyright (C) 2004-2015 TOWN, Inc. * http://www.aipo.com * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU Affero General Public License as * published by the Free Software Foundation, either version 3 of the * License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Affero General Public License for more details. * * You should have received a copy of the GNU Affero General Public License * along with this program. If not, see <http://www.gnu.org/licenses/>. */ package com.aimluck.eip.project; import java.math.BigDecimal; import java.text.DecimalFormat; import java.util.ArrayList; import java.util.Calendar; import java.util.Date; import java.util.List; import com.aimluck.commons.field.ALDateTimeField; import com.aimluck.commons.field.ALNumberField; import com.aimluck.commons.field.ALStringField; import com.aimluck.eip.common.ALData; import com.aimluck.eip.fileupload.beans.FileuploadBean; import com.aimluck.eip.project.util.ProjectUtils; import com.aimluck.eip.util.ALCommonUtils; import com.aimluck.eip.util.ALEipUtils; /** * タスクのResultDataです。 <BR> * */ public class ProjectTaskResultData implements ALData { /** タスク ID */ protected ALNumberField task_id; /** 親タスク ID */ protected ALNumberField parent_task_id; /** 親タスク名 */ protected ALStringField parent_task_name; /** プロジェクト ID */ protected ALNumberField project_id; /** 分類 */ protected ALStringField tracker; /** タスク名 */ protected ALStringField task_name; /** プロジェクト名 **/ protected ALStringField project_name; /** 説明 */ protected ALStringField explanation; /** ステータス */ protected ALStringField status; /** 優先度 */ protected ALStringField priority; /** 開始予定日 */ protected ALDateTimeField start_plan_date; /** 完了予定日 */ protected ALDateTimeField end_plan_date; /** 予定期間 */ protected ALNumberField plan_term; /** 開始実績日 */ protected ALDateTimeField start_date; /** 完了実績日 */ protected ALDateTimeField end_date; /** 計画工数 */ protected BigDecimal plan_workload; /** 工数実績 */ protected BigDecimal workload; /** 完了予測工数 */ protected BigDecimal forecast_workload; /** 予定進捗率 */ protected ALNumberField plan_progress_rate; /** 進捗率 */ protected ALNumberField progress_rate; /** 担当者リスト */ private List<ProjectTaskMemberResultData> memberList = null; /** ログインユーザーID */ private ALNumberField login_user_id; /** 作成日 */ protected ALDateTimeField create_date; /** 更新日 */ protected ALDateTimeField update_date; /** 添付ファイルリスト */ private List<FileuploadBean> attachmentFileList = null; /** コメントリスト */ private List<ProjectTaskCommentResultData> commentList = null; /** 実績表示フラグ */ private boolean resultDisplayFlg; /** 子タスク保持フラグ */ private boolean hasChildren; /** フォーム用の子タスク保持フラグ */ private boolean hasChildrenForForm; /** インデント表示フラグ */ private boolean indentFlg; /** タスク名表示インデント */ private ALNumberField indent; /** パンくずリスト */ private ALStringField topicPath; /** 小数値項目フォーマット */ private final DecimalFormat df = new DecimalFormat("#.0##"); private boolean editable; /** * 初期設定を行います */ @Override public void initField() { task_id = new ALNumberField(); parent_task_id = new ALNumberField(); parent_task_name = new ALStringField(); project_id = new ALNumberField(); tracker = new ALStringField(); task_name = new ALStringField(); project_name = new ALStringField(); explanation = new ALStringField(); status = new ALStringField(); priority = new ALStringField(); start_plan_date = new ALDateTimeField(); end_plan_date = new ALDateTimeField(); plan_term = new ALNumberField(); start_date = new ALDateTimeField(); end_date = new ALDateTimeField(); plan_workload = new BigDecimal(0); workload = new BigDecimal(0); forecast_workload = new BigDecimal(0); plan_progress_rate = new ALNumberField(); progress_rate = new ALNumberField(); memberList = new ArrayList<ProjectTaskMemberResultData>(); login_user_id = new ALNumberField(); create_date = new ALDateTimeField(); update_date = new ALDateTimeField(); attachmentFileList = new ArrayList<FileuploadBean>(); commentList = new ArrayList<ProjectTaskCommentResultData>(); indent = new ALNumberField(); topicPath = new ALStringField(); resultDisplayFlg = true; hasChildren = false; indentFlg = false; hasChildrenForForm = false; editable = false; } /** * タスクIDを取得する * * @return タスクID */ public ALNumberField getTaskId() { return task_id; } /** * タスクIDを設定する * * @param i * タスクトID */ public void setTaskId(long i) { task_id.setValue(i); } /** * 親タスクIDを取得する * * @return 親タスクID */ public ALNumberField getParentTaskId() { return parent_task_id; } /** * 親タスクIDを設定する * * @param i * 親タスクID */ public void setParentTaskId(long i) { parent_task_id.setValue(i); } /** * 親タスク名を取得する * * @return 親タスク名 */ public String getParentTaskName() { return ALCommonUtils.replaceToAutoCR(parent_task_name.toString()); } /** * 親タスク名を設定する * * @param string * 親タスク名 */ public void setParentTaskName(String string) { parent_task_name.setValue(string); } /** * プロジェクトIDを取得する * * @return プロジェクトID */ public ALNumberField getProjectId() { return project_id; } /** * プロジェクトIDを設定する * * @param i * プロジェクトID */ public void setProjectId(long i) { project_id.setValue(i); } /** * 分類を取得する * * @return 分類 */ public String getTracker() { return ALCommonUtils.replaceToAutoCR(tracker.toString()); } /** * 分類を設定する * * @param string * 分類 */ public void setTracker(String string) { tracker.setValue(string); } /** * タスク名を取得する * * @return タスク名 */ public ALStringField getTaskName() { return task_name; } public String getTaskNameHtml() { return ALCommonUtils.replaceToAutoCR(task_name.toString()); } /** * タスク名を設定する * * @param string * タスク名 */ public void setTaskName(String string) { task_name.setValue(string); } /** * プロジェクト名を取得する * * @return プロジェクト名 */ public ALStringField getProjectName() { return project_name; } public String getProjectNameHtml() { return ALCommonUtils.replaceToAutoCR(project_name.toString()); } /** * プロジェクト名を設定する * * @param string * プロジェクト名 */ public void setProjectName(String string) { project_name.setValue(string); } /** * 説明を取得する * * @return 説明 */ public String getExplanation() { return ALEipUtils.getMessageList(explanation.getValue()); } /** * 説明を設定する * * @param string * 説明 */ public void setExplanation(String string) { explanation.setValue(string); } /** * ステータスを取得する * * @return ステータス */ public String getStatus() { return ALCommonUtils.replaceToAutoCR(status.toString()); } /** * ステータスを設定する * * @param string * ステータス */ public void setStatus(String string) { status.setValue(string); } /** * 優先度を取得する * * @return 優先度 */ public String getPriority() { return ALCommonUtils.replaceToAutoCR(priority.toString()); } /** * 優先度を設定する * * @param string * 優先度 */ public void setPriority(String string) { priority.setValue(string); } /** * 開始予定日を取得する * * @return 開始予定日 */ public ALDateTimeField getStartPlanDate() { return start_plan_date; } /** * 開始予定日を設定する * * @param dt * 開始予定日 */ public void setStartPlanDate(Date dt) { start_plan_date.setValue(dt); } /** * 完了予定日を取得する * * @return 完了予定日 */ public ALDateTimeField getEndPlanDate() { return end_plan_date; } /** * 完了予定日をフォーマットしていで取得する * * @return 完了予定日 */ public String getEndPlanDateWithFormat(String format) { return end_plan_date.toString(format); } /** * 完了予定日を設定する * * @param dt * 完了予定日 */ public void setEndPlanDate(Date dt) { end_plan_date.setValue(dt); } /** * 予定期間を取得する * * @return 予定期間 */ public ALNumberField getPlanTerm() { return plan_term; } /** * 予定期間を設定する * * @param i * 予定期間 */ public void setPlanTerm(long i) { plan_term.setValue(i); } /** * 開始実績日を取得する * * @return 開始実績日 */ public ALDateTimeField getStartDate() { return start_date; } /** * 開始実績日を設定する * * @param dt * 開始実績日 */ public void setStartDate(Date dt) { start_date.setValue(dt); } /** * 完了実績日を取得する * * @return 完了実績日 */ public ALDateTimeField getEndDate() { return end_date; } /** * 完了実績日を設定する * * @param dt * 完了実績日 */ public void setEndDate(Date dt) { end_date.setValue(dt); } /** * 計画工数を取得する * * @return 計画工数 */ public BigDecimal getPlanWorkload() { return plan_workload; } /** * 計画工数を設定する * * @param i * 計画工数 */ public void setPlanWorkload(BigDecimal i) { plan_workload = i; } /** * 計画工数を取得する(表示用) * * @return 計画工数 */ public String getPlanWorkloadFormat() { return df.format(plan_workload); } /** * 実績工数を取得する * * @return 実績工数 */ public BigDecimal getWorkload() { return workload; } /** * 実績工数を設定する * * @param i * 実績工数 */ public void setWorkload(BigDecimal i) { workload = i; } /** * 実績工数を取得する(表示用) * * @return 実績工数 */ public String getWorkloadFormat() { return df.format(workload); } /** * 完了予測工数を取得する * * @return 完了予測工数 */ public BigDecimal getForecastWorkload() { return forecast_workload; } /** * 完了予測工数を設定する * * @param i * 完了予測工数 */ public void setForecastWorkload(BigDecimal i) { forecast_workload = i; } /** * 完了予測工数を取得する(表示用) * * @return 完了予測工数 */ public String getForecastWorkloadFormat() { return df.format(forecast_workload); } /** * 予定進捗率を取得する * * @return 予定進捗率 */ public ALNumberField getPlanProgressRate() { return plan_progress_rate; } /** * 予定進捗率を設定する * * @param i * 予定進捗率 */ public void setPlanProgressRate(long i) { plan_progress_rate.setValue(i); } /** * 進捗率を取得する * * @return 進捗率 */ public ALNumberField getProgressRate() { return progress_rate; } /** * 進捗率を設定する * * @param i * 進捗率 */ public void setProgressRate(long i) { progress_rate.setValue(i); } /** * 作成日を取得する * * @return 作成日 */ public ALDateTimeField getCreateDate() { return create_date; } /** * 作成日を設定する * * @param dt * 作成日 */ public void setCreateDate(Date dt) { create_date.setValue(dt); } /** * 更新日を取得する * * @return 更新日 */ public ALDateTimeField getUpdateDate() { return ALEipUtils.getFormattedTime(update_date); } /** * 更新日を設定する * * @param dt * 更新日 */ public void setUpdateDate(Date dt) { update_date.setValue(dt); } /** * 担当者リストを取得します。 * * @return 担当者リスト */ public List<ProjectTaskMemberResultData> getMemberList() { return memberList; } /** * 担当者リストを設定します。 * * @param memberList * 担当者リスト */ public void setMemberList(List<ProjectTaskMemberResultData> memberList) { this.memberList = memberList; } /** * 担当者リスト文字列を取得します。 * * @return 担当者リスト */ public String getMemberListString() { if (memberList == null) { return ""; } StringBuilder sb = new StringBuilder(); for (int i = 0; i < memberList.size(); i++) { ProjectTaskMemberResultData member = memberList.get(i); if (member == null) { continue; } if (i > 0) { sb.append("、"); } sb.append(member.getUserName()); } return String.valueOf(sb); } /** * ログインユーザーIDを取得します。 * * @return ログインユーザーID */ public ALNumberField getLoginUserId() { return login_user_id; } /** * ログインユーザーIDを設定する * * @param ログインユーザーID */ public void setLoginUserId(long i) { login_user_id.setValue(i); } /** * 工数合計を取得します。 * * @return 担当者リスト */ public BigDecimal getWorkloadTotal() { BigDecimal w = BigDecimal.valueOf(0); if (memberList == null) { return w; } for (int i = 0; i < memberList.size(); i++) { ProjectTaskMemberResultData member = memberList.get(i); if (member == null) { continue; } w = w.add(member.getWorkload()); } return w; } /** * 添付ファイルリストを取得します。 * * @return list 添付ファイルリスト */ public List<FileuploadBean> getAttachmentFileList() { return attachmentFileList; } /** * 添付ファイルリストを設定します。 * * @param list * 添付ファイルリスト */ public void setAttachmentFiles(List<FileuploadBean> list) { attachmentFileList = list; } /** * コメントリストを取得します。 * * @return list コメントリスト */ public List<ProjectTaskCommentResultData> getCommentList() { return commentList; } /** * コメントリストを設定します。 * * @param list * 添付ファイルリスト */ public void setCommentList(List<ProjectTaskCommentResultData> list) { commentList = list; } /** * 実績表示フラグを取得します。 * * @return 実績表示フラグ */ public boolean getResultDisplayFlg() { return resultDisplayFlg; } /** * 実績表示フラグを設定します。 * * @param b * 実績表示フラグ */ public void setResultDisplayFlg(boolean b) { resultDisplayFlg = b; } /** * 子タスク保持フラグを取得します。 * * @return 子タスク保持フラグ */ public boolean getHasChildren() { return hasChildren; } /** * 子タスク保持フラグを設定します。 * * @param b * 子タスク保持フラグ */ public void setHasChildren(boolean b) { hasChildren = b; } /** * 一覧条件絞込みフラグを取得します。 * * @return 一覧条件絞込みフラグ */ public boolean getConditionFlg() { return indentFlg; } /** * インデント表示フラグを設定します。 * * @param b * インデント表示フラグ */ public void setIndentFlg(boolean b) { indentFlg = b; } /** * タスク名表示インデントを取得する * * @return インデント */ public ALNumberField getIndent() { return indent; } /** * タスク名表示インデントを設定する * * @param i * インデント */ public void setIndent(long i) { indent.setValue(i); } /** * タスク名表示インデント文字列を取得する * * @return インデント */ public String getIndentString() { if (!indentFlg) { return ""; } StringBuilder sb = new StringBuilder(); for (int i = 0; i < indent.getValue(); i++) { sb.append("  "); } if (sb.length() > 0) { sb.append("└ "); } return String.valueOf(sb); } /** * 進捗遅延であるかをチェックする * * @return TRUE:工数オーバー */ public boolean isDelay() { if ("".equals(getPlanProgressRate().toString()) || "".equals(getProgressRate().toString())) { return false; } return (getPlanProgressRate().getValue() > getProgressRate().getValue()); } /** * 工数オーバーであるかをチェックする * * @return TRUE:工数オーバー */ public boolean isWorkloadOver() { if ("".equals(getStartPlanDate().toString()) || "".equals(getEndPlanDate().toString())) { return false; } return (getPlanWorkload().compareTo(getForecastWorkload()) < 0); } /** * パンくずリストを設定する * * @param i * パンくずリスト */ public void setTopicPath(String i) { topicPath.setValue(i); } /** * パンくずリストを取得する * * @return パンくずリスト */ public ALStringField getTopicPath() { return topicPath; } /** * 未来開始予定であるかを取得する * * @return TRUE:未来開始予定タスクである */ public boolean isNoStart() { Calendar today = Calendar.getInstance(); Calendar cal = Calendar.getInstance(); cal.setTime(start_plan_date.getValue()); return today.get(Calendar.YEAR) < cal.get(Calendar.YEAR) || (today.get(Calendar.YEAR) == cal.get(Calendar.YEAR) && today .get(Calendar.MONTH) < cal.get(Calendar.MONTH)) || (today.get(Calendar.YEAR) == cal.get(Calendar.YEAR) && today.get(Calendar.MONTH) == cal.get(Calendar.MONTH) && today .get(Calendar.DAY_OF_MONTH) < cal.get(Calendar.DAY_OF_MONTH)); } /** * 完了済み予定であるかを取得する * * @return TRUE:完了済み予定 */ public boolean isPastFinish() { Calendar today = Calendar.getInstance(); Calendar cal = Calendar.getInstance(); cal.setTime(end_plan_date.getValue()); return today.get(Calendar.YEAR) > cal.get(Calendar.YEAR) || (today.get(Calendar.YEAR) == cal.get(Calendar.YEAR) && today .get(Calendar.MONTH) > cal.get(Calendar.MONTH)) || (today.get(Calendar.YEAR) == cal.get(Calendar.YEAR) && today.get(Calendar.MONTH) == cal.get(Calendar.MONTH) && today .get(Calendar.DAY_OF_MONTH) > cal.get(Calendar.DAY_OF_MONTH)); } /** * 完了済であるかを取得する * * @return TRUE:ステータスが新規、進行中、フィードバックのもの以外を完了済とする */ public boolean isFinishStatus() { for (String _status : ProjectUtils.completeStatus) { if (status.getValue().equals(_status)) { return true; } } return false; } // --------------------------------------------------- // 区分値取得 // --------------------------------------------------- /** * 分類区分値を取得する * * @param kubun * 区分値 * @return 区分値文字列 */ public String getTrackerString() { return ProjectUtils.getKubunValueString("tracker", tracker.getValue()); } /** * ステータス区分値を取得する * * @param kubun * 区分値 * @return 区分値文字列 */ public String getStatusString() { return ProjectUtils.getKubunValueString("status", status.getValue()); } /** * 優先度区分値を取得する * * @param kubun * 区分値 * @return 区分値文字列 */ public String getPriorityString() { return ProjectUtils.getKubunValueString("priority", priority.getValue()); } /** * @return hasChildrenForForm */ public boolean isHasChildrenForForm() { return hasChildrenForForm; } /** * @param hasChildrenForForm * セットする hasChildrenForForm */ public void setHasChildrenForForm(boolean hasChildrenForForm) { this.hasChildrenForForm = hasChildrenForForm; } public boolean isEditable() { return editable; } public void setEditable(boolean editable) { this.editable = editable; } }