# Seglo consumer install — užduotis Claude'ui

**Kontekstas:**
- Esi aplanke `/Applications/XAMPP/xamppfiles/htdocs/seglo` (macOS + XAMPP).
- Kuriame **atskirą consumer instaliaciją** „Seglo" produkto (apskaitos / sąskaitų suvedimo sistema,
  `accounting` aplinka). Visas kodas ateina iš privataus **Satis** Composer repo — nieko rankomis nekopijuojam.
- **NEREIKIA:** `va-themes/cleverphant`, `va-florial/*` — jų NEinstaliuok.
- Node/npm **nereikia** — temos assets ateina pre-built.

---

## Žingsniai

### 1. Host skeleton (jei aplankas tuščias)

```bash
composer create-project laravel/laravel .
```

### 2. composer.json — pridėk root lygyje

```jsonc
"minimum-stability": "dev",
"prefer-stable": true,
"repositories": [
    { "type": "composer", "url": "https://satis.viartas.com/" }
],
```

### 3. Require paketus

```bash
composer require \
  va-core/core va-core/auth va-core/users va-core/translations \
  va-themes/viartas-default \
  va-seglo/core va-seglo/tenancy va-seglo/ledger va-seglo/sources \
  va-seglo/export va-seglo/rules va-seglo/ocr va-seglo/expenses \
  va-seglo/security va-seglo/insights \
  va-themes/seglo
```

**Kas ką duoda:**
- `va-core/core` — bazinė infra + admin aplinka (`/admin`)
- `va-core/auth` — login (**būtinas**)
- `va-core/users` — users + roles
- `va-core/translations` — vertimų UI
- `va-themes/viartas-default` — **admin tema** (kad `/admin` renderintųsi)
- **Ateina per `va-core/core`:** `va-core/module-manager` + `va-cross/{media,seo,geo,microdata,cms-badges,logs}` (nebereikia vardyti)
- `va-seglo/*` — Seglo produktas (ledger, sources, export, rules, ocr, expenses, security, insights)
- `va-themes/seglo` — Seglo tema (`accounting` aplinka)

**Neįtraukta sąmoningai:** `va-themes/cleverphant`, `va-florial/*`.

> ℹ️ **Nebūtina:** viešas marketingo landing'as (`/`, `/seglo/*`) reikalauja `va-modules/pages` — jis įrašytas
> `va-themes/seglo` `suggest` sąraše (ne hard require), nes minimalus „tik apskaita" install veikia ir be jo.
> Kaip įjungti — žr. **7 žingsnį** žemiau.

Provideriai registruojasi per Laravel auto-discovery — `bootstrap/providers.php` **neliesk**.

### 4. .env

```env
APP_URL=http://seglo.test
DB_DATABASE=seglo
DB_USERNAME=root
DB_PASSWORD=
```

### 5. DB + vhost (jei dar nėra)

- Sukurk `seglo` DB (utf8mb4).
- XAMPP vhost: `seglo.test` → `.../seglo/public`; `/etc/hosts`: `127.0.0.1 seglo.test`; restart Apache.

### 6. Bootstrap

```bash
# Ištrink Laravel skeleton migracijas — paketai jas tiekia patys (users/cache/jobs);
# kitaip `migrate` lūžta „SQLSTATE[42S01]: Table 'cache' already exists":
rm -f database/migrations/0001_01_01_*_create_users_table.php \
      database/migrations/0001_01_01_*_create_cache_table.php \
      database/migrations/0001_01_01_*_create_jobs_table.php

# XAMPP/macOS: storage/ + bootstrap/cache rašomi Apache (daemon) vartotojui —
# kitaip login meta 500 su klaidinančiu „tempnam(): file created in temp directory":
chmod -R a+rwX storage bootstrap/cache

php artisan key:generate
php artisan storage:link
php artisan migrate

# BAZĖ: locales + admin@viartas.lt + roles + temų DB eilutės + route vertimai.
# CmsBootSeeder dabar class_exists-guarded → saugu subsete (praleidžia neįdiegtus seederius).
php artisan db:seed --class="ViartasCore\Core\Database\Seeders\CmsBootSeeder" --force

# Seglo baseline (permissions + tema + tenancy roles + landing):
php artisan seglo:install

# FRONTEND (Node/npm NEREIKIA):
php artisan themes:publish-assets                          # temų assets (seglo + viartas-default)
php artisan vendor:publish --tag=package-assets --force    # visų paketų admin assets
php artisan optimize:clear                                 # švieži config/route/view cache (Blade direktyvos + assets)
```

