/*********************************************************************
* All Rights reserved,Copyright (c) K-Opticom
**********************************************************************
*＜プログラム内容＞
*   システム名      ：eo顧客基幹システム
*   モジュール名    ：JKKKojiOccurChk
*   ソースファイル名：JKKKojiOccurChk.java
*   作成者          ：富士通
*   日付            ：2013年01月17日
*＜機能概要＞
*   工事発生有無チェック部品です。
*＜修正履歴＞
*   バージョン  修正日       修正者      修正内容
*   v4.00.00    2013/01/17   FJ）        新規作成
 *  v8.00.00    2014/04/15  FJ)星野     OM-2014-0001365対応
*   v4.00.00    2013/01/17   FJ)三原     【ANK-3387-00-00】マンションタイプ光コンセントサービス導入   
*  v61.00.00	2023/01/04  FJ)澤田	   【ANK-4315-00-00】【eo定期】 eoホームゲートウェイ導入対応
*  v73.01.01	2025/03/10   FJ) 舘山    【#83584】HGW瑕疵内障害
**********************************************************************/
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.constant.JKKKojiAnkenConstCC;
import com.fujitsu.futurity.bp.custom.constant.JKKSvcConst;
import com.fujitsu.futurity.bp.x21.bpm.ServiceComponentRequestInvoker;
import com.fujitsu.futurity.bp.x21.bpm.db.SessionHandle;
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.CCException;
import com.fujitsu.futurity.bp.x21.cc.exception.SCCallException;
import com.fujitsu.futurity.common.JCMConstants;
import com.fujitsu.futurity.common.x01.sc.SCControlMapKeys;
import com.fujitsu.futurity.model.base.CAANMsg;
import com.sun.enterprise.tools.common.util.StringUtils;

import eo.common.constant.JKKStrConst;
import eo.common.util.JKKCommonUtil;
import eo.ejb.cbs.cbsmsg.EDK0011B080CBSMsg;
import eo.ejb.cbs.cbsmsg.EDK0011B080CBSMsg1List;
import eo.ejb.cbs.cbsmsg.EDK0011B100CBSMsg;
import eo.ejb.cbs.cbsmsg.EDK0011B100CBSMsg1List;
import eo.ejb.cbs.cbsmsg.EKK0081B009CBSMsg;
import eo.ejb.cbs.cbsmsg.EKK0081B009CBSMsg1List;
import eo.ejb.cbs.cbsmsg.EKK0341A010CBSMsg;
import eo.ejb.cbs.cbsmsg.EKK0341A010CBSMsg1List;
import eo.ejb.cbs.cbsmsg.EKK0891A010CBSMsg1List;
import eo.ejb.cbs.cbsmsg.EKU0011A010CBSMsg1List;
import eo.ejb.cbs.cbsmsg.EKU0011B050CBSMsg;
import eo.ejb.cbs.cbsmsg.EKU0011B050CBSMsg1List;

/**
 * 工事発生有無チェック部品です。<p>
 * <br>
 * @author FJ
 */
public class JKKKojiOccurChk extends AbstractCommonComponent
{

	/** マンション物件コード:マンション */
	private static final String MANSION_BUKKEN_CD_MANSION = "001";

	/** 回線コード: 光回線(マンション光配線) */
	public static final String KAISEN_CD_HIKARI_HAISEN = "1004";

	/** 提供方式コード（光配線） */
	private static final String TK_HOSHIKI_CD_HIKARI_HAISEN = "008";
	/** 提供方式コード（旧光直収） */
	private static final String TK_HOSHIKI_CD_KYU_HIKARI_CHOKUSHU = "009";


	/** 異動区分（サービス追加） */
	private static final String IDO_DIV_SVC_ADD = "00002";

// OM-2014-0001365対応 200140415 星野 ADD START
	/** 新設 */
	public static final String CD00577_NEWESTA = "001";
	/** 住所変更(新設) */
	public static final String CD00577_AD_CHG_NEWESTA = "003";
	/** プラン変更(収容替) */
	public static final String CD00577_PLAN_CHG_SHUYO = "009";
// OM-2014-0001365対応 200140415 星野 ADD END
	// ANK-4315-00-00 ADD START
	/** ONU交換工事 */
	public static final String CD00577_ONU_KOKAN = "015";
	// ANK-4315-00-00 ADD END
	
	
	/** 工事案件ステータス（工事会社決定済） */
	private static final String KOJIAK_STAT_COMPANY_ADD_ZM = "160";
// OM-2014-0001365対応 200140415 星野 ADD START
	/** 工事案件ステータス（受付済） */
	private static final String KOJIAK_STAT_UKTK_ZM = "130";
	/** 工事案件ステータス（完了済） */
	private static final String KOJIAK_STAT_FIN_ZM = "200";
// OM-2014-0001365対応 200140415 星野 ADD END
	

