package cokr.xit.fims.sndb;

import java.util.ArrayList;
import java.util.List;
import java.util.function.BiConsumer;

import cokr.xit.foundation.AbstractEntity;
import cokr.xit.foundation.data.Convert;
import cokr.xit.foundation.data.DataObject;
import lombok.Getter;
import lombok.Setter;

/**발송 대장
 * @author JoJH
 */
@Getter
@Setter
public class SndngDtl extends AbstractEntity {
	/**발송 상세 ID */
	private String sndngDtlId;
	/**발송 ID */
	private String sndngId;
	/**단속 ID */
	private String crdnId;
	/**공시송달 ID */
	private String svbtcId;
	/**연계 대상 코드 */
	private String linkTrgtCd;
	/**연계 관리 키 */
	private String linkMngKey;
	/**발송 구분 코드 */
	private String sndngSeCd;
	/**발송 일자 */
	private String sndngYmd;
	/**발송 종료 일자 */
	private String sndngEndYmd;
	/**수령인 명 */
	private String rcpnNm;
	/**수령인 생년월일 */
	private String rcpnBrdt;
	/**수령인 주소 */
	private String rcpnAddr;
	/**수령인 상세 주소 */
	private String rcpnDtlAddr;
	/**수령인 우편번호 */
	private String rcpnZip;
	/**외부연계식별키 */
	private String conKey;
	/**등기 번호 */
	private String rgNo;
	/**배달 일자 */
	private String dlvrYmd;
	/**배달 시각 */
	private String dlvrTm;
	/**미배달 사유 코드 */
	private String undlvrRsnCd;
	/**미배달 사유 명 */
	private String undlvrRsnNm;
	/**실제 수령인 명 */
	private String actlRcpnNm;
	/**수령인 관계 명 */
	private String rcpnRelNm;
	/**발송 상세 상태 코드 */
	private String sndngDtlSttsCd;
	/**전 발송 상세 상태 코드 */
	private String bfrSndngDtlSttsCd;
	/**전 배달 일자 */
	private String bfrDlvrYmd;
	/**전 배달 시각 */
	private String bfrDlvrTm;
	/**발송 수납 코드 */
	private String sndngRcvmtCd;
	/**주소 변경 코드 */
	private String addrChgCd;
	/**단속 일시 */
	private String crdnDt;
	/**차량번호 */
	private String vhrno;
	/**단속 법정동 명 */
	private String crdnStdgNm;
	/**단속 장소 */
	private String crdnPlc;
	/**회계연도 */
	private String fyr;
	/**부과 번호 */
	private String levyNo;
	/**부과 일자 */
	private String levyYmd;
	/**납기 일자 */
	private String dudtYmd;
	/**납기 후 일자 */
	private String dudtAftrYmd;
	/**과태료 금액 */
	private Integer ffnlgAmt;
	/**본세 */
	private Integer pcptax;
	/**가산금 */
	private Integer adamt;
	/**최종 금액 */
	private Integer lastAmt;
	/**납기 후 금액 */
	private Integer dudtAftrAmt;
	/**납세 번호 */
	private String taxNo;
	/**전자납부번호 */
	private String epayno;
	/**은행 명 */
	private String bankNm;
	/**가상 계좌번호 */
	private String vrActno;
	/**은행 명2 */
	private String bankNm2;
	/**가상 계좌번호2 */
	private String vrActno2;
	/**은행 명3 */
	private String bankNm3;
	/**가상 계좌번호3 */
	private String vrActno3;
	/**은행 명4 */
	private String bankNm4;
	/**가상 계좌번호4 */
	private String vrActno4;
	/**은행 명5 */
	private String bankNm5;
	/**가상 계좌번호5 */
	private String vrActno5;
	/**은행 명6 */
	private String bankNm6;
	/**가상 계좌번호6 */
	private String vrActno6;
	/**은행 명7 */
	private String bankNm7;
	/**가상 계좌번호7 */
	private String vrActno7;
	/**은행 명8 */
	private String bankNm8;
	/**가상 계좌번호8 */
	private String vrActno8;
	/**은행 명9 */
	private String bankNm9;
	/**가상 계좌번호9 */
	private String vrActno9;
	/**은행 명10 */
	private String bankNm10;
	/**가상 계좌번호10 */
	private String vrActno10;
	/**은행 명11 */
	private String bankNm11;
	/**가상 계좌번호11 */
	private String vrActno11;
	/**은행 명12 */
	private String bankNm12;
	/**가상 계좌번호12 */
	private String vrActno12;
	/**은행 명13 */
	private String bankNm13;
	/**가상 계좌번호13 */
	private String vrActno13;
	/**은행 명14 */
	private String bankNm14;
	/**가상 계좌번호14 */
	private String vrActno14;
	/**은행 명15 */
	private String bankNm15;
	/**가상 계좌번호15 */
	private String vrActno15;
	/**은행 명16 */
	private String bankNm16;
	/**가상 계좌번호16 */
	private String vrActno16;
	/**은행 명17 */
	private String bankNm17;
	/**가상 계좌번호17 */
	private String vrActno17;
	/**은행 명18 */
	private String bankNm18;
	/**가상 계좌번호18 */
	private String vrActno18;
	/**은행 명19 */
	private String bankNm19;
	/**가상 계좌번호19 */
	private String vrActno19;
	/**은행 명20 */
	private String bankNm20;
	/**가상 계좌번호20 */
	private String vrActno20;
	/**삭제 여부 */
	private String delYn;
	/**삭제 사유 */
	private String delRsn;
	// 추가 /////////////////////////////////////////////////////////////////////
	/**발송 상세 Ids */
	private String[] sndngDtlIds;
	/**시군구 코드 */
	private String sggCd;
	/** 업무구분 코드 */
	private String taskSeCd;

