Jedna lista obiektów, a obok niej stała kolumna nawigatora: Moje widoki, Klienci, Miasta. Każda pozycja ma licznik. Kliknięcie zawęża listę po prawej. Na telefonie ten sam nawigator jest dolnym arkuszem pod przyciskiem Filtry.
Werdykt: to jest odpowiedź na skalę Filipa. Drzewko zostaje, tylko drzewkiem są klienci i miasta, a nie obiekty. To najdroższy z trzech wariantów, opłacalny powyżej około 100 obiektów albo wtedy, gdy z jednej listy codziennie korzysta kilka osób. Przy dzisiejszych 28 obiektach jest za duży, a przy 331 obiektach Filipa warianty A i B zaczynają być za małe.
01Werdykt i jeden obrazek
Ten dokument opisuje jeden z trzech wariantów. Wszystko, co jest tu opisane jako Jest dziś albo Defekt, ma dowód w kodzie albo w migracji. Wszystko inne jest oznaczone Propozycja i ma cenę w sekcji 9. Nic z tego nie jest wdrożone.
Co to jest
Jedna płaska lista obiektów, stała kolumna nawigatora z licznikami i możliwość zapisania swojego zestawu filtrów pod własną nazwą.
Dla kogo
Dla firmy usługowej, która ma setki obiektów i kilka osób pracujących na tej samej liście. Nie dla zarządcy z trzema obiektami.
Ile kosztuje
Trzy warstwy, sekcja 9. Najdroższa pozycja to zapisane widoki, bo aplikacja nie ma dziś żadnego miejsca na preferencje interfejsu.
Najważniejszy obrazek: dziś kontra po zmianie
Obiekty, stan dzisiejszyWeb 1440pxDefekt
Obiekty
Szukaj obiektu...
Brak klienta - Galeria Robakowo (1)
Galeria Robakowo
Brak klienta
ul. Poznańska 2, Robakowo
5 pracowników
Parking poziom -1
ul. Poznańska 2, Robakowo
2 pracowników
2FSG Sp. z o.o. (14)
Fabryka Formy Malta
2FSG Sp. z o.o.
ul. Baraniaka 88, Poznań
4 pracowników
Strefa cardio
ul. Baraniaka 88, Poznań
2 pracowników
Szatnie
ul. Baraniaka 88, Poznań
2 pracowników
Fabryka Formy Arena
2FSG Sp. z o.o.
ul. Wyspiańskiego 33, Poznań
3 pracowników
Basen
ul. Wyspiańskiego 33, Poznań
2 pracowników
Fabryka Formy Grunwaldzka
2FSG Sp. z o.o.
ul. Grunwaldzka 104, Poznań
3 pracowników
Lidl Poznań Naramowicka
2FSG Sp. z o.o.
ul. Naramowicka 154, Poznań
Sprzątanie codzienne, mycie okien 1x/mies
2 pracowników
Lidl Swarzędz
2FSG Sp. z o.o.
ul. Poznańska 21, Swarzędz
2 pracowników
Utrzymanie terenów zewnętrznych
2FSG Sp. z o.o.
6 pracowników
Anfil Poznań Dębiec
ul. 28 Czerwca 1956 r. 223, Poznań
1 pracowników
Anfil Poznań Winogrady
ul. Murawa 39, Poznań
1 pracowników
Student Depot Polonez
2FSG Sp. z o.o.
ul. Obornicka 1, Poznań
3 pracowników
Część wspólna
ul. Obornicka 1, Poznań
2 pracowników
Wspólnota Mieszkaniowa Grunwaldzka 12
2FSG Sp. z o.o.
ul. Grunwaldzka 12, Poznań
1 pracowników
Obiekty, propozycja CWeb 1440pxPropozycja
Wszystkie obiekty22
Moje widoki
Benefit System Poznań6
Lidl cały kraj3
Klienci
Anfil5
Benefit System6
Lidl3
Bez klienta8
Miasta
Poznań14
Robakowo2
Swarzędz2
Wrocław2
Warszawa1
Bez miasta1
Obiekty
Szukaj obiektu...
22 obiekty, 15 na liście głównej
Anfil (5 obiektów)
Utrzymanie terenów zewnętrznych›Anfil Poznań Dębiec
Anfil Poznań Dębiec
Anfil
ul. 28 Czerwca 1956 r. 223, Poznań
1 pracowników
Utrzymanie terenów zewnętrznych›Anfil Poznań Winogrady
Anfil Poznań Winogrady
Anfil
ul. Murawa 39, Poznań
1 pracowników
Anfil Poznań Jeżyce
Anfil
ul. Dąbrowskiego 81, Poznań
1 pracowników
Anfil Warszawa Mokotów
Anfil
ul. Wołoska 12, Warszawa
1 pracowników
Anfil Wrocław Krzyki
Anfil
ul. Powstańców Śląskich 95, Wrocław
1 pracowników
Benefit System (6 obiektów)
Fabryka Formy Malta
Benefit System
ul. Baraniaka 88, Poznań
4 pracowników
Strefa cardio
ul. Baraniaka 88, Poznań
2 pracowników
Szatnie
ul. Baraniaka 88, Poznań
2 pracowników
Fabryka Formy Arena
Benefit System
ul. Wyspiańskiego 33, Poznań
3 pracowników
1
Po lewej cała lista leży w jednej sekcji o nazwie Twojej własnej firmy, a pod każdą kartą powtarza się ta sama nazwa. Nagłówek sekcji bierze surowe clients.name (objects.tsx:60), więc dla obiektu bez klienta powstaje sekcja Brak klienta - Galeria Robakowo (1), choć karta pod nią pisze poprawnie Brak klienta (objects.tsx:99).
2
Po prawej sekcją jest Klient, a linia pod nazwą obiektu wreszcie niesie informację. Sekcja bez klienta nazywa się po prostu Bez klienta, bez nazwy przypadkowego obiektu w środku.
3
Kolumna nawigatora niczego w danych nie zmienia. Daje to, czego dziś nie ma nigdzie w aplikacji: liczniki. Widać skalę, zanim się cokolwiek kliknie.
Zestawienie pokazuje dzisiejszą skalę: 22 obiekty, 15 na liście głównej. Liczby na makietach są przykładowe, poza tymi, które wprost cytuję z audytu (28 obiektów na LIVE, 12 z rodzicem, maksymalna głębokość 2). W obu ramkach ukryty jest lewy pasek nawigacji, bo jest identyczny i zabierał szerokość. W nagłówku sekcji kod wstawia w tym miejscu długi myślnik, w tym dokumencie zastąpiony zwykłym, żeby dotrzymać zasady zero długich myślników.
Obiekty, dziśMobile 390pxDefekt
9:41. . . .|||100%
Obiekty
Szukaj obiektu...
Brak klienta - Galeria Robakowo (1)
Galeria Robakowo
Brak klienta
ul. Poznańska 2, Robakowo
5 pracowników
Parking poziom -1
ul. Poznańska 2, Robakowo
2 pracowników
2FSG Sp. z o.o. (14)
Fabryka Formy Malta
2FSG Sp. z o.o.
ul. Baraniaka 88, Poznań
4 pracowników
Strefa cardio
ul. Baraniaka 88, Poznań
2 pracowników
Szatnie
ul. Baraniaka 88, Poznań
2 pracowników
Fabryka Formy Arena
2FSG Sp. z o.o.
ul. Wyspiańskiego 33, Poznań
3 pracowników
Basen
ul. Wyspiańskiego 33, Poznań
2 pracowników
Fabryka Formy Grunwaldzka
2FSG Sp. z o.o.
ul. Grunwaldzka 104, Poznań
3 pracowników
Obiekty, propozycja CMobile 390pxPropozycja
9:41. . . .|||100%
Obiekty
Szukaj obiektu...
Filtry
Anfil 5
Benefit System 6
Lidl 3
22 obiekty, 15 na liście głównej
Anfil (5 obiektów)
Utrzymanie terenów zewnętrznych›Anfil Poznań Dębiec
Anfil Poznań Dębiec
Anfil
ul. 28 Czerwca 1956 r. 223, Poznań
1 pracowników
Utrzymanie terenów zewnętrznych›Anfil Poznań Winogrady
Anfil Poznań Winogrady
Anfil
ul. Murawa 39, Poznań
1 pracowników
Anfil Poznań Jeżyce
Anfil
ul. Dąbrowskiego 81, Poznań
1 pracowników
Anfil Warszawa Mokotów
Anfil
ul. Wołoska 12, Warszawa
1 pracowników
Anfil Wrocław Krzyki
Anfil
ul. Powstańców Śląskich 95, Wrocław
1 pracowników
Benefit System (6 obiektów)
Fabryka Formy Malta
Benefit System
ul. Baraniaka 88, Poznań
4 pracowników
1
Na telefonie nie ma miejsca na stałą kolumnę, więc nawigator jest dolnym arkuszem. Nad listą zostaje poziomo przewijany rząd chipów z tymi samymi licznikami.
2
Obie listy są przycięte krawędzią ekranu celowo. Tak wygląda praca na tej liście: przewijanie jest jedyną czynnością, dopóki nie ma czym zawęzić.
Ta sama zmiana, ten sam dzień, dwa urządzenia. Dane identyczne jak w ramkach web powyżej.
02Co powiedział Franek
Sześć zdań Franka z dwóch dni. Pod każdym jedno zdanie o tym, co z niego wynika dla tej propozycji.
17.08, 22:32 · d17_v223213
„Wchodzę dodaj obiekt, dodam obiekt, i ten obiekt mi wchodzi w to drzewko, którego nie chciałem. Wchodzi mi to w główny, a chciałem to przypisać do terenów zewnętrznych.”
Wynika z tego naprawa D3: formularz ma powiedzieć, gdzie obiekt wyląduje, zanim naciśniesz Utwórz.
17.08, 22:33 · d17_v223336
„Pod obiektami powinno być napisane nazwa obiektu, adres, miasto, i ta lista byłaby taka mega długa i nie byłoby żadnego drzewka.”
To jest dokładnie propozycja C: lista jest długa i płaska, a porządek robi nawigator obok niej, nie struktura w danych.
17.08, 22:35 · d17_p223547
„Filipa, który miałby to włożyć do trzystu siłowni. Nie wiem, czy to nie będzie łatwiejsze, jeżeli te wszystkie obiekty będą w jednej linii. Chyba że można to zrobić w ten sposób, że jako obiekt nadrzędny wpisywać klienta.”
Pierwsza połowa tego zdania to propozycja C. Druga połowa została odrzucona 06.08 przez samego Franka, dlatego klient jest tu pozycją w nawigatorze, a nie korzeniem drzewa.
17.08, 22:48 · d17_p224842
„Patrzę sobie od dwóch stron. Czy to weźmie zarządca, czy weźmie ta firma usługowa. I to jest największy błąd w tej sytuacji.”
Nawigator sam wybiera stronę: pusty rejestr klientów oznacza brak sekcji Klienci, więc zarządca dostaje krótszy nawigator bez żadnego ustawiania.
17.08, 22:50 · d17_p225036
„Myślę, że ja to zagmatwałem, bo lepiej jest to zrobić jako każdy obiekt po prostu. Czyli wpisujesz obiekty i później możesz je sobie filtrować. Filip może mieć pięćset za chwilę.”
Zdanie kluczowe dla tego wariantu: filtrowanie ma zastąpić strukturę, a przy pięciuset obiektach chipy nad listą przestają wystarczać i potrzebna jest osobna kolumna.
19.08, 14:24 · d19_p142424
„Te obiekty trzeba podzielić. Szukam łatwego sposobu, czy do każdego obiektu trzeba wpisywać klienta czy co?”
Pełna odpowiedź jest w sekcji 8. W skrócie: nie do każdego, tylko raz na korzeń gałęzi, a dla obiektów już istniejących jest masowy zaznaczacz, który dziś działa.
03Sześć znaczeń słowa klient
To jest tabela z audytu (sekcja 2). Nie jest ciekawostką. To jest wyjaśnienie, dlaczego przy tej aplikacji da się zgubić: słowo klient znaczy tu sześć różnych rzeczy, a napis Klienci na pasku nawigacji znaczy co innego u roli owner niż u szefa firmy.
Nazwa w interfejsie
Nazwa w kodzie
Czym jest naprawdę
Klienci Proofix, Nowy klient Proofix
clients z admin_user_id IS NOT NULL
Firma najemca, która kupiła Proofixa. Widzi to tylko rola owner.
Klienci w Zespole u ownera, Dane firmy-klienta w kreatorze
clients z admin_user_id IS NULL
Klasyczny klient zewnętrzny z modelu sprzed pivotu z 21.04.2026. Model odziedziczony.
Klienci, Karta klienta
end_clients
To jest ten klient, o którego chodzi w tym dokumencie. Rejestr od 06.08.2026. Benefit System, Lidl, Anfil.
Przedstawiciel klienta w kreatorze, Klient na badge'u
profiles.role='client' plus wiersz client_users
Osoba po stronie klienta: dyrektor, kierownik sklepu, recepcja.
Klient * oraz Klient (opcjonalnie) na jednym ekranie
objects.client_id oraz objects.end_client_id
Dwa różne pola obiektu pokazane pod tym samym słowem (objects/new.tsx:507 i :554).
Szef Klienta na badge'u, Szef firmy na liście Zespół
profiles.role='klient_admin'
Administrator firmy najemcy. To w ogóle nie jest klient.
Siódme, ukryte znaczenie: Brak klientaDefekt
objects.client_id jest NOT NULL, więc obiektu bez firmy nie da się zapisać. Interfejs obchodzi to, tworząc sztuczny wiersz w tabeli clients o nazwie Brak klienta - nazwa obiektu z flagą is_internal (objects/new.tsx:219-224). Karta obiektu tę flagę stosuje i pisze Brak klienta, ale nagłówek sekcji jej nie stosuje i pisze pełną nazwę atrapy. Stąd sekcja Brak klienta - Galeria Robakowo (1) na makiecie w sekcji 1.
Dowód: app/(auth)/(tabs)/objects.tsx:60 kontra :99; migracja 20260412000004_internal_client.sql.
Konsekwencja dla tego dokumentu: wszędzie dalej Twoja firma oznacza 2FSG, a Klient oznacza wiersz w rejestrze end_clients, czyli Benefit System, Lidl albo Anfil. Nawigator z propozycji C stoi wyłącznie na tym rejestrze.
04Dlaczego drzewo wyszło dziwnie
Franek nie zbudował złego drzewa. Próbował zbudować jakiekolwiek, bo aplikacja nie pokazywała mu żadnego.
To nie jest uprzejme zdanie, tylko wniosek z trzech faktów z audytu:
Lista obiektów grupuje po Twojej firmie, nie po Kliencie.objects.tsx:60 bierze clients.name, a hooks/useObjects.ts:31 w ogóle nie pobiera end_client_id. Szef jednego tenanta dostaje jedną sekcję z nazwą własnej firmy. Defekt
Nazwa Klienta nie pojawia się nigdzie poza rejestrem. Ani na liście obiektów, ani na karcie zlecenia, ani w obecności, ani w raportach. Pełny grep end_client po app/ i components/ daje 12 plików i żaden z nich to nie te ekrany. Defekt
Zero filtrowania po Kliencie w całej aplikacji.FilterState w zleceniach ma trzy pola: status, priority, objectId (components/ui/FilterBar.tsx:11-27). Defekt
Reguła, która porządkuje resztę
parent_id znaczy jedno: obiekt fizycznie zawiera się w innym obiekcie. Budynek zawiera piętro, hala zawiera strefę.
Test: czy mogę tam wejść i odbić się telefonem o punkt NFC? Tak, to obiekt. Nie, to cecha obiektu.
Utrzymanie terenów zewnętrznych: nie przechodzi. Nikt się nie odbija o kategorię usługi.
Benefit System: nie przechodzi. To firma, nie miejsce.
Fabryka Formy Malta: przechodzi. To adres, na który jedzie ekipa.
Pomysł z 22:35, żeby obiektem nadrzędnym był Klient, został już raz rozpatrzony i odrzucony 06.08 przez samego Franka. Tryb ?jako=klient został wtedy usunięty (objects/new.tsx:99), a zamiast niego powstał rejestr end_clients z decyzją: „Klient to nie jest obiekt. Klient to jest dla mnie numerek.” (migracja 20260806090000:4-8). Propozycja C daje ten sam obraz, o który chodziło, ale zbudowany na rejestrze, który już istnieje, a nie na parent_id.
Dodatkowy powód, żeby nie ruszać parent_id: przeniesienia obiektu w drzewie dziś nie ma, nie ma też RPC ani ochrony przed cyklem, a triggery głębokości, limitu obiektów i dziedziczenia firmy są BEFORE INSERT. Ścieżka UPDATE parent_id jest dziś całkowicie nieosłonięta (audyt 8.2, punkty 6 do 8).
05Pięć rzeczy, które naprawiamy zawsze
Te pięć naprawia każda z trzech propozycji. Różnica między A, B i C zaczyna się dopiero za nimi. Każda pozycja ma dowód.
Nr
Defekt
Dowód
D1
Sekcje listy grupują po Twojej firmie, nie po Kliencie, a end_client_id nie jest nawet pobierane. Szef jednego tenanta widzi jedną sekcję z nazwą własnej firmy.
objects.tsx:60, hooks/useObjects.ts:31
D2
Nagłówek sekcji dla obiektu bez klienta brzmi Brak klienta - Galeria Robakowo (1), bo bierze surowe clients.name, a karta pod nim stosuje is_internal i pisze poprawnie Brak klienta.
objects.tsx:60 kontra :99; 20260412000004_internal_client.sql
D3
Nowy obiekt ląduje na liście głównej i interfejs tego nie mówi. Komunikat to tylko „Obiekt utworzony!”, akordeon rodzica jest zwinięty i nie pokazuje wartości domyślnej.
CHECKLISTA_PRZEKLIKANIE_2026-08-19.md:521-530, S2-012 STATUS FAIL
D4
Szukanie gubi hierarchię. Znaleziony pod-obiekt renderuje się jako korzeń, bo buildObjectTree dostaje już przefiltrowaną listę. Przy 331 obiektach wynik nie mówi, gdzie ta rzecz jest.
checklista :543-551, S2-014 STATUS FAIL, zrzut przeklik_S2-014.png
D5
Na karcie klienta nie ma przycisku Dodaj obiekt, mimo że oba formularze obiektu obsługują ?endClient=. Jedyny przycisk to Dodaj przedstawiciela.
D1 i D2 widać na zestawieniu w sekcji 1. D4 ma własny ekran w sekcji 6. Poniżej D3 i D5.
Nowy obiekt, po naprawie D3Web 1440pxPropozycja
Nowy obiekt
Nazwa obiektu *Anfil Poznań Rataje
Adresul. Piaśnicka 4
MiastoPoznań
Obiekt nadrzędnyBrak. Obiekt na liście głównej
Ten obiekt trafi na listę główną. Nie jest częścią żadnego innego obiektu.
KlientAnfil
Ostatnio używany: Anfil
Klient Anfil zejdzie na wszystkie pod-obiekty tej gałęzi.
Utwórz obiekt
1
Pole Obiekt nadrzędny pokazuje wartość domyślną wprost: Brak. Obiekt na liście głównej. Dziś akordeon jest zwinięty i nie widać, co jest wybrane.
2
Baner mówi, gdzie obiekt wyląduje, zanim naciśniesz Utwórz. To jest jedno zdanie, którego zabrakło Frankowi 17.08 o 22:32.
3
Drugi baner mówi to, czego dziś nie mówi żaden ekran w panelu szefa: klient zejdzie na całą gałąź, bo pod-obiekty dziedziczą go przez wyliczenie object_effective_end_client_id.
Zmiana dotyczy wyłącznie warstwy komunikatu i wartości domyślnej. Reguła, że klienta ustawia się tylko na korzeniu, zostaje bez zmian.
Nowy obiekt, dziśMobile 390pxDefekt
9:41. . . .|||100%
Nowy obiekt
Nazwa obiektu *Anfil Poznań Rataje
Adresul. Piaśnicka 4
MiastoPoznań
Obiekt nadrzędnyWybierz obiekt nadrzędny
Klient (opcjonalnie)Wybierz klienta
Utwórz obiekt
Obiekt utworzony!
Nowy obiekt, po naprawie D3Mobile 390pxPropozycja
9:41. . . .|||100%
Nowy obiekt
Nazwa obiektu *Anfil Poznań Rataje
Adresul. Piaśnicka 4
MiastoPoznań
Obiekt nadrzędnyBrak. Obiekt na liście głównej
Ten obiekt trafi na listę główną. Nie jest częścią żadnego innego obiektu.
KlientAnfil
Utwórz obiekt
Utworzony na liście głównej, klient Anfil.Zmień
1
Po lewej stan dzisiejszy: dwa puste pola wyboru i komunikat „Obiekt utworzony!”, który nie mówi ani gdzie, ani dla kogo.
2
Po prawej ten sam ekran po zmianie. Komunikat nazywa miejsce i klienta, a Zmień pozwala poprawić bez szukania obiektu na liście.
Karta klienta Anfil, po naprawie D5Web 1440pxPropozycja
Anfil
Dane klienta
Nazwa klienta *Anfil
Adresul. Święty Marcin 29
MiastoPoznań
Obiekty klientaDodaj obiekt
Zaznacz istniejące obiekty, które należą do tego klienta. Pod-obiekty zaznaczonego obiektu dziedziczą klienta automatycznie, wystarczy zaznaczyć korzeń gałęzi.
Anfil Poznań Dębiec
ul. 28 Czerwca 1956 r. 223, Poznań
Anfil Poznań Winogrady
ul. Murawa 39, Poznań
Anfil Poznań Jeżyce
ul. Dąbrowskiego 81, Poznań
Anfil Warszawa Mokotów
ul. Wołoska 12, Warszawa
Anfil Wrocław Krzyki
ul. Powstańców Śląskich 95, Wrocław
Galeria Robakowo
ul. Poznańska 2, Robakowo
Przedstawiciele klienta
Filip Nowak
Dyrektor
Dodaj przedstawicielaZapisz zmiany
1
Jedyna nowa rzecz to przycisk Dodaj obiekt. Prowadzi do istniejącego formularza z parametrem ?endClient=, który oba formularze już obsługują (objects/new.tsx:123). Instalacja jest położona, brakowało kontaktu.
2
Reszta karty zostaje bez zmian: masowy zaznaczacz obiektów działa dziś i jest jedyną ścieżką, która pozwala otagować pod-obiekt (EndClientDetailScreen.tsx:311-317).
3
Notka o zakresie zostaje, bo jest prawdziwa: lista pokazuje wyłącznie obiekty z zakresu zalogowanego.
Liczniki obiektów na tej karcie liczą się dziś w przeglądarce, nie na serwerze. Propozycja C to zmienia, bo nawigator bez wiarygodnych liczb nie ma sensu. To jest pozycja kosztowa w sekcji 9, nie ozdobnik.
Karta klienta, dziśMobile 390pxDefekt
9:41. . . .|||100%
Anfil
Dane klienta
Nazwa klienta *Anfil
MiastoPoznań
Obiekty klienta
Anfil Poznań Dębiec
ul. 28 Czerwca 1956 r. 223, Poznań
Anfil Poznań Winogrady
ul. Murawa 39, Poznań
Anfil Poznań Jeżyce
ul. Dąbrowskiego 81, Poznań
Anfil Warszawa Mokotów
ul. Wołoska 12, Warszawa
Przedstawiciele klienta
Filip Nowak
Dyrektor
Dodaj przedstawiciela
Karta klienta, po naprawie D5Mobile 390pxPropozycja
9:41. . . .|||100%
Anfil
Dane klienta
Nazwa klienta *Anfil
MiastoPoznań
Obiekty klientaDodaj obiekt
Anfil Poznań Dębiec
ul. 28 Czerwca 1956 r. 223, Poznań
Anfil Poznań Winogrady
ul. Murawa 39, Poznań
Anfil Poznań Jeżyce
ul. Dąbrowskiego 81, Poznań
Anfil Warszawa Mokotów
ul. Wołoska 12, Warszawa
Przedstawiciele klienta
Filip Nowak
Dyrektor
Dodaj przedstawiciela
1
Po lewej jedyny przycisk na całej karcie to Dodaj przedstawiciela. Żeby dodać obiekt dla tego klienta, trzeba wyjść na zakładkę Obiekty i wybrać klienta ręcznie z listy.
2
Po prawej sekcja Obiekty klienta ma własne Dodaj, dokładnie tak jak sekcja Pod-obiekty na karcie obiektu.
06Jak to wygląda
Od tego miejsca wszystkie makiety pokazują skalę po imporcie Filipa: 331 obiektów, z tego 312 u jednego klienta. Nawigator ma trzy sekcje: Moje widoki, Klienci, Miasta. Na webie jest to stała kolumna 268 px między paskiem nawigacji a treścią. Na telefonie ten sam nawigator jest dolnym arkuszem.
Dlaczego w nawigatorze nie ma sekcji „Rodzaje usług” Defekt danych
Bo nie ma czym jej wypełnić. objects.service_scope to kolumna TEXT bez NOT NULL, bez DEFAULT, bez CHECK, bez klucza obcego i bez indeksu. Nie istnieje żadna tabela słownikowa zakresów usług. Grep po całym repozytorium daje 20 trafień i zero w jakimkolwiek .eq, .ilike, .filter albo .order. Żaden ekran, hook ani funkcja SQL po tym polu nie filtruje, nie grupuje i nie sortuje (audyt 9.4).
To znaczy, że „Utrzymanie terenów zewnętrznych” nie może dziś być pozycją nawigatora ani warunkiem zapisanego widoku. Wycena tej sekcji jest osobno, w sekcji 9. Bez niej ta część nawigatora nie może powstać, i nie należy udawać, że powstanie.
Ekran 1: nawigator, nic nie wybrane
Obiekty, nawigator bez zawężeniaWeb 1440pxPropozycja
Wszystkie obiekty331
Moje widoki
Anfil Poznań138
Benefit System Poznań4
Lidl cały kraj3
Klienci
Anfil312
Benefit System12
Lidl3
Bez klienta4
Miasta
Poznań148
Warszawa61
Wrocław44
Gdańsk27
Katowice19
Kraków18
Szczecin8
Swarzędz6
Obiekty
Szukaj obiektu...
331 obiektów, 318 na liście głównej
Anfil (312 obiektów)
Anfil Poznań Dębiec
Anfil
ul. 28 Czerwca 1956 r. 223, Poznań
1 pracowników
Anfil Poznań Winogrady
Anfil
ul. Murawa 39, Poznań
1 pracowników
Anfil Poznań Jeżyce
Anfil
ul. Dąbrowskiego 81, Poznań
1 pracowników
Anfil Poznań Rataje
Anfil
ul. Piaśnicka 4, Poznań
1 pracowników
Anfil Poznań Stare Miasto
Anfil
ul. Święty Marcin 29, Poznań
2 pracowników
Anfil Poznań Grunwald
Anfil
ul. Grunwaldzka 182, Poznań
1 pracowników
Anfil Poznań Naramowice
Anfil
ul. Sielawy 10, Poznań
1 pracowników
Anfil Poznań Górczyn
Anfil
ul. Głogowska 246, Poznań
1 pracowników
1
Kolumna nawigatora ma 268 px i siedzi między paskiem nawigacji a treścią. Nie zastępuje niczego, co dziś jest.
2
Liczniki są całą wartością tego ekranu. Anfil 312 mówi o skali w jednej sekundzie. Dziś takiej liczby nie ma nigdzie w aplikacji, a na karcie klienta liczy ją przeglądarka.
3
Lista po prawej jest przycięta krawędzią ramki, bo ma 331 pozycji. Tak wygląda ten ekran naprawdę.
Sekcja Miasta stoi na objects.city, które jest wolnym tekstem bez słownika. Zanim liczniki miast będą prawdziwe, trzeba raz ujednolicić wartości. To jest tańsze niż słownik usług, bo miasto ma naturalną postać kanoniczną, ale nie jest za darmo. Pozycja w sekcji 9.
Obiekty, arkusz zamkniętyMobile 390pxPropozycja
9:41. . . .|||100%
Obiekty
Szukaj obiektu...
Filtry
Moje widoki 3
Klient 4
Miasto 8
331 obiektów
Anfil (312 obiektów)
Anfil Poznań Dębiec
Anfil
ul. 28 Czerwca 1956 r. 223, Poznań
1 pracowników
Anfil Poznań Winogrady
Anfil
ul. Murawa 39, Poznań
1 pracowników
Anfil Poznań Jeżyce
Anfil
ul. Dąbrowskiego 81, Poznań
1 pracowników
Anfil Poznań Rataje
Anfil
ul. Piaśnicka 4, Poznań
1 pracowników
Anfil Poznań Stare Miasto
Anfil
ul. Święty Marcin 29, Poznań
2 pracowników
Anfil Poznań Grunwald
Anfil
ul. Grunwaldzka 182, Poznań
1 pracowników
Obiekty, arkusz otwartyMobile 390pxPropozycja
9:41. . . .|||100%
Obiekty
Szukaj obiektu...
331 obiektów
Anfil (312 obiektów)
Anfil Poznań Dębiec
Anfil
ul. 28 Czerwca 1956 r. 223, Poznań
1 pracowników
Anfil Poznań Winogrady
Anfil
ul. Murawa 39, Poznań
1 pracowników
Anfil Poznań Jeżyce
Anfil
ul. Dąbrowskiego 81, Poznań
1 pracowników
Anfil Poznań Rataje
Anfil
ul. Piaśnicka 4, Poznań
1 pracowników
Nawigator
Wszystkie obiekty331
Moje widoki
Anfil Poznań138
Benefit System Poznań4
Klienci
Anfil312
Benefit System12
Lidl3
Bez klienta4
Miasta
Poznań148
Warszawa61
Pokaż 331 obiektów
1
Po lewej stan spoczynku: rząd chipów z licznikami, przewijany poziomo, i lista pod spodem.
2
Po prawej ten sam nawigator jako dolny arkusz. Te same trzy sekcje, te same liczby, ten sam porządek co na webie.
Ekran 2: wybrany Anfil i miasto Poznań
Obiekty, dwa filtry aktywneWeb 1440pxPropozycja
Wszystkie obiekty331
Moje widoki
Anfil Poznań138
Benefit System Poznań4
Lidl cały kraj3
Klienci
Anfil312
Benefit System12
Lidl3
Bez klienta4
Miasta
Poznań148
Warszawa61
Wrocław44
Gdańsk27
Katowice19
Kraków18
Szczecin8
Swarzędz6
Obiekty
Szukaj obiektu...
Anfil ×
Poznań ×
Wyczyść
138 obiektów z 331
Anfil (138 obiektów w Poznaniu)
Anfil Poznań Dębiec
Anfil
ul. 28 Czerwca 1956 r. 223, Poznań
1 pracowników
Anfil Poznań Winogrady
Anfil
ul. Murawa 39, Poznań
1 pracowników
Anfil Poznań Jeżyce
Anfil
ul. Dąbrowskiego 81, Poznań
1 pracowników
Anfil Poznań Rataje
Anfil
ul. Piaśnicka 4, Poznań
1 pracowników
Anfil Poznań Stare Miasto
Anfil
ul. Święty Marcin 29, Poznań
2 pracowników
Anfil Poznań Grunwald
Anfil
ul. Grunwaldzka 182, Poznań
1 pracowników
Anfil Poznań Naramowice
Anfil
ul. Sielawy 10, Poznań
1 pracowników
Anfil Poznań Górczyn
Anfil
ul. Głogowska 246, Poznań
1 pracowników
1
Dwie pozycje nawigatora są podświetlone, a nad listą stoją dwa chipy z krzyżykiem. Zawsze widać, dlaczego lista jest krótsza, niż była.
2
Filtry łączą się przez oraz: klient Anfil oraz miasto Poznań. 138 z 331.
3
Ten ekran jest tym, czym Franek chciał, żeby było drzewko. Różnica jest taka, że nic nie zmienia w danych i da się to cofnąć jednym kliknięciem.
Nawigator, zaznaczanieMobile 390pxPropozycja
9:41. . . .|||100%
Obiekty
Szukaj obiektu...
331 obiektów
Anfil (312 obiektów)
Anfil Poznań Dębiec
Anfil
ul. 28 Czerwca 1956 r. 223, Poznań
1 pracowników
Anfil Poznań Winogrady
Anfil
ul. Murawa 39, Poznań
1 pracowników
Anfil Poznań Jeżyce
Anfil
ul. Dąbrowskiego 81, Poznań
1 pracowników
Anfil Poznań Rataje
Anfil
ul. Piaśnicka 4, Poznań
1 pracowników
Nawigator
Klienci
Anfil312
Benefit System12
Lidl3
Bez klienta4
Miasta
Poznań148
Warszawa61
Wrocław44
Gdańsk27
Pokaż 138 obiektów
Lista po zawężeniuMobile 390pxPropozycja
9:41. . . .|||100%
Obiekty
Szukaj obiektu...
Anfil ×
Poznań ×
Zapisz widok
Wyczyść
138 obiektów z 331
Anfil Poznań Dębiec
Anfil
ul. 28 Czerwca 1956 r. 223, Poznań
1 pracowników
Anfil Poznań Winogrady
Anfil
ul. Murawa 39, Poznań
1 pracowników
Anfil Poznań Jeżyce
Anfil
ul. Dąbrowskiego 81, Poznań
1 pracowników
Anfil Poznań Rataje
Anfil
ul. Piaśnicka 4, Poznań
1 pracowników
Anfil Poznań Stare Miasto
Anfil
ul. Święty Marcin 29, Poznań
2 pracowników
Anfil Poznań Grunwald
Anfil
ul. Grunwaldzka 182, Poznań
1 pracowników
1
Po lewej wybór w arkuszu. Przycisk na dole liczy wynik przed zamknięciem arkusza, więc nie trzeba zgadywać.
2
Po prawej efekt: chipy aktywne, licznik „138 obiektów z 331” i skrót Zapisz widok od razu pod ręką.
Ekran 3: zapisanie widoku
Widok to preferencja użytkownika, nie nowy wspólny byt
Zapisany widok nie tworzy obiektu, nie tworzy klienta i nie zmienia ani jednego wiersza w objects. Zapisuje tylko zestaw filtrów pod nazwą, którą sam nadajesz, i widzisz go wyłącznie Ty. Franek odtwarza w ten sposób swoje kategorie, nie dotykając danych.
Co sprawdziłem w audycie i w repozytorium: aplikacja nie ma dziś żadnego miejsca na preferencje interfejsu. Jedyna tabela preferencji to notification_preferences (user_id, event_type, enabled) z twardym CHECK na dwanaście typów zdarzeń, więc nie da się do niej nic dopisać (zrzut schematu db_schema_2026-08-18_pre_fala_z2z8.sql:6182-6188). Biblioteki AsyncStorage w repozytorium nie ma w ogóle, a SecureStore jest użyty wyłącznie do trzymania sesji Supabase (lib/supabase.ts:25-63). Zapisane widoki wymagają więc nowej tabeli z własnym RLS, nowego hooka i migracji. To jest najdroższa pojedyncza pozycja w tej propozycji.Koszt
Ograniczenie, które trzeba powiedzieć od razu: widok może zawierać tylko to, co realnie da się odfiltrować, czyli klienta, miasto i tekst wyszukiwania. Widoku „Tereny zewnętrzne Poznań” nie da się dziś zapisać, dopóki rodzaj usługi nie jest słownikiem.
Zapisz widokWeb 1440pxPropozycja
Wszystkie obiekty331
Moje widoki
Anfil Poznań138
Benefit System Poznań4
Lidl cały kraj3
Klienci
Anfil312
Benefit System12
Lidl3
Bez klienta4
Miasta
Poznań148
Warszawa61
Wrocław44
Gdańsk27
Katowice19
Kraków18
Szczecin8
Swarzędz6
Obiekty
Szukaj obiektu...
Anfil ×
Poznań ×
Zapisz widok
138 obiektów z 331
Anfil Poznań Dębiec
Anfil
ul. 28 Czerwca 1956 r. 223, Poznań
1 pracowników
Anfil Poznań Winogrady
Anfil
ul. Murawa 39, Poznań
1 pracowników
Anfil Poznań Jeżyce
Anfil
ul. Dąbrowskiego 81, Poznań
1 pracowników
Anfil Poznań Rataje
Anfil
ul. Piaśnicka 4, Poznań
1 pracowników
Anfil Poznań Stare Miasto
Anfil
ul. Święty Marcin 29, Poznań
2 pracowników
Anfil Poznań Grunwald
Anfil
ul. Grunwaldzka 182, Poznań
1 pracowników
Zapisz widok
Nazwa widokuAnfil Poznań
Klient: Anfil
312 obiektów
Miasto: Poznań
148 obiektów
Widok zapisuje się tylko dla Ciebie. Nie zmienia danych i nie widzą go inni.
AnulujZapisz
1
Okno pokazuje wprost, co wchodzi w skład widoku: dwa warunki, które są w tej chwili aktywne.
2
Zdanie „Widok zapisuje się tylko dla Ciebie” jest w interfejsie, a nie w dokumentacji. Bez niego pierwsze pytanie brzmi: czy Filip to teraz widzi.
3
Nazwę nadaje użytkownik. To jest miejsce, w którym Franek może wpisać swoje „Tereny zewnętrzne Poznań”, o ile ten widok da się zbudować z dostępnych filtrów.
Zapisz widok, arkuszMobile 390pxPropozycja
9:41. . . .|||100%
Obiekty
Szukaj obiektu...
138 obiektów z 331
Anfil Poznań Dębiec
Anfil
ul. 28 Czerwca 1956 r. 223, Poznań
1 pracowników
Anfil Poznań Winogrady
Anfil
ul. Murawa 39, Poznań
1 pracowników
Anfil Poznań Jeżyce
Anfil
ul. Dąbrowskiego 81, Poznań
1 pracowników
Zapisz widok
Nazwa widokuAnfil Poznań
Klient: Anfil
312 obiektów
Miasto: Poznań
148 obiektów
Widok zapisuje się tylko dla Ciebie. Nie zmienia danych.
Zapisz widok
Widok zapisanyMobile 390pxPropozycja
9:41. . . .|||100%
Obiekty
Szukaj obiektu...
Widok: Anfil Poznań ×
Filtry
138 obiektów z 331
Anfil Poznań Dębiec
Anfil
ul. 28 Czerwca 1956 r. 223, Poznań
1 pracowników
Anfil Poznań Winogrady
Anfil
ul. Murawa 39, Poznań
1 pracowników
Anfil Poznań Jeżyce
Anfil
ul. Dąbrowskiego 81, Poznań
1 pracowników
Anfil Poznań Rataje
Anfil
ul. Piaśnicka 4, Poznań
1 pracowników
Anfil Poznań Stare Miasto
Anfil
ul. Święty Marcin 29, Poznań
2 pracowników
Anfil Poznań Grunwald
Anfil
ul. Grunwaldzka 182, Poznań
1 pracowników
Widok zapisany. Widzisz go tylko Ty.Cofnij
1
Ten sam formularz, ta sama treść, tylko jako arkusz. Zero osobnego ekranu do utrzymania.
2
Po zapisie widok staje się pierwszym chipem, a komunikat powtarza najważniejsze: widzisz go tylko Ty.
Ekran 4: arkusz filtrów i lista z chipami
Dwóch klientów narazWeb 1440pxPropozycja
Wszystkie obiekty331
Moje widoki
Anfil Poznań138
Benefit System Poznań4
Lidl cały kraj3
Klienci
Anfil312
Benefit System12
Lidl3
Bez klienta4
Miasta
Poznań148
Warszawa61
Wrocław44
Gdańsk27
Katowice19
Kraków18
Szczecin8
Swarzędz6
Obiekty
Szukaj obiektu...
Widok: Anfil Poznań ×
Anfil ×
Poznań ×
Wyczyść
138 obiektów z 331
Anfil Poznań Dębiec
Anfil
ul. 28 Czerwca 1956 r. 223, Poznań
1 pracowników
Anfil Poznań Winogrady
Anfil
ul. Murawa 39, Poznań
1 pracowników
Anfil Poznań Jeżyce
Anfil
ul. Dąbrowskiego 81, Poznań
1 pracowników
Anfil Poznań Rataje
Anfil
ul. Piaśnicka 4, Poznań
1 pracowników
Anfil Poznań Stare Miasto
Anfil
ul. Święty Marcin 29, Poznań
2 pracowników
Anfil Poznań Grunwald
Anfil
ul. Grunwaldzka 182, Poznań
1 pracowników
Anfil Poznań Naramowice
Anfil
ul. Sielawy 10, Poznań
1 pracowników
Anfil Poznań Górczyn
Anfil
ul. Głogowska 246, Poznań
1 pracowników
1
Zapisany widok jest zwykłym skrótem do zestawu chipów. Po kliknięciu widać dokładnie te same chipy, które można ręcznie zdjąć.
2
Wyczyść wraca do pełnych 331 jednym kliknięciem. To jest różnica między filtrem a strukturą: filtru nikt nie musi sprzątać.
Arkusz, wybór wielokrotnyMobile 390pxPropozycja
9:41. . . .|||100%
Obiekty
Szukaj obiektu...
331 obiektów
Fabryka Formy Malta
Benefit System
ul. Baraniaka 88, Poznań
4 pracowników
Strefa cardio
ul. Baraniaka 88, Poznań
2 pracowników
Szatnie
ul. Baraniaka 88, Poznań
2 pracowników
Nawigator
Moje widoki
Anfil Poznań138
Benefit System Poznań4
Lidl cały kraj3
Klienci
Anfil312
Benefit System12
Lidl3
Bez klienta4
Miasta
Poznań148
Warszawa61
Pokaż 15 obiektów
Lista z chipamiMobile 390pxPropozycja
9:41. . . .|||100%
Obiekty
Szukaj obiektu...
Benefit System ×
Lidl ×
Zapisz widok
Wyczyść
15 obiektów z 331
Benefit System (12 obiektów)
Fabryka Formy Malta
Benefit System
ul. Baraniaka 88, Poznań
4 pracowników
Strefa cardio
ul. Baraniaka 88, Poznań
2 pracowników
Szatnie
ul. Baraniaka 88, Poznań
2 pracowników
Fabryka Formy Arena
Benefit System
ul. Wyspiańskiego 33, Poznań
3 pracowników
Basen
ul. Wyspiańskiego 33, Poznań
2 pracowników
Fabryka Formy Grunwaldzka
Benefit System
ul. Grunwaldzka 104, Poznań
3 pracowników
1
W arkuszu można zaznaczyć kilku klientów naraz. Wtedy warunki w obrębie jednej sekcji łączą się przez albo: Benefit System albo Lidl.
2
Lista po zamknięciu arkusza: chipy pokazują komplet warunków, a nagłówki sekcji nadal grupują po Kliencie.
Ekran 5: skala Filipa, 312 obiektów pod jednym klientem
Anfil, 312 obiektówWeb 1440pxPropozycja
Wszystkie obiekty331
Moje widoki
Anfil Poznań138
Benefit System Poznań4
Lidl cały kraj3
Klienci
Anfil312
Benefit System12
Lidl3
Bez klienta4
Miasta
Poznań148
Warszawa61
Wrocław44
Gdańsk27
Katowice19
Kraków18
Szczecin8
Swarzędz6
Obiekty
Szukaj obiektu...
Anfil ×
Wyczyść
312 obiektów z 331
Anfil (312 obiektów)
Anfil Poznań Dębiec
Anfil
ul. 28 Czerwca 1956 r. 223, Poznań
1 pracowników
Anfil Poznań Winogrady
Anfil
ul. Murawa 39, Poznań
1 pracowników
Anfil Poznań Jeżyce
Anfil
ul. Dąbrowskiego 81, Poznań
1 pracowników
Anfil Poznań Rataje
Anfil
ul. Piaśnicka 4, Poznań
1 pracowników
Anfil Poznań Stare Miasto
Anfil
ul. Święty Marcin 29, Poznań
2 pracowników
Anfil Poznań Grunwald
Anfil
ul. Grunwaldzka 182, Poznań
1 pracowników
Anfil Warszawa Mokotów
Anfil
ul. Wołoska 12, Warszawa
1 pracowników
Anfil Warszawa Wola
Anfil
ul. Kasprzaka 29, Warszawa
1 pracowników
Anfil Warszawa Ursynów
Anfil
ul. Puławska 427, Warszawa
1 pracowników
Anfil Wrocław Krzyki
Anfil
ul. Powstańców Śląskich 95, Wrocław
1 pracowników
1
Tak wygląda 312 siłowni w jednej sekcji. Bez drugiego filtru to jest ściana, którą się tylko przewija.
2
Dlatego Miasta jest w nawigatorze osobną sekcją, a nie chipem schowanym pod Filtry. Przy jednym dużym kliencie miasto jest drugim wymiarem, który realnie skraca listę.
3
Licznik 312 musi być liczony na serwerze. Dziś liczba obiektów klienta liczy się w przeglądarce z zakresu zalogowanego (lib/utils.ts:258-279 przez EndClientListScreen.tsx:75), więc dwóch menedżerów zobaczyłoby w nawigatorze różne liczby.
Anfil, góra listyMobile 390pxPropozycja
9:41. . . .|||100%
Obiekty
Szukaj obiektu...
Anfil ×
Miasto 8
Wyczyść
312 obiektów z 331
Anfil (312 obiektów)
Anfil Poznań Dębiec
Anfil
ul. 28 Czerwca 1956 r. 223, Poznań
1 pracowników
Anfil Poznań Winogrady
Anfil
ul. Murawa 39, Poznań
1 pracowników
Anfil Poznań Jeżyce
Anfil
ul. Dąbrowskiego 81, Poznań
1 pracowników
Anfil Poznań Rataje
Anfil
ul. Piaśnicka 4, Poznań
1 pracowników
Anfil Poznań Stare Miasto
Anfil
ul. Święty Marcin 29, Poznań
2 pracowników
Anfil Poznań Grunwald
Anfil
ul. Grunwaldzka 182, Poznań
1 pracowników
Anfil i Poznań, dalej w dółMobile 390pxPropozycja
9:41. . . .|||100%
Obiekty
Anfil ×
Poznań ×
Wyczyść
138 obiektów z 331
Anfil Poznań Stare Miasto
Anfil
ul. Święty Marcin 29, Poznań
2 pracowników
Anfil Poznań Grunwald
Anfil
ul. Grunwaldzka 182, Poznań
1 pracowników
Anfil Poznań Naramowice
Anfil
ul. Sielawy 10, Poznań
1 pracowników
Anfil Poznań Górczyn
Anfil
ul. Głogowska 246, Poznań
1 pracowników
Anfil Poznań Piątkowo
Anfil
ul. Szymanowskiego 15, Poznań
1 pracowników
Anfil Poznań Malta
Anfil
ul. Baraniaka 2, Poznań
2 pracowników
Anfil Poznań Wilda
Anfil
ul. Dolna Wilda 87, Poznań
1 pracowników
Anfil Poznań Podolany
Anfil
ul. Druskienicka 12, Poznań
1 pracowników
1
Po lewej sam klient: 312 pozycji i przewijanie bez końca.
2
Po prawej ten sam ekran po dołożeniu miasta: 138 pozycji i widać, że lista realnie się skończy. To jest cały mechanizm tej propozycji w dwóch obrazkach.
Ekran 6: szukanie ze ścieżką (naprawa D4)
Wyniki szukania ze ścieżkąWeb 1440pxPropozycja
Wszystkie obiekty331
Moje widoki
Anfil Poznań138
Benefit System Poznań4
Lidl cały kraj3
Klienci
Anfil312
Benefit System12
Lidl3
Bez klienta4
Miasta
Poznań148
Warszawa61
Wrocław44
Gdańsk27
Katowice19
Kraków18
Szczecin8
Swarzędz6
Obiekty
cardio
4 wyniki z 331 obiektów
Benefit System (3 wyniki)
Fabryka Formy Malta›Strefa cardio
Strefa cardio
Benefit System
ul. Baraniaka 88, Poznań
2 pracowników
Fabryka Formy Arena›Parter›Strefa cardio
Strefa cardio
Benefit System
ul. Wyspiańskiego 33, Poznań
1 pracowników
Fabryka Formy Grunwaldzka›Cardio i rowery
Cardio i rowery
Benefit System
ul. Grunwaldzka 104, Poznań
1 pracowników
Anfil (1 wynik)
Utrzymanie terenów zewnętrznych›Anfil Poznań Winogrady›Strefa cardio
Strefa cardio
Anfil
ul. Murawa 39, Poznań
1 pracowników
1
Trzy wyniki nazywają się tak samo. Bez ścieżki nad nazwą nie da się ich rozróżnić, a przy 331 obiektach to jest codzienność.
2
Ścieżka pokazuje też coś, czego nie widać inaczej: ostatni wynik nadal wisi pod korzeniem Utrzymanie terenów zewnętrznych. Przepięcie takich obiektów to osobna fala, warstwa 3 w sekcji 9.
3
Wyniki są nadal pogrupowane po Kliencie, więc szukanie nie wypada z logiki reszty ekranu.
Szukanie, dziśMobile 390pxDefekt
9:41. . . .|||100%
Obiekty
cardio
2FSG Sp. z o.o. (4)
Strefa cardio
ul. Baraniaka 88, Poznań
2 pracowników
Strefa cardio
ul. Wyspiańskiego 33, Poznań
1 pracowników
Cardio i rowery
ul. Grunwaldzka 104, Poznań
1 pracowników
Strefa cardio
ul. Murawa 39, Poznań
1 pracowników
Szukanie, po naprawie D4Mobile 390pxPropozycja
9:41. . . .|||100%
Obiekty
cardio
4 wyniki z 331 obiektów
Benefit System (3 wyniki)
Fabryka Formy Malta›Strefa cardio
Strefa cardio
Benefit System
ul. Baraniaka 88, Poznań
2 pracowników
Fabryka Formy Arena›Parter›Strefa cardio
Strefa cardio
Benefit System
ul. Wyspiańskiego 33, Poznań
1 pracowników
Fabryka Formy Grunwaldzka›Cardio i rowery
Cardio i rowery
Benefit System
ul. Grunwaldzka 104, Poznań
1 pracowników
Anfil (1 wynik)
Utrzymanie terenów zewnętrznych›Anfil Poznań Winogrady›Strefa cardio
Strefa cardio
Anfil
ul. Murawa 39, Poznań
1 pracowników
1
Po lewej stan dzisiejszy: cztery karty bez ścieżki, wszystkie wyrenderowane jako korzenie, bo buildObjectTree dostaje już przefiltrowaną listę (S2-014 STATUS FAIL).
2
Po prawej ta sama lista ze ścieżką do korzenia i z nazwą Klienta. Ta sama liczba wyników, całkiem inna użyteczność.
07Dwie persony
Aplikacja nie musi pytać Franka, czy jest zarządcą, czy firmą usługową. Wystarczy, że patrzy na rejestr klientów. Pusty rejestr oznacza zarządcę i wtedy część nawigatora po prostu nie powstaje.
Co widzi
Zarządca: Fikołki, 3 obiekty
Firma usługowa: 2FSG, 331 obiektów
Rejestr Klienci
Pusty. Nikt tam nic nie wpisał.
Cztery pozycje: Anfil, Benefit System, Lidl, plus obiekty bez klienta.
Sekcja Klienci w nawigatorze
Nie powstaje. Zero pozycji, więc zero sekcji.
Główne wejście. Anfil 312, Benefit System 12, Lidl 3, Bez klienta 4.
Sekcja Miasta
Trzy pozycje: Poznań, Stary Browar liczony jako Poznań, Wrocław. Przy trzech obiektach nawigator jest zwinięty domyślnie.
Osiem pozycji. Drugi wymiar, który realnie skraca listę 312 siłowni Anfilu.
Nagłówki sekcji listy
Znikają. Lista jest płaska, dokładnie taka, o jaką prosił Franek 17.08 o 22:33.
Nagłówkiem jest Klient, karta pokazuje nazwę Klienta zamiast nazwy własnej firmy.
Pole Klient w formularzu obiektu
Nie renderuje się, bo nie ma z czego wybierać.
Renderuje się z podpowiedzią ostatnio używanego klienta.
Zapisane widoki
Działają, ale przy trzech obiektach nikt ich nie potrzebuje.
Główny powód, dla którego ta propozycja jest droższa od A i od B.
Decyzja W9 z audytu (sekcja 10.1, punkt 6) mówi wprost: wariantu zarządcy nie budujemy teraz, ale nie wolno niczego zahardcodować tak, żeby go zamknąć. Ta propozycja tego nie łamie, bo zarządca dostaje mniej sekcji, a nie inny produkt.
08Odpowiedź na pytanie z 19.08
19.08, 14:24 · d19_p142424
„Szukam łatwego sposobu, czy do każdego obiektu trzeba wpisywać klienta czy co?”
Odpowiedź ma trzy części i żadna z nich nie brzmi „do każdego”.
1. U zarządcy: nie
Rejestr klientów jest pusty, więc pole Klient w ogóle się nie renderuje. Nie ma czego wpisywać i nie ma czego pomijać.
2. Przy nowym obiekcie: raz, na korzeniu
Klienta ustawia się na obiekcie głównym. Pod-obiekty dziedziczą go z gałęzi przez wyliczenie object_effective_end_client_id, więc wypełnia się to na budynku, nie na piętrze. Jest dziś
3. Dla obiektów, które już są: masowo
Karta klienta ma zaznaczacz z całym drzewem. Zaznaczasz korzeń gałęzi i zapisujesz. To jedyna ścieżka, która pozwala otagować także pod-obiekt. Jest dziś
Czyli praktycznie: 312 siłowni Anfilu nie trzeba klikać po jednej. Wchodzisz na kartę klienta Anfil, zaznaczasz je w zaznaczaczu i zapisujesz. Dwa masowe UPDATE, jeden zapis (hooks/useEndClients.ts:180-214).
Trzy rzeczy, które trzeba przy tym wiedzieć Defekt
Zaznaczacz na karcie klienta nie blokuje dzieci i nie oznacza dziedziczenia, choć komponent to potrafi. Oba przełączniki są tam domyślnie wyłączone, więc klik przestawia dokładnie jeden węzeł, mimo że notka nad zaznaczaczem mówi o dziedziczeniu przez korzeń gałęzi (audyt 9.8).
Etykieta „(inny klient)” pojawia się tylko przy obiektach z własnym tagiem. Pod-obiekty, które dziedziczą cudzy tag, jej nie mają, mimo że zapis się na nich odbije (potwierdzone klikiem, STATUS FAIL).
Zaznaczacz pokazuje wyłącznie obiekty z Twojego zakresu. Notka o tym jest na karcie klienta, ale nie ma jej na liście klientów.
Propozycja C te trzy rzeczy naprawia, bo nawigator opiera się na tym samym tagu. Są w warstwie 1 i 2 wyceny.
09Co to kosztuje
Trzy warstwy. Rosną nie tyle pracą, co ryzykiem. Szacunki są w dniach roboczych jednej osoby i są szacunkami, a nie ofertą.
Warstwa 1: sam widok Koszt
Pozycja
Szacunek
Uwaga
Join do end_clients w useObjects i zmiana klucza grupowania sekcji
0,5 dnia
Wspólne z propozycjami A i B. SectionList i buildObjectTree już są.
Nazwa Klienta na karcie obiektu zamiast nazwy własnej firmy, sekcja Bez klienta (D1, D2)
0,5 dnia
Naprawa dwóch defektów jedną zmianą.
Kolumna nawigatora 268 px na webie
1,5 dnia
Nowy komponent. Klasa .explorer jest w tym dokumencie, w aplikacji jej nie ma.
Dolny arkusz nawigatora na mobile plus rząd chipów aktywnych
1,5 dnia
Musi mieć własny stan i licznik wyniku przed zamknięciem.
Ścieżka do korzenia w wynikach szukania (D4)
0,5 dnia
Dane są, brakuje renderowania.
Komunikat „gdzie wyląduje obiekt” i wartość domyślna rodzica (D3)
0,5 dnia
Warstwa komunikatu, zero zmian w bazie.
Przycisk Dodaj obiekt na karcie klienta (D5)
0,5 dnia
Parametr ?endClient= obsługują już oba formularze.
Warstwa 2: dane i serwer Koszt
Pozycja
Szacunek
Dlaczego to musi być
Liczba obiektów klienta liczona na serwerze zamiast w przeglądarce
1,5 dnia
Dziś liczy ją funkcja frontowa z zakresu zalogowanego, więc dwóch menedżerów zobaczy różne liczby. Nawigator bez wiarygodnych liczników nie ma sensu. Funkcja SQL o tej roli nie istnieje, grep po repo daje zero trafień (audyt 9.3).
Liczniki miast: jednorazowe ujednolicenie objects.city plus grupowanie po znormalizowanej wartości
1 dzień
city to wolny tekst bez słownika. „Poznan”, „poznań” i „Poznań ” dadzą dziś trzy pozycje w nawigatorze.
Zapisane widoki: nowa tabela, RLS, hook, migracja
3 dni
Aplikacja nie ma żadnego mechanizmu zapisu preferencji interfejsu. Jedyna tabela preferencji to notification_preferences z CHECK na dwanaście typów zdarzeń, AsyncStorage nie występuje w repozytorium, a SecureStore trzyma tylko sesję Supabase. To jest budowa od zera. Najdroższa pojedyncza pozycja tej propozycji.
Zaznaczacz na karcie klienta: włączyć dziedziczenie i oznaczanie gałęzi
1 dzień
Komponent to potrafi, ale oba przełączniki są tam wyłączone (audyt 9.8). Bez tego nawigator pokaże liczby, których zaznaczacz nie umie ustawić jednym kliknięciem.
Warstwa 3: osobna fala, nie razem z resztą Koszt
Przepięcie istniejących obiektów spod korzeni-kategorii, na przykład wyjęcie siłowni Anfilu spod „Utrzymania terenów zewnętrznych”. Szacunek: 2 dni plus test przed i po, zawsze jako oddzielna fala.
Powód jest w audycie i jest twardy: przeniesienia obiektu w drzewie nie ma w aplikacji, nie ma RPC, nie ma ochrony przed cyklem, a triggery głębokości, limitu obiektów i dziedziczenia firmy są BEFORE INSERT. Ręczny UPDATE objects SET parent_id nie przeliczy client_id, nie sprawdzi głębokości, nie sprawdzi limitu i nie sprawdzi tagu klienta, jeśli przenoszony obiekt ma end_client_id = NULL. Trigger integralności milczy przy NULL (audyt 8.1 punkt 4, 8.2 punkty 6 do 8).
Dobra wiadomość: propozycja C tej fali nie wymaga, żeby zadziałać. Nawigator pokaże siłownie Anfilu od razu, bo grupuje po tagu klienta, a nie po pozycji w drzewie. Ścieżka nad nazwą pokaże tylko, że wiszą jeszcze pod starą kategorią. Przepięcie można zrobić później, spokojnie, albo wcale.
Opcja dodatkowa: rodzaj usługi jako słownik PropozycjaKoszt
To nie jest część propozycji C. To osobna decyzja z osobną ceną. Dopóki jej nie ma, sekcja „Rodzaje usług” w nawigatorze nie może powstać, a widoku typu „Tereny zewnętrzne Poznań” nie da się zapisać.
Pozycja
Szacunek
Uwaga
Migracja: tabela słownikowa rodzajów usług plus kolumna z kluczem obcym na objects
1 dzień
Dziś nie istnieje żadna tabela słownikowa zakresów usług.
Pole wyboru w obu formularzach obiektu (panel szefa i panel klient_admina)
1 dzień
Dwa osobne ekrany, dwie ścieżki zapisu.
Filtr i sekcja w nawigatorze plus chip na mobile
1 dzień
Dopiero tu pojawia się to, co widać na ekranie.
Przepisanie istniejących wartości z wolnego tekstu service_scope na pozycje słownika
1 do 3 dni
Robota ręczna, nie automat. „Sprzątanie codzienne, mycie okien 1x/mies” to jedno pole, w którym siedzą dwie usługi i częstotliwość. Ktoś musi zdecydować, na co to się rozpada.
Razem: 4 do 6 dni, z czego najtrudniejsza część to nie kod, tylko decyzja, jaki ma być ten słownik. Dlatego jest osobno: propozycja C działa bez niej, a ona bez propozycji C też ma sens.
Suma
Warstwa 1: około 5,5 dnia. Warstwa 2: około 6,5 dnia. Warstwa 3: 2 dni osobnej fali, opcjonalnie. Opcja dodatkowa rodzaju usługi: 4 do 6 dni, osobna decyzja. Dla porównania: propozycja A to sama warstwa 1 plus drobiazgi, bez nowej tabeli i bez nawigatora.
10Czego to NIE robi
Uczciwe granice. Każda pozycja jest po to, żeby nie było niespodzianki po wdrożeniu.
Nie zmienia tego, że klienta ustawia się z interfejsu tylko na obiekcie korzeniowym. Warunki !parentId w new.tsx:283 i !detail.parent_id w [id].tsx:238 zostają. Jedyny wyjątek to zaznaczacz na karcie klienta, tak jak dziś.
Nie dodaje przenoszenia obiektu w drzewie. Nawigator zawęża listę, ale niczego w drzewie nie przestawia. Przeniesienie to warstwa 3 i osobna fala.
Nie naprawia tego, że trigger integralności milczy przy end_client_id = NULL. Odtagowanie nadal nie zostanie zablokowane niczym.
Nie miesza dwóch torów liczenia zakresu. Role firmowe nadal liczą po parent_id przez get_my_subtree_ids(), a przedstawiciel klienta po tagu przez get_client_object_ids_for(). Nawigator jest warstwą widoku nad tym, co użytkownik i tak widzi, a nie nowym źródłem uprawnień. Nagłówek migracji zabrania podpinania prymitywów odwrotnych pod rolę client i tego nie ruszamy.
Nie grupuje po rodzaju usługi.service_scope to wolny tekst bez słownika i bez ani jednego miejsca w kodzie, które po nim filtruje. Osobna wycena wyżej.
Nie daje przedstawicielowi klienta własnej listy obiektów. Rola client nadal nie ma listy obiektów ani karty obiektu, widzi je tylko przez obecność i patrole. Nawigator jest ekranem dla firmy, nie dla klienta.
Nie dodaje filtru klienta w zleceniach.orders nie ma kolumny klienta, orders.object_id jest NOT NULL. Filtr zleceń po kliencie wymaga joina przez obiekt i jest osobną pozycją, nieujętą w tej wycenie.
Nie odwraca decyzji z 06.08. Klient nie jest obiektem i nie staje się nim w tej propozycji. Jest pozycją w nawigatorze, czyli dokładnie tym „numerkiem”, o którym Franek mówił.
Nie zastępuje zakładki Obiekty ani rejestru Klienci. Oba ekrany zostają tam, gdzie są. Nawigator dokłada kolumnę, a nie zabiera wejście.
11Co to odblokowuje
Jeden join do end_clients na liście obiektów jest tanią rzeczą, która otwiera kilka drzwi naraz. Ta sama nazwa klienta może potem stanąć na karcie zlecenia, w obecności i w raportach, bo dziś nie ma jej nigdzie poza rejestrem. Domyka się też sprawa, która wygląda dziś dziwnie: przedstawiciel klienta nie widzi w interfejsie nawet nazwy klienta, którego reprezentuje, mimo że kolumna end_client_id fizycznie przychodzi do aplikacji w useMyClientUser przez select('*') i tylko nie jest zadeklarowana w typie ani nigdzie renderowana (audyt 6.2). To ten sam join i ta sama godzina pracy. Osobno, jako decyzja handlowa na później, zostaje wątek z 19.08 o 15:17: klient taki jak Anfil mógłby kiedyś kupić aplikację na swoje pozostałe obiekty, a wtedy nazwa klienta widoczna po obu stronach przestaje być kosmetyką i staje się częścią oferty.