/*******************************************************************************
*	 All Rights reserved,Copyright (c) K-Opticom 
********************************************************************************
*＜プログラム内容＞
*	システム名		：eo顧客基幹システム
*	モジュール名	：CNW01001SFLogic
*	ソースファイル名：CNW01001SFLogic.java
*	作成者			：EK908988
*	日付			：2011年08月03日
*＜機能概要＞
*	コンテンツサービス毎最新累計参照のViewロジックです。
*＜修正履歴＞
*	バージョン	修正日		修正者		修正内容
*	ｖ1.00.00
*	ｖ3.00.00	2012/10/22	FJ)小林		【ST4-2012-0000046】性能対応
*	ｖ4.00.00	2013/01/23	FJ)小林		ST4-2012-0000256:コンテンツ毎売上集計参照画面性能改善
*	ｖ8.00.00	2014/03/03	FJ)味岡		OM-2014-0000858:コンテンツ毎売上集計参照画面機能修正(昨日までのデータのみ表示)
*
********************************************************************************/

package eo.web.webview.CNW01001SF;

import java.util.EventObject;
import java.util.HashMap;

import com.fujitsu.futurity.web.x31.X31CID;
import com.fujitsu.futurity.web.x31.X31CMessageResult;
import com.fujitsu.futurity.web.x31.X31CWebConst;
import com.fujitsu.futurity.web.x31.X31SDataBeanAccess;
import com.fujitsu.futurity.web.x31.X31SDataBeanAccessArray;
import com.fujitsu.futurity.web.x33.X33SException;

import eo.web.webview.JCCWebBusinessLogic;
import eo.web.webview.CNW01001SF.CNW01001SFConst;
import eo.web.webview.CommonInfoCF.CommonInfoCFConst;
import eo.web.webview.common.JCCWebCommon;
import eo.web.webview.common.JCNScreenConst;
import eo.web.webview.common.JCNWebConst;
import eo.web.webview.mapping.CNSV0025_CNSV0025OPDBMapper;
import eo.web.webview.mapping.CNSV0026_CNSV0026OPDBMapper;
import eo.common.constant.JPCModelConstant;

import eo.common.util.JCCToolTextDateFormat;
import eo.common.util.JPCDateUtil;

/**
 * コンテンツサービス毎最新累計参照のViewロジック<p>
 * <BR>
 * @author 富士通
 */
@SuppressWarnings("serial")
public class CNW01001SFLogic extends JCCWebBusinessLogic
{
	// 改行コード
	private static final String STR_CRLF = "\r\n";
	// ダウンロードファイル名
	private static final String CSV_FILE_NAME = "コンテンツサービス毎最新累計_";
	// 拡張子
	private static final String KAKUTYO_CSV = ".csv";
	
	// 曜日
	private static final String[] yobiStr = {"", "日", "月", "火", "水", "木", "金", "土"};

	/**
	 * 親クラスX31BWebBusinessLogicのreceiveMessageWebを
	 * オーバーライドして自動生成されたメソッドです。
	 * @param arg0 (I) イベント情報
	 * @param arg1 (I) WebFWでは使用しません
	 * @param arg2 (I) WebFWでは使用しません
	 * @return 処理結果（true:正常終了、false:エラー）
	 * @throws X33SException X33SException
	 */
	@Override
	protected boolean receiveMessageWeb(X31CID arg0, Object arg1,
			EventObject arg2) throws X33SException
	{
		// TODO 自動生成されたメソッドスタブ
		return false;
	}

