/*********************************************************************
*  All Rights reserved,Copyright (c) K-Opticom
**********************************************************************
*＜プログラム内容＞
*	システム名			：eo顧客基幹システム
*	モジュール名		：JBSbatKKTvCrsStbHsgChkListSksi
*	ソースファイル名	：JBSbatKKTvCrsStbHsgChkListSksi.java
*	作成者				：富士通　
*	作成日				：2016年03月08日
*＜機能概要＞
*　ＴＶコース／ＳＴＢ不整合チェックリスト作成部品です。
*＜修正履歴＞
*	バージョン	修正日		修正者		修正内容
*	v25.00.00	2016/03/08	FJ) 謝		【ANK-2530-00-00】TV新コースおよびVOD導入 新規作成
*********************************************************************/
package eo.business.service;

import java.io.BufferedReader;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStreamReader;
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.table.JBSbatKK_M_PCRS;
import eo.business.util.table.JBSbatZM_M_CD_NM_KANRI;
import eo.common.constant.JKKStrConst;
import eo.common.constant.JZM0171Constant;
import eo.common.util.JKKTvCrsStbHsgChk;
import eo.framework.db.JBSbatSQLAccess;
import eo.framework.item.JBSbatCommonDBInterface;
import eo.framework.item.JBSbatCommonItem;
import eo.framework.item.JBSbatOutputItem;
import eo.framework.util.JBSbatBusinessFileUtil;
import eo.framework.util.JBSbatDateUtil;

/**
* (クラスの機能概要) <p>
*<BR>
* @author 富士通
*/
public class JBSbatKKTvCrsStbHsgChkListSksi extends JBSbatBusinessService
{
	/**▼▼▼▼▼▼ツールから生成した宣言です 開始▼▼▼▼▼▼*/
	/** テーブル(料金コース)*/
	private static final String D_TBL_NAME_KK_M_PCRS = "KK_M_PCRS";

	/** テーブル(コード名称管理)*/
	private static final String D_TBL_NAME_ZM_M_CD_NM_KANRI = "ZM_M_CD_NM_KANRI";

	/** テーブル(ダウンロードファイル管理)*/
	private static final String D_TBL_NAME_ZM_T_DL_FILE_KANRI = "ZM_T_DL_FILE_KANRI";

	/** SQL定義キー(KK_SELECT_001)*/
	private static final String KK_M_PCRS_KK_SELECT_001 = "KK_SELECT_001";

	/** SQL定義キー(KK_SELECT_008)*/
	private static final String ZM_M_CD_NM_KANRI_KK_SELECT_008 = "KK_SELECT_008";

	/** SQL定義キー(KK_INSERT_001)*/
	private static final String ZM_T_DL_FILE_KANRI_KK_INSERT_001 = "KK_INSERT_001";

	/** テーブルアクセスクラス(料金コース)*/
	private JBSbatSQLAccess db_KK_M_PCRS = null;

	/** テーブルアクセスクラス(コード名称管理)*/
	private JBSbatSQLAccess db_ZM_M_CD_NM_KANRI = null;

	/** テーブルアクセスクラス(ダウンロードファイル管理)*/
	private JBSbatSQLAccess db_ZM_T_DL_FILE_KANRI = null;
	/**▲▲▲▲▲▲ツールから生成した宣言です 終了▲▲▲▲▲▲*/
	
	/** ファイルコード */
	private static final String FILE_CD = "0000";
	
	/** 処理管理番号 */
	private static final String TRN_KANRI_NO = "000000000146";
	
	/** ファイル名編集用 */
	private static final String FILE_NM = "KKLST094_TV_STB_CHK_";
	
	/** ヘッダ編集用＿お客さまID */
	private static final String HEADER_SVC_KEI_NO = "お客さまID";
	
	/** ヘッダ編集用＿サービス契約内訳ステータス */
	private static final String HEADER_SVC_KEI_UCWK_STAT = "サービス契約内訳ステータス";
	
