/*********************************************************************
*  All Rights reserved,Copyright (c) K-Opticom
**********************************************************************
*＜プログラム内容＞
*	システム名			：eo顧客基幹システム
*	モジュール名		：JBSbatKUTaknkikiStatUpdSaksei
*	ソースファイル名	：JBSbatKUTaknkikiStatUpdSaksei.java
*	作成者				：富士通　
*	作成日				：2012年05月16日
*＜機能概要＞
*　宅内機器ステータス更新作成部品です。
*＜修正履歴＞
*	バージョン	修正日		修正者		修正内容
*	v1.00.00	2012/05/16   富士通		新規作成
*	v4.00.00	2012/06/12   FJ)中西	【ANK-0574-00-00】 住変同時番ポ(主幹：契約)
*********************************************************************/
package eo.business.service;

import eo.business.common.JBSbatBusinessService;
import eo.business.common.JKUBatCommon;
import eo.business.util.file.JBSbatKUIFE058;
import eo.business.util.table.JBSbatKK_T_KKTK_SVC_KEI;
import eo.business.util.table.JBSbatKU_T_KJAK_TG_TKKIKI;
import eo.business.util.table.JBSbatKU_T_KJ_KNRN_RCV_IF;
import eo.business.util.table.JBSbatKU_T_KOJIAK;
import eo.common.constant.JKUStrConst;
import eo.common.constant.JPCBatchMessageConstant;
import eo.framework.item.JBSbatCommonItem;
import eo.framework.item.JBSbatServiceInterfaceMap;
import eo.framework.item.JBSbatOutputItem;
import eo.framework.item.JBSbatCommonDBInterface;
import eo.framework.application.JBSbatBusinessError;
import eo.framework.db.JBSbatSQLAccess;

/**
* (クラスの機能概要) <p>
*<BR>
* @author 富士通
*/
public class JBSbatKUTaknkikiStatUpdSaksei extends JBSbatBusinessService
{
	/**▼▼▼▼▼▼ツールから生成した宣言です 開始▼▼▼▼▼▼*/
	/** テーブル(工事案件)*/
	private static final String D_TBL_NAME_KU_T_KOJIAK = "KU_T_KOJIAK";

	/** テーブル(工事案件対象宅内機器)*/
	private static final String D_TBL_NAME_KU_T_KJAK_TG_TKKIKI = "KU_T_KJAK_TG_TKKIKI";

	/** テーブル(機器提供サービス契約)*/
	private static final String D_TBL_NAME_KK_T_KKTK_SVC_KEI = "KK_T_KKTK_SVC_KEI";

	/** SQL定義キー(KU_SELECT_014)*/
	private static final String KU_T_KJAK_TG_TKKIKI_KU_SELECT_014 = "KU_SELECT_014";

	/** SQL定義キー(KU_SELECT_002)*/
	private static final String KK_T_KKTK_SVC_KEI_KU_SELECT_002 = "KU_SELECT_002";

	/** テーブルアクセスクラス(工事案件)*/
	private JBSbatSQLAccess db_KU_T_KOJIAK = null;

	/** テーブルアクセスクラス(工事案件対象宅内機器)*/
	private JBSbatSQLAccess db_KU_T_KJAK_TG_TKKIKI = null;

	/** テーブルアクセスクラス(機器提供サービス契約)*/
	private JBSbatSQLAccess db_KK_T_KKTK_SVC_KEI = null;
	/**▲▲▲▲▲▲ツールから生成した宣言です 終了▲▲▲▲▲▲*/
	
	/**▼▼▼▼▼▼業務チームで作成した宣言です 開始▼▼▼▼▼▼*/
	
	/** 宅内機器ステータス「51:設置」の定数 */
	private static final String TAKNKIKI_STAT_STC = "51";
	/** 宅内機器ステータス「52:お客様預り」の定数 */
	private static final String TAKNKIKI_STAT_CUST = "52";
	/** 宅内機器ステータス「53:残置」の定数 */
	private static final String TAKNKIKI_STAT_ZANCHI = "53";
	
