/*********************************************************************
* All Rights reserved,Copyright (c) K-Opticom
**********************************************************************
*＜プログラム内容＞
*   システム名      ：eo顧客基幹システム
*   モジュール名    ：KKA507SFLogic
*   ソースファイル名：KKA507SFLogic.java
*   作成者          ：富士通
*   日付            ：2011年10月24日
*＜機能概要＞
*   お客さま契約情報照会要求受付(API)のビューロジックです。
*＜修正履歴＞
*   バージョン  修正日       修正者      修正内容
*   v4.00.00    2013/09/18   FJ)古内     【OM-2013-0001129】新規作成
*   v33.00.00   2017/09/14   FJ)平野     ST-2017-0000013対応
*	v39.00.00	2018/10/23	 FJ)鈴木	【ANK-3484-00-00】端末補償サービスの導入対応
*   v74.00.00	2025/02/11	 GDC)J.Zabala	【ANK-4640-00-00】typeN：追加要件対応
**********************************************************************/
package eo.web.webview.KKA507SF;

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.JCCWebCommon;
import eo.web.webview.common.JKKApiCommon;
import eo.web.webview.common.JKKCommonConst;
import eo.web.webview.mapping.KKSV0761_KKSV0761OPDBMapper;

/**
 * KKA129のビューロジックです。<p>
 * <BR>
 * @author 富士通
 */
@SuppressWarnings("serial")
public class KKA507SFLogic extends JCCWebBusinessLogic
{
	
	/**
	 * 業務処理名
	 */
	private static final String BUSINESS_LOGIC_NM = "お客さま契約情報照会要求受付（通信状況なし）";
	
