diff --git a/app/Http/Controllers/Finance/JournalEntryController.php b/app/Http/Controllers/Finance/JournalEntryController.php index 3da24b19..be09a659 100644 --- a/app/Http/Controllers/Finance/JournalEntryController.php +++ b/app/Http/Controllers/Finance/JournalEntryController.php @@ -477,6 +477,7 @@ public function bankTransactions(Request $request): JsonResponse $accountBalances[$accNum] = $newBal; $logs[] = [ + 'id' => $tx->id, 'uniqueKey' => $tx->unique_key, 'transDate' => $tx->trans_date, 'transTime' => $tx->trans_time, @@ -761,6 +762,40 @@ public function deleteBankJournal(int $id): JsonResponse ]); } + /** + * 은행거래 레코드 삭제 — 관리자 이상만 가능 + */ + public function destroyBankTransaction(int $id): JsonResponse + { + $user = auth()->user(); + if (! $user || ! $user->isAdmin()) { + return response()->json([ + 'success' => false, + 'message' => '은행거래 삭제는 관리자만 가능합니다.', + ], 403); + } + + $tenantId = session('selected_tenant_id', 1); + $tx = BankTransaction::where('tenant_id', $tenantId)->findOrFail($id); + + // 연결된 분개 전표도 함께 삭제 + $journal = JournalEntry::where('tenant_id', $tenantId) + ->where('source_type', 'bank_transaction') + ->where('source_key', $tx->unique_key) + ->first(); + + if ($journal) { + $journal->delete(); + } + + $tx->delete(); + + return response()->json([ + 'success' => true, + 'message' => '은행거래 레코드가 삭제되었습니다.', + ]); + } + /** * 조회기간 이전의 계좌별 잔액 계산 * EaccountController::findBaseBalance() 패턴을 계좌별로 확장 diff --git a/resources/views/finance/journal-entries.blade.php b/resources/views/finance/journal-entries.blade.php index ed088c88..09a4fe2a 100644 --- a/resources/views/finance/journal-entries.blade.php +++ b/resources/views/finance/journal-entries.blade.php @@ -1166,6 +1166,26 @@ className="px-2.5 py-1 text-xs font-medium bg-amber-100 text-amber-700 rounded-f } }; + const handleDeleteBankTx = async (bankTxId, description) => { + if (!bankTxId) return; + if (!confirm(`"${description}" 은행거래 레코드를 삭제하시겠습니까?\n(연결된 분개 전표도 함께 삭제됩니다)`)) return; + try { + const res = await fetch(`/finance/journal-entries/bank-transaction/${bankTxId}`, { + method: 'DELETE', + headers: { 'X-CSRF-TOKEN': CSRF_TOKEN }, + }); + const data = await res.json(); + if (data.success) { + notify('은행거래 레코드가 삭제되었습니다.', 'success'); + fetchData(); + } else { + notify(data.message || '삭제 실패', 'error'); + } + } catch (err) { + notify('삭제 중 오류가 발생했습니다.', 'error'); + } + }; + const handleJournal = (tx) => { setModalTransaction(tx); setShowJournalModal(true); @@ -1409,8 +1429,21 @@ className={`px-2.5 py-1 text-xs rounded-full font-medium transition-colors ${vie {row.totalCredit > 0 ? formatCurrency(row.totalCredit) : ''}