diff --git a/frontend/api.js b/frontend/api.js index f2bf2de..f2dbd00 100644 --- a/frontend/api.js +++ b/frontend/api.js @@ -351,6 +351,7 @@ async function getReports() { }, }); const data = await response.json(); + console.log(data); if (response.ok) { return { success: true, reports: data.reports }; } else { @@ -401,9 +402,6 @@ async function loadReports() { tbody.innerHTML = ""; reports.forEach((report) => { - const store = database.stores.find((s) => s.id === report.storeId); - // Fallback for username if user might be missing from local array: - const user = database.users.find((u) => u.id === report.userId); const profit = (Number(report.totalIncome) || 0) - (Number(report.totalExpenses) || 0); @@ -426,7 +424,7 @@ async function loadReports() { profit >= 0 ? "text-green-600" : "text-red-600" }">€${profit.toFixed(2)} ${ - user ? user.username : report.userId + report.username || report.userId } { + if (typeof data[k] === "number" && isNaN(data[k])) delete data[k]; + }); await updateReport(reportId, data); } @@ -645,5 +660,57 @@ async function verifyReport(reportId) { } } -//delete report -// deleteReport(id) +//delete report (admin only) +async function apiDeleteReport(reportId) { + const token = localStorage.getItem("token"); + try { + const response = await fetch(`${API_BASE_URL}/reports/${reportId}`, { + method: "DELETE", + headers: { + Authorization: `Bearer ${token}`, + "Content-Type": "application/json", + }, + }); + const data = await response.json(); + if (response.ok && data.deleted) { + showNotification("Отчет удален!"); + await loadReports(); + if (typeof updateDashboard === "function") updateDashboard(); + } else { + showNotification(data.error || "Ошибка удаления отчета", "error"); + } + } catch { + showNotification("Нет соединения с сервером", "error"); + } +} + +//worker +//create report +// api.js +async function createReport(data) { + const token = localStorage.getItem("token"); + try { + const response = await fetch(`${API_BASE_URL}/reports`, { + method: "POST", + headers: { + Authorization: `Bearer ${token}`, + "Content-Type": "application/json", + }, + body: JSON.stringify(data), + }); + const result = await response.json(); + if (response.ok && result.id) { + return { success: true, id: result.id }; + } else { + return { + success: false, + error: + result.error || + (result.errors && result.errors[0]?.msg) || + "Ошибка создания отчета", + }; + } + } catch (err) { + return { success: false, error: "Нет соединения с сервером" }; + } +} diff --git a/frontend/script.js b/frontend/script.js index 14a03de..a8391c5 100644 --- a/frontend/script.js +++ b/frontend/script.js @@ -256,11 +256,9 @@ function loadUserStores() { let userStores = []; if (currentUser.role === "admin") { - userStores = database.stores; + userStores = currentUser.stores; } else { - userStores = database.stores.filter((store) => - currentUser.stores.includes(store.id) - ); + userStores = currentUser.stores; } userStores.forEach((store) => { @@ -405,85 +403,133 @@ function updateTotals() { } // Отправка формы отчета -document.getElementById("reportForm").addEventListener("submit", (e) => { +// document.getElementById("reportForm").addEventListener("submit", (e) => { +// e.preventDefault(); + +// const formData = { +// id: editingReportId || Date.now(), +// date: new Date().toISOString().split("T")[0], +// storeId: parseInt(document.getElementById("storeSelect").value), +// userId: currentUser.id, +// income: parseFloat(document.getElementById("income").value), +// cajaInicial: parseFloat(document.getElementById("cajaInicial").value), +// totalIncome: parseFloat(document.getElementById("totalIncome").value), +// envelope: parseFloat(document.getElementById("envelope").value), +// verified: false, +// createdAt: new Date().toISOString(), +// }; + +// // Сбор зарплат +// const wages = []; +// const wageRows = document.querySelectorAll(".wage-row"); +// wageRows.forEach((row) => { +// const name = row.querySelector(".wage-name").value; +// const amount = parseFloat(row.querySelector(".wage-amount").value) || 0; +// if (name && amount > 0) { +// wages.push({ name, amount }); +// } +// }); + +// // Сбор расходов +// const expenses = []; +// const expenseRows = document.querySelectorAll(".expense-row"); +// expenseRows.forEach((row) => { +// const name = row.querySelector(".expense-name").value; +// const amount = parseFloat(row.querySelector(".expense-amount").value) || 0; +// if (name && amount > 0) { +// expenses.push({ name, amount }); +// } +// }); + +// formData.wages = wages; +// formData.expenses = expenses; +// formData.totalWages = calculateTotalWages(); +// formData.totalExpensesInternal = calculateTotalExpenses(); +// formData.totalExpenses = formData.totalWages + formData.totalExpensesInternal; +// formData.cajaFinal = +// formData.totalIncome - formData.totalExpenses - formData.envelope; + +// if (editingReportId) { +// const index = database.reports.findIndex((r) => r.id === editingReportId); +// database.reports[index] = formData; +// editingReportId = null; +// showNotification("Отчет успешно обновлен!"); +// } else { +// database.reports.push(formData); +// showNotification("Отчет успешно сохранен!"); +// } + +// // Очистка формы +// document.getElementById("reportForm").reset(); +// document.getElementById("wagesContainer").innerHTML = ` +//
+// +// +// +//
+// `; +// document.getElementById("expensesContainer").innerHTML = ` +//
+// +// +// +//
+// `; + +// updateTotals(); +// }); + +document.getElementById("reportForm").addEventListener("submit", async (e) => { e.preventDefault(); const formData = { - id: editingReportId || Date.now(), - date: new Date().toISOString().split("T")[0], storeId: parseInt(document.getElementById("storeSelect").value), - userId: currentUser.id, + reportDate: new Date().toISOString().split("T")[0], // Or get from input if user chooses date income: parseFloat(document.getElementById("income").value), - cajaInicial: parseFloat(document.getElementById("cajaInicial").value), + initialCash: parseFloat(document.getElementById("cajaInicial").value), totalIncome: parseFloat(document.getElementById("totalIncome").value), + wages: JSON.stringify(collectWages()), + expenses: JSON.stringify(collectExpenses()), + totalWages: calculateTotalWages(), + totalExpenses: calculateTotalExpenses() + calculateTotalWages(), envelope: parseFloat(document.getElementById("envelope").value), - verified: false, - createdAt: new Date().toISOString(), + finalCash: + parseFloat(document.getElementById("totalIncome").value) - + (calculateTotalWages() + calculateTotalExpenses()) - + parseFloat(document.getElementById("envelope").value), }; + console.log("Sending report:", formData); + const result = await createReport(formData); + if (result.success) { + showNotification("Отчет успешно создан!"); + document.getElementById("reportForm").reset(); + } else { + showNotification(result.error || "Ошибка создания отчета", "error"); + } +}); - // Сбор зарплат +function collectWages() { const wages = []; - const wageRows = document.querySelectorAll(".wage-row"); - wageRows.forEach((row) => { + document.querySelectorAll(".wage-row").forEach((row) => { const name = row.querySelector(".wage-name").value; const amount = parseFloat(row.querySelector(".wage-amount").value) || 0; - if (name && amount > 0) { - wages.push({ name, amount }); - } + if (name && amount > 0) wages.push({ name, amount }); }); - - // Сбор расходов + return wages; +} +function collectExpenses() { const expenses = []; - const expenseRows = document.querySelectorAll(".expense-row"); - expenseRows.forEach((row) => { + document.querySelectorAll(".expense-row").forEach((row) => { const name = row.querySelector(".expense-name").value; const amount = parseFloat(row.querySelector(".expense-amount").value) || 0; - if (name && amount > 0) { - expenses.push({ name, amount }); - } + if (name && amount > 0) expenses.push({ name, amount }); }); - - formData.wages = wages; - formData.expenses = expenses; - formData.totalWages = calculateTotalWages(); - formData.totalExpensesInternal = calculateTotalExpenses(); - formData.totalExpenses = formData.totalWages + formData.totalExpensesInternal; - formData.cajaFinal = - formData.totalIncome - formData.totalExpenses - formData.envelope; - - if (editingReportId) { - const index = database.reports.findIndex((r) => r.id === editingReportId); - database.reports[index] = formData; - editingReportId = null; - showNotification("Отчет успешно обновлен!"); - } else { - database.reports.push(formData); - showNotification("Отчет успешно сохранен!"); - } - - // Очистка формы - document.getElementById("reportForm").reset(); - document.getElementById("wagesContainer").innerHTML = ` -
- - - -
- `; - document.getElementById("expensesContainer").innerHTML = ` -
- - - -
- `; - - updateTotals(); -}); + return expenses; +} // Отчет за сегодня для пользователя document.getElementById("todayReportBtn").addEventListener("click", () => { @@ -510,9 +556,6 @@ function showReportModal(report, isAdmin = false) { const buttons = document.getElementById("reportModalButtons"); const title = document.getElementById("reportModalTitle"); - const store = database.stores.find((s) => s.id === report.storeId); - const user = database.users.find((u) => u.id === report.userId); - title.textContent = `Отчет от ${report.reportDate || report.date} - ${ report.storeName || report.storeId || "Неизвестный магазин" }`; @@ -530,7 +573,7 @@ function showReportModal(report, isAdmin = false) { report.storeName || report.storeId }
Пользователь: ${ - user ? user.username : report.userId + report.username || report.fullName || report.userId }
Статус: r.id !== reportId); +// loadReports(); +// updateDashboard(); +// showNotification("Отчет удален!"); +// } +// } + function deleteReport(reportId) { - if (confirm("Вы уверены, что хотите удалить этот отчет?")) { - database.reports = database.reports.filter((r) => r.id !== reportId); + showConfirmModal("Вы уверены, что хотите удалить этот отчет?", () => { + apiDeleteReport(reportId); loadReports(); updateDashboard(); showNotification("Отчет удален!"); - } + }); } // Настройка фильтров отчетов