/*********************************************************************
* All Rights reserved,Copyright (c) K-Opticom
**********************************************************************
*＜プログラム内容＞
*   システム名      ：eo顧客基幹システム
*   モジュール名    ：物流管理システム
*   ソースファイル名：JDKCommon49CC.java
*   作成者          ：富士通
*   日付            ：2011年07月20日
*＜機能概要＞
*   交換機器引き渡し登録宅内連携CCクラスです。
*＜修正履歴＞
*   バージョン  修正日       修正者      修正内容
*   v1.00.00    2011/07/20   FJ          新規作成
*   v5.00.00    2011/11/27   FJ)鄭       OM-2013-0004724対応 サービス契約内訳の更新処理追加
*   v8.00.00    2014/03/05   FJ)鄭       ANK-1991-00-00対応 ルーターの修理交換グループ変更の対応
*   v14.00.00   2015/05/15   FJ)窪田     OM-2015-0001066対応 
*   v38.00.00   2018/08/06   FJ)謝       【ANK-3274-00-00】【機能改善】工事会社出荷時の機器状態チェック条件の見直し
**********************************************************************/
package com.fujitsu.futurity.bp.custom.common;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;

import com.fujitsu.futurity.bp.custom.constant.DKSV0060_DKSV0060OP_DKSV006012CC;
import com.fujitsu.futurity.bp.custom.mapping.DKSV0060_DKSV0060OP_EDK0011D010BSMapper;
import com.fujitsu.futurity.bp.custom.mapping.DKSV0060_DKSV0060OP_EDK0011D020BSMapper;
import com.fujitsu.futurity.bp.custom.mapping.DKSV0060_DKSV0060OP_EDK0181D010BSMapper;
import com.fujitsu.futurity.bp.custom.mapping.DKSV0060_DKSV0060OP_EDKA0010006BSMapper;
import com.fujitsu.futurity.bp.custom.mapping.DKSV0060_DKSV0060OP_EKK0121C041BSMapper;
import com.fujitsu.futurity.bp.custom.mapping.DKSV0060_DKSV0060OP_EKK0161A010BSMapper;
import com.fujitsu.futurity.bp.custom.mapping.DKSV0060_DKSV0060OP_EKK0191A010BSMapper;
import com.fujitsu.futurity.bp.custom.mapping.DKSV0060_DKSV0060OP_EKK0191C060BSMapper;
import com.fujitsu.futurity.bp.custom.mapping.DKSV0060_DKSV0060OP_EKK0201C051BSMapper;
import com.fujitsu.futurity.bp.custom.mapping.DKSV0060_DKSV0060OP_EKK0341A010BSMapper;
import com.fujitsu.futurity.bp.custom.mapping.DKSV0060_DKSV0060OP_EKK0341B031BSMapper;
import com.fujitsu.futurity.bp.custom.mapping.DKSV0060_DKSV0060OP_EKK0341C160BSMapper;
import com.fujitsu.futurity.bp.custom.mapping.DKSV0060_DKSV0060OP_EKK0341C180BSMapper;
import com.fujitsu.futurity.bp.custom.mapping.DKSV0060_DKSV0060OP_EKK0341C190BSMapper;
import com.fujitsu.futurity.bp.custom.mapping.DKSV0060_DKSV0060OP_EKK0341C230BSMapper;
import com.fujitsu.futurity.bp.custom.mapping.DKSV0060_DKSV0060OP_EKK0341C231BSMapper;
import com.fujitsu.futurity.bp.custom.mapping.DKSV0060_DKSV0060OP_EKK0341E020BSMapper;
import com.fujitsu.futurity.bp.custom.mapping.DKSV0060_DKSV0060OP_EKK2101C010BSMapper;
import com.fujitsu.futurity.bp.custom.mapping.DKSV0060_DKSV0060OP_ESC0081A010BSMapper;
import com.fujitsu.futurity.bp.x21.bpm.ServiceComponentRequestInvoker;
import com.fujitsu.futurity.bp.x21.bpm.db.SessionHandle;
import com.fujitsu.futurity.bp.x21.bpm.exception.RequestParameterException;
import com.fujitsu.futurity.bp.x21.bpm.parameter.IRequestParameterReadWrite;
import com.fujitsu.futurity.bp.x21.cc.AbstractCommonComponent;
import com.fujitsu.futurity.bp.x21.cc.exception.SCCallException;
import com.fujitsu.futurity.model.ejb.common.JSYejbLog;
import com.fujitsu.futurity.model.ejb.common.StatusCodes;

import eo.common.constant.JDKStrConst;
import eo.common.constant.JPCModelConstant;
import eo.common.util.JDKCommonUtil;
import eo.ejb.cbs.cbsmsg.EDKA0010006CBSMsg1List;
import eo.ejb.cbs.cbsmsg.EDKA0010006CBSMsg2List;
import eo.ejb.cbs.cbsmsg.EDKA0010008CBSMsg1List;
import eo.ejb.cbs.cbsmsg.EKK0341A010CBSMsg1List;
import eo.ejb.cbs.cbsmsg.EKK0341B031CBSMsg1List;
import eo.ejb.cbs.cbsmsg.EKK0341C230CBSMsg;


/**
 * 交換機器引き渡し登録宅内連携CCクラスです。
 * @author 富士通
 */
public class JDKCommon49CC extends AbstractCommonComponent
{
	/** CC名 */
	private static final String DKSV006012CC = "DKSV006012CC";

	private static final DKSV0060_DKSV0060OP_EDKA0010006BSMapper MAPPER = new DKSV0060_DKSV0060OP_EDKA0010006BSMapper();

	/** 宅内機器種別コード：イー・モバイル */
	private static final String E_MOBILE = "H0";

	/** 宅内機器種別コード：ＵＱ */
	private static final String UQ = "J0";

