/*********************************************************************
* All Rights reserved,Copyright (c) K-Opticom
**********************************************************************
*＜プログラム内容＞
*   システム名      ：eo顧客基幹システム
*   モジュール名    ：JKKExclusiveMapper
*   ソースファイル名：JKKExclusiveMapper.java
*   作成者          ：FJ
*   日付            ：2011年12月15日
*＜機能概要＞
*   排他制御用更新年月日マッパークラス
*＜修正履歴＞
*＜修正履歴＞
*   バージョン  修正日       修正者      修正内容
*   v1.00.00    2011/12/15   FJ          新規作成
*   v27.00.00   2016/10/10   FJ) 阮      ANK-2987-00-00対応      
*   v36.00.00   2017/01/30   FJ)山地     ANK-3296-00-00対応      
**********************************************************************/
package com.fujitsu.futurity.bp.custom.common;


import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;

import com.fujitsu.futurity.model.base.CAANMsg;

/**
 * 排他制御用更新年月日マッパークラスです。<p>
 * <br>
 * @author 富士通
 */
public class JKKExclusiveMapper
{
	
	/** 排他親子関係辞書 **/
	private HashMap<String, ArrayList<String>> exclusiveDic = null;
	
	/** 最終更新日時辞書 **/
	private HashMap<String, String> lastUpdDtmDic = null;
	
	/**
	 * コンストラクタ
	 */
	public JKKExclusiveMapper()
	{
		
		ArrayList<String> childDic = null;
		
		//最終更新日時辞書の生成
		lastUpdDtmDic = new HashMap<String, String>();
		
		//排他親子関係辞書の構築
		exclusiveDic = new HashMap<String, ArrayList<String>>();
		
		//サービス契約に関連するスキーマID
		childDic = new ArrayList<String>();
		exclusiveDic.put("KK0081", childDic);
		childDic.add("KK0081"); //サービス契約
		childDic.add("KK0091"); //サービス契約<eo光ネット>
		childDic.add("KK0101"); //サービス契約<eo光TV>
		childDic.add("KK0111"); //サービス契約<eo光電話>
		childDic.add("KK0121"); //サービス契約<eoモバイル>
		childDic.add("KK0131"); //サービス契約<eo64エア>
		childDic.add("KK0141"); //サービス契約<eoADSL>
		childDic.add("KK0151"); //サービス契約<ホスティング>
		childDic.add("KK0161"); //サービス契約内訳
		childDic.add("KK0171"); //サービス契約内訳<eo光ネット>
		childDic.add("KK0181"); //サービス契約内訳<eo光TV>
		childDic.add("KK0191"); //サービス契約内訳<eo光電話>
		childDic.add("KK0201"); //サービス契約内訳<eoモバイル>
		childDic.add("KK0211"); //サービス契約内訳<eo64エア>
		childDic.add("KK0221"); //サービス契約内訳<eoADSL>
		childDic.add("KK0231"); //サービス契約内訳<ホスティング>
		childDic.add("KK0241"); //回線対象サービス契約
		childDic.add("KK0251"); //サービス契約回線内訳
		childDic.add("KK0331"); //帯域制御集約
		childDic.add("KK0341"); //機器提供サービス契約
		childDic.add("KK0351"); //オプションサービス契約
		childDic.add("KK0361"); //オプションサービス契約<ISP>
		childDic.add("KK0371"); //オプションサービス契約<電話>
		childDic.add("KK0381"); //オプションサービス契約<TV>
		childDic.add("KK0391"); //オプションサービス契約<サポート>
		childDic.add("KK0401"); //サブオプションサービス契約
		childDic.add("KK0411"); //サブオプションサービス契約<ISP>
		childDic.add("KK0421"); //サブオプションサービス契約<TV>
		childDic.add("KK0431"); //サブオプションサービス契約<電話>
		childDic.add("KK0451"); //割引サービス契約
		childDic.add("KK0461"); //割引サービス契約<一時費用割引>	//2012-02-16追加、ST2-2012-0000185対応
		childDic.add("KK0471"); //割引サービス契約<月額費用割引>	//2012-02-16追加、ST2-2012-0000185対応
		childDic.add("KK0481"); //割引サービス対象契約
		// 20131209 IT1-2013-0001685 ADD START
		childDic.add("KK2811"); //機器オプションサービス契約
		// 20131209 IT1-2013-0001685 ADD END
		
		//** 申込に関連するスキーマID
		childDic = new ArrayList<String>();
		exclusiveDic.put("KK0011", childDic);
		childDic.add("KK0011"); //申込
		childDic.add("KK0021"); //申込明細
		
		//** お客様に関連するスキーマID
		childDic = new ArrayList<String>();
		exclusiveDic.put("CK0011", childDic);
		childDic.add("CK0011"); //お客様
		// 2012-03-08 追加↓↓↓
		childDic.add("CK0111"); //グループ
		// 2012-03-08 追加↑↑↑
		//↓↓↓2012-09-24追加　ロット２追加案件 ANK-0024-05-00↓↓↓
		childDic.add("CK0121"); //お客様グループ設定
		//↑↑↑2012-09-24追加　ロット２追加案件 ANK-0024-05-00↑↑↑
		childDic.add("CK0021"); //お客様<個人>
		childDic.add("CK0031"); //お客様<法人>
		childDic.add("CK0041"); //法人連絡先
		childDic.add("CK0141"); //オプトインメール受信設定
		childDic.add("CK0201"); //連絡先
// ANK-2987-00-00 ADD START      
		childDic.add("CK0251"); //オプトインメール受信設定ワーク
// ANK-2987-00-00 ADD END
		
		//** 面開発案件に関連するスキーマID
		childDic = new ArrayList<String>();
		exclusiveDic.put("KK0271", childDic);
		childDic.add("KK0271"); //面開発案件
		childDic.add("KK0281"); //面開発担当者
		childDic.add("KK0291"); //面開発保証金
		
		//** 請求契約に関連するスキーマID
		childDic = new ArrayList<String>();
		exclusiveDic.put("KK0491", childDic);
		childDic.add("KK0491"); //請求契約
		childDic.add("KK0441"); //請求オプションサービス契約
		childDic.add("KK0501"); //口座
		childDic.add("KK0521"); //クレジットカード
		
// ANK406
		//**  他事業者割引契約
		childDic = new ArrayList<String>();
		exclusiveDic.put("KK2451", childDic);
		childDic.add("KK2451");//他事業者割引契約
	
// ANK0546-00-00 2012-09-24 ADD_START
		//**  割賦契約
		childDic = new ArrayList<String>();
		exclusiveDic.put("KK2541", childDic);
		childDic.add("KK2541");//割賦契約
// ANK0546-00-00 2012-09-24 ADD_END
		//---------v36.00.00 ANK-3296-00-00_ADD START---------//
		childDic = new ArrayList<String>();
		exclusiveDic.put("KK3131", childDic);
		childDic.add("KK3131");
		//---------v36.00.00 ANK-3296-00-00_ADD END-----------//

	}
	
