/*
 * Aipo is a groupware program developed by Aimluck,Inc.
 * Copyright (C) 2004-2008 Aimluck,Inc.
 * http://aipostyle.com/
 * 
 * This program is free software; you can redistribute it and/or modify
 * it under the terms of the GNU 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 General Public License for more details.
 * 
 * You should have received a copy of the GNU General Public License
 * along with this program. If not, see <http://www.gnu.org/licenses/>.
 */
package com.aimluck.eip.paidholidaylist;

import java.util.ArrayList;
import java.util.Calendar;
import java.util.List;

import org.apache.cayenne.access.DataContext;
import org.apache.cayenne.exp.Expression;
import org.apache.cayenne.exp.ExpressionFactory;
import org.apache.cayenne.query.SelectQuery;
import org.apache.jetspeed.om.security.Group;
import org.apache.jetspeed.services.JetspeedSecurity;
import org.apache.jetspeed.services.logging.JetspeedLogFactoryService;
import org.apache.jetspeed.services.logging.JetspeedLogger;
import org.apache.turbine.util.RunData;
import org.apache.velocity.context.Context;

import com.aimluck.commons.field.ALNumberField;
import com.aimluck.commons.field.ALStringField;
import com.aimluck.eip.cayenne.om.portlet.EipFacilityGroup;
import com.aimluck.eip.cayenne.om.portlet.EipMFacility;
import com.aimluck.eip.cayenne.om.portlet.EipTScheduleMap;
import com.aimluck.eip.cayenne.om.portlet.EipTWorkflowRoute;
import com.aimluck.eip.cayenne.om.portlet.ImwMPaidHolidayList;
import com.aimluck.eip.cayenne.om.security.TurbineGroup;
import com.aimluck.eip.common.ALAbstractFormData;
import com.aimluck.eip.common.ALDBErrorException;
import com.aimluck.eip.common.ALEipConstants;
import com.aimluck.eip.common.ALPageNotFoundException;
import com.aimluck.eip.modules.actions.common.ALAction;
import com.aimluck.eip.orm.DatabaseOrmService;
import com.aimluck.eip.paidholidaylist.util.PaidHolidayListUtils;
import com.aimluck.eip.util.ALEipUtils;


/**
 * 有給付与のフォームデータを管理するクラスです。 <BR>
 * 
 */
