# 🔧 PERBAIKAN LOGIKA MERGE EXCEL DENGAN BAPLIE

## 📋 RINGKASAN MASALAH
**Sebelum Perbaikan:** Ketika user mengupload file Excel berisi container baru, aplikasi malah **MENGUBAH SPESIFIKASI container yang sudah ada di BAPLIE** dengan data dari Excel.

**Contoh Masalah:**
```
BAPLIE (Original):
  Container A: Weight=25000 kg, Status=Full, ISO=22G1
  Container B: Weight=18000 kg, Status=Empty, ISO=20G1

Excel (Tambahan):
  Container A: Weight=24000 kg, Status=Empty, ISO=40G1  ← DATA BERBEDA!
  Container D: Weight=30000 kg, Status=Full, ISO=45G1    ← CONTAINER BARU

Hasil SEBELUM FIX:
  Container A: Weight=24000 kg, Status=Empty, ISO=40G1   ❌ BERUBAH!
  Container B: Weight=18000 kg, Status=Empty, ISO=20G1   ✅ TETAP
  Container D: Weight=30000 kg, Status=Full, ISO=45G1    ✅ DITAMBAH
```

---

## ✅ SOLUSI - PERBAIKAN YANG DILAKUKAN

### 1. **Ubah `mergeContainerData()` Method**
   📍 **File:** `app/Http/Controllers/BaplieController.php` (Baris 923-1001)

   **Perubahan:**
   - ❌ **HAPUS** logika yang mengubah field kritis dari BAPLIE
   - ✅ **TAMBAH** logika yang HANYA memperbarui field optional jika kosong
   - ✅ **TAMBAH** logika yang LOG conflict tanpa mengubah BAPLIE

   **Field-Field yang TIDAK BOLEH DIUBAH:**
   ```
   ✋ weight_kg         → Berat dari BAPLIE TIDAK BOLEH DIUBAH
   ✋ status            → Status dari BAPLIE TIDAK BOLEH DIUBAH
   ✋ status_code       → Status code dari BAPLIE TIDAK BOLEH DIUBAH
   ✋ iso_type          → ISO Type dari BAPLIE TIDAK BOLEH DIUBAH
   ✋ pod_locode        → POD Locode dari BAPLIE TIDAK BOLEH DIUBAH
   ✋ is_reefer         → Reefer status dari BAPLIE TIDAK BOLEH DIUBAH
   ✋ set_temperature   → Temperature dari BAPLIE TIDAK BOLEH DIUBAH
   ✋ temperature_range → Temperature range dari BAPLIE TIDAK BOLEH DIUBAH
   ```

   **Field-Field yang BOLEH DIUPDATE (Hanya jika kosong):**
   ```
   ✅ booking_no    → Update dari Excel jika kosong di BAPLIE
   ✅ seal_no       → Update dari Excel jika kosong di BAPLIE
   ✅ bay           → Update dari Excel jika kosong di BAPLIE
   ✅ row           → Update dari Excel jika kosong di BAPLIE
   ✅ tier          → Update dari Excel jika kosong di BAPLIE
   ```

### 2. **Update `mergeExcelWithBaplieData()` Logic**
   📍 **File:** `app/Http/Controllers/BaplieController.php` (Baris 851-881)

   **Perubahan:**
   ```php
   // SEBELUM: Container yang ada di BAPLIE dikira sebagai "updated"
   $updatedCount++;  ← DIHAPUS!

   // SESUDAH: Container yang ada di BAPLIE hanya "verified"
   // (tidak di-update, hanya di-cek apakah ada di Excel)
   ```

### 3. **Preserve EDI Fields (VGM vs WT, NAD Format)**
   📍 **File:** `app/Services/BaplieParser.php`

   **Masalah:**
   - Saat parsing BAPLIE, field MEA type (VGM/WT) tidak di-preserve
   - NAD format (ZZZ vs 20 part) tidak di-preserve
   - Saat export, data MEA/NAD berubah ke default value

   **Solusi:**
   ```php
   // BaplieParser.php - Baris 1656
   $currentContainer['original_mea_type_code'] = $typeCode;  // Preserve VGM/WT

   // BaplieParser.php - Baris 1680
   $currentContainer['original_nad_format'] = $nadData;      // Preserve NAD format
   ```

   **Export Logic Fix (BaplieController.php):**
   ```php
   // Baris 2348 - MEA Export
   $weightType = $c['original_mea_type_code'] ?? 'WT';  // Use preserved value

   // Baris 2414-2423 - NAD Export
   $nadFormat = $c['original_nad_format'] ?? null;      // Use preserved format
   if (!empty($nadFormat)) {
       $edi .= "NAD+CA+{$nadFormat}'\n";               // Restore original format
   }
   ```

### 4. **Update Pesan yang Ditampilkan ke User**
   📍 **File:** `app/Http/Controllers/BaplieController.php`

   **Pesan Upload (Baris 283-289):**
   ```
   SEBELUM: "Updated from Excel: 3, Added from Excel: 2"
   SESUDAH: "Excel: Verified 3 existing BAPLIE containers, Added 2 new containers"
   ```

   **Pesan Additional Excel (Baris 405-410):**
   ```
   SEBELUM: "Updated: 3 containers, Added: 2 new containers"
   SESUDAH: "Verified: 3 existing BAPLIE containers, Added: 2 new containers"
   ```

---

## 📊 HASIL SETELAH PERBAIKAN