	/**▲▲▲▲▲▲業務チームで作成した宣言です 終了▲▲▲▲▲▲*/
	
	/**
	 * 初期処理
	 * @param JBSbatCommonItem commonItem　バッチ共通パラメータ電文
	 * @throws Exception
	 */
	public void initial(JBSbatCommonItem commonItem) throws Exception
	{
	/**▼▼▼▼▼▼業務サービスの初期処理を記述してください。▼▼▼▼▼▼*/
		/**▼▼▼▼▼▼ツールから生成した初期化のソースです 開始▼▼▼▼▼▼*/
		// 共通パラメータを設定します
		super.setCommonInfo(commonItem);

		// DBアクセスクラスを生成します
		db_KU_T_KOJIAK = new JBSbatSQLAccess(commonItem, D_TBL_NAME_KU_T_KOJIAK);
		db_KU_T_KJAK_TG_TKKIKI = new JBSbatSQLAccess(commonItem, D_TBL_NAME_KU_T_KJAK_TG_TKKIKI);
		db_KK_T_KKTK_SVC_KEI = new JBSbatSQLAccess(commonItem, D_TBL_NAME_KK_T_KKTK_SVC_KEI);
		/**▲▲▲▲▲▲ツールから生成した初期化のソースです 終了▲▲▲▲▲▲*/
	/**▲▲▲▲▲▲業務サービスの初期処理を記述してください。▲▲▲▲▲▲*/
	}