	/**
	 * 交換危機宅内連携処理を行います。
	 * @param handle セッションハンドル
	 * @param param パラメータ
	 * @param fixedText 定型文字
	 * @return パラメータ
	 * @throws Exception
	 */
	@SuppressWarnings("unchecked")
	public IRequestParameterReadWrite updateStock(SessionHandle handle, IRequestParameterReadWrite param, String fixedText) throws Exception
	{
		ServiceComponentRequestInvoker scCall = new ServiceComponentRequestInvoker();
		Map args = (HashMap) param.getData(DKSV006012CC);

		// 管理場所識別コード
		String skbtCd = (String) args.get(DKSV0060_DKSV0060OP_DKSV006012CC.KNR_PLACE_SKBT_CD);
		// 倉庫コード
		String sokoCd = (String) args.get(DKSV0060_DKSV0060OP_DKSV006012CC.KNR_PLACE_NO);
		// 棚コード
		String shelfCd = (String) args.get(DKSV0060_DKSV0060OP_DKSV006012CC.KNR_PLACE_SHELF_CD);
		// 宅内機器型式コード
		String modelCd = (String) args.get(DKSV0060_DKSV0060OP_DKSV006012CC.TAKNKIKI_MODEL_CD);
		// 宅内機器種別コード
		String taknkikiSbtCd = (String) args.get(DKSV0060_DKSV0060OP_DKSV006012CC.TAKNKIKI_SBT_CD);
		// 住所変更番号
		String adchgNo = (String) args.get(DKSV0060_DKSV0060OP_DKSV006012CC.ADCHG_NO);

		HashMap<String, Object> inMap = new HashMap<String, Object>();
		Map<?, ?> result = null;
		Map<String, String> searchMap = null;

		// S-IFの実行条件
		int cond = 0;
		if (JDKStrConst.ROUTER.equals(taknkikiSbtCd))
		{
			// 宅内機器種別コードが「F0」（ルーター）の場合
			// 交換後機器に対する料金コース情報を取得
			Map<String, Object> pcrsDataMap = getPcrsData(handle, param);

			if (args.get("pcrs_cd").equals(pcrsDataMap.get("pcrs_cd")) && args.get("pplan_cd").equals(pcrsDataMap.get("pplan_cd")))
			{
				// 交換前後の機器の料金コースコードと料金プランコードが同じである場合
				if (JDKStrConst.MINATO_SOKO_CD.equals(((Map) param.getData("DKSV006004SC")).get("soko_cd")))
				{
					// 倉庫コードが大阪みなとロジシスセンターの場合
					cond = 1;
				}
				else
				{
					// 倉庫コードが大阪みなとロジシスセンター以外の場合
					cond = 3;
				}
			}
			else
			{
				// 交換前後の機器の料金コースコードと料金プランコードが異なる場合
				// 交換後機器に対する料金コース情報を設定
				setNewPcrsData(param, pcrsDataMap);

				if (JDKStrConst.MINATO_SOKO_CD.equals(((Map) param.getData("DKSV006004SC")).get("soko_cd")))
				{
					// 倉庫コードが大阪みなとロジシスセンターの場合
					cond = 2;
				}
				else
				{
					// 倉庫コードが大阪みなとロジシスセンター以外の場合
					cond = 4;
				}
			}
		}
		else
		{
			// 宅内機器種別コードが「F0」（ルーター）以外の場合
			if (JDKStrConst.MINATO_SOKO_CD.equals(((Map) param.getData("DKSV006004SC")).get("soko_cd")))
			{
				// 倉庫コードが大阪みなとロジシスセンターの場合
				cond = 1;
			}
			else
			{
				// 倉庫コードが大阪みなとロジシスセンター以外の場合
				cond = 3;
			}
		}

		switch (cond)
		{
			case 1:
				/*
				 * 倉庫コードが大阪みなとロジシスセンター
				 * 且つ交換前後の機器の料金コースコードと料金プランコードが同じである場合
				 */
				// 機器提供サービス契約機器変更
				callEKK0341C190(handle, param, scCall);

				// 配送受付
				callEDK0011D020(handle, param, scCall);

				// 機器提供サービス契約一意照会
				searchMap = new HashMap<String, String>();
				searchMap.put("kktk_svc_kei_no", (String) ((HashMap) param.getData("DKSV006011SC")).get("kktk_svc_kei_no"));
				searchMap.put("gene_add_dtm", (String) ((HashMap) param.getData("DKSV006011SC")).get("gene_add_dtm"));
				callEKK0341A010(handle, param, scCall, searchMap);

				// 機器提供サービス契約情報変更
				if (0 < ((List) args.get(EKK0341A010CBSMsg1List.class.getName())).size())
				{
					callEKK0341C230(handle, param, scCall);
				}

				break;

			case 2:
				/*
				 * 倉庫コードが大阪みなとロジシスセンター
				 * 且つ交換前後の機器の料金コースコードと料金プランコードが異なる場合
				 */
				// 機器提供サービス契約料金コース変更
				callEKK0341C160(handle, param, scCall);

				// 配送受付
				callEDK0011D020(handle, param, scCall);

				// 機器提供サービス契約一意照会
				searchMap = new HashMap<String, String>();
				searchMap.put("kktk_svc_kei_no", (String) ((HashMap) param.getData("DKSV006011SC")).get("kktk_svc_kei_no"));
				searchMap.put("gene_add_dtm", (String) ((HashMap) param.getData("DKSV006011SC")).get("gene_add_dtm"));
				callEKK0341A010(handle, param, scCall, searchMap);

				// 機器提供サービス契約情報変更（契約変更中）
				if (0 < ((List) args.get(EKK0341A010CBSMsg1List.class.getName())).size())
				{
					callEKK0341C231(handle, param, scCall);
				}

				break;

			case 3:
				/*
				 * 倉庫コードが大阪みなとロジシスセンター以外
				 * 且つ交換前後の機器の料金コースコードと料金プランコードが同じである場合
				 */
				// 機器提供サービス契約機器変更
				callEKK0341C190(handle, param, scCall);

				// 代替機出荷でない場合
				if (!JDKStrConst.DAITAIKI_KOKAN.equals(((Map) param.getData("DKSV006001SC")).get("hikiwatashi_goods_cd")))
				{
					// 検証交換登録
					callEDK0181D010(handle, param, scCall);
				}

				// 配送実績登録
				callEDK0011D010(handle, param, scCall);

				// 機器提供サービス契約一意照会
				searchMap = new HashMap<String, String>();
				searchMap.put("kktk_svc_kei_no", (String) ((HashMap) param.getData("DKSV006011SC")).get("kktk_svc_kei_no"));
				searchMap.put("gene_add_dtm", (String) ((HashMap) param.getData("DKSV006011SC")).get("gene_add_dtm"));
				callEKK0341A010(handle, param, scCall, searchMap);

				// 機器提供サービス契約情報変更
				if (0 < ((List) args.get(EKK0341A010CBSMsg1List.class.getName())).size())
				{
					callEKK0341C230(handle, param, scCall);
				}

				break;

			case 4:
				/*
				 * 倉庫コードが大阪みなとロジシスセンター以外
				 * 且つ交換前後の機器の料金コースコードと料金プランコードが異なる場合
				 */
				// 機器提供サービス契約料金コース変更
				callEKK0341C160(handle, param, scCall);

				// 代替機出荷でない場合
				if (!JDKStrConst.DAITAIKI_KOKAN.equals(((Map) param.getData("DKSV006001SC")).get("hikiwatashi_goods_cd")))
				{
					// 検証交換登録
					callEDK0181D010(handle, param, scCall);
				}

				// 配送実績登録
				callEDK0011D010(handle, param, scCall);

				// 機器提供サービス契約料金コース変更確定
				if ("1".equals(((HashMap) param.getData("DKSV006011SC")).get("func_code")))
				{
					callEKK0341C180(handle, param, scCall);
				}

				// 機器提供サービス契約一意照会
				searchMap = new HashMap<String, String>();
				searchMap.put("kktk_svc_kei_no", (String) ((HashMap) param.getData("DKSV006011SC")).get("kktk_svc_kei_no"));
				searchMap.put("gene_add_dtm", (String) ((HashMap) param.getData("DKSV006011SC")).get("gene_add_dtm"));
				callEKK0341A010(handle, param, scCall, searchMap);

				// 機器提供サービス契約情報変更
				if (0 < ((List) args.get(EKK0341A010CBSMsg1List.class.getName())).size())
				{
					callEKK0341C230(handle, param, scCall);
				}

			default:
				break;
		}

		if (0 < ((List) args.get(EKK0341A010CBSMsg1List.class.getName())).size())
		{
			// 住所変更中のデータが存在する場合
			if (!JDKCommonUtil.isNull(adchgNo))
			{
				// 住所変更明細更新
				callEKK2101C010(handle, param, scCall);

				// 機器提供サービス契約履歴一覧照会（SYSID）
				callEKK0341B031(handle, param, scCall);

				if (0 < ((List) args.get(EKK0341B031CBSMsg1List.class.getName())).size())
				{
					// 機器提供サービス契約論理削除（住所変更）
					callEKK0341E020(handle, param, scCall);
				}
			}

			// サービス契約内訳番号（第１電話）もしくは、サービス契約内訳番号（第２電話）が設定されている場合
			// OM-2015-0001066 MOD START
			//if (!JDKCommonUtil.isNull(args.get("svc_kei_ucwk_no_tel1"))
			//		|| !JDKCommonUtil.isNull(args.get("svc_kei_ucwk_no_tel2")))
			// 出荷元がみなと倉庫以外でサービス契約内訳番号（第１電話）もしくは、サービス契約内訳番号（第２電話）が設定されている場合
			if ((!JDKCommonUtil.isNull(args.get("svc_kei_ucwk_no_tel1"))
					|| !JDKCommonUtil.isNull(args.get("svc_kei_ucwk_no_tel2"))) &&
					(!JDKStrConst.MINATO_SOKO_CD.equals(sokoCd.toString())))
			// OM-2015-0001066 MOD END
			{
				// 機器提供サービス契約一意照会
				Map kktkSvcKeiDataMap = (Map) ((List) args.get(EKK0341C230CBSMsg.class.getName())).get(0);
				searchMap = new HashMap<String, String>();
				searchMap.put("kktk_svc_kei_no", (String) kktkSvcKeiDataMap.get("kktk_svc_kei_no"));
				searchMap.put("gene_add_dtm", (String) kktkSvcKeiDataMap.get("gene_add_dtm"));
				callEKK0341A010(handle, param, scCall, searchMap);

				if (!JDKCommonUtil.isNull(args.get("svc_kei_ucwk_no_tel1")))
				{
					updateSvcKeiUcwkEohTel(handle, param, (String) args.get("svc_kei_ucwk_no_tel1"));
				}

				if (!JDKCommonUtil.isNull(args.get("svc_kei_ucwk_no_tel2")))
				{
					updateSvcKeiUcwkEohTel(handle, param, (String) args.get("svc_kei_ucwk_no_tel2"));
				}
			}
		}

		// 製造番号なしは機器情報を送らない
		// 工事会社からの出荷は在庫情報を送らない
		// 両条件を満たす場合、宅内連携自体を行わない
		if (!existProductNo(args) && fromKojiComp(args))
		{
			JSYejbLog.outlog(null, JSYejbLog.DEBUG, JDKCommon49CC.class, "工事会社からの製造番号なし機器の引き渡しなので宅内連携を行いません");
			return param;
		}

		// 製造番号ありの場合は宅内基本情報を更新する必要がある
		if (existProductNo(args))
		{
			List<Map> list = new ArrayList<Map>();
			list.add(args);
			// 宅内機器一覧照会(5)(EDKA0010008)を実行し、情報を得る
			List<Map> takunaiBasements = JDKBPCommon.getLastUpdateDtm(list, "taknkiki_model_cd", "kiki_seizo_no", handle, param, false);

			throwExceptionOnError(takunaiBasements, param, handle, args);
			list.get(0).put(EDKA0010006CBSMsg1List.KEY_KIHON_UPD_DTTM, takunaiBasements.get(0).get(EDKA0010008CBSMsg1List.KHN_MOD_DTTM));

			if (0 < ((List) args.get(EKK0341A010CBSMsg1List.class.getName())).size()
					&& !JDKStrConst.MINATO_SOKO_CD.equals(sokoCd)) { // みなと倉庫以外の場合
				if (E_MOBILE.equals(taknkikiSbtCd) || UQ.equals(taknkikiSbtCd)) {
					// ＥＭ契約者コード
					args.put(DKSV0060_DKSV0060OP_DKSV006012CC.EM_KSH_CD, takunaiBasements.get(0).get(EDKA0010008CBSMsg1List.EM_KSH_CD));
					// UQ認証ID
					args.put(DKSV0060_DKSV0060OP_DKSV006012CC.UQ_NINSHO_ID, takunaiBasements.get(0).get(EDKA0010008CBSMsg1List.UQ_NINSHO_ID));
					// UQ認証IDパスワード
					args.put(DKSV0060_DKSV0060OP_DKSV006012CC.UQ_NINSHO_ID_PWD, takunaiBasements.get(0).get(EDKA0010008CBSMsg1List.UQ_PWD));

					if (UQ.equals(taknkikiSbtCd)) {
						// サービス契約内訳＜eoモバイル＞情報変更（ＵＱ認証）
						DKSV0060_DKSV0060OP_EKK0201C051BSMapper svkeiuwEomobaUpdMapper = new DKSV0060_DKSV0060OP_EKK0201C051BSMapper();
						inMap = svkeiuwEomobaUpdMapper.editInMsg(param);
						JSYejbLog.println(JSYejbLog.DEBUG, this.getClass(), "サービス契約内訳＜eoモバイル＞情報変更（ＵＱ認証）処理の実行");
						result = scCall.run(inMap, handle);
						svkeiuwEomobaUpdMapper.editResultRP(result, param);

						if (JDKBPCommon.hasError(param))
						{
							throw new SCCallException("サービス契約内訳＜eoモバイル＞情報変更（ＵＱ認証）処理失敗", "0", 
									Integer.parseInt(param.getControlMapData("returnCode").toString()));
						}

						// SOD業務管理一意照会
						// 事業者コードを取得
						DKSV0060_DKSV0060OP_ESC0081A010BSMapper sodWorkKanriMapper = new DKSV0060_DKSV0060OP_ESC0081A010BSMapper();
						inMap = sodWorkKanriMapper.editInMsg(param);
						JSYejbLog.println(JSYejbLog.DEBUG, this.getClass(), "SOD業務管理一意照会処理の実行");
						result = scCall.run(inMap, handle);
						sodWorkKanriMapper.editResultRP(result, param);

						if (JDKBPCommon.hasError(param))
						{
							throw new SCCallException("SOD業務管理一意照会処理失敗", "0", 
									Integer.parseInt(param.getControlMapData("returnCode").toString()));
						}
					}

					// サービス契約＜eoモバイル＞情報変更（事業者用契約）
					DKSV0060_DKSV0060OP_EKK0121C041BSMapper svcKeiEomobaUpdMapper = new DKSV0060_DKSV0060OP_EKK0121C041BSMapper();
					inMap = svcKeiEomobaUpdMapper.editInMsg(param);
					JSYejbLog.println(JSYejbLog.DEBUG, this.getClass(), "サービス契約＜eoモバイル＞情報変更（事業者用契約）処理の実行");
					result = scCall.run(inMap, handle);
					svcKeiEomobaUpdMapper.editResultRP(result, param);

					if (JDKBPCommon.hasError(param))
					{
						throw new SCCallException("サービス契約＜eoモバイル＞情報変更（事業者用契約）処理失敗", "0", 
								Integer.parseInt(param.getControlMapData("returnCode").toString()));
					}
				}
			}
		}

		// 工事会社配送の場合は、在庫数のチェックを行わない
		if (!fromKojiComp(args))
		{
			// 宅内機器物流在庫一意照会(EKKA0020005)を実行し、在庫情報を得る
			Integer stock = JDKBPCommon.getStockAmount(sokoCd, shelfCd, modelCd, skbtCd, handle, param);
			if (stock == null || stock <= 0)
			{
				JDKBPCommon.addError(param, "tk_mdl_cd_err", "EE", "EKKA0020005", StatusCodes.RELATION_ERR, 0);
				JSYejbLog.outlog(null, JSYejbLog.DEBUG, JDKCommon49CC.class, String.format("在庫不足 soko:%s shelf:%s kiki:%s stock:%d", sokoCd, shelfCd, modelCd, stock));
	
				JDKBPCommon.throwScExceptionIfHasError("在庫不足", param);
			}
		}

		// みなと倉庫か否かで在庫の計上に違いがある
		if (sokoCd != null)
		{
			if (JDKStrConst.MINATO_SOKO_CD.equals(sokoCd.toString()))
			{
				args.put(EDKA0010006CBSMsg2List.HAISO_UK_JUCHU_CNT, "1");
			}
			else
			{
				args.put(EDKA0010006CBSMsg2List.JZAIKO_CNT, "-1");
				args.put(EDKA0010006CBSMsg2List.TJITU_HAISO_SHKA_CNT, "1");
			}
		}

		inMap = MAPPER.editInMsg(param);
		JSYejbLog.println(JSYejbLog.DEBUG, this.getClass(), "宅内機器修理交換情報更新処理の実行");
		result = scCall.run(inMap, handle);
		MAPPER.editResultRP(result, param);

		if (JDKBPCommon.hasError(param))
		{
			throw new SCCallException("宅内機器修理交換情報更新処理失敗", "0", 
										Integer.parseInt(param.getControlMapData("returnCode").toString()));
		}

		JDKBPCommon.throwScExceptionIfHasError("宅内機器修理交換情報更新処理リターンコード不正", param);

		return param;
	}
	
	
	
