Property Manager je sustav za upravljanje najmom nekretnina izgrađen oko tri aplikacije koje dijele jednu MySQL bazu — javne stranice za rezervacije, REST API i Vue admin SPA. Pokreće oglase, prilagođeni mehanizam cijena po danu, rezervacije svjesne preklapanja, višejezični sadržaj te polimorfni galerija/slika pipeline iza jedinstvenog brenda za najam vila.
Property Manager je platforma iza hrvatskog brenda za najam vila. Dijeli se čisto na tri aplikacije koje dijele jednu MySQL bazu: Livewire-renderirane javne stranice za rezervacije, Laravel 11 REST API te Vue 3 + TypeScript admin SPA. Umjesto sinkronizacije podataka preko mreže, dvije Laravel aplikacije čitaju istu Eloquent shemu izravno, pa se javne stranice i administracijski alati nikad ne razilaze oko nekretnine, cijene ili razdoblja dostupnosti.
Zanimljiv rad živi u domenskoj logici. Jedan PricingService pretvara rijetke preinake po noćenju u potpunu ponudu rezervacije, a isti servis napaja i administracijski kalkulator i javni kalendar cijena. Rezervacije se provjeravaju na preklapanja koristeći puna datum-vremena izvučena iz vremena prijave i odjave svake nekretnine, što tiho omogućuje istodnevnu izmjenu — stvarnu potrebu koja zbunjuje većinu naivnih kalendara. Sadržaj kroz otprilike dvadeset entiteta višejezičan je putem Spatie Translatable, a polimorfni sustav galerija s Intervention Image pipelineom obrađuje promjenu veličine, sličice i organizaciju po galeriji pri učitavanju.
Rezultat je namjerno dosadan-na-pravim-mjestima deployment: tri poddomene na zajedničkom hostingu, bash deploy skripta te Larastan i Pint koji drže Laravel stranu poštenom.
Svaka nekretnina ima osnovnu cijenu noćenja, no bilo koji pojedinačni datum može nositi prilagođenu cijenu. Namjenski PricingService prolazi raspon datuma noć po noć, primjenjujući preinake gdje postoje i vraćajući se na osnovnu cijenu.
Rezervacije provjeravaju sukobe s potvrđenim rezervacijama prije spremanja. Javni tok rezervacije koristi puno datum-vrijeme usporedbu pa odjava i nova prijava mogu dijeliti isti dan.
Naslovi, opisi i SEO meta podaci pohranjuju se kao JSON i razrješavaju po lokalizaciji putem Spatie Translatable. Jezicima se upravlja u administraciji i izloženi su prije prijave kako bi se sučelje moglo prikazati na ispravnom jeziku.
Galerije se vežu na nekretnine, stranice ili objave putem para entity_type/entity_id. Učitavanja prolaze kroz FileUploadService, koji mijenja veličinu slika u punoj veličini, generira sličice i organizira datoteke u mape po galeriji.
Lokacije i sadržaji nose i naziv ikone i sanitizirani SVG markup, uz Leaflet karte za postavljanje točaka. Birači ikona mapiraju nazive u SVG putanje kroz marker-utils datoteke zajedničke uređivačima.
Vue administracija izgrađena je na jednom useCrud composableu i generičkom servisnom sloju, pa svaka od dvadeset domenskih značajki ponovno koristi istu fetch/submit/delete infrastrukturu umjesto namjenskog koda.
Javne stranice i administracijski API zasebne su Laravel aplikacije, no dupliciranje pristupa podacima ili sinkronizacija preko HTTP-a otvorila bi prostor za razilaženje i latenciju. Trebale su ostati savršeno dosljedne.
Obje Laravel aplikacije definiraju vlastite Eloquent modele nad istom MySQL shemom i čitaju je izravno — javna aplikacija ne radi nijedan HTTP poziv prema API-ju (grep za Http:: u omniapp/app = 0). Vue SPA jedini je klijent koji prolazi kroz REST API, čime se logika pisanja drži centraliziranom dok čitanja ostaju brza.
Cijene noćenja mijenjaju se za vikende, sezone i posebne datume, no pohranjivanje reda za svaku nekretninu × svaki dan bilo bi rastrošno i teško održivo u skladu s osnovnom cijenom.
Samo preinačeni datumi dobivaju PropertyDailyPrice red; PricingService iterira raspon rezervacije s CarbonPeriod i vraća se na price_per_night gdje god nema preinake. Isti servis izračunava administracijsku ponudu i javnu mapu cijena, pa postoji jedan izvor istine za novac.
Naivna provjera preklapanja datuma ili blokira legitimne istodnevne izmjene (jedan gost odlazi, drugi dolazi) ili dopušta da se dva boravka sudare na zajedničkim danima.
Otkrivanje sukoba uspoređuje puna datum-vremena izgrađena iz check_in_time / check_out_time svake nekretnine, pa se odjava u 10:00 i prijava u 14:00 istog kalendarskog dana ne sukobljavaju, dok se stvarna preklapanja na potvrđenim rezervacijama odbijaju prije spremanja.
Admin SPA i javne stranice nalaze se na različitim poddomenama, ali moraju dijeliti autentifikaciju putem kolačića sesije koju podržava API, na zajedničkom hostingu gdje se korijeni dokumenata ne mogu slobodno premještati.
Sanctum je konfiguriran sa stateful domenama i nadređenim SESSION_DOMAIN (.villasmarinovic.com), uz javne endpointe za jezik i postavke namjerno ostavljene bez autentifikacije kako bi se sučelje moglo pokrenuti prije prijave. Bash deploy skripta povezuje svaku aplikaciju s vlastitim korijenom dokumenata i zakrpava index.php putanje.