	/**
	 * 主処理
	 * @param inMap　入力電文
	 * @return JBSbatOutputItem　出力情報
	 * @throws Exception
	 */
	public JBSbatOutputItem execute(JBSbatServiceInterfaceMap inMap) throws Exception
	{
	/**▼▼▼▼▼▼業務サービスの主処理を記述してください。▼▼▼▼▼▼*/
		// 出力共通電文を生成する。
		JBSbatOutputItem outputBean = new JBSbatOutputItem();
		
		// 工事関連受信情報の連携データ３(工事案件番号)を取得
		String kojiakNo = inMap.getString(JBSbatKU_T_KJ_KNRN_RCV_IF.RENKEI_DATA_3);
		
		// 工事案件を検索
		JBSbatCommonDBInterface kojiakMap = getKojiak(kojiakNo);
		
		// 検索結果が０件
		if (kojiakMap == null)
		{
			// 工事案件に該当の工事案件番号が存在しません。（00000000）
			commonItem.getLogPrint().printBusinessErrorLog(JPCBatchMessageConstant.EKUB0650KW, new String[]{
					JKUStrConst.SCHEMANM_KU0011,
					"工事案件番号",
					kojiakNo});
			
			throw new JBSbatBusinessError();
		}
		
		// 工事案件の工事案件種別コードを取得
		String kojiakSbt = kojiakMap.getString(JBSbatKU_T_KOJIAK.KOJIAK_SBT_CD);
		
		// 工事案件の住所変更新設(撤去)工事案件番号を格納する変数
		String adChgKojiakNo = null;
		
		/** 工事案件の工事案件種別コードが「新設 」、「住所変更(新設) 」の場合 */
		if (JKUStrConst.CD00577_NEWESTA.equals(kojiakSbt) ||
				JKUStrConst.CD00577_AD_CHG_NEWESTA.equals(kojiakSbt))
		{
			// 工事案件の住所変更撤去工事案件番号を取得
			adChgKojiakNo = kojiakMap.getString(JBSbatKU_T_KOJIAK.AD_CHG_TEKKYO_KJAK_NO);
		}
		/** 工事案件の工事案件種別コードが「撤去(解約)」、「住所変更(撤去) 」の場合 */
		else if (JKUStrConst.CD00577_TEKKYO_DSL.equals(kojiakSbt) ||
				JKUStrConst.CD00577_AD_CHG_TEKKYO.equals(kojiakSbt))
		{
			// 工事案件の住所変更新設工事案件番号を取得
			adChgKojiakNo = kojiakMap.getString(JBSbatKU_T_KOJIAK.AD_CHG_NEWESTA_KJAK_NO);
		}
		
		// 未設定の場合
		if (!JKUBatCommon.isNotNull(adChgKojiakNo))
		{
			return null;
		}
		
		// 工事案件(住所変更工事案件)を検索
		JBSbatCommonDBInterface adKojiakMap = getKojiak(adChgKojiakNo);
		
		// 検索結果が０件の場合
		if (adKojiakMap == null)
		{
			return null;
		}
		
		// 工事案件ステータスを取得
		String kojiakStat = adKojiakMap.getString(JBSbatKU_T_KOJIAK.KOJIAK_STAT);
		
		// 工事案件対象宅内機器を検索
		JBSbatCommonDBInterface kjakTgTkkikiMap = getKjakTgTkkiki(kojiakNo);
		
		// 検索結果が０件
		if (kjakTgTkkikiMap == null)
		{
			return null;
		}
		
		while (null != kjakTgTkkikiMap)
		{
			// 工事案件対象宅内機器ステータスを取得
			String kjakTgtkkikiStat = kjakTgTkkikiMap.getString(JBSbatKU_T_KJAK_TG_TKKIKI.KOJIAK_TRGT_TAKNKIKI_STAT);
			// 宅内機器異動コードを取得
			String taknkikiIdoCd = kjakTgTkkikiMap.getString(JBSbatKU_T_KJAK_TG_TKKIKI.TAKNKIKI_IDO_CD);
			
			/** 工事案件の工事案件種別コードが「新設 」、「住所変更(新設) 」の場合 */
			if (JKUStrConst.CD00577_NEWESTA.equals(kojiakSbt) ||
					JKUStrConst.CD00577_AD_CHG_NEWESTA.equals(kojiakSbt))
			{
				/**
				 *  工事案件ステータスが「工事完了済」且つ
				 *  工事案件対象宅内機器ステータスが「実績確定済」且つ
				 *  宅内機器異動異動コードが「移動」の場合
				 */
				if (JKUStrConst.CD00474_KOJI_FIN_ZM.equals(kojiakStat) &&
						JKUStrConst.CD00475_JSEKI_FIX_ZM.equals(kjakTgtkkikiStat) &&
						JKUStrConst.CD00562_MOVE.equals(taknkikiIdoCd))
				{
					// 出力共通電文に入出力インターフェースを設定(51:設置)
					outputBean.addOutMapList(setOutMap(kojiakMap, kjakTgTkkikiMap, TAKNKIKI_STAT_STC));
				}
				
			}
			/** 工事案件の工事案件種別コードが「撤去(解約)」、「住所変更(撤去) 」の場合 */
			else if (JKUStrConst.CD00577_TEKKYO_DSL.equals(kojiakSbt) ||
					JKUStrConst.CD00577_AD_CHG_TEKKYO.equals(kojiakSbt))
			{
				/**
				 *  工事案件ステータスが「工事完了済」以外且つ
				 *  工事案件対象宅内機器ステータスが「実績確定済」且つ
				 *  宅内機器異動異動コードが「移動」の場合
				 */
				if (!JKUStrConst.CD00474_KOJI_FIN_ZM.equals(kojiakStat) &&
						JKUStrConst.CD00475_JSEKI_FIX_ZM.equals(kjakTgtkkikiStat) &&
						JKUStrConst.CD00562_MOVE.equals(taknkikiIdoCd))
				{
					// 出力共通電文に入出力インターフェースを設定(52:お客様預り)
					outputBean.addOutMapList(setOutMap(kojiakMap, kjakTgTkkikiMap, TAKNKIKI_STAT_CUST));
				}
				
				/**
				 *  工事案件対象宅内機器ステータスが「なし」の場合
				 */
				if (JKUStrConst.CD00475_NASHI.equals(kjakTgtkkikiStat))
				{
					// 機器提供サービス契約番号を取得
					String kktkSvcKeiNo = kjakTgTkkikiMap.getString(JBSbatKU_T_KJAK_TG_TKKIKI.KKTK_SVC_KEI_NO);
					
					// 機器提供サービスを検索
					JBSbatCommonDBInterface kktkSvcKeiMap = getkktkSvcKei(kktkSvcKeiNo);
					
					// 検索結果が０件
					if (kktkSvcKeiMap == null)
					{
						// 検索結果を１件取得する
						kjakTgTkkikiMap = db_KU_T_KJAK_TG_TKKIKI.selectNext();
						
						// 工事案件対象宅内機器次レコードへ
						continue;
					}
					
					// サービス契約回線内訳番号を取得
					String svKeiKsnUwNo = kktkSvcKeiMap.getString(JBSbatKK_T_KKTK_SVC_KEI.SVC_KEI_KAISEN_UCWK_NO);
					
					/**
					 *  サービス契約回線内訳番号が設定済の場合
					 */
					if (JKUBatCommon.isNotNull(svKeiKsnUwNo))
					{
						// 出力共通電文に入出力インターフェースを設定(53:残置)
						outputBean.addOutMapList(setOutMap(kojiakMap, kjakTgTkkikiMap, TAKNKIKI_STAT_ZANCHI));
						
					}
				}
				
			}
			
			// 検索結果を１件取得する
			kjakTgTkkikiMap = db_KU_T_KJAK_TG_TKKIKI.selectNext();
		}
		
		// 出力共通電文を返却
		return outputBean;
	/**▲▲▲▲▲▲業務サービスの主処理を記述してください。▲▲▲▲▲▲*/
	}

