/*********************************************************************
* All Rights reserved,Copyright (c) K-Opticom
**********************************************************************
*＜プログラム内容＞
*   システム名      ：eo顧客基幹システム
*   モジュール名    ：DKW04202SFLogic
*   ソースファイル名：DKW04202SFLogic.java
*   作成者          ：富士通
*   日付            ：2011年08月22日
*＜機能概要＞
*   発注訂正画面のビューロジックです。
*＜修正履歴＞
*   バージョン  修正日       修正者      修正内容
*   v1.00.00    2011/05/19   FJ）河野(拓)    新規作成
*
**********************************************************************/
package eo.web.webview.DKW04202SF;

import static com.fujitsu.futurity.web.x31.X31SWebLog.DEBUG_LOG;

import java.util.HashMap;

import com.fujitsu.futurity.web.x31.X31CMessageResult;
import com.fujitsu.futurity.web.x31.X31CWebConst;
import com.fujitsu.futurity.web.x31.X31SDataBeanAccess;
import com.fujitsu.futurity.web.x31.X31SDataBeanAccessArray;

import eo.common.constant.JPCModelConstant;
import eo.common.constant.JPCOnlineMessageConstant;
import eo.common.util.JCCFrameworkException;
import eo.common.util.JDKCommonUtil;
import eo.web.webview.JCCWebBusinessLogic;
import eo.web.webview.CommonInfoCF.CommonInfoCFConst;
import eo.web.webview.common.JCCWebCommon;
import eo.web.webview.common.JDKScreenConst;
import eo.web.webview.common.JDKWebCommon;
import eo.web.webview.common.JZMWebConst;
import eo.web.webview.mapping.DKSV0067_DKSV0067OPDBMapper;
import eo.web.webview.mapping.DKSV0071_DKSV0071OPDBMapper;
import eo.web.webview.mapping.DKSV0075_DKSV0075OPDBMapper;
import eo.web.webview.mapping.DKSV0096_DKSV0096OPDBMapper;


/**
 * DKW04101のビューロジック
 * <BR>
 * @author 富士通
 */
public class DKW04202SFLogic extends JCCWebBusinessLogic
{
	/**
	 * シリアルバージョン
	 */
	private static final long serialVersionUID = -387442983010999218L;

	/**
	 * サービスID（発注訂正初期表示）
	 */
	private static final String DKSV0067 = "DKSV0067";
	/**
	 * サービスID（発注取消訂正初期表示）
	 */
	private static final String DKSV0096 = "DKSV0096";
	/**
	 * サービスID（発注データ取消）
	 */
	private static final String DKSV0071 = "DKSV0071";
	/**
	 * サービスID（発注数量変更確定）
	 */
	private static final String DKSV0075 = "DKSV0075";

	/**
	 * 発注明細一意照会取得SC
	 */
	private static final String DKSV006701SC = "DKSV006701SC";
	/**
	 * 発注情報取得SC
	 */
	private static final String DKSV009601SC = "DKSV009601SC";
	/**
	 * 発注明細情報取得SC
	 */
	private static final String DKSV009602SC = "DKSV009602SC";

	/**
	 * イベント区分（訂正）
	 */
	private static final String EVENT_DIV_TEISE = "1";
	/**
	 * イベント区分（照会）
	 */
	private static final String EVENT_DIV_SHOKAI = "2";
	/**
	 * イベント区分（取消）
	 */
	private static final String EVENT_DIV_CANCEL = "3";
	
	/**
	 * 項目活性制御（非活性）
	 */
	private static final String KMK_ENABLE_CTRL_DISABLE = "true";
	
	/**
	 * 項目活性制御（活性化）
	 */
	private static final String KMK_ENABLE_CTRL_ENABLE = "false";

	/**
	 * メッセージ（発注データ）
	 */
	private static final String MSG_HATTCHU_DATA = "発注データ";
	/**
	 * メッセージ（発注明細データ）
	 */
	private static final String MSG_HATTCHU_DTL_DATA = "発注明細データ";
	/**
	 * メッセージ（発注訂正）
	 */
	private static final String MSG_HATTCHU_TEISE = "発注訂正";
	/**
	 * メッセージ（発注取消）
	 */
	private static final String MSG_HATTCHU_CANCEL = "発注取消";