public class PaidHolidayListFormData extends ALAbstractFormData {
	
/*Delete 趙丹2011/01/26 Start----  */		

//  /** logger */
//  private static final JetspeedLogger logger = JetspeedLogFactoryService
//      .getLogger(PaidHolidayListFormData.class.getName());
//
//  /** 有給付与名 */
//  private ALStringField facility_name;
//
//  /** メモ */
//  private ALStringField note;
//
//  private String facilityid;
//
//  private int userId;
//
//  private DataContext dataContext;
//
//  /**
//   * 
//   * @param action
//   * @param rundata
//   * @param context
//   * @see com.aimluck.eip.common.ALAbstractFormData#init(com.aimluck.eip.modules.actions.common.ALAction,
//   *      org.apache.turbine.util.RunData, org.apache.velocity.context.Context)
//   */
//  public void init(ALAction action, RunData rundata, Context context)
//      throws ALPageNotFoundException, ALDBErrorException {
//    super.init(action, rundata, context);
//
//    dataContext = DatabaseOrmService.getInstance().getDataContext();
//
//    userId = ALEipUtils.getUserId(rundata);
//  }
//
//  /**
//   * 各フィールドを初期化します。 <BR>
//   * 
//   * @see com.aimluck.eip.common.ALData#initField()
//   */
//  public void initField() {
//    // 有給付与名
//    facility_name = new ALStringField();
//    facility_name.setFieldName("有給付与名");
//    facility_name.setTrim(true);
//    // メモ
//    note = new ALStringField();
//    note.setFieldName("メモ");
//    note.setTrim(false);
//  }
//
//  /**
//   * 有給付与の各フィールドに対する制約条件を設定します。 <BR>
//   * 
//   * @see com.aimluck.eip.common.ALAbstractFormData#setValidator()
//   */
//  protected void setValidator() {
//    // 有給付与名必須項目
//    facility_name.setNotNull(true);
//    // 有給付与名の文字数制限
//    facility_name.limitMaxLength(50);
//    // メモの文字数制限
//    note.limitMaxLength(1000);
//  }
//
//  /**
//   * 
//   * @param rundata
//   * @param context
//   * @param msgList
//   * @return
//   * @see com.aimluck.eip.common.ALAbstractFormData#setFormData(org.apache.turbine.util.RunData,
//   *      org.apache.velocity.context.Context, java.util.ArrayList)
//   */
//  protected boolean setFormData(RunData rundata, Context context,
//      ArrayList msgList) throws ALPageNotFoundException, ALDBErrorException {
//    boolean res = super.setFormData(rundata, context, msgList);
//    try {
//      if (res) {
//        if (ALEipConstants.MODE_UPDATE.equals(getMode())) {
//          facilityid = ALEipUtils.getTemp(rundata, context,
//              ALEipConstants.ENTITY_ID);
//        }
//      }
//    } catch (Exception ex) {
//      logger.error("Exception", ex);
//      res = false;
//    }
//    return res;
//  }
//
//  /**
//   * 有給付与のフォームに入力されたデータの妥当性検証を行います。 <BR>
//   * 
//   * @param msgList
//   * @return TRUE 成功 FALSE 失敗
//   * @see com.aimluck.eip.common.ALAbstractFormData#validate(java.util.ArrayList)
//   */
//  protected boolean validate(ArrayList msgList) {
//    try {
//      SelectQuery query = new SelectQuery(EipMFacility.class);
//      if (ALEipConstants.MODE_INSERT.equals(getMode())) {
//        Expression exp = ExpressionFactory.matchExp(
//            EipMFacility.FACILITY_NAME_PROPERTY, facility_name.getValue());
//        query.setQualifier(exp);
//      } else if (ALEipConstants.MODE_UPDATE.equals(getMode())) {
//        Expression exp1 = ExpressionFactory.matchExp(
//            EipMFacility.FACILITY_NAME_PROPERTY, facility_name.getValue());
//        query.setQualifier(exp1);
//        Expression exp2 = ExpressionFactory.noMatchDbExp(
//            EipMFacility.FACILITY_ID_PK_COLUMN, Integer.valueOf(facilityid));
//        query.andQualifier(exp2);
//      }
//
//      if (dataContext.performQuery(query).size() != 0) {
//        msgList.add("有給付与名『 <span class='em'>" + facility_name.toString()
//            + "</span> 』は既に登録されています。");
//      }
//    } catch (Exception ex) {
//      logger.error("Exception", ex);
//      return false;
//    }
//
//    // 有給付与名
//    facility_name.validate(msgList);
//    // メモ
//    note.validate(msgList);
//    return (msgList.size() == 0);
//
//  }
//
//  /**
//   * 有給付与をデータベースから読み出します。 <BR>
//   * 
//   * @param rundata
//   * @param context
//   * @param msgList
//   * @return TRUE 成功 FALSE 失敗
//   * @see com.aimluck.eip.common.ALAbstractFormData#loadFormData(org.apache.turbine.util.RunData,
//   *      org.apache.velocity.context.Context)
//   */
//  protected boolean loadFormData(RunData rundata, Context context,
//      ArrayList msgList) {
//    try {
//      // オブジェクトモデルを取得
//      EipMFacility facility = PaidHolidayListUtils.getEipMFacility(rundata, context);
//      if (facility == null)
//        return false;
//      // 有給付与名
//      facility_name.setValue(facility.getFacilityName());
//      // メモ
//      note.setValue(facility.getNote());
//    } catch (Exception ex) {
//      logger.error("Exception", ex);
//      return false;
//    }
//    return true;
//  }
//
//  /**
//   * 有給付与をデータベースから削除します。 <BR>
//   * 
//   * @param rundata
//   * @param context
//   * @param msgList
//   * @return TRUE 成功 FALSE 失敗
//   * @see com.aimluck.eip.common.ALAbstractFormData#deleteFormData(org.apache.turbine.util.RunData,
//   *      org.apache.velocity.context.Context)
//   */
//  protected boolean deleteFormData(RunData rundata, Context context,
//      ArrayList msgList) {
//    try {
//      // オブジェクトモデルを取得
//      EipMFacility facility = PaidHolidayListUtils.getEipMFacility(rundata, context);
//      if (facility == null)
//        return false;
//
//      SelectQuery query1 = new SelectQuery(EipTScheduleMap.class);
//      Expression exp1 = ExpressionFactory.matchExp(
//          EipTScheduleMap.USER_ID_PROPERTY, facility.getFacilityId());
//      Expression exp2 = ExpressionFactory.matchExp(
//          EipTScheduleMap.TYPE_PROPERTY, "F");
//      query1.setQualifier(exp1.andExp(exp2));
//
//      List slist = dataContext.performQuery(query1);
//      if (slist != null && slist.size() > 0) {
//        // 有給付与のスケジュールを削除
//        dataContext.deleteObjects(slist);
//      }
//      // 有給付与を削除
//      dataContext.deleteObject(facility);
//      dataContext.commitChanges();
//      // orm.doDelete(facility);
//    } catch (Exception ex) {
//      logger.error("Exception", ex);
//      return false;
//    }
//    return true;
//  }
//
//  /**
//   * 有給付与をデータベースに格納します。 <BR>
//   * 
//   * @param rundata
//   * @param context
//   * @param msgList
//   * @return TRUE 成功 FALSE 失敗
//   * @see com.aimluck.eip.common.ALAbstractFormData#insertFormData(org.apache.turbine.util.RunData,
//   *      org.apache.velocity.context.Context, java.util.ArrayList)
//   */
//  protected boolean insertFormData(RunData rundata, Context context,
//      ArrayList msgList) {
//    try {
//      // 新規オブジェクトモデル
//      EipMFacility facility = (EipMFacility) dataContext
//          .createAndRegisterNewObject(EipMFacility.class);
//      // ユーザID
//      facility.setUserId(Integer.valueOf(userId));
//      // 有給付与名
//      facility.setFacilityName(facility_name.getValue());
//      // メモ
//      facility.setNote(note.getValue());
//      // 作成日
//      facility.setCreateDate(Calendar.getInstance().getTime());
//      // 更新日
//      facility.setUpdateDate(Calendar.getInstance().getTime());
//
//      Group facility_group = JetspeedSecurity.getGroup("Facility");
//      EipFacilityGroup fg = (EipFacilityGroup) dataContext
//          .createAndRegisterNewObject(EipFacilityGroup.class);
//      fg.setEipMFacility(facility);
//      fg.setTurbineGroup((TurbineGroup) facility_group);
//
//      // 有給付与を登録
//      dataContext.commitChanges();
//    } catch (Exception ex) {
//      logger.error("Exception", ex);
//      return false;
//    }
//    return true;
//  }
//
//  /**
//   * データベースに格納されている有給付与を更新します。 <BR>
//   * 
//   * @param rundata
//   * @param context
//   * @param msgList
//   * @return TRUE 成功 FALSE 失敗
//   * @see com.aimluck.eip.common.ALAbstractFormData#updateFormData(org.apache.turbine.util.RunData,
//   *      org.apache.velocity.context.Context, java.util.ArrayList)
//   */
//  protected boolean updateFormData(RunData rundata, Context context,
//      ArrayList msgList) {
//    try {
//      // オブジェクトモデルを取得
//      EipMFacility facility = PaidHolidayListUtils.getEipMFacility(rundata, context);
//      if (facility == null)
//        return false;
//
//      // 有給付与名
//      facility.setFacilityName(facility_name.getValue());
//      // メモ
//      facility.setNote(note.getValue());
//      // 更新日
//      facility.setUpdateDate(Calendar.getInstance().getTime());
//
//      // 有給付与を更新
//      dataContext.commitChanges();
//    } catch (Exception ex) {
//      logger.error("Exception", ex);
//      return false;
//    }
//    return true;
//  }
//
//  /**
//   * メモを取得します。 <BR>
//   * 
//   * @return
//   */
//  public ALStringField getNote() {
//    return note;
//  }
//
//  /**
//   * 有給付与名を取得します。 <BR>
//   * 
//   * @return
//   */
//  public ALStringField getFacilityName() {
//    return facility_name;
//  }
//	
/*Delete 趙丹2011/01/26 End----  */	
	
/*Add 趙丹 2010/01/26 Start----  */
	  /** logger */
	  private static final JetspeedLogger logger = JetspeedLogFactoryService
	      .getLogger(PaidHolidayListFormData.class.getName());

