/*********************************************************************
*  All Rights reserved,Copyright (c) K-Opticom
**********************************************************************
*＜プログラム内容＞
*	システム名			：eo顧客基幹システム
*	モジュール名		：JBSBatKKEmoneyGiftcdHkRsltAdd
*	ソースファイル名	：JBSBatKKEmoneyGiftcdHkRsltAdd.java
*	作成者				：富士通　
*	作成日				：2022年01月26日
*＜機能概要＞
*　電子マネーギフトコード発行結果登録部品です。
*＜修正履歴＞
*	バージョン	修正日		修正者		修正内容
*	v57.00.00	2022/01/26	FJ)吉田		【ANK-4208-00-00】電子マネー特典導入
*	v57.00.01	2022/02/02	FJ)吉田		【ANK-4208-02-00】電子マネー特典導入(仕変2)
*	v57.00.02	2022/03/09	FJ)吉田		【ANK-4208-00-00】電子マネー特典導入
*********************************************************************/
package eo.business.service;

import java.io.UnsupportedEncodingException;
import java.util.ArrayList;
import java.util.HashMap;

import com.fujitsu.futurity.model.common.check.DatetimeCheck;
import com.fujitsu.futurity.model.common.check.HalfCharCheck;
import com.fujitsu.futurity.model.common.check.LengthCheck;
import com.fujitsu.futurity.model.common.check.MixCharCheck;

import eo.business.common.JACbatDebugLogUtil;
import eo.business.common.JBSbatBusinessService;
import eo.business.common.JBSbatKKEMoneyMailUtil;
import eo.business.common.JCCBatCommon;
import eo.business.util.file.JBSbatKKIFE480;
import eo.business.util.file.JBSbatKKIFM937;
import eo.business.util.table.JBSbatCK_T_CUST;
import eo.business.util.table.JBSbatKK_T_CMP_APLY_INFO;
import eo.business.util.table.JBSbatKK_T_DCHSKMST;
import eo.common.constant.JKKStrConst;
import eo.common.constant.JPCBatchMessageConstant;
import eo.common.util.JKKStringUtil;
import eo.framework.item.JBSbatCommonItem;
import eo.framework.item.JBSbatServiceInterfaceMap;
import eo.framework.item.JBSbatOutputItem;
import eo.framework.item.JBSbatCommonDBInterface;
import eo.framework.log.JBSbatLogPrintControl;
import eo.framework.db.JBSbatSQLAccess;
import eo.framework.util.JCCBatchEsbInterface;

/**
* (クラスの機能概要) <p>
*<BR>
* @author 富士通
*/
public class JBSbatKKEMoneyGiftcdHkRsltAdd extends JBSbatBusinessService
{
	/**▼▼▼▼▼▼ツールから生成した宣言です 開始▼▼▼▼▼▼*/
	/** テーブル(キャンペーン適用情報)*/
	private static final String D_TBL_NAME_KK_T_CMP_APLY_INFO = "KK_T_CMP_APLY_INFO";
	// ANK-4208-02-00 DEL START
//	/** テーブル(データ抽出項目設定)*/
//	private static final String D_TBL_NAME_KK_T_DCHSKMST = "KK_T_DCHSKMST";
//	/** テーブル(サービス契約)*/
//	private static final String D_TBL_NAME_KK_T_SVC_KEI = "KK_T_SVC_KEI";
	// ANK-4208-02-00 DEL END
	/** テーブル(お客様)*/
	private static final String D_TBL_NAME_CK_T_CUST = "CK_T_CUST";

	/** SQL定義キー(KK_SELECT_002)*/
	private static final String KK_T_CMP_APLY_INFO_KK_SELECT_002 = "KK_SELECT_002";
	// ANK-4208-02-00 DEL START
//	/** SQL定義キー(KK_INSERT_002)*/
//	private static final String KK_T_DCHSKMST_KK_INSERT_002 = "KK_INSERT_002";
//	/** SQL定義キー(KK_SELECT_023)*/
//	private static final String KK_T_SVC_KEI_KK_SELECT_023 = "KK_SELECT_023";
	// ANK-4208-02-00 DEL END
	/** SQL定義キー(KK_SELECT_002)*/
	private static final String CK_T_CUST_KK_SELECT_002 = "KK_SELECT_002";

	/** テーブルアクセスクラス(キャンペーン適用情報)*/
	private JBSbatSQLAccess db_KK_T_CMP_APLY_INFO = null;
	// ANK-4208-02-00 DEL START
//	/** テーブルアクセスクラス(データ抽出項目設定)*/
//	private JBSbatSQLAccess db_KK_T_DCHSKMST = null;
//	/** テーブルアクセスクラス(サービス契約番号)*/
//	private JBSbatSQLAccess db_KK_T_SVC_KEI = null;
	// ANK-4208-02-00 DEL END
	/** テーブルアクセスクラス(お客様)*/
	private JBSbatSQLAccess db_CK_T_CUST = null;
	
	/**▲▲▲▲▲▲ツールから生成した宣言です 終了▲▲▲▲▲▲*/

	/** ユースケースID ギフトコード発行結果通知メール送信 */
	private static final String USECASE_ID_KKSV0996 = "KKSV0996";
	
	/** オペレーションID ギフトコード発行結果通知メール送信 */
	private static final String OPERATION_ID_KKSV0996 = "KKSV0996OP";
	
	/** マッピングID */
	private static final String MAPPING_ID_01 = "KKSV099601CC";
	
