/*********************************************************************
*  All Rights reserved,Copyright (c) K-Opticom
**********************************************************************
*＜プログラム内容＞
*	システム名			：eo顧客基幹システム
*	モジュール名		：JBSbatKKCashPostRnk
*	ソースファイル名	：JBSbatKKCashPostRnk.java
*	作成者				：富士通　
*	作成日				：2019年10月09日
*＜機能概要＞
*　CASHPOST送金対象連携部品です。
*＜修正履歴＞
*	バージョン	修正日		修正者		修正内容
*	v46.00.00	2019/10/09  富士通		新規作成
*	v46.00.00	2020/01/16  FJ)美濃原  【OM-2020-0000054】CASHPOST連携バッチでケースファイルが移動できていない
*	v49.00.00	2020/04/08  FJ)岡井    【ANK-3837-00-00】CASHPOST連携：住所変更時のCP付け替え機能
*	v53.00.00	2021/05/13  FJ)岡井    【ANK-3907-00-00】CASHPOST連携キャンペーン金額表示形式変更
*	v57.00.00	2022/02/15	FJ)平野    【ANK-4193-00-00】CASHPOSTお客さま受取結果反映
*	v59.00.00	2022/04/18	FJ)美濃原  【ANK-4229-00-00】CASHPOST登録結果のメール送付
*	v71.00.00	2024/06/18	FJ)久山    【ANK-4468-07-00】シンプルプラン CASHPOST対応
*	v73.00.00	2024/11/13	FJ)辻中    【ANK-4427-00-00】NTT卸対応
*********************************************************************/
package eo.business.service;

import java.io.File;
import java.text.NumberFormat;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashMap;

import eo.business.common.JBSBatKKFileUtil;
import eo.business.common.JBSbatBusinessService;
import eo.business.common.JBSbatKKCashPostRnkApi;
import eo.business.common.JCCBatCommon;
import eo.business.common.JKKBatCommon;
import eo.business.common.JKKBatConst;
import eo.business.common.JKKBatKKCashPostBase;
import eo.business.util.file.JBSbatKKIFE427;
import eo.business.util.file.JBSbatKKIFM893;
import eo.business.util.table.JBSbatKK_T_CASHPOST_KEI;
import eo.common.constant.JKKStrConst;
import eo.common.constant.JPCBatchMessageConstant;
import eo.common.util.JKKStringUtil;
import eo.framework.application.JBSbatBusinessException;
import eo.framework.db.JBSbatSQLAccess;
import eo.framework.file.JBSbatDefFileUtil;
import eo.framework.file.JBSbatInputFileUtil;
import eo.framework.item.JBSbatCommonDBInterface;
import eo.framework.item.JBSbatCommonItem;
import eo.framework.item.JBSbatOutputItem;
import eo.framework.item.JBSbatServiceInterfaceMap;
import eo.framework.util.JBSbatAplConst;
import eo.framework.util.JBSbatBusinessFileUtil;
import eo.framework.util.JBSbatDateUtil;
import eo.framework.util.JBSbatStringUtil;

/**
* (クラスの機能概要) <p>
*<BR>
* @author 富士通
*/
public class JBSbatKKCashPostRnk extends JBSbatBusinessService
{
	/**▼▼▼▼▼▼ツールから生成した宣言です 開始▼▼▼▼▼▼*/
	/** テーブルアクセスクラス(CASHPOST契約)*/
	private JBSbatSQLAccess db_KK_T_CASHPOST_KEI = null;
	/** テーブルアクセスクラス(ダウンロードファイル管理)*/
	private JBSbatSQLAccess db_ZM_T_DL_FILE_KANRI = null;
	/**▲▲▲▲▲▲ツールから生成した宣言です 終了▲▲▲▲▲▲*/

	// 起動パラメータ
	/** 起動パラメータ FREE項目 */
	private String[] freeItems = null;

	/** FREE項目：全項目数 */
	private static final int FREE_ITEM_COUNT = 4;
	/** FREE項目：入力ファイルフォルダ */
	private static final int FREE_IDX_INPT = 0;
	/** FREE項目：作業用フォルダ */
	private static final int FREE_IDX_OUTPUT = 1;
	/** FREE項目：バックアップフォルダ */
	private static final int FREE_IDX_BACKUP = 2;
	/** FREE項目：対応履歴ファイル出力先フォルダ */
	private static final int FREE_IDX_TAIORIREKI = 3;

	// テーブル
	/** テーブル(CASHPOST契約)*/
	private static final String D_TBL_NAME_KK_T_CASHPOST_KEI = "KK_T_CASHPOST_KEI";
	/** SQL定義キー(CASHPOST契約：KK_T_CASHPOST-KK_SELECT_003)*/
	private static final String KK_T_CASHPOST_KK_SELECT_003 = "KK_SELECT_003";
	/** SQL定義キー(CASHPOST契約：KK_T_CASHPOST-KK_INSERT_002)*/
	private static final String KK_T_CASHPOST_KEI_KK_INSERT_002 = "KK_INSERT_002";

	/** テーブル(ダウンロードファイル管理)*/
	private static final String D_TBL_NAME_ZM_T_DL_FILE_KANRI = "ZM_T_DL_FILE_KANRI";
	/** SQL定義キー(KK_SELECT_373)*/
	private static final String ZM_T_DL_FILE_KANRI_KK_INSERT_002 = "KK_INSERT_002";

	/** 電子ファイル管理.処理管理番号（CASHPOST送信完了ハガキ発送用リスト） */
	private static final String TRN_KANRI_NO_KKIFM894 = "000000000210";
	/** 電子ファイル管理.ファイルコード */
	private static final String FILE_CD = "0000";

	// ファイル情報
	/** ＣＡＳＨＰＯＳＴ送金対象情報ファイルのプレフィックス "CASHPOST_" </br>
	 *  命名ルール：「CASHPOST_YYYYMMDDhhmmssSSS.csv」
	 */
	private static final String KKIFM893_NAME = "CASHPOST_";
	/** ファイルエンコード(SJIS) */
	private static final String ENCODE_SHIFT_JIS = "Shift-JIS";
	/** ＣＡＳＨＰＯＳＴ送金対象情報ファイル名の文字数 */
	private static final int INT_FILE_NAME_LEN = 30;

	/** ＣＡＳＨＰＯＳＴ送金対象情報ファイル 定義ファイル名 */
	private static final String KKIFM893_DEF = "KKIFM893.def";
	/** CASHPOST送信完了ハガキ発送用リストのプレフィックス "CASHPOST_POSTCARD_LIST_" </br>
	 *  命名ルール：「CASHPOST_POSTCARD_LIST_yyyyMMddHHmmss.csv」
	 */
	private static final String KKIFM894_NAME = "CASHPOST_POSTCARD_LIST_";
	
	// ANK-4468-07-00 ADD START
	/** CASHPOST送信完了ハガキ発送用リスト（シンプルプラン）のプレフィックス "CASHPOST_SIMPLE_POSTCARD_LIST_" </br>
	 *  命名ルール：「CASHPOST_SIMPLE_POSTCARD_LIST_yyyyMMddHHmmss.csv」
	 */
	private static final String KKIFM894_NAME2 = "CASHPOST_SIMPLE_POSTCARD_LIST_";
	// ANK-4468-07-00 ADD END
	// ANK-4427-00-00 ADD START
	/** CASHPOST送信完了ハガキ発送用リスト（NTT卸）のプレフィックス "CASHPOST_NTTO_POSTCARD_LIST_" </br>
	 *  命名ルール：「CASHPOST_NTTO_POSTCARD_LIST_yyyyMMddHHmmss.csv」
	 */
	private static final String KKIFM894_NAME3 = "CASHPOST_NTTO_POSTCARD_LIST_";
	// ANK-4427-00-00 ADD END	
	
	/** CASEファイルのプレフィックス "CASE_CASHPOST_" */
	private static final String KKIFM895_CASE_CASE_PREFIX = "CASE_CASHPOST_";

	/** CASEファイルの拡張子 ".CSV" </br>命名ルール：「CASE_CASHPOST_yyyymmddhhmmss.CSV」*/
	private static final String KKIFM895_CASE_EXT = ".CSV";

	/** CASE件数ファイルのサフィックス "_CNT"命名ルール：「CASE_CASHPOST_yyyymmddhhmmss_CNT.TXT」*/
	private static final String KKIFM895_CASE_CNT_SUFFIX = "_CNT";
	/** CASEフラグファイルの拡張子 */
	private static final String KKIFM895_CASE_CNT_EXT = ".TXT";

	/** CASEフラグファイルのサフィックス "_FTP" </br>命名ルール：「CASE_CASHPOST_yyyymmddhhmmss_FTP.FLG」*/
	private static final String KKIFM895_CASE_FLG_SUFFIX = "_FTP";
	/** CASEフラグファイルの拡張子 */
	private static final String KKIFM895_CASE_FLG_EXT = ".FLG";