	public SndngDtl() {}

	public SndngDtl(Sndng sndng) {
        setSggCd(sndng.getSggCd());             // 시군구 코드
        setSndngId(sndng.getSndngId());         // 발송 ID
        setSndngSeCd(sndng.getSndngSeCd());     // 발송 구분 코드
        setSndngYmd(sndng.getSndngYmd());       // 발송 일자
        setSndngEndYmd(sndng.getSndngEndYmd()); // 발송 종료 일자
        setSndngDtlSttsCd("00");                // 발송 상세 상태 코드 - 00 처리전
        setDelYn("N");                          // 삭제 여부
	}

	public SndngDtl setPayerInfo(DataObject payerInfo) {
        setCrdnId(payerInfo.string("CRDN_ID"));                        // 단속 ID
        setRcpnNm(payerInfo.string("RTPYR_NM"));                       // 수령인 명
        setRcpnBrdt(payerInfo.string("RTPYR_BRDT"));                   // 수령인 생년월일
        setRcpnAddr(payerInfo.string("ADDR"));                         // 수령인 주소
        setRcpnDtlAddr(payerInfo.string("DTL_ADDR"));                  // 수령인 상세 주소
        setRcpnZip(payerInfo.string("ZIP"));                           // 수령인 우편번호
        setVhrno(payerInfo.string("VHRNO"));                           // 차량번호
        setCrdnDt(payerInfo.string("CRDN_YMD_TM_MASK"));               // 단속 일시
        setCrdnStdgNm(payerInfo.string("CRDN_STDG_NM"));               // 단속 법정동 명
        setCrdnPlc(payerInfo.string("CRDN_PLC"));                      // 단속 장소
        setFyr(payerInfo.string("FYR"));                               // 회계연도
        setLevyNo(payerInfo.string("LEVY_NO"));                        // 부과 번호
        setLevyYmd(payerInfo.string("LEVY_YMD"));                      // 부과 일자
        setDudtYmd(payerInfo.string("DUDT_YMD"));                      // 납기 일자
        setFfnlgAmt(Convert.toInt(payerInfo.get("FFNLG_AMT")));        // 과태료 금액
        setPcptax(Convert.toInt(payerInfo.get("PCPTAX")));             // 본세 : 부과본세 - 수납본세 - 감액본세
        setAdamt(Convert.toInt(payerInfo.get("ADAMT")));               // 가산금 : 부과가산금 - 수납가산금 - 감액가산금
        setLastAmt(Convert.toInt(payerInfo.get("LAST_AMT")));          // 최종 금액
        setDudtAftrAmt(Convert.toInt(payerInfo.get("DUDT_AFTR_AMT"))); // 납기 후 금액
        setEpayno(payerInfo.string("TAX_NO"));                         // 납세 번호
        setEpayno(payerInfo.string("EPAYNO"));                         // 전자납부번호
        setBankNm(payerInfo.string("BANK_NM"));                        // 은행 명
        setVrActno(payerInfo.string("VR_ACTNO"));                      // 가상 계좌번호
        setBankNm2(payerInfo.string("BANK_NM2"));                      // 은행 명2
        setVrActno2(payerInfo.string("VR_ACTNO2"));                    // 가상 계좌번호2
        setBankNm3(payerInfo.string("BANK_NM3"));                      // 은행 명3
        setVrActno3(payerInfo.string("VR_ACTNO3"));                    // 가상 계좌번호3
        setBankNm4(payerInfo.string("BANK_NM4"));                      // 은행 명4
        setVrActno4(payerInfo.string("VR_ACTNO4"));                    // 가상 계좌번호4
        setBankNm5(payerInfo.string("BANK_NM5"));                      // 은행 명5
        setVrActno5(payerInfo.string("VR_ACTNO5"));                    // 가상 계좌번호5
        setBankNm6(payerInfo.string("BANK_NM6"));                      // 은행 명6
        setVrActno6(payerInfo.string("VR_ACTNO6"));                    // 가상 계좌번호6
        setBankNm7(payerInfo.string("BANK_NM7"));                      // 은행 명7
        setVrActno7(payerInfo.string("VR_ACTNO7"));                    // 가상 계좌번호7
        setBankNm8(payerInfo.string("BANK_NM8"));                      // 은행 명8
        setVrActno8(payerInfo.string("VR_ACTNO8"));                    // 가상 계좌번호8
        setBankNm9(payerInfo.string("BANK_NM9"));                      // 은행 명9
        setVrActno9(payerInfo.string("VR_ACTNO9"));                    // 가상 계좌번호9
        setBankNm10(payerInfo.string("BANK_NM10"));                    // 은행 명10
        setVrActno10(payerInfo.string("VR_ACTNO10"));                  // 가상 계좌번호10
        setBankNm11(payerInfo.string("BANK_NM11"));                    // 은행 명11
        setVrActno11(payerInfo.string("VR_ACTNO11"));                  // 가상 계좌번호11
        setBankNm12(payerInfo.string("BANK_NM12"));                    // 은행 명12
        setVrActno12(payerInfo.string("VR_ACTNO12"));                  // 가상 계좌번호12
        setBankNm13(payerInfo.string("BANK_NM13"));                    // 은행 명13
        setVrActno13(payerInfo.string("VR_ACTNO13"));                  // 가상 계좌번호13
        setBankNm14(payerInfo.string("BANK_NM14"));                    // 은행 명14
        setVrActno14(payerInfo.string("VR_ACTNO14"));                  // 가상 계좌번호14
        setBankNm15(payerInfo.string("BANK_NM15"));                    // 은행 명15
        setVrActno15(payerInfo.string("VR_ACTNO15"));                  // 가상 계좌번호15
        setBankNm16(payerInfo.string("BANK_NM16"));                    // 은행 명16
        setVrActno16(payerInfo.string("VR_ACTNO16"));                  // 가상 계좌번호16
        setBankNm17(payerInfo.string("BANK_NM17"));                    // 은행 명17
        setVrActno17(payerInfo.string("VR_ACTNO17"));                  // 가상 계좌번호17
        setBankNm18(payerInfo.string("BANK_NM18"));                    // 은행 명18
        setVrActno18(payerInfo.string("VR_ACTNO18"));                  // 가상 계좌번호18
        setBankNm19(payerInfo.string("BANK_NM19"));                    // 은행 명19
        setVrActno19(payerInfo.string("VR_ACTNO19"));                  // 가상 계좌번호19
        setBankNm20(payerInfo.string("BANK_NM20"));                    // 은행 명20
        setVrActno20(payerInfo.string("VR_ACTNO20"));                  // 가상 계좌번호20
		return this;
	}

