/**********************************************************************
 * All Rights reserved,Copyright (c) K-Opticom
 **********************************************************************
 *＜プログラム内容＞
 *   システム名      ：eo顧客基幹システム
 *   モジュール名    ：CHW01701SFLogic
 *   ソースファイル名：CHW01701SFLogic.java
 *   作成者          ：富士通
 *   日付            ：2011年11月17日
 *＜機能概要＞
 *   支払証明書発行のビューロジック部品です。
 *＜修正履歴＞
 *   バージョン  修正日       修正者      修正内容
 *   v1.00.00    2011/11/17               新規作成
 *	 v1.01.00	 2013/05/08	  FJ)大塚     メッセージ領域の背景色の設定対応
 *	 v9.00.00	 2014/08/25	  FJ)早崎     【OM-2014-0001880】支払証明書発行画面情報取得サービスに業務パラメータ管理一意照会を追加
 **********************************************************************/
package eo.web.webview.CHW01701SF;

import java.util.ArrayList;
import java.util.HashMap;

import com.fujitsu.futurity.web.x31.X31CWebConst;
import com.fujitsu.futurity.web.x31.X31SDataBeanAccess;
import com.fujitsu.futurity.web.x31.X31SDataBeanAccessArray;

import eo.common.constant.JACStrConst;
import eo.common.constant.JPCModelConstant;
import eo.common.constant.JPCOnlineMessageConstant;
import eo.common.util.JPCEditString;
import eo.web.webview.JCCWebBusinessLogic;
import eo.web.webview.CommonInfoCF.CommonInfoCFConst;
import eo.web.webview.common.JACScreenConst;
import eo.web.webview.common.JCCWebCommon;
import eo.web.webview.common.JCHCommonServiceUtil;
import eo.web.webview.common.JCHPageTransferUtil;
import eo.web.webview.common.JCHPulldownUtil;
import eo.web.webview.mapping.CHSV0040_CHSV0040OPDBMapper;
import eo.web.webview.mapping.CHSV0041_CHSV0041OPDBMapper;

/**
 * 支払証明書発行のビューロジックを提供します。
 * <p>
 * <BR>
 * 
 * @author 富士通
 */
public class CHW01701SFLogic extends JCCWebBusinessLogic
{

	/** ユースケースID(支払証明書発行情報取得) */
	private static final String USECASE_ID_CHSV0040 = "CHSV0040";

	/** ユースケースID(支払証明書発行確認画面) */
	private static final String USECASE_ID_CHSV0041 = "CHSV0041";

	/** メッセージＩＤ(ＮＧワード) */
	private static final String MESSAGE_ID_NG_WORD = "EKB8580-KW";

	/** 出力種別コード（印刷） */
	private static final String OUTPUT_SBT_CD_PRINT = "01";

	/** 出力種別コード（ファイル出力） */
	private static final String OUTPUT_SBT_CD_FILE = "02";

	/**
	 * 支払証明書発行画面の初期表示処理を行います。 <br>
	 * 
	 * @return 実行結果
	 * @throws Exception 例外が発生した場合
	 */
	public boolean init() throws Exception
	{

		// 共有フォームBeanのアクセサを取得する
		X31SDataBeanAccess commoninfoBean = super.getCommonInfoBean();

		// 遷移先画面IDを判定して画面IDに対応する初期表示処理を呼び出す
		String screenId = commoninfoBean.sendMessageString(CommonInfoCFConst.NEXT_SCREEN_ID, X31CWebConst.DATABEAN_GET_VALUE);
		if (screenId.equals(JACScreenConst.SCREEN_ID_CHW01701))
		{
			initAddScreen();
		}

		return true;
	}