	/** サービスのリターンコード(正常) */
	private static final String RETURN_CODE_SUCCESS = "0000";
	
	/** メールコード(プレゼントコード取得完了のお知らせ) */
	private static final String MAIL_CD_GIFTCD_HK_RELS_TCH = "KKM1000034";
	
	private JBSbatKKEMoneyMailUtil eMoneyMailUtil ;
	
	/**
	 * 初期処理
	 * @param JBSbatCommonItem commonItem　バッチ共通パラメータ電文
	 * @throws Exception
	 */
	public void initial(JBSbatCommonItem commonItem) throws Exception
	{
	/**▼▼▼▼▼▼業務サービスの初期処理を記述してください。▼▼▼▼▼▼*/
		/**▼▼▼▼▼▼ツールから生成した初期化のソースです 開始▼▼▼▼▼▼*/
		// 共通パラメータを設定します
		super.setCommonInfo(commonItem);
		
		// DBアクセスクラスを生成します
		db_KK_T_CMP_APLY_INFO = new JBSbatSQLAccess(commonItem, D_TBL_NAME_KK_T_CMP_APLY_INFO);
		// ANK-4208-02-00 DEL START
//		db_KK_T_DCHSKMST = new JBSbatSQLAccess(commonItem, D_TBL_NAME_KK_T_DCHSKMST);
//		db_KK_T_SVC_KEI = new JBSbatSQLAccess(commonItem, D_TBL_NAME_KK_T_SVC_KEI);
		// ANK-4208-02-00 DEL END
		db_CK_T_CUST = new JBSbatSQLAccess(commonItem, D_TBL_NAME_CK_T_CUST);
		/**▲▲▲▲▲▲ツールから生成した初期化のソースです 終了▲▲▲▲▲▲*/
		eMoneyMailUtil = new JBSbatKKEMoneyMailUtil();
		eMoneyMailUtil.initial(commonItem);
		
	/**▲▲▲▲▲▲業務サービスの初期処理を記述してください。▲▲▲▲▲▲*/
	}

	/**
	 * 主処理
	 * @param inMap　入力電文
	 * @return JBSbatOutputItem　出力情報
	 * @throws Exception
	 */
	public JBSbatOutputItem execute(JBSbatServiceInterfaceMap inMap) throws Exception
	{
	/**▼▼▼▼▼▼業務サービスの主処理を記述してください。▼▼▼▼▼▼*/
		
		JBSbatOutputItem outputItem = new JBSbatOutputItem();
		
		// 入力データ単項目チェック処理
		if (!checkInputData(inMap, outputItem))
		{
			return outputItem;
		}
		
		// データ抽出項目設定番号
		String dchskmstNo = "";
		// 処理ステータス
		String trnStat = "";
		// ANK-4208-02-00 DEL START
//		// 世代登録年月日時分秒(データ抽出項目設定)
//		String geneAddDtm = "";
		// ANK-4208-02-00 DEL END
		// SYSID
		String sysid = "";
		
		// キャンペーン適用情報を取得する。
		executeKK_T_CMP_APLY_INFO_KK_SELECT_002(inMap);
		// 結果を取得
		JBSbatCommonDBInterface dbMapKK_T_CMP_APLY_INFO =  db_KK_T_CMP_APLY_INFO.selectNext();
		if(dbMapKK_T_CMP_APLY_INFO == null)
		{
			//取得データが存在しない場合はエラー
			String errMsgId = JPCBatchMessageConstant.EKKB2130KW;								// エラーメッセージID
			String[] errMsgValue = new String[]{};												// エラーメッセージ置換文字
			String errCd	= "E21";															// エラーコード
			String errMsg	= JBSbatLogPrintControl.getMessage(errMsgId, errMsgValue);			// エラーメッセージ
			
			// エラーファイル出力
			createOutputFileError(inMap, errCd, errMsg, outputItem);
			return outputItem;
		}
		
		// データ抽出項目設定番号を取得する。
		dchskmstNo = dbMapKK_T_CMP_APLY_INFO.getString(JBSbatKK_T_CMP_APLY_INFO.DCHSKMST_NO);
		// ANK-4208-02-00 DEL START
//		// 世代登録年月日時分秒を取得する。
//		geneAddDtm = dbMapKK_T_CMP_APLY_INFO.getString(JBSbatKK_T_DCHSKMST.GENE_ADD_DTM);
		// ANK-4208-02-00 DEL END
		// 処理ステータス
		trnStat = dbMapKK_T_CMP_APLY_INFO.getString(JBSbatKK_T_CMP_APLY_INFO.TRN_STAT);
		// 処理ステータスが020:依頼済以外の場合はエラー
		if(!JKKStrConst.TRN_STAT_IRAIZUMI.equals(trnStat))
		{
			//取得データが存在しない場合はエラー
			String errMsgId = JPCBatchMessageConstant.EKKB2140KW;								// エラーメッセージID
			String[] errMsgValue = new String[]{};												// エラーメッセージ置換文字
			String errCd	= "E22";															// エラーコード
			String errMsg	= JBSbatLogPrintControl.getMessage(errMsgId, errMsgValue);			// エラーメッセージ
			
			// エラーファイル出力
			createOutputFileError(inMap, errCd, errMsg, outputItem);
			return outputItem;
		}
		
		// ************ データ更新 ************
		// キャンペーン適用情報をギフトコード発行結果で更新する。
		executeKK_T_CMP_APLY_INFO_PKUPDATE(inMap, dchskmstNo);
		
		// ANK-4208-02-00 DEL START
//		// データ抽出項目を適用済で更新する。
//		executeKK_T_DCHSKMST_KK_INSERT_002(inMap, dchskmstNo, geneAddDtm);
		// ANK-4208-02-00 DEL END
		
		// コネクションのコミット
		commonItem.getConnection().commit();
		
		// ************ メール送信 ************
		// ANK-4208-02-00 DEL START
//		// お客さまID(サービス契約番号)からSYSIDを取得する
//		executeKK_T_SVC_KEI_KK_SELECT_023(inMap);
//		JBSbatCommonDBInterface dbMapKK_T_SVC_KEI =  db_KK_T_SVC_KEI.selectNext();
//		if(dbMapKK_T_SVC_KEI == null){
//			// お客さまIDからSYSIDが取得できなかった場合
//			StringBuffer err_msg = new StringBuffer();
//			err_msg.append("お客さまID(" + inMap.getString(JBSbatKKIFE480.CUST_ID) + ")からSYSIDが取得できませんでした。");
//			super.logPrint.printBusinessErrorLog("EKKB0010CW", 
//					new String[]{ err_msg.toString() });
//			super.commonItem.setErrFlg(true);
//			return null;
//		}
		// ANK-4208-02-00 DEL END
		// ANK-4208-02-00 MOD START
		// sysidを取得する。
//		sysid = dbMapKK_T_SVC_KEI.getString(JBSbatKK_T_SVC_KEI.SYSID);
		sysid = dbMapKK_T_CMP_APLY_INFO.getString(JBSbatKK_T_DCHSKMST.SYSID);
		// ANK-4208-02-00 MOD END
		
		// 電子マネーメール共通部品を使用して、メールアドレス情報を取得する。
		// 送信先メールアドレスリスト
		ArrayList<String> sendMladList = eMoneyMailUtil.getMailAddrList(sysid, inMap.getString(JBSbatKKIFE480.CUST_ID), super.opeDate);
		
		// 〇置換情報取得
		// お客様名
		String cust_nm = "";
		
		// メール本文の置換部用のデータを取得する。
		executeCK_T_CUST_KK_SELECT_002(inMap, sysid);
		JBSbatCommonDBInterface dbMapCK_T_CUST =  db_CK_T_CUST.selectNext();
		if(dbMapCK_T_CUST == null){
			StringBuffer err_msg = new StringBuffer();
			err_msg.append("SYSID(" + sysid + ")からお客様名が取得できませんでした。");
			super.logPrint.printBusinessErrorLog("EKKB0010CW", 
					new String[]{ err_msg.toString() });
			super.commonItem.setErrFlg(true);
			return null;
		}
		cust_nm = dbMapCK_T_CUST.getString(JBSbatCK_T_CUST.CUST_NM);
		
		// 置換情報配列
		String[] convArray = {cust_nm};
		
		// メール送信サービスを呼出す。
		for(String mlad : sendMladList)
		{
			callMailSendService(inMap, mlad, convArray);
		}
		
		return null;
	/**▲▲▲▲▲▲業務サービスの主処理を記述してください。▲▲▲▲▲▲*/
	}

