/*********************************************************************
* All Rights reserved,Copyright (c) K-Opticom
**********************************************************************
*＜プログラム内容＞
*	システム名			：eo顧客基幹システム
*	モジュール名		：JBSbatKKFauthoriRsltListSaksei
*	ソースファイル名	：JBSbatKKFauthoriRsltListSaksei.java
*	作成者				：富士通　
*	作成日				：2011年07月07日
*＜機能概要＞
*　初回オーソリ結果リスト作成部品です。
*＜修正履歴＞
*	バージョン	修正日		修正者		修正内容
*	v1.00.00	2011/07/07  FJ)倉上		新規作成
*	v4.00.00	2013/03/08  FJ)団		【ST1-2013-0000469】クレジットカード番号暗号化
*	v4.01.00	2013/03/25  FJ)神田		【IT1-2013-0000498】障害対応
*	v5.00.00	2013/08/24  FJ)中作		【OM-2013-0000837】障害対応
*	v5.00.01	2014/06/17  FJ)古内		【TAI-2014-0000014】右肩上がり性能改善
*  v20.00.00	2015/11/11	FJ)笠川		【ANK-2565-00-00】クレジットオーソリ処理結果対象抽出
*  v37.00.00	2018/05/30  FJ)森脇     【OM-2018-0000424】クレジットカードスキーマ不要参照
*********************************************************************/
package eo.business.service;

import java.io.IOException;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collection;
import java.util.Collections;
import java.util.Comparator;
import java.util.HashMap;

import eo.business.common.JBSbatBusinessService;
import eo.business.common.JBSbatInterface;
import eo.business.common.JCCBatCommon;
import eo.business.util.file.JBSbatKKIFE069;
import eo.business.util.file.JBSbatKKIFM033;
import eo.business.util.file.JBSbatKKIFM619;
import eo.business.util.table.JBSbatKK_M_CRECARD_COMP;
import eo.business.util.table.JBSbatKK_T_KAKINS;
import eo.business.util.table.JBSbatKK_T_SEIKY_KEI;
import eo.common.util.JKKCommonUtil;
import eo.framework.application.JBSbatBusinessException;
import eo.framework.db.JBSbatSQLAccess;
import eo.framework.item.JBSbatCommonDBInterface;
import eo.framework.item.JBSbatCommonItem;
import eo.framework.item.JBSbatOutputItem;
import eo.framework.item.JBSbatServiceInterfaceMap;
import eo.framework.util.JBSbatDateUtil;
import eo.framework.util.JBSbatStringUtil;

/**
* (クラスの機能概要) <p>
*<BR>
* @author 富士通
*/
public class JBSbatKKFauthoriRsltListSaksei extends JBSbatBusinessService
{
	/**▼▼▼▼▼▼ツールから生成した宣言です 開始▼▼▼▼▼▼*/
	/** テーブル(請求契約)*/
	private static final String D_TBL_NAME_KK_T_SEIKY_KEI = "KK_T_SEIKY_KEI";

	/** テーブル(課金先)*/
	private static final String D_TBL_NAME_KK_T_KAKINS = "KK_T_KAKINS";

	/** SQL定義キー(KK_SELECT_015)*/
	private static final String KK_T_SEIKY_KEI_KK_SELECT_015 = "KK_SELECT_015";

	/** SQL定義キー(KK_SELECT_011)*/
	private static final String KK_T_KAKINS_KK_SELECT_011 = "KK_SELECT_011";

	/** テーブルアクセスクラス(請求契約)*/
	private JBSbatSQLAccess db_KK_T_SEIKY_KEI = null;

	/** テーブルアクセスクラス(課金先)*/
	private JBSbatSQLAccess db_KK_T_KAKINS = null;
	
// ++++++++++++++++ TAI-2014-0000014 追加開始 ++++++++++++++++
	/** テーブル(クレジットカード会社)*/
	private static final String D_TBL_NAME_KK_M_CRECARD_COMP = "KK_M_CRECARD_COMP";

	/** SQL定義キー(KK_SELECT_008)*/
	private static final String KK_M_CRECARD_COMP_KK_SELECT_008 = "KK_SELECT_008";
	
	/** テーブルアクセスクラス(クレジットカード会社)*/
	private JBSbatSQLAccess db_KK_M_CRECARD_COMP = null;
// ++++++++++++++++ TAI-2014-0000014 追加終了 ++++++++++++++++
	/**▲▲▲▲▲▲ツールから生成した宣言です 終了▲▲▲▲▲▲*/
	
