/*********************************************************************
*  All Rights reserved,Copyright (c) K-Opticom
**********************************************************************
*＜プログラム内容＞
*	システム名			：eo顧客基幹システム
*	モジュール名		：JBSbatACContJgshaDataMake
*	ソースファイル名	：JBSbatACContJgshaDataMake.java
*	作成者				：富士通　
*	作成日				：2013年10月27日
*＜機能概要＞
*　コンテンツ事業者間精算電情報作成部品です。
*＜修正履歴＞
*	バージョン	修正日		修正者		修正内容
*	v5.00.00	2013/10/27   後藤		新規作成
*********************************************************************/
package eo.business.service;

import java.math.BigDecimal;

import eo.business.common.JACbatDebugLogUtil;
import eo.business.common.JBSbatBusinessService;
import eo.business.util.file.JBSbatACIFM247;
import eo.business.util.file.JBSbatACIFM248;
import eo.common.constant.JACStrConst;
import eo.framework.file.JBSbatDefFileUtil;
import eo.framework.file.JBSbatOutputFileUtil;
import eo.framework.item.JBSbatCommonItem;
import eo.framework.item.JBSbatOutputItem;
import eo.framework.item.JBSbatServiceInterfaceMap;
import eo.framework.util.JBSbatAplConst;

/**
* (クラスの機能概要) <p>
*<BR>
* @author 富士通
*/
public class JBSbatACContJgshaDataMake extends JBSbatBusinessService
{
	/**▼▼▼▼▼▼ツールから生成した宣言です 開始▼▼▼▼▼▼*/
	/**▲▲▲▲▲▲ツールから生成した宣言です 終了▲▲▲▲▲▲*/

	/** 決済方法（無料） */
	private static final String KSSAI_WAY_MURYO = "無料";

	/** カンマ（置換前） */
	private static final String COMMMA_REP_BF = "@@COMMA@@";
	
	/** カンマ（置換前） */
	private static final String FAMILY = "ファミリー";
	
	/** ヘッダ編集用＿サービス契約番号 */
	private static final String HEADER_SVC_KEI_NO = "サービス契約番号";

	/** ヘッダ編集用＿請求契約番号 */
	private static final String HEADER_SEIKY_KEI_NO = "請求契約番号";

	/** ヘッダ編集用＿ｅｏ‐ＩＤ */
	private static final String HEADER_EOID = "ｅｏ‐ＩＤ";

	/** ヘッダ編集用＿ＳＹＳＩＤ */
	private static final String HEADER_SYSID = "ＳＹＳＩＤ";

	/** ヘッダ編集用＿テストＩＤ */
	private static final String HEADER_TEST_ID_FLG = "テストＩＤ";

	/** ヘッダ編集用＿コンテンツサービスコード */
	private static final String HEADER_CONT_SVC_CD = "コンテンツサービスコード";

	/** ヘッダ編集用＿サービス名称 */
	private static final String HEADER_CONT_SVC_NM = "サービス名称";

	/** ヘッダ編集用＿コンテンツコード */
	private static final String HEADER_CONT_CD = "コンテンツコード";

	/** ヘッダ編集用＿コンテンツ名称 */
	private static final String HEADER_CONT_NM = "コンテンツ名称";

	/** ヘッダ編集用＿契約開始日時 */
	private static final String HEADER_CONT_KEI_STA_DTM = "契約開始日時";

	/** ヘッダ編集用＿契約解除日時 */
	private static final String HEADER_CONT_KEI_END_DTM = "契約解除日時";

	/** ヘッダ編集用＿決済方法 */
	private static final String HEADER_KSSAI_WAY = "決済方法";

	/** ヘッダ編集用＿仕入先 */
	private static final String HEADER_SUPPLIER = "仕入先";

	/** ヘッダ編集用＿単価 */
	private static final String HEADER_CONT_TANKA = "単価";

	/** ヘッダ編集用＿数量 */
	private static final String HEADER_CONT_BUY_CNT = "数量";

	/** ヘッダ編集用＿金額 */
	private static final String HEADER_CHRG_AMNT = "金額";

	/** ヘッダ編集用＿訂正金額 */
	private static final String HEADER_TEISE_KINGAKU = "訂正金額";

