forked from maiora/backend-api
0002650-endpoint-annullaPrenotazioni-modifiche-richieste #25
@ -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,
|
||||||
|
38
src/main/kotlin/eu/maiora/model/DwhMovimenti.kt
Normal file
38
src/main/kotlin/eu/maiora/model/DwhMovimenti.kt
Normal 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
|
||||||
|
|
||||||
|
)
|
@ -0,0 +1,5 @@
|
|||||||
|
package eu.maiora.model
|
||||||
|
|
||||||
|
interface DwhMovimentiRepository {
|
||||||
|
suspend fun insert(movimento : DwhMovimenti): DwhMovimenti
|
||||||
|
}
|
@ -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
|
||||||
|
)
|
||||||
|
}
|
||||||
|
}
|
@ -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
|
||||||
)
|
)
|
@ -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
|
||||||
}
|
}
|
@ -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
|
||||||
}
|
}
|
||||||
}
|
}
|
@ -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,
|
||||||
|
14
src/main/kotlin/eu/maiora/model/ViewTessereAPI.kt
Normal file
14
src/main/kotlin/eu/maiora/model/ViewTessereAPI.kt
Normal 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
|
||||||
|
)
|
@ -0,0 +1,6 @@
|
|||||||
|
package eu.maiora.model
|
||||||
|
|
||||||
|
interface ViewTessereAPIRepository {
|
||||||
|
suspend fun tesseraByCodiceFiscale(cf : String): ViewTessereAPI?
|
||||||
|
suspend fun tesseraById(id : Long): ViewTessereAPI?
|
||||||
|
}
|
@ -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)}
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
@ -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())
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -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
|
||||||
|
)
|
@ -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}"){
|
||||||
|
Loading…
Reference in New Issue
Block a user