package incheon.res.rdm.dp.levy.service.impl;



import incheon.res.rdm.com.levy.LevyNextUtil;
import incheon.res.rdm.com.levy.LevyService;
import incheon.res.rdm.com.levy.vo.*;
import incheon.res.rdm.com.levylink.LinkService;
import incheon.res.rdm.com.levylink.RoadVO;
import incheon.res.rdm.dp.levy.mapper.RdmDpLevyMapper;
import incheon.res.rdm.dp.levy.service.RdmDpLevyService;
import incheon.res.rdm.dp.levy.vo.RdmDpLevy;
import incheon.res.rdm.dp.levy.vo.RdmDpLevyVO;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.egovframe.rte.fdl.cmmn.EgovAbstractServiceImpl;
import org.egovframe.rte.fdl.property.EgovPropertyService;
import org.egovframe.rte.psl.dataaccess.util.EgovMap;
import org.springframework.stereotype.Service;

import javax.annotation.Resource;
import java.io.IOException;
import java.net.UnknownHostException;
import java.text.SimpleDateFormat;
import java.util.*;



@Service
public class RdmDpLevyServiceImpl extends EgovAbstractServiceImpl implements RdmDpLevyService {

	public static final String ACC_GBN = "41";
	public static final String REL_GBN_INSERT = "I";

	protected Log log = LogFactory.getLog(this.getClass());

    @Resource(name = "propertiesService")
    protected EgovPropertyService propertiesService;
	@Resource
    private RdmDpLevyMapper rdmDpLevyMapper;
	@Resource(name="LevyService")
    private LevyService levyService;
	@Resource(name="LevyNextUtil")
    private LevyNextUtil levyNextUtil;

	/**
	 * @MethodDESC : 초기 셋팅ui 년도
	 */
	@Override
	public List selectInitUI(RdmDpLevyVO vo) throws Exception {
		return rdmDpLevyMapper.selectInitUI(vo);
	}

	/**
	 * @MethodDESC : 부과정보 저장
	 */
	@Override
	public void insertLevy(RdmDpLevyVO vo) throws Exception {
		rdmDpLevyMapper.insertLevy(vo);
	}

	@Override
	public int deleteLevy(RdmDpLevyVO vo) throws Exception {
		return rdmDpLevyMapper.deleteLevy(vo);
	}