	/**
	 * 支払証明書発行確認画面に遷移します。 <br>
	 * 
	 * @return 実行結果
	 * @throws Exception 例外が発生した場合
	 */
	public boolean printCfm() throws Exception
	{

		// 共有フォームBeanのアクセスクラスを取得
		X31SDataBeanAccess commoninfoBean = super.getCommonInfoBean();

		// サービスフォームBeanのアクセサを取得する
		X31SDataBeanAccess bean = super.getServiceFormBean();

		// サービスフォームBeanのアクセサを配列化する
		X31SDataBeanAccess[] paramBeans = { bean, commoninfoBean };

		//発行日（年月日）
		String hakkoYear = paramBeans[0].sendMessageString(CHW01701SFConst.HAKKO_YEAR, X31CWebConst.DATABEAN_GET_VALUE);
		String hakkoMon = paramBeans[0].sendMessageString(CHW01701SFConst.HAKKO_MON, X31CWebConst.DATABEAN_GET_VALUE);
		String hakkoDay = paramBeans[0].sendMessageString(CHW01701SFConst.HAKKO_DAY, X31CWebConst.DATABEAN_GET_VALUE);
		paramBeans[0].sendMessageString(CHW01701SFConst.HAKKO_YMD, X31CWebConst.DATABEAN_SET_VALUE, hakkoYear + hakkoMon + hakkoDay);

		//出力種別
		X31SDataBeanAccessArray oputSbtInfo = paramBeans[0].getDataBeanArray(CHW01701SFConst.OPUT_SBT_INFO);
		int oputSbtSelIndex = Integer.parseInt(paramBeans[0].sendMessageString(CHW01701SFConst.OPUT_SBT_SEL_INDEX, X31CWebConst.DATABEAN_GET_VALUE));
		String oputSbtSelNm = oputSbtInfo.getDataBean(oputSbtSelIndex).sendMessageString(CHW01701SFConst.OPUT_SBT_NM_01, X31CWebConst.DATABEAN_GET_VALUE);
		paramBeans[0].sendMessageString(CHW01701SFConst.OPUT_SBT_SEL_NM, X31CWebConst.DATABEAN_SET_VALUE, oputSbtSelNm);
		String oputSbtSelCd = oputSbtInfo.getDataBean(oputSbtSelIndex).sendMessageString(CHW01701SFConst.OPUT_SBT_CD_01, X31CWebConst.DATABEAN_GET_VALUE);
		paramBeans[0].sendMessageString(CHW01701SFConst.OPUT_SBT_SEL_CD, X31CWebConst.DATABEAN_SET_VALUE, oputSbtSelCd);

		//手数料
		String commisionSelCd = JCHPulldownUtil.getSelectedValue(paramBeans, CHW01701SFConst.COMMISION_SEL_INFO, CHW01701SFConst.COMMISION_CD_LIST_02,
				CHW01701SFConst.COMMISION_SEL_02);
		String commisionSelNm = JCHPulldownUtil.getSelectedValue(paramBeans, CHW01701SFConst.COMMISION_SEL_INFO, CHW01701SFConst.COMMISION_NM_LIST_02,
				CHW01701SFConst.COMMISION_SEL_02);
		String selOutputPrcGrpCd = JCHPulldownUtil.getSelectedValue(paramBeans, CHW01701SFConst.COMMISION_SEL_INFO,
				CHW01701SFConst.OUTPUT_PRC_GRP_CD_LIST_02, CHW01701SFConst.COMMISION_SEL_02);
		String selOutPcrsCd = JCHPulldownUtil.getSelectedValue(paramBeans, CHW01701SFConst.COMMISION_SEL_INFO, CHW01701SFConst.OUT_PCRS_CD_LIST_02,
				CHW01701SFConst.COMMISION_SEL_02);
		String selOutPrcSvcCd = JCHPulldownUtil.getSelectedValue(paramBeans, CHW01701SFConst.COMMISION_SEL_INFO, CHW01701SFConst.OUT_PRC_SVC_CD_LIST_02,
				CHW01701SFConst.COMMISION_SEL_02);
		String selOutPrcKmkCd = JCHPulldownUtil.getSelectedValue(paramBeans, CHW01701SFConst.COMMISION_SEL_INFO, CHW01701SFConst.OUT_PRC_KMK_CD_LIST_02,
				CHW01701SFConst.COMMISION_SEL_02);

		paramBeans[0].sendMessageString(CHW01701SFConst.COMMISION_SEL_CD, X31CWebConst.DATABEAN_SET_VALUE, commisionSelCd);
		paramBeans[0].sendMessageString(CHW01701SFConst.COMMISION_SEL_NM, X31CWebConst.DATABEAN_SET_VALUE, commisionSelNm);
		paramBeans[0].sendMessageString(CHW01701SFConst.SEL_OUTPUT_PRC_GRP_CD, X31CWebConst.DATABEAN_SET_VALUE, selOutputPrcGrpCd);
		paramBeans[0].sendMessageString(CHW01701SFConst.SEL_OUT_PCRS_CD, X31CWebConst.DATABEAN_SET_VALUE, selOutPcrsCd);
		paramBeans[0].sendMessageString(CHW01701SFConst.SEL_PRC_SVC_CD, X31CWebConst.DATABEAN_SET_VALUE, selOutPrcSvcCd);
		paramBeans[0].sendMessageString(CHW01701SFConst.SEL_OUT_PRC_KMK_CD, X31CWebConst.DATABEAN_SET_VALUE, selOutPrcKmkCd);

		// ユーザーIDの取得
		String userId = commoninfoBean.sendMessageString(CommonInfoCFConst.USER_ID, X31CWebConst.DATABEAN_GET_VALUE);

		// サービス実行
		if (!this.execCHSV0041(paramBeans, JPCModelConstant.FUNC_CD_2, userId))
		{
			return true;
		}

		// メッセージ領域の背景色の設定
		JCCWebCommon.setMessageAreaBackColor(this, "1");

		// メッセージの設定
		JCCWebCommon.setMessageInfo(this, JPCOnlineMessageConstant.EKB0370__I, new String[] {"発行"});

		// 遷移先画面を設定する 
		commoninfoBean.sendMessageString(CommonInfoCFConst.NEXT_SCREEN_ID, X31CWebConst.DATABEAN_SET_VALUE, JACScreenConst.SCREEN_ID_CHW01702);
		commoninfoBean.sendMessageString(CommonInfoCFConst.NEXT_SCREEN_NAME, X31CWebConst.DATABEAN_SET_VALUE, JACScreenConst.SCREEN_NAME_CHW01702);

		return true;
	}

