/*********************************************************************
*  All Rights reserved,Copyright (c) K-Opticom
**********************************************************************
*＜プログラム内容＞
*	システム名			：eo顧客基幹システム
*	モジュール名		：JBSbatKKOrsjgsUseStpTrgtChsht
*	ソースファイル名	：JBSbatKKOrsjgsUseStpTrgtChsht.java
*	作成者				：富士通
*	作成日				：2018年03月23日
*＜機能概要＞
*卸先事業者利用停止完了情報送信対象抽出部品です。
*＜修正履歴＞
*	バージョン	修正日		修正者		修正内容
*   v37.00.00   2018/03/23  FJ)山地   【ANK-3366-00-00】eo光設備卸対応
*********************************************************************/
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 JBSbatKKOrsjgsUseStpTrgtChsht extends JBSbatBusinessService
{
	/**▼▼▼▼▼▼ツールから生成した宣言です 開始▼▼▼▼▼▼*/
	/**▲▲▲▲▲▲ツールから生成した宣言です 終了▲▲▲▲▲▲*/
	
	/** テーブル(卸先事業者契約異動通知)*/
	private static final String D_TBL_NAME_KK_T_ORSJGS_KEI_IDT = "KK_T_ORSJGS_KEI_IDT";

	/** SQL定義キー(KK_SELECT_009)*/
	private static final String KK_T_ORSJGS_KEI_IDT_SELECT_009 = "KK_SELECT_009";

	/** テーブルアクセスクラス(卸先事業者契約異動通知)*/
	private JBSbatSQLAccess db_KK_T_ORSJGS_KEI_IDT = null;

	/** 卸先契約利用停止完了情報送信ファイルファイルオブジェクト */
	private JBSbatBusinessFileUtil kkife382FileObj = null;

	/** 卸先契約利用停止完了情報送信ファイル */
	private static final String FILE_KKIFE382 = "KKIFE382_ZZ_YYMMDDhhmmss.csv";

	/** 卸先事業者契約異動通知更新ファイル(利用停止)ファイルオブジェクト */
	private JBSbatBusinessFileUtil kkifm786FileObj = null;

	/** 卸先事業者契約異動通知更新ファイル(利用停止) */
	private static final String FILE_KKIFM786003 = "KKIFM786003.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";

	/**
	 * 初期処理
	 * @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_KKIFM786003,
				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_KKIFE382.replaceAll("ZZ", inputOrsjgsCd);
			fileName = fileName.replaceAll("YYMMDDhhmmss", JCCBatCommon.getSysDateTime());
			kkife382FileObj = JKKBatCommon.createBusinessFileUtil(freeItems[0] + fileName,
							"", "", JKKBatConst.S_SEP_CAM);
			
			ArrayList<JBSbatCommonDBInterface> existsOrsjgsKeiIdtList = getExistOrsjgsKeiIdt(inputOrsjgsCd);
			
			int count = 0;
			
			fileOutKKIFE382Header();
			
			if (existsOrsjgsKeiIdtList != null)
			{
				for (int i = 0; i < existsOrsjgsKeiIdtList.size(); i++, count++)
				{
					// 卸先事業者利用停止完了情報ファイルにデータ情報を出力する
					fileOutKKIFE382data((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.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));
				}
			}
			fileOutKKIFE382Footer(count);
		}
		catch(Exception e)
		{
			throw e;
		}

		return null;
	}
	
	/**▲▲▲▲▲▲業務サービスの主処理を記述してください。▲▲▲▲▲▲*/

	/**
	 * 業務サービス終了処理
	 * @throws Exception
	 */
	public void terminal() throws Exception
	{
	/**▼▼▼▼▼▼業務サービスの終了処理を記述してください。▼▼▼▼▼▼*/
		// ファイルを閉じる
		JKKBatCommon.closeBusinessFileUtil(kkife382FileObj);
		JKKBatCommon.closeBusinessFileUtil(kkifm786FileObj);
		/**▼▼▼▼▼▼ツールから生成した終了処理のソースです 開始▼▼▼▼▼▼*/
		/**▲▲▲▲▲▲ツールから生成した終了処理のソースです 終了▲▲▲▲▲▲*/
		// DBアクセスクラスをクローズします
		db_KK_T_ORSJGS_KEI_IDT.close();
	/**▲▲▲▲▲▲業務サービスの終了処理を記述してください。▲▲▲▲▲▲*/
	}

	/**
	 * SQLKEY(KK_SELECT_009)で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_009(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_SELECT_009);
	}

	/**
	 * 卸先事業者連携識別コードをもとに卸先事業者契約異動通知スキーマを検索する.
	 * 取得項目：
				卸先事業者コード
				サービス契約番号
				サービス種別
				卸先事業者連携対象サービス契約番号
				卸先事業者契約異動通知結果コード
				卸先事業者契約異動処理年月日
				卸先事業者契約異動通知NG理由
	 * @param  orsjgsCd
	 * @return ArrayList
	 * @throws Exception
	 */
	private ArrayList<JBSbatCommonDBInterface> getExistOrsjgsKeiIdt(String orsjgsCd) throws Exception
	{
		Object[] param = {
				orsjgsCd
		};
		executeKK_T_ORSJGS_KEI_IDT_SELECT_009(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 orsjgsKeiIdtRsltCd 卸先事業者契約異動通知結果コード
	 * @param orsjgsKeiIdoTrnYmd 卸先事業者契約異動処理年月日
	 * @param orsjgsKeiIdtNgRsn 卸先事業者契約異動通知NG理由
	 * @throws Exception 業務サービス内で発生した例外全般。
	 */
	private void fileOutKKIFE382data(
								String orsjgsCd,
								String svcKeiNo,
								String orsjgsKeiIdtRsltCd,
								String orsjgsKeiIdoTrnYmd,
								String orsjgsKeiIdtNgRsn) throws Exception
	{
		// 卸先契約利用停止完了情報ファイルにデータ情報を出力する
		ArrayList<String> outputInfo = new ArrayList<String>();
		outputInfo.add(orsjgsCd);						// データ部-「レコード区分」	卸先事業者コード
		outputInfo.add(svcKeiNo);						// データ部-「共通キー」		サービス契約番号
		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(kkife382FileObj, outputInfo);
	}

	/**
	 * ファイルに卸先契約利用停止完了情報のヘッダ部を出力する
	 * @throws Exception 業務サービス内で発生した例外全般。
	 */
	private void fileOutKKIFE382Header() throws Exception
	{
		// 卸先契約利用停止完了情報ファイルファイルにデータ情報を出力する
		ArrayList<String> outputInfo = new ArrayList<String>();
		outputInfo.add("00");							// ヘッダ部-レコード区分
		JKKBatCommon.printDoubleQuoteBusinessFileUtil(kkife382FileObj, outputInfo);
	}

	/**
	 * ファイルに卸先契約利用停止完了情報のフッタ部を出力する
	 * @param count データ部の件数
	 * @throws Exception 業務サービス内で発生した例外全般。
	 */
	private void fileOutKKIFE382Footer(int count) throws Exception
	{
		// 卸先契約利用停止完了情報ファイルファイルにデータ情報を出力する
		
		ArrayList<String> outputInfo = new ArrayList<String>();
		outputInfo.add("99");									// トレーラ部-レコード区分
		outputInfo.add(String.valueOf(count));					// トレーラ部-データ部の件数
		JKKBatCommon.printDoubleQuoteBusinessFileUtil(kkife382FileObj, 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);
	}
}