	private boolean checkInputData(JBSbatServiceInterfaceMap inMap, JBSbatOutputItem outputItem) throws Exception
	{
		
		// エラー部設定内容
		boolean errFlg	= false;															// エラーフラグ
		String errMsgId = null;																// エラーメッセージID
		String[] errMsgValue = new String[]{};												// エラーメッセージ置換文字
		String errCd	= null;																// エラーコード
		String errMsg	= null;																// エラーメッセージ
		
		// inputデータを定義
		String custId = inMap.getString(JBSbatKKIFE480.CUST_ID);
		String presentCd = inMap.getString(JBSbatKKIFE480.PRESENT_CD);
		String presentSbt = inMap.getString(JBSbatKKIFE480.PRESENT_SBT);
		String presentSbtNm = inMap.getString(JBSbatKKIFE480.PRESENT_SBT_NM);
		String cmpNm = inMap.getString(JBSbatKKIFE480.CMP_NM);
		String giftId = inMap.getString(JBSbatKKIFE480.GIFT_ID);
		String ejoicaTrnNo = inMap.getString(JBSbatKKIFE480.EJOICA_TRN_NO);
		String amnt = inMap.getString(JBSbatKKIFE480.AMNT);
		String giftidYkKigenYmd = inMap.getString(JBSbatKKIFE480.GIFTID_YK_KIGEN_YMD);
		String giftidUketoriDtm = inMap.getString(JBSbatKKIFE480.GIFTID_UKETORI_DTM);
		
		// お客さまID
		if(JKKStringUtil.isNullEmpty(custId))
		{
			// 必須チェックエラー
			// エラーファイル出力用に設定
			errFlg = true;
			errMsgId = JPCBatchMessageConstant.EKKB2020TW;
			errMsgValue = new String[]{"お客さまID"};
			errCd = "E01";
		}
		else if (!HalfCharCheck.isEnNumber1Check(custId))
		{
			// 属性チェックエラー
			// エラーファイル出力用に設定
			errFlg = true;
			errMsgId = JPCBatchMessageConstant.EKKB2040TW;
			errMsgValue = new String[]{"お客さまID"};
			errCd = "E02";
		}
		else if (!LengthCheck.isLength1Check(custId, 10))
		{
			// 桁数チェックエラー
			// エラーファイル出力用に設定
			errFlg = true;
			errMsgId = JPCBatchMessageConstant.EKKB2030TW;
			errMsgValue = new String[]{"お客さまID"};
			errCd = "E03";
		}

		if(!errFlg)
		{
			// プレゼントコード
			if(JKKStringUtil.isNullEmpty(presentCd))
			{
				// 必須チェックエラー
				// エラーファイル出力用に設定
				errFlg = true;
				errMsgId = JPCBatchMessageConstant.EKKB2020TW;
				errMsgValue = new String[]{"プレゼントコード"};
				errCd = "E01";
			}
			else if (!HalfCharCheck.isEnNumber1Check(presentCd))
			{
				// 属性チェックエラー
				// エラーファイル出力用に設定
				errFlg = true;
				errMsgId = JPCBatchMessageConstant.EKKB2040TW;
				errMsgValue = new String[]{"プレゼントコード"};
				errCd = "E02";
			}
			else if (!LengthCheck.isLength2Check(presentCd, 1, 30))
			{
				// 桁数チェックエラー
				// エラーファイル出力用に設定
				errFlg = true;
				errMsgId = JPCBatchMessageConstant.EKKB2030TW;
				errMsgValue = new String[]{"プレゼントコード"};
				errCd = "E03";
			}
		}
		if(!errFlg)
		{
			// プレゼント種別
			if(JKKStringUtil.isNullEmpty(presentSbt))
			{
				// 必須チェックエラー
				// エラーファイル出力用に設定
				errFlg = true;
				errMsgId = JPCBatchMessageConstant.EKKB2020TW;
				errMsgValue = new String[]{"プレゼント種別"};
				errCd = "E01";
			}
			else if (!HalfCharCheck.isEnNumber1Check(presentSbt))
			{
				// 属性チェックエラー
				// エラーファイル出力用に設定
				errFlg = true;
				errMsgId = JPCBatchMessageConstant.EKKB2040TW;
				errMsgValue = new String[]{"プレゼント種別"};
				errCd = "E02";
			}
			else if (!LengthCheck.isLength1Check(presentSbt, 2))
			{
				// 桁数チェックエラー
				// エラーファイル出力用に設定
				errFlg = true;
				errMsgId = JPCBatchMessageConstant.EKKB2030TW;
				errMsgValue = new String[]{"プレゼント種別"};
				errCd = "E03";
			}
		}
//		if(!errFlg)
//		{
//			// プレゼント種別名称
//			if(JKKStringUtil.isNullEmpty(presentSbtNm))
//			{
//				// 必須チェックエラー
//				// エラーファイル出力用に設定
//				errFlg = true;
//				errMsgId = JPCBatchMessageConstant.EKKB2020TW;
//				errMsgValue = new String[]{"プレゼント種別名称"};
//				errCd = "E01";
//			}
//			else if (!MixCharCheck.isMixCheck(presentSbtNm))
//			{
//				// 属性チェックエラー
//				// エラーファイル出力用に設定
//				errFlg = true;
//				errMsgId = JPCBatchMessageConstant.EKKB2040TW;
//				errMsgValue = new String[]{"プレゼント種別名称"};
//				errCd = "E02";
//			}
//			else if (!isByteCheck(presentSbtNm, 1, 100))
//			{
//				// 桁数チェックエラー
//				// エラーファイル出力用に設定
//				errFlg = true;
//				errMsgId = JPCBatchMessageConstant.EKKB2030TW;
//				errMsgValue = new String[]{"プレゼント種別名称"};
//				errCd = "E03";
//			}
//		}
//		if(!errFlg)
//		{
//			// キャンペーン名称
//			if(JKKStringUtil.isNullEmpty(cmpNm))
//			{
//				// 必須チェックエラー
//				// エラーファイル出力用に設定
//				errFlg = true;
//				errMsgId = JPCBatchMessageConstant.EKKB2020TW;
//				errMsgValue = new String[]{"キャンペーン名称"};
//				errCd = "E01";
//			}
//			else if (!MixCharCheck.isMixCheck(presentSbtNm))
//			{
//				// 属性チェックエラー
//				// エラーファイル出力用に設定
//				errFlg = true;
//				errMsgId = JPCBatchMessageConstant.EKKB2040TW;
//				errMsgValue = new String[]{"キャンペーン名称"};
//				errCd = "E02";
//			}
//			else if (!isByteCheck(cmpNm, 1, 80))
//			{
//				// 桁数チェックエラー
//				// エラーファイル出力用に設定
//				errFlg = true;
//				errMsgId = JPCBatchMessageConstant.EKKB2030TW;
//				errMsgValue = new String[]{"キャンペーン名称"};
//				errCd = "E03";
//			}
//		}
		if(!errFlg)
		{
			// ギフトID
			if(JKKStringUtil.isNullEmpty(giftId))
			{
				// 必須チェックエラー
				// エラーファイル出力用に設定
				errFlg = true;
				errMsgId = JPCBatchMessageConstant.EKKB2020TW;
				errMsgValue = new String[]{"ギフトID"};
				errCd = "E01";
			}
			else if (!HalfCharCheck.isEnNumber1Check(giftId))
			{
				// 属性チェックエラー
				// エラーファイル出力用に設定
				errFlg = true;
				errMsgId = JPCBatchMessageConstant.EKKB2040TW;
				errMsgValue = new String[]{"ギフトID"};
				errCd = "E02";
			}
			else if (!LengthCheck.isLength2Check(giftId, 1, 64))
			{
				// 桁数チェックエラー
				// エラーファイル出力用に設定
				errFlg = true;
				errMsgId = JPCBatchMessageConstant.EKKB2030TW;
				errMsgValue = new String[]{"ギフトID"};
				errCd = "E03";
			}
		}
		if(!errFlg)
		{
			// EJOICA管理番号
			if(JKKStringUtil.isNullEmpty(ejoicaTrnNo))
			{
				// 必須チェックエラー
				// エラーファイル出力用に設定
				errFlg = true;
				errMsgId = JPCBatchMessageConstant.EKKB2020TW;
				errMsgValue = new String[]{"EJOICA管理番号"};
				errCd = "E01";
			}
			else if (!HalfCharCheck.isEnNumber1Check(ejoicaTrnNo))
			{
				// 属性チェックエラー
				// エラーファイル出力用に設定
				errFlg = true;
				errMsgId = JPCBatchMessageConstant.EKKB2040TW;
				errMsgValue = new String[]{"EJOICA管理番号"};
				errCd = "E02";
			}
			else if (!LengthCheck.isLength2Check(ejoicaTrnNo, 1, 16))
			{
				// 桁数チェックエラー
				// エラーファイル出力用に設定
				errFlg = true;
				errMsgId = JPCBatchMessageConstant.EKKB2030TW;
				errMsgValue = new String[]{"EJOICA管理番号"};
				errCd = "E03";
			}
		}
		if(!errFlg)
		{
			// 金額
			if(JKKStringUtil.isNullEmpty(amnt))
			{
				// 必須チェックエラー
				// エラーファイル出力用に設定
				errFlg = true;
				errMsgId = JPCBatchMessageConstant.EKKB2020TW;
				errMsgValue = new String[]{"金額"};
				errCd = "E01";
			}
			else if (!HalfCharCheck.isEnNumber1Check(amnt))
			{
				// 属性チェックエラー
				// エラーファイル出力用に設定
				errFlg = true;
				errMsgId = JPCBatchMessageConstant.EKKB2040TW;
				errMsgValue = new String[]{"金額"};
				errCd = "E02";
			}
			else if (!LengthCheck.isLength2Check(amnt, 1, 6))
			{
				// 桁数チェックエラー
				// エラーファイル出力用に設定
				errFlg = true;
				errMsgId = JPCBatchMessageConstant.EKKB2030TW;
				errMsgValue = new String[]{"金額"};
				errCd = "E03";
			}
		}
		if(!errFlg)
		{
			// ギフトコード有効期限
			if(JKKStringUtil.isNullEmpty(giftidYkKigenYmd))
			{
				// 必須チェックエラー
				// エラーファイル出力用に設定
				errFlg = true;
				errMsgId = JPCBatchMessageConstant.EKKB2020TW;
				errMsgValue = new String[]{"ギフトコード有効期限"};
				errCd = "E01";
			}
			else if (!HalfCharCheck.isEnNumber1Check(giftidYkKigenYmd))
			{
				// 属性チェックエラー
				// エラーファイル出力用に設定
				errFlg = true;
				errMsgId = JPCBatchMessageConstant.EKKB2040TW;
				errMsgValue = new String[]{"ギフトコード有効期限"};
				errCd = "E02";
			}
			else if (!LengthCheck.isLength1Check(giftidYkKigenYmd, 8))
			{
				// 桁数チェックエラー
				// エラーファイル出力用に設定
				errFlg = true;
				errMsgId = JPCBatchMessageConstant.EKKB2030TW;
				errMsgValue = new String[]{"ギフトコード有効期限"};
				errCd = "E03";
			}
			else if (!DatetimeCheck.isDateCheck(giftidYkKigenYmd))
			{
				// 日付チェックエラー
				// エラーファイル出力用に設定
				errFlg = true;
				errMsgId = JPCBatchMessageConstant.EKKB2110TW;
				errMsgValue = new String[]{"ギフトコード有効期限"};
				errCd = "E04";
			}
		}
		if(!errFlg)
		{
			// ギフトコード受取日時
			if(JKKStringUtil.isNullEmpty(giftidUketoriDtm))
			{
				// 桁数チェックエラー
				// エラーファイル出力用に設定
				errFlg = true;
				errMsgId = JPCBatchMessageConstant.EKKB2020TW;
				errMsgValue = new String[]{"ギフトコード受取日時"};
				errCd = "E01";
			}
			else if (!HalfCharCheck.isEnNumber1Check(giftidUketoriDtm))
			{
				// 桁数チェックエラー
				// エラーファイル出力用に設定
				errFlg = true;
				errMsgId = JPCBatchMessageConstant.EKKB2040TW;
				errMsgValue = new String[]{"ギフトコード受取日時"};
				errCd = "E02";
			}
			else if (!LengthCheck.isLength1Check(giftidUketoriDtm, 14))
			{
				// 桁数チェックエラー
				// エラーファイル出力用に設定
				errFlg = true;
				errMsgId = JPCBatchMessageConstant.EKKB2030TW;
				errMsgValue = new String[]{"ギフトコード受取日時"};
				errCd = "E03";
			}
			else if (!DatetimeCheck.isDatetime4Check(giftidUketoriDtm))
			{
				// 桁数チェックエラー
				// エラーファイル出力用に設定
				errFlg = true;
				errMsgId = JPCBatchMessageConstant.EKKB2120TW;
				errMsgValue = new String[]{"ギフトコード受取日時"};
				errCd = "E05";
			}
		}
		// エラーがあればエラーを出力する
		if(errFlg)
		{
			errMsg = JBSbatLogPrintControl.getMessage(errMsgId, errMsgValue);
			// エラーファイル出力
			createOutputFileError(inMap, errCd, errMsg, outputItem);
			return false;
		}
		return true;
	}