	/**
	 * 修正を処理します。 <br>
	 * 
	 * @return 実行結果
	 * @throws Exception 例外が発生した場合
	 */
	public boolean shusei() throws Exception
	{

		// 共有フォームBeanのアクセサを取得する
		X31SDataBeanAccess commoninfoBean = super.getCommonInfoBean();
		// 遷移先画面を設定する
		commoninfoBean.sendMessageString(CommonInfoCFConst.NEXT_SCREEN_ID, X31CWebConst.DATABEAN_SET_VALUE, JACScreenConst.SCREEN_ID_CHW01701);
		commoninfoBean.sendMessageString(CommonInfoCFConst.NEXT_SCREEN_NAME, X31CWebConst.DATABEAN_SET_VALUE, JACScreenConst.SCREEN_NAME_CHW01701);

		return true;
	}

	/**
	 * モーダル反映画面に遷移して画面を閉じます。 <br>
	 * 
	 * @return 実行結果
	 * @throws Exception 例外が発生した場合
	 */
	public boolean close() throws Exception
	{
		// 遷移先画面IDを取得し、子画面を閉じる共通処理を呼出す
		return JCHPageTransferUtil.closeTransfer(this, JCCWebCommon.getScreenId(this));
	}

	/**
	 * 確定完了を処理します。 <br>
	 * 
	 * @return 実行結果
	 * @throws Exception 例外が発生した場合
	 */
	public boolean fixFin() throws Exception
	{

		// 共有フォームBeanのアクセスクラスを取得
		X31SDataBeanAccess commoninfoBean = super.getCommonInfoBean();

		// サービスフォームBeanのアクセサを取得する
		X31SDataBeanAccess bean = super.getServiceFormBean();

		// サービスフォームBeanのアクセサを配列化する
		X31SDataBeanAccess[] paramBeans = { bean, commoninfoBean };

		// ユーザーIDの取得
		String userId = commoninfoBean.sendMessageString(CommonInfoCFConst.USER_ID, X31CWebConst.DATABEAN_GET_VALUE);

		// サービス実行
		this.execCHSV0041(paramBeans, JPCModelConstant.FUNC_CD_1, userId);

		return true;
	}

	/**
	 * 支払証明書発行画面の初期表示処理を行います。 <br>
	 * 
	 * @throws Exception 例外が発生した場合
	 */
	private void initAddScreen() throws Exception
	{

		// 画面間引継情報を設定する
		JCCWebCommon.getScreenInfo(this);

		// サービスフォームBeanのアクセサを取得する
		X31SDataBeanAccess bean = super.getServiceFormBean();

		// サービスフォームBeanのアクセサを配列化する
		X31SDataBeanAccess[] paramBeans = { bean };

		//支払証明書発行画面情報取得サービス実行
		this.execCHSV0040(paramBeans);

		// 初期値設定
		// オンライン運用日
		String opeDate = JCCWebCommon.getOpeDate(this, JACStrConst.SYS_CD_CH);
		paramBeans[0].sendMessageString(CHW01701SFConst.HAKKO_YEAR, X31CWebConst.DATABEAN_SET_VALUE, JPCEditString.toYearFromYmd(opeDate));
		paramBeans[0].sendMessageString(CHW01701SFConst.HAKKO_MON, X31CWebConst.DATABEAN_SET_VALUE, JPCEditString.toMonthFromYmd(opeDate));
		paramBeans[0].sendMessageString(CHW01701SFConst.HAKKO_DAY, X31CWebConst.DATABEAN_SET_VALUE, JPCEditString.toDayFromYmd(opeDate));
		paramBeans[0].sendMessageString(CHW01701SFConst.UNYO_YMD, X31CWebConst.DATABEAN_SET_VALUE, opeDate);

		// 帳票出力フラグ
		paramBeans[0].sendMessageString(CHW01701SFConst.OUTPUT_FLG, X31CWebConst.DATABEAN_SET_VALUE, "0");

		// 出力種別インデックス
		paramBeans[0].sendMessageString(CHW01701SFConst.OPUT_SBT_SEL_INDEX, X31CWebConst.DATABEAN_SET_VALUE, "0");

		return;
	}

