Перейти до основного вмісту
megapromotingПоговорімо

Рішення · Стоматологічні клініки

Список послуг із позначкою покриття через обов’язкове страхування, який може редагувати рецепція, — не PDF з цінами, надісланий електронною поштою.

Сайт стоматологічної клініки оцінюють за одним: чи знаходить людина потрібну їй послугу, з її ціною та одиницею — за зуб, за щелепу, за сеанс — і чи знає вона, входить це в страхування чи ні. Решта — декор. Ми будуємо структуру, що це утримує, і панель, з якої персонал змінює її самостійно.

Вже збудованоLucrarea se poate verifica din exterior chiar acum: datele publice ale unui centru stomatologic raional pe care îl administrăm sunt servite ca fișier structurat — 89 de servicii, fiecare cu categorie, subcategorie, denumire, preț, unitate de măsură și un indicator de eligibilitate pentru asigurarea obligatorie, dintre care 27 marcate ca eligibile; 7 categorii și 10 subcategorii, verificate de noi pe 06.09.2026. A doua parte a dovezii e securizarea, cu diff în istoric: la preluare, parola de administrator era comparată în browser și ajungea în pachetul JavaScript public, iar scrierile pe interfața de programare se puteau face de oricine de pe internet. Precizarea corectă, ca să nu ne atribuim mai mult decât e al nostru: prima variantă a site-ului nu e a noastră. Contribuția care se poate arăta cu diff e preluarea, securizarea, tipurile, integrarea continuă și igiena dependințelor.

Стоматологічна клініка не продає «послуги». Вона продає дуже довгий список тарифних позицій з одиницями, які не схожі ні на що в іншій сфері: за зуб, за щелепу, за видалення, за пролікований випадок, за сеанс, за візит, за втручання. Людина, яка шукає в інтернеті, не шукає клініку, а шукає свою позицію: скільки коштує видалення, чи оплачується за зуб або за візит, чи покривається страхуванням. Сайт, який відповідає на це, корисний; той, що має сторінку «Ціни» з прикріпленим PDF, — ні.

Друга річ, яку вимагає реальність клініки, — щоб список можна було змінювати без програміста. Тарифи змінюються, лікарі змінюються, графік невідкладної допомоги взимку оголошують інакше. Якщо кожна зміна проходить через розробника, список залишається старим і за кілька місяців пацієнти приходять із ціною минулого року. Структура, яку ми будуємо, тримає публічні дані — послуги та команду — у структурованих файлах, які читають і інтерфейс програмування, і безпосередньо видима частина сайту, а персонал редагує їх із панелі.

Третя річ, яку ніхто не просить у брифі й яка має найбільше значення, — хто може записувати в цей список. Під час приймання проєкту, про який ми тут пишемо, будь-хто з інтернету міг надіслати запис до інтерфейсу програмування, а пароль панелі потрапляв у пакет JavaScript, який видавався браузеру, — бо його перевірка виконувалася в браузері. Ми перенесли перевірку на сервер: пароль більше не залишає сервер, натомість повертається підписаний токен, дійсний дванадцять годин, з лімітом у вісім спроб за п’ятнадцять хвилин на IP-адресу та порівняннями в сталий час; інтерфейс слухає лише на локальній адресі, тож вебсервер — єдиний публічний шлях.

Маркування покриття через обов’язкове страхування заслуговує окремого речення, бо це поле з найбільшою цінністю для пацієнта і з найбільшим ризиком для клініки: це твердження з наслідками. Тому воно живе як дані, відредаговані установою, а не як текст, написаний нами на сторінці; ми будуємо поле, відображення і можливість виправити його за хвилину.

Що входить

Що конкретно змінюється у стоматологічних клініках

Кожна послуга — це позиція зі своєю одиницею, а не рядок у таблиці цін

