Početna / Radovi
Property Manager — Villas Marinović · Hrvatska Stranica uživo ↗
Platforma za rezervacije i CMS

Property ManagerVillas Marinović · Hrvatska

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.

UlogaDesign + full-stack
Godina2025
TehnologijeLaravel 11 · Vue 3 · Livewire 3
PovršinaPublic site + REST API + admin SPA
Uživovillasmarinovic.com
Javne stranice za rezervaciju vila s kalendarom dostupnosti uz Vue administracijski panel
Snimka uskoro
Cijene

Cijene po danu s preinakama po noćenju

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.

  • PropertyDailyPrice redovi preinačuju price_per_night za određene datume
  • Međuzbroj, prosjek po noćenju, naknada za čišćenje i polog vraćaju se kao razrada
  • Isti mehanizam napaja administracijski kalkulator cijena i javni endpoint za cijene
Snimka uskoro
Rezervacije

Rezervacije svjesne preklapanja s istodnevnom izmjenom

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.

  • checkOverlaps() blokira dvostruko rezerviranje na potvrđenim boravcima
  • Provjera prijave/odjave po vremenu dana omogućuje istodnevnu izmjenu
  • Tok statusa: pending → confirmed → completed / cancelled
Snimka uskoro
Sadržaj

Višejezični sadržaj kroz svaki entitet

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.

  • 14 deklaracija prevodivih polja kroz API modele
  • Nekretnine, stranice, objave, izbornici, sadržaji i lokacije svi su lokalizirani
  • Javni preklopnik jezika pokretan iz istih podataka
Snimka uskoro
Mediji

Polimorfne galerije s pipelineom za promjenu veličine

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.

  • Intervention Image v3 (GD) skalira i obrezuje pri učitavanju
  • FilePond učitavač s preraspoređivanjem povlačenjem, skupnim brisanjem i ZIP preuzimanjem
  • SVG sanitizacija za ikonski markup putem enshrined/svg-sanitize
Snimka uskoro
Karte i ikone

Lokacije i sadržaji označeni na karti

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.

  • Leaflet korišten kroz 5 administracijskih modula za koordinate
  • Birači ikona za lokacije i sadržaje podržani marker-utils mapama
  • Endpoint za skupni uvoz lokacija za popunjavanje točaka
Snimka uskoro
Admin SPA

Generički CRUD kroz dvadeset resursa

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.

  • 20 composablea značajki obavija jednu useCrud jezgru
  • Sanctum autentifikacija temeljena na kolačićima kroz administracijsku i javnu domenu
  • VeeValidate + Zod sheme za tipiziranu validaciju obrazaca
Arhitektura

Jedna MySQL baza, tri aplikacije — Livewire javne stranice, Sanctum REST API i Vue SPA administracija.

Klijent
Preglednik — javne stranice + admin SPA
Livewire-renderirane stranice za rezervacije na glavnoj domeni; Vue 3 SPA na administracijskoj poddomeni.
Rub
Tri poddomene na zajedničkom hostingu
villasmarinovic.com, api.* i admin.* mapirani na zasebne korijene dokumenata putem bash deploy skripte.
Aplikacija
Laravel 11 × 2 + Vue
API izlaže zaštićene + javne REST rute pod Sanctumom; javna aplikacija pokreće vlastiti Laravel s Livewire komponentama.
Podaci i mediji
Jedna MySQL DB + pohrana slika
Obje Laravel aplikacije čitaju istu Eloquent shemu izravno; učitavanja se nalaze pod pohranom API-ja i poslužuju se putem URL-a.
Riješeni izazovi
01

Tri aplikacije, jedna baza, bez API poziva između Laravel aplikacija

Problem

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.

Rješenje

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.

02

Cijene koje variraju po noćenju bez eksplozije pohrane

Problem

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.

Rješenje

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.

03

Sprječavanje dvostrukih rezervacija uz dopuštanje istodnevne izmjene

Problem

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.

Rješenje

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.

04

Autentifikacija među poddomenama na zajedničkom hostingu

Problem

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.

Rješenje

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.

Kako je izrađeno
Backend i API
Laravel 11, PHP 8.2+, Sanctum, Spatie Translatable, Intervention Image, MySQL
Admin frontend
Vue 3, TypeScript, Vite, Pinia, shadcn/vue (Radix), VeeValidate + Zod, Tiptap, Leaflet, FilePond, TanStack Table
Javni frontend
Laravel 11, Livewire 3, Blade, Tailwind CSS, vis-timeline calendar
Infrastruktura i kvaliteta
Shared cPanel hosting, bash deploy script, Larastan, Laravel Pint, PHPUnit

Jedna baza, troja ulazna vrata — i mehanizam cijena koji se uvijek slaže sam sa sobom.