/*********************************************************************
*  All Rights reserved,Copyright (c) K-Opticom
**********************************************************************
*＜プログラム内容＞
*	システム名			：eo顧客基幹システム
*	モジュール名		：JBSbatKKIntrCdIkaAdd
*	ソースファイル名	：JBSbatKKIntrCdIkaAdd.java
*	作成者				：富士通　
*	作成日				：2019年02月18日
*＜機能概要＞
*　紹介コード一括登録部品です。
*＜修正履歴＞
*	バージョン	修正日		修正者		修正内容
*	v41.00.00	2019/02/18	FJ)星野		【ANK-3548-00-00】紹介コードの事前発番対応  新規作成
*	v48.00.00	2020/02/04	FJ)後藤		【OM-2019-0001431】中間CSVの競合エラー対応
*********************************************************************/
package eo.business.service;

import java.io.File;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import eo.business.common.JBSbatBusinessService;
import eo.business.common.JCCBatCommon;
import eo.business.common.JCCbatShoriIraiUtil;
import eo.business.common.JKKBatCommon;
import eo.business.common.JKKBatConst;
import eo.business.util.file.JBSbatKKIFM875;
import eo.business.util.table.JBSbatCC_T_DLYD_TRN_REQ;
import eo.business.util.table.JBSbatCK_T_CUST;
import eo.business.util.table.JBSbatKK_T_INTR;
import eo.business.util.table.JBSbatKK_T_SVC_KEI;
import eo.business.util.table.JBSbatKK_T_SVKEI_KAISEN_UW;
import eo.business.util.table.JBSbatZM_M_WORK_PARAM_KNRI;
import eo.common.constant.JKKStrConst;
import eo.common.util.JKKStringUtil;
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.JBSbatCheckUtil;
import eo.framework.util.JBSbatDateUtil;
import eo.framework.util.JBSbatOracleSeqUtil;
import eo.framework.util.JBSbatStringUtil;

/**
* (クラスの機能概要) <p>
*<BR>
* @author 富士通
*/
public class JBSbatKKIntrCdIkaAdd extends JBSbatBusinessService
{
	/**▼▼▼▼▼▼ツールから生成した宣言です 開始▼▼▼▼▼▼*/
	/** テーブル(紹介)*/
	private static final String D_TBL_NAME_KK_T_INTR = "KK_T_INTR";
	
	/** テーブル(お客様)*/
	private static final String D_TBL_NAME_CK_T_CUST = "CK_T_CUST";
	
	/** テーブル(サービス契約)*/
	private static final String D_TBL_NAME_KK_T_SVC_KEI = "KK_T_SVC_KEI";
	
	/** テーブル(回線対象サービス契約)*/
	private static final String D_TBL_NAME_KK_T_KAISEN_TG_SVKEI = "KK_T_KAISEN_TG_SVKEI";
	
	/** テーブル(サービス契約回線内訳)*/
	private static final String D_TBL_NAME_KK_T_SVKEI_KAISEN_UW = "KK_T_SVKEI_KAISEN_UW";
	
	/** テーブル(業務パラメータ管理)*/
	private static final String D_TBL_NAME_ZM_M_WORK_PARAM_KNRI = "ZM_M_WORK_PARAM_KNRI";
	
	/** テーブル(ダウンロードファイル管理)*/
	private static final String D_TBL_NAME_ZM_T_DL_FILE_KANRI = "ZM_T_DL_FILE_KANRI";
	
	/** テーブル(データ一括登録管理)*/
	private static final String D_TBL_NAME_ZM_T_DATAIKTTRK_KNRI = "ZM_T_DATAIKTTRK_KNRI";

	/** SQL定義キー(KK_SELECT_020)*/
	private static final String CK_T_CUST_KK_SELECT_020 = "KK_SELECT_020";
	/** SQL定義キー(KK_SELECT_373)*/
	private static final String KK_T_SVC_KEI_KK_SELECT_373 = "KK_SELECT_373";
	/** SQL定義キー(KK_SELECT_001)*/
	private static final String KK_T_SVKEI_KAISEN_UW_KK_SELECT_001 = "KK_SELECT_001";
	/** SQL定義キー(KK_SELECT_002)*/
	private static final String ZM_M_WORK_PARAM_KNRI_KK_SELECT_002 = "KK_SELECT_002";
	/** SQL定義キー(KK_SELECT_373)*/
	private static final String ZM_T_DL_FILE_KANRI_KK_INSERT_002 = "KK_INSERT_002";
	
	/** テーブルアクセスクラス(紹介)*/
	private JBSbatSQLAccess db_KK_T_INTR = null;
	
	/** テーブルアクセスクラス(お客様)*/
	private JBSbatSQLAccess db_CK_T_CUST = null;
	
	/** テーブルアクセスクラス(サービス契約)*/
	private JBSbatSQLAccess db_KK_T_SVC_KEI = null;
	
	/** テーブルアクセスクラス(回線対象サービス契約)*/
	private JBSbatSQLAccess db_KK_T_KAISEN_TG_SVKEI = null;
	
