/*********************************************************************
*	All Rights reserved,Copyright (c) K-Opticom
**********************************************************************
*＜プログラム内容＞
*	システム名		：eo顧客基幹システム
*	モジュール名	：JKKBatNumberParts
*	ソースファイル名：JKKBatNumberParts.java
*	作成者			：富士通
*	日付			：2012年10月05日
*＜機能概要＞
*	採番処理部品クラスです。
*＜修正履歴＞
*	バージョン	修正日		修正者		修正内容
*	v1.00.00	2012/10/05	富士通		新規作成
*	v23.00.00	2016/04/18	FJ)藤本		【ANK-2783-00-00】お客さまＩＤ重複障害対応：採番ロジック見直し
*
**********************************************************************/
package eo.business.common;

import java.util.HashMap;

import eo.business.util.table.JBSbatKK_T_SVKEI_EXC_CTRL;
import eo.common.util.JKKSvcKeiNoSaiban;
import eo.framework.db.JBSbatSQLAccess;
import eo.framework.item.JBSbatCommonDBInterface;
import eo.framework.item.JBSbatCommonItem;

public class JKKBatNumberParts extends JKKBatNumberPartsBase {
	/** シーケンス定義名(請求契約番号) */
	private static final String SEQ_NAME = "SEQ_SEIKY_KEI_NO";
	/** シーケンス定義名(サービス契約番号) */
	private static final String SEQ_SVC_KEI_NO = "SEQ_SVC_KEI_NO";
	/** ＳＹＳＩＤシーケンス(お客様) */
	private static final String SEQ_SYSID = "SEQ_SYSID";

	/** シーケンス桁数(請求契約番号) */
	private static final int SEQ_LENGTH = 9;
	/** シーケンス桁数(サービス契約番号) */
	private static final int SEQ_SVC_KEI_NO_LENGTH = 8;
	/** シーケンス補正桁数(SYSID) */
	private static final int SEQ_SYSID_LENGTH = 9;

	/** 接頭語(請求契約番号) */
	private static final String PREFIX_SEIKYKEINO = "";
	/** 接頭語(SYSID) */
	private static final String PREFIX_SYSID = "1";
	// 20160418 ANK-2783-00-00 お客さまＩＤ重複障害対応：採番ロジック見直し DEL START
//	/** 接頭語(C) */
//	private static final String PREFIX_C = "C";
	// 20160418 ANK-2783-00-00 お客さまＩＤ重複障害対応：採番ロジック見直し DEL END

	/**
	 * <p>
	 * 請求契約番号の採番を行います。
	 * </p>
	 * @param inMsg 処理対象のメッセージキャリア
	 * @param inContext Agentから渡されたAgentDispatchContext
	 * @return 採番された請求契約番号
	 */
	public static String getSeikyKeiNo(JBSbatCommonItem common)
	{
		String value = null;

		// 採番処理
		value = JCCBatCommon.getFormatedNextSeq(common , SEQ_NAME, PREFIX_SEIKYKEINO, SEQ_LENGTH);
		value = value.concat(getCheckDigit21(value));

		return value;
	}

	/**
	 * <p>
	 * サービス契約番号採番処理
	 * </p>
	 * @return 採番値
	 */
	public static String svcKtranSaiban(JBSbatSQLAccess db_KK_T_SVKEI_EXC_CTRL,
			JBSbatCommonItem common) throws Exception
	{
		String rslt = "";
		rslt = getSvcKSaiban(common);
		//サービス契約排他のキー重複がなくなるまで再採番
		while(checkRepetition(rslt, common, db_KK_T_SVKEI_EXC_CTRL))
		{
			rslt = getSvcKSaiban(common);
		}
		return rslt;
	}

	/**
	 * <p>
	 * サービス契約番号採番処理
	 * </p>
	 * @return 採番値
	 */
	public static String getSvcKSaiban(JBSbatCommonItem common)
	{
		// 採番処理
		// モデル共通アクセッサー部品・Oracleシーケンス取得処理
		String value = JCCBatCommon.getFormatedNextSeq(common, SEQ_SVC_KEI_NO, 
				PREFIX_SEIKYKEINO, SEQ_SVC_KEI_NO_LENGTH);

		// 20160418 ANK-2783-00-00 お客さまＩＤ重複障害対応：採番ロジック見直し MOD START
//		// 変換処理
//		StringBuffer buffer = new StringBuffer();
//
//		// (1)接頭語を設定する
//		buffer.append(PREFIX_C);
//		// (2)シーケンスの2桁目,3桁目を元に変換表Ａ変換処理を呼び出す
//		buffer.append(toAlphabetA(value.substring(1, 2), value.substring(2, 3)));
//		// (3)シーケンスの6桁目,7桁目を元に変換表Ａ変換処理を呼び出す
//		buffer.append(toAlphabetA(value.substring(5, 6), value.substring(6, 7)));
//		// (4)シーケンスの5桁目を設定する
//		buffer.append(value.substring(4, 5));
//		// (5)シーケンスの6桁目を設定する
//		buffer.append(value.substring(5, 6));
//		// (6)シーケンスの1桁目,2桁目を元に変換表Ａ変換処理を呼び出す
//		buffer.append(toAlphabetA(value.substring(0, 1), value.substring(1, 2)));
//		// (7)シーケンスの3桁目,4桁目を元に変換表Ａ変換処理を呼び出す
//		buffer.append(toAlphabetA(value.substring(2, 3), value.substring(3, 4)));
//		// (8)シーケンスの7桁目を設定する
//		buffer.append(value.substring(6, 7));
//		// (9)シーケンスの8桁目を設定する
//		buffer.append(value.substring(7, 8));
//		// (10)設定された値からチェックデジットを算出して設定する
//		buffer.append(getCheckDigit21(buffer.toString()));
//
//		String rltValue = buffer.toString();

		// 通番からサービス契約番号への変換を行う
		String rltValue = JKKSvcKeiNoSaiban.convSvcKeiNo(value);
		// 20160418 ANK-2783-00-00 お客さまＩＤ重複障害対応：採番ロジック見直し MOD END
		return rltValue;
	}