	/** ヘッダ編集用＿サービス契約内訳ステータス名 */
	private static final String HEADER_SVC_KEI_UCWK_STAT_NM = "サービス契約内訳ステータス名";
	
	/** ヘッダ編集用＿料金コースコード */
	private static final String HEADER_PCRS_CD = "料金コースコード";
	
	/** ヘッダ編集用＿料金コース名 */
	private static final String HEADER_PCRS_NM = "料金コース名";
	
	/** ヘッダ編集用＿サービス契約内訳プラン開始年月日 */
	private static final String HEADER_SVC_KEI_UCWK_PLAN_STAYMD = "サービス契約内訳プラン開始年月日";
	
	/** ヘッダ編集用＿機器提供サービス契約ステータス */
	private static final String HEADER_KKTK_SVC_KEI_STAT = "機器提供サービス契約ステータス";
	
	/** ヘッダ編集用＿機器提供サービス契約ステータス名 */
	private static final String HEADER_KKTK_SVC_KEI_STAT_NM = "機器提供サービス契約ステータス名";
	
	/** ヘッダ編集用＿HDD容量コード */
	private static final String HEADER_HDD_CAPA_CD = "HDD容量コード";
	
	/** ヘッダ編集用＿HDD容量コード名 */
	private static final String HEADER_HDD_CAPA_CD_NM = "HDD容量コード名";
	
	/** ヘッダ編集用＿宅内機器型式コード */
	private static final String HEADER_TAKNKIKI_MODEL_CD = "宅内機器型式コード";
	
	/** ヘッダ編集用＿機器提供サービス契約プラン開始年月日 */
	private static final String HEADER_KKTK_SVC_KEI_PLAN_STAYMD = "機器提供サービス契約プラン開始年月日";
	
	/** ヘッダ編集用＿サービス契約内訳番号 */
	private static final String HEADER_SVC_KEI_UCWK_NO = "サービス契約内訳番号";
	
	/** ヘッダ編集用＿機器提供サービス契約番号 */
	private static final String HEADER_KKTK_SVC_KEI_NO = "機器提供サービス契約番号";
	
	/** ヘッダ編集用＿機器変更番号 */
	private static final String HEADER_KIKI_CHG_NO = "機器変更番号";
	
	/** ＴＶコース／ＳＴＢ不整合チェックリスト抽出ファイルファイルパス */
	private String kkifm70101FilePath = null;
	
	/** ＴＶコース／ＳＴＢ不整合チェックリストファイルパス */
	private String kkifm701FilePath = null;
	
	/** ＴＶコース／ＳＴＢ不整合チェックリストファイルオブジェクト */
	private JBSbatBusinessFileUtil kkifm701FileObj = null;
	
	/** ファイル出力件数 */
	private int outCount = 0;
	
	/**
	 * 初期処理
	 * @param JBSbatCommonItem commonItem　バッチ共通パラメータ電文
	 * @throws Exception
	 */
	public void initial(JBSbatCommonItem commonItem) throws Exception
	{
	/**▼▼▼▼▼▼業務サービスの初期処理を記述してください。▼▼▼▼▼▼*/
		/**▼▼▼▼▼▼ツールから生成した初期化のソースです 開始▼▼▼▼▼▼*/
		// 共通パラメータを設定します
		super.setCommonInfo(commonItem);

		// DBアクセスクラスを生成します
		db_KK_M_PCRS = new JBSbatSQLAccess(commonItem, D_TBL_NAME_KK_M_PCRS);
		db_ZM_M_CD_NM_KANRI = new JBSbatSQLAccess(commonItem, D_TBL_NAME_ZM_M_CD_NM_KANRI);
		db_ZM_T_DL_FILE_KANRI = new JBSbatSQLAccess(commonItem, D_TBL_NAME_ZM_T_DL_FILE_KANRI);
		/**▲▲▲▲▲▲ツールから生成した初期化のソースです 終了▲▲▲▲▲▲*/
		
		// フリー項目を取得する
		String[] freeItems = commonItem.getFreeItem().split(JKKBatConst.S_PARAM_DELIM);
		
		// ＴＶコース／ＳＴＢ不整合チェックリスト抽出ファイルファイルパス
		kkifm70101FilePath = freeItems[0];
		
		// ＴＶコース／ＳＴＢ不整合チェックリストファイルパス
		kkifm701FilePath = freeItems[1];
		
		// ＴＶコース／ＳＴＢ不整合チェックリストファイルオブジェクト
		kkifm701FileObj = JKKBatCommon.createBusinessFileUtil(kkifm701FilePath,
				JKKBatConst.SJIS, JKKStrConst.LINE_SEPARATOR, JKKBatConst.S_SEP_CAM);
		
		// ファイル出力件数
		outCount = 0;
	/**▲▲▲▲▲▲業務サービスの初期処理を記述してください。▲▲▲▲▲▲*/
	}

