/*********************************************************************
*  All Rights reserved,Copyright (c) K-Opticom
**********************************************************************
*＜プログラム内容＞
*	システム名			：eo顧客基幹システム
*	モジュール名		：JBSbatACJgsknSsnAdd
*	ソースファイル名	：JBSbatACJgsknSsnAdd.java
*	作成者				：富士通　
*	作成日				：2011年12月18日
*＜機能概要＞
*　事業者間精算登録部品です。
*＜修正履歴＞
*	バージョン	修正日		修正者		修正内容
*	v1.00.00	2011/12/18   富士通		新規作成
*	v5.00.00	2013/03/11   FJ) 小柴	【ANK-1380-00-00】処理内容を一新
*********************************************************************/
package eo.business.service;

import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.HashMap;

import eo.business.common.JACbatDebugLogUtil;
import eo.business.common.JACbatSchdlUtil;
import eo.business.common.JBSbatBusinessService;
import eo.business.util.file.JBSbatACIFM105;
import eo.business.util.table.JBSbatCH_T_JGSHAKSSN;
import eo.common.constant.JACStrConst;
import eo.common.util.JPCEditString;
import eo.framework.db.JBSbatSQLAccess;
import eo.framework.item.JBSbatCommonDBInterface;
import eo.framework.item.JBSbatCommonItem;
import eo.framework.item.JBSbatOutputItem;
import eo.framework.item.JBSbatServiceInterfaceMap;

/**
* (クラスの機能概要) <p>
*<BR>
* @author 富士通
*/
public class JBSbatACJgsknSsnAdd extends JBSbatBusinessService
{
	/**▼▼▼▼▼▼ツールから生成した宣言です 開始▼▼▼▼▼▼*/
	/** テーブル(事業者間精算)*/
	private static final String D_TBL_NAME_CH_T_JGSHAKSSN = "CH_T_JGSHAKSSN";

	/** テーブルアクセスクラス(事業者間精算)*/
	private JBSbatSQLAccess db_CH_T_JGSHAKSSN = null;
	/**▲▲▲▲▲▲ツールから生成した宣言です 終了▲▲▲▲▲▲*/

	/** 初期値：0 */
	private static final String 		INIT_ZERO 			= "0";
	/** 事業者コード桁数 */
	private static final int 		JIGYOSHA_CD_CNT		= 10;
	/** 事業者契約コード桁数 */
	private static final int 		JIGYOSHA_KEI_CD_CNT	= 6;
	
	/** 料金スケジュール定義部品 */
	private JACbatSchdlUtil 			schdlUtil 			= null;
	/** 退避.請求年月 */
	private String 					skyYmd 				= null;
	
	/** 退避．前回キー */
	private String tmpKey = null;
	/** 退避．出力データ保持リスト */
	private ArrayList tmpOutputList = null;
	
	/** 退避．出力データ保持マップ（役務工事費（ネットなし）） */
	private HashMap tmpDataMapEkimuNsi = null;
	/** 退避．出力データ保持マップ（役務工事費（ネットあり）） */
	private HashMap tmpDataMapEkimuAri = null;
	/** 退避．出力データ保持マップ（端末利用料金） */
	private HashMap tmpDataMapTanmatsu = null;
	
	/** 退避．集計用金額（役務工事費（ネットなし）） */
	private BigDecimal tmpPrcEkimuNsi = null;
	/** 退避．集計用金額（役務工事費（ネットあり）） */
	private BigDecimal tmpPrcEkimuAri = null;
	/** 退避．集計用金額（端末利用料金） */
	private BigDecimal tmpPrcTanmatsu = null;
	/** 退避．集計用件数（役務工事費（ネットなし）） */
	private BigDecimal tmpCountEkimuNsi = null;
	/** 退避．集計用件数（役務工事費（ネットあり）） */
	private BigDecimal tmpCountEkimuAri = null;
	/** 退避．集計用件数（端末利用料金） */
	private BigDecimal tmpCountTanmatsu = null;
	
	/** 対象項目コードセット */
	private ArrayList spoilTarget = null;
	