	/** ヘッダ編集用＿課金額（金額‐訂正金額） */
	private static final String HEADER_KAKIN_AMNT = "課金額（金額‐訂正金額）";

	/** ヘッダ編集用＿サービス開始日 */
	private static final String HEADER_SVC_STA_YMD = "サービス開始日";

	/** ヘッダ編集用＿ＦＰ契約開始日 */
	private static final String HEADER_FP_STA_YMD = "ＦＰ契約開始日";

	/** ヘッダ編集用＿ＦＰ契約終了日 */
	private static final String HEADER_FP_END_YMD = "ＦＰ契約終了日";

	/** ヘッダ編集用＿ＶＢ‐ＩＤ */
	private static final String HEADER_VIRUSBUSTER_ID = "ＶＢ‐ＩＤ";

	/** ヘッダ編集用＿シリアル番号 */
	private static final String HEADER_TRENDMICRO_CEREAL_NO = "シリアル番号";

	/** ヘッダ編集用＿コンテンツ契約番号 */
	private static final String HEADER_CONT_KEI_NO = "コンテンツ契約番号";

	/**
	 * 初期処理
	 * @param JBSbatCommonItem commonItem　バッチ共通パラメータ電文
	 * @throws Exception
	 */
	public void initial(JBSbatCommonItem commonItem) throws Exception
	{
	/**▼▼▼▼▼▼業務サービスの初期処理を記述してください。▼▼▼▼▼▼*/
		/**▼▼▼▼▼▼ツールから生成した初期化のソースです 開始▼▼▼▼▼▼*/
		// 共通パラメータを設定します
		super.setCommonInfo(commonItem);
		/**▲▲▲▲▲▲ツールから生成した初期化のソースです 終了▲▲▲▲▲▲*/
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[S][initial]");
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[S][initial][opeDate=" + super.opeDate + "]");
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[S][initial][freeItem=" + super.freeItem + "]");
		
		// ヘッダ情報編集・出力
		makeHeadder(super.freeItem);
		
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[E][initial]");
	/**▲▲▲▲▲▲業務サービスの初期処理を記述してください。▲▲▲▲▲▲*/
	}

	/**
	 * 主処理
	 * @param inMap　入力電文
	 * @return JBSbatOutputItem　出力情報
	 * @throws Exception
	 */
	public JBSbatOutputItem execute(JBSbatServiceInterfaceMap inMap) throws Exception
	{
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[S][execute]");
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[S][execute][inMap = " + inMap.getMap().toString() + "]");
		JBSbatOutputItem outputItem = new JBSbatOutputItem();
		// コンテンツ支払い方法コード
		String contPaywayCd = inMap.getString(JBSbatACIFM247.CONT_PAYWAY_CD);
		
		// 無料レコードの場合
		if(contPaywayCd.equals(JACStrConst.CONT_PAYWAY_CD_MURYO))
		{
			inMap.setBigDecimal(JBSbatACIFM247.CONT_BUY_CNT, 	BigDecimal.ONE);	// 数量
			inMap.setString(JBSbatACIFM247.KSSAI_WAY, 			KSSAI_WAY_MURYO);	// 決済方法
		}
		
		// 金額
		BigDecimal chgeAmnt = inMap.getBigDecimal(JBSbatACIFM247.CHRG_AMNT);
		// 訂正額
		BigDecimal teiseKingaku = inMap.getBigDecimal(JBSbatACIFM247.TEISE_KINGAKU);
		
		// 課金額 ← 金額 - 訂正額
		BigDecimal kakinAmnt = chgeAmnt.subtract(teiseKingaku);
		inMap.setBigDecimal(JBSbatACIFM247.KAKIN_AMNT, kakinAmnt);
		
		// テストＩＤフラグ
		String tmpTestIdFlg = inMap.getString(JBSbatACIFM247.TEST_ID_FLG);
		if(tmpTestIdFlg.equals(JACStrConst.KARA_MOJI))
		{
			inMap.setString(JBSbatACIFM247.TEST_ID_FLG, JACStrConst.KARA_MOJI);
		}
		else if(tmpTestIdFlg.equals(JACStrConst.KEISHA_TYPE_CD_MNT))
		{
			inMap.setString(JBSbatACIFM247.TEST_ID_FLG, JACStrConst.TEST_ID_FLG_MNT);
		}
		else
		{
			inMap.setString(JBSbatACIFM247.TEST_ID_FLG, JACStrConst.TEST_ID_FLG_MNT_IGAI);
		}
		
		// コンテンツ名
		String contNm = inMap.getString(JBSbatACIFM247.CONT_NM);
		// コンテンツ名
		inMap.setString(JBSbatACIFM247.CONT_NM, contNm.replace(COMMMA_REP_BF, JACStrConst.COMMA));
		
		inMap.setOutFlg(true);
		
		// コンテンツサービスコード
		String contSvcCd = inMap.getString(JBSbatACIFM247.CONT_SVC_CD);
		
		// VBとそれ以外を分割
		if(contSvcCd.equals(JACStrConst.KARA_MOJI) || contSvcCd.equals(JACStrConst.CONT_SVC_CD_VB) || contSvcCd.equals(JACStrConst.CONT_SVC_CD_VB_MULTI))
		{
			// FPのみの場合、コンテンツサービス名に"ファミリー"を設定
			if(contSvcCd.equals(JACStrConst.KARA_MOJI))
			{
				inMap.setString(JBSbatACIFM247.CONT_SVC_NM, FAMILY);
			}
			
			// VB
			outputItem.addOutMapList(inMap);
		}
		else
		{
			// VB以外
			outputItem.addOutMapList_2(inMap);
		}
		
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[E][execute]");
		return outputItem;
	/**▲▲▲▲▲▲業務サービスの主処理を記述してください。▲▲▲▲▲▲*/
	}