> ℹ️ `CmsBootSeeder` sukuria locales (`accounting` yra `per_locale`), `admin@viartas.lt` ir temų eilutes. `themes:publish-assets` dabar veikia vendor-install'e (Composer-discovery). Middleware alias'ai + temų keliai resolve'inasi savaime. `seglo:install` PATI kviečia `cms:sync-permissions` (atskiro žingsnio nereikia).
>
> 🧹 **Švarus single-theme state (`--wipe-foreign`):** švariame Seglo consumer'e (sava DB, tik Seglo paketas) svetimo turinio nėra → valyti NEreikia. Bet jei DB dalinasi su kitomis temomis (dev/staging su Florial/Cleverphant/Protera), jų CMS puslapiai/naujienos/DUK persidengia su Seglo landing'u. Tada:
> ```bash
> php artisan seglo:install --wipe-foreign --dry-run   # peržiūra — ką ištrintų (nieko nekeičia)
> php artisan seglo:install --wipe-foreign --force     # išvalo svetimą CMS + perseed'ina seglo landing
> ```
> Valymas bėga PRIEŠ baseline (bendras `ViartasCore\Core\Support\ForeignCmsContentWiper`), tad `SegloLandingSeeder` po to atkuria `seglo-*` puslapius švarioje DB. **Dėmesio:** `--fresh` čia yra KITAS flagas (demo TENANT re-provision su `--with-content`), ne CMS. Destruktyvu — **NENAUDOK update'ui**, tik first-install / reset'ui.

### 7. Viešas landing'as (nebūtina)

Minimalus install (aukščiau) duoda **tik** `/admin` + `/accounting`; `/` redirect'ina į `/accounting`, o `/seglo/*` grąžina 404. Seglo viešo marketingo landing'o blade'ai **jau yra `va-themes/seglo` viduje**, bet jie renderinasi per CMS **Pages** web aplinkoje — tam reikia `va-modules/pages`.

```bash
# 1. Įdiek Pages (traukia va-modules/grid-builder):
composer require va-modules/pages

# 2. Sukurk pages lenteles:
php artisan migrate

# 3. Užsėk landing'ą (10 puslapių). seglo:install re-run užsėja jį (SegloLandingSeeder
#    dabar mato pages lentelę), ARBA tiesiai seederiu:
php artisan seglo:install --force
#    (alternatyva) php artisan db:seed --class="ViartasThemes\Seglo\Database\Seeders\SegloLandingSeeder" --force

# 4. Perpublish + cache:
php artisan themes:publish-assets
php artisan optimize:clear
```

**Kas pasikeičia savaime (rankinio route NEREIKIA):**
- `/` **tampa landing home** — `va-seglo/core` root redirect'as turi `class_exists(\ViartasModules\Pages\Models\Page::class)` guard'ą → įdiegus Pages, jis pasitraukia ir Pages resolver'is rodo landing home.
- `/seglo`, `/seglo/kaina` ir kiti landing URL'ai pradeda veikti (Pages catchall).
- `/admin` gauna **„Puslapiai"** sekciją.
- `/accounting` nepakinta — apskaitos produktas lieka kaip buvęs.

> ℹ️ Be Pages `SegloLandingSeeder` spausdina „pages table missing — skipped" ir tyliai praleidžia — tai **ne klaida**, o numatyta minimalaus install elgsena.

---

## Prisijungimas + aplinkos

**Super admin (sukuria `CmsBootSeeder`):** `admin@viartas.lt` / **`password`** (super-admin rolė).

| Aplinka | URL | Kam |
|---|---|---|
| **Admin CMS** | `http://seglo.test/admin` | users/roles/temos (super-admin) |
| **Accounting** | `http://seglo.test/accounting` | Seglo apskaitos produktas (`per_locale`) |

> ⚠️ `.env`: `AUTH_MODEL="ViartasCore\\Users\\Models\\User"`, `APP_LOCALE=lt`, `APP_FALLBACK_LOCALE=lt`.
> ⚠️ Po `composer create-project` ištrink `routes/web.php` skeleton welcome route (P6).
> `accounting` aplinka turi `security.ip_allowlist` middleware — kai `ip_allowlist` lentelė tuščia, praleidžia (fail-open).

## Verifikacija

