/*********************************************************************
*  All Rights reserved,Copyright (c) K-Opticom
**********************************************************************
*＜プログラム内容＞
*	システム名			：eo顧客基幹システム
*	モジュール名		：JBSbatKKOrsjgsCancelInfoSendTrgtChsht
*	ソースファイル名	：JBSbatKKOrsjgsCancelInfoSendTrgtChsht.java
*	作成者				：富士通
*	作成日				：2018年03月23日
*＜機能概要＞
*卸先事業者キャンセル情報送信対象抽出部品です。
*＜修正履歴＞
*	バージョン	修正日		修正者		修正内容
*   v37.00.00   2018/03/23  FJ)山地   【ANK-3366-00-00】eo光設備卸対応
*   v39.00.00   2018/08/21  FJ)岡     【ANK-3478-00-00】eo光設備卸対応(サービス開始対応)
*   v39.00.01   2018/10/12  FJ)中原   【ST-2018-0000040】共通キー(ネット)の出力不正
*********************************************************************/
package eo.business.service;

import java.util.ArrayList;

import eo.business.common.JBSbatBusinessService;
import eo.business.common.JCCBatCommon;
import eo.business.common.JKKBatCommon;
import eo.business.common.JKKBatConst;
import eo.business.util.file.JBSbatCCIFM046;
import eo.business.util.table.JBSbatKK_T_ORSJGS_KEI_IDT;
import eo.framework.db.JBSbatSQLAccess;
import eo.framework.item.JBSbatCommonDBInterface;
import eo.framework.item.JBSbatCommonItem;
import eo.framework.item.JBSbatOutputItem;
import eo.framework.item.JBSbatServiceInterfaceMap;
import eo.framework.util.JBSbatBusinessFileUtil;

/**
* (クラスの機能概要) <p>
*<BR>
* @author 富士通
*/
public class JBSbatKKOrsjgsCancelInfoSendTrgtChsht extends JBSbatBusinessService
{
	/**▼▼▼▼▼▼ツールから生成した宣言です 開始▼▼▼▼▼▼*/
	/**▲▲▲▲▲▲ツールから生成した宣言です 終了▲▲▲▲▲▲*/
	
	/** テーブル(卸先事業者契約異動通知)*/
	private static final String D_TBL_NAME_KK_T_ORSJGS_KEI_IDT = "KK_T_ORSJGS_KEI_IDT";

	/** SQL定義キー(KK_SELECT_006)*/
	private static final String KK_T_ORSJGS_KEI_IDT_KK_SELECT_006 = "KK_SELECT_006";
	
	// ANK-3478-00-00 2018/08/21 ADD START
	/** SQL定義キー(KK_SELECT_011)*/
	private static final String KK_T_ORSJGS_KEI_IDT_KK_SELECT_011 = "KK_SELECT_011";
	// ANK-3478-00-00 2018/08/21 ADD END

	/** テーブルアクセスクラス(卸先事業者契約異動通知)*/
	private JBSbatSQLAccess db_KK_T_ORSJGS_KEI_IDT = null;

	/** 卸先契約キャンセル情報送信ファイルファイルオブジェクト */
	private JBSbatBusinessFileUtil kkife378FileObj = null;

	/** 卸先契約キャンセル情報送信ファイル */
	private static final String FILE_KKIFE378 = "KKIFE378_ZZ_YYMMDDhhmmss.csv";

	/** 卸先事業者契約異動通知更新ファイルファイルオブジェクト */
	private JBSbatBusinessFileUtil kkifm786FileObj = null;

	/** 卸先事業者契約異動通知更新ファイル */
	private static final String FILE_KKIFM786001 = "KKIFM786001.csv";

	/** 卸先事業者契約異動通知結果コード_1:OK */
	private static final String ORSJGS_KEI_IDT_RESULT_CD_OK  = "1";

	/** 卸先事業者契約異動通知結果コード_2:NG */
	private static final String ORSJGS_KEI_IDT_RESULT_CD_NG  = "2";

