платежи почти всё
parent
8cb2ec92b7
commit
359e254c0a
161
code/src/app.rs
161
code/src/app.rs
|
|
@ -255,6 +255,12 @@ impl Default for MainTabViewer {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
impl 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 {
|
fn new(is_admin: bool) -> Self {
|
||||||
Self {
|
Self {
|
||||||
is_admin,
|
is_admin,
|
||||||
|
|
@ -287,6 +293,7 @@ impl MainTabViewer {
|
||||||
let mut table = TableBuilder::new(ui)
|
let mut table = TableBuilder::new(ui)
|
||||||
.striped(true)
|
.striped(true)
|
||||||
.resizable(false)
|
.resizable(false)
|
||||||
|
.vscroll(false)
|
||||||
.cell_layout(egui::Layout::left_to_right(egui::Align::Center))
|
.cell_layout(egui::Layout::left_to_right(egui::Align::Center))
|
||||||
.column(Column::auto())
|
.column(Column::auto())
|
||||||
.column(Column::auto())
|
.column(Column::auto())
|
||||||
|
|
@ -512,6 +519,7 @@ impl MainTabViewer {
|
||||||
.striped(true)
|
.striped(true)
|
||||||
.columns(Column::auto(), 5)
|
.columns(Column::auto(), 5)
|
||||||
.sense(egui::Sense::click())
|
.sense(egui::Sense::click())
|
||||||
|
.vscroll(false)
|
||||||
.header(30.0, |mut header| {
|
.header(30.0, |mut header| {
|
||||||
header.col(|ui| {
|
header.col(|ui| {
|
||||||
ui.heading("Имя сотрудника");
|
ui.heading("Имя сотрудника");
|
||||||
|
|
@ -529,7 +537,7 @@ impl MainTabViewer {
|
||||||
.body(|mut body| {
|
.body(|mut body| {
|
||||||
body.ui_mut().style_mut().interaction.selectable_labels = false;
|
body.ui_mut().style_mut().interaction.selectable_labels = false;
|
||||||
for sal in (self.salaries.read().iter().clone()) {
|
for sal in (self.salaries.read().iter().clone()) {
|
||||||
body.row(20.0, |mut row| {
|
body.row(25.0, |mut row| {
|
||||||
row.col(|ui| {
|
row.col(|ui| {
|
||||||
ui.label(&sal.worker.full_name);
|
ui.label(&sal.worker.full_name);
|
||||||
});
|
});
|
||||||
|
|
@ -540,7 +548,8 @@ impl MainTabViewer {
|
||||||
ui.label(&sal.salary_date.date_naive().to_string());
|
ui.label(&sal.salary_date.date_naive().to_string());
|
||||||
});
|
});
|
||||||
row.col(|ui| {
|
row.col(|ui| {
|
||||||
ui.label(&sal.comment);
|
let text: String = sal.comment.chars().take(15).collect();
|
||||||
|
ui.label(text);
|
||||||
});
|
});
|
||||||
row.col(|ui| {
|
row.col(|ui| {
|
||||||
if ui.button("Удалить").clicked() {
|
if ui.button("Удалить").clicked() {
|
||||||
|
|
@ -553,9 +562,10 @@ impl MainTabViewer {
|
||||||
self.salary_modal_state
|
self.salary_modal_state
|
||||||
.data
|
.data
|
||||||
.insert("salary_size".to_owned(), sal.salary_size.to_string());
|
.insert("salary_size".to_owned(), sal.salary_size.to_string());
|
||||||
self.salary_modal_state
|
self.salary_modal_state.data.insert(
|
||||||
.data
|
"salary_date".to_owned(),
|
||||||
.insert("salary_date".to_owned(), sal.salary_date.to_string());
|
sal.salary_date.date_naive().to_string(),
|
||||||
|
);
|
||||||
self.salary_modal_state
|
self.salary_modal_state
|
||||||
.data
|
.data
|
||||||
.insert("comment".to_owned(), sal.comment.clone());
|
.insert("comment".to_owned(), sal.comment.clone());
|
||||||
|
|
@ -639,27 +649,146 @@ impl MainTabViewer {
|
||||||
size,
|
size,
|
||||||
egui::TextEdit::singleline(
|
egui::TextEdit::singleline(
|
||||||
self.salary_modal_state.data.get_mut("salary_date").unwrap(),
|
self.salary_modal_state.data.get_mut("salary_date").unwrap(),
|
||||||
),
|
)
|
||||||
|
.hint_text("1970-01-01"),
|
||||||
);
|
);
|
||||||
ui.end_row();
|
ui.end_row();
|
||||||
ui.label("Примечание:");
|
ui.label("Примечание:");
|
||||||
ui.add_sized(size,
|
ui.add_sized(
|
||||||
egui::TextEdit::singleline(self.salary_modal_state.data.get_mut("comment").unwrap()));
|
size,
|
||||||
|
egui::TextEdit::multiline(
|
||||||
|
self.salary_modal_state.data.get_mut("comment").unwrap(),
|
||||||
|
),
|
||||||
|
);
|
||||||
ui.end_row();
|
ui.end_row();
|
||||||
});
|
});
|
||||||
|
} else {
|
||||||
}else{
|
let wname = self
|
||||||
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;
|
.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("Вы уверены, что хотите удалить запись о выплате:");
|
||||||
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{
|
let btext = match self.salary_modal_state.status {
|
||||||
ModalStatus::Add => "Добавить",
|
ModalStatus::Add => "Добавить",
|
||||||
ModalStatus::Edit => "Сохранить",
|
ModalStatus::Edit => "Сохранить",
|
||||||
ModalStatus::Remove => "Удалить"
|
ModalStatus::Remove => "Удалить",
|
||||||
};
|
};
|
||||||
if ui.button(btext).clicked(){
|
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::<i32>()
|
||||||
|
.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::<i32>()
|
||||||
|
.unwrap(),
|
||||||
|
)
|
||||||
|
.await;
|
||||||
|
}),
|
||||||
|
}
|
||||||
|
self.salary_modal_state.is_open = false;
|
||||||
|
self.update_salary();
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -365,14 +365,14 @@ impl DBOperator {
|
||||||
}
|
}
|
||||||
pub async fn add_salary(
|
pub async fn add_salary(
|
||||||
&self,
|
&self,
|
||||||
worker: Worker,
|
worker_id: i32,
|
||||||
salary_date: DateTime<chrono::Local>,
|
salary_date: DateTime<chrono::Local>,
|
||||||
salary_size: Option<BigDecimal>,
|
salary_size: BigDecimal,
|
||||||
comment: Option<String>,
|
comment: Option<String>,
|
||||||
) -> Result<bool, sqlx::Error> {
|
) -> Result<bool, sqlx::Error> {
|
||||||
match sqlx::query("INSERT INTO Brewery.salary (id, worker_id, salary_size, salary_date, comment) VALUES(0, ?, ?, ?, ?);")
|
match sqlx::query("INSERT INTO Brewery.salary (id, worker_id, salary_size, salary_date, comment) VALUES(0, ?, ?, ?, ?);")
|
||||||
.bind(worker.id)
|
.bind(worker_id)
|
||||||
.bind(salary_size.unwrap_or(worker.position.wage))
|
.bind(salary_size)
|
||||||
.bind(salary_date)
|
.bind(salary_date)
|
||||||
.bind(comment.unwrap_or(String::new()))
|
.bind(comment.unwrap_or(String::new()))
|
||||||
.execute(&self.pool)
|
.execute(&self.pool)
|
||||||
|
|
@ -381,6 +381,29 @@ impl DBOperator {
|
||||||
Err(_) => Ok(false)
|
Err(_) => Ok(false)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
pub async fn update_salary(&self, salary: Salary) -> Result<bool, sqlx::Error> {
|
||||||
|
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<bool, sqlx::Error> {
|
||||||
|
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> {
|
pub async fn estabilish_connection() -> Result<(), sqlx::Error> {
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue