# BiznisPortal — Release Day Runbook (Android v1)

Redosledan, copy-paste vodič za objavu **verzije 1** na Google Play.
Pretpostavka: koraci se rade na mašini sa **Android Studio + Android SDK +
JDK 21** (ova dev mašina nema Java/Android SDK za build).

Status koda: **nema blokera** — sve dole su operativne radnje.
Legenda: `💻` = terminal komanda · `🖐️` = ručno (browser/Android Studio).

---

## 0. Preduslovi (jednokratno)
- 🖐️ Google Play Console nalog ($25 jednokratno)
- 🖐️ Firebase nalog (besplatno)
- 💻 Node 20+, `npm ci` u repou, Android Studio + SDK + JDK 21

---

## Korak 1 — Commit + push (sav lokalni rad)

Trenutno je ~208 fajlova neukomitovano na `main`.

```bash
cd /Users/smartechor/biznisportal
git status                       # pregledaj šta ide
# .env i android/app/google-services.json su u .gitignore — NE smeju u git
git add app components lib styles next.config.ts capacitor.config.ts \
        package.json docs android/app/src android/app/build.gradle
git status                       # potvrdi da NEMA .env / *.keystore / google-services.json
git commit -m "BiznisPortal mobilna v1: native UX, tier, katalog, brisanje naloga, telemetrija"
git push origin main
```
✅ Provera: `git status` čist, na remote-u nova glava.

---

## Korak 2 — Sadržaj (P0, pre objave)
🖐️ Napuni direktorijum po `docs/real-content-rollout-plan.md` (dovoljno
firmi po gradu/kategoriji). Bez ovoga app radi ali deluje prazno.

---

## Korak 3 — Firebase / FCM (`google-services.json`)

1. 🖐️ <https://console.firebase.google.com> → novi projekat
2. 🖐️ Add app → **Android**, package: `rs.biznisportal.app`
3. 🖐️ Preuzmi `google-services.json` →

```bash
cp ~/Downloads/google-services.json \
   /Users/smartechor/biznisportal/android/app/google-services.json
# build.gradle ima guard: ako fajl postoji, FCM se automatski uključuje
```
4. 🖐️ Firebase → Project settings → Service accounts → generiši ključ;
   u admin podešavanjima sajta unesi `notifications.fcmProjectId`,
   `notifications.fcmClientEmail`, `notifications.fcmPrivateKey`
5. 💻 Build env za push UI: `export NEXT_PUBLIC_PUSH_ENABLED=1`

✅ Provera: posle build/instalacije, test push iz admina stiže na uređaj.

---

## Korak 4 — Release keystore (jednokratno, TAJNA)

```bash
cd /Users/smartechor/biznisportal
npm run native:keystore        # vođeni skript: pravi ~/biznisportal-release.keystore
```
- Skript ispisuje **SHA-256 otisak** — sačuvaj ga (treba za Korak 7 App Links).
- 🖐️ **Bekap keystore fajla + lozinki na 2 mesta** (password manager +
  offline). Gubitak = nikad više update na Play.

Env za build (isti shell kao Korak 6):
```bash
export ANDROID_KEYSTORE_FILE="$HOME/biznisportal-release.keystore"
export ANDROID_KEYSTORE_PASSWORD="••••"
export ANDROID_KEY_ALIAS="biznisportal"
export ANDROID_KEY_PASSWORD="••••"
```

---

## Korak 5 — Env za App Links (opciono sad, može i posle prvog uploada)
```bash
# Upload key SHA-256 (iz Koraka 4) + Play App Signing SHA-256 (Korak 7.4)
export ANDROID_CERT_FINGERPRINTS="AA:BB:..,CC:DD:.."
# (iOS, ako ga radiš:) export APPLE_TEAM_ID="ABCDE12345"
```
Rute `/.well-known/assetlinks.json` i `/apple-app-site-association` čitaju
ovo iz env-a — bez ponovnog deploya.

---

## Korak 6 — Build potpisan AAB (mašina sa Android SDK)

```bash
cd /Users/smartechor/biznisportal
npm ci

# Verzija (v1): podrazumevano versionCode=1, versionName=1.0.0.
# Za svaki sledeći upload OBAVEZNO podigni versionCode (+1).
export CAPACITOR_ANDROID_VERSION_CODE=1
export CAPACITOR_ANDROID_VERSION_NAME="1.0.0"

# VAŽNO: produkcijski build mora da gađa ŽIVI sajt, NE localhost/emulator.
export CAPACITOR_SERVER_URL="https://www.biznisportal.rs"

# (Keystore env iz Koraka 4 mora biti u OVOM shell-u.)
npx cap sync android
npm run native:android:release
# Izlaz: android/app/build/outputs/bundle/release/app-release.aab
```
✅ Provera: `.aab` fajl postoji; veličina > 0; bez Gradle grešaka.

> Alternativa GUI: Android Studio → Build → Generate Signed Bundle →
> izaberi keystore → release.

---

## Korak 7 — Play Console (listing + upload)

1. 🖐️ Play Console → Create app → naziv, srpski default jezik, Free
2. 🖐️ **App content**:
   - Privacy policy: `https://www.biznisportal.rs/privatnost`
   - Data safety: popuni po `docs/play-data-safety.md`
   - Account deletion URL: `https://www.biznisportal.rs/privatnost/brisanje-naloga`
   - Content rating upitnik (Business; ima user-generated content)
   - Ads: **Da** (sadrži reklame)
3. 🖐️ **Main store listing**: copy-paste iz `docs/play-store-listing.md`
   (naziv, kratak/pun opis, „šta je novo", 8 screenshot-a, feature graphic)
4. 🖐️ **Setup → App integrity**: prihvati Play App Signing → kopiraj
   **App signing key SHA-256** → vrati se u Korak 5 i dodaj ga u
   `ANDROID_CERT_FINGERPRINTS` (drugi otisak)
5. 🖐️ **Testing → Internal testing** → upload `app-release.aab` →
   dodaj sebe kao testera → instaliraj sa Play test linka
6. 🖐️ Smoke test na realnom uređaju (vidi checklist dole) 1–2 dana
7. 🖐️ Promote: Internal → Closed (opц.) → **Production**, staged 20%

---

## Pre-promote smoke test (realan uređaj, ne emulator)
- [ ] Hladan start: app < 3s, tamni splash → intro → app, bez belog bljeska
- [ ] Prijava/registracija IN-APP (ne otvara browser); Google/magic-link otvaraju app nazad
- [ ] „U mojoj blizini" → rationale modal pa sistemski dijalog
- [ ] Push stiže + tap otvara pravi ekran
- [ ] Brisanje naloga iz app-a stvarno briše
- [ ] Tier kartice (Diamond/Gold/Silver/Bronze) se vide
- [ ] Kategorije/profili ostaju u app-u (ne Custom Tab)
- [ ] Offline → native offline ekran → auto-recovery
- [ ] App Links: `curl https://www.biznisportal.rs/.well-known/assetlinks.json` vraća tvoj SHA-256

---

## Rollback (ako nešto pukne u produkciji)
🖐️ Play Console → Production → **Halt rollout** (zaustavi staged %), pa
novi build sa povećanim `versionCode` i ispravkom. Keystore se NIKAD ne menja.

---

## Brzi redosled (TL;DR)
1 commit/push → 2 sadržaj → 3 Firebase fajl → 4 `npm run native:keystore` +bekap
→ 6 `cap sync` + `native:android:release` → 7 Play listing+upload → 5 fingerprints
→ internal test → production staged.