	//サービス契約排他のキー重複チェック
	private static boolean checkRepetition(String svckNo, 
			JBSbatCommonItem common, JBSbatSQLAccess db_KK_T_SVKEI_EXC_CTRL) throws Exception
	{
		// SQL実行結果取得用mapを生成（サービス契約TBL）
		JBSbatCommonDBInterface pkMap = new JBSbatCommonDBInterface();

		// 条件項目を設定します
		pkMap.setValue(JBSbatKK_T_SVKEI_EXC_CTRL.SVC_KEI_NO, svckNo);
		// PK検索を行う
		JBSbatCommonDBInterface outMap = db_KK_T_SVKEI_EXC_CTRL.selectByPrimaryKeys(pkMap);

		if(null == outMap)
		{
			return false;
		}
		common.getLogPrint().printDebugLog(
				"サービス契約排他制御情報が存在します。サービス契約番号:" + svckNo);
		return true;
	}

	/**
	 * <p>
	 * SYSIDの採番を行います。
	 * </p>
	 * @return 採番されたSYSID
	 */
	public static String getSysId(JBSbatCommonItem common)
	{
		String value = "";
		value = JCCBatCommon.getFormatedNextSeq(
				common, SEQ_SYSID, PREFIX_SYSID, SEQ_SYSID_LENGTH);
		return value;
	}

	// 20160418 ANK-2783-00-00 お客さまＩＤ重複障害対応：採番ロジック見直し DEL START
//	/**
//	 * <p>
//	 * 変換表Ａを使用して英字変換を行います。
//	 * </p>
//	 * @param str1 変換元データの１桁目
//	 * @param str2 変換元データの２桁目
//	 * @return 変換した英字。
//	 */
//	private static String toAlphabetA(String str1, String str2)
//	{
//		// 変換表Ａを使用して英字変換を行う
//		return toAlphabetTarget(str1, str2, CHANGE_LIST_A);
//	}
	// 20160418 ANK-2783-00-00 お客さまＩＤ重複障害対応：採番ロジック見直し DEL END

	/**
	 * <p>
	 * 変換表Ｂを使用して英字変換を行います。
	 * </p>
	 * @param str1 変換元データの１桁目
	 * @param str2 変換元データの２桁目
	 * @return 変換した英字。
	 */
	private static String toAlphabetB(String str1, String str2)
	{
		// 変換表Ｂを使用して英字変換を行う
		return toAlphabetTarget(str1, str2, CHANGE_LIST_B);
	}

	// 20160418 ANK-2783-00-00 お客さまＩＤ重複障害対応：採番ロジック見直し DEL START
//	/** 変換表Ａ */
//	private static final HashMap<String, String> CHANGE_LIST_A = new HashMap<String, String>();
//
//	static
//	{
//		// 変換配列設定
//		CHANGE_LIST_A.put("0", "RSUWXZFGHJ");
//		CHANGE_LIST_A.put("1", "SUWXZFGHJR");
//		CHANGE_LIST_A.put("2", "UWXZFGHJRS");
//		CHANGE_LIST_A.put("3", "WXZFGHJRSU");
//		CHANGE_LIST_A.put("4", "XZFGHJRSUW");
//		CHANGE_LIST_A.put("5", "ZFGHJRSUWX");
//		CHANGE_LIST_A.put("6", "FGHJRSUWXZ");
//		CHANGE_LIST_A.put("7", "GHJRSUWXZF");
//		CHANGE_LIST_A.put("8", "HJRSUWXZFG");
//		CHANGE_LIST_A.put("9", "JRSUWXZFGH");
//	}
	// 20160418 ANK-2783-00-00 お客さまＩＤ重複障害対応：採番ロジック見直し DEL END

	/** 変換表Ｂ */
	private static final HashMap<String, String> CHANGE_LIST_B = new HashMap<String, String>();

	static
	{
		// 変換配列設定
		CHANGE_LIST_B.put("0", "npqrstuvwx");
		CHANGE_LIST_B.put("1", "kmnpqrstuv");
		CHANGE_LIST_B.put("2", "pqrstuvwxy");
		CHANGE_LIST_B.put("3", "tuvwxyzabc");
		CHANGE_LIST_B.put("4", "ijkmnpqrst");
		CHANGE_LIST_B.put("5", "cdefghijkm");
		CHANGE_LIST_B.put("6", "mnpqrstuvw");
		CHANGE_LIST_B.put("7", "abcdefghij");
		CHANGE_LIST_B.put("8", "stuvwxyzab");
		CHANGE_LIST_B.put("9", "hijkmnpqrs");
	}
}
