/*********************************************************************
* All Rights reserved,Copyright (c) K-Opticom
**********************************************************************
*＜プログラム内容＞
*   システム名      ：eo顧客基幹システム
*   モジュール名    ：KKA140SFLogic
*   ソースファイル名：KKA140SFLogic.java
*   作成者          ：富士通
*   日付            ：2011年05月27日
*＜機能概要＞
*   個人情報変更要求受付(API)のビューロジックです。
*＜修正履歴＞
*   バージョン  修正日       修正者      修正内容
*   v1.00.00    2011/05/27   FJ          新規作成
*   v3.00.00	2012/08/24   FJ          ST1-2012-0000339対応
*   v3.00.01	2012/09/05   FJ)団       業務処理名"Ｗｅｂ受付手動連携情報登録"→"個人情報変更要求受付"
*   v3.01.00    2012/09/06   FJ)強矢     ST1-2012-0000449対応
*   v4.00.00    2012/11/14   FJ)赤穂     ST1-2012-0000938対応
*   v17.00.00	2015/07/06	 FJ)河邊	 ANK-2557-00-00対応
*
**********************************************************************/
package eo.web.webview.KKA140SF;

import static com.fujitsu.futurity.web.x31.X31SWebLog.DEBUG_LOG;

import java.util.ArrayList;
import java.util.HashMap;

import com.fujitsu.futurity.web.x00.JCCWebServiceException;
import com.fujitsu.futurity.web.x31.X31CWebConst;
import com.fujitsu.futurity.web.x31.X31SDataBeanAccess;

import eo.common.util.JPCEditString;
import eo.web.webview.JCCWebBusinessLogic;
import eo.web.webview.common.JKKApiCommon;
import eo.web.webview.common.JKKCommonConst;
import eo.web.webview.mapping.KKSV0345_KKSV0345OPDBMapper;

/**
 * KKA140のビューロジックです。<p>
 * <BR>
 * @author 富士通
 */
@SuppressWarnings("serial")
public class KKA140SFLogic extends JCCWebBusinessLogic
{
	/**
	 * 業務処理名
	 */
	private static final String BUSINESS_LOGIC_NM = "個人情報変更要求受付";
	
	/**
	 * 項目名 （Web受付キーID）
	 */	
	private static final String WEB_KEYID = "WEB_KEYID";
	
	/**
	 * 項目名 （処理種別）
	 */
	private static final String SYR_SBT = "SYR_SBT";
	
	/**
	 * 項目名 （操作日時）
	 */
	private static final String SUS_NTZ = "SUS_NTZ";
	
	/**
	 * 項目名 （受付年月日）
	 */
	private static final String UKTK_YMD = "UKTK_YMD";
	
	/**
	 * 項目名 （サービス契約番号）
	 */
	private static final String OKYAKSM_ID = "OKYAKSM_ID";
	
	/**
	 * 処理済フラグ
	 */
	private static final String SYRZM_FRG = "SYRZM_FRG";
	
	/**
	 * 項目名 （処理日）
	 */
	private static final String SYR_NTZ = "SYR_NTZ";

	/**
	 * 項目名 （作成プログラムＩＤ）
	 */
	private static final String SKSI_PRGRM_ID = "SKSI_PRGRM_ID";

	/**
	 * 項目名 （レコード作成者）
	 */
	private static final String RKD_SKSI_SHA = "RKD_SKSI_SHA";
	
	/**
	 * 項目名 （レコード作成日時）
	 */
	private static final String RKD_SKSI_NTZ = "RKD_SKSI_NTZ";
	
	/**
	 * 項目名 （レコード更新日時）
	 */
	private static final String RKD_KUSN_NTZ = "RKD_KUSN_NTZ";

	/**
	 * 要求電文項目（項目１〜１９）
	 */
	private static final String[] KEY_REQ_PARAM_NM = {"KUMK_001",
														"KUMK_002",
														"KUMK_003",
														"KUMK_004",
														"KUMK_005",
														"KUMK_006",
														"KUMK_007",
														"KUMK_008",
														"KUMK_009",
														"KUMK_010",
														"KUMK_011",
														"KUMK_012",
														"KUMK_013",
														"KUMK_014",
														"KUMK_015",
														"KUMK_016",
														"KUMK_017",
	// ANK-2557-00-00 MOD START
	//													"KUMK_018"};
														"KUMK_018",
														"KUMK_019"};
	// ANK-2557-00-00 MOD END
	