	/** ＣＡＳＨＰＯＳＴ送金対象情報ファイル パス */
	private String KKIFM893FilePath = null;
	/** CASHPOST送信完了ハガキ発送用ファイル名 */
	private String KKIFM894FileName = null;
	/** CASHPOST送信完了ハガキ発送用リストファイル パス */
	private String KKIFM894FilePath = null;
	// ANK-4468-07-00 ADD START
	/** CASHPOST送信完了ハガキ発送用（シンプルプラン）ファイル名 */
	private String KKIFM894SimpleFileName = null;
	/** CASHPOST送信完了ハガキ発送用リスト（シンプルプラン）ファイル パス */
	private String KKIFM894SimpleFilePath = null;
	// ANK-4468-07-00 ADD END
	// ANK-4427-00-00 ADD START
	/** CASHPOST送信完了ハガキ発送用（NTT卸）ファイル名 */
	private String KKIFM894NttOroshiFileName = null;
	/** CASHPOST送信完了ハガキ発送用リスト（NTT卸）ファイル パス */
	private String KKIFM894NttOroshiFilePath = null;
	// ANK-4427-00-00 ADD END
	/** CASEファイル パス */
	private String KKIFM895FilePath1 = null;
	/** CASE件数ファイル パス */
	private String KKIFM895FilePath2 = null;
	/** CASEフラグ パス */
	private String KKIFM895FilePath3 = null;

	/** CASHPOST送信完了ハガキ発送用リストファイル オブジェクト */
	private JBSbatBusinessFileUtil KKIFM894FileObj = null;
	// ANK-4468-07-00 ADD START
	/** CASHPOST送信完了ハガキ発送用（シンプルプラン）リストファイル オブジェクト */
	private JBSbatBusinessFileUtil KKIFM894SimpleFileObj = null;
	// ANK-4468-07-00 ADD END
	// ANK-4427-00-00 ADD START
	/** CASHPOST送信完了ハガキ発送用（NTT卸）リストファイル オブジェクト */
	private JBSbatBusinessFileUtil KKIFM894NttOroshiFileObj = null;
	// ANK-4427-00-00 ADD END
	/** CASEファイル オブジェクト */
	private JBSbatBusinessFileUtil KKIFM895CaseFileObj = null;
	/** CASE件数ファイル オブジェクト */
	private JBSbatBusinessFileUtil KKIFM895CntFileObj = null;
	/** CASEフラグ オブジェクト */
	private JBSbatBusinessFileUtil KKIFM895FlgFileObj = null;

	/** 入力ファイル定義 */
	private static final String PARAM_IND = "IND";
	/** 空文字 */
	private static final String STR_EMPTY = "";
	/** 分離符（半角スラッシュ）*/
	private static final String STR_SEP_SLASH = "/";
	/** CASEファイル用の分離符（全角スラッシュ）*/
	private static final String STR_SEP_CASE_SLASH = "／";
	/** FREE項目 ヘッダ */
	private static final String STR_FREE_HEADER = "キャンペーン名：";
	/** 受取期限 40日 */
	private static final int INT_UKE_END_DAY = 40;
	/** CASHPOST送信完了ハガキ発送用リストファイル ヘッダー部 */
	private static final ArrayList<String> KKIFM894_HEADER_INFO =
			new ArrayList<String>(Arrays.asList("郵便番号", "住所", "氏名", "CP名称1", "CP名称2", "CP名称3", "CP名称4", "CP名称5", "送金額", "受付番号", "受取期限"));
	/** ファイル項目の最大項目数 */
	private static final int INT_KMK_MAX = 5;
	// ANK-4468-07-00 ADD START
	/** 業務パラメータ管理キー：CASHPOSTハガキ送付用CSV作成分割料金コース */
	private static final String KK_CASHPOST_CSV_PCRS = "KK_CASHPOST_CSV_PCRS";
	/** 業務パラメータ設定値：CASHPOSTハガキ送付用CSV作成分割料金コース */
	private String kkCashpostCsvPcrs = "";
	/** 料金コースコード */
	private String svcPcrsCd = "";
	// ANK-4468-07-00 ADD END
	// ANK-4427-00-00 ADD START
	/** 業務パラメータ管理キー：CASHPOSTハガキ送付用CSV作成分割料金コース(NTT卸) */
	private static final String KK_CASHPOST_CSV_NTT = "KK_CASHPOST_CSV_NTT";
	/** 業務パラメータ設定値：CASHPOSTハガキ送付用CSV作成分割料金コース(NTT卸) */
	private String kkCashpostCsvNttOroshiPcrs = "";
	// ANK-4427-00-00 ADD END
	
	// CASHPOST連携API
	/** CASHPOST連携処理の外部インターフェース：正常終了 */
	private static final String API_NORMALEND = "0";
	/** そとれん接続エラー */
	private static final String API_ERR_SOTOREN = "SOTOREN";

	/** サイト管理番号 上2桁 */
	private static final String API_EO = "eo";
	/** サイト管理番号 連番桁数 */
	private static final int API_REN_BYTE = 4;
	/** 金額単位（円）*/
	private static final String STR_TANI_YEN = "円";

	// ANK-3837-00-00 ADD START
	/** 半角ハイフン */
	private static final String STR_HALF_HYPHEN = "-";
	// ANK-3837-00-00 ADD END

	/** メール送信日（API処理結果をもとに取得） */
	private static final String API_MAIL_SEND_DATE = "mailSendDate";
	/** 受取期限（API処理結果をもとに取得）*/
	private static final String API_UKE_END_DATE = "ukeEndDate";

	// CASEファイル
	/** ファイル出力文字列(加入者) */
	public static final String FILE_KNYSHA = "加入者";
	/** ファイル出力文字列(クローズ) */
	public static final String FILE_CLOSE = "クローズ";
	/** ファイル出力文字列(処理中) */
	public static final String FILE_TRN = "処理中";
	/** ファイル出力文字列(他システム) */
	public static final String OTHER_SYSTEM = "OTHER_SYSTEM";
	/** ファイル出力文字列(他システム) */
	public static final String FILE_TSYS = "他システム";
	/** ファイル出力文字列(タイトル) */
	public static final String FILE_TITLE = "CASHPOST送金情報";
	/** ファイル出力フォーマット(日付) */
	public static final String FILE_DATE_FORMAT = "yyyy/MM/dd HH:mm:ss";
	/** ファイル入力フォーマット(日付) */
	public static final String FILE_DATE_IN = "yyyyMMddHHmmss";

	//件数
	/** ＣＡＳＨＰＯＳＴ送金対象情報ファイル 入力レコード件数 */
	private int kkifm893RecordCnt = 0;
	/** CASHPOST送信完了ハガキ発送用リスト 出力レコード件数 */
	private int kkifm894OutputCnt = 0;
	// ANK-4468-07-00 ADD START
	/** CASHPOST送信完了ハガキ発送用リスト（シンプルプラン） 出力レコード件数 */
	private int kkifm894SimpleOutputCnt = 0;
	// ANK-4468-07-00 ADD END
	// ANK-4427-00-00 ADD START
	/** CASHPOST送信完了ハガキ発送用リスト（NTT卸） 出力レコード件数 */
	private int kkifm894NttOroshiOutputCnt = 0;
	// ANK-4427-00-00 ADD END
	/** CASEファイル 出力レコード件数 */
	private int kkifm895OutputCnt = 0;
	/** エラーレコード件数 */
	private int ErrorRecordCnt = 0;
	/** 更新エラーレコード件数 */
	private int ErrorUpdateCnt = 0;

	/** エラーメッセージ */
	private StringBuffer errMsgBuf = new StringBuffer();

