package jp.mosp.payroll.report.action;

import java.sql.SQLException;
import java.util.ArrayList;
import java.util.Date;
import java.util.Iterator;
import java.util.List;

import jp.mosp.common.MosPVo;
import jp.mosp.common.common.MospConst;
import jp.mosp.common.common.MospException;
import jp.mosp.common.common.MospUtility;
import jp.mosp.common.dto.MosPConfDto;
import jp.mosp.common.part.DatePart;
import jp.mosp.legal.LegalConst;
import jp.mosp.payroll.base.AdjustmentAction;
import jp.mosp.payroll.base.PayrollConst;
import jp.mosp.payroll.common.vo.AdjustmentCalcVo;
import jp.mosp.payroll.common.vo.AdjustmentListVo;
import jp.mosp.payroll.dao.CmCompanyDao;
import jp.mosp.payroll.dto.CdAdjustmentDto;
import jp.mosp.payroll.report.dto.AdjustDataDto;
import jp.mosp.payroll.report.dto.WithholdingListDto;

public class AdjustDataOutputAction extends AdjustmentAction {
	
	// コマンド
	private static final String CMD_OUTPUT_FOR_YEAR = "P3050";
	private static final String CMD_OUTPUT_FOR_CURR = "P3052";
	
	// 設定テーブル
	public List<MosPConfDto> listConf;
	public String[][] aryEra;
	public String[][] aryStation ;
	public String[][] aryPltIncomeTaxType;
	public String[][] aryPltAdjustmentType;
	public String[][] aryPltHandicapType  ;
	public String[][] aryPltWidowType      ;
	public String[][] aryPltStudentType    ;
	public String[][] aryPltSpouseIntendType;
	public String[][] aryPltLiveWithType    ;
	public String[][] aryPltSpouseType      ;
	public String[][] aryPltDependentType   ;
	public String[][] aryGender  ;
	
	/**
	 * コンストラクタ
	 */
	public AdjustDataOutputAction() {
		super();
		setNeedProcSeq(false);
	}
	
	/**
	 * アクション
	 */
	public void action() throws Exception {
		// DBコネクション取得
		getConnection();
		// 給与管理者権限確認
		confirmPayrollAuth();
		// 会社情報取得
		setCompanyDataInfo();
		// DAO準備
		prepareDao();
		// 配列取得
		aryStation             = getStationArrayAll ()               ;
		aryPosition            = getPositionArrayAll()               ;
		aryEra                 = getCodeArray(PayrollConst.TID_JAPANESE);
		aryPltIncomeTaxType    = LegalConst.INCOME_TAX_ARRAY         ;
		aryPltAdjustmentType   = LegalConst.ADJUSTMENT_ARRAY         ;
		aryPltHandicapType     = LegalConst.HANDICAP_ARRAY           ;
		aryPltWidowType        = LegalConst.WIDOW_ARRAY              ;
		aryPltStudentType      = LegalConst.STUDENT_ARRAY            ;
		aryPltSpouseIntendType = LegalConst.SPOUSE_INTEND_ARRAY      ;
		aryPltLiveWithType     = LegalConst.LIVE_WITH_ARRAY          ;
		aryPltSpouseType       = LegalConst.SPOUSE_ARRAY             ;
		aryPltDependentType    = LegalConst.DEPENDENT_ARRAY          ;
		// 和暦設定取得
		listConf = getConfList(PayrollConst.CONF_ID_JP_IMP_CAL);
		// 寡婦(夫) 振分用
		aryGender = getCodeArray(PayrollConst.TID_GENDER);
		// コマンド毎の処理
		if (cmd.equals(CMD_OUTPUT_FOR_YEAR)) {
			// VOの取得
			AdjustmentListVo vo = (AdjustmentListVo)session.getAttribute(MospConst.ATT_FORMER_VO);
			vo.clearMessage();
			vo.clearErrField();
			vo.initVo(cfg, msg, cmd, aspUser, user);
			// パラメータ取得
			vo.setParams(request);
			adjustYear   = vo.getPltReportYear();
			startAdjDate = getStartDateOfYear(adjustYear);
			lastDate     = getLastDateOfYear(adjustYear);
			// 対象年月、対象データ設定
			setTargetData();
			Date date = vo.getDate(String.valueOf(vo.getPltReportYear()), String.valueOf(PayrollConst.TIME_ADJ_PAY_MONTH),  String.valueOf(PayrollConst.TIME_DEFAULT_DAY));
			// 年調データ作成
			List<AdjustDataDto> list = getAdjustDataList(date, vo);
			// 出力ファイル名設定
			String fileName = vo.getPltReportYear() +
					PayrollConst.FILE_NAME_SEPARATOR + PayrollConst.FILE_ADJUST_DATA;
			request.setAttribute(MospConst.ATT_FILE_NAME  , fileName);
			// 出力内容設定
			request.setAttribute(MospConst.ATT_FILE_OBJECT, makeAdjustData(list));
		} else if (cmd.equals(CMD_OUTPUT_FOR_CURR)) {
			// VOの取得
			AdjustmentCalcVo vo = (AdjustmentCalcVo)session.getAttribute(MospConst.ATT_FORMER_VO);
			vo.clearMessage();
			vo.clearErrField();
			vo.initVo(cfg, msg, cmd, aspUser, user);
			// パラメータ取得
			vo.setParams(request);
			adjustYear   = vo.getHidAdjustYear();
			startAdjDate = getStartDateOfYear(adjustYear);
			lastDate     = getLastDateOfYear(adjustYear);
			// 対象年月、対象データ設定
			setTargetData();
			// 対象年月取得(対象年12/1)
			Date date = vo.getDate(String.valueOf(vo.getHidAdjustYear()), String.valueOf(PayrollConst.TIME_ADJ_PAY_MONTH),  String.valueOf(PayrollConst.TIME_DEFAULT_DAY));
			// 年調データ作成
			List<AdjustDataDto> list = getAdjustDataList(date, vo);
			// 出力ファイル名設定
			String fileName = vo.getHidAdjustYear() +
					PayrollConst.FILE_NAME_SEPARATOR + PayrollConst.FILE_ADJUST_DATA;
			request.setAttribute(MospConst.ATT_FILE_NAME  , fileName);
			// 出力内容設定
			request.setAttribute(MospConst.ATT_FILE_OBJECT, makeAdjustData(list));
		} else {
			throw new MospException(MospConst.EX_CMD_INVALID);	
		}

	}
	