	private static final Set<String> SHIPABLE_SHELFS = new HashSet<String>();
	static
	{
		SHIPABLE_SHELFS.add(JDKStrConst.TUJYO_TANA);
		SHIPABLE_SHELFS.add(JDKStrConst.SAISEI_A_TANA);
		SHIPABLE_SHELFS.add(JDKStrConst.SAISEI_B_TANA);
		SHIPABLE_SHELFS.add(JDKStrConst.TORIOKI_TANA);
	}
	
	/**
	 * 宅内への問い合わせ結果を用いて処理続行可否を判断します
	 * @param kikiList 宅内機器情報
	 */
	@SuppressWarnings("unchecked")
	private static void throwExceptionOnError(List<Map> kikiList, IRequestParameterReadWrite param, SessionHandle handle, Map ccMap)
	throws SCCallException, RequestParameterException, Exception
	{
		if (kikiList == null || kikiList.isEmpty())
		{
			JDKBPCommon.addError(param, "kiki_seizo_no_err", "EA", "EDKA0010008", StatusCodes.RELATION_ERR, 0);
			JSYejbLog.outlog(null, JSYejbLog.DEBUG, JDKCommon49CC.class, "宅内に機器情報がない");
			JDKBPCommon.throwScExceptionIfHasError("宅内に機器情報がない", param);
		}
		
		Map kiki = kikiList.get(0);
// ANK-3274-00-00 ADD START
		// 機能コード
		String funcCode = (String) ccMap.get("func_code");
// ANK-3274-00-00 ADD END

		// 工事会社配送以外のとき、下記のチェックを行う
		if (!fromKojiComp(ccMap)) 
		{
			if (JDKStrConst.SLF_MV_RSV_FLG_ON.equals(kiki.get(EDKA0010008CBSMsg1List.SLF_MV_RSV_FLG)))
			{
				JDKBPCommon.addError(param, "kiki_seizo_no_err", "EB", "EDKA0010008", StatusCodes.RELATION_ERR, 0);
				JSYejbLog.outlog(null, JSYejbLog.DEBUG, JDKCommon49CC.class, "棚移動予約フラグが１");
			}
		
			if (!JDKStrConst.SHOYU_DIV_KOPT.equals(kiki.get(EDKA0010008CBSMsg1List.SHOYU_CD)))
			{
				JDKBPCommon.addError(param, "kiki_seizo_no_err", "EC", "EDKA0010008", StatusCodes.RELATION_ERR, 0);
				JSYejbLog.outlog(null, JSYejbLog.DEBUG, JDKCommon49CC.class, "所有コードが１ではない");
			}
		
			if (!SHIPABLE_SHELFS.contains(kiki.get(EDKA0010008CBSMsg1List.KNRI_PLC_SLF_CD)))
			{
				JDKBPCommon.addError(param, "shelf_no_err", "ED", "EDKA0010008", StatusCodes.RELATION_ERR, 0);
				JSYejbLog.outlog(null, JSYejbLog.DEBUG, JDKCommon49CC.class, "通常棚、再生ＡＢ棚、取置棚以外が指定されている");
			}
			
			if (!kiki.get(EDKA0010008CBSMsg1List.KNRI_PLC_CD).equals(ccMap.get(DKSV0060_DKSV0060OP_DKSV006012CC.KNR_PLACE_NO)) ||
				!kiki.get(EDKA0010008CBSMsg1List.KNRI_PLC_SLF_CD).equals(ccMap.get(DKSV0060_DKSV0060OP_DKSV006012CC.KNR_PLACE_SHELF_CD)))
			{
				JDKBPCommon.addError(param, "kiki_seizo_no_err", "EA", "EDKA0010008", StatusCodes.RELATION_ERR, 0);
				JDKBPCommon.throwScExceptionIfHasError("宅内に機器情報がない", param);
				JSYejbLog.outlog(null, JSYejbLog.DEBUG, JDKCommon49CC.class, "宅内に機器情報がない");
			}
			
		}		
// ANK-3274-00-00 ADD START
		// 機能コードが"1"(更新モード)の場合、かつ工事会社配送の場合
		if (JPCModelConstant.FUNC_CD_1.equals(funcCode) && fromKojiComp(ccMap))
		{
			// 廃棄棚であればエラー
			if (JDKStrConst.HAIKI_TANA.equals(kiki.get(EDKA0010008CBSMsg1List.KNRI_PLC_SLF_CD)))
			{
				JDKBPCommon.addError(param, "shelf_no_err", "ET", "EDKA0010008", StatusCodes.RELATION_ERR, 0);
				JSYejbLog.outlog(null, JSYejbLog.DEBUG, JDKCommon49CC.class, "工事会社からの出荷で、廃棄棚が指定されている");
			}
		}
// ANK-3274-00-00 ADD END
		JDKBPCommon.throwScExceptionIfHasError("宅内機器情報の不整合エラー", param);
	}