	  /** 勤続年数 */
	  private ALStringField serve_years;

	  /** 付与日数 */
	  private ALStringField paid_holiday_days;
	  
	  

	  private String paidholidaylistid;

	  

	  private DataContext dataContext;

	  /**
	   * 
	   * @param action
	   * @param rundata
	   * @param context
	   * @see com.aimluck.eip.common.ALAbstractFormData#init(com.aimluck.eip.modules.actions.common.ALAction,
	   *      org.apache.turbine.util.RunData, org.apache.velocity.context.Context)
	   */
	  public void init(ALAction action, RunData rundata, Context context)
	      throws ALPageNotFoundException, ALDBErrorException {
	    super.init(action, rundata, context);

	    dataContext = DatabaseOrmService.getInstance().getDataContext();
        paidholidaylistid = ALEipUtils.getTemp(rundata, context,
	            ALEipConstants.ENTITY_ID);
	      
	  }

	  /**
	   * 各フィールドを初期化します。 <BR>
	   * 
	   * @see com.aimluck.eip.common.ALData#initField()
	   */
	  public void initField() {
		
	    // 勤続年数
		serve_years = new ALStringField();
		serve_years.setFieldName("勤続年数");
		
	    // 付与日数
		paid_holiday_days = new ALStringField();
		paid_holiday_days.setFieldName("付与日数");
		
		

		
	  }