	/**
	 * 初期表示処理を行います。
	 * <br>
	 * @return 処理の成否
	 * @throws Exception 例外
	 */
	public boolean init() throws Exception
	{
		// 画面情報を取得し、サービスフォームBeanに設定
		JCCWebCommon.getScreenInfo(this);

		// サービスフォームBeanのデータBeanアクセスクラスを取得。
		X31SDataBeanAccess serviceFormBean = super.getServiceFormBean();
		
		String eventDiv = JDKWebCommon.getData(serviceFormBean, DKW04202SFConst.EVENT_DIV);

		String screenId = JCCWebCommon.getScreenId(this);

		JDKWebCommon.setData(serviceFormBean, JCCWebCommon.getOpeDate(this, null), DKW04202SFConst.UNYO_YMD);

		// イベント区分が取消の場合
		if (EVENT_DIV_CANCEL.equals(eventDiv))
		{
			if (JDKScreenConst.SCREEN_ID_DKW04201.equals(screenId))
			{
				X31SDataBeanAccessArray enableCtrlInfoList = serviceFormBean.getDataBeanArray(DKW04202SFConst.ENABLE_CTRL_INFO);
				this.setDataToArray(enableCtrlInfoList, 0, DKW04202SFConst.FIX_BTN_ENABLE_CTRL_02, KMK_ENABLE_CTRL_ENABLE);

				// 発注取消訂正初期表示サービスを実行
				boolean ret = this.execDKSV0096(serviceFormBean);

				if (ret)
				{
					// 次画面で表示するメッセージを設定する
					JCCWebCommon.setMessageInfo(this, JPCOnlineMessageConstant.EKB0370__I, new String[] {MSG_HATTCHU_CANCEL});
				}

				JCCWebCommon.setScreenId(this, JDKScreenConst.SCREEN_ID_DKW04203, JDKScreenConst.SCREEN_ID_DKW04202);

				// 遷移先画面ＩＤの設定
				this.setNextScreen(JDKScreenConst.SCREEN_ID_DKW04203, JDKScreenConst.SCREEN_NAME_DKW04203);
				setTransferPageId(JDKScreenConst.SCREEN_ID_DKW04203 + JZMWebConst.PJP);
			}
			else
			{
				return true;
			}
		}
		else
		{
			X31SDataBeanAccessArray enableCtrlInfoList = serviceFormBean.getDataBeanArray(DKW04202SFConst.ENABLE_CTRL_INFO);
			if (EVENT_DIV_TEISE.equals(eventDiv))
			{
				this.setDataToArray(enableCtrlInfoList, 0, DKW04202SFConst.HATTCHU_CNT_ENABLE_CTRL_02, KMK_ENABLE_CTRL_ENABLE);
			}
			else
			{
				this.setDataToArray(enableCtrlInfoList, 0, DKW04202SFConst.HATTCHU_CNT_ENABLE_CTRL_02, KMK_ENABLE_CTRL_DISABLE);
			}

			// 発注訂正初期表示サービスを実行
			this.execDKSV0067(serviceFormBean);

			// 遷移先画面ＩＤの設定
			this.setNextScreen(JDKScreenConst.SCREEN_ID_DKW04202, JDKScreenConst.SCREEN_NAME_DKW04202);
		}

		X31SDataBeanAccess hattchuDtlBean = serviceFormBean.getDataBeanArray(DKW04202SFConst.HATTCHU_TYPE).getDataBean(0);
		JDKWebCommon.setData(this, JDKWebCommon.getData(hattchuDtlBean, DKW04202SFConst.HATTCHU_LOT_DTL_NO_01), 
				DKW04202SFConst.HATTCHU_LOT_DTL_NO);
		String taknkikiModelCd = JDKWebCommon.getData(hattchuDtlBean, DKW04202SFConst.TAKNKIKI_MODEL_CD_01);
		String huzokuModelCd = JDKWebCommon.getData(hattchuDtlBean, DKW04202SFConst.HUZOKUHIN_MODEL_CD_01);
		String sethinCd = JDKWebCommon.getData(hattchuDtlBean, DKW04202SFConst.TAKNKIKI_SETHIN_MODEL_CD_01);
		String modelNo = "";
		if (!JDKCommonUtil.isNull(taknkikiModelCd))
		{
			modelNo = taknkikiModelCd;
		}
		else if (!JDKCommonUtil.isNull(huzokuModelCd))
		{
			modelNo = huzokuModelCd;
		}
		else if(!JDKCommonUtil.isNull(sethinCd))
		{
			modelNo = sethinCd;
		}
		JDKWebCommon.setData(this, modelNo, DKW04202SFConst.MODEL_NO);
		String taknkikiModelNm = JDKWebCommon.getData(hattchuDtlBean, DKW04202SFConst.TAKNKIKI_MODEL_NM_01);
		String huzokuModelNm = JDKWebCommon.getData(hattchuDtlBean, DKW04202SFConst.HUZOKUHIN_MODEL_NM_01);
		String sethinNm = JDKWebCommon.getData(hattchuDtlBean, DKW04202SFConst.TAKNKIKI_SETHIN_MODEL_NM_01);
		String goodsNm = "";
		if (!JDKCommonUtil.isNull(taknkikiModelNm))
		{
			goodsNm = taknkikiModelNm;
		}
		else if (!JDKCommonUtil.isNull(huzokuModelNm))
		{
			goodsNm = huzokuModelNm;
		}
		else if(!JDKCommonUtil.isNull(sethinNm))
		{
			goodsNm = sethinNm;
		}
		JDKWebCommon.setData(this, goodsNm, DKW04202SFConst.GOODS_NM);
		String updDtm = "";
		// イベント区分が取消の場合
		if (EVENT_DIV_CANCEL.equals(eventDiv))
		{
			X31SDataBeanAccess hattchuBean = serviceFormBean.getDataBeanArray(DKW04202SFConst.HATTCHU_INFO).getDataBean(0);
			updDtm = JDKWebCommon.getData(hattchuBean, DKW04202SFConst.UPD_DTM_03);
		}
		else
		{
			updDtm = JDKWebCommon.getData(hattchuDtlBean, DKW04202SFConst.UPD_DTM_01);
		}
		JDKWebCommon.setData(this, updDtm, DKW04202SFConst.LAST_UPD_DTM_BF);

		return true;
	}