	/**
	 * 個人情報変更要求受付処理です。
	 * <br>
	 * @return 処理の成否
	 * @throws Exception エラーが発生した場合
	 */
	@SuppressWarnings("unchecked")
	public boolean init() throws Exception
	{
		// サービス結果格納用サービスフォームBean
		X31SDataBeanAccess bean = null;
		StringBuffer rspMsg = new StringBuffer();
		
		try
		{
			// サービス結果格納用サービスフォームBean取得
			bean = getServiceFormBean();
			
			X31SDataBeanAccess commonBean = super.getCommonInfoBean();
			
			// ■ 業務規制チェック
			if (!JKKApiCommon.checkRequestRestriction(commonBean))
			{
				// 規制中の場合
				DEBUG_LOG.debug("■業務規制エラー");
				
				// "M" "007001"（メンテナンス中エラー）
				Exception ex = new Exception("メンテナンス中です。");
				
				// 例外発生したソースコードの行番号を取得し５桁となるようにゼロ埋め
				String line_num = JPCEditString.fillZero(String.valueOf(ex.getStackTrace()[0].getLineNumber()), 5, false);
				
				// エラー情報をマップに設定する
				HashMap<String, Object> errMap = setErrMap("007001", line_num, BUSINESS_LOGIC_NM, "", "", "顧客サーバ");
				
				// 処理応答電文（共通セクタ）の形式に変換
				rspMsg.append(JKKApiCommon.getCommonSector(errMap));
				
				// 返却値の設定
				bean.sendMessageString(KKA140SFConst.RSP_MSG, X31CWebConst.DATABEAN_SET_VALUE, rspMsg.toString());
				return true;
			}
			
			// ■ 処理要求電文より、パラメータを取得する。
			HashMap<String, Object> reqMap = super.getRequestParams();
			
			JKKApiCommon.setNulltoBlank(reqMap, KEY_REQ_PARAM_NM);
			
			String webKeyId = (String)reqMap.get(WEB_KEYID);		// Web受付キーID
			String syrSbt = (String)reqMap.get(SYR_SBT);			// 処理種別
			String susNtz = (String)reqMap.get(SUS_NTZ);			// 操作日時
			String uktkYmd = (String)reqMap.get(UKTK_YMD);			// 受付年月日
			String okyaksm = (String)reqMap.get(OKYAKSM_ID);		// サービス契約番号
			String syrNtz = (String)reqMap.get(SYR_NTZ);			// 処理日
			String syrtzFlg = (String)reqMap.get(SYRZM_FRG);		// 処理済フラグ
			String sksiPrgrmId = (String)reqMap.get(SKSI_PRGRM_ID);	// 作成プログラムＩＤ
			String rkdSksiSha = (String)reqMap.get(RKD_SKSI_SHA);	// レコード作成者
			String rkdSksiNtz = (String)reqMap.get(RKD_SKSI_NTZ);	// レコード作成日時
			String rkdKusnNtz = (String)reqMap.get(RKD_KUSN_NTZ);	// レコード更新日時
			
			// 処理日が"99999999"の場合、"20991231"に変換する
			if ("99999999".equals(syrNtz))
			{
				syrNtz = "20991231";
				reqMap.put(SYR_NTZ, "20991231");
			}
			
			// 処理済フラグがnullの場合、"0"に変換する
			if (null == syrtzFlg)
			{
				syrtzFlg = "0";
				reqMap.put(SYRZM_FRG, "0");
			}
			
			// ■ 必須入力チェック
			// 各項目の必須チェックを行いエラーとなった項目を返却する
			String chkError = getErrorKmkChk(webKeyId, syrSbt, susNtz, uktkYmd, okyaksm, syrNtz, sksiPrgrmId, rkdSksiSha, rkdSksiNtz, rkdKusnNtz);
			
			if (!JKKApiCommon.isNull(chkError))
			{
				DEBUG_LOG.debug("■必須項目が設定されていません。");
				
				// "E" "009008"（必須項目が未設定の場合）
				Exception ex = new Exception("必須項目が設定されていません。");
				
				// 例外発生したソースコードの行番号を取得し５桁となるようにゼロ埋め
				String line_num = JPCEditString.fillZero(String.valueOf(ex.getStackTrace()[0].getLineNumber()), 5, false);
				
				// エラー情報をマップに設定する
				HashMap<String, Object> errMap = setErrMap("009008", line_num, BUSINESS_LOGIC_NM, chkError, "", "");
				
				// 処理応答電文（共通セクタ）の形式に変換
				rspMsg.append(JKKApiCommon.getCommonSector(errMap));
				
				// 返却値の設定
				bean.sendMessageString(KKA140SFConst.RSP_MSG, X31CWebConst.DATABEAN_SET_VALUE, rspMsg.toString());
				return true;
			}
			
			// ■ 最大桁数チェック
			// 各項目の必須チェックを行い最大桁数がエラーとなった項目を返却する
			ArrayList<String> array = 
				makLengthChk(webKeyId, syrSbt, susNtz, uktkYmd, okyaksm, syrNtz, syrtzFlg, sksiPrgrmId, rkdSksiSha, rkdSksiNtz, rkdKusnNtz, reqMap);
			
			if (null != array)
			{
				DEBUG_LOG.debug("■最大桁数を超えています。");
				
				// "E" "009010"（パラメータ値の最大桁数を超えた場合）
				Exception ex = new Exception("最大桁数を超えています。");
				
				// 例外発生したソースコードの行番号を取得し５桁となるようにゼロ埋め
				String line_num = JPCEditString.fillZero(String.valueOf(ex.getStackTrace()[0].getLineNumber()), 5, false);
				
				// エラー情報をマップに設定する
				HashMap<String, Object> errMap = setErrMap("009010", line_num, BUSINESS_LOGIC_NM, array.get(0), "", array.get(1));
				
				// 処理応答電文（共通セクタ）の形式に変換
				rspMsg.append(JKKApiCommon.getCommonSector(errMap));
				
				// 返却値の設定
				bean.sendMessageString(KKA140SFConst.RSP_MSG, X31CWebConst.DATABEAN_SET_VALUE, rspMsg.toString());
				return true;
			}
			
			// ■ サービス呼び出し準備
			HashMap<String, Object> paramMap = new HashMap<String, Object>();
			paramMap.put(X31CWebConst.TELEGRAM_INFO_USECASE_ID, "KKSV0345");
			
			HashMap<String, HashMap<String, Object>> inputMap = new HashMap<String, HashMap<String, Object>>();
			HashMap<String, HashMap<String, Object>> outputMap = new HashMap<String, HashMap<String, Object>>();
			
			KKSV0345_KKSV0345OPDBMapper mapper = new KKSV0345_KKSV0345OPDBMapper();
			mapper.setKKSV034501SC(reqMap, inputMap, JKKCommonConst.FUNC_CODE_1);
			
			// ■ サービス呼出
			try
			{
				invokeService(paramMap, inputMap, outputMap);
			}
			catch(JCCWebServiceException jwse)
			{
				throw jwse;
			}
			
			// ■ サービス結果の転記
			HashMap<String, Object> comMap = new HashMap<String, Object>();
			
			mapper.getKKSV0345WORK01(comMap, outputMap);
			
			String result_cd = (String)comMap.get("WDA_COM_RESULT");
			
			DEBUG_LOG.debug("■返却コード：" + result_cd);
			
			// サービス処理結果の取得
			// 返却コード"000000"の場合
			if ("000000".equals(result_cd))
			{
				// 処理応答電文（共通セクタ）の形式に変換
				rspMsg.append(JKKApiCommon.getCommonSector(result_cd));
				
				// 返却値の設定
				bean.sendMessageString(KKA140SFConst.RSP_MSG, X31CWebConst.DATABEAN_SET_VALUE, rspMsg.toString());
				return true;
			}
			
			// 返却コード不正
			throw new Exception("処理結果コードが取得できませんでした。");
			
		}
		catch (Exception e)
		{
			
			// 処理で致命的なエラー（返却コード"009003"）が発生した場合
			DEBUG_LOG.debug("■致命的なエラー発生");
			
			// ■例外トレースのログ出力
			JKKApiCommon.printDebugLog(e);
			
			// 例外発生したソースコードの行番号を取得し５桁となるようにゼロ埋め
			String line_num = JPCEditString.fillZero(String.valueOf(e.getStackTrace()[0].getLineNumber()), 5, false);
			
			// エラー情報をマップに設定する
			HashMap<String, Object> errMap = setErrMap("009003", line_num, BUSINESS_LOGIC_NM, "", "", e.toString());
			
			// 処理応答電文（共通セクタ）の形式に変換
			rspMsg.append(JKKApiCommon.getCommonSector(errMap));
			
			// 返却値の設定
			bean.sendMessageString(KKA140SFConst.RSP_MSG, X31CWebConst.DATABEAN_SET_VALUE, rspMsg.toString());
			
			return true;
		}
	}
	