	/**
	 * 業務サービス終了処理
	 * @throws Exception
	 */
	public void terminal() throws Exception
	{
	/**▼▼▼▼▼▼業務サービスの終了処理を記述してください。▼▼▼▼▼▼*/
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[S][terminal]");
		/**▼▼▼▼▼▼ツールから生成した終了処理のソースです 開始▼▼▼▼▼▼*/
		/**▲▲▲▲▲▲ツールから生成した終了処理のソースです 終了▲▲▲▲▲▲*/
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[E][terminal]");
	/**▲▲▲▲▲▲業務サービスの終了処理を記述してください。▲▲▲▲▲▲*/
	}

	/**▼▼▼▼▼▼ツールから生成したメソッドです 開始▼▼▼▼▼▼*/
	/**▲▲▲▲▲▲ツールから生成したメソッドです 終了▲▲▲▲▲▲*/

	/**
	 * ヘッダ情報編集・出力
	 * @param  fileDef   ファイル出力情報
	 * @throws Exception 業務サービス内で発生した例外全般。
	 */
	private void makeHeadder(String fileDef) throws Exception
	{
		assert 	JACbatDebugLogUtil.printDebugLog(super.logPrint, "[S][makeHeadder]");

		// ファイル出力部品を取得
		JBSbatOutputFileUtil fileUtil 		= super.commonItem.getOutPutFile();
		// 設定されているエンコード形式を退避
		String enc = fileUtil.getEncode();
		// encodeの形式がSHIFT-JISの場合、MS932に変換
		if (JACStrConst.ENCODE_SJIS.toUpperCase().equals(enc.toUpperCase()))
		{
			enc = JACStrConst.ENCODE_MS932;
		}

		// 出力定義ファイル名を取得する。
		String outFileDefName 				= JBSbatAplConst.getAplConstValue("OTD") + fileDef;
		// 出力定義ファイルオブジェクトを生成する
		JBSbatDefFileUtil outFileDef 		= new JBSbatDefFileUtil(outFileDefName, fileUtil);
		// 退避したエンコード形式を戻す（出力定義ファイルオブジェクト生成時に上書きが発生しているため）
		fileUtil.setEncode(enc);

		// ファイル出力部品を取得
		JBSbatOutputFileUtil fileUtil2 		= super.commonItem.getOutPutFile2();
		// 設定されているエンコード形式を退避
		String enc2 = fileUtil2.getEncode();
		// encodeの形式がSHIFT-JISの場合、MS932に変換
		if (JACStrConst.ENCODE_SJIS.toUpperCase().equals(enc2.toUpperCase()))
		{
			enc2 = JACStrConst.ENCODE_MS932;
		}

		// 出力定義ファイル名を取得する。
		String outFileDefName2 				= JBSbatAplConst.getAplConstValue("OTD") + fileDef;
		// 出力定義ファイルオブジェクトを生成する
		JBSbatDefFileUtil outFileDef2 		= new JBSbatDefFileUtil(outFileDefName2, fileUtil2);
		// 退避したエンコード形式を戻す（出力定義ファイルオブジェクト生成時に上書きが発生しているため）
		fileUtil2.setEncode(enc2);
		
		
		// 出力情報格納用マップ
		JBSbatServiceInterfaceMap headMap 	= new JBSbatServiceInterfaceMap();
		
		//項目を格納
		headMap.set(JBSbatACIFM248.SVC_KEI_NO, HEADER_SVC_KEI_NO);							// サービス契約番号
		headMap.set(JBSbatACIFM248.SEIKY_KEI_NO, HEADER_SEIKY_KEI_NO);						// 請求契約番号
		headMap.set(JBSbatACIFM248.EOID, HEADER_EOID);										// ｅｏ‐ＩＤ
		headMap.set(JBSbatACIFM248.SYSID, HEADER_SYSID);									// ＳＹＳＩＤ
		headMap.set(JBSbatACIFM248.TEST_ID_FLG, HEADER_TEST_ID_FLG);						// テストＩＤ
		headMap.set(JBSbatACIFM248.CONT_SVC_CD, HEADER_CONT_SVC_CD);						// コンテンツサービスコード
		headMap.set(JBSbatACIFM248.CONT_SVC_NM, HEADER_CONT_SVC_NM);						// サービス名称
		headMap.set(JBSbatACIFM248.CONT_CD, HEADER_CONT_CD);								// コンテンツコード
		headMap.set(JBSbatACIFM248.CONT_NM, HEADER_CONT_NM);								// コンテンツ名称
		headMap.set(JBSbatACIFM248.CONT_KEI_STA_DTM, HEADER_CONT_KEI_STA_DTM);				// 契約開始日時
		headMap.set(JBSbatACIFM248.CONT_KEI_END_DTM, HEADER_CONT_KEI_END_DTM);				// 契約解除日時
		headMap.set(JBSbatACIFM248.KSSAI_WAY, HEADER_KSSAI_WAY);							// 決済方法
		headMap.set(JBSbatACIFM248.SUPPLIER, HEADER_SUPPLIER);								// 仕入先
		headMap.set(JBSbatACIFM248.CONT_TANKA, HEADER_CONT_TANKA);							// 単価
		headMap.set(JBSbatACIFM248.CONT_BUY_CNT, HEADER_CONT_BUY_CNT);						// 数量
		headMap.set(JBSbatACIFM248.CHRG_AMNT, HEADER_CHRG_AMNT);							// 金額
		headMap.set(JBSbatACIFM248.TEISE_KINGAKU, HEADER_TEISE_KINGAKU);					// 訂正金額
		headMap.set(JBSbatACIFM248.KAKIN_AMNT, HEADER_KAKIN_AMNT);							// 課金額（金額‐訂正金額）
		headMap.set(JBSbatACIFM248.SVC_STA_YMD, HEADER_SVC_STA_YMD);						// サービス開始日
		headMap.set(JBSbatACIFM248.FP_STA_YMD, HEADER_FP_STA_YMD);							// ＦＰ契約開始日
		headMap.set(JBSbatACIFM248.FP_END_YMD, HEADER_FP_END_YMD);							// ＦＰ契約終了日
		headMap.set(JBSbatACIFM248.VIRUSBUSTER_ID, HEADER_VIRUSBUSTER_ID);					// ＶＢ‐ＩＤ
		headMap.set(JBSbatACIFM248.TRENDMICRO_CEREAL_NO, HEADER_TRENDMICRO_CEREAL_NO);		// シリアル番号
		headMap.set(JBSbatACIFM248.CONT_KEI_NO, HEADER_CONT_KEI_NO);						// コンテンツ契約番号

		fileUtil.print(headMap, outFileDef);
		fileUtil2.print(headMap, outFileDef2);

		assert 	JACbatDebugLogUtil.printDebugLog(super.logPrint, "[E][makeHeadder]");
	}
}