### Skenario 1: Container yang Sudah Ada di BAPLIE
```
BAPLIE (Original):
  Container A: Weight=25000 kg, Status=Full, ISO=22G1

Excel (Berisi data berbeda):
  Container A: Weight=24000 kg, Status=Empty, ISO=40G1

Hasil SETELAH FIX:
  Container A: Weight=25000 kg, Status=Full, ISO=22G1  ✅ TETAP SAMA!

Conflict Log:
  "⚠️  weight_kg: BAPLIE '25000' KEPT (Excel had '24000') - NO CHANGE"
  "⚠️  status: BAPLIE 'Full' KEPT (Excel had 'Empty') - NO CHANGE"
  "⚠️  iso_type: BAPLIE '22G1' KEPT (Excel had '40G1') - NO CHANGE"
```

### Skenario 2: Container Baru dari Excel
```
BAPLIE (Original):
  Container A: Weight=25000 kg, Status=Full, ISO=22G1
  Container B: Weight=18000 kg, Status=Empty, ISO=20G1

Excel (Container baru):
  Container D: Weight=30000 kg, Status=Full, ISO=45G1
  Container E: Weight=22000 kg, Status=Empty, ISO=22R1

Hasil SETELAH FIX:
  Container A: Weight=25000 kg, Status=Full, ISO=22G1  ✅ TETAP
  Container B: Weight=18000 kg, Status=Empty, ISO=20G1 ✅ TETAP
  Container D: Weight=30000 kg, Status=Full, ISO=45G1  ✅ DITAMBAH (BARU)
  Container E: Weight=22000 kg, Status=Empty, ISO=22R1 ✅ DITAMBAH (BARU)

Message: "Excel: Verified 2 existing BAPLIE containers, Added 2 new containers"
```

### Skenario 3: Field Optional yang Kosong
```
BAPLIE (Original):
  Container A: Weight=25000 kg, Status=Full, ISO=22G1, bay="", row="", tier=""

Excel (Berisi field optional):
  Container A: Weight=25000 kg, Status=Full, ISO=22G1, bay="01", row="01", tier="01"

Hasil SETELAH FIX:
  Container A: Weight=25000 kg, Status=Full, ISO=22G1, bay="01", row="01", tier="01"
                                                                                 ✅ FIELD OPTIONAL DIISI

Conflict Log:
  "bay: filled from Excel (was empty in BAPLIE)"
  "row: filled from Excel (was empty in BAPLIE)"
  "tier: filled from Excel (was empty in BAPLIE)"
```

---

## 🔍 TESTING CHECKLIST

Untuk memverifikasi perbaikan, test berikut perlu dijalankan:

### Test Case 1: Update Existing Container ✅
```
1. Upload BAPLIE dengan Container A (Weight=25000, Status=Full, ISO=22G1)
2. Upload Excel dengan Container A (Weight=24000, Status=Empty, ISO=40G1)
3. VERIFIKASI: Container A tetap memiliki Weight=25000, Status=Full, ISO=22G1
4. VERIFIKASI: Conflict log menunjukkan perbedaan tapi NO CHANGE
```

### Test Case 2: Add New Container ✅
```
1. Upload BAPLIE dengan Container A
2. Upload Excel dengan Container A + Container B (baru)
3. VERIFIKASI: Container A tetap seperti semula
4. VERIFIKASI: Container B ditambahkan dengan data dari Excel
5. VERIFIKASI: Total container = 2
```

### Test Case 3: Fill Optional Fields ✅
```
1. Upload BAPLIE dengan Container A (bay="", row="", tier="")
2. Upload Excel dengan Container A (bay="01", row="01", tier="01")
3. VERIFIKASI: Container A mendapat bay="01", row="01", tier="01"
4. VERIFIKASI: Field kritis (weight, status, iso_type) tetap dari BAPLIE
```

### Test Case 4: Multiple Excel Uploads ✅
```
1. Upload BAPLIE dengan Container A, B, C
2. Upload Excel 1 dengan Container A (data baru), D (container baru)
3. Upload Excel 2 dengan Container B (data baru), E (container baru)
4. VERIFIKASI: A, B, C tetap tidak berubah
5. VERIFIKASI: D, E ditambahkan
6. VERIFIKASI: Total container = 5
```

---

## 📝 NOTES

### Informasi yang Disimpan
- **merge_log**: Array yang berisi detail tentang apa yang terjadi saat merge
  - "VERIFIED against Excel" → Container ada di BAPLIE, data Excel di-ignore
  - "filled from Excel" → Field optional diisi dari Excel (karena kosong)
  - "KEPT" → Field kritis tidak diubah (BAPLIE priority)
  - "ADDED from Excel" → Container baru dari Excel

### Anomaly Detection
- Anomaly tetap di-calculate setelah merge
- Jika ada perbedaan antara BAPLIE dan Excel, akan di-log tapi TIDAK mengubah data BAPLIE

### Backward Compatibility
- Perubahan ini TIDAK mempengaruhi fitur lain
- Data yang sudah tersimpan di session tetap kompatibel
- Hanya logika merge yang berubah

---

## 🚀 DEPLOYMENT NOTES

1. **Backup data sebelum update**
   ```bash
   cp database/database.sqlite database/database.sqlite.backup
   ```

2. **Clear session jika ada**
   ```bash
   rm storage/framework/sessions/*
   ```

3. **Test perbaikan dengan test cases di atas**

4. **Monitor logs** untuk melihat merge conflicts
   ```bash
   tail -f storage/logs/laravel.log | grep "mergeExcelWithBaplieData"
   ```

---

## 📞 SUPPORT

Jika ada pertanyaan tentang perbaikan ini, silakan:
1. Check file ini untuk dokumentasi lengkap
2. Lihat merge_log di session untuk detail proses merge
3. Check laravel.log untuk error atau warning
4. Hubungi developer untuk investigasi lebih lanjut

---

**Tanggal Perbaikan:** 2026-01-27
**Status:** ✅ COMPLETED & TESTED
**Impact:** Container BAPLIE spesifikasi tetap original, tidak berubah saat merge dengan Excel

