# Custom Notification System for TRANSC Menu

## Overview
Sistem notifikasi custom ini dibuat untuk menampilkan jumlah data pada setiap menu di dalam group menu "transc" (Transaction Customer). Sistem ini dirancang agar tidak merusak kode yang sudah ada dan tetap terstruktur sesuai standar perusahaan.

## Struktur Implementasi

### 1. View Composer (app/View/Composers/MenuNotificationComposer.php)
File ini adalah inti dari sistem notifikasi. ViewComposer akan otomatis menghitung jumlah data untuk setiap menu berdasarkan:
- Role user yang login
- Divisi user (HM atau Industrial)
- Status data (pending, approved, unreviewed, rejected)

**Menu yang didukung:**
- `trsapv` - Approval Persetujuan SO
- `trsapd` - Approved SO (Ready to Send to Customer)
- `trsign` - Unreviewed SO (Need Resend)
- `trsrjc` - Rejected SO (Need Review)

**Logic perhitungan:**
- **TRSAPV**: Hanya menghitung data yang perlu di-approve oleh user sesuai rolenya
  - SPV/Head: Hanya data dengan temp_status = 'pending'
  - Manager: Hanya data dengan final_status = 'pending' DAN temp_status sudah approved/unreviewed
  - Filtered by division

- **TRSAPD**: Menghitung data yang sudah approved dan belum dikirim ke customer
  - final_status = 'approved'
  - sent_to_customer_status = 0
  - Filtered by division

- **TRSIGN**: Menghitung data yang di-ignore dan perlu dikirim ulang
  - final_status = 'unreviewed'
  - Filtered by division

- **TRSRJC**: Menghitung data yang di-reject dan perlu di-review (hanya untuk admin)
  - revision_status = 0
  - temp_status = 'rejected' AND final_status = 'rejected'
  - Filtered by division
  - Hanya role admin (admhm1, admind) yang bisa melihat

### 2. Service Provider (app/Providers/AppServiceProvider.php)
ViewComposer didaftarkan di AppServiceProvider agar otomatis dijalankan setiap kali sidenav dimuat.

```php
View::composer('layouts.navbars.auth.sidenav', MenuNotificationComposer::class);
```

### 3. Controller Updates
Setiap controller di-update untuk menyimpan count data yang ditampilkan ke dalam variabel `$data['notif_count']`. Ini berguna untuk:
- Debugging
- Verifikasi perhitungan
- Digunakan jika diperlukan di halaman detail

**File yang diupdate:**
- `app/Http/Controllers/TrsapvController.php` (line ~174)
- `app/Http/Controllers/TrsapdController.php` (line ~111)
- `app/Http/Controllers/TrsignController.php` (line ~106)
- `app/Http/Controllers/TrsrjcController.php` (line ~118)

**Kode yang ditambahkan:**
```php
// Add notification count for this menu
$data['notif_count'] = $data['table_detail']->count();
```

### 4. Sidenav Blade Update (resources/views/layouts/navbars/auth/sidenav.blade.php)
Blade template sidenav diupdate untuk menampilkan notifikasi dari ViewComposer untuk menu "transc".

**Logic yang ditambahkan:**
```blade
@elseif ($g->gmenu == 'transc' && isset($menu_notifications[$d->dmenu]) && $menu_notifications[$d->dmenu] > 0)
{{-- Custom notification for transc menu --}}
<span style="background-color: #f33b3b;position: absolute;right: 20px;"
    class="badge text-white ms-1">{{ $menu_notifications[$d->dmenu] }}</span>
@endif
```

**Penjelasan:**
- Tetap menggunakan notifikasi query lama (`$d->notif`) jika ada
- Jika tidak ada dan gmenu adalah 'transc', gunakan notifikasi dari ViewComposer
- Notifikasi hanya muncul jika count > 0

## Keuntungan Implementasi Ini

1. **Tidak Merusak Kode Lama**: 
   - Semua kode lama tetap berfungsi
   - Notifikasi query lama masih diutamakan
   - Custom notifikasi hanya untuk menu "transc"

2. **Terstruktur dan Maintainable**:
   - Logic notifikasi terpusat di ViewComposer
   - Mudah di-update atau ditambahkan menu baru
   - Tidak perlu mengubah banyak file

3. **Performance Efficient**:
   - ViewComposer hanya dipanggil saat sidenav dimuat
   - Tidak ada query berulang untuk setiap menu item
   - Count dilakukan langsung dengan filter yang optimal

4. **Role-Based Access**:
   - Setiap user hanya melihat data sesuai rolenya
   - Division-based filtering (HM vs Industrial)
   - Manager HM bisa melihat data Industrial yang sudah final approved (dan sebaliknya)

## Cara Menambahkan Menu Baru

Jika ingin menambahkan menu baru di "transc", ikuti langkah berikut:

1. **Tambahkan method di MenuNotificationComposer.php**:
```php
private function getNewMenuCount($userDivision, $additionalParams)
{
    $query = DB::table('your_table')
        ->where('your_conditions', 'value');
    
    if ($userDivision !== null) {
        $query->where('so_type_id', $userDivision);
    }
    
    return $query->count();
}
```

2. **Panggil method di compose()**:
```php
$notifications['newmenu'] = $this->getNewMenuCount($userDivision, $params);
```

3. **Tambahkan count di Controller index()**:
```php
// Add notification count for this menu
$data['notif_count'] = $data['table_detail']->count();
```

4. **Tidak perlu update sidenav.blade.php** - sudah otomatis!

## Testing

Untuk testing sistem notifikasi:

1. Login dengan berbagai role:
   - Admin HM (admhm1)
   - Admin Industrial (admind)
   - SPV/Head HM (shhm12)
   - SPV/Head Industrial (shind1)
   - Manager HM (manhm1)
   - Manager Industrial (manind)

2. Verifikasi bahwa:
   - Notifikasi muncul sesuai role
   - Count sesuai dengan data yang ditampilkan di index
   - Notifikasi hilang ketika count = 0
   - Division filtering bekerja dengan benar

3. Check console browser untuk error JavaScript
4. Check Laravel log untuk error PHP

## Troubleshooting

**Problem**: Notifikasi tidak muncul
- **Solution**: Check apakah ViewComposer sudah registered di AppServiceProvider
- **Solution**: Verifikasi variabel `$menu_notifications` tersedia di blade

**Problem**: Count tidak sesuai
- **Solution**: Compare dengan `$data['notif_count']` di controller
- **Solution**: Check filter logic di ViewComposer vs Controller

**Problem**: Error saat load sidenav
- **Solution**: Check syntax di MenuNotificationComposer
- **Solution**: Pastikan semua required fields ada di database

## Notes

- Sistem ini mengikuti pattern yang sama dengan notifikasi query lama
- Tidak ada perubahan pada database schema
- Semua perubahan backward compatible
- ViewComposer bisa di-cache untuk performance lebih baik (opsional)

## Author
Created: December 2025
Version: 1.0.0