	/**
	 * 製造番号があることを確認する
	 * @return 有:true なし:false
	 */
	@SuppressWarnings("unchecked")
	private boolean existProductNo (Map ccMap)
	{
		return !JDKCommonUtil.isNull(ccMap.get(DKSV0060_DKSV0060OP_DKSV006012CC.KIKI_SEIZO_NO));
	}
	
	/**
	 * 工事会社からの出荷であることを確認する
	 * @return 工事会社から:true 工事会社以外から:false
	 */
	@SuppressWarnings("unchecked")
	private static boolean fromKojiComp(Map ccMap)
	{
		return JDKStrConst.KANRI_PLACE_SKB_KOJI.equals(ccMap.get(DKSV0060_DKSV0060OP_DKSV006012CC.KNR_PLACE_SKBT_CD));
	}

	/**
	 * 交換後機器に対する料金コース情報を取得します。
	 * @param handle セッションハンドル
	 * @param param パラメータ
	 * @return 料金コース情報
	 * @throws Exception
	 */
	@SuppressWarnings("unchecked")
	private Map<String, Object> getPcrsData(SessionHandle handle, IRequestParameterReadWrite param)
	throws Exception
	{
		Map args = (HashMap) param.getData(DKSV006012CC);

		// 交換後機器に対する料金コース情報を取得
		HashMap<String, Object> inMap = new HashMap<String, Object>();
		// 機器提供種別コード
		inMap.put("kktk_sbt_cd", args.get(DKSV0060_DKSV0060OP_DKSV006012CC.KKTK_SBT_CD));
		// 機器提供サービスコード
		inMap.put("kktk_svc_cd", "");
		// STB種別コード
		inMap.put("stb_sbt_cd", "");
		// 宅内機器型式コード
		inMap.put("taknkiki_model_cd", args.get(DKSV0060_DKSV0060OP_DKSV006012CC.TAKNKIKI_MODEL_CD));
		// HDD容量コード
		inMap.put("hdd_capa_cd_in", "");
		// 基準年月日
		inMap.put("stdardymd", JPCBPCommon.getOpeDate(null));

		try
		{
			JSYejbLog.println(JSYejbLog.DEBUG, this.getClass(), "料金コース取得処理の実行");
			return JKKBpCommon.getPcrsData(handle, param, inMap);
		}
		catch (Throwable th)
		{
			throw new Exception(th);
		}
	}