	/** 配送ステータス（受付済） */
	private static final String HAISO_STAT_UK_ZM = "001";
	/** 配送ステータス（指示済） */
	private static final String HAISO_STAT_SIZISHO = "002";
	/** 配送ステータス（出荷済） */
	private static final String HAISO_STAT_SHKA_ZM = "003";
	/** 配送ステータス（完了済） */
	private static final String HAISO_STAT_FIN_ZM = "004";
	/** 配送ステータス（中止） */
	private static final String HAISO_STAT_CANCEL = "005";

	/** 宅内機器種別コード */
	private static final String TAKNKIKI_SBT_CD_ONU = "D0";

// ▽▽▽ #83584 ADD START
	/** 宅内機器種別コード(HGW) */
	private static final String TAKNKIKI_SBT_CD_HGW = "S0";
// △△△ #83584 ADD END
	/**
	 * 料金グループコード
	 */
	/** 料金グループコード（ｅｏ光ネットホームタイプ） */
	public static final String PRC_GRP_CD_NET_HM = "02";
	/** 料金グループコード（ｅｏ光ネットメゾンタイプ） */
	public static final String PRC_GRP_CD_NET_MZ = "03";
	/** 料金グループコード（ｅｏ光ネットマンションタイプ） */
	public static final String PRC_GRP_CD_NET_MT = "04";
	/** 料金グループコード（ｅｏ光電話） */
	public static final String PRC_GRP_CD_TEL = "10";

	/** 
	 * 契約ステータス
	 */
	/** 契約ステータス：030(締結済) */
	public static final String SVC_KEI_STAT_030 = "030";
	/** 契約ステータス：100(サービス提供中) **/
	public static final String SVC_KEI_STAT_100 = "100"; 
	/** 契約ステータス：210(休止・中断中) **/
	public static final String SVC_KEI_STAT_210 = "210";
	/** 契約ステータス：220(停止中) **/
	public static final String SVC_KEI_STAT_220 = "220";
	/** 契約ステータス：910(解約済) **/
	public static final String SVC_KEI_STAT_910 = "910";
	/** 契約ステータス：920(キャンセル済) **/
	public static final String SVC_KEI_STAT_920 = "920";

	/** エラーメッセージ */
	private static final String ERR_MSG = "INVALID_RETURN_MESSAGE";

	/** エラーメッセージ：パラメータ設定不正 */
	private static final String ERR_MSG_PARAM = "リクエストパラメータに誤りがあります。";

	/** サービスインタフェース呼び出しで使用するマッパー群 */
	private JKKKojiAnkenMapperCC mapper = null;

	/** SC呼び出し部品 */
	ServiceComponentRequestInvoker scCall = null;

	/** ユーザ任意文字列 */
	private String fixedTextGlobal = null;

	/**
	 * 工事発生有無チェックの初期処理です。
	 * <br>
	 * @param param モデルグループ、コントロールマップを含むパラメータオブジェクト
	 * @param fixedText ユーザ任意文字列
	 * @throws Throwable 
	 */
	private void init(IRequestParameterReadWrite param, String fixedText)
	throws Throwable
	{
		// SC呼び出し部品のインスタンス生成（引数にはログに出力するクラス名を渡す。空文字を設定した場合はログに出力されない。）
		if (null == this.scCall)
		{
			this.scCall = new ServiceComponentRequestInvoker();
		}
		
		// マッパーのインスタンス生成
		if (null == this.mapper)
		{
			this.mapper = new JKKKojiAnkenMapperCC();
		}
		
		// ユーザ任意文字列をグローバルで保持
		this.fixedTextGlobal = fixedText;

		// リターンコードに正常を設定
		param.setControlMapData(SCControlMapKeys.RETURN_CODE, JCMConstants.RET_NORMAL);
	}

	/**
	 * 工事発生有無チェック処理を行います。
	 * <br>
	 * @param handle セッションマネージャなどを持ったハンドル
	 * @param param モデルグループ、コントロールマップを含むパラメータオブジェクト
	 * @param trgtData 対象データ
	 * @param fixedText ユーザ任意文字列
	 * @throws Throwable 
	 */
	@SuppressWarnings("unchecked")
	public boolean chkKojiOccurInf(SessionHandle handle, IRequestParameterReadWrite param, HashMap trgtData, String fixedText)
	throws Throwable
	{
		init(param, fixedText);

		// 入力パラメータチェック処理
		String errMsg = chkInput(handle, param, trgtData);
		if (!JKKCommonUtil.isNull(errMsg))
		{
			// チェックエラー
			throw new CCException(errMsg, new Exception());
		}

		// チェック処理
		return chkKojiOccur(handle, param, trgtData); 
	}

