/*********************************************************************
*  All Rights reserved,Copyright (c) K-Opticom
**********************************************************************
*＜プログラム内容＞
*	システム名			：eo顧客基幹システム
*	モジュール名		：JBSbatACKaikHoseiInfChsht
*	ソースファイル名	：JBSbatACKaikHoseiInfChsht.java
*	作成者				：富士通　
*	作成日				：2023年06月06日
*＜機能概要＞
*	会計用補正情報抽出部品です。
*＜修正履歴＞
*	バージョン	修正日		修正者		修正内容
*	v68.00.00	2023/06/06  FJ)吉川		新規作成 【ANK-4268-00-00】グループ大経理統一化
*	v68.10.00	2023/10/02  FJ)寺田		変更 【ANK-4268-10-00】グループ大経理統一化
*********************************************************************/	
package eo.business.service;

import java.math.BigDecimal;
import java.util.ArrayList;
import eo.business.common.JACbatSchdlUtil;
import eo.business.common.JBSbatBusinessService;
import eo.business.common.JCCBatCommon;
import eo.business.common.JKKBatCommon;
import eo.business.common.JKKBatConst;
import eo.business.util.table.JBSbatCH_T_KAIK_HOSEI_KNRI;
import eo.common.constant.JACStrConst;
import eo.common.constant.JKKStrConst;
import eo.framework.item.JBSbatCommonItem;
import eo.framework.item.JBSbatOutputItem;
import eo.framework.item.JBSbatCommonDBInterface;
import eo.framework.db.JBSbatSQLAccess;
import eo.framework.util.JBSbatBusinessFileUtil;
import java.util.HashMap;

/**
* (クラスの機能概要) <p>
*<BR>
* @author 富士通
*/
public class JBSbatACKaikHoseiInfChsht extends JBSbatBusinessService
{
	/**▼▼▼▼▼▼ツールから生成した宣言です 開始▼▼▼▼▼▼*/
	/** テーブル(会計用補正情報管理)*/
	private static final String D_TBL_NAME_CH_T_KAIK_HOSEI_KNRI = "CH_T_KAIK_HOSEI_KNRI";
	
	/** SQL定義キー(AC_SELECT_001)*/
	private static final String CH_T_KAIK_HOSEI_KNRI_AC_SELECT_001 = "AC_SELECT_001";
	
	/** テーブルアクセスクラス(会計用補正情報管理)*/
	private JBSbatSQLAccess db_CH_T_KAIK_HOSEI_KNRI = null;
	/**▲▲▲▲▲▲ツールから生成した宣言です 終了▲▲▲▲▲▲*/
	
	/** 会計計上月 */
	private String kaikYm = null;
	
	/** 前回使用の会計内訳コード */
	private String kaikUcwkCd = null;
	
	/** 会計補正情報売掛金ファイルパス */
	private String acifm362FilePath = null;
	
	/** 会計補正情報入金ファイルパス */
	private String acifm363FilePath = null;
	
	/** 会計補正情報売掛金ファイルオブジェクト */
	private JBSbatBusinessFileUtil  acifm362FileObj = null;
	
	/** 会計補正情報入金ファイルオブジェクト */
	private JBSbatBusinessFileUtil  acifm363FileObj = null;
	
	/** 会計内訳種別コード: 80：会計用コンテンツ決済 */
	private static final String KAIK_UCWK_SBT_CD_80 = "80";
	
	/** 会計内訳種別コード: 40：コンビニ等 */
	private static final String KAIK_UCWK_SBT_CD_40 = "40";
	
	/** 卸区分: 0 */
	private static final String OROSHI_KUBUN_0 = "0";
	
	/** 合計値: 0 */
	private static final BigDecimal SUM_0 = BigDecimal.ZERO;
	
	/** 伝票入力者コード */
	private static final String EOUSER = "eouser";
	
	/** 集計（件数） */
	private BigDecimal sumCnt = BigDecimal.ZERO;
	
	/** 集計（金額） */
	private BigDecimal sumAmnt = BigDecimal.ZERO;

	/** 集計（税抜金額） */
	private BigDecimal sumExTaxAmnt = BigDecimal.ZERO;

	/** 集計（消費税額） */
	private BigDecimal sumStaxAmnt = BigDecimal.ZERO;
	