	/**
	 * コンテンツサービス毎最新累計参照の初期表示を行います。<br>
	 * 
	 * @return 処理結果（true:正常終了、false:エラー）
	 * @throws Exception
	 */
	@SuppressWarnings("unchecked")
	public boolean action_init() throws Exception
	{
		// 共通Bean取得
		X31SDataBeanAccess commoninfoBean = super.getCommonInfoBean();
		
		// 親画面のBean取得
		X31SDataBeanAccess bean = super.getServiceFormBean();

		// マッピングクラスに渡すため、配列に作り変える
		X31SDataBeanAccess[] paramBean = {bean};
		
		// ユースケースID格納用マップ生成
		HashMap paramMap = new HashMap();
		// ユースケースID設定
		paramMap.put(X31CWebConst.TELEGRAM_INFO_USECASE_ID, "CNSV0025");

		// マッピングクラスのインスタンス作成
		CNSV0025_CNSV0025OPDBMapper mapper = new CNSV0025_CNSV0025OPDBMapper();
		HashMap dataMap = new HashMap();
		mapper.setCNSV002501SC(paramBean, dataMap, "1");

		// 検索結果格納用マップ生成
		HashMap outputMap = new HashMap();

		// SQL呼出し
		X31CMessageResult msgResult = invokeService(paramMap, dataMap, outputMap);

		// エラー処理 
		if(msgResult != null)
		{
			JCCWebCommon.setMessageInfo(this, msgResult);
			return true;
		}
		
		// beanのクリア
		bean.getDataBeanArray(CNW01001SFConst.CONT_SVC_NM_LIST).clearArray();
		bean.getDataBeanArray(CNW01001SFConst.CONT_SVC_KOBET_LIST).clearArray();

		// 検索結果の取り出し
		mapper.getCNSV002501SC(paramBean, outputMap);

		// ボタン表示設定
		bean.sendMessageBoolean(CNW01001SFConst.CONT_SVC_CHOICE_BTN_CTL, X31CWebConst.DATABEAN_SET_VALUE, true);
		bean.sendMessageBoolean(CNW01001SFConst.CONT_SVC_RLS_BTN_CTL, X31CWebConst.DATABEAN_SET_VALUE, true);
		bean.sendMessageBoolean(CNW01001SFConst.SEARCH_BTN_CTL, X31CWebConst.DATABEAN_SET_VALUE, true);
		bean.sendMessageBoolean(CNW01001SFConst.CLR_BTN_CTL, X31CWebConst.DATABEAN_SET_VALUE, true);
		bean.sendMessageBoolean(CNW01001SFConst.DL_BTN_CTL, X31CWebConst.DATABEAN_SET_VALUE, true);
		
		// ラジオボタン設定（日別）
		bean.sendMessageString(CNW01001SFConst.SHUK_TANI, X31CWebConst.DATABEAN_SET_VALUE, "1");
		// 一覧表示設定
		bean.sendMessageBoolean(CNW01001SFConst.LIST_DSP_CTL, X31CWebConst.DATABEAN_SET_VALUE, false);
		bean.sendMessageBoolean(CNW01001SFConst.DOWNLOAD_LIST_CTL, X31CWebConst.DATABEAN_SET_VALUE, true);

		// 検索エラーフラグの取得
		String searchError = JCCWebCommon.getSearchErrFlg("CNSV002501SC", outputMap);
		if (JPCModelConstant.SEARCH_ERR_FLG_ZERO.equals(searchError))
		{
			// 検索結果０件
			JCCWebCommon.setMessageInfo(this, JCNWebConst.SEARCH_ERR_MESSAGE_ZERO);
			// ボタン非表示
			bean.sendMessageBoolean(CNW01001SFConst.CONT_SVC_CHOICE_BTN_CTL, X31CWebConst.DATABEAN_SET_VALUE, false);
			bean.sendMessageBoolean(CNW01001SFConst.CONT_SVC_RLS_BTN_CTL, X31CWebConst.DATABEAN_SET_VALUE, false);
			bean.sendMessageBoolean(CNW01001SFConst.SEARCH_BTN_CTL, X31CWebConst.DATABEAN_SET_VALUE, false);
			bean.sendMessageBoolean(CNW01001SFConst.CLR_BTN_CTL, X31CWebConst.DATABEAN_SET_VALUE, false);
			bean.sendMessageBoolean(CNW01001SFConst.DL_BTN_CTL, X31CWebConst.DATABEAN_SET_VALUE, false);
		}

		// 遷移元画面IDの取得
		String nextScreenId = JCCWebCommon.getScreenId(this);
		if (nextScreenId != null)
		{
			// 戻るボタンに切替
			bean.sendMessageBoolean(CNW01001SFConst.CLOSE_CTRL, X31CWebConst.DATABEAN_SET_VALUE, false);
		}

		// 遷移先の画面IDを共有フォームBeanの項目に設定する。
		commoninfoBean.sendMessageString(CommonInfoCFConst.NEXT_SCREEN_ID,
				X31CWebConst.DATABEAN_SET_VALUE, JCNScreenConst.SCREEN_ID_CNW01001);
		
		// 遷移先の画面名を共有フォームBeanの項目に設定する。
		commoninfoBean.sendMessageString(CommonInfoCFConst.NEXT_SCREEN_NAME,
				X31CWebConst.DATABEAN_SET_VALUE, JCNScreenConst.SCREEN_NAME_CNW01001);

		return true;
	}