	/** コロン */
	private static final String KORON = ":";
	
	/** 異動区分(新規契約) */
	private static final String IDO_DIV_00001 = "00001";
	
	/** 異動区分(サービス追加) */
	private static final String IDO_DIV_00002 = "00002";
	
	/** 異動区分(請求先変更) */
	private static final String IDO_DIV_00015 = "00015";
	
	/** 異動区分(請求先分割) */
	private static final String IDO_DIV_00017 = "00017";
	
	/** 初回オーソリ取消 */
	private static final String FAUTHORI_CL = "1";
	
	/** 支払審査結果(新契) */
	private static final String PAY_JDG_RSLT1 = "新契";
	
	/** 支払審査結果(サ追) */
	private static final String PAY_JDG_RSLT2 = "サ追";
	
	/** 支払審査結果(支変) */
	private static final String PAY_JDG_RSLT3 = "支変";
	
	/** 支払審査結果(取消) */
	private static final String PAY_JDG_RSLT4 = "取消";

	/** 有効期限変更有無(変更あり) */
	private static final String YK_KIGEN_CHG_U = "1";
	
	/** 初回オーソリフラグ(有効) */
	private static final String FAUTHORI_FLG_YK = "1";

	/** 審査結果(OK) */
	private static final String SHINSA_KEKKA_OK = "OK";
	
	/** 審査結果(NG) */
	private static final String SHINSA_KEKKA_NG = "NG";
	
	/** 空白*/
	private static final String SPACE = "";
	
	/** クレジット初回オーソリデータ件数*/
	int data_cnt = 0;
	
// ++++++++++++++++ TAI-2014-0000014 追加開始 ++++++++++++++++
	/** */
	private static HashMap<String, String> crecardMstCashe = null;
	
	private ArrayList<JBSbatServiceInterfaceMap> kkl005List = new ArrayList<JBSbatServiceInterfaceMap>();
	
	private String judge_time = "";
// ++++++++++++++++ TAI-2014-0000014 追加終了 ++++++++++++++++
	
	/**
	 * 初期処理
	 * @param JBSbatCommonItem commonItem　バッチ共通パラメータ電文
	 * @throws Exception
	 */
	public void initial(JBSbatCommonItem commonItem) throws Exception
	{
	/**▼▼▼▼▼▼業務サービスの初期処理を記述してください。▼▼▼▼▼▼*/
		/**▼▼▼▼▼▼ツールから生成した初期化のソースです 開始▼▼▼▼▼▼*/
		// 共通パラメータを設定します
		super.setCommonInfo(commonItem);

		// DBアクセスクラスを生成します
		db_KK_T_SEIKY_KEI = new JBSbatSQLAccess(commonItem, D_TBL_NAME_KK_T_SEIKY_KEI);
		db_KK_T_KAKINS = new JBSbatSQLAccess(commonItem, D_TBL_NAME_KK_T_KAKINS);
// ++++++++++++++++ TAI-2014-0000014 追加開始 ++++++++++++++++
		db_KK_M_CRECARD_COMP = new JBSbatSQLAccess(commonItem, D_TBL_NAME_KK_M_CRECARD_COMP);
// ++++++++++++++++ TAI-2014-0000014 追加終了 ++++++++++++++++
		/**▲▲▲▲▲▲ツールから生成した初期化のソースです 終了▲▲▲▲▲▲*/
		
// ++++++++++++++++ TAI-2014-0000014 追加開始 ++++++++++++++++
		executeKK_M_CRECARD_COMP_KK_SELECT_008(new Object[]{super.opeDate,super.opeDate});
		JBSbatCommonDBInterface out_map = null;
		crecardMstCashe = new HashMap<String, String>();
		while ((out_map = db_KK_M_CRECARD_COMP.selectNext()) != null)
		{
			crecardMstCashe.put(JBSbatStringUtil.Rtrim(out_map.getString(JBSbatKK_M_CRECARD_COMP.CRECARD_COMP_CD)), 
					            JBSbatStringUtil.Rtrim(out_map.getString(JBSbatKK_M_CRECARD_COMP.CRECARD_COMP_ALI)));
		}
// ++++++++++++++++ TAI-2014-0000014 追加終了 ++++++++++++++++
		
		// 審査時間を取得します。
		judge_time = getJudgeTime();
		
	/**▲▲▲▲▲▲業務サービスの初期処理を記述してください。▲▲▲▲▲▲*/
	}

