PETSCARE · LOKALNY MVP · 29.10.2026

Od znalezienia kliniki do zarządzania wizytówką i terminami.

Wzorzec zachowania dla wdrożenia Care. Jeden punkt w standardowym panelu kliniki; sieć Ethos jest osobnym demo.

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.

1. Wejścia i role

WidokCelDostępne działania
index.htmlPubliczna mapa opiekuna11 kategorii, wyszukiwanie tekstowe/głosowe, lista zwijana, piny, zapisane/ostatnio oglądane miejsca, wizytówka, claim i lokalny booking.
clinic.html?clinic=IDJedna konkretna klinikaClaim, status weryfikacji, po zatwierdzeniu szkic profilu, lokalna publikacja, konfiguracja i lista rezerwacji.
/map/kraj/stan/miasto/slug?preview=1Podgląd szkicu właścicielaJawny napis „Draft preview · not published”; publiczny profil bez tego parametru pokazuje wyłącznie wersję opublikowaną.
ethos-demo.htmlPrezentacja sieci144 ź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.

2. Claim i uprawnienia

Publiczna wizytówka → Claim this clinic → potwierdzenie placówki → dane osoby reprezentującej → przegląd → lokalne zgłoszenie.

StanUI i działaniaNastępny stan
unclaimedClaim 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.
pendingAwaiting verification, numer sprawy, podgląd przekazanych danych. Bez edycji profilu, publikacji i ustawień rezerwacji.needs_info lub approved przez testowy panel recenzenta.
needs_infoUwagi 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.
approvedApproved · 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.

3. Szkic, publikacja i publiczna wizytówka

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.

4. Ustawienia i rezerwacja

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.

5. Przełączniki i szybki test akceptacyjny

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.

  1. Rozpocznij z Not claimed; mapa ma dokładnie jeden punkt, bez Fado/AirTagów.
  2. Wyślij lokalny claim na danych testowych. Odśwież — nadal Awaiting verification; brak edycji i publikacji.
  3. Ustaw More information needed, dodaj uwagę, popraw email i zgłoś ponownie. Numer sprawy pozostaje ten sam.
  4. Ustaw Approved · local test. Zmień opis, zapisz szkic. Public view bez zmian; Preview draft pokazuje nowy opis.
  5. Publish locally i odśwież Public view — nowy opis jest publiczny w prototypie.
  6. Włącz booking, ustaw dni i lekarzy. Zarezerwuj konkretny przyszły slot z widoku opiekuna.
  7. Otwórz ponownie ten sam dzień i tego samego lekarza: slot jest niedostępny. Any available vet może go nadal pokazywać, jeżeli drugi lekarz jest wolny.
  8. W klinice otwórz Appointments, anuluj testową wizytę. Dostępność wraca.
  9. Sprawdź telefon, zwijanie szczegółów, stałą nawigację mapy i menu.

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.

6. Pliki i kontrakt do integracji

PlikOdpowiedzialność
app.js, map-ui.js/cssWspólna mapa, kategorie, filtry, wizytówki i stabilny układ.
clinic-single.jsJedna placówka, edytor i podgląd profilu, centrowanie, menu.
clinic-workflow.jsKroki claimu, stany UI, testowy recenzent, publikacja, ustawienia lekarzy i lista wizyt.
mvp-store.jsJedyny lokalny model claimu, szkiców, publikacji, dostępności i rezerwacji. Główne metody opisano poniżej.
local-booking.jsKroki opiekuna i obsługa konfliktu w momencie potwierdzenia.
clinic-mode.jsWyłą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.jsSpeechRecognition z obsługą odmowy/niedostępności. Bez automatycznego uruchamiania mikrofonu; pozostaje wyszukiwanie tekstowe.

Metody warstwy PC_MVP

GrupaOdczyt / operacja
Claimclaim(id), submitClaim(id, contact); decyzja scenario() jest wyłącznie testowa i ma zostać zastąpiona rolą recenzenta po stronie serwera.
Profildraft(id), published(id), saveDraft(id, fields), publish(id)
Dostępnośćsettings(id), saveSettings(id, config), slots(id,date,timeZone,vetId), freeVets(...)
Rezerwacjebookings(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.

Model danych

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.

7. Świadomie poza zakresem

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.

8. Istniejące strony klinik i SEO — zachować

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.

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.

9. Booking publiczny zależy od aktywacji

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.

Aktualizacja 30.10 — Pet Parents

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.