middleware('auth'); } public function index(){ $auth_user = Auth::user(); $api_url = config('api.url'); $user_name = $auth_user['name']; $komoditi = Komoditi::first(); $min_komoditi = $komoditi['min_komoditi']; return view('operasi.komuditi.index',compact('user_name','api_url','min_komoditi')); } public function cetakRekodKomoditi(){ $rekod = Http::withOptions(['verify' => config('app.api_verify')])->get(config('api.url') . '/api/komuditi/rekodkomuditi')->json(); return view('print.laporan_komoditi',compact('rekod')); } public function rekodKomoditi(Request $request){ $auth_user = Auth::user(); $api_url = config('api.url'); $user_name = $auth_user['name']; return view('operasi.komuditi.rekod_transaksi',compact('user_name','api_url')); } public function printRekodTransaksi(Request $request){ $tarikh_rekod = $request->tarikh_print; $rekod_print = Http::withOptions(['verify' => config('app.api_verify')])->get(config('api.url') . '/api/komoditi/rekod/transaksi',[ 'tarikh' => $request->tarikh_print ])->json(); return view('print.laporan_transaksi_komoditi',compact('rekod_print','tarikh_rekod')); } public function komoditiUpdate(Request $request){ $komoditi = Komoditi::first(); $komoditi->min_komoditi = $request->komoditi_limit; $komoditi->save(); return redirect()->route('komuditi'); } /** * Khazanah branch list of BSAS commodity orders. */ public function khazanahBsas() { $auth_user = Auth::user(); $cawangan_info = Http::withOptions(['verify' => config('app.api_verify')]) ->get(config('api.url') . '/api/cawangan/' . $auth_user['cawangan']) ->json(); return view('homepage.khazanah.bsas_komoditi', compact('cawangan_info')); } /** * Dummy BSAS eCert layout preview (bid, OTC, STB, then one commodity schedule). */ public function previewBsasEcert() { $line = [ ['SUPPLIER' => 'FGV TRADING SDN BHD', 'VOLUME' => '0.75276406'], ]; return view('print.bsas_ecert', $this->presentBsasCertificates([ 'e_cert_no' => 'CPO21OCT26-0000031-000', 'serial_number' => '1', 'otc_counter_party' => 'ALI BIN ABU', 'otc_murabaha_value' => '3,814.40', 'product_code' => 'CPO-MSIA-09', 'bid_ecert' => [ 'ECERTNO' => 'CPO21OCT26-0000031-000', 'BUYER' => 'KOPERASI PERMODALAN KELANTAN BERHAD', 'OWNER' => 'KOPERASI PERMODALAN KELANTAN BERHAD', 'BIDNO' => '8', 'TOTALVALUE' => '3,200.00', 'CURRENCY' => 'MYR', 'PRICE' => '4,251.00', 'PRICE_MYR_EQUIVALENT' => '4,251.00', 'PURCHASETIMEDATE' => '15:11:53.316 21 Oct 2026', 'VALUEDATE' => '21 Oct 2026', 'PNAME' => 'CPO-MSIA-09', 'PVOLUME' => '0.75276406', 'LINE' => $line, ], 'otc_ecert' => [ 'ECERTNO' => 'CPO21OCT26-0000031-000', 'SELLER' => 'KOPERASI PERMODALAN KELANTAN BERHAD', 'BUYER' => 'ALI BIN ABU', 'REPORTINGTIMEDATE' => '15:11:53.320 21 Oct 2026', 'VALUEDATE' => '21 Oct 2026', 'PNAME' => 'CPO-MSIA-09', 'PVOLUME' => '0.75276406', 'CURRENCY' => 'MYR', 'PRICE' => '4,251.00', 'PRICE_MYR_EQUIVALENT' => '4,251.00', 'TOTALVALUE' => '3,200.00', 'MURABAHAVALUE' => '3,814.40', 'LINE' => $line, ], 'stb_ecert' => [ 'ECERTNO' => 'CPO21OCT26-0000031-000', 'SELLER' => 'ALI BIN ABU', 'BUYER' => 'BURSA MALAYSIA ISLAMIC SERVICES', 'TOTALVALUE' => '3,200.00', 'CURRENCY' => 'MYR', 'PRICE' => '4,251.00', 'PRICE_MYR_EQUIVALENT' => '4,251.00', 'SELLINGTIMEDATE' => '15:11:53.325 21 Oct 2026', 'VALUEDATE' => '21 Oct 2026', 'PNAME' => 'CPO-MSIA-09', 'PVOLUME' => '0.75276406', 'LINE' => $line, ], ], true)); } /** * Live BSAS eCerts from stored bid, OTC and STB payloads. */ public function showBsasEcert($uuid) { $response = Http::withOptions(['verify' => config('app.api_verify')]) ->get(config('api.url') . '/api/komuditi/bsas/order/' . urlencode($uuid) . '/ecert'); if ($response->status() === 404) { abort(404, $response->json('message') ?: 'eCert tidak dijumpai.'); } if (!$response->successful()) { abort(502, 'Gagal memuatkan eCert BSAS.'); } $payload = $response->json(); if (!is_array($payload)) { abort(502, 'Gagal memuatkan eCert BSAS.'); } $presented = $this->presentBsasCertificates($payload, false); if ($presented['certificates'] === []) { abort(404, 'eCert belum tersedia untuk order ini.'); } return view('print.bsas_ecert', $presented); } /** * Bid, OTC and STB pages, plus one shared commodity schedule. */ protected function presentBsasCertificates(array $payload, bool $isDummy): array { $certificates = []; $bid = $payload['bid_ecert'] ?? null; if (is_array($bid) && $bid !== []) { $certificates[] = $this->mapBidCertificate($bid, $payload); } $otc = $payload['otc_ecert'] ?? null; if (is_array($otc) && $otc !== []) { $certificates[] = $this->mapOtcCertificate($otc, $payload); } $stb = $payload['stb_ecert'] ?? null; if (is_array($stb) && $stb !== []) { $certificates[] = $this->mapStbCertificate($stb, $payload); } $scheduleSource = []; if (is_array($otc) && $otc !== []) { $scheduleSource = $otc; } elseif (is_array($bid) && $bid !== []) { $scheduleSource = $bid; } elseif (is_array($stb) && $stb !== []) { $scheduleSource = $stb; } $ecertNo = $scheduleSource['ECERTNO'] ?? ($payload['e_cert_no'] ?? '-'); return [ 'certificates' => $certificates, 'ecert_no' => $ecertNo, 'lines' => $this->mapBsasLines($scheduleSource), 'isDummy' => $isDummy, ]; } protected function mapBidCertificate(array $ecert, array $orderMeta): array { [$time, $date] = $this->splitBsasDateTime((string) ($ecert['PURCHASETIMEDATE'] ?? '')); return $this->certificatePage( 'Certificate of Purchase', 'This is to certify that the following bid transaction has been executed
through the Bursa Suq Al-Sila\' in accordance with the
Rules of Bursa Suq Al-Sila\'.', $ecert, $orderMeta, array_merge([ ['label' => 'Buyer', 'value' => $ecert['BUYER'] ?? '-'], ['label' => 'Owner', 'value' => $ecert['OWNER'] ?? '-'], ['label' => 'Bid No', 'value' => $ecert['BIDNO'] ?? ($orderMeta['serial_number'] ?? '-')], ['label' => 'Purchase Time / Date', 'value' => $time . ' / ' . $date], ], $this->commodityDetailRows($ecert, $orderMeta)) ); } protected function mapOtcCertificate(array $ecert, array $orderMeta): array { [$time, $date] = $this->splitBsasDateTime((string) ($ecert['REPORTINGTIMEDATE'] ?? '')); $page = $this->certificatePage( 'Certificate of Murabahah', 'This is to certify that the following transaction has been executed
through the Bursa Suq Al-Sila\' in accordance with the
Rules of Bursa Suq Al-Sila\'.', $ecert, $orderMeta, array_merge([ ['label' => 'Seller', 'value' => $ecert['SELLER'] ?? 'KOPERASI PERMODALAN KELANTAN BERHAD'], ['label' => 'Buyer', 'value' => $ecert['BUYER'] ?? ($orderMeta['otc_counter_party'] ?? '-')], ['label' => 'Bid No', 'value' => $orderMeta['serial_number'] ?? '1'], ['label' => 'Reporting Time / Date', 'value' => $time . ' / ' . $date], ], $this->commodityDetailRows($ecert, $orderMeta), [ ['label' => 'Transaction Type', 'value' => '-'], ]) ); $page['show_murabaha'] = true; $page['murabaha'] = $ecert['MURABAHAVALUE'] ?? ($orderMeta['otc_murabaha_value'] ?? '-'); return $page; } protected function mapStbCertificate(array $ecert, array $orderMeta): array { [$time, $date] = $this->splitBsasDateTime((string) ($ecert['SELLINGTIMEDATE'] ?? '')); return $this->certificatePage( 'Certificate of Sale', 'This is to certify that the following sale transaction has been executed
through the Bursa Suq Al-Sila\' in accordance with the
Rules of Bursa Suq Al-Sila\'.', $ecert, $orderMeta, array_merge([ ['label' => 'Seller', 'value' => $ecert['SELLER'] ?? ($orderMeta['otc_counter_party'] ?? '-')], ['label' => 'Buyer', 'value' => $ecert['BUYER'] ?? '-'], ['label' => 'Selling Time / Date', 'value' => $time . ' / ' . $date], ], $this->commodityDetailRows($ecert, $orderMeta)) ); } protected function certificatePage(string $title, string $statement, array $ecert, array $orderMeta, array $rows): array { return [ 'title' => $title, 'statement' => $statement, 'ecert_no' => $ecert['ECERTNO'] ?? ($orderMeta['e_cert_no'] ?? '-'), 'currency' => $ecert['CURRENCY'] ?? 'MYR', 'rows' => $rows, 'show_murabaha' => false, 'murabaha' => null, ]; } protected function commodityDetailRows(array $ecert, array $orderMeta): array { return [ ['label' => 'Value Date', 'value' => isset($ecert['VALUEDATE']) ? strtoupper((string) $ecert['VALUEDATE']) : '-'], ['label' => 'Product Code / Description', 'value' => $ecert['PNAME'] ?? ($orderMeta['product_code'] ?? '-')], ['label' => 'Unit', 'value' => 'Tonnage'], ['label' => 'Volume', 'value' => $ecert['PVOLUME'] ?? '-'], ['label' => 'Currency', 'value' => $ecert['CURRENCY'] ?? 'MYR'], ['label' => 'Price (MYR)', 'value' => $ecert['PRICE'] ?? '-'], ['label' => 'Price (MYR Equivalent)', 'value' => $ecert['PRICE_MYR_EQUIVALENT'] ?? ($ecert['PRICE'] ?? '-')], ['label' => 'Value', 'value' => $ecert['TOTALVALUE'] ?? '-'], ]; } protected function mapBsasLines(array $ecert): array { $lines = []; foreach (($ecert['LINE'] ?? []) as $line) { if (!is_array($line)) { continue; } $lines[] = [ 'supplier' => $line['SUPPLIER'] ?? '-', 'volume' => $line['VOLUME'] ?? ($ecert['PVOLUME'] ?? '-'), ]; } if ($lines === []) { $lines[] = [ 'supplier' => '-', 'volume' => $ecert['PVOLUME'] ?? '-', ]; } return $lines; } protected function splitBsasDateTime(string $value): array { $value = trim($value); if ($value === '') { return ['-', '-']; } $parts = explode(' ', $value, 2); return [ $parts[0] ?? '-', isset($parts[1]) ? strtoupper($parts[1]) : '-', ]; } }