	/**
	 * 主処理
	 * @param inMap　入力電文
	 * @return JBSbatOutputItem　出力情報
	 * @throws Exception
	 */
	public JBSbatOutputItem execute(JBSbatServiceInterfaceMap inMap) throws Exception
	{
	/**▼▼▼▼▼▼業務サービスの主処理を記述してください。▼▼▼▼▼▼*/
		
		super.logPrint.printDebugLog("execute_START");
		
		// 出力共通電文を生成する。
		JBSbatOutputItem outputBean = new JBSbatOutputItem();
		
		// クレジットオーソリ処理結果リストを設定します。
		JBSbatServiceInterfaceMap outmap = setCrecardAuthFile(inMap);
// ++++++++++++++++ TAI-2014-0000014 変更開始 ++++++++++++++++
		if (outmap == null)
		{
			// 最終行である場合、データのソートを行う。
			if (super.commonItem.isEndRecordFlg())
			{
				processLastRecord(outputBean);
				return outputBean;
			}
			return null;
		}
// ++++++++++++++++ TAI-2014-0000014 変更終了 ++++++++++++++++
		
		// クレジットオーソリ処理結果リストを設定します。
		JBSbatServiceInterfaceMap outmap1 = setCrecardAuthUpdateFile(inMap);
		
		//出力フラグを設定
		outmap.setOutFlg(true);
		//出力共通電文に入出力インターフェースを設定する。
		kkl005List.add(outmap);
		
		//出力フラグを設定
		outmap1.setOutFlg(true);
		//出力共通電文に入出力インターフェースを設定する。
		outputBean.addOutMapList_2(outmap1);
		
// ++++++++++++++++ TAI-2014-0000014 変更開始 ++++++++++++++++
		// 最終行である場合、データのソートを行う。
		if (super.commonItem.isEndRecordFlg())
		{
			if (super.commonItem.isEndRecordFlg())
			{
				processLastRecord(outputBean);
			}
		}
// ++++++++++++++++ TAI-2014-0000014 変更終了 ++++++++++++++++
		
		super.logPrint.printDebugLog("execute_END");
		
		return outputBean;
	/**▲▲▲▲▲▲業務サービスの主処理を記述してください。▲▲▲▲▲▲*/
	}
	
	/**
	 * 業務サービス終了処理
	 * @throws Exception
	 */
	public void terminal() throws Exception
	{
	/**▼▼▼▼▼▼業務サービスの終了処理を記述してください。▼▼▼▼▼▼*/
		/**▼▼▼▼▼▼ツールから生成した終了処理のソースです 開始▼▼▼▼▼▼*/

		// DBアクセスクラスをクローズします
		db_KK_T_SEIKY_KEI.close();
		db_KK_T_KAKINS.close();
// ++++++++++++++++ TAI-2014-0000014 追加開始 ++++++++++++++++
		db_KK_M_CRECARD_COMP.close();
// ++++++++++++++++ TAI-2014-0000014 追加終了 ++++++++++++++++
		/**▲▲▲▲▲▲ツールから生成した終了処理のソースです 終了▲▲▲▲▲▲*/
	/**▲▲▲▲▲▲業務サービスの終了処理を記述してください。▲▲▲▲▲▲*/
	}