	/**
	 * エラーファイルを出力します。
	 * 
	 * @param inMap
	 * @param errCd
	 * @param errMsg
	 * @param outputItem 
	 * @throws Exception
	 */
	private void createOutputFileError(JBSbatServiceInterfaceMap inMap, String errCd, String errMsg, JBSbatOutputItem outputItem) throws Exception {
		
		JBSbatServiceInterfaceMap errMap = new JBSbatServiceInterfaceMap();
		
		errMap.setString(JBSbatKKIFM937.ERRCD,					errCd);														// エラー種類
		errMap.setString(JBSbatKKIFM937.ERRMSG,					errMsg);													// エラー内容
		errMap.setString(JBSbatKKIFM937.CUST_ID,				inMap.getString(JBSbatKKIFE480.CUST_ID));					// お客さまID
		errMap.setString(JBSbatKKIFM937.PRESENT_CD,				inMap.getString(JBSbatKKIFE480.PRESENT_CD));				// プレゼントコード
		errMap.setString(JBSbatKKIFM937.PRESENT_SBT,			inMap.getString(JBSbatKKIFE480.PRESENT_SBT));				// プレゼント種別
		errMap.setString(JBSbatKKIFM937.PRESENT_SBT_NM,			inMap.getString(JBSbatKKIFE480.PRESENT_SBT_NM));			// プレゼント種別名称
		errMap.setString(JBSbatKKIFM937.CMP_NM,					inMap.getString(JBSbatKKIFE480.CMP_NM));					// キャンペーン名称
		errMap.setString(JBSbatKKIFM937.GIFT_ID,				inMap.getString(JBSbatKKIFE480.GIFT_ID));					// ギフトID
		errMap.setString(JBSbatKKIFM937.EJOICA_TRN_NO,			inMap.getString(JBSbatKKIFE480.EJOICA_TRN_NO));				// EJOICA管理番号
		errMap.setString(JBSbatKKIFM937.AMNT,					inMap.getString(JBSbatKKIFE480.AMNT));						// 金額
		errMap.setString(JBSbatKKIFM937.GIFTID_YK_KIGEN_YMD,	inMap.getString(JBSbatKKIFE480.GIFTID_YK_KIGEN_YMD));		// ギフトID有効期限日
		errMap.setString(JBSbatKKIFM937.GIFTID_UKETORI_DTM,		inMap.getString(JBSbatKKIFE480.GIFTID_UKETORI_DTM));		// ギフトID受取日時

		errMap.setOutFlg(true);
		super.commonItem.setErrFlg(true);
		outputItem.addOutMapList(errMap);

	}