	/**
	 * 入力パラメータの必須チェックを行います。
	 * <br>
	 * @param handle セッションマネージャなどを持ったハンドル
	 * @param param モデルグループ、コントロールマップを含むパラメータオブジェクト
	 * @param trgtData 対象データ
	 * @return エラーメッセージ
	 */
	@SuppressWarnings("unchecked")
	private String chkInput(SessionHandle handle, IRequestParameterReadWrite param, HashMap trgtData)
	{
		// 必須チェック
		String svcKeiNo = (String)trgtData.get(JKKKojiAnkenConstCC.SVC_KEI_NO);
		String idoDiv = (String)trgtData.get(JKKKojiAnkenConstCC.IDO_DIV);
		String prcGrpCd = (String)trgtData.get(JKKKojiAnkenConstCC.PRC_GRP_CD);

		// サービス契約番号が設定されていない
		if (JKKCommonUtil.isNull(svcKeiNo))
		{
			// サービス契約番号が設定されていないのでエラー
			return ERR_MSG_PARAM + "サービス契約番号が設定されていません。";
		}

		// 異動区分が設定されていない
		if (JKKCommonUtil.isNull(idoDiv))
		{
			// サービス契約番号が設定されていないのでエラー
			return ERR_MSG_PARAM + "異動区分が設定されていません。";
		}

		// 料金グループコードが設定されていない
		if (JKKCommonUtil.isNull(prcGrpCd))
		{
			// 料金グループコードが設定されていないのでエラー
			return ERR_MSG_PARAM + "料金グループコードが設定されていません。";
		}

		// 関連チェック

		String mansionBukkenCd = (String)trgtData.get(JKKKojiAnkenConstCC.MANSION_BUKKEN_CD);
		String tkHoshikiCd = (String)trgtData.get(JKKKojiAnkenConstCC.TK_HOSHIKI_CD);
		String kaisenCd = (String)trgtData.get(JKKKojiAnkenConstCC.KAISEN_CD);
		
		/** マンション物件コードがマンションの場合、提供方式コード・回線コードのいずれかは必須 **/
		if (MANSION_BUKKEN_CD_MANSION.equals(mansionBukkenCd))
		{
			// 回線コード・提供方式コードがどちらも設定されていない
			if (JKKCommonUtil.isNull(kaisenCd) && JKKCommonUtil.isNull(tkHoshikiCd))
			{
				// いずれかは必須のため、エラー
				return ERR_MSG_PARAM + "提供方式コード・回線コードがいずれも設定されていません";
			}
		}

		// チェックOK
		return "";
	}