	/** テーブルアクセスクラス(サービス契約回線内訳)*/
	private JBSbatSQLAccess db_KK_T_SVKEI_KAISEN_UW = null;
	
	/** テーブルアクセスクラス(業務パラメータ管理)*/
	private JBSbatSQLAccess db_ZM_M_WORK_PARAM_KNRI = null;
	
	/** テーブルアクセスクラス(ダウンロードファイル管理)*/
	private JBSbatSQLAccess db_ZM_T_DL_FILE_KANRI = null;
	
	/** テーブルアクセスクラス(ディレイド処理依頼)*/
	private JBSbatSQLAccess db_ZM_T_DATAIKTTRK_KNRI = null;

	/**▲▲▲▲▲▲ツールから生成した宣言です 終了▲▲▲▲▲▲*/
	
	/** ファイルエンコード(SJIS) */
	private static final String ENCODE_SHIFT_JIS = "Shift-JIS";
	
	/** シーケンス定義名(照会コード：SEQ_INTR_CD)*/
	private static final String SEQ_INTR_CD = "SEQ_INTR_CD";

	/** 照会コード接頭子 */
	private static final String INTR_CD_PREFIX = "Z";

	/**紹介コード一括登録有効期限年月日  外部定義キー */
	private static final String INTR_CD_YK_KIGEN = "KK_INTR_CD_YK_PRD";
	
	private static enum ErrCdEnum{
		/** E020_ＳＹＳＩＤ未設定 */
		E020("ＳＹＳＩＤ未設定")
		/** E030_ＳＹＳＩＤ文字種不正 */
		,E030("ＳＹＳＩＤ文字種不正")
		/** E040_ＳＹＳＩＤ桁数不正 */
		,E040("ＳＹＳＩＤ桁数不正")
		/** E050_お客様ＩＤ未設定 */
		,E050("お客様ＩＤ未設定")
		/** E060_お客様ＩＤ文字種不正 */
		,E060("お客様ＩＤ文字種不正")
		/** E070_お客様ＩＤ桁数不正 */
		,E070("お客様ＩＤ桁数不正")
		/** E080_有効期限文字種不正 */
		,E080("有効期限文字種不正")
		/** E090_有効期限桁数不正 */
		,E090("有効期限桁数不正")
		/** E100_存在しないＳＹＳＩＤです。 */
		,E100("存在しないＳＹＳＩＤです。")
		/** E110_既に退会しています。 */
		,E110("既に退会しています。")
		/** E120_ＳＹＳＩＤとお客様ＩＤが一致しません。 */
		,E120("ＳＹＳＩＤとお客様ＩＤが一致しません。")
		/** E998_照会コードが重複しました。 */
		,E998("照会コードが重複しました。")
		/** E999_フォーマットエラー */
		,E999("フォーマットエラー")
		;
		
		final String message;
		
		private ErrCdEnum(String message){
			this.message = message;
		}
	}

	/** 紹介コード一括登録リスト定義ファイル名 */
	private static final String KKIFM875_DEF = "KKIFM875.def";
	
	// OM-2019-0001431 MOD START
//	/** 紹介コード一括登録結果リストファイル名 */
//	private static final String KKIFM876_NAME = "KKIFM876.csv";
	
	/** 紹介コード一括登録結果リストファイル名 */
	private static final String KKIFM876_NAME = "KKIFM876_yyyyMMddHHmmssSSS.csv";
	
//	/** 紹介コード一括登録エラーリストファイル名 */
//	private static final String KKIFM877_NAME = "KKIFM877.csv";
	// OM-2019-0001431 MOD END
	
	/** 紹介コード一括登録エラーリストファイル名 */
	private static final String KKIFM877_NAME = "KKIFM877_yyyyMMddHHmmssSSS.csv";
	
	/** 入力ファイル定義 */
	private static final String PARAM_IND = "IND";
	
	/** ファイルコード */
	private static final String FILE_CD = "0000";
	
	/** 処理管理番号（紹介コード一括登録結果リスト） */
	private static final String TRN_KANRI_NO_KKIFM876 = "000000000206";
	
	/** 処理管理番号（紹介コード一括登録エラーリスト） */
	private static final String TRN_KANRI_NO_KKIFM877 = "000000000207";
	
	/** ファイル名編集用（紹介コード一括登録結果リスト） */
	private static final String FILE_NAME_TEMPLATE_KKIFM876 = "紹介コード一括登録結果リスト_yyyyMMddHHmmssSSS.csv";
	
	/** ファイル名編集用（紹介コード一括登録エラーリスト） */
	private static final String FILE_NAME_TEMPLATE_KKIFM877 = "紹介コード一括登録エラーリスト_yyyyMMddHHmmssSSS.csv";
	
	/** ファイル名で利用するタイムスタンプのフォーマット */
	private static final String FILE_TIMESTAMP_FORMAT = "yyyyMMddHHmmssSSS";
	
	
	/** 紹介コード一括登録結果リストファイルオブジェクト */
	private JBSbatBusinessFileUtil kkifm876FileObj = null;
	