	/** 抽出対象：役務工事費（ネットなし） */
	private static final String EKIMU_NET_NSI = "00800156601";
	/** 抽出対象：役務工事費（ネットあり） */
	private static final String EKIMU_NET_ARI = "00800157601";
	/** 抽出対象：端末利用料金 */
	private static final String TANMATSU      = "00800158601";
	
	/** データ出力フラグ（役務工事費（ネットなし）） */
	private boolean outputFlgEkimuNsi = false;
	/** データ出力フラグ（役務工事費（ネットあり）） */
	private boolean outputFlgEkimuAri = false;
	/** データ出力フラグ（端末利用料金） */
	private boolean outputFlgTanmatsu = false;
	/**
	 * 初期処理
	 * @param JBSbatCommonItem commonItem　バッチ共通パラメータ電文
	 * @throws Exception
	 */
	public void initial(JBSbatCommonItem commonItem) throws Exception
	{
	/**▼▼▼▼▼▼業務サービスの初期処理を記述してください。▼▼▼▼▼▼*/
		/**▼▼▼▼▼▼ツールから生成した初期化のソースです 開始▼▼▼▼▼▼*/
		// 共通パラメータを設定します
		super.setCommonInfo(commonItem);

		// DBアクセスクラスを生成します
		db_CH_T_JGSHAKSSN = new JBSbatSQLAccess(commonItem, D_TBL_NAME_CH_T_JGSHAKSSN);
		/**▲▲▲▲▲▲ツールから生成した初期化のソースです 終了▲▲▲▲▲▲*/
		
		assert 	JACbatDebugLogUtil.printDebugLog(super.logPrint, "[S][initial]");

		// 料金スケジュール定義部品の初期化
		schdlUtil 				= new JACbatSchdlUtil(commonItem);
		// 当月請求年月取得 イベントコード:"03"(料金計算日)
		this.skyYmd 			= schdlUtil.getBillDate(super.opeDate, JACStrConst.EVENT_CD_RYOKIN_KEISAN_YMD);
		// 料金スケジュール定義部品をクローズ
		schdlUtil.close();

		// 出力データ保持用の退避マップを作成
		tmpDataMapEkimuNsi = new HashMap();
		tmpDataMapEkimuAri = new HashMap();
		tmpDataMapTanmatsu = new HashMap();
		
		// 出力データ保持用の退避リストを作成
		tmpOutputList = new ArrayList();
		
		// 抽出対象の項目コードリストを作成
		spoilTarget = new ArrayList();
		spoilTarget.add(EKIMU_NET_NSI);
		spoilTarget.add(EKIMU_NET_ARI);
		spoilTarget.add(TANMATSU);
		
		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]");
		String prcKmkCd = inMap.getString(JBSbatACIFM105.PRC_KMK_CD);
		
