# Panduan Instalasi Lengkap - Laravel 12 Tambak API

## 📋 Prerequisites

Sebelum memulai, pastikan sudah terinstall:
- **PHP 8.2 atau higher**
- **MySQL 8.0 atau higher**
- **Composer** (Latest version)
- **Git** (Opsional)

Database `tambak` harus sudah dibuat di MySQL.

---

## 🔧 Langkah-langkah Instalasi

### 1. Persiapan Folder

Masuk ke folder project:
```bash
cd C:\laragon\www\cek\dok_tambak\TAMBAK\TRANSAKSI\laravel-tambak
```

### 2. Install Dependencies

Jika belum ada `vendor` folder:
```bash
composer install
```

Atau jika menggunakan Laragon, bisa langsung menjalankan project.

### 3. Setup Environment

Copy file `.env.example` ke `.env`:
```bash
cp .env.example .env
```

### 4. Konfigurasi Database

Edit file `.env` dan sesuaikan dengan konfigurasi database Anda:

```env
APP_NAME="Tambak API"
APP_ENV=local
APP_KEY=
APP_DEBUG=true
APP_TIMEZONE="Asia/Jakarta"
APP_URL=http://localhost:8000

DATABASE_CONNECTION=mysql
DATABASE_HOST=127.0.0.1
DATABASE_PORT=3306
DATABASE_NAME=tambak
DATABASE_USERNAME=root
DATABASE_PASSWORD=

# API Configuration
API_PREFIX=api
SANCTUM_TOKEN_EXPIRATION=525600
```

### 5. Generate Application Key

```bash
php artisan key:generate
```

### 6. Run Migrations

Jalankan migrasi untuk membuat semua tabel:

```bash
php artisan migrate
```

**Tabel yang akan dibuat:**

#### Authentication & RBAC
- `users` - User accounts
- `password_reset_tokens` - Password reset tokens
- `sessions` - User sessions
- `roles` - User roles
- `permissions` - System permissions
- `user_roles` - User-role relationships
- `user_permissions` - User permissions
- `role_permissions` - Role permissions

#### Logging
- `activity_logs` - Activity logging
- `login_logs` - Login history

#### Master Data
- `tkolam` - Data kolam/tambak
- `tsatuan` - Satuan unit
- `tkategori` - Kategori barang
- `tlokasi` - Lokasi penyimpanan
- `tsupplier` - Data supplier
- `tcustomer` - Data customer
- `tperusahaan` - Data perusahaan

#### Inventory
- `tbarang` - Master barang
- `tharga` - Tabel harga

#### Operations
- `taktivitas` - Transaksi aktivitas (panen, tebar)
- `tsampling` - Data sampling
- `tmati` - Data kematian
- `tpakan` - Data pakan
- `tcek_anco` - Cek anco
- `tcek_air` - Cek kualitas air

#### Transactions
- `tpo` - Purchase order
- `rpo` - Detail PO
- `tlpb` - Laporan penerimaan barang
- `rlpb` - Detail LPB
- `tbayar_hutang` - Pembayaran hutang
- `tbayar_piutang` - Penerimaan piutang
- `ttstok` - Mutasi stok
- `tjurnal_umum` - Jurnal umum

### 7. Seed RBAC Data

Jalankan seeder untuk membuat roles dan permissions:

```bash
php artisan db:seed --class=RBACSeeder
```

**Roles yang dibuat:**
1. `super-admin` - Super Administrator
2. `admin` - Administrator
3. `kepala-produksi` - Kepala Produksi
4. `supervisor` - Supervisor
5. `operator` - Operator
6. `keuangan` - Keuangan
7. `mobile-user` - Mobile User

**Permissions yang dibuat:**
- User Management (users.*)
- Role Management (roles.*)
- Kolam (kolam.*)
- Tebar (tebar.*)
- Panen (panen.*)
- Sampling (sampling.*)
- Pakan (pakan.*)
- Cek Anco (cek-anco.*)
- Cek Air (cek-air.*)
- Kematian (kematian.*)
- Stok (stok.*)
- Mutasi Stok (mutasi-stok.*)
- Pembelian (pembelian.*)
- Keuangan (keuangan.*)
- Laporan (laporan.*)
- Activity Logs (logs.*)

### 8. Create Admin User

Ada beberapa cara untuk membuat admin user:

#### Cara 1: Menggunakan Tinker
```bash
php artisan tinker
```

Kemudian jalankan perintah ini:
```php
use App\Models\User;
use App\Models\Role;

$user = User::create([
    'name' => 'Super Admin',
    'username' => 'admin',
    'password' => bcrypt('password123'),
    'divisi' => 'PUSAT',
    'is_active' => true,
]);

$role = Role::where('name', 'super-admin')->first();
$user->roles()->attach($role);

echo "User created successfully!\n";
exit;
```

#### Cara 2: Menggunakan Database Seeder
Buat file seeder baru:

`database/seeders/AdminUserSeeder.php`
```php
<?php

namespace Database\Seeders;

use App\Models\User;
use App\Models\Role;
use Illuminate\Database\Seeder;

class AdminUserSeeder extends Seeder
{
    public function run(): void
    {
        $user = User::create([
            'name' => 'Super Admin',
            'username' => 'admin',
            'password' => bcrypt('password123'),
            'divisi' => 'PUSAT',
            'is_active' => true,
        ]);

        $role = Role::where('name', 'super-admin')->first();
        $user->roles()->attach($role);

        $this->command->info('Admin user created successfully!');
    }
}
```

Jalankan seeder:
```bash
php artisan db:seed --class=AdminUserSeeder
```

### 9. Start Development Server

```bash
php artisan serve
```

API akan berjalan di: `http://localhost:8000/api`

---