	/**
	 * お客さま契約情報照会要求受付処理です。
	 * <br>
	 * @return 処理の成否
	 * @throws Exception エラーが発生した場合
	 */
	@SuppressWarnings("unchecked")
	public boolean init() throws Exception
	{
		// サービス結果格納用サービスフォームBean
		X31SDataBeanAccess bean = null;
		StringBuilder rspMsg = new StringBuilder();
		
		try
		{
			// サービス結果格納用サービスフォームBean取得
			bean = getServiceFormBean();
			
			X31SDataBeanAccess commonBean = super.getCommonInfoBean();
			
			// ■ 業務規制チェック
			if (!JKKApiCommon.checkRequestRestriction(commonBean))
			{
				// 規制中の場合
				DEBUG_LOG.debug("■業務規制エラー");
				
				bean.sendMessageString(KKA507SFConst.RSP_MSG, 
										X31CWebConst.DATABEAN_SET_VALUE, 
										makeErrorInfo("007001", "", "顧客サーバ", 1));
				return true;
			}
			
			// ■ 処理要求電文より、パラメータを取得する。
			HashMap<String, Object> reqMap = super.getRequestParams();
			
			// ******* 以下、入力チェック ********
			
			// 必須入力チェック
			if ((!checkRequire(reqMap, "OKYAKSM_ID"))
					|| (!checkRequire(reqMap, "KIYK_SBS"))
					|| (!checkRequire(reqMap, "RYOUKN_PRN")))
			{
				return true;
			}
			
			// 最大桁数チェック
			if ((!checkMaxLength(reqMap, "OKYAKSM_ID", 10))
					|| (!checkMaxLength(reqMap, "KIYK_SBS", 2))
					|| (!checkMaxLength(reqMap, "RYOUKN_PRN", 3)))
			{
				return true;
			}
			// ******* ここまで、入力チェック ********
			
			// ******* 以下 サービス呼出処理 *********
			
			// ■ サービス呼び出し準備
			HashMap<String, Object> paramMap = new HashMap<String, Object>();
			paramMap.put(X31CWebConst.TELEGRAM_INFO_USECASE_ID, "KKSV0761");
			
			HashMap<String, HashMap<String, Object>> inputMap = new HashMap<String, HashMap<String, Object>>();
			HashMap<String, HashMap<String, Object>> outputMap = new HashMap<String, HashMap<String, Object>>();
			
			KKSV0761_KKSV0761OPDBMapper mapper = new KKSV0761_KKSV0761OPDBMapper();
			
			// オンライン運用日付取得
			String opeDate = JCCWebCommon.getOpeDate(this, null);
			
			// サービス契約一意照会マップ
			mapper.setKKSV076101SC(reqMap, inputMap, JKKCommonConst.FUNC_CODE_2, opeDate);
			// 料金コース情報照会マップ
			mapper.setKKSV076101CC(reqMap, inputMap);
			// 通信状況情報照会マップ
			mapper.setKKSV076102CC(reqMap, inputMap);
			// メール情報照会マップ
			mapper.setKKSV076103CC(reqMap, inputMap);
			// ホームページ情報照会マップ
			mapper.setKKSV076104CC(reqMap, inputMap);
			// メーリングリスト情報照会マップ
			mapper.setKKSV076105CC(reqMap, inputMap);
			// eo光ネットオプション情報照会マップ
			mapper.setKKSV076106CC(reqMap, inputMap);
			// 課金先一覧照会（請求契約番号/サービス契約番号）マップ
			mapper.setKKSV076107SC(reqMap, inputMap, JKKCommonConst.FUNC_CODE_1);
			// 認証ID情報照会マップ
			mapper.setKKSV076108CC(reqMap, inputMap);
			// 有害サイトブロック情報照会マップ
			mapper.setKKSV076109CC(reqMap, inputMap);
			// ダイヤルアップ接続情報照会マップ
			mapper.setKKSV076110CC(reqMap, inputMap);
			// リモートサポートプラス接続情報照会マップ
			mapper.setKKSV076111CC(reqMap, inputMap);
			// サービス契約＜eoモバイル＞一意照会照会マップ
			mapper.setKKSV076112SC(reqMap, inputMap, JKKCommonConst.FUNC_CODE_2);
			// 長割情報照会マップ
			mapper.setKKSV076113CC(reqMap, inputMap);
			// オプションサービス契約一覧照会
			mapper.setKKSV076114SC(reqMap, inputMap, JKKCommonConst.FUNC_CODE_1);
			// スマートリンク割賦契約情報照会
			mapper.setKKSV076115CC(reqMap, inputMap);
//ST-2017-0000013 ADD START
			// GH契約情報照会
			mapper.setKKSV076116CC(reqMap, inputMap);
//ST-2017-0000013 ADD END
			// ANK-3484-00-00 ADD START
			// 端末補償操作の共通コンポーネント（照会）
			mapper.setKKSV076117CC(reqMap, inputMap);
			// ANK-3484-00-00 ADD END
			// お客様契約情報照会作業項目マップ01
			mapper.setKKSV0761WORK01(reqMap, inputMap);
			// お客様契約情報照会作業項目マップ02
			mapper.setKKSV0761WORK02(reqMap, inputMap);
			// ANK-4640-00-00 ADD START
			// WAO連携情報一意照会マップ
			mapper.setKKSV076118SC(reqMap, inputMap, JKKCommonConst.FUNC_CODE_2);
			// ANK-4640-00-00 ADD END
			// ■ サービス呼出
			try
			{
				invokeService(paramMap, inputMap, outputMap);
			}
			catch(JCCWebServiceException jwse)
			{
				throw jwse;
			}
			
			// ■ サービス結果の転記
			HashMap<String, Object> comMap = new HashMap<String, Object>();
			
			// お客様契約情報照会作業項目マップ02
			// 下りのステータス（result_cd）を取得する。
			mapper.getKKSV0761WORK02(comMap, outputMap);
			
			// ******* ここまで サービス呼出処理 *********
			
			// ******* 以下 ＡＰＩ応答電文生成処理 *********
			String result_cd = (String)comMap.get("WDA_COM_RESULT");
			
			DEBUG_LOG.debug("■返却コード：" + result_cd);
			
			// 起点変電所CD集約局CD変換の取得件数が1件以外（返却コード"029019"）の場合
			if ("029019".equals(result_cd))
			{
				bean.sendMessageString(KKA507SFConst.RSP_MSG, 
						X31CWebConst.DATABEAN_SET_VALUE, 
						makeErrorInfo("029019", "", "起点変電所CD集約局CD情報参照取得件数不正", 1));
				return true;
			}
			// GE-PON利用可否が"0"、"1"以外（返却コード"029003"）の場合
			else if ("029003".equals(result_cd))
			{
				bean.sendMessageString(KKA507SFConst.RSP_MSG, 
						X31CWebConst.DATABEAN_SET_VALUE, 
						makeErrorInfo("029003", "", "GE-PON利用可否取得値不正", 1));
				return true;
			}
			// ダイヤルアップ接続用認証IDに値が無い（返却コード"029033"）場合
			else if ("029033".equals(result_cd))
			{
				bean.sendMessageString(KKA507SFConst.RSP_MSG, 
						X31CWebConst.DATABEAN_SET_VALUE, 
						makeErrorInfo("029033", "", "データ矛盾エラー（ダイヤルアップ接続用認証IDに値が設定されていません）", 1));
				return true;
			}
			// サービスの処理結果が正常（返却コード"000000"）の場合
			else if ("000000".equals(result_cd))
			{
				HashMap<String, Object> sectorData = createSectorTemplate();
				
				// サービスの実行結果を取得
				// サービス契約一意照会マップ
				// 料金コース情報照会マップ
				mapper.getKKSV076101CC(outputMap, sectorData);
				// 通信状況情報照会マップ
				mapper.getKKSV076102CC(outputMap, sectorData);
				// メール情報照会マップ
				mapper.getKKSV076103CC(outputMap, sectorData);
				// ホームページ情報照会マップ
				mapper.getKKSV076104CC(outputMap, sectorData);
				// メーリングリスト情報照会マップ
				mapper.getKKSV076105CC(outputMap, sectorData);
				// eo光ネットオプション情報照会マップ
				mapper.getKKSV076106CC(outputMap, sectorData);
				// 課金先一覧照会（請求契約番号/サービス契約番号）マップ
				mapper.getKKSV076107SC(outputMap, sectorData);
				// 認証ID情報照会マップ
				mapper.getKKSV076108CC(outputMap, sectorData);
				// 有害サイトブロック情報照会マップ
				mapper.getKKSV076109CC(outputMap, sectorData);
				// ダイヤルアップ接続情報照会マップ
				mapper.getKKSV076110CC(outputMap, sectorData);
				// リモートサポートプラス接続情報照会マップ
				mapper.getKKSV076111CC(outputMap, sectorData);
				// サービス契約＜eoモバイル＞一意照会照会マップ
				mapper.getKKSV076112SC(outputMap, sectorData);
				// 長割情報照会マップ
				mapper.getKKSV076113CC(outputMap, sectorData);
				// オプションサービス契約一覧照会
				mapper.getKKSV076114SC(outputMap, sectorData);
				// スマートリンク割賦契約情報照会
				mapper.getKKSV076115CC(outputMap, sectorData);
//ST-2017-0000013 ADD START
				// GH契約情報照会
				mapper.getKKSV076116CC(outputMap, sectorData);
//ST-2017-0000013 ADD END
				// ANK-3484-00-00 ADD START
				// 端末補償操作の共通コンポーネント（照会）
				mapper.getKKSV076117CC(outputMap, sectorData);
				// ANK-3484-00-00 ADD END
				// ANK-4640-00-00 ADD START
				// WAO連携情報一意照会マップ
				mapper.getKKSV076118SC(outputMap, sectorData);
				// ANK-4640-00-00 ADD END
				// *** 処理応答電文（共通セクタ）の形式に変換 ***
				rspMsg.append(JKKApiCommon.getCommonSector(result_cd));
				
				// *** 処理応答電文（個別セクタ）の形式に変換 ***
				
				rspMsg.append(JKKApiCommon.getSimpleSector((HashMap<String, Object>)sectorData.get("S1")));
				rspMsg.append(JKKApiCommon.getMultipleSector((ArrayList<HashMap<String, Object>>)sectorData.get("M1"), "M1"));
				
				rspMsg.append(JKKApiCommon.getSimpleSector((HashMap<String, Object>)sectorData.get("S2")));
				rspMsg.append(JKKApiCommon.getMultipleSector((ArrayList<HashMap<String, Object>>)sectorData.get("M2"), "M2"));
				
				rspMsg.append(JKKApiCommon.getSimpleSector((HashMap<String, Object>)sectorData.get("S3")));
				rspMsg.append(JKKApiCommon.getMultipleSector((ArrayList<HashMap<String, Object>>)sectorData.get("M9"), "M9"));
				
				rspMsg.append(JKKApiCommon.getSimpleSector((HashMap<String, Object>)sectorData.get("S4")));
				rspMsg.append(JKKApiCommon.getMultipleSector((ArrayList<HashMap<String, Object>>)sectorData.get("M3"), "M3"));
				
				rspMsg.append(JKKApiCommon.getSimpleSector((HashMap<String, Object>)sectorData.get("S5")));
				rspMsg.append(JKKApiCommon.getMultipleSector((ArrayList<HashMap<String, Object>>)sectorData.get("M4"), "M4"));
				
				rspMsg.append(JKKApiCommon.getSimpleSector((HashMap<String, Object>)sectorData.get("S6")));
				rspMsg.append(JKKApiCommon.getMultipleSector((ArrayList<HashMap<String, Object>>)sectorData.get("M5"), "M5"));
				
				rspMsg.append(JKKApiCommon.getSimpleSector((HashMap<String, Object>)sectorData.get("S7")));
				rspMsg.append(JKKApiCommon.getMultipleSector((ArrayList<HashMap<String, Object>>)sectorData.get("M6"), "M6"));
				
				rspMsg.append(JKKApiCommon.getSimpleSector((HashMap<String, Object>)sectorData.get("S8")));
				rspMsg.append(JKKApiCommon.getMultipleSector((ArrayList<HashMap<String, Object>>)sectorData.get("M8"), "M8"));
				rspMsg.append(JKKApiCommon.getMultipleSector((ArrayList<HashMap<String, Object>>)sectorData.get("M7"), "M7"));
				
				rspMsg.append(JKKApiCommon.getSimpleSector((HashMap<String, Object>)sectorData.get("S9")));
				rspMsg.append(JKKApiCommon.getMultipleSector((ArrayList<HashMap<String, Object>>)sectorData.get("M11"), "M11"));
				
				rspMsg.append(JKKApiCommon.getSimpleSector((HashMap<String, Object>)sectorData.get("S10")));
				
				// 返却値の設定
				bean.sendMessageString(KKA507SFConst.RSP_MSG, X31CWebConst.DATABEAN_SET_VALUE, rspMsg.toString());
				return true;
			}
			
			// ******* ここまで ＡＰＩ応答電文生成処理 *********
			
			// 返却コード不正
			throw new Exception("処理結果コードが取得できませんでした。");
			
		}
		catch (Exception e)
		{
			DEBUG_LOG.debug("■致命的なエラー発生");
			
			// ■例外トレースのログ出力
			JKKApiCommon.printDebugLog(e);
			
			// 処理で致命的なエラー（返却コード"009003"）が発生した場合
			
			bean.sendMessageString(KKA507SFConst.RSP_MSG, 
									X31CWebConst.DATABEAN_SET_VALUE, 
									makeErrorInfo("009003", "", e.toString(), 1));
			return true;
		}
	}
	
