fix(original-series-calculate): 소지 유저별 정산 엑셀 시트 생성을 정리한다

This commit is contained in:
2026-04-21 19:16:34 +09:00
parent 72f49f2471
commit 49b1aa8f0c
2 changed files with 33 additions and 16 deletions

View File

@@ -22,14 +22,14 @@ class AdminOriginalSeriesCalculateService(
fun getSettlementDetails( fun getSettlementDetails(
startDateStr: String, startDateStr: String,
endDateStr: String, endDateStr: String,
memberId: Long, creatorId: Long,
offset: Long, offset: Long,
limit: Long limit: Long
): GetAdminOriginalSeriesSettlementDetailListResponse { ): GetAdminOriginalSeriesSettlementDetailListResponse {
val (startDate, endDate) = toDateRange(startDateStr, endDateStr) val (startDate, endDate) = toDateRange(startDateStr, endDateStr)
val totalCount = repository.getSettlementDetailTotalCount(startDate, endDate, memberId) val totalCount = repository.getSettlementDetailTotalCount(startDate, endDate, creatorId)
val items = repository val items = repository
.getSettlementDetails(startDate, endDate, memberId, offset, limit) .getSettlementDetails(startDate, endDate, creatorId, offset, limit)
.map { it.toResponse() } .map { it.toResponse() }
return GetAdminOriginalSeriesSettlementDetailListResponse(totalCount, items) return GetAdminOriginalSeriesSettlementDetailListResponse(totalCount, items)
@@ -43,18 +43,16 @@ class AdminOriginalSeriesCalculateService(
return StreamingResponseBody { outputStream -> return StreamingResponseBody { outputStream ->
val workbook = SXSSFWorkbook(100) val workbook = SXSSFWorkbook(100)
try { try {
if (owners.isEmpty()) { if (owners.isNotEmpty()) {
writeHeaders(workbook.createSheet("오리지널 시리즈 정산"))
} else {
owners.forEach { owner -> owners.forEach { owner ->
val sheet = workbook.createSheet(toSheetName(owner)) val sheet = workbook.createSheet(toSheetName(owner))
writeHeaders(sheet) writeHeaders(sheet)
val totalCount = repository.getSettlementDetailTotalCount(startDate, endDate, owner.memberId) val totalCount = repository.getSettlementDetailTotalCount(startDate, endDate, owner.creatorId)
val items = if (totalCount == 0) { val items = if (totalCount == 0) {
emptyList() emptyList()
} else { } else {
repository.getSettlementDetails(startDate, endDate, owner.memberId, 0L, totalCount.toLong()) repository.getSettlementDetails(startDate, endDate, owner.creatorId, 0L, totalCount.toLong())
.map { it.toResponse() } .map { it.toResponse() }
} }
@@ -92,7 +90,7 @@ class AdminOriginalSeriesCalculateService(
} }
private fun toSheetName(owner: GetAdminOriginalSeriesOwnerResponse): String { private fun toSheetName(owner: GetAdminOriginalSeriesOwnerResponse): String {
return WorkbookUtil.createSafeSheetName("${owner.memberId}_${owner.nickname}") return WorkbookUtil.createSafeSheetName(owner.nickname)
} }
private fun toDateRange(startDateStr: String, endDateStr: String): Pair<LocalDateTime, LocalDateTime> { private fun toDateRange(startDateStr: String, endDateStr: String): Pair<LocalDateTime, LocalDateTime> {

View File

@@ -25,13 +25,13 @@ class AdminOriginalSeriesCalculateServiceTest {
@Test @Test
@DisplayName("오리지널 시리즈 소지 유저 목록 조회는 리포지토리 결과를 반환한다") @DisplayName("오리지널 시리즈 소지 유저 목록 조회는 리포지토리 결과를 반환한다")
fun shouldReturnOriginalSeriesOwners() { fun shouldReturnOriginalSeriesOwners() {
val owners = listOf(GetAdminOriginalSeriesOwnerResponse(memberId = 1L, nickname = "owner-a")) val owners = listOf(GetAdminOriginalSeriesOwnerResponse(creatorId = 1L, nickname = "owner-a"))
Mockito.`when`(repository.getOriginalSeriesOwners()).thenReturn(owners) Mockito.`when`(repository.getOriginalSeriesOwners()).thenReturn(owners)
val result = service.getOriginalSeriesOwners() val result = service.getOriginalSeriesOwners()
assertEquals(1, result.size) assertEquals(1, result.size)
assertEquals(1L, result[0].memberId) assertEquals(1L, result[0].creatorId)
Mockito.verify(repository).getOriginalSeriesOwners() Mockito.verify(repository).getOriginalSeriesOwners()
} }
@@ -67,7 +67,7 @@ class AdminOriginalSeriesCalculateServiceTest {
val result = service.getSettlementDetails( val result = service.getSettlementDetails(
startDateStr = "2026-04-01", startDateStr = "2026-04-01",
endDateStr = "2026-04-30", endDateStr = "2026-04-30",
memberId = 9L, creatorId = 9L,
offset = 0L, offset = 0L,
limit = 20L limit = 20L
) )
@@ -96,8 +96,8 @@ class AdminOriginalSeriesCalculateServiceTest {
@DisplayName("정산 엑셀 다운로드는 소지 유저별 시트를 생성한다") @DisplayName("정산 엑셀 다운로드는 소지 유저별 시트를 생성한다")
fun shouldCreateOneSheetPerOwnerForExcel() { fun shouldCreateOneSheetPerOwnerForExcel() {
val owners = listOf( val owners = listOf(
GetAdminOriginalSeriesOwnerResponse(memberId = 1L, nickname = "owner-a"), GetAdminOriginalSeriesOwnerResponse(creatorId = 1L, nickname = "owner-a"),
GetAdminOriginalSeriesOwnerResponse(memberId = 2L, nickname = "owner-b") GetAdminOriginalSeriesOwnerResponse(creatorId = 2L, nickname = "owner-b")
) )
Mockito.`when`(repository.getOriginalSeriesOwners()).thenReturn(owners) Mockito.`when`(repository.getOriginalSeriesOwners()).thenReturn(owners)
Mockito.`when`( Mockito.`when`(
@@ -147,8 +147,8 @@ class AdminOriginalSeriesCalculateServiceTest {
XSSFWorkbook(ByteArrayInputStream(outputStream.toByteArray())).use { workbook -> XSSFWorkbook(ByteArrayInputStream(outputStream.toByteArray())).use { workbook ->
assertEquals(2, workbook.numberOfSheets) assertEquals(2, workbook.numberOfSheets)
assertEquals("1_owner-a", workbook.getSheetAt(0).sheetName) assertEquals("owner-a", workbook.getSheetAt(0).sheetName)
assertEquals("2_owner-b", workbook.getSheetAt(1).sheetName) assertEquals("owner-b", workbook.getSheetAt(1).sheetName)
assertEquals("시리즈 제목", workbook.getSheetAt(0).getRow(0).getCell(0).stringCellValue) assertEquals("시리즈 제목", workbook.getSheetAt(0).getRow(0).getCell(0).stringCellValue)
assertEquals("오리지널 시리즈", workbook.getSheetAt(0).getRow(1).getCell(0).stringCellValue) assertEquals("오리지널 시리즈", workbook.getSheetAt(0).getRow(1).getCell(0).stringCellValue)
assertEquals("시리즈 제목", workbook.getSheetAt(1).getRow(0).getCell(0).stringCellValue) assertEquals("시리즈 제목", workbook.getSheetAt(1).getRow(0).getCell(0).stringCellValue)
@@ -164,4 +164,23 @@ class AdminOriginalSeriesCalculateServiceTest {
1L 1L
) )
} }
@Test
@DisplayName("소지 유저가 없으면 엑셀에 시트를 생성하지 않는다")
fun shouldCreateWorkbookWithoutSheetsWhenNoOwners() {
Mockito.`when`(repository.getOriginalSeriesOwners()).thenReturn(emptyList())
val response = service.downloadSettlementDetailsExcel(
startDateStr = "2026-04-01",
endDateStr = "2026-04-30"
)
val outputStream = ByteArrayOutputStream()
response.writeTo(outputStream)
assertTrue(outputStream.toByteArray().isNotEmpty())
XSSFWorkbook(ByteArrayInputStream(outputStream.toByteArray())).use { workbook ->
assertEquals(0, workbook.numberOfSheets)
}
}
} }