/*********************************************************************
 *  All Rights reserved,Copyright (c) K-Opticom
 **********************************************************************
 *＜プログラム内容＞
 *	システム名			：eo顧客基幹システム
 *	モジュール名		：JBSbatKKCreateKnytcPostFile
 *	ソースファイル名	：JBSbatKKCreateKnytcPostFile.java
 *	作成者				：富士通　
 *	作成日				：2016年01月27日
 *＜機能概要＞
 *　契約内容通知ハガキファイル作成部品です。
 *＜修正履歴＞
 *	バージョン	修正日		修正者		修正内容
 *	v1.00.00	2016/01/27   富士通		新規作成
 *	v23.00.01	2016/02/09	FJ)柳		【IT1-2016-0000023】文字化け対応
 *********************************************************************/
package eo.business.service;

import java.io.BufferedReader;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.InputStreamReader;

import eo.business.common.JBSbatBusinessService;
import eo.business.common.JKKBatConst;
import eo.business.util.file.JBSbatCHIFM167;
import eo.business.util.file.JBSbatKKIFM692;
import eo.business.util.file.JBSbatKKIFM695;
import eo.common.constant.JACStrConst;
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.util.JBSbatAplConst;
import eo.framework.application.JBSbatBusinessException;
import eo.framework.db.JBSbatSQLAccess;
import eo.framework.file.JBSbatDefFileUtil;
import eo.framework.file.JBSbatOutputFileUtil;

/**
 * (クラスの機能概要)
 * <p>
 *<BR>
 * 
 * @author 富士通
 */
public class JBSbatKKCreateKnytcPostFile extends JBSbatBusinessService {
	/** ▼▼▼▼▼▼ツールから生成した宣言です 開始▼▼▼▼▼▼ */
	/** テーブル(契約内容通知書) */
	private static final String D_TBL_NAME_KK_T_KNYTCS = "KK_T_KNYTCS";

	/** テーブルアクセスクラス(契約内容通知書) */
	private JBSbatSQLAccess db_KK_T_KNYTCS = null;

	/** 出力ファイル定義 */
	private static final String PARAM_OTD = "OTD";

	/** 出力ファイル項目定義(契約内容通知ハガキファイル) */
	private static final String KKIFM695_DEF = "KKIFM695.def";

	/** 文字コード(SJIS) */
	public static final String SJIS = "Shift-JIS";

	/** ▲▲▲▲▲▲ツールから生成した宣言です 終了▲▲▲▲▲▲ */

	/** 入力ファイルのフルパス */
	protected String filePass = "";

	/**
	 * 初期処理
	 * 
	 * @param JBSbatCommonItem
	 *            commonItem　バッチ共通パラメータ電文
	 * @throws Exception
	 */
	public void initial(JBSbatCommonItem commonItem) throws Exception {
		/** ▼▼▼▼▼▼業務サービスの初期処理を記述してください。▼▼▼▼▼▼ */
		/** ▼▼▼▼▼▼ツールから生成した初期化のソースです 開始▼▼▼▼▼▼ */
		// 共通パラメータを設定します
		super.setCommonInfo(commonItem);

		// DBアクセスクラスを生成します
		db_KK_T_KNYTCS = new JBSbatSQLAccess(commonItem, D_TBL_NAME_KK_T_KNYTCS);
		/** ▲▲▲▲▲▲ツールから生成した初期化のソースです 終了▲▲▲▲▲▲ */

		// フリー項目値の取得をします。
		String[] free_item = commonItem.getFreeItem().split(
				JKKBatConst.S_PARAM_DELIM);

		// 入力ファイルのフルパスを取得
		filePass = free_item[0];
		/** ▲▲▲▲▲▲業務サービスの初期処理を記述してください。▲▲▲▲▲▲ */
	}