	/**
	 * 交換後機器に対する料金コース情報をワーク３に設定します。
	 * @param param パラメータ
	 * @param pcrsDataMap 料金コース情報
	 * @throws Exception
	 */
	@SuppressWarnings("unchecked")
	private void setNewPcrsData(IRequestParameterReadWrite param, Map<String, Object> pcrsDataMap)
	throws Exception
	{
		// 作業領域の取得
		Map workMap = (Map) param.getMappingWorkArea();
		if (workMap == null)
		{
			workMap = new HashMap();
			param.setMappingWorkArea(workMap);
		}

		/* 作業領域データ設定 */
		HashMap dataMap = (HashMap) workMap.get("work3");
		if (dataMap == null)
		{
			dataMap = new HashMap();
			workMap.put("work3", dataMap);
		}

		// ワーク３.料金コースコード ← 料金コースコード
		if (!pcrsDataMap.containsKey("pcrs_cd") || JDKCommonUtil.isNull(pcrsDataMap.get("pcrs_cd")))
		{
			dataMap.put("new_pcrs_cd", new String());
		} else {
			dataMap.put("new_pcrs_cd", (String) pcrsDataMap.get("pcrs_cd"));
		}

		// ワーク３.料金プランコード ← 料金プランコード
		if (!pcrsDataMap.containsKey("pplan_cd") || JDKCommonUtil.isNull(pcrsDataMap.get("pplan_cd")))
		{
			dataMap.put("new_pplan_cd", new String());
		} else {
			dataMap.put("new_pplan_cd", (String) pcrsDataMap.get("pplan_cd"));
		}

		// ワーク３.HDD容量コード ← HDD容量コード
		if (!pcrsDataMap.containsKey("hdd_capa_cd") || JDKCommonUtil.isNull(pcrsDataMap.get("hdd_capa_cd")))
		{
			dataMap.put("new_hdd_capa_cd", new String());
		} else {
			dataMap.put("new_hdd_capa_cd", (String) pcrsDataMap.get("hdd_capa_cd"));
		}
	}

