diff --git a/src/model/user/member.rs b/src/model/user/member.rs index 9161ac6..faebd87 100644 --- a/src/model/user/member.rs +++ b/src/model/user/member.rs @@ -1,6 +1,7 @@ use super::ScheckbuchUser; use crate::model::{ logbook::{Logbook, LogbookWithBoatAndRowers}, + role::Role, user::User, }; use serde::{Deserialize, Serialize}; diff --git a/src/model/user/mod.rs b/src/model/user/mod.rs index 8ca32b8..ba89924 100644 --- a/src/model/user/mod.rs +++ b/src/model/user/mod.rs @@ -35,7 +35,7 @@ use scheckbuch::ScheckbuchUser; mod basic; mod fee; pub(crate) mod member; -mod scheckbuch; +pub(crate) mod scheckbuch; #[derive(FromRow, Serialize, Deserialize, Clone, Debug, Eq, Hash, PartialEq)] pub struct User { diff --git a/src/model/user/scheckbuch.rs b/src/model/user/scheckbuch.rs index 2521eef..9a66521 100644 --- a/src/model/user/scheckbuch.rs +++ b/src/model/user/scheckbuch.rs @@ -1,10 +1,15 @@ -use super::User; +use super::member::Member; +use super::{ManageUserUser, User}; +use crate::model::role::Role; use crate::model::user::LoginError; +use crate::tera::admin::user::ScheckToRegularForm; use crate::{ model::{mail::Mail, notification::Notification}, special_user, SCHECKBUCH, }; +use chrono::NaiveDate; use rocket::async_trait; +use rocket::fs::TempFile; use rocket::http::Status; use rocket::request; use rocket::request::FromRequest; @@ -16,10 +21,39 @@ use std::ops::Deref; special_user!(ScheckbuchUser, +"scheckbuch"); impl ScheckbuchUser { + pub(crate) async fn convert_to_regular_user( + self, + db: &SqlitePool, + changed_by: &ManageUserUser, + member_since: &NaiveDate, + birthdate: &NaiveDate, + phone: &str, + address: &str, + membership_pdf: &TempFile<'_>, + ) -> Result<(), String> { + // Set data + self.user.update_birthdate(db, changed_by, birthdate).await; + self.user + .update_member_since(db, changed_by, member_since) + .await; + self.user.update_phone(db, changed_by, phone).await?; + self.user.update_address(db, changed_by, address).await?; + self.user.update_address(db, changed_by, address).await?; + self.user + .add_membership_pdf(db, changed_by, membership_pdf) + .await?; + + // Change roles + let regular = Role::find_by_name(db, "Donau Linz").await.unwrap(); + let scheckbook = Role::find_by_name(db, "scheckbuch").await.unwrap(); + self.user.remove_role(db, changed_by, &scheckbook).await?; + self.user.add_role(db, changed_by, ®ular).await?; + + // Notify + todo!() // Continue here + } + //async fn from(user: User, db: &SqlitePool, mail: &str, smtp_pw: &str) -> Result<(), String> { - // // TODO: see when/how to invoke this function (explicit `Neue Person hinzufügen` button? - // // Button to transition existing users to scheckbuch? Automatically called when - // // `scheckbuch` is newly selected as role? // if user.has_role(db, "scheckbuch").await { // return Err("User is already a scheckbuch".into()); // } diff --git a/src/tera/admin/user.rs b/src/tera/admin/user.rs index 42b40f0..6c89e0e 100644 --- a/src/tera/admin/user.rs +++ b/src/tera/admin/user.rs @@ -7,8 +7,9 @@ use crate::{ logbook::Logbook, role::Role, user::{ - member::Member, AdminUser, AllowedToEditPaymentStatusUser, ManageUserUser, User, - UserWithDetails, UserWithMembershipPdf, UserWithRolesAndMembershipPdf, VorstandUser, + member::Member, scheckbuch::ScheckbuchUser, AdminUser, AllowedToEditPaymentStatusUser, + ManageUserUser, User, UserWithDetails, UserWithMembershipPdf, + UserWithRolesAndMembershipPdf, VorstandUser, }, }, tera::Config, @@ -813,6 +814,68 @@ struct UserAddScheckbuchForm<'r> { // Flash::success(Redirect::to("/admin/schnupper"), format!("Scheckbuch erfolgreich erstellt. Eine E-Mail in der alles erklärt wird, wurde an {} verschickt.", user.mail.unwrap())) //} +#[derive(FromForm, Debug)] +pub struct ScheckToRegularForm<'a> { + member_since: String, + birthdate: String, + phone: String, + address: String, + membership_pdf: TempFile<'a>, +} + +#[post("/user//scheckbook-to-regular", data = "")] +async fn scheckbook_to_regular( + db: &State, + data: Form>, + admin: ManageUserUser, + id: i32, +) -> Flash { + let Some(user) = User::find_by_id(db, id).await else { + return Flash::error( + Redirect::to("/admin/user"), + format!("User with ID {} does not exist!", id), + ); + }; + let Ok(birthdate) = NaiveDate::parse_from_str(&data.birthdate, "%Y-%m-%d") else { + return Flash::error( + Redirect::to("/admin/user/{id}"), + format!("Datum {} ist nicht im YYYY-MM-DD Format", &data.birthdate), + ); + }; + let Ok(member_since) = NaiveDate::parse_from_str(&data.member_since, "%Y-%m-%d") else { + return Flash::error( + Redirect::to("/admin/user/{id}"), + format!("Datum {} ist nicht im YYYY-MM-DD Format", &data.birthdate), + ); + }; + + let Some(user) = ScheckbuchUser::new(db, &user).await else { + return Flash::error( + Redirect::to("/admin/user/{id}"), + "User ist kein Scheckbuchuser", + ); + }; + + match user + .convert_to_regular_user( + db, + &admin, + &member_since, + &birthdate, + &data.phone, + &data.address, + &data.membership_pdf, + ) + .await + { + Ok(_) => Flash::success( + Redirect::to(format!("/admin/user/{}", id)), + "Mitgliedstyp umgewandelt und Infos versendet", + ), + Err(e) => Flash::error(Redirect::to(format!("/admin/user/{}", id)), e), + } +} + pub fn routes() -> Vec { routes![ index, @@ -840,5 +903,7 @@ pub fn routes() -> Vec { add_membership_pdf, add_role, remove_role, + // + scheckbook_to_regular, ] } diff --git a/templates/admin/user/view.html.tera b/templates/admin/user/view.html.tera index 9a32444..64b2c4b 100644 --- a/templates/admin/user/view.html.tera +++ b/templates/admin/user/view.html.tera @@ -209,7 +209,7 @@ ⚠️ Aktuell gibt's keine Beitrittserklärung 😢 {% if allowed_to_edit %} Das kannst du hier ändern ⤵️ -
+
{{ macros::input(label='Neue Beitrittserklärung hochladen', name='membership_pdf', type="file", accept='application/pdf') }} @@ -252,6 +252,19 @@ {{ log::show_old(log=log, state="completed", only_ones=false, index=loop.index, allowed_to_edit=false) }} {% endfor %} +
+ Zu reguläres Vereinsmitglied umwandeln + + {{ macros::input(label='Mitglied seit', name='member_since', type="date", value=now() | date()) }} + {{ macros::input(label='Geburtsdatum', name='birthdate', type="date", value=user.birthdate) }} + {{ macros::input(label='Telefonnummer', name='phone', type="text", value=user.phone) }} + {{ macros::input(label='Adresse', name='address', type="text", value=user.address) }} + {{ macros::input(label='Beitrittserklärung', name='membership_pdf', type="file", accept='application/pdf') }} + + +
+ + {% elif "Regular" in member %} ist ein reguläres Vereinsmitglied. {% elif "Foerdernd" in member %}