// shared.jsx – wspólne dane i komponenty pomocnicze dla 3 wariantów const STEPS = [ { n: '01', title: 'Wybór formy prawnej', short: 'JDG, sp. z o.o. czy spółka partnerska – co się opłaca?', time: '1–3 dni', cost: '0–600 zł', bullets: [ 'JDG – najszybciej, ale pełna odpowiedzialność majątkiem', 'Sp. z o.o. – ograniczona odpowiedzialność, więcej formalności', 'Spółka partnerska – tylko dla wolnych zawodów', ], }, { n: '02', title: 'Lokal i wymagania sanepidu', short: 'Odbiór sanitarny, instalacje, dostępność dla niepełnosprawnych.', time: '4–8 tygodni', cost: 'od 15 000 zł', bullets: [ 'Wymogi rozporządzenia MZ z 26 marca 2019 r.', 'Decyzja PSSE / pozytywna opinia sanepidu', 'Dostępność dla osób z niepełnosprawnościami', ], }, { n: '03', title: 'Personel i kwalifikacje', short: 'Kierownik medyczny, kadra, badania, BHP.', time: '2–6 tygodni', cost: 'wg etatu', bullets: [ 'Kierownik z prawem wykonywania zawodu', 'Umowy z personelem (B2B / etat / kontrakt)', 'Polisa OC obowiązkowa', ], }, { n: '04', title: 'Wpis do RPWDL', short: 'Rejestr Podmiotów Wykonujących Działalność Leczniczą.', time: '14–30 dni', cost: '~600 zł', bullets: [ 'Wniosek przez profil zaufany', 'Wpis do księgi rejestrowej wojewody', 'Numer księgi rejestrowej dla NZOZ', ], }, { n: '05', title: 'Dokumentacja i RODO', short: 'Regulamin, polityki, EDM, IOD jeśli wymagany.', time: '1–2 tygodnie', cost: 'od 2 500 zł', bullets: [ 'Regulamin organizacyjny podmiotu', 'Polityka ochrony danych + rejestr czynności', 'Elektroniczna dokumentacja medyczna (EDM)', ], }, { n: '06', title: 'Kontrakt z NFZ', short: 'Konkurs ofert, kolejka oczekujących, sprawozdawczość. Krok opcjonalny.', time: '3–6 miesięcy', cost: '–', bullets: [ 'Konkurs ofert NFZ – terminy ogłaszane regionalnie', 'Wymagana sprawozdawczość P1 / SZOI', 'Możliwość startu komercyjnego bez kontraktu', ], }, ]; const FAQ = [ { q: 'Czy mogę założyć NZOZ jako jednoosobowa działalność?', a: 'Tak. Lekarz wykonujący zawód w ramach JDG może zarejestrować praktykę jako podmiot leczniczy w RPWDL. Sp. z o.o. wybiera się głównie dla ograniczenia odpowiedzialności i optymalizacji podatkowej powyżej pewnej skali.', }, { q: 'Ile kosztuje uruchomienie małego NZOZ?', a: 'Realny minimalny budżet to ok. 80 000–150 000 zł, zakładając wynajem lokalu, podstawowe wyposażenie, dokumentację, system EDM i 3 miesiące rezerwy operacyjnej. Pełny gabinet z USG i diagnostyką to 250 000+.', }, { q: 'Czy potrzebuję kierownika medycznego?', a: 'Tak – każdy podmiot leczniczy musi wskazać osobę kierującą. W jednoosobowej praktyce lekarskiej kierownikiem jest sam lekarz. W NZOZ z personelem trzeba wskazać konkretną osobę z prawem wykonywania zawodu.', }, { q: 'Ile trwa cała procedura?', a: 'Zakładając równoległe prowadzenie wątków: 8–14 tygodni od decyzji do otwarcia. Najwięcej czasu zabiera dostosowanie lokalu i odbiór sanepidu. Wpis do RPWDL trwa ustawowo do 30 dni.', }, { q: 'Czy muszę mieć kontrakt z NFZ?', a: 'Nie. Wiele NZOZ działa wyłącznie komercyjnie. Kontrakt z NFZ daje stabilny przychód, ale wiąże się z kolejką oczekujących, sprawozdawczością i ograniczeniami cenowymi.', }, ]; const COSTS = { registration: { label: 'Rejestracja i wpisy', base: 1500 }, legal: { label: 'Doradztwo prawne i regulaminy', base: 4500 }, premises: { label: 'Adaptacja lokalu', base: 35000 }, equipment: { label: 'Wyposażenie medyczne', base: 28000 }, software: { label: 'EDM i oprogramowanie (rok)', base: 4800 }, marketing: { label: 'Marka i strona www', base: 6500 }, reserve: { label: 'Rezerwa operacyjna (3 mies.)', base: 45000 }, }; // ── Interaktywny wizard hook ──────────────────────────────────── function useWizard(initial = 0) { const [step, setStep] = React.useState(initial); const [done, setDone] = React.useState(() => new Set()); const toggle = (i) => setDone((s) => { const n = new Set(s); if (n.has(i)) n.delete(i); else n.add(i); return n; }); return { step, setStep, done, toggle }; } // ── Kalkulator hook ───────────────────────────────────────────── function useCalculator() { const [size, setSize] = React.useState(60); // m² const [rooms, setRooms] = React.useState(2); const [staff, setStaff] = React.useState(3); const [nfz, setNfz] = React.useState(false); const items = React.useMemo(() => { const sizeMul = 1 + (size - 60) / 100; const roomMul = 0.7 + rooms * 0.3; const staffMul = 0.8 + staff * 0.15; return { registration: COSTS.registration.base + (nfz ? 800 : 0), legal: Math.round(COSTS.legal.base * (1 + (nfz ? 0.4 : 0))), premises: Math.round(COSTS.premises.base * sizeMul), equipment: Math.round(COSTS.equipment.base * roomMul), software: Math.round(COSTS.software.base * staffMul), marketing: COSTS.marketing.base, reserve: Math.round(COSTS.reserve.base * staffMul), }; }, [size, rooms, staff, nfz]); const total = Object.values(items).reduce((a, b) => a + b, 0); return { size, setSize, rooms, setRooms, staff, setStaff, nfz, setNfz, items, total }; } const fmtPLN = (n) => new Intl.NumberFormat('pl-PL').format(n) + ' zł'; // ── FAQ akordeon ──────────────────────────────────────────────── function useAccordion(initial = -1) { const [open, setOpen] = React.useState(initial); return { open, toggle: (i) => setOpen((c) => (c === i ? -1 : i)) }; } Object.assign(window, { STEPS, FAQ, COSTS, useWizard, useCalculator, useAccordion, fmtPLN, });