	/**
	 * 初期処理
	 * @param JBSbatCommonItem commonItem　バッチ共通パラメータ電文
	 * @throws Exception
	 */
	public void initial(JBSbatCommonItem commonItem) throws Exception
	{
		/**▼▼▼▼▼▼業務サービスの初期処理を記述してください。▼▼▼▼▼▼*/
		/**▼▼▼▼▼▼ツールから生成した初期化のソースです 開始▼▼▼▼▼▼*/
		// 共通パラメータを設定します
		super.setCommonInfo(commonItem);
		db_KK_T_CASHPOST_KEI = new JBSbatSQLAccess(commonItem, D_TBL_NAME_KK_T_CASHPOST_KEI);
		db_ZM_T_DL_FILE_KANRI = new JBSbatSQLAccess(commonItem, D_TBL_NAME_ZM_T_DL_FILE_KANRI);
		/**▲▲▲▲▲▲ツールから生成した初期化のソースです 終了▲▲▲▲▲▲*/

		// Free項目からパラメータを取得
		freeItems = freeItem.split(JKKBatConst.S_PARAM_DELIM);
		if (freeItems.length < FREE_ITEM_COUNT)
		{
			// パラメータが不正です。(%1%)	
			throw new JBSbatBusinessException(JPCBatchMessageConstant.EKKB0130CE, new String[] { "FREE項目の項目数不正" });
		}
		printInfoLog("[初期処理]入力ファイルフォルダ：" + freeItems[FREE_IDX_INPT] + " 候補ファイル名：" + KKIFM893_NAME + "*" + JKKStrConst.EXT_CSV);
		printInfoLog("[初期処理]作業フォルダ：" + freeItems[FREE_IDX_OUTPUT]);
		printInfoLog("[初期処理]バックアップフォルダ：" + freeItems[FREE_IDX_BACKUP]);
		printInfoLog("[初期処理]対応履歴ファイルフォルダ：" + freeItems[FREE_IDX_TAIORIREKI]);
		// OM-2020-0000054 2020/01/16 ADD START
		File dir = new File(freeItems[FREE_IDX_TAIORIREKI]);
		if (!dir.exists() || !dir.isDirectory())
		{
			//『ファイル制御に失敗しました。%1%』
			throw new JBSbatBusinessException("EKKB2060AW", new String[] { "対応履歴ファイルフォルダが存在しません。" });
		}
		// OM-2020-0000054 2020/01/16 ADD END
		// ANK-4468-07-00 ADD START
		// 業務パラメータ管理：CASHPOSTハガキ送付用CSV作成分割料金コース
		kkCashpostCsvPcrs = JKKBatCommon.getWorkParamSetteValue(commonItem, KK_CASHPOST_CSV_PCRS);
		if (JKKStringUtil.isNullBlank(kkCashpostCsvPcrs))
		{
			// %1%テーブルに%2%が存在しません。
			throw new JBSbatBusinessException(JPCBatchMessageConstant.EKKB0210CE, new String[] { "業務パラメータ", "業務パラメータＩＤ：" + KK_CASHPOST_CSV_PCRS });
		}
		// ANK-4468-07-00 ADD END
		// ANK-4427-00-00 ADD START
		// 業務パラメータ管理：CASHPOSTハガキ送付用CSV作成分割料金コース（NTT卸）
		kkCashpostCsvNttOroshiPcrs = JKKBatCommon.getWorkParamSetteValue(commonItem, KK_CASHPOST_CSV_NTT);
		if (JKKStringUtil.isNullBlank(kkCashpostCsvNttOroshiPcrs))
		{
			// %1%テーブルに%2%が存在しません。
			throw new JBSbatBusinessException(JPCBatchMessageConstant.EKKB0210CE, new String[] { "業務パラメータ", "業務パラメータＩＤ：" + KK_CASHPOST_CSV_NTT });
		}
		// ANK-4427-00-00 ADD END
		/**▲▲▲▲▲▲業務サービスの初期処理を記述してください。▲▲▲▲▲▲*/
	}

	/**
	 * 主処理
	 * @return JBSbatOutputItem　出力情報
	 * @throws Exception
	 */
	public JBSbatOutputItem execute() throws Exception
	{
		/**▼▼▼▼▼▼業務サービスの主処理を記述してください。▼▼▼▼▼▼*/

		//■処理対象ファイルを確定する
		KKIFM893FilePath =
				JBSBatKKFileUtil.getTaishoFileFullPath(commonItem, freeItems[FREE_IDX_INPT], KKIFM893_NAME, JKKStrConst.EXT_CSV, INT_FILE_NAME_LEN);
		if (JKKStringUtil.isNullBlank(KKIFM893FilePath))
		{
			// （正常終了）
			printInfoLog("処理対象となるCASHPOST送金対象情報ファイルが存在しませんでした。処理を終了します。");
			return null;
		}
		printInfoLog("[メイン処理]入力ファイル名：" + KKIFM893FilePath);

		JBSbatInputFileUtil kkifm893FileUtil = null;
		try
		{
			String inFilePath = STR_EMPTY;
			//■処理対象ファイルを作業フォルダへ移動する
			if (freeItems[FREE_IDX_INPT].equals(freeItems[FREE_IDX_OUTPUT]))
			{
				inFilePath = KKIFM893FilePath;
			}
			else
			{
				File outputPath = new File(freeItems[FREE_IDX_OUTPUT]);
				File taisho = new File(KKIFM893FilePath);
				inFilePath = freeItems[FREE_IDX_OUTPUT] + taisho.getName();
				KKIFM893FilePath = inFilePath;
				JBSBatKKFileUtil.moveAndDeleteFile(new File[] { taisho }, null, outputPath);
			}

			//■入力ファイル制御
			// ＣＡＳＨＰＯＳＴ送金対象情報ファイル 定義ファイル名を取得する
			String kkifm893DefName = JBSbatAplConst.getAplConstValue(PARAM_IND) + KKIFM893_DEF;
			// ＣＡＳＨＰＯＳＴ送金対象情報ファイル 定義ファイルオブジェクトを生成する
			kkifm893FileUtil = new JBSbatInputFileUtil(inFilePath);
			JBSbatDefFileUtil kkifm893FileDef = new JBSbatDefFileUtil(kkifm893DefName, kkifm893FileUtil);
			// Readerオブジェクトを生成する。
			kkifm893FileUtil.createReader();

			//■出力ファイルOPEN
			String timeStamp = JKKBatCommon.getSysDateTime();
			outputFileOpen(timeStamp);

			// レコード件数
			kkifm893RecordCnt = 0;
			kkifm894OutputCnt = 0;
			// ANK-4468-07-00 ADD START
			kkifm894SimpleOutputCnt = 0;
			// ANK-4468-07-00 ADD END
			// ANK-4427-00-00 ADD START
			kkifm894NttOroshiOutputCnt = 0;
			// ANK-4427-00-00 ADD END
			kkifm895OutputCnt = 0;
			ErrorRecordCnt = 0;
			ErrorUpdateCnt = 0;

			String opeDateFormat = JKKBatCommon.formatDate(this.opeDate);
			String inOrdernoSysDate = JKKBatCommon.getSysDate().substring(2);
			int inOrderNoRenban = 0;

			//■作業用フォルダに移動した入力ファイルを読み込み、件数分下記の処理を繰り返す。
			while (kkifm893FileUtil.ready())
			{
				// ファイルから１レコードを取得する
				String line = kkifm893FileUtil.readLine();

				// 入力ファイルレコード件数カウント
				kkifm893RecordCnt++;

				// 空行の場合
				if (!JKKBatCommon.isNotNull(line))
				{
					printInfoLog("空行のためスキップ " + kkifm893RecordCnt + "行目");
					continue;
				}

				// １レコードの情報をマップに格納する
				JBSbatServiceInterfaceMap inputRecMap = kkifm893FileDef.lineToObject(line, kkifm893FileUtil, kkifm893RecordCnt);

				//----------------------------------------
				// CASHPOST連携処理モジュール呼び出し
				//----------------------------------------
				JBSbatKKCashPostRnkApi api = new JBSbatKKCashPostRnkApi();
				inOrderNoRenban++;
				HashMap<String, Object> apiParamMap = makeApiParamMap(inOrdernoSysDate, inOrderNoRenban, inputRecMap);

				StringBuffer msgStr = new StringBuffer();
				msgStr.append("##########【CASHPOST連携API呼出】：[ＣＡＳＨＰＯＳＴ契約番号:");
				msgStr.append(inputRecMap.get(JBSbatKKIFM893.CASHPOST_KEI_NO));
				msgStr.append("][サービス契約番号 :");
				msgStr.append(inputRecMap.get(JBSbatKKIFM893.SVC_KEI_NO));
				msgStr.append("] ##########");
				printInfoLog(msgStr.toString());

				api.execute(commonItem, apiParamMap);

				// 日付フォーマット
				SimpleDateFormat sdf = new SimpleDateFormat(FILE_DATE_FORMAT);
				SimpleDateFormat instance = new SimpleDateFormat(FILE_DATE_IN);
				// 連携時のシステム日付 yyyy/mm/dd hh:mm:ss ※同一回線のものは、同じ日付となります。
				String renkeiSysDate = sdf.format(instance.parse(JKKBatCommon.getSysDateTime()));

				if (isApiResultNormal(inputRecMap, apiParamMap))
				{
					//■正常
					apiParamMap.put(API_MAIL_SEND_DATE, STR_EMPTY); // メール送信日
					apiParamMap.put(API_UKE_END_DATE, STR_EMPTY); // 受取期限
					String cashpost_endtime = (String)apiParamMap.get(JBSbatKKIFE427.OUT_ENDTIME); // 応答日時
					if (JKKBatCommon.isNotNull(cashpost_endtime))
					{
						String outEndTime = cashpost_endtime.substring(0, 8);
						String mailSendDate = JKKBatCommon.formatDate(outEndTime);
						String ukeEndFormat = JKKBatCommon.formatDate(JKKBatCommon.addDay(outEndTime, INT_UKE_END_DAY));
						apiParamMap.put(API_MAIL_SEND_DATE, mailSendDate); // メール送信日
						apiParamMap.put(API_UKE_END_DATE, ukeEndFormat); // 受取期限
					}

					// CASHPOST契約の登録、ハガキ、CASEファイル出力処理
					cashpostInsert(inputRecMap, apiParamMap, opeDateFormat, renkeiSysDate);
				}
			}

			// OM-2020-0000054 2020/01/16 ADD START
			try
			{
			// OM-2020-0000054 2020/01/16 ADD END
				//■ファイルCLOSE
				outputFileClose();
				kkifm893FileUtil.close();
	
				//■電子ファイル管理登録処理とバックアップ、対応履歴ファイル制御
				fileControl(timeStamp);
			// OM-2020-0000054 2020/01/16 ADD START
			}
			catch (Exception fex)
			{
				//『ファイル制御に失敗しました。%1%』
				printBusinessError("EKKB2060AW", new String[] { fex.getMessage() });
			}
			// OM-2020-0000054 2020/01/16 ADD END
		}
		catch (Exception e)
		{
			super.logPrint.printDebugLog("例外発生の為、更新データがある場合はロールバックされます。");
			//■ファイルCLOSE
			outputFileClose();
			outputFileCloseCntFlg();
			kkifm893FileUtil.close();
			throw e;
		}
		finally
		{
			//■エラーメッセージの出力
			if (0 < errMsgBuf.length())
			{
				//『CASHPOSTへの連携で異常終了しました。%1%』 
				//     %1%  [結果コード詳細：xxxx/お客さまID：xxxxxxxxxx]
				printBusinessError(JPCBatchMessageConstant.EKKB2000AW, new String[] { errMsgBuf.toString() });
			}
		}

		return null;
		/**▲▲▲▲▲▲業務サービスの主処理を記述してください。▲▲▲▲▲▲*/
	}

