서울 세외수입 연계 관련 수정

main
mjkhan21 3 months ago
parent 19029fe719
commit 5298b2f344

@ -115,15 +115,19 @@ public class LevyExclBean extends AbstractBean {
return "[F] 단속 민원 자료가 처리 되지 않았습니다."
+ "<br>단속 민원 업무를 먼저 처리 하시기 바랍니다.";
}
if (levyExcl.getLevyExclSeCd().contains("1,2")) { // 부과제외(서손), 계고
if (toInt(levyExclInfo.get("CRDN_STTS_CD")) >= 51) // 단속상태코드가 부과(51) 보다 크다면, 부과제외 또는 계고 등록을 할 수 없다.
int crdnSttsCd = toInt(levyExclInfo.get("CRDN_STTS_CD"));
String levyExclSeCd = levyExcl.getLevyExclSeCd();
if ("1,2".contains(levyExclSeCd)) { // 부과제외(서손), 계고
// if (levyExclSeCd.contains("1,2")) { // 부과제외(서손), 계고
if (crdnSttsCd >= 51) // 단속상태코드가 부과(51) 보다 크다면, 부과제외 또는 계고 등록을 할 수 없다.
return "[F] 작업 중 오류가 발생하였습니다."
+ "<br>단속 자료의 처리상태가 " + levyExclInfo.string("CRDN_STTS_NM") + " 입니다";
} else if (levyExcl.getLevyExclSeCd().equals("3")) { // 부과취소
if (toInt(levyExclInfo.get("CRDN_STTS_CD")) < 51) // 단속상태코드가 부과(51) 보다 작다면, 전액감액 등록 할 수 없다.
} else if ("3".equals(levyExclSeCd)) { // 부과취소
if (crdnSttsCd < 51) // 단속상태코드가 부과(51) 보다 작다면, 전액감액 등록 할 수 없다.
return "[F] 작업 중 오류가 발생하였습니다."
+ "<br>단속 자료의 처리상태가 " + levyExclInfo.string("CRDN_STTS_NM") + " 입니다";
if (toInt(levyExclInfo.get("CRDN_STTS_CD")) > 55) // 단속상태코드가 압류(55) 보다 크면, 전액감액 등록 할 수 없다.
if (crdnSttsCd > 55) // 단속상태코드가 압류(55) 보다 크면, 전액감액 등록 할 수 없다.
return "[F] 작업 중 오류가 발생하였습니다."
+ "<br>단속 자료의 처리상태가 " + levyExclInfo.string("CRDN_STTS_NM") + " 입니다";
if (levyExclInfo.string("LEVY_ID").equals("")) // 부과(TB_LEVY) 정보 확인
@ -143,7 +147,7 @@ public class LevyExclBean extends AbstractBean {
}
// 부과취소(전액감액)일 경우 부과(TB_LEVY)에 감액금액 입력이 필요..
if (levyExcl.getLevyExclSeCd().equals("3")) {
if (levyExclSeCd.equals("3")) {
// 감액(TB_RDAMT) 등록
Rdamt rdamt = new Rdamt();
rdamt.setLevyId(levyExclInfo.string("LEVY_ID")); // 부과 ID
@ -168,7 +172,7 @@ public class LevyExclBean extends AbstractBean {
crdnSttsHstry.setCrdnId(levyExclInfo.string("CRDN_ID"));
crdnSttsHstry.setBfrSttsCd(levyExclInfo.string("CRDN_STTS_CD"));
crdnSttsHstry.setBfrSttsChgDt(levyExclInfo.string("CRDN_STTS_CHG_DT"));
crdnSttsHstry.setCrdnSttsCd(switch (levyExcl.getLevyExclSeCd()) {
crdnSttsHstry.setCrdnSttsCd(switch (levyExclSeCd) {
case "1" -> "81"; // 부과제외 -> 부과제외(서손)
case "2" -> "83"; // 계고 -> 계고
case "3" -> "80"; // 부과취소(전액감액) -> 부과취소

@ -199,6 +199,14 @@ public class Levy extends AbstractEntity {
/** 단속 Ids */
private String[] crdnIds;
public int finalPcptax() {
return toInt(levyPcptax) - toInt(rcvmtPcptax) - toInt(rdamtPcptax);
}
public int finalAdamt() {
return toInt(levyAdamt) - toInt(rcvmtAdamt) - toInt(rdamtAdamt);
}
public List<BiConsumer<String, String>> bankAccountSetters() {
ArrayList<BiConsumer<String, String>> setters = new ArrayList<>();
setters.add((bankNm, accountNo) -> {setBankNm(bankNm); setVrActno(accountNo);});

@ -14,7 +14,6 @@ import org.springframework.stereotype.Component;
import cokr.xit.base.user.service.bean.UserBean;
import cokr.xit.fims.FimsConf;
import cokr.xit.fims.cmmn.CrdnSttsHstry;
import cokr.xit.fims.cmmn.service.bean.CrdnSttsHstryBean;
import cokr.xit.fims.crdn.Crdn;
import cokr.xit.fims.crdn.dao.CrdnInfoMapper;
@ -27,6 +26,8 @@ import cokr.xit.fims.nxrp.NisIndivQuery;
import cokr.xit.fims.nxrp.dao.NisA01Mapper;
import cokr.xit.fims.rcvm.Rcvmt;
import cokr.xit.fims.rcvm.service.bean.RcvmtBean;
import cokr.xit.fims.rdca.Rdamt;
import cokr.xit.fims.rdca.service.bean.RdamtBean;
import cokr.xit.fims.sndb.SndbQuery;
import cokr.xit.fims.sndb.SndngDtl;
import cokr.xit.fims.sndb.dao.SndngDtlMapper;
@ -34,6 +35,7 @@ import cokr.xit.foundation.Downloadable;
import cokr.xit.foundation.UserInfo;
import cokr.xit.foundation.component.AbstractBean;
import cokr.xit.foundation.data.DataObject;
import cokr.xit.foundation.data.JSON;
import cokr.xit.interfaces.sntris.buga.Bu04BugaWSDTO;
import cokr.xit.interfaces.sntris.fileoffer.Ye22InputDTO;
import cokr.xit.interfaces.sntris.fileoffer.Ye22NoticeInfoDTO;
@ -75,6 +77,10 @@ public class SnisBean extends AbstractBean {
private LevyMapper levyMapper;
@Resource(name = "rcvmtBean")
private RcvmtBean rcvmtBean;
@Resource(name = "rdamtBean")
private RdamtBean rdamtBean;
private JSON json = new JSON();
/** .
* @param req
@ -87,6 +93,7 @@ public class SnisBean extends AbstractBean {
}
public String update(Map<String, Bu18WebReturnInfoDTO> results) {
log().debug("{} Bu18WebReturnInfoDTOs received", results.size());
// 로컬 발송대상 상세 업데이트
Set<String> ids = results.keySet(); // 발송대상 상세ID
SndbQuery req = new SndbQuery().setSndngDtlIds(ids.toArray(new String[ids.size()]));
@ -137,6 +144,8 @@ public class SnisBean extends AbstractBean {
private SndngDtl update(Bu18WebReturnInfoDTO returned, SndngDtl sndngDtl) {
if (returned == null) return null;
log().debug("returned\n{}", json.stringify(returned, true));
sndngDtl.setLinkMngKey(returned.getNoticeAk()); // 연계 키 <- 세외수입 과태료대장키
// sndngDtl.setLinkMngKey(returned.getBuAfk()); // 연계 키 <- 세외수입 부과키
sndngDtl.setEpayno(returned.getEnapbuNo()); // 전자납부번호
@ -309,7 +318,7 @@ public class SnisBean extends AbstractBean {
levy.setLevyPcptax((int)notice.getTaxAmt()); // 부과본세 <- 과세금액
levy.setLevyAdamt((int)notice.gasanAmt()); // 부과가산금
levy.setLastAmt((int)notice.totalAmt()); // 최종금액
levy.setLastAmt((int)notice.finalAmt()); // 최종금액
levy.setDudtAftrAmt(null);
if ("1".equals(notice.getBuStatusCd())) { // 완납일경우
@ -352,6 +361,7 @@ public class SnisBean extends AbstractBean {
}
private void update(List<Ye22NoticeInfoDTO> notices) {
log().debug("{} Ye22NoticeInfoDTO(s) received", !isEmpty(notices) ? notices.size() : 0);
if (isEmpty(notices)) return;
// 세외수입 연계키별 부과정보
@ -380,24 +390,40 @@ public class SnisBean extends AbstractBean {
));
for (Ye22NoticeInfoDTO notice: notices) {
String status = notice.getBuStatusCd(); // 과태료 상태
boolean paidFull = "1".equals(status); // '완납' 여부
log().debug("Ye22NoticeInfoDTO of\n{}", json.stringify(notice, true));
String statusCode = notice.getBuStatusCd(), // 과태료 상태
status = notice.getBuStatusNm(); // 상태이름
boolean paid = "1,2,3,4,5".contains(statusCode); // 수납(완납,이중납,일부납,과납,오납)
String linkMngKey = Long.toString(notice.getBuAk()); // 세외수입 연계키
int rcvmtAmt = (int)notice.totalAmt();
log().debug("세외수입 연계키: {}, 상태: {}", linkMngKey, status);
log().debug("세외수입 연계키: {}, 상태: {}", linkMngKey, statusCode);
Levy levy = levies.get(linkMngKey);
if (levy == null) continue;
update(notice, levy); // 부과정보에 적용
levyMapper.updateLevy(levy);
if (paidFull) {
Rcvmt rcvmt = new Rcvmt(); // 수납등록
rcvmt.setLevyId(levy.getLevyId());
rcvmt.setRcvmtAmt(rcvmtAmt);
String crdnId = levy.getCrdnId();
Crdn crdn = crdns.get(crdnId);
if (crdn == null) continue;
if (paid) {
Rcvmt rcvmt = Rcvmt.create(levy); // 수납등록
rcvmt.setRcvmtAmt(rcvmtAmt); // 수납금액
rcvmt.setRcvmtYmd(notice.getNapbuYmd()); // 수납일자
rcvmt.calcAmts();
if ("1".equals(statusCode)) { // 완납
String rcvmtSttsCd = switch (crdn.getCrdnSttsCd()) {
case "23", "31", "42", "43", "44", "45" -> "1"; // 사전부과, 의견제출, 사전통보발송, 사전통보완료 -> 사전통보수납
case "51" -> "2"; // 부과 -> 부과수납
case "55" -> "3"; // 압류 -> 압류수납
default -> null;
};
if (rcvmtSttsCd != null)
rcvmt.setRcvmtSttsCd(rcvmtSttsCd);
}
rcvmtBean.createRcvmt(rcvmt);
}
String crdnId = levy.getCrdnId();
if (bugwa) {
SndngDtl sndngDtl = sndngDetails.get(crdnId);
update(notice, sndngDtl); // 발송상세에 적용
@ -405,18 +431,24 @@ public class SnisBean extends AbstractBean {
sndngDtlMapper.updateSndngDtl(sndngDtl);
}
Crdn crdn = crdns.get(crdnId);
if (crdn == null) continue;
boolean reduced = "30".equals(statusCode) || "전액감액".equals(status);
if (reduced) { // 감면, 전액감액 -> 감액 등록
Rdamt rdamt = Rdamt.create(levy);
rdamtBean.createRdamt(rdamt);
}
if (!paid && !reduced)
levyMapper.updateLevy(levy);
String crdnStatus = crdn.getCrdnSttsCd();
// String crdnStatus = crdn.getCrdnSttsCd();
// 단속정보에 적용
if ("0".equals(status)) { // '부과'상태
if ("0".equals(statusCode)) { // '부과'상태
} else if (paidFull) {
} else if (paid) {
crdn.setRcvmtAmt(rcvmtAmt); // 수납금액
// notice.getNapbuYmd(); // 납부일자
crdnUpdtMapper.updateEditCrdn(crdn);
/*
crdnStatus = switch (crdn.getCrdnSttsCd()) {
case "23", "31", "42", "43", "44", "45" -> "71"; // 사전부과, 의견제출, 사전통보발송, 사전통보완료 -> 사전통보수납
case "51" -> "72"; // 부과 -> 부과수납
@ -429,6 +461,9 @@ public class SnisBean extends AbstractBean {
CrdnSttsHstry history = CrdnSttsHstry.create(crdnStatus, null, crdn);
crdnSttsHstryBean.createHstryUpdateCrdnSttsCd(history);
}
*/
} else if ("전액감액".equals(status)) {
}
}
}

@ -1,5 +1,6 @@
package cokr.xit.fims.rcvm;
import cokr.xit.fims.levy.Levy;
import cokr.xit.foundation.AbstractEntity;
import lombok.Getter;
import lombok.Setter;
@ -11,6 +12,28 @@ import lombok.Setter;
@Getter
@Setter
public class Rcvmt extends AbstractEntity {
public static final Rcvmt create(Levy levy) {
Rcvmt rcvmt = new Rcvmt(); // 수납등록
rcvmt.setSggCd(levy.getSggCd());
rcvmt.setTaskSeCd(levy.getTaskSeCd());
rcvmt.setDeptCd(levy.getDeptCd());
rcvmt.setLevyId(levy.getLevyId());
rcvmt.setRcvmtInptSeCd("11"); // 수납입력구분: 세외수입(FIM044)
rcvmt.setFyr(levy.getFyr()); // 회계연도
rcvmt.setAcntgSeCd(levy.getAcntgSeCd()); // 회계구분
rcvmt.setSpclBizCd(levy.getSpclBizCd());
rcvmt.setTxitmCd(levy.getTxitmCd()); // 세목
rcvmt.setLevyNo(levy.getLevyNo()); // 부과번호
rcvmt.setIspySn(null); // 분납 일련번호
rcvmt.setAcntgYmd(rcvmt.getRcvmtYmd()); // 회계일자
rcvmt.setTsfYmd(rcvmt.getRcvmtYmd()); // 이체일자
rcvmt.setPayMthdSeCd("10"); // 납부방법구분: 기타 (FIM045)
rcvmt.setEpayno(levy.getEpayno()); // 전자납부번호
rcvmt.setLastPcptax(levy.finalPcptax()); // 최종본세
rcvmt.setLastAdamt(levy.finalAdamt()); // 최종가산금
return rcvmt;
}
/**
* ID
@ -177,5 +200,33 @@ public class Rcvmt extends AbstractEntity {
*/
private String delRsn;
}
/** , .
* .
*/
public void calcAmts() {
if (lastPcptax == null || lastAdamt == null) return;
if (lastPcptax + lastAdamt == 0) {
rcvmtPcptax = rcvmtAdamt = 0;
rcvmtSeCd = "02"; // 이중수납
} else {
rcvmtPcptax = lastPcptax;
rcvmtAdamt = lastAdamt;
int rcvmtAmt = toInt(this.rcvmtAmt);
if (lastPcptax + lastAdamt == rcvmtAmt)
rcvmtSeCd = "01"; // 완납
else if (lastPcptax + lastAdamt < rcvmtAmt)
rcvmtSeCd = "04"; // 과납
else if (lastPcptax + lastAdamt > rcvmtAmt) {
if (rcvmtAmt > lastPcptax) {
rcvmtAdamt = rcvmtAmt - lastPcptax;
} else {
rcvmtPcptax = rcvmtAmt;
rcvmtAdamt = 0;
}
rcvmtSeCd = "06"; // 일부수납
}
}
}
}

@ -163,7 +163,7 @@ public class RcvmtBean extends AbstractBean {
throw new RuntimeException("부과 대장에 수납금액 수정에 실패하였습니다.");
// 합계 금액이 0이면서 완납(01) 또는 과납(04)이라면 단속 상태 코드를 수정한다.
if (levy.getLastAmt() == 0 && (rcvmtSeCd.equals("01") || rcvmtSeCd.equals("04"))) {
if (levy.getLastAmt() == 0 && ("01,04".contains(rcvmtSeCd))) {
// 단속 상태 이력(TB_CRDN_STTS_HSTRY) 대장에 등록하고, 단속(TB_CRDN) 대장을 수정한다.
String crdnSttsCd = levyInfo.string("CRDN_STTS_CD");
String newCrdnSttsCd = "";
@ -180,13 +180,7 @@ public class RcvmtBean extends AbstractBean {
};
}
CrdnSttsHstry crdnSttsHstry = new CrdnSttsHstry();
crdnSttsHstry.setCrdnId(levyInfo.string("CRDN_ID")); // 단속 ID
crdnSttsHstry.setBfrSttsCd(levyInfo.string("CRDN_STTS_CD")); // 단속 상태 코드
crdnSttsHstry.setBfrSttsChgDt(levyInfo.string("CRDN_STTS_CHG_DT")); // 단소 상태 변경 일시
crdnSttsHstry.setCrdnSttsCd(newCrdnSttsCd); // 단속상태코드(FIM010)
crdnSttsHstry.setTaskDtlId(rcvmt.getRcvmtId()); // 수납 ID
CrdnSttsHstry crdnSttsHstry = CrdnSttsHstry.create(newCrdnSttsCd, rcvmt.getRcvmtId(), null, levyInfo);
// 단속 상태 이력(TB_CRDN_STTS_HSTRY) 대장에 등록하고, 단속(TB_CRDN) 대장을 수정한다.
if (!crdnSttsHstryBean.createHstryUpdateCrdnSttsCd(crdnSttsHstry))
throw new RuntimeException("수납 등록 중 단속 대장의 단속상태 수정에 실패하였습니다.");

@ -1,8 +1,9 @@
package cokr.xit.fims.rdca;
import cokr.xit.fims.levy.Levy;
import cokr.xit.foundation.AbstractEntity;
import lombok.Getter;
import lombok.Setter;
import cokr.xit.foundation.AbstractEntity;
/**
*
@ -98,4 +99,10 @@ public class Rdamt extends AbstractEntity {
*/
private String sggCd;
}
public static final Rdamt create(Levy levy) {
Rdamt rdamt = new Rdamt();
rdamt.setLevyId(levy.getLevyId());
rdamt.setSggCd(levy.getSggCd());
return rdamt;
}
}

@ -28,11 +28,9 @@ import cokr.xit.foundation.data.DataObject;
*/
@Component("rdamtBean")
public class RdamtBean extends AbstractBean {
/** 감액 대장 정보 DAO */
@Resource(name = "rdamtMapper")
private RdamtMapper rdamtMapper;
/** 부과 대장 정보 DAO */
@Resource(name = "levyMapper")
private LevyMapper levyMapper;
@ -98,11 +96,6 @@ public class RdamtBean extends AbstractBean {
* </ul>
*/
public String createRdamt(Rdamt rdamt) {
// 변수 선언
boolean rtnScs = false; // DB 처리 결과
int rtnNocs = -1; // 처리 결과 건수
String rtnMsg = ""; // 처리 결과 메시지
// 부과 ID로 부과 정보 조회
DataObject levyInfo = levyMapper.selectLevyAmt(new LevyQuery().setLevyId(rdamt.getLevyId()));
@ -110,15 +103,15 @@ public class RdamtBean extends AbstractBean {
Levy levy = new Levy();
levy.setLevyId(levyInfo.string("LEVY_ID")); // 부과 ID
if ("02,03,04".contains(rdamt.getRdamtSeCd())) { // 02:부과취소, 03:이의신청수용, 04:법원이송
int levyPcptax = toInt(levyInfo.get("LEVY_PCPTAX"));
int levyAdamt = toInt(levyInfo.get("LEVY_ADAMT"));
if ("02,03,04".contains(rdamt.getRdamtSeCd())) { // 02:부과취소, 03:이의신청수용, 04:법원이송
// 수납금액이 있으면 오류 발생
if (toInt(levyInfo.get("RCVMT_PCPTAX")) + toInt(levyInfo.get("RCVMT_ADAMT")) > 0) {
rtnMsg = "[F] 수납금액이 존재합니다.<br>부분 감액으로 진행하시기 바랍니다."; // 예외를 발생시켜서 DB Rollback
return rtnMsg;
}
if (toInt(levyInfo.get("RCVMT_PCPTAX")) + toInt(levyInfo.get("RCVMT_ADAMT")) > 0)
return "[F] 수납금액이 존재합니다.<br>부분 감액으로 진행하시기 바랍니다.";
levy.setRdamtPcptax(toInt(levyInfo.get("LEVY_PCPTAX"))); // 감액 본세
levy.setRdamtAdamt(toInt(levyInfo.get("LEVY_ADAMT"))); // 감액 가산금
levy.setRdamtPcptax(levyPcptax); // 감액 본세
levy.setRdamtAdamt(levyAdamt); // 감액 가산금
levy.setLastAmt(0); // 최종 금액
levy.setDudtAftrAmt(0); // 납기 후 금액
} else {
@ -132,17 +125,15 @@ public class RdamtBean extends AbstractBean {
}
}
rtnNocs = levyMapper.updateLevyRdamt(levy);
if (rtnNocs != 1) {
throw new RuntimeException("부과 대장의 감액 금액 수정에 실패하였습니다."); // 예외를 발생시켜서 DB Rollback
}
if (levyMapper.updateLevyRdamt(levy) != 1)
throw new RuntimeException("부과 대장의 감액 금액 수정에 실패하였습니다.");
// 감액(TB_RDAMT) 대장 정보를 등록한다.
if ("02,03,04".contains(rdamt.getRdamtSeCd())) { // 02:부과취소, 03:이의신청수용, 04:법원이송
rdamt.setLastPcptax(toInt(levyInfo.get("LEVY_PCPTAX")));
rdamt.setLastAdamt(toInt(levyInfo.get("LEVY_ADAMT")));
rdamt.setRdamtPcptax(toInt(levyInfo.get("LEVY_PCPTAX")));
rdamt.setRdamtAdamt(toInt(levyInfo.get("LEVY_ADAMT")));
rdamt.setLastPcptax(levyPcptax);
rdamt.setLastAdamt(levyAdamt);
rdamt.setRdamtPcptax(levyPcptax);
rdamt.setRdamtAdamt(levyAdamt);
} else {
rdamt.setLastPcptax(toInt(levyInfo.get("LAST_PCPTAX")));
rdamt.setLastAdamt(toInt(levyInfo.get("LAST_ADAMT")));
@ -150,10 +141,8 @@ public class RdamtBean extends AbstractBean {
rdamt.setRdamtAdamt(rdamt.getRdamtAdamt());
}
rtnScs = rdamtMapper.insert(rdamt);
if (!rtnScs) {
throw new RuntimeException("감액 대장 등록에 실패하였습니다."); // 예외를 발생시켜서 DB Rollback
}
if (!rdamtMapper.insert(rdamt))
throw new RuntimeException("감액 대장 등록에 실패하였습니다.");
return "[S] 작업이 정상 처리 되었습니다.";
}
@ -167,9 +156,8 @@ public class RdamtBean extends AbstractBean {
*/
public String updateRdamt(Rdamt rdamt) {
// 감액(TB_RDAMT) 대장 정보를 수정한다.
boolean rtnScs = rdamtMapper.update(rdamt);
if (!rtnScs)
throw new RuntimeException("감액 대장 수정에 실패하였습니다."); // 예외를 발생시켜서 DB Rollback
if (!rdamtMapper.update(rdamt))
throw new RuntimeException("감액 대장 수정에 실패하였습니다.");
return "[S] 작업이 정상 처리 되었습니다.";
}
@ -183,11 +171,9 @@ public class RdamtBean extends AbstractBean {
*/
public String removeRdamt(Rdamt rdamt) {
// 감액(TB_RDAMT) 대장 정보를 삭제한다.
boolean rtnScs = rdamtMapper.delete(rdamt);
if (!rtnScs)
throw new RuntimeException("감액 정보 삭제에 실패하였습니다."); // 예외를 발생시켜서 DB Rollback
if (!rdamtMapper.delete(rdamt))
throw new RuntimeException("감액 정보 삭제에 실패하였습니다.");
return "[S] 작업이 정상 처리 되었습니다.";
}
}
}

@ -373,8 +373,7 @@
FROM TB_RCVMT
WHERE RCVMT_ID LIKE CONCAT(#{sggCd}, DATE_FORMAT(CURRENT_DATE, '%Y'), '%')
</selectKey>
INSERT
INTO TB_RCVMT (
INSERT INTO TB_RCVMT (
RCVMT_ID <!-- 수납 ID -->
, SGG_CD <!-- 시군구 코드 -->
, TASK_SE_CD <!-- 업무 구분 코드 -->
@ -411,8 +410,7 @@
, RGTR <!-- 등록자 -->
, MDFCN_DT <!-- 수정 일시 -->
, MDFR <!-- 수정자 -->
)
VALUES (
) VALUES (
#{rcvmtId} <!-- 수납 ID -->
, #{sggCd} <!-- 시군구 코드 -->
, #{taskSeCd} <!-- 업무 구분 코드 -->

Loading…
Cancel
Save