	/**
	 * SQLKEY(KK_SELECT_015)で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_SEIKY_KEI_KK_SELECT_015(Object[] param) throws Exception
	{
		// バイント変数のリストを生成します
		JBSbatCommonDBInterface paramList = new JBSbatCommonDBInterface();
		paramList.setValue(param[0].toString());
		paramList.setValue(param[1].toString());
		// OM-2018-0000424 DEL START
//		paramList.setValue(param[2].toString());
//		paramList.setValue(param[3].toString());
		// OM-2018-0000424 DEL END

		// DBアクセスを実行します
		db_KK_T_SEIKY_KEI.selectBySqlDefine(paramList, KK_T_SEIKY_KEI_KK_SELECT_015);
	}

	/**
	 * SQLKEY(KK_SELECT_011)でDBアクセスを行います。<br>
	 * <p>
	 * <b>処理フロー</b><br>
	 * <pre>
	 * 1.引数でバイント変数を設定します。<br>
	 *
	 * 2.DBアクセスを実行します。<br>
	 * 
	 * 3.メソッドの呼び出し方です。<br>
	 *		引数:
	 *		param:順にバイント変数の値をparam配列に入れます。バイント変数は以下に説明します。
	 *		 	RSV_APLY_YMD
	 *		 	SEIKY_KEI_NO
	 * </pre>
	 * <p>
	 * @param param バイント変数の値配列。
	 * @throws Exception 業務サービス内で発生した例外全般。
	 */
	private void executeKK_T_KAKINS_KK_SELECT_011(Object[] param) throws Exception
	{
		// バイント変数のリストを生成します
		JBSbatCommonDBInterface paramList = new JBSbatCommonDBInterface();
		paramList.setValue(param[0].toString());
		paramList.setValue(param[1].toString());
		
		// DBアクセスを実行します
		db_KK_T_KAKINS.selectBySqlDefine(paramList, KK_T_KAKINS_KK_SELECT_011);
	}

	/**
	 * SQLKEY(KK_SELECT_008)でDBアクセスを行います。<br>
	 * <p>
	 * <b>処理フロー</b><br>
	 * <pre>
	 * 1.引数でバイント変数を設定します。<br>
	 *
	 * 2.DBアクセスを実行します。<br>
	 * 
	 * 3.メソッドの呼び出し方です。<br>
	 *		引数:
	 *		param:順にバイント変数の値をparam配列に入れます。バイント変数は以下に説明します。
	 *		 	RSV_APLY_YMD
	 *		 	SEIKY_KEI_NO
	 * </pre>
	 * <p>
	 * @param param バイント変数の値配列。
	 * @throws Exception 業務サービス内で発生した例外全般。
	 */
	private void executeKK_M_CRECARD_COMP_KK_SELECT_008(Object[] param) throws Exception
	{
		// バイント変数のリストを生成します
		JBSbatCommonDBInterface paramList = new JBSbatCommonDBInterface();
		paramList.setValue(param[0].toString());
		paramList.setValue(param[1].toString());
		
		// DBアクセスを実行します
		db_KK_M_CRECARD_COMP.selectBySqlDefine(paramList, KK_M_CRECARD_COMP_KK_SELECT_008);
	}
	/**▲▲▲▲▲▲ツールから生成したメソッドです 終了▲▲▲▲▲▲*/
	
	/**
	 * 審査時間を取得します。<br>
	 * <p>
	 * @return judge_time システム時刻(HH:MM:SS)
	 * @throws Exception 業務サービス内で発生した例外全般。
	 * @throws IOException 
	 */	
	private String getJudgeTime() throws Exception
	{
		String judge_time = "";
		
		// システム日付を取得
		String syste_date = JBSbatDateUtil.getSystemDateTime();
		// 時、分、秒に分割します。
		String hour   = syste_date.substring(8, 10);
		String minute = syste_date.substring(10, 12);
		String second = syste_date.substring(12, 14);
		
		judge_time = hour + KORON + minute + KORON + second;
		
		return judge_time;
	}
	
	/**
	 * 支払審査結果取得を実施します。<br>
	 * <p>
	 * @param ido_div 異動区分
	 * @param cl_cd 取消コード
	 * @return rslt_nyo 支払審査結果
	 * @throws JBSbatBusinessException 
	 * @throws IOException 業務サービス内で発生した例外全般。
	 */	
	private String getPaySkekka(String ido_div, String cl_cd) throws JBSbatBusinessException
	{
		String rslt_nyo = "";	// 結果内容
		
		// 異動区分が「新規契約」の場合
		if (IDO_DIV_00001.equals(ido_div))
		{
			rslt_nyo = PAY_JDG_RSLT1;
		}
		
		// 異動区分が「サービス追加」の場合
		else if (IDO_DIV_00002.equals(ido_div))
		{
			rslt_nyo = PAY_JDG_RSLT2;
		}
		
		// 異動区分が「請求先変更」または「請求先分割」の場合
		else if (IDO_DIV_00015.equals(ido_div) || IDO_DIV_00017.equals(ido_div))
		{
			rslt_nyo = PAY_JDG_RSLT3;
		}
		
		// 取消コードが「取消」の場合
		else if (FAUTHORI_CL.equals(cl_cd))
		{
			rslt_nyo = PAY_JDG_RSLT4;
		}
		else
		{
			rslt_nyo = "";
		}
		
		return rslt_nyo;
	}
	