	/**
	 * 必須項目のチェックを行います。
	 * <br>
	 * @param webKeyId Web受付キーID
	 * @param syrSbt 処理種別
	 * @param susNtz 操作日時
	 * @param uktkYmd 受付年月日
	 * @param okyaksm サービス契約番号
	 * @param syrNtz 処理日
	 * @param sksiPrgrmId 作成プログラムＩＤ
	 * @param rkdSksiSha レコード作成者
	 * @param rkdSksiNtz レコード作成日時
	 * @param rkdKusnNtz レコード更新日時
	 * @param arrayList 項目１〜１００を格納したリスト
	 * @return 必須チェックでエラーが発生した場合、エラーとなった項目を設定する、エラーでない場合は、nullを返却
	 */
	private String getErrorKmkChk(String webKeyId, String syrSbt, String susNtz, String uktkYmd, String okyaksm, 
			String syrNtz, String sksiPrgrmId, String rkdSksiSha, String rkdSksiNtz, String rkdKusnNtz)
	{
		// Web受付キーIDの必須チェックを行う
		if(JKKApiCommon.isNull(webKeyId))
		{
			return WEB_KEYID;
		}
		
		// 処理種別の必須チェックを行う
		if(JKKApiCommon.isNull(syrSbt))
		{
			return SYR_SBT;
		}
		
		// 操作日時の必須チェックを行う
		if(JKKApiCommon.isNull(susNtz))
		{
			return SUS_NTZ;
		}
		
		// 受付年月日の必須チェックを行う
		if(JKKApiCommon.isNull(uktkYmd))
		{
			return UKTK_YMD;
		}
		
		// サービス契約番号の必須チェックを行う
		if(JKKApiCommon.isNull(okyaksm))
		{
			return OKYAKSM_ID;
		}
		
		// 処理日の必須チェックを行う
		if(JKKApiCommon.isNull(syrNtz))
		{
			return SYR_NTZ;
		}
		
		// 作成プログラムＩＤの必須チェックを行う
		if(JKKApiCommon.isNull(sksiPrgrmId))
		{
			return SKSI_PRGRM_ID;
		}
		
		// レコード作成者の必須チェックを行う
		if(JKKApiCommon.isNull(rkdSksiSha))
		{
			return RKD_SKSI_SHA;
		}
		
		// レコード作成日時の必須チェックを行う
		if(JKKApiCommon.isNull(rkdSksiNtz))
		{
			return RKD_SKSI_NTZ;
		}

		// レコード更新日時の必須チェックを行う
		if(JKKApiCommon.isNull(rkdKusnNtz))
		{
			return RKD_KUSN_NTZ;
		}
		
		return null;
	}
	
