From 3de696a092360e933ecb694a8d6165294deaa425 Mon Sep 17 00:00:00 2001 From: Dauren777 Date: Fri, 19 Jun 2026 06:06:52 +0000 Subject: [PATCH] v2 --- index.html | 115 ++++++++++++++++++++++++++++++++++++++++++++++++++--- 1 file changed, 110 insertions(+), 5 deletions(-) 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();