	/**
	 * 支払証明書発行画面情報取得サービスを実行します。 <br>
	 * 
	 * @param paramBeans 支払証明書発行サービスフォームBean
	 */
	private void execCHSV0040(X31SDataBeanAccess[] paramBeans)
	{
		// ユースケースID格納用マップを生成。
		HashMap<String, Object> paramMap = new HashMap<String, Object>();
		paramMap.put(X31CWebConst.TELEGRAM_INFO_USECASE_ID, USECASE_ID_CHSV0040);

		// サービスに渡すMapを生成する
		HashMap<String, Object> inDataMap = new HashMap<String, Object>();
		CHSV0040_CHSV0040OPDBMapper mapper = new CHSV0040_CHSV0040OPDBMapper();

		mapper.setCHSV004001SC(paramBeans, inDataMap, JPCModelConstant.FUNC_CD_1); // EZM0171B012 : 出力種別
		mapper.setCHSV004002SC(paramBeans, inDataMap, JPCModelConstant.FUNC_CD_1); // EAC0281B020 : 手数料一覧照会
		// OM-2014-0001880 ADD START
		mapper.setCHSV004003SC(paramBeans, inDataMap, JPCModelConstant.FUNC_CD_1);	// EZM0321A010 : 業務パラメータ管理一意照会
		// OM-2014-0001880 ADD END

		// 検索結果格納用マップを生成。
		HashMap<String, Object> outputMap = new HashMap<String, Object>();

		// サービスの呼び出し
		invokeService(paramMap, inDataMap, outputMap);

		// 下りマッピング
		mapper.getCHSV004001SC(paramBeans, outputMap);
		mapper.getCHSV004002SC(paramBeans, outputMap);
		// OM-2014-0001880 ADD START
		mapper.getCHSV004003SC(paramBeans, outputMap);
		// OM-2014-0001880 ADD END

		return;
	}