	/**
	 * 業務サービス終了処理
	 * @throws Exception
	 */
	public void terminal() throws Exception
	{
	/**▼▼▼▼▼▼業務サービスの終了処理を記述してください。▼▼▼▼▼▼*/
		/**▼▼▼▼▼▼ツールから生成した終了処理のソースです 開始▼▼▼▼▼▼*/
		// DBアクセスクラスをクローズします
		db_KU_T_KOJIAK.close();
		db_KU_T_KJAK_TG_TKKIKI.close();
		db_KK_T_KKTK_SVC_KEI.close();
		/**▲▲▲▲▲▲ツールから生成した終了処理のソースです 終了▲▲▲▲▲▲*/
	/**▲▲▲▲▲▲業務サービスの終了処理を記述してください。▲▲▲▲▲▲*/
	}

	/**▼▼▼▼▼▼ツールから生成したメソッドです 開始▼▼▼▼▼▼*/
	/**
	 * PK(ＰＫ　検索)でDBアクセスを行います。<br>
	 * <p>
	 * <b>処理フロー</b><br>
	 * <pre>
	 * 1.引数で条件マップを作ります。<br>
	 *
	 * 2.DBアクセスを実行します。<br>
	 * 
	 * 3.メソッドの呼び出し方です。<br>
	 *		引数:
	 *		whereParam:PK項目の(項目、値)を(key、value)として,格納された配列です。PK項目は以下に説明します。
	 *		 	KOJIAK_NO
	 * </pre>
	 * <p>
	 * @param whereParam 条件項目の値。
	 * @return JBSbatCommonDBInterface 検索の結果。
	 * @throws Exception 業務サービス内で発生した例外全般。
	 */
	private JBSbatCommonDBInterface executeKU_T_KOJIAK_PKSELECT(Object[] whereParam) throws Exception
	{
		// 条件のマップを作成します
		JBSbatCommonDBInterface whereMap = new JBSbatCommonDBInterface();
		whereMap.setValue("KOJIAK_NO", whereParam[0]);

		// DBアクセスを実行します
		return db_KU_T_KOJIAK.selectByPrimaryKeys(whereMap);
	}