	/**
	 * 対象サービスが工事なしかどうかを判断し、結果を返却する。
	 * <br>
	 * @param handle セッションマネージャなどを持ったハンドル
	 * @param param モデルグループ、コントロールマップを含むパラメータオブジェクト
	 * @param trgtData 対象データ
	 * @return 工事なし判定（工事なし：true）
	 * @throws Throwable 例外時にスローします
	 */
	@SuppressWarnings("unchecked")
	private boolean chkKojiOccur(SessionHandle handle, IRequestParameterReadWrite param, HashMap trgtData) throws Throwable
	{
		// 工事発生無しフラグ
		boolean isNonKojiOccur = false;
		
		// 対象データから業務情報を取得
		String svcKeiNo = (String)trgtData.get(JKKKojiAnkenConstCC.SVC_KEI_NO);
		String prcGrpCd = (String)trgtData.get(JKKKojiAnkenConstCC.PRC_GRP_CD);
		String mansionBukkenCd = (String)trgtData.get(JKKKojiAnkenConstCC.MANSION_BUKKEN_CD);
		String tkHoshikiCd = (String)trgtData.get(JKKKojiAnkenConstCC.TK_HOSHIKI_CD);
		String kaisenCd = (String)trgtData.get(JKKKojiAnkenConstCC.KAISEN_CD);
		String idoDiv = (String)trgtData.get(JKKKojiAnkenConstCC.IDO_DIV);
// IT1-2013-000XXXX対応 20130508 星野 ADD START
		String addSakiKojiakNo = (String)trgtData.get("add_saki_kojiak_no");
		String addSakiKojiakStat = (String)trgtData.get("add_saki_kojiak_stat");
// IT1-2013-000XXXX対応 20130508 星野 ADD END
		// ANK-3387-00-00 ADD START
		String tkHoshikiPatternCd = (String)trgtData.get(JKKKojiAnkenConstCC.TK_HOSHIKI_PATTERN_CD);
		// ANK-3387-00-00 ADD END
		// ANK-4315-00-00 ADD START
		// 工事受付コード
		String kojiUkCd =(String)trgtData.get(JKKKojiAnkenConstCC.KOJI_UK_CD );
		// 工事受付詳細コード
		String kojiUkDtlCd =(String)trgtData.get(JKKKojiAnkenConstCC.KOJI_UK_DTL_CD );
		// ANK-4315-00-00 ADD END
		if (!PRC_GRP_CD_NET_HM.equals(prcGrpCd) &&
			!PRC_GRP_CD_NET_MZ.equals(prcGrpCd) &&
			!PRC_GRP_CD_NET_MT.equals(prcGrpCd) &&
			!PRC_GRP_CD_TEL.equals(prcGrpCd))
		{
			// ネット・電話以外の場合、処理しない
			return isNonKojiOccur;
		}
		
		// マンションの場合
		if (MANSION_BUKKEN_CD_MANSION.equals(mansionBukkenCd))
		{
			// 回線コードが指定されている場合
			if (!JKKCommonUtil.isNull(kaisenCd))
			{
				if (!KAISEN_CD_HIKARI_HAISEN.equals(kaisenCd))
				{
					// マンション光配線以外であれば、工事無し
					isNonKojiOccur = true;
				}
			}
			// 提供方式コードが指定されている場合
			if (!JKKCommonUtil.isNull(tkHoshikiCd))
			{
				// ANK-3387-00-00 MOD START
				//if (!TK_HOSHIKI_CD_HIKARI_HAISEN.equals(tkHoshikiCd) &&
				//	!TK_HOSHIKI_CD_KYU_HIKARI_CHOKUSHU.equals(tkHoshikiCd))
				if ((!TK_HOSHIKI_CD_HIKARI_HAISEN.equals(tkHoshikiCd) &&
					!TK_HOSHIKI_CD_KYU_HIKARI_CHOKUSHU.equals(tkHoshikiCd)) || JKKStrConst.TK_HOSHIKI_PATTERN_CD_51.equals(tkHoshikiPatternCd))
				// ANK-3387-00-00 MOD END
				{
					// 光配線・旧光直収以外であれば、工事無し
					isNonKojiOccur = true;
				}
			}
		}
		
		// 上記判定で工事無しと判断されていない場合のみ、後続処理を行う
		if (!isNonKojiOccur)
		{
			if (IDO_DIV_SVC_ADD.equals(idoDiv))
			{
				// サービス追加の場合
				
				// 対象料金グループリスト
				ArrayList<String> targetPrcGrpCdList = new ArrayList<String>();
				if (PRC_GRP_CD_NET_HM.equals(prcGrpCd) ||
					PRC_GRP_CD_NET_MZ.equals(prcGrpCd) ||
					PRC_GRP_CD_NET_MT.equals(prcGrpCd))
				{
					// ネットの場合、対象料金グループリストに電話を追加
					targetPrcGrpCdList.add(PRC_GRP_CD_TEL);
				}
				else if (PRC_GRP_CD_TEL.equals(prcGrpCd))
				{
					// 電話の場合、対象料金グループリストにネットを追加
					targetPrcGrpCdList.add(PRC_GRP_CD_NET_HM);
					targetPrcGrpCdList.add(PRC_GRP_CD_NET_MZ);
					targetPrcGrpCdList.add(PRC_GRP_CD_NET_MT);
				}
				
				if (!targetPrcGrpCdList.isEmpty())
				{
					// 同一場所サービス契約情報照会サービスIF呼出処理を実施
					HashMap<String, Object> ekk0081b009Hash = new HashMap<String, Object>();
					callEKK0081B009(param, handle, svcKeiNo, ekk0081b009Hash);
					
					CAANMsg[] ekk0081b009List = (CAANMsg[])ekk0081b009Hash.get(EKK0081B009CBSMsg.EKK0081B009CBSMSG1LIST);
					if (ekk0081b009List != null && ekk0081b009List.length != 0)
					{
						for (int i = 0;i<ekk0081b009List.length;i++){
							String tmpSvcKeiStat = (String)ekk0081b009List[i].getString(EKK0081B009CBSMsg1List.SVC_KEI_STAT);
							String tmpPrcGrpCd = (String)ekk0081b009List[i].getString(EKK0081B009CBSMsg1List.PRC_GRP_CD);
							
							String tmpSvcKeiNo = (String)ekk0081b009List[i].getString(EKK0081B009CBSMsg1List.SVC_KEI_NO);
							
							if (targetPrcGrpCdList.contains(tmpPrcGrpCd))
							{
								// 対象料金グループリストに含まれる料金グループコードの場合
// OM-2014-0001365対応 20140415 星野 ADD START
								// 対象サービスが電話の場合、ネット収容替工事を考慮する必要があるため
								// サービス契約ステータスによる判定は行わない
								if( !PRC_GRP_CD_TEL.equals(prcGrpCd) ){
// OM-2014-0001365対応 20140415 星野 ADD END
									if (SVC_KEI_STAT_100.equals(tmpSvcKeiStat) ||
										SVC_KEI_STAT_210.equals(tmpSvcKeiStat) ||
										SVC_KEI_STAT_220.equals(tmpSvcKeiStat))
									{
										// ANK-4315-00-00 ADD START
										// ONU交換工事の場合スキップ
										if (!("007".equals( kojiUkCd ) && "E0".equals(kojiUkDtlCd)))
										{
										// ANK-4315-00-00 ADD END
											// サービス契約ステータスがサービス提供中、休止・中断中、停止中の場合
											isNonKojiOccur = true;
											break;
										// ANK-4315-00-00 ADD START
										}
										// ANK-4315-00-00 ADD END
									}
// OM-2014-0001365対応 20140415 星野 ADD START
								}
// OM-2014-0001365対応 20140415 星野 ADD END
								// 対象料金グループが電話かつサービスステータスが締結済の場合
								if (PRC_GRP_CD_TEL.equals(prcGrpCd) &&
// OM-2014-0001365対応 20140415 星野 MOD START
//									SVC_KEI_STAT_030.equals(tmpSvcKeiStat)
									 ( SVC_KEI_STAT_030.equals(tmpSvcKeiStat)
										|| SVC_KEI_STAT_100.equals(tmpSvcKeiStat) 
										|| SVC_KEI_STAT_210.equals(tmpSvcKeiStat) 
										|| SVC_KEI_STAT_220.equals(tmpSvcKeiStat)
									 )
// OM-2014-0001365対応 20140415 星野 MOD END
								){
									
									// 工事案件ステータス
									String kojiak_stat = "";
									
									// 工事案件一覧照会（工事案件番号サービス契約番号）IF呼出処理を実施
									HashMap<String, String> condMap = new HashMap<String, String>();
									HashMap<String, Object> reqMap;
									Map<?, ?> resMap;
									
									condMap.clear();
									condMap.put( EKU0011B050CBSMsg.KEY_KOJIAK_NO_SVC_KEI_NO, tmpSvcKeiNo);
									reqMap = this.mapper.setEKU0011B050(param, fixedTextGlobal, condMap);
									resMap = scCall.run( reqMap, handle );
									ArrayList<HashMap<String, Object>> eku0011b050List =  this.mapper.getEKU0011B050( param, this.fixedTextGlobal, resMap );
									mapper.scResultCheck( param );
									
									// ■工事案件番号を抽出し、対象の工事案件情報を取得する。
// OM-2014-0001365対応 20140415 星野 MOD START
//									Iterator<HashMap<String, Object>> eku0011b050Ite = eku0011b050List.iterator();
//									// 最初の１件目のみを対象とする
//									if (eku0011b050Ite.hasNext())
//									{
//										// カレントの工事案件情報を取得
//										HashMap<String, Object> curKu0011_b050 = eku0011b050Ite.next();
									
									HashMap<String, Object> curKu0011_b050 = null;
									
									// まずは仕掛中工事を探す
									for( HashMap<String, Object> eku0011b050Map : eku0011b050List ){
										
										String kojiakNo = (String)eku0011b050Map.get(EKU0011B050CBSMsg1List.KOJIAK_NO);
										// 工事案件一意照会
										HashMap<String, Object> ku0011_a010 = getEKU0011A010(param, handle, kojiakNo);
										
										if(ku0011_a010==null || ku0011_a010.isEmpty()){
											continue;
										}

										// 最新基本工事フラグが立っているものは仕掛中ではない
										String rcntKihonKojiFlg = (String)ku0011_a010.get(EKU0011A010CBSMsg1List.RCNT_KIHON_KOJI_FLG);
										if("1".equals(rcntKihonKojiFlg)){
											continue;
										}
										
										// 新設・住変新設・収容替工事・ONU交換工事が対象
										String kojiakSbtCd = (String)ku0011_a010.get(EKU0011A010CBSMsg1List.KOJIAK_SBT_CD);
										if( !CD00577_NEWESTA.equals(kojiakSbtCd) 
											&& !CD00577_AD_CHG_NEWESTA.equals(kojiakSbtCd) 
											&& !CD00577_PLAN_CHG_SHUYO.equals(kojiakSbtCd)
											// ANK-4315-00-00 ADD START
											&& !CD00577_ONU_KOKAN.equals(kojiakSbtCd)
											// ANK-4315-00-00 ADD END
										){
											continue;
										}
										
										
										// ステータスを元に仕掛中を探す(130〜200)
										String kojiakStat = (String)ku0011_a010.get(EKU0011A010CBSMsg1List.KOJIAK_STAT);
										if( KOJIAK_STAT_UKTK_ZM.compareTo(kojiakStat) <= 0 
											&& KOJIAK_STAT_FIN_ZM.compareTo(kojiakStat) >= 0
										){
											// 確定
											curKu0011_b050 = eku0011b050Map;
											break;
										}
										
									}
									
									// 仕掛中工事が無い場合、最新基本工事を探す
									if(curKu0011_b050==null || curKu0011_b050.isEmpty()){
										for( HashMap<String, Object> eku0011b050Map : eku0011b050List ){

											String kojiakNo = (String)eku0011b050Map.get(EKU0011B050CBSMsg1List.KOJIAK_NO);
											// 工事案件一意照会
											HashMap<String, Object> ku0011_a010 = getEKU0011A010(param, handle, kojiakNo);
											
											if(ku0011_a010==null || ku0011_a010.isEmpty()){
												continue;
											}
	
											// 最新基本工事フラグが立っているものだけが対象
											String rcntKihonKojiFlg = (String)ku0011_a010.get(EKU0011A010CBSMsg1List.RCNT_KIHON_KOJI_FLG);
											if(!"1".equals(rcntKihonKojiFlg)){
												continue;
											}
	
											// 新設・住変新設・収容替工事・ONU交換工事が対象
											String kojiakSbtCd = (String)ku0011_a010.get(EKU0011A010CBSMsg1List.KOJIAK_SBT_CD);
											if( !CD00577_NEWESTA.equals(kojiakSbtCd) 
												&& !CD00577_AD_CHG_NEWESTA.equals(kojiakSbtCd) 
												&& !CD00577_PLAN_CHG_SHUYO.equals(kojiakSbtCd)
												// ANK-4315-00-00 ADD START
												&& !CD00577_ONU_KOKAN.equals(kojiakSbtCd)
												// ANK-4315-00-00 ADD END
											){
												continue;
											}
											// 確定
											curKu0011_b050 = eku0011b050Map;
											break;
										}
									}
									
									if(curKu0011_b050!=null && !curKu0011_b050.isEmpty()){
// OM-2014-0001365対応 20140415 星野 MOD END
										
										// 工事案件ステータスを取得
										kojiak_stat = (String) curKu0011_b050.get(EKU0011B050CBSMsg1List.KOJIAK_STAT);
										
										// 工事案件ステータスが160「工事会社決定済」未満の場合
										if (KOJIAK_STAT_COMPANY_ADD_ZM.compareTo(kojiak_stat) > 0){
											// 処理なし
										} else {
											// 工事案件ステータスが160「工事会社決定済」以上の場合、配送情報一覧照会を実行する
											
											ArrayList<String> haisoStatList = new ArrayList<String>();
											
											haisoStatList.add(HAISO_STAT_UK_ZM);
											haisoStatList.add(HAISO_STAT_SIZISHO);
											haisoStatList.add(HAISO_STAT_SHKA_ZM);
											haisoStatList.add(HAISO_STAT_FIN_ZM);
											haisoStatList.add(HAISO_STAT_CANCEL);
											
											// 配送情報一覧照会処理
											HashMap<String, Object> eDK0011B080Hash = new HashMap<String, Object>();
											JKKBpCommon.searchHaisoInfo(param, handle, tmpSvcKeiNo, null, null, null, haisoStatList, eDK0011B080Hash, this.fixedTextGlobal);
											
											// 配送情報を取り出す
											CAANMsg[] eDK0011B080CBSMSG1list = (CAANMsg[])eDK0011B080Hash.get(EDK0011B080CBSMsg.EDK0011B080CBSMSG1LIST);
											
											// 配送情報が1件でも取得できた場合
											if (eDK0011B080CBSMSG1list != null && eDK0011B080CBSMSG1list.length != 0)
											{
												for (int j = 0; j < eDK0011B080CBSMSG1list.length; j++){
													
													String workKikiSvcKeiNo = (String)eDK0011B080CBSMSG1list[j].getString(EDK0011B080CBSMsg1List.KKTK_SVC_KEI_NO);
													String workHaisoStat = (String)eDK0011B080CBSMSG1list[j].getString(EDK0011B080CBSMsg1List.HAISO_STAT);
													
													// 機器提供サービス契約一意照会処理を実施
													HashMap<String, Object> eKK0341A010Hash = new HashMap<String, Object>();
													JKKBpCommon.searchKktkSvcKei(param, handle, workKikiSvcKeiNo, eKK0341A010Hash, this.fixedTextGlobal);
													
													// 機器提供サービス契約情報を取り出す
													CAANMsg[] eKK0341A010CBSMSG1listWork = (CAANMsg[])eKK0341A010Hash.get(EKK0341A010CBSMsg.EKK0341A010CBSMSG1LIST);
													
													if (eKK0341A010CBSMSG1listWork != null && eKK0341A010CBSMSG1listWork.length > 0)
													{
														// 機器提供サービス契約情報を取得できた場合
														HashMap<String, Object> eKK0341A010CBSMSG1WORK = eKK0341A010CBSMSG1listWork[0].getMsgData();
														
														String workTaknKikiSbtCd = (String)eKK0341A010CBSMSG1WORK.get(EKK0341A010CBSMsg1List.TAKNKIKI_SBT_CD);
														
														// 宅内機器種別コードがD0(ONU)の場合、配送ステータスを条件に工事発生無しフラグのオンオフを判断する
// ▽▽▽ #83584 Modify START
//														if (TAKNKIKI_SBT_CD_ONU.equals(workTaknKikiSbtCd)){
														if (TAKNKIKI_SBT_CD_ONU.equals(workTaknKikiSbtCd) || TAKNKIKI_SBT_CD_HGW.equals(workTaknKikiSbtCd)){
// △△△ #83584 Modify END
															
															// 配送ステータスが中止以外の場合
															if (!HAISO_STAT_CANCEL.equals(workHaisoStat)){
																// ANK-4315-00-00 ADD START
																// ONU交換工事の場合スキップ
																if (!("007".equals( kojiUkCd ) && "E0".equals(kojiUkDtlCd)))
																{
																// ANK-4315-00-00 ADD END
																	isNonKojiOccur = true;
																	break;
																// ANK-4315-00-00 ADD START
																}
																// ANK-4315-00-00 ADD END
															}
														}
													}
												}
											}
										}
									}
									// 工事発生無しと判断されている場合
									if (isNonKojiOccur)
									{
										break;
									}
								}
							}
						}
					}
				}
// IT1-2013-000XXXX対応 20130508 星野 ADD START
			// 住所変更 修正モードでの電話サービス追加時用
			// 工事案件ステータスで修正モードでの電話サービス追加を判断する
			}else if( 
				JKKSvcConst.IDO_DIV_ADCHGADD.equals(idoDiv) && 
				!StringUtils.isEmpty(addSakiKojiakNo) &&
				!StringUtils.isEmpty(addSakiKojiakStat) &&
				"130".compareTo(addSakiKojiakStat) < 0
			){
					
				// 住所変更の場合、同一場所サービスのステータスでは判断できないので工事案件ステータス（完了済以降）で判断する
				if( "200".equals(addSakiKojiakStat) ){
					// 工事案件ステータスが完了済の場合、追加配送フラグにONを設定する
					isNonKojiOccur = true;
					
				// 対象料金グループが電話の場合
				}else if (JKKSvcConst.PRC_GRP_CD_TEL.equals(prcGrpCd) ){
					// 工事案件ステータスが160「工事会社決定済」未満の場合、何もしない
					if (KOJIAK_STAT_COMPANY_ADD_ZM.compareTo(addSakiKojiakStat) > 0){
						// 何もしない
						
					}else{
						// 工事案件ステータスが160「工事会社決定済」以上の場合、配送情報一覧照会を実行する
							
						// 住所変更データの場合、ONUが転居先につながっているために配送情報一覧照会では配送を取得できないので
						// 工事会社配送対象物品一覧照会を使用する
						HashMap<String, Object> eDK0011B100Hash = callEDK0011B100(param, handle, addSakiKojiakNo);
						
						// 配送情報を取り出す
						CAANMsg[] EDK0011B100CBSMSG1list = (CAANMsg[])eDK0011B100Hash.get(EDK0011B100CBSMsg.EDK0011B100CBSMSG1LIST);
						
						// 配送情報が1件でも取得できた場合
						if (EDK0011B100CBSMSG1list != null && EDK0011B100CBSMSG1list.length != 0){
							for (int j = 0;j<EDK0011B100CBSMSG1list.length;j++){
								
								String workKikiSvcKeiNo = (String)EDK0011B100CBSMSG1list[j].getString(EDK0011B100CBSMsg1List.KKTK_SVC_KEI_NO);
								String workHaisoStat = (String)EDK0011B100CBSMSG1list[j].getString(EDK0011B100CBSMsg1List.HAISO_STAT);
								
								// 機器提供サービス契約一意照会処理を実施
								HashMap<String, Object> eKK0341A010Hash = new HashMap<String, Object>();
								JKKBpCommon.searchKktkSvcKei(param, handle, workKikiSvcKeiNo, eKK0341A010Hash, this.fixedTextGlobal);
								
								// 機器提供サービス契約情報を取り出す
								CAANMsg[] eKK0341A010CBSMSG1listWork = (CAANMsg[])eKK0341A010Hash.get(EKK0341A010CBSMsg.EKK0341A010CBSMSG1LIST);
								
								if (eKK0341A010CBSMSG1listWork != null && eKK0341A010CBSMSG1listWork.length > 0)
								{
									// 機器提供サービス契約情報を取得できた場合
									HashMap<String, Object> eKK0341A010CBSMSG1WORK = eKK0341A010CBSMSG1listWork[0].getMsgData();
									
									String workTaknKikiSbtCd = (String)eKK0341A010CBSMSG1WORK.get(EKK0341A010CBSMsg1List.TAKNKIKI_SBT_CD);
									
									// 宅内機器種別コードがD0(ONU)の場合、配送ステータスを条件に機器更新フラグのオンオフを判断する
// ▽▽▽ #83584 Modify START
//									if (TAKNKIKI_SBT_CD_ONU.equals(workTaknKikiSbtCd)){
									if (TAKNKIKI_SBT_CD_ONU.equals(workTaknKikiSbtCd) || TAKNKIKI_SBT_CD_HGW.equals(workTaknKikiSbtCd)){
// △△△ #83584 Modify END
										
										// 配送ステータスが中止の場合
										if (HAISO_STAT_CANCEL.equals(workHaisoStat)){
											//isAddHaisou = true;
											//break;
										}else{
										// 配送ステータスが中止以外の場合
											isNonKojiOccur = true;
										}
									}
								}
							}
						}else{
							// 何もしない
						}
					}
				}
// IT1-2013-000XXXX対応 20130508 星野 ADD END
			}
		}
		
		return isNonKojiOccur;
	}

// OM-2014-0001365対応 20140415 星野 ADD START
	private HashMap<String, Object> getEKU0011A010( IRequestParameterReadWrite param, SessionHandle handle, String kojiakNo) throws Exception{
		HashMap<String, Object> reqMap;
		Map<?, ?> resMap;
		HashMap<String, String> condMap = new HashMap<String, String>();
		// 住所変更登録CCマッピングクラスインスタンスを取得
		JKKAdchgMapperCC adchgMapper = JKKAdchgMapperCC.getInstance();
		// ●工事案件情報の取得
		condMap.clear();
		condMap.put( JKKAdchgMapperCC.COND_KEY_KOJIAK_NO, kojiakNo);
		reqMap = adchgMapper.setEKU0011A010( param, this.fixedTextGlobal, condMap );
		resMap = scCall.run( reqMap, handle );
		HashMap<String, Object> ku0011_a010 = adchgMapper.getEKU0011A010( param, this.fixedTextGlobal, resMap );
		mapper.scResultCheck( param );
		return ku0011_a010;
	}
// OM-2014-0001365対応 20140415 星野 ADD END
	