	/** 紹介コード一括登録結果リストファイルレコード件数 */
	private int kkifm876RecordCnt = 0;
	
	/** 紹介コード一括登録エラーリストファイルオブジェクト */
	private JBSbatBusinessFileUtil kkifm877FileObj = null;
	
	/** 紹介コード一括登録エラーリストファイルレコード件数 */
	private int kkifm877RecordCnt = 0;

	/** 有効期限加算日数 */
	private int ykKigenNDate = 0;
	
	/**
	 * 初期処理
	 * @param JBSbatCommonItem commonItem　バッチ共通パラメータ電文
	 * @throws Exception
	 */
	public void initial(JBSbatCommonItem commonItem) throws Exception
	{
	/**▼▼▼▼▼▼業務サービスの初期処理を記述してください。▼▼▼▼▼▼*/
		/**▼▼▼▼▼▼ツールから生成した初期化のソースです 開始▼▼▼▼▼▼*/
		// 共通パラメータを設定します
		super.setCommonInfo(commonItem);

		// DBアクセスクラスを生成します
		db_KK_T_INTR = new JBSbatSQLAccess(commonItem, D_TBL_NAME_KK_T_INTR);
		db_CK_T_CUST = new JBSbatSQLAccess(commonItem, D_TBL_NAME_CK_T_CUST);
		db_KK_T_SVC_KEI = new JBSbatSQLAccess(commonItem, D_TBL_NAME_KK_T_SVC_KEI);
		db_KK_T_KAISEN_TG_SVKEI = new JBSbatSQLAccess(commonItem, D_TBL_NAME_KK_T_KAISEN_TG_SVKEI);
		db_KK_T_SVKEI_KAISEN_UW = new JBSbatSQLAccess(commonItem, D_TBL_NAME_KK_T_SVKEI_KAISEN_UW);
		db_ZM_M_WORK_PARAM_KNRI = new JBSbatSQLAccess(commonItem, D_TBL_NAME_ZM_M_WORK_PARAM_KNRI);
		db_ZM_T_DL_FILE_KANRI = new JBSbatSQLAccess(commonItem, D_TBL_NAME_ZM_T_DL_FILE_KANRI);
		db_ZM_T_DATAIKTTRK_KNRI = new JBSbatSQLAccess(commonItem, D_TBL_NAME_ZM_T_DATAIKTTRK_KNRI);
		
		executeZM_M_WORK_PARAM_KNRI_KK_SELECT_002(new String[] {INTR_CD_YK_KIGEN, super.opeDate, super.opeDate});
		JBSbatCommonDBInterface workParamMap1 = db_ZM_M_WORK_PARAM_KNRI.selectNext();
		if(workParamMap1!=null){
			try {
				ykKigenNDate = Integer.parseInt(workParamMap1.getString(JBSbatZM_M_WORK_PARAM_KNRI.WORK_PARAM_SETTE_VALUE));
			} catch (NumberFormatException e) {
				// 数値変換に失敗したら加算日数を0とする
				ykKigenNDate = 0;
			}
		}

		/**▲▲▲▲▲▲ツールから生成した初期化のソースです 終了▲▲▲▲▲▲*/
	/**▲▲▲▲▲▲業務サービスの初期処理を記述してください。▲▲▲▲▲▲*/
	}