	/**
	 * 配送実績登録S-IFを呼び出します。
	 * @param handle セッションハンドル
	 * @param param パラメータ
	 * @param scCall SC呼び出しオブジェクト
	 * @throws Exception
	 */
	private void callEDK0011D010(SessionHandle handle, IRequestParameterReadWrite param, ServiceComponentRequestInvoker scCall)
	throws Exception
	{
		DKSV0060_DKSV0060OP_EDK0011D010BSMapper haisoRegMapper = new DKSV0060_DKSV0060OP_EDK0011D010BSMapper();
		HashMap<String, Object> inMap = haisoRegMapper.editInMsg(param);
		JSYejbLog.println(JSYejbLog.DEBUG, this.getClass(), "配送実績登録処理の実行");
		Map<?, ?> result = scCall.run(inMap, handle);
		haisoRegMapper.editResultRP(result, param);

		if (JDKBPCommon.hasError(param))
		{
			throw new SCCallException("配送実績登録処理失敗", "0", 
					Integer.parseInt(param.getControlMapData("returnCode").toString()));
		}
	}

	/**
	 * 配送受付S-IFを呼び出します。
	 * @param handle セッションハンドル
	 * @param param パラメータ
	 * @param scCall SC呼び出しオブジェクト
	 * @throws Exception
	 */
	private void callEDK0011D020(SessionHandle handle, IRequestParameterReadWrite param, ServiceComponentRequestInvoker scCall)
	throws Exception
	{
		DKSV0060_DKSV0060OP_EDK0011D020BSMapper haisoRecvMapper = new DKSV0060_DKSV0060OP_EDK0011D020BSMapper();
		HashMap<String, Object> inMap = haisoRecvMapper.editInMsg(param);
		JSYejbLog.println(JSYejbLog.DEBUG, this.getClass(), "配送受付処理の実行");
		Map<?, ?> result = scCall.run(inMap, handle);
		haisoRecvMapper.editResultRP(result, param);

		if (JDKBPCommon.hasError(param))
		{
			throw new SCCallException("配送受付処理失敗", "0", 
					Integer.parseInt(param.getControlMapData("returnCode").toString()));
		}
	}

	/**
	 * 検証交換登録S-IFを呼び出します。
	 * @param handle セッションハンドル
	 * @param param パラメータ
	 * @param scCall SC呼び出しオブジェクト
	 * @throws Exception
	 */
	private void callEDK0181D010(SessionHandle handle, IRequestParameterReadWrite param, ServiceComponentRequestInvoker scCall)
	throws Exception
	{
		DKSV0060_DKSV0060OP_EDK0181D010BSMapper knshokkanRegMapper = new DKSV0060_DKSV0060OP_EDK0181D010BSMapper();
		HashMap<String, Object> inMap = knshokkanRegMapper.editInMsg(param);
		JSYejbLog.println(JSYejbLog.DEBUG, this.getClass(), "検証交換登録処理の実行");
		Map<?, ?> result = scCall.run(inMap, handle);
		knshokkanRegMapper.editResultRP(result, param);

		if (JDKBPCommon.hasError(param))
		{
			throw new SCCallException("検証交換登録処理失敗", "0", 
					Integer.parseInt(param.getControlMapData("returnCode").toString()));
		}
	}

	/**
	 * 機器提供サービス契約一意照会S-IFを呼び出します。
	 * @param handle セッションハンドル
	 * @param param パラメータ
	 * @param scCall SC呼び出しオブジェクト
	 * @param searchMap 検索マップ
	 * @throws Exception
	 */
	private void callEKK0341A010(SessionHandle handle, IRequestParameterReadWrite param, ServiceComponentRequestInvoker scCall, Map<String, String> searchMap)
	throws Exception
	{
		// 機器提供サービス契約一意照会
		DKSV0060_DKSV0060OP_EKK0341A010BSMapper kktkSvcKeiRefMapper = new DKSV0060_DKSV0060OP_EKK0341A010BSMapper();
		HashMap<String, Object> inMap = kktkSvcKeiRefMapper.editInMsg(param, searchMap);
		JSYejbLog.println(JSYejbLog.DEBUG, this.getClass(), "機器提供サービス契約一意照会処理の実行");
		Map<?, ?> result = scCall.run(inMap, handle);
		kktkSvcKeiRefMapper.editResultRP(result, param);

		if (JDKBPCommon.hasError(param))
		{
			throw new SCCallException("機器提供サービス契約一意照会処理失敗", "0", 
					Integer.parseInt(param.getControlMapData("returnCode").toString()));
		}
	}

