package jp.mosp.payroll.report.action;

import java.sql.SQLException;
import java.util.ArrayList;
import java.util.Date;
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.utils.DateUtil;
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 (CdAdjustmentDto cdAdjustmentDto : listAdjustment) {
			// 社員コード設定
			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 (AdjustDataDto dto : list) {
			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 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.setMonthType01("1");
		dto.setMonthType02("2");
		dto.setMonthType03("3");
		dto.setMonthType04("4");
		dto.setMonthType05("5");
		dto.setMonthType06("6");
		dto.setMonthType07("7");
		dto.setMonthType08("8");
		dto.setMonthType09("9");
		dto.setMonthType10("10");
		dto.setMonthType11("11");
		dto.setMonthType12("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, DateUtil.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)); // 配偶者区分
	}
	
}