	/**
	 * 主処理
	 * @return JBSbatOutputItem　出力情報
	 * @throws Exception
	 */
	public JBSbatOutputItem execute() throws Exception
	{
	/**▼▼▼▼▼▼業務サービスの主処理を記述してください。▼▼▼▼▼▼*/
		// ディレイド処理依頼情報リストを取得する
		List<HashMap<String, Object>> shoriIraiList = JCCbatShoriIraiUtil.getShoriIraiInfo(commonItem, this.jobid);
		
		// ディレイド処理依頼情報リストが取得できない場合、処理を終了する
		if (null == shoriIraiList)
		{
			return null;
		}
		
		// フリー項目を取得する
		String[] freeItems = freeItem.split(JKKBatConst.S_PARAM_DELIM);
		
		// OM-2019-0001431 MOD START
		// 紹介コード一括登録結果リストファイルパス
//		String kkifm876FilePath = freeItems[0] + KKIFM876_NAME;
		String kkifm876FilePath = freeItems[0] + KKIFM876_NAME.replaceAll(FILE_TIMESTAMP_FORMAT, JCCBatCommon.getSysDateTime());
		// 紹介コード一括登録エラーリストファイルパス
//		String kkifm877FilePath = freeItems[0] + KKIFM877_NAME;
		String kkifm877FilePath = freeItems[0] + KKIFM877_NAME.replaceAll(FILE_TIMESTAMP_FORMAT, JCCBatCommon.getSysDateTime());
		// OM-2019-0001431 MOD END
		
		// 紹介コード一括登録リスト定義ファイル名を取得する
		String kkifm875DefName = JBSbatAplConst.getAplConstValue(PARAM_IND) + KKIFM875_DEF;
		
		// ディレイド処理依頼情報リストの件数分繰り返す
		for (HashMap<String, Object> shoriIrai : shoriIraiList)
		{
			try {
				// チェックエラーフラグ
				boolean checkErrFlg = false;
				
				// 電子ファイル管理から紹介コード一括登録リストを取得する
				JBSbatInputFileUtil kkifm875FileUtil = 
					new JBSbatInputFileUtil( JCCBatCommon.searchDenshiFile(commonItem, (String)shoriIrai.get(JBSbatCC_T_DLYD_TRN_REQ.INPUT_EFILE_KANRI_NO)) );
				
				// 紹介コード一括登録リスト定義ファイルオブジェクトを生成する
				JBSbatDefFileUtil kkifm875FileDef = new JBSbatDefFileUtil(kkifm875DefName, kkifm875FileUtil);
				
				// 紹介コード一括登録結果リストファイルオブジェクトを生成する
				kkifm876FileObj = JKKBatCommon.createBusinessFileUtil(kkifm876FilePath,
						ENCODE_SHIFT_JIS, JKKStrConst.LINE_SEPARATOR, JKKStrConst.COMMA);
				// 紹介コード一括登録エラーリストファイルオブジェクトを生成する
				kkifm877FileObj = JKKBatCommon.createBusinessFileUtil(kkifm877FilePath,
						ENCODE_SHIFT_JIS, JKKStrConst.LINE_SEPARATOR, JKKStrConst.COMMA);
				
				// 紹介コード一括登録リストファイルレコード件数
				int kkifm875RecordCnt = 0;
				
				// 紹介コード一括登録結果リストファイルレコード件数
				kkifm876RecordCnt = 0;
				// 紹介コード一括登録エラーリストファイルレコード件数
				kkifm877RecordCnt = 0;
				
				// Readerオブジェクトを生成する
				kkifm875FileUtil.createReader();
				
				// 紹介コード一括登録リストファイルの件数分繰り返す
				while (kkifm875FileUtil.ready())
				{
					// ファイルから１レコードを取得する
					String line = kkifm875FileUtil.readLine();
					
					// 紹介コード一括登録リストファイルレコード件数カウント
					kkifm875RecordCnt++;
					
					// 空行の場合
					if (!JKKBatCommon.isNotNull(line))
					{
						// フォーマットエラー
						createKkifm877(null, ErrCdEnum.E999, " "+kkifm875RecordCnt+"行目");
						checkErrFlg = true;
						continue;
					}
					
					// １レコードの情報をマップに格納する
					JBSbatServiceInterfaceMap recordMap = kkifm875FileDef.lineToObject(line, kkifm875FileUtil, kkifm875RecordCnt);
					if (recordMap.isInputErrorFlg())
					{
						// フォーマットエラー
						createKkifm877(null, ErrCdEnum.E999, " "+kkifm875RecordCnt+"行目");
						checkErrFlg = true;
						continue;
					}
					
					// 入力ファイルチェック
					ErrCdEnum result = checkMain(recordMap);
					if(result != null){
						// チェックエラー
						createKkifm877(recordMap, result);
						checkErrFlg = true;
						continue;
					}
					
					// 紹介コードの採番 英字１桁"Z"（固定）＋残り９桁は数字
					String intrCd = INTR_CD_PREFIX + JBSbatStringUtil.padNumFormString( JBSbatOracleSeqUtil.getNextSeq(commonItem.getConnection(), SEQ_INTR_CD), 9);

					// 紹介テーブルをPK検索して重複チェック
					String[] selectWhereParam = new String[1];
					selectWhereParam[0] = intrCd;			// 紹介コード
					JBSbatCommonDBInterface duprecatedMap = executeKK_T_INTR_PKSELECT(selectWhereParam);
					if (null != duprecatedMap)
					{
						// 重複時はエラー（本来起こらないはず）
						createKkifm877(recordMap, ErrCdEnum.E998, "照会コード：" + intrCd);
						checkErrFlg = true;
						continue;
					}
					
					// 紹介登録
					insertIntr(recordMap, intrCd);
					
					// 紹介コード一括登録結果リストを出力する
					createKkifm876(intrCd, recordMap);
				}
				
				// 紹介コード一括登録結果リストを閉じる
				JKKBatCommon.closeBusinessFileUtil(kkifm876FileObj);
				// 紹介コード一括登録エラーリストを閉じる
				JKKBatCommon.closeBusinessFileUtil(kkifm877FileObj);
				
				// 電子ファイル管理・ダウンロードファイル管理に登録
				addEfileAndDlFileKanri(kkifm876FilePath, FILE_NAME_TEMPLATE_KKIFM876, TRN_KANRI_NO_KKIFM876, String.valueOf(kkifm876RecordCnt));
				addEfileAndDlFileKanri(kkifm877FilePath, FILE_NAME_TEMPLATE_KKIFM877, TRN_KANRI_NO_KKIFM877, String.valueOf(kkifm877RecordCnt));
				// 一時ファイルの削除
				deleteTmpFile(kkifm876FilePath);
				deleteTmpFile(kkifm877FilePath);
				
				// ディレイド処理依頼の更新
				updateDelaydTrnReq(shoriIrai, checkErrFlg);
				
				// ディレイド処理依頼1件を処理する毎にコミット
				commit();
			} catch (Exception e) {
				// 想定外のエラー発生時は、ロールバック後にディレイド処理依頼だけをエラー更新してコミット。
				
				commonItem.getConnection().rollback();
				JCCBatCommon.updateShoriIraiResult(commonItem, (String)shoriIrai.get(JBSbatCC_T_DLYD_TRN_REQ.DLYD_TRN_REQ_NO), JKKStrConst.DLYD_TRN_RSLT_CD_SYS_ERR, null);
				commit();
				
				// エラー通知は必要なので例外はそのまま投げる
				throw e;
			}
		}
		return null;
	/**▲▲▲▲▲▲業務サービスの主処理を記述してください。▲▲▲▲▲▲*/
	}