	/**
	 * 下りセクター情報の雛型を生成する。
	 * @return HashMap<String, Object>
	 */
	private HashMap<String, Object> createSectorTemplate()
	{
		HashMap<String, Object> sectorTemplate = new HashMap<String, Object>();
		
		sectorTemplate.put("S1", new HashMap<String, Object>());
		sectorTemplate.put("M1", new ArrayList<HashMap<String, Object>>());
		sectorTemplate.put("S2", new HashMap<String, Object>());
		sectorTemplate.put("M2", new ArrayList<HashMap<String, Object>>());
		sectorTemplate.put("S3", new HashMap<String, Object>());
		sectorTemplate.put("M9", new ArrayList<HashMap<String, Object>>());
		sectorTemplate.put("S4", new HashMap<String, Object>());
		sectorTemplate.put("M3", new ArrayList<HashMap<String, Object>>());
		sectorTemplate.put("S5", new HashMap<String, Object>());
		sectorTemplate.put("M4", new ArrayList<HashMap<String, Object>>());
		sectorTemplate.put("S6", new HashMap<String, Object>());
		sectorTemplate.put("M5", new ArrayList<HashMap<String, Object>>());
		sectorTemplate.put("S7", new HashMap<String, Object>());
		sectorTemplate.put("M6", new ArrayList<HashMap<String, Object>>());
		sectorTemplate.put("S8", new HashMap<String, Object>());
		sectorTemplate.put("M7", new ArrayList<HashMap<String, Object>>());
		sectorTemplate.put("S8", new HashMap<String, Object>());
		sectorTemplate.put("M8", new ArrayList<HashMap<String, Object>>());
		sectorTemplate.put("M7", new ArrayList<HashMap<String, Object>>());
		sectorTemplate.put("S9", new HashMap<String, Object>());
		sectorTemplate.put("M11", new ArrayList<HashMap<String, Object>>());
		sectorTemplate.put("S10", new HashMap<String, Object>());
		
		return sectorTemplate;
	}
	
