/*********************************************************************
*  All Rights reserved,Copyright (c) K-Opticom
**********************************************************************
*＜プログラム内容＞
*	システム名			：eo顧客基幹システム
*	モジュール名		：JBSbatKKTelPreTchCaseSksi
*	ソースファイル名	：JBSbatKKTelPreTchCaseSksi.java
*	作成者				：富士通　
*	作成日				：2011年12月20日
*＜機能概要＞
*　電話番号事前通知ＣＡＳＥファイル作成部品です。
*＜修正履歴＞
*	バージョン	修正日		修正者		修正内容
*	v1.00		2011/12/20   富士通		新規作成
*	v4.00		2012/08/01   FJ)井熊	フロント繋がり対応(電話番号事前通知)
*	v4.01		2012/02/13   FJ)鷲塚	【IT1-2013-0000266】守口倉庫I/F対応(トレーラレコード出力)
*	v5.00		2013/05/16   FJ)米谷	【SG1-2013-0000041】受付者、担当者項目の出力値を修正
*	v5.01		2013/07/23   FJ)井熊	【IT1-2013-0001425】KKIFE117の改行コードをLFからCRLFへ修正
*********************************************************************/
package eo.business.service;

import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.HashMap;

import eo.business.common.JBSbatBusinessService;
import eo.business.common.JKKBatCommon;
import eo.business.common.JKKBatConst;
import eo.business.util.file.JBSbatCRIFE016;
import eo.business.util.file.JBSbatKKIFE117;
import eo.common.constant.JPCBatchMessageConstant;
import eo.framework.application.JBSbatBusinessException;
import eo.framework.file.JBSbatInputFileUtil;
import eo.framework.file.JBSbatOutputFileUtil;
import eo.framework.item.JBSbatCommonItem;
import eo.framework.item.JBSbatOutputItem;
import eo.framework.item.JBSbatServiceInterfaceMap;
import eo.framework.util.JBSbatCheckUtil;

/**
* (クラスの機能概要) <p>
*<BR>
* @author 富士通
*/
public class JBSbatKKTelPreTchCaseSksi extends JBSbatBusinessService
{
	/**▼▼▼▼▼▼ツールから生成した宣言です 開始▼▼▼▼▼▼*/
	/**▲▲▲▲▲▲ツールから生成した宣言です 終了▲▲▲▲▲▲*/

	/** CASEファイル */
	private static final String FILE_NAME  = "電話番号事前通知ＣＡＳＥファイル";

	/** ファイル出力文字列(加入者) */
	public static final String FILE_KNYSHA = "加入者";

	/** ファイル出力文字列(クローズ) */
	public static final String FILE_CLOSE = "クローズ";

	/** ファイル出力文字列(処理中) */
	public static final String FILE_TRN = "処理中";

	/** ファイル出力文字列(バッチＩＤ) */
	public static final String FILE_BATCH_ID = "KKPRC10301";

	/** ファイル出力文字列(他システム) */
	public static final String FILE_TSYS = "他システム";

	/** ファイル出力文字列(タイトル) */
	public static final String FILE_TITLE = "電話番号事前通知データ抽出";

	/** ファイル入力フォーマット(日付) */
	public static final String FILE_DATE_IN = "yyyyMMddHHmmss";

	/** ファイル出力フォーマット(日付) */
	public static final String FILE_DATE_FORMAT = "yyyy/MM/dd HH:mm:ss";

	/** 業務パラメータ(問合せ履歴) */
	private static final String WORK_PARAM_ID = "KK_CASE_TEL_PRE_TCH";
	
// SG1-2013-0000041 2013.05.16 ADD START
	/** 業務パラメータ(契約用対応履歴登録ユーザ) */
	private static final String WORK_PARAM_ID_KK_TAIORRK_ADD_USER = "KK_TAIORRK_ADD_USER";
// SG1-2013-0000041 2013.05.16 ADD END

	/** 改行コード */
	private static final String CRLF  = "CR+LF";

	/** 改行コード */
//	private static final String LF  = "LF";

	/** 文字コード */
	private static final String SJIS  = JKKBatConst.SJIS;

