/*******************************************************************************
*	All Rights reserved,Copyright (c) K-Opticom
********************************************************************************
*＜プログラム内容＞
*	システム名		：eo顧客基幹システム
*	モジュール名	：JESC0121B010TPMA
*	ソースファイル名：JESC0121B010TPMA.java
*	作成者			：EK909733
*	日付			：2011年10月05日
*＜機能概要＞
*	SPOT送受信オーダ一覧照会の単関連チェック部品です。
*＜修正履歴＞
*	バージョン	修正日		修正者		修正内容
*	ｖ1.00.00
*
********************************************************************************/

package eo.ejb.cbs.mainproc;


import java.text.DateFormat;
import java.text.ParseException;
import java.util.Date;
import com.fujitsu.futurity.model.base.CAANMsg;
import com.fujitsu.futurity.model.ejb.common.JSYejbLog;
import com.fujitsu.futurity.model.ejb.common.StatusCodes;
import com.fujitsu.futurity.model.ejb.common.fw.AgentDispatchContext;
import com.fujitsu.futurity.model.ejb.common.fw.TemplateMainHandler;
import eo.ejb.cbs.cbsmsg.ESC0121B010CBSMsg;


/**
 * <HR>
 * SPOT送受信オーダ一覧照会の単関連チェック用クラス｡ <p>
 * 
 * 以下の機能をサポートする。
 * <ul>
 * <li>SPOT送受信オーダ一覧照会CBSMsgの単関連をチェックする。
 * </ul>
 * <p>
 * <HR>
 * <p>
 */ 
public class JESC0121B010TPMA implements TemplateMainHandler 
{

	/**
	 * JESC0101B020TPMA単関連をチェックする。<br>
	 * 
	 * JESC0101B020TPMA単関連をチェックする。
	 * <p>
	 * @param	inCBSMsg	CBSMsgメッセージ
	 * @param	inContext	Agent
	 */
	public void invoke(CAANMsg inCBSMsg, AgentDispatchContext inContext) 
	{

		JSYejbLog.println(JSYejbLog.DEBUG,this.getClass(),"JSYejbESC0102B010_01TKCK#invoke start");

		// 日付がすべて未入力の場合は何もチェックしない
		if (isDateNull(inCBSMsg)) 
		{
			return;
		}

		// 年月日がすべて入力されているかチェック
		if ( !checkRequiredItems(inCBSMsg) ) 
		{
			return;
		}

		// 正しい日付かチェック
		checkCorrectDate(inCBSMsg);
		
		JSYejbLog.println(JSYejbLog.DEBUG,this.getClass(),"iJSYejbESC0102B010_01TKCK#invoke end");
	}

	/**
	 * 日時年、日時月、日時日が入力されているか調べます。
	 * 
	 * @param inCBSMsg CAANMsg
	 * @return 年月日すべてが未入力の場合true
	 */
	private boolean isDateNull(CAANMsg inCBSMsg) 
	{
		String year = getString(inCBSMsg, ESC0121B010CBSMsg.KEY_DATE_YEAR);
		String month = getString(inCBSMsg, ESC0121B010CBSMsg.KEY_DATE_MON);
		String day = getString(inCBSMsg, ESC0121B010CBSMsg.KEY_DATE_DAY);

		return isNullOrBlank(year) && isNullOrBlank(month) && isNullOrBlank(day);
	}
	
	/**
	 * 日時年、日時月、日時日の入力チェックを行います。
	 * 入力されていない項目のエラーフラグをE5に設定します。
	 * 
	 * @param inCBSMsg CAANMsg
	 * @return 日時年、日時月、日時日が全て入力されている場合true
	 */
	private boolean checkRequiredItems(CAANMsg inCBSMsg) 
	{
		boolean isOk = true;
		
		String year = getString(inCBSMsg, ESC0121B010CBSMsg.KEY_DATE_YEAR);
		if (isNullOrBlank(year)) 
		{
			inCBSMsg.set(ESC0121B010CBSMsg.KEY_DATE_YEAR_ERR, "E5");
			isOk = false;
		}

		String month = getString(inCBSMsg, ESC0121B010CBSMsg.KEY_DATE_MON);
		if (isNullOrBlank(month)) 
		{
			inCBSMsg.set(ESC0121B010CBSMsg.KEY_DATE_MON_ERR, "E5");
			isOk =  false;
		}
		
		String day = getString(inCBSMsg, ESC0121B010CBSMsg.KEY_DATE_DAY);
		if (isNullOrBlank(day)) 
		{
			inCBSMsg.set(ESC0121B010CBSMsg.KEY_DATE_DAY_ERR, "E5");
			isOk = false;
		}
		
		if (!isOk) 
		{
			inCBSMsg.set(ESC0121B010CBSMsg.STATUS, StatusCodes.ITEM_RELATION_ERR);
		}
		
		return isOk;
	}
	
	/**
	 * 正しい日付かどうかチェックします。エラーの場合はエラーコードがセットされます。
	 * @param inCBSMsg
	 * @return 正しい日付の場合true
	 */
	private boolean checkCorrectDate(CAANMsg inCBSMsg) 
	{
		try 
		{
			String year = getString(inCBSMsg, ESC0121B010CBSMsg.KEY_DATE_YEAR);
			String month = getString(inCBSMsg, ESC0121B010CBSMsg.KEY_DATE_MON);
			String day = getString(inCBSMsg, ESC0121B010CBSMsg.KEY_DATE_DAY);

			DateFormat df = DateFormat.getDateInstance();
			df.setLenient(false);
			Date date = df.parse(year + "/" + month + "/" + day);
			
			JSYejbLog.println(JSYejbLog.DEBUG,this.getClass(),"date=" + date.toString());
			return true;
		} 
		catch (ParseException e) 
		{
			inCBSMsg.set(ESC0121B010CBSMsg.KEY_DATE_YEAR_ERR, "E5");
			inCBSMsg.set(ESC0121B010CBSMsg.KEY_DATE_MON_ERR, "E5");
			inCBSMsg.set(ESC0121B010CBSMsg.KEY_DATE_DAY_ERR, "E5");
			inCBSMsg.set(ESC0121B010CBSMsg.STATUS, StatusCodes.ITEM_RELATION_ERR);
		
			JSYejbLog.println(JSYejbLog.DEBUG,this.getClass(),"date_year_err:E5");
			return false;
		}
	}
	
	private String getString(CAANMsg inCBSMsg, String key) 
	{
		return (String)inCBSMsg.getObject(key);
	}

	private boolean isNullOrBlank(String str) 
	{
		return str == null || str.trim().length() == 0;
	}

}