	/**
	 * 業務サービス終了処理
	 * @throws Exception
	 */
	public void terminal() throws Exception
	{
	/**▼▼▼▼▼▼業務サービスの終了処理を記述してください。▼▼▼▼▼▼*/
		/**▼▼▼▼▼▼ツールから生成した終了処理のソースです 開始▼▼▼▼▼▼*/
		db_KK_T_CMP_APLY_INFO.close();
		// ANK-4208-02-00 DEL START
//		db_KK_T_DCHSKMST.close();
		// ANK-4208-02-00 DEL END
		/**▲▲▲▲▲▲ツールから生成した終了処理のソースです 終了▲▲▲▲▲▲*/
		eMoneyMailUtil.terminal();
	/**▲▲▲▲▲▲業務サービスの終了処理を記述してください。▲▲▲▲▲▲*/
	}

	/**▼▼▼▼▼▼ツールから生成したメソッドです 開始▼▼▼▼▼▼*/
	/**▲▲▲▲▲▲ツールから生成したメソッドです 終了▲▲▲▲▲▲*/
	
//	/**
//	 * Byte数をチェックします。
//	 * 
//	 * @param presentSbtNm
//	 * @param i
//	 * @return
//	 * @throws UnsupportedEncodingException 
//	 */
//	private boolean isByteCheck(String value, int min, int max) throws UnsupportedEncodingException {
//		
//		int len = value.getBytes("UTF-8").length;
//
//		// バイト数が指範囲外ならエラー
//		if (len <= min)
//		{
//			return false;
//		}
//			if (max <= len)
//		{
//			return false;
//		}
//
//		return true;
//	}