	/** 件数ファイル括り文字 */
	private static final String SCOPE  = "\"";

	/** トレーラーレコード付与対象ファイル */
	private String otf1File = null;

	/** CASE件数ファイル */
	private String createCntFile = null;

	/** 問合せ履歴 */
	private String toiawaseRireki = null;
// SG1-2013-0000041 2013.05.16 ADD START
	/** 契約用対応履歴登録ユーザ */
	private String taioRrkAddUser = null;
// SG1-2013-0000041 2013.05.16 ADD END
	/** CASEファイル出力件数 */
	private int outmapCnt = 0;

	/**
	 * 初期処理
	 * @param JBSbatCommonItem commonItem　バッチ共通パラメータ電文
	 * @throws Exception
	 */
	public void initial(JBSbatCommonItem commonItem) throws Exception
	{
		
	/**▼▼▼▼▼▼業務サービスの初期処理を記述してください。▼▼▼▼▼▼*/
		/**▼▼▼▼▼▼ツールから生成した初期化のソースです 開始▼▼▼▼▼▼*/
		// 共通パラメータを設定します
		super.setCommonInfo(commonItem);
		/**▲▲▲▲▲▲ツールから生成した初期化のソースです 終了▲▲▲▲▲▲*/

		// フリー項目よりCASE件数ファイルおよびトレーラーレコード付与対象ファイルのフルパスを取得
		String[] freeItems = super.freeItem.split(JKKBatConst.S_PARAM_DELIM);
		if (freeItems[0] != null || !freeItems[0].equals("") || freeItems.length == 2)
		{
			this.createCntFile = freeItems[0];
			this.otf1File = freeItems[1];
		}
		else
		{
			// パラメータ不正
			throw new JBSbatBusinessException(JPCBatchMessageConstant.EKKB0130CE,
					new String[]{super.freeItem});
		}

		// 問合せ履歴出力用文字列を取得
		this.toiawaseRireki = JKKBatCommon.getWorkParamSetteValue(super.commonItem, WORK_PARAM_ID);
// SG1-2013-0000041 2013.05.16 ADD START
		// 受付者、担当者用文字列を取得
		this.taioRrkAddUser = JKKBatCommon.getWorkParamSetteValue(super.commonItem, WORK_PARAM_ID_KK_TAIORRK_ADD_USER);
// SG1-2013-0000041 2013.05.16 ADD END
	/**▲▲▲▲▲▲業務サービスの初期処理を記述してください。▲▲▲▲▲▲*/
	}

	/**
	 * 主処理
	 * @param inMap　入力電文
	 * @return JBSbatOutputItem　出力情報
	 * @throws Exception
	 */
	@SuppressWarnings("unchecked")
	public JBSbatOutputItem execute(JBSbatServiceInterfaceMap inMap) throws Exception
	{
	/**▼▼▼▼▼▼業務サービスの主処理を記述してください。▼▼▼▼▼▼*/
		// 出力共通電文を生成
		JBSbatOutputItem outputItem = new JBSbatOutputItem();

		// 入力レコードに異常があった場合
		if (inMap.isInputErrorFlg())
		{
			// 業務エラーログ出力
			super.logPrint.printBusinessErrorLog(JPCBatchMessageConstant.EKKB0100AE,
					new String[] {FILE_NAME});
			// エラーフラグ設定
			super.commonItem.setErrFlg(true);
			return null;
		}

		// データをHashMapに格納
		HashMap rsMap = inMap.getMap();

		if (!isSingleCheckKKIFE117_INF1(rsMap, getItemvalueMap()))
		{
			// エラーフラグ設定
			super.commonItem.setErrFlg(true);
			return null;
		}

		// 電話番号事前通知CASEファイルにデータを出力
		outputItem.addOutMapList(setOutFileData(inMap));

		// CASEファイル出力件数をカウントアップ
		this.outmapCnt++;

		return outputItem;
	/**▲▲▲▲▲▲業務サービスの主処理を記述してください。▲▲▲▲▲▲*/
	}