	/**
	 * コンテンツサービス毎最新累計参照の検索ボタン押下時の処理を行います。<br>
	 * 
	 * @return 処理結果（true:正常終了、false:エラー）
	 * @throws Exception
	 */
	public boolean action_search() throws Exception
	{
		// 共通Bean取得
		X31SDataBeanAccess commoninfoBean = super.getCommonInfoBean();
		
		// 親画面のBean取得
		X31SDataBeanAccess bean = super.getServiceFormBean();

		// 検索処理の実行
		listSearch();

		// 一覧表示設定
		bean.sendMessageBoolean(CNW01001SFConst.LIST_DSP_CTL, X31CWebConst.DATABEAN_SET_VALUE, true);
		bean.sendMessageBoolean(CNW01001SFConst.DOWNLOAD_LIST_CTL, X31CWebConst.DATABEAN_SET_VALUE, true);

		// 遷移先の画面IDを共有フォームBeanの項目に設定する。
		commoninfoBean.sendMessageString(CommonInfoCFConst.NEXT_SCREEN_ID,
				X31CWebConst.DATABEAN_SET_VALUE, JCNScreenConst.SCREEN_ID_CNW01001);
		
		// 遷移先の画面名を共有フォームBeanの項目に設定する。
		commoninfoBean.sendMessageString(CommonInfoCFConst.NEXT_SCREEN_NAME,
				X31CWebConst.DATABEAN_SET_VALUE, JCNScreenConst.SCREEN_NAME_CNW01001);

		return true;
	}
	
	/**
	 * コンテンツサービス毎最新累計参照のダウンロードボタン押下時の処理を行います。<br>
	 * 
	 * @return 処理結果（true:正常終了、false:エラー）
	 * @throws Exception
	 */
	public boolean action_download() throws Exception
	{
		// 共通Bean取得
		X31SDataBeanAccess commoninfoBean = super.getCommonInfoBean();
		
		// 親画面のBean取得
		X31SDataBeanAccess bean = super.getServiceFormBean();

		// 検索処理の実行
		listSearch();

		// 一覧表示設定（ダウンロード時は一覧表示しない）
		bean.sendMessageBoolean(CNW01001SFConst.LIST_DSP_CTL, X31CWebConst.DATABEAN_SET_VALUE, true);
		bean.sendMessageBoolean(CNW01001SFConst.DOWNLOAD_LIST_CTL, X31CWebConst.DATABEAN_SET_VALUE, false);

		// 遷移先の画面IDを共有フォームBeanの項目に設定する。
		commoninfoBean.sendMessageString(CommonInfoCFConst.NEXT_SCREEN_ID,
				X31CWebConst.DATABEAN_SET_VALUE, JCNScreenConst.SCREEN_ID_CNW01001);
		
		// 遷移先の画面名を共有フォームBeanの項目に設定する。
		commoninfoBean.sendMessageString(CommonInfoCFConst.NEXT_SCREEN_NAME,
				X31CWebConst.DATABEAN_SET_VALUE, JCNScreenConst.SCREEN_NAME_CNW01001);

		String fileName = CSV_FILE_NAME + JCCWebCommon.getSysDateTime() + KAKUTYO_CSV;
		
		// ファイルのダウンロード
		JCCWebCommon.setTempDownloadFile(this, createFile().getBytes("Windows-31J"), fileName);

		return true;
	}
	
	/**
	 * コンテンツサービス毎最新累計参照の戻る押下時の処理を行います。<br>
	 * 
	 * @return 処理結果（true:正常終了、false:エラー）
	 * @throws Exception
	 */
	public boolean action_back() throws Exception
	{
		// 共通Bean取得
		X31SDataBeanAccess commoninfoBean = super.getCommonInfoBean();

		// 親画面のBean取得
		X31SDataBeanAccess bean = super.getServiceFormBean();

		// 次画面移送用のマップ作成
		HashMap<String, Object> dataMap = new HashMap<String, Object>();

		// 移送データ設定

		// 遷移元の画面ID取得
		String nextScreenId = JCCWebCommon.getScreenId(this);
		String nextScreenNm = "";

		// 画面情報を設定
		JCCWebCommon.setScreenInfo(this, nextScreenId, dataMap);
		JCCWebCommon.setScreenId(this, nextScreenId, JCNScreenConst.SCREEN_ID_CNW01001);

		// 遷移先の画面IDを共有フォームBeanの項目に設定する。
		commoninfoBean.sendMessageString(CommonInfoCFConst.NEXT_SCREEN_ID,
				X31CWebConst.DATABEAN_SET_VALUE, nextScreenId);
		
		// 遷移先の画面名を共有フォームBeanの項目に設定する。
		commoninfoBean.sendMessageString(CommonInfoCFConst.NEXT_SCREEN_NAME,
				X31CWebConst.DATABEAN_SET_VALUE, nextScreenNm);

		return true;
	}
	
