/** * Update the specified resource in storage. */ public function update(Request $request, SuratMasuk $suratMasuk) { $user = auth()->user(); // Authorization: pembuat bisa update sebelum disposisi, admin bisa update apapun if (!$suratMasuk->canBeModifiedBy($user)) { return redirect()->back()->with('error', 'Anda tidak memiliki akses untuk mengupdate surat ini.'); } // TU satuan: validasi tujuan harus ke atasan langsung (kecuali admin) if (($user->isTU() || $user->isOperatorTU()) && !$user->isSETUM() && !$user->isAdmin()) { $tujuanId = $request->input('tujuan_akhir_id'); if ($tujuanId && $tujuanId != $user->superior_id) { return redirect()->back()->with('error', 'TU hanya dapat mengirim surat ke atasan langsung.'); } } $action = $request->input('action'); $isDraft = $action === 'draft'; $isUpdate = $action === 'update'; // Validasi ringan di Laravel untuk UX (pesan langsung tanpa round-trip Node) if ($isDraft) { $validated = $request->validate([ 'nomor_surat' => 'nullable|string|max:255', 'tanggal_surat' => 'nullable|date', 'asal_surat' => 'nullable|string|max:255', 'perihal' => 'nullable|string', 'kategori_id' => 'nullable|exists:kategori_surat,id', 'tujuan_akhir_id' => 'nullable|exists:users,id', 'sifat' => 'nullable|in:biasa,segera,sangat_segera,rahasia', 'is_kilat' => 'nullable|boolean', 'keterangan' => 'nullable|string', 'file_surat' => 'nullable|file|mimes:pdf|max:30720', ]); } elseif ($isUpdate) { $validated = $request->validate([ 'nomor_surat' => 'nullable|string|max:255', 'tanggal_surat' => 'nullable|date', 'asal_surat' => 'nullable|string|max:255', 'perihal' => 'nullable|string', 'kategori_id' => 'nullable|exists:kategori_surat,id', 'sifat' => 'nullable|in:biasa,segera,sangat_segera,rahasia', 'is_kilat' => 'nullable|boolean', 'keterangan' => 'nullable|string', 'file_surat' => 'nullable|file|mimes:pdf|max:30720', ]); } else { // Mode kirim $validated = $request->validate([ 'nomor_surat' => 'required|string|max:255', 'tanggal_surat' => 'required|date', 'asal_surat' => 'required|string|max:255', 'perihal' => 'required|string', 'kategori_id' => 'required|exists:kategori_surat,id', 'tujuan_akhir_id' => 'required|exists:users,id', 'sifat' => 'nullable|in:biasa,segera,sangat_segera,rahasia', 'is_kilat' => 'nullable|boolean', 'keterangan' => 'nullable|string', 'file_surat' => 'nullable|file|mimes:pdf|max:30720', ]); } $validated['is_kilat'] = $request->has('is_kilat') ? '1' : '0'; try { $nodeApi = new NodeApiService(); // Handle file upload ke S3 dahulu, lalu kirim path ke Node if ($request->hasFile('file_surat')) { $filePath = $request->file('file_surat')->store('surat-masuk', 's3'); $validated['file_surat_path'] = $filePath; } $payload = array_filter([ 'nomor_surat' => $validated['nomor_surat'] ?? null, 'asal_surat' => $validated['asal_surat'] ?? null, 'perihal' => $validated['perihal'] ?? null, 'tanggal_surat' => $validated['tanggal_surat'] ?? null, 'kategori_id' => $validated['kategori_id'] ?? null, 'sifat' => $validated['sifat'] ?? null, 'is_kilat' => $validated['is_kilat'], 'keterangan' => $validated['keterangan'] ?? null, 'tujuan_akhir_id' => $validated['tujuan_akhir_id'] ?? null, 'file_surat_path' => $validated['file_surat_path'] ?? null, ], fn($v) => !is_null($v)); $response = $nodeApi->put("/api/surat-masuk/{$suratMasuk->id}", $payload); if (!$response->successful()) { $errorMsg = $response->json('message') ?? $response->body(); return redirect()->back()->withInput()->with('error', 'Gagal: ' . $errorMsg); } $successMessage = $response->json('message') ?? 'Surat masuk berhasil diperbarui.'; if ($isDraft) { return redirect()->route('surat-masuk.index')->with('success', $successMessage); } return redirect()->route('surat-masuk.show', $suratMasuk)->with('success', $successMessage); } catch (\Exception $e) { return redirect()->back() ->withInput() ->with('error', 'Gagal memperbarui surat masuk: ' . $e->getMessage()); } }