	  /**
	   * 有給付与の各フィールドに対する制約条件を設定します。 <BR>
	   * 
	   * @see com.aimluck.eip.common.ALAbstractFormData#setValidator()
	   */
	  protected void setValidator() {
	    // 勤続年数必須項目
		serve_years.setNotNull(true);
		// 付与日数必須項目
		paid_holiday_days.setNotNull(true);
	    // 勤続年数の文字数制限
		serve_years.limitMaxLength(100);
	    // 付与日数文字数制限
		paid_holiday_days.limitMaxLength(100);
	  }

	  /**
	   * 
	   * @param rundata
	   * @param context
	   * @param msgList
	   * @return
	   * @see com.aimluck.eip.common.ALAbstractFormData#setFormData(org.apache.turbine.util.RunData,
	   *      org.apache.velocity.context.Context, java.util.ArrayList)
	   */
	  protected boolean setFormData(RunData rundata, Context context,
	      ArrayList msgList) throws ALPageNotFoundException, ALDBErrorException {
	    boolean res = super.setFormData(rundata, context, msgList);
	    try {
	      if (res) {
	        if (ALEipConstants.MODE_UPDATE.equals(getMode())) {
	          paidholidaylistid = ALEipUtils.getTemp(rundata, context,
		              ALEipConstants.ENTITY_ID);
	        }
	      }
	    } catch (Exception ex) {
	      logger.error("Exception", ex);
	      res = false;
	    }
	    return res;
	  }