Структура даних кожної послуги має категорію, підкатегорію, назву, ціну, одиницю виміру та індикатор відповідності для обов’язкового страхування. Одиниці — це реальні одиниці галузі — зуб, щелепа, видалення, випадок лікування, сеанс, візит, консультація, анестезія, процедура, дослідження, втручання — бо ціна без одиниці породжує саме ту розмову, якої рецепція хоче уникнути.

Таксономія на двох рівнях, щоб довгий список залишався зручним для перегляду

Категорія і підкатегорія, а не плоский список. У роботі, про яку ми пишемо: 7 категорій і 10 підкатегорій понад 89 послуг. Порядок величини має значення — для менш ніж сотні позицій таксономії на двох рівнях достатньо; понад кілька сотень структура стає іншою розмовою, і ми кажемо це заздалегідь, а не потім.

Маркування покриття страхуванням як дані установи

Індикатор відповідності стоїть на кожній послузі, у публічних даних, і його може редагувати клініка. У наведеній роботі 27 із 89 послуг позначені як такі, що відповідають вимогам. Ми самі не пишемо, що входить у страхування, і не виводимо це: це твердження установи з наслідками для пацієнта, і воно має бути виправним нею в будь-який момент.

Окремі екрани для невідкладних випадків, ортодонтії, імплантів, педодонтії

Не одна сторінка «Послуги». Сайт має 22 екрани — від послуг і цін до невідкладних випадків, ортодонтії, імплантів, педодонтії, прозорості та відгуків. Причина практична: той, хто шукає «стоматологічну невідкладну допомогу» в неділю ввечері, не хоче загальну сторінку, а сторінка розділу має що сказати про графік і про те, що в ньому робиться.

Персонал редагує, розробник не в ланцюгу

Послуги та команда редагуються з панелі, а записи вимагають дійсний токен; читання залишаються публічними, щоб сайт працював без автентифікації. Наслідок для клініки: зміна тарифу входить того ж дня, а не в наступну ітерацію розробки.

Пароль не залишає сервер, а спроби обмежені

Автентифікація виконується на сервері й повертає токен, підписаний HMAC-SHA256, дійсний 12 годин, з максимумом 8 спроб на 15 хвилин на IP-адресу та порівняннями в сталий час. Секрет для підпису генерується сам, у файлі з обмеженими правами, що зберігається поза репозиторієм. Це цифри з коду, а не загальні принципи — їх можна прочитати і оскаржити.

Інтерфейс програмування не відкрито напряму в інтернет

Він слухає лише на локальній адресі, тож вебсервер попереду — єдиний публічний шлях; список дозволених доменів є явним, а тіло запитів обмежене 1 MB. Записи вимагають токен, читання — ні. Це звичайна конфігурація — проблема в тому, що коли її немає, це не видно зовні аж до дня, коли хтось її знаходить.

Безперервна інтеграція відхиляє пакет, якщо знаходить у ньому секрет

Перевірка, яка компілює і перевіряє типи, робить іще одну річ, яку роблять небагато проєктів: шукає секрети в зібраному пакеті й падає, якщо знаходить. Це прямо пов’язано з виправленою на етапі отримання помилкою — пароль потрапив у публічний пакет саме тому, що ніхто цього не перевіряв. Понад це — щотижневий ритм оновлень залежностей.

Що не робить сайт стоматологічної клініки

Не підтверджує запис самостійно: збирає запит, а підтвердження потребує або людини, або підключення до системи запису клініки — окрема робота, зі своїми умовами. Не публікує клінічну інформацію, написану нами: зміст про лікування є відповідальністю спеціалістів. І не вирішує, що входить в страхування.

Traseul

Як запит проходить через систему.

01

Інвентаризуємо номенклатуру до дизайну

Перша поставка — це список тарифних позицій з одиницею кожної та з позначкою покриття, у формі, в якій її веде клініка. Якщо списку немає в структурованому вигляді — а зазвичай він є як файл таблиці або як документ — ми структуруємо його самі, а клініка його підтверджує. Дизайн іде після, бо він залежить від того, скільки є позицій.

02

Будуємо публічну структуру і панель в один етап

