diff --git a/src/model/boatdamage.rs b/src/model/boatdamage.rs index 3f6c742..a12de47 100644 --- a/src/model/boatdamage.rs +++ b/src/model/boatdamage.rs @@ -271,6 +271,52 @@ ORDER BY created_at DESC Ok(()) } + pub async fn unfix(&self, db: &SqlitePool, tech_user: &User) -> Result<(), String> { + if self.user_id_verified.is_some() { + return Err("Reparatur wurde bereits verifiziert und kann nicht mehr rückgängig gemacht werden.".into()); + } + if self.user_id_fixed.is_none() { + return Err("Reparatur wurde noch nicht eingetragen.".into()); + } + + let boat = Boat::find_by_id(db, self.boat_id as i32) + .await + .ok_or("Boot gibt's ned")?; + + Log::create( + db, + format!("Unfix boat damage id={} by user {:?}", self.id, tech_user), + ) + .await; + + sqlx::query!( + "UPDATE boat_damage SET user_id_fixed=NULL, fixed_at=NULL WHERE id=?", + self.id + ) + .execute(db) + .await + .map_err(|e| e.to_string())?; + + let technicals = + User::all_with_role(db, &Role::find_by_name(db, "tech").await.unwrap()).await; + for technical in technicals { + Notification::create( + db, + &technical, + &format!( + "{} hat die Reparatur des Bootschadens '{}' beim Boot '{}' als fehlerhaft eingetragen zurückgesetzt.", + tech_user.name, self.desc, boat.name, + ), + "Bootsschaden-Reparatur rückgängig gemacht", + None, + None, + ) + .await; + } + + Ok(()) + } + pub async fn verified( &self, db: &SqlitePool, diff --git a/src/tera/boatdamage.rs b/src/tera/boatdamage.rs index 2fcc368..323a2d4 100644 --- a/src/tera/boatdamage.rs +++ b/src/tera/boatdamage.rs @@ -152,6 +152,25 @@ pub struct FormBoatDamageVerified<'r> { desc: &'r str, } +#[post("//unfix")] +async fn unfix( + db: &State, + boatdamage_id: i32, + techuser: TechUser, +) -> Flash { + let Some(boatdamage) = BoatDamage::find_by_id(db, boatdamage_id).await else { + return Flash::error(Redirect::to("/boatdamage"), "Bootsschaden nicht gefunden."); + }; + let user: User = techuser.into_inner(); + match boatdamage.unfix(db, &user).await { + Ok(_) => Flash::success( + Redirect::to("/boatdamage"), + "Reparatur wurde zurückgesetzt.", + ), + Err(e) => Flash::error(Redirect::to("/boatdamage"), format!("Fehler: {e}")), + } +} + #[post("//verified", data = "")] async fn verified<'r>( db: &State, @@ -176,6 +195,7 @@ pub fn routes() -> Vec { index_kiosk, create, fixed, + unfix, verified, create_from_kiosk ] diff --git a/templates/boatdamages.html.tera b/templates/boatdamages.html.tera index 63751d1..7b4b6c6 100644 --- a/templates/boatdamages.html.tera +++ b/templates/boatdamages.html.tera @@ -55,6 +55,13 @@ {% if boatdamage.fixed_at %} Repariert von {{ boatdamage.user_fixed.name }} am/um {{ boatdamage.fixed_at | date(format='%d.%m.%Y (%H:%M)') }} + {% if loggedin_user and "tech" in loggedin_user.roles and not boatdamage.verified_at %} +
+ +
+ {% endif %} {% else %} {% if loggedin_user and loggedin_user.allowed_to_steer %}