	/**
	 * 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_CMP_APLY_INFO_KK_SELECT_002(JBSbatServiceInterfaceMap inMap) throws Exception
	{
		// バイント変数のリストを生成します
		JBSbatCommonDBInterface paramList = new JBSbatCommonDBInterface();
		paramList.setValue(inMap.getString(JBSbatKKIFE480.CUST_ID));
		paramList.setValue(inMap.getString(JBSbatKKIFE480.PRESENT_CD));
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[L][execute][paramList=" + paramList.getList().toString() + "]");		

		// DBアクセスを実行します
		db_KK_T_CMP_APLY_INFO.selectBySqlDefine(paramList, KK_T_CMP_APLY_INFO_KK_SELECT_002);
	}

	/**
	 * PK(ＰＫ　更新)でDBアクセスを行います。<br>
	 * <p>
	 * <b>処理フロー</b><br>
	 * <pre>
	 * 1.引数で設定項目マップを作ります。<br>
	 *
	 * 2.引数で条件マップを作ります。<br>
	 *
	 * 3.DBアクセスを実行します。<br>
	 * 
	 * 4.メソッドの呼び出し方です。<br>
	 *		引数:
	 *		setParam:設定したい項目の(項目、値)を(key、value)として、setParamマップに入れます。項目キーは以下に説明します。
	 *		 	利用通信量合計				USE_TSRYO_GK
	 *		 	更新年月日時分秒			UPD_DTM
	 *		 	更新オペレータアカウント	UPD_OPEACNT
	 *		whereParam:PK項目の(項目、値)を(key、value)として,格納された配列です。PK項目は以下に説明します。
	 *		 	DCHSKMST_NO
	 * </pre>
	 * <p>
	 * @param setParam 設定項目の値。
	 * @param whereParam 条件項目の値。
	 * @throws Exception 業務サービス内で発生した例外全般。
	 */
	private void executeKK_T_CMP_APLY_INFO_PKUPDATE(JBSbatServiceInterfaceMap inMap, String dchskmstNo) throws Exception
	{
		// 条件値のマップを生成します
		JBSbatCommonDBInterface whereMap = new JBSbatCommonDBInterface();
		whereMap.setValue(JBSbatKK_T_CMP_APLY_INFO.DCHSKMST_NO, dchskmstNo);
		
		// 設定値のマップを作成します
		JBSbatCommonDBInterface valueMap = new JBSbatCommonDBInterface();
		valueMap.setValue(JBSbatKK_T_CMP_APLY_INFO.TRN_STAT,				JKKStrConst.TRN_STAT_SHORIZUMI);
		valueMap.setValue(JBSbatKK_T_CMP_APLY_INFO.PRESENTCD,				inMap.getString(JBSbatKKIFE480.PRESENT_CD));
		valueMap.setValue(JBSbatKK_T_CMP_APLY_INFO.GIFTID,					inMap.getString(JBSbatKKIFE480.GIFT_ID));
		valueMap.setValue(JBSbatKK_T_CMP_APLY_INFO.GIFTID_HAKKO_FIN_DTM,	super.opeDate + JCCBatCommon.getSysDateTime().substring(8, 14));
		valueMap.setValue(JBSbatKK_T_CMP_APLY_INFO.GIFTID_YK_KIGEN_YMD,		inMap.getString(JBSbatKKIFE480.GIFTID_YK_KIGEN_YMD));
		valueMap.setValue(JBSbatKK_T_CMP_APLY_INFO.GIFTID_UKETORI_DTM,		inMap.getString(JBSbatKKIFE480.GIFTID_UKETORI_DTM));
		valueMap.setValue(JBSbatKK_T_CMP_APLY_INFO.KANRI_NO,				inMap.getString(JBSbatKKIFE480.EJOICA_TRN_NO));
		valueMap.setValue(JBSbatKK_T_CMP_APLY_INFO.LAST_RNK_DTM,			JCCBatCommon.getSysDateTime());
		valueMap.setValue(JBSbatKK_T_CMP_APLY_INFO.LAST_RNK_RSLT_CD,		JKKStrConst.LAST_RNK_RSLT_CD_OK);

		
		// DBアクセスを実行します
		db_KK_T_CMP_APLY_INFO.updateByPrimaryKeys(whereMap, valueMap);
	}