	/**
	 * 必須入力チェックを実行する。
	 * 
	 * @param req
	 * @param key
	 * @return true:正常 false:エラー
	 */
	private boolean checkRequire(HashMap<String, Object> req, String key)
	{
		// サービス結果格納用サービスフォームBean取得
		X31SDataBeanAccess bean = getServiceFormBean();
		
		String value = (String)req.get(key);
		
		// ■ 必須入力チェック
		if (JKKApiCommon.isNull(value))
		{
			DEBUG_LOG.debug("■必須項目が設定されていません。");
			
			// 返却値の設定
			bean.sendMessageString(KKA507SFConst.RSP_MSG, 
									X31CWebConst.DATABEAN_SET_VALUE, 
									makeErrorInfo("009008", key, value, 2));
			return false;
		}
		
		return true;
	}
	
	/**
	 * 最大桁数チェックを実行する。
	 * 
	 * @param req
	 * @param key
	 * @param length
	 * @return true:正常 false:エラー
	 */
	private boolean checkMaxLength(HashMap<String, Object> req, String key, int length)
	{
		// サービス結果格納用サービスフォームBean取得
		X31SDataBeanAccess bean = getServiceFormBean();
		
		String value = (String)req.get(key);
		
		// ■ 最大桁数チェック
		if (length < value.length())
		{
			DEBUG_LOG.debug("■最大桁数を超えています。");
			
			// 返却値の設定
			bean.sendMessageString(KKA507SFConst.RSP_MSG, 
									X31CWebConst.DATABEAN_SET_VALUE, 
									makeErrorInfo("009010", key, value, 2));
			return false;
		}
		
		return true;
	}
	
