Skip to content

Commit

Permalink
[sally4405/#19] Feat: 숙소 예약 요금 상세 조회 API 개발
Browse files Browse the repository at this point in the history
- 주 단위, 월 단위, 연 단위 할인 정책 enum 클래스를 만들어 예약한 날짜를 계산하여 할인을 적용할 수 있는 로직 추가
  • Loading branch information
donggi-lee-bit committed Jun 2, 2022
1 parent 7333f76 commit 9b018ce
Show file tree
Hide file tree
Showing 3 changed files with 59 additions and 8 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -42,7 +42,7 @@ public AccommodationDetailResponse getAccommodationDetail(@PathVariable Long id)
@GetMapping("/{id}/detail-price")
public AccommodationDetailPriceResponse getDetailPrice(@PathVariable Long id,
AccommodationDetailPriceRequest accommodationDetailPriceRequest) {
return mockAccommodationService.findDetailPrice(id, accommodationDetailPriceRequest);
return accommodationService.findDetailPrice(id, accommodationDetailPriceRequest);
}

}
Original file line number Diff line number Diff line change
@@ -1,5 +1,12 @@
package louie.dong.airbnb.accommodation;

import static louie.dong.airbnb.accommodation.DiscountPolicy.MONTHLY;
import static louie.dong.airbnb.accommodation.DiscountPolicy.NONE;
import static louie.dong.airbnb.accommodation.DiscountPolicy.WEEKLY;
import static louie.dong.airbnb.accommodation.DiscountPolicy.YEARLY;

import java.time.LocalDate;
import java.time.temporal.ChronoUnit;
import java.util.List;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
Expand All @@ -26,22 +33,54 @@ public AccommodationPriceResponse findPrices(String country) {
}

public AccommodationDetailResponse findById(Long id) {
Accommodation accommodation = accommodationRepository.findById(id)
.orElseThrow(() -> new IllegalArgumentException("유효하지 않은 id입니다."));
Accommodation accommodation = getAccommodation(id);
boolean wish = wishRepository.existsByAccommodationId(id);
return new AccommodationDetailResponse(accommodation, wish);
}

public AccommodationDetailPriceResponse findDetailPrice(Long id,
AccommodationDetailPriceRequest accommodationDetailPriceRequest) {
Accommodation accommodation = getAccommodation(id);
LocalDate checkIn = accommodationDetailPriceRequest.getCheckIn();
LocalDate checkOut = accommodationDetailPriceRequest.getCheckOut();

int date = (int) checkIn.until(checkOut, ChronoUnit.DAYS);
int totalPrice = accommodation.getPrice() * date;
double discountRate = getDiscountRate(date) * 0.01;
int discountPrice = (int) (totalPrice * discountRate);
int finalPrice = totalPrice - discountPrice + accommodation.getCleaningFee()
+ accommodation.getServiceFee() + accommodation.getAccommodationFee();

return new AccommodationDetailPriceResponse(accommodation.getPrice(), date, totalPrice,
WEEKLY.getDiscountRate(), discountPrice, accommodation.getCleaningFee(),
accommodation.getServiceFee(), accommodation.getAccommodationFee(), finalPrice);
}

private Accommodation getAccommodation(Long id) {
return accommodationRepository.findById(id)
.orElseThrow(() -> new IllegalArgumentException("유효하지 않은 id입니다."));
}

private int getDiscountRate(int date) {
if (date < 7) {
return NONE.getDiscountRate();
}

if (date < 30) {
return WEEKLY.getDiscountRate();
}

if (date < 365) {
return MONTHLY.getDiscountRate();
}
return YEARLY.getDiscountRate();
}

private int calculateAverage(List<Integer> prices) {
int sum = 0;
for (Integer price : prices) {
sum += price;
}
return sum / prices.size();
}

public AccommodationDetailPriceResponse findDetailPrice(Long id,
AccommodationDetailPriceRequest accommodationDetailPriceRequest) {
return null;
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
package louie.dong.airbnb.accommodation;

import lombok.Getter;
import lombok.RequiredArgsConstructor;

@RequiredArgsConstructor
@Getter
public enum DiscountPolicy {
WEEKLY(4), MONTHLY(7), YEARLY(10), NONE(0);

private final int discountRate;
}

0 comments on commit 9b018ce

Please sign in to comment.