	/**
	 * 主処理
	 * 
	 * @param inMap
	 *            　入力電文
	 * @return JBSbatOutputItem　出力情報
	 * @throws Exception
	 */
	public JBSbatOutputItem execute() throws Exception {
		/** ▼▼▼▼▼▼業務サービスの主処理を記述してください。▼▼▼▼▼▼ */

		// ファイル出力マップの初期化
		JBSbatServiceInterfaceMap file_outmap = new JBSbatServiceInterfaceMap();

		// 出力ファイル
		JBSbatOutputFileUtil knytcPostFile = commonItem.getOutPutFile();

		// 文字コードの設定
		knytcPostFile.setEncode(JACStrConst.ENCODE_SJIS);

		// 改行コードの設定
		knytcPostFile.setLine(JACStrConst.LINE_CRLF);

		// ジョブIDの設定
		knytcPostFile.setJobID(commonItem.getJobid());

		// 定義ファイルオブジェクトの生成
		String knytcPostFileDefNm = JBSbatAplConst.getAplConstValue(PARAM_OTD)
				+ KKIFM695_DEF;
		JBSbatDefFileUtil knytcPostFileDef = new JBSbatDefFileUtil(
				knytcPostFileDefNm, knytcPostFile);
		// IT1-2016-0000023 2016/02/09 ADD START
		// Writerオブジェクトを生成する。
		knytcPostFile.createWriter();
		// IT1-2016-0000023 2016/02/09 ADD END

		BufferedReader br = null;

		try {
			br = new BufferedReader(new InputStreamReader(new FileInputStream(filePass), JKKBatConst.S_CHR_CODE));
			String data = br.readLine(); // 1行読込み

			while (data != null) {
				String[] dataArray = data.split(JKKBatConst.S_SEP_CAM);
				String knytcsNo = null;
				String svcKeiNo = null;
				String contactorId = null;
				String unyoDate = null;
				
				try{
					// 入力ファイルの項目取得
					svcKeiNo = dataArray[0];
					knytcsNo = dataArray[1];
					contactorId = dataArray[2];
					unyoDate = dataArray[3];
				}				
				catch (ArrayIndexOutOfBoundsException ae){
					data = br.readLine(); // 1行読込み
					continue;
				} 

				// 契約内容通知書番号に値が無ければ次の処理
				if (knytcsNo == null || "".equals(knytcsNo)) {
					continue;
				}

				// 契約内容通知書番号をキーとしてデータを取得する
				JBSbatCommonDBInterface dataMap = executeKK_T_KNYTCS_PKSELECT(getPkWhereParam(knytcsNo));

				// データがあれば処理を行う
				if (dataMap != null) {
					// 契約内容通知ハガキファイルのデータ作成
					file_outmap.setString(JBSbatKKIFM695.SVC_KEI_NO, svcKeiNo); // サービス契約番号
					file_outmap.setString(JBSbatKKIFM695.CONTRACTOR_ID, contactorId); // 契約者番号
					
					if (dataMap.getString("KNYTCS_SOHUS_NM") != null) {
						file_outmap.setString(JBSbatKKIFM695.KNYTCS_SOHUS_NM, dataMap.getString("KNYTCS_SOHUS_NM")); // 契約内容通知書送付先氏名
					}
					else 
					{
						file_outmap.setString(JBSbatKKIFM695.KNYTCS_SOHUS_NM, ""); // 契約内容通知書送付先氏名
					}
					
					if (dataMap.getString("KNYTCS_SOHUS_PCD") != null) {
						file_outmap.setString(JBSbatKKIFM695.KNYTCS_SOHUS_PCD, dataMap.getString("KNYTCS_SOHUS_PCD")); // 契約内容通知書送付先郵便番号
					}
					else
					{
						file_outmap.setString(JBSbatKKIFM695.KNYTCS_SOHUS_PCD, ""); // 契約内容通知書送付先郵便番号
					}
					if (getKnytcsSohusAdr(dataMap) != null) {
						file_outmap.setString(JBSbatKKIFM695.KNYTCS_SOHUS_ADR, getKnytcsSohusAdr(dataMap)); // 契約内容通知書送付先住所
					}
					else
					{
						file_outmap.setString(JBSbatKKIFM695.KNYTCS_SOHUS_ADR, ""); // 契約内容通知書送付先住所
					}

					// 契約内容通知ハガキファイルの1レコード分を出力
					knytcPostFile.print(file_outmap, knytcPostFileDef);

					// 契約内容通知書スキーマのステータスを更新する
					executeKK_T_KNYTCS_PKUPDATE(getPkUpdSetParam(unyoDate), getPkWhereParam(knytcsNo));
				}

				data = br.readLine(); // 1行読込み
			}
		} catch (FileNotFoundException fe) {
			// ファイルが存在しない場合は下記のログ出力する。
			throw new JBSbatBusinessException(
					JPCBatchMessageConstant.EKKB0020CE,
					new String[] { filePass });
		} catch (ArrayIndexOutOfBoundsException ae){
			// 何もせず
			
		} finally {
			if (br != null) {
				br.close();
				// ファイルクローズ
				knytcPostFile.close();
			}
		}

		return null;
		/** ▲▲▲▲▲▲業務サービスの主処理を記述してください。▲▲▲▲▲▲ */
	}

