카드 매입 승인 경로 Spring Boot 3 전환 (ACX-E2E-1785394564819)
Some checks failed
Verify / source-contract (push) Has been cancelled
Some checks failed
Verify / source-contract (push) Has been cancelled
This commit is contained in:
parent
a098d222b2
commit
4146f9ec3b
1 changed files with 110 additions and 0 deletions
110
src/main/java/com/acquirex/service/ApprovalService.java
Normal file
110
src/main/java/com/acquirex/service/ApprovalService.java
Normal file
|
|
@ -0,0 +1,110 @@
|
||||||
|
package com.acquirex.service;
|
||||||
|
|
||||||
|
import com.acquirex.domain.AcquisitionCard;
|
||||||
|
import com.acquirex.domain.ApprovalRequest;
|
||||||
|
import com.acquirex.dto.ApprovalRequestDto;
|
||||||
|
import com.acquirex.dto.ApprovalResponseDto;
|
||||||
|
import com.acquirex.repository.AcquisitionCardRepository;
|
||||||
|
import com.acquirex.repository.ApprovalRequestRepository;
|
||||||
|
import org.springframework.stereotype.Service;
|
||||||
|
import org.springframework.transaction.annotation.Transactional;
|
||||||
|
|
||||||
|
import java.time.LocalDateTime;
|
||||||
|
import java.util.UUID;
|
||||||
|
|
||||||
|
@Service
|
||||||
|
public class ApprovalService {
|
||||||
|
|
||||||
|
private final ApprovalRequestRepository approvalRequestRepository;
|
||||||
|
private final AcquisitionCardRepository acquisitionCardRepository;
|
||||||
|
|
||||||
|
public ApprovalService(ApprovalRequestRepository approvalRequestRepository,
|
||||||
|
AcquisitionCardRepository acquisitionCardRepository) {
|
||||||
|
this.approvalRequestRepository = approvalRequestRepository;
|
||||||
|
this.acquisitionCardRepository = acquisitionCardRepository;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Transactional
|
||||||
|
public ApprovalResponseDto requestApproval(ApprovalRequestDto dto) {
|
||||||
|
String transactionId = generateTransactionId();
|
||||||
|
|
||||||
|
AcquisitionCard card = acquisitionCardRepository
|
||||||
|
.findByCardNumberAndCardCompanyCode(dto.getCardNumber(), dto.getCardCompanyCode())
|
||||||
|
.orElseGet(() -> createNewCard(dto));
|
||||||
|
|
||||||
|
ApprovalRequest request = new ApprovalRequest();
|
||||||
|
request.setCardId(card.getId());
|
||||||
|
request.setTransactionId(transactionId);
|
||||||
|
request.setAmount(dto.getAmount());
|
||||||
|
request.setVat(dto.getVat());
|
||||||
|
request.setApprovalStatus(ApprovalRequest.ApprovalStatus.REQUESTED);
|
||||||
|
|
||||||
|
ApprovalRequest saved = approvalRequestRepository.save(request);
|
||||||
|
return buildApprovalResponse(saved, "매입 승인 요청이 완료되었습니다");
|
||||||
|
}
|
||||||
|
|
||||||
|
@Transactional
|
||||||
|
public ApprovalResponseDto approveRequest(Long requestId) {
|
||||||
|
ApprovalRequest request = approvalRequestRepository.findById(requestId)
|
||||||
|
.orElseThrow(() -> new IllegalArgumentException("승인 요청을 찾을 수 없습니다: " + requestId));
|
||||||
|
|
||||||
|
if (request.getApprovalStatus() != ApprovalRequest.ApprovalStatus.REQUESTED) {
|
||||||
|
throw new IllegalStateException("이미 처리된 요청입니다");
|
||||||
|
}
|
||||||
|
|
||||||
|
request.setApprovalNumber(generateApprovalNumber());
|
||||||
|
request.setApprovalStatus(ApprovalRequest.ApprovalStatus.APPROVED);
|
||||||
|
request.setApprovedAt(LocalDateTime.now());
|
||||||
|
|
||||||
|
ApprovalRequest saved = approvalRequestRepository.save(request);
|
||||||
|
return buildApprovalResponse(saved, "매입 승인이 완료되었습니다");
|
||||||
|
}
|
||||||
|
|
||||||
|
@Transactional
|
||||||
|
public ApprovalResponseDto rejectRequest(Long requestId, String reason) {
|
||||||
|
ApprovalRequest request = approvalRequestRepository.findById(requestId)
|
||||||
|
.orElseThrow(() -> new IllegalArgumentException("승인 요청을 찾을 수 없습니다: " + requestId));
|
||||||
|
|
||||||
|
if (request.getApprovalStatus() != ApprovalRequest.ApprovalStatus.REQUESTED) {
|
||||||
|
throw new IllegalStateException("이미 처리된 요청입니다");
|
||||||
|
}
|
||||||
|
|
||||||
|
request.setApprovalStatus(ApprovalRequest.ApprovalStatus.REJECTED);
|
||||||
|
request.setRejectionReason(reason);
|
||||||
|
|
||||||
|
ApprovalRequest saved = approvalRequestRepository.save(request);
|
||||||
|
return buildApprovalResponse(saved, "매입 승인이 거절되었습니다");
|
||||||
|
}
|
||||||
|
|
||||||
|
@Transactional(readOnly = true)
|
||||||
|
public ApprovalResponseDto getApprovalStatus(Long requestId) {
|
||||||
|
ApprovalRequest request = approvalRequestRepository.findById(requestId)
|
||||||
|
.orElseThrow(() -> new IllegalArgumentException("승인 요청을 찾을 수 없습니다: " + requestId));
|
||||||
|
return buildApprovalResponse(request, "조회가 완료되었습니다");
|
||||||
|
}
|
||||||
|
|
||||||
|
private AcquisitionCard createNewCard(ApprovalRequestDto dto) {
|
||||||
|
AcquisitionCard card = new AcquisitionCard();
|
||||||
|
card.setCardNumber(dto.getCardNumber());
|
||||||
|
card.setCardCompanyCode(dto.getCardCompanyCode());
|
||||||
|
card.setMerchantNumber(dto.getMerchantNumber());
|
||||||
|
card.setStatus(AcquisitionCard.CardStatus.PENDING);
|
||||||
|
return acquisitionCardRepository.save(card);
|
||||||
|
}
|
||||||
|
|
||||||
|
private String generateTransactionId() {
|
||||||
|
return "TX" + System.currentTimeMillis() + UUID.randomUUID().toString().substring(0, 8).toUpperCase();
|
||||||
|
}
|
||||||
|
|
||||||
|
private String generateApprovalNumber() {
|
||||||
|
return "AP" + System.currentTimeMillis();
|
||||||
|
}
|
||||||
|
|
||||||
|
private ApprovalResponseDto buildApprovalResponse(ApprovalRequest request, String message) {
|
||||||
|
return new ApprovalResponseDto(
|
||||||
|
request.getId(), request.getTransactionId(), request.getApprovalNumber(),
|
||||||
|
request.getApprovalStatus().name(), request.getAmount(), request.getVat(),
|
||||||
|
request.getApprovedAt(), message
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
Loading…
Add table
Add a link
Reference in a new issue