	/**
	 * 主処理
	 * @return JBSbatOutputItem　出力情報
	 * @throws Exception
	 */
	public JBSbatOutputItem execute() throws Exception
	{
	/**▼▼▼▼▼▼業務サービスの主処理を記述してください。▼▼▼▼▼▼*/
		// TVコース／STB不整合チェックリストにヘッダ情報を出力する
		ArrayList<String> header = new ArrayList<String>(15);
		
		header.add(HEADER_SVC_KEI_NO);					// お客さまID
		header.add(HEADER_SVC_KEI_UCWK_STAT);			// サービス契約内訳ステータス
		header.add(HEADER_SVC_KEI_UCWK_STAT_NM);		// サービス契約内訳ステータス名
		header.add(HEADER_PCRS_CD);						// 料金コースコード
		header.add(HEADER_PCRS_NM);						// 料金コース名
		header.add(HEADER_SVC_KEI_UCWK_PLAN_STAYMD);	// サービス契約内訳プラン開始年月日
		header.add(HEADER_KKTK_SVC_KEI_STAT);			// 機器提供サービス契約ステータス
		header.add(HEADER_KKTK_SVC_KEI_STAT_NM);		// 機器提供サービス契約ステータス名
		header.add(HEADER_HDD_CAPA_CD);					// HDD容量コード
		header.add(HEADER_HDD_CAPA_CD_NM);				// HDD容量コード名
		header.add(HEADER_TAKNKIKI_MODEL_CD);			// 宅内機器型式コード
		header.add(HEADER_KKTK_SVC_KEI_PLAN_STAYMD);	// 機器提供サービス契約プラン開始年月日
		header.add(HEADER_SVC_KEI_UCWK_NO);				// サービス契約内訳番号
		header.add(HEADER_KKTK_SVC_KEI_NO);				// 機器提供サービス契約番号
		header.add(HEADER_KIKI_CHG_NO);					// 機器変更番号
		
		JKKBatCommon.printDoubleQuoteBusinessFileUtil(kkifm701FileObj, header);
		
		// TVコース／STB不整合チェックリスト抽出ファイル件数分を繰返す
		BufferedReader br = null;
		try
		{
			InputStreamReader is = new InputStreamReader(new FileInputStream(kkifm70101FilePath), JKKStrConst.ENCODE_SJIS);
			br = new BufferedReader(is);
			
			while (br.ready())
			{
				// 1行読込み
				String[] data = br.readLine().split(",");
				
				String svcKeiNo = data[0].substring(1, data[0].length() - 1);				// サービス契約番号
				String pcrsCd = data[1].substring(1, data[1].length() - 1);					// 料金コースコード
				String hddCapaCd = data[2].substring(1, data[2].length() - 1);				// ＨＤＤ容量コード
				String svcKeiUcwkNo = data[3].substring(1, data[3].length() - 1);			// サービス契約内訳番号
				String svcKeiUcwkStat = data[4].substring(1, data[4].length() - 1);			// サービス契約内訳ステータス
				String svcKeiUcwkPlanStaymd = data[5].substring(1, data[5].length() - 1);	// サービス契約内訳プラン開始年月日
				String kktkSvcKeiNo = data[6].substring(1, data[6].length() - 1);			// 機器提供サービス契約番号
				String kktkSvcKeiStat = data[7].substring(1, data[7].length() - 1);			// 機器提供サービス契約ステータス
				String taknkikiModelCd = data[8].substring(1, data[8].length() - 1);		// 宅内機器型式コード
				String kikiChgNo = data[9].substring(1, data[9].length() - 1);				// 機器変更番号
				String kktkSvcKeiPlanStaymd = data[10].substring(1, data[10].length() - 1);	// 機器提供サービス契約プラン開始年月日
				
				// 不整合チェック
				if (JKKTvCrsStbHsgChk.doTvCrsStbHsgChk(hddCapaCd, pcrsCd))
				{
					// 整合の場合、次レコードを処理する
					continue;
				}
				
				// 料金コースより料金コースコードの名称を取得する
				executeKK_M_PCRS_KK_SELECT_001(new Object[] {pcrsCd});
				JBSbatCommonDBInterface pcrsMap = db_KK_M_PCRS.selectNext();
				if (null == pcrsMap)
				{
					continue;
				}
				String pcrsNm = pcrsMap.getString(JBSbatKK_M_PCRS.PCRS_NM);
				
				// コード名称管理よりサービス契約内訳ステータスの名称を取得する
				executeZM_M_CD_NM_KANRI_KK_SELECT_008(new Object[] {JZM0171Constant.CD00037, svcKeiUcwkStat, super.opeDate, super.opeDate});
				JBSbatCommonDBInterface cd00037Map = db_ZM_M_CD_NM_KANRI.selectNext();
				if (null == cd00037Map)
				{
					continue;
				}
				String svcKeiUcwkStatNm = cd00037Map.getString(JBSbatZM_M_CD_NM_KANRI.CD_DIV_NM);
				
				// コード名称管理より機器提供サービス契約ステータスの名称を取得する
				executeZM_M_CD_NM_KANRI_KK_SELECT_008(new Object[] {JZM0171Constant.CD00056, kktkSvcKeiStat, super.opeDate, super.opeDate});
				JBSbatCommonDBInterface cd00056Map = db_ZM_M_CD_NM_KANRI.selectNext();
				if (null == cd00056Map)
				{
					continue;
				}
				String kktkSvcKeiStatNm = cd00056Map.getString(JBSbatZM_M_CD_NM_KANRI.CD_DIV_NM);
				
				// コード名称管理よりHDD容量コードの名称を取得する
				executeZM_M_CD_NM_KANRI_KK_SELECT_008(new Object[] {JZM0171Constant.CD00557, hddCapaCd, super.opeDate, super.opeDate});
				JBSbatCommonDBInterface cd00557Map = db_ZM_M_CD_NM_KANRI.selectNext();
				if (null == cd00557Map)
				{
					continue;
				}
				String hddCapaCdNm = cd00557Map.getString(JBSbatZM_M_CD_NM_KANRI.CD_DIV_NM);
				
				// TVコース／STB不整合チェックリストにデータ部情報を出力する
				ArrayList<String> outputInfo = new ArrayList<String>(15);
				
				outputInfo.add(svcKeiNo);				// お客さまID
				outputInfo.add(svcKeiUcwkStat);			// サービス契約内訳ステータス
				outputInfo.add(svcKeiUcwkStatNm);		// サービス契約内訳ステータス名
				outputInfo.add(pcrsCd);					// 料金コースコード
				outputInfo.add(pcrsNm);					// 料金コース名
				outputInfo.add(svcKeiUcwkPlanStaymd);	// サービス契約内訳プラン開始年月日
				outputInfo.add(kktkSvcKeiStat);			// 機器提供サービス契約ステータス
				outputInfo.add(kktkSvcKeiStatNm);		// 機器提供サービス契約ステータス名
				outputInfo.add(hddCapaCd);				// HDD容量コード
				outputInfo.add(hddCapaCdNm);			// HDD容量コード名
				outputInfo.add(taknkikiModelCd);		// 宅内機器型式コード
				outputInfo.add(kktkSvcKeiPlanStaymd);	// 機器提供サービス契約プラン開始年月日
				outputInfo.add(svcKeiUcwkNo);			// サービス契約内訳番号
				outputInfo.add(kktkSvcKeiNo);			// 機器提供サービス契約番号
				outputInfo.add(kikiChgNo);				// 機器変更番号
				
				JKKBatCommon.printDoubleQuoteBusinessFileUtil(kkifm701FileObj, outputInfo);
				
				// データ件数計算
				outCount++;
			}
		}
		catch (IOException e)
		{
			// TVコース／STB不整合チェックリスト抽出ファイルがない場合０件と同様とする
			super.logPrint.printDebugLog("TVコース／STB不整合チェックリスト抽出ファイルなし");
		}
		finally
		{
			if (null != br)
			{
				br.close();
			}
		}
		
		// ファイルを閉じる
		JCCBatCommon.closeBusinessFileUtil(kkifm701FileObj);
		
		// 電子ファイル管理登録処理
		JBSbatCommonItem arg0 = super.commonItem;						// 業務共通電文
		String arg1 = FILE_CD;											// ファイルコード
		String arg2 = kkifm701FilePath;									// ファイルパス
		String arg3 = JBSbatDateUtil.adjustMonth(super.opeDate, 1);		// ファイル削除年月日
		String[] rc = JCCBatCommon.createDenshiFile(arg0, arg1, arg2, arg3);
		
		// ログ出力
		super.logPrint.printDebugLog("電子ファイル管理番号(" + rc[0] +  ")、世代登録年月日時分秒(" + rc[1] + ")");
		
		// ダウンロードファイル管理登録処理
		executeZM_T_DL_FILE_KANRI_KK_INSERT_001(getDlFileInsertParam(rc, arg3));
		
		return null;
	/**▲▲▲▲▲▲業務サービスの主処理を記述してください。▲▲▲▲▲▲*/
	}

