diff --git a/src/main/kotlin/com/android/trisolarisserver/controller/RazorpayQrPayments.kt b/src/main/kotlin/com/android/trisolarisserver/controller/RazorpayQrPayments.kt index a82df20..e22fec4 100644 --- a/src/main/kotlin/com/android/trisolarisserver/controller/RazorpayQrPayments.kt +++ b/src/main/kotlin/com/android/trisolarisserver/controller/RazorpayQrPayments.kt @@ -197,6 +197,39 @@ class RazorpayQrPayments( ) } + @PostMapping("/qr/{qrId}/close") + @Transactional + fun closeQrById( + @PathVariable propertyId: UUID, + @PathVariable bookingId: UUID, + @PathVariable qrId: String, + @AuthenticationPrincipal principal: MyPrincipal? + ): RazorpayQrGenerateResponse? { + requireRole(propertyAccess, propertyId, principal, Role.ADMIN, Role.MANAGER, Role.STAFF) + val booking = bookingRepo.findById(bookingId).orElseThrow { + ResponseStatusException(HttpStatus.NOT_FOUND, "Booking not found") + } + if (booking.property.id != propertyId) { + throw ResponseStatusException(HttpStatus.NOT_FOUND, "Booking not found for property") + } + val record = qrRequestRepo.findTopByQrIdOrderByCreatedAtDesc(qrId) + ?: throw ResponseStatusException(HttpStatus.NOT_FOUND, "QR not found") + val settings = settingsRepo.findByPropertyId(propertyId) + ?: throw ResponseStatusException(HttpStatus.BAD_REQUEST, "Razorpay settings not configured") + val response = postJson(resolveBaseUrl(settings.isTest) + "/payments/qr_codes/$qrId/close", settings, "{}") + if (!response.statusCode.is2xxSuccessful) { + throw ResponseStatusException(HttpStatus.BAD_GATEWAY, "Razorpay close request failed") + } + record.status = "closed" + qrRequestRepo.save(record) + return RazorpayQrGenerateResponse( + qrId = record.qrId, + amount = record.amount, + currency = record.currency, + imageUrl = record.imageUrl + ) + } + @GetMapping("/qr/{qrId}/events") fun qrEvents( @PathVariable propertyId: UUID,