	/** 処理結果コード_00:正常 */
	private static final String RESULT_CD_OK  = "00";

	/** 処理結果コード_99:異常 */
	private static final String RESULT_CD_NG  = "99";
	
	// ANK-3478-00-00 2018/08/21 ADD START
	/** サービス種別電話 */
	private static final String SVC_SBT_TEL = "2";

	/** サービス種別テレビ */
	private static final String SVC_SBT_TV = "3";
	// ANK-3478-00-00 2018/08/21 ADD END
	
	/**
	 * 初期処理
	 * @param JBSbatCommonItem commonItem　バッチ共通パラメータ電文
	 * @throws Exception
	 */
	public void initial(JBSbatCommonItem commonItem) throws Exception
	{
	/**▼▼▼▼▼▼業務サービスの初期処理を記述してください。▼▼▼▼▼▼*/
		/**▼▼▼▼▼▼ツールから生成した初期化のソースです 開始▼▼▼▼▼▼*/
		/**▲▲▲▲▲▲ツールから生成した初期化のソースです 終了▲▲▲▲▲▲*/
		// 共通パラメータを設定します
		super.setCommonInfo(commonItem);
		// DBアクセスクラスを生成します
		db_KK_T_ORSJGS_KEI_IDT = new JBSbatSQLAccess(commonItem, D_TBL_NAME_KK_T_ORSJGS_KEI_IDT);
		
		String[] freeItems = commonItem.getFreeItem().split(JKKBatConst.S_PARAM_DELIM);
		kkifm786FileObj = JKKBatCommon.createBusinessFileUtil(freeItems[1] + FILE_KKIFM786001,
				JKKBatConst.S_CHR_CODE, JKKBatConst.S_LINE_SEPARAOR_LF, JKKBatConst.S_SEP_CAM);
	/**▲▲▲▲▲▲業務サービスの初期処理を記述してください。▲▲▲▲▲▲*/
	}

