/*********************************************************************
* All Rights reserved,Copyright (c) K-Opticom
**********************************************************************
*＜プログラム内容＞
*   システム名      ：eo顧客基幹システム
*   モジュール名    ：物流管理システム
*   ソースファイル名：JDKCommon05CC.java
*   作成者          ：富士通
*   日付            ：2011年07月20日
*＜機能概要＞
*   返品承認データ一覧照会再検索CCクラスです。
*＜修正履歴＞
*   バージョン  修正日       修正者      修正内容
*   v1.00.00    2011/07/20   FJ          新規作成
*   v33.00.00   2017/08/16   FJ)周藤     【ANK-3185-00-00】(客B)返品承認の挙動改善
*   v33.00.01   2017/10/05   FJ)謝       【OM-2017-0001015】返品承認画面の不備
*	v67.00.00	2023/08/30   FJ)舘山     【#63455】返品機器の提供種別に値が入らない
*   v61.00.00   2023/01/13   GDC)r.heredia   【ANK-4315-00-00】eoホームゲートウェイ導入対応
*
**********************************************************************/
package com.fujitsu.futurity.bp.custom.common;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.Map;

import com.fujitsu.futurity.bp.custom.mapping.DKSV0079_DKSV0079OP_EDK0301B020BSMapper;
import com.fujitsu.futurity.bp.custom.mapping.DKSV0079_DKSV0079OP_EKK0341B519BSMapper;
import com.fujitsu.futurity.bp.custom.mapping.DKSV0079_DKSV0079OP_EKK0241B002BSMapper;
import com.fujitsu.futurity.bp.x21.bpm.ServiceComponentRequestInvoker;
import com.fujitsu.futurity.bp.x21.bpm.db.SessionHandle;
import com.fujitsu.futurity.bp.x21.bpm.exception.RequestParameterException;
import com.fujitsu.futurity.bp.x21.bpm.parameter.IRequestParameterReadWrite;
import com.fujitsu.futurity.bp.x21.cc.AbstractCommonComponent;
import com.fujitsu.futurity.bp.x21.cc.exception.SCCallException;
import com.fujitsu.futurity.common.JCMConstants;
import com.fujitsu.futurity.model.base.CAANMsg;
import com.fujitsu.futurity.model.ejb.common.JSYejbLog;

import eo.common.constant.JDKStrConst;
import eo.common.util.JDKCommonUtil;
import eo.ejb.cbs.cbsmsg.EDK0301B020CBSMsg;
import eo.ejb.cbs.cbsmsg.EDK0301B020CBSMsg1List;
import eo.ejb.cbs.cbsmsg.EKK0341B519CBSMsg;
import eo.ejb.cbs.cbsmsg.EKK0341B519CBSMsg1List;
import eo.ejb.cbs.cbsmsg.EKK0241B002CBSMsg;
import eo.ejb.cbs.cbsmsg.EKK0241B002CBSMsg1List;
/**
 * 返品承認データ一覧照会再検索CCクラスです。
 * @author 富士通
 */
public class JDKCommon05CC extends AbstractCommonComponent
{
	/** ＣＣ名 */
	private static final String DKSV007901CC = "DKSV007901CC";
	/** マッパー */
	private static final DKSV0079_DKSV0079OP_EDK0301B020BSMapper MAPPER = new DKSV0079_DKSV0079OP_EDK0301B020BSMapper();
// ANK-3185-00-00 ADD START
	private static final DKSV0079_DKSV0079OP_EKK0341B519BSMapper MAPPER_GET_KIKI = new DKSV0079_DKSV0079OP_EKK0341B519BSMapper();
	private static final DKSV0079_DKSV0079OP_EKK0241B002BSMapper MAPPER_GET_KAISEN = new DKSV0079_DKSV0079OP_EKK0241B002BSMapper();
	
	/** サービスコード：ネット */
	private static final String NET = "01";

	/** サービスコード：電話 */
	private static final String TEL = "02";

	/** サービスコード：TV */
	private static final String TV = "03";
// ANK-3185-00-00 ADD END