- Login: `admin@viartas.lt` / `password`.
- **Admin:** `http://seglo.test/admin` → dashboard. ⚠️ Su `APP_LOCALE=lt` keliai **išversti**: `/admin/vartotojai` (users), `/admin/vartotojai/roles` (roles), `/admin/temos` (themes). `/admin/users` grąžina 404 (teisinga — EN variantas po `/admin/en/...`).
- **`/` (root):** minimaliame Seglo (be `va-modules/pages`) `va-seglo/core` **redirect'ina `/` → `/accounting`** (savaime). Nebe 404. Įdiegus Pages (7 žingsnis) `/` tampa viešu landing home.
- **Seglo:** `http://seglo.test/accounting` → Seglo UI (`per_locale`).
- **Landing (jei įdiegtas):** `http://seglo.test/` + `http://seglo.test/seglo/kaina` → viešas marketingo landing'as.

## Jei kažkas lūžta

- `composer require` „package not found" → Satis neturi visos priklausomybių grandinės
  (ne tik `va-seglo/*`, bet ir `va-core/*`). Pranešk kuris trūksta.
- 403 `accounting` aplinkoje → `security.ip_allowlist` middleware. Kai `ip_allowlist` lentelė tuščia —
  fail-open (praleidžia), bet jei įrašų yra, pridėk savo IP arba laikinai išjunk.
- Migrate/route klaidos → `php artisan optimize:clear` ir bandyk vėl.

## Pabaigus

Trumpai atsiskaityk: kokie paketai įsidiegė, ar login veikia, ar `accounting` aplinka atsidaro.

---

## Forge / production deploy

Seglo (consumer app) Forge deploy — **be `npm build`** (assets pre-built per `vendor:publish`). Forge → site → **Deploy Script**:

```bash
cd $FORGE_SITE_PATH
git pull origin $FORGE_SITE_BRANCH
$FORGE_COMPOSER install --no-dev --no-interaction --prefer-dist --optimize-autoloader

$FORGE_PHP artisan storage:link
$FORGE_PHP artisan migrate --force

# FIRST install — TIK vieną kartą (tikras bootstrap: locales, super admin, temų eilutės):
if [ ! -f storage/app/.viartas-installed ]; then
    $FORGE_PHP artisan vendor:publish --tag=cms-database-seeder --force
    $FORGE_PHP artisan db:seed --class="ViartasCore\Core\Database\Seeders\CmsBootSeeder" --force
    $FORGE_PHP artisan seglo:install --force
    mkdir -p storage/app && touch storage/app/.viartas-installed
fi

# KIEKVIENĄ deploy — idempotentinis sync (tema + permissions + roles + landing).
# Be šito naujos užduočių permission'ai/seeder'iai consumer'io nepasiekia.
# NIEKADA neliečia tenant'ų; migracijas paima atskiras `migrate --force` aukščiau.
$FORGE_PHP artisan seglo:upgrade --force

# Bazinės global validation/auth lang + modelių aptikimas (va-core/translations 1.1.0).
# --force saugu: per-projekto vertimai yra DB (language_lines), ne failuose.
$FORGE_PHP artisan vendor:publish --tag=lang --force
$FORGE_PHP artisan translations:sync-models

$FORGE_PHP artisan themes:publish-assets
$FORGE_PHP artisan vendor:publish --tag=package-assets --force
$FORGE_PHP artisan optimize

( flock -w 10 9 || exit 1; sudo -S service $FORGE_PHP_FPM reload ) 9>/tmp/fpmlock
```

> Po pirmo deploy — nieko rankomis (first-install blokas automatiškas). `.env`: `APP_URL`, DB, `AUTH_MODEL`, `APP_LOCALE=lt`.

---

## Atnaujinimas (update)

Po dev serverio užduočių consumer'is atsinaujina **viena idempotentine komanda** —
nereikia per-užduotinio rankinių žingsnių sąrašo:

```bash
composer update
php artisan migrate --force
php artisan seglo:upgrade --force
php artisan vendor:publish --tag=lang --force        # bazinės validation/auth/passwords/pagination (lt+en) → global lang/
php artisan translations:sync-models                 # modelių aptikimas /admin/translations/modeliai
php artisan themes:publish-assets
php artisan vendor:publish --tag=package-assets --force
php artisan optimize
```

`seglo:upgrade` yra ta pati struktūrinė grandinė kaip `seglo:install` (bendra
implementacija — išsiskirti negali), tik recurring vardu: accounting temos eilutė →
per-modulio permission seeder'iai → apskaitos rolės → `cms:sync-permissions` →
viešo landing'o Pages → per-aplinkos temų default'ai. Idempotentiška (2× run —
be dublikatų), **niekada neliečia tenant'ų** ir niekada neperrašo per admin
redaguoto puslapių turinio.

⚠️ Išimtys, kurių komanda absorbuoti negali (naujas `.env`, Satis rebuild,
vienkartinis rankinis veiksmas) — [`CHANGELOG.md`](CHANGELOG.md).
