diff --git a/code/src/app.rs b/code/src/app.rs index c7fc346..9913a48 100644 --- a/code/src/app.rs +++ b/code/src/app.rs @@ -1,7 +1,7 @@ use std::sync::Arc; use chrono::NaiveDate; -use egui::mutex::RwLock; +use egui::{WidgetText::RichText, mutex::RwLock}; use egui_dock::{DockArea, Style, TabViewer}; use rust_decimal::prelude::Zero; use sqlx::{Connection, MySqlConnection, MySqlPool, types::BigDecimal}; @@ -50,10 +50,6 @@ impl Default for App{ tab_type: TabTypes::Salary, title:"Выплаты".to_owned(), }, - Tab{ - tab_type: TabTypes::Position, - title: "Должности".to_owned(), - }, Tab{ tab_type: TabTypes::Recipe, title: "Рецепты".to_owned(), @@ -201,7 +197,7 @@ impl MainTabViewer{ ui.label("Сырьё короче да"); } fn show_salary(&mut self, ui: &mut egui::Ui){ - + ui.label("Помогите"); } fn show_settings(&mut self, ui: &mut egui::Ui){ ui.checkbox(&mut self.is_dark_theme, "Тёмная тема"); @@ -277,6 +273,8 @@ struct WorkerTabViewer{ edit_worker_position: Position, rt: tokio::runtime::Runtime, + show_position_delete_modal: bool, + delete_position: Position, } @@ -284,6 +282,9 @@ impl WorkerTabViewer{ fn update_workers(&mut self){ self.workers = Arc::new(RwLock::new(Option::Some(self.rt.block_on(async{self.db_oper.get_workers().await.unwrap()})))); } + fn update_positions(&mut self){ + self.positions = Arc::new(RwLock::new(Option::Some(self.rt.block_on(async{self.db_oper.get_position().await.unwrap()})))); + } fn show_worker(&mut self, ui: &mut egui::Ui){ ui.horizontal(|ui|{ @@ -295,6 +296,20 @@ impl WorkerTabViewer{ }; if ui.button("Редактировать").clicked() { self.show_worker_edit_modal = true; + self.rt.block_on(async{ + let wrkr = match self.db_oper.get_worker_by_id(self.edit_worker_id).await{ + Ok(worker)=>{ + worker + }, + Err(_)=>{ + Worker::default() + } + }; + self.edit_worker_name = wrkr.full_name; + self.edit_worker_hire_date = wrkr.hire_date.format("%Y-%m-%d").to_string(); + self.edit_worker_position = wrkr.position; + self.edit_worker_is_fired = wrkr.is_fired; + }); } if ui.button("Обновить").clicked(){ self.update_workers(); @@ -379,7 +394,6 @@ impl WorkerTabViewer{ }); }); if self.edit_worker_id != old{ - println!("Ура перемена"); self.rt.block_on(async{ let wrkr = match self.db_oper.get_worker_by_id(self.edit_worker_id).await{ Ok(worker)=>{ @@ -417,11 +431,33 @@ impl WorkerTabViewer{ }); ui.end_row(); + ui.label("Дата найма"); + ui.text_edit_singleline(&mut self.edit_worker_hire_date); + ui.end_row(); + ui.checkbox(&mut self.edit_worker_is_fired, "Уволен"); ui.end_row(); }); - + if chrono::NaiveDate::parse_from_str(&self.edit_worker_hire_date, "%Y-%m-%d").is_ok() && self.edit_worker_name.len() > 0{ + self.can_edit_worker = true; + }else{ + self.can_edit_worker = false; + } + let resp = ui.add_enabled(self.can_edit_worker, egui::Button::new("Добавить")); + if resp.clicked(){ + self.rt.block_on(async{ + let ndate = chrono::NaiveDate::parse_from_str(&self.edit_worker_hire_date, "%Y-%m-%d").unwrap(); + self.db_oper.update_worker(Worker { + id: self.edit_worker_id, + full_name: self.edit_worker_name.clone(), + hire_date: ndate.and_hms_opt(0,0, 0).unwrap().and_local_timezone(chrono::Local).unwrap(), + position: self.edit_worker_position.clone(), + is_fired: self.edit_worker_is_fired }).await.unwrap(); + }); + self.update_workers(); + self.show_worker_edit_modal = false; + } }); } for wk in self.workers.read().clone().unwrap().iter(){ @@ -454,6 +490,12 @@ impl WorkerTabViewer{ if ui.button("Добавить").clicked(){ self.show_position_add_modal = true; } + if ui.button("Удалить").clicked(){ + self.show_position_delete_modal = true; + self.delete_position = self.positions.read().clone().unwrap()[0].clone(); + self.update_positions(); + self.update_workers(); + } }); for eq in self.positions.read().clone().unwrap().iter(){ ui.push_id(&eq.name, |ui|{ @@ -488,8 +530,42 @@ impl WorkerTabViewer{ ui.end_row(); }); - - + let resp = ui.add_enabled(self.add_position_name.len()>0&&self.add_position_wage.len()>0,egui::Button::new("Добавить") ); + if resp.clicked(){ + self.rt.block_on(async{ + self.db_oper.add_position(Position { + id: 0, + name: self.add_position_name.clone(), + wage: BigDecimal::from(self.add_position_wage.trim().parse::().unwrap()) }).await.ok(); + }); + self.update_positions(); + self.show_position_add_modal = false; + } + }); + } + if self.show_position_delete_modal{ + egui::Modal::new("delete_position".into()).show(ui.ctx(), |ui|{ + if ui.button("Закрыть").clicked(){ + self.show_position_delete_modal = false; + } + egui::ComboBox::from_label("Должность").selected_text(&self.delete_position.name) + .show_ui(ui, |ui|{ + self.rt.block_on(async{ + for pos in self.positions.read().clone().unwrap().iter(){ + ui.selectable_value(&mut self.delete_position, pos.clone(), &pos.name); + } + }); + }); + let can_delete = self.workers.read().clone().unwrap().iter().find(|wrkr| wrkr.position.id == self.delete_position.id).iter().len() == 0; + if !can_delete{ + ui.label(egui::RichText::new("Есть сотрудники с этой должностью").color(egui::Color32::YELLOW)); + } + let resp = ui.add_enabled(can_delete, egui::Button::new("Удалить")); + if resp.clicked(){ + self.rt.block_on(async{ + self.db_oper.delete_position(self.delete_position.clone()).await.unwrap(); + }); + } }); } } @@ -526,6 +602,7 @@ impl Default for WorkerTabViewer{ show_worker_add_modal: false, show_worker_edit_modal: false, show_position_add_modal: false, + show_position_delete_modal: false, fire_worker_id: String::new(), add_worker_name: String::new(), add_worker_position: Position::default(), @@ -534,6 +611,7 @@ impl Default for WorkerTabViewer{ can_edit_worker: false, add_position_name: String::new(), add_position_wage: String::new(), + delete_position: Position::default(), edit_worker_id: 1, edit_worker_name: String::new(), diff --git a/code/src/database.rs b/code/src/database.rs index 130f824..da870a0 100644 --- a/code/src/database.rs +++ b/code/src/database.rs @@ -79,16 +79,47 @@ impl DBOperator{ } } } - pub async fn change_worker_fire_state(&self, worker_id: i32, is_fired: bool) -> Result{ - match(sqlx::query("UPDATE Brewery.worker SET is_fired=? WHERE id=?;") - .bind(if is_fired {1} else {0}) - .bind(worker_id) + pub async fn add_position(&self, position: Position) -> Result{ + match sqlx::query("INSERT INTO Brewery.`position` (id, name, wage) VALUES(0, ?, ?);") + .bind(position.name) + .bind(position.wage) .execute(&self.pool) - .await){ + .await{ + Ok(_)=>{ + Ok(true) + }, + Err(_)=>{ + Ok(false) + } + } + } + pub async fn delete_position(&self, position: Position) -> Result{ + match sqlx::query("DELETE FROM Brewer.`position` WHERE id = ?;") + .bind(position.id) + .execute(&self.pool) + .await{ + Ok(_)=>{ + Ok(true) + }, + Err(_)=>{ + Ok(false) + } + } + } + + pub async fn update_worker(&self, worker: Worker) -> Result{ + match sqlx::query("UPDATE Brewery.worker SET position_id=?, hire_date=?, is_fired=?, full_name=? WHERE id=?;") + .bind(worker.position.id) + .bind(worker.hire_date) + .bind(worker.is_fired) + .bind(worker.full_name) + .bind(worker.id) + .execute(&self.pool) + .await{ Ok(_) =>{ Ok(true) }, - Err(_) =>{ + Err(_)=>{ Ok(false) } }