78 Optional<User> lenderOpt = userRepository.findById(loan.getLender());
79 if (lenderOpt ==
null || lenderOpt.isEmpty()) {
80 throw new RuntimeException(
"Failed to save loan with id " + loan.getId() +
": Lender not found with id: " + loan.getLender());
84 Optional<User> borrowerOpt = userRepository.findById(loan.getBorrower());
85 if (borrowerOpt ==
null || borrowerOpt.isEmpty()) {
86 throw new RuntimeException(
"Failed to save loan with id " + loan.getId() +
": Borrower not found with id: " + loan.getBorrower());
88 User borrower = borrowerOpt.get();
90 if (borrower.hasPenalty()) {
91 throw new ResponseStatusException(
92 HttpStatus.BAD_REQUEST,
93 "Cannot borrow items while under penalty."
98 Optional<Item> itemOpt = itemRepository.findById(loan.getItem());
99 if (itemOpt ==
null || itemOpt.isEmpty()) {
100 throw new RuntimeException(
"Failed to save loan with id " + loan.getId() +
": Item not found with id: " + loan.getItem());
104 if (loan.getId() ==
null && loan.getLoanStatus() == Loan.Status.IN_USE) {
105 int activos = loanRepository.countByBorrowerAndLoanStatus(
106 loan.getBorrower(), Loan.Status.IN_USE);
108 throw new ResponseStatusException(
109 HttpStatus.BAD_REQUEST,
110 "Failed to save loan with id " + loan.getId() +
": You already have 3 items reserved. Return an item before booking another."
116 Item itemToModify = itemOpt.get();
117 itemToModify.setStatus(ItemStatus.BORROWED);
118 itemRepository.save(itemToModify);
121 return loanRepository.save(loan);
126 Optional<Loan> optionalLoan = loanRepository.findByBorrowerAndItemAndLoanStatus(
127 borrowerId, itemId, Loan.Status.IN_USE);
129 if (optionalLoan !=
null && optionalLoan.isPresent()) {
131 Optional<Item> optionalItem = itemRepository.findById(itemId);
132 if (optionalItem.isPresent()) {
133 Item item = optionalItem.get();
134 item.setStatus(ItemStatus.AVAILABLE);
135 itemRepository.save(item);
138 Loan loan = optionalLoan.get();
139 loan.setLoanStatus(Loan.Status.RETURNED);
140 loan.setRealReturnDate(
new Date());
141 Item item = itemRepository.findById(loan.getItem()).get();
142 item.setStatus(Item.ItemStatus.AVAILABLE);
143 itemRepository.save(item);
144 loanRepository.save(loan);
147 Optional<User> lenderOpt = userRepository.findById(loan.getLender());
148 if (lenderOpt.isPresent()) {
149 User lender= lenderOpt.get();
150 double currentRating = 0;
151 if(lender!=
null && lender.getAverageRating() !=
null) {
152 currentRating = lender.getAverageRating()+0.1;
153 if (currentRating > 5) {
158 lender.setAverageRating(currentRating);
159 userRepository.save(lender);
163 if(userRepository.findById(loan.getLender()).isPresent() && userRepository.findById(loan.getBorrower()).isPresent()) {
164 notificationService.enviarCorreo(userRepository.findById(loan.getLender()).get().getEmail(),
"Item returned",
165 "Your item has been returned!\nItem: " + itemRepository.findById(loan.getItem()).get().getName()
166 +
"\nBorrower: " + userRepository.findById(loan.getBorrower()).get().getName()
167 +
"\nReturn date: " + loan.getRealReturnDate().toString()
168 +
"\n\nThank you for using our service!");
170 notificationService.enviarCorreo(userRepository.findById(loan.getBorrower()).get().getEmail(),
"Item returned",
171 "You have returned the item!\nItem: " + itemRepository.findById(loan.getItem()).get().getName()
172 +
"\nLender: " + userRepository.findById(loan.getLender()).get().getName() +
"\nReturn date: "
173 + loan.getRealReturnDate().toString() +
"\n\nThank you for using our service!");
185 if (loan.getId() !=
null) {
186 if (loanRepository.existsById(loan.getId())) {
187 throw new RuntimeException(
"Loan already exists with id: " + loan.getId());
191 User lender = userRepository.findById(loan.getLender())
192 .orElseThrow(() ->
new RuntimeException(
193 "Failed to save loan: Lender not found with id: " + loan.getLender()));
195 User borrower = userRepository.findById(loan.getBorrower())
196 .orElseThrow(() ->
new RuntimeException(
197 "Failed to save loan: Borrower not found with id: " + loan.getBorrower()));
199 if (borrower.hasPenalty()) {
200 throw new RuntimeException(
"Cannot borrow items while under penalty.");
203 Item item = itemRepository.findById(loan.getItem())
204 .orElseThrow(() ->
new RuntimeException(
205 "Failed to save loan: Item not found with id: " + loan.getItem()));
207 if (loan.getId() ==
null && loan.getLoanStatus() == Loan.Status.IN_USE) {
208 int activos = loanRepository.countByBorrowerAndLoanStatus(loan.getBorrower(), Loan.Status.IN_USE);
210 throw new ResponseStatusException(HttpStatus.BAD_REQUEST,
211 "You already have 3 items reserved. Return an item before booking another.");
215 loan.setLoanStatus(Loan.Status.IN_USE);
216 item.setStatus(Item.ItemStatus.BORROWED);
218 notificationService.enviarCorreo(
221 "You have successfully made a loan!\nItem: " + item.getName() +
222 "\nLender: " + lender.getName() +
223 "\nReturn date: " + loan.getEstimatedReturnDate().toString() +
224 "\n\nThank you for using our service!"
227 notificationService.enviarCorreo(
230 "Your item has successfully been lended!\nItem: " + item.getName() +
231 "\nBorrower: " + borrower.getName() +
232 "\nReturn date: " + loan.getEstimatedReturnDate().toString() +
233 "\n\nThank you for using our service!"
236 return loanRepository.save(loan);