	/**
	 * 業務サービス終了処理
	 * @throws Exception
	 */
	public void terminal() throws Exception
	{
		/**▼▼▼▼▼▼業務サービスの終了処理を記述してください。▼▼▼▼▼▼*/
		/**▼▼▼▼▼▼ツールから生成した終了処理のソースです 開始▼▼▼▼▼▼*/
		db_KK_T_CASHPOST_KEI.close();
		db_ZM_T_DL_FILE_KANRI.close();
		/**▲▲▲▲▲▲ツールから生成した終了処理のソースです 終了▲▲▲▲▲▲*/
		printInfoLog("CASHPOST送金対象情報ファイル 入力件数：" + String.valueOf(kkifm893RecordCnt));
		printInfoLog("CASHPOST送信完了ハガキ発送用リスト 出力件数：" + String.valueOf(kkifm894OutputCnt));
		// ANK-4468-07-00 ADD START
		printInfoLog("CASHPOST送信完了ハガキ発送用リスト（シンプルプラン） 出力件数：" + String.valueOf(kkifm894SimpleOutputCnt));
		// ANK-4468-07-00 ADD END
		// ANK-4427-00-00 ADD START
		printInfoLog("CASHPOST送信完了ハガキ発送用リスト（NTT卸） 出力件数：" + String.valueOf(kkifm894NttOroshiOutputCnt));
		// ANK-4427-00-00 ADD END
		printInfoLog("CASEファイル 出力件数：" + String.valueOf(kkifm895OutputCnt));
		printInfoLog("CASHPOST連携エラー件数（回線場所毎）：" + String.valueOf(ErrorRecordCnt));
		printInfoLog("CASHPOST契約更新エラー件数：" + String.valueOf(ErrorUpdateCnt));
		/**▲▲▲▲▲▲業務サービスの終了処理を記述してください。▲▲▲▲▲▲*/
	}

	/**
	 * 出力ファイルOPEN。
	 * 
	 * <br>
	 * @throws Exception 
	 */
	private void outputFileOpen(String timeStamp) throws Exception
	{

		// ■CASHPOST送信完了ハガキ発送用リスト
		KKIFM894FileName = getFileName(KKIFM894_NAME, timeStamp, null, JKKStrConst.EXT_CSV);
		KKIFM894FilePath = getFullPathName(freeItems[FREE_IDX_OUTPUT], KKIFM894_NAME, timeStamp, null, JKKStrConst.EXT_CSV);
		// ファイルオブジェクトを生成する
		KKIFM894FileObj = JKKBatCommon.createBusinessFileUtil(KKIFM894FilePath, ENCODE_SHIFT_JIS, JKKStrConst.LINE_SEPARATOR, JKKStrConst.COMMA);

		// ANK-4468-07-00 ADD START
		// ■CASHPOST送信完了ハガキ発送用リスト（シンプルプラン）
		KKIFM894SimpleFileName = getFileName(KKIFM894_NAME2, timeStamp, null, JKKStrConst.EXT_CSV);
		KKIFM894SimpleFilePath = getFullPathName(freeItems[FREE_IDX_OUTPUT], KKIFM894SimpleFileName, timeStamp, null, JKKStrConst.EXT_CSV);
		// ファイルオブジェクトを生成する
		KKIFM894SimpleFileObj = JKKBatCommon.createBusinessFileUtil(KKIFM894SimpleFilePath, ENCODE_SHIFT_JIS, JKKStrConst.LINE_SEPARATOR, JKKStrConst.COMMA);
		// ANK-4468-07-00 ADD END
		
		// ANK-4427-00-00 ADD START
		// ■CASHPOST送信完了ハガキ発送用リスト（NTT卸）
		KKIFM894NttOroshiFileName = getFileName(KKIFM894_NAME3, timeStamp, null, JKKStrConst.EXT_CSV);
		KKIFM894NttOroshiFilePath = getFullPathName(freeItems[FREE_IDX_OUTPUT], KKIFM894NttOroshiFileName, timeStamp, null, JKKStrConst.EXT_CSV);
		// ファイルオブジェクトを生成する
		KKIFM894NttOroshiFileObj = JKKBatCommon.createBusinessFileUtil(KKIFM894NttOroshiFilePath, ENCODE_SHIFT_JIS, JKKStrConst.LINE_SEPARATOR, JKKStrConst.COMMA);
		// ANK-4427-00-00 ADD END
		
		// ■CASEファイル
		KKIFM895FilePath1 = getFullPathName(freeItems[FREE_IDX_OUTPUT], KKIFM895_CASE_CASE_PREFIX, timeStamp, null, KKIFM895_CASE_EXT);
		// ファイルオブジェクトを生成する
		KKIFM895CaseFileObj = JKKBatCommon.createBusinessFileUtil(KKIFM895FilePath1, ENCODE_SHIFT_JIS, JKKStrConst.LINE_SEPARATOR, JKKStrConst.COMMA);

	}

	/**
	 * ファイルのフルパスを生成する。<br>
	 * （システム日付付加）
	 * <br>
	 * @param dirName ディレクトリ名
	 * @param defaultFileName ファイル名
	 * @param timeStamp タイムスタンプ
	 * @param endFix ファイルの終端名
	 * @param extKind 拡張子
	 * @return
	 */
	private String getFullPathName(String dirName, String defaultFileName, String timeStamp, String endFix, String extKind)
	{
		StringBuffer sb = new StringBuffer();
		sb.append(dirName);
		sb.append(getFileName(defaultFileName, timeStamp, endFix, extKind));
		return sb.toString();
	}

	/**
	 * ファイル名を生成する。<br>
	 * （システム日付付加）
	 * <br>
	 * @param defaultFileName ファイル名
	 * @param timeStamp タイムスタンプ
	 * @param endFix ファイルの終端名
	 * @param extKind 拡張子
	 * @return
	 */
	private String getFileName(String defaultFileName, String timeStamp, String endFix, String extKind)
	{
		StringBuffer sb = new StringBuffer();
		sb.append(defaultFileName);
		sb.append(timeStamp);
		sb.append(JKKStringUtil.nullToBlank(endFix));
		sb.append(extKind);
		return sb.toString();
	}

	/**
	 * APIリクエストパラメータ設定。
	 *
	 * <br>
	 * @param inOrdernoSysDate システム日付：YYMMDD
	 * @param inOrderNoRenban 連番
	 * @param inputRecMap 入力ファイルレコード
	 * @return APIリクエストパラメータ
	 */
	private HashMap<String, Object> makeApiParamMap(String inOrdernoSysDate, int inOrderNoRenban, JBSbatServiceInterfaceMap inputRecMap)
	{
		HashMap<String, Object> requestMap = new HashMap<String, Object>();

		// サイト管理番号 「eo」＋「日付（システム日付：YYMMDD）」＋「4桁の通番」
		String renban = JBSbatStringUtil.padNumFormString(String.valueOf(inOrderNoRenban), API_REN_BYTE);
		requestMap.put(JBSbatKKIFE427.IN_ORDERNO, API_EO + inOrdernoSysDate + renban);
		// 送金額
		String amount = String.valueOf(inputRecMap.get(JBSbatKKIFM893.SOHU_AMNT));
		requestMap.put(JBSbatKKIFE427.IN_AMOUNT, amount);
		// 案内方法
		requestMap.put(JBSbatKKIFE427.IN_GUIDEPTN, String.valueOf(inputRecMap.get(JBSbatKKIFM893.GUIDE_WAY)));
		// 受取認証キー１
		requestMap.put(JBSbatKKIFE427.IN_RECEIVEKEY1, String.valueOf(inputRecMap.get(JBSbatKKIFM893.UKETORI_NINSHO_KEY)));
		// メールアドレス
		requestMap.put(JBSbatKKIFE427.IN_MAILADD, String.valueOf(inputRecMap.get(JBSbatKKIFM893.MLAD)));
		// 自由項目
		String freeKmk = String.valueOf(inputRecMap.get(JBSbatKKIFM893.FREE_KMK));
		freeKmk = freeKmk.replaceAll(STR_SEP_SLASH, JKKStrConst.COMMA);
		requestMap.put(JBSbatKKIFE427.IN_FREEITEM, freeKmk);
		// ANK-4468-07-00 ADD START
		// テンプレートコード
		requestMap.put(JBSbatKKIFE427.IN_GUIDETMPCD, String.valueOf(inputRecMap.get(JBSbatKKIFM893.CASHPOST_TEMPLATE_CD)));
		// ANK-4468-07-00 ADD END

		return requestMap;
	}