	/**
	 * 同一場所サービス契約情報照会サービスIF呼出処理
	 * 
	 * @param param リクエストパラメータ
	 * @param handle セッションハンドル
	 * @param svcKeiNo サービス契約番号
	 * @param resultHash 結果のハッシュ
	 * @throws Throwable 例外時にスローされます
	 */
	private void callEKK0081B009(IRequestParameterReadWrite param, SessionHandle handle, String svcKeiNo,
			HashMap<String, Object> resultHash) throws Throwable
	{
		
		// 上り情報をマッピング
		HashMap<String, Object> sIFRequest = this.mapper.editInMsgEKK0081B009(param, svcKeiNo);

		// SIFの呼び出し
		Map<?, ?> sIFResult = this.scCall.run(sIFRequest, handle);

		// エラー情報のマッピング
		this.mapper.editResultRPEKK0081B009(sIFResult, param, this.fixedTextGlobal);

		// エラーチェック処理
		errChk(sIFResult);

		// SIFの実行結果を設定
		resultHash.putAll(getWorkCAANMsg(sIFResult));
	}
	
// IT1-2013-000XXXX対応 20130508 星野 ADD START
	/**
	 * 工事会社配送対象物品一覧照会S-IF
	 * 
	 * @param param リクエストパラメータ
	 * @param handle セッションハンドル
	 * @param kojiak_no 工事案件番号
	 * @return 照会結果のマップ
	 * @throws Exception 任意の例外
	 * @since 2013-04-23 IT1-2013-0000998
	 */
	private HashMap<String, Object> callEDK0011B100(
			IRequestParameterReadWrite param, SessionHandle handle, String kojiak_no) throws Exception
	{
		// 上り情報をマッピング
		HashMap<String, Object> sIFRequest = this.mapper.editInMsgEDK0011B100(param, kojiak_no);
		
		// SIFの呼び出し
		Map<?, ?> sIFResult = this.scCall.run(sIFRequest, handle);

		// エラー情報のマッピング
		this.mapper.editResultRPEDK0011B100(sIFResult, param, this.fixedTextGlobal);
		
		// エラーチェック処理
		errChk(sIFResult);

		// SIFの実行結果を設定
		HashMap<String, Object> EDK0011B100OutMap = getWorkCAANMsg(sIFResult);
		return EDK0011B100OutMap;
	}
// IT1-2013-000XXXX対応 20130508 星野 ADD END
	/**
	 * エラーチェック処理
	 * 
	 * @param msgList サービスインタフェース実行結果
	 * return void
	 * @throws SCCallException 
	 */
	private void errChk(Map<?, ?> msgList) 
	throws SCCallException
	{
		CAANMsg[] templates = (CAANMsg[])msgList.get(JCMConstants.TEMPLATE_LIST_KEY);
		CAANMsg template = templates[0];

		// リターンコード取得
		int returnCode = (Integer)msgList.get(JCMConstants.RET_CD_INT_KEY);
		
		// ステータス
		int templateStatus = template.getInt(JCMConstants.STATUS_INT_KEY);
		
		if ((0 != returnCode) || (0 != templateStatus))
		{
			throw new SCCallException(ERR_MSG, String.valueOf(returnCode), templateStatus);
		}
	}
	
	/**
	 * 業務データの取得処理です。
	 * 
	 * @param rslt SVIFの実行結果データ
	 * @return 業務データ
	 */
	private HashMap<String, Object> getWorkCAANMsg(Map<?, ?> rslt)
	{
		CAANMsg[] templates = (CAANMsg[])rslt.get(JCMConstants.TEMPLATE_LIST_KEY);
		CAANMsg parentTemplate = templates[0];

		return (HashMap<String, Object>)parentTemplate.getMsgData();
	}
}