	/**
	 * 年調データを取得する。<br>
	 * @param targetMonth 作成対象年
	 * @param vo          VO
	 * @return 給与明細データリスト
	 * @throws Exception
	 */
	private List<AdjustDataDto> getAdjustDataList(
			Date targetYear, MosPVo vo
	) throws Exception {
		// 年末調整データ取得
		List<CdAdjustmentDto> listAdjustment = cdAdjustmentDao.findForWithholdVote(MospUtility.getYear(targetYear), null);
		// 源泉徴収簿リスト準備
		List<AdjustDataDto> list = new ArrayList<AdjustDataDto>();
		// 年調データリスト作成
		for (Iterator<CdAdjustmentDto> it = listAdjustment.iterator(); it.hasNext();) {
			// 年末調整データ取得
			cdAdjustmentDto = it.next();
			// 社員コード設定
			kCode = cdAdjustmentDto.getKCode();
			// 人事情報設定
			setHumanInfo(cdAdjustmentDto);
			// 給与、賞与情報取得
			setPaymentBonusInfo();
			// 年末調整データ設定
			AdjustDataDto dto = new AdjustDataDto(
					adjustYear      ,
					cdAdjustmentDto ,
					mKihonDto       ,
					mKojinDto      ,
					cmIncomeTaxDto  ,
					cmMidwayEnterDto,
					listPaymentData ,
					listBonusData   ,
					pdPayDeductionDao,
					cmCompanyDto
			);
			// 本人設定
			setWidowType(dto);
			// 月区分設定
			setMonthType(dto);
			// 日付和暦設定
			setJapanDate(dto);
			// コード名設定
			setDtoCodeName(dto);
			// コード名称設定(年調データ用)
			setDataForAdjustData(dto);
			// リストに設定
			list.add(dto);
		}
		// 年調データリスト確認
		if (list.size() == 0) {
			setVo(vo);
			setUrl(vo.getRetUrl());
			String errMessage = MospUtility.getMessage(msg, PayrollConst.MSG_NO_ADJUST_REPORT, "");
			addErrMessage(errMessage);
			throw new MospException(PayrollConst.EX_NO_PAYMENT_DETAIL, errMessage);
		}
		return list;
	}
	