	/**
	 * CASHPOST連携APIの結果が正常か判定する。
	 * 
	 * <br>
	 * @param inputRecMap 入力ファイルレコード
	 * @param apiParamMap CASHPOST連携結果
	 * @return true:正常、false：エラー
	 * @throws Exception
	 */
	private boolean isApiResultNormal(JBSbatServiceInterfaceMap inputRecMap, HashMap<String, Object> apiParamMap) throws Exception
	{
		String outResult = (String)apiParamMap.get(JKKBatKKCashPostBase.CMD_RESULT_CD);
		String cashpostResult = (String)apiParamMap.get(JBSbatKKIFE427.OUT_RESULT);
		if (JKKBatKKCashPostBase.CMD_RESULT_CD_NORMAL.equals(outResult))
		{
			if (API_NORMALEND.equals(cashpostResult))
			{
				return true;
			}
			else
			{
				//■エラー（CASHPOST側でエラー：1:形式エラー、2:業務エラー、9:システムエラー ）
				String msg = errorMsgEditWork(inputRecMap, apiParamMap, (String)apiParamMap.get(JBSbatKKIFE427.OUT_RESULTDET));
				errMsgBuf = errMsgBuf.append(msg);
			}
		}
		else if (JKKBatKKCashPostBase.CMD_RESULT_CD_ERR_PARAM.equals(outResult))
		{
			// パラメータが不正です。(%1%)	
			throw new JBSbatBusinessException(JPCBatchMessageConstant.EKKB0130CE, new String[] { "アプリケーションプロパティ不正" });
		}
		else
		{
			//■エラー（通信、形式変換など不正）
			String msg = errorMsgEditWork(inputRecMap, apiParamMap, API_ERR_SOTOREN);
			errMsgBuf = errMsgBuf.append(msg);
		}
		return false;
	}

	/**
	 * 出力ファイルCLOSE。
	 * 
	 * <br>
	 * @throws Exception 
	 */
	private void outputFileClose() throws Exception
	{
		if (null != KKIFM894FileObj)
		{
			JKKBatCommon.closeBusinessFileUtil(KKIFM894FileObj);
		}
		// ANK-4468-07-00 ADD START
		if (null != KKIFM894SimpleFileObj)
		{
			JKKBatCommon.closeBusinessFileUtil(KKIFM894SimpleFileObj);
		}
		// ANK-4468-07-00 ADD END
		// ANK-4427-00-00 ADD START
		if (null != KKIFM894NttOroshiFileObj)
		{
			JKKBatCommon.closeBusinessFileUtil(KKIFM894NttOroshiFileObj);
		}
		// ANK-4427-00-00 ADD END
		if (null != KKIFM895CaseFileObj)
		{
			JKKBatCommon.closeBusinessFileUtil(KKIFM895CaseFileObj);
		}
	}

	/**
	 * 出力ファイルCLOSE。
	 * 
	 * <br>
	 * @throws Exception 
	 */
	private void outputFileCloseCntFlg() throws Exception
	{
		if (null != KKIFM895CntFileObj)
		{
			JKKBatCommon.closeBusinessFileUtil(KKIFM895CntFileObj);
		}
		if (null != KKIFM895FlgFileObj)
		{
			JKKBatCommon.closeBusinessFileUtil(KKIFM895FlgFileObj);
		}
	}

	/**
	 * 電子ファイル管理登録処理とバックアップ、対応履歴ファイル移動。
	 * 
	 * <br>
	 * @throws Exception
	 */
	private void fileControl(String timeStamp) throws Exception
	{
		//■CASHPOST送信完了ハガキ発送用リストファイル
		if (0 < kkifm894OutputCnt)
		{
			// 電子ファイル管理・ダウンロードファイル管理に登録
			addEfileAndDlFileKanri(KKIFM894FilePath, KKIFM894FileName, TRN_KANRI_NO_KKIFM894, String.valueOf(kkifm894OutputCnt));
		}

		// ANK-4468-07-00 ADD START
		//■CASHPOST送信完了ハガキ発送用リストファイル（シンプルプラン）
		if (0 < kkifm894SimpleOutputCnt)
		{
			// 電子ファイル管理・ダウンロードファイル管理に登録
			addEfileAndDlFileKanri(KKIFM894SimpleFilePath, KKIFM894SimpleFileName, TRN_KANRI_NO_KKIFM894, String.valueOf(kkifm894SimpleOutputCnt));
		}
		// ANK-4468-07-00 ADD END
		
		//ANK-4427-00-00 START
		//■CASHPOST送信完了ハガキ発送用リストファイル（NTT卸）
		if (0 < kkifm894NttOroshiOutputCnt)
		{
			// 電子ファイル管理・ダウンロードファイル管理に登録
			addEfileAndDlFileKanri(KKIFM894NttOroshiFilePath, KKIFM894NttOroshiFileName, TRN_KANRI_NO_KKIFM894, String.valueOf(kkifm894NttOroshiOutputCnt));
		}
		// ANK-4427-00-00 ADD END

		//■入力対象となったファイルをバックアップに保存する
		if (!JKKStringUtil.isNullBlank(KKIFM893FilePath))
		{
			printInfoLog("[メイン処理]入力ファイル 移動元ファイル：" + KKIFM893FilePath + " 移動先フォルダ：" + freeItems[FREE_IDX_BACKUP]);
			File[] fromDir = new File[] { new File(KKIFM893FilePath) };
			File toDir = new File(freeItems[FREE_IDX_BACKUP]);
			JBSBatKKFileUtil.moveAndDeleteFile(fromDir, null, toDir);
		}

		//■対応履歴CASEファイルを移動し、CASE件数ファイル、CASEフラグを作成
		if (0 == kkifm895OutputCnt)
		{
			// 対応履歴レコードが０件の場合、作業ファイル削除。
			deleteTmpFile(KKIFM895FilePath1);
		}
		else if (0 < kkifm895OutputCnt)
		{
			printInfoLog("[メイン処理]対応履歴ファイル 移動元ファイル：" + KKIFM895FilePath1 + " 移動先フォルダ：" + freeItems[FREE_IDX_TAIORIREKI]);
			File[] fromDir = new File[] { new File(KKIFM895FilePath1) };
			File toDir = new File(freeItems[FREE_IDX_TAIORIREKI]);
			JBSBatKKFileUtil.moveAndDeleteFile(fromDir, null, toDir);
			createCaseFlgCnt(timeStamp, kkifm895OutputCnt);
		}

		// 電子ファイルテーブルに登録した「CASHPOST送信完了ハガキ発送用リストファイル」の作業ファイルを削除
		deleteTmpFile(KKIFM894FilePath);
		// ANK-4468-07-00 ADD START
		// 電子ファイルテーブルに登録した「CASHPOST送信完了ハガキ発送用リストファイル（シンプルプラン）」の作業ファイルを削除
		deleteTmpFile(KKIFM894SimpleFilePath);
		// ANK-4468-07-00 ADD END
		// ANK-4468-07-00 ADD START
		// 電子ファイルテーブルに登録した「CASHPOST送信完了ハガキ発送用リストファイル（NTT卸）」の作業ファイルを削除
		deleteTmpFile(KKIFM894NttOroshiFilePath);
		// ANK-4468-07-00 ADD END

	}

