use super::foerdernd::FoerderndUser; use super::regular::RegularUser; use super::scheckbuch::ScheckbuchUser; use super::unterstuetzend::UnterstuetzendUser; use super::{ManageUserUser, User}; use crate::model::role::Role; use crate::NonEmptyString; use crate::{ model::{mail::Mail, notification::Notification}, special_user, }; use chrono::NaiveDate; use rocket::async_trait; use rocket::fs::TempFile; use sqlx::SqlitePool; special_user!(SchnupperantUser, +"schnupperant"); impl SchnupperantUser { async fn set_data_for_clubmember( &self, db: &SqlitePool, changed_by: &ManageUserUser, member_since: &NaiveDate, birthdate: &NaiveDate, phone: NonEmptyString, address: NonEmptyString, membership_pdf: &TempFile<'_>, ) -> Result<(), String> { 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 .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, "schnupperant").await.unwrap(); self.user.remove_role(db, changed_by, &scheckbook).await?; self.user.add_role(db, changed_by, ®ular).await?; // Notify let regular = RegularUser::new(db, &self.user).await.unwrap(); regular.send_welcome_mail_to_user(db, smtp_pw).await?; Notification::create_for_steering_people( db, &format!( "Liebe Steuerberechtigte, {} nahm an unserem Schnupperkurs teil und ist nun seit {} ein neues reguläres Mitglied. 🎉", self.name, self.member_since_date.clone().unwrap() ), "Neues Vereinsmitglied", None, None, ) .await; Ok(()) } pub(crate) async fn move_to_scheckbook( self, db: &SqlitePool, changed_by: &ManageUserUser, smtp_pw: &str, ) -> Result<(), String> { let schnupperant = Role::find_by_name(db, "schnupperant").await.unwrap(); let scheckbook = Role::find_by_name(db, "scheckbuch").await.unwrap(); self.user.remove_role(db, changed_by, &schnupperant).await?; self.user.add_role(db, changed_by, &scheckbook).await?; let scheckbook = ScheckbuchUser::new(db, &self.user).await.unwrap(); scheckbook.send_welcome_mail_to_user(db, smtp_pw).await?; Notification::create_for_steering_people( db, &format!( "Liebe Steuerberechtigte, {} hat unseren Schnupperkurs absolviert und nun ein Scheckbuch. Wie immer, freuen wir uns wenn du uns beim A+F Rudern unterstützt oder selber Ausfahrten ausschreibst. Bitte beachte, dass Scheckbuch-Personen nur Ausfahrten sehen, bei denen 'Scheckbuch-Anmeldungen erlauben' ausgewählt wurde.", self.name ), "Neues Scheckbuch", None,None ) .await; Ok(()) } pub(crate) async fn convert_to_unterstuetzend_user( self, db: &SqlitePool, smtp_pw: &str, 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, "schnupperant").await.unwrap(); self.user.remove_role(db, changed_by, &scheckbook).await?; self.user.add_role(db, changed_by, &unterstuetzend).await?; let unterstuetzend = UnterstuetzendUser::new(db, &self.user).await.unwrap(); unterstuetzend .send_welcome_mail_to_user(db, smtp_pw) .await?; if let Some(vorstand) = Role::find_by_name(db, "vorstand").await { Notification::create_for_role( db, &vorstand, &format!( "Lieber Vorstand, {} nahm am Schnupperkurs teil 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, smtp_pw: &str, 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, "schnupperant").await.unwrap(); self.user.remove_role(db, changed_by, &scheckbook).await?; self.user.add_role(db, changed_by, &unterstuetzend).await?; let foerdernd = FoerderndUser::new(db, &self.user).await.unwrap(); foerdernd.send_welcome_mail_to_user(db, smtp_pw).await?; if let Some(vorstand) = Role::find_by_name(db, "vorstand").await { Notification::create_for_role( db, &vorstand, &format!( "Lieber Vorstand, {} nahm am Schnupperkurs teil 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(()) } // TODO: make private pub(crate) async fn notify( &self, db: &SqlitePool, mail: &str, smtp_pw: &str, ) -> Result<(), String> { self.notify_coxes_about_new_scheckbuch(db).await; self.send_welcome_mail_to_user(db, mail, smtp_pw).await?; Ok(()) } async fn send_welcome_mail_to_user( &self, db: &SqlitePool, mail: &str, smtp_pw: &str, ) -> Result<(), String> { Mail::send_single( db, mail, "ASKÖ Ruderverein Donau Linz | Dein Scheckbuch wartet auf Dich", format!( "Hallo {0}, es freut uns sehr, dich bei unserem Schnupperkurs willkommen heißen zu dürfen. Detaillierte Informationen folgen noch, ich werde sie dir ein paar Tage vor dem Termin zusenden. Riemen- & Dollenbruch, ASKÖ Ruderverein Donau Linz", self.name), smtp_pw, ).await?; Ok(()) } async fn notify_coxes_about_new_scheckbuch(&self, db: &SqlitePool) { if let Some(role) = Role::find_by_name(db, "schnupper-betreuer").await { Notification::create_for_role( db, &role, &format!( "Lieber Schnupperbetreuer, {} hat sich zum Schnupperkurs angemeldet.", self.name ), "Neuer Schnupperant", None, None, ) .await; } } }