	/**
	 * コンテンツサービス毎最新累計検索処理
	 * @return
	 */
	private boolean listSearch()
	{
		// 親画面のBean取得
		X31SDataBeanAccess bean = super.getServiceFormBean();

		// マッピングクラスに渡すため、配列に作り変える
		X31SDataBeanAccess[] paramBean = {bean};
		
		// ユースケースID格納用マップ生成
		HashMap<String, String> paramMap = new HashMap<String, String>();
		// ユースケースID設定
		paramMap.put(X31CWebConst.TELEGRAM_INFO_USECASE_ID, "CNSV0026");
		// マッピングクラスのインスタンス作成
		CNSV0026_CNSV0026OPDBMapper mapper = new CNSV0026_CNSV0026OPDBMapper();
		HashMap<String, Object> dataMap = new HashMap<String, Object>();
		// お客様会員数集計（累計）
//		mapper.setCNSV002601SC(paramBean, dataMap, "4");
		// お客様会員数集計（新規）
//		mapper.setCNSV002602SC(paramBean, dataMap, "2");
		// お客様会員数集計（解約）
//		mapper.setCNSV002603SC(paramBean, dataMap, "3");
		// コンテンツ契約サービス別会員数集計（累計）
//		mapper.setCNSV002604SC(paramBean, dataMap, "1");
		// コンテンツ契約サービス別会員数集計（新規）//- 検索当日の差分のみ抽出 -//
//		mapper.setCNSV002605SC(paramBean, dataMap, "4");
		// コンテンツ契約サービス別会員数集計（解約）//- 検索当日の差分のみ抽出 -//
//		mapper.setCNSV002606SC(paramBean, dataMap, "5");
		// 総括日別サマリー一覧照会（前日分）
		mapper.setCNSV002607SC(paramBean, dataMap, "1");
		// 総括月別サマリー一覧照会（前月分）
		mapper.setCNSV002608SC(paramBean, dataMap, "1");
		// ワーク売上情報一覧照会（当日分）
//		mapper.setCNSV002609SC(paramBean, dataMap, "1");
		// 総括月別サマリー一覧照会（当月分）
		mapper.setCNSV002610SC(paramBean, dataMap, "1");

		
		// 検索結果格納用マップ生成
		HashMap outputMap = new HashMap();

		// SQL呼出し
		X31CMessageResult msgResult = invokeService(paramMap, dataMap, outputMap);

		// エラー処理 
		if(null!= msgResult )
		{
			JCCWebCommon.setMessageInfo(this, msgResult);
			return true;
		}

		// beanのクリア
		bean.getDataBeanArray(CNW01001SFConst.CONT_SVC_KOBET_LIST).clearArray();

		// 検索結果の取り出し
		mapper.getCNSV002601SC(paramBean, outputMap);

		return true;
	}
	
