# Projektdíjak és Stripe

Az első elmentett projekt fiókonként ingyenes. Minden további projekthely egyszeri, összesen **3 490 Ft**. Alternatívaként havi **2 490 Ft-os**, automatikusan megújuló előfizetés választható korlátlan projekthez. A vásárolt hely a következő új projekt, másolat vagy importált projekt mentésekor foglalódik le. Ugyanazon projekt későbbi mentése ingyenes. Az első és az egyszeri díjjal megvásárolt projektek előfizetés nélkül is elérhetők. Az előfizetés lejártakor a többi projekt megnyitása és mentése zárolódik, de az adataik megmaradnak.

Vendégként egy helyi projekt menthető; további projektekhez saját fiók és projekthely szükséges. A pénzügyi jogosultságokat a szerver ellenőrzi. Az adminpanel nem a böngészőben tárolt adatok alapján ad hozzáférést.

## Első telepítés Node.js / MySQL tárhelyre

1. Telepítsd a frissített sémát a `node --env-file=.env.production --experimental-strip-types scripts/mysql-setup.mjs` paranccsal. A meglévő adatokat megtartja; létrehozza a `billing_settings`, `billing_orders` és `billing_grants` táblákat.
2. Regisztráld a tulajdonosi fiókot, majd a `users` táblából keresd ki az ellenőrzött fiók `id` mezőjét. Ezt add meg `ADMIN_USER_ID` szerveroldali környezeti változóként. Az e-mail-cím beírása önmagában nem ad adminjogot.
3. Generálj egy 32 bájtos titkosítókulcsot: `node -e "console.log(require('node:crypto').randomBytes(32).toString('hex'))"`. A 64 hexadecimális karaktert add meg `BILLING_ENCRYPTION_KEY` titokként. Tarts róla biztonságos mentést, és ne cseréld le egy már konfigurált telepítésnél: a tárolt Stripe-kulcsok visszafejtéséhez szükséges.
4. Az `APP_ORIGIN` legyen a publikus HTTPS-cím, útvonal és záró perjel nélkül. Például `https://terv.pelda.hu`.
5. Indítsd újra az alkalmazást. Az adminfiókkal belépve a felső **Admin** hivatkozás vagy a `/admin` cím nyitja meg a panelt.

Sites-hostolásnál a három változót a szerveroldali környezeti beállításokban kell megadni, majd az új környezeti változatot közzétenni. A `BILLING_ENCRYPTION_KEY` titok. A Stripe-kulcsokat ezt követően az alkalmazás adminpaneljén lehet kezelni; módosításukhoz nem kell új közzététel.

## Stripe beállítása

