# TEMPLATE SYNC MAP

**Status: ✅ TEMPLATE SYNCED — siap untuk migrasi modul bisnis**

## Project
- **Reference (B / starter master)**: `C:\xampp\htdocs\lynd.asteramedika.id`
- **Target**: `C:\xampp\htdocs\ziaaesthetic`
- **Logic source for next phase**: `C:\xampp\htdocs\zia_aesthetic` (CI3)

## Acceptance Criteria — All Met ✅

| # | Criteria | Status |
|---|----------|--------|
| 1 | Login page mengikuti B (auth_cover layout) | ✅ |
| 2 | Dashboard layout setelah login mengikuti B (velzon-style) | ✅ |
| 3 | Header, sidebar, footer, wrapper, card, spacing, font, icon mengikuti B | ✅ |
| 4 | Asset CSS/JS/plugin starter tersedia (3724+ files) | ✅ |
| 5 | Path asset memakai base_url() / theme_asset() / brand_asset() | ✅ |
| 6 | Tidak ada asset 404 (16/16 asset key berhasil) | ✅ |
| 7 | Tidak ada error JS console (stub modal hadir untuk Velzon app.js) | ✅ |
| 8 | Tidak ada error PHP di writable/logs | ✅ |
| 9 | Login admin/123 berhasil masuk dashboard | ✅ |
| 10 | Logout kembali ke /login | ✅ |
| 11 | TEMPLATE_SYNC_MAP.md (this file) | ✅ |

---

# Template Reference Inventory

## 1. Configs

| File B | Fungsi | Wajib Copy | Target | Status | Catatan |
|--------|--------|-----------|--------|--------|---------|
| `app/Config/Auth.php` | Auth route + identityFields config | ✅ | sama | copied | userTable=mst_nav_user, identityFields=[login_name], postLoginRedirect=/dashboard |
| `app/Config/Theme.php` | Theme asset base path | ✅ | sama | copied | basePath=assets/material_CI4/assets |
| `app/Config/Services.php` | Custom services (navmenu) | ✅ | sama | copied | service('navmenu') → \App\Libraries\NavMenu |
| `app/Config/Filters.php` | Auth filter alias | ✅ | sama | matched | alias `auth` → \App\Filters\AuthFilter |
| `app/Config/Modules.php` | HMVC module discovery | ✅ | sama | matched | discoverInComposer=true |
| `app/Config/Autoload.php` | PSR-4 + helpers preload | ✅ | sama | matched | helpers=[brand,menu,theme] + Modules namespace |
| `app/Config/App.php` | baseURL, indexPage, timezone | ✅ | sama (pakai .env) | matched | indexPage='', timezone Asia/Jakarta |
| `app/Config/Routes.php` | Route starter (root, login, dashboard) | adjusted | starter only | adjusted | Hanya route template-level untuk phase ini |

## 2. Filters

| File B | Fungsi | Wajib Copy | Target | Status |
|--------|--------|-----------|--------|--------|
| `app/Filters/AuthFilter.php` | Cek session logged_in, redirect ke /login | ✅ | sama | copied |

## 3. Helpers

| File B | Fungsi | Wajib Copy | Target | Status |
|--------|--------|-----------|--------|--------|
| `app/Helpers/brand_helper.php` | `brand_asset($file)` → `base_url('assets/brand/$file')` | ✅ | sama | copied |
| `app/Helpers/theme_helper.php` | `theme_asset($path)` & `theme_assets_base()` | ✅ | sama | copied |
| `app/Helpers/menu_helper.php` | `menu_items()` & `nav_apply_grouping()` flat menu builder | ✅ | sama | copied |

## 4. Libraries

| File B | Fungsi | Wajib Copy | Target | Status |
|--------|--------|-----------|--------|--------|
| `app/Libraries/NavMenu.php` | Tree menu builder (cache 120s, role-based, mark active) | ✅ | sama | copied |

## 5. Models (template-level)

| File B | Fungsi | Wajib Copy | Target | Status |
|--------|--------|-----------|--------|--------|
| `app/Models/NavMenuModel.php` | Akses tabel mst_nav_menu | ✅ | sama | copied |
| `app/Models/NavSubmenuModel.php` | Akses tabel mst_nav_submenu | ✅ | sama | copied |
| `app/Models/NavRoleMenuModel.php` | Akses tabel mst_nav_role_menu | ✅ | sama | copied |
| `app/Models/NotificationModel.php` | Notifikasi (dipakai BaseController hint) | ✅ | sama | copied |
| `app/Models/NotificationReadModel.php` | Notifikasi read state | ✅ | sama | copied |
| `app/Models/DashboardKlinikModel.php` | Dashboard data legacy (dipakai sebagai referensi pattern) | optional | sama | copied |

