Barton0708 commited on
Commit
b15f58c
·
verified ·
1 Parent(s): 616be1a

улучши код файл main.py для Desktop-приложения (имеется прямой доступ) :

Browse files

import tkinter as tk
from tkinter import ttk, filedialog, messagebox
import sqlite3
import pandas as pd
from datetime import datetime
import os

class HRManagementSystem:
def __init__(self):
self.root = tk.Tk()
self.root.title("Система управления кадрами ВЕЛЕССТРОЙМОНТАЖ")
self.root.geometry("1000x700")
self.root.configure(bg='#2c3e50')

# Центрирование окна
self.center_window()

self.init_database()
self.create_main_menu()

# Пути к файлам
self.settings_file = None
self.data_1c_file = None
self.flight_data_file = None
self.position_data_file = None

# Загрузка сохраненных путей
self.load_saved_paths()

def center_window(self):
"""Центрирование окна на экране"""
self.root.update_idletasks()
width = self.root.winfo_width()
height = self.root.winfo_height()
x = (self.root.winfo_screenwidth() // 2) - (width // 2)
y = (self.root.winfo_screenheight() // 2) - (height // 2)
self.root.geometry('{}x{}+{}+{}'.format(width, height, x, y))

def init_database(self):
"""Инициализация базы данных"""
try:
self.conn = sqlite3.connect('local_hr_database.db', check_same_thread=False)
self.create_tables()
print("База данных успешно инициализирована")
except Exception as e:
messagebox.showerror("Ошибка", f"Ошибка инициализации базы данных: {str(e)}")

def create_tables(self):
"""Создание таблиц в базе данных"""
cursor = self.conn.cursor()

# Основная таблица сотрудников
cursor.execute('''
CREATE TABLE IF NOT EXISTS employees (
id INTEGER PRIMARY KEY AUTOINCREMENT,
fio_dr TEXT UNIQUE,
fio_employment_date TEXT,
unified_number TEXT,
organization TEXT DEFAULT 'ВелесстройМонтаж',
region TEXT,
platform TEXT,
personnel_number TEXT,
fio TEXT,
birth_date TEXT,
citizenship TEXT,
passport_series TEXT,
passport_number TEXT,
actual_position TEXT,
department TEXT,
work_type TEXT,
employee_category TEXT,
status TEXT,
hire_date TEXT,
dismissal_date TEXT,
hire_year INTEGER,
dismissal_year INTEGER,
total_experience_days INTEGER,
total_experience_months INTEGER,
position_1c TEXT,
rank_1c TEXT,
territory_1c TEXT,
organization_1c TEXT,
subdivision_1c TEXT,
birth_place TEXT,
passport_issued_by TEXT,
passport_issue_date TEXT,
snils TEXT,
inn TEXT,
work_schedule TEXT,
registration_address TEXT,
address_abroad TEXT,
personal_phone TEXT,
mobile_phone TEXT,
relative_phone TEXT
)
''')

# Таблица истории трудоустройств
cursor.execute('''
CREATE TABLE IF NOT EXISTS employment_history (
id INTEGER PRIMARY KEY AUTOINCREMENT,
fio_dr TEXT,
employment_rank INTEGER,
personnel_number TEXT,
hire_date TEXT,
dismissal_date TEXT,
work_days INTEGER,
FOREIGN KEY (fio_dr) REFERENCES employees (fio_dr)
)
''')

# Таблица настроек (пути к файлам)
cursor.execute('''
CREATE TABLE IF NOT EXISTS app_settings (
key TEXT PRIMARY KEY,
value TEXT
)
''')

self.conn.commit()

def save_setting(self, key, value):
"""Сохранение настроек в базу"""
cursor = self.conn.cursor()
cursor.execute('''
INSERT OR REPLACE INTO app_settings (key, value)
VALUES (?, ?)
''', (key, value))
self.conn.commit()

def load_setting(self, key, default=None):
"""Загрузка настроек из базы"""
cursor = self.conn.cursor()
cursor.execute('SELECT value FROM app_settings WHERE key = ?', (key,))
result = cursor.fetchone()
return result[0] if result else default

def load_saved_paths(self):
"""Загрузка сохраненных путей к файлам"""
self.settings_file = self.load_setting('settings_file')
self.data_1c_file = self.load_setting('data_1c_file')
self.flight_data_file = self.load_setting('flight_data_file')
self.position_data_file = self.load_setting('position_data_file')

def create_main_menu(self):
"""Создание главного меню"""
# Заголовок
title_label = tk.Label(self.root,
text="СИСТЕМА УПРАВЛЕНИЯ КАДРАМИ\nВЕЛЕССТРОЙМОНТАЖ",
font=('Arial', 20, 'bold'),
bg='#2c3e50',
fg='white',
justify='center')
title_label.pack(pady=30)

# Фрейм для кнопок
button_frame = tk.Frame(self.root, bg='#2c3e50')
button_frame.pack(pady=20)

# Кнопки меню
buttons = [
("📁 Загрузить файл Настройка", self.load_settings_file, "#3498db"),
("🔢 Загрузить данные 1С", self.load_1c_data, "#2ecc71"),
("✈️ Загрузить данные Прилет/Вылет", self.load_flight_data, "#e74c3c"),
("👥 Загрузить данные факт. должности", self.load_position_data, "#9b59b6"),
("🚀 ПРОДОЛЖИТЬ", self.open_main_application, "#f39c12"),
("❌ ВЫЙТИ", self.root.quit, "#95a5a6")
]

for text, command, color in buttons:
btn = tk.Button(button_frame,
text=text,
command=command,
font=('Arial', 12, 'bold'),
width=35,
height=2,
bg=color,
fg='white',
relief='raised',
bd=3,
cursor='hand2')
btn.pack(pady=8)

# Статусная строка
self.status_frame = tk.Frame(self.root, bg='#34495e', height=50)
self.status_frame.pack(side='bottom', fill='x', pady=10)
self.status_frame.pack_propagate(False)

self.status_label = tk.Label(self.status_frame,
text="Готов к работе. Загрузите файлы для начала работы.",
font=('Arial', 10),
bg='#34495e',
fg='#ecf0f1')
self.status_label.pack(expand=True)

def update_status(self, message):
"""Обновление статусной строки"""
self.status_label.config(text=message)
self.root.update()

def load_settings_file(self):
"""Загрузка файла настроек"""
file_path = filedialog.askopenfilename(
title="Выберите файл Настройка.xlsx",
filetypes=[("Excel files", "*.xlsx *.xls")]
)

if file_path:
try:
self.settings_file = file_path
self.save_setting('settings_file', file_path)

# Проверяем структуру файла
xl = pd.ExcelFile(file_path)
sheets = xl.sheet_names

# Простая проверка на наличие нужных листов
required_sheets = ['Pass and Logika', 'Local Data Base', 'Параметры']
found_sheets = [sheet for sheet in required_sheets if sheet in sheets]

message = f"Файл настроек загружен успешно!\nНайдены листы: {', '.join(found_sheets)}"
messagebox.showinfo("Успех", message)
self.update_status(f"Файл настроек: {os.path.basename(file_path)}")

except Exception as e:
messagebox.showerror("Ошибка", f"Ошибка загрузки файла настроек: {str(e)}")

def load_1c_data(self):
"""Загрузка данных 1С"""
file_path = filedialog.askopenfilename(
title="Выберите файл с данными 1С",
filetypes=[("Excel files", "*.xlsx *.xls *.xlsb")]
)

if file_path:
try:
self.data_1c_file = file_path
self.save_setting('data_1c_file', file_path)
self.process_1c_data(file_path)

except Exception as e:
messagebox.showerror("Ошибка", f"Ошибка загрузки данных 1С: {str(e)}")

def process_1c_data(self, file_path):
"""Обработка дан

Files changed (0) hide show