0002650-endpoint-annullaPrenotazioni-modifiche-richieste #25

Merged
f.disciascio merged 1 commits from 0002650-endpoint-annullaPrenotazioni-modifiche-richieste into dev 2025-10-03 10:30:09 +00:00
14 changed files with 485 additions and 104 deletions

View File

@ -3,6 +3,8 @@ package eu.maiora.db
import eu.maiora.model.* import eu.maiora.model.*
import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.Dispatchers
import kotlinx.datetime.toKotlinLocalDate
import kotlinx.datetime.toKotlinLocalDateTime
import org.jetbrains.exposed.dao.* import org.jetbrains.exposed.dao.*
import org.jetbrains.exposed.dao.id.EntityID import org.jetbrains.exposed.dao.id.EntityID
import org.jetbrains.exposed.dao.id.IdTable import org.jetbrains.exposed.dao.id.IdTable
@ -13,7 +15,6 @@ import org.jetbrains.exposed.sql.transactions.experimental.newSuspendedTransacti
import java.time.format.DateTimeFormatter import java.time.format.DateTimeFormatter
object AccountsTable : IdTable<Int>("accounts") { object AccountsTable : IdTable<Int>("accounts") {
override val id = integer("id").entityId() override val id = integer("id").entityId()
val username = varchar("username", 255) val username = varchar("username", 255)
@ -30,7 +31,15 @@ object ParametriTable : IdTable<Int>("parametri"){
override val primaryKey = PrimaryKey(id) override val primaryKey = PrimaryKey(id)
} }
object TessereTable : IdTable<Long>("view_tessere_api"){ object TessereTable : IdTable<Long>("tessere") {
override val id = long("id").entityId()
val saldo = double("saldo")
val tsUltimoUtilizzo = datetime("ts_ultimo_utilizzo")
override val primaryKey = PrimaryKey(id)
}
object ViewTessereAPITable : IdTable<Long>("view_tessere_api") {
override val id = long("id").entityId() override val id = long("id").entityId()
val idUtente = long("id_utente") val idUtente = long("id_utente")
val codiceFiscale = varchar("codice_fiscale", 255) val codiceFiscale = varchar("codice_fiscale", 255)
@ -59,6 +68,35 @@ object MovimentiTable : IdTable<Long>("view_movimenti_api"){
val dettagli = varchar("dettagli", 255) val dettagli = varchar("dettagli", 255)
} }
object DwhMovimentiTable : IdTable<Long>("dwh.movimenti") {
override val id = long("id").autoIncrement("dwh.seq_movimenti").entityId()
val idTessera = long("id_tessera")
val numero = varchar("numero", 255)
val operazione = varchar("operazione", 255)
val data = datetime("DATA")
val transazione = long("transazione")
val dispositivo = varchar("dispositivo", 255)
val riferimento = varchar("riferimento", 255)
val saldoPre = double("saldo_pre")
val importo = double("importo")
val saldoPost = double("saldo_post")
val puntiPre = long("punti_pre")
val punti = long("punti")
val puntiPost = long("punti_post")
val flagPassaggioTessera = integer("flag_passaggio_tessera")
val oggetto = varchar("oggetto", 255)
val cognome = varchar("cognome", 255)
val nome = varchar("nome", 255)
val codiceFiscale = varchar("codice_fiscale", 255)
val azienda = varchar("azienda", 255)
val categoriaUtenti = varchar("categoria_utenti", 255)
val fascia = varchar("fascia", 255)
val idTipoMovimentoConto = integer("id_tipo_movimento_conto")
val giorno = date("giorno")
val modalita = varchar("modalita", 255)
val idModalita = long("id_modalita")
}
object ComposizioniTable : IdTable<Long>("view_composizioni") { object ComposizioniTable : IdTable<Long>("view_composizioni") {
override val id = long("id").entityId() override val id = long("id").entityId()
val idVassoio = long("id_vassoio") val idVassoio = long("id_vassoio")
@ -148,6 +186,7 @@ object ViewPrenotazioniPastiTable : IdTable<Long>("view_prenotazioni_pasti"){
val dataFine = datetime("data_fine") val dataFine = datetime("data_fine")
val dataLimiteCancellazione = datetime("data_limite_cancellazione") val dataLimiteCancellazione = datetime("data_limite_cancellazione")
val idVassoio = long("id_vassoio").nullable() val idVassoio = long("id_vassoio").nullable()
val vassoio = varchar("vassoio", 255)
val codiceRistocloud = varchar("codice_ristocloud", 255).nullable() val codiceRistocloud = varchar("codice_ristocloud", 255).nullable()
val importoPagato = double("importo_pagato") val importoPagato = double("importo_pagato")
val puntoDistribuzione = varchar("punto_distribuzione", 255) val puntoDistribuzione = varchar("punto_distribuzione", 255)
@ -175,11 +214,18 @@ class ParametriDAO(id: EntityID<Int>) :IntEntity(id) {
class TessereDao(id: EntityID<Long>) : LongEntity(id) { class TessereDao(id: EntityID<Long>) : LongEntity(id) {
companion object : LongEntityClass<TessereDao>(TessereTable) companion object : LongEntityClass<TessereDao>(TessereTable)
var idUtente by TessereTable.idUtente
var codiceFiscale by TessereTable.codiceFiscale
var numero by TessereTable.numero
var saldo by TessereTable.saldo var saldo by TessereTable.saldo
var punti by TessereTable.punti var tsUltimoUtilizzo by TessereTable.tsUltimoUtilizzo
}
class ViewTessereAPIDao(id: EntityID<Long>) : LongEntity(id) {
companion object : LongEntityClass<ViewTessereAPIDao>(ViewTessereAPITable)
var idUtente by ViewTessereAPITable.idUtente
var codiceFiscale by ViewTessereAPITable.codiceFiscale
var numero by ViewTessereAPITable.numero
var saldo by ViewTessereAPITable.saldo
var punti by ViewTessereAPITable.punti
} }
class MovimentiDao(id: EntityID<Long>) : LongEntity(id) { class MovimentiDao(id: EntityID<Long>) : LongEntity(id) {
@ -201,6 +247,36 @@ class MovimentiDao(id: EntityID<Long>) :LongEntity(id) {
var dettagli by MovimentiTable.dettagli var dettagli by MovimentiTable.dettagli
} }
class DwhMovimentiDao(id: EntityID<Long>) : LongEntity(id) {
companion object : LongEntityClass<DwhMovimentiDao>(DwhMovimentiTable)
var idTessera by DwhMovimentiTable.idTessera
var numero by DwhMovimentiTable.numero
var operazione by DwhMovimentiTable.operazione
var data by DwhMovimentiTable.data
var transazione by DwhMovimentiTable.transazione
var dispositivo by DwhMovimentiTable.dispositivo
var riferimento by DwhMovimentiTable.riferimento
var saldoPre by DwhMovimentiTable.saldoPre
var importo by DwhMovimentiTable.importo
var saldoPost by DwhMovimentiTable.saldoPost
var puntiPre by DwhMovimentiTable.puntiPre
var punti by DwhMovimentiTable.punti
var puntiPost by DwhMovimentiTable.puntiPost
var flagPassaggioTessera by DwhMovimentiTable.flagPassaggioTessera
var oggetto by DwhMovimentiTable.oggetto
var cognome by DwhMovimentiTable.cognome
var nome by DwhMovimentiTable.nome
var codiceFiscale by DwhMovimentiTable.codiceFiscale
var azienda by DwhMovimentiTable.azienda
var categoriaUtenti by DwhMovimentiTable.categoriaUtenti
var fascia by DwhMovimentiTable.fascia
var idTipoMovimentoConto by DwhMovimentiTable.idTipoMovimentoConto
var giorno by DwhMovimentiTable.giorno
var modalita by DwhMovimentiTable.modalita
var idModalita by DwhMovimentiTable.idModalita
}
class ComposizioniDao(id: EntityID<Long>) : LongEntity(id) { class ComposizioniDao(id: EntityID<Long>) : LongEntity(id) {
companion object : LongEntityClass<ComposizioniDao>(ComposizioniTable) companion object : LongEntityClass<ComposizioniDao>(ComposizioniTable)
@ -297,6 +373,7 @@ class ViewPrenotazioniPastiDao(id: EntityID<Long>) :LongEntity(id){
val dataFine by ViewPrenotazioniPastiTable.dataFine val dataFine by ViewPrenotazioniPastiTable.dataFine
val dataLimiteCancellazione by ViewPrenotazioniPastiTable.dataLimiteCancellazione val dataLimiteCancellazione by ViewPrenotazioniPastiTable.dataLimiteCancellazione
val idVassoio by ViewPrenotazioniPastiTable.idVassoio val idVassoio by ViewPrenotazioniPastiTable.idVassoio
val vassoio by ViewPrenotazioniPastiTable.vassoio
val codiceRistocloud by ViewPrenotazioniPastiTable.codiceRistocloud val codiceRistocloud by ViewPrenotazioniPastiTable.codiceRistocloud
val importoPagato by ViewPrenotazioniPastiTable.importoPagato val importoPagato by ViewPrenotazioniPastiTable.importoPagato
val puntoDistribuzione by ViewPrenotazioniPastiTable.puntoDistribuzione val puntoDistribuzione by ViewPrenotazioniPastiTable.puntoDistribuzione
@ -320,6 +397,15 @@ fun parametriDaoToModel(dao: ParametriDAO) = Parametri(
) )
fun tessereDaoToModel(dao: TessereDao) = Tessere( fun tessereDaoToModel(dao: TessereDao) = Tessere(
dao.id.value,
dao.saldo,
dao.tsUltimoUtilizzo.toKotlinLocalDateTime()
)
fun viewTessereAPIDaoToModel(dao: ViewTessereAPIDao): ViewTessereAPI {
return ViewTessereAPI(
dao.id.value, dao.id.value,
dao.idUtente, dao.idUtente,
dao.codiceFiscale, dao.codiceFiscale,
@ -327,6 +413,8 @@ fun tessereDaoToModel(dao: TessereDao) = Tessere(
dao.saldo, dao.saldo,
dao.punti dao.punti
) )
}
fun movimentiDaoToModel(dao: MovimentiDao): Movimenti { fun movimentiDaoToModel(dao: MovimentiDao): Movimenti {
val formatter = DateTimeFormatter.ofPattern("ddMMyyyy HH:mm") val formatter = DateTimeFormatter.ofPattern("ddMMyyyy HH:mm")
@ -351,6 +439,36 @@ fun movimentiDaoToModel(dao: MovimentiDao) :Movimenti{
) )
} }
fun dwhMovimentiDaoToModel(dao: DwhMovimentiDao) = DwhMovimenti(
dao.id.value,
dao.idTessera,
dao.numero,
dao.operazione,
dao.data.toKotlinLocalDateTime(),
dao.transazione,
dao.dispositivo,
dao.riferimento,
dao.saldoPre,
dao.importo,
dao.saldoPost,
dao.puntiPre,
dao.punti,
dao.puntiPost,
dao.flagPassaggioTessera,
dao.oggetto,
dao.cognome,
dao.nome,
dao.codiceFiscale,
dao.azienda,
dao.categoriaUtenti,
dao.fascia,
dao.idTipoMovimentoConto,
dao.giorno.toKotlinLocalDate(),
dao.modalita,
dao.idModalita
)
fun composizioniDaoToModel(dao: ComposizioniDao) = Composizioni( fun composizioniDaoToModel(dao: ComposizioniDao) = Composizioni(
dao.id.value, dao.id.value,
dao.idVassoio, dao.idVassoio,
@ -450,39 +568,11 @@ fun prenotazioniPastiDettaglioDaoToModel(dao: PrenotazioniPastiDettaglioDao) : P
) )
} }
/*fun viewPrenotazioniPastiDaoToModel(dao: ViewPrenotazioniPastiDao) : ViewPrenotazioniPasti{
val formatterGiorno = DateTimeFormatter.ofPattern("ddMMyyyy") fun viewPrenotazioniPastiDaoToModel(
val formatterDataInizio = DateTimeFormatter.ofPattern("ddMMyyyy HH:mm") dao: ViewPrenotazioniPastiDao,
val formatterDataFine = DateTimeFormatter.ofPattern("ddMMyyyy HH:mm") listaProdotti: List<ListaProdottiElement>? = null
val formatterDataLimiteCancellazione = DateTimeFormatter.ofPattern("ddMMyyyy HH:mm") ): ViewPrenotazioniPasti {
val formattedGiorno = dao.giorno.format(formatterGiorno)
val formattedDataInizio = dao.dataInizio.format(formatterDataInizio)
val formattedDataFine = dao.dataFine.format(formatterDataFine)
val formattedDataLimiteCanc = dao.dataLimiteCancellazione.format(formatterDataLimiteCancellazione)
return ViewPrenotazioniPasti(
dao.idPrenotazione,
dao.idStato,
dao.stato,
dao.idTessera,
dao.idSlotPuntoCassa,
formattedGiorno,
dao.turno,
formattedDataInizio,
formattedDataFine,
formattedDataLimiteCanc,
dao.idVassoio,
dao.codiceRistocloud,
dao.importoPagato,
dao.puntoDistribuzione,
dao.puntoCassa,
dao.modalita,
null
)
}*/
fun viewPrenotazioniPastiDaoToModel(dao: ViewPrenotazioniPastiDao, listaProdotti: List<ListaProdottiElement>? = null) : ViewPrenotazioniPasti{
val formatterGiorno = DateTimeFormatter.ofPattern("ddMMyyyy") val formatterGiorno = DateTimeFormatter.ofPattern("ddMMyyyy")
val formatterDataInizio = DateTimeFormatter.ofPattern("ddMMyyyy HH:mm") val formatterDataInizio = DateTimeFormatter.ofPattern("ddMMyyyy HH:mm")
val formatterDataFine = DateTimeFormatter.ofPattern("ddMMyyyy HH:mm") val formatterDataFine = DateTimeFormatter.ofPattern("ddMMyyyy HH:mm")
@ -505,6 +595,7 @@ fun viewPrenotazioniPastiDaoToModel(dao: ViewPrenotazioniPastiDao, listaProdotti
formattedDataFine, formattedDataFine,
formattedDataLimiteCanc, formattedDataLimiteCanc,
dao.idVassoio, dao.idVassoio,
dao.vassoio,
dao.codiceRistocloud, dao.codiceRistocloud,
dao.importoPagato, dao.importoPagato,
dao.puntoDistribuzione, dao.puntoDistribuzione,

View File

@ -0,0 +1,38 @@
package eu.maiora.model
import kotlinx.datetime.LocalDate
import kotlinx.datetime.LocalDateTime
import kotlinx.serialization.Serializable
@Serializable
data class DwhMovimenti(
val id: Long,
val idTessera: Long,
val numero: String,
val operazione: String,
val data: LocalDateTime,
val transazione: Long,
val dispositivo: String,
val riferimento: String,
val saldoPre: Double,
val importo: Double,
val saldoPost: Double,
val puntiPre: Long,
val punti: Long,
val puntiPost: Long,
val flagPassaggioTessera: Int,
val oggetto: String,
val cognome: String,
val nome: String,
val codiceFiscale: String,
val azienda: String,
val categoriaUtenti: String,
val fascia: String,
val idTipoMovimentoConto: Int,
val giorno: LocalDate,
val modalita: String,
val idModalita: Long
)

View File

@ -0,0 +1,5 @@
package eu.maiora.model
interface DwhMovimentiRepository {
suspend fun insert(movimento : DwhMovimenti): DwhMovimenti
}

View File

@ -0,0 +1,71 @@
package eu.maiora.model
import eu.maiora.db.*
import kotlinx.datetime.toJavaLocalDate
import kotlinx.datetime.toJavaLocalDateTime
import org.jetbrains.exposed.sql.insertAndGetId
class DwhMovimentiRepositoryImpl : DwhMovimentiRepository {
override suspend fun insert(movimento : DwhMovimenti): DwhMovimenti = suspendTransaction {
// Inserisci un nuovo movimento
// ID non definito: viene gestito dalla sequence
val idMovimentoInserted = DwhMovimentiTable.insertAndGetId {
it[idTessera] = movimento.idTessera
it[numero] = movimento.numero
it[operazione] = movimento.operazione
it[data] = movimento.data.toJavaLocalDateTime()
it[transazione] = movimento.transazione
it[dispositivo] = movimento.dispositivo
it[riferimento] = movimento.riferimento
it[saldoPre] = movimento.saldoPre
it[importo] = movimento.importo
it[saldoPost] = movimento.saldoPost
it[puntiPre] = movimento.puntiPre
it[punti] = movimento.punti
it[puntiPost] = movimento.puntiPost
it[flagPassaggioTessera] = movimento.flagPassaggioTessera
it[oggetto] = movimento.oggetto
it[cognome] = movimento.cognome
it[nome] = movimento.nome
it[codiceFiscale] = movimento.codiceFiscale
it[azienda] = movimento.azienda
it[categoriaUtenti] = movimento.categoriaUtenti
it[fascia] = movimento.fascia
it[idTipoMovimentoConto] = movimento.idTipoMovimentoConto
it[giorno] = movimento.giorno.toJavaLocalDate()
it[modalita] = movimento.modalita
it[idModalita] = movimento.idModalita
}.value
DwhMovimenti(
idMovimentoInserted,
movimento.idTessera,
movimento.numero,
movimento.operazione,
movimento.data,
movimento.transazione,
movimento.dispositivo,
movimento.riferimento,
movimento.saldoPre,
movimento.importo,
movimento.saldoPost,
movimento.puntiPre,
movimento.punti,
movimento.puntiPost,
movimento.flagPassaggioTessera,
movimento.oggetto,
movimento.cognome,
movimento.nome,
movimento.codiceFiscale,
movimento.azienda,
movimento.categoriaUtenti,
movimento.fascia,
movimento.idTipoMovimentoConto,
movimento.giorno,
movimento.modalita,
movimento.idModalita
)
}
}

View File

@ -1,13 +1,11 @@
package eu.maiora.model package eu.maiora.model
import kotlinx.datetime.LocalDateTime
import kotlinx.serialization.Serializable import kotlinx.serialization.Serializable
@Serializable @Serializable
data class Tessere( data class Tessere(
val id: Long, val id: Long,
val idUtente : Long,
val codiceFiscale : String,
val numero : String,
val saldo : Double, val saldo : Double,
val punti : Int val tsUltimoUtilizzo : LocalDateTime
) )

View File

@ -1,5 +1,5 @@
package eu.maiora.model package eu.maiora.model
interface TessereRepository { interface TessereRepository {
suspend fun tesseraByCodiceFiscale(cf : String): Tessere? suspend fun update(tessera: Tessere): Tessere
} }

View File

@ -1,13 +1,17 @@
package eu.maiora.model package eu.maiora.model
import eu.maiora.db.* import eu.maiora.db.*
import kotlinx.datetime.toJavaLocalDateTime
import org.jetbrains.exposed.sql.update
class TessereRepositoryImpl : TessereRepository { class TessereRepositoryImpl : TessereRepository {
override suspend fun tesseraByCodiceFiscale(cf: String): Tessere? = suspendTransaction {
// Cerca tessere in base al codice fiscale
TessereDao.find { TessereTable.codiceFiscale eq cf }
.singleOrNull() // Restituisce un singolo risultato o null se non trovato
?.let { tessereDaoToModel(it) } // Converte il DAO in un oggetto Tessere
override suspend fun update (tessera : Tessere): Tessere = suspendTransaction {
TessereTable.update({TessereTable.id eq tessera.id}){
it[saldo] = tessera.saldo
it[tsUltimoUtilizzo] = tessera.tsUltimoUtilizzo.toJavaLocalDateTime()
}
tessera
} }
} }

View File

@ -1,6 +1,7 @@
package eu.maiora.model package eu.maiora.model
import kotlinx.serialization.Serializable import kotlinx.serialization.Serializable
import kotlinx.serialization.Transient
@Serializable @Serializable
data class ViewPrenotazioniPasti( data class ViewPrenotazioniPasti(
@ -15,6 +16,8 @@ data class ViewPrenotazioniPasti(
val dataFine: String, val dataFine: String,
val dataLimiteCancellazione: String, val dataLimiteCancellazione: String,
val idVassoio: Long? = null, val idVassoio: Long? = null,
@Transient
val vassoio: String = "",
val codiceRistocloud: String? = null, val codiceRistocloud: String? = null,
val importoPagato: Double, val importoPagato: Double,
val puntoDistribuzione: String, val puntoDistribuzione: String,

View File

@ -0,0 +1,14 @@
package eu.maiora.model
import kotlinx.serialization.Serializable
import javax.management.monitor.StringMonitor
@Serializable
data class ViewTessereAPI(
val id: Long,
val idUtente : Long,
val codiceFiscale : String,
val numero : String,
val saldo : Double,
val punti : Int
)

View File

@ -0,0 +1,6 @@
package eu.maiora.model
interface ViewTessereAPIRepository {
suspend fun tesseraByCodiceFiscale(cf : String): ViewTessereAPI?
suspend fun tesseraById(id : Long): ViewTessereAPI?
}

View File

@ -0,0 +1,23 @@
package eu.maiora.model
import eu.maiora.db.*
import org.jetbrains.exposed.sql.update
import java.time.LocalDateTime
class ViewTessereAPIRepositoryImpl : ViewTessereAPIRepository {
override suspend fun tesseraByCodiceFiscale(cf: String): ViewTessereAPI? = suspendTransaction {
// Cerca tessere in base al codice fiscale
ViewTessereAPIDao.find { ViewTessereAPITable.codiceFiscale eq cf }
.singleOrNull() // Restituisce un singolo risultato o null se non trovato
?.let { viewTessereAPIDaoToModel(it) } // Converte il DAO in un oggetto ViewTessereAPI
}
override suspend fun tesseraById(id: Long): ViewTessereAPI? = suspendTransaction{
//Cerca tessera in base all'id
ViewTessereAPIDao.find{ViewTessereAPITable.id eq id}
.singleOrNull()
?.let{viewTessereAPIDaoToModel(it)}
}
}

View File

@ -13,7 +13,7 @@ fun Application.configureRouting() {
} }
auth(AccountsRepositoryImpl()) auth(AccountsRepositoryImpl())
tessere(TessereRepositoryImpl()) tessere(ViewTessereAPIRepositoryImpl())
movimenti(MovimentiRepositoryImpl()) movimenti(MovimentiRepositoryImpl())
composizioni(ComposizioniRepositoryImpl()) composizioni(ComposizioniRepositoryImpl())
valorePasti(ValorePastiRepositoryImpl()) valorePasti(ValorePastiRepositoryImpl())
@ -26,7 +26,11 @@ fun Application.configureRouting() {
SlotOrariRepositoryImpl(), SlotOrariRepositoryImpl(),
PrenotazioniPastiDettaglioRepositoryImpl(), PrenotazioniPastiDettaglioRepositoryImpl(),
ViewPrenotazioniPastiRepositoryImpl()) ViewPrenotazioniPastiRepositoryImpl())
annullaPrenotazioni(ViewPrenotazioniPastiRepositoryImpl(), PrenotazioniPastiDettaglioRepositoryImpl()) annullaPrenotazioni(ViewPrenotazioniPastiRepositoryImpl(),
PrenotazioniPastiDettaglioRepositoryImpl(),
TessereRepositoryImpl(),
ViewTessereAPIRepositoryImpl(),
DwhMovimentiRepositoryImpl())
verificaVassoio(SelezionaComposizioneRepositoryImpl()) verificaVassoio(SelezionaComposizioneRepositoryImpl())
} }
} }

View File

@ -6,14 +6,22 @@ import io.ktor.server.application.*
import io.ktor.server.auth.* import io.ktor.server.auth.*
import io.ktor.server.response.* import io.ktor.server.response.*
import io.ktor.server.routing.* import io.ktor.server.routing.*
import kotlinx.datetime.toJavaLocalDateTime import kotlinx.datetime.toKotlinLocalDate
import kotlinx.datetime.toKotlinLocalDateTime
import kotlinx.serialization.Serializable
import org.jetbrains.exposed.sql.transactions.TransactionManager
import org.jetbrains.exposed.sql.transactions.transaction
import java.time.LocalDate
import java.time.LocalDateTime import java.time.LocalDateTime
import java.time.format.DateTimeFormatter import java.time.format.DateTimeFormatter
fun Route.annullaPrenotazioni( fun Route.annullaPrenotazioni(
viewPrenotazioniPastiRepository: ViewPrenotazioniPastiRepositoryImpl, viewPrenotazioniPastiRepository: ViewPrenotazioniPastiRepositoryImpl,
prenotazioniPastiDettaglioRepository: PrenotazioniPastiDettaglioRepositoryImpl prenotazioniPastiDettaglioRepository: PrenotazioniPastiDettaglioRepositoryImpl,
tessereRepository: TessereRepositoryImpl,
viewTessereAPIRepository: ViewTessereAPIRepositoryImpl,
dwhMovimentiRepository: DwhMovimentiRepositoryImpl
) { ) {
route("/api/annullaPrenotazioni") { route("/api/annullaPrenotazioni") {
authenticate("auth-jwt") { authenticate("auth-jwt") {
@ -54,7 +62,56 @@ fun Route.annullaPrenotazioni(
val listaProdottiPrenotati = val listaProdottiPrenotati =
prenotazioniPastiDettaglioRepository.listaDettagliByIdPrenotazione(idPrenotazione.toLong()) prenotazioniPastiDettaglioRepository.listaDettagliByIdPrenotazione(idPrenotazione.toLong())
val tessera = viewTessereAPIRepository.tesseraById(prenotazione.idTessera)
if (tessera == null) {
call.respond(
HttpStatusCode.BadRequest,
"Prenotazione non annullata: tessera collegata alla prenotazione non trovata"
)
return@patch
}
//recupero i dati di tessera e utente
val datiUtenteTessera = transaction {
val query = """
SELECT u.cognome, u.nome, a.nome as azienda, cu.nome as categoria_utenti, f.nome as fascia
FROM tessere t
LEFT JOIN utenti u ON t.id_utente = u.id
LEFT JOIN categorie_utenti cu ON u.id_categoria = cu.id
LEFT JOIN aziende a ON cu.id_azienda = a.id
LEFT JOIN categorie_utenti_fasce cuf ON cuf.id_categoria_utenti = cu.id
LEFT JOIN fasce f ON cuf.id_fascia = f.id
WHERE t.id = ?
""".trimIndent()
val connection = TransactionManager.current().connection
val preparedStatement = connection.prepareStatement(query, true)
preparedStatement[1] = tessera.id
val rs = preparedStatement.executeQuery()
if (rs.next()) {
DatiUtenteTessera(
cognome = rs.getString("cognome"),
nome = rs.getString("nome"),
azienda = rs.getString("azienda"),
categoriaUtenti = rs.getString("categoria_utenti"),
fascia = rs.getString("fascia")
)
} else null
}
if (datiUtenteTessera == null) {
call.respond(
HttpStatusCode.BadRequest,
"Prenotazione non annullata: dati utente tessera non trovati"
)
return@patch
}
//aggiorna lo stato di ogni prodotto per annullare la prenotazione //aggiorna lo stato di ogni prodotto per annullare la prenotazione
try {
listaProdottiPrenotati.forEach { el -> listaProdottiPrenotati.forEach { el ->
val prodottoDaAggiornare = PrenotazioniPastiDettaglio( val prodottoDaAggiornare = PrenotazioniPastiDettaglio(
el.id, el.id,
@ -64,17 +121,84 @@ fun Route.annullaPrenotazioni(
) )
prenotazioniPastiDettaglioRepository.update(prodottoDaAggiornare) prenotazioniPastiDettaglioRepository.update(prodottoDaAggiornare)
} }
} catch (e: Exception) {
println("Annulamento prenotazione non completato. Errore durante l'update dei dettagli: ${e.message}")
call.respond(HttpStatusCode.InternalServerError, "Errore durante l'update dei dettagli: ${e.message}")
}
//effettuare l'aggiornamento del saldo della tessera
val nuovoSaldo = tessera.saldo.plus(prenotazione.importoPagato)
try {
tessereRepository.update(
Tessere(
tessera.id,
nuovoSaldo,
LocalDateTime.now().toKotlinLocalDateTime()
)
)
} catch (e: Exception) {
println("Annulamento prenotazione non completato. Errore durante l'update della tessera: ${e.message}")
call.respond(HttpStatusCode.InternalServerError, "Errore durante l'update della tessera: ${e.message}")
}
//effettuare l'inserimento del movimento di storno
try {
dwhMovimentiRepository.insert(
DwhMovimenti(
-1L,
tessera.id,
tessera.numero,
"Storno prenotazione pre pagata",
LocalDateTime.now().toKotlinLocalDateTime(),
prenotazione.id,
"App",
"0",
tessera.saldo,
prenotazione.importoPagato,
tessera.saldo + prenotazione.importoPagato,
tessera.punti.toLong(),
0,
tessera.punti.toLong() + 0,
0,
prenotazione.vassoio,
datiUtenteTessera.cognome,
datiUtenteTessera.nome,
tessera.codiceFiscale,
datiUtenteTessera.azienda,
datiUtenteTessera.categoriaUtenti,
datiUtenteTessera.fascia,
3, //Storno
LocalDate.now().toKotlinLocalDate(),
"Standard",
1
)
)
} catch (e: Exception) {
println("Annulamento prenotazione non completato. Errore durante l'insert del movimento: ${e.message}")
call.respond(HttpStatusCode.InternalServerError, "Errore durante l'insert del movimento: ${e.message}")
}
call.respond(HttpStatusCode.OK, "Prenotazione $idPrenotazione annullata") call.respond(HttpStatusCode.OK, "Prenotazione $idPrenotazione annullata")
} } catch (e: IllegalArgumentException) {
catch (e: IllegalArgumentException) {
call.respond(HttpStatusCode.NotFound, "Prenotazione non trovata: ${e.message}") call.respond(HttpStatusCode.NotFound, "Prenotazione non trovata: ${e.message}")
} } catch(e: Exception){
println("Annulamento prenotazione non completato. Errore generico: ${e.message}")
call.respond(HttpStatusCode.InternalServerError, "Errore generico: ${e.message}")
}
} }
} }
} }
}
}
@Serializable
data class DatiUtenteTessera(
val cognome: String,
val nome: String,
val azienda: String,
val categoriaUtenti: String,
val fascia: String
)

View File

@ -1,6 +1,6 @@
package eu.maiora.routes package eu.maiora.routes
import eu.maiora.model.TessereRepositoryImpl import eu.maiora.model.ViewTessereAPIRepositoryImpl
import io.ktor.http.* import io.ktor.http.*
import io.ktor.server.application.* import io.ktor.server.application.*
import io.ktor.server.auth.* import io.ktor.server.auth.*
@ -8,7 +8,7 @@ import io.ktor.server.response.*
import io.ktor.server.routing.* import io.ktor.server.routing.*
fun Route.tessere(tessereRepository: TessereRepositoryImpl){ fun Route.tessere(tessereRepository: ViewTessereAPIRepositoryImpl){
route("/api/tessere"){ route("/api/tessere"){
authenticate("auth-jwt") { authenticate("auth-jwt") {
get("{cf}"){ get("{cf}"){