	private void insertIntr(JBSbatServiceInterfaceMap recordMap, String intrCd) throws Exception {
		
		// SYSID
		String sysid = recordMap.getString(JBSbatKKIFM875.SYSID);
		// サービス契約番号
		String svcKeiNo = recordMap.getString(JBSbatKKIFM875.SVC_KEI_NO);
		// 有効期限年月日
		String ykKigenYmd = recordMap.getString(JBSbatKKIFM875.YK_KIGEN_YMD);
		if(JKKStringUtil.isNullBlank(ykKigenYmd))
		{
			// 未入力時は運用日＋外部定義されている日数
			ykKigenYmd = JBSbatDateUtil.adjustDate(super.opeDate, ykKigenNDate);
			// 結果リストに出力するため、recordMapにも反映する
			recordMap.setString(JBSbatKKIFM875.YK_KIGEN_YMD, ykKigenYmd);
		}

		// お客さまをカレント取得
		executeCK_T_CUST_KK_SELECT_020(new String[]{sysid, super.opeDate});
		JBSbatCommonDBInterface custInfo = db_CK_T_CUST.selectNext();
		if (null == custInfo)
		{
			custInfo = new JBSbatCommonDBInterface();
		}
		
		// 利用場所住所を取得
		executeKK_T_SVKEI_KAISEN_UW_KK_SELECT_001(new String[] {svcKeiNo,super.opeDate,super.opeDate});
		JBSbatCommonDBInterface kaisenMap = db_KK_T_SVKEI_KAISEN_UW.selectNext();
		if(null == kaisenMap)
		{
			kaisenMap = new JBSbatCommonDBInterface();
		}

		// 紹介テーブルの登録を行う
		JBSbatCommonDBInterface setMap = new JBSbatCommonDBInterface();
		setMap.setValue(JBSbatKK_T_INTR.INTR_CD, 					intrCd);																	// 紹介コード
		setMap.setValue(JBSbatKK_T_INTR.SYSID, 						sysid);																		// SYSID
		setMap.setValue(JBSbatKK_T_INTR.SHOKAISHA_NM, 				custInfo.getString(JBSbatCK_T_CUST.CUST_NM));								// 紹介者名
		setMap.setValue(JBSbatKK_T_INTR.SVC_KEI_NO, 				svcKeiNo);																	// サービス契約番号
		setMap.setValue(JBSbatKK_T_INTR.SHOKAISHA_PCD, 				kaisenMap.getString(JBSbatKK_T_SVKEI_KAISEN_UW.KAISEN_PLACE_PCD));			// 紹介者郵便番号
		setMap.setValue(JBSbatKK_T_INTR.SHOKAISHA_AD_STATE_NM, 		kaisenMap.getString(JBSbatKK_T_SVKEI_KAISEN_UW.KAISEN_PLACE_STATE_NM));		// 紹介者住所都道府県名
		setMap.setValue(JBSbatKK_T_INTR.SHOKAISHA_AD_CITY_NM, 		kaisenMap.getString(JBSbatKK_T_SVKEI_KAISEN_UW.KAISEN_PLACE_CITY_NM));		// 紹介者住所市区町村名
		setMap.setValue(JBSbatKK_T_INTR.SHOKAISHA_AD_OAZTSU_NM, 	kaisenMap.getString(JBSbatKK_T_SVKEI_KAISEN_UW.KAISEN_PLACE_OAZTSU_NM));	// 紹介者住所大字通称名
		setMap.setValue(JBSbatKK_T_INTR.SHOKAISHA_AD_AZCHO_NM, 		kaisenMap.getString(JBSbatKK_T_SVKEI_KAISEN_UW.KAISEN_PLACE_AZCHO_NM));		// 紹介者住所字丁目名
		setMap.setValue(JBSbatKK_T_INTR.SHOKAISHA_AD_BNCHIGO, 		kaisenMap.getString(JBSbatKK_T_SVKEI_KAISEN_UW.KAISEN_PLACE_BNCHIGO));		// 紹介者住所番地号
		setMap.setValue(JBSbatKK_T_INTR.SHOKAISHA_ADRTTM, 			kaisenMap.getString(JBSbatKK_T_SVKEI_KAISEN_UW.KAISEN_PLACE_ADRTTM));		// 紹介者住所補記・建物名
		setMap.setValue(JBSbatKK_T_INTR.SHOKAISHA_ADRRM,			 kaisenMap.getString(JBSbatKK_T_SVKEI_KAISEN_UW.KAISEN_PLACE_ADRRM));		// 紹介者住所補記・部屋番号
		// 以下はフレームワークで自動設定
		// 登録年月日時分秒 登録オペレータアカウント 更新年月日時分秒 更新オペレータアカウント 無効フラグ
		// 登録運用年月日 登録処理ID 更新運用年月日 更新処理ID
		
		setMap.setValue(JBSbatKK_T_INTR.YK_KIGEN_YMD, ykKigenYmd);	// 有効期限
		
		db_KK_T_INTR.insertByPrimaryKeys(setMap);
	}