	/**
	 * ＰＫ　検索、ＰＫ　更新で使用する設定項目を取得する
	 * 
	 * @param trnDay
	 * @return
	 */
	private Object[] getPkUpdSetParam(String trnDay) {
		Object[] setParam = new Object[2];

		setParam[0] = "100"; // 100　"依頼・発行・公開済"
		setParam[1] = trnDay; // ハガキ用契約内容通知情報.処理日

		return setParam;
	}

	/**
	 * 契約内容通知書送付先住所の文字列を取得する
	 * 
	 * @param dataMap
	 * @return
	 */
	private Object getKnytcsSohusAdr(JBSbatCommonDBInterface dataMap)
			throws Exception {
		StringBuilder sb = new StringBuilder();
		if (dataMap.getString("KNYTCS_SOHUS_STATE_NM") != null) {
			sb.append(dataMap.getString("KNYTCS_SOHUS_STATE_NM")); // 契約内容通知書．契約内容通知書送付先都道府県名
		}
		if (dataMap.getString("KNYTCS_SOHUS_CITY_NM") != null) {
			sb.append(dataMap.getString("KNYTCS_SOHUS_CITY_NM")); // 契約内容通知書.契約内容通知書送付先市区町村名
		}
		if (dataMap.getString("KNYTCS_SOHUS_OAZTSU_NM") != null) {
			sb.append(dataMap.getString("KNYTCS_SOHUS_OAZTSU_NM")); // 契約内容通知書.契約内容通知書送付先大字通称名
		}
		if (dataMap.getString("KNYTCS_SOHUS_AZCHO_NM") != null) {
			sb.append(dataMap.getString("KNYTCS_SOHUS_AZCHO_NM")); // 契約内容通知書.契約内容通知書送付先字丁目名
		}
		if (dataMap.getString("KNYTCS_SOHUS_BNCHIGO") != null) {
			sb.append(dataMap.getString("KNYTCS_SOHUS_BNCHIGO")); // 契約内容通知書.契約内容通知書送付先番地号
		}
		if (dataMap.getString("KNYTCS_SOHUS_ADRTTM") != null) {
			sb.append(dataMap.getString("KNYTCS_SOHUS_ADRTTM")); // 契約内容通知書.契約内容通知書送付先住所補記・建物名
		}
		if (dataMap.getString("KNYTCS_SOHUS_ADRRM") != null) {
			sb.append(dataMap.getString("KNYTCS_SOHUS_ADRRM")); // 契約内容通知書.契約内容通知書送付先住所補記・部屋番号
		}

		return sb.toString();
	}

	/**
	 * PK項目：契約内容通知書番号を取得する
	 * 
	 * @param knytcsNo
	 * @return
	 */
	private Object[] getPkWhereParam(String knytcsNo) {
		// Object[] whereParam = new Object[1];

		Object[] whereParam = { knytcsNo };
		// whereParam[0] = knytcsNo; // 契約内容通知書.契約内容通知書番号
		return whereParam;
	}