	/**
	 * 発注訂正画面の確認ボタンを処理する。
	 * @return 成否
	 * @throws Exception 例外
	 */
	public boolean confirmCreate() throws Exception 
	{
		// サービスフォームBeanのデータBeanアクセスクラスを取得。
		X31SDataBeanAccess bean = super.getServiceFormBean();

		X31SDataBeanAccess hattchuDtlBean = bean.getDataBeanArray(DKW04202SFConst.HATTCHU_TYPE).getDataBean(0);
		JDKWebCommon.setData(this, JDKWebCommon.getData(hattchuDtlBean, DKW04202SFConst.HATTCHU_CNT_01), 
				DKW04202SFConst.HATTCHU_CNT);

		// 次画面で表示するメッセージを設定する
		JCCWebCommon.setMessageInfo(this, JPCOnlineMessageConstant.EKB0370__I, new String[] {MSG_HATTCHU_TEISE});

		//遷移先の画面IDを共有フォームBeanの項目に設定する。
		X31SDataBeanAccess commoninfoBean = super.getCommonInfoBean();

		commoninfoBean.sendMessageString(CommonInfoCFConst.NEXT_SCREEN_ID,
		X31CWebConst.DATABEAN_SET_VALUE, JDKScreenConst.SCREEN_ID_DKW04203);

		//遷移先の画面名を共有フォームBeanの項目に設定する。
		commoninfoBean.sendMessageString(CommonInfoCFConst.NEXT_SCREEN_NAME,
		X31CWebConst.DATABEAN_SET_VALUE, JDKScreenConst.SCREEN_NAME_DKW04203);
		
		return true;
		
	}