	// ANK-4208-02-00 DEL START
//	/**
//	 * 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_DCHSKMST_KK_INSERT_002(JBSbatServiceInterfaceMap inMap, String dchskmstNo, String geneAddDtm) throws Exception
//	{
//		String sysDateTime = JCCBatCommon.getSysDateTimeStamp();
//		
//		// バイント変数のリストを生成します
//		JBSbatCommonDBInterface paramList = new JBSbatCommonDBInterface();
//		paramList.setValue(sysDateTime);		// 世代登録年月日時分秒
//		paramList.setValue(super.opeDate);		// 運用日
//		paramList.setValue(sysDateTime);		// 登録年月日時分秒
//		paramList.setValue(batchUserId);		// 登録オペレータアカウント（バッチユーザID）
//		paramList.setValue(sysDateTime);		// 更新年月日時分秒
//		paramList.setValue(batchUserId);		// 更新オペレータアカウント（バッチユーザID）
//		paramList.setValue(dchskmstNo);			// データ抽出項目設定番号
//		paramList.setValue(geneAddDtm);			// 世代登録年月日時分秒
//
//		// DBアクセスを実行します
//		db_KK_T_DCHSKMST.executeBySqlDefine(paramList, KK_T_DCHSKMST_KK_INSERT_002);
//	}
//
//	/**
//	 * SQLKEY(KK_SELECT_023)で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_023(JBSbatServiceInterfaceMap inMap) throws Exception
//	{
//		// バイント変数のリストを生成します
//		JBSbatCommonDBInterface paramList = new JBSbatCommonDBInterface();
//		paramList.setValue(inMap.getString(JBSbatKKIFE480.CUST_ID));
//		paramList.setValue(super.opeDate);
//		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[L][executeKK_T_SVC_KEI_KK_SELECT_023][paramList=" + paramList.getList().toString() + "]");		
//
//		// DBアクセスを実行します
//		db_KK_T_SVC_KEI.selectBySqlDefine(paramList, KK_T_SVC_KEI_KK_SELECT_023);
//	}
	// ANK-4208-02-00 DEL END
	/**
	 * SQLKEY(KK_SELECT_023)でDBアクセスを行います。<br>
	 * <p>
	 * <b>処理フロー</b><br>
	 * <pre>
	 * 1.引数でバイント変数を設定します。<br>
	 *
	 * 2.DBアクセスを実行します。<br>
	 * 
	 * 3.メソッドの呼び出し方です。<br>
	 *		引数:
	 *		param:順にバイント変数の値をparam配列に入れます。バイント変数は以下に説明します。
	 *		 	請求契約番号
	 *		 	予約適用年月日
	 * </pre>
	 * <p>
	 * @param param バイント変数の値配列。
	 * @throws Exception 業務サービス内で発生した例外全般。
	 */
	private void executeCK_T_CUST_KK_SELECT_002(JBSbatServiceInterfaceMap inMap, String sysid) throws Exception
	{
		// バイント変数のリストを生成します
		JBSbatCommonDBInterface paramList = new JBSbatCommonDBInterface();
		paramList.setValue(sysid);
		paramList.setValue(super.opeDate);
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[L][executeCK_T_CUST_KK_SELECT_002][paramList=" + paramList.getList().toString() + "]");		

		// DBアクセスを実行します
		db_CK_T_CUST.selectBySqlDefine(paramList, CK_T_CUST_KK_SELECT_002);
	}
	
