# ÁFA-kigyűjtő – adatbázisos változat (3.0.3-db3)

## Frissítés a 3.0.x-db3 verziókról

Csomagold ki a zip-et a régi fájlok fölé, állítsd vissza a jogosultságokat, majd frissítsd a böngészőt (Ctrl+F5). Adatbázis-frissítés nem kell.

Változások:
- 3.0.3: a rögzítés alatti „Legutóbb rögzített számlák” listában a számlánkénti nettó és áfa összeg is látszik, az áfa-kódok és a végösszeg előtt.
- 3.0.2: a numerikus billentyűzet Enter gombja is a következő mezőre lép (azokban a környezetekben is, ahol a böngésző ezt a billentyűt nem szabványos névvel jelzi).
- A rögzítő blokk háttere fizetendő számlánál halvány piros, levonhatónál halvány zöld.
- A várólistán a törzsben nem talált partnerhez a program hasonló nevű törzsbeli partnereket javasol (egyezési százalékkal). Kézi párosításkor (javaslatból vagy kereséssel) a számlázóból jövő név lesz a partner fő neve, a régi törzsbeli név aliasként megmarad. A partner nevét csak könyvelő vagy admin módosíthatja: rögzítő párosításakor a törzsbeli név marad, a számlázós név aliasként kerül be importáláskor.


## Frissítés a 3.0.0-db2 verzióról

1. Tölts le egy adatbázis-mentést (Beállítások → Rendszer).
2. Csomagold ki a zip-et a `/var/www/html/afaprogram/` mappába, felülírva a régi fájlokat (a `config.php` és a gyökér `.htaccess` nem íródik felül).
3. Állítsd vissza a jogosultságokat (lásd lent, „Első telepítés” 1. lépés).
4. A böngészőben frissítsd az oldalt (Ctrl+F5). Adatbázis-frissítés ehhez a verzióhoz nem kell.

## Újdonságok a 3. ütemben (3.0.0-db3)

- **Import várólistával:** Excel-beolvasás (a böngésző olvassa, a szerver kötegekben kapja), automatikus oszlopfelismerés a forintos oszlopok előnyben részesítésével, cégenként és oldalanként megjegyzett oszlop-hozzárendelés, pénznem és árfolyam átvétele, figyelmeztetés idegen sorszám-előtagnál.
- **Kulcsfelismerés a szerveren:** kulcsoszlopból vagy az áfa és a nettó arányából; a vegyes kulcsú számla kézi besorolásra kerül.
- **Várólista javítása:** partner keresése vagy felvétele („Új” gomb, kétirányú partnerként; az azonos nevű tételek is megkapják), dátum, áfa-kód, áfa újraszámolása, elvetés, **felosztás a rögzítő felületen** (mentés után a tétel lekerül a várólistáról). Importáláskor az eltérő partnernév aliasként rögzül.
- **Időszakok** a cég bevallási gyakorisága szerint (hónap, negyedév, év): lezárás, indoklással feloldás, önellenőrzési különbözet az első lezáráshoz képest.
- **Lezárás előtti ellenőrzések:** várólistás vagy dátum nélküli tétel esetén a lezárás tiltott; hiányzó sorszám esetén csak indoklással zárható.
- **Sorszám-folytonosság** sorozatonként, hiányok elfogadása indoklással és visszavonása.
- Mérés: 60 000 számla mellett az időszakok oldala kb. 1 mp; 5 000 számla beolvasása 2 mp, importálása 8 mp.

## Frissítés a 3.0.0-db1 verzióról (már telepített szerverre)

1. Tölts le egy adatbázis-mentést: Beállítások → Rendszer → Adatbázis-mentés letöltése.
2. Csomagold ki a zip-et a `/var/www/html/afaprogram/` mappába, felülírva a régi fájlokat. A `config/config.php`-t és a gyökérben lévő `.htaccess`-t a csomag nem tartalmazza, így ezek nem íródnak felül.
3. Állítsd vissza a jogosultságokat (lásd lent az 1. lépést).
4. Jelentkezz be rendszeradminként, és a Beállítások → Rendszer részben kattints az „Adatbázis frissítése (1)” gombra. Ez létrehoz egy indexet a legutóbbi számlák gyors listázásához.
5. A böngészőben frissítsd az oldalt (Ctrl+F5), hogy az új felület töltődjön be.

## Újdonságok a 2. ütemben (3.0.0-db2)