	/**
	 * ダウンロードファイル生成処理
	 * 
	 * @return
	 */
	private String createFile()
	{
		// 親画面のBean取得
		X31SDataBeanAccess bean = super.getServiceFormBean();
		X31SDataBeanAccessArray beanArray = bean.getDataBeanArray(CNW01001SFConst.CONT_SVC_KOBET_LIST);
		
		// 集計単位の取得
		String summary = bean.sendMessageString(CNW01001SFConst.SHUK_TANI, X31CWebConst.DATABEAN_GET_VALUE);
		// 購入者数の算出
		boolean buyFlag = bean.sendMessageBoolean(CNW01001SFConst.KNSHA_CNT, X31CWebConst.DATABEAN_GET_VALUE);
		
		// ヘッダ部作成
		String fileHeader = createHeader(summary, buyFlag);
		
		// 日付取得
		String dateStr = JCCWebCommon.getSysDate();
		if ("2".equals(summary))
		{
			dateStr = dateStr.substring(0, 6);
			dateStr = new JCCToolTextDateFormat("yyyy/MM","yyyyMM").formattedPrint(dateStr);
		}
		else
		{
			String yobi = JPCDateUtil.getDayOfWeek(dateStr);
			dateStr = new JCCToolTextDateFormat("yyyy/MM/dd","yyyyMMdd").formattedPrint(dateStr);
			// 日別であれば曜日付与
			dateStr = join(",", addQuart(dateStr), addQuart(yobiStr[Integer.parseInt(yobi)]));
		}

		// 明細部作成
		StringBuffer body = new StringBuffer();
		for (int i = 0; i < beanArray.getCount(); i++)
		{
			String bodyStr = "";
			X31SDataBeanAccess subbean = beanArray.getDataBean(i);
			bodyStr = join(",",
					addQuart(subbean.sendMessageString(CNW01001SFConst.CONT_SVC_CD_02, X31CWebConst.DATABEAN_GET_VALUE)),
					addQuart(subbean.sendMessageString(CNW01001SFConst.CONT_SVC_NM_02, X31CWebConst.DATABEAN_GET_VALUE)),
					dateStr,
					subbean.sendMessageString(CNW01001SFConst.RUIKEI_CNT_02, X31CWebConst.DATABEAN_GET_VALUE),
					subbean.sendMessageString(CNW01001SFConst.ZNKI_CNT_02, X31CWebConst.DATABEAN_GET_VALUE),
					subbean.sendMessageString(CNW01001SFConst.NEW_CNT_02, X31CWebConst.DATABEAN_GET_VALUE),
					subbean.sendMessageString(CNW01001SFConst.DSL_CNT_02, X31CWebConst.DATABEAN_GET_VALUE),
					subbean.sendMessageString(CNW01001SFConst.ZOUBUN_CNT_02, X31CWebConst.DATABEAN_GET_VALUE),
					subbean.sendMessageString(CNW01001SFConst.SALES_CNT_02, X31CWebConst.DATABEAN_GET_VALUE),
					subbean.sendMessageString(CNW01001SFConst.SALES_AMNT_02, X31CWebConst.DATABEAN_GET_VALUE)
					);
			if (buyFlag)
			{
				// 購入者算出
				bodyStr = join(",",
						bodyStr,
						subbean.sendMessageString(CNW01001SFConst.KNSHA_CNT_02, X31CWebConst.DATABEAN_GET_VALUE)
						);
			}
			// 改行コード付与
			bodyStr = join(",", bodyStr, STR_CRLF);
			body.append(bodyStr);
		}

		return join(STR_CRLF, fileHeader, body.toString());
	}
	
	private static String createHeader(String summary, boolean flag)
	{
		String header = "";
		if ("1".equals(summary))
		{
			// 日別
			header = join(",",
					addQuart("コンテンツサービスコードID"),
					addQuart("コンテンツサービス名"),
					addQuart("日付"),
					addQuart("曜日"),
					addQuart("累計数"),
					addQuart("前々日会員数"),
					addQuart("新規契約数"),
					addQuart("解約数"),
					addQuart("増減"),
					addQuart("売上件数"),
					addQuart("売上金額")
					);
		}
		else
		{
			// 月別
			header = join(",",
					addQuart("コンテンツサービスコードID"),
					addQuart("コンテンツサービス名"),
					addQuart("年月"),
					addQuart("累計数"),
					addQuart("前月会員数"),
					addQuart("新規契約数"),
					addQuart("解約数"),
					addQuart("増減"),
					addQuart("売上件数"),
					addQuart("売上金額")
					);
		}
		if (flag)
		{
			header = join(",", header, addQuart("購入者数"));
		}
		
		return header;
	}
	
	/**
	 * 指定された文字列の配列をseparatorで結合します。
	 * @param separator 結合文字列
	 * @param strs 結合する文字列
	 * @return 結合された文字列
	 */
	public static String join(String separator, String...strs)
	{
		StringBuffer sb = new StringBuffer();
		
		boolean isFirst = true;
		for (String str : strs)
		{
			if (!isFirst)
			{
				sb.append(separator);
			}
			
			sb.append(str);
			isFirst = false;
		}
		
		return sb.toString();
	}

	private static String addQuart(String str)
	{
		return String.format("\"%s\"", str);
	}
}