	/** 会計用補正情報退避用マップ */
	private HashMap tempMap = new HashMap();
	
	
	/**
	 * 初期処理
	 * @param JBSbatCommonItem commonItem　バッチ共通パラメータ電文
	 * @throws Exception
	 */
	public void initial(JBSbatCommonItem commonItem) throws Exception
	{
	/**▼▼▼▼▼▼業務サービスの初期処理を記述してください。▼▼▼▼▼▼*/
		/**▼▼▼▼▼▼ツールから生成した初期化のソースです 開始▼▼▼▼▼▼*/
		// 共通パラメータを設定します
		super.setCommonInfo(commonItem);
		
		// DBアクセスクラスを生成します
		db_CH_T_KAIK_HOSEI_KNRI = new JBSbatSQLAccess(commonItem, D_TBL_NAME_CH_T_KAIK_HOSEI_KNRI);
		/**▲▲▲▲▲▲ツールから生成した初期化のソースです 終了▲▲▲▲▲▲*/
		
		{
		// 会計計上月を取得
		JACbatSchdlUtil schdlUtil = new JACbatSchdlUtil(commonItem);
		this.kaikYm = schdlUtil.getBillDate(super.opeDate, JACStrConst.EVENT_CD_KAIK_SHORI_YMD);
		schdlUtil.close();
		}
		
		String[] freeItems = commonItem.getFreeItem().split(JKKBatConst.S_PARAM_DELIM);
		
		// 会計補正情報売掛金ファイルパス
		acifm362FilePath = freeItems[0];
		// 会計補正情報入金ファイルパス
		acifm363FilePath = freeItems[1];
		
		// 会計補正情報売掛金ファイルオブジェクト
		acifm362FileObj = JKKBatCommon.createBusinessFileUtil(acifm362FilePath,JKKBatConst.SJIS, JKKStrConst.LINE_SEPARATOR, JKKBatConst.S_SEP_CAM);
		// 会計補正情報入金ファイルオブジェクト
		acifm363FileObj = JKKBatCommon.createBusinessFileUtil(acifm363FilePath,JKKBatConst.SJIS, JKKStrConst.LINE_SEPARATOR, JKKBatConst.S_SEP_CAM);
		
		
	/**▲▲▲▲▲▲業務サービスの初期処理を記述してください。▲▲▲▲▲▲*/
	}
	
	
	/**
	 * 主処理
	 * @return JBSbatOutputItem　出力情報
	 * @throws Exception
	 */
	public JBSbatOutputItem execute() throws Exception
	{
	/**▼▼▼▼▼▼業務サービスの主処理を記述してください。▼▼▼▼▼▼*/
		
		//会計用補正情報管理より対象データを抽出する
		executeCH_T_KAIK_HOSEI_KNRI_AC_SELECT_001(new Object[] {this.kaikYm});
		
		//レコードを取得する
		JBSbatCommonDBInterface kaikHoseiMap = db_CH_T_KAIK_HOSEI_KNRI.selectNext();

		while (kaikHoseiMap != null)
		{
			//会計内訳コード単位で集計する
			//初回または会計内訳コードが前回と同じ場合
			if(kaikUcwkCd == null || kaikUcwkCd.equals(kaikHoseiMap.getString(JBSbatCH_T_KAIK_HOSEI_KNRI.KAIK_UCWK_CD)))
			{
				// 集計する（件数）
				this.sumCnt = this.sumCnt.add(new BigDecimal(kaikHoseiMap.getString(JBSbatCH_T_KAIK_HOSEI_KNRI.CNT)));
				// 集計する（金額）
				this.sumAmnt = this.sumAmnt.add(new BigDecimal(kaikHoseiMap.getString(JBSbatCH_T_KAIK_HOSEI_KNRI.AMNT)));
				// 集計する（税抜金額）
				this.sumExTaxAmnt = this.sumExTaxAmnt.add(new BigDecimal(kaikHoseiMap.getString(JBSbatCH_T_KAIK_HOSEI_KNRI.EXTAX_AMNT)));
				// 集計する（消費税額）
				this.sumStaxAmnt = this.sumStaxAmnt.add(new BigDecimal(kaikHoseiMap.getString(JBSbatCH_T_KAIK_HOSEI_KNRI.STAX_AMNT)));
				
				//会計用補正情報退避
				tempMap.put(kaikHoseiMap.getString(JBSbatCH_T_KAIK_HOSEI_KNRI.KAIK_UCWK_CD), kaikHoseiMap);
			}
			else
			{
				//ファイルへ出力（件数・金額が0の時は出力しない）
				if(!SUM_0.equals(sumCnt) || !SUM_0.equals(sumAmnt))
				{
					String[] strList = new String[4];
					
					// 集計済（件数）
					strList[0] = sumCnt.toString();
					// 集計済（金額）
					strList[1] = sumAmnt.toString();
					// 集計済（税抜金額）
					strList[2] = sumExTaxAmnt.toString();
					// 集計済（消費税額）
					strList[3] = sumStaxAmnt.toString();
					
					//会計補正情報売掛金・入金ファイル出力
					outFile(kaikUcwkCd,strList);
				}
				
				// 集計項目のクリア
				this.sumCnt = BigDecimal.ZERO;
				this.sumAmnt = BigDecimal.ZERO;
				this.sumExTaxAmnt = BigDecimal.ZERO;
				this.sumStaxAmnt = BigDecimal.ZERO;
				//会計用補正情報のクリア
				tempMap = new HashMap();
				
				// 集計する（件数）
				this.sumCnt = this.sumCnt.add(new BigDecimal(kaikHoseiMap.getString(JBSbatCH_T_KAIK_HOSEI_KNRI.CNT)));
				// 集計する（金額）
				this.sumAmnt = this.sumAmnt.add(new BigDecimal(kaikHoseiMap.getString(JBSbatCH_T_KAIK_HOSEI_KNRI.AMNT)));
				// 集計する（税抜金額）
				this.sumExTaxAmnt = this.sumExTaxAmnt.add(new BigDecimal(kaikHoseiMap.getString(JBSbatCH_T_KAIK_HOSEI_KNRI.EXTAX_AMNT)));
				// 集計する（消費税額）
				this.sumStaxAmnt = this.sumStaxAmnt.add(new BigDecimal(kaikHoseiMap.getString(JBSbatCH_T_KAIK_HOSEI_KNRI.STAX_AMNT)));
				
				//会計用補正情報退避
				tempMap.put(kaikHoseiMap.getString(JBSbatCH_T_KAIK_HOSEI_KNRI.KAIK_UCWK_CD), kaikHoseiMap);
				}
			
			//会計内訳コードを取得する(次のレコードと比較するため)
			kaikUcwkCd = kaikHoseiMap.getString(JBSbatCH_T_KAIK_HOSEI_KNRI.KAIK_UCWK_CD);
			
			//次のレコードを取得する
			kaikHoseiMap = db_CH_T_KAIK_HOSEI_KNRI.selectNext();
			
			
			//会計内訳コード単位で集計された最後の情報をファイルへ出力（件数・金額が0の時は出力しない）
			if(kaikHoseiMap == null)
			if(!SUM_0.equals(sumCnt) || !SUM_0.equals(sumAmnt))
			{
				String[] strList = new String[4];
				
				// 集計済（件数）
				strList[0] = sumCnt.toString();
				// 集計済（金額）
				strList[1] = sumAmnt.toString();
				// 集計済（税抜金額）
				strList[2] = sumExTaxAmnt.toString();
				// 集計済（消費税額）
				strList[3] = sumStaxAmnt.toString();
				
				//会計補正情報売掛金・入金ファイル出力
				outFile(kaikUcwkCd,strList);
			}	
		}
		
		// ファイルを閉じる
		JCCBatCommon.closeBusinessFileUtil(acifm362FileObj);
		JCCBatCommon.closeBusinessFileUtil(acifm363FileObj);
		
		return null;
	}
	/**▲▲▲▲▲▲業務サービスの主処理を記述してください。▲▲▲▲▲▲*/
	
	
	
	/**
	 * 業務サービス終了処理
	 * @throws Exception
	 */
	public void terminal() throws Exception
	{
	/**▼▼▼▼▼▼業務サービスの終了処理を記述してください。▼▼▼▼▼▼*/
		/**▼▼▼▼▼▼ツールから生成した終了処理のソースです 開始▼▼▼▼▼▼*/
		// DBアクセスクラスをクローズします
		db_CH_T_KAIK_HOSEI_KNRI.close();
		/**▲▲▲▲▲▲ツールから生成した終了処理のソースです 終了▲▲▲▲▲▲*/
	/**▲▲▲▲▲▲業務サービスの終了処理を記述してください。▲▲▲▲▲▲*/
	}
	
	/**▼▼▼▼▼▼ツールから生成したメソッドです 開始▼▼▼▼▼▼*/
	
	/**
	 * SQLKEY(AC_SELECT_001)でDBアクセスを行います。<br>
	 * <p>
	 * <b>処理フロー</b><br>
	 * <pre>
	 * 1.引数でバイント変数を設定します。<br>
	 *
	 * 2.DBアクセスを実行します。<br>
	 *
	 * 3.メソッドの呼び出し方です。<br>
	 *		引数:
	 *		param:順にバイント変数の値をparam配列に入れます。バイント変数は以下に説明します。
	 *			会計計上月
	 * </pre>
	 * <p>
	 * @param param バイント変数の値配列。
	 * @throws Exception 業務サービス内で発生した例外全般。
	 */
	private void executeCH_T_KAIK_HOSEI_KNRI_AC_SELECT_001(Object[] param) throws Exception
	{
		// バイント変数のリストを生成します
		JBSbatCommonDBInterface paramList = new JBSbatCommonDBInterface();
		paramList.setValue(param[0].toString());
		
		// DBアクセスを実行します
		db_CH_T_KAIK_HOSEI_KNRI.selectBySqlDefine(paramList, CH_T_KAIK_HOSEI_KNRI_AC_SELECT_001);
	}
	
	/**▲▲▲▲▲▲ツールから生成したメソッドです 終了▲▲▲▲▲▲*/
	
	
	/**
	 * 会計補正情報売掛金・入金データ抽出
	 * @param kaikUcwkCd 対象の会計内訳コード
	 * @param strList 件数、金額、税抜金額、消費税額の集計リスト
	 * @throws Exception
	 */
	private void outFile(String kaikUcwkCd, String[] strList)	throws Exception
	{
		//会計内訳種別コードを取得する
		JBSbatCommonDBInterface hoseiInfMap= (JBSbatCommonDBInterface) tempMap.get(kaikUcwkCd);
		if(hoseiInfMap != null)
		{
		//会計内訳種別コード
		String kaikUcwkSbtCd = hoseiInfMap.getString(JBSbatCH_T_KAIK_HOSEI_KNRI.KAIK_UCWK_SBT_CD);
		
		//会計内訳種別コードが「80：会計用コンテンツ決済」の場合
		//会計補正情報売掛金データ抽出
		if(KAIK_UCWK_SBT_CD_80.equals(kaikUcwkSbtCd))
		{
				//会計補正情報売掛金ファイルを出力する
				//ANK-4268-10-00 MOD START
				//String[] urkkList = new String[20];
				String[] urkkList = new String[21];
				//ANK-4268-10-00 MOD END
				urkkList[0] = OROSHI_KUBUN_0;
				urkkList[1] = hoseiInfMap.getString(JBSbatCH_T_KAIK_HOSEI_KNRI.KAIK_SUMUP_MON);
				urkkList[2] = hoseiInfMap.getString(JBSbatCH_T_KAIK_HOSEI_KNRI.KAIK_UCWK_CD);
				urkkList[3] = hoseiInfMap.getString(JBSbatCH_T_KAIK_HOSEI_KNRI.KAIK_UCWK_NM);
				urkkList[4] = hoseiInfMap.getString(JBSbatCH_T_KAIK_HOSEI_KNRI.KAIK_UCWK_SBT_CD);
				urkkList[5] = hoseiInfMap.getString(JBSbatCH_T_KAIK_HOSEI_KNRI.KAIK_UCWK_SBT_DTL_CD);	
				urkkList[6] = JACStrConst.KARA_MOJI;
				urkkList[7] = JACStrConst.KARA_MOJI;
				urkkList[8] = JACStrConst.KARA_MOJI;
				urkkList[9] = hoseiInfMap.getString(JBSbatCH_T_KAIK_HOSEI_KNRI.PRC_KMK_CD);
				urkkList[10] = strList[0];
				urkkList[11] = strList[1];
				urkkList[12] = strList[2];
				urkkList[13] = strList[3];
				urkkList[14] = JACStrConst.KARA_MOJI;
				urkkList[15] = JACStrConst.KARA_MOJI;
				urkkList[16] = hoseiInfMap.getString(JBSbatCH_T_KAIK_HOSEI_KNRI.CRECARD_COMP_CD);
				urkkList[17] = hoseiInfMap.getString(JBSbatCH_T_KAIK_HOSEI_KNRI.CONT_SVC_CD);
				urkkList[18] = JACStrConst.KARA_MOJI;
				//ANK-4268-10-00 MOD START
				//urkkList[19] = EOUSER;
				urkkList[19] = JACStrConst.KARA_MOJI;
				urkkList[20] = EOUSER;
				//ANK-4268-10-00 MOD END
				//会計補正情報売掛金ファイルを出力する
				createAcifm362(urkkList);
			}
		//会計内訳種別コードが「80：会計用コンテンツ決済」以外の場合
		//会計補正情報入金データ抽出
		else{
				//会計補正情報入金ファイルを出力する
				String[] nyukList = new String[24];
				
				nyukList[0] = hoseiInfMap.getString(JBSbatCH_T_KAIK_HOSEI_KNRI.KAIK_SUMUP_MON);
				nyukList[1] = hoseiInfMap.getString(JBSbatCH_T_KAIK_HOSEI_KNRI.KAIK_UCWK_CD);
				nyukList[2] = hoseiInfMap.getString(JBSbatCH_T_KAIK_HOSEI_KNRI.KAIK_UCWK_SBT_CD);
				nyukList[3] = hoseiInfMap.getString(JBSbatCH_T_KAIK_HOSEI_KNRI.KAIK_UCWK_SBT_DTL_CD);
				//会計内訳種別コードが「40：コンビニ等」の場合は「補正年月日」を出力
				if(KAIK_UCWK_SBT_CD_40.equals(hoseiInfMap.getString(JBSbatCH_T_KAIK_HOSEI_KNRI.KAIK_UCWK_SBT_CD))){
				nyukList[4] = hoseiInfMap.getString(JBSbatCH_T_KAIK_HOSEI_KNRI.HOSEI_YMD);
				}else{
				nyukList[4] = JACStrConst.KARA_MOJI;
				}
				nyukList[5] = strList[0];
				nyukList[6] = strList[1];
				nyukList[7] = strList[2];
				nyukList[8] = strList[3];
				nyukList[9] = hoseiInfMap.getString(JBSbatCH_T_KAIK_HOSEI_KNRI.HOSEI_YMD);
				nyukList[10] = hoseiInfMap.getString(JBSbatCH_T_KAIK_HOSEI_KNRI.HOSEI_YMD);
				nyukList[11] = hoseiInfMap.getString(JBSbatCH_T_KAIK_HOSEI_KNRI.NYUKIN_ROUTE_CD);
				nyukList[12] = hoseiInfMap.getString(JBSbatCH_T_KAIK_HOSEI_KNRI.SHUNOKIKAN_CD);
				nyukList[13] = hoseiInfMap.getString(JBSbatCH_T_KAIK_HOSEI_KNRI.BANK_CD);
				nyukList[14] = hoseiInfMap.getString(JBSbatCH_T_KAIK_HOSEI_KNRI.BANK_SHITEN_CD);
				nyukList[15] = hoseiInfMap.getString(JBSbatCH_T_KAIK_HOSEI_KNRI.SHITEIKOZA_CD);
				nyukList[16] = hoseiInfMap.getString(JBSbatCH_T_KAIK_HOSEI_KNRI.ORG_CD);
				nyukList[17] = hoseiInfMap.getString(JBSbatCH_T_KAIK_HOSEI_KNRI.SKNKSITKCM_CD);
				nyukList[18] = hoseiInfMap.getString(JBSbatCH_T_KAIK_HOSEI_KNRI.EAN_MAKER_CD);
				nyukList[19] = hoseiInfMap.getString(JBSbatCH_T_KAIK_HOSEI_KNRI.CVS_PAY_RSV_YMD_JDGRSLT);
				nyukList[20] = JACStrConst.KARA_MOJI;
				nyukList[21] = hoseiInfMap.getString(JBSbatCH_T_KAIK_HOSEI_KNRI.CRECARD_COMP_CD);
				nyukList[22] = hoseiInfMap.getString(JBSbatCH_T_KAIK_HOSEI_KNRI.HOSEI_SBT_CD);
				nyukList[23] = EOUSER;
				
				//会計補正情報入金ファイルを出力する
				createAcifm363(nyukList);
			}
		}
	}
	