	/**
	 * 年調データ作成
	 * @param list 年調データリスト
	 * @return 年調データ文字列
	 * @throws Exception 
	 */
	private StringBuffer makeAdjustData(List<AdjustDataDto> list) throws Exception {
		// 帳票作成準備
		StringBuffer sb = new StringBuffer();
		// ヘッダー情報設定
		sb.append(makeAdjustDataTitle());
		for (Iterator<AdjustDataDto> it = list.iterator(); it.hasNext();) {
			AdjustDataDto dto = it.next();
			sb.append(getCsvData(dto.getKCode()));	// 社員コード
			sb.append(PayrollConst.STR_CSV_SEPARATOR);
			sb.append(getCsvData(dto.getStationCode()));	// 部門コード
			sb.append(PayrollConst.STR_CSV_SEPARATOR);
			sb.append(getCsvData(dto.getKName()));	// 社員氏名
			sb.append(PayrollConst.STR_CSV_SEPARATOR);
			sb.append(getCsvData(dto.getGeneralLifeIns().intValue()));	// 生命保険支払額
			sb.append(PayrollConst.STR_CSV_SEPARATOR);
			sb.append(getCsvData(dto.getPrivatePension().intValue()));	// 個人年金支払額
			sb.append(PayrollConst.STR_CSV_SEPARATOR);
			sb.append(getCsvData(dto.getLifeInsDeduction().intValue()));	// 生命保険料控除
			sb.append(PayrollConst.STR_CSV_SEPARATOR);
			sb.append(getCsvData(dto.getEarthquakeIns().intValue()));	// 地震保険支払額
			sb.append(PayrollConst.STR_CSV_SEPARATOR);
			sb.append(getCsvData(dto.getLongTermDamageIns().intValue()));	// 旧長期損害保険
			sb.append(PayrollConst.STR_CSV_SEPARATOR);
			sb.append(getCsvData(dto.getDamageInsDeduction().intValue()));	// 地震保険料控除
			sb.append(PayrollConst.STR_CSV_SEPARATOR);
			sb.append(getCsvData(dto.getSocInsDeduction().intValue()));	// 社保給与控除分
			sb.append(PayrollConst.STR_CSV_SEPARATOR);
			sb.append(getCsvData("0"));	// 国民年金支払額
			sb.append(PayrollConst.STR_CSV_SEPARATOR);
			sb.append(getCsvData(dto.getSocialInsDeduction().intValue()));	// 社保申告控除分
			sb.append(PayrollConst.STR_CSV_SEPARATOR);
			sb.append(getCsvData(dto.getMutualAidDeduction().intValue()));	// 小規模共済掛金
			sb.append(PayrollConst.STR_CSV_SEPARATOR);
			sb.append(getCsvData(dto.getSpouseSumIncome().intValue()));	// 配偶者合計所得
			sb.append(PayrollConst.STR_CSV_SEPARATOR);
			sb.append(getCsvData(dto.getSpouseSpDeduction().intValue()));	// 配偶者特別控除
			sb.append(PayrollConst.STR_CSV_SEPARATOR);
			sb.append(getCsvData(dto.getHouseLoanDeduction().intValue()));	// 住宅借入金等控除
			sb.append(PayrollConst.STR_CSV_SEPARATOR);
			sb.append(getCsvData(dto.getIncomeTaxType()));	// 課税区分
			sb.append(PayrollConst.STR_CSV_SEPARATOR);
			sb.append(getCsvData(dto.getAdjustmentType()));	// 年末調整区分
			sb.append(PayrollConst.STR_CSV_SEPARATOR);
			sb.append(getCsvData(dto.getSelfWidowType()));	// 本人区分１
			sb.append(PayrollConst.STR_CSV_SEPARATOR);
			sb.append(getCsvData(dto.getSelfHandicapType()));	// 本人区分２
			sb.append(PayrollConst.STR_CSV_SEPARATOR);
			sb.append(getCsvData(dto.getSelfStudentType()));	// 本人区分３
			sb.append(PayrollConst.STR_CSV_SEPARATOR);
			sb.append(getCsvData(dto.getSpouseIntendType()));	// 配偶者区分
			sb.append(PayrollConst.STR_CSV_SEPARATOR);
			sb.append(getCsvData(dto.getGeneralDependent()));	// 一般扶養親族
			sb.append(PayrollConst.STR_CSV_SEPARATOR);
			sb.append(getCsvData(dto.getSpecificDependent()));	// 特定扶養親族
			sb.append(PayrollConst.STR_CSV_SEPARATOR);
			sb.append(getCsvData(dto.getElderlyDependent())); 	// 老人扶養親族
			sb.append(PayrollConst.STR_CSV_SEPARATOR);
			sb.append(getCsvData(dto.getLiveWithEldRel()));	// 同居老親等
			sb.append(PayrollConst.STR_CSV_SEPARATOR);
			sb.append(getCsvData(dto.getLiveWithHandiGe()));	// 同居特障一般
			sb.append(PayrollConst.STR_CSV_SEPARATOR);
			sb.append(getCsvData(dto.getLiveWithHandiSp()));	// 同居特障特定
			sb.append(PayrollConst.STR_CSV_SEPARATOR);
			sb.append(getCsvData(dto.getLiveWithHandiEl()));	// 同居特障老人
			sb.append(PayrollConst.STR_CSV_SEPARATOR);
			sb.append(getCsvData(dto.getLiveWithHandiEr()));	// 同居特障老親
			sb.append(PayrollConst.STR_CSV_SEPARATOR);
			sb.append(getCsvData(dto.getGeneralHandicap()));	// 一般障害者
			sb.append(PayrollConst.STR_CSV_SEPARATOR);
			sb.append(getCsvData(dto.getSpecificHandicap()));	// 特別障害者
			sb.append(PayrollConst.STR_CSV_SEPARATOR);
			sb.append(getCsvData(dto.getAllowanceAdjustment().intValue()));	// 支給調整額
			sb.append(PayrollConst.STR_CSV_SEPARATOR);
			sb.append(getCsvData(dto.getTaxFreeAdjustment().intValue()));	// 非課税調整額
			sb.append(PayrollConst.STR_CSV_SEPARATOR);
			sb.append(getCsvData(dto.getSocInsAdjustment().intValue()));	// 社会保険調整額
			sb.append(PayrollConst.STR_CSV_SEPARATOR);
			sb.append(getCsvData(dto.getTaxIncAdjustment().intValue()));	// 所得税調整額
			sb.append(PayrollConst.STR_CSV_SEPARATOR);
			sb.append(getCsvData(dto.getStrMidwayType()));	// 中途区分
			sb.append(PayrollConst.STR_CSV_SEPARATOR);
			sb.append(getCsvData(dto.getFormerIncome().intValue()));	// 中途収入金額
			sb.append(PayrollConst.STR_CSV_SEPARATOR);
			sb.append(getCsvData(dto.getFormerInsurance().intValue()));	// 中途社会保険
			sb.append(PayrollConst.STR_CSV_SEPARATOR);
			sb.append(getCsvData(dto.getFormerTax().intValue()));	// 中途所得税
			sb.append(PayrollConst.STR_CSV_SEPARATOR);
			sb.append(getCsvData(dto.getTotalPayTotalAllowance().intValue()));	// 給料・手当等
			sb.append(PayrollConst.STR_CSV_SEPARATOR);
			sb.append(getCsvData(dto.getTotalBonTotalAllowance().intValue()));	// 賞与等
			sb.append(PayrollConst.STR_CSV_SEPARATOR);
			sb.append(getCsvData(dto.getMidwayAdjustIncome().intValue()));	// 中途・調整収入
			sb.append(PayrollConst.STR_CSV_SEPARATOR);
			sb.append(getCsvData(dto.getTotalAllowance().intValue() + dto.getMidwayAdjustIncome().intValue()));	// 総収入金額
			sb.append(PayrollConst.STR_CSV_SEPARATOR);
			sb.append(getCsvData(dto.getTaxFree().intValue()));	// 非課税支給額
			sb.append(PayrollConst.STR_CSV_SEPARATOR);
			sb.append(getCsvData(dto.getTaxFreeAdjustment().intValue()));	// 非課税調整額
			sb.append(PayrollConst.STR_CSV_SEPARATOR);
			sb.append(getCsvData(dto.getTaxFree().intValue() + dto.getTaxFreeAdjustment().intValue()));	// 非課税金額
			sb.append(PayrollConst.STR_CSV_SEPARATOR);
			sb.append(getCsvData(dto.getAdjTotalAllowance().intValue()));	// ≪ 課税収入金額 ≫
			sb.append(PayrollConst.STR_CSV_SEPARATOR);
			sb.append(getCsvData(dto.getAfterDeductIncome().intValue()));	// ＜給与所得控除後＞
			sb.append(PayrollConst.STR_CSV_SEPARATOR);
			sb.append(getCsvData(dto.getDependentsDeduction().intValue()));	// 配偶扶養基礎控除
			sb.append(PayrollConst.STR_CSV_SEPARATOR);
			sb.append(getCsvData(dto.getIncomeDeductSum().intValue()));	// ＜所得控除合計額＞
			sb.append(PayrollConst.STR_CSV_SEPARATOR);
			sb.append(getCsvData(dto.getCalcTaxedIncome().intValue()));	// ＜ 課税給与所得 ＞
			sb.append(PayrollConst.STR_CSV_SEPARATOR);
			sb.append(getCsvData(dto.getCalcIncomeTax().intValue()));	// ≪ 年 税 額 ≫
			sb.append(PayrollConst.STR_CSV_SEPARATOR);
			sb.append(getCsvData(dto.getFinalIncomeTax().intValue()));	// ＜差 引 年 税 額＞
			sb.append(PayrollConst.STR_CSV_SEPARATOR);
			sb.append(getCsvData(dto.getAdjTotalIncome().intValue()));	// 源泉徴収税額
			sb.append(PayrollConst.STR_CSV_SEPARATOR);
			sb.append(getCsvData(dto.getTaxGap().intValue()));	// ≪ 差引過不足額 ≫
			sb.append(PayrollConst.STR_CSV_SEPARATOR);
			sb.append(getCsvData("給与年調"));	// 年末調整方法
			sb.append(PayrollConst.STR_CSV_SEPARATOR);
			sb.append(getCsvData(""));	// 単独還付方法
			sb.append(PayrollConst.STR_CSV_SEPARATOR);
			sb.append(getCsvData("給料・賞与"));	// 種 別
			sb.append(PayrollConst.STR_CSV_SEPARATOR);
			sb.append(getCsvData(dto.getWithholdSlipNotes()));	// 摘要１
			sb.append(PayrollConst.STR_CSV_SEPARATOR);
			sb.append(getCsvData(""));	// 摘要２
			sb.append(PayrollConst.STR_CSV_NEW_LINE);
		}
		return sb;
	}
	