	  /**
	   * 有給付与のフォームに入力されたデータの妥当性検証を行います。 <BR>
	   * 
	   * @param msgList
	   * @return TRUE 成功 FALSE 失敗
	   * @see com.aimluck.eip.common.ALAbstractFormData#validate(java.util.ArrayList)
	   */
	  protected boolean validate(ArrayList msgList) {
	    try {
	      SelectQuery query = new SelectQuery(ImwMPaidHolidayList.class);
	      if (ALEipConstants.MODE_INSERT.equals(getMode())) {
	        Expression exp = ExpressionFactory.matchExp(
	        		ImwMPaidHolidayList.SERVE_YEARS_PROPERTY, serve_years.getValue());
	        Expression exp1 = ExpressionFactory.matchExp(
		        	ImwMPaidHolidayList.PAID_HOLIDAY_DAYS_PROPERTY,paid_holiday_days.getValue());
		       
	        query.setQualifier(exp.andExp(exp1));
	      } else if (ALEipConstants.MODE_UPDATE.equals(getMode())) {
	    	Expression exp1 = ExpressionFactory.matchExp(
	    			ImwMPaidHolidayList.SERVE_YEARS_PROPERTY, serve_years.getValue());	 
	    	query.setQualifier(exp1);
	    	Expression exp2 = ExpressionFactory.matchDbExp(
	    			ImwMPaidHolidayList.PAID_HOLIDAY_DAYS_PROPERTY, paid_holiday_days.getValue());	
	    	query.andQualifier(exp2);
	        Expression exp3 = ExpressionFactory.noMatchDbExp(
	        		ImwMPaidHolidayList.PAID_HOLIDAY_LIST_ID_PK_COLUMN, Integer.valueOf(paidholidaylistid));
	        query.andQualifier(exp3);
	      }


	    } catch (Exception ex) {
	      logger.error("Exception", ex);
	      return false;
	    }

	    // 勤続年数
	    serve_years.validate(msgList);
	    // 付与日数
	    paid_holiday_days.validate(msgList);
	    
	   
	    return (msgList.size() == 0);

	  }

	  /**
	   * 有給付与をデータベースから読み出します。 <BR>
	   * 
	   * @param rundata
	   * @param context
	   * @param msgList
	   * @return TRUE 成功 FALSE 失敗
	   * @see com.aimluck.eip.common.ALAbstractFormData#loadFormData(org.apache.turbine.util.RunData,
	   *      org.apache.velocity.context.Context)
	   */
	  protected boolean loadFormData(RunData rundata, Context context,
	      ArrayList msgList) {
	    try {
	      // オブジェクトモデルを取得
	      ImwMPaidHolidayList paidholidaylist = PaidHolidayListUtils.getImwMPaidHolidayList(rundata, context);
	      if (paidholidaylist == null)
	        return false;
	      paidholidaylistid=String.valueOf(paidholidaylist.getPaidHolidayListId());
	      // 勤続年数
	      serve_years.setValue(String.valueOf(paidholidaylist.getServeYears()));
	      // 付与日数
	      paid_holiday_days.setValue(String.valueOf(paidholidaylist.getPaidHolidayDays()));
	      
	      
	    } catch (Exception ex) {
	      logger.error("Exception", ex);
	      return false;
	    }
	    return true;
	  }

	  /**
	   * 有給付与をデータベースから削除します。 <BR>
	   * 
	   * @param rundata
	   * @param context
	   * @param msgList
	   * @return TRUE 成功 FALSE 失敗
	   * @see com.aimluck.eip.common.ALAbstractFormData#deleteFormData(org.apache.turbine.util.RunData,
	   *      org.apache.velocity.context.Context)
	   */
	  protected boolean deleteFormData(RunData rundata, Context context,
	      ArrayList msgList) {
	    try {
	      // オブジェクトモデルを取得
	      ImwMPaidHolidayList paidholidaylist = PaidHolidayListUtils.getImwMPaidHolidayList(rundata, context);
	      if (paidholidaylist == null)
	        return false;

	      SelectQuery query = new SelectQuery(ImwMPaidHolidayList.class);
	      Expression exp = ExpressionFactory.matchDbExp(ImwMPaidHolidayList.PAID_HOLIDAY_LIST_ID_PK_COLUMN, paidholidaylist.getPaidHolidayListId());
          query.setQualifier(exp);
	      List slist = dataContext.performQuery(query);
	      if (slist != null && slist.size() > 0) {
	        // 有給付与のスケジュールを削除
	        dataContext.deleteObjects(slist);
	      }
	      // 有給付与を削除
	      dataContext.deleteObject(paidholidaylist);
	      dataContext.commitChanges();
	      // orm.doDelete(facility);
	    } catch (Exception ex) {
	      logger.error("Exception", ex);
	      return false;
	    }
	    return true;
	  }