	/**
	 * サービス契約番号を取得します。<br>
	 * <p>
	 * @param seiky_kei_no 請求契約番号
	 * @return svc_kei_no サービス契約番号
	 * @throws Exception 業務サービス内で発生した例外全般。
	 * @throws IOException 
	 */	
	private String getSvkeiNo(String seiky_kei_no) throws Exception
	{
		String svc_kei_no = "";
		
		// サービス契約番号を取得します。
		Object[] param = new Object[]{super.opeDate, seiky_kei_no};
		
		// 検索実行。
		executeKK_T_KAKINS_KK_SELECT_011(param);
		
		JBSbatCommonDBInterface out_map = db_KK_T_KAKINS.selectNext();
		
		// 検索結果の判断
		if (out_map != null)
		{
			svc_kei_no = JBSbatStringUtil.Rtrim(out_map.getString(JBSbatKK_T_KAKINS.SVC_KEI_NO));
		}
		
		return svc_kei_no;
	}

	/**
	 * 請求契約、クレジット情報を取得します。<br>
	 * <p>
	 * @param outmap 出力ファイル情報
	 * @param seiky_kei_no 請求契約番号
	 * @param seikykei_gene_add_dtm 請求契約世代登録年月日時分秒
	 * @param seikyway_no_crecard 請求方法番号(クレジットカード) 
	 * @param crecard_gene_add_dtm クレジットカード世代登録年月日時分秒
	 * @return JBSbatCommonDBInterface 検索結果情報
	 * @throws Exception 業務サービス内で発生した例外全般。
	 */	
	private boolean getSeikyKeiInfo(JBSbatServiceInterfaceMap outmap, String seikyway_no_crecard, String crecard_gene_add_dtm,
			String seiky_kei_no, String seikykei_gene_add_dtm, String cl_cd) throws Exception
	{
		// 異動区分
		String ido_div = "";
		
		// サービス契約番号を取得します。
		// OM-2018-0000424 MOD START
//		Object[] param = new Object[]{seikyway_no_crecard, crecard_gene_add_dtm, seiky_kei_no, seikykei_gene_add_dtm};
		Object[] param = new Object[]{seiky_kei_no, seikykei_gene_add_dtm};
		// OM-2018-0000424 MOD END
		
		executeKK_T_SEIKY_KEI_KK_SELECT_015(param);
		
		JBSbatCommonDBInterface out_map = db_KK_T_SEIKY_KEI.selectNext();
		
		if (out_map != null)
		{
			// 送付先名の取得
			String sohusNm = 
				JBSbatInterface.charConverter(JBSbatStringUtil.Rtrim(out_map.getString(JBSbatKK_T_SEIKY_KEI.SOHUS_NM)));
			
			if (!"".equals(sohusNm))
			{
				if(30 < sohusNm.length())
				{
					sohusNm = sohusNm.substring(0, 30);
				}
			}
			
			// 送付先名の取得
			outmap.setString(JBSbatKKIFE069.SOHUS_NM, sohusNm);
			
			// 送付先電話番号
			outmap.setString(JBSbatKKIFE069.SHS_TEL_NO, JBSbatStringUtil.Rtrim(out_map.getString(JBSbatKK_T_SEIKY_KEI.SOHUS_TELNO)));
			
			// 異動区分取得
			ido_div = JBSbatStringUtil.Rtrim(out_map.getString(JBSbatKK_T_SEIKY_KEI.IDO_DIV));
			
			// 結果内容
			outmap.setString(JBSbatKKIFE069.RSLT_NYO, getPaySkekka(ido_div, cl_cd));
		}
		else
		{
			return false;
		}
		return true;
	}
	
