const page = CarPassPage; let selectedPayload = null; function summaryItems(counts = {}) { const labels = { vehicles: "Автомобили", fuel_entries: "Заправки", service_entries: "ТО и ремонт", expense_entries: "Расходы", appointments: "Записи в СТО", service_visits: "Заказ-наряды", }; return Object.entries(labels).map(([key, label]) => `
${label} ${page.escapeHtml(counts[key] ?? 0)}
`).join(""); } function countExport(payload) { const vehicles = payload.vehicles || []; return { vehicles: vehicles.length, fuel_entries: vehicles.reduce((sum, item) => sum + (item.fuel_entries || []).length, 0), service_entries: vehicles.reduce((sum, item) => sum + (item.service_entries || []).length, 0), expense_entries: vehicles.reduce((sum, item) => sum + (item.expense_entries || []).length, 0), appointments: vehicles.reduce((sum, item) => sum + (item.appointments || []).length, 0), service_visits: vehicles.reduce((sum, item) => sum + (item.service_visits || []).length, 0), }; } function renderPreview(preview) { document.querySelector("#importSummary").innerHTML = ` ${summaryItems(preview.counts)} ${preview.warnings?.length ? `
${preview.warnings.map(page.escapeHtml).join("
")}
` : ""} `; } async function readSelectedFile() { const file = document.querySelector("#importFile").files[0]; if (!file) throw new Error("Выберите JSON-файл"); selectedPayload = JSON.parse(await file.text()); return selectedPayload; } document.querySelector("#exportBtn").addEventListener("click", async (event) => { await page.runAction(event.currentTarget, "Готовлю файл...", async () => { const payload = await page.api("/my/export"); const blob = new Blob([JSON.stringify(payload, null, 2)], { type: "application/json" }); const url = URL.createObjectURL(blob); const link = document.createElement("a"); const stamp = new Date().toISOString().slice(0, 19).replace(/[:T]/g, "-"); link.href = url; link.download = `carpass-export-${stamp}.json`; document.body.appendChild(link); link.click(); link.remove(); URL.revokeObjectURL(url); document.querySelector("#exportSummary").innerHTML = summaryItems(countExport(payload)); page.toast("Экспорт подготовлен"); }); }); document.querySelector("#previewBtn").addEventListener("click", async (event) => { await page.runAction(event.currentTarget, "Проверяю файл...", async () => { const payload = await readSelectedFile(); const preview = await page.api("/my/import/preview", { method: "POST", body: JSON.stringify(payload), }); renderPreview(preview); page.toast("Файл проверен"); }); }); document.querySelector("#importForm").addEventListener("submit", async (event) => { event.preventDefault(); await page.runAction(document.querySelector("#importBtn"), "Импортирую...", async () => { const payload = selectedPayload || await readSelectedFile(); const result = await page.api("/my/import", { method: "POST", body: JSON.stringify(payload), }); renderPreview(result.preview); document.querySelector("#importSummary").insertAdjacentHTML("afterbegin", `
Импортировано: авто ${result.imported.vehicles_created}, заправок ${result.imported.fuel_entries}, сервисных записей ${result.imported.service_entries}, расходов ${result.imported.expense_entries}.
`); page.toast("Импорт завершен"); }); }); page.boot(async () => {});