## ✅ Testing Installation

### 1. Test Health Check

```bash
curl http://localhost:8000/api/health
```

**Expected Response:**
```json
{
  "success": true,
  "message": "API is running",
  "data": {
    "version": "1.0.0",
    "timestamp": "2026-04-12T10:30:00.000000Z",
    "timezone": "Asia/Jakarta"
  }
}
```

### 2. Test Login

```bash
curl -X POST http://localhost:8000/api/auth/login \
  -H "Content-Type: application/json" \
  -d '{"username":"admin","password":"password123"}'
```

**Expected Response:**
```json
{
  "success": true,
  "message": "Login successful",
  "data": {
    "user": {
      "id": 1,
      "name": "Super Admin",
      "username": "admin",
      "divisi": "PUSAT",
      "roles": ["super-admin"],
      "permissions": ["kolam.view", "pakan.create", ...],
      "last_login_at": null
    },
    "token": "1|aBcDeFgHiJkLmNoPqRsTuVwXyZ",
    "token_type": "Bearer"
  }
}
```

### 3. Test API Endpoint dengan Token

Gunakan token dari login response:

```bash
curl http://localhost:8000/api/kolam \
  -H "Authorization: Bearer YOUR_TOKEN_HERE"
```

---

## 📱 Flutter Integration Quick Start

### 1. Setup HTTP Client

```dart
class ApiClient {
  final String baseUrl = 'http://10.0.2.2:8000/api'; // Untuk Android Emulator
  // final String baseUrl = 'http://localhost:8000/api'; // Untuk iOS Simulator
  String? token;

  Future<void> login(String username, String password) async {
    final response = await http.post(
      Uri.parse('$baseUrl/auth/login'),
      headers: {'Content-Type': 'application/json'},
      body: jsonEncode({
        'username': username,
        'password': password,
      }),
    );

    if (response.statusCode == 200) {
      final data = jsonDecode(response.body);
      setState(() {
        token = data['data']['token'];
      });
    } else {
      throw Exception('Login failed');
    }
  }

  Future<Map<String, String>> getHeaders() async {
    return {
      'Content-Type': 'application/json',
      'Authorization': 'Bearer $token',
    };
  }
}
```

### 2. Example: Get Dashboard Data

```dart
Future<Dashboard> getDashboard() async {
  final headers = await apiClient.getHeaders();
  final response = await http.get(
    Uri.parse('${apiClient.baseUrl}/dashboard'),
    headers: headers,
  );

  if (response.statusCode == 200) {
    final data = jsonDecode(response.body);
    return Dashboard.fromJson(data['data']);
  }
  throw Exception('Failed to load dashboard');
}
```

---

## 🔥 Common Issues & Solutions

### Issue 1: SQLSTATE[HY000] [2002] Connection refused

**Solution:**
Pastikan MySQL server sudah berjalan. Untuk Laragon:
- Buka Laragon
- Start Apache & MySQL

### Issue 2: Database 'tambak' doesn't exist

**Solution:**
Buat database terlebih dahulu:
```sql
CREATE DATABASE tambak CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
```

### Issue 3: Permission denied

**Solution:**
Jalankan dengan administrator privileges atau pastikan user MySQL memiliki permission yang cukup.

### Issue 4: Class not found

**Solution:**
Jalankan:
```bash
composer dump-autoload
```

### Issue 5: Token expiration

**Solution:**
Default token expiration adalah 525600 menit (1 tahun). Ubah di `.env`:
```env
SANCTUM_TOKEN_EXPIRATION=43200 // 30 hari
```

---

## 📊 Default Users

Setelah instalasi, Anda bisa membuat users berikut:

### Super Admin
- **Username:** admin
- **Password:** password123 (setelah di-create)
- **Role:** super-admin
- **Access:** Semua module

### Operator Contoh
```php
User::create([
    'name' => 'Operator Tambak',
    'username' => 'operator1',
    'password' => bcrypt('operator123'),
    'divisi' => 'PRODUKSI',
    'is_active' => true,
])->assignRole('operator');
```

---

## 🚀 Production Deployment

### 1. Optimize Application

```bash
php artisan config:cache
php artisan route:cache
php artisan view:cache
php artisan event:cache
```

### 2. Set Production Environment

Edit `.env`:
```env
APP_ENV=production
APP_DEBUG=false
```

### 3. Set File Permissions

```bash
chmod -R 755 storage bootstrap/cache
```

### 4. Use Queue (Optional)

```bash
php artisan queue:work --daemon
```

---

## 📚 Next Steps

1. **Baca API Documentation** - Lihat `API_DOCUMENTATION.md`
2. **Buat Master Data** - Import data kolam, barang, supplier
3. **Setup Flutter Project** - Integrasikan dengan API
4. **Custom RBAC** - Sesuaikan dengan kebutuhan perusahaan
5. **Testing** - Lakukan testing thoroughly

---

## 🆘 Support

Jika ada masalah:
1. Cek `storage/logs/laravel.log` untuk error logs
2. Pastikan semua migrations sudah berjalan
3. Verify RBAC seeder sudah berjalan
4. Cek database connection di `.env`

---

## ✨ Checklist Instalasi

- [ ] PHP 8.2+ installed
- [ ] MySQL 8.0+ installed
- [ ] Database 'tambak' created
- [ ] Composer dependencies installed
- [ ] `.env` file configured
- [ ] Application key generated
- [ ] Migrations run
- [ ] RBAC seeder run
- [ ] Admin user created
- [ ] Development server started
- [ ] Health check successful
- [ ] Login test successful

Selamat! 🎉 Sistem Laravel 12 Tambak API sudah siap digunakan!

Hubungi tim development jika membutuhkan bantuan lebih lanjut.