	/**
	 * 年調データタイトル作成
	 * @return CSV文字列
	 * @throws Exception 
	 */
	private StringBuffer makeAdjustDataTitle() throws Exception {
		StringBuffer sb = new StringBuffer();
		sb.append(getCsvData("社員番号"));
		sb.append(PayrollConst.STR_CSV_SEPARATOR);
		sb.append(getCsvData("部門コード"));
		sb.append(PayrollConst.STR_CSV_SEPARATOR);
		sb.append(getCsvData("氏名"));
		sb.append(PayrollConst.STR_CSV_SEPARATOR);
		sb.append(getCsvData("生命保険支払額")); 
		sb.append(PayrollConst.STR_CSV_SEPARATOR);
		sb.append(getCsvData("個人年金支払額"));
		sb.append(PayrollConst.STR_CSV_SEPARATOR);
		sb.append(getCsvData("生命保険料控除")); 
		sb.append(PayrollConst.STR_CSV_SEPARATOR);
		sb.append(getCsvData("地震保険支払額"));
		sb.append(PayrollConst.STR_CSV_SEPARATOR);
		sb.append(getCsvData("旧長期損害保険"));
		sb.append(PayrollConst.STR_CSV_SEPARATOR);
		sb.append(getCsvData("地震保険料控除"));
		sb.append(PayrollConst.STR_CSV_SEPARATOR);
		sb.append(getCsvData("社保給与控除分"));
		sb.append(PayrollConst.STR_CSV_SEPARATOR);
		sb.append(getCsvData("国民年金支払額"));
		sb.append(PayrollConst.STR_CSV_SEPARATOR);
		sb.append(getCsvData("社保申告控除分"));
		sb.append(PayrollConst.STR_CSV_SEPARATOR);
		sb.append(getCsvData("小規模共済掛金"));
		sb.append(PayrollConst.STR_CSV_SEPARATOR);
		sb.append(getCsvData("配偶者合計所得"));
		sb.append(PayrollConst.STR_CSV_SEPARATOR);
		sb.append(getCsvData("配偶者特別控除"));
		sb.append(PayrollConst.STR_CSV_SEPARATOR);
		sb.append(getCsvData("住宅借入金等控除"));
		sb.append(PayrollConst.STR_CSV_SEPARATOR);
		sb.append(getCsvData("課税区分"));
		sb.append(PayrollConst.STR_CSV_SEPARATOR);
		sb.append(getCsvData("年末調整区分"));
		sb.append(PayrollConst.STR_CSV_SEPARATOR);
		sb.append(getCsvData("本人区分１"));
		sb.append(PayrollConst.STR_CSV_SEPARATOR);
		sb.append(getCsvData("本人区分２"));
		sb.append(PayrollConst.STR_CSV_SEPARATOR);
		sb.append(getCsvData("本人区分３"));
		sb.append(PayrollConst.STR_CSV_SEPARATOR);
		sb.append(getCsvData("配偶者区分"));
		sb.append(PayrollConst.STR_CSV_SEPARATOR);
		sb.append(getCsvData("一般扶養親族"));
		sb.append(PayrollConst.STR_CSV_SEPARATOR);
		sb.append(getCsvData("特定扶養親族"));
		sb.append(PayrollConst.STR_CSV_SEPARATOR);
		sb.append(getCsvData("老人扶養親族"));
		sb.append(PayrollConst.STR_CSV_SEPARATOR);
		sb.append(getCsvData("同居老親等"));
		sb.append(PayrollConst.STR_CSV_SEPARATOR);
		sb.append(getCsvData("同居特障一般"));
		sb.append(PayrollConst.STR_CSV_SEPARATOR);
		sb.append(getCsvData("同居特障特定"));
		sb.append(PayrollConst.STR_CSV_SEPARATOR);
		sb.append(getCsvData("同居特障老人"));
		sb.append(PayrollConst.STR_CSV_SEPARATOR);
		sb.append(getCsvData("同居特障老親"));
		sb.append(PayrollConst.STR_CSV_SEPARATOR);
		sb.append(getCsvData("一般障害者"));
		sb.append(PayrollConst.STR_CSV_SEPARATOR);
		sb.append(getCsvData("特別障害者"));
		sb.append(PayrollConst.STR_CSV_SEPARATOR);
		sb.append(getCsvData("支給調整額"));
		sb.append(PayrollConst.STR_CSV_SEPARATOR);
		sb.append(getCsvData("非課税調整額"));
		sb.append(PayrollConst.STR_CSV_SEPARATOR);
		sb.append(getCsvData("社会保険調整額"));
		sb.append(PayrollConst.STR_CSV_SEPARATOR);
		sb.append(getCsvData("所得税調整額"));
		sb.append(PayrollConst.STR_CSV_SEPARATOR);
		sb.append(getCsvData("中途区分"));
		sb.append(PayrollConst.STR_CSV_SEPARATOR);
		sb.append(getCsvData("中途収入金額"));
		sb.append(PayrollConst.STR_CSV_SEPARATOR);
		sb.append(getCsvData("中途社会保険"));
		sb.append(PayrollConst.STR_CSV_SEPARATOR);
		sb.append(getCsvData("中途所得税"));
		sb.append(PayrollConst.STR_CSV_SEPARATOR);
		sb.append(getCsvData("給料・手当等"));
		sb.append(PayrollConst.STR_CSV_SEPARATOR);
		sb.append(getCsvData("賞与等"));
		sb.append(PayrollConst.STR_CSV_SEPARATOR);
		sb.append(getCsvData("中途・調整収入"));
		sb.append(PayrollConst.STR_CSV_SEPARATOR);
		sb.append(getCsvData("＜総収入金額＞"));
		sb.append(PayrollConst.STR_CSV_SEPARATOR);
		sb.append(getCsvData("非課税支給額"));
		sb.append(PayrollConst.STR_CSV_SEPARATOR);
		sb.append(getCsvData("非課税調整額"));
		sb.append(PayrollConst.STR_CSV_SEPARATOR);
		sb.append(getCsvData("＜非課税金額計＞"));
		sb.append(PayrollConst.STR_CSV_SEPARATOR);
		sb.append(getCsvData("≪課税収入金額≫")); 
		sb.append(PayrollConst.STR_CSV_SEPARATOR);
		sb.append(getCsvData("＜給与所得控除後＞"));
		sb.append(PayrollConst.STR_CSV_SEPARATOR);
		sb.append(getCsvData("配偶扶養基礎控除"));
		sb.append(PayrollConst.STR_CSV_SEPARATOR);
		sb.append(getCsvData("＜所得控除合計額＞"));
		sb.append(PayrollConst.STR_CSV_SEPARATOR);
		sb.append(getCsvData("＜課税給与所得＞"));
		sb.append(PayrollConst.STR_CSV_SEPARATOR);
		sb.append(getCsvData("≪年税額≫"));
		sb.append(PayrollConst.STR_CSV_SEPARATOR);
		sb.append(getCsvData("＜差引年税額＞"));
		sb.append(PayrollConst.STR_CSV_SEPARATOR);
		sb.append(getCsvData("源泉徴収税額"));
		sb.append(PayrollConst.STR_CSV_SEPARATOR);
		sb.append(getCsvData("≪差引過不足額≫"));
		sb.append(PayrollConst.STR_CSV_SEPARATOR);
		sb.append(getCsvData("年末調整方法"));
		sb.append(PayrollConst.STR_CSV_SEPARATOR);
		sb.append(getCsvData("単独還付方法"));
		sb.append(PayrollConst.STR_CSV_SEPARATOR);
		sb.append(getCsvData("種別"));
		sb.append(PayrollConst.STR_CSV_SEPARATOR);
		sb.append(getCsvData("摘要１"));
		sb.append(PayrollConst.STR_CSV_SEPARATOR);
		sb.append(getCsvData("摘要２"));
		sb.append(PayrollConst.STR_CSV_NEW_LINE);
		return sb;
	}
	