	/**
	 * 返品承認データ一覧取得処理を行います。
	 * @param handle セッションハンドル
	 * @param param パラメータ
	 * @param fixedText 定型文字
	 * @return パラメータ
	 * @throws Throwable 
	 */
	@SuppressWarnings("unchecked")
	public IRequestParameterReadWrite getHmpinDataSearch(SessionHandle handle, 
// ANK-3185-00-00 MOD START
			//IRequestParameterReadWrite param, String fixedText) throws Exception
			IRequestParameterReadWrite param, String fixedText) throws Throwable
// ANK-3185-00-00 MOD END
	{

		// ◇上りマッピング処理
		// 上りマッピングの処理結果を取得するためのマップを生成
		HashMap<String, Object> paramMap = new HashMap<String, Object>();

		// リクエストパラメータを引数に上りマッピング処理メソッドを実行
		paramMap = editInMsg(param);

		// ◇ＳＣ呼出実行
		// SC呼び出し部品のインスタンス生成（引数にはログに出力するクラス名を渡す。空文字を設定した場合はログに出力されない。
		ServiceComponentRequestInvoker scCall = new ServiceComponentRequestInvoker();
		JSYejbLog.println(JSYejbLog.DEBUG, this.getClass(), "返品承認データ一覧照会処理の実行");
		Map<?, ?> result = scCall.run(paramMap, handle);

		CAANMsg[] templates = (CAANMsg[])result.get(JCMConstants.TEMPLATE_LIST_KEY);
		CAANMsg msg = templates[0];

		// 検索リストを取得する。
		CAANMsg[] serchList = msg.getCAANMsgList(EDK0301B020CBSMsg.EDK0301B020CBSMSG1LIST);

		// 画面で選択していたデータが検索結果に存在するかチェックを行う。
		boolean flg = false;

		// ユーザデータ情報
		// 画面で選択されていたデータを取得する。
		HashMap inParamMap = (HashMap)param.getData(DKSV007901CC);
		String key = (String)inParamMap.get("paging_key");

		// キー情報が存在するか確認する。
		if (serchList != null && !JDKCommonUtil.isNull(key))
		{
			for (int i = 0; i < serchList.length; i++)
			{
				CAANMsg childTemplate = serchList[i];
				String hmpinKikiNo = childTemplate.getString(EDK0301B020CBSMsg1List.HMPIN_KIKI_NO);

				// 選択データが検索結果にある場合はチェック終了
				if(key.equals(hmpinKikiNo))
				{
					flg = true;
					break;
				}
			}
		}
		else if (serchList != null && 0 < serchList.length)
		{

			// データが検索結果にある場合はチェック終了
			flg = true;
		}

		// 画面で選択していたデータがない場合は1ページ目を再検索する。
		if (!flg)
		{
			HashMap inMap = (HashMap)param.getData(DKSV007901CC);

			// 表示ページ番号を1ページに設定する。
			inMap.put("display_page_num", "1");

			// 画面制御のため検索エラーフラグを3に設定する。
			inMap.put("search_err_flg", "3");

			// 表示行番号を0に設定する
			inMap.put("display_no", "0");
			
			// リクエストパラメータを引数に上りマッピング処理メソッドを実行
			paramMap = editInMsg(param);

			// ◇ＳＣ呼出実行
			// SC呼び出し部品のインスタンス生成（引数にはログに出力するクラス名を渡す。空文字を設定した場合はログに出力されない。
			scCall = new ServiceComponentRequestInvoker();
			JSYejbLog.println(JSYejbLog.DEBUG, this.getClass(), "返品承認データ一覧照会処理の実行");
			result = scCall.run(paramMap, handle);
// ANK-3185-00-00 ADD START
			templates = (CAANMsg[])result.get(JCMConstants.TEMPLATE_LIST_KEY);
			msg = templates[0];

			// 検索リストを取得する。
			serchList = msg.getCAANMsgList(EDK0301B020CBSMsg.EDK0301B020CBSMSG1LIST);
// ANK-3185-00-00 ADD END
		}

// OM-2017-0001015 ADD START
		// 返品機器サービス契約番号リスト
		ArrayList hmpinKikiSvcKeiNoList = new ArrayList();
// OM-2017-0001015 ADD END
		
// ANK-3185-00-00 ADD START
		// 返品承認データ一覧照会情報編集処理
		if(serchList != null)
		{
			for (int i = 0; i < serchList.length; i++)
			{
				CAANMsg childTemplate = serchList[i];
				String svcKeiNo = childTemplate.getString(EDK0301B020CBSMsg1List.SVC_KEI_NO);
	
// OM-2017-0001015 ADD START
				// 返品機器サービス契約番号リストに返品承認データ.サービス契約を追加する
				HashMap hmpinKikiSvcKeiNoMap = new HashMap();
				hmpinKikiSvcKeiNoMap.put("hmpin_kiki_svc_kei_no", svcKeiNo);
				hmpinKikiSvcKeiNoList.add(hmpinKikiSvcKeiNoMap);
// OM-2017-0001015 ADD END
				
				// 返品承認データ.サービス契約取得が空のデータ毎に、サービス契約番号取得処理を行う
				if(svcKeiNo == null || svcKeiNo.isEmpty())
				{
					// ◇上りマッピング処理
					// 上りマッピングの処理結果を取得するためにマップを初期化
					paramMap = new HashMap<String, Object>();
					
					// リクエストパラメータを引数に上りマッピング処理メソッドを実行
					paramMap = editInCheckKikiMsg(param,
							childTemplate.getString(EDK0301B020CBSMsg1List.TAKNKIKI_MODEL_CD),
							childTemplate.getString(EDK0301B020CBSMsg1List.KIKI_SEIZO_NO));
	
					// ◇ＳＣ呼出実行
					// SC呼び出し部品のインスタンス生成（引数にはログに出力するクラス名を渡す。空文字を設定した場合はログに出力されない。
					scCall = new ServiceComponentRequestInvoker();
					JSYejbLog.println(JSYejbLog.DEBUG, this.getClass(), "機器提供サービス契約一覧照会(型番・製番)処理の実行");
					Map<?, ?> editResult = scCall.run(paramMap, handle);
					
					CAANMsg[] checkTemplates = (CAANMsg[])editResult.get(JCMConstants.TEMPLATE_LIST_KEY);
					CAANMsg checkMsg = checkTemplates[0];
					
					// チェック用検索リストを取得する。
					CAANMsg[] checkList = checkMsg.getCAANMsgList(EKK0341B519CBSMsg.EKK0341B519CBSMSG1LIST);
					
					// 取得件数が0件以上の場合
					if(checkList.length>0)
					{
						CAANMsg checkTemplate = checkList[0];
						svcKeiNo = checkTemplate.getString(EKK0341B519CBSMsg1List.SVC_KEI_NO);
						
						// 機器提供サービス契約のサービス契約番号が設定されている場合、
						// 返品承認データ.サービス契約番号を機器提供サービス契約.サービス契約番号で上書きする
						if(svcKeiNo != null && !svcKeiNo.isEmpty())
						{
							childTemplate.set(EDK0301B020CBSMsg1List.SVC_KEI_NO, 
									checkTemplate.getString(EKK0341B519CBSMsg1List.SVC_KEI_NO));
						}
						// 機器は取得できたがサービス契約番号が設定されていていない場合、
						// 回線対象サービス契約からサービス契約番号を取得する
						else
						{
							String taknkikiSbtCd = checkTemplate.getString(EKK0341B519CBSMsg1List.TAKNKIKI_SBT_CD);
		
							// ◇上りマッピング処理
							// 上りマッピングの処理結果を取得するためにマップを初期化
							paramMap = new HashMap<String, Object>();
							
							// リクエストパラメータを引数に上りマッピング処理メソッドを実行
							paramMap = editInCheckKiasenMsg(param,
									checkTemplate.getString(EKK0341B519CBSMsg1List.SVC_KEI_KAISEN_UCWK_NO));
							
							// ◇ＳＣ呼出実行
							// SC呼び出し部品のインスタンス生成（引数にはログに出力するクラス名を渡す。空文字を設定した場合はログに出力されない。
							scCall = new ServiceComponentRequestInvoker();
							JSYejbLog.println(JSYejbLog.DEBUG, this.getClass(), "回線対象サービス契約一覧照会処理の実行");
							editResult = scCall.run(paramMap, handle);
							
							checkTemplates = (CAANMsg[])editResult.get(JCMConstants.TEMPLATE_LIST_KEY);
							checkMsg = checkTemplates[0];
							
							// チェック用検索リストを取得する。
							checkList = checkMsg.getCAANMsgList(EKK0241B002CBSMsg.EKK0241B002CBSMSG1LIST);
							// 宅内機器種別コード別にサービス契約番号を取得する。
							String kaiSvcKeiNo = getSvcKeiNo(checkList, taknkikiSbtCd);
							
							// 取得したサービス契約番号で、返品承認データ.サービス契約番号を上書きする。
							childTemplate.set(EDK0301B020CBSMsg1List.SVC_KEI_NO, kaiSvcKeiNo);
						}
// ▽▽▽ #63455 ADD START
						// 提供種別コードが未設定の場合、機器提供サービスの値を設定する
						String kktkSbtCd = checkTemplate.getString(EKK0341B519CBSMsg1List.KKTK_SBT_CD);
						String tkSbtCdNm = checkTemplate.getString(EKK0341B519CBSMsg1List.KKTK_SBT_CD_NM);
						
						String tkSbtCd = childTemplate.getString(EDK0301B020CBSMsg1List.TK_SBT_CD);
						if (kktkSbtCd != null && (tkSbtCd == null || tkSbtCd.isEmpty()))
						{
							// 提供種別コード
							childTemplate.set(EDK0301B020CBSMsg1List.TK_SBT_CD, kktkSbtCd);
							// 提供種別名
							childTemplate.set(EDK0301B020CBSMsg1List.TK_SBT_CD_NM, tkSbtCdNm);
						}
// ▲▲▲ #63455 ADD END
					}
				}
			}
		}
// ANK-3185-00-00 ADD END
		
// OM-2017-0001015 ADD START
		HashMap dataMap = (HashMap)param.getData("DKSV007901CC");
		dataMap.put("hmpinKikiSvcKeiNoList", hmpinKikiSvcKeiNoList);
// OM-2017-0001015 ADD END
		
		// ◇下りマッピング処理
		editOutMsg(result, param);
		
		if (JDKBPCommon.hasError(param))
		{
			throw new SCCallException("返品承認データ一覧照会処理失敗", "0", 
					Integer.parseInt(param.getControlMapData("returnCode").toString()));
		}
		
		return param;
	}


// ANK-3185-00-00 ADD START
	/**
	 * 回線対象サービス契約一覧から適切なサービス契約番号を返します。
	 * @param checkList 検索結果
	 * @param taknkikiSbtCd 宅内機器種別コード
	 * @return サービス契約番号
	 */
	private String getSvcKeiNo(CAANMsg[] checkList, String taknkikiSbtCd)
	{
		String returnSvcKeiNo = null;
		String svcCd = null;
		CAANMsg checkTemplate = null;

		if(checkList != null)
		{
			// 宅内機器種別コードが多機能ルータ、ONU、モデム、ＨＧＷの場合
			// ANK-4315-00-00 MOD START	
			//if(JDKStrConst.TAKINORT.equals(taknkikiSbtCd) || JDKStrConst.ONU.equals(taknkikiSbtCd) || JDKStrConst.MODEM.equals(taknkikiSbtCd))			
			if(JDKStrConst.TAKINORT.equals(taknkikiSbtCd) || JDKStrConst.ONU.equals(taknkikiSbtCd) || JDKStrConst.MODEM.equals(taknkikiSbtCd)
					|| JDKStrConst.HGW.equals(taknkikiSbtCd))
			// ANK-4315-00-00 MOD END
			{
				for(int i = 0; i < checkList.length; i++)
				{
					checkTemplate = checkList[i];
					// サービスコード取得
					svcCd = checkTemplate.getString(EKK0241B002CBSMsg1List.SVC_CD);
					// 回線対象サービス契約一覧.サービスコード = '01'(ネット)のレコードを優先してサービス契約番号を書き換える。
					if(NET.equals(svcCd))
					{
						returnSvcKeiNo = checkTemplate.getString(EKK0241B002CBSMsg1List.SVC_KEI_NO);
						break;
					}
					else if(TEL.equals(svcCd))
					{
						returnSvcKeiNo = checkTemplate.getString(EKK0241B002CBSMsg1List.SVC_KEI_NO);
					}
					
				}
			}
			// 宅内機器種別コードがV-ONUの場合
			else if(JDKStrConst.VONU.equals(taknkikiSbtCd))
			{
				for(int i = 0; i < checkList.length; i++)
				{
					checkTemplate = checkList[i];
					// サービスコード取得
					svcCd = checkTemplate.getString(EKK0241B002CBSMsg1List.SVC_CD);
					// 回線対象サービス契約一覧.サービスコード = '03'(TV)のレコードの場合、サービス契約番号を書き換える。
					if(TV.equals(svcCd))
					{
						returnSvcKeiNo = checkTemplate.getString(EKK0241B002CBSMsg1List.SVC_KEI_NO);
						break;
					}
					
				}
			}
		}
		return returnSvcKeiNo;
	}
// ANK-3185-00-00 ADD END