	/**
	 * 会計補正情報売掛金ファイルの作成を行う。
	 * @param strList 出力対象データ
	 * @return JBSbatServiceInterfaceMap
	 * @throws Exception メソッド内で発生した例外全般。
	 */
	private void createAcifm362(String[] strList) throws Exception
	{
		super.logPrint.printDebugLog("createAcifm362_START");
		
		ArrayList<String> outputList = new ArrayList<String>();
		
		// 項目を設定
		outputList.add(strList[0]);		//卸区分
		outputList.add(strList[1]);		//会計計上月
		outputList.add(strList[2]);		//会計内訳コード
		outputList.add(strList[3]);		//会計内訳名称
		outputList.add(strList[4]);		//会計内訳種別コード
		outputList.add(strList[5]);		//会計内訳種別詳細コード
		outputList.add(strList[6]);		//料金グループコード
		outputList.add(strList[7]);		//料金コースコード
		outputList.add(strList[8]);		//料金サービスコード
		outputList.add(strList[9]);		//料金項目コード
		outputList.add(strList[10]);	//件数
		outputList.add(strList[11]);	//金額
		outputList.add(strList[12]);	//税抜金額
		outputList.add(strList[13]);	//消費税額
		outputList.add(strList[14]);	//料金月
		outputList.add(strList[15]);	//支払方法
		outputList.add(strList[16]);	//クレジットカード会社コード
		outputList.add(strList[17]);	//コンテンツサービスコード
		outputList.add(strList[18]);	//企業識別コード
		//ANK-4268-10-00 MOD START
		//outputList.add(strList[19]);	//伝票入力者コード
		outputList.add(strList[19]);	//卸先事業者コード
		outputList.add(strList[20]);	//伝票入力者コード
		//ANK-4268-10-00 MOD END
		JKKBatCommon.printBusinessFileUtil(acifm362FileObj, outputList);
		
		super.logPrint.printDebugLog("createAcifm362_END");
	}
	
