/*********************************************************************
 * All Rights reserved,Copyright (c) K-Opticom
 **********************************************************************
 *＜プログラム内容＞
 *   システム名      ：eo顧客基幹システム
 *   モジュール名    ：DKW03701SFLogic
 *   ソースファイル名：DKW03701SFLogic.java
 *   作成者          ：富士通
 *   日付            ：2011年09月16日
 *＜機能概要＞
 *   新品機器SOD登録のビューロジックです。
 *＜修正履歴＞
 *   バージョン  修正日       修正者      修正内容
 *   v1.00.00    2011/09/16   FJ）        新規作成
 *	 v9.00.00    2014/08/04   FJ）窪田    OM-2014-0002359対応
 *	v47.00.00    2019/02/02   FJ）阪口    【ANK-3760-00-00】新品SOD処理不可対応
 *
 **********************************************************************/
package eo.web.webview.DKW03701SF;

import static com.fujitsu.futurity.web.x31.X31SWebLog.DEBUG_LOG;
import static eo.web.webview.common.JDKWebCommon.getData;

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.JDKStrConst;
import eo.common.constant.JPCModelConstant;
import eo.common.constant.JPCOnlineMessageConstant;
import eo.web.webview.JCCWebBusinessLogic;
import eo.web.webview.CommonInfoCF.CommonInfoCFConst;
import eo.web.webview.common.JCCMessageCache;
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.DKSV0044_DKSV0044OPDBMapper;
import eo.web.webview.mapping.DKSV0045_DKSV0045OPDBMapper;

import static eo.web.webview.DKW03701SF.DKW03701SFConst.*;

/**
 * 修理登録を処理するロジッククラスです。
 * 
 * @author 富士通
 */
public class DKW03701SFLogic extends JCCWebBusinessLogic
{
	/** シリアルバージョン */
	private static final long serialVersionUID = 1L;