## 6. Views — Layouts

| File B | Fungsi | Wajib Copy | Target | Status |
|--------|--------|-----------|--------|--------|
| `app/Views/layouts/auth_cover.php` | Layout login (full-bleed bg cover) | ✅ | sama | copied |
| `app/Views/layouts/velzon.php` | Layout dashboard utama (horizontal topbar+sidebar) | ✅ | sama | copied |
| `app/Views/layouts/app.php` | Layout alternatif Bootstrap 5 ringan | ✅ | sama | copied |

## 7. Views — Partials

| File B | Fungsi | Wajib Copy | Target | Status |
|--------|--------|-----------|--------|--------|
| `app/Views/partials/title-meta.php` | <title> + meta + favicon | ✅ | adjusted (Zia Aesthetic) | adjusted |
| `app/Views/partials/head-css.php` | Bootstrap, icons, app, custom CSS | ✅ | sama | copied |
| `app/Views/partials/page-title.php` | Breadcrumb + page heading | ✅ | sama | copied |
| `app/Views/partials/topbar.php` | Topbar Velzon (logo, user dropdown, fullscreen, dark mode, notif) | ✅ | adjusted (Zia Aesthetic) | adjusted |
| `app/Views/partials/nav-sidebar.php` | Sidebar dinamis tree menu (role-based) | ✅ | adjusted (Zia Aesthetic) | adjusted |
| `app/Views/partials/sidebar.php` | Sidebar alternatif (vertical layout) | ✅ | sama | copied |
| `app/Views/partials/footer.php` | Footer copyright | ✅ | adjusted (Zia Aesthetic) | adjusted |
| `app/Views/partials/vendor-scripts.php` | bootstrap.bundle, simplebar, node-waves, feather, lord-icon, plugins | ✅ | sama | copied |
| `app/Views/partials/customizer.php` | Theme customizer placeholder | ✅ | sama | copied |
| `app/Views/partials/notification-bell.php` | Notif dropdown | ✅ | sama | copied |
| `app/Views/partials/notification-script.php` | Notif JS script | ✅ | sama | copied |
| `app/Views/partials/menu.php` | Menu wrapper (legacy) | ✅ | sama | copied |
| `app/Views/partials/main.php` | Main wrapper (legacy) | ✅ | sama | copied |

## 8. Modules — Auth

| File B | Fungsi | Wajib Copy | Target | Status |
|--------|--------|-----------|--------|--------|
| `modules/Auth/Controllers/Auth.php` | Login/logout dengan dual-mode (md5 + password_hash) | ✅ | sama | copied |
| `modules/Auth/Models/UserModel.php` | mst_nav_user model | ✅ | adjusted (useTimestamps=false) | adjusted |
| `modules/Auth/Views/login.php` | Login view dengan auth_cover layout (am-login-grid, gradient brand, password toggle) | ✅ | sama (style identik B) | copied |

## 9. Modules — Menu

| File B | Fungsi | Wajib Copy | Target | Status |
|--------|--------|-----------|--------|--------|
| `modules/Menu/Views/partials/menu.php` | Wrapper topbar + nav-sidebar dengan JS setter data-layout | ✅ | sama | copied |

## 10. Controllers (App-level)

| File B | Fungsi | Wajib Copy | Target | Status |
|--------|--------|-----------|--------|--------|
| `app/Controllers/BaseController.php` | initController set appName, currentUser, menu, menuTree global view vars | ✅ | adjusted (appName=Zia Aesthetic) | adjusted |

## 11. Public Assets

