/POST prenotazioni

inserimento nuova prenotazione, con i relativi prodotti
This commit is contained in:
Francesco Di Sciascio 2025-04-29 14:43:16 +02:00
parent 4c3ea7fbf0
commit fbcef1af3e
14 changed files with 236 additions and 13 deletions

View File

@ -82,6 +82,7 @@ object SlotPrenotabiliTable : IdTable<Long>("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<Long>("residenze"){
val nome = varchar("nome", 255)
}
object PrenotazioniPastiTable : IdTable<Long>("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<Long>("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<Int>) :IntEntity(id) {
companion object : IntEntityClass<AccountsDAO>(AccountsTable)
@ -184,6 +202,7 @@ class SlotPrenotabiliDao(id: EntityID<Long>) :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,

View File

@ -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<ProdottiPrenotabili>? = null,
val importoPagato : Double
)

View File

@ -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
)

View File

@ -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
)

View File

@ -0,0 +1,5 @@
package eu.maiora.model
interface PrenotazioniPastiDettaglioRepository {
suspend fun insert(prenotazionePastoDettaglio : PrenotazioniPastiDettaglio): PrenotazioniPastiDettaglio
}

View File

@ -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
)
}
}

View File

@ -0,0 +1,5 @@
package eu.maiora.model
interface PrenotazioniPastiRepository {
suspend fun insert(prenotazionePasto : PrenotazioniPasti): PrenotazioniPasti
}

View File

@ -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
)
}
}

View File

@ -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
)

View File

@ -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,

View File

@ -5,4 +5,8 @@ interface SlotOrariRepository {
idTurno : Long,
idPuntoDistribuzione : Long,
idModalita : Long): List<SlotOrari>?
suspend fun idResidenzaByIdSlotOrario(idSlot : Long) : Long?
suspend fun slotOrarioById(idSlot : Long) : SlotOrari
}

View File

@ -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
}
}

View File

@ -22,5 +22,6 @@ fun Application.configureRouting() {
slotOrari(SlotOrariRepositoryImpl())
prodottiPrenotabili(ProdottiPrenotabiliRepositoryImpl())
residenze(ResidenzeRepositoryImpl())
prenotazioni(PrenotazioniPastiRepositoryImpl(), SlotOrariRepositoryImpl(), PrenotazioniPastiDettaglioRepositoryImpl())
}
}

View File

@ -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<PrenotazioniPastiDettaglio>()
val prenotazioneRequest = call.receive<Prenotazioni>()
//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}"
)
}
}
}
}
}