Публічні екрани і панель, з якої редагують, не робляться окремо, бо інакше з’являються поля, що відображаються, але не редагуються. Ми здаємо сайт із завантаженими реальними даними, а не з наповнювачем — сайт клініки, заповнений тимчасовим текстом, ніхто не зможе оцінити.

03

Закриваємо записи і перевіряємо ззовні

Аутентифікація на сервері, підписаний токен, ліміт спроб, інтерфейс запису лише на локальній адресі, список дозволених доменів, ліміт на тіло запитів. Ми здаємо результат перевірки, зробленої ззовні: що можна прочитати без аутентифікації і що не можна записати.

04

Передаємо з навчанням для того, хто редагує, а не лише з паролями

Передаємо доступи, документ про введення в експлуатацію і коротке навчання для людини, яка змінюватиме тарифи та команду. Передача не вважається завершеною, доки хтось із клініки самостійно не зробить зміну, яка з’явиться на сайті.

1Server web în față2pachet static construit3interfață de programare doar pe adresa locală4fișiere structurate cu serviciile și echipaCitirile trec public; scrierile cer un jeton semnat, valabil 12 ore.
4 straturi

Дані

Чого торкаємося, де воно лежить і скільки лишається

Правила відрізняються від однієї галузі до іншої. Це ті, що застосовуються в стоматологічних клініках.

Що є публічним і що ні, на сайті клініки
Публічне: список послуг з одиницею та позначкою покриття, команда, графік, контакти установи. Непублічне: будь-що, що надходить із форми. Різниця здається очевидною, доки хтось не розмістить на сторінці відгуку повідомлення зі своїм ім’ям і проблемою — саме тому форми та публічне відображення ніколи не ділять одне й те саме джерело.
Запит на запис містить дані про здоров’я
«У мене болить нижній лівий зуб мудрості» — це інформація про здоров’я ідентифікованої особи, з категорії з суворішим режимом. Практичні наслідки визначаються під час впровадження: хто має доступ до отриманих повідомлень, як довго вони зберігаються, яким каналом надходять і що ніколи не запитують у формі.
Ціни та позначка покриття належать установі
Ми будуємо їх як структуру і як панель; їхній зміст належить клініці і змінюється за її рішенням. Ми не публікуємо жодної цифри тарифу як приклад у наших матеріалах, навіть з ілюстративною метою — тариф, вирваний з контексту, стає твердженням про клініку.
Хто може писати в публічні дані
Лише той, хто має дійсний жетон, отриманий через автентифікацію на сервері, з лімітом спроб. Читання є публічними, бо так і має бути. Різниця між цими двома реченнями — це саме той дефект, який ми виправили під час прийняття згаданого проєкту.
Що лишається в історії репозиторію
Історія проєкту майже завжди містить дані, які ніхто не додавав туди навмисно: номер телефону, адресу e-mail, ім’я адміністратора контенту. Ми поводимося з ними саме так — їх не переносять у публічні матеріали й видаляють із контенту на вимогу клієнта.

Випадок

Пароль адміністратора, який потрапляв у пакет, що обслуговував браузер

Ситуація

Під час прийняття сайту стоматологічного центру панель керування мала дві проблеми, які були видимі лише зсередини. Перша: пароль порівнювався в браузері, тож потрапляв у публічний JavaScript-пакет. Друга: запити на запис до API міг робити будь-хто з інтернету, а порт був відкритий напряму.

Що ми збудували

Ми перенесли перевірку на сервер: автентифікація повертає жетон, підписаний HMAC-SHA256, дійсний 12 годин, з лімітом 8 спроб на 15 хвилин на IP-адресу та порівняннями в сталому часі; секрет підписування генерується самостійно, з обмеженими правами, поза репозиторієм. API залишився слухати лише на локальній адресі, з вебсервером попереду, списком дозволених доменів і обмеженням тіла запиту до 1 MB. Записи до сервісів і до команди потребують жетона; читання лишилися публічними. Поверх усього — безперервна інтеграція, яка збирає, перевіряє типи й відхиляє пакет, якщо знаходить у ньому секрет.