	/**
	 * 初期表示処理
	 * <br>
	 * @return 成否
	 * @throws Exception 例外発生時
	 */
	@SuppressWarnings("unchecked")
	public boolean init() throws Exception
	{
		// 画面情報を取得し、サービスフォームBeanに設定
		String opeDate = JCCWebCommon.getOpeDate(this, null);

		// サービスフォームBeanのデータBeanアクセスクラスを取得
		X31SDataBeanAccess serviceFormBean = super.getServiceFormBean();

		X31SDataBeanAccess[] paramBean = { serviceFormBean };

		if (JCCWebCommon.getScreenId(this) != null)
		{
			// 物流保全番号の設定
			HashMap<String, Object> map = JCCWebCommon.getScreenInfo(this);
			String btryhoznNo = (String)map.get(JDKStrConst.BUTSURYUHOZEN_NO);
			paramBean[0].sendMessageString(DKW03701SFConst.BTRYHOZN_NO, X31CWebConst.DATABEAN_SET_VALUE, btryhoznNo);

			// 運用日付の設定
			serviceFormBean.sendMessageString(DKW03701SFConst.UNYO_YMD, X31CWebConst.DATABEAN_SET_VALUE, opeDate);
		}
		else
		{
			return true;
		}

		HashMap<String, String> paramMap = new HashMap<String, String>();
		HashMap<String, String> inputMap = new HashMap<String, String>();
		HashMap<String, String> outputMap = new HashMap<String, String>();

		// ユーズケースIDを設定
		paramMap.put(X31CWebConst.TELEGRAM_INFO_USECASE_ID, "DKSV0044");

		// サービス呼出処理
		DKSV0044_DKSV0044OPDBMapper mapper = new DKSV0044_DKSV0044OPDBMapper();
		mapper.setDKSV004401SC(paramBean, inputMap, JPCModelConstant.FUNC_CD_1);
		mapper.setDKSV004402SC(paramBean, inputMap, JPCModelConstant.FUNC_CD_1);
		mapper.setDKSV004403SC(paramBean, inputMap, JPCModelConstant.FUNC_CD_1);

		// サービス処理結果の判定
		X31CMessageResult msgResult = invokeService(paramMap, inputMap, outputMap);

		if (msgResult != null)
		{
			JCCWebCommon.setMessageInfo(this, msgResult);
			return true;
		}

		JCCMessageCache.setMessageCache();

		// サービス処理結果の取得
		mapper.getDKSV004401SC(paramBean, outputMap);
		mapper.getDKSV004402SC(paramBean, outputMap);
		mapper.getDKSV004403SC(paramBean, outputMap);

		// 遷移可否判断処理
		// 新品機器SOD情報.物流保全ステータスの取得
		X31SDataBeanAccess newKikiSODInfo = serviceFormBean.getDataBeanArray(DKW03701SFConst.NEW_KIKI_SOD_INFO).getDataBean(0);
		String btryhoznStat = getData(this, DKW03701SFConst.NEW_KIKI_SOD_INFO, DKW03701SFConst.BTRYHOZN_STAT_03);

		// 新品機器SOD情報.物流保全ステータスが
		// "001"（受付済み）でない場合かつ"004"（完了）でない場合は当機能を使用できない
		if(!JDKStrConst.BTRYHOZN_STAT_UKETSUKE.equals(btryhoznStat) && !JDKStrConst.BTRYHOZN_STAT_FIN.equals(btryhoznStat))
		{
			return toSearch(JCCWebCommon.getScreenId(this), JPCOnlineMessageConstant.EKB0810_NW, "データ", "新品機器SOD登録");
		}
		
		// 機器修理でかつ代替機不要な場合は当機能を使用できない
		if ("2".equals(getData(this, SHURI_JOKYO_INFO, SYOTI_DEV_01)) && "0".equals(getData(this, SHURI_JOKYO_INFO, DAITAI_KIKI_CD_01)))
		{
			return toSearch(JCCWebCommon.getScreenId(this), JPCOnlineMessageConstant.EKB0810_NW, "データ", "代替不要のため新品機器SOD登録は");
		}

		
		// OM-2014-0002359 ADD START
		// 機器提供サービス契約が締結済・サービス提供中以外の場合は当機能を使用できない
		String kktkSvcKeiStat = getData(this, DKW03701SFConst.NEW_KIKI_SOD_INFO, DKW03701SFConst.HUZOKUHIN_MODEL_CD_03);
		DEBUG_LOG.debug(String.format("機器提供サービス契約ステータス ：%s", kktkSvcKeiStat));
// ANK-3760-00-00 MOD START
//		if (!"100".equals(getData(this, DKW03701SFConst.NEW_KIKI_SOD_INFO, DKW03701SFConst.HUZOKUHIN_MODEL_CD_03)))
//		{
//			return toSearch(JCCWebCommon.getScreenId(this), JPCOnlineMessageConstant.EKB0810_NW, "データ", "機器契約がサービス提供中以外のため新品機器SOD登録は");
		if (!"030".equals(getData(this, DKW03701SFConst.NEW_KIKI_SOD_INFO, DKW03701SFConst.HUZOKUHIN_MODEL_CD_03))
				&& !"100".equals(getData(this, DKW03701SFConst.NEW_KIKI_SOD_INFO, DKW03701SFConst.HUZOKUHIN_MODEL_CD_03)))
		{
			return toSearch(JCCWebCommon.getScreenId(this), JPCOnlineMessageConstant.EKB0810_NW, "データ", "機器契約が締結済・サービス提供中以外のため新品機器SOD登録は");
		}
// ANK-3760-00-00 MOD END
		// OM-2014-0002359 ADD END

		X31SDataBeanAccessArray shuriRirekiList = serviceFormBean.getDataBeanArray(DKW03701SFConst.SHURI_RIREKI_LIST);
		for (int i = 0; i < shuriRirekiList.getCount(); i++)
		{
			X31SDataBeanAccess shuriRireki = shuriRirekiList.getDataBean(i);
			String btryhoznTaioCd = shuriRireki.sendMessageString(DKW03701SFConst.TAIO_DIV_CD_02, X31CWebConst.DATABEAN_GET_VALUE);
			// 物流保全対応コードが"02"（交換機器引渡済）のレコードが存在する
			if (JDKStrConst.BTRYHOZN_TAIO_CD_KIKI_HIKIWATASI_FIN.equals(btryhoznTaioCd))
			{
				String syotiDev = getData(this, DKW03701SFConst.SHURI_JOKYO_INFO, DKW03701SFConst.SYOTI_DEV_01);
				String daitaiKikiCd = getData(this, DKW03701SFConst.SHURI_JOKYO_INFO, DKW03701SFConst.DAITAI_KIKI_CD_01);
				// 物流保全コード(処置区分)が"2"（機器修理）で且つ代替機コードが"1"（代替機必要）である
				if("2".equals(syotiDev) && "1".equals(daitaiKikiCd))
				{
					return toSearch(JCCWebCommon.getScreenId(this), JPCOnlineMessageConstant.EKB0810_NW, "データ", "新品機器SOD登録");
				}
			}
		}
		
		// サービスフォームBean設定処理
		// 新品機器SOD情報.型番号に新品機器SOD情報.宅内機器型式コードまたは
		// 新品機器SOD情報.付属品型式コードのうち値が設定されているコード値を設定
		String modelNo = getData(this, DKW03701SFConst.NEW_KIKI_SOD_INFO, DKW03701SFConst.TAKNKIKI_MODEL_CD_03);
//		if ("".equals(modelNo))
//		{
//			modelNo = getData(this, DKW03701SFConst.NEW_KIKI_SOD_INFO, DKW03701SFConst.HUZOKUHIN_MODEL_CD_03);
//		}
		newKikiSODInfo.sendMessageString(DKW03701SFConst.MODEL_CD_03, X31CWebConst.DATABEAN_SET_VALUE, modelNo);

		// 新品機器SOD情報.異動区分に"00027"(機器故障対応)を設定
		newKikiSODInfo.sendMessageString(DKW03701SFConst.IDO_DIV_03, X31CWebConst.DATABEAN_SET_VALUE, "00027");

		// 新品機器SOD情報.返品区分に"1"(キャンセル品)を設定
		newKikiSODInfo.sendMessageString(DKW03701SFConst.HMPIN_DIV_03, X31CWebConst.DATABEAN_SET_VALUE, "1");

		// 新品機器SOD情報.返品元個別指定フラグに"0"(個別指定なし)を設定
		newKikiSODInfo.sendMessageString(DKW03701SFConst.HMPIN_MOTO_KSITEI_FLG_03, X31CWebConst.DATABEAN_SET_VALUE, "0");

		// 新品機器SOD情報.物流保全対応コードに"04"(新品SOD登録済み)を設定
		newKikiSODInfo.sendMessageString(DKW03701SFConst.BTRYHOZN_TAIO_CD_03, X31CWebConst.DATABEAN_SET_VALUE, JDKStrConst.BTRYHOZN_TAIO_CD_NEW_SOD_ADD_FIN);

		// 新品機器SOD情報.検証交換結果コードに"1"(未処理)を設定
		newKikiSODInfo.sendMessageString(DKW03701SFConst.KNSHOKKAN_RSLT_CD_03, X31CWebConst.DATABEAN_SET_VALUE, "1");

		X31SDataBeanAccess shuriJokyoInfo = serviceFormBean.getDataBeanArray(DKW03701SFConst.SHURI_JOKYO_INFO).getDataBean(0);

		// 修理状況情報.契約者表示名
		String keishaDispNm = JDKWebCommon.substr(getData(this, DKW03701SFConst.SHURI_JOKYO_INFO, DKW03701SFConst.KEISHA_NM_01), 0, 33);
		shuriJokyoInfo.sendMessageString(DKW03701SFConst.KEISHA_DISP_NM_01, X31CWebConst.DATABEAN_SET_VALUE, keishaDispNm);

		// 修理状況情報.メーカー表示名
		String mekaDispNm = JDKWebCommon.substr(getData(this, DKW03701SFConst.SHURI_JOKYO_INFO, DKW03701SFConst.MEKA_NM_01), 0, 10);
		shuriJokyoInfo.sendMessageString(DKW03701SFConst.MEKA_DISP_NM_01, X31CWebConst.DATABEAN_SET_VALUE, mekaDispNm);

		// 修理状況情報.機器契約区分表示名称
		String kikiKeiDevDispNm = JDKWebCommon.substr(getData(this, DKW03701SFConst.SHURI_JOKYO_INFO, DKW03701SFConst.KIKI_KEI_DEV_NM_01), 0, 10);
		shuriJokyoInfo.sendMessageString(DKW03701SFConst.KIKI_KEI_DEV_DISP_NM_01, X31CWebConst.DATABEAN_SET_VALUE, kikiKeiDevDispNm);

		// 修理状況情報.製造番号表示名
		String seizoNoDispNm = JDKWebCommon.substr(getData(this, DKW03701SFConst.SHURI_JOKYO_INFO, DKW03701SFConst.SEIZO_NO_01), 0, 20);
		shuriJokyoInfo.sendMessageString(DKW03701SFConst.SEIZO_NO_DISP_NM_01, X31CWebConst.DATABEAN_SET_VALUE, seizoNoDispNm);

		// 修理状況情報.保証区分表示名称
		String hoshoDivDispNm = JDKWebCommon.substr(getData(this, DKW03701SFConst.SHURI_JOKYO_INFO, DKW03701SFConst.HOSHO_DIV_NM_01), 0, 10);
		shuriJokyoInfo.sendMessageString(DKW03701SFConst.HOSHO_DIV_DISP_NM_01, X31CWebConst.DATABEAN_SET_VALUE, hoshoDivDispNm);

		// 修理状況情報.処置区分表示名称
		String syotiDevDispNm = JDKWebCommon.substr(getData(this, DKW03701SFConst.SHURI_JOKYO_INFO, DKW03701SFConst.SYOTI_DEV_NM_01), 0, 10);
		shuriJokyoInfo.sendMessageString(DKW03701SFConst.SYOTI_DEV_DISP_NM_01, X31CWebConst.DATABEAN_SET_VALUE, syotiDevDispNm);

		// 修理状況情報.受付者表示名
		String ukDispNm = JDKWebCommon.substr(getData(this, DKW03701SFConst.SHURI_JOKYO_INFO, DKW03701SFConst.UK_NM_01), 0, 17);
		shuriJokyoInfo.sendMessageString(DKW03701SFConst.UK_DISP_NM_01, X31CWebConst.DATABEAN_SET_VALUE, ukDispNm);

		// 修理状況情報.故障区分表示名称
		String troubleDivDispNm = JDKWebCommon.substr(getData(this, DKW03701SFConst.SHURI_JOKYO_INFO, DKW03701SFConst.TROUBLE_DIV_NM_01), 0, 17);
		shuriJokyoInfo.sendMessageString(DKW03701SFConst.TROUBLE_DIV_DISP_NM_01, X31CWebConst.DATABEAN_SET_VALUE, troubleDivDispNm);

		//X31SDataBeanAccessArray shuriRirekiList = serviceFormBean.getDataBeanArray(DKW03701SFConst.SHURI_RIREKI_LIST);

		for (int i = 0; i < shuriRirekiList.getCount(); i++)
		{
			X31SDataBeanAccess shuriRireki = shuriRirekiList.getDataBean(i);

			// 修理対応履歴.対応区分表示名称
			String taioDivDispNm = JDKWebCommon.substr(shuriRireki.sendMessageString(DKW03701SFConst.TAIO_DIV_NM_02, X31CWebConst.DATABEAN_GET_VALUE), 0, 11);
			shuriRireki.sendMessageString(DKW03701SFConst.TAIO_DIV_DISP_NM_02, X31CWebConst.DATABEAN_SET_VALUE, taioDivDispNm);

			// 修理対応履歴.社員表示名
			String syainDispNm = JDKWebCommon.substr(shuriRireki.sendMessageString(DKW03701SFConst.SYAIN_NM_02, X31CWebConst.DATABEAN_GET_VALUE), 0, 14);
			shuriRireki.sendMessageString(DKW03701SFConst.SYAIN_DISP_NM_02, X31CWebConst.DATABEAN_SET_VALUE, syainDispNm);

			// 修理対応履歴.特記事項表示名
			String tkjkDispNm = JDKWebCommon.substr(shuriRireki.sendMessageString(DKW03701SFConst.TKJK_02, X31CWebConst.DATABEAN_GET_VALUE), 0, 20);
			shuriRireki.sendMessageString(DKW03701SFConst.TKJK_DISP_NM_02, X31CWebConst.DATABEAN_SET_VALUE, tkjkDispNm);

			// 修理対応履歴.背景色を設定
			if (i % 2 == 1)
			{
				shuriRireki.sendMessageString(DKW03701SFConst.COLOR_02, X31CWebConst.DATABEAN_SET_VALUE, "even");
			}
			else
			{
				shuriRireki.sendMessageString(DKW03701SFConst.COLOR_02, X31CWebConst.DATABEAN_SET_VALUE, "odd");
			}
		}

		// 遷移先画面の設定
		setNextScreen(JDKScreenConst.SCREEN_ID_DKW03701, JDKScreenConst.SCREEN_NAME_DKW03701);

		return true;
	}

