From 635b19e17a2758b76da915d1cc179677321f5d6e Mon Sep 17 00:00:00 2001 From: francescods Date: Wed, 30 Apr 2025 11:16:46 +0200 Subject: [PATCH] PATCH annulla prenotazione --- src/main/kotlin/eu/maiora/db/Mapping.kt | 68 +++++++++++++++++- .../PrenotazioniPastiDettaglioRepository.kt | 2 + ...renotazioniPastiDettaglioRepositoryImpl.kt | 21 +++++- .../eu/maiora/model/ViewPrenotazioniPasti.kt | 13 ++++ .../model/ViewPrenotazioniPastiRepository.kt | 5 ++ .../ViewPrenotazioniPastiRepositoryImpl.kt | 15 ++++ src/main/kotlin/eu/maiora/plugins/Routing.kt | 1 + .../eu/maiora/routes/AnnullaPrenotazioni.kt | 71 +++++++++++++++++++ 8 files changed, 194 insertions(+), 2 deletions(-) create mode 100644 src/main/kotlin/eu/maiora/model/ViewPrenotazioniPasti.kt create mode 100644 src/main/kotlin/eu/maiora/model/ViewPrenotazioniPastiRepository.kt create mode 100644 src/main/kotlin/eu/maiora/model/ViewPrenotazioniPastiRepositoryImpl.kt create mode 100644 src/main/kotlin/eu/maiora/routes/AnnullaPrenotazioni.kt diff --git a/src/main/kotlin/eu/maiora/db/Mapping.kt b/src/main/kotlin/eu/maiora/db/Mapping.kt index 20e4ec5..e9c8889 100644 --- a/src/main/kotlin/eu/maiora/db/Mapping.kt +++ b/src/main/kotlin/eu/maiora/db/Mapping.kt @@ -2,6 +2,7 @@ package eu.maiora.db import eu.maiora.model.* import kotlinx.coroutines.Dispatchers +import kotlinx.datetime.toKotlinLocalDateTime import org.jetbrains.exposed.dao.IntEntity import org.jetbrains.exposed.dao.IntEntityClass import org.jetbrains.exposed.dao.LongEntity @@ -124,7 +125,7 @@ object PrenotazioniPastiTable : IdTable("prenotazioni_pasti"){ val idSlotPuntoCassa = long("id_slot_punto_cassa") val idResidenza = long("id_residenza").nullable() val idVassoio = long("id_vassoio") - val importoPagato = RicaricheTable.double("importo_pagato") + val importoPagato = double("importo_pagato") } object PrenotazioniPastiDettaglioTable : IdTable("prenotazioni_pasti_dettaglio"){ @@ -135,6 +136,14 @@ object PrenotazioniPastiDettaglioTable : IdTable("prenotazioni_pasti_detta } +object ViewPrenotazioniPastiTable : IdTable("view_prenotazioni_pasti"){ + override val id = long("id").entityId() + val idPrenotazione = long("id_prenotazione") + val idStato = long("id_stato") + val stato = varchar("stato", 255) + val dataLimiteCancellazione = datetime("data_limite_cancellazione") +} + class AccountsDAO(id: EntityID) :IntEntity(id) { companion object : IntEntityClass(AccountsTable) @@ -240,6 +249,33 @@ class ResidenzeDao(id: EntityID) :LongEntity(id){ val nome by ResidenzeTable.nome } +class PrenotazioniPastiDao(id: EntityID) :LongEntity(id){ + companion object : LongEntityClass(PrenotazioniPastiTable) + + val idTessera by PrenotazioniPastiTable.idTessera + val idSlotPuntoCassa by PrenotazioniPastiTable.idSlotPuntoCassa + val idResidenza by PrenotazioniPastiTable.idResidenza + val idVassoio by PrenotazioniPastiTable.idVassoio + val importoPagato by PrenotazioniPastiTable.importoPagato +} + +class PrenotazioniPastiDettaglioDao(id: EntityID) :LongEntity(id){ + companion object : LongEntityClass(PrenotazioniPastiDettaglioTable) + + val idPrenotazione by PrenotazioniPastiDettaglioTable.idPrenotazione + val idProdotto by PrenotazioniPastiDettaglioTable.idProdotto + val idStato by PrenotazioniPastiDettaglioTable.idStato +} + +class ViewPrenotazioniPastiDao(id: EntityID) :LongEntity(id){ + companion object : LongEntityClass(ViewPrenotazioniPastiTable) + + val idPrenotazione by ViewPrenotazioniPastiTable.idPrenotazione + val idStato by ViewPrenotazioniPastiTable.idStato + val stato by ViewPrenotazioniPastiTable.stato + val dataLimiteCancellazione by ViewPrenotazioniPastiTable.dataLimiteCancellazione +} + fun accountsDaoToModel(dao: AccountsDAO) = Accounts( dao.id.value, dao.username, @@ -361,6 +397,36 @@ fun residenzeDaoToModel(dao: ResidenzeDao) :Residenze{ ) } +fun prenotazioniPastiDaoToModel(dao: PrenotazioniPastiDao) : PrenotazioniPasti{ + return PrenotazioniPasti( + dao.id.value, + dao.idTessera, + dao.idSlotPuntoCassa, + dao.idResidenza, + dao.idVassoio, + dao.importoPagato + ) +} + +fun prenotazioniPastiDettaglioDaoToModel(dao: PrenotazioniPastiDettaglioDao) : PrenotazioniPastiDettaglio{ + return PrenotazioniPastiDettaglio( + dao.id.value, + dao.idPrenotazione, + dao.idProdotto, + dao.idStato + ) +} + +fun viewPrenotazioniPastiDaoToModel(dao: ViewPrenotazioniPastiDao) : ViewPrenotazioniPasti{ + return ViewPrenotazioniPasti( + dao.id.value, + dao.idPrenotazione, + dao.idStato, + dao.stato, + dao.dataLimiteCancellazione.toKotlinLocalDateTime() + ) +} + suspend fun suspendTransaction(block: Transaction.() -> T): T = newSuspendedTransaction(Dispatchers.IO, statement = block) \ No newline at end of file diff --git a/src/main/kotlin/eu/maiora/model/PrenotazioniPastiDettaglioRepository.kt b/src/main/kotlin/eu/maiora/model/PrenotazioniPastiDettaglioRepository.kt index 88b22aa..38573e4 100644 --- a/src/main/kotlin/eu/maiora/model/PrenotazioniPastiDettaglioRepository.kt +++ b/src/main/kotlin/eu/maiora/model/PrenotazioniPastiDettaglioRepository.kt @@ -2,4 +2,6 @@ package eu.maiora.model interface PrenotazioniPastiDettaglioRepository { suspend fun insert(prenotazionePastoDettaglio : PrenotazioniPastiDettaglio): PrenotazioniPastiDettaglio + suspend fun update(prenotazionePastoDettaglio: PrenotazioniPastiDettaglio): PrenotazioniPastiDettaglio + suspend fun listaDettagliByIdPrenotazione(idPrenotazione : Long): List } \ No newline at end of file diff --git a/src/main/kotlin/eu/maiora/model/PrenotazioniPastiDettaglioRepositoryImpl.kt b/src/main/kotlin/eu/maiora/model/PrenotazioniPastiDettaglioRepositoryImpl.kt index 7eef060..fd285b2 100644 --- a/src/main/kotlin/eu/maiora/model/PrenotazioniPastiDettaglioRepositoryImpl.kt +++ b/src/main/kotlin/eu/maiora/model/PrenotazioniPastiDettaglioRepositoryImpl.kt @@ -2,9 +2,10 @@ package eu.maiora.model import eu.maiora.db.* import org.jetbrains.exposed.sql.insertAndGetId +import org.jetbrains.exposed.sql.update class PrenotazioniPastiDettaglioRepositoryImpl : PrenotazioniPastiDettaglioRepository { - override suspend fun insert(prenotazionePastoDettaglio : PrenotazioniPastiDettaglio): PrenotazioniPastiDettaglio = suspendTransaction { + override suspend fun insert(prenotazionePastoDettaglio : PrenotazioniPastiDettaglio): PrenotazioniPastiDettaglio = suspendTransaction { // Inserisci un nuovo dettaglio di una prenotazione pasto // ID non definito: viene gestito dalla sequence val idPrenPastiDettInserted = PrenotazioniPastiDettaglioTable.insertAndGetId { @@ -20,4 +21,22 @@ class PrenotazioniPastiDettaglioRepositoryImpl : PrenotazioniPastiDettaglioRepos prenotazionePastoDettaglio.idStato ) } + + override suspend fun update (prenotazionePastoDettaglio : PrenotazioniPastiDettaglio): PrenotazioniPastiDettaglio = suspendTransaction { + PrenotazioniPastiDettaglioTable.update({PrenotazioniPastiDettaglioTable.id eq prenotazionePastoDettaglio.id}){ + it[idPrenotazione] = prenotazionePastoDettaglio.idPrenotazione + it[idProdotto] = prenotazionePastoDettaglio.idProdotto + it[idStato] = prenotazionePastoDettaglio.idStato + } + + prenotazionePastoDettaglio + } + + override suspend fun listaDettagliByIdPrenotazione(idPrenotazione : Long): List = suspendTransaction { + // Cerca la lista di dettagli della prenotazione (ovvero i prodotti) + PrenotazioniPastiDettaglioDao.find { PrenotazioniPastiDettaglioTable.idPrenotazione eq idPrenotazione } + .toList() // Restituisce la lista dei prodotti + .map { prenotazioniPastiDettaglioDaoToModel(it) } // Converte il DAO in un oggetto PrenotazioniPastiDettaglio + + } } \ No newline at end of file diff --git a/src/main/kotlin/eu/maiora/model/ViewPrenotazioniPasti.kt b/src/main/kotlin/eu/maiora/model/ViewPrenotazioniPasti.kt new file mode 100644 index 0000000..8ff0756 --- /dev/null +++ b/src/main/kotlin/eu/maiora/model/ViewPrenotazioniPasti.kt @@ -0,0 +1,13 @@ +package eu.maiora.model + +import kotlinx.datetime.LocalDateTime +import kotlinx.serialization.Serializable + +@Serializable +data class ViewPrenotazioniPasti( + val id: Long, + val idPrenotazione: Long, + val idStato: Long, + val stato: String, + val dataLimiteCancellazione: LocalDateTime +) \ No newline at end of file diff --git a/src/main/kotlin/eu/maiora/model/ViewPrenotazioniPastiRepository.kt b/src/main/kotlin/eu/maiora/model/ViewPrenotazioniPastiRepository.kt new file mode 100644 index 0000000..2745b7a --- /dev/null +++ b/src/main/kotlin/eu/maiora/model/ViewPrenotazioniPastiRepository.kt @@ -0,0 +1,5 @@ +package eu.maiora.model + +interface ViewPrenotazioniPastiRepository { + suspend fun prenotazioniPastiById(id : Long): ViewPrenotazioniPasti +} \ No newline at end of file diff --git a/src/main/kotlin/eu/maiora/model/ViewPrenotazioniPastiRepositoryImpl.kt b/src/main/kotlin/eu/maiora/model/ViewPrenotazioniPastiRepositoryImpl.kt new file mode 100644 index 0000000..617d58d --- /dev/null +++ b/src/main/kotlin/eu/maiora/model/ViewPrenotazioniPastiRepositoryImpl.kt @@ -0,0 +1,15 @@ +package eu.maiora.model + +import eu.maiora.db.* +import org.jetbrains.exposed.sql.SortOrder +import org.jetbrains.exposed.sql.insertAndGetId + +class ViewPrenotazioniPastiRepositoryImpl : ViewPrenotazioniPastiRepository { + + override suspend fun prenotazioniPastiById(id : Long): ViewPrenotazioniPasti = suspendTransaction { + // Cerca la prenotazione + ViewPrenotazioniPastiDao.find { ViewPrenotazioniPastiTable.idPrenotazione eq id } + .first() //prendo solo il primo record, dato che ci sono tanti record quanti prodotti prenotati + .let { viewPrenotazioniPastiDaoToModel(it) } // Converte il DAO in un oggetto ViewPrenotazioniPasti + } +} \ No newline at end of file diff --git a/src/main/kotlin/eu/maiora/plugins/Routing.kt b/src/main/kotlin/eu/maiora/plugins/Routing.kt index 55b8613..9590816 100644 --- a/src/main/kotlin/eu/maiora/plugins/Routing.kt +++ b/src/main/kotlin/eu/maiora/plugins/Routing.kt @@ -23,5 +23,6 @@ fun Application.configureRouting() { prodottiPrenotabili(ProdottiPrenotabiliRepositoryImpl()) residenze(ResidenzeRepositoryImpl()) prenotazioni(PrenotazioniPastiRepositoryImpl(), SlotOrariRepositoryImpl(), PrenotazioniPastiDettaglioRepositoryImpl()) + annullaPrenotazioni(ViewPrenotazioniPastiRepositoryImpl(), PrenotazioniPastiDettaglioRepositoryImpl()) } } diff --git a/src/main/kotlin/eu/maiora/routes/AnnullaPrenotazioni.kt b/src/main/kotlin/eu/maiora/routes/AnnullaPrenotazioni.kt new file mode 100644 index 0000000..dab7187 --- /dev/null +++ b/src/main/kotlin/eu/maiora/routes/AnnullaPrenotazioni.kt @@ -0,0 +1,71 @@ +package eu.maiora.routes + +import eu.maiora.model.* +import io.ktor.http.* +import io.ktor.server.application.* +import io.ktor.server.auth.* +import io.ktor.server.response.* +import io.ktor.server.routing.* +import kotlinx.datetime.toJavaLocalDateTime +import java.time.LocalDateTime + + +fun Route.annullaPrenotazioni( + viewPrenotazioniPastiRepository: ViewPrenotazioniPastiRepositoryImpl, + prenotazioniPastiDettaglioRepository: PrenotazioniPastiDettaglioRepositoryImpl +) { + route("/api/annullaPrenotazioni") { + authenticate("auth-jwt") { + patch("{idPrenotazione}") { + //ottieni l'id della prenotazione dal percorso + val idPrenotazione = call.parameters["idPrenotazione"] + + if (idPrenotazione == null) { + call.respondText("ID prenotazione non valido", status = HttpStatusCode.BadRequest) + return@patch + } + + val prenotazione = viewPrenotazioniPastiRepository.prenotazioniPastiById(idPrenotazione.toLong()) + val statoPrenotazione = prenotazione.stato + + //prenotazione annullabile se lo stato non è SERVITA 2L + if (prenotazione.idStato == 2L) { + call.respond( + HttpStatusCode.BadRequest, + "Prenotazione non annullata. Stato corrente della prenotazione: $statoPrenotazione" + ) + return@patch + } + + //prenotazione annullabile se la data limite per la cancellazione non è stato superato + if (LocalDateTime.now().isAfter(prenotazione.dataLimiteCancellazione.toJavaLocalDateTime())) { + call.respond( + HttpStatusCode.BadRequest, + "Prenotazione non annullata: data limite cancellazione superata" + ) + return@patch + } + + + val listaProdottiPrenotati = + prenotazioniPastiDettaglioRepository.listaDettagliByIdPrenotazione(idPrenotazione.toLong()) + + //aggiorna lo stato di ogni prodotto per annullare la prenotazione + listaProdottiPrenotati.forEach { el -> + val prodottoDaAggiornare = PrenotazioniPastiDettaglio( + el.id, + el.idPrenotazione, + el.idProdotto, + 3L //ANNULLATA + ) + prenotazioniPastiDettaglioRepository.update(prodottoDaAggiornare) + } + + call.respond(HttpStatusCode.OK, "Prenotazione $idPrenotazione annullata") + + + } + } + + } +} \ No newline at end of file -- 2.27.0