- **Rögzítés** a megszokott billentyűzetes kezeléssel: Enter a következő mezőre, Shift+Tab vissza, F10 mentés; év/hó/nap bontás; áfa-kód a kulcs beírásával (pl. 27); maradékelvű többkulcsos felosztás; kétoldalú kódok.
- **Partnerkeresés a szerveren** gépelés közben (tízezres partnertörzsnél is gyors), aliasokkal; ismeretlen név esetén „Felvétel a törzsbe”.
- **Szerveroldali ellenőrzés:** az áfa és a kulcs egyezése, a részletezés és a végösszeg egyezése (±2 Ft), az előjel, a lezárt időszak és a duplikáció (az adatbázis egyedi kulccsal is véd). Ha két felhasználó egyszerre módosítja ugyanazt a számlát, a második figyelmeztetést kap, és nem írja felül az első módosítását.
- **Törlés** csak adminnak, logikai törléssel: a számla nem tűnik el az adatbázisból, a napló rögzíti, ki és mikor törölte.
- **Lista és összesítők:** lapozott lista (100 tétel oldalanként) áfa-kódonként csoportosítva, részösszegekkel; a szűrés és az összesítés az adatbázisban fut. 60 000 számlával tesztelve: egy hónap szűrése 0,1–0,2 mp, a teljes állomány szűrés nélkül kb. 1 mp.
- **Export Excelbe:** Tételek, Összesítő kulcsonként és Időszakonként lappal. A szerver folyamatosan küldi az adatot, így 60 000 tétel exportja is kb. 2 mp, és kevés memóriát használ.

Az import (várólistával) és az időszakok lezárása a 3. ütemben jön.

---

# Első telepítés (3.0.0-db1 óta változatlan)

## Mit tartalmaz ez az ütem

- Telepítő (`install.php`): létrehozza a táblákat, a rendszeradmint és az első céget.
- Bejelentkezés jelszóval, munkamenet-kezeléssel (60 perc inaktivitás után lejár), 5 hibás jelszó után 15 perces zárolással.
- Cégválasztó, cégek kezelése (név, rövid jel, bevallási gyakoriság, sorszám-előtagok, szín).
- Felhasználók cégenkénti szerepkörrel (rögzítő, könyvelő, admin) és rendszeradmin jelöléssel. Minden jogosultságot a szerver ellenőriz.
- Közös törzsek: áfa-kódok, partnerek aliasokkal, partnernevek betöltése Excelből, partnerlista exportja.
- Napló cégenként és cégtől függetlenül, szűréssel, kereséssel, Excel-exporttal.
- Rendszer: adatbázis-verzió, frissítés futtatása, teljes SQL-mentés letöltése.
- A teljes adatbázis-szerkezet (számlák, import várólista, időszakok stb.) már létrejön.



## A csomag szerkezete

```
afaprogram/
  .htaccess.gyoker   ← a gyökérbe kerülő .htaccess (lásd 2. lépés)
  TELEPITES.md
  public/            ← ami a webről elérhető: index.html, app.js, app.css, api.php, install.php, vendor/
  app/               ← PHP-kód (webről tiltva)
  config/            ← config.sample.php; ide kerül a config.php (webről tiltva)
  migrations/        ← adatbázis-szerkezet SQL-fájljai (webről tiltva)
  storage/           ← későbbi használatra (webről tiltva)
```

A szerveren meglévő `logs/` mappához a csomag nem nyúl.

## Telepítés lépésenként

### 1. Fájlok feltöltése

Csomagold ki a zip tartalmát a `/var/www/html/afaprogram/` mappába úgy, hogy a `public/`, `app/`, `config/` stb. közvetlenül ott legyenek. Utána:

```
cd /var/www/html/afaprogram
chown -R root:www-data public app config migrations storage
find public app migrations storage -type d -exec chmod 755 {} \;
find public app migrations storage -type f -exec chmod 644 {} \;
```

### 2. Webgyökér: két lehetőség

**A) Javasolt: a DocumentRoot a `public/` mappára mutat.** A virtualhost konfigurációban (a 80-as **és** a 443-as/SSL virtualhostban is) írd át:

```
DocumentRoot /var/www/html/afaprogram/public
<Directory "/var/www/html/afaprogram/public">
    Options FollowSymLinks
    AllowOverride All
    Require all granted
</Directory>
```

Ilyenkor a `logs/`, `app/`, `config/` mappa eleve kívül esik a webgyökéren. Ellenőrzés és újratöltés:

```
apachectl configtest && systemctl reload apache2
```

**B) Ha a DocumentRoot marad `/var/www/html/afaprogram`:** nevezd át a csomagban lévő `.htaccess.gyoker` fájlt `.htaccess`-re ugyanebben a mappában:

```
mv .htaccess.gyoker .htaccess
```