	/**
	 * 業務サービス終了処理
	 * @throws Exception
	 */
	public void terminal() throws Exception
	{
	/**▼▼▼▼▼▼業務サービスの終了処理を記述してください。▼▼▼▼▼▼*/
		/**▼▼▼▼▼▼ツールから生成した終了処理のソースです 開始▼▼▼▼▼▼*/
		/**▲▲▲▲▲▲ツールから生成した終了処理のソースです 終了▲▲▲▲▲▲*/

		// トレーラーレコード付与処理
		writeTrailer();

		// 件数ファイルを作成し、処理件数を出力
		JBSbatOutputFileUtil cntFile = new JBSbatOutputFileUtil(this.createCntFile);
		cntFile.setEncode(SJIS);
		cntFile.setLine(CRLF);
		cntFile.createWriter();
		StringBuffer sb = new StringBuffer();
		sb.append(SCOPE);
		sb.append(String.valueOf(this.outmapCnt));
		sb.append(SCOPE);
		cntFile.write(sb.toString());
		cntFile.close();
	/**▲▲▲▲▲▲業務サービスの終了処理を記述してください。▲▲▲▲▲▲*/
	}

	/**▼▼▼▼▼▼ツールから生成したメソッドです 開始▼▼▼▼▼▼*/
	/**
	 *入力情報（番ポなし番号事前通知ファイル）の単項目チェックを行います。<br>
	 * <p>
	 * <b>処理フロー</b><br>
	 * <pre>
	 * 1.単項目チェックを行います。<br>
	 * 
	 * 2.メソッドの呼び出し方です。<br>
	 *		引数:
	 *		rsMap:(項目、値)を(key、value)として、データをrsMapに入れます
	 *		itemvalueMap:埋め込み文字の値をitemvalueMapに入れます。キーの値は、以下に説明します。
	 *			 TXT-KKIFE117-INF1.svc_kei_no			番ポなし番号事前通知ファイル.サービス契約番号
	 *			 TXT-KKIFE117-INF1.svc_kei_no			番ポなし番号事前通知ファイル.サービス契約番号
	 *			 TXT-KKIFE117-INF1.svc_kei_no			番ポなし番号事前通知ファイル.サービス契約番号
	 * </pre>
	 * <p>
	 * @param rsMap 入力データ（TXT又はDB）を格納されたHashMap。
	 * @param itemvalueMap エラーメッセージに関する項目値を格納されたHashMap。
	 * @return  boolean trueである場合、エラーがありません。falseである場合、エラーを発生しました。
	 */
	@SuppressWarnings("unchecked")
	private boolean isSingleCheckKKIFE117_INF1(HashMap rsMap, HashMap itemvalueMap)
	{
		// 単項目チェックを行います
		String strValue = null;

		// サービス契約番号項目チェック
		strValue = (String)rsMap.get("svc_kei_no");
		// 必須チェック
		if(strValue == null || "".equals(strValue))
		{
			commonItem.getLogPrint().printBusinessErrorLog("EKKB0060TE", new String[]{
															(String)itemvalueMap.get("TXT-KKIFE117-INF1.svc_kei_no")});
			return false;
		}
		// 桁数チェック
		if(!JBSbatCheckUtil.invoke(strValue, new String[]{"ketasuu2", "0", "10"}))
		{
			commonItem.getLogPrint().printBusinessErrorLog("EKKB0070TE", new String[]{
															(String)itemvalueMap.get("TXT-KKIFE117-INF1.svc_kei_no")});
			return false;
		}
		// 属性チェック
		if(!JBSbatCheckUtil.invoke(strValue, new String[]{"hannkakuesuuji1"}))
		{
			commonItem.getLogPrint().printBusinessErrorLog("EKKB0080TE", new String[]{
															(String)itemvalueMap.get("TXT-KKIFE117-INF1.svc_kei_no")});
			return false;
		}

		return true;
	}
	/**▲▲▲▲▲▲ツールから生成したメソッドです 終了▲▲▲▲▲▲*/