	/**
	 * 機器提供サービス契約履歴一覧照会（SYSID）S-IFを呼び出します。
	 * @param handle セッションハンドル
	 * @param param パラメータ
	 * @param scCall SC呼び出しオブジェクト
	 * @throws Exception
	 */
	private void callEKK0341B031(SessionHandle handle, IRequestParameterReadWrite param, ServiceComponentRequestInvoker scCall)
	throws Exception
	{
		DKSV0060_DKSV0060OP_EKK0341B031BSMapper kktkSvcKeiHisRefMapper = new DKSV0060_DKSV0060OP_EKK0341B031BSMapper();
		HashMap<String, Object> inMap = kktkSvcKeiHisRefMapper.editInMsg(param);
		JSYejbLog.println(JSYejbLog.DEBUG, this.getClass(), "機器提供サービス契約履歴一覧照会（SYSID）処理の実行");
		Map<?, ?> result = scCall.run(inMap, handle);
		kktkSvcKeiHisRefMapper.editResultRP(result, param);

		if (JDKBPCommon.hasError(param))
		{
			throw new SCCallException("機器提供サービス契約履歴一覧照会（SYSID）処理失敗", "0", 
					Integer.parseInt(param.getControlMapData("returnCode").toString()));
		}
	}

	/**
	 * 機器提供サービス契約料金コース変更S-IFを呼び出します。
	 * @param handle セッションハンドル
	 * @param param パラメータ
	 * @param scCall SC呼び出しオブジェクト
	 * @throws Exception
	 */
	private void callEKK0341C160(SessionHandle handle, IRequestParameterReadWrite param, ServiceComponentRequestInvoker scCall)
	throws Exception
	{
		DKSV0060_DKSV0060OP_EKK0341C160BSMapper kktkSvcKeiPcrsUpdMapper = new DKSV0060_DKSV0060OP_EKK0341C160BSMapper();
		HashMap<String, Object> inMap = kktkSvcKeiPcrsUpdMapper.editInMsg(param);
		JSYejbLog.println(JSYejbLog.DEBUG, this.getClass(), "機器提供サービス契約料金コース変更処理の実行");
		Map<?, ?> result = scCall.run(inMap, handle);
		kktkSvcKeiPcrsUpdMapper.editResultRP(result, param);

		if (JDKBPCommon.hasError(param))
		{
			throw new SCCallException("機器提供サービス契約料金コース変更処理失敗", "0", 
					Integer.parseInt(param.getControlMapData("returnCode").toString()));
		}
	}

	/**
	 * 機器提供サービス契約料金コース変更確定S-IFを呼び出します。
	 * @param handle セッションハンドル
	 * @param param パラメータ
	 * @param scCall SC呼び出しオブジェクト
	 * @throws Exception
	 */
	private void callEKK0341C180(SessionHandle handle, IRequestParameterReadWrite param, ServiceComponentRequestInvoker scCall)
	throws Exception
	{
		DKSV0060_DKSV0060OP_EKK0341C180BSMapper kktkSvcKeiPcrsFixMapper = new DKSV0060_DKSV0060OP_EKK0341C180BSMapper();
		HashMap<String, Object> inMap = kktkSvcKeiPcrsFixMapper.editInMsg(param);
		JSYejbLog.println(JSYejbLog.DEBUG, this.getClass(), "機器提供サービス契約料金コース変更確定処理の実行");
		Map<?, ?> result = scCall.run(inMap, handle);
		kktkSvcKeiPcrsFixMapper.editResultRP(result, param);

		if (JDKBPCommon.hasError(param))
		{
			throw new SCCallException("機器提供サービス契約料金コース変更確定処理失敗", "0", 
					Integer.parseInt(param.getControlMapData("returnCode").toString()));
		}
	}

	/**
	 * 機器提供サービス契約機器変更S-IFを呼び出します。
	 * @param handle セッションハンドル
	 * @param param パラメータ
	 * @param scCall SC呼び出しオブジェクト
	 * @throws Exception
	 */
	private void callEKK0341C190(SessionHandle handle, IRequestParameterReadWrite param, ServiceComponentRequestInvoker scCall)
	throws Exception
	{
		DKSV0060_DKSV0060OP_EKK0341C190BSMapper kktkSvcKeiKikiUpdMapper = new DKSV0060_DKSV0060OP_EKK0341C190BSMapper();
		HashMap<String, Object> inMap = kktkSvcKeiKikiUpdMapper.editInMsg(param);
		JSYejbLog.println(JSYejbLog.DEBUG, this.getClass(), "機器提供サービス契約機器変更処理の実行");
		Map<?, ?> result = scCall.run(inMap, handle);
		kktkSvcKeiKikiUpdMapper.editResultRP(result, param);

		if (JDKBPCommon.hasError(param))
		{
			throw new SCCallException("機器提供サービス契約機器変更処理失敗", "0", 
					Integer.parseInt(param.getControlMapData("returnCode").toString()));
		}
	}

	/**
	 * 機器提供サービス契約情報変更S-IFを呼び出します。
	 * @param handle セッションハンドル
	 * @param param パラメータ
	 * @param scCall SC呼び出しオブジェクト
	 * @throws Exception
	 */
	private void callEKK0341C230(SessionHandle handle, IRequestParameterReadWrite param, ServiceComponentRequestInvoker scCall)
	throws Exception
	{
		DKSV0060_DKSV0060OP_EKK0341C230BSMapper kktkSvcKeiUpdMapper = new DKSV0060_DKSV0060OP_EKK0341C230BSMapper();
		HashMap<String, Object> inMap = kktkSvcKeiUpdMapper.editInMsg(param);
		JSYejbLog.println(JSYejbLog.DEBUG, this.getClass(), "機器提供サービス契約情報変更処理の実行");
		Map<?, ?> result = scCall.run(inMap, handle);
		kktkSvcKeiUpdMapper.editResultRP(result, param);

		if (JDKBPCommon.hasError(param))
		{
			throw new SCCallException("機器提供サービス契約情報変更処理失敗", "0", 
					Integer.parseInt(param.getControlMapData("returnCode").toString()));
		}
	}

	/**
	 * 機器提供サービス契約情報変更（契約変更中）S-IFを呼び出します。
	 * @param handle セッションハンドル
	 * @param param パラメータ
	 * @param scCall SC呼び出しオブジェクト
	 * @throws Exception
	 */
	private void callEKK0341C231(SessionHandle handle, IRequestParameterReadWrite param, ServiceComponentRequestInvoker scCall)
	throws Exception
	{
		DKSV0060_DKSV0060OP_EKK0341C231BSMapper kktkSvcKeiUpdMapper = new DKSV0060_DKSV0060OP_EKK0341C231BSMapper();
		HashMap<String, Object> inMap = kktkSvcKeiUpdMapper.editInMsg(param);
		JSYejbLog.println(JSYejbLog.DEBUG, this.getClass(), "機器提供サービス契約情報変更（契約変更中）処理の実行");
		Map<?, ?> result = scCall.run(inMap, handle);
		kktkSvcKeiUpdMapper.editResultRP(result, param);

		if (JDKBPCommon.hasError(param))
		{
			throw new SCCallException("機器提供サービス契約情報変更（契約変更中）処理失敗", "0", 
					Integer.parseInt(param.getControlMapData("returnCode").toString()));
		}
	}