	/**
	 * 発注訂正画面の戻るボタンを処理する。
	 * @return 成否
	 * @throws Exception 例外
	 */
	public boolean returnList() throws Exception 
	{
		JCCWebCommon.setScreenId(this, JDKScreenConst.SCREEN_ID_DKW04201, JDKScreenConst.SCREEN_ID_DKW04202);

		this.setNextScreen(JDKScreenConst.SCREEN_ID_DKW04201, JDKScreenConst.SCREEN_NAME_DKW04201);

		return true;
	}

	/**
	 * 発注取消訂正画面の確認ボタンを処理する。
	 * @return 成否
	 * @throws Exception 例外
	 */
	public boolean fix() throws Exception 
	{
		// サービスフォームBeanのデータBeanアクセスクラスを取得。
		X31SDataBeanAccess serviceFormBean = super.getServiceFormBean();

		String eventDiv = JDKWebCommon.getData(this, DKW04202SFConst.EVENT_DIV);

		boolean ret = true;

		// 訂正の場合
		if (EVENT_DIV_TEISE.equals(eventDiv))
		{
			// 発注数量変更確定サービスを実行
			ret = this.execDKSV0075(serviceFormBean);

			if (ret)
			{
				// 次画面で表示するメッセージを設定する
				JCCWebCommon.setMessageInfo(this, JPCOnlineMessageConstant.EKB0380__I, new String[] {MSG_HATTCHU_TEISE});

				// 遷移先画面ＩＤの設定
				this.setNextScreen(JDKScreenConst.SCREEN_ID_DKW04204, JDKScreenConst.SCREEN_NAME_DKW04204);
			}
		}
		// 取消の場合
		else
		{
			// 発注データ取消サービスを実行
			ret = this.execDKSV0071(serviceFormBean);

			if (ret)
			{
				// 次画面で表示するメッセージを設定する
				JCCWebCommon.setMessageInfo(this, JPCOnlineMessageConstant.EKB0380__I, new String[] {MSG_HATTCHU_CANCEL});

				// 遷移先画面ＩＤの設定
				this.setNextScreen(JDKScreenConst.SCREEN_ID_DKW04204, JDKScreenConst.SCREEN_NAME_DKW04204);
			}
		}
		
		return ret;
		
	}

	/**
	 * 発注取消訂正確認画面の修正ボタンを処理する。
	 * @return 成否
	 * @throws Exception 例外
	 */
	public boolean modify() throws Exception 
	{
		JCCWebCommon.setScreenId(this, JDKScreenConst.SCREEN_ID_DKW04202, JDKScreenConst.SCREEN_ID_DKW04203);

		this.setNextScreen(JDKScreenConst.SCREEN_ID_DKW04202, JDKScreenConst.SCREEN_NAME_DKW04202);

		return true;
	}

	/**
	 * 発注取消訂正確認画面の戻るボタンを処理する。
	 * @return 成否
	 * @throws Exception 例外
	 */
	public boolean returnSearch() throws Exception 
	{
		JCCWebCommon.setScreenId(this, JDKScreenConst.SCREEN_ID_DKW04201, JDKScreenConst.SCREEN_ID_DKW04203);

		this.setNextScreen(JDKScreenConst.SCREEN_ID_DKW04201, JDKScreenConst.SCREEN_NAME_DKW04201);

		return true;
	}

	/**
	 * 発注取消訂正完了画面の完了ボタンを処理する。
	 * @return 成否
	 * @throws Exception 例外
	 */
	public boolean complete() throws Exception 
	{
		JCCWebCommon.setScreenId(this, JDKScreenConst.SCREEN_ID_DKW04201, JDKScreenConst.SCREEN_ID_DKW04204);

		this.setNextScreen(JDKScreenConst.SCREEN_ID_DKW04201, JDKScreenConst.SCREEN_NAME_DKW04201);

		return true;
	}

