From fbcef1af3e9ddb081e62d20a8be05cde2e22e94f Mon Sep 17 00:00:00 2001 From: francescods Date: Tue, 29 Apr 2025 14:43:16 +0200 Subject: [PATCH 1/3] /POST prenotazioni inserimento nuova prenotazione, con i relativi prodotti --- src/main/kotlin/eu/maiora/db/Mapping.kt | 21 +++++ .../kotlin/eu/maiora/model/Prenotazioni.kt | 21 +++++ .../eu/maiora/model/PrenotazioniPasti.kt | 13 ++++ .../model/PrenotazioniPastiDettaglio.kt | 11 +++ .../PrenotazioniPastiDettaglioRepository.kt | 5 ++ ...renotazioniPastiDettaglioRepositoryImpl.kt | 23 ++++++ .../model/PrenotazioniPastiRepository.kt | 5 ++ .../model/PrenotazioniPastiRepositoryImpl.kt | 27 +++++++ .../eu/maiora/model/ProdottiPrenotabili.kt | 26 +++---- src/main/kotlin/eu/maiora/model/SlotOrari.kt | 1 + .../eu/maiora/model/SlotOrariRepository.kt | 4 + .../maiora/model/SlotOrariRepositoryImpl.kt | 13 ++++ src/main/kotlin/eu/maiora/plugins/Routing.kt | 1 + .../kotlin/eu/maiora/routes/Prenotazioni.kt | 78 +++++++++++++++++++ 14 files changed, 236 insertions(+), 13 deletions(-) create mode 100644 src/main/kotlin/eu/maiora/model/Prenotazioni.kt create mode 100644 src/main/kotlin/eu/maiora/model/PrenotazioniPasti.kt create mode 100644 src/main/kotlin/eu/maiora/model/PrenotazioniPastiDettaglio.kt create mode 100644 src/main/kotlin/eu/maiora/model/PrenotazioniPastiDettaglioRepository.kt create mode 100644 src/main/kotlin/eu/maiora/model/PrenotazioniPastiDettaglioRepositoryImpl.kt create mode 100644 src/main/kotlin/eu/maiora/model/PrenotazioniPastiRepository.kt create mode 100644 src/main/kotlin/eu/maiora/model/PrenotazioniPastiRepositoryImpl.kt create mode 100644 src/main/kotlin/eu/maiora/routes/Prenotazioni.kt diff --git a/src/main/kotlin/eu/maiora/db/Mapping.kt b/src/main/kotlin/eu/maiora/db/Mapping.kt index d42d8ce..20e4ec5 100644 --- a/src/main/kotlin/eu/maiora/db/Mapping.kt +++ b/src/main/kotlin/eu/maiora/db/Mapping.kt @@ -82,6 +82,7 @@ object SlotPrenotabiliTable : IdTable("view_slot_prenotabili"){ val giorno = date("giorno") val dataInizio = datetime("data_inizio") val dataFine = datetime("data_fine") + val dataLimiteCancellazione = datetime("data_limite_cancellazione") val idModalita = long("id_modalita") val modalitaPrenotazione = varchar("modalita_prenotazione", 255) val idPuntoDistribuzione = long("id_punto_distribuzione") @@ -117,6 +118,23 @@ object ResidenzeTable : IdTable("residenze"){ val nome = varchar("nome", 255) } +object PrenotazioniPastiTable : IdTable("prenotazioni_pasti"){ + override val id = long("id").autoIncrement("seq_prenotazioni_pasti").entityId() + val idTessera = long("id_tessera") + val idSlotPuntoCassa = long("id_slot_punto_cassa") + val idResidenza = long("id_residenza").nullable() + val idVassoio = long("id_vassoio") + val importoPagato = RicaricheTable.double("importo_pagato") +} + +object PrenotazioniPastiDettaglioTable : IdTable("prenotazioni_pasti_dettaglio"){ + override val id = long("id").autoIncrement("seq_pren_past_dettaglio").entityId() + val idPrenotazione = long("id_prenotazione") + val idProdotto = long("id_prodotto") + val idStato = long("id_stato") + +} + class AccountsDAO(id: EntityID) :IntEntity(id) { companion object : IntEntityClass(AccountsTable) @@ -184,6 +202,7 @@ class SlotPrenotabiliDao(id: EntityID) :LongEntity(id) { var giorno by SlotPrenotabiliTable.giorno var dataInizio by SlotPrenotabiliTable.dataInizio var dataFine by SlotPrenotabiliTable.dataFine + var dataLimiteCancellazione by SlotPrenotabiliTable.dataLimiteCancellazione var idModalita by SlotPrenotabiliTable.idModalita var modalitaPrenotazione by SlotPrenotabiliTable.modalitaPrenotazione var idPuntoDistribuzione by SlotPrenotabiliTable.idPuntoDistribuzione @@ -291,12 +310,14 @@ fun slotOrariDaoToModel(dao: SlotPrenotabiliDao) :SlotOrari{ val formattedGiorno = dao.giorno.format(formatterGiorno) val formattedDataInizio = dao.dataInizio.format(formatterConOra) val formattedDataFine = dao.dataFine.format(formatterConOra) + val formattedDataLimiteCancellazione = dao.dataLimiteCancellazione.format(formatterConOra) return SlotOrari( dao.id.value, formattedGiorno, formattedDataInizio, formattedDataFine, + formattedDataLimiteCancellazione, dao.idPuntoDistribuzione, dao.puntoDistribuzione, dao.idPuntoCassa, diff --git a/src/main/kotlin/eu/maiora/model/Prenotazioni.kt b/src/main/kotlin/eu/maiora/model/Prenotazioni.kt new file mode 100644 index 0000000..354a4d0 --- /dev/null +++ b/src/main/kotlin/eu/maiora/model/Prenotazioni.kt @@ -0,0 +1,21 @@ +package eu.maiora.model + +import kotlinx.serialization.Serializable + +@Serializable +data class Prenotazioni( + val id: Long? = null, + val codicePrenotazione: String? = null, + val idTessera : Long, + val idSlotPuntoCassa : Long, + val giorno : String? = null, + val turno : String? = null, + val dataInizio : String? = null, + val dataFine : String? = null, + val dataLimiteCancellazione : String? = null, + val idVassoio : Long, + val idStato : Long? = null, + val stato : String? = null, + val listaProdotti : List? = null, + val importoPagato : Double +) \ No newline at end of file diff --git a/src/main/kotlin/eu/maiora/model/PrenotazioniPasti.kt b/src/main/kotlin/eu/maiora/model/PrenotazioniPasti.kt new file mode 100644 index 0000000..5de7ba8 --- /dev/null +++ b/src/main/kotlin/eu/maiora/model/PrenotazioniPasti.kt @@ -0,0 +1,13 @@ +package eu.maiora.model + +import kotlinx.serialization.Serializable + +@Serializable +data class PrenotazioniPasti( + val id: Long, + val idTessera : Long, + val idSlotPuntoCassa : Long, + val idResidenza : Long? = null, + val idVassoio : Long, + val importoPagato : Double +) \ No newline at end of file diff --git a/src/main/kotlin/eu/maiora/model/PrenotazioniPastiDettaglio.kt b/src/main/kotlin/eu/maiora/model/PrenotazioniPastiDettaglio.kt new file mode 100644 index 0000000..1588923 --- /dev/null +++ b/src/main/kotlin/eu/maiora/model/PrenotazioniPastiDettaglio.kt @@ -0,0 +1,11 @@ +package eu.maiora.model + +import kotlinx.serialization.Serializable + +@Serializable +data class PrenotazioniPastiDettaglio( + val id: Long? = null, + val idPrenotazione : Long, + val idProdotto : Long, + val idStato : Long +) \ 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 new file mode 100644 index 0000000..88b22aa --- /dev/null +++ b/src/main/kotlin/eu/maiora/model/PrenotazioniPastiDettaglioRepository.kt @@ -0,0 +1,5 @@ +package eu.maiora.model + +interface PrenotazioniPastiDettaglioRepository { + suspend fun insert(prenotazionePastoDettaglio : PrenotazioniPastiDettaglio): PrenotazioniPastiDettaglio +} \ 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 new file mode 100644 index 0000000..7eef060 --- /dev/null +++ b/src/main/kotlin/eu/maiora/model/PrenotazioniPastiDettaglioRepositoryImpl.kt @@ -0,0 +1,23 @@ +package eu.maiora.model + +import eu.maiora.db.* +import org.jetbrains.exposed.sql.insertAndGetId + +class PrenotazioniPastiDettaglioRepositoryImpl : PrenotazioniPastiDettaglioRepository { + 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 { + it[idPrenotazione] = prenotazionePastoDettaglio.idPrenotazione + it[idProdotto] = prenotazionePastoDettaglio.idProdotto + it[idStato] = prenotazionePastoDettaglio.idStato + }.value + + PrenotazioniPastiDettaglio( + idPrenPastiDettInserted, + prenotazionePastoDettaglio.idPrenotazione, + prenotazionePastoDettaglio.idProdotto, + prenotazionePastoDettaglio.idStato + ) + } +} \ No newline at end of file diff --git a/src/main/kotlin/eu/maiora/model/PrenotazioniPastiRepository.kt b/src/main/kotlin/eu/maiora/model/PrenotazioniPastiRepository.kt new file mode 100644 index 0000000..02bbecc --- /dev/null +++ b/src/main/kotlin/eu/maiora/model/PrenotazioniPastiRepository.kt @@ -0,0 +1,5 @@ +package eu.maiora.model + +interface PrenotazioniPastiRepository { + suspend fun insert(prenotazionePasto : PrenotazioniPasti): PrenotazioniPasti +} \ No newline at end of file diff --git a/src/main/kotlin/eu/maiora/model/PrenotazioniPastiRepositoryImpl.kt b/src/main/kotlin/eu/maiora/model/PrenotazioniPastiRepositoryImpl.kt new file mode 100644 index 0000000..b7c6c1f --- /dev/null +++ b/src/main/kotlin/eu/maiora/model/PrenotazioniPastiRepositoryImpl.kt @@ -0,0 +1,27 @@ +package eu.maiora.model + +import eu.maiora.db.* +import org.jetbrains.exposed.sql.insertAndGetId + +class PrenotazioniPastiRepositoryImpl : PrenotazioniPastiRepository { + override suspend fun insert(prenotazionePasto : PrenotazioniPasti): PrenotazioniPasti = suspendTransaction { + // Inserisci una nuova prenotazione pasto + // ID non definito: viene gestito dalla sequence + val idPrenPastiInserted = PrenotazioniPastiTable.insertAndGetId { + it[idTessera] = prenotazionePasto.idTessera + it[idSlotPuntoCassa] = prenotazionePasto.idSlotPuntoCassa + it[idResidenza] = prenotazionePasto.idResidenza + it[idVassoio] = prenotazionePasto.idVassoio + it[importoPagato] = prenotazionePasto.importoPagato + }.value + + PrenotazioniPasti( + idPrenPastiInserted, + prenotazionePasto.idTessera, + prenotazionePasto.idSlotPuntoCassa, + prenotazionePasto.idResidenza, + prenotazionePasto.idVassoio, + prenotazionePasto.importoPagato + ) + } +} \ No newline at end of file diff --git a/src/main/kotlin/eu/maiora/model/ProdottiPrenotabili.kt b/src/main/kotlin/eu/maiora/model/ProdottiPrenotabili.kt index 1d8425e..0aa51fb 100644 --- a/src/main/kotlin/eu/maiora/model/ProdottiPrenotabili.kt +++ b/src/main/kotlin/eu/maiora/model/ProdottiPrenotabili.kt @@ -5,17 +5,17 @@ import kotlinx.serialization.Serializable @Serializable data class ProdottiPrenotabili( val id: Long, - val giorno : String, - val idPuntoDistribuzione : Long, - val puntoDistribuzione : String, - val idTurno : Long, - val turno : String, - val idProdotto : Long, - val prodotto : String, - val codiceProdotto : String, - val descrizioneProdotto : String, - val idCategoria : Long, - val categoria : String, - val idModalita : Long, - val modalitaPrenotazione : String + val giorno : String? = null, + val idPuntoDistribuzione : Long? = null, + val puntoDistribuzione : String? = null, + val idTurno : Long? = null, + val turno : String? = null, + val idProdotto : Long? = null, + val prodotto : String? = null, + val codiceProdotto : String? = null, + val descrizioneProdotto : String? = null, + val idCategoria : Long? = null, + val categoria : String? = null, + val idModalita : Long? = null, + val modalitaPrenotazione : String? = null ) \ No newline at end of file diff --git a/src/main/kotlin/eu/maiora/model/SlotOrari.kt b/src/main/kotlin/eu/maiora/model/SlotOrari.kt index 6c4c46c..67842fd 100644 --- a/src/main/kotlin/eu/maiora/model/SlotOrari.kt +++ b/src/main/kotlin/eu/maiora/model/SlotOrari.kt @@ -8,6 +8,7 @@ data class SlotOrari( val giorno : String, val dataInizio : String, val dataFine : String, + val dataLimiteCancellazione : String, val idPuntoDistribuzione : Long, val puntoDistribuzione : String, val idPuntoCassa : Long, diff --git a/src/main/kotlin/eu/maiora/model/SlotOrariRepository.kt b/src/main/kotlin/eu/maiora/model/SlotOrariRepository.kt index 2052ea5..55082ca 100644 --- a/src/main/kotlin/eu/maiora/model/SlotOrariRepository.kt +++ b/src/main/kotlin/eu/maiora/model/SlotOrariRepository.kt @@ -5,4 +5,8 @@ interface SlotOrariRepository { idTurno : Long, idPuntoDistribuzione : Long, idModalita : Long): List? + + suspend fun idResidenzaByIdSlotOrario(idSlot : Long) : Long? + + suspend fun slotOrarioById(idSlot : Long) : SlotOrari } \ No newline at end of file diff --git a/src/main/kotlin/eu/maiora/model/SlotOrariRepositoryImpl.kt b/src/main/kotlin/eu/maiora/model/SlotOrariRepositoryImpl.kt index 1d63f45..99042ca 100644 --- a/src/main/kotlin/eu/maiora/model/SlotOrariRepositoryImpl.kt +++ b/src/main/kotlin/eu/maiora/model/SlotOrariRepositoryImpl.kt @@ -22,4 +22,17 @@ class SlotOrariRepositoryImpl : SlotOrariRepository { .map { slotOrariDaoToModel(it) } // Converte il DAO in un oggetto SlotOrari } + + override suspend fun idResidenzaByIdSlotOrario(idSlot : Long) : Long? = suspendTransaction { + SlotPrenotabiliDao.find{ SlotPrenotabiliTable.id eq idSlot } + .single() // Restituisce un singolo risultato o null se non trovato + .let { slotOrariDaoToModel(it) } // Converte il DAO in un oggetto SlotOrari + .idResidenza + } + + override suspend fun slotOrarioById(idSlot : Long) : SlotOrari = suspendTransaction { + SlotPrenotabiliDao.find{ SlotPrenotabiliTable.id eq idSlot } + .single() // Restituisce un singolo risultato o null se non trovato + .let { slotOrariDaoToModel(it) } // Converte il DAO in un oggetto SlotOrari + } } \ 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 1c26bee..55b8613 100644 --- a/src/main/kotlin/eu/maiora/plugins/Routing.kt +++ b/src/main/kotlin/eu/maiora/plugins/Routing.kt @@ -22,5 +22,6 @@ fun Application.configureRouting() { slotOrari(SlotOrariRepositoryImpl()) prodottiPrenotabili(ProdottiPrenotabiliRepositoryImpl()) residenze(ResidenzeRepositoryImpl()) + prenotazioni(PrenotazioniPastiRepositoryImpl(), SlotOrariRepositoryImpl(), PrenotazioniPastiDettaglioRepositoryImpl()) } } diff --git a/src/main/kotlin/eu/maiora/routes/Prenotazioni.kt b/src/main/kotlin/eu/maiora/routes/Prenotazioni.kt new file mode 100644 index 0000000..c1ceab6 --- /dev/null +++ b/src/main/kotlin/eu/maiora/routes/Prenotazioni.kt @@ -0,0 +1,78 @@ +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.request.* +import io.ktor.server.response.* +import io.ktor.server.routing.* + + +fun Route.prenotazioni(prenotazioniPastiRepository: PrenotazioniPastiRepository, + slotOrariRepository: SlotOrariRepository, + prenotazioniPastiDettaglioRepository : PrenotazioniPastiDettaglioRepository){ + route("/api/prenotazioni"){ + authenticate("auth-jwt") { + post(){ + try{ + val listaDettagliInseriti = mutableListOf() + val prenotazioneRequest = call.receive() + //recupera lo slot orario selezionato + val idSlotOrario = slotOrariRepository.slotOrarioById(prenotazioneRequest.idSlotPuntoCassa) + + val prenotazionePasto = PrenotazioniPasti( + -1, + prenotazioneRequest.idTessera, + prenotazioneRequest.idSlotPuntoCassa, + idSlotOrario.idResidenza, + prenotazioneRequest.idVassoio, + prenotazioneRequest.importoPagato + ) + + //Inserisci la prenotazione nel database + val prenotazioneInserita = prenotazioniPastiRepository.insert(prenotazionePasto) + + //per ogni prodotto, inserisci il dettaglio della prenotazione + prenotazioneRequest.listaProdotti?.forEach { el -> + val dettaglioPrenotazione = PrenotazioniPastiDettaglio( + -1, + prenotazioneInserita.id, + el.id, + 0L + ) + listaDettagliInseriti.add(prenotazioniPastiDettaglioRepository.insert(dettaglioPrenotazione)) + + } + + + //restituisci la prenotazione + val prenotazione = Prenotazioni( + prenotazioneInserita.id, + prenotazioneRequest.codicePrenotazione, + prenotazioneInserita.idTessera, + prenotazioneInserita.idSlotPuntoCassa, + idSlotOrario.giorno, + idSlotOrario.turno, + idSlotOrario.dataInizio, + idSlotOrario.dataFine, + idSlotOrario.dataLimiteCancellazione, + prenotazioneRequest.idVassoio, + prenotazioneRequest.idStato, + prenotazioneRequest.stato, + prenotazioneRequest.listaProdotti, + prenotazioneRequest.importoPagato + ) + call.respond(HttpStatusCode.Created, prenotazione) + } + catch (e: Exception){ + call.respond( + HttpStatusCode.BadRequest, + "Errore nel processare la richiesta: ${e.cause}" + ) + } + } + } + + } +} \ No newline at end of file -- 2.27.0 From 635b19e17a2758b76da915d1cc179677321f5d6e Mon Sep 17 00:00:00 2001 From: francescods Date: Wed, 30 Apr 2025 11:16:46 +0200 Subject: [PATCH 2/3] 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 From 4c80fdcdb3ba472c5d8e917ab0952e0593441f29 Mon Sep 17 00:00:00 2001 From: francescods Date: Wed, 30 Apr 2025 12:01:33 +0200 Subject: [PATCH 3/3] aggiunta campo codice ristocloud --- src/main/kotlin/eu/maiora/db/Mapping.kt | 5 ++++- src/main/kotlin/eu/maiora/model/Prenotazioni.kt | 2 +- src/main/kotlin/eu/maiora/model/PrenotazioniPasti.kt | 3 ++- .../eu/maiora/model/PrenotazioniPastiRepositoryImpl.kt | 4 +++- src/main/kotlin/eu/maiora/model/SlotOrariRepository.kt | 2 +- .../kotlin/eu/maiora/model/SlotOrariRepositoryImpl.kt | 6 +++--- src/main/kotlin/eu/maiora/routes/Prenotazioni.kt | 10 ++++++++-- 7 files changed, 22 insertions(+), 10 deletions(-) diff --git a/src/main/kotlin/eu/maiora/db/Mapping.kt b/src/main/kotlin/eu/maiora/db/Mapping.kt index e9c8889..7dc6b6e 100644 --- a/src/main/kotlin/eu/maiora/db/Mapping.kt +++ b/src/main/kotlin/eu/maiora/db/Mapping.kt @@ -126,6 +126,7 @@ object PrenotazioniPastiTable : IdTable("prenotazioni_pasti"){ val idResidenza = long("id_residenza").nullable() val idVassoio = long("id_vassoio") val importoPagato = double("importo_pagato") + val codiceRistocloud = varchar("codice_ristocloud", 255).nullable() } object PrenotazioniPastiDettaglioTable : IdTable("prenotazioni_pasti_dettaglio"){ @@ -257,6 +258,7 @@ class PrenotazioniPastiDao(id: EntityID) :LongEntity(id){ val idResidenza by PrenotazioniPastiTable.idResidenza val idVassoio by PrenotazioniPastiTable.idVassoio val importoPagato by PrenotazioniPastiTable.importoPagato + val codiceRistocloud by PrenotazioniPastiTable.codiceRistocloud } class PrenotazioniPastiDettaglioDao(id: EntityID) :LongEntity(id){ @@ -404,7 +406,8 @@ fun prenotazioniPastiDaoToModel(dao: PrenotazioniPastiDao) : PrenotazioniPasti{ dao.idSlotPuntoCassa, dao.idResidenza, dao.idVassoio, - dao.importoPagato + dao.importoPagato, + dao.codiceRistocloud ) } diff --git a/src/main/kotlin/eu/maiora/model/Prenotazioni.kt b/src/main/kotlin/eu/maiora/model/Prenotazioni.kt index 354a4d0..c879f3b 100644 --- a/src/main/kotlin/eu/maiora/model/Prenotazioni.kt +++ b/src/main/kotlin/eu/maiora/model/Prenotazioni.kt @@ -5,7 +5,7 @@ import kotlinx.serialization.Serializable @Serializable data class Prenotazioni( val id: Long? = null, - val codicePrenotazione: String? = null, + val codiceRistocloud: String? = null, val idTessera : Long, val idSlotPuntoCassa : Long, val giorno : String? = null, diff --git a/src/main/kotlin/eu/maiora/model/PrenotazioniPasti.kt b/src/main/kotlin/eu/maiora/model/PrenotazioniPasti.kt index 5de7ba8..0d3f42b 100644 --- a/src/main/kotlin/eu/maiora/model/PrenotazioniPasti.kt +++ b/src/main/kotlin/eu/maiora/model/PrenotazioniPasti.kt @@ -9,5 +9,6 @@ data class PrenotazioniPasti( val idSlotPuntoCassa : Long, val idResidenza : Long? = null, val idVassoio : Long, - val importoPagato : Double + val importoPagato : Double, + val codiceRistocloud : String? = null ) \ No newline at end of file diff --git a/src/main/kotlin/eu/maiora/model/PrenotazioniPastiRepositoryImpl.kt b/src/main/kotlin/eu/maiora/model/PrenotazioniPastiRepositoryImpl.kt index b7c6c1f..52cc535 100644 --- a/src/main/kotlin/eu/maiora/model/PrenotazioniPastiRepositoryImpl.kt +++ b/src/main/kotlin/eu/maiora/model/PrenotazioniPastiRepositoryImpl.kt @@ -13,6 +13,7 @@ class PrenotazioniPastiRepositoryImpl : PrenotazioniPastiRepository { it[idResidenza] = prenotazionePasto.idResidenza it[idVassoio] = prenotazionePasto.idVassoio it[importoPagato] = prenotazionePasto.importoPagato + it[codiceRistocloud] = prenotazionePasto.codiceRistocloud }.value PrenotazioniPasti( @@ -21,7 +22,8 @@ class PrenotazioniPastiRepositoryImpl : PrenotazioniPastiRepository { prenotazionePasto.idSlotPuntoCassa, prenotazionePasto.idResidenza, prenotazionePasto.idVassoio, - prenotazionePasto.importoPagato + prenotazionePasto.importoPagato, + prenotazionePasto.codiceRistocloud ) } } \ No newline at end of file diff --git a/src/main/kotlin/eu/maiora/model/SlotOrariRepository.kt b/src/main/kotlin/eu/maiora/model/SlotOrariRepository.kt index 55082ca..47c945b 100644 --- a/src/main/kotlin/eu/maiora/model/SlotOrariRepository.kt +++ b/src/main/kotlin/eu/maiora/model/SlotOrariRepository.kt @@ -8,5 +8,5 @@ interface SlotOrariRepository { suspend fun idResidenzaByIdSlotOrario(idSlot : Long) : Long? - suspend fun slotOrarioById(idSlot : Long) : SlotOrari + suspend fun slotOrarioById(idSlot : Long) : SlotOrari? } \ No newline at end of file diff --git a/src/main/kotlin/eu/maiora/model/SlotOrariRepositoryImpl.kt b/src/main/kotlin/eu/maiora/model/SlotOrariRepositoryImpl.kt index 99042ca..9f9d431 100644 --- a/src/main/kotlin/eu/maiora/model/SlotOrariRepositoryImpl.kt +++ b/src/main/kotlin/eu/maiora/model/SlotOrariRepositoryImpl.kt @@ -30,9 +30,9 @@ class SlotOrariRepositoryImpl : SlotOrariRepository { .idResidenza } - override suspend fun slotOrarioById(idSlot : Long) : SlotOrari = suspendTransaction { + override suspend fun slotOrarioById(idSlot : Long) : SlotOrari? = suspendTransaction { SlotPrenotabiliDao.find{ SlotPrenotabiliTable.id eq idSlot } - .single() // Restituisce un singolo risultato o null se non trovato - .let { slotOrariDaoToModel(it) } // Converte il DAO in un oggetto SlotOrari + .singleOrNull() // Restituisce un singolo risultato o null se non trovato + ?.let { slotOrariDaoToModel(it) } // Converte il DAO in un oggetto SlotOrari } } \ No newline at end of file diff --git a/src/main/kotlin/eu/maiora/routes/Prenotazioni.kt b/src/main/kotlin/eu/maiora/routes/Prenotazioni.kt index c1ceab6..8afeb6a 100644 --- a/src/main/kotlin/eu/maiora/routes/Prenotazioni.kt +++ b/src/main/kotlin/eu/maiora/routes/Prenotazioni.kt @@ -20,6 +20,11 @@ fun Route.prenotazioni(prenotazioniPastiRepository: PrenotazioniPastiRepository, val prenotazioneRequest = call.receive() //recupera lo slot orario selezionato val idSlotOrario = slotOrariRepository.slotOrarioById(prenotazioneRequest.idSlotPuntoCassa) + if(idSlotOrario == null){ + call.respond(HttpStatusCode.BadRequest,"Slot orario non esistente") + return@post + } + val prenotazionePasto = PrenotazioniPasti( -1, @@ -27,7 +32,8 @@ fun Route.prenotazioni(prenotazioniPastiRepository: PrenotazioniPastiRepository, prenotazioneRequest.idSlotPuntoCassa, idSlotOrario.idResidenza, prenotazioneRequest.idVassoio, - prenotazioneRequest.importoPagato + prenotazioneRequest.importoPagato, + prenotazioneRequest.codiceRistocloud ) //Inserisci la prenotazione nel database @@ -49,7 +55,7 @@ fun Route.prenotazioni(prenotazioniPastiRepository: PrenotazioniPastiRepository, //restituisci la prenotazione val prenotazione = Prenotazioni( prenotazioneInserita.id, - prenotazioneRequest.codicePrenotazione, + prenotazioneRequest.codiceRistocloud, prenotazioneInserita.idTessera, prenotazioneInserita.idSlotPuntoCassa, idSlotOrario.giorno, -- 2.27.0