Ez minden kérést a `public/` mappába irányít. Így a `logs/`, `app/`, `config/`, `migrations/` a webről nem érhető el (ezt teszteltem Apache 2.4 + mod_php alatt a mostani konfigurációddal azonos beállítással).

Mindkét esetben javaslom, hogy a virtualhostban az `Options` sorból kerüljön ki az `Indexes` és a `MultiViews`. A program `.htaccess`-e ezeket amúgy is kikapcsolja.

**Fontos:** a képen a 80-as port virtualhostja látszik, amely HTTPS-re irányít. A tényleges kiszolgálást a 443-as (SSL) virtualhost végzi, ezért a DocumentRoot és az `AllowOverride All` ott is legyen meg.

### 3. Konfiguráció

```
cd /var/www/html/afaprogram/config
cp config.sample.php config.php
nano config.php
chown root:www-data config.php
chmod 640 config.php
```

Töltsd ki:
- `pass`: az `afa_db_user` adatbázis-jelszava;
- `install_token`: egy legalább 16 karakteres véletlen szöveg (például `openssl rand -hex 24`). Ezt a telepítő kéri. Akkor is hagyd a fájlban, ha a telepítés kész, mert a telepítő a felhasználók megléte alapján tiltja le magát.

### 4. PHP-beállítás (opcionális)

A program magának Europe/Budapest időzónát állít be, és az adatbázisban UTC-ben tárol, így a `date.timezone = UTC` beállítás nem okoz hibát. Ha a szerveren más is fut, a `/etc/php/8.2/apache2/php.ini`-ben átállíthatod `Europe/Budapest`-re (utána `systemctl reload apache2`).

A mostani korlátok megfelelnek. Az Excel-fájlokat a böngésző olvassa be, a szerver kötegekben kapja az adatokat, így a 2 MB-os feltöltési korlát nem akadály.

### 5. Telepítő futtatása

Nyisd meg: **https://afaprogram.vsrv.hu/install.php**

A telepítő először ellenőrzi a környezetet (PHP-verzió, pdo_mysql, mbstring, HTTPS, adatbázis-kapcsolat, telepítési kód). Ha minden rendben, add meg:
- a telepítési kódot (config.php),
- a rendszeradmin nevét és jelszavát (legalább 8 karakter),
- az első cég nevét, rövid jelét és bevallási gyakoriságát.

A telepítés után a telepítő letiltja magát. Ha szeretnéd, a `public/install.php` fájl törölhető is.

### 6. Első lépések a programban

1. Jelentkezz be a rendszeradminnal: https://afaprogram.vsrv.hu/
2. A cégválasztó alatt, a Beállítások részben vedd fel a többi céget, majd a felhasználókat. A táblázatban cégenként add meg a szerepkörüket.
3. Nyiss meg egy céget, és a Törzsek fülön ellenőrizd az áfa-kódokat, töltsd be a partnereket.

## Mentés

Cron nélkül a mentés kézi. A program **Beállítások → Rendszer → Adatbázis-mentés letöltése (SQL)** gombja (csak rendszeradmin) a teljes adatbázist letölti. Ez phpMyAdmin-ban importálva visszaállítható. A visszatöltést kipróbáltam: a számított mezők és az idegen kulcsok is helyesen állnak vissza.

Javaslat: hetente, valamint minden frissítés előtt tölts le egy mentést, és tárold a szerveren kívül. A mentés jelszó-hash-eket és minden cég adatát tartalmazza, ezért bizalmasan kezelendő. A phpMyAdmin Exportálás funkciója ugyanígy használható.

## Frissítés (későbbi ütemek)

1. Tölts le egy mentést.
2. Másold fel az új csomag fájljait. A `config/config.php`-t ne írd felül, a csomag nem is tartalmazza.
3. Jelentkezz be rendszeradminként: **Beállítások → Rendszer**. Ha függő adatbázis-frissítés van, kattints az „Adatbázis frissítése” gombra.

## Hibakeresés

- **Fehér oldal vagy 500-as hiba:** nézd meg a `/var/www/html/afaprogram/logs/error.log` fájlt. Átmenetileg a `config.php`-ban `'debug' => true` mellett a hibaüzenet a böngészőben is látszik. Élesben ezt kapcsold vissza `false`-ra.
- **„Hiányzik a config/config.php”:** a 3. lépés maradt ki.
- **Adatbázis-kapcsolat hiba a telepítőben:** ellenőrizd a jelszót. A `host` maradjon `localhost`, így a kapcsolat Unix socketen megy.
- **„A munkamenet biztonsági kódja érvénytelen”:** frissítsd az oldalt (például ha a böngészőben sokáig nyitva maradt egy régi lap).