	/**
	 * 発注訂正初期表示サービスを実行する。
	 * @param bean サービスフォームビーン
	 * @return 成否
	 */
	@SuppressWarnings("unchecked")
	private boolean execDKSV0067(X31SDataBeanAccess bean)
	{
		// パラメータ作成
		X31SDataBeanAccess[] paramBean = {bean};

		// ユースケースID格納用マップを生成。
		HashMap paramMap = new HashMap();
		paramMap.put(X31CWebConst.TELEGRAM_INFO_USECASE_ID, DKSV0067);

		// マッピングクラスのインスタンスを生成
		DKSV0067_DKSV0067OPDBMapper mapper = new DKSV0067_DKSV0067OPDBMapper();
		HashMap dataMap = new HashMap();
		mapper.setDKSV006701SC(paramBean, dataMap, JPCModelConstant.FUNC_CD_2);

		// 検索結果格納用マップ
		HashMap outputMap = new HashMap();

		X31CMessageResult msgResult = invokeService(paramMap, dataMap, outputMap);
		if (msgResult != null) 
		{
			
			return false;
		}

		mapper.getDKSV006701SC(paramBean, outputMap);

		// 検索エラーフラグの取得
		String searchErrFlg = JCCWebCommon.getSearchErrFlg(DKSV006701SC, outputMap);
		if (JPCModelConstant.SEARCH_ERR_FLG_ZERO.equals(searchErrFlg))
		{
			// 検索結果が0件の場合の処理
			try
			{
				JCCWebCommon.setMessageInfo(this, JPCOnlineMessageConstant.EKB2190_KW, new String[] {MSG_HATTCHU_DATA});
			} 
			catch (JCCFrameworkException e1) 
			{
				return false;
			}
		}

		return true;
	}

	/**
	 * 発注取消訂正初期表示サービスを実行する。
	 * @param bean サービスフォームビーン
	 * @return 成否
	 */
	@SuppressWarnings("unchecked")
	private boolean execDKSV0096(X31SDataBeanAccess bean)
	{
		// パラメータ作成
		X31SDataBeanAccess[] paramBean = {bean};

		// ユースケースID格納用マップを生成。
		HashMap paramMap = new HashMap();
		paramMap.put(X31CWebConst.TELEGRAM_INFO_USECASE_ID, DKSV0096);

		// マッピングクラスのインスタンスを生成
		DKSV0096_DKSV0096OPDBMapper mapper = new DKSV0096_DKSV0096OPDBMapper();
		HashMap dataMap = new HashMap();
		mapper.setDKSV009601SC(paramBean, dataMap, JPCModelConstant.FUNC_CD_1);
		mapper.setDKSV009602SC(paramBean, dataMap, JPCModelConstant.FUNC_CD_2);

		// 検索結果格納用マップ
		HashMap outputMap = new HashMap();

		X31CMessageResult msgResult = invokeService(paramMap, dataMap, outputMap);
		if (msgResult != null) 
		{
			
			return false;
		}

		mapper.getDKSV009601SC(paramBean, outputMap);
		mapper.getDKSV009602SC(paramBean, outputMap);

		// 検索エラーフラグの取得
		String searchErrFlg = JCCWebCommon.getSearchErrFlg(DKSV009601SC, outputMap);
		if (JPCModelConstant.SEARCH_ERR_FLG_ZERO.equals(searchErrFlg))
		{
			// 検索結果が0件の場合の処理
			JCCWebCommon.setMessageInfo(this, "EKB2190-KW", new String[] {MSG_HATTCHU_DATA});
			// 確定ボタンを非活性にする
			X31SDataBeanAccessArray enableCtrlInfoList = bean.getDataBeanArray(DKW04202SFConst.ENABLE_CTRL_INFO);
			this.setDataToArray(enableCtrlInfoList, 0, DKW04202SFConst.FIX_BTN_ENABLE_CTRL_02, KMK_ENABLE_CTRL_DISABLE);
			return false;
		}

		searchErrFlg = JCCWebCommon.getSearchErrFlg(DKSV009602SC, outputMap);
		if (JPCModelConstant.SEARCH_ERR_FLG_ZERO.equals(searchErrFlg))
		{
			// 検索結果が0件の場合の処理
			JCCWebCommon.setMessageInfo(this, "EKB2190-KW", new String[] {MSG_HATTCHU_DTL_DATA});
			// 確定ボタンを非活性にする
			X31SDataBeanAccessArray enableCtrlInfoList = bean.getDataBeanArray(DKW04202SFConst.ENABLE_CTRL_INFO);
			this.setDataToArray(enableCtrlInfoList, 0, DKW04202SFConst.FIX_BTN_ENABLE_CTRL_02, KMK_ENABLE_CTRL_DISABLE);
			return false;
		}

		return true;
	}