	/**
	 * 返品承認データ一覧取得処理チェックを行います。
	 * @param handle セッションハンドル
	 * @param param パラメータ
	 * @param fixedText 定型文字
	 * @return マッピングパラメータ
	 * @throws RequestParameterException
	 */
	public  HashMap<String, Object> getInvokeCBS(SessionHandle handle
			, IRequestParameterReadWrite param, String fixedText) throws RequestParameterException 
	{
		return editInMsg(param);
	}

	/**
	 * 返品承認データ一覧取得処理用メッセージ設定処理を行います。
	 * @param param パラメータ
	 * @return マッピングパラメータ
	 * @throws RequestParameterException
	 */
	private HashMap<String, Object> editInMsg(IRequestParameterReadWrite param) throws RequestParameterException
	{
		return MAPPER.editInMsg(param);
	}
	


	/**
	 * 返品承認データ一覧取得処理用メッセージ取得処理を行います。
	 * @param msgList メッセージリスト
	 * @param param パラメータ
	 * @return パラメータ
	 * @throws Exception
	 */
	private IRequestParameterReadWrite editOutMsg(Map<?, ?> msgList,
			IRequestParameterReadWrite param) throws Exception
	{
		return MAPPER.editResultRP(msgList, param);
	}
	

	/**
	 * サービスコンポーネント実行後に、IRequestParameterReadWriteにエラー情報をマッピングします。
	 * @param param パラメータ
	 * @param templates テンプレート
	 * @param returnCode リターンコード
	 * @return パラメータ
	 * @throws RequestParameterException
	 */
	public IRequestParameterReadWrite editErrorInfo(IRequestParameterReadWrite param
			, CAANMsg[] templates, int returnCode) throws RequestParameterException
	{
		return MAPPER.editErrorInfo(param, templates, returnCode);
	}

// ANK-3185-00-00 ADD START
	/**
	 * 機器提供サービス契約一覧取得処理用メッセージ設定処理を行います。
	 * @param param パラメータ
	 * @return マッピングパラメータ
	 * @throws Throwable 
	 */
	private HashMap<String, Object> editInCheckKikiMsg(IRequestParameterReadWrite param, String taknkikiModelCd,
			String kikiSeizoNo) throws Throwable
	{
		HashMap<String, Object> inMap = new HashMap<String, Object>();
		inMap.put("key_taknkiki_model_cd", taknkikiModelCd);
		inMap.put("key_kiki_seizo_no", kikiSeizoNo);
		
		param.setData("add_param", inMap);
		
		HashMap<String, Object> paramMap = MAPPER_GET_KIKI.editInMsg(param);

		return paramMap;
	}
	
	

