# Konteks Sesi - san_ibb_2jul
> Disimpan: 2026-07-14 08:48 WIB

---

## 1. Fitur Lock Estimate (Selesai ✅)

**Ringkasan:**  
Ketika estimate sedang diedit orang lain, semua tombol aksi dimatikan dan hanya tombol "Minta Ambil Alih" yang aktif.

**File yang diubah:**
- `app/Controllers/Estimates.php` — cek lock state `is_currently_locked` dikirim ke view
- `app/Views/estimates/view.php` — script untuk disable semua tombol aksi saat locked

---

## 2. Dropdown Group B dengan Alamat Lengkap (Selesai ✅)

**Ringkasan:**  
Field dropdown pada form Sunting Estimate (Group B: Customer Details, Billing Details, Delivery Details) sebelumnya hanya menampilkan nama/alias saja. Sekarang label dropdown diperkaya dengan alamat lengkap, format: `Nama (Alamat Lengkap)`.

**File yang diubah:**
- `app/Controllers/Estimates.php` — method `get_dynamic_model_options()`:
  - Untuk model `MdlCustomerAddress`, `MdlCustomerBillAddress`, `MdlCustomer_and_pre`, dilakukan dua kali query ke API Data Center:
    1. Ambil nama/alias (`alias` atau `nama`)
    2. Ambil alamat (`alamat` atau `alamat_1`)
  - Hasilnya digabung: `"Nama (Alamat)"`

**API Data Center yang digunakan:**
- Base URL: `https://demo.mayagrahakencana.com/san_28jun/`
- Endpoint: `eusvc/Transactions/getModelOptions?...`
- Field alamat:
  - `MdlCustomerAddress` → kolom `alamat`
  - `MdlCustomerBillAddress` → kolom `alamat`
  - `MdlCustomer_and_pre` → kolom `alamat_1`

---

## 3. Card "Detail Transaksi" di Sidebar Kanan (Selesai ✅)

**Ringkasan:**  
Menambahkan card premium di sidebar kanan halaman view estimate untuk menampilkan semua field `transaction_options` yang tersimpan dalam database, dengan nilai yang sudah di-resolve (nama + alamat).

**File yang diubah:**

### `app/Controllers/Estimates.php` — method `view($estimate_id)`
Setelah baris `$view_data["signature"] = $this->_getCustomSigner($estimate_id);` ditambahkan:
```php
$transaction_options_resolved = array();
if (isset($view_data["estimate_info"]->transaction_options) && $view_data["estimate_info"]->transaction_options) {
    $tx_opts = json_decode($view_data["estimate_info"]->transaction_options, true);
    if (is_array($tx_opts) && !empty($tx_opts)) {
        $baseUrl = rtrim((string) env('API_BASE_URL_DC'), '/') . '/';
        $apiUrl = $baseUrl . "eusvc/Transactions/getUiElements/582";
        $ui_response = call_curl($apiUrl);

        if (isset($ui_response['success']) && $ui_response['success'] && !empty($ui_response['data'])) {
            foreach ($tx_opts as $key => $selected_id) {
                if (isset($ui_response['data'][$key]) && $selected_id) {
                    $elem = $ui_response['data'][$key];
                    $label = $elem['label'] ?? $key;
                    $mdlName = $elem['mdlName'] ?? '';
                    $keyField = $elem['key'] ?? 'id';
                    $labelSrc = $elem['labelSrc'] ?? '';

                    $addressField = '';
                    if ($mdlName === 'MdlCustomerAddress' || $mdlName === 'MdlCustomerBillAddress') {
                        $addressField = 'alamat';
                    } else if ($mdlName === 'MdlCustomer_and_pre') {
                        $addressField = 'alamat_1';
                    }

                    if ($mdlName && $labelSrc) {
                        $query_params = array(
                            "mdlName" => $mdlName,
                            "key" => $keyField,
                            "labelSrc" => $labelSrc,
                            "filter" => array("$keyField=$selected_id")
                        );
                        $apiUrlName = $baseUrl . "eusvc/Transactions/getModelOptions?" . http_build_query($query_params);
                        $resName = call_curl($apiUrlName);
                        $nameVal = '';
                        if (isset($resName['success']) && $resName['success'] && !empty($resName['data'])) {
                            $nameVal = $resName['data'][0]['text'] ?? '';
                        }

                        $addressVal = '';
                        if ($addressField) {
                            $query_params['labelSrc'] = $addressField;
                            $apiUrlAddress = $baseUrl . "eusvc/Transactions/getModelOptions?" . http_build_query($query_params);
                            $resAddress = call_curl($apiUrlAddress);
                            if (isset($resAddress['success']) && $resAddress['success'] && !empty($resAddress['data'])) {
                                $addressVal = $resAddress['data'][0]['text'] ?? '';
                            }
                        }

                        $displayText = $nameVal;
                        if ($displayText && $addressVal) {
                            $displayText .= " (" . $addressVal . ")";
                        } else if ($addressVal) {
                            $displayText = $addressVal;
                        }

                        if ($displayText) {
                            $transaction_options_resolved[] = array(
                                "label" => $label,
                                "value" => $displayText
                            );
                        }
                    }
                }
            }
        }
    }
}
$view_data["transaction_options_resolved"] = $transaction_options_resolved;
```

### `app/Views/estimates/details.php` — setelah card status bar (`col-md-3`)
```php
if (isset($transaction_options_resolved) && !empty($transaction_options_resolved)) {
    $details .= "<div class='card p20 mt15' style='border: 1px solid rgba(229, 233, 242, 0.8); box-shadow: 0 4px 20px rgba(0, 0, 0, 0.02); border-radius: 12px; background: #fff;'>";
    $details .= "<div class='card-body p0'>";
    $details .= "<h4 class='mt0 mb15' style='font-size: 14px; font-weight: 700; color: #1f2937; letter-spacing: 0.5px; border-bottom: 2px solid #f3f4f6; padding-bottom: 8px;'>DETAIL TRANSAKSI</h4>";
    foreach ($transaction_options_resolved as $opt) {
        $details .= "<div class='mb15' style='border-left: 3px solid #357ffa; padding-left: 10px;'>";
        $details .= "<span class='text-off' style='font-size: 10px; font-weight: 700; text-transform: uppercase; letter-spacing: 0.8px; color: #9ca3af; display: block;'>" . esc($opt['label']) . "</span>";
        $details .= "<div style='font-size: 13px; font-weight: 600; margin-top: 4px; color: #374151; word-break: break-word; line-height: 1.4;'>" . esc($opt['value']) . "</div>";
        $details .= "</div>";
    }
    $details .= "</div>";
    $details .= "</div>";
}
```

---

## Catatan Lanjutan (TODO)

- [ ] Verifikasi tampilan card "Detail Transaksi" di browser dengan data real dari estimate yang memiliki `transaction_options`
- [ ] Pertimbangkan caching hasil resolve API agar tidak terlalu banyak request ke Data Center tiap kali halaman view dibuka
- [ ] Uji performa jika ada banyak field di `transaction_options`

---

## Info Teknis Penting

| Key | Value |
|-----|-------|
| Database (IBB) | `192.168.5.10`, db `ibb_6jul`, prefix `rise_` |
| API Data Center base URL | `https://demo.mayagrahakencana.com/san_28jun/` |
| UI Elements ID | `582` (untuk form Estimate Group B) |
| Column `transaction_options` | Disimpan di tabel `rise_estimates`, format JSON |
| Lock system | Tabel `rise_estimate_edit_counter`, kolom `session_edit`, `session_edit_user`, `booking_dtime` |