	/**
	 * 業務サービス終了処理
	 * @throws Exception
	 */
	public void terminal() throws Exception
	{
	/**▼▼▼▼▼▼業務サービスの終了処理を記述してください。▼▼▼▼▼▼*/
		/**▼▼▼▼▼▼ツールから生成した終了処理のソースです 開始▼▼▼▼▼▼*/
		// DBアクセスクラスをクローズします
		db_KK_M_PCRS.close();
		db_ZM_M_CD_NM_KANRI.close();
		db_ZM_T_DL_FILE_KANRI.close();
		/**▲▲▲▲▲▲ツールから生成した終了処理のソースです 終了▲▲▲▲▲▲*/
	/**▲▲▲▲▲▲業務サービスの終了処理を記述してください。▲▲▲▲▲▲*/
	}

	/**▼▼▼▼▼▼ツールから生成したメソッドです 開始▼▼▼▼▼▼*/
	/**
	 * SQLKEY(KK_SELECT_001)で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_M_PCRS_KK_SELECT_001(Object[] param) throws Exception
	{
		// バイント変数のリストを生成します
		JBSbatCommonDBInterface paramList = new JBSbatCommonDBInterface();
		paramList.setValue(param[0].toString());

		// DBアクセスを実行します
		db_KK_M_PCRS.selectBySqlDefine(paramList, KK_M_PCRS_KK_SELECT_001);
	}

	/**
	 * SQLKEY(KK_SELECT_008)でDBアクセスを行います。<br>
	 * <p>
	 * <b>処理フロー</b><br>
	 * <pre>
	 * 1.引数でバイント変数を設定します。<br>
	 *
	 * 2.DBアクセスを実行します。<br>
	 * 
	 * 3.メソッドの呼び出し方です。<br>
	 *		引数:
	 *		param:順にバイント変数の値をparam配列に入れます。バイント変数は以下に説明します。
	 *		 	コード種別コード
	 *		 	コード区分
	 *		 	コード適用開始年月日
	 *		 	コード適用終了年月日
	 * </pre>
	 * <p>
	 * @param param バイント変数の値配列。
	 * @throws Exception 業務サービス内で発生した例外全般。
	 */
	private void executeZM_M_CD_NM_KANRI_KK_SELECT_008(Object[] param) throws Exception
	{
		// バイント変数のリストを生成します
		JBSbatCommonDBInterface paramList = new JBSbatCommonDBInterface();
		paramList.setValue(param[0].toString());
		paramList.setValue(param[1].toString());
		paramList.setValue(param[2].toString());
		paramList.setValue(param[3].toString());

		// DBアクセスを実行します
		db_ZM_M_CD_NM_KANRI.selectBySqlDefine(paramList, ZM_M_CD_NM_KANRI_KK_SELECT_008);
	}

	/**
	 * SQLKEY(KK_INSERT_001)でDBアクセスを行います。<br>
	 * <p>
	 * <b>処理フロー</b><br>
	 * <pre>
	 * 1.引数でバイント変数を設定します。<br>
	 *
	 * 2.DBアクセスを実行します。<br>
	 * 
	 * 3.メソッドの呼び出し方です。<br>
	 *		引数:
	 *		param:順にバイント変数の値をparam配列に入れます。バイント変数は以下に説明します。
	 *		 	処理管理番号
	 *			ファイル名
	 *			データ件数
	 *		 	ファイル登録年月日時分秒
	 *			ファイル削除年月日
	 *		 	登録年月日時分秒
	 *		 	登録オペレータアカウント
	 *		 	更新年月日時分秒
	 *		 	更新オペレータアカウント
	 *		 	電子ファイル管理番号
	 *		 	世代登録年月日時分秒
	 * </pre>
	 * <p>
	 * @param param バイント変数の値配列。
	 * @throws Exception 業務サービス内で発生した例外全般。
	 */
	private void executeZM_T_DL_FILE_KANRI_KK_INSERT_001(Object[] param) throws Exception
	{
		// バイント変数のリストを生成します
		JBSbatCommonDBInterface paramList = new JBSbatCommonDBInterface();
		paramList.setValue(param[0].toString());
		paramList.setValue(param[1].toString());
		paramList.setValue(param[2].toString());
		paramList.setValue(param[3].toString());
		paramList.setValue(param[4].toString());
		paramList.setValue(param[5].toString());
		paramList.setValue(param[6].toString());

		// DBアクセスを実行します
		db_ZM_T_DL_FILE_KANRI.executeBySqlDefine(paramList, ZM_T_DL_FILE_KANRI_KK_INSERT_001);
	}
	/**▲▲▲▲▲▲ツールから生成したメソッドです 終了▲▲▲▲▲▲*/
	