	/**
	 * サービスコンポーネント実行後に、IRequestParameterReadWriteにエラー情報をマッピングします。
	 * @param param パラメータ
	 * @param templates テンプレート
	 * @param returnCode リターンコード
	 * @return パラメータ
	 * @throws Throwable 
	 */
	public IRequestParameterReadWrite editErrorCheckKikiInfo(IRequestParameterReadWrite param
			, CAANMsg[] templates, int returnCode) throws Throwable
	{
		return MAPPER_GET_KIKI.editErrorInfo(param, templates, returnCode);
	}

	/**
	 * 回線対象サービス契約一覧取得処理用メッセージ設定処理を行います。
	 * @param param パラメータ
	 * @return マッピングパラメータ
	 * @throws Throwable 
	 */
	private HashMap<String, Object> editInCheckKiasenMsg(IRequestParameterReadWrite param, 
			String svcKeiKaisenUtwkNo) throws Throwable
	{
		HashMap<String, Object> inMap = new HashMap<String, Object>();
		inMap.put("key_svc_kei_kaisen_utwk_no", svcKeiKaisenUtwkNo);
		
		param.setData("add_param", inMap);
		
		HashMap<String, Object> paramMap = MAPPER_GET_KAISEN.editInMsg(param);

		return paramMap;
	}
	

	/**
	 * サービスコンポーネント実行後に、IRequestParameterReadWriteにエラー情報をマッピングします。
	 * @param param パラメータ
	 * @param templates テンプレート
	 * @param returnCode リターンコード
	 * @return パラメータ
	 * @throws Throwable 
	 */
	public IRequestParameterReadWrite editErrorCheckKaisenInfo(IRequestParameterReadWrite param
			, CAANMsg[] templates, int returnCode) throws Throwable
	{
		return MAPPER_GET_KAISEN.editErrorInfo(param, templates, returnCode);
	}
// ANK-3185-00-00 ADD END
}