	/**
	 * 機器提供サービス契約論理削除（住所変更）S-IFを呼び出します。
	 * @param handle セッションハンドル
	 * @param param パラメータ
	 * @param scCall SC呼び出しオブジェクト
	 * @throws Exception
	 */
	private void callEKK0341E020(SessionHandle handle, IRequestParameterReadWrite param, ServiceComponentRequestInvoker scCall)
	throws Exception
	{
		DKSV0060_DKSV0060OP_EKK0341E020BSMapper kktkSvcKeiDelMapper = new DKSV0060_DKSV0060OP_EKK0341E020BSMapper();
		HashMap<String, Object> inMap = kktkSvcKeiDelMapper.editInMsg(param);
		JSYejbLog.println(JSYejbLog.DEBUG, this.getClass(), "機器提供サービス契約論理削除（住所変更）処理の実行");
		Map<?, ?> result = scCall.run(inMap, handle);
		kktkSvcKeiDelMapper.editResultRP(result, param);

		if (JDKBPCommon.hasError(param))
		{
			throw new SCCallException("機器提供サービス契約論理削除（住所変更）処理失敗", "0", 
					Integer.parseInt(param.getControlMapData("returnCode").toString()));
		}
	}

	/**
	 * 住所変更明細更新S-IFを呼び出します。
	 * @param handle セッションハンドル
	 * @param param パラメータ
	 * @param scCall SC呼び出しオブジェクト
	 * @throws Exception
	 */
	private void callEKK2101C010(SessionHandle handle, IRequestParameterReadWrite param, ServiceComponentRequestInvoker scCall)
	throws Exception
	{
		DKSV0060_DKSV0060OP_EKK2101C010BSMapper adchgDtlUpdMapper = new DKSV0060_DKSV0060OP_EKK2101C010BSMapper();
		HashMap<String, Object> inMap = adchgDtlUpdMapper.editInMsg(param);
		JSYejbLog.println(JSYejbLog.DEBUG, this.getClass(), "住所変更明細更新処理の実行");
		Map<?, ?> result = scCall.run(inMap, handle);
		adchgDtlUpdMapper.editResultRP(result, param);

		if (JDKBPCommon.hasError(param))
		{
			throw new SCCallException("住所変更明細更新処理失敗", "0", 
					Integer.parseInt(param.getControlMapData("returnCode").toString()));
		}
	}

	/**
	 * サービス契約内訳<eo光電話>情報変更処理を行います。
	 * @param handle セッションハンドル
	 * @param param パラメータ
	 * @param svcKeiUcwkNo サービス契約内訳番号
	 * @return パラメータ
	 * @throws Exception
	 */
	@SuppressWarnings("unchecked")
	private void updateSvcKeiUcwkEohTel(SessionHandle handle, IRequestParameterReadWrite param, String svcKeiUcwkNo) throws Exception
	{
		ServiceComponentRequestInvoker scCall = new ServiceComponentRequestInvoker();

		// サービス契約内訳一意照会
		// サービス契約内訳<eo光電話>情報変更処理に必要な項目を取得
		DKSV0060_DKSV0060OP_EKK0161A010BSMapper svcKeiUcwkRefMapper = new DKSV0060_DKSV0060OP_EKK0161A010BSMapper();
		Map<String, String> searchMap = new HashMap<String, String>();
		searchMap.put("svc_kei_ucwk_no", svcKeiUcwkNo);
		HashMap inMap = svcKeiUcwkRefMapper.editInMsg(param, searchMap);
		JSYejbLog.println(JSYejbLog.DEBUG, this.getClass(), "サービス契約内訳一意照会処理の実行");
		Map result = scCall.run(inMap, handle);
		svcKeiUcwkRefMapper.editResultRP(result, param);

		if (JDKBPCommon.hasError(param))
		{
			throw new SCCallException("サービス契約内訳<eo光電話>一意照会処理失敗", "0", 
					Integer.parseInt(param.getControlMapData("returnCode").toString()));
		}

		// サービス契約内訳<eo光電話>一意照会
		// サービス契約内訳<eo光電話>情報変更処理に必要な項目を取得
		DKSV0060_DKSV0060OP_EKK0191A010BSMapper svcKeiUcwkEohTelRefMapper = new DKSV0060_DKSV0060OP_EKK0191A010BSMapper();
		searchMap = new HashMap<String, String>();
		searchMap.put("svc_kei_ucwk_no", svcKeiUcwkNo);
		inMap = svcKeiUcwkEohTelRefMapper.editInMsg(param, searchMap);
		JSYejbLog.println(JSYejbLog.DEBUG, this.getClass(), "サービス契約内訳<eo光電話>一意照会処理の実行");
		result = scCall.run(inMap, handle);
		svcKeiUcwkEohTelRefMapper.editResultRP(result, param);

		if (JDKBPCommon.hasError(param))
		{
			throw new SCCallException("サービス契約内訳<eo光電話>一意照会処理失敗", "0", 
					Integer.parseInt(param.getControlMapData("returnCode").toString()));
		}

		// サービス契約内訳<eo光電話>情報変更
		DKSV0060_DKSV0060OP_EKK0191C060BSMapper svcKeiUcwkUpdMapper = new DKSV0060_DKSV0060OP_EKK0191C060BSMapper();
		inMap = svcKeiUcwkUpdMapper.editInMsg(param, searchMap);
		JSYejbLog.println(JSYejbLog.DEBUG, this.getClass(), "サービス契約内訳<eo光電話>情報変更処理の実行");
		result = scCall.run(inMap, handle);
		svcKeiUcwkUpdMapper.editResultRP(result, param);

		if (JDKBPCommon.hasError(param))
		{
			throw new SCCallException("サービス契約内訳<eo光電話>情報変更処理失敗", "0", 
					Integer.parseInt(param.getControlMapData("returnCode").toString()));
		}
	}
}