	/**
	 * 主処理
	 * @param inMap　入力電文
	 * @return JBSbatOutputItem　出力情報
	 * @throws Exception
	 */
	public JBSbatOutputItem execute(JBSbatServiceInterfaceMap inMap) throws Exception
	{
		/**▼▼▼▼▼▼業務サービスの主処理を記述してください。▼▼▼▼▼▼*/
		try
		{
			// エラーメッセージ文言
			String message = "";
			
			// 入力ファイルの内容取得（卸先事業者コード）
			String inputOrsjgsCd = (String)inMap.getString(JBSbatCCIFM046.ORSJGS_CD);
			
			String[] freeItems = commonItem.getFreeItem().split(JKKBatConst.S_PARAM_DELIM);
			String fileName = FILE_KKIFE378.replaceAll("ZZ", inputOrsjgsCd);
			fileName = fileName.replaceAll("YYMMDDhhmmss", JCCBatCommon.getSysDateTime());
			kkife378FileObj = JKKBatCommon.createBusinessFileUtil(freeItems[0] + fileName,
								"", "", JKKBatConst.S_SEP_CAM);
			
			ArrayList<JBSbatCommonDBInterface> existsOrsjgsKeiIdtList = getExistOrsjgsKeiIdt(inputOrsjgsCd);
			
			int count = 0;
			
			fileOutKKIFE378Header();

			if (existsOrsjgsKeiIdtList != null)
			{
				// ANK-3478-00-00 2018/08/21 ADD START
				
				// キャンセル完了連携ファイル出力対象格納リスト
				ArrayList<JBSbatCommonDBInterface> cancelFinRenkeiList = new ArrayList<JBSbatCommonDBInterface>();
				
				for (int j = 0; j < existsOrsjgsKeiIdtList.size(); j++)
				{
					// サービス種別を取得
					String svcSbt = (String)existsOrsjgsKeiIdtList.get(j).getString(JBSbatKK_T_ORSJGS_KEI_IDT.SVC_SBT);
					// サービス契約番号を取得
					String svcKeiNo = (String)existsOrsjgsKeiIdtList.get(j).getString(JBSbatKK_T_ORSJGS_KEI_IDT.SVC_KEI_NO);
					
					if(SVC_SBT_TEL.equals(svcSbt) || SVC_SBT_TV.equals(svcSbt))
					{
						// サービス種別が電話もしくはテレビの場合
						// 卸先事業者から申込みされたデータを取得する。
						ArrayList<JBSbatCommonDBInterface> orsjgsMskmDataList = getExistOrsjgsMskmData(svcKeiNo);
						
						if(orsjgsMskmDataList != null)
						{
							// キャンセル完了連携ファイル出力対象格納リストにデータを格納する。
							cancelFinRenkeiList.add(existsOrsjgsKeiIdtList.get(j));
						}
						
					}
					else
					{
						// キャンセル完了連携ファイル出力対象格納リストにデータを格納する。
						cancelFinRenkeiList.add(existsOrsjgsKeiIdtList.get(j));
					}
					
				}
				// ANK-3478-00-00 2018/08/21 ADD END
				
				// ANK-3478-00-00 2018/08/21 MOD START
//				for (int i = 0; i < existsOrsjgsKeiIdtList.size(); i++, count++)
//				{
//					// 卸先契約キャンセル情報送信ファイルにデータ情報を出力する
//					fileOutKKIFE378data((String)existsOrsjgsKeiIdtList.get(i).getString(JBSbatKK_T_ORSJGS_KEI_IDT.ORSJGS_CD),
//										(String)existsOrsjgsKeiIdtList.get(i).getString(JBSbatKK_T_ORSJGS_KEI_IDT.SVC_KEI_NO),
//										(String)existsOrsjgsKeiIdtList.get(i).getString(JBSbatKK_T_ORSJGS_KEI_IDT.SVC_SBT),
//										(String)existsOrsjgsKeiIdtList.get(i).getString(JBSbatKK_T_ORSJGS_KEI_IDT.ORSJGS_RNK_TG_SVC_KEI_NO),
//										(String)existsOrsjgsKeiIdtList.get(i).getString(JBSbatKK_T_ORSJGS_KEI_IDT.ORSJGS_KEI_IDT_RSLT_CD),
//										(String)existsOrsjgsKeiIdtList.get(i).getString(JBSbatKK_T_ORSJGS_KEI_IDT.ORSJGS_KEI_IDO_TRN_YMD),
//										(String)existsOrsjgsKeiIdtList.get(i).getString(JBSbatKK_T_ORSJGS_KEI_IDT.ORSJGS_KEI_IDT_NG_RSN));
//				}
//				
//				for (int j = 0; j < existsOrsjgsKeiIdtList.size(); j++)
//				{
//					// 卸先事業者契約異動通知更新ファイル
//					fileOutKKIFM786((String)existsOrsjgsKeiIdtList.get(j).getString(JBSbatKK_T_ORSJGS_KEI_IDT.ORSJGS_CD),
//									(String)existsOrsjgsKeiIdtList.get(j).getString(JBSbatKK_T_ORSJGS_KEI_IDT.ORSJGS_KEI_IDT_NO));
//				}
				
				if (cancelFinRenkeiList != null)
				{
					for (int i = 0; i < cancelFinRenkeiList.size(); i++, count++)
					{
						// 卸先契約キャンセル情報送信ファイルにデータ情報を出力する
						fileOutKKIFE378data((String)cancelFinRenkeiList.get(i).getString(JBSbatKK_T_ORSJGS_KEI_IDT.ORSJGS_CD),
											(String)cancelFinRenkeiList.get(i).getString(JBSbatKK_T_ORSJGS_KEI_IDT.SVC_KEI_NO),
											(String)cancelFinRenkeiList.get(i).getString(JBSbatKK_T_ORSJGS_KEI_IDT.SVC_SBT),
											(String)cancelFinRenkeiList.get(i).getString(JBSbatKK_T_ORSJGS_KEI_IDT.ORSJGS_RNK_TG_SVC_KEI_NO),
											(String)cancelFinRenkeiList.get(i).getString(JBSbatKK_T_ORSJGS_KEI_IDT.ORSJGS_KEI_IDT_RSLT_CD),
											(String)cancelFinRenkeiList.get(i).getString(JBSbatKK_T_ORSJGS_KEI_IDT.ORSJGS_KEI_IDO_TRN_YMD),
											(String)cancelFinRenkeiList.get(i).getString(JBSbatKK_T_ORSJGS_KEI_IDT.ORSJGS_KEI_IDT_NG_RSN));
					}
					
					for (int j = 0; j < cancelFinRenkeiList.size(); j++)
					{
						// 卸先事業者契約異動通知更新ファイル
						fileOutKKIFM786((String)cancelFinRenkeiList.get(j).getString(JBSbatKK_T_ORSJGS_KEI_IDT.ORSJGS_CD),
										(String)cancelFinRenkeiList.get(j).getString(JBSbatKK_T_ORSJGS_KEI_IDT.ORSJGS_KEI_IDT_NO));
					}
				}
				// ANK-3478-00-00 2018/08/21 MOD END
			}
			fileOutKKIFE378Footer(count);
		}
		catch(Exception e)
		{
			throw e;
		}

		return null;
	}
	
