diff --git a/index.html b/index.html
index a2e865e..9be8544 100644
--- a/index.html
+++ b/index.html
@@ -52,6 +52,20 @@ th{background:var(--gray-100);font-weight:600}
+
Загрузка списка работников
+
+
+
+ Ожидаемые столбцы: Табельный номер, ФИО, Штатная должность, Грейд, МВЗ, ОрганизационнЕдиница, Текст Орг.Единицы, Факт-дни, Оклад по ШР, Оклад факт, ДатаВзыскания, ВидВзыскания, ДатаПриема (формат: ДД.ММ.ГГГГ)
+
+
+
+
+
+
+
+
— или добавляйте вручную —
+
@@ -72,11 +86,6 @@ th{background:var(--gray-100);font-weight:600}
-
-
-
-
-
@@ -135,6 +144,102 @@ function addWorker() {
clearForm();
}
+function loadFromFile() {
+ const fileInput = document.getElementById('fileUpload');
+ const reportMonth = document.getElementById('reportMonth').value;
+
+ if (!fileInput.files.length) {
+ alert('Выберите файл для загрузки');
+ return;
+ }
+
+ if (!reportMonth) {
+ alert('Укажите отчетный месяц');
+ return;
+ }
+
+ const file = fileInput.files[0];
+ const reader = new FileReader();
+
+ reader.onload = function(e) {
+ const content = e.target.result;
+ const lines = content.split('\n').filter(line => line.trim());
+
+ // Skip header row if exists (check if first line contains "ФИО" or similar)
+ const startIndex = lines[0].includes('ФИО') || lines[0].includes('Табельный') ? 1 : 0;
+
+ let loadedCount = 0;
+
+ for (let i = startIndex; i < lines.length; i++) {
+ const line = lines[i].trim();
+ if (!line) continue;
+
+ // Detect separator: tab or comma
+ const separator = line.includes('\t') ? '\t' : ',';
+ const columns = line.split(separator).map(col => col.trim());
+
+ // Expected structure based on user's columns:
+ // 0: Табельный номер
+ // 1: ФИО
+ // 2: Штатная должность
+ // 3: Грейд
+ // 4: МВЗ
+ // 5: ОрганизационнЕдиница
+ // 6: Текст Орг.Единицы
+ // 7: Факт-дни
+ // 8: Оклад по ШР
+ // 9: Оклад факт
+ // 10: ДатаВзыскания
+ // 11: ВидВзыскания
+ // 12: ДатаПриема
+
+ if (columns.length < 13) {
+ console.log(`Строка ${i+1}: недостаточно столбцов (${columns.length}), пропускаем`);
+ continue;
+ }
+
+ const fullName = columns[1];
+ const workedDays = parseInt(columns[7]);
+ const salary = parseFloat(columns[9].replace(/\s/g, ''));
+ const hireDateRaw = columns[12];
+
+ // Parse hire date (format: DD.MM.YYYY or YYYY-MM-DD)
+ let hireDate;
+ if (hireDateRaw.includes('.')) {
+ const [day, month, year] = hireDateRaw.split('.');
+ hireDate = `${year}-${month.padStart(2, '0')}-${day.padStart(2, '0')}`;
+ } else if (hireDateRaw.includes('-')) {
+ hireDate = hireDateRaw;
+ } else {
+ console.log(`Строка ${i+1}: неверный формат даты "${hireDateRaw}", пропускаем`);
+ continue;
+ }
+
+ if (!fullName || isNaN(workedDays) || isNaN(salary)) {
+ console.log(`Строка ${i+1}: некорректные данные, пропускаем`);
+ continue;
+ }
+
+ workers.push({
+ id: Date.now() + i,
+ fullName,
+ hireDate,
+ salary,
+ workedDays,
+ reportMonth
+ });
+
+ loadedCount++;
+ }
+
+ updateTable();
+ alert(`Загружено ${loadedCount} работников`);
+ fileInput.value = '';
+ };
+
+ reader.readAsText(file);
+}
+
function removeWorker(id) {
workers = workers.filter(w => w.id !== id);
updateTable();