	/**
	 * @MethodDESC : 부과정보 수정
	 */
	@Override
	public String updateLevy(RdmDpLevyVO vo) throws Exception {
		String message = "succ";

		RdmDpLevy levy = rdmDpLevyMapper.selectInitDB(vo);
		levy.setFisYea(vo.getFisYea());
		levy.setDudtIsePayTerm(vo.getDudtIsePayTerm());
		levy.setLevyAmt(vo.getLevyAmt());
		levy.setDudtAftrPayTerm(vo.getDudtAftrPayTerm());
		levy.setVat(vo.getVat());
		levy.setAfDueAmt(vo.getAfDueAmt());
		levy.setAdamt(vo.getAdamt());
		
		//Srting dep_cde = propertiesService.getString("rdm.levy.deptcode."+levy.getNmgCde());	//세외수입 부서코드
		String dep_code=levy.getDggTaskDeptCd().trim()+"0000";					//부서코드(자치단체정보에서 추출)
		String rel_lvy_no=levy.getLinSeq().trim();						//연계시스템 부과번호
		//String rel_tax_code= propertiesService.getString("rdm.levy.reltaxcode");	//연계시스템 세입코드
		String rel_tax_code = vo.getRelTaxCode();	//연계시스템 세입코드
		String acc_year=levy.getFisYea();								//회계연도
		String acc_gbn=ACC_GBN;											//회계구분
		String lvy_ymd=levy.getLvyYmd();			//부과일자
		String fst_amt=levy.getLevyAmt();								//최초본세
		
		String lst_add_amt=levy.getAdamt();							//최종가산금
//		String fst_nap_ymd=levy.getTpiPer().replaceAll("-", "");		//최초납기일
//		String aft_nap_ymd=levy.getTprPer().replaceAll("-", "");		//납기후일자
//		String aft_nap_amt=levy.getAfDueAmt();							//납기후금액
		
		String fst_nap_ymd=lvy_ymd;		//최초납기일
		String aft_nap_ymd=lvy_ymd;		//납기후일자
		String aft_nap_amt=fst_amt;						//납기후금액
		
		String lvy_gbn="02";											//부과구분 (02:수시)

		String per_gbn="";												//납세자구분 (02:법인)
		String per_nm="";												//납세자성명
		String per_pid="";												//납세자주민번호 :사업자번호
		String per_pid_sno="";											//납세자주민일련
		String per_post="";												//납세자우편번호
		String per_regn="";												//납세자지역코드
		String per_heng="";												//납세자행정동
		String per_san="";												//납세자산
		String per_bunji="";											//납세자번지
		String per_ho="";												//납세자호
		String per_spec_addr="";										//납세자특수주소
		String per_spec_dong="";										//납세자특수지동
		String per_spec_ho="";											//납세자특수지호
		String per_tong="";												//납세자통
		String per_ban="";												//납세자반

		/**
		 * 개인사용자 법정동, 행정동 가지고 오는 부분 개선필요
		 */
		//개인사용자
		if("UAT003".equals(levy.getUserAuthrt())){

			per_gbn="01";											//납세자구분 (01:개인)
			per_nm=levy.getUserNm();								//납세자성명
			per_pid=levy.getRrno();								//납세자주민번호 :사업자번호
			per_pid_sno="000";										//납세자주민일련
			per_post=levy.getUsrZip();								//납세자우편번호
			per_regn=levy.getUsrBjdCde();							//납세자지역코드
			per_heng=levy.getUsrHjdCde()+"00";						//납세자행정동
			per_san=levy.getMtnSeCd();								//납세자산
			per_bunji=levy.getMno();								//납세자번지
			per_ho=levy.getSno();								//납세자호
			per_spec_addr=levy.getDtpAdr();							//납세자특수주소
			per_spec_dong="";										//납세자특수지동
			per_spec_ho="";											//납세자특수지호
			per_tong="";											//납세자통
			per_ban="";												//납세자반

		//개인이외(유관기관)
		}else{
			per_gbn="02";											//납세자구분 (02:법인)
			per_nm=levy.getBzentyNm();								//납세자성명
			per_pid=levy.getBrno();								//납세자주민번호 :사업자번호
			per_pid_sno="001";										//납세자주민일련
			per_post=levy.getZip();								//납세자우편번호
			per_regn=levy.getStdgEmdCd();								//납세자지역코드
			per_heng=levy.getPbadmsEmdCd()+"00";							//납세자행정동
			per_san="";												//납세자산
			per_bunji="";											//납세자번지
			per_ho="";												//납세자호
			per_spec_addr=levy.getDaddr();							//납세자특수주소
			per_spec_dong="";										//납세자특수지동
			per_spec_ho="";											//납세자특수지호
			per_tong="";											//납세자통
			per_ban="";												//납세자반
		}

		String obj_nm=levy.getObjNam();							//물건명
		String obj_post=levy.getObjZip();						//물건지 우편번호
		String obj_regn=levy.getObjReg();						//물건지 지역코드
		String obj_heng=levy.getObjHen()+"00";					//물건지 행정동
		String obj_san=levy.getObjSan();						//물건지 산
		String obj_bunji=levy.getObjBun();						//물건지 번지
		String obj_ho=levy.getObjHoo();							//물건지 호
		String obj_spec_addr=levy.getObjSpe();					//물건지 특수주소
		String obj_spec_dong="";
		String obj_spec_ho="";
		String obj_tong="";
		String obj_ban="";
		String bigo="";
		String mge_item1="";
		String mge_item2="";
		String mge_item3="";
		String mge_item4="";
		String mge_item5="";
		String mge_item6="";
		String rel_gbn=REL_GBN_INSERT;									//처리구분


		RoadVO roadVO = new RoadVO();
		roadVO.setDEP_CODE(dep_code);
		roadVO.setREL_LVY_NO(rel_lvy_no);
		roadVO.setREL_TAX_CODE(rel_tax_code);
		roadVO.setACC_YEAR(acc_year);
		roadVO.setACC_GBN(acc_gbn);
		roadVO.setLVY_YMD(lvy_ymd);
		roadVO.setFST_AMT(fst_amt);

		roadVO.setLST_ADD_AMT(lst_add_amt);
		roadVO.setFST_NAP_YMD(fst_nap_ymd);
		roadVO.setAFT_NAP_YMD(aft_nap_ymd);
		roadVO.setAFT_NAP_AMT(aft_nap_amt);

		roadVO.setLVY_GBN(lvy_gbn);
		roadVO.setPER_GBN(per_gbn);
		roadVO.setPER_NM(per_nm);
		roadVO.setPER_PID(per_pid);
		roadVO.setPER_PID_SNO(per_pid_sno);
		roadVO.setPER_POST(per_post);
		roadVO.setPER_REGN(per_regn);
		roadVO.setPER_HENG(per_heng);
		roadVO.setPER_SAN(per_san);
		roadVO.setPER_BUNJI(per_bunji);
		roadVO.setPER_HO(per_ho);
		roadVO.setPER_SPEC_ADDR(per_spec_addr);
		roadVO.setPER_SPEC_DONG(per_spec_dong);
		roadVO.setPER_SPEC_HO(per_spec_ho);
		roadVO.setPER_TONG(per_tong);
		roadVO.setPER_BAN(per_ban);
		roadVO.setOBJ_NM(obj_nm);
		roadVO.setOBJ_POST(obj_post);
		roadVO.setOBJ_REGN(obj_regn);
		roadVO.setOBJ_HENG(obj_heng);
		roadVO.setOBJ_SAN(obj_san);
		roadVO.setOBJ_BUNJI(obj_bunji);
		roadVO.setOBJ_HO(obj_ho);
		roadVO.setOBJ_SPEC_ADDR(obj_spec_addr);
		roadVO.setOBJ_SPEC_DONG(obj_spec_dong);
		roadVO.setOBJ_SPEC_HO(obj_spec_ho);
		roadVO.setOBJ_TONG(obj_tong);
		roadVO.setOBJ_BAN(obj_ban);
		roadVO.setBIGO(bigo);
		roadVO.setMGE_ITEM1(mge_item1);
		roadVO.setMGE_ITEM2(mge_item2);
		roadVO.setMGE_ITEM3(mge_item3);
		roadVO.setMGE_ITEM4(mge_item4);
		roadVO.setMGE_ITEM5(mge_item5);
		roadVO.setMGE_ITEM6(mge_item6);
		roadVO.setREL_GBN(rel_gbn);

		String ip = levy.getNxrpIp().trim();
		int port = Integer.parseInt(levy.getNxrpPort().trim());
		LinkService service = new LinkService(ip, port);
		Map map = new HashMap();
		try{
			map = service.send(roadVO);
		}catch (UnknownHostException e){
			log.error("세외수입시스템 호스트를 찾을 수 없습니다.");
		}catch (IOException e){
			try{
				service.close();
			}catch (IOException e1){
				log.error("세외수입시스템 연결에 실패하였습니다.");
			}
			log.error("세외수입시스템 연결에 실패하였습니다.");
			message = "세외수입시스템 연결에 실패하였습니다.";
		}

		String type= (String)map.get(LinkService.TYPE);
		String rData= (String)map.get(LinkService.RETURN_DATA);
		rData = rData.trim();

		if(type.trim().equals("NAK")){
			message = "세외수입 고지서 부과연계오류입니다.{0}"+"\n"+rData+"번오류";
		}else if(type.trim().equals("ACK")){

			vo.setLevyNo(rel_lvy_no);
			vo.setLevyAmt(levy.getLevyAmt());
			vo.setNhtNo(rData);
			vo.setDudtIsePayTerm(levy.getDudtIsePayTerm());
			vo.setDudtAftrPayTerm(aft_nap_ymd);
			rdmDpLevyMapper.insertLevy(vo);
		}else{
			message = "세외수입시스템 연결에 실패하였습니다.";
		}

		return message;
	}



