diff --git a/code/src/app.rs b/code/src/app.rs index f5ca150..1683f87 100644 --- a/code/src/app.rs +++ b/code/src/app.rs @@ -255,6 +255,12 @@ impl Default for MainTabViewer { } } impl MainTabViewer { + fn update_salary(&mut self) { + self.salaries = Arc::new(RwLock::new( + self.rt + .block_on(async { self.db_oper.get_salaries().await.unwrap() }), + )); + } fn new(is_admin: bool) -> Self { Self { is_admin, @@ -287,6 +293,7 @@ impl MainTabViewer { let mut table = TableBuilder::new(ui) .striped(true) .resizable(false) + .vscroll(false) .cell_layout(egui::Layout::left_to_right(egui::Align::Center)) .column(Column::auto()) .column(Column::auto()) @@ -512,6 +519,7 @@ impl MainTabViewer { .striped(true) .columns(Column::auto(), 5) .sense(egui::Sense::click()) + .vscroll(false) .header(30.0, |mut header| { header.col(|ui| { ui.heading("Имя сотрудника"); @@ -529,7 +537,7 @@ impl MainTabViewer { .body(|mut body| { body.ui_mut().style_mut().interaction.selectable_labels = false; for sal in (self.salaries.read().iter().clone()) { - body.row(20.0, |mut row| { + body.row(25.0, |mut row| { row.col(|ui| { ui.label(&sal.worker.full_name); }); @@ -540,7 +548,8 @@ impl MainTabViewer { ui.label(&sal.salary_date.date_naive().to_string()); }); row.col(|ui| { - ui.label(&sal.comment); + let text: String = sal.comment.chars().take(15).collect(); + ui.label(text); }); row.col(|ui| { if ui.button("Удалить").clicked() { @@ -553,9 +562,10 @@ impl MainTabViewer { self.salary_modal_state .data .insert("salary_size".to_owned(), sal.salary_size.to_string()); - self.salary_modal_state - .data - .insert("salary_date".to_owned(), sal.salary_date.to_string()); + self.salary_modal_state.data.insert( + "salary_date".to_owned(), + sal.salary_date.date_naive().to_string(), + ); self.salary_modal_state .data .insert("comment".to_owned(), sal.comment.clone()); @@ -639,28 +649,147 @@ impl MainTabViewer { size, egui::TextEdit::singleline( self.salary_modal_state.data.get_mut("salary_date").unwrap(), - ), + ) + .hint_text("1970-01-01"), ); ui.end_row(); ui.label("Примечание:"); - ui.add_sized(size, - egui::TextEdit::singleline(self.salary_modal_state.data.get_mut("comment").unwrap())); + ui.add_sized( + size, + egui::TextEdit::multiline( + self.salary_modal_state.data.get_mut("comment").unwrap(), + ), + ); ui.end_row(); }); - - }else{ - let wname = self.workers.read().clone().iter().find(|w| w.id.to_string() == self.salary_modal_state.data.get("worker_id").unwrap()).unwrap().full_name; + } else { + let wname = self + .workers + .read() + .clone() + .iter() + .find(|w| { + &w.id.to_string() + == self.salary_modal_state.data.get("worker_id").unwrap() + }) + .unwrap() + .full_name + .clone(); ui.label("Вы уверены, что хотите удалить запись о выплате:"); - ui.label(format!("{}: {} | ${}", self.salary_modal_state.data.get("salary_date").unwrap(), wname, self.salary_modal_state.data.get("salary_size").unwrap())); + ui.label(format!( + "{}: {} | ${}", + self.salary_modal_state.data.get("salary_date").unwrap(), + wname, + self.salary_modal_state.data.get("salary_size").unwrap() + )); } - let btext = match self.salary_modal_state.status{ - ModalStatus::Add => "Добавить", - ModalStatus::Edit => "Сохранить", - ModalStatus::Remove => "Удалить" - }; - if ui.button(btext).clicked(){ - + let btext = match self.salary_modal_state.status { + ModalStatus::Add => "Добавить", + ModalStatus::Edit => "Сохранить", + ModalStatus::Remove => "Удалить", + }; + if ui.button(btext).clicked() { + match self.salary_modal_state.status { + ModalStatus::Add => { + self.rt.block_on(async { + for w in self.salary_modal_state.workers.iter() { + self.db_oper + .add_salary( + w.id, + chrono::NaiveDate::from_str( + self.salary_modal_state + .data + .get("salary_date") + .unwrap(), + ) + .unwrap() + .and_hms_opt(0, 0, 0) + .unwrap() + .and_local_timezone(chrono::Local) + .unwrap(), + BigDecimal::from_str( + self.salary_modal_state + .data + .get("salary_size") + .unwrap(), + ) + .unwrap(), + Some( + self.salary_modal_state + .data + .get("comment") + .unwrap() + .clone(), + ), + ) + .await + .ok(); + } + }); + } + ModalStatus::Edit => { + let sal = Salary { + id: self + .salary_modal_state + .data + .get("id") + .unwrap() + .parse::() + .unwrap(), + worker: self + .workers + .read() + .iter() + .find(|w| { + &w.id.to_string() + == self + .salary_modal_state + .data + .get("worker_id") + .unwrap() + }) + .unwrap() + .clone(), + salary_size: BigDecimal::from_str( + self.salary_modal_state.data.get("salary_size").unwrap(), + ) + .unwrap(), + salary_date: chrono::NaiveDate::parse_from_str( + self.salary_modal_state.data.get("salary_date").unwrap(), + "%Y-%m-%d", + ) + .unwrap() + .and_hms_opt(0, 0, 0) + .unwrap() + .and_local_timezone(chrono::Local) + .unwrap(), + comment: self + .salary_modal_state + .data + .get("comment") + .unwrap() + .clone(), + }; + self.rt.block_on(async { + self.db_oper.update_salary(sal).await; + }); + } + ModalStatus::Remove => self.rt.block_on(async { + self.db_oper + .remove_salary( + self.salary_modal_state + .data + .get("id") + .unwrap() + .parse::() + .unwrap(), + ) + .await; + }), } + self.salary_modal_state.is_open = false; + self.update_salary(); + } }); } /* diff --git a/code/src/database.rs b/code/src/database.rs index 2e10586..bb80bcd 100644 --- a/code/src/database.rs +++ b/code/src/database.rs @@ -365,14 +365,14 @@ impl DBOperator { } pub async fn add_salary( &self, - worker: Worker, + worker_id: i32, salary_date: DateTime, - salary_size: Option, + salary_size: BigDecimal, comment: Option, ) -> Result { match sqlx::query("INSERT INTO Brewery.salary (id, worker_id, salary_size, salary_date, comment) VALUES(0, ?, ?, ?, ?);") - .bind(worker.id) - .bind(salary_size.unwrap_or(worker.position.wage)) + .bind(worker_id) + .bind(salary_size) .bind(salary_date) .bind(comment.unwrap_or(String::new())) .execute(&self.pool) @@ -381,6 +381,29 @@ impl DBOperator { Err(_) => Ok(false) } } + pub async fn update_salary(&self, salary: Salary) -> Result { + match sqlx::query("UPDATE Brewery.salary SET worker_id=?, salary_size=?, salary_date=?, comment=? WHERE id=?;") + .bind(salary.worker.id) + .bind(salary.salary_size) + .bind(salary.salary_date) + .bind(salary.comment) + .bind(salary.id) + .execute(&self.pool) + .await{ + Ok(_) => Ok(true), + Err(_) => Ok(false) + } + } + pub async fn remove_salary(&self, id: i32) -> Result { + match sqlx::query("DELETE FROM Brewery.salary WHERE id=?;") + .bind(id) + .execute(&self.pool) + .await + { + Ok(_) => Ok(true), + Err(_) => Ok(false), + } + } } pub async fn estabilish_connection() -> Result<(), sqlx::Error> {