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