nation 버전 이식

This commit is contained in:
Macbook
2026-07-12 15:55:08 +09:00
parent 314a3554d3
commit 07a8114927
54 changed files with 11612 additions and 203 deletions
@@ -29,10 +29,9 @@ class CareReceptionController {
private final EntityManager em;
private final FileStorageService fileStorage;
static final List<String> PROGRESS_STATUSES = List.of(
"1.접수완료", "2.고객통화", "3.서류검토", "4.개통완료", "5.사은품지급", "6.정산완료", "9.취소");
static final List<String> SETTLE_STATUSES = List.of("정산대기", "정산완료", "회수대기", "회수완료");
static final List<String> GIFT_STATUSES = List.of("미지급", "지급대기", "지급완료", "반송");
static final List<String> PROGRESS_STATUSES = ReceptionStatuses.progressCodes();
static final List<String> SETTLE_STATUSES = ReceptionStatuses.centerCodes();
static final List<String> GIFT_STATUSES = ReceptionStatuses.giftCodes();
static final List<String> CARRIERS = List.of("KT", "SKB", "LGU+", "SKT", "기타");
static final List<String> REGIONS = List.of(
"서울", "경기", "인천", "강원", "충북", "충남", "대전", "전북", "전남", "광주",
@@ -47,7 +46,9 @@ class CareReceptionController {
Map<String, Long> counts = new LinkedHashMap<>();
counts.put("ALL", (long) filtered.size());
for (String st : PROGRESS_STATUSES) {
counts.put(st, filtered.stream().filter(r -> st.equals(r.getProgressStatus())).count());
counts.put(st, filtered.stream()
.filter(r -> st.equals(ReceptionStatuses.normalizeProgress(r.getProgressStatus())))
.count());
}
int fromIdx = Math.max(0, page) * Math.max(1, size);
int limit = Math.min(Math.max(size, 1), 200);
@@ -60,6 +61,10 @@ class CareReceptionController {
data.put("progressStatuses", PROGRESS_STATUSES);
data.put("settleStatuses", SETTLE_STATUSES);
data.put("giftStatuses", GIFT_STATUSES);
data.put("progressStatusLabels", ReceptionStatuses.PROGRESS);
data.put("giftStatusLabels", ReceptionStatuses.GIFT);
data.put("settleStatusLabels", ReceptionStatuses.CENTER);
data.put("giftPlaceLabels", ReceptionStatuses.GIFT_PLACE);
data.put("carriers", distinct(filtered, HomesReception::getCarrier, CARRIERS));
data.put("branches", distinct(filtered, HomesReception::getBranch, List.of()));
data.put("counselors", distinct(filtered, HomesReception::getCounselor, List.of()));
@@ -170,32 +175,61 @@ class CareReceptionController {
boolean adminOnly = Boolean.TRUE.equals(body.get("adminOnly")) || "true".equalsIgnoreCase(String.valueOf(body.get("adminOnly")));
boolean statusChanged = false;
if (!blank(newStatus) && !Objects.equals(newStatus, r.getProgressStatus())) {
r.setProgressStatus(newStatus);
statusChanged = true;
if ("4.개통완료".equals(newStatus) && blank(r.getGiftStatus())) {
r.setGiftStatus("지급대기");
}
if ("4.개통완료".equals(newStatus) && r.getOpenDate() == null) {
r.setOpenDate(LocalDate.now(ZoneId.of("Asia/Seoul")));
String prevProgress = ReceptionStatuses.normalizeProgress(r.getProgressStatus());
if (!blank(newStatus)) {
newStatus = ReceptionStatuses.normalizeProgress(newStatus);
if (!Objects.equals(newStatus, prevProgress)) {
Set<String> allowed = ReceptionStatuses.orderStatusTransitions(prevProgress);
if (("f23".equals(prevProgress) || "f24".equals(prevProgress) || "f25".equals(prevProgress))
&& !allowed.isEmpty() && !allowed.contains(newStatus)) {
return ApiResponse.fail("정산 관련 상태는 정산현황 메뉴에서 변경하세요. (현재: "
+ ReceptionStatuses.progressLabel(prevProgress) + ")");
}
r.setProgressStatus(newStatus);
statusChanged = true;
applyOpenSideEffects(r, newStatus, u);
}
}
String giftStatus = str(body.get("giftStatus"));
boolean giftChanged = false;
if (!blank(giftStatus) && !Objects.equals(giftStatus, r.getGiftStatus())) {
r.setGiftStatus(giftStatus);
giftChanged = true;
appendGiftLog(r, giftStatus, str(body.get("giftProgressLog")), u);
if ("지급완료".equals(giftStatus) && "4.개통완료".equals(r.getProgressStatus())) {
r.setProgressStatus("6.정산완료");
r.setSettleStatus("정산완료");
statusChanged = true;
if (body.containsKey("giftStatus")) {
giftStatus = ReceptionStatuses.normalizeGift(giftStatus);
String prevGift = ReceptionStatuses.normalizeGift(r.getGiftStatus());
if (!Objects.equals(giftStatus, prevGift)) {
r.setGiftStatus(blank(giftStatus) ? null : giftStatus);
if ("g01".equals(giftStatus) && r.getGiftRequested() == null) {
r.setGiftRequested(LocalDate.now(ZoneId.of("Asia/Seoul")));
}
if ("g07".equals(giftStatus)) {
if (r.getGiftSended() == null) {
LocalDate today = LocalDate.now(ZoneId.of("Asia/Seoul"));
r.setGiftSended(today);
r.setGiftDate(today);
}
String cur = ReceptionStatuses.normalizeProgress(r.getProgressStatus());
if ("f14".equals(cur)) {
r.setProgressStatus("f23");
r.setSettleStatus("h01");
statusChanged = true;
appendLog(r, "f23", "사은품 지급완료 후 정산대기 자동변경", u, false);
}
}
appendGiftLog(r, blank(giftStatus) ? prevGift : giftStatus, str(body.get("giftProgressLog")), u);
} else if (!blank(str(body.get("giftProgressLog")))) {
appendGiftLog(r, r.getGiftStatus(), str(body.get("giftProgressLog")), u);
}
} else if (!blank(str(body.get("giftProgressLog")))) {
appendGiftLog(r, r.getGiftStatus(), str(body.get("giftProgressLog")), u);
}
String centerStatus = str(body.containsKey("centerStatus") ? body.get("centerStatus") : body.get("settleStatus"));
if (!blank(centerStatus)) {
centerStatus = ReceptionStatuses.normalizeCenter(centerStatus);
if (!Objects.equals(centerStatus, ReceptionStatuses.normalizeCenter(r.getSettleStatus()))) {
r.setSettleStatus(centerStatus);
}
}
if (statusChanged || !blank(progressMemo)) {
appendLog(r, blank(newStatus) ? r.getProgressStatus() : newStatus, progressMemo, u, adminOnly);
}
@@ -210,6 +244,30 @@ class CareReceptionController {
return ApiResponse.ok(toProgressDetail(r, u));
}
/** f14 개통완료 시 사은품 g01 + 입력처 h01 + 개통일 */
private void applyOpenSideEffects(HomesReception r, String newStatus, JwtUser u) {
if ("f22".equals(newStatus) && r.getCancelDate() == null) {
r.setCancelDate(LocalDate.now(ZoneId.of("Asia/Seoul")));
}
if (ReceptionStatuses.isPreCalc(newStatus)) {
r.setReceptionCostId(null);
}
if (!"f14".equals(newStatus)) return;
if (r.getOpenDate() == null) {
r.setOpenDate(LocalDate.now(ZoneId.of("Asia/Seoul")));
}
String gift = ReceptionStatuses.normalizeGift(r.getGiftStatus());
if (blank(gift)) {
r.setGiftStatus("g01");
if (r.getGiftRequested() == null) {
r.setGiftRequested(LocalDate.now(ZoneId.of("Asia/Seoul")));
}
appendGiftLog(r, "g01", "개통완료 후 자동변경", u);
}
String center = ReceptionStatuses.normalizeCenter(r.getSettleStatus());
r.setSettleStatus(blank(center) ? "h01" : center);
}
@DeleteMapping("/receptions/progress-log/{logId}")
@Transactional
ApiResponse deleteProgressLog(@PathVariable Long logId, @AuthenticationPrincipal JwtUser u) {
@@ -235,9 +293,12 @@ class CareReceptionController {
r.setGroupId(u.getGroupId());
apply(r, body);
if (r.getOrderDate() == null) r.setOrderDate(LocalDateTime.now(ZoneId.of("Asia/Seoul")));
if (blank(r.getProgressStatus())) r.setProgressStatus("1.접수완료");
if (blank(r.getSettleStatus())) r.setSettleStatus("정산대기");
if (blank(r.getGiftStatus())) r.setGiftStatus("미지급");
if (blank(r.getProgressStatus())) r.setProgressStatus("f01");
else r.setProgressStatus(ReceptionStatuses.normalizeProgress(r.getProgressStatus()));
if (blank(r.getSettleStatus())) r.setSettleStatus("h01");
else r.setSettleStatus(ReceptionStatuses.normalizeCenter(r.getSettleStatus()));
if (blank(r.getGiftStatus()) || "미지급".equals(r.getGiftStatus())) r.setGiftStatus(null);
else r.setGiftStatus(ReceptionStatuses.normalizeGift(r.getGiftStatus()));
if (blank(r.getOrderNumber())) r.setOrderNumber(genOrderNumber());
em.persist(r);
em.flush();
@@ -313,12 +374,13 @@ class CareReceptionController {
int n = 0;
for (HomesReception r : rows) {
r.setProgressStatus(status);
String normalized = ReceptionStatuses.normalizeProgress(status);
r.setProgressStatus(normalized);
if (!blank(processor)) r.setProcessor(processor);
if (opened != null) r.setOpenDate(opened);
if (canceled != null) r.setCancelDate(canceled);
if ("4.개통완료".equals(status) && blank(r.getGiftStatus())) r.setGiftStatus("지급대기");
appendLog(r, status, memo, u, adminOnly);
applyOpenSideEffects(r, normalized, u);
appendLog(r, normalized, memo, u, adminOnly);
n++;
}
writeLog(u, "RECEPTION", "접수-일괄진행", "접수 " + n + "건 진행상황을 [" + status + "]로 변경하였습니다.");
@@ -359,7 +421,8 @@ class CareReceptionController {
int n = 0;
for (HomesReception r : rows) {
r.setGiftStatus(status);
String normalized = ReceptionStatuses.normalizeGift(status);
r.setGiftStatus(blank(normalized) ? null : normalized);
if (!blank(place)) r.setGiftPlace(place);
if (!blank(deliveryCompany)) r.setDeliveryCompany(deliveryCompany);
if (!blank(trackingNumber)) r.setTrackingNumber(trackingNumber);
@@ -368,7 +431,22 @@ class CareReceptionController {
r.setGiftSended(sended);
r.setGiftDate(sended);
}
appendGiftLog(r, status, giftMemo, u);
if ("g01".equals(normalized) && r.getGiftRequested() == null) {
r.setGiftRequested(LocalDate.now(ZoneId.of("Asia/Seoul")));
}
if ("g07".equals(normalized)) {
if (r.getGiftSended() == null) {
LocalDate today = LocalDate.now(ZoneId.of("Asia/Seoul"));
r.setGiftSended(today);
r.setGiftDate(today);
}
if ("f14".equals(ReceptionStatuses.normalizeProgress(r.getProgressStatus()))) {
r.setProgressStatus("f23");
r.setSettleStatus("h01");
appendLog(r, "f23", "사은품 일괄지급완료 후 정산대기", u, false);
}
}
appendGiftLog(r, blank(normalized) ? status : normalized, giftMemo, u);
n++;
}
writeLog(u, "RECEPTION", "사은품-일괄", "접수 " + n + "건 사은품진행을 [" + status + "]로 변경하였습니다.");
@@ -385,9 +463,9 @@ class CareReceptionController {
for (Long id : ids) {
HomesReception r = findOwned(id, u);
if (r == null) return ApiResponse.fail("접수 리스트가 올바르지 않습니다.");
// 입력처 정산이 비어있거나 미지정인 건만 대상
if (!blank(r.getSettleStatus()) && !"정산대기".equals(r.getSettleStatus())
&& !"미지정".equals(r.getSettleStatus())) {
// 입력처 정산이 비어있거나 정산대기(h01)인 건만 대상
String st = ReceptionStatuses.normalizeCenter(r.getSettleStatus());
if (!blank(st) && !"h01".equals(st)) {
return ApiResponse.fail("접수 리스트가 올바르지 않습니다.");
}
rows.add(r);
@@ -395,7 +473,7 @@ class CareReceptionController {
int n = 0;
for (HomesReception r : rows) {
r.setSettleStatus("정산대기");
r.setSettleStatus("h01");
appendLog(r, r.getProgressStatus(), "[일괄변경] 입력처 정산대기", u, false);
n++;
}
@@ -540,8 +618,10 @@ class CareReceptionController {
r.setGiftCategory(giftCategory);
r.setGiftPlace(giftPlaceCode);
r.setGiftDate(parseDate(str(gift.get("giftDate"))));
r.setGiftStatus(blank(giftType) || "a01".equals(giftType) ? "미지급" : "지급대기");
r.setGiftCashAmount(toDecimal(gift.get("cashAmount")));
r.setGiftStatus(blank(giftType) || "a01".equals(giftType) ? null : "g01");
if ("g01".equals(r.getGiftStatus())) {
r.setGiftRequested(LocalDate.now(ZoneId.of("Asia/Seoul")));
} r.setGiftCashAmount(toDecimal(gift.get("cashAmount")));
r.setGiftGoods(str(gift.get("goods")));
r.setGiftGoodsPrice(toDecimal(gift.get("goodsPrice")));
r.setGiftBank(str(gift.get("accountBank")));
@@ -559,8 +639,8 @@ class CareReceptionController {
r.setPaymentCardYear(str(payment.get("cardYear")));
r.setPaymentCardMonth(str(payment.get("cardMonth")));
r.setPaymentCardNumber(str(payment.get("cardNumber")));
r.setProgressStatus("1.접수완료");
r.setSettleStatus("정산대기");
r.setProgressStatus("f01");
r.setSettleStatus("h01");
r.setOrderNumber(genOrderNumber());
r.setProcessor(r.getCounselor());
r.setDetailProgress("신규신청");
@@ -766,9 +846,21 @@ class CareReceptionController {
LocalDate gd = r.getGiftSended() != null ? r.getGiftSended() : r.getGiftDate();
if (gd == null || !gd.equals(giftSended)) return false;
}
if (progressF != null && !progressF.equals(r.getProgressStatus())) return false;
if (settle != null && !settle.equals(r.getSettleStatus())) return false;
if (giftStatus != null && !giftStatus.equals(r.getGiftStatus())) return false;
if (progressF != null) {
String rp = ReceptionStatuses.normalizeProgress(r.getProgressStatus());
String fp = ReceptionStatuses.normalizeProgress(progressF);
if (!fp.equals(rp) && !progressF.equals(r.getProgressStatus())) return false;
}
if (settle != null) {
String rs = ReceptionStatuses.normalizeCenter(r.getSettleStatus());
String fs = ReceptionStatuses.normalizeCenter(settle);
if (!fs.equals(rs) && !settle.equals(r.getSettleStatus())) return false;
}
if (giftStatus != null) {
String rg = ReceptionStatuses.normalizeGift(r.getGiftStatus());
String fg = ReceptionStatuses.normalizeGift(giftStatus);
if (!fg.equals(rg) && !giftStatus.equals(r.getGiftStatus())) return false;
}
if (carrier != null && !carrier.equals(r.getCarrier()) && !carrier.equals(r.getIspName())) return false;
if (ispName != null) {
String hay = (nullToEmpty(r.getIspName()) + " " + nullToEmpty(r.getCarrier())).toLowerCase();
@@ -829,7 +921,7 @@ class CareReceptionController {
if (d.containsKey("customerName")) r.setCustomerName(str(d.get("customerName")));
if (d.containsKey("phone")) r.setPhone(str(d.get("phone")));
if (d.containsKey("region")) r.setRegion(str(d.get("region")));
if (d.containsKey("progressStatus")) r.setProgressStatus(str(d.get("progressStatus")));
if (d.containsKey("progressStatus")) r.setProgressStatus(ReceptionStatuses.normalizeProgress(str(d.get("progressStatus"))));
if (d.containsKey("orderNumber")) r.setOrderNumber(str(d.get("orderNumber")));
if (d.containsKey("ispId")) r.setIspId(toLong(d.get("ispId")));
if (d.containsKey("ispName")) r.setIspName(str(d.get("ispName")));
@@ -838,11 +930,13 @@ class CareReceptionController {
if (d.containsKey("detailProgress")) r.setDetailProgress(str(d.get("detailProgress")));
if (d.containsKey("paymentType")) r.setPaymentType(str(d.get("paymentType")));
if (d.containsKey("amount")) r.setAmount(toDecimal(d.get("amount")));
if (d.containsKey("settleStatus")) r.setSettleStatus(str(d.get("settleStatus")));
if (d.containsKey("settleStatus")) r.setSettleStatus(ReceptionStatuses.normalizeCenter(str(d.get("settleStatus"))));
if (d.containsKey("openDate")) r.setOpenDate(parseDate(str(d.get("openDate"))));
if (d.containsKey("giftDate")) r.setGiftDate(parseDate(str(d.get("giftDate"))));
if (d.containsKey("giftStatus")) r.setGiftStatus(str(d.get("giftStatus")));
if (d.containsKey("giftPlace")) r.setGiftPlace(str(d.get("giftPlace")));
if (d.containsKey("giftStatus")) {
String g = ReceptionStatuses.normalizeGift(str(d.get("giftStatus")));
r.setGiftStatus(blank(g) ? null : g);
} if (d.containsKey("giftPlace")) r.setGiftPlace(str(d.get("giftPlace")));
if (d.containsKey("agreementName")) r.setAgreementName(str(d.get("agreementName")));
if (d.containsKey("contractNumber")) r.setContractNumber(str(d.get("contractNumber")));
if (d.containsKey("identifyNumber")) r.setIdentifyNumber(str(d.get("identifyNumber")));
@@ -953,12 +1047,14 @@ class CareReceptionController {
data.put("progressStatuses", PROGRESS_STATUSES);
data.put("giftStatuses", GIFT_STATUSES);
data.put("settleStatuses", SETTLE_STATUSES);
Map<String, String> statusOptions = new LinkedHashMap<>();
for (String s : PROGRESS_STATUSES) statusOptions.put(s, s);
data.put("statusOptions", statusOptions);
Map<String, String> giftStatusOptions = new LinkedHashMap<>();
for (String s : GIFT_STATUSES) giftStatusOptions.put(s, s);
data.put("giftStatusOptions", giftStatusOptions);
data.put("progressStatusLabels", ReceptionStatuses.PROGRESS);
data.put("giftStatusLabels", ReceptionStatuses.GIFT);
data.put("settleStatusLabels", ReceptionStatuses.CENTER);
data.put("statusOptions", new LinkedHashMap<>(ReceptionStatuses.PROGRESS));
data.put("giftStatusOptions", new LinkedHashMap<>(ReceptionStatuses.GIFT));
data.put("centerStatusOptions", new LinkedHashMap<>(ReceptionStatuses.CENTER));
data.put("allowedProgressStatuses", new ArrayList<>(
ReceptionStatuses.orderStatusTransitions(ReceptionStatuses.normalizeProgress(r.getProgressStatus()))));
// flat alias for list edit form compatibility
data.putAll(reception);
return data;
@@ -1003,6 +1099,8 @@ class CareReceptionController {
m.put("addressDetail", r.getAddressDetail());
m.put("region", r.getRegion());
m.put("progressStatus", r.getProgressStatus());
m.put("progressStatusLabel", ReceptionStatuses.progressLabel(ReceptionStatuses.normalizeProgress(r.getProgressStatus())));
m.put("status", ReceptionStatuses.progressLabel(ReceptionStatuses.normalizeProgress(r.getProgressStatus())));
m.put("orderNumber", r.getOrderNumber());
m.put("ispId", r.getIspId());
m.put("ispName", r.getIspName());
@@ -1038,8 +1136,11 @@ class CareReceptionController {
m.put("sido", r.getRegion());
m.put("opened", r.getOpenDate() == null ? null : r.getOpenDate().toString());
m.put("canceled", r.getCancelDate() == null ? null : r.getCancelDate().toString());
m.put("status", r.getProgressStatus());
m.put("giftType", r.getGiftCategory());
m.put("giftStatusLabel", ReceptionStatuses.giftLabel(ReceptionStatuses.normalizeGift(r.getGiftStatus())));
m.put("settleStatusLabel", ReceptionStatuses.centerLabel(ReceptionStatuses.normalizeCenter(r.getSettleStatus())));
m.put("centerStatus", r.getSettleStatus());
m.put("centerStatusLabel", ReceptionStatuses.centerLabel(ReceptionStatuses.normalizeCenter(r.getSettleStatus())));
m.put("giftSended", r.getGiftSended() == null
? (r.getGiftDate() == null ? null : r.getGiftDate().toString())
: r.getGiftSended().toString());
@@ -1050,7 +1151,8 @@ class CareReceptionController {
if (r.getGiftCashAmount() != null) giftAmt = giftAmt.add(r.getGiftCashAmount());
if (r.getGiftGoodsPrice() != null) giftAmt = giftAmt.add(r.getGiftGoodsPrice());
if (giftAmt.signum() == 0 && r.getAmount() != null
&& r.getGiftStatus() != null && !"미지급".equals(r.getGiftStatus()) && !"없음".equals(r.getGiftCategory())) {
&& r.getGiftStatus() != null && !r.getGiftStatus().isBlank()
&& !"미지급".equals(r.getGiftStatus()) && !"없음".equals(r.getGiftCategory())) {
giftAmt = r.getAmount();
}
m.put("giftAmount", giftAmt.signum() == 0 ? null : giftAmt);