	/**▲▲▲▲▲▲業務サービスの主処理を記述してください。▲▲▲▲▲▲*/

	/**
	 * 業務サービス終了処理
	 * @throws Exception
	 */
	public void terminal() throws Exception
	{
	/**▼▼▼▼▼▼業務サービスの終了処理を記述してください。▼▼▼▼▼▼*/
		// ファイルを閉じる
		JKKBatCommon.closeBusinessFileUtil(kkife378FileObj);
		JKKBatCommon.closeBusinessFileUtil(kkifm786FileObj);
		/**▼▼▼▼▼▼ツールから生成した終了処理のソースです 開始▼▼▼▼▼▼*/
		/**▲▲▲▲▲▲ツールから生成した終了処理のソースです 終了▲▲▲▲▲▲*/
		// DBアクセスクラスをクローズします
		db_KK_T_ORSJGS_KEI_IDT.close();
	/**▲▲▲▲▲▲業務サービスの終了処理を記述してください。▲▲▲▲▲▲*/
	}

	/**
	 * SQLKEY(KK_SELECT_006)で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_ORSJGS_KEI_IDT_SELECT_006(Object[] param) throws Exception
	{
		// バイント変数のリストを生成します
		JBSbatCommonDBInterface paramList = new JBSbatCommonDBInterface();
		paramList.setValue(param[0].toString());
		
		// DBアクセスを実行します
		db_KK_T_ORSJGS_KEI_IDT.selectBySqlDefine(paramList, KK_T_ORSJGS_KEI_IDT_KK_SELECT_006);
	}

	/**
	 * 卸先事業者連携識別コードをもとに卸先事業者契約異動通知スキーマを検索する.
	 * 取得項目：
				卸先事業者コード
				サービス契約番号
				サービス種別
				卸先事業者連携対象サービス契約番号
				卸先事業者契約異動通知結果コード
				卸先事業者契約異動処理年月日
				卸先事業者契約異動通知NG理由
	 * @param  orsjgsCd
	 * @return ArrayList
	 * @throws Exception
	 */
	private ArrayList<JBSbatCommonDBInterface> getExistOrsjgsKeiIdt(String orsjgsCd) throws Exception
	{
		Object[] param = {
				orsjgsCd
		};
		executeKK_T_ORSJGS_KEI_IDT_SELECT_006(param);
		JBSbatCommonDBInterface orsjgsInfo = new JBSbatCommonDBInterface();
		ArrayList<JBSbatCommonDBInterface>  orsjgsList = new ArrayList<JBSbatCommonDBInterface>();

		while((orsjgsInfo = db_KK_T_ORSJGS_KEI_IDT.selectNext()) != null)
		{
			orsjgsList.add(orsjgsInfo);
		}
		return (orsjgsList.size() > 0 ? orsjgsList : null);
	}
	