	/**
	 * 親テーブルとなるスキーマIDの最終更新日時を初期化する
	 * ※当該機能を利用する際、かならず親テーブルの一意照会で取得した最終更新年月日を
	 *   このメソッドで指定してください。
	 *   例：サービス契約一意照会の最終更新年月日を指定する場合
	 *        initParentLastUpdDtm("KK0081", "2011121520230000")
	 * @param parentSchemaID 親テーブルのスキーマID
	 * @param lastUpdDtm 最終更新日時
	 */
	public void initParentLastUpdDtm(String parentSchemaID, String lastUpdDtm)
	{
		//最終更新日時の設定
		lastUpdDtmDic.put(parentSchemaID, lastUpdDtm);
	}
	
	/**
	 * wkMapに対して更新年月日を設定
	 * ※更新系サービスIF呼び出し直前にこちらのメソッドをかましてください。
     *
     *      //サービスIFコール用クラスの生成
	 *      ServiceComponentRequestInvoker scCall = new ServiceComponentRequestInvoker();
     *           ・
     *           ・
     *           ・
     *      //最終更新年月日をマージ（取得）
     *      kkExclusiveMapper.mergeSetLastUpdDtm(wkMap);      ← ココ
     *           
	 *      //サービスIFをコール
	 *      rslt = scCall.run(wkMap, handle);
	 * 
	 *      //最終更新年月日をマージ（設定）
	 *      kkExclusiveMapper.mergeGetLastUpdDtm(wkMap);
	 * 
	 * 
	 * @param wkMap 対象マップ（サービスIFに渡す直前のハッシュマップ）
	 */
	public void mergeSetLastUpdDtm(HashMap<String, Object> wkMap)
	{
		
		CAANMsg[] templates = null;
		CAANMsg template = null;
		String templateID = null;
		String schemaID = null;
		String lastUpdDtm = null;
		Iterator<String> keiIterator = null;
		String key = null;
		ArrayList<String> childSchemaList = null;
		
		//SIFに渡すデータの取得
		templates = (CAANMsg[])wkMap.get("templates");
		template = templates[0];
		
		//呼び出したSIFのIDを取得
		templateID = template.getString("templateID");
		
		//SIFの内部スキーマIDの取得
		schemaID = templateID.substring(1, 7);
		
		//排他親子関係辞書のスキーマIDごとのループ
		keiIterator = exclusiveDic.keySet().iterator();
		while(keiIterator.hasNext())
		{
			//1要素の取得
			key = (String)keiIterator.next();
			childSchemaList = exclusiveDic.get(key);
			
			//その中の要素の分ループ
			for(int i = 0 ; i < childSchemaList.size() ; i++)
			{
				
				//子に属するスキーマID
				if(childSchemaList.get(i).equals(schemaID))
				{
					
					//内部でキャッシュしている最終更新日時を取得
					lastUpdDtm = lastUpdDtmDic.get(key);
					
					//日付をキャッシュしている場合だけ設定する
					if(lastUpdDtm != null)
					{
						template.set("upd_dtm_bf", lastUpdDtm);
					}
					
					return;
				}
				
			}
			
		}
		
		//特別なにもかからない場合は何もしない
		return;

	}
	