	/**
	 * 会社情報設定
	 * @param dto
	 * @throws NoSuchFieldException 
	 * @throws IllegalAccessException 
	 * @throws SQLException 
	 */
	protected void setCompanyDataInfo() throws SQLException, IllegalAccessException, NoSuchFieldException {
		CmCompanyDao dao = new CmCompanyDao();
		dao.initDao(cfg, cmd, aspUser, user, conn);
		cmCompanyDto = dao.findAll();
	}
	
	/**
	 * 人事情報設定
	 * @param dto 
	 * @throws NoSuchFieldException 
	 * @throws IllegalAccessException 
	 * @throws SQLException 
	 * @throws ClassNotFoundException 
	 * @throws MospException 
	 */
	protected void setHumanInfo(
			CdAdjustmentDto dto
	) throws SQLException, IllegalAccessException, NoSuchFieldException, MospException {
		if (dto != null) {
			// 社員コード設定
			kCode = dto.getKCode();
			// 年最終日を履歴情報取得対象月として使用
			Date targetDate = getLastDateOfYear(adjustYear);
			// 人事基本情報取得
			mKihonDto = mKihonPayrollDao.findForKey(kCode);
			if (mKihonDto == null) {
				// 人事基本情報が無い場合
				String errMessage = MospUtility.getMessage(msg, PayrollConst.MSG_NO_HUMAN_DATA, "");
				addErrMessage(errMessage);
			}
			// 人事基本情報設定
			// 人事管理情報取得
			mKojinDto       = mKojinDao.findForKey(kCode);
			
			// 人事給与情報取得
			cmIncomeTaxDto   = cmIncomeTaxDao  .findForEmployeeDate(kCode, targetDate);
			cmMidwayEnterDto = cmMidwayEnterDao.findForKey         (kCode          );

		}
	}
	