	/**
	 * @MethodDESC : 부과정보 수정
	 */
	@Override
	public String updateLevyNew(RdmDpLevyVO vo) throws Exception {
		String message = "succ";

		RdmDpLevy levy = rdmDpLevyMapper.selectInitDB(vo);
		levy.setFisYea(vo.getFisYea());
		levy.setDudtIsePayTerm(vo.getDudtIsePayTerm());
		levy.setLevyAmt(vo.getLevyAmt());
		levy.setDudtAftrPayTerm(vo.getDudtAftrPayTerm());
		levy.setVat(vo.getVat());
		levy.setAfDueAmt(vo.getAfDueAmt());
		levy.setAdamt(vo.getAdamt());
		/******** 일시점용료 부과 시작 *************************************************************************/

		//String deptCd			= wfmUiLoginDVO.getDptIde() + "0000";					//부서코드
		String deptCd			= levy.getDggTaskDeptCd() + "0000";							//부서코드
		String fisYy			= levy.getFisYea();										//회계연도
		String fisSp			= vo.getFisSp();										//회계구분
		//String ptclCd			= propertiesService.getString("rdm.levy.reltaxcode");	//세입코드
		String ptclCd			 = vo.getRelTaxCode();	//연계시스템 세입코드
		
		String impsDt			= vo.getLevyYmd();										//부과일자 (2016-01-04)
		String initDueDt		= vo.getLstDueDt();										//납기일자 (2016-01-19)
		String lstDueDt			= vo.getLstDueDt();										//최초납기일(2016-01-19)
		String afDueDt			= vo.getAfDueDt();										//납기후일자 (2016-02-04)
		
		
		String initPrcpTaxAmt	= vo.getLevyAmt();										//최초본세
		String lstPrcpTaxAmt	= vo.getLevyAmt(); //String.valueOf(Integer.parseInt(vo.getLevAmt()) + Integer.parseInt(vo.getVatTax())); //최종본세
		String vatTax			= vo.getVatTax();										//부가가치세
		String lstAddAmt		= vo.getAdamt();										//최종가산금
		String afDueAmt			= vo.getAfDueAmt();										//납기후금액
		
		
		String impsSp			= "02";													//부과구분(02:수시)
		String decsSp			= "02";													//감경구분(02:미감경)
		String decsImpsNo		= "";													//감경부과번호
		
		
		String intgrtnSp		= vo.getIntgrtnSp();//"01";													//통합구분(01:통합(부과세붙음) / 02:부과)
		//String intgrtnSp		= "02";	
		
		String ntnTax			= "0";													//국세
		
		String cnpTax			= "0";													//시도세
		String cdsTax			= "0";										//시군구세
		if(vo.getTrigAlotmKnd().equals("AMT001") || vo.getTrigAlotmKnd().equals("AMT002") || vo.getTrigAlotmKnd().equals("AMT006")){
			cnpTax = vo.getLevyAmt();
		}else if(vo.getTrigAlotmKnd().equals("AMT003") || vo.getTrigAlotmKnd().equals("AMT004") || vo.getTrigAlotmKnd().equals("AMT007")){
			cdsTax = vo.getLevyAmt();
		}

		//vatTax = String.valueOf(Integer.parseInt(levy.getLevAmt())/10);
		//vatTax = "0";//levy.getBugAmt();
		//afDueDt = levy.getLvyYmd();

		String txprSp			= "";													//납부자구분(03:사업자)
		String txprNm			= "";													//납부자성명
		String txprNo			= "";													//납부자번호(사업자번호)
		String txprZipCd		= "";													//납부자우편번호
		String txprLglvilCd		= "";													//납부자법정동코드
		String txprTwnvilCd		= "";													//납부자행정동코드
		String txprMt			= "";													//납부자산
		String txprAddrNo		= "";													//납부자번지
		String txprAddrHo		= "";													//납부자호
		String txprSpclAddr		= "";													//납부자특수주소

		if("UAT003".equals(levy.getUserAuthrt())){
			txprSp			= "01";														//납부자구분(01:개인)
			txprNm			= levy.getUserNm();											//납부자성명
			txprNo			= levy.getRrno().trim();									//납부자번호(사업자번호)
			txprZipCd		= levy.getUsrZip().replaceAll("-", "");											//납부자우편번호
			txprLglvilCd	= levy.getUsrBjdCde();										//납부자법정동코드
			txprTwnvilCd	= levy.getUsrHjdCde();										//납부자행정동코드
			txprMt			= levy.getUsrSan();											//납부자산
			txprAddrNo		= levy.getUsrBun();											//납부자번지
			txprAddrHo		= levy.getUsrBho();											//납부자호
			txprSpclAddr	= levy.getDtpAdr();											//납부자특수주소
		}else{
			txprSp			= "03";														//납부자구분(03:사업자)
			txprNm			= levy.getBzentyNm();											//납부자성명
			txprNo			= levy.getBrno().trim();									//납부자번호(사업자번호)
			txprZipCd		= levy.getZip().replaceAll("-", "");;											//납부자우편번호
			txprLglvilCd	= levy.getStdgEmdCd();											//납부자법정동코드
			txprTwnvilCd	= levy.getPbadmsEmdCd();											//납부자행정동코드
			txprMt			= levy.getMtnSeCd();											//납부자산
			txprAddrNo		= levy.getMno();											//납부자번지
			txprAddrHo		= levy.getSno();											//납부자호
			txprSpclAddr	= levy.getDaddr();											//납부자특수주소
		}


		String txprTelNo		= "";													//납부자전화번호
		String txprMphnNo		= "";													//납부자휴대폰
		String txprEml			= "";													//납부자이메일
		String newAddrYn		= "2";													//새주소여부
		//새주소관련 파라미터 추가반영.구주소를 사용하므로 전부 blank로 입력 처리2011.10.26
		String txprRoadCd		= "";													//납부자 도로명 코드
		String txprBdFlrSp		= "";													//납부자 지하여부
		String txprBdPrcpNo		= "";													//납부자 건물본번
		String txprBdSubNo		= "";													//납부자 건물부번
		//새주소관련 파라미터 추가반영.구주소를 사용하므로 전부 blank로 입력 처리2011.10.26
		String statCd			= "10";													//상태코드
		String spclFisBizCd		= "000000";												//특별회계사업코드

		String txprSpclAddrDong	= "";													//납부자특수주소동
		String txprSpclAddrHo	= "";													//납부자특수주소호
		String txprAddrTong		= "";													//납부자통
		String txprAddrBan		= "";													//납부자반
		String txprBdMngNo		= "";													//납부자반
		String txprDtlAddr		= "";													//납부자반

		String objNm			= vo.getOcpatPlc();							//물건지명
		String taxObjNewAddrYn	= "2";													//물건지새주소여부
		//새주소관련 파라미터 추가반영.구주소를 사용하므로 전부 blank로 입력 처리2011.10.26
		String objRoadCd		= "";													//물건지 도로명 코드
		String objBdFlrSp		= "";													//물건지 지하여부
		String objBdPrcpNo		= "";													//물건지 건물본번
		String objBdSubNo		= "";													//물건지 건물부번
		//새주소관련 파라미터 추가반영.구주소를 사용하므로 전부 blank로 입력 처리2011.10.26
		String objZipCd			= levy.getObjZip();										//물건지 우편번호
		String objLglvilCd		= levy.getObjReg();										//물건지 지역코드
		String objRoof			= levy.getObjHen();										//물건지 행정동
		String objMt			= levy.getObjSan();										//물건지 산
		String objAddrNo		= levy.getObjBun();										//물건지 번지
		String objAddrHo		= levy.getObjHoo();										//물건지 호
		String objSpclAddr		= levy.getObjSpe();										//물건지 특수주소
		String objSpclDong		= "";													//물건지 특수주소동
		String objSpclHo		= "";													//물건지 특수주소호
		String objTong			= "";													//물건지통
		String objBan			= "";													//물건지반
		String objBdMngNo		= "";													//물건지건물관리번호
		String objDtlAddr		= "";													//물건지상세주소
		String mngHtm1			= "";													//관리항목1
		String mngHtm2			= "";													//관리항목2
		String mngHtm3			= "";													//관리항목3
		String mngHtm4			= "";													//관리항목4
		String mngHtm5			= "";													//관리항목5
		String mngHtm6			= "";													//관리항목6
		String rmk				= "";													//비고
		String initWrkrId		= levy.getNxrpId();										//최초작업자ID
		String taxObjSp			= vo.getTaxObjSp()!= null && !"".equals(vo.getTaxObjSp()) ? vo.getTaxObjSp() : "";										//부과대상 구분코드

		InputVO inputVO = new InputVO();
		inputVO.setDEPT_CD(deptCd);
		inputVO.setFISYY(fisYy);
		inputVO.setFIS_SP(fisSp);
		inputVO.setPTCL_CD(ptclCd);
		inputVO.setIMPS_DT(impsDt);
		inputVO.setINIT_PRCP_TAX_AMT(initPrcpTaxAmt);
		inputVO.setLST_PRCP_TAX_AMT(lstPrcpTaxAmt);
		inputVO.setINIT_DUE_DT(initDueDt);
		inputVO.setLST_ADD_AMT(lstAddAmt);
		inputVO.setLST_DUE_DT(lstDueDt);
		inputVO.setAF_DUE_DT(afDueDt);
		inputVO.setAF_DUE_AMT(afDueAmt);
		inputVO.setIMPS_SP(impsSp);
		inputVO.setDECS_SP(decsSp);
		inputVO.setDECS_IMPS_NO(decsImpsNo);
		inputVO.setINTGRTN_SP(intgrtnSp);
		inputVO.setNTN_TAX(ntnTax);
		inputVO.setCNP_TAX(cnpTax);
		inputVO.setCDS_TAX(cdsTax);
		inputVO.setVAT_TAX(vatTax);
		inputVO.setTXPR_SP(txprSp);
		inputVO.setTXPR_NO(txprNo);
		inputVO.setTXPR_NM(txprNm);
		inputVO.setTXPR_TEL_NO(txprTelNo);
		inputVO.setTXPR_MPHN_NO(txprMphnNo);
		inputVO.setTXPR_EML(txprEml);
		inputVO.setNEW_ADDR_YN(newAddrYn);
		inputVO.setTXPR_ROAD_CD(txprRoadCd);
		inputVO.setTXPR_BD_FLR_SP(txprBdFlrSp);
		inputVO.setTXPR_BD_PRCP_NO(txprBdPrcpNo);
		inputVO.setTXPR_BD_SUB_NO(txprBdSubNo);
		inputVO.setSTAT_CD(statCd);
		inputVO.setSPCL_FIS_BIZ_CD(spclFisBizCd);
		inputVO.setTXPR_ZIP_CD(txprZipCd);
		inputVO.setTXPR_LGLVIL_CD(txprLglvilCd);
		inputVO.setTXPR_TWNVIL_CD(txprTwnvilCd);
		inputVO.setTXPR_MT(txprMt);
		inputVO.setTXPR_ADDR_NO(txprAddrNo);
		inputVO.setTXPR_ADDR_HO(txprAddrHo);
		inputVO.setTXPR_SPCL_ADDR(txprSpclAddr);
		inputVO.setTXPR_SPCL_ADDR_DONG(txprSpclAddrDong);
		inputVO.setTXPR_SPCL_ADDR_HO(txprSpclAddrHo);
		inputVO.setTXPR_ADDR_TONG(txprAddrTong);
		inputVO.setTXPR_ADDR_BAN(txprAddrBan);
		inputVO.setTXPR_BD_MNG_NO(txprBdMngNo);
		inputVO.setTXPR_DTL_ADDR(txprDtlAddr);
		inputVO.setOBJ_NM(objNm);
		inputVO.setTAX_OBJ_NEW_ADDR_YN(taxObjNewAddrYn);
		inputVO.setOBJ_ROAD_CD(objRoadCd);
		inputVO.setOBJ_BD_FLR_SP(objBdFlrSp);
		inputVO.setOBJ_BD_PRCP_NO(objBdPrcpNo);
		inputVO.setOBJ_BD_SUB_NO(objBdSubNo);
		inputVO.setOBJ_ZIP_CD(objZipCd);
		inputVO.setOBJ_LGLVIL_CD(objLglvilCd);
		inputVO.setOBJ_ROOF(objRoof);
		inputVO.setOBJ_MT(objMt);
		inputVO.setOBJ_ADDR_NO(objAddrNo);
		inputVO.setOBJ_ADDR_HO(objAddrHo);
		inputVO.setOBJ_SPCL_ADDR(objSpclAddr);
		inputVO.setOBJ_SPCL_DONG(objSpclDong);
		inputVO.setOBJ_SPCL_HO(objSpclHo);
		inputVO.setOBJ_TONG(objTong);
		inputVO.setOBJ_BAN(objBan);
		inputVO.setOBJ_BD_MNG_NO(objBdMngNo);
		inputVO.setOBJ_DTL_ADDR(objDtlAddr);
		inputVO.setMNG_HTM1(mngHtm1);
		inputVO.setMNG_HTM2(mngHtm2);
		inputVO.setMNG_HTM3(mngHtm3);
		inputVO.setMNG_HTM4(mngHtm4);
		inputVO.setMNG_HTM5(mngHtm5);
		inputVO.setMNG_HTM6(mngHtm6);
		inputVO.setRMK(rmk);
		inputVO.setINIT_WRKR_ID(initWrkrId);
		inputVO.setTAX_OBJ_SP(taxObjSp); //부과대상 구분코드


		LevyOutputVO outputVO = null;
		//부과금액이 0 이상일 경우만 부과
		if(!levy.getLevyAmt().equals("") && Integer.parseInt(levy.getLevyAmt()) > 0){
			try{
				outputVO = levyService.inputLevy(inputVO, levy.getNxrpIp(), levy.getNxrpPort());
			}catch (IOException e) {
				log.error(e.getMessage());
			}catch (Exception e) {
				log.error("세외수입 고지서 부과연계오류입니다.{0}");
				message = "세외수입 고지서 부과연계오류입니다.{0}";
			}

			if(outputVO.getResultCd().equals("100")){
				String rel_lvy_no = levy.getLinSeq().trim();	//연계시스템 부과번호
				if(rel_lvy_no.length() > 0){
					String temp = "";
					for(int i=0; i<21-rel_lvy_no.length(); i++) temp = "0"+temp;
					rel_lvy_no = temp + rel_lvy_no;
				}

				vo.setLevyKnd("LET001");
				vo.setLevyNo(rel_lvy_no);
				vo.setLevyAmt(levy.getLevyAmt());
				//vo.setAmtCde("AMT001");
				vo.setNhtNo(outputVO.getImpsKey());
				vo.setDudtIsePayTerm(initDueDt);
				vo.setDudtAftrPayTerm(afDueDt);
				rdmDpLevyMapper.insertLevy(vo);

			}else{
				message = "세외수입 고지서 부과연계오류입니다.{0}";
				message = "fail";
			}

		}
        /******** 일시점용료 부과 끝 ***************************************************************************/

		return message;
	}
	/**
	 * @MethodDESC : 부과정보 가져오기
	 */
	public RdmDpLevy selectLevyDt(RdmDpLevyVO vo) throws Exception {
		return rdmDpLevyMapper.selectLevyDt(vo);
	}