	/**
	 * 会計補正情報入金ファイルの作成を行う。
	 * @param strList 出力対象データ
	 * @return JBSbatServiceInterfaceMap
	 * @throws Exception メソッド内で発生した例外全般。
	 */
	private void createAcifm363(String[] strList) throws Exception
	{
		super.logPrint.printDebugLog("createAcifm363_START");
		
		ArrayList<String> outputList = new ArrayList<String>();
		
		// 項目を設定
		outputList.add(strList[0]);		//会計計上月
		outputList.add(strList[1]);		//会計内訳コード
		outputList.add(strList[2]);		//会計内訳種別コード
		outputList.add(strList[3]);		//会計内訳種別詳細コード
		outputList.add(strList[4]);		//コンビニ支払予定年月日
		outputList.add(strList[5]);		//件数
		outputList.add(strList[6]);		//金額
		outputList.add(strList[7]);		//税抜金額
		outputList.add(strList[8]);		//消費税額
		outputList.add(strList[9]);		//外部組織収納年月日
		outputList.add(strList[10]);	//入金処理年月日
		outputList.add(strList[11]);	//入金経路コード
		outputList.add(strList[12]);	//収納機関コード
		outputList.add(strList[13]);	//金融機関コード
		outputList.add(strList[14]);	//金融機関支店コード
		outputList.add(strList[15]);	//指定口座コード
		outputList.add(strList[16]);	//組織コード
		outputList.add(strList[17]);	//債権回収委託会社コード
		outputList.add(strList[18]);	//EANメーカーコード
		outputList.add(strList[19]);	//コンビニ支払予定年月日判定結果
		outputList.add(strList[20]);	//送付先名
		outputList.add(strList[21]);	//クレジットカード会社コード
		outputList.add(strList[22]);	//手数料チャージバック区分
		outputList.add(strList[23]);	//伝票入力者コード
		
		JKKBatCommon.printBusinessFileUtil(acifm363FileObj, outputList);
		
		super.logPrint.printDebugLog("createAcifm363_END");
	}
}