	/**
	 * 業務サービス終了処理
	 * 
	 * @throws Exception
	 */
	public void terminal() throws Exception {
		/** ▼▼▼▼▼▼業務サービスの終了処理を記述してください。▼▼▼▼▼▼ */
		/** ▼▼▼▼▼▼ツールから生成した終了処理のソースです 開始▼▼▼▼▼▼ */
		// DBアクセスクラスをクローズします
		db_KK_T_KNYTCS.close();
		/** ▲▲▲▲▲▲ツールから生成した終了処理のソースです 終了▲▲▲▲▲▲ */
		/** ▲▲▲▲▲▲業務サービスの終了処理を記述してください。▲▲▲▲▲▲ */
	}

	/** ▼▼▼▼▼▼ツールから生成したメソッドです 開始▼▼▼▼▼▼ */
	/**
	 * PK(ＰＫ　検索)でDBアクセスを行います。<br>
	 * <p>
	 * <b>処理フロー</b><br>
	 * 
	 * <pre>
	 * 1.引数で条件マップを作ります。&lt;br&gt;
	 * 
	 * 2.DBアクセスを実行します。&lt;br&gt;
	 * 
	 * 3.メソッドの呼び出し方です。&lt;br&gt;
	 * 	引数:
	 * 	whereParam:PK項目の(項目、値)を(key、value)として,格納された配列です。PK項目は以下に説明します。
	 * </pre>
	 * <p>
	 * 
	 * @param whereParam
	 *            条件項目の値。
	 * @return JBSbatCommonDBInterface 検索の結果。
	 * @throws Exception
	 *             業務サービス内で発生した例外全般。
	 */
	private JBSbatCommonDBInterface executeKK_T_KNYTCS_PKSELECT(
			Object[] whereParam) throws Exception {
		// 条件のマップを作成します
		JBSbatCommonDBInterface whereMap = new JBSbatCommonDBInterface();
		whereMap.setValue("KNYTCS_NO", whereParam[0]); // 契約内容通知書番号

		// DBアクセスを実行します
		return db_KK_T_KNYTCS.selectByPrimaryKeys(whereMap);
	}

	/**
	 * PK(ＰＫ　更新)でDBアクセスを行います。<br>
	 * <p>
	 * <b>処理フロー</b><br>
	 * 
	 * <pre>
	 * 1.引数で設定項目マップを作ります。&lt;br&gt;
	 * 
	 * 2.引数で条件マップを作ります。&lt;br&gt;
	 * 
	 * 3.DBアクセスを実行します。&lt;br&gt;
	 * 
	 * 4.メソッドの呼び出し方です。&lt;br&gt;
	 * 	引数:
	 * 	setParam:設定したい項目の(項目、値)を(key、value)として、setParamマップに入れます。項目キーは以下に説明します。
	 * 	whereParam:PK項目の(項目、値)を(key、value)として,格納された配列です。PK項目は以下に説明します。
	 * </pre>
	 * <p>
	 * 
	 * @param setParam
	 *            設定項目の値。
	 * @param whereParam
	 *            条件項目の値。
	 * @throws Exception
	 *             業務サービス内で発生した例外全般。
	 */
	private void executeKK_T_KNYTCS_PKUPDATE(Object[] setParam,
			Object[] whereParam) throws Exception {
		// 設定値のマップを作成します
		JBSbatCommonDBInterface setMap = new JBSbatCommonDBInterface();
		setMap.setValue("KNYTCS_STAT", setParam[0]); // 契約内容通知書ステータス
		setMap.setValue("KNYTCS_WEB_KOKAI_YMD", setParam[1]); // 契約内容通知書Web公開年月日

		// 条件のマップを作成します
		JBSbatCommonDBInterface whereMap = new JBSbatCommonDBInterface();
		whereMap.setValue("KNYTCS_NO", whereParam[0]); // 契約内容通知書番号

		// DBアクセスを実行します
		db_KK_T_KNYTCS.updateByPrimaryKeys(whereMap, setMap);
	}
	/** ▲▲▲▲▲▲ツールから生成したメソッドです 終了▲▲▲▲▲▲ */
}
