diff --git a/src/model/user/foerdernd.rs b/src/model/user/foerdernd.rs new file mode 100644 index 0000000..de557b8 --- /dev/null +++ b/src/model/user/foerdernd.rs @@ -0,0 +1,73 @@ +use super::User; +use crate::{ + model::{mail::Mail, notification::Notification}, + special_user, +}; +use rocket::async_trait; +use sqlx::SqlitePool; + +special_user!(RegularUser, +"Donau Linz", -"Unterstützend", -"Förderndes Mitglied"); + +impl RegularUser { + pub(crate) async fn notify(&self, db: &SqlitePool, smtp_pw: &str) -> Result<(), String> { + self.notify_coxes_about_new_regular(db).await; + self.send_welcome_mail_to_user(db, smtp_pw).await?; + + Ok(()) + } + + async fn send_welcome_mail_to_user( + &self, + db: &SqlitePool, + smtp_pw: &str, + ) -> Result<(), String> { + let Some(mail) = &self.mail else { + return Err(format!( + "Couldn't send welcome mail, as the user {self} has no mail..." + )); + }; + + Mail::send_single( + db, + mail, + "Willkommen im ASKÖ Ruderverein Donau Linz!", + format!( +"Hallo {0}, + +herzlich willkommen im ASKÖ Ruderverein Donau Linz! Wir freuen uns sehr, dich als neues Mitglied in unserem Verein begrüßen zu dürfen. + +Um dir den Einstieg zu erleichtern, findest du in unserem Handbuch alle wichtigen Informationen über unseren Verein: https://rudernlinz.at/book. Bei weiteren Fragen stehen dir die Adressen info@rudernlinz.at (für allgemeine Fragen) und it@rudernlinz.at (bei technischen Fragen) jederzeit zur Verfügung. + +Du kannst auch gerne unserer Signal-Gruppe beitreten, um auf dem Laufenden zu bleiben und dich mit anderen Mitgliedern auszutauschen: https://signal.group/#CjQKICFrq6zSsRHxrucS3jEcQn6lknEXacAykwwLV3vNLKxPEhA17jxz7cpjfu3JZokLq1TH + +Für die Organisation unserer Ausfahrten nutzen wir app.rudernlinz.at. Logge dich einfach mit deinem Namen ('{0}' ohne Anführungszeichen) ein, beim ersten Mal kannst du das Passwortfeld leer lassen. Unter 'Geplante Ausfahrten' kannst du dich jederzeit zu den Ausfahrten anmelden. + +Beim nächsten Treffen im Verein, erinnere jemand vom Vorstand (https://rudernlinz.at/unser-verein/vorstand/) bitte daran, deinen Fingerabdruck zu registrieren, damit du Zugang zum Bootshaus erhältst. + +Damit du dich noch mehr verbunden fühlst (:-)), haben wir im Bootshaus ein WLAN für Vereinsmitglieder 'ASKÖ Ruderverein Donau Linz' eingerichtet. Das Passwort dafür lautet 'donau1921' (ohne Anführungszeichen). Bitte gib das Passwort an keine vereinsfremden Personen weiter. + +Wir freuen uns darauf, dich bald am Wasser zu sehen und gemeinsam tolle Erfahrungen zu sammeln! + +Riemen- & Dollenbruch +ASKÖ Ruderverein Donau Linz", self.name), + smtp_pw, + ).await?; + + Ok(()) + } + + async fn notify_coxes_about_new_regular(&self, db: &SqlitePool) { + Notification::create_for_steering_people( + db, + &format!( + "Liebe Steuerberechtigte, seit {} gibt es ein neues Mitglied: {}", + self.member_since_date.clone().unwrap(), + self.name + ), + "Neues Vereinsmitglied", + None, + None, + ) + .await; + } +} diff --git a/src/model/user/regular.rs b/src/model/user/regular.rs index de557b8..d6b3123 100644 --- a/src/model/user/regular.rs +++ b/src/model/user/regular.rs @@ -6,17 +6,10 @@ use crate::{ use rocket::async_trait; use sqlx::SqlitePool; -special_user!(RegularUser, +"Donau Linz", -"Unterstützend", -"Förderndes Mitglied"); +special_user!(RegularUser, +"Donau Linz"); impl RegularUser { - pub(crate) async fn notify(&self, db: &SqlitePool, smtp_pw: &str) -> Result<(), String> { - self.notify_coxes_about_new_regular(db).await; - self.send_welcome_mail_to_user(db, smtp_pw).await?; - - Ok(()) - } - - async fn send_welcome_mail_to_user( + pub(crate) async fn send_welcome_mail_to_user( &self, db: &SqlitePool, smtp_pw: &str, @@ -56,18 +49,5 @@ ASKÖ Ruderverein Donau Linz", self.name), Ok(()) } - async fn notify_coxes_about_new_regular(&self, db: &SqlitePool) { - Notification::create_for_steering_people( - db, - &format!( - "Liebe Steuerberechtigte, seit {} gibt es ein neues Mitglied: {}", - self.member_since_date.clone().unwrap(), - self.name - ), - "Neues Vereinsmitglied", - None, - None, - ) - .await; - } + async fn notify_coxes_about_new_regular(&self, db: &SqlitePool) {} } diff --git a/src/model/user/scheckbuch.rs b/src/model/user/scheckbuch.rs index 9273eb5..364c47f 100644 --- a/src/model/user/scheckbuch.rs +++ b/src/model/user/scheckbuch.rs @@ -14,10 +14,9 @@ use sqlx::SqlitePool; special_user!(ScheckbuchUser, +"scheckbuch"); impl ScheckbuchUser { - pub(crate) async fn convert_to_regular_user( - self, + async fn set_data_for_clubmember( + &self, db: &SqlitePool, - smtp_pw: &str, changed_by: &ManageUserUser, member_since: &NaiveDate, birthdate: &NaiveDate, @@ -25,7 +24,6 @@ impl ScheckbuchUser { address: NonEmptyString, 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) @@ -37,6 +35,30 @@ impl ScheckbuchUser { .add_membership_pdf(db, changed_by, membership_pdf) .await?; + Ok(()) + } + pub(crate) async fn convert_to_regular_user( + self, + db: &SqlitePool, + smtp_pw: &str, + changed_by: &ManageUserUser, + member_since: &NaiveDate, + birthdate: &NaiveDate, + phone: NonEmptyString, + address: NonEmptyString, + membership_pdf: &TempFile<'_>, + ) -> Result<(), String> { + self.set_data_for_clubmember( + db, + changed_by, + member_since, + birthdate, + phone, + address, + 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(); @@ -45,7 +67,113 @@ impl ScheckbuchUser { // Notify let regular = RegularUser::new(db, &self.user).await.unwrap(); - regular.notify(db, smtp_pw).await?; + regular.send_welcome_mail_to_user(db, smtp_pw).await?; + Notification::create_for_steering_people( + db, + &format!( + "Liebe Steuerberechtigte, {} hatte ein Scheckbuch und ist nun seit {} es ein neues reguläres Mitglied. 🎉", + self.name, + self.member_since_date.clone().unwrap() + ), + "Neues Vereinsmitglied", + None, + None, + ) + .await; + + Ok(()) + } + + pub(crate) async fn convert_to_unterstuetzend_user( + self, + db: &SqlitePool, + changed_by: &ManageUserUser, + member_since: &NaiveDate, + birthdate: &NaiveDate, + phone: NonEmptyString, + address: NonEmptyString, + membership_pdf: &TempFile<'_>, + ) -> Result<(), String> { + // Set data + self.set_data_for_clubmember( + db, + changed_by, + member_since, + birthdate, + phone, + address, + membership_pdf, + ) + .await?; + + // Change roles + let unterstuetzend = Role::find_by_name(db, "Unterstützend").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, &unterstuetzend).await?; + + if let Some(vorstand) = Role::find_by_name(db, "vorstand").await { + Notification::create_for_role( + db, + &vorstand, + &format!( + "Lieber Vorstand, {} hatte ein Scheckbuch und ist nun seit {} es ein neues unterstützendes Mitglied.", + self.name, + self.member_since_date.clone().unwrap() + ), + "Neues unterstützendes Vereinsmitglied", + None, + None, + ) + .await; + } + + Ok(()) + } + + pub(crate) async fn convert_to_foerdernd_user( + self, + db: &SqlitePool, + changed_by: &ManageUserUser, + member_since: &NaiveDate, + birthdate: &NaiveDate, + phone: NonEmptyString, + address: NonEmptyString, + membership_pdf: &TempFile<'_>, + ) -> Result<(), String> { + // Set data + self.set_data_for_clubmember( + db, + changed_by, + member_since, + birthdate, + phone, + address, + membership_pdf, + ) + .await?; + + // Change roles + let unterstuetzend = Role::find_by_name(db, "Förderndes Mitglied").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, &unterstuetzend).await?; + + if let Some(vorstand) = Role::find_by_name(db, "vorstand").await { + Notification::create_for_role( + db, + &vorstand, + &format!( + "Lieber Vorstand, {} hatte ein Scheckbuch und ist nun seit {} es ein neues förderndes Mitglied.", + self.name, + self.member_since_date.clone().unwrap() + ), + "Neues förderndes Vereinsmitglied", + None, + None, + ) + .await; + } Ok(()) } diff --git a/src/model/user/unterstuetzend.rs b/src/model/user/unterstuetzend.rs new file mode 100644 index 0000000..b0f0980 --- /dev/null +++ b/src/model/user/unterstuetzend.rs @@ -0,0 +1,31 @@ +use super::User; +use crate::{ + model::{mail::Mail, notification::Notification}, + special_user, +}; +use rocket::async_trait; +use sqlx::SqlitePool; + +special_user!(UnterstuetzendUser, +"Unterstützend"); + +impl UnterstuetzendUser { + pub(crate) async fn notify(&self, db: &SqlitePool, smtp_pw: &str) -> Result<(), String> { + self.notify_coxes_about_new_unterstuetzend(db).await; + + Ok(()) + } + + async fn notify_vorstand_about_new_unterstuetzend(&self, db: &SqlitePool) { + Notification::create_for_steering_people( + db, + &format!( + "Lieber Vorstand, es gibt ein neues unterstützendes Mitglied: {}", + self.name + ), + "Neues unterstützendes Vereinsmitglied", + None, + None, + ) + .await; + } +} diff --git a/src/tera/admin/user.rs b/src/tera/admin/user.rs index 6b853ba..cd94675 100644 --- a/src/tera/admin/user.rs +++ b/src/tera/admin/user.rs @@ -816,6 +816,7 @@ struct UserAddScheckbuchForm<'r> { #[derive(FromForm, Debug)] pub struct ScheckToRegularForm<'a> { + membertype: String, member_since: String, birthdate: String, phone: String, @@ -875,20 +876,53 @@ async fn scheckbook_to_regular( "Vereinsmitglied braucht eine Adresse", ); }; + let response = match &*data.membertype { + "regular" => { + user.convert_to_regular_user( + db, + &config.smtp_pw, + &admin, + &member_since, + &birthdate, + phone, + address, + &data.membership_pdf, + ) + .await + } + "unterstuetzend" => { + user.convert_to_unterstuetzend_user( + db, + &admin, + &member_since, + &birthdate, + phone, + address, + &data.membership_pdf, + ) + .await + } + "foerdernd" => { + user.convert_to_foerdernd_user( + db, + &admin, + &member_since, + &birthdate, + phone, + address, + &data.membership_pdf, + ) + .await + } + _ => { + return Flash::error( + Redirect::to(format!("/admin/user/{id}")), + "Membertype gibts ned", + ) + } + }; - match user - .convert_to_regular_user( - db, - &config.smtp_pw, - &admin, - &member_since, - &birthdate, - phone, - address, - &data.membership_pdf, - ) - .await - { + match response { Ok(_) => Flash::success( Redirect::to(format!("/admin/user/{}", id)), "Mitgliedstyp umgewandelt und Infos versendet",