/*********************************************************************
 *  All Rights reserved,Copyright (c) Fujitsu ,2012					 *
 **********************************************************************
 *＜プログラム内容＞
 *	システム名			：eo顧客基幹システム
 *	モジュール名		：JBSbatKKIdTchishoTelnoClear
 *	ソースファイル名	：JBSbatKKIdTchishoTelnoClear.java
 *	作成者				：富士通　
 *	作成日				：2021年05月28日
 *＜機能概要＞
 *　ID通知書電話番号非通知更新です。
 *＜修正履歴＞
 *	バージョン	修正日		修正者		修正内容
*   v53.00.00   2021/05/28  FJ)星野　   ANK-4009-06-00_CX戦略WG方針対応
 *********************************************************************/
package eo.business.service;

import java.io.IOException;

import eo.business.common.JBSbatBusinessService;
import eo.business.common.JKKBatConst;
import eo.business.util.table.JBSbatKK_T_SVC_KEI;
import eo.common.constant.JKKStrConst;
import eo.common.util.JKKStringUtil;
import eo.framework.db.JBSbatSQLAccess;
import eo.framework.file.JBSbatInputFileUtil;
import eo.framework.file.JBSbatOutputFileUtil;
import eo.framework.item.JBSbatCommonDBInterface;
import eo.framework.item.JBSbatCommonItem;
import eo.framework.item.JBSbatOutputItem;

/**
 * ID通知書電話番号非通知更新
 * <p>
 *<BR>
 * 
 * @author 富士通
 */
public class JBSbatKKIdTchishoTelnoClear extends JBSbatBusinessService {

	/** ▼▼▼▼▼▼ツールから生成した宣言です 開始▼▼▼▼▼▼ */
	/** ▲▲▲▲▲▲ツールから生成した宣言です 終了▲▲▲▲▲▲ */


	/** テーブル(サービス契約)*/
	private static final String D_TBL_NAME_KK_T_SVC_KEI = "KK_T_SVC_KEI";
	/** テーブル(住所変更明細)*/
	private static final String D_TBL_NAME_KK_T_ADCHG_DTL = "KK_T_ADCHG_DTL";
	
	/** SQL定義キー(KK_SELECT_012)*/
	private static final String KK_T_SVC_KEI_KK_SELECT_012 = "KK_SELECT_012";
	/** SQL定義キー(KK_SELECT_056)*/
	private static final String KK_T_ADCHG_DTL_KK_SELECT_056 = "KK_SELECT_056";

	/** テーブルアクセスクラス(サービス契約)*/
	private JBSbatSQLAccess db_KK_T_SVC_KEI = null;
	/** テーブルアクセスクラス(住所変更明細)*/
	private JBSbatSQLAccess db_KK_T_ADCHG_DTL = null;




	/**
	 * 入力ファイルパス
	 */
	private String inFilePath = "";

	/**
	 * 出力ファイルパス
	 */
	private String outFilePath = "";
	
	
	/** 項目インデックス レコード種別 */
	private static final int INDEX_RECORD_SBT = 0;
	/** 項目インデックス 料金プランコード */
	private static final int INDEX_PPLAN_CD = 5;
	/** 項目インデックス サービス契約番号 */
	private static final int INDEX_SVC_KEI_NO = 10;
	/** 項目インデックス サービス契約内訳番号 */
	private static final int INDEX_SVC_KEI_UCWK_NO = 11;
	/** 項目インデックス ｅｏ電話番号 */
	private static final int INDEX_EO_TELNO = 49;
	/** 項目インデックス 番ポ有無 */
	private static final int INDEX_BMP_UM = 51;
	
	
	/** レコード種別「基本情報」 */
	private static final String RECORD_SBT_BASIC = "91";
	
	/** 改行コード（CRLF） */
	private static final String CRLF  = "CR+LF";
	/** 囲み文字（ダブルクォート） */
	private static final String DOUBLE_QUOTE = "\"";
	/** 空文字列 */
	private static final String EMPTY = "";