	/**
	 * 給与、賞与情報取得
	 * @param vo
	 * @throws Exception 
	 */
	protected void setPaymentBonusInfo() throws Exception {
		// 計算対象給与データ取得
		listPaymentData = phPaymentDao.findForConditionDate(kCode,targetBefDate, targetAffDate);
		// 計算対象賞与データ取得
		listBonusData = phBonusDao.findForConditionDate(kCode, startAdjDate, lastDate);
		// 給与データ確認
		setTargetPaymentData();
		// 対象データ所得税計算(登録なし)
		calcTargetIncomeTax(false);
	}
	
	/**
	 * 月区分設定
	 * @param dto
	 */
	private void setMonthType(WithholdingListDto dto) {
		dto.setMonthType_01("1");
		dto.setMonthType_02("2");
		dto.setMonthType_03("3");
		dto.setMonthType_04("4");
		dto.setMonthType_05("5");
		dto.setMonthType_06("6");
		dto.setMonthType_07("7");
		dto.setMonthType_08("8");
		dto.setMonthType_09("9");
		dto.setMonthType_10("10");
		dto.setMonthType_11("11");
		dto.setMonthType_12("12");
	}
	
	/**
	 * 本人区分設定
	 * @param dto
	 */
	private void setWidowType(WithholdingListDto dto) {
		if (cmIncomeTaxDto != null) {
			String widowType   = cmIncomeTaxDto.getSelfWidowType();
			// 寡婦(夫)の場合は性別で判断して設定、設定なしの場合は一般寡婦へ
			if (widowType.equals(LegalConst.WIDOW_GENERAL)) {
				// DTO確認
				if (mKojinDto != null) {
					String gender = mKojinDto.getSeibetu();
					// 寡夫
					if (gender.equals(aryGender[0][0])) {
						dto.setWidow(PayrollConst.ADJ_APPLICABLE);
					}
					// 一般寡婦
					if (gender.equals(aryGender[1][0])) {
						dto.setGeWidow(PayrollConst.ADJ_APPLICABLE);
					}
				} else {
					// 性別の設定がない場合は一般寡婦に設定
					dto.setGeWidow(PayrollConst.ADJ_APPLICABLE);
				}
			} else if (widowType.equals(LegalConst.WIDOW_SPECIAL)) {
				// 特別寡婦
				dto.setSpWidow(PayrollConst.ADJ_APPLICABLE);
			}
		}
	}