	/**
	 * 最大桁数のチェックを行います。
	 * <br>
	 * @param webKeyId Web受付キーID
	 * @param syrSbt 処理種別
	 * @param susNtz 操作日時
	 * @param uktkYmd 受付年月日
	 * @param okyaksm サービス契約番号
	 * @param syrNtz 処理日
	 * @param syrtzFlg 処理済フラグ
	 * @param sksiPrgrmId 作成プログラムＩＤ
	 * @param rkdSksiSha レコード作成者
	 * @param rkdSksiNtz レコード作成日時
	 * @param rkdKusnNtz レコード更新日時
	 * @param reqMap リクエストマップ
	 * @return 最大桁数チェックでエラーが発生した場合、エラーとなった項目と項目の値を設定する、エラーでない場合は、nullを返却
	 */
	private ArrayList<String> makLengthChk(String webKeyId, String syrSbt, String susNtz, String uktkYmd, String okyaksm, 
			String syrNtz, String syrtzFlg, String sksiPrgrmId, String rkdSksiSha, String rkdSksiNtz, String rkdKusnNtz, HashMap<String, Object> reqMap)
	{
		
		ArrayList<String> array = new ArrayList<String>();
		
		// Web受付キーIDの最大桁数チェックを行う
		if(16 < webKeyId.length())
		{
			array.add(WEB_KEYID);
			array.add(webKeyId);
			
			return array;
		}
		
		// 処理種別の最大桁数チェックを行う
		if(6 < syrSbt.length())
		{
			array.add(SYR_SBT);
			array.add(syrSbt);
			
			return array;
		}

		// 操作日時の最大桁数チェックを行う
		if(14 < susNtz.length())
		{
			array.add(SUS_NTZ);
			array.add(susNtz);
			
			return array;
		}
		
		// 受付年月日の最大桁数チェックを行う
		if(8 < uktkYmd.length())
		{
			array.add(UKTK_YMD);
			array.add(uktkYmd);
			
			return array;
		}
		
		// サービス契約番号の最大桁数チェックを行う
		if(10 < okyaksm.length())
		{
			array.add(OKYAKSM_ID);
			array.add(okyaksm);
			
			return array;
		}
		
		// 項目１〜１００の最大桁数チェックを行う
		array = checkKumk(reqMap);
		
		if(2 == array.size())
		{
			return array;
		}
		
		// 処理済フラグの最大桁数チェックを行う
		if(1 < syrtzFlg.length())
		{
			array.add(SYRZM_FRG);
			array.add(syrtzFlg);
			
			return array;
		}
		
		// 処理日の最大桁数チェックを行う
		if(8 < syrNtz.length())
		{
			array.add(SYR_NTZ);
			array.add(syrNtz);
			
			return array;
		}
		
		// 作成プログラムＩＤの最大桁数チェックを行う
		if(8 < sksiPrgrmId.length())
		{
			array.add(SKSI_PRGRM_ID);
			array.add(sksiPrgrmId);
			
			return array;
		}
		
		// レコード作成者の最大桁数チェックを行う
		if(7 < rkdSksiSha.length())
		{
			array.add(RKD_SKSI_SHA);
			array.add(rkdSksiSha);
			
			return array;
		}
		
		// レコード作成日時の最大桁数チェックを行う
		if(14 < rkdSksiNtz.length())
		{
			array.add(RKD_SKSI_NTZ);
			array.add(rkdSksiNtz);
			
			return array;
		}
		
		// レコード更新日時の最大桁数チェックを行う
		if(14 < rkdKusnNtz.length())
		{
			array.add(RKD_KUSN_NTZ);
			array.add(rkdKusnNtz);
			
			return array;
		}
		
		return null;

	}
	