		// 抽出対象の料金項目コードでない場合は終了する
		if (!spoilTarget.contains(prcKmkCd))
		{
			assert 	JACbatDebugLogUtil.printDebugLog(super.logPrint, "[L][execute]抽出対象外です");
		}
		else
		{
			// 料金項目コードの値で集計先を変更する
			// 役務工事費（ネットなし）
			if (EKIMU_NET_NSI.equals(prcKmkCd))
			{
				assert 	JACbatDebugLogUtil.printDebugLog(super.logPrint, "[L][execute]役務工事費（ネットなし）");
				// データ保存マップが空の場合はデータ保持を行う
				if (tmpDataMapEkimuNsi.isEmpty())
				{
					setTempDataMap(inMap, tmpDataMapEkimuNsi);
					
					// 集計用の値を初期化
					tmpPrcEkimuNsi   = inMap.getBigDecimal(JBSbatACIFM105.PRC);
					tmpCountEkimuNsi = BigDecimal.ONE;
					outputFlgEkimuNsi = true;
				}
				// データ保存済の時は集計のみ実施
				else
				{
					tmpPrcEkimuNsi   = tmpPrcEkimuNsi.add(inMap.getBigDecimal(JBSbatACIFM105.PRC));
					tmpCountEkimuNsi = tmpCountEkimuNsi.add(BigDecimal.ONE);
				}
			}
			// 役務工事費（ネットあり）
			else if (EKIMU_NET_ARI.equals(prcKmkCd))
			{
				assert 	JACbatDebugLogUtil.printDebugLog(super.logPrint, "[L][execute]役務工事費（ネットあり）");
				// データ保存マップが空の場合はデータ保持を行う
				if (tmpDataMapEkimuAri.isEmpty())
				{
					setTempDataMap(inMap, tmpDataMapEkimuAri);
					
					// 集計用の値を初期化
					tmpPrcEkimuAri   = inMap.getBigDecimal(JBSbatACIFM105.PRC);
					tmpCountEkimuAri = BigDecimal.ONE;
					outputFlgEkimuAri = true;
				}
				// データ保存済の時は集計のみ実施
				else
				{
					tmpPrcEkimuAri   = tmpPrcEkimuAri.add(inMap.getBigDecimal(JBSbatACIFM105.PRC));
					tmpCountEkimuAri = tmpCountEkimuAri.add(BigDecimal.ONE);
				}
			}
			// 端末利用量
			else if (TANMATSU.equals(prcKmkCd))
			{
				assert 	JACbatDebugLogUtil.printDebugLog(super.logPrint, "[L][execute]端末利用量");
				// データ保存マップが空の場合はデータ保持を行う
				if (tmpDataMapTanmatsu.isEmpty())
				{
					setTempDataMap(inMap, tmpDataMapTanmatsu);
					
					// 集計用の値を初期化
					tmpPrcTanmatsu   = inMap.getBigDecimal(JBSbatACIFM105.PRC);
					tmpCountTanmatsu = BigDecimal.ONE;
					outputFlgTanmatsu = true;
				}
				// データ保存済の時は集計のみ実施
				else
				{
					tmpPrcTanmatsu   = tmpPrcTanmatsu.add(inMap.getBigDecimal(JBSbatACIFM105.PRC));
					tmpCountTanmatsu = tmpCountTanmatsu.add(BigDecimal.ONE);
				}
			}
			// 当てはまらなければスキップ（本来は通らないはず）
			else
			{
				return null;
			}
		}
		
		
		// 最終行の場合は、データベースへの出力を行う
		if (this.commonItem.isEndRecordFlg())
		{
			assert 	JACbatDebugLogUtil.printDebugLog(super.logPrint, "[L][execute]最終レコードなので出力を行います");
			
			// 集計結果を各マップに反映
			if (tmpPrcEkimuNsi != null)
			{
				tmpDataMapEkimuNsi.put(JBSbatCH_T_JGSHAKSSN.SSN_AMNT, tmpPrcEkimuNsi.toString());
			}
			if (tmpCountEkimuNsi != null)
			{
				tmpDataMapEkimuNsi.put(JBSbatCH_T_JGSHAKSSN.SSN_CNT,  tmpCountEkimuNsi.toString());
			}
			if (tmpPrcEkimuAri != null)
			{
				tmpDataMapEkimuAri.put(JBSbatCH_T_JGSHAKSSN.SSN_AMNT, tmpPrcEkimuAri.toString());
			}
			if (tmpCountEkimuAri != null)
			{
				tmpDataMapEkimuAri.put(JBSbatCH_T_JGSHAKSSN.SSN_CNT,  tmpCountEkimuAri.toString());
			}
			if (tmpPrcTanmatsu != null)
			{
				tmpDataMapTanmatsu.put(JBSbatCH_T_JGSHAKSSN.SSN_AMNT, tmpPrcTanmatsu.toString());
			}
			if (tmpCountTanmatsu != null)
			{
				tmpDataMapTanmatsu.put(JBSbatCH_T_JGSHAKSSN.SSN_CNT,  tmpCountTanmatsu.toString());
			}
			
			// データの出力
			if (outputFlgEkimuNsi)
			{
				outputData(tmpDataMapEkimuNsi);
			}
			if (outputFlgEkimuAri)
			{
				outputData(tmpDataMapEkimuAri);
			}
			if (outputFlgTanmatsu) {
				outputData(tmpDataMapTanmatsu);
			}
		}
		assert 	JACbatDebugLogUtil.printDebugLog(super.logPrint, "[E][execute]");
		return null;
	/**▲▲▲▲▲▲業務サービスの主処理を記述してください。▲▲▲▲▲▲*/
	}
	
	/**
	 * 退避マップに1件目のデータの内容を保持します。
	 * @param inMap
	 * @param dataMap
	 * @throws Exception
	 */
	private void setTempDataMap(JBSbatServiceInterfaceMap inMap, HashMap dataMap) throws Exception
	{
		// レイアウト用マップにデータを保存
		
		// 入力.事業者コードが空文字の場合
		String jigyoCd = inMap.getString(JBSbatACIFM105.JIGYOSHA_CD);
		String jigyoKeiCd = inMap.getString(JBSbatACIFM105.JIGYOSHA_KEI_CD);
		
		if(jigyoCd == null
		|| JACStrConst.KARA_MOJI.equals(jigyoCd.trim()))
		{
			//  1.事業者コード："0000000000"を設定
			dataMap.put(JBSbatCH_T_JGSHAKSSN.JIGYOSHA_CD,			JPCEditString.fillZero(INIT_ZERO, JIGYOSHA_CD_CNT, true));		// 事業者コード
		}
		else
		{
			//  1.事業者コード
			dataMap.put(JBSbatCH_T_JGSHAKSSN.JIGYOSHA_CD,			inMap.getString(JBSbatACIFM105.JIGYOSHA_CD));		// 事業者コード
		}
		// 入力.事業者契約コードが空文字の場合
		if(jigyoKeiCd == null
		|| JACStrConst.KARA_MOJI.equals(jigyoKeiCd.trim()))
		{
			//  2.事業者契約コード："000000"を設定
			dataMap.put(JBSbatCH_T_JGSHAKSSN.JIGYOSHA_KEI_CD,		JPCEditString.fillZero(INIT_ZERO, JIGYOSHA_KEI_CD_CNT, true));	// 事業者契約コード
		}
		else
		{
			//  2.事業者契約コード
			dataMap.put(JBSbatCH_T_JGSHAKSSN.JIGYOSHA_KEI_CD,		inMap.getString(JBSbatACIFM105.JIGYOSHA_KEI_CD));	// 事業者契約コード
		}
		
		dataMap.put(JBSbatCH_T_JGSHAKSSN.SSN_PRC_KMK_CD,		inMap.getString(JBSbatACIFM105.PRC_KMK_CD));		// 精算料金項目コード
		dataMap.put(JBSbatCH_T_JGSHAKSSN.SSN_YM,				this.skyYmd);										// 精算年月
		dataMap.put(JBSbatCH_T_JGSHAKSSN.SSN_AMNT,				null);												// 精算金額
		dataMap.put(JBSbatCH_T_JGSHAKSSN.SSN_AMNT_STAX_CD,		JACStrConst.SPACE_1);								// 精算金額税コード
		dataMap.put(JBSbatCH_T_JGSHAKSSN.SSN_AMNT_YMD,			super.opeDate);										// 精算金額設定年月日
		dataMap.put(JBSbatCH_T_JGSHAKSSN.SSN_TANI_CD,			JACStrConst.SPACE_1);								// 精算単位
		dataMap.put(JBSbatCH_T_JGSHAKSSN.SSN_TANKA,				JACStrConst.EDIT_PTN_0);							// 精算単価
		dataMap.put(JBSbatCH_T_JGSHAKSSN.SSN_CNT,				null);												// 精算数量
		dataMap.put(JBSbatCH_T_JGSHAKSSN.ADD_DTM,				null);												// 登録年月日時分秒
		dataMap.put(JBSbatCH_T_JGSHAKSSN.ADD_OPEACNT,			null);												// 登録オペレータアカウント
		dataMap.put(JBSbatCH_T_JGSHAKSSN.UPD_DTM,				null);												// 更新年月日時分秒
		dataMap.put(JBSbatCH_T_JGSHAKSSN.UPD_OPEACNT,			null);												// 更新オペレータアカウント
		dataMap.put(JBSbatCH_T_JGSHAKSSN.DEL_DTM,				null);												// 削除年月日時分秒
		dataMap.put(JBSbatCH_T_JGSHAKSSN.DEL_OPEACNT,			null);												// 削除オペレータアカウント
		dataMap.put(JBSbatCH_T_JGSHAKSSN.MK_FLG,				null);												// 無効フラグ
	}
	

	/**
	 * 事業者間精算に登録を行います
	 * @param inMap　入力電文
	 * @throws Exception 業務サービス内で発生した例外全般
	 */
	private void outputData(HashMap retMap) throws Exception
	{
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[S][outputData]");
		JBSbatCommonDBInterface paramList 		= new JBSbatCommonDBInterface();
		
		//  1.事業者コード
		paramList.setValue(retMap.get(JBSbatCH_T_JGSHAKSSN.JIGYOSHA_CD));
		//  2.事業者契約コード
		paramList.setValue(retMap.get(JBSbatCH_T_JGSHAKSSN.JIGYOSHA_KEI_CD));
		//  3.精算料金項目コード
		paramList.setValue(retMap.get(JBSbatCH_T_JGSHAKSSN.SSN_PRC_KMK_CD));
		//  4.精算年月
		paramList.setValue(retMap.get(JBSbatCH_T_JGSHAKSSN.SSN_YM));
		//  5.精算金額
		paramList.setValue(retMap.get(JBSbatCH_T_JGSHAKSSN.SSN_AMNT));
		//  6.精算金額税コード
		paramList.setValue(retMap.get(JBSbatCH_T_JGSHAKSSN.SSN_AMNT_STAX_CD));
		//  7.精算金額設定年月日
		paramList.setValue(retMap.get(JBSbatCH_T_JGSHAKSSN.SSN_AMNT_YMD));
		//  8.精算単位
		paramList.setValue(retMap.get(JBSbatCH_T_JGSHAKSSN.SSN_TANI_CD));
		//  9.精算単価
		paramList.setValue(retMap.get(JBSbatCH_T_JGSHAKSSN.SSN_TANKA));
		// 10.精算数量
		paramList.setValue(retMap.get(JBSbatCH_T_JGSHAKSSN.SSN_CNT));
		// 11.登録年月日時分秒
		paramList.setValue(retMap.get(JBSbatCH_T_JGSHAKSSN.ADD_DTM));
		// 12.登録オペレータカウント
		paramList.setValue(retMap.get(JBSbatCH_T_JGSHAKSSN.ADD_OPEACNT));
		// 13.更新年月日時分秒
		paramList.setValue(retMap.get(JBSbatCH_T_JGSHAKSSN.UPD_DTM));
		// 14.更新オペレータカウント
		paramList.setValue(retMap.get(JBSbatCH_T_JGSHAKSSN.UPD_OPEACNT));
		// 15.削除年月日時分秒
		paramList.setValue(retMap.get(JBSbatCH_T_JGSHAKSSN.DEL_DTM));
		// 16.削除オペレータカウント
		paramList.setValue(retMap.get(JBSbatCH_T_JGSHAKSSN.DEL_OPEACNT));
		// 17.無効フラグ
		paramList.setValue(retMap.get(JBSbatCH_T_JGSHAKSSN.MK_FLG));
		
		// 事業者間精算登録
		executeCH_T_JGSHAKSSN_PKINSERT(paramList.getList().toArray());
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[L][outputData][paramList=" + paramList.getList().toString() + "]");
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[E][outputData]");
	}

	/**
	 * 業務サービス終了処理
	 * @throws Exception
	 */
	public void terminal() throws Exception
	{
	/**▼▼▼▼▼▼業務サービスの終了処理を記述してください。▼▼▼▼▼▼*/
		/**▼▼▼▼▼▼ツールから生成した終了処理のソースです 開始▼▼▼▼▼▼*/
		// DBアクセスクラスをクローズします
		db_CH_T_JGSHAKSSN.close();
		/**▲▲▲▲▲▲ツールから生成した終了処理のソースです 終了▲▲▲▲▲▲*/
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[S][terminal]");
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[E][terminal]");
	/**▲▲▲▲▲▲業務サービスの終了処理を記述してください。▲▲▲▲▲▲*/
	}

	/**▼▼▼▼▼▼ツールから生成したメソッドです 開始▼▼▼▼▼▼*/
	/**
	 * PK(全項目登録)でDBアクセスを行います。<br>
	 * <p>
	 * <b>処理フロー</b><br>
	 * <pre>
	 * 1.引数で設定項目マップを作ります。<br>
	 *
	 * 2.DBアクセスを実行します。<br>
	 * 
	 * 3.メソッドの呼び出し方です。<br>
	 *		引数:
	 *		setParam:設定したい項目の(項目、値)を(key、value)として、setParamマップに入れます。項目キーは以下に説明します。
	 *		 	事業者コード				JIGYOSHA_CD
	 *		 	事業者契約コード				JIGYOSHA_KEI_CD
	 *		 	精算料金項目コード				SSN_PRC_KMK_CD
	 *		 	精算年月				SSN_YM
	 *		 	精算金額				SSN_AMNT
	 *		 	精算金額税コード				SSN_AMNT_STAX_CD
	 *		 	精算金額設定年月日				SSN_AMNT_YMD
	 *		 	精算単位				SSN_TANI_CD
	 *		 	精算単価				SSN_TANKA
	 *		 	精算数量				SSN_CNT
	 *		 	登録年月日時分秒				ADD_DTM
	 *		 	登録オペレータアカウント				ADD_OPEACNT
	 *		 	更新年月日時分秒				UPD_DTM
	 *		 	更新オペレータアカウント				UPD_OPEACNT
	 *		 	削除年月日時分秒				DEL_DTM
	 *		 	削除オペレータアカウント				DEL_OPEACNT
	 *		 	無効フラグ				MK_FLG
	 * </pre>
	 * <p>
	 * @param setParam 設定項目の値。
	 * @throws Exception 業務サービス内で発生した例外全般。
	 */
	private void executeCH_T_JGSHAKSSN_PKINSERT(Object[] setParam) throws Exception
	{
		// 設定値のマップを作成します
		JBSbatCommonDBInterface setMap = new JBSbatCommonDBInterface();
		setMap.setValue("JIGYOSHA_CD", setParam[0]);
		setMap.setValue("JIGYOSHA_KEI_CD", setParam[1]);
		setMap.setValue("SSN_PRC_KMK_CD", setParam[2]);
		setMap.setValue("SSN_YM", setParam[3]);
		setMap.setValue("SSN_AMNT", setParam[4]);
		setMap.setValue("SSN_AMNT_STAX_CD", setParam[5]);
		setMap.setValue("SSN_AMNT_YMD", setParam[6]);
		setMap.setValue("SSN_TANI_CD", setParam[7]);
		setMap.setValue("SSN_TANKA", setParam[8]);
		setMap.setValue("SSN_CNT", setParam[9]);
		setMap.setValue("ADD_DTM", setParam[10]);
		setMap.setValue("ADD_OPEACNT", setParam[11]);
		setMap.setValue("UPD_DTM", setParam[12]);
		setMap.setValue("UPD_OPEACNT", setParam[13]);
		setMap.setValue("DEL_DTM", setParam[14]);
		setMap.setValue("DEL_OPEACNT", setParam[15]);
		setMap.setValue("MK_FLG", setParam[16]);
	
		// DBアクセスを実行します
		db_CH_T_JGSHAKSSN.insertByPrimaryKeys(setMap);
	}
	/**▲▲▲▲▲▲ツールから生成したメソッドです 終了▲▲▲▲▲▲*/
}