	private void addEfileAndDlFileKanri(String tmpFilePath,
			String fileNameTemplate, 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 fileName = fileNameTemplate .replaceAll(FILE_TIMESTAMP_FORMAT, JCCBatCommon.getSysDateTime());
		
		// ダウンロードファイル管理登録処理
		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);
	}

	private void deleteTmpFile(String tmpFilePath) {
		File tmpFile = new File(tmpFilePath);
		if (tmpFile.exists())
		{
			tmpFile.delete();
		}
	}
	
	private void updateDelaydTrnReq(HashMap<String, Object> shoriIrai,
			boolean checkErrFlg) {
		// ディレイド処理依頼番号
		String shoriIraiNo = (String)shoriIrai.get(JBSbatCC_T_DLYD_TRN_REQ.DLYD_TRN_REQ_NO);
		
		// ディレイド処理依頼結果更新
		// チェックエラーフラグがtrueの場合
		if (checkErrFlg)
		{
			JCCbatShoriIraiUtil.updateShoriIraiResult(commonItem, shoriIraiNo, JKKStrConst.DLYD_TRN_RSLT_CD_APP_ERR, null);
		}
		// チェックエラーフラグがfalseの場合
		else
		{
			JCCbatShoriIraiUtil.updateShoriIraiResult(commonItem, shoriIraiNo, JKKStrConst.DLYD_TRN_RSLT_CD_COMPLETE, null);
		}
	}

	/**
	 * 業務サービス終了処理
	 * @throws Exception
	 */
	public void terminal() throws Exception
	{
	/**▼▼▼▼▼▼業務サービスの終了処理を記述してください。▼▼▼▼▼▼*/
		/**▼▼▼▼▼▼ツールから生成した終了処理のソースです 開始▼▼▼▼▼▼*/
		// DBアクセスクラスをクローズします
		db_KK_T_INTR.close();
		db_CK_T_CUST.close();
		db_KK_T_SVC_KEI.close();
		db_KK_T_KAISEN_TG_SVKEI.close();
		db_KK_T_SVKEI_KAISEN_UW.close();
		db_ZM_M_WORK_PARAM_KNRI.close();
		db_ZM_T_DL_FILE_KANRI.close();
		db_ZM_T_DATAIKTTRK_KNRI.close();
			/**▲▲▲▲▲▲ツールから生成した終了処理のソースです 終了▲▲▲▲▲▲*/
	/**▲▲▲▲▲▲業務サービスの終了処理を記述してください。▲▲▲▲▲▲*/
	}

	/**▼▼▼▼▼▼ツールから生成したメソッドです 開始▼▼▼▼▼▼*/
	/**
	 * PK(ＰＫ　検索)でDBアクセスを行います。<br>
	 * <p>
	 * <b>処理フロー</b><br>
	 * <pre>
	 * 1.引数で条件マップを作ります。<br>
	 *
	 * 2.DBアクセスを実行します。<br>
	 * 
	 * 3.メソッドの呼び出し方です。<br>
	 *		引数:
	 *		whereParam:PK項目の(項目、値)を(key、value)として,格納された配列です。PK項目は以下に説明します。
	 *		 	INTR_CD
	 * </pre>
	 * <p>
	 * @param whereParam 条件項目の値。
	 * @return JBSbatCommonDBInterface 検索の結果。
	 * @throws Exception 業務サービス内で発生した例外全般。
	 */
	private JBSbatCommonDBInterface executeKK_T_INTR_PKSELECT(Object[] whereParam) throws Exception
	{
		// 条件のマップを作成します
		JBSbatCommonDBInterface whereMap = new JBSbatCommonDBInterface();
		whereMap.setValue("INTR_CD", whereParam[0]);

		// DBアクセスを実行します
		return db_KK_T_INTR.selectByPrimaryKeys(whereMap);
	}

	/**
	 * SQLKEY(KK_SELECT_020)でDBアクセスを行います。<br>
	 * <p>
	 * <b>処理フロー</b><br>
	 * <pre>
	 * 1.引数でバイント変数を設定します。<br>
	 *
	 * 2.DBアクセスを実行します。<br>
	 * 
	 * 3.メソッドの呼び出し方です。<br>
	 *		引数:
	 *		param:順にバイント変数の値をparam配列に入れます。バイント変数は以下に説明します。
	 *		 	SYSID
	 *		 	予約適用年月日
	 * </pre>
	 * <p>
	 * @param param バイント変数の値配列。
	 * @throws Exception 業務サービス内で発生した例外全般。
	 */
	private void executeCK_T_CUST_KK_SELECT_020(Object[] param) throws Exception
	{
		// バイント変数のリストを生成します
		JBSbatCommonDBInterface paramList = new JBSbatCommonDBInterface();
		paramList.setValue(param[0]);
		paramList.setValue(param[1]);

		// DBアクセスを実行します
		db_CK_T_CUST.selectBySqlDefine(paramList, CK_T_CUST_KK_SELECT_020);
	}
	
	/**
	 * SQLKEY(KK_SELECT_373)で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_373(Object[] param) throws Exception
	{
		// バイント変数のリストを生成します
		JBSbatCommonDBInterface paramList = new JBSbatCommonDBInterface();
		paramList.setValue(param[0]);
		paramList.setValue(param[1]);

		// DBアクセスを実行します
		db_KK_T_SVC_KEI.selectBySqlDefine(paramList, KK_T_SVC_KEI_KK_SELECT_373);
	}
	
	/**
	 * 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_T_SVKEI_KAISEN_UW_KK_SELECT_001(Object[] param) throws Exception
	{
		// バイント変数のリストを生成します
		JBSbatCommonDBInterface paramList = new JBSbatCommonDBInterface();
		paramList.setValue(param[0].toString());
		// OM-2016-0002006 SQL変更のためパラメータ追加 2016/10/19 ADD START
		paramList.setValue(param[1].toString());
		paramList.setValue(param[2].toString());
		// OM-2016-0002006 SQL変更のためパラメータ追加 2016/10/19 ADD END
		// DBアクセスを実行します
		db_KK_T_SVKEI_KAISEN_UW.selectBySqlDefine(paramList, KK_T_SVKEI_KAISEN_UW_KK_SELECT_001);
	}
	
	/**
	 * SQLKEY(KK_SELECT_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_M_WORK_PARAM_KNRI_KK_SELECT_002(Object[] param) throws Exception
	{
		// バイント変数のリストを生成します
		JBSbatCommonDBInterface paramList = new JBSbatCommonDBInterface();
		paramList.setValue(param[0].toString());
		paramList.setValue(param[1].toString());
		paramList.setValue(param[2].toString());

		// DBアクセスを実行します
		db_ZM_M_WORK_PARAM_KNRI.selectBySqlDefine(paramList, ZM_M_WORK_PARAM_KNRI_KK_SELECT_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[] 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());

		// DBアクセスを実行します
		db_ZM_T_DL_FILE_KANRI.executeBySqlDefine(paramList, ZM_T_DL_FILE_KANRI_KK_INSERT_002);
	}
	/**▲▲▲▲▲▲ツールから生成したメソッドです 終了▲▲▲▲▲▲*/
	
	/**
	 * 紹介コード一括登録結果リストを出力する。<br>
	 * @param intrCd 紹介コード
	 * @param addRslt 登録結果
	 * @param rsltNaiyo 結果内容
	 * @throws Exception メソッド内で発生した例外全般。
	 */
	private void createKkifm876(String intrCd, JBSbatServiceInterfaceMap recordMap) throws Exception
	{
		ArrayList<String> outputInfo = new ArrayList<String>();
		
		outputInfo.add(intrCd);														// 紹介コード
		outputInfo.add(recordMap.getString(JBSbatKKIFM875.SYSID));					// SYSID
		outputInfo.add(recordMap.getString(JBSbatKKIFM875.SVC_KEI_NO));				// お客様ID
		outputInfo.add(recordMap.getString(JBSbatKKIFM875.YK_KIGEN_YMD));			// 有効期限年月日
		
		JKKBatCommon.printDoubleQuoteBusinessFileUtil(kkifm876FileObj, outputInfo);
		
		kkifm876RecordCnt++;
	}

	/**
	 * 紹介コード一括登録エラーリストを出力する。<br>
	 */
	private void createKkifm877(JBSbatServiceInterfaceMap recordMap, ErrCdEnum errCdEnum) throws Exception
	{
		createKkifm877(recordMap, errCdEnum, null);
	}

	/**
	 * 紹介コード一括登録エラーリストを出力する。<br>
	 */
	private void createKkifm877(JBSbatServiceInterfaceMap recordMap, ErrCdEnum errCdEnum, String additionalMessage) throws Exception
	{
		ArrayList<String> outputInfo = new ArrayList<String>();
		if(recordMap==null){
			outputInfo.add("");															// SYSID
			outputInfo.add("");															// お客様ID
			outputInfo.add("");															// 有効期限年月日
		}else{
			outputInfo.add(recordMap.getString(JBSbatKKIFM875.SYSID));					// SYSID
			outputInfo.add(recordMap.getString(JBSbatKKIFM875.SVC_KEI_NO));				// お客様ID
			outputInfo.add(recordMap.getString(JBSbatKKIFM875.YK_KIGEN_YMD));			// 有効期限年月日
		}
		outputInfo.add(errCdEnum.toString());						// エラーコード
		if(additionalMessage != null){
			outputInfo.add(errCdEnum.message+additionalMessage);	// エラー理由
		}else{
			outputInfo.add(errCdEnum.message);						// エラー理由
		}
		
		JKKBatCommon.printDoubleQuoteBusinessFileUtil(kkifm877FileObj, outputInfo);
		
		kkifm877RecordCnt++;
	}
	
	/**
	 * エラーチェックを行います。
	 * <br>
	 * @param recordMap 紹介コード一括登録リストの１レコードの情報
	 * @return 紹介コード一括登録エラーコード
	 */
	@SuppressWarnings("unchecked")
	private ErrCdEnum checkMain(JBSbatServiceInterfaceMap recordMap) throws Exception
	{
		// 単項目チェック
		ErrCdEnum result = singleCheck(recordMap.getMap());
		if(result != null){
			return result;
		}
		
		String sysid = recordMap.getString(JBSbatKKIFM875.SYSID);
		// お客さまをカレント取得
		executeCK_T_CUST_KK_SELECT_020(new String[]{sysid, super.opeDate});
		JBSbatCommonDBInterface custInfo = db_CK_T_CUST.selectNext();

		// お客様に存在しないSYSIDの場合、チェックエラーとする
		if (null == custInfo)
		{
			return ErrCdEnum.E100;
		}

		// お客様のお客様入退会コードが「退会」の場合、チェックエラーとする
		String custNtaikaiCd = custInfo.getString(JBSbatCK_T_CUST.CUST_NTAIKAI_CD);
		if ("1".equals(custNtaikaiCd))
		{
			return ErrCdEnum.E110;
		}
		
		// サービス契約をカレント取得
		String svcKeiNo = recordMap.getString(JBSbatKKIFM875.SVC_KEI_NO);
		executeKK_T_SVC_KEI_KK_SELECT_373(new String[]{svcKeiNo, super.opeDate});
		JBSbatCommonDBInterface svcKeiInfo = db_KK_T_SVC_KEI.selectNext();
		//お客様のお客様IDとSYSIDが不一致の場合、チェックエラーとする。
		if(null == svcKeiInfo || !sysid.equals( svcKeiInfo.getString(JBSbatKK_T_SVC_KEI.SYSID) ) )
		{
			return ErrCdEnum.E120;
		}

		return null;
	}

	/**
	 * 入力情報（紹介コード一括登録）の単項目チェックを行います。<br>
	 * @param rsMap 入力データ（TXT又はDB）を格納されたMap。
	 * @return エラー内容に該当する紹介コード一括登録エラーコード。エラーなしの場合には空文字を返却。
	 */
	private ErrCdEnum singleCheck(Map<String, Object> rsMap)
	{
		// 単項目チェックを行います
		String strValue = null;

		// SYSID項目チェック
		strValue = (String)rsMap.get(JBSbatKKIFM875.SYSID);

		// 必須チェック
		if(JKKStringUtil.isNullBlank(strValue))
		{
			return ErrCdEnum.E020;
		}

		// 桁数チェック
		if(!JBSbatCheckUtil.invoke(strValue, new String[]{"ketasuu1","10"}))
		{
			return ErrCdEnum.E040;
		}

		// 属性チェック
		if(!JBSbatCheckUtil.invoke(strValue, new String[]{"hannkakuesuuji1"}))
		{
			return ErrCdEnum.E030;
		}

		// サービス契約番号項目チェック
		strValue = (String)rsMap.get(JBSbatKKIFM875.SVC_KEI_NO);

		// 必須チェック
		if(JKKStringUtil.isNullBlank(strValue))
		{
			return ErrCdEnum.E050;
		}

		// 桁数チェック
		if(!JBSbatCheckUtil.invoke(strValue, new String[]{"ketasuu1","10"}))
		{
			return ErrCdEnum.E070;
		}

		// 属性チェック
		if(!JBSbatCheckUtil.invoke(strValue, new String[]{"hannkakuesuuji1"}))
		{
			return ErrCdEnum.E060;
		}
		
		// 有効期限項目チェック
		strValue = (String)rsMap.get(JBSbatKKIFM875.YK_KIGEN_YMD);

		// 必須チェックなし 入力時のみ桁数属性チェック
		if(!JKKStringUtil.isNullBlank(strValue))
		{
			// 桁数チェック
			if(!JBSbatCheckUtil.invoke(strValue, new String[]{"ketasuu1", "8"}))
			{
				return ErrCdEnum.E090;
			}
	
			// 属性チェック
			if(!JBSbatCheckUtil.invoke(strValue, new String[]{"year_month_day1"}))
			{
				return ErrCdEnum.E080;
			}
		}

		return null;
	}
}
