diff --git a/miniapp/assets/clients.js b/miniapp/assets/clients.js index 63f8274..39ccfe4 100644 --- a/miniapp/assets/clients.js +++ b/miniapp/assets/clients.js @@ -76,6 +76,14 @@ const Clients = (function () { Кв./офис + +
@@ -133,17 +141,24 @@ const Clients = (function () { }); const name = (form.querySelector("#fn").value || "").trim(); const phoneRaw = (form.querySelector("#ph").value || "").trim(); - const adCity = (form.querySelector("#ad_city").value || "").trim(); - const adStreet = (form.querySelector("#ad_street").value|| "").trim(); - const adHouse = (form.querySelector("#ad_house").value || "").trim(); - const adApt = (form.querySelector("#ad_apt").value || "").trim(); + const adCity = (form.querySelector("#ad_city").value || "").trim(); + const adStreet = (form.querySelector("#ad_street").value || "").trim(); + const adHouse = (form.querySelector("#ad_house").value || "").trim(); + const adApt = (form.querySelector("#ad_apt").value || "").trim(); + const adEntrance = (form.querySelector("#ad_entrance").value|| "").trim(); + const adFloor = (form.querySelector("#ad_floor").value || "").trim(); const note = (form.querySelector("#nt").value || "").trim(); const contract_no = (form.querySelector("#cn").value || "").trim(); const contract_date = (form.querySelector("#cd").value || "").trim(); // Собираем адрес из полей - const address = [adCity, adStreet, adHouse ? "д. " + adHouse : "", adApt ? "кв. " + adApt : ""] - .filter(Boolean).join(", "); + const address = [ + adCity, adStreet, + adHouse ? "д. " + adHouse : "", + adApt ? "кв. " + adApt : "", + adEntrance ? "подъезд " + adEntrance : "", + adFloor ? "этаж " + adFloor : "", + ].filter(Boolean).join(", "); // Валидация if (!name || name.length < 2) { @@ -179,9 +194,15 @@ const Clients = (function () { }); const geoData = await geoRes.json(); if (geoData.ok && geoData.result) { - gps_lat = geoData.result.lat; - gps_lng = geoData.result.lng; - geoEl.innerHTML = `✓ ${escHtml(geoData.result.formatted || address)}`; + const kind = (geoData.result.kind || "").toLowerCase(); + const precise = ["house", "street", "entrance", "building"].includes(kind); + if (precise) { + gps_lat = geoData.result.lat; + gps_lng = geoData.result.lng; + geoEl.innerHTML = `✓ ${escHtml(geoData.result.formatted || address)}`; + } else { + geoEl.innerHTML = `⚠ Улица не найдена — геокодер вернул «${escHtml(geoData.result.formatted || "")}». Проверьте написание улицы. Сохраняем без координат.`; + } } else { geoEl.innerHTML = `⚠ Адрес не найден в геокодере — проверьте написание. Сохраняем без координат.`; } @@ -240,23 +261,22 @@ const Clients = (function () { }); } - // Разбирает сохранённый адрес «Город, Улица, д. NN, кв. MM» обратно в поля. + // Разбирает сохранённый адрес «Город, Улица, д. NN, кв. MM, подъезд P, этаж F» обратно в поля. function splitAddress(combined) { - if (!combined) return { city: "Санкт-Петербург", street: "", house: "", apt: "" }; + if (!combined) return { city: "Санкт-Петербург", street: "", house: "", apt: "", entrance: "", floor: "" }; let s = combined.trim(); - let apt = ""; - const aptMatch = s.match(/,\s*кв\.?\s*([^\s,]+)/i); - if (aptMatch) { apt = aptMatch[1]; s = s.replace(aptMatch[0], ""); } - let house = ""; - const houseMatch = s.match(/,\s*д\.?\s*([^\s,]+)/i); - if (houseMatch) { house = houseMatch[1]; s = s.replace(houseMatch[0], ""); } + const grab = (re) => { const m = s.match(re); if (m) { s = s.replace(m[0], ""); return m[1]; } return ""; }; + const floor = grab(/,\s*этаж\s+([^\s,]+)/i); + const entrance = grab(/,\s*подъезд\s+([^\s,]+)/i); + const apt = grab(/,\s*кв\.?\s*([^\s,]+)/i); + const house = grab(/,\s*д\.?\s*([^\s,]+)/i); s = s.replace(/,$/, "").trim(); const parts = s.split(",").map(p => p.trim()).filter(Boolean); let city = "", street = ""; if (parts.length >= 2) { city = parts[0]; street = parts.slice(1).join(", "); } else if (parts.length === 1) { city = parts[0]; } if (!city) city = "Санкт-Петербург"; - return { city, street, house, apt }; + return { city, street, house, apt, entrance, floor }; } function normalizePhone(raw) { @@ -751,6 +771,14 @@ const Clients = (function () { Кв./офис + +
@@ -781,12 +809,14 @@ const Clients = (function () { }); form.querySelector("#ed_save").addEventListener("click", async () => { - const fn = form.querySelector("#ed_fn").value.trim(); - const ph = form.querySelector("#ed_ph").value.trim(); - const edCity = (form.querySelector("#ed_city").value || "").trim(); - const edStreet = (form.querySelector("#ed_street").value || "").trim(); - const edHouse = (form.querySelector("#ed_house").value || "").trim(); - const edApt = (form.querySelector("#ed_apt").value || "").trim(); + const fn = form.querySelector("#ed_fn").value.trim(); + const ph = form.querySelector("#ed_ph").value.trim(); + const edCity = (form.querySelector("#ed_city").value || "").trim(); + const edStreet = (form.querySelector("#ed_street").value || "").trim(); + const edHouse = (form.querySelector("#ed_house").value || "").trim(); + const edApt = (form.querySelector("#ed_apt").value || "").trim(); + const edEntrance = (form.querySelector("#ed_entrance").value || "").trim(); + const edFloor = (form.querySelector("#ed_floor").value || "").trim(); const cno = form.querySelector("#ed_cno").value.trim(); const cdate = form.querySelector("#ed_cdate").value.trim(); const errName = form.querySelector("#ed_errName"); @@ -809,8 +839,13 @@ const Clients = (function () { return; } - const address = [edCity, edStreet, edHouse ? "д. " + edHouse : "", edApt ? "кв. " + edApt : ""] - .filter(Boolean).join(", "); + const address = [ + edCity, edStreet, + edHouse ? "д. " + edHouse : "", + edApt ? "кв. " + edApt : "", + edEntrance ? "подъезд " + edEntrance : "", + edFloor ? "этаж " + edFloor : "", + ].filter(Boolean).join(", "); const btn = form.querySelector("#ed_save"); btn.disabled = true; btn.textContent = "Проверяем адрес…"; @@ -830,9 +865,15 @@ const Clients = (function () { }); const geoData = await geoRes.json(); if (geoData.ok && geoData.result) { - gps_lat = geoData.result.lat; - gps_lng = geoData.result.lng; - geoEl.innerHTML = `✓ ${escHtml(geoData.result.formatted || address)}`; + const kind = (geoData.result.kind || "").toLowerCase(); + const precise = ["house", "street", "entrance", "building"].includes(kind); + if (precise) { + gps_lat = geoData.result.lat; + gps_lng = geoData.result.lng; + geoEl.innerHTML = `✓ ${escHtml(geoData.result.formatted || address)}`; + } else { + geoEl.innerHTML = `⚠ Улица не найдена — геокодер вернул «${escHtml(geoData.result.formatted || "")}». Проверьте написание улицы. Сохраняем без координат.`; + } } else { geoEl.innerHTML = `⚠ Адрес не найден — сохраняем без координат.`; } diff --git a/miniapp/assets/podbor.css b/miniapp/assets/podbor.css index daf63bd..856fac8 100644 --- a/miniapp/assets/podbor.css +++ b/miniapp/assets/podbor.css @@ -3328,8 +3328,10 @@ margin-top: 6px; } .addr-grid .field { margin: 0; } -.addr-house { grid-column: 1; } -.addr-apt { grid-column: 2; } +.addr-house { grid-column: 1; } +.addr-apt { grid-column: 2; } +.addr-entrance { grid-column: 1; } +.addr-floor { grid-column: 2; } .field-sublabel { display: block; font-size: 11px; diff --git a/miniapp/index.html b/miniapp/index.html index 046bf91..6f8d472 100644 --- a/miniapp/index.html +++ b/miniapp/index.html @@ -12,14 +12,14 @@ - - + +
- +
- - - - - - - - - - + + + + + + + + + +