	/**
	 * 和暦日付取得
	 * @param dto
	 * @throws MospException
	 */
	private void setJapanDate(WithholdingListDto dto) throws MospException {
		String strDate[];
		// 表示用年月取得(対象年月)
		if (targetAffDate != null) {
			strDate = getJpImperialCal(listConf, targetAffDate);
			strDate[0]       = getCodeName(strDate[0], aryEra);
			dto.setAdjustYear(strDate[0] + strDate[1]);
			
		}
		if (mKojinDto != null) {
			if (mKojinDto.getSeinenbi() != 0) {
				// 生年月日
				strDate          = getJpImperialCal(listConf, DatePart.convIntegerDateToDate(mKojinDto.getSeinenbi()));
				strDate[0]       = getCodeName(strDate[0], aryEra);
				dto.setBirthDate(strDate[0] + " " + strDate[1] + PayrollConst.NAM_YEAR + " " +  strDate[2]
				                 + " " + PayrollConst.NAM_MONTH + " " + strDate[3] + PayrollConst.NAM_DAY);
			} else {
				dto.setBirthDate(" " + " " + " " + PayrollConst.NAM_YEAR + " " +  " "
	                    + " " + PayrollConst.NAM_MONTH + " " + " " + PayrollConst.NAM_DAY);

			}
		}
	}
	