	/**
	 * 登録確認ボタン押下処理
	 * <br>
	 * @return 成否
	 * @throws Exception 例外発生時
	 */
	public boolean confirmCreate() throws Exception
	{
		// サービスフォームBeanのデータBeanアクセスクラスを取得
		X31SDataBeanAccess serviceFormBean = super.getServiceFormBean();

		X31SDataBeanAccess[] paramBean = { serviceFormBean };

		HashMap<String, String> paramMap = new HashMap<String, String>();
		HashMap<String, String> inputMap = new HashMap<String, String>();
		HashMap<String, String> outputMap = new HashMap<String, String>();

		// ユーズケースIDを設定
		paramMap.put(X31CWebConst.TELEGRAM_INFO_USECASE_ID, "DKSV0045");

		// サービス呼出処理
		DKSV0045_DKSV0045OPDBMapper mapper = new DKSV0045_DKSV0045OPDBMapper();
		mapper.setDKSV004501SC(paramBean, inputMap, JPCModelConstant.FUNC_CD_2);
		mapper.setDKSV004502SC(paramBean, inputMap, JPCModelConstant.FUNC_CD_2);
		mapper.setDKSV004503SC(paramBean, inputMap, JPCModelConstant.FUNC_CD_2);
		mapper.setDKSV004504SC(paramBean, inputMap, JPCModelConstant.FUNC_CD_2);
		mapper.setDKSV004505SC(paramBean, inputMap, JPCModelConstant.FUNC_CD_2);
		mapper.setDKSV004506SC(paramBean, inputMap, JPCModelConstant.FUNC_CD_2);

		// サービス処理結果の判定
		X31CMessageResult msgResult = invokeService(paramMap, inputMap, outputMap);

		if (msgResult != null)
		{
			JCCWebCommon.setMessageInfo(this, msgResult);
			return false;
		}

		// メッセージの設定
		JCCWebCommon.setMessageInfo(this, JPCOnlineMessageConstant.EKB0370__I, new String [] {"新品機器SOD登録"});

		// 遷移先画面の設定
		setNextScreen(JDKScreenConst.SCREEN_ID_DKW03702, JDKScreenConst.SCREEN_NAME_DKW03702);

		return true;
	}