	/**
	 * エラーメッセージに関する項目値を格納されたHashMap<String, String>を生成します。<br>
	 * <p>
	 * <b>処理フロー</b><br>
	 * <pre>
	 * 1.エラーメッセージに関する項目値を格納されたHashMapを生成する。<br>
	 *
	 * 2.エラーメッセージに関する項目値を格納されたHashMapに値を設定する。<br>
	 * </pre>
	 * <p>
	 * @return itemvalueMap エラーメッセージに関する項目値を格納されたHashMap
	 */
	private HashMap<String, String> getItemvalueMap()
	{
		// エラーメッセージに関する項目値が格納されたHashMapを設定
		HashMap<String, String> itemvalueMap = new HashMap<String, String>();
		itemvalueMap.put("TXT-KKIFE117-INF1.svc_kei_no", "番ポなし番号事前通知ファイル.サービス契約番号");

		return itemvalueMap;
	}

	/**
	 * 電話番号事前通知CASEファイルにデータを設定します。<br>
	 * <p>
	 * <b>処理フロー</b><br>
	 * <pre>
	 * 1.電話番号事前通知CASEファイルに出力するデータを設定する。<br>
	 * </pre>
	 * <p>
	 * @param inMap 入力電文
	 * @return JBSbatServiceInterfaceMap 入出力インターフェースマップ
	 * @throws Exception 
	 */
	private JBSbatServiceInterfaceMap setOutFileData(JBSbatServiceInterfaceMap inMap) throws Exception
	{
		// 入出力インターフェースオブジェクトを生成
		JBSbatServiceInterfaceMap outMap = new JBSbatServiceInterfaceMap();
		// 日付フォーマット
		SimpleDateFormat sdf = new SimpleDateFormat(FILE_DATE_FORMAT);
		SimpleDateFormat instance = new SimpleDateFormat(FILE_DATE_IN);

		// 顧客タイプ
		outMap.setString(JBSbatCRIFE016.CUST_TYPE, FILE_KNYSHA);
		// サービス契約番号
		outMap.setString(JBSbatCRIFE016.CUST_ID, inMap.getString(JBSbatKKIFE117.SVC_KEI_NO));
		// 顧客氏名
		outMap.setString(JBSbatCRIFE016.CUST_NM, inMap.getString(JBSbatKKIFE117.CUST_NM));
		// 顧客氏名（カナ）
		outMap.setString(JBSbatCRIFE016.CUST_NM_KANA, inMap.getString(JBSbatKKIFE117.CUST_KANA));
		// 電話番号
		outMap.setString(JBSbatCRIFE016.TELNO, inMap.getString(JBSbatKKIFE117.TELNO1));
		// 電話番号２
		outMap.setString(JBSbatCRIFE016.TELNO_2, "");
		// 郵便番号
		outMap.setString(JBSbatCRIFE016.PCD, "");
		// 住所１
		outMap.setString(JBSbatCRIFE016.AD_1, "");
		// 住所２
		outMap.setString(JBSbatCRIFE016.AD_2, "");
		// 住所３
		outMap.setString(JBSbatCRIFE016.AD_3, "");
		// 性別
		outMap.setString(JBSbatCRIFE016.SEX, "");
		// 生年月日
		outMap.setString(JBSbatCRIFE016.BIRTHD, "");
		// 状態
		outMap.setString(JBSbatCRIFE016.JOTAI, FILE_CLOSE);
		// ステータス
		outMap.setString(JBSbatCRIFE016.STAT, FILE_TRN);
		// 作成日時
		outMap.setString(JBSbatCRIFE016.SAKSEI_DATE,
				sdf.format(instance.parse(JKKBatCommon.getSysDateTime())));
		// 受付者
		outMap.setString(JBSbatCRIFE016.UKSHA, this.taioRrkAddUser);
		// 担当者
		outMap.setString(JBSbatCRIFE016.TNTSHA, this.taioRrkAddUser);
		// キュー名
		outMap.setString(JBSbatCRIFE016.QUE_NM, "");
		// 受付種別
		outMap.setString(JBSbatCRIFE016.UK_SBT, FILE_TSYS);
		// タイトル
		outMap.setString(JBSbatCRIFE016.TITLE, FILE_TITLE);
		// カテゴリー１
		outMap.setString(JBSbatCRIFE016.CTGR_1, "");
		// カテゴリー２
		outMap.setString(JBSbatCRIFE016.CTGR_2, "");
		// カテゴリー３
		outMap.setString(JBSbatCRIFE016.CTGR_3, "");
		// カテゴリー４
		outMap.setString(JBSbatCRIFE016.CTGR_4, "");
		// カテゴリー５
		outMap.setString(JBSbatCRIFE016.CTGR_5, "");
		// カテゴリー６
		outMap.setString(JBSbatCRIFE016.CTGR_6, "");
		// カテゴリー７
		outMap.setString(JBSbatCRIFE016.CTGR_7, "");
		// カテゴリー８
		outMap.setString(JBSbatCRIFE016.CTGR_8, "");
		// カテゴリー９
		outMap.setString(JBSbatCRIFE016.CTGR_9, "");
		// カテゴリー１０
		outMap.setString(JBSbatCRIFE016.CTGR_10, "");
		// カテゴリー１１
		outMap.setString(JBSbatCRIFE016.CTGR_11, "");
		// 問合せ履歴
		outMap.setString(JBSbatCRIFE016.TOIAWASE_RIREKI, this.toiawaseRireki);
		// 問合せ客番号
		outMap.setString(JBSbatCRIFE016.PROSCST_ID, "");
		// ｅｏＩＤ
		outMap.setString(JBSbatCRIFE016.EOID, "");
		// 申込書番号
		outMap.setString(JBSbatCRIFE016.MSKMSHO_NO, "");
		// コールバック日時
		outMap.setString(JBSbatCRIFE016.CALLBK_DATE, "");
		// コールバック時間指定タイプ
		outMap.setString(JBSbatCRIFE016.CALLBK_SHITEI_TYPE, "");

		outMap.setOutFlg(true);
		return outMap;
	}