	/**
	 * SQLKEY(KU_SELECT_014)でDBアクセスを行います。<br>
	 * <p>
	 * <b>処理フロー</b><br>
	 * <pre>
	 * 1.引数でバイント変数を設定します。<br>
	 *
	 * 2.DBアクセスを実行します。<br>
	 * 
	 * 3.メソッドの呼び出し方です。<br>
	 *		引数:
	 *		param:順にバイント変数の値をparam配列に入れます。バイント変数は以下に説明します。
	 *		 	工事案件番号
	 * </pre>
	 * <p>
	 * @param param バイント変数の値配列。
	 * @throws Exception 業務サービス内で発生した例外全般。
	 */
	private void executeKU_T_KJAK_TG_TKKIKI_KU_SELECT_014(Object[] param) throws Exception
	{
		// バイント変数のリストを生成します
		JBSbatCommonDBInterface paramList = new JBSbatCommonDBInterface();
		paramList.setValue(param[0].toString());

		// DBアクセスを実行します
		db_KU_T_KJAK_TG_TKKIKI.selectBySqlDefine(paramList, KU_T_KJAK_TG_TKKIKI_KU_SELECT_014);
	}

	/**
	 * SQLKEY(KU_SELECT_002)でDBアクセスを行います。<br>
	 * <p>
	 * <b>処理フロー</b><br>
	 * <pre>
	 * 1.引数でバイント変数を設定します。<br>
	 *
	 * 2.DBアクセスを実行します。<br>
	 * 
	 * 3.メソッドの呼び出し方です。<br>
	 *		引数:
	 *		param:順にバイント変数の値をparam配列に入れます。バイント変数は以下に説明します。
	 *		 	機器提供サービス契約番号
	 * </pre>
	 * <p>
	 * @param param バイント変数の値配列。
	 * @throws Exception 業務サービス内で発生した例外全般。
	 */
	private void executeKK_T_KKTK_SVC_KEI_KU_SELECT_002(Object[] param) throws Exception
	{
		// バイント変数のリストを生成します
		JBSbatCommonDBInterface paramList = new JBSbatCommonDBInterface();
		paramList.setValue(param[0].toString());

		// DBアクセスを実行します
		db_KK_T_KKTK_SVC_KEI.selectBySqlDefine(paramList, KK_T_KKTK_SVC_KEI_KU_SELECT_002);
	}
	/**▲▲▲▲▲▲ツールから生成したメソッドです 終了▲▲▲▲▲▲*/
	
	/**▼▼▼▼▼▼業務チームで作成したメソッドです 開始▼▼▼▼▼▼*/
	
	/**
	 * 工事案件を取得する。
	 * @param kojiakNo　工事案件番号
	 * @return JBSbatCommonDBInterface 工事案件を格納したMap
	 * @throws Exception 
	 */	
	private JBSbatCommonDBInterface getKojiak(String kojiakNo) throws Exception
	{
		// 工事案件を格納するMap
		JBSbatCommonDBInterface kojiakMap = new JBSbatCommonDBInterface();
		
		// 工事案件テーブル検索パラメタ設定
		// 検索する値を設定
		Object[] whereParam = new Object[1];
		// 工事案件番号を設定
		whereParam[0] = kojiakNo;
		
		// 検索結果を１件取得する
		kojiakMap = this.executeKU_T_KOJIAK_PKSELECT(whereParam);
		
		return kojiakMap;
	}
	
