[TASK] group reservations in log to avoid near-duplicates
This commit is contained in:
		| @@ -1,3 +1,5 @@ | ||||
| use std::collections::HashMap; | ||||
|  | ||||
| use crate::model::{boat::Boat, user::User}; | ||||
| use chrono::NaiveDate; | ||||
| use chrono::NaiveDateTime; | ||||
| @@ -24,7 +26,7 @@ pub struct BoatReservation { | ||||
| #[derive(FromRow, Debug, Serialize, Deserialize)] | ||||
| pub struct BoatReservationWithDetails { | ||||
|     #[serde(flatten)] | ||||
|     boat_reservation: BoatReservation, | ||||
|     reservation: BoatReservation, | ||||
|     boat: Boat, | ||||
|     user_applicant: User, | ||||
|     user_confirmation: Option<User>, | ||||
| @@ -84,7 +86,7 @@ WHERE end_date >= CURRENT_DATE ORDER BY end_date | ||||
|                 .unwrap(); | ||||
|  | ||||
|             res.push(BoatReservationWithDetails { | ||||
|                 boat_reservation: reservation, | ||||
|                 reservation, | ||||
|                 boat, | ||||
|                 user_applicant, | ||||
|                 user_confirmation, | ||||
| @@ -92,6 +94,31 @@ WHERE end_date >= CURRENT_DATE ORDER BY end_date | ||||
|         } | ||||
|         res | ||||
|     } | ||||
|     pub async fn all_future_with_groups( | ||||
|         db: &SqlitePool, | ||||
|     ) -> HashMap<String, Vec<BoatReservationWithDetails>> { | ||||
|         let mut grouped_reservations: HashMap<String, Vec<BoatReservationWithDetails>> = | ||||
|             HashMap::new(); | ||||
|  | ||||
|         let reservations = Self::all_future(db).await; | ||||
|         for reservation in reservations { | ||||
|             let key = format!( | ||||
|                 "{}-{}-{}-{}-{}", | ||||
|                 reservation.reservation.start_date, | ||||
|                 reservation.reservation.end_date, | ||||
|                 reservation.reservation.time_desc, | ||||
|                 reservation.reservation.usage, | ||||
|                 reservation.user_applicant.name | ||||
|             ); | ||||
|  | ||||
|             grouped_reservations | ||||
|                 .entry(key) | ||||
|                 .or_insert_with(Vec::new) | ||||
|                 .push(reservation); | ||||
|         } | ||||
|  | ||||
|         grouped_reservations | ||||
|     } | ||||
|  | ||||
|     pub async fn create( | ||||
|         db: &SqlitePool, | ||||
|   | ||||
| @@ -26,7 +26,7 @@ const REGULAR: i32 = 22000; | ||||
| const UNTERSTUETZEND: i32 = 2500; | ||||
| const FOERDERND: i32 = 8500; | ||||
|  | ||||
| #[derive(FromRow, Serialize, Deserialize, Clone, Debug)] | ||||
| #[derive(FromRow, Serialize, Deserialize, Clone, Debug, Eq, Hash)] | ||||
| pub struct User { | ||||
|     pub id: i64, | ||||
|     pub name: String, | ||||
|   | ||||
| @@ -78,7 +78,10 @@ async fn index( | ||||
|     } | ||||
|  | ||||
|     context.insert("boats", &boats); | ||||
|     context.insert("reservations", &BoatReservation::all_future(db).await); | ||||
|     context.insert( | ||||
|         "reservations", | ||||
|         &BoatReservation::all_future_with_groups(db).await, | ||||
|     ); | ||||
|     context.insert("coxes", &coxes); | ||||
|     context.insert("users", &users); | ||||
|     context.insert("logtypes", &logtypes); | ||||
| @@ -169,7 +172,10 @@ async fn kiosk( | ||||
|     } | ||||
|  | ||||
|     context.insert("boats", &boats); | ||||
|     context.insert("reservations", &BoatReservation::all_future(db).await); | ||||
|     context.insert( | ||||
|         "reservations", | ||||
|         &BoatReservation::all_future_with_groups(db).await, | ||||
|     ); | ||||
|     context.insert("coxes", &coxes); | ||||
|     context.insert("users", &users); | ||||
|     context.insert("logtypes", &logtypes); | ||||
|   | ||||
| @@ -2,7 +2,8 @@ | ||||
|     <div class="bg-white dark:bg-primary-900 rounded-md shadow pb-2 mt-3"> | ||||
|         <h2 class="h2">Reservierungen ({{ reservations | length }})</h2> | ||||
|         <div class="grid grid-cols-1 gap-3 mb-3 w-full"> | ||||
|             {% for reservation in reservations %} | ||||
|             {% for _, reservations_for_event in reservations %} | ||||
|                 {% set reservation = reservations_for_event[0] %} | ||||
|                 <div class="pt-2 px-3 border-t text-primary-900 dark:text-white"> | ||||
|                     <strong class="block"> | ||||
|                         {{ reservation.start_date | date(format="%d.%m.%Y") }} | ||||
| @@ -13,7 +14,10 @@ | ||||
|                         <small>({{ reservation.time_desc }})</small> | ||||
|                     </strong> | ||||
|                     <span class="block"> | ||||
|                         {{ reservation.boat.name }} | ||||
|                         {% for reservation in reservations_for_event %} | ||||
|                             {{ reservation.boat.name }} | ||||
|                             {% if not loop.last %}+{% endif %} | ||||
|                         {% endfor %} | ||||
|                         <small>({{ reservation.user_applicant.name }})</small> | ||||
|                     </span> | ||||
|                     <span class="text-sm italic">{{ reservation.usage }}</span> | ||||
|   | ||||
		Reference in New Issue
	
	Block a user