	/**
	 * クレジットオーソリ処理結果リストを設定します。<br>
	 * <p>
	 * @param inMap クレジットオーソリ実績情報
	 * @return JBSbatServiceInterfaceMap 検索結果情報
	 * @throws Exception 業務サービス内で発生した例外全般。
	 */	
	private JBSbatServiceInterfaceMap setCrecardAuthFile(JBSbatServiceInterfaceMap inMap) throws Exception
	{
		//入出力インターフェースオブジェクトを生成(結果ファイル用)
		JBSbatServiceInterfaceMap outmap = new JBSbatServiceInterfaceMap();
		
		String crecardDecrypt = "";			// クレジットカード番号(復号化)
		String crecardNoEncrypt = "";		// クレジットカード番号（暗号化）
		
		// 請求契約番号の取得
		String seiky_kei_no = JBSbatStringUtil.Rtrim(inMap.getString(JBSbatKKIFM619.SEIKY_KEI_NO));
		// 請求契約世代登録年月日時分秒の取得
		String seikykei_gene_add_dtm = JBSbatStringUtil.Rtrim(inMap.getString(JBSbatKKIFM619.SEIKY_KEI_GENE_ADD_DTM));
		// 請求方法番号(クレジットカード)の取得
		String seikyway_no_crecard = JBSbatStringUtil.Rtrim(inMap.getString(JBSbatKKIFM619.SEIKY_WAY_NO_CRECARD));
		// クレジットカード世代登録年月日時分秒の取得
		String crecard_gene_add_dtm = JBSbatStringUtil.Rtrim(inMap.getString(JBSbatKKIFM619.CRECARD_GENE_ADD_DTM));
		// クレジットカード番号の取得
		String crecard_no = JBSbatStringUtil.Rtrim(inMap.getString(JBSbatKKIFM619.CRECARD_NO));
// ++++++++++++++++ ANK-2565-00-00 add start ++++++++++++++++
		// クレジットカード預かりIDの取得
		String crecard_azkri_id = JBSbatStringUtil.Rtrim(inMap.getString(JBSbatKKIFM619.CRECARD_NO_AZKRI_ID));
// ++++++++++++++++ ANK-2565-00-00 add end ++++++++++++++++
		// クレジットカード有効期限の取得
		String crecard_yk_kigen = JBSbatStringUtil.Rtrim(inMap.getString(JBSbatKKIFM619.CRECARD_YK_KIGEN));
		// 有効期限変更有無の取得
		String yk_kigen_chg_um = JBSbatStringUtil.Rtrim(inMap.getString(JBSbatKKIFM619.YK_KIGEN_CHG_UM));
		// オーソリフラグの取得
		String auth_flg = JBSbatStringUtil.Rtrim(inMap.getString(JBSbatKKIFM619.AUTH_FLG));
		// オーソリ承認番号の取得
		String authori_shonun_no = JBSbatStringUtil.Rtrim(inMap.getString(JBSbatKKIFM619.AUTHORI_SHONIN_NO));
		// 取消コードの取得
		String cl_cd = JBSbatStringUtil.Rtrim(inMap.getString(JBSbatKKIFM619.CL_CD));

// ++++++++++++++++ TAI-2014-0000014 変更開始 ++++++++++++++++
// 抽出にて取得しないようにするため、この箇所で取得する。
		//クレジットカード会社略称の取得
//		String crecardCompAli = JBSbatInterface.charConverter(
//				JBSbatStringUtil.Rtrim(inMap.getString(JBSbatKK_M_CRECARD_COMP.CRECARD_COMP_ALI)));
		String crecardCompAliStr = crecardMstCashe.get(inMap.getString(JBSbatKKIFM619.CRECARD_COMP_CD));
		// データが取得出来ない場合は、当レコードをスキップ
		if (crecardCompAliStr == null)
		{
			return null;
		}
		String crecardCompAli = JBSbatInterface.charConverter(crecardCompAliStr);
		
		if(20 < crecardCompAli.length())
		{
			crecardCompAli = crecardCompAli.substring(0, 20);
		}
// ++++++++++++++++ TAI-2014-0000014 変更終了 ++++++++++++++++
		
		
		super.logPrint.printDebugLog("請求方法番号(クレジットカード):::" + seikyway_no_crecard);
		super.logPrint.printDebugLog("クレジットカード世代登録年月日時分秒:::" + crecard_gene_add_dtm);
		super.logPrint.printDebugLog("請求契約番号:::" + seiky_kei_no);
		super.logPrint.printDebugLog("請求契約世代登録年月日時分秒:::" + seikykei_gene_add_dtm);
		
		// 請求契約、クレジットカード情報を取得します。
		if (!getSeikyKeiInfo(outmap, seikyway_no_crecard, crecard_gene_add_dtm, seiky_kei_no, seikykei_gene_add_dtm, cl_cd))
		{
			return null;
		}
		
		//項目を設定
		outmap.setString(JBSbatKKIFE069.JDG_TIME, judge_time);						// 審査時間
		
		// 有効期限変更有無が「変更有り」かつオーソリフラグが「有効」
		// かつ承認番号が設定されている場合
		if (YK_KIGEN_CHG_U.equals(yk_kigen_chg_um) && FAUTHORI_FLG_YK.equals(auth_flg)
				&& (authori_shonun_no != null && !"".equals(authori_shonun_no)))
		{
			outmap.setString(JBSbatKKIFE069.HIDUKE_GYAKUTEN, "*");					// 日付逆転
		}
		else
		{
			outmap.setString(JBSbatKKIFE069.HIDUKE_GYAKUTEN, SPACE);				// 日付逆転
		}
		
		// 初回オーソリフラグが「有効」の場合
		if (FAUTHORI_FLG_YK.equals(auth_flg))
		{
			outmap.setString(JBSbatKKIFE069.SHINSA_KEKKA, SHINSA_KEKKA_OK);
		}
		else
		{
			outmap.setString(JBSbatKKIFE069.SHINSA_KEKKA, SHINSA_KEKKA_NG);
		}
		
		outmap.setString(JBSbatKKIFE069.CRECARD_COMP_ALI, crecardCompAli);		// 	カード種類 
		
		super.logPrint.printDebugLog("請求契約世代登録年月日時分秒:::" + seikykei_gene_add_dtm);
// ++++++++++++++++ ANK-2565-00-00 add start ++++++++++++++++
		if(crecard_no == null || "".equals(crecard_no))
		{
			outmap.setString(JBSbatKKIFE069.CRECARD_NO, "");	
		}
		else
		{
		// クレジットカード番号の複合化を行う。（クレジットカード番号が暗号化されている前提）
		crecardDecrypt = JCCBatCommon.getDecryptResult(commonItem, crecard_no);
		//クレジットカード番号の下4桁を抽出する。
		crecardDecrypt = crecardDecrypt.substring(crecardDecrypt.length() -4,crecardDecrypt.length());
		// クレジットカード番号の暗号化を行う。
		crecardNoEncrypt = JCCBatCommon.getEncryptResultPassword(crecardDecrypt);
		outmap.setString(JBSbatKKIFE069.CRECARD_NO, crecardNoEncrypt);				// カード番号
		}
		outmap.setString(JBSbatKKIFE069.CRECARD_NO_AZKRI_ID, crecard_azkri_id);		// クレジットカード預かりID
// ++++++++++++++++ ANK-2565-00-00 add end ++++++++++++++++
		outmap.setString(JBSbatKKIFE069.SEIKY_KEI_NO, seiky_kei_no);				// 請求契約番号
		outmap.setString(JBSbatKKIFE069.SVC_KEI_NO, getSvkeiNo(seiky_kei_no));		// サービス契約番号
		
		// 有効期限変更有無が変更の場合
		if (YK_KIGEN_CHG_U.equals(yk_kigen_chg_um))
		{
			
			String mmYY = "";
			if (!"".equals(crecard_yk_kigen))
			{
				mmYY = crecard_yk_kigen;
			}
			
			// クレジットカード有効期限
			if(6 <= crecard_yk_kigen.length() && 6 <= mmYY.length())
			{
				// 備考
				outmap.setString(JBSbatKKIFE069.BIKO, mmYY.substring(2, 4) + "/" + mmYY.substring(4, 6)
					+ "→" + crecard_yk_kigen.substring(4, 6) + "/" + crecard_yk_kigen.substring(2, 4));
			}
		}
		return outmap;
	}
	