	/**
	 * 項目１〜１９までの最大桁数チェックを行います。
	 * <br>
	 * @param reqMap リクエストマップ
	 * @return ArrayList エラー対象の項目と項目値
	 */
	private ArrayList<String> checkKumk(HashMap<String, Object> reqMap)
	{
		ArrayList<String> array = new ArrayList<String>();
		
		for(int i = 0; i < KEY_REQ_PARAM_NM.length; i++)
		{
			
			String kumk = (String)reqMap.get(KEY_REQ_PARAM_NM[i]);
			
			int size = JPCEditString.getLength(kumk);
			
			if(200 < size)
			{
				
				array.add(KEY_REQ_PARAM_NM[i]);
				array.add(kumk);
				
				return array;
				
			}
			
		}
		
		return array;
	}
	
	/**
	 * エラー情報をマップに設定します。
	 * <br>
	 * @param result 結果コードに設定する値
	 * @param detail2 詳細情報2に設定する値
	 * @param detail3 詳細情報3に設定する値
	 * @param detail4 詳細情報4に設定する値
	 * @param detail5 詳細情報5に設定する値
	 * @param detail6 詳細情報6に設定する値
	 * @return エラー情報を格納したMAP
	 */
	private HashMap<String, Object> setErrMap(String result, String detail2, String detail3, String detail4, String detail5, String detail6)
	{
		HashMap<String, Object> errMap = new HashMap<String, Object>();
		
		errMap.put("WDA_COM_RTYPE", JKKApiCommon.getRtype(result));
		errMap.put("WDA_COM_RESULT", result);
		errMap.put("WDA_COM_DETAIL1", this.getClass().getName());
		errMap.put("WDA_COM_DETAIL2", detail2);
		errMap.put("WDA_COM_DETAIL3", detail3);
		errMap.put("WDA_COM_DETAIL4", detail4);
		errMap.put("WDA_COM_DETAIL5", detail5);
		errMap.put("WDA_COM_DETAIL6", detail6);
		
		return errMap;

	}

}
