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

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 {
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::<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(
&self,
worker: Worker,
worker_id: i32,
salary_date: DateTime<chrono::Local>,
salary_size: Option<BigDecimal>,
salary_size: BigDecimal,
comment: Option<String>,
) -> Result<bool, sqlx::Error> {
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<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> {