	/**
	 * CASHPOST送信完了ハガキ発送用リストを出力する。
	 * 
	 * <br>
	 * @param inputRecMap 入力ファイルレコード
	 * @param apiParamMap CASHPOST連携結果
	 * @throws Exception
	 */
	private void createKkifm894(JBSbatServiceInterfaceMap inputRecMap, HashMap<String, Object> apiParamMap) throws Exception
	{
		// ANK-4427-00-00 MOD START
		// ANK-4468-07-00 MOD START
//		if (0 == kkifm894OutputCnt)
//		if (0 == kkifm894OutputCnt && 0 == kkifm894SimpleOutputCnt)
		if (0 == kkifm894OutputCnt && 0 == kkifm894SimpleOutputCnt && 0 == kkifm894NttOroshiOutputCnt)
		// ANK-4468-07-00 MOD END
		// ANK-4427-00-00 MOD END
		{
			// ヘッダー部出力
			JKKBatCommon.printDoubleQuoteBusinessFileUtil(KKIFM894FileObj, KKIFM894_HEADER_INFO);
			
			// ANK-4468-07-00 ADD START
			// ヘッダー部出力（シンプルプラン）
			JKKBatCommon.printDoubleQuoteBusinessFileUtil(KKIFM894SimpleFileObj, KKIFM894_HEADER_INFO);
			// ANK-4468-07-00 ADD END
			
			// ANK-4427-00-00 ADD START
			// ヘッダー部出力（NTT卸プラン）
			JKKBatCommon.printDoubleQuoteBusinessFileUtil(KKIFM894NttOroshiFileObj, KKIFM894_HEADER_INFO);
			// ANK-4427-00-00 ADD END
		}

		String noList = String.valueOf(inputRecMap.get(JBSbatKKIFM893.CASHPOST_KEI_NO));
		String freeKmkList = String.valueOf(inputRecMap.get(JBSbatKKIFM893.FREE_KMK));
		freeKmkList = freeKmkList.replaceAll(STR_FREE_HEADER, STR_EMPTY);
		String[] allCashPostKeiNo = noList.split(STR_SEP_SLASH);
		String[] allFreeKmk = freeKmkList.split(STR_SEP_SLASH);

		ArrayList<String> outputInfo = new ArrayList<String>();

		outputInfo.add(String.valueOf(inputRecMap.get(JBSbatKKIFM893.CUST_PCD))); // 郵便番号
		outputInfo.add(String.valueOf(inputRecMap.get(JBSbatKKIFM893.CUST_ADR))); // 住所
		outputInfo.add(String.valueOf(inputRecMap.get(JBSbatKKIFM893.CUST_NM))); // 氏名

		// CP名称（CP名称＋(半角スペース)＋金額＋"円"）MAX5個（5個未満は空文字）
		int kmkCount = -1;
		for (String cashPostKeiNo : allCashPostKeiNo)
		{
			kmkCount++;
			if (!JKKStringUtil.isNullBlank(cashPostKeiNo))
			{
				outputInfo.add(allFreeKmk[kmkCount]);
			}
		}
		for (int idx = kmkCount + 1; idx < INT_KMK_MAX; idx++)
		{
			outputInfo.add(STR_EMPTY);
		}

		// ANK-3837-00-00 MOD START
		//outputInfo.add(String.valueOf(inputRecMap.get(JBSbatKKIFM893.SOHU_AMNT)) + STR_TANI_YEN); // 送金額

		// ANK-3907-00-00 MOD START
		//outputInfo.add(String.valueOf(inputRecMap.get(JBSbatKKIFM893.SOHU_AMNT))); // 送金額
		outputInfo.add(editAmnt(String.valueOf(inputRecMap.get(JBSbatKKIFM893.SOHU_AMNT)), false)); // 送金額
		// ANK-3907-00-00 MOD END

		//outputInfo.add(String.valueOf(apiParamMap.get(JBSbatKKIFE427.OUT_RECEIVENO))); // 受付番号
		String outReceiveno = String.valueOf(apiParamMap.get(JBSbatKKIFE427.OUT_RECEIVENO));
		outputInfo.add(outReceiveno.substring(0, 4) + STR_HALF_HYPHEN +  outReceiveno.substring(4)); // 受付番号
		// ANK-3837-00-00 MOD END

		outputInfo.add(String.valueOf(apiParamMap.get(API_UKE_END_DATE))); // 受取期限

		// ANK-4468-07-00 ADD START
		svcPcrsCd = "";
		svcPcrsCd = (String) inputRecMap.get(JBSbatKKIFM893.SVC_PCRS_CD); //料金コースコード
		if(!JKKStringUtil.isNullBlank(svcPcrsCd))
		{
			if(kkCashpostCsvPcrs.contains(svcPcrsCd))
			{
				JKKBatCommon.printDoubleQuoteBusinessFileUtil(KKIFM894SimpleFileObj, outputInfo);
				
				kkifm894SimpleOutputCnt++;
				
			// ANK-4427-00-00 ADD START
			} else if(kkCashpostCsvNttOroshiPcrs.contains(svcPcrsCd)) {
				
				JKKBatCommon.printDoubleQuoteBusinessFileUtil(KKIFM894NttOroshiFileObj, outputInfo);
				
				kkifm894NttOroshiOutputCnt++;
			}
			// ANK-4427-00-00 ADD END
			else
			{
		// ANK-4468-07-00 ADD END
				JKKBatCommon.printDoubleQuoteBusinessFileUtil(KKIFM894FileObj, outputInfo);
				
				kkifm894OutputCnt++;
		// ANK-4468-07-00 ADD START
			}
		}
		// ANK-4468-07-00 ADD END
	}

	/**
	 * CASEファイルを出力する。
	 * 
	 * <br>
	 * @param inputRecMap 入力ファイルレコード
	 * @param ukeEndFormat 受取期限(YYYY/MM/DD)
	 * @param opeDateFormat 運用日付(YYYY/MM/DD)
	 * @param renkeiSysDate 作成日時
	 * @param svcKeiNo サービス契約番号
	 * @param toiawaseRireki 問合せ履歴
	 * @throws Exception
	 */
	private void createKkifm895(String renkeiSysDate, String svcKeiNo, String toiawaseRireki) throws Exception
	{

		ArrayList<String> outputInfo = new ArrayList<String>();
		outputInfo.add(FILE_KNYSHA); //顧客タイプ
		outputInfo.add(svcKeiNo); //お客様ID
		outputInfo.add(STR_EMPTY); //顧客氏名
		outputInfo.add(STR_EMPTY); //顧客氏名（カナ）
		outputInfo.add(STR_EMPTY); //電話番号
		outputInfo.add(STR_EMPTY); //電話番号2
		outputInfo.add(STR_EMPTY); //郵便番号
		outputInfo.add(STR_EMPTY); //住所1
		outputInfo.add(STR_EMPTY); //住所2
		outputInfo.add(STR_EMPTY); //住所3
		outputInfo.add(STR_EMPTY); //性別
		outputInfo.add(STR_EMPTY); //生年月日
		outputInfo.add(FILE_CLOSE); //状態
		outputInfo.add(FILE_TRN); //ステータス
		outputInfo.add(renkeiSysDate); //作成日時
		outputInfo.add(OTHER_SYSTEM); //受付者
		outputInfo.add(OTHER_SYSTEM); //担当者
		outputInfo.add(STR_EMPTY); //キュー名
		outputInfo.add(FILE_TSYS); //受付種別
		outputInfo.add(FILE_TITLE); //タイトル
		outputInfo.add(STR_EMPTY); //カテゴリ１
		outputInfo.add(STR_EMPTY); //カテゴリ２
		outputInfo.add(STR_EMPTY); //カテゴリ３
		outputInfo.add(STR_EMPTY); //カテゴリ４
		outputInfo.add(STR_EMPTY); //カテゴリ５
		outputInfo.add(STR_EMPTY); //カテゴリ６
		outputInfo.add(STR_EMPTY); //カテゴリ７
		outputInfo.add(STR_EMPTY); //カテゴリ８
		outputInfo.add(STR_EMPTY); //カテゴリ９
		outputInfo.add(STR_EMPTY); //カテゴリ１０
		outputInfo.add(STR_EMPTY); //カテゴリ１１

		outputInfo.add(toiawaseRireki); //問合せ履歴
		outputInfo.add(STR_EMPTY); //問合せ客番号
		outputInfo.add(STR_EMPTY); //eoID
		outputInfo.add(STR_EMPTY); //受付番号
		outputInfo.add(STR_EMPTY); //コールバック日時
		outputInfo.add(STR_EMPTY); //コールバック時間指定タイプ

		outputInfo.add(STR_EMPTY); //業務個別設定組織コード
		outputInfo.add(STR_EMPTY); //反響可能性フラグ
		outputInfo.add(STR_EMPTY); //対応部署

		JKKBatCommon.printDoubleQuoteBusinessFileUtil(KKIFM895CaseFileObj, outputInfo);

		kkifm895OutputCnt++;

	}

	/**
	 * 問合せ履歴の編集を行う。
	 * 
	 * <br>
	 * @param inputRecMap 入力ファイルレコード
	 * @param apiParamMap CASHPOST連携結果
	 * @return
	 * @throws Exception
	 */
	private String getToiawaseRireki(JBSbatServiceInterfaceMap inputRecMap, HashMap<String, Object> apiParamMap) throws Exception
	{
		String svcKeiList = inputRecMap.getString(JBSbatKKIFM893.SVC_KEI_NO);
		String[] allSvcKeiNo = svcKeiList.split(STR_SEP_SLASH);
		String cmpList = inputRecMap.getString(JBSbatKKIFM893.FREE_KMK);
		cmpList = cmpList.replaceAll(STR_FREE_HEADER, STR_EMPTY);
		String[] allCmpKmk = cmpList.split(STR_SEP_SLASH);

		StringBuffer sb = new StringBuffer();

		sb.append("キャンペーン名称：");
		int kmkCount = -1;
		for (String svcKeiNo : allSvcKeiNo)
		{
			kmkCount++;
			if (JKKStringUtil.isNullBlank(svcKeiNo))
			{
				break;
			}
			if (0 < kmkCount)
			{
				sb.append(STR_SEP_CASE_SLASH);
			}
			sb.append(allCmpKmk[kmkCount]);
		}
		sb.append(JKKStrConst.KAIGYO_CD);
		sb.append("送金額：");

		// ANK-3907-00-00 MOD START
		//sb.append(String.valueOf(inputRecMap.get(JBSbatKKIFM893.SOHU_AMNT)));
		sb.append(editAmnt(String.valueOf(inputRecMap.get(JBSbatKKIFM893.SOHU_AMNT)), false));
		// ANK-3907-00-00 MOD END

		sb.append(STR_TANI_YEN);
		sb.append(JKKStrConst.KAIGYO_CD);
		sb.append("サイト管理番号：");
		sb.append((String)apiParamMap.get(JBSbatKKIFE427.OUT_ORDERNO));
		sb.append(JKKStrConst.KAIGYO_CD);
		if (!JKKStringUtil.isNullBlank(inputRecMap.getString(JBSbatKKIFM893.MLAD)))
		{
			sb.append("メール送信日：");
			sb.append((String)apiParamMap.get(API_MAIL_SEND_DATE));
			sb.append(JKKStrConst.KAIGYO_CD);
		}
		sb.append("受取期限：");
		sb.append((String)apiParamMap.get(API_UKE_END_DATE));

		if (!JKKStringUtil.isNullBlank(inputRecMap.getString(JBSbatKKIFM893.MLAD)))
		{
			sb.append(JKKStrConst.KAIGYO_CD);
			sb.append("送信先メールアドレス：");
			sb.append(inputRecMap.getString(JBSbatKKIFM893.MLAD));
		}
		return sb.toString();
	}