	/**
	 * ファイルに卸先契約キャンセル情報を出力する
	 * @param orsjgsCd 卸先事業者コード
	 * @param svcKeiNo サービス契約番号
	 * @param svcSbt サービス種別
	 * @param orsjgsRnkTgSvcKeiNo 卸先事業者連携対象サービス契約番号
	 * @param orsjgsKeiIdtRsltCd 卸先事業者契約異動通知結果コード
	 * @param orsjgsKeiIdoTrnYmd 卸先事業者契約異動処理年月日
	 * @param orsjgsKeiIdtNgRsn 卸先事業者契約異動通知NG理由
	 * @throws Exception 業務サービス内で発生した例外全般。
	 */
	private void fileOutKKIFE378data(
								String orsjgsCd,
								String svcKeiNo,
								String svcSbt,
								String orsjgsRnkTgSvcKeiNo,
								String orsjgsKeiIdtRsltCd,
								String orsjgsKeiIdoTrnYmd,
								String orsjgsKeiIdtNgRsn) throws Exception
	{
		// 卸先契約キャンセル情報送信ファイルファイルにデータ情報を出力する
		ArrayList<String> outputInfo = new ArrayList<String>();
		outputInfo.add(orsjgsCd);						// データ部-「レコード区分」	卸先事業者コード
		outputInfo.add(svcKeiNo);						// データ部-「共通キー」		サービス契約番号
		outputInfo.add(svcSbt);							// データ部-「サービス種別」	サービス種別
		// ST-2018-0000040 ADD START
		if ( SVC_SBT_TEL.equals(svcSbt) || SVC_SBT_TV.equals(svcSbt) )
		{
		// ST-2018-0000040 ADD END
			outputInfo.add(orsjgsRnkTgSvcKeiNo);			// データ部-「共通キー(ネット)」卸先事業者連携対象サービス契約番号
		// ST-2018-0000040 ADD START
		}
		else
		{
			outputInfo.add("");
		}
		// ST-2018-0000040 ADD END
		outputInfo.add(orsjgsKeiIdtRsltCd);				// データ部-「処理結果」		卸先事業者契約異動通知結果コード
		if(ORSJGS_KEI_IDT_RESULT_CD_OK.equals(orsjgsKeiIdtRsltCd))
		{
			outputInfo.add(orsjgsKeiIdoTrnYmd);				// データ部-「キャンセル日」	卸先事業者契約異動処理年月日
		}
		else
		{
			outputInfo.add("00000000");						// データ部-「キャンセル日」	卸先事業者契約異動処理年月日(卸先事業者契約異動通知結果コードがNGの場合)
		}
		outputInfo.add(orsjgsKeiIdtNgRsn);				// データ部-「NG理由」			卸先事業者契約異動通知NG理由
		outputInfo.add("");								// データ部-「予備項目1」
		outputInfo.add("");								// データ部-「予備項目2」
		outputInfo.add("");								// データ部-「予備項目3」
		outputInfo.add("");								// データ部-「予備項目4」
		outputInfo.add("");								// データ部-「予備項目5」
		outputInfo.add("");								// データ部-「予備項目6」
		outputInfo.add("");								// データ部-「予備項目7」
		outputInfo.add("");								// データ部-「予備項目8」
		outputInfo.add("");								// データ部-「予備項目9」
		outputInfo.add("");								// データ部-「予備項目10」
		JKKBatCommon.printDoubleQuoteBusinessFileUtil(kkife378FileObj, outputInfo);
	}

