Compare commits

...

9 Commits

Author SHA1 Message Date
49799b6734 Merge pull request 'modifica formattazione date' (#17) from 0002429-endpoint-prenotazioni into dev
Reviewed-on: #17
2025-05-15 08:00:51 +00:00
328c444405 modifica formattazione date
modificato nome oggetto lista prodotti nella /GET, per renderlo coerente con il dataset della /POST
2025-05-15 10:00:01 +02:00
896a21173a Merge pull request 'campo ID_VASSOIO nullable' (#16) from 0002429-endpoint-prenotazioni into dev
Reviewed-on: #16
2025-05-13 09:51:25 +00:00
de62e90480 campo ID_VASSOIO nullable
per il pregresso e per le prenotazioni create da Ricarichiamoci, il vassoio non viene selezionato.
Solo Ristocloud ha l'obbligo di indicare il vassoio
2025-05-13 11:50:38 +02:00
3a3e9b633b Merge pull request '/GET prenotazioni' (#15) from 0002429-endpoint-prenotazioni into dev
Reviewed-on: #15
2025-05-12 15:52:44 +00:00
b210ffd802 /GET prenotazioni
recupero delle prenotazioni di una tessera, con i prodotti prenotati
2025-05-12 17:51:58 +02:00
f88167d87e Merge pull request '0002429-endpoint-prenotazioni' (#14) from 0002429-endpoint-prenotazioni into dev
Reviewed-on: #14
2025-04-30 10:03:04 +00:00
4c80fdcdb3 aggiunta campo codice ristocloud 2025-04-30 12:01:33 +02:00
73e46947cd Merge pull request '0002430-endpoint-annullaPrenotazioni' (#13) from 0002430-endpoint-annullaPrenotazioni into 0002429-endpoint-prenotazioni
Reviewed-on: #13
2025-04-30 09:18:23 +00:00
12 changed files with 108 additions and 18 deletions

View File

@ -1,8 +1,10 @@
package eu.maiora.db
import eu.maiora.model.*
import kotlinx.coroutines.Dispatchers
import kotlinx.datetime.toKotlinLocalDateTime
import kotlinx.datetime.toKotlinLocalDate
import org.jetbrains.exposed.dao.IntEntity
import org.jetbrains.exposed.dao.IntEntityClass
import org.jetbrains.exposed.dao.LongEntity
@ -126,6 +128,7 @@ object PrenotazioniPastiTable : IdTable<Long>("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<Long>("prenotazioni_pasti_dettaglio"){
@ -141,7 +144,15 @@ object ViewPrenotazioniPastiTable : IdTable<Long>("view_prenotazioni_pasti"){
val idPrenotazione = long("id_prenotazione")
val idStato = long("id_stato")
val stato = varchar("stato", 255)
val idTessera = long("id_tessera")
val idSlotPuntoCassa = long("id_slot_punto_cassa")
val giorno = date("giorno")
val turno = varchar("turno", 255)
val dataInizio = datetime("data_inizio")
val dataLimiteCancellazione = datetime("data_limite_cancellazione")
val idVassoio = long("id_vassoio").nullable()
val codiceRistocloud = varchar("codice_ristocloud", 255).nullable()
val importoPagato = double("importo_pagato")
}
class AccountsDAO(id: EntityID<Int>) :IntEntity(id) {
@ -257,6 +268,7 @@ class PrenotazioniPastiDao(id: EntityID<Long>) :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<Long>) :LongEntity(id){
@ -272,8 +284,16 @@ class ViewPrenotazioniPastiDao(id: EntityID<Long>) :LongEntity(id){
val idPrenotazione by ViewPrenotazioniPastiTable.idPrenotazione
val idStato by ViewPrenotazioniPastiTable.idStato
val idTessera by ViewPrenotazioniPastiTable.idTessera
val idSlotPuntoCassa by ViewPrenotazioniPastiTable.idSlotPuntoCassa
val stato by ViewPrenotazioniPastiTable.stato
val giorno by ViewPrenotazioniPastiTable.giorno
val turno by ViewPrenotazioniPastiTable.turno
val dataInizio by ViewPrenotazioniPastiTable.dataInizio
val dataLimiteCancellazione by ViewPrenotazioniPastiTable.dataLimiteCancellazione
val idVassoio by ViewPrenotazioniPastiTable.idVassoio
val codiceRistocloud by ViewPrenotazioniPastiTable.codiceRistocloud
val importoPagato by ViewPrenotazioniPastiTable.importoPagato
}
fun accountsDaoToModel(dao: AccountsDAO) = Accounts(
@ -404,7 +424,8 @@ fun prenotazioniPastiDaoToModel(dao: PrenotazioniPastiDao) : PrenotazioniPasti{
dao.idSlotPuntoCassa,
dao.idResidenza,
dao.idVassoio,
dao.importoPagato
dao.importoPagato,
dao.codiceRistocloud
)
}
@ -418,12 +439,28 @@ fun prenotazioniPastiDettaglioDaoToModel(dao: PrenotazioniPastiDettaglioDao) : P
}
fun viewPrenotazioniPastiDaoToModel(dao: ViewPrenotazioniPastiDao) : ViewPrenotazioniPasti{
val formatterGiorno = DateTimeFormatter.ofPattern("ddMMyyyy")
val formatterDataInizio = DateTimeFormatter.ofPattern("ddMMyyyy HH:mm")
val formatterDataLimiteCancellazione = DateTimeFormatter.ofPattern("ddMMyyyy HH:mm")
val formattedGiorno = dao.giorno.format(formatterGiorno)
val formattedDataInizio = dao.dataInizio.format(formatterDataInizio)
val formattedDataLimiteCanc = dao.dataLimiteCancellazione.format(formatterDataLimiteCancellazione)
return ViewPrenotazioniPasti(
dao.id.value,
dao.idPrenotazione,
dao.idStato,
dao.stato,
dao.dataLimiteCancellazione.toKotlinLocalDateTime()
dao.idTessera,
dao.idSlotPuntoCassa,
formattedGiorno,
dao.turno,
formattedDataInizio,
formattedDataLimiteCanc,
dao.idVassoio,
dao.codiceRistocloud,
dao.importoPagato,
null
)
}

View File

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

View File

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

View File

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

View File

@ -8,5 +8,5 @@ interface SlotOrariRepository {
suspend fun idResidenzaByIdSlotOrario(idSlot : Long) : Long?
suspend fun slotOrarioById(idSlot : Long) : SlotOrari
suspend fun slotOrarioById(idSlot : Long) : SlotOrari?
}

View File

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

View File

@ -1,13 +1,23 @@
package eu.maiora.model
import kotlinx.datetime.LocalDate
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
val idTessera: Long,
val idSlotPuntoCassa: Long,
val giorno: String,
val turno: String,
val dataInizio: String,
val dataLimiteCancellazione: String,
val idVassoio: Long? = null,
val codiceRistocloud: String? = null,
val importoPagato: Double,
var listaProdotti: List<PrenotazioniPastiDettaglio>? = null
)

View File

@ -2,4 +2,5 @@ package eu.maiora.model
interface ViewPrenotazioniPastiRepository {
suspend fun prenotazioniPastiById(id : Long): ViewPrenotazioniPasti
suspend fun prenotazioniPastiByIdTessera(idTessera : Long): List<ViewPrenotazioniPasti>
}

View File

@ -12,4 +12,13 @@ class ViewPrenotazioniPastiRepositoryImpl : ViewPrenotazioniPastiRepository {
.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
}
override suspend fun prenotazioniPastiByIdTessera(idTessera : Long): List<ViewPrenotazioniPasti> = suspendTransaction {
// Cerca la lista di prenotazioni
ViewPrenotazioniPastiDao.find { ViewPrenotazioniPastiTable.idTessera eq idTessera }
.orderBy(ViewPrenotazioniPastiTable.giorno to SortOrder.DESC)
.toList() // Restituisce la lista delle prenotazioni
.map { viewPrenotazioniPastiDaoToModel(it) } // Converte il DAO in un oggetto Movimenti
}
}

View File

@ -22,7 +22,10 @@ fun Application.configureRouting() {
slotOrari(SlotOrariRepositoryImpl())
prodottiPrenotabili(ProdottiPrenotabiliRepositoryImpl())
residenze(ResidenzeRepositoryImpl())
prenotazioni(PrenotazioniPastiRepositoryImpl(), SlotOrariRepositoryImpl(), PrenotazioniPastiDettaglioRepositoryImpl())
prenotazioni(PrenotazioniPastiRepositoryImpl(),
SlotOrariRepositoryImpl(),
PrenotazioniPastiDettaglioRepositoryImpl(),
ViewPrenotazioniPastiRepositoryImpl())
annullaPrenotazioni(ViewPrenotazioniPastiRepositoryImpl(), PrenotazioniPastiDettaglioRepositoryImpl())
}
}

View File

@ -37,8 +37,8 @@ fun Route.annullaPrenotazioni(
return@patch
}
//prenotazione annullabile se la data limite per la cancellazione non è stato superato
if (LocalDateTime.now().isAfter(prenotazione.dataLimiteCancellazione.toJavaLocalDateTime())) {
//prenotazione annullabile se la data limite per la cancellazione non è stata superata
if (LocalDateTime.now().isAfter(LocalDateTime.parse(prenotazione.dataLimiteCancellazione))) {
call.respond(
HttpStatusCode.BadRequest,
"Prenotazione non annullata: data limite cancellazione superata"

View File

@ -11,15 +11,41 @@ import io.ktor.server.routing.*
fun Route.prenotazioni(prenotazioniPastiRepository: PrenotazioniPastiRepository,
slotOrariRepository: SlotOrariRepository,
prenotazioniPastiDettaglioRepository : PrenotazioniPastiDettaglioRepository){
prenotazioniPastiDettaglioRepository : PrenotazioniPastiDettaglioRepository,
viewPrenotazioniPastiRepositoryImpl: ViewPrenotazioniPastiRepositoryImpl){
route("/api/prenotazioni"){
authenticate("auth-jwt") {
get("{idTessera}"){
// Ottieni l'id della tessera dal percorso
val idTessera = call.parameters["idTessera"]
if (idTessera == null) {
call.respondText("ID tessera non valido", status = HttpStatusCode.BadRequest)
return@get
}
// Cerca le prenotazioni per la tessera indicata
val listaPrenotazioniPasti = viewPrenotazioniPastiRepositoryImpl.prenotazioniPastiByIdTessera(idTessera.toLong())
listaPrenotazioniPasti.forEach{ el ->
el.listaProdotti =
prenotazioniPastiDettaglioRepository.listaDettagliByIdPrenotazione(el.id)
}
call.respond(listaPrenotazioniPasti)
}
post(){
try{
val listaDettagliInseriti = mutableListOf<PrenotazioniPastiDettaglio>()
val prenotazioneRequest = call.receive<Prenotazioni>()
//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 +53,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 +76,7 @@ fun Route.prenotazioni(prenotazioniPastiRepository: PrenotazioniPastiRepository,
//restituisci la prenotazione
val prenotazione = Prenotazioni(
prenotazioneInserita.id,
prenotazioneRequest.codicePrenotazione,
prenotazioneRequest.codiceRistocloud,
prenotazioneInserita.idTessera,
prenotazioneInserita.idSlotPuntoCassa,
idSlotOrario.giorno,