	/**
	 * 電子マネーギフトコード発行結果メール送信サービスを呼出します。
	 * 
	 * 
	 * @param inMap
	 * @param convArray 
	 * @param sendMladList 
	 * @param convArray 
	 * @throws Exception 
	 */
	private void callMailSendService(JBSbatServiceInterfaceMap inMap, String mlad, String[] convArray) throws Exception
	{
		HashMap<String, Object> paramMap = new HashMap<String, Object>();
		
		// ユースケースIDを格納
		paramMap.put(JCCBatchEsbInterface.TELEGRAM_INFO_USECASE_ID, USECASE_ID_KKSV0996);
		paramMap.put(JCCBatchEsbInterface.TELEGRAM_INFO_OPERATION_ID, OPERATION_ID_KKSV0996);
		
		// 入力電文からパラメータを取得する
		// サービスの処理用のパラメータ設定
		HashMap<String, Object> inputMap = new HashMap<String, Object>();
		
		HashMap<String, Object> ccMap = new HashMap<String, Object>();
		
		ArrayList<HashMap> ecc0021D010List1 = new ArrayList<HashMap>();
		ArrayList<HashMap> ecc0021D010List2 = new ArrayList<HashMap>();
		ArrayList<HashMap> ecc0021D010List3 = new ArrayList<HashMap>();
		ArrayList<HashMap> ecc0021D010List4 = new ArrayList<HashMap>();
		ArrayList<HashMap> ecc0021D010List5 = new ArrayList<HashMap>();
		
		// 処理コード
		ccMap.put("func_code", "1");
		// メールコード
		ccMap.put("mail_cd", MAIL_CD_GIFTCD_HK_RELS_TCH);
		// メール送信パターンコード　01:リアルタイム
		ccMap.put("mail_send_pattern_cd", "01");
		
		// 01.メールアドレスを設定する
		HashMap list1Map = new HashMap();
		// メールアドレス
		list1Map.put("mlad", mlad);
		// メール設定フィールドコード　01:to
		list1Map.put("mlad_set_field_cd", "01");
		ecc0021D010List1.add(list1Map);
		
		ccMap.put("ECC0021D010CBSMsg1List", ecc0021D010List1);

		// 02.置換文字を設定する。
		HashMap list2Map = new HashMap();
		// メール本文の置換文字列にお客様名を設定
		list2Map.put("text_htk_ckam_moji", convArray[0]);
		ecc0021D010List2.add(list2Map);

		ccMap.put("ECC0021D010CBSMsg2List", ecc0021D010List2);

		// その他の設定
		ccMap.put("ECC0021D010CBSMsg3List", ecc0021D010List3);
		ccMap.put("ECC0021D010CBSMsg4List", ecc0021D010List4);
		ccMap.put("ECC0021D010CBSMsg5List", ecc0021D010List5);

		inputMap.put(MAPPING_ID_01, ccMap);
		
		// サービスの処理結果の格納用MAP
		HashMap<String, Object> outputMap = new HashMap<String, Object>();

		JCCBatchEsbInterface.invokeService(super.commonItem, paramMap, inputMap, outputMap);
		
		String returnCode = JCCBatchEsbInterface.getReturnCode(outputMap);
		if(!RETURN_CODE_SUCCESS.equals(returnCode))
		{
			//サービスがエラーを返した場合
			StringBuffer err_msg = new StringBuffer();
			// v57.00.02 ANK-4208-00-00 MOD START
//			err_msg.append("メールが送信できませんでした。" + "サービス契約番号 : " +  "ステータスコード ：" + returnCode);
			err_msg.append("メールが送信できませんでした。" + "サービス契約番号 : " + inMap.getString(JBSbatKKIFE480.CUST_ID) +  " ステータスコード ：" + returnCode);
			// v57.00.02 ANK-4208-00-00 MOD END
			super.logPrint.printBusinessErrorLog("EKKB1220CI", 
					new String[]{ err_msg.toString() });
			return;
		}
	}
}
