платежи почти всё

master
Алексей Алексей 2026-06-20 12:36:48 +10:00
parent 8cb2ec92b7
commit 359e254c0a
2 changed files with 175 additions and 23 deletions

View File

@ -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.workers.read().clone().iter().find(|w| w.id.to_string() == self.salary_modal_state.data.get("worker_id").unwrap()).unwrap().full_name; 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("Вы уверены, что хотите удалить запись о выплате:");
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();
} }
}); });
} }

View File

@ -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> {