	/**
	 * ZM_T_DL_FILE_KANRI-KK_INSERT_001を実行する際に必要なパラメータを返す。
	 * @param rc 共通部品の電子ファイル管理登録から返却された文字列
	 * @param arg3 共通部品の電子ファイル管理登録に渡したファイル削除年月日
	 * @return Object[] ZM_T_DL_FILE_KANRI-KK_INSERT_001を実行する際に必要なパラメータ
	 * @throws Exception メソッド内で発生した例外全般。
	 */
	private Object[] getDlFileInsertParam(String[] rc, String arg3) throws Exception
	{
		// システム日時
		String fileTimeStamp = JCCBatCommon.getSysDateTime();
		
		// ファイル名
		String fileName = FILE_NM + JKKStrConst.FILE_NM_TIMESTAMP.replaceAll(
				JKKStrConst.FILE_TIMESTAMP_FORMAT, fileTimeStamp);
		
		Object[] setParam = {
				TRN_KANRI_NO,						// 処理管理番号
				fileName,							// ファイル名
				outCount,							// データ件数
				rc[1],								// ファイル登録年月日時分秒
				arg3,								// ファイル削除年月日
				rc[0],								// 電子ファイル管理番号
				rc[1],								// 世代登録年月日時分秒
		};
		return setParam;
	}
}