	/**
	 * 出力ファイルにトレーラーレコードを付与します。<br>
	 * <p>
	 * <b>処理フロー</b><br>
	 * <pre>
	 * 1.トレーラーレコード付与処理。<br>
	 * </pre>
	 * <p>
	 * @throws Exception 
	 */
	private void writeTrailer() throws Exception
	{
		// 入力ファイル名を取得する
		String inFileName = this.otf1File;
		JBSbatInputFileUtil inFileObj = null;
		ArrayList<String> inArr = new ArrayList<String>();
		int inputCount = 0;
		if(inFileName != null && !"".equals(inFileName))
		{
			// 入力ファイルオブジェクトを生成する
			inFileObj = new JBSbatInputFileUtil(inFileName);
			inFileObj.setEncode(SJIS);
			// Readerオブジェクトを生成する。
			inFileObj.createReader();
			// インプットがファイルの場合
			while (inFileObj.ready())
			{
				inArr.add(inFileObj.readLine()); // ファイルレコード取得
				inputCount++;
			}
			inFileObj.close();
		}

		// IT1-2013-0000266 2013/02/13 DEL START
//		// 入力ファイルの件数が0件の場合は処理終了
//		if (inArr.size() <= 0)
//		{
//			return;
//		}
		// IT1-2013-0000266 2013/02/13 DEL END

		// 出力日を取得する
		String opeYmd = super.opeDate;
		// トレーラー行レコード
		inArr.add(String.format(
				SCOPE + "E" + SCOPE + "," + SCOPE + "%d" + SCOPE + "," + SCOPE + "%s" + SCOPE,
				inputCount, opeYmd));

		// 出力ファイル名を取得する
		String outFileName = this.otf1File;
		JBSbatOutputFileUtil outFileObj = null;
		if(outFileName != null && !"".equals(outFileName))
		{
			// 出力ファイルオブジェクトを生成する
			outFileObj = new JBSbatOutputFileUtil(outFileName);
			outFileObj.setEncode(SJIS);
			outFileObj.setLine(CRLF);
			
			// Writerオブジェクトを生成する
			outFileObj.createWriter();
			for (String line : inArr) {
				// 出力する
				outFileObj.write(line);
			}
			outFileObj.close();
		}
	}
}