	/**
	 * 戻るボタン押下処理
	 * <br>
	 * @return 成否
	 * @throws Exception 例外発生時
	 */
	public boolean returnList() throws Exception
	{
		// 遷移先画面の設定
		setNextScreen(JCCWebCommon.getScreenId(this), JZMWebConst.BLANK);

		return true;
	}

	/**
	 * 確定ボタン押下処理
	 * <br>
	 * @return 成否
	 * @throws Exception 例外発生時
	 */
	public boolean fix() throws Exception
	{
		// サービスフォームBeanのデータBeanアクセスクラスを取得
		X31SDataBeanAccess serviceFormBean = super.getServiceFormBean();

		X31SDataBeanAccess[] paramBean = { serviceFormBean };

		HashMap<String, String> paramMap = new HashMap<String, String>();
		HashMap<String, String> inputMap = new HashMap<String, String>();
		HashMap<String, String> outputMap = new HashMap<String, String>();

		// ユーズケースIDを設定
		paramMap.put(X31CWebConst.TELEGRAM_INFO_USECASE_ID, "DKSV0045");

		// サービス呼出処理
		DKSV0045_DKSV0045OPDBMapper mapper = new DKSV0045_DKSV0045OPDBMapper();
		mapper.setDKSV004501SC(paramBean, inputMap, JPCModelConstant.FUNC_CD_1);
		mapper.setDKSV004502SC(paramBean, inputMap, JPCModelConstant.FUNC_CD_1);
		mapper.setDKSV004503SC(paramBean, inputMap, JPCModelConstant.FUNC_CD_1);
		mapper.setDKSV004504SC(paramBean, inputMap, JPCModelConstant.FUNC_CD_1);
		mapper.setDKSV004505SC(paramBean, inputMap, JPCModelConstant.FUNC_CD_1);
		mapper.setDKSV004506SC(paramBean, inputMap, JPCModelConstant.FUNC_CD_1);

		// サービス処理結果の判定
		X31CMessageResult msgResult = invokeService(paramMap, inputMap, outputMap);

		if (msgResult != null)
		{
			JCCWebCommon.setMessageInfo(this, msgResult);
			return true;
		}

		// メッセージの設定
		JCCWebCommon.setMessageInfo(this, JPCOnlineMessageConstant.EKB0380__I, new String [] {"新品機器SOD登録"});

		// 遷移先画面の設定
		setNextScreen(JDKScreenConst.SCREEN_ID_DKW03703, JDKScreenConst.SCREEN_NAME_DKW03703);

		return true;
	}