	/**
	 * 初期処理
	 * 
	 * @param JBSbatCommonItem
	 *            commonItem　バッチ共通パラメータ電文
	 * @throws Exception
	 */
	public void initial(JBSbatCommonItem commonItem) throws Exception {
		/** ▼▼▼▼▼▼業務サービスの初期処理を記述してください。▼▼▼▼▼▼ */
		/** ▼▼▼▼▼▼ツールから生成した初期化のソースです 開始▼▼▼▼▼▼ */
		// 共通パラメータを設定します
		super.setCommonInfo(commonItem);

		// DBアクセスクラスを生成します
		db_KK_T_SVC_KEI = new JBSbatSQLAccess(commonItem, D_TBL_NAME_KK_T_SVC_KEI);
		db_KK_T_ADCHG_DTL = new JBSbatSQLAccess(commonItem, D_TBL_NAME_KK_T_ADCHG_DTL);
		/** ▲▲▲▲▲▲ツールから生成した初期化のソースです 終了▲▲▲▲▲▲ */
		/** ▲▲▲▲▲▲業務サービスの初期処理を記述してください。▲▲▲▲▲▲ */
		
		// フリー項目取得
		String[] free = commonItem.getFreeItem().split(
				JKKBatConst.S_PARAM_DELIM);

		inFilePath = free[0];
		outFilePath = free[1];
	}

	/**
	 * 主処理
	 * 
	 * @return JBSbatOutputItem　出力情報
	 * @throws Exception
	 */
	public JBSbatOutputItem execute() throws Exception {
		/** ▼▼▼▼▼▼業務サービスの主処理を記述してください。▼▼▼▼▼▼ */

		// 入力ファイルパス
		JBSbatInputFileUtil inFile = new JBSbatInputFileUtil(inFilePath);
		inFile.setEncode(JKKBatConst.SJIS); // 文字コード
		inFile.setLine(CRLF); // 改行コード

		// 出力ファイル
		JBSbatOutputFileUtil outFile = new JBSbatOutputFileUtil(outFilePath);
		outFile.setEncode(JKKBatConst.SJIS);
		outFile.setLine(CRLF);

		try {
			// 入力ファイル
			inFile.createReader();
			outFile.createWriter();

			while (inFile.ready()) {
				// 一行読み込み
				String line = inFile.readLine();
				String[] record = lineToRecord(line);
				
				// レコード種別「基本情報」のレコード以外はそのまま出力
				if(!RECORD_SBT_BASIC.equals( record[INDEX_RECORD_SBT] ) )
				{
					outFile.write(line);
					continue;
				}
				
				// 電話ホームタイプ以外はそのまま出力
				if( !JKKStrConst.CD00565_TEL1_HOME.equals(record[INDEX_PPLAN_CD]) && !JKKStrConst.CD00565_TEL2_HOME.equals(record[INDEX_PPLAN_CD]))
				{
					outFile.write(line);
					continue;
				}
				
				// ｅｏ電話番号が未設定ならそのまま出力
				if( JKKStringUtil.isNullBlank(record[INDEX_EO_TELNO]) )
				{
					outFile.write(line);
					continue;
				}
				
				// 番ポなし 以外はそのまま出力
				if( !JKKStrConst.CD_DIV_UM_NASHI.equals(record[INDEX_BMP_UM]) )
				{
					outFile.write(line);
					continue;
				}
				
				String svcKeiNo = record[INDEX_SVC_KEI_NO];
				String svcKeiUcwkNo = record[INDEX_SVC_KEI_UCWK_NO];
				
				// サービス契約を検索 KK_SELECT_012
				executeKK_T_SVC_KEI_KK_SELECT_012(new String[]{
					svcKeiNo,
					super.opeDate,
				});

				JBSbatCommonDBInterface svcKeiResultMap = db_KK_T_SVC_KEI.selectNext();
				if (svcKeiResultMap == null)
				{
					outFile.write(line);
					continue;
				}
				String svcKeiStat = svcKeiResultMap.getString(JBSbatKK_T_SVC_KEI.SVC_KEI_STAT);

				
				// 住所変更明細を検索 KK_SELECT_056
				executeKK_T_ADCHG_DTL_KK_SELECT_056(new String[]{
					svcKeiNo,
					svcKeiUcwkNo
				});
				
				JBSbatCommonDBInterface adchgDtlResultMap = db_KK_T_ADCHG_DTL.selectNext();

				// 住所変更なしの場合
				if(adchgDtlResultMap == null)
				{
					// サービス契約ステータス「照査済」がクリア対象
					if( JKKStrConst.CD00037_SHOSA_ZUMI.equals(svcKeiStat) )
					{
						// ｅｏ電話番号をクリア
						record[INDEX_EO_TELNO] = EMPTY;
						// 編集後のレコードを出力
						outFile.write(recordToLine(record));
						continue;
					}
					else
					{
						// 上記以外の場合、そのまま出力
						outFile.write(line);
						continue;
					}
				
				}
				// 住所変更ありの場合
				else
				{
					// サービス契約ステータス「照査済」「締結済」「サービス提供中」がクリア対象
					if( JKKStrConst.CD00037_SHOSA_ZUMI.equals(svcKeiStat)
						|| JKKStrConst.CD00037_CNC_ZM.equals(svcKeiStat)
						|| JKKStrConst.CD00037_SVCTK_CHU.equals(svcKeiStat)
					)
					{
						// ｅｏ電話番号をクリア
						record[INDEX_EO_TELNO] = EMPTY;
						// 編集後のレコードを出力
						outFile.write(recordToLine(record));
						continue;
					}
					else
					{
						// 上記以外の場合、そのまま出力
						outFile.write(line);
						continue;
					}
				}
			}
			inFile.close();
		} catch (IOException ioe) {
			throw ioe;
		} finally {
			// 入力ファイルクローズ
			inFile.close();
			outFile.close();
		}

		return null;
		/** ▲▲▲▲▲▲業務サービスの主処理を記述してください。▲▲▲▲▲▲ */
	}

