Granica prototypu: nie zmieniamy produkcji. localStorage symuluje backend, role, weryfikację, publikację i rezerwacje. Żaden email ani prawdziwe zgłoszenie nie jest wysyłane. Przełączniki scenariuszy służą wyłącznie do testów i muszą zniknąć z wdrożenia produkcyjnego.
| Widok | Cel | Dostępne działania |
|---|---|---|
index.html | Publiczna mapa opiekuna | 11 kategorii, wyszukiwanie tekstowe/głosowe, lista zwijana, piny, zapisane/ostatnio oglądane miejsca, wizytówka, claim i lokalny booking. |
clinic.html?clinic=ID | Jedna konkretna klinika | Claim, status weryfikacji, po zatwierdzeniu szkic profilu, lokalna publikacja, konfiguracja i lista rezerwacji. |
/map/kraj/stan/miasto/slug?preview=1 | Podgląd szkicu właściciela | Jawny napis „Draft preview · not published”; publiczny profil bez tego parametru pokazuje wyłącznie wersję opublikowaną. |
ethos-demo.html | Prezentacja sieci | 144 źródłowe lokalizacje, przełącznik sieć / placówka, wyszukiwanie i pokaz zarządzania wieloma placówkami. |
Parametr starego prototypu hospital pozostaje obsługiwany jako alias clinic. Główny panel zawsze ogranicza mapę do jednego ID; wcześniejsze wybory wielu lokalizacji nie mają na niego wpływu.
Publiczna wizytówka → Claim this clinic → potwierdzenie placówki → dane osoby reprezentującej → przegląd → lokalne zgłoszenie.
| Stan | UI i działania | Następny stan |
|---|---|---|
unclaimed | Claim this clinic. Nazwa i adres placówki; potwierdzenie właściwej kliniki. Imię i nazwisko, rola, email służbowy, telefon, potwierdzenie upoważnienia. | pending po poprawnym wysłaniu. |
pending | Awaiting verification, numer sprawy, podgląd przekazanych danych. Bez edycji profilu, publikacji i ustawień rezerwacji. | needs_info lub approved przez testowy panel recenzenta. |
needs_info | Uwagi recenzenta, formularz z istniejącymi danymi, możliwość poprawy. Powrót pomiędzy krokami zachowuje wprowadzone dane. | pending po ponownym wysłaniu; ten sam numer sprawy. |
approved | Approved · local test. Edytor, publikacja, ustawienia bookingu, lista wizyt. Weryfikacja pozostaje widoczna do wglądu. | Zmiany profilu pozostają w tej samej autoryzowanej roli. |
Walidacje: obowiązkowe imię i nazwisko, obsługiwana rola (owner/manager/staff), email, telefon 7–15 cyfr po normalizacji, potwierdzenie reprezentacji. pending nie pozwala ponownie wysłać tego samego formularza. Odmowa edycji nie zależy wyłącznie od ukrycia przycisku — warstwa stanu również sprawdza status.
Produkcja musi identyfikować zalogowaną osobę, sprawdzać jej uprawnienia do dokładnego clinic_id i niezależnie weryfikować reprezentację placówki. Parametr URL, lokalny status, „My places” ani zatwierdzenie testowe nie stanowią autoryzacji. Wymagane są serwerowe decyzje recenzenta i historia zmian.
W produkcji: osobne wersje szkicu i publikacji, uprawnienia do uploadu, walidacja rzeczywistego typu pliku, storage obrazów, geokodowanie oraz odświeżanie publicznej wersji po publikacji. Godziny otwarcia i dostępność rezerwacji są różnymi danymi.
Booking settings jest dostępne po zatwierdzeniu. Domyślnie booking jest wyłączony. Przykładowe nazwiska lekarzy są danymi testowymi, nie personelem źródłowej kliniki.
Na serwerze rezerwacja musi być atomowa: ponowna kontrola dostępności w transakcji oraz zabezpieczenie przed podwójnym żądaniem. Samo localStorage nie zapewnia ochrony pomiędzy urządzeniami ani równoczesnymi kartami. Produkcja wymaga kalendarzy lekarzy, walidacji danych, polityki anulowania i powiadomień. Aktualny prototyp nie wysyła emaili.
Przycisk Prototype scenarios jest w menu kliniki; na telefonie również przy dolnej krawędzi. Pozwala wybrać stan zgłoszenia, wpisać uwagę recenzenta, wyeksportować JSON i uruchomić test od nowa. Reset wymaga potwierdzenia i dotyczy wyłącznie aktualnej kliniki.
Wykonane kontrole: 9 testów logiki stanu/rezerwacji (uprawnienia, walidacja, poprawa claimu, rozdzielenie szkicu/publikacji, strefa i wyprzedzenie, przypisanie lekarza, konflikty, anulowanie, reset konkretnej kliniki). Przejście przeglądarkowe: zgłoszenie → uzupełnienie → zatwierdzenie → publikacja → ustawienia → rezerwacja → lista kliniki → anulowanie. Dodatkowo testy układu desktop i mobile.
| Plik | Odpowiedzialność |
|---|---|
app.js, map-ui.js/css | Wspólna mapa, kategorie, filtry, wizytówki i stabilny układ. |
clinic-single.js | Jedna placówka, edytor i podgląd profilu, centrowanie, menu. |
clinic-workflow.js | Kroki claimu, stany UI, testowy recenzent, publikacja, ustawienia lekarzy i lista wizyt. |
mvp-store.js | Jedyny lokalny model claimu, szkiców, publikacji, dostępności i rezerwacji. Główne metody opisano poniżej. |
local-booking.js | Kroki opiekuna i obsługa konfliktu w momencie potwierdzenia. |
clinic-mode.js | Wyłącznie wielolokalizacyjne demo Ethos; nie jest ładowany w standardowym panelu. |
locations.json/js | Źródłowy katalog. Nie używać jako bazy właścicieli/claimów. |
voice-search.js | SpeechRecognition z obsługą odmowy/niedostępności. Bez automatycznego uruchamiania mikrofonu; pozostaje wyszukiwanie tekstowe. |
| Grupa | Odczyt / operacja |
|---|---|
| Claim | claim(id), submitClaim(id, contact); decyzja scenario() jest wyłącznie testowa i ma zostać zastąpiona rolą recenzenta po stronie serwera. |
| Profil | draft(id), published(id), saveDraft(id, fields), publish(id) |
| Dostępność | settings(id), saveSettings(id, config), slots(id,date,timeZone,vetId), freeVets(...) |
| Rezerwacje | bookings(id), reserve(id, details, timeZone), cancel(id, bookingId) |
To kontrakt zachowania, nie dokumentacja istniejących endpointów Care. Implementacja obecnie jest synchroniczna. Przy podłączeniu prawdziwego API trzeba użyć wywołań asynchronicznych, stanów ładowania, blokady powtórnego wysyłania i obsługi błędów. Backend pozostaje jedynym źródłem uprawnień, decyzji recenzenta i dostępności. Nie zgadujemy tras API w tym pakiecie.
claim: clinicId, status, caseId, fullName, role, email, phone, authorised, reviewNote, submittedAt, reviewedAt, history. profile: name, address, phone, website, description, profilePhoto, openingHours, timeZone, updatedAt/publishedAt. bookingSettings: enabled, duration, lead, week[7], start, end, staff[{id,name,days[]}]. appointment: id, clinicId, date, time, timeZone, duration, vetId, vetName, petName, ownerName, email, phone, status, createdAt/cancelledAt.
Lokalne klucze mają prefiks pc-mvp-v2: i są rozdzielone przez rodzaj danych oraz clinic_id. Stare szkice i poprzedni wielolokalizacyjny wybór nie przyznają uprawnień w nowym procesie. Dane testowe pozostają zależne od przeglądarki i originu — wszystkie karty uruchamiaj na tym samym porcie.
Rzeczywista autoryzacja i weryfikacja klinik, publikacja do produkcyjnego Care, wysyłka wiadomości, płatności, połączenia PIMS/laboratoria, śledzenie zwierząt/AirTag i pełne grafiki wyjątków/nieobecności personelu. Mapy oraz katalog są realne, a operacje biznesowe w tym pakiecie są lokalnym wzorcem do wdrożenia.
Publiczna wizytówka pozostaje osobną stroną pod dotychczasowym adresem. Claim przypisuje uprawnienia do istniejącego clinic_id; nie tworzy nowego rekordu, sluga, strony ani przekierowania. Zmiana nazwy lub adresu w edytorze nie zmienia automatycznie URL.
Przykład lokalny: Bradley Southside Vet Hospital. W źródle Care ta strona ma canonical na https://www.petscare.com/map/..., chociaż otwiera się na care.petscare.com. Pakiet zachowuje źródłowy canonical; decyzja o zmianie domeny canonical wymaga osobnego audytu SEO.
public-pages.json/js: 26 istniejących ścieżek i metadane pobrane ze źródła. Nie jest to pełny katalog produkcyjny.public-profile-urls.js: wspólne linki z mapy, panelu i podglądu. Parametr ?place=ID jest wejściem zgodności dla wcześniejszego prototypu, a nie nowym publicznym adresem strony posiadającej już ścieżkę Care.map/.../index.html: publiczna nazwa, adres, opis, godziny, title, description, canonical i JSON-LD istnieją w HTML przed uruchomieniem JavaScript.serve_local.py: obsługuje dokładne ścieżki bez wymuszania końcowego ukośnika; nieznane podstrony zwracają 404.Wyłącznie lokalny serwer podglądu dodaje X-Robots-Tag: noindex, follow. Nie kopiować tego nagłówka do publicznych stron produkcyjnych. Ich źródłowe metadane pozostają zachowane.
Filtr sieci Ethos: All locations → State → City. Rodzaj placówki nie jest nazwą filtra geograficznego. Standardowy panel kliniki nadal pokazuje jeden punkt.
Opiekun widzi Book a visit wyłącznie, gdy zatwierdzona klinika włączyła booking. W innym przypadku: Online booking is not available, kontakt telefoniczny, jeśli podany, i zewnętrzna strona, jeśli podana. Brak danych kontaktowych nie jest uzupełniany fikcyjnymi wartościami. Preview booking jest wyłącznie narzędziem panelu kliniki. Kierunek dojazdu jest pojedynczą akcją ikonową w dolnym pasku.
View clinic profile otwiera pełny profil PetsCare pod istniejącym adresem /map/.../slug. Osobno oznaczona Visit clinic website otwiera zewnętrzną stronę. Dla rekordów demo Ethos bez potwierdzonego adresu Care używamy lokalnego ?place=ID&profile=1; nie wymyślamy produkcyjnych ścieżek SEO. W produkcji dostępność bookingu musi pochodzić z autorytatywnego statusu backendu. Lokalnie zależy od zatwierdzenia i ustawień PC_MVP.
Pełne wizytówki są teraz osobnymi dokumentami HTML, a nie rozszerzonymi panelami mapy. Lincoln Square jest przykładem z rzeczywistą galerią, opisem i godzinami. Zobacz audyt danych i integracji z main-site. Poprzednie opisy public-profile-urls.js i ?profile=1 należy czytać z tą aktualizacją: rekordy z istniejącą stroną mają zachowane /map/.../slug, pozostałe demonstracyjne /profile.html?place=ID.