	@Override
	public String updateLevyNext(RdmDpLevyVO vo) throws Exception {
		String message = "succ";
		String sysId = "RES";
		String ifId = "ERR_Z000001LGE_1741000NIS_0003";
		
		String DATE_FORMAT = "yyyyMMddHHmmss";
		String MSG_FORMAT = "yyMMddHHmmssSSS";
		SimpleDateFormat sdf = new SimpleDateFormat( DATE_FORMAT );
		SimpleDateFormat mdf = new SimpleDateFormat( MSG_FORMAT );
		Calendar cal = Calendar.getInstance();
		UUID id = UUID.randomUUID();
		
		RdmDpLevy levy = rdmDpLevyMapper.selectLevyInfo(vo);
		
		levy.setFisYea(vo.getFisYea());
		levy.setDudtIsePayTerm(vo.getDudtIsePayTerm());
		levy.setLevyAmt(vo.getLevyAmt());
		levy.setDudtAftrPayTerm(vo.getDudtAftrPayTerm());
		levy.setVat(vo.getVat());
		levy.setAfDueAmt(vo.getAfDueAmt());
		levy.setAdamt(vo.getAdamt());
		
		/******** 일시점용료 body *************************************************************************/
		
		//자치단체코드
		String sgbCd 				= levy.getRspnsDeptCd();
		//연계대상코드
		String linkTrgtCd			= levy.getRspnsDeptCd() + sysId +  "01001";
		//연계관리키
		String linkMngKey			= vo.getRoadDggMngNo()+"_"+vo.getTrigAlotmKnd()+"_"+sdf.format(cal.getTime()); //허가신청서 키값으로함 + 부과코드 + 날짜
		//부서코드
		String dptCd				= levy.getDggTaskDeptCd();
		//특별회계 사업코드
		String spclFisBizCd			= "0000";
		//회계년도
		String fyr					= levy.getFisYea();
		//회계구분코드
		String actSeCd				= vo.getFisSp();
		//대표세입과목코드 
		String rprsTxmCd			= vo.getRelTaxCode();
		//운영항목코드
		String operItemCd			= "003"; //도로손괘자부담금
		
		if("236002".equals(vo.getRelTaxCode())){
			if("3530000".equals(vo.getMngInstCd()) || "3500000".equals(vo.getMngInstCd())){
				operItemCd = "003";
			}else if("3490000".equals(vo.getMngInstCd())){
				operItemCd = "000";
			}else{
				operItemCd = "004";
			}
			
		}else if("212001".equals(vo.getRelTaxCode())){
			if("AMT004".equals(vo.getTrigAlotmKnd()) || "AMT002".equals(vo.getTrigAlotmKnd())){
				operItemCd = "003";
			}else {
				operItemCd = "022";
			}
		}
		
		
		//부과일자
		String lvyYmd				= vo.getLevyYmd();
		//최초본세금액
		String frstPctAmt			= vo.getLevyAmt();
		//최초납기일자
		String frstPidYmd			= vo.getLstDueDt();
		//부과구분코드
		String lvySeCd				= "02"; //01:정기 , 02:수시
		//통합구분코드
		String untySeCd				= vo.getIntgrtnSp(); //01:통합, 02:미통합
		//국세분금액
		String ntntaxAmt			= "0";
		//시도세금액
		String prvtxAmt				= "0";
		//시군구세금액
		String curprcAmt			= "0";
		if(vo.getTrigAlotmKnd().equals("AMT001") || vo.getTrigAlotmKnd().equals("AMT002") || vo.getTrigAlotmKnd().equals("AMT006")){
			prvtxAmt = vo.getLevyAmt();
		}else if(vo.getTrigAlotmKnd().equals("AMT003") || vo.getTrigAlotmKnd().equals("AMT004") || vo.getTrigAlotmKnd().equals("AMT007")){
			curprcAmt = vo.getLevyAmt();
		}
		//부가가치세금액
		String vatAmt				= vo.getVatTax();
		//납부자구분
		String pyrSeCd;
		//납부자번호
		String pyrNo;
		//납부자명
		String pyrNm;
		
		if("UAT003".equals(levy.getUserAuthrt())){
			pyrSeCd			= "01";														//납부자구분(01:개인)
			pyrNo			= levy.getRrno().replaceAll("-","");
			pyrNm			= levy.getUserNm();
		}else{
			pyrSeCd			= "04";														//납부자구분(04:사업자)
			pyrNo			= levy.getBrno();
			pyrNm			= levy.getBzentyNm();
		}
		
		//대표납부자번호
		String rprsPyrNo			= "";		
		//대표납부자명
		String rprsPyrNm			= "";
		//연락처
		String cnpc					= levy.getMblTelno();
		//연락처구분코드
		String cnpcSeCd				= "02"; //01:전화번호, 02:휴대전화
		//납부자이메일주소
		String pyrEmlAddr			= levy.getEml();
		//납부자상태코드
		String pyrSttCd				= "10"; //10:거주자
		//지번도로주소구분코드
		String lotnoRoadAddrSeCd	= "02"; //01:지번주소, 02:도로명주소
		
		if("".equals(levy.getRoadNmAddrCd())){
			lotnoRoadAddrSeCd = "01";
		}
		//우편번호
		String zip					= levy.getUsrZip();
		//도로명코드 
		String roadNmCd				= levy.getRoadNmAddrCd();
		//지하여부
		String addrUdgdYn			= "N";
		
		
		//건물본번
		String bmno					= "";
		//건물부번
		String bsno					= "";
		
		//본번
		String mno					= "";
		//부번
		String sno					= "";
		
		//도로명 주소
		String roadNmAddr			= "";
		//도로명상세주소
		String roadNmDaddr			= "";
		//도로명전체주소
		String roadNmAlAddr			= "";
				
		//지번주소		
		String lotnoAddr			= "";
		//지번상세주소
		String lotnoDaddr			= "";
		//지번전체주소
		String lotnoAlAddr			= "";
				
		String adrAdr = levy.getAddr();
		if("02".equals(lotnoRoadAddrSeCd)){
			if(adrAdr != null){
				String bunji = adrAdr.substring(adrAdr.lastIndexOf(" ")+1,adrAdr.length() );
				if(bunji.indexOf("-")==-1){
					bmno = bunji;
				}else{
					bmno = bunji.split("-")[0];
					bsno = bunji.split("-")[1];
				}
			}
			roadNmAddr = adrAdr;
			roadNmDaddr = levy.getDtpAdr() == null ? "" : levy.getDtpAdr();
			roadNmAlAddr = adrAdr + " " +  (levy.getDtpAdr() == null ? "" : levy.getDtpAdr());
			
		}else{
			if(adrAdr != null){
				String bunji = adrAdr.substring(adrAdr.lastIndexOf(" ")+1,adrAdr.length() );
				if(bunji.indexOf("-")==-1){
					mno = bunji;
				}else{
					mno = bunji.split("-")[0];
					sno = bunji.split("-")[1];
				}
			}
			lotnoAddr = adrAdr;
			lotnoDaddr =  levy.getDtpAdr() == null ? "" : levy.getDtpAdr();
			lotnoAlAddr = adrAdr + " " +  (levy.getDtpAdr() == null ? "" : levy.getDtpAdr());
		}
		
		
		//법정동코드
		String stdgCd				= levy.getStdgCd();
		//행정동코드
		String dongCd				= "";
		//산구분코드
		String addrMtnYn			= "";
	
		//특수주소
		String spclAddr				=  levy.getDtpAdr() == null ? "" : levy.getDtpAdr(); //상세주소
		//특수동
		String spclDg				= "";
		//특수호
		String spclHo				= "";
		
		
		//부과대상구분코드
		String lvyTrgtSeCd			= vo.getTaxObjSp();
		//불건지명
		String glNm					= levy.getCstrnNm();
		//물건지지번도로주소구분코드		
		String glLotnoRoadAddrSeCd	= "01"; 
		//물건지우편번호
		String glZip				= levy.getObjZip();
		//물건지도로명코드
		String glRoadNmCd			= "";
		//물건지주소지하여부
		String glAddrUdgdYn			= "";
		//물건지건물본번
		String glBmno				= "";
		//물건지건물부번		
		String glBsno				= "";
		//물건지법정동코드
		String glStdgCd				= "";
		//물건지행정동코드
		String glDongCd				= "";
		//물건지산구분코드
		String glMtnYn				= "";
		//물건지본번
		String glMno				= "";
		//물건지부번
		String glSno				= "";
		//물건지특수동
		String glSpclAddr			= "";
		//물건지특수호
		String glSpclDg				= "";
		//물건지특수주소
		String glSpclHo				= "";
		//물건지도로명기본주소
		String glRoadNmAddr			= "";
		//물건지도로명 상세주소
		String glRoadNmDaddr		= "";
		//물건지도로명전체주소
		String glRoadNmAlAddr		= "";
		//물건지지번기본주소
		String glLotnoAddr			= levy.getObjSpe();
		//물건지지번상세주소
		String glLotnoDaddr			= "";
		//물건지지번전체주소
		String glLotnoAlAddr		= levy.getObjSpe();
		//관리1항목
		String mngItemCn1			= "";
		//관리2항목
		String mngItemCn2			= "";
		//관리3항목
		String mngItemCn3			= "";
		//관리4항목
		String mngItemCn4			= "";
		//관리5항목
		String mngItemCn5			= "";
		//관리6항목
		String mngItemCn6			= "";
		//비고내용
		String rmCn					= "";
		//예비항목1
		String rsveItem1			= "";
		//예비항목2
		String rsveItem2			= "";
		//예비항목3
		String rsveItem3			= "";
		//예비항목4
		String rsveItem4			= "";
		//예비항목5
		String rsveItem5			= "";


		LevyNextBodyVO levyvo = new LevyNextBodyVO();
		
		levyvo.setSgbCd(sgbCd);
		levyvo.setLinkTrgtCd(linkTrgtCd);
		levyvo.setLinkMngKey(linkMngKey);
		levyvo.setDptCd(dptCd);
		levyvo.setSpclFisBizCd(spclFisBizCd);
		levyvo.setFyr(fyr);
		levyvo.setActSeCd(actSeCd);
		levyvo.setRprsTxmCd(rprsTxmCd);
		levyvo.setOperItemCd(operItemCd);
		levyvo.setLvyYmd(lvyYmd);
		levyvo.setFrstPctAmt(frstPctAmt);
		levyvo.setFrstPidYmd(frstPidYmd);
		levyvo.setLvySeCd(lvySeCd);
		levyvo.setUntySeCd(untySeCd);
		levyvo.setNtntaxAmt(ntntaxAmt);
		levyvo.setPrvtxAmt(prvtxAmt);
		levyvo.setCurprcAmt(curprcAmt);
		levyvo.setVatAmt(vatAmt);
		levyvo.setPyrSeCd(pyrSeCd);
		levyvo.setPyrNo(pyrNo);
		levyvo.setPyrNm(pyrNm);
		levyvo.setRprsPyrNo(rprsPyrNo);
		levyvo.setRprsPyrNm(rprsPyrNm);
		levyvo.setCnpc(cnpc);
		levyvo.setCnpcSeCd(cnpcSeCd);
		levyvo.setPyrEmlAddr(pyrEmlAddr);
		levyvo.setPyrSttCd(pyrSttCd);
		levyvo.setLotnoRoadAddrSeCd(lotnoRoadAddrSeCd);
		levyvo.setZip(zip);
		levyvo.setRoadNmCd(roadNmCd);
		levyvo.setAddrUdgdYn(addrUdgdYn);
		levyvo.setBmno(bmno);
		levyvo.setBsno(bsno);
		levyvo.setStdgCd(stdgCd);
		levyvo.setDongCd(dongCd);
		levyvo.setAddrMtnYn(addrMtnYn);
		levyvo.setMno(mno);
		levyvo.setSno(sno);
		levyvo.setSpclAddr(spclAddr);
		levyvo.setSpclDg(spclDg);
		levyvo.setSpclHo(spclHo);
		levyvo.setRoadNmAddr(roadNmAddr);
		levyvo.setRoadNmDaddr(roadNmDaddr);
		levyvo.setRoadNmAlAddr(roadNmAlAddr);
		levyvo.setLotnoAddr(lotnoAddr);
		levyvo.setLotnoDaddr(lotnoDaddr);
		levyvo.setLotnoAlAddr(lotnoAlAddr);
		levyvo.setLvyTrgtSeCd(lvyTrgtSeCd);
		levyvo.setGlNm(glNm);
		levyvo.setGlLotnoRoadAddrSeCd(glLotnoRoadAddrSeCd);
		levyvo.setGlZip(glZip);
		levyvo.setGlRoadNmCd(glRoadNmCd);
		levyvo.setGlAddrUdgdYn(glAddrUdgdYn);
		levyvo.setGlBmno(glBmno);
		levyvo.setGlBsno(glBsno);
		levyvo.setGlStdgCd(glStdgCd);
		levyvo.setGlDongCd(glDongCd);
		levyvo.setGlMtnYn(glMtnYn);
		levyvo.setGlMno(glMno);
		levyvo.setGlSno(glSno);
		levyvo.setGlSpclAddr(glSpclAddr);
		levyvo.setGlSpclDg(glSpclDg);
		levyvo.setGlSpclHo(glSpclHo);
		levyvo.setGlRoadNmAddr(glRoadNmAddr);
		levyvo.setGlRoadNmDaddr(glRoadNmDaddr);
		levyvo.setGlRoadNmAlAddr(glRoadNmAlAddr);
		levyvo.setGlLotnoAddr(glLotnoAddr);
		levyvo.setGlLotnoDaddr(glLotnoDaddr);
		levyvo.setGlLotnoAlAddr(glLotnoAlAddr);
		levyvo.setMngItemCn1(mngItemCn1);
		levyvo.setMngItemCn2(mngItemCn2);
		levyvo.setMngItemCn3(mngItemCn3);
		levyvo.setMngItemCn4(mngItemCn4);
		levyvo.setMngItemCn5(mngItemCn5);
		levyvo.setMngItemCn6(mngItemCn6);
		levyvo.setRmCn(rmCn);
		levyvo.setRsveItem1(rsveItem1);
		levyvo.setRsveItem2(rsveItem2);
		levyvo.setRsveItem3(rsveItem3);
		levyvo.setRsveItem4(rsveItem4);
		levyvo.setRsveItem5(rsveItem5);

		/******** 일시점용료 body 끝*************************************************************************/
		
		/******** 일시점용료 head 시작************************************************************************/
		LevyNextHeadVO headVo = new LevyNextHeadVO();

		headVo.setIfDate(sdf.format(cal.getTime()));
		headVo.setIfMsgKey("Z"+mdf.format(cal.getTime())+"-"+id.toString().replaceAll("-", ""));
		headVo.setIfId(ifId);
		headVo.setSource(sgbCd + sysId);
		headVo.setTarget("1741000NIS");
		headVo.setIfType("S");
		headVo.setIfFormat("J");
		headVo.setRetCode("");
		headVo.setRetName("");
		
		/******** 일시점용료 head 끝************************************************************************/

		LevyNextOutputVO outputVO = null;
		//부과금액이 0 이상일 경우만 부과
		if(!levy.getLevyAmt().equals("") && Integer.parseInt(levy.getLevyAmt()) > 0){
			outputVO = levyNextUtil.callLevyNext(levyvo, headVo);
			
			if("000".equals(outputVO.getLinkRstCd())){

				vo.setLevyKnd("LET001");
				vo.setLevyNo("Z"+mdf.format(cal.getTime()));
				vo.setLevyAmt(levy.getLevyAmt());
				vo.setNhtNo(outputVO.getLinkMngKey());
				vo.setDudtIsePayTerm(frstPidYmd);
				vo.setDudtAftrPayTerm(frstPidYmd);
				rdmDpLevyMapper.insertLevy(vo);
				
				message = "succ";
			}else{
				message = "fail";
			}
		}
        /******** 일시점용료 부과 끝 ***************************************************************************/
		

		return message;
	}