	private String[] lineToRecord(String line) {
		// カンマで分割
		String[] record = line.split(JKKStrConst.COMMA);
		
		// 囲み文字のダブルクォートを外す
		for(int i=0; i<record.length; i++)
		{
			String column = record[i];
			if(column != null){
				if( column.startsWith(DOUBLE_QUOTE) )
				{
					column = column.substring(1);
				}
				if( column.endsWith(DOUBLE_QUOTE) )
				{
					column = column.substring(0, column.length()-1);
				}
				
				record[i] = column;
			}
		}
		return record;
	}

	private String recordToLine(String[] record) {
		StringBuilder str = new StringBuilder();
		for(String column : record)
		{
			if(str.length()>0){
				str.append(JKKStrConst.COMMA);
			}
			str.append(DOUBLE_QUOTE);	// 囲み文字（ダブルクォート）
			str.append(JKKStringUtil.nullToBlank(column));
			str.append(DOUBLE_QUOTE);	// 囲み文字（ダブルクォート）
			
		}
		String newLine = str.toString();
		return newLine;
	}

	/**
	 * 業務サービス終了処理
	 * 
	 * @throws Exception
	 */
	public void terminal() throws Exception {
		/** ▼▼▼▼▼▼業務サービスの終了処理を記述してください。▼▼▼▼▼▼ */
		/** ▼▼▼▼▼▼ツールから生成した終了処理のソースです 開始▼▼▼▼▼▼ */
		// DBアクセスクラスをクローズします
		db_KK_T_SVC_KEI.close();
		db_KK_T_ADCHG_DTL.close();
		/** ▲▲▲▲▲▲ツールから生成した終了処理のソースです 終了▲▲▲▲▲▲ */
		/** ▲▲▲▲▲▲業務サービスの終了処理を記述してください。▲▲▲▲▲▲ */
	}

	/** ▼▼▼▼▼▼ツールから生成したメソッドです 開始▼▼▼▼▼▼ */
	/**
	 * SQLKEY(KK_SELECT_012)で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_SVC_KEI_KK_SELECT_012(Object[] param) throws Exception
	{
		// バイント変数のリストを生成します
		JBSbatCommonDBInterface paramList = new JBSbatCommonDBInterface();
		paramList.setValue(param[0].toString());
		paramList.setValue(param[1].toString());

		// DBアクセスを実行します
		db_KK_T_SVC_KEI.selectBySqlDefine(paramList, KK_T_SVC_KEI_KK_SELECT_012);
	}

	/**
	 * SQLKEY(KK_SELECT_056)で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_ADCHG_DTL_KK_SELECT_056(Object[] param) throws Exception
	{
		// バイント変数のリストを生成します
		JBSbatCommonDBInterface paramList = new JBSbatCommonDBInterface();
		paramList.setValue(param[0].toString());
		paramList.setValue(param[1].toString());

		// DBアクセスを実行します
		db_KK_T_ADCHG_DTL.selectBySqlDefine(paramList, KK_T_ADCHG_DTL_KK_SELECT_056);
	}

	/** ▲▲▲▲▲▲ツールから生成したメソッドです 終了▲▲▲▲▲▲ */

}