	public List<BiConsumer<String, String>> bankAccountSetters() {
		ArrayList<BiConsumer<String, String>> setters = new ArrayList<>();
		setters.add((bankNm, accountNo) -> {setBankNm(bankNm); setVrActno(accountNo);});
		setters.add((bankNm, accountNo) -> {setBankNm2(bankNm); setVrActno2(accountNo);});
		setters.add((bankNm, accountNo) -> {setBankNm3(bankNm); setVrActno3(accountNo);});
		setters.add((bankNm, accountNo) -> {setBankNm4(bankNm); setVrActno4(accountNo);});
		setters.add((bankNm, accountNo) -> {setBankNm5(bankNm); setVrActno5(accountNo);});
		setters.add((bankNm, accountNo) -> {setBankNm6(bankNm); setVrActno6(accountNo);});
		setters.add((bankNm, accountNo) -> {setBankNm7(bankNm); setVrActno7(accountNo);});
		setters.add((bankNm, accountNo) -> {setBankNm8(bankNm); setVrActno8(accountNo);});
		setters.add((bankNm, accountNo) -> {setBankNm9(bankNm); setVrActno9(accountNo);});
		setters.add((bankNm, accountNo) -> {setBankNm10(bankNm); setVrActno10(accountNo);});
		setters.add((bankNm, accountNo) -> {setBankNm11(bankNm); setVrActno11(accountNo);});
		setters.add((bankNm, accountNo) -> {setBankNm12(bankNm); setVrActno12(accountNo);});
		setters.add((bankNm, accountNo) -> {setBankNm13(bankNm); setVrActno13(accountNo);});
		setters.add((bankNm, accountNo) -> {setBankNm14(bankNm); setVrActno14(accountNo);});
		setters.add((bankNm, accountNo) -> {setBankNm15(bankNm); setVrActno15(accountNo);});
		setters.add((bankNm, accountNo) -> {setBankNm16(bankNm); setVrActno16(accountNo);});
		setters.add((bankNm, accountNo) -> {setBankNm17(bankNm); setVrActno17(accountNo);});
		setters.add((bankNm, accountNo) -> {setBankNm18(bankNm); setVrActno18(accountNo);});
		setters.add((bankNm, accountNo) -> {setBankNm19(bankNm); setVrActno19(accountNo);});
		setters.add((bankNm, accountNo) -> {setBankNm20(bankNm); setVrActno20(accountNo);});
		return setters;
	}
}