	/**
	 * wkMapから更新年月日を抽出
	 * @param wkMap 対象マップ（サービスIFに渡した直後のハッシュマップ）
	 * ※更新系サービスIF呼び出し直前にこちらのメソッドをかましてください。
     *
     *      //サービスIFコール用クラスの生成
	 *      ServiceComponentRequestInvoker scCall = new ServiceComponentRequestInvoker();
     *           ・
     *           ・
     *           ・
     *      //最終更新年月日をマージ（取得）
     *      kkExclusiveMapper.mergeSetLastUpdDtm(wkMap);     
     *           
	 *      //サービスIFをコール
	 *      rslt = scCall.run(wkMap, handle);
	 * 
	 *      //最終更新年月日をマージ（設定）
	 *      kkExclusiveMapper.mergeGetLastUpdDtm(wkMap);      ← ココ
	 * 
	 * 
	 */
	public void mergeGetLastUpdDtm(HashMap<String, Object> wkMap)
	{
		
		CAANMsg[] templates = null;
		CAANMsg template = null;
		String templateID = null;
		String schemaID = null;
		String lastUpdDtm = null;
		String updDtm = null;
		Iterator<String> keiIterator = null;
		String key = null;
		ArrayList<String> childSchemaList = null;
		
		//SIFに渡すデータの取得
		templates = (CAANMsg[])wkMap.get("templates");
		template = templates[0];
		
		//呼び出したSIFのIDを取得
		templateID = template.getString("templateID");
		
		//SIFの内部スキーマIDの取得
		schemaID = templateID.substring(1, 7);
		
		//排他親子関係辞書のスキーマIDごとのループ
		keiIterator = exclusiveDic.keySet().iterator();
		while(keiIterator.hasNext())
		{
			//1要素の取得
			key = (String)keiIterator.next();
			childSchemaList = exclusiveDic.get(key);
			
			//その中の要素の分ループ
			for(int i = 0 ; i < childSchemaList.size() ; i++)
			{
				
				//子に属するスキーマID
				if(childSchemaList.get(i).equals(schemaID))
				{
					
					//内部でキャッシュしている最終更新日時を取得
					lastUpdDtm = lastUpdDtmDic.get(key);
					
					//日付をキャッシュしている場合だけ設定する
					if(lastUpdDtm != null)
					{
						
						//更新年月日を取得
						updDtm = template.getString("upd_dtm");
						lastUpdDtmDic.put(key, updDtm);
					}
					
					return;
				}
				
			}
			
		}
		
		//特別なにもかからない場合は何もしない
		return;

	}
	
}