	/**
	 * コード名称設定
	 * @param dto
	 */
	private void setDtoCodeName(WithholdingListDto dto) {
		if (cmIncomeTaxDto != null) {
			// 課税区分
			dto.setIncomeTaxType(getCodeName(dto.getIncomeTaxType(), aryPltIncomeTaxType));
			// 年調区分
			dto.setAdjustmentType(getCodeName(dto.getAdjustmentType(), aryPltAdjustmentType));
		}
		if (mKihonDto != null ) {
			// 所属コード
			String stationCode = dto.getPositionCode() + " - " + dto.getStationCode();
			// 所属
			dto.setStationCode(stationCode);
		}
		// 役職が不明なので空に
		dto.setPositionCode("");
	}
	
	/**
	 * コード名称設定(年調データ用)
	 * @param dto
	 */
	private void setDataForAdjustData(AdjustDataDto dto) {
		dto.setSelfWidowType   (getCodeName(dto.getSelfWidowType   (), LegalConst.WIDOW_ARRAY        ));	// 本人寡婦区分
		dto.setSelfHandicapType(getCodeName(dto.getSelfHandicapType(), LegalConst.HANDICAP_ARRAY     ));	// 本人障害区分
		dto.setSelfStudentType (getCodeName(dto.getSelfStudentType (), LegalConst.STUDENT_ARRAY      ));	// 本人学生区分
		dto.setSpouseIntendType(getCodeName(dto.getSpouseIntendType(), LegalConst.SPOUSE_INTEND_ARRAY));	// 配偶者区分
	}
	
}