	/**
	 * クレジットオーソリ処理結果リストを設定します。<br>
	 * <p>
	 * @param inMap クレジットオーソリ実績情報
	 * @return JBSbatServiceInterfaceMap 検索結果情報
	 * @throws Exception 業務サービス内で発生した例外全般。
	 */	
	private JBSbatServiceInterfaceMap setCrecardAuthUpdateFile(JBSbatServiceInterfaceMap inMap) throws Exception
	{
		//入出力インターフェースオブジェクトを生成(結果ファイル用)
		JBSbatServiceInterfaceMap outmap = new JBSbatServiceInterfaceMap();
		
		// クレジットオーソリ実績番号の取得
		String crecard_auth_jsk_no = JBSbatStringUtil.Rtrim(inMap.getString(JBSbatKKIFM619.CREDIT_AUTH_JSK_NO));
		// 世代登録年月日時分秒の取得
		String gene_add_dtm = JBSbatStringUtil.Rtrim(inMap.getString(JBSbatKKIFM619.GENE_ADD_DTM));
		
		// クレジットオーソリ実績番号設定
		outmap.setString(JBSbatKKIFM033.CREDIT_AUTH_JSK_NO, crecard_auth_jsk_no);
		// 世代登録年月日時分秒
		outmap.setString(JBSbatKKIFM033.GENE_ADD_DTM, gene_add_dtm);

		return outmap;
	}
	
// ++++++++++++++++ TAI-2014-0000014 変更開始 ++++++++++++++++
	/**
	 * 最終行の場合に、データのソートを行う。
	 * 
	 */
	private void processLastRecord(JBSbatOutputItem outputBean) throws Exception
	{
		// KKL00501のソート
		// KKIFE069のソートを行う。
		// ソート順は、カード種別、カード預かりID、請求契約番号、サービス契約番号とする。
		Collections.sort(kkl005List, new Comparator<JBSbatServiceInterfaceMap>() {
			@Override
			public int compare(JBSbatServiceInterfaceMap map1, JBSbatServiceInterfaceMap map2) {
				try
				{
					String cardComp1 = JBSbatStringUtil.Rtrim(map1.getString(JBSbatKKIFE069.CRECARD_COMP_ALI));
					String cardComp2 = JBSbatStringUtil.Rtrim(map2.getString(JBSbatKKIFE069.CRECARD_COMP_ALI));
					if (!cardComp1.equals(cardComp2))
					{
						return JKKCommonUtil.convertHalf(cardComp1).compareTo(JKKCommonUtil.convertHalf(cardComp2));
					}
// ++++++++++++++++ ANK-2565-00-00 mod start ++++++++++++++++
//					String cardNo1 = JBSbatStringUtil.Rtrim(map1.getString(JBSbatKKIFE069.CRECARD_NO));
//					String cardNo2 = JBSbatStringUtil.Rtrim(map2.getString(JBSbatKKIFE069.CRECARD_NO));
//					if (!cardNo1.equals(cardNo2))
//					{
//						return cardNo1.compareTo(cardNo2);
//					}
					String cardNoAzkriId1 = JBSbatStringUtil.Rtrim(map1.getString(JBSbatKKIFE069.CRECARD_NO_AZKRI_ID));
					String cardNoAzkriId2 = JBSbatStringUtil.Rtrim(map2.getString(JBSbatKKIFE069.CRECARD_NO_AZKRI_ID));
					if (!cardNoAzkriId1.equals(cardNoAzkriId2))
					{
						return cardNoAzkriId1.compareTo(cardNoAzkriId2);
					}
// ++++++++++++++++ ANK-2565-00-00 mod end ++++++++++++++++
					String seikyKeiNo1 = JBSbatStringUtil.Rtrim(map1.getString(JBSbatKKIFE069.SEIKY_KEI_NO));
					String seikyKeiNo2 = JBSbatStringUtil.Rtrim(map2.getString(JBSbatKKIFE069.SEIKY_KEI_NO));
					if (!seikyKeiNo1.equals(seikyKeiNo2))
					{
						return seikyKeiNo1.compareTo(seikyKeiNo2);
					}
					String svcKeiNo1 = JBSbatStringUtil.Rtrim(map1.getString(JBSbatKKIFE069.SVC_KEI_NO));
					String svcKeiNo2 = JBSbatStringUtil.Rtrim(map2.getString(JBSbatKKIFE069.SVC_KEI_NO));
					if (!svcKeiNo1.equals(svcKeiNo2))
					{
						return svcKeiNo1.compareTo(svcKeiNo2);
					}
					return 0;
				} 
				catch (Exception ex)
				{
					// 発生しない
					ex.printStackTrace();
				}
				return 0;
			}
		});
		
		for (JBSbatServiceInterfaceMap map : kkl005List)
		{
			outputBean.addOutMapList(map);
		}
	}
	// ++++++++++++++++ TAI-2014-0000014 変更終了 ++++++++++++++++
}