	/**
	 * エラー情報を生成し処理応答電文を返却する。
	 * 
	 * @param errorCode 結果コード
	 * @param key 詳細情報４
	 * @param value 詳細情報６
	 * @param stackLevel
	 * @return エラー時の処理応答電文
	 */
	private String makeErrorInfo(String errorCode, String key, String value, int stackLevel)
	{
		Exception ex = new Exception();
		
		// 例外発生したソースコードの行番号を取得し５桁となるようにゼロ埋め
		String line_num = JPCEditString.fillZero(String.valueOf(ex.getStackTrace()[stackLevel].getLineNumber()), 5, false);
		
		HashMap<String, Object> errMap = new HashMap<String, Object>();
		errMap.put("WDA_COM_RTYPE", JKKApiCommon.getRtype(errorCode));
		errMap.put("WDA_COM_RESULT", errorCode);
		errMap.put("WDA_COM_DETAIL1", this.getClass().getName());
		errMap.put("WDA_COM_DETAIL2", line_num);
		errMap.put("WDA_COM_DETAIL3", BUSINESS_LOGIC_NM);
		errMap.put("WDA_COM_DETAIL4", key);
		errMap.put("WDA_COM_DETAIL5", "");
		errMap.put("WDA_COM_DETAIL6", (value == null ? "" : value));
		
		// 処理応答電文（共通セクタ）の形式に変換
		return JKKApiCommon.getCommonSector(errMap);
	}
}