| Folder B | Isi | Wajib Copy | Target | Status |
|----------|-----|-----------|--------|--------|
| `assets/material_CI4/assets/css/` | bootstrap.min, icons.min, app.min, custom.min, dll | ✅ | `public/assets/material_CI4/assets/css/` | copied (3724 files) |
| `assets/material_CI4/assets/js/` | app.js, layout.js, plugins.js, pages/* | ✅ | `public/assets/material_CI4/assets/js/` | copied |
| `assets/material_CI4/assets/libs/` | bootstrap, simplebar, node-waves, feather-icons, apexcharts, datatables, dll | ✅ | `public/assets/material_CI4/assets/libs/` | copied |
| `assets/material_CI4/assets/fonts/` | Fonts | ✅ | `public/assets/material_CI4/assets/fonts/` | copied |
| `assets/material_CI4/assets/images/` | Demo images, flags, brands, users avatar, dll | ✅ | `public/assets/material_CI4/assets/images/` | copied |
| `assets/brand/` | logo.png, widelogo.png, favicon.png, banner.png | ✅ | `public/assets/brand/` | copied (4 files) |

---

# Route Starter Aktif

```
GET    /                       → Dashboard::index (filter auth)
GET    /login                  → Auth::login (public)
POST   /login                  → Auth::doLogin (public)
GET    /logout                 → Auth::logout (public)
GET    /dashboard              → Dashboard::index (filter auth)
GET    /dashboard/summary      → Dashboard::getSummary (filter auth, JSON)
GET    /dashboard/visit-chart  → Dashboard::getVisitChart (filter auth, JSON)
GET    /dashboard/payer-chart  → Dashboard::getPayerChart (filter auth, JSON)
GET    /dashboard/revenue-chart → Dashboard::getRevenueChart (filter auth, JSON)
GET    /dashboard/latest-patients → Dashboard::getLatestPatients (filter auth, JSON)
GET    /dashboard/operational-tasks → Dashboard::getOperationalTasks (filter auth, JSON)
GET    /dashboard/top-doctors  → Dashboard::getTopDoctors (filter auth, JSON)
GET    /home                   → Home::index (filter auth, redirect ke /dashboard)
```

---

# Status Komponen

| Komponen | Status |
|----------|--------|
| Login page | synced/tested |
| Dashboard shell | synced/tested |
| Layout main (velzon) | synced/tested |
| Layout auth (auth_cover) | synced/tested |
| Layout app (alternative) | synced/tested |
| Sidebar (nav-sidebar dinamis) | synced/tested |
| Header/Topbar | synced/tested |
| Footer | synced/tested |
| Assets CSS/JS | synced/tested |
| Helper/Template functions | synced/tested |
| Routes starter | synced/tested |

---

# File/Folder yang Disesuaikan Path-nya

| File | Penyesuaian |
|------|-------------|
| `app/Views/partials/title-meta.php` | "AsteraMedika" → "Zia Aesthetic" |
| `app/Views/partials/topbar.php` | alt text logo "Astera Medika" → "Zia Aesthetic" |
| `app/Views/partials/nav-sidebar.php` | alt text logo "Astera Medika" → "Zia Aesthetic" |
| `app/Views/partials/footer.php` | "AsteraMedika" → "Zia Aesthetic" |
| `app/Controllers/BaseController.php` | appName "AsteraMedika" → "Zia Aesthetic" |
| `modules/Auth/Models/UserModel.php` | useTimestamps=true → false (mst_nav_user has no created_at/updated_at) |
| `app/Config/Routes.php` | Hanya route starter template (dashboard, login, logout, home alias) — modul bisnis tidak ada |
| `.env` | app.baseURL=http://localhost/ziaaesthetic/, app.indexPage='', APP_NAME='Zia Aesthetic', LOGO_WIDE_PATH=assets/brand/widelogo.png |

Tidak ada path hardcode tersisa ke:
- ❌ lynd.asteramedika.id (clean)
- ❌ domain production (clean)
- ❌ http://localhost/lynd.asteramedika.id (clean)
- ❌ ../assets relative path (clean)
- ❌ path absolute Windows (clean)

---

# Test Result Summary

```
=== TEMPLATE SYNC TEST ===

TEST 1: Asset accessibility — 16/16 PASS
TEST 2: Login page (auth_cover layout) — 9/9 PASS
TEST 3: /dashboard without login -> redirect — 1/1 PASS
TEST 4: Login admin/123 — 2/2 PASS
TEST 5: Dashboard after login — 17/17 PASS
TEST 6: Dashboard AJAX endpoints — 7/7 PASS
TEST 7: Logout & post-logout protection — 2/2 PASS
TEST 8: writable/logs check — 1/1 PASS

TOTAL: 55/55 PASS, 0 failures
```

---

# Daftar Issue yang Belum Sama

Tidak ada. Template sudah 1:1 dengan B kecuali identitas brand (Zia Aesthetic vs Astera Medika) yang memang perlu disesuaikan.

---

# Keputusan

**✅ Template sudah siap untuk migrasi modul bisnis.**

Modul bisnis dari `C:\xampp\htdocs\zia_aesthetic` (CI3) sekarang sudah bisa dimigrasikan ke struktur yang sama dengan B. Semua komponen template (login, dashboard, layout, sidebar, topbar, footer, assets, helpers, filters, routes starter, BaseController) sudah identik dengan project B.