	/**
	 * 修正ボタン押下処理
	 * <br>
	 * @return 成否
	 * @throws Exception 例外発生時
	 */
	public boolean modify() throws Exception
	{
		// 遷移先画面の設定
		setNextScreen(JDKScreenConst.SCREEN_ID_DKW03701, JDKScreenConst.SCREEN_NAME_DKW03701);

		return true;
	}

	/**
	 * 完了ボタン押下処理
	 * @return 成否
	 * @throws Exception 例外発生時
	 */
	public boolean complete() throws Exception
	{
		// 遷移先画面の設定
		setNextScreen(JCCWebCommon.getScreenId(this, JDKScreenConst.SCREEN_ID_DKW03701), JZMWebConst.BLANK);

		return true;
	}
	
	
	/**
	 * 一覧画面への遷移を行う
	 * @param screenId 一覧画面の画面ID
	 * @return 成否
	 */
	private boolean toSearch (String screenId, String errCd, String...errMsgs) 
	{
		JCCWebCommon.setMessageInfo(this, errCd, errMsgs);

		// 一覧画面に強制転送
		setNextScreen(screenId, JZMWebConst.BLANK);
		setTransferPageId(JCCWebCommon.getScreenId(this) + JZMWebConst.PJP);

		return true;
	}

	/**
	 * 画面遷移先を設定します。
	 * <br>
	 * @param nextScreenId 遷移先画面ID
	 * @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);
	}
}