Що вийшло

Публічні дані клініки можна перевірити ззовні й сьогодні: 89 сервісів, кожен із категорією, підкатегорією, ціною, одиницею та індикатором покриття страхуванням, з яких 27 позначені як такі, що відповідають вимогам. Змінилося те, хто може в них писати.

Чого цей випадок не каже

Не ми побудували першу версію сайту. З історії репозиторію частина комітів належить зовнішнім розробникам. Ту частину, яку ми можемо показати через diff, становить прийняття: безпека, безперервна інтеграція, типи, залежності.

Питання

Що запитують у стоматологічних клініках

Можемо самі змінювати ціни, без вашого дзвінка?

Так — це половина роботи. Сервіси й команда редагуються з панелі; записи потребують автентифікації, читання залишаються публічними. Наша рекомендація: під час здачі роботи та людина, яка цим займатиметься, вносить зміну при нас, щоб ми знали, що це працює з її рук, а не з наших.

Як показати, що входить до обов’язкового страхування?

Як індикатор біля кожного сервісу, у тих самих даних, які ви редагуєте. У роботі, на яку ми посилаємося, 27 із 89 сервісів позначені як такі, що відповідають вимогам. Ми будуємо поле й відображення; що саме є таким, що відповідає вимогам, — це твердження установи, бо воно має наслідки для пацієнта й для клініки.

Чому одиниця виміру важлива для ціни?

Бо в стоматології ціна не за візит. Вона за зуб, за щелепу, за видалення, за пролікований випадок, за сеанс. Ціна, показана без одиниці, породжує рівно ту розмову, яку рецепція веде десять разів на день, і, що гірше, відчуття пацієнта, що йому телефоном сказали інше.

Сайт може робити запис на прийом?

Може збирати запит. Підтвердження часу потребує або людини, яка подивиться в розклад, або підключення до системи запису клініки — це окрема робота, з перевіркою сумісності перед початком. Ми не називаємо «онлайн-записом» форму, яка надсилає e-mail.

Хто пише тексти про лікування?

Фахівці клініки. Ми не пишемо клінічну інформацію і не «оптимізуємо» її для пошуку, бо це означало б формулювати медичні твердження від імені медичної установи. Ми структуруємо, ставимо запитання, на які текст має відповісти, і публікуємо його після підтвердження.

У мене вже є сайт, зроблений кимось іншим. Ви можете його взяти на себе?

Так, і робота, про яку ми пишемо тут, — саме про це. Що ми робимо спочатку під час прийняття: дивимося, що можна записати ззовні, де лежать паролі та що потрапляє в пакет, який обслуговує браузер. У наведеному випадку пароль адміністратора потрапляв у публічний пакет, а записи міг робити будь-хто. Ми перенесли перевірку на сервер і закрили запис.

Як швидко видно зміну тарифу?

Одразу після збереження, тому що публічні дані читаються з того самого джерела, яке ви редагуєте. Чого ми не обіцяємо — це швидкості оновлення результатів у пошукових системах: це від нас не залежить, і ми не можемо цього гарантувати.

Що відбувається з даними з контактної форми?

Це визначається під час впровадження: куди вони потрапляють, хто їх бачить, як довго зберігаються і чого ніколи не запитують у формі. У клініці повідомлення часто містить опис проблеми зі здоров’ям, тож це не «лід», а категорія даних із суворим режимом — і порядок її обробки прописується в опублікованій політиці клініки.

Сайт писатиме, що його зробили ви?

Лише якщо ви хочете. Деякі з наших робіт мають атрибуцію в підвалі, інші ні — залежить від клієнта. Ми згадуємо це, бо це запитання ставлять клініки і тому що, коли сайт не має жодної атрибуції, ми теж не представляємося авторами без їхньої згоди.

Що вам хотілося б налагодити?

Розкажіть про свій процес. Разом визначимо, що варто збудувати, що можна підключити і як перевіримо результат.

Поговорімо