	/**
	 * 支払証明書発行確認サービスを実行します。 <br>
	 * 
	 * @param paramBeans 支払証明書発行サービスフォームBean
	 * @param funcCd 機能コード
	 * @param userId ユーザーＩＤ
	 */
	@SuppressWarnings("unchecked")
	private boolean execCHSV0041(X31SDataBeanAccess[] paramBeans, String funcCd, String userId) throws Exception
	{

		// ユースケースID格納用マップを生成。
		HashMap<String, Object> paramMap = new HashMap<String, Object>();
		paramMap.put(X31CWebConst.TELEGRAM_INFO_USECASE_ID, USECASE_ID_CHSV0041);
		// サービスフォームBean アクセスクラスの取得
		X31SDataBeanAccess svcFormBean = super.getServiceFormBean();

		// 上り格納マップ
		HashMap<String, Object> inDataMap = new HashMap<String, Object>();
		CHSV0041_CHSV0041OPDBMapper mapper = new CHSV0041_CHSV0041OPDBMapper();

		mapper.setCHSV004101SC(paramBeans, inDataMap, JPCModelConstant.FUNC_CD_2); 	// ECH0501A010 : 料金スケジュール定義一意照会
		mapper.setCHSV004102SC(paramBeans, inDataMap, funcCd); 						// EAC0171D010 : 一時金登録
		mapper.setCHSV004103SC(paramBeans, inDataMap, JPCModelConstant.FUNC_CD_1); 	// ECH0311B010 : 領収一覧照会
		mapper.setTAIOKIROKADDCC(paramBeans, inDataMap, funcCd, this); 				// TAIOKIROKADDCC : 顧客対応記録登録CC
		mapper.setADDHOTVOICCC(paramBeans, inDataMap, funcCd, this); 				// ADDHOTVOICCC : 顧客対応記録登録CC
		mapper.setPRCTAIOKIROKADDCC(paramBeans, inDataMap, funcCd, this); 			// PRCTAIOKIROKADDCC : 料金対応記録登録CC
		mapper.setTUSHINSVCPAYSHOMESCHOHYOCC(paramBeans, inDataMap, funcCd); 		// TUSHINSVCPAYSHOMESCHOHYOCC : 通信サービス支払証明書帳票CC
		
		if (JPCModelConstant.FUNC_CD_2.equals(funcCd))
		{
			// NGワードチェックフラグを設定
			((HashMap)inDataMap.get(JACStrConst.PRCTAIOKIROKADDCC_MAP_ID)).put(JACStrConst.KEY_NGWORD_CHECK_FLG, "1");
		}

		// 結果格納用マップを生成。
		HashMap<String, Object> outputMap = new HashMap<String, Object>();

		// サービスの呼び出し
		invokeService(paramMap, inDataMap, outputMap);

		if (JPCModelConstant.FUNC_CD_2.equals(funcCd))
		{
			// ＮＧワードチェック
			ArrayList<String> ngWordList = JCHCommonServiceUtil.getNgWordList(outputMap);

			// NGワードが存在する場合、警告メッセージ表示
			if (!ngWordList.isEmpty())
			{
				for (int i = 0; i < ngWordList.size(); i++)
				{
					JCCWebCommon.setMessageInfo(this, MESSAGE_ID_NG_WORD, new String[]{ CHW01701SFConst.KIJI, ngWordList.get(i)});
				}
				return false;
			}
		}

		if(JPCModelConstant.FUNC_CD_1.equals(funcCd))
		{
			String oputSbtCd = paramBeans[0].sendMessageString(CHW01701SFConst.OPUT_SBT_SEL_CD, X31CWebConst.DATABEAN_GET_VALUE);
			String outFileNm = JACStrConst.KARA_MOJI;
			if(oputSbtCd.equals(OUTPUT_SBT_CD_PRINT))
			{
				// 出力する帳票の情報を取得
				HashMap outFileInfMap = ((HashMap)((ArrayList)outputMap.get("TELEGRAM_INFO_ATTACH_FILE_LIST")).get(0));
				// 出力するファイルデータを取得
				byte[] outFileData = (byte[])outFileInfMap.get("TELEGRAM_INFO_ATTACH_FILE");
				// 出力するファイル名を取得
				String outFileName = (String)outFileInfMap.get("TELEGRAM_INFO_ATTACH_ITEM_NAMAE");
				// ダウンロード部品を呼出
				// 出力するファイルをセッションに格納する
				outFileNm = outFileName + ".pdf";
				HashMap<String, Object> printInfo = new HashMap<String, Object>();
				printInfo.put("output_chohyo", outFileData);
				printInfo.put("chohyo_name", outFileNm);

				JCCWebCommon.setScreenInfo(this, JACScreenConst.SCREEN_ID_ACW00699, printInfo);

				svcFormBean.sendMessageString(CHW01701SFConst.OUTPUT_FLG, X31CWebConst.DATABEAN_SET_VALUE, "1");
			} 
			else 
			{
				this.close();
			}
		
		}

		return true;
	}

	/**
	 * 支払確定確認画面 印刷確定処理
	 * 
	 * @return 処理結果
	 * @throws Exception
	 */
	public boolean printFin() throws Exception
	{
		// サービスフォームBeanのデータBeanアクセスクラスを取得。
		X31SDataBeanAccess bean = super.getServiceFormBean();
		
		HashMap<String, Object> printInfo = JCCWebCommon.getScreenInfo(this, JACScreenConst.SCREEN_ID_ACW00699);
		if(printInfo != null && printInfo.containsKey("output_chohyo") && printInfo.containsKey("chohyo_name"))
		{
			JCCWebCommon.setTempDownloadFile(this, (byte[])printInfo.get("output_chohyo")
					, (String)printInfo.get("chohyo_name"));
			
			bean.sendMessageString(CHW01701SFConst.OUTPUT_FLG, X31CWebConst.DATABEAN_SET_VALUE, "0");
			JCCWebCommon.removeScreenInfo(this, JACScreenConst.SCREEN_ID_CHW01701);
		}
		return true;
	}

	/**
	 * アンロード処理.<br>
	 * 自画面がクローズした時、呼び元に戻る。
	 * 
	 * @return boolean
	 * @throws Exception
	 */
	public boolean unload() throws Exception
	{
		return this.close();
	}
}