1. Nyisd meg a saját Stripe Dashboardodat, és válaszd ki a tesztkörnyezetet.
2. A Villanyrajz adminpaneljén add meg a teszt API-kulcsot (`sk_test_…`). A nyilvános `pk_…` kulcsra a használt, Stripe által hosztolt Checkouthoz nincs szükség.
3. A Stripe-ban hozz létre egy webhook-végpontot az adminpanelen megjelenő pontos címmel: `https://SAJÁT-DOMAIN/api/stripe/webhook`. A végpontnak publikus HTTPS-en elérhetőnek kell lennie, bejelentkezési átirányítás és proxy által beillesztett HTML nélkül.
4. Válaszd a `checkout.session.completed` és `checkout.session.async_payment_succeeded` eseményeket. Másold a végpont saját `whsec_…` aláírókulcsát a Villanyrajz megfelelő tesztmezőjébe.
5. Válaszd a tesztüzemet, engedélyezd az új vásárlásokat és ments. A **Mentett API-kapcsolat ellenőrzése** az API elérhetőségét vizsgálja, a webhookét nem.
6. Az adminfiókban, a **Projektek → Projekthelyek és fizetés** ablakban indíts tesztvásárlást. Használd a [Stripe hivatalos tesztadatait](https://docs.stripe.com/testing). Ellenőrizd a jóváírást, a fizetési jegyzéket, az új projekt létrehozását, valamint a megszakított fizetést. Tesztüzemben csak az admin indíthat fizetést; a normál felhasználók meglévő tervei elérhetők maradnak.
7. Az éles működéshez az éles API-kulcsot (`sk_live_…`) és az éles webhook-végpont külön aláírókulcsát is add meg. Válts **Éles fizetés** módra, és ments. A két környezet kulcsait ne keverd össze.

A díj a szerveren rögzített: 3 490 Ft, a Stripe számára 349000 HUF kisegység. A böngésző nem adhat meg árat. A HUF terhelési egységéről a [Stripe pénznemdokumentációja](https://docs.stripe.com/currencies#special-cases) ír. A vásárló a Stripe oldalán adja meg a kártyaadatokat; azok nem kerülnek a Villanyrajz szolgáltatás adatbázisába. Az AAM számlák automatikus kiállításához kötelező a [Számlázz.hu beállítása](szamlazz-hu.md) és a vásárló számlázási adatainak mentése. A Stripe saját bizonylata nem helyettesíti a Számlázz.hu-számlát.

## Jóváírás és üzemeltetés

- A visszatérési URL önmagában nem igazol fizetést. Az alkalmazás szerveroldalon ellenőrzi a Checkout Sessiont, vagy az aláírt webhookból fogadja el a `paid` állapotot. Ellenőrzi a rendelést, tulajdonost, összeget, pénznemet és teszt/éles módot.
- Az ismételt vagy párhuzamos webhookok ugyanahhoz a rendeléshez csak egy helyet adhatnak. A fizetés visszaigazolása nélkül nincs fizetett hely.
- Ha a vásárló bezárja a Stripe utáni oldalt, a webhook akkor is jóváírhatja a helyet. A **Projekthelyek → Állapot frissítése** újra lekéri a jogosultságokat.
- A Stripe-kulcsokat AES-GCM titkosítással tároljuk az adatbázisban. Az admin API csak azt jelzi, hogy be vannak-e állítva; a titkokat nem adja vissza. Üres kulcsmező mentése megtartja a korábbi értéket.
- A vásárlások kikapcsolása nem tiltja a meglévő projektek szerkesztését és nem állítja le a korábbi fizetések webhook-feldolgozását.
- Az adminpanel az utolsó 50 fizetési kísérletet mutatja. A megszakított vagy lejárt kísérlet jóváírás nélkül függőben maradhat a jegyzékben.
- Visszatérítést és vitatott fizetést a Stripe Dashboardban kezelj. Ez a változat nem törli automatikusan a tervet és nem vonja vissza a projekthelyet visszatérítéskor; ez külön üzemeltetői egyeztetést igényel.
- Adatbázis-költöztetéskor az összes billing táblát és a `subscription_checkouts` táblát, a `users` és `plans` táblákat, valamint a titkosítókulcsot együtt őrizd meg.

A fizetésfeldolgozás a [Stripe Checkout jóváírási útmutatóját](https://docs.stripe.com/checkout/fulfillment) és a [webhook-aláírás ellenőrzését](https://docs.stripe.com/webhooks/signature) követi.

## Havi előfizetés – 2 490 Ft

A csomag egy hónapra szól, automatikusan megújul; a Stripe Checkout ismétlődő HUF-terhelése 249000 kisegység. Nem kell kézzel Stripe Price-azonosítót megadni: a szerver készíti elő a havi árat. Az egyszeri projektdíj továbbra is 3 490 Ft. A Stripe-kulcsok és a vásárlások engedélyezése mindkét csomagra vonatkoznak.

### Kötelező webhook-bővítés

A meglévő végponton az egyszeri fizetés eseményei mellé kapcsold be:

- `invoice.paid`
- `invoice.payment_failed`
- `invoice.payment_action_required`
- `customer.subscription.created`
- `customer.subscription.updated`
- `customer.subscription.deleted`
- `customer.subscription.paused`
- `customer.subscription.resumed`

A beállítás az adminpanelen is olvasható. A program az esemény aláírását ellenőrzi, majd a Stripe aktuális előfizetését kéri le; egy régi esemény nem írhatja vissza a saját elavult állapotát. Jogosultság csak a megfelelő, kifizetett havi számla időszakára jár. A puszta aktív státusz vagy visszatérési URL nem elegendő. A kifizetett határidő leteltét minden szerveroldali megnyitás és mentés ellenőrzi, ezért elmulasztott webhook mellett sem marad korlátlan hozzáférés. A megújulás késedelmes webhookja esetén az Állapot frissítése gomb újraszinkronizál.

### Hozzáférés és lemondás

- Az első elmentett projekt ingyenes helyet kap, aktív előfizetés esetén is.
- Az egyszeri díjas projektek tartósan hozzáférhetők. Aktív előfizetés alatt az új projektek nem fogyasztják el a még felhasználható egyszeri fizetett helyeket.
- Lejárat után a zárolt projektek neve látszik, tartalmukat a szerver nem küldi vissza, és menteni sem lehet őket. Új, rendezett előfizetéssel újra hozzáférhetők.
- Az előfizetés előtti, régi rendszerből származó tervek megmaradnak; ha a fiók előfizetésre vált, majd az lejár, az első és a bizonyíthatóan egyszeri díjjal vásárolt projekten kívüli tervek szintén zárolódnak.
- Az Előfizetés kezelése / lemondás gomb a Stripe ügyfélportálját nyitja meg. Az alkalmazás létrehozza a hozzá tartozó portálbeállítást: fizetési mód frissítése, számlák megtekintése és időszak végi lemondás. Csomagváltás nincs engedélyezve. Korlátozott API-kulcsnál ehhez Customer Portal konfiguráció- és munkamenet-jogosultság is szükséges.
- Lemondáskor a már kifizetett időszak végéig megmarad a hozzáférés. Sikertelen megújulás nem hosszabbítja meg az időszakot.
- Tesztelőfizetés csak az admin tesztkörnyezetében ad jogosultságot, éles hozzáférést nem biztosít.
- Párhuzamos előfizetésindítások közös függő Checkoutot használnak. Már futó vagy rendezésre váró előfizetés mellett új helyett a portált kell használni.
- A böngészőbe korábban betöltött vagy exportált adatokat egy előfizetés lejárta nem tudja visszavonni. A korlátozás az új szerveroldali megnyitásokra és mentésekre vonatkozik.

### Frissítés és próba

Sites a `0004_lovely_young_avengers.sql` migrációt közzétételkor alkalmazza. Node.js / MySQL telepítésnél futtasd újra a `scripts/mysql-setup.mjs` programot: az új táblák mellett a meglévő `billing_orders` táblához hozzáadja a csomagtípust. Készíts adatbázismentést frissítés előtt.

Tesztüzemben ellenőrizd az első fizetést, a megújulást, a fizetési hibát, az időszak végi lemondást, a projektek zárolását és az újbóli hozzáférést. A helyi automatizált tesztek szimulált Stripe-válaszokat használnak; valódi Stripe-előfizetéssel végzett próba még szükséges a saját kulcsokkal. A fizetési kísérletek listája az előfizetés indítását mutatja; minden havi számla a Stripe portálon és Dashboardon érhető el.

Hivatalos referencia: [Stripe előfizetési események](https://docs.stripe.com/billing/subscriptions/webhooks).

## Importálás és exportálás

A tervimport kizárólag aktív havi előfizetéshez tartozik. A JSON-, SVG-, CSV-, PDF-export / nyomtatható tervdokumentáció és az árajánlat-PDF projektenként jár: az első ingyenes és az egyszeri díjjal megvásárolt projekt (`free` vagy egyszeri `live`/`test` grant) előfizetés nélkül, lejárt előfizetés után is exportálható; az előfizetéssel létrehozott (`sub_*`) és a grant nélküli régi projektek exportja aktív előfizetéshez kötött. Archivált, lomtáras és még nem mentett projekt előfizetés nélkül nem exportálható. Lemondás után a kifizetett időszak végéig használhatók az előfizetéshez kötött műveletek. Minden művelet friss szerveroldali ellenőrzést kér (`GET /api/transfer-access?purpose=export&projectId=…`, import esetén paraméter nélkül), hálózati hiba esetén nem indulnak el. Az admin tesztüzeme csak érvényes tesztelőfizetéssel engedi a tesztelést. A jogi tájékoztatók és telepítési útmutatók nyomtatása továbbra is nyilvános.
