[{"data":1,"prerenderedAt":207},["ShallowReactive",2],{"case-study-pony-academy-pl":3},{"id":4,"title":5,"body":6,"description":173,"extension":174,"featured":175,"interactive":176,"meta":177,"navigation":175,"path":178,"seo":179,"stem":180,"subtitle":181,"tags":182,"technologies":189,"__hash__":206},"caseStudiesPl\u002Fcase-studies\u002Fpl\u002Fpony-academy.md","Pony Academy — Platforma rezerwacji dla szkoły jazdy konnej",{"type":7,"value":8,"toc":163},"minimark",[9,14,18,21,30,37,41,44,47,50,56,60,63,66,69,72,76,79,131,134,138,141,144,147,150,154,157,160],[10,11,13],"h2",{"id":12},"o-projekcie","O projekcie",[15,16,17],"p",{},"Pony Academy prowadzi indywidualne lekcje jazdy konnej dla dzieci. Dla rodzica rezerwacja zaczyna się od zrozumienia doświadczenia: przebiegu lekcji, dostępnego sprzętu i sposobu, w jaki instruktor wspiera dziecko. Dla szkoły każda rezerwacja musi pasować do rzeczywistego harmonogramu instruktorów i koni.",[15,19,20],{},"Zbudowałem publiczną stronę oraz moduł rezerwacji Pony Academy na bazie mojego frameworka Aurum. Zakres łączy dedykowany frontend z dostępnością, rezerwacjami, integracją płatności, dostępem klientów i panelem administracyjnym.",[15,22,23],{},[24,25,29],"a",{"href":26,"rel":27},"https:\u002F\u002Fponyacademy.pl\u002F",[28],"nofollow","Zobacz Pony Academy",[15,31,32],{},[33,34],"img",{"alt":35,"src":36},"Strona główna Pony Academy z informacjami o lekcjach i czytelnym przejściem do rezerwacji","\u002Fcase-studies\u002Fpony-academy\u002Fmain.avif",[10,38,40],{"id":39},"spokojna-droga-od-poznania-oferty-do-rezerwacji","Spokojna droga od poznania oferty do rezerwacji",[15,42,43],{},"Strona wyjaśnia przebieg pierwszej lekcji, zanim poprosi rodzica o decyzję. Łączy informacje o bezpieczeństwie, profil instruktorki, ofertę i odpowiedzi na częste pytania z wyraźnym przejściem do rezerwacji.",[15,45,46],{},"Proces rezerwacji dzieli złożony wybór na sześć kroków: oferta, termin, instruktor, koń, dane kontaktowe i płatność. Interfejs prezentuje dostępność przez API rezerwacji, zamiast wymagać od użytkownika porównywania osobnych kalendarzy. Obsługuje rezerwacje gościnne i konta klientów; założenie konta jest opcjonalne.",[15,48,49],{},"Frontend korzysta z Nuxt, Vue, TypeScript i Pinia. Rezerwacje, konta i integracje treści mają własne granice modułów, dzięki czemu komponenty prezentacyjne nie muszą zawierać reguł harmonogramu ani płatności.",[15,51,52],{},[33,53],{"alt":54,"src":55},"Początek rezerwacji Pony Academy z opcjonalnym kontem klienta i sześcioma etapami procesu","\u002Fcase-studies\u002Fpony-academy\u002Fbooking.avif",[10,57,59],{"id":58},"planowanie-dwóch-zasobów-jednocześnie","Planowanie dwóch zasobów jednocześnie",[15,61,62],{},"Lekcja wymaga zarówno instruktora, jak i odpowiedniego konia. Wolny instruktor nie wystarcza, jeśli koń jest niedostępny, ma już rezerwację albo potrzebuje przerwy.",[15,64,65],{},"Zamodelowałem dostępność na podstawie harmonogramów instruktorów, blokad koni, istniejących rezerwacji, długości lekcji i reguł obciążenia konia. Kalendarz wylicza poprawne terminy z tych danych, zamiast utrzymywać drugi, potencjalnie niespójny zbiór dostępnych godzin.",[15,67,68],{},"Backend chroni również przed równoczesnymi żądaniami. Utworzenie tymczasowej blokady terminu i zmiana harmonogramu używają tych samych blokad zasobu i dnia w transakcji bazodanowej. Konflikty pozostają więc regułą biznesową egzekwowaną przez serwer także wtedy, gdy dwóch klientów lub administrator działa jednocześnie.",[15,70,71],{},"Domena harmonogramu nie zależy od Vue, HTTP, sterowników bazy danych ani dostawcy płatności. Te same reguły mogą obsługiwać publiczną rezerwację i operacje administracyjne.",[10,73,75],{"id":74},"płatność-jako-cykl-życia-rezerwacji","Płatność jako cykl życia rezerwacji",[15,77,78],{},"Powrót z bramki płatniczej nie jest dowodem opłacenia lekcji. Ekran powrotu odczytuje stan rezerwacji i rozróżnia potwierdzenie, oczekiwanie oraz niepowodzenie.",[80,81,82,95],"table",{},[83,84,85],"thead",{},[86,87,88,92],"tr",{},[89,90,91],"th",{},"Sytuacja",[89,93,94],{},"Zachowanie systemu",[96,97,98,107,115,123],"tbody",{},[86,99,100,104],{},[101,102,103],"td",{},"Klient rozpoczyna płatność",[101,105,106],{},"Tymczasowo zablokuj wybrane zasoby i utwórz płatność z kluczem idempotencji.",[86,108,109,112],{},[101,110,111],{},"Powiadomienie o płatności przychodzi ponownie",[101,113,114],{},"Zastosuj zmianę rezerwacji tylko raz przez transakcyjny rejestr zdarzeń.",[86,116,117,120],{},[101,118,119],{},"Blokada terminu wygasa przed otrzymaniem płatności",[101,121,122],{},"Obsłuż spóźnioną płatność przez trwałe zlecenie zwrotu.",[86,124,125,128],{},[101,126,127],{},"Klient wraca z bramki płatniczej",[101,129,130],{},"Odczytaj stan rezerwacji przed pokazaniem potwierdzenia.",[15,132,133],{},"Przeglądarka może zachować sesję blokady rezerwacji, aby umożliwić odzyskanie procesu po odświeżeniu. Wygaśnięcie blokady, zdarzenia płatnicze i zasady anulowania pozostają pod kontrolą backendu. Powiadomienia i planowanie przypomnień są zapisywane razem ze zmianami rezerwacji, wiążąc dalszą pracę z zatwierdzonym stanem.",[10,135,137],{"id":136},"aurum-dla-operacji-aurora-dla-treści","Aurum dla operacji, Aurora dla treści",[15,139,140],{},"Moduł Pony Academy integruje się z kontraktami Payments, Customers, Notifications, Storage i Translations w Aurum. Panel szkoły skupia oferty, konie, instruktorów, dostępność, blokady, rezerwacje i ustawienia powiadomień.",[15,142,143],{},"Tożsamość klienta należy do modułu Customers. Rezerwacja zachowuje własną historyczną kopię danych kontaktowych i oferty, a zweryfikowane konta mogą uzyskać dostęp do powiązanych rezerwacji. Dzięki temu zapis lekcji pozostaje zrozumiały także po późniejszej zmianie danych klienta lub oferty.",[15,145,146],{},"Aurora pozwala wizualnie edytować teksty i obrazy strony. Osadzona aplikacja wysyła intencje zmian do zaufanej aplikacji nadrzędnej, która autoryzuje i zapisuje edycję; publiczny frontend nie przechowuje tokenów administracyjnych. Opublikowane treści są pobierane podczas renderowania po stronie serwera, z określonymi wartościami domyślnymi na wypadek niedostępności usługi treści.",[15,148,149],{},"Projekt rozszerza Aurum poza strony nieruchomości: wspólne usługi platformy obsługują inną domenę biznesową, a publiczna strona zachowuje własną tożsamość.",[10,151,153],{"id":152},"weryfikacja-i-efekt-inżynierski","Weryfikacja i efekt inżynierski",[15,155,156],{},"Kod rezerwacji zawiera testy konfliktów zasobów, równoczesnych blokad terminów i koni, uprawnień, idempotencji płatności oraz granicznych reguł harmonogramu. Scenariusze płatnicze mogą korzystać z lokalnego symulatora dostawcy, pozwalając sprawdzać ścieżki błędów bez rzeczywistych transakcji.",[15,158,159],{},"Publiczna strona i początek rezerwacji działają online. Efektem inżynierskim jest spójny produkt: rodzic poznaje ofertę i przechodzi przez uporządkowaną rezerwację, a implementacja daje szkole wspólny model zasobów, terminów, płatności i komunikacji.",[15,161,162],{},"Kluczową decyzją było pozostawienie reguł biznesowych w domenie rezerwacji, a wspólnych możliwości w Aurum. Dzięki temu frontend może się rozwijać bez powielania zasad chroniących harmonogram szkoły.",{"title":164,"searchDepth":165,"depth":165,"links":166},"",2,[167,168,169,170,171,172],{"id":12,"depth":165,"text":13},{"id":39,"depth":165,"text":40},{"id":58,"depth":165,"text":59},{"id":74,"depth":165,"text":75},{"id":136,"depth":165,"text":137},{"id":152,"depth":165,"text":153},"Dedykowana strona Nuxt i moduł rezerwacji Aurum, które łączą ofertę lekcji, dostępność koni i instruktorów, płatności online, konta klientów oraz administrację szkoły.","md",true,false,{},"\u002Fcase-studies\u002Fpl\u002Fpony-academy",{"title":5,"description":173},"case-studies\u002Fpl\u002Fpony-academy","Przyjazna strona, planowanie dostępności i zaplecze oparte na Aurum",[183,184,185,186,187,188],"Aurum","Nuxt","System rezerwacji","Domain-Driven Design","Płatności","Vue.js",[190,192,194,197,200,203],{"name":184,"icon":191},"logos:nuxt-icon",{"name":188,"icon":193},"logos:vue",{"name":195,"icon":196},"TypeScript","logos:typescript-icon",{"name":198,"icon":199},"Node.js","logos:nodejs-icon",{"name":201,"icon":202},"MongoDB","logos:mongodb-icon",{"name":204,"icon":205},"Tailwind CSS","logos:tailwindcss-icon","dDMWBp_NzcZiIMy_dCQcjmUy6Q3zOTn-pmRO_bJqgfw",1793020436760]