	/**
	 * ファイルに卸先契約キャンセル情報のヘッダ部を出力する
	 * @throws Exception 業務サービス内で発生した例外全般。
	 */
	private void fileOutKKIFE378Header() throws Exception
	{
		// 卸先契約キャンセル情報送信ファイルファイルにデータ情報を出力する
		ArrayList<String> outputInfo = new ArrayList<String>();
		outputInfo.add("00");							// ヘッダ部-レコード区分
		JKKBatCommon.printDoubleQuoteBusinessFileUtil(kkife378FileObj, outputInfo);
	}

	/**
	 * ファイルに卸先契約キャンセル情報のフッタ部を出力する
	 * @param count データ部の件数
	 * @throws Exception 業務サービス内で発生した例外全般。
	 */
	private void fileOutKKIFE378Footer(int count) throws Exception
	{
		// 卸先契約キャンセル情報送信ファイルファイルにデータ情報を出力する
		
		ArrayList<String> outputInfo = new ArrayList<String>();
		outputInfo.add("99");									// トレーラ部-レコード区分
		outputInfo.add(String.valueOf(count));					// トレーラ部-データ部の件数
		JKKBatCommon.printDoubleQuoteBusinessFileUtil(kkife378FileObj, outputInfo);
	}

	/**
	 * ファイルに卸先事業者契約異動通知更新情報を出力する
	 * @param orsjgsCd 卸先事業者コード
	 * @param orsjgsKeiIdtNo 卸先事業者契約異動通知番号
	 * @throws Exception 業務サービス内で発生した例外全般。
	 */
	private void fileOutKKIFM786(
								String orsjgsCd,
								String orsjgsKeiIdtNo) throws Exception
	{
		// 卸先契約キャンセル情報送信ファイルファイルにデータ情報を出力する
		ArrayList<String> outputInfo = new ArrayList<String>();
		outputInfo.add(orsjgsCd);						// 卸先事業者コード
		outputInfo.add(orsjgsKeiIdtNo);					// 卸先事業者契約異動通知番号

		JKKBatCommon.printDoubleQuoteBusinessFileUtil(kkifm786FileObj, outputInfo);
	}
	
	// ANK-3478-00-00 2018/08/21 ADD START
	/**
	 * サービス契約番号をもとに卸先事業者契約異動通知スキーマを検索する.
	 * 取得項目：卸先事業者契約異動通知番号
	 * @return ArrayList
	 * @throws Exception
	 */
	private ArrayList<JBSbatCommonDBInterface> getExistOrsjgsMskmData(String svcKeiNo) throws Exception
	{
		Object[] param = {
				svcKeiNo			// 卸先事業者契約異動通知．サービス契約番号					 = サービス契約番号
		};
		executeKK_T_ORSJGS_KEI_IDT_KK_SELECT_011(param);
		JBSbatCommonDBInterface orsjgsInfo = new JBSbatCommonDBInterface();
		ArrayList<JBSbatCommonDBInterface> orsjgsMskmDataList = new ArrayList<JBSbatCommonDBInterface>();

		while((orsjgsInfo = db_KK_T_ORSJGS_KEI_IDT.selectNext()) != null)
		{
			orsjgsMskmDataList.add(orsjgsInfo);
		}
		return (orsjgsMskmDataList.size() > 0 ? orsjgsMskmDataList : null);
	}
	
	/**
	 * SQLKEY(KK_SEKECT_011)で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_ORSJGS_KEI_IDT_KK_SELECT_011(Object[] param) throws Exception
	{
		// バイント変数のリストを生成します
		JBSbatCommonDBInterface paramList = new JBSbatCommonDBInterface();
		paramList.setValue(param[0].toString());
		
		// DBアクセスを実行します
		db_KK_T_ORSJGS_KEI_IDT.selectBySqlDefine(paramList, KK_T_ORSJGS_KEI_IDT_KK_SELECT_011);
	}
	// ANK-3478-00-00 2018/08/21 ADD END
}