	  /**
	   * 有給付与をデータベースに格納します。 <BR>
	   * 
	   * @param rundata
	   * @param context
	   * @param msgList
	   * @return TRUE 成功 FALSE 失敗
	   * @see com.aimluck.eip.common.ALAbstractFormData#insertFormData(org.apache.turbine.util.RunData,
	   *      org.apache.velocity.context.Context, java.util.ArrayList)
	   */
	  protected boolean insertFormData(RunData rundata, Context context,
	      ArrayList msgList) {
	    try {
	      // 新規オブジェクトモデル
	     
	    	 
	      ImwMPaidHolidayList paidholidaylist = (ImwMPaidHolidayList) dataContext
	      .createAndRegisterNewObject(ImwMPaidHolidayList.class);
	      // ユーザID
//	     paidholidaylist.setPaidHolidayListId(Integer.valueOf(paidholidaylistid));
	      // 有給付与名
	      paidholidaylist.setServeYears(Integer.valueOf(serve_years.getValue()));
	      // メモ
	      paidholidaylist.setPaidHolidayDays(Integer.valueOf(paid_holiday_days.getValue()));
	     
	      paidholidaylist.setUpdateDate(Calendar.getInstance().getTime());
	      
	      paidholidaylist.setCreateDate(Calendar.getInstance().getTime());



	      // 有給付与を登録
	      dataContext.commitChanges();
	    } catch (Exception ex) {
	      logger.error("Exception", ex);
	      return false;
	    }
	    return true;
	  }

	  /**
	   * データベースに格納されている有給付与を更新します。 <BR>
	   * 
	   * @param rundata
	   * @param context
	   * @param msgList
	   * @return TRUE 成功 FALSE 失敗
	   * @see com.aimluck.eip.common.ALAbstractFormData#updateFormData(org.apache.turbine.util.RunData,
	   *      org.apache.velocity.context.Context, java.util.ArrayList)
	   */
	  protected boolean updateFormData(RunData rundata, Context context,
	      ArrayList msgList) {
	    try {
	      // オブジェクトモデルを取得
	      ImwMPaidHolidayList paidholidaylist = PaidHolidayListUtils.getImwMPaidHolidayList(rundata, context);
	      if (paidholidaylist == null)
	        return false;

	      // 有給付与名
	      paidholidaylist.setServeYears(Integer.valueOf(serve_years.getValue()));
	      
	      // メモ
	      paidholidaylist.setPaidHolidayDays(Integer.valueOf(paid_holiday_days.getValue()));
	      
          paidholidaylist.setUpdateDate(Calendar.getInstance().getTime());
	      
	      paidholidaylist.setCreateDate(Calendar.getInstance().getTime());
	
	      // 有給付与を更新
	      dataContext.commitChanges();
	    } catch (Exception ex) {
	      logger.error("Exception", ex);
	      return false;
	    }
	    return true;
	  }

	  /**
	   * メモを取得します。 <BR>
	   * 
	   * @return
	   */
	  public ALStringField getPaidHolidayDays() {
	    return paid_holiday_days;
	  }
      public String getStringPaidHolidayDays(){
    	  return paid_holiday_days.getValue()+".0";
      }
	  /**
	   * 有給付与名を取得します。 <BR>
	   * 
	   * @return
	   */
	  public ALStringField getServeYears() {
	    return serve_years;
	  }
	  public String getStringServeYears(){
		  return serve_years.getValue();
	  }
/*Add 趙丹 2010/01/26 End----  */

}