	/**
	 * CASE件数ファイル、CASEフラグを作成する。
	 * 
	 * <br>
	 * @param timeStamp タイムスタンプ
	 * @param recordCount レコード件数
	 * @throws Exception
	 */
	private void createCaseFlgCnt(String timeStamp, int recordCount) throws Exception
	{
		// ■CASE件数ファイル
		KKIFM895FilePath2 =
				getFullPathName(freeItems[FREE_IDX_TAIORIREKI], KKIFM895_CASE_CASE_PREFIX, timeStamp, KKIFM895_CASE_CNT_SUFFIX, KKIFM895_CASE_CNT_EXT);
		// ファイルオブジェクトを生成する
		KKIFM895CntFileObj = JKKBatCommon.createBusinessFileUtil(KKIFM895FilePath2, ENCODE_SHIFT_JIS, JKKStrConst.LINE_SEPARATOR, JKKStrConst.COMMA);
		// CASE件数ファイルへ出力する。
		JCCBatCommon.printBusinessFileUtil(KKIFM895CntFileObj, String.valueOf(recordCount));
		JKKBatCommon.closeBusinessFileUtil(KKIFM895CntFileObj);

		printInfoLog("[メイン処理]対応履歴ファイル 件数ファイル作成：" + KKIFM895FilePath2);

		// ■CASEフラグ
		KKIFM895FilePath3 =
				getFullPathName(freeItems[FREE_IDX_TAIORIREKI], KKIFM895_CASE_CASE_PREFIX, timeStamp, KKIFM895_CASE_FLG_SUFFIX, KKIFM895_CASE_FLG_EXT);
		// ファイルオブジェクトを生成する
		KKIFM895FlgFileObj = JKKBatCommon.createBusinessFileUtil(KKIFM895FilePath3, ENCODE_SHIFT_JIS, JKKStrConst.LINE_SEPARATOR, JKKStrConst.COMMA);
		JKKBatCommon.closeBusinessFileUtil(KKIFM895FlgFileObj);
		printInfoLog("[メイン処理]対応履歴ファイル フラグファイル作成：" + KKIFM895FilePath3);

	}

	/**
	 * CASHPOST連携結果エラーメッセージを編集。
	 * 
	 * <br>
	 * @param inputRecMap 入力ファイルレコード
	 * @param apiParamMap CASHPOST連携結果
	 * @param resultdet 結果コード詳細
	 * @return エラーメッセージ
	 * @throws Exception
	 */
	private String errorMsgEditWork(JBSbatServiceInterfaceMap inputRecMap, HashMap<String, Object> apiParamMap, String resultdet) throws Exception
	{
		String noList = inputRecMap.getString(JBSbatKKIFM893.SVC_KEI_NO);
		String[] allSvcKeiNo = noList.split(STR_SEP_SLASH);
		StringBuffer sb = new StringBuffer();

		//[結果コード詳細：%1%/お客さまID：%2%]
		sb.append("[結果コード詳細：");
		sb.append(resultdet);
		sb.append("/お客さまID：");

		int idx = 0;
		HashMap<String, String> outKeyMap = new HashMap<String, String>();
		for (String svcKeiNo : allSvcKeiNo)
		{
			if (JKKStringUtil.isNullBlank(svcKeiNo))
			{
				break;
			}
			if (outKeyMap.containsKey(svcKeiNo))
			{
				// 同一サービス契約番号は、除外する。
				continue;
			}
			outKeyMap.put(svcKeiNo, svcKeiNo);
			if (0 < idx)
			{
				sb = sb.append(JKKStrConst.COMMA);
			}

			sb.append(svcKeiNo);
			idx++;
		}
		sb.append("]");
		ErrorRecordCnt++;
		return sb.toString();
	}

	/**
	 * CASHPOST契約の登録、ハガキ、CASEファイル出力処理。
	 * 
	 * <br>
	 * @param inputRecMap 入力ファイルレコード
	 * @param apiParamMap CASHPOST連携結果
	 * @param opeDateFormat 運用日付(YYYY/MM/DD)
	 * @param renkeiSysDate 作成日時
	 * @throws Exception
	 */
	private void cashpostInsert(JBSbatServiceInterfaceMap inputRecMap, HashMap<String, Object> apiParamMap, String opeDateFormat, String renkeiSysDate)
			throws Exception
	{

		boolean isNormalEnd = true;
		String noList = inputRecMap.getString(JBSbatKKIFM893.CASHPOST_KEI_NO);
		String[] allCashPostKeiNo = noList.split(STR_SEP_SLASH);
		String svcKeiList = inputRecMap.getString(JBSbatKKIFM893.SVC_KEI_NO);
		String[] allSvcKeiNo = svcKeiList.split(STR_SEP_SLASH);
		String toiawaseRireki = getToiawaseRireki(inputRecMap, apiParamMap);
		HashMap<String, Object> caseWriteSvc = new HashMap<String, Object>();

		for (int idx = 0; idx < allCashPostKeiNo.length; idx++)
		{
			String cashPostKeiNo = allCashPostKeiNo[idx];
			if (JKKStringUtil.isNullBlank(cashPostKeiNo))
			{
				continue;
			}
			//■CASHPOST契約の更新
			executeKK_T_CASHPOST_KEI_KK_SELECT_003(new String[] { cashPostKeiNo });
			JBSbatCommonDBInterface cashPsotChshstInfo = db_KK_T_CASHPOST_KEI.selectNext();
			if (null == cashPsotChshstInfo)
			{
				// 『%1%テーブルに%2%が存在しません。（key：%3%）』（ありえない前提）
				// CASHPOST連携済のため、DBとファイルにアンマッチが発生。
				// ファイルは、書き込み出来る分を書き出す。
				printBusinessError(JPCBatchMessageConstant.EKKB0630NW, new String[] { "CASHPOST契約", "CASHPOST契約番号",
						cashPostKeiNo + " ※CASHPOST連携済のため、CASHPOST契約テーブル、CASEファイル、ハガキに差異が発生します。" });
				ErrorUpdateCnt++;
				isNormalEnd = false;
				continue;
			}

			String cashpost_kei_no = cashPsotChshstInfo.getString(JBSbatKK_T_CASHPOST_KEI.CASHPOST_KEI_NO); // CASHPOST契約番号
			String svc_kei_no = cashPsotChshstInfo.getString(JBSbatKK_T_CASHPOST_KEI.SVC_KEI_NO); // サービス契約番号
			String cashpost_cd = cashPsotChshstInfo.getString(JBSbatKK_T_CASHPOST_KEI.CASHPOST_CD); // CASHPOSTコード
			String sohu_amnt = cashPsotChshstInfo.getString(JBSbatKK_T_CASHPOST_KEI.SOHU_AMNT); // 送付金額
			String cashpost_rnki_ymd = this.opeDate; // CASHPOST連携年月日
			String mlad = inputRecMap.getString(JBSbatKKIFM893.MLAD); // メールアドレス
			String uketori_ninsho_key = inputRecMap.getString(JBSbatKKIFM893.UKETORI_NINSHO_KEY); // 受取認証キー
			String add_dtm = cashPsotChshstInfo.getString(JBSbatKK_T_CASHPOST_KEI.ADD_DTM); // 登録年月日時分秒
			String add_opeacnt = cashPsotChshstInfo.getString(JBSbatKK_T_CASHPOST_KEI.ADD_OPEACNT); // 登録オペレータアカウント
			String add_unyo_ymd = cashPsotChshstInfo.getString(JBSbatKK_T_CASHPOST_KEI.ADD_UNYO_YMD); // 登録運用年月日
			String add_trn_id = cashPsotChshstInfo.getString(JBSbatKK_T_CASHPOST_KEI.ADD_TRN_ID); // 登録処理ID
			String cashpost_uk_no = (String)apiParamMap.get(JBSbatKKIFE427.OUT_RECEIVENO); // 受付番号
			String cashpost_endtime = (String)apiParamMap.get(JBSbatKKIFE427.OUT_ENDTIME); // 応答日時
			// ANK-4193-00-00 ADD START
			String site_kanri_no = (String)apiParamMap.get(JBSbatKKIFE427.IN_ORDERNO); // サイト管理番号
			// ANK-4193-00-00 ADD END
			// ANK-4229-00-00 ADD START
			String cashpost_add_ymd = cashPsotChshstInfo.getString(JBSbatKK_T_CASHPOST_KEI.CASHPOST_ADD_YMD); // CASHPOST登録年月日
			String add_mail_send_flg = cashPsotChshstInfo.getString(JBSbatKK_T_CASHPOST_KEI.ADD_MAIL_SEND_FLG); // 登録メール送信フラグ
			String add_mail_saksei_ymd = cashPsotChshstInfo.getString(JBSbatKK_T_CASHPOST_KEI.ADD_MAIL_SAKSEI_YMD); // 登録メール作成年月日
			String rpsrc_cashpost_kei_no = cashPsotChshstInfo.getString(JBSbatKK_T_CASHPOST_KEI.RPSRC_CASHPOST_KEI_NO); // 付け替え元CASHPOST契約番号
			// ANK-4229-00-00 ADD END

			String[] paramata =
					new String[] { cashpost_kei_no, svc_kei_no, cashpost_cd, sohu_amnt, cashpost_rnki_ymd, mlad, uketori_ninsho_key, add_dtm,
					// ANK-4229-00-00 DEL START
//					// ANK-4193-00-00 MOD START
////							add_opeacnt, add_unyo_ymd, add_trn_id, cashpost_uk_no, cashpost_endtime };
//							add_opeacnt, add_unyo_ymd, add_trn_id, cashpost_uk_no, cashpost_endtime, site_kanri_no};
//					// ANK-4193-00-00 MOD END
					// ANK-4229-00-00 DEL END
					// ANK-4229-00-00 ADD START
						add_opeacnt, add_unyo_ymd, add_trn_id, cashpost_uk_no, cashpost_endtime, site_kanri_no,
						cashpost_add_ymd, add_mail_send_flg, add_mail_saksei_ymd, rpsrc_cashpost_kei_no};
					// ANK-4229-00-00 ADD END
			executeKK_T_CASHPOST_KEI_KK_INSERT_002(paramata);

			//■ CASEファイルを出力する。（サービス契約番号単位）
			if (!caseWriteSvc.containsKey(allSvcKeiNo[idx]))
			{
				createKkifm895(renkeiSysDate, allSvcKeiNo[idx], toiawaseRireki);
				caseWriteSvc.put(allSvcKeiNo[idx], allSvcKeiNo[idx]);
			}
		}

		//■ CASHPOST送信完了ハガキ発送用リストを出力する
		if (isNormalEnd)
		{
			createKkifm894(inputRecMap, apiParamMap);
		}
	}

	/**
	 * 電子ファイル管理、ダウンロードファイル管理にファイルを登録する。
	 * 
	 * <br>
	 * @param tmpFilePath 作業ファイルパス
	 * @param fileName ファイル名
	 * @param trnKanriNo 処理管理番号
	 * @param recordCount レコード件数
	 * @throws Exception
	 */
	private void addEfileAndDlFileKanri(String tmpFilePath, String fileName, String trnKanriNo, String recordCount) throws Exception
	{
		// ■電子ファイル管理登録処理
		JBSbatCommonItem arg0 = commonItem; // 業務共通電文
		String arg1 = FILE_CD; // ファイルコード
		String arg2 = tmpFilePath; // ファイルパス
		String arg3 = JBSbatDateUtil.adjustMonth(super.opeDate, 1); // ファイル削除年月日（運用日付 + 1ヶ月）
		String[] rc = JCCBatCommon.createDenshiFile(arg0, arg1, arg2, arg3);

		// ログ出力
		super.logPrint.printDebugLog("電子ファイル管理番号(" + rc[0] + ")、世代登録年月日時分秒(" + rc[1] + ")");

		// ■ダウンロードファイル管理登録処理
		String[] insertSetParam2 = new String[5];
		insertSetParam2[0] = trnKanriNo; // 処理管理番号
		insertSetParam2[1] = fileName; // ファイル名
		insertSetParam2[2] = recordCount; // データ件数
		insertSetParam2[3] = rc[0]; // 電子ファイル管理番号
		insertSetParam2[4] = rc[1]; // 世代登録年月日時分秒
		executeZM_T_DL_FILE_KANRI_KK_INSERT_002(insertSetParam2);
	}

	/**
	 * CASHPOST契約 SQLKEY(KK_SELECT_003)でDBアクセスを行います。<br>
	 * <p>
	 * <b>処理フロー</b><br>
	 * <pre>
	 * 1.引数でバイント変数を設定します。<br>
	 *
	 * 2.DBアクセスを実行します。<br>
	 * 
	 * 3.メソッドの呼び出し方です。<br>
	 *		引数:
	 *		param:順にバイント変数の値をparam配列に入れます。バイント変数は以下に説明します。
	 *		 	CASHPOST契約番号
	 * </pre>
	 * <p>
	 * @param param バイント変数の値配列。
	 * @throws Exception 業務サービス内で発生した例外全般。
	 */
	private void executeKK_T_CASHPOST_KEI_KK_SELECT_003(Object[] setParam) throws Exception
	{
		// バイント変数のリストを生成します
		JBSbatCommonDBInterface paramList = new JBSbatCommonDBInterface();

		for (int i = 0; i < setParam.length; i++)
		{
			paramList.setValue(setParam[i]);
		}

		// DBアクセスを実行します
		db_KK_T_CASHPOST_KEI.selectBySqlDefine(paramList, KK_T_CASHPOST_KK_SELECT_003);
	}

	/**
	 * CASHPOST契約 SQLKEY(KK_INSERT_002)で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_CASHPOST_KEI_KK_INSERT_002(Object[] setParam) throws Exception
	{
		// バイント変数のリストを生成します
		JBSbatCommonDBInterface paramList = new JBSbatCommonDBInterface();

		for (int i = 0; i < setParam.length; i++)
		{
			paramList.setValue(setParam[i]);
		}

		// DBアクセスを実行します
		db_KK_T_CASHPOST_KEI.executeBySqlDefine(paramList, KK_T_CASHPOST_KEI_KK_INSERT_002);
	}

	/**
	 * ダウンロードファイル管理 SQLKEY(KK_INSERT_002)で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_002(Object[] setParam) throws Exception
	{
		// バイント変数のリストを生成します
		JBSbatCommonDBInterface paramList = new JBSbatCommonDBInterface();

		for (int i = 0; i < setParam.length; i++)
		{
			paramList.setValue(setParam[i]);
		}

		// DBアクセスを実行します
		db_ZM_T_DL_FILE_KANRI.executeBySqlDefine(paramList, ZM_T_DL_FILE_KANRI_KK_INSERT_002);
	}

	/**
	 * ファイル削除。
	 * 
	 * <br>
	 * @param tmpFilePath 削除するファイルのフルパス
	 */
	private void deleteTmpFile(String tmpFilePath)
	{
		if (!JKKStringUtil.isNullBlank(tmpFilePath))
		{
			File tmpFile = new File(tmpFilePath);
			if (tmpFile != null && tmpFile.exists())
			{
				tmpFile.delete();
			}
		}
	}

	/**
	 * 警告メッセージ出力。
	 * 
	 * <br>
	 * @param msgId メッセージID
	 * @param chngMsgStr メッセージ置換文字列
	 */
	private void printBusinessError(String msgId, String[] chngMsgStr)
	{
		if (chngMsgStr == null)
		{
			super.logPrint.printBusinessErrorLog(msgId);
		}
		else
		{
			super.logPrint.printBusinessErrorLog(msgId, chngMsgStr);
		}
	}

	/**
	 * 情報メッセージ出力
	 * 
	 * <br>
	 * @param msg メッセージ
	 */
	private void printInfoLog(String msg)
	{
		super.logPrint.printBusinessErrorLog(JPCBatchMessageConstant.EKKB1200AI, new String[] { msg });
	}

	// ANK-3907-00-00 ADD START
	/**
	 * 金額を編集します。
	 * <br>
	 * @param amnt 金額
	 * @param zenkaku 全角変換フラグ
	 * @return 編集結果
	 */
	private String editAmnt(String amnt, boolean zenkaku)
	{
		String result = amnt;

		try
		{
			long val = Long.parseLong(amnt);

			// 3桁区切り
			NumberFormat nf = NumberFormat.getNumberInstance();
			result = nf.format(val);

			if (zenkaku)
			{
				// 全角変換

				// 半角 → 全角
				StringBuilder sb = new StringBuilder(result);
				for (int i = 0; i < result.length(); i++)
				{
					char c = result.charAt(i);

					// 変換対象：0〜9、半角カンマ
					if ((0x30 <= c && c <= 0x39) || c == 0x2C)
					{
						sb.setCharAt(i, (char)(c + 0xFEE0));
					}
				}

				// 変換後の値を設定
				result = sb.toString();
			}
		}
		catch (Exception e)
		{
			// 変換時にエラーの場合は変換しない
			result = amnt;
		}

		return result;
	}
	// ANK-3907-00-00 ADD END

}