	/**
	 * 工事案件対象宅内機器を取得する。
	 * @param kojiakNo　工事案件番号
	 * @return JBSbatCommonDBInterface 工事案件対象宅内機器を格納したMap
	 * @throws Exception 
	 */	
	private JBSbatCommonDBInterface getKjakTgTkkiki(String kojiakNo) throws Exception
	{
		// 工事案件対象宅内機器を格納するMap
		JBSbatCommonDBInterface kjakTgTkkikiMap = new JBSbatCommonDBInterface();
		
		// 工事案件対象宅内機器テーブル検索パラメタ設定
		// 検索する値を設定
		Object[] whereParam = new Object[1];
		// 工事案件番号を設定
		whereParam[0] = kojiakNo;
		
		// 検索を実行する
		this.executeKU_T_KJAK_TG_TKKIKI_KU_SELECT_014(whereParam);
		
		// 検索結果を１件取得する
		kjakTgTkkikiMap = db_KU_T_KJAK_TG_TKKIKI.selectNext();
		
		return kjakTgTkkikiMap;
	}
	
	/**
	 * 機器提供サービス契約を取得する。
	 * @param kktkSvcKeiNo　機器提供サービス契約番号
	 * @return JBSbatCommonDBInterface 機器提供サービス契約を格納したMap
	 * @throws Exception 
	 */	
	private JBSbatCommonDBInterface getkktkSvcKei(String kktkSvcKeiNo) throws Exception
	{
		// 機器提供サービス契約を格納するMap
		JBSbatCommonDBInterface kktkSvcKeiMap = new JBSbatCommonDBInterface();
		
		// 機器提供サービス契約テーブル検索パラメタ設定
		// 検索する値を設定
		Object[] whereParam = new Object[1];
		// 機器提供サービス契約番号を設定
		whereParam[0] = kktkSvcKeiNo;
		
		// 検索を実行する
		this.executeKK_T_KKTK_SVC_KEI_KU_SELECT_002(whereParam);
		
		// 検索結果を１件取得する
		kktkSvcKeiMap = db_KK_T_KKTK_SVC_KEI.selectNext();
		
		return kktkSvcKeiMap;
	}
	
	/**
	 * 宅内機器ステータス更新の設定を行う。
	 * @param kojiakMap　工事案件を格納したMap
	 * @param kjakTgTkkikiMap　工事案件対象宅内機器を格納したMap
	 * @param tknkikiStat　宅内機器ステータス
	 * @return JBSbatServiceInterfaceMap 宅内機器ステータス更新情報を格納したMap
	 * @throws Exception 
	 */	
	private JBSbatServiceInterfaceMap setOutMap(JBSbatCommonDBInterface kojiakMap, 
			JBSbatCommonDBInterface kjakTgTkkikiMap, String tknkikiStat) throws Exception
	{
		/** 出力共通電文の設定 */
		
		// 入出力インターフェースオブジェクトを生成
		JBSbatServiceInterfaceMap outMap = new JBSbatServiceInterfaceMap();
		
		// サービス契約番号
		outMap.set(JBSbatKUIFE058.SVC_KEI_NO, kojiakMap.getString(JBSbatKU_T_KOJIAK.RNKI_SVC_KEI_NO));
		// 機器提供サービス契約番号
		outMap.set(JBSbatKUIFE058.KKTK_SVC_KEI_NO, kjakTgTkkikiMap.getString(JBSbatKU_T_KJAK_TG_TKKIKI.KKTK_SVC_KEI_NO));
		// 宅内機器型式コード
		outMap.set(JBSbatKUIFE058.TAKNKIKI_MODEL_CD, kjakTgTkkikiMap.getString(JBSbatKU_T_KJAK_TG_TKKIKI.JSEKI_TAKNKIKI_MODEL_CD));
		// 機器製造番号
		outMap.set(JBSbatKUIFE058.KIKI_SEIZO_NO, kjakTgTkkikiMap.getString(JBSbatKU_T_KJAK_TG_TKKIKI.JSEKI_KIKI_SEIZO_NO));
		// 宅内機器ステータス
		outMap.set(JBSbatKUIFE058.TAKNKIKI_STAT, tknkikiStat);
		
		// 出力フラグを設定
		outMap.setOutFlg(true);
		
		return outMap;
		
	}
	/**▲▲▲▲▲▲業務チームで作成したメソッドです 終了▲▲▲▲▲▲*/
}