	/**
	 * 発注数量変更確定サービスを実行する。
	 * @param bean サービスフォームビーン
	 * @return 成否
	 */
	@SuppressWarnings("unchecked")
	private boolean execDKSV0075(X31SDataBeanAccess bean)
	{
		// パラメータ作成
		X31SDataBeanAccess[] paramBean = {bean};

		// ユースケースID格納用マップを生成。
		HashMap paramMap = new HashMap();
		paramMap.put(X31CWebConst.TELEGRAM_INFO_USECASE_ID, DKSV0075);

		// マッピングクラスのインスタンスを生成
		DKSV0075_DKSV0075OPDBMapper mapper = new DKSV0075_DKSV0075OPDBMapper();
		HashMap dataMap = new HashMap();
		mapper.setDKSV007501SC(paramBean, dataMap, JPCModelConstant.FUNC_CD_1);

		// 実行結果格納用マップ
		HashMap outputMap = new HashMap();

		// サービス実行
		invokeService(paramMap, dataMap, outputMap);

		return true;
	}

	/**
	 * 発注データ取消サービスを実行する。
	 * @param bean サービスフォームビーン
	 * @return 成否
	 */
	@SuppressWarnings("unchecked")
	private boolean execDKSV0071(X31SDataBeanAccess bean)
	{
		// パラメータ作成
		X31SDataBeanAccess[] paramBean = {bean};

		// ユースケースID格納用マップを生成。
		HashMap paramMap = new HashMap();
		paramMap.put(X31CWebConst.TELEGRAM_INFO_USECASE_ID, DKSV0071);

		// マッピングクラスのインスタンスを生成
		DKSV0071_DKSV0071OPDBMapper mapper = new DKSV0071_DKSV0071OPDBMapper();
		HashMap dataMap = new HashMap();
		mapper.setDKSV007101SC(paramBean, dataMap, JPCModelConstant.FUNC_CD_1);

		// 実行結果格納用マップ
		HashMap outputMap = new HashMap();

		// サービス実行
		invokeService(paramMap, dataMap, outputMap);

		return true;
	}

	/**
	 * 画面遷移先を設定します。
	 * @param nextScreenId 遷移先画面ＩＤ
	 * @param nextScreenName 遷移先画面名
	 */
	private void setNextScreen(String nextScreenId, String nextScreenName) 
	{
		X31SDataBeanAccess  commoninfoBean = super.getCommonInfoBean();

		commoninfoBean.sendMessageString(CommonInfoCFConst.NEXT_SCREEN_ID, X31CWebConst.DATABEAN_SET_VALUE, nextScreenId);
		commoninfoBean.sendMessageString(CommonInfoCFConst.NEXT_SCREEN_NAME, X31CWebConst.DATABEAN_SET_VALUE, nextScreenName);

		DEBUG_LOG.debug(String.format("%s(%s)へ遷移します", nextScreenName, nextScreenId));
	}

	/**
	 * リストにデータをセットします。
	 * @param list リストオブジェクト
	 * @param index インデックス
	 * @param key 項目ID
	 * @param value 値
	 */
	private void setDataToArray(X31SDataBeanAccessArray list, int index, String key, String value)
	{
		int cnt = list.getCount();
		X31SDataBeanAccess subbean = null;
		if (cnt > index)
		{
			subbean = list.getDataBean(index);
		}
		else
		{
			subbean = list.addDataBean();
		}
		subbean.sendMessageString(key, X31CWebConst.DATABEAN_SET_VALUE, value);
	}	
	
}