	@Override
	public String insertLevyResult(LevyResultVO vo) throws Exception {
		String result = "succ";
		try {
			rdmDpLevyMapper.insertLevyResult(vo);
		} catch (IllegalStateException  e) {
			log.error("Levy result insert failed");
			result = "fail";
		}
		return result;
	}

	@Override
	public String insertLevyAccept(LevyAcceptVO vo) throws Exception {
		String result = "succ";
		try {
			//허가대기
			String rdhCde = "RDH302";
			//부과상태-납부확인요청
			String lesCde = "LES002";
			rdmDpLevyMapper.insertAcceptResult(vo);
			if("01".equals(vo.getRcvmtSeCd())){
				List list = rdmDpLevyMapper.selectLevyDtLinkMngKey(vo);
				boolean flag = true;
				for(int i=0;i<list.size();i++){
					EgovMap map = (EgovMap) list.get(i);
					if("0".equals(map.get("cnt"))){
						flag = false;
						break;
					}
				}
				
				if(flag){
					RdmDpLevyVO lvo = new RdmDpLevyVO();
					lvo.setRoadDggPrcsStts(rdhCde);
					lvo.setLevyStts(lesCde);
					rdmDpLevyMapper.updateLevyLesCde(lvo);
					rdmDpLevyMapper.updateConfirm(lvo);
				}
			}
			//}
		} catch (IllegalStateException e) {
			log.error("Levy accept processing failed");
			result = "fail";
		}
		return result;
	}

	@Override
	public String insertLevyCancel(LevyCancelVO vo) throws Exception {
		String result = "succ";
		try {
			rdmDpLevyMapper.insertLevyCancel(vo);
		} catch (Exception e) {
			log.error(e);
			result = "fail";
		}
		return result;
	}

	@Override
	public String insertDecrement(LevyDecrementVO vo) throws Exception {
		String result = "succ";
		try {
			rdmDpLevyMapper.insertDecrement(vo);
		} catch (IllegalStateException e) {
			log.error("Levy decrement insert failed");
			result = "fail";
		}
		return result;
	}

	@Override
	public List selectLevyResult(LevyResultVO vo) throws Exception {
		return rdmDpLevyMapper.selectLevyResult(vo);
	}

	@Override
	public List selectAcceptResult(LevyAcceptVO vo)  throws Exception {
		return rdmDpLevyMapper.selectAcceptResult(vo);
	}
	
	@Override
	public List selectLevyDtLinkMngKey(LevyAcceptVO vo)  throws Exception {
		return rdmDpLevyMapper.selectLevyDtLinkMngKey(vo);
	}

}