fix: [finance] 분리 카드거래 분개 매칭 누락 수정
- 분리 거래 source_key(uniqueKey|split:N) 패턴 매칭 추가 - 일반전표입력: 복수 분리 분개를 합산하여 1행으로 표시 - 계정별원장: 분리 키도 원본 카드 데이터로 매핑
This commit is contained in:
@@ -8,6 +8,7 @@
|
||||
use App\Models\Barobill\BankTransactionOverride;
|
||||
use App\Models\Barobill\CardTransaction;
|
||||
use App\Models\Barobill\CardTransactionHide;
|
||||
use App\Models\Barobill\CardTransactionSplit;
|
||||
use App\Models\Finance\JournalEntry;
|
||||
use App\Models\Finance\JournalEntryLine;
|
||||
use App\Models\Finance\TradingPartner;
|
||||
@@ -1007,11 +1008,11 @@ public function cardTransactions(Request $request): JsonResponse
|
||||
// 각 거래의 uniqueKey 수집
|
||||
$uniqueKeys = array_column($logs, 'uniqueKey');
|
||||
|
||||
// 분개 완료된 source_key 조회
|
||||
// 분개 완료된 source_key 조회 (직접 매칭)
|
||||
$journaledKeys = JournalEntry::getJournaledSourceKeys($tenantId, 'ecard_transaction', $uniqueKeys);
|
||||
$journaledKeysMap = array_flip($journaledKeys);
|
||||
|
||||
// 분개된 전표 ID 조회
|
||||
// 분개된 전표 ID 조회 (직접 매칭)
|
||||
$journalMap = [];
|
||||
if (! empty($journaledKeys)) {
|
||||
$journals = JournalEntry::where('tenant_id', $tenantId)
|
||||
@@ -1024,12 +1025,63 @@ public function cardTransactions(Request $request): JsonResponse
|
||||
}
|
||||
}
|
||||
|
||||
// 분리 거래의 분개 상태 조회 (source_key LIKE 'uniqueKey|split:%')
|
||||
$splitJournalMap = []; // originalKey => [['id' => ..., 'entry_no' => ...], ...]
|
||||
if (! empty($uniqueKeys)) {
|
||||
$splitJournals = JournalEntry::where('tenant_id', $tenantId)
|
||||
->where('source_type', 'ecard_transaction')
|
||||
->where(function ($q) use ($uniqueKeys) {
|
||||
foreach ($uniqueKeys as $key) {
|
||||
$q->orWhere('source_key', 'LIKE', $key.'|split:%');
|
||||
}
|
||||
})
|
||||
->select('id', 'source_key', 'entry_no')
|
||||
->get();
|
||||
|
||||
foreach ($splitJournals as $j) {
|
||||
$originalKey = explode('|split:', $j->source_key)[0];
|
||||
$splitJournalMap[$originalKey][] = ['id' => $j->id, 'entry_no' => $j->entry_no];
|
||||
}
|
||||
}
|
||||
|
||||
// 분리 건수 조회 (전체 분개 완료 여부 판단용)
|
||||
$splitCounts = [];
|
||||
if (! empty($uniqueKeys)) {
|
||||
$counts = CardTransactionSplit::where('tenant_id', $tenantId)
|
||||
->whereIn('original_unique_key', $uniqueKeys)
|
||||
->selectRaw('original_unique_key, COUNT(*) as cnt')
|
||||
->groupBy('original_unique_key')
|
||||
->pluck('cnt', 'original_unique_key');
|
||||
$splitCounts = $counts->toArray();
|
||||
}
|
||||
|
||||
// 각 거래에 분개 상태 추가
|
||||
$journaledCount = 0;
|
||||
foreach ($logs as &$log) {
|
||||
$key = $log['uniqueKey'] ?? '';
|
||||
$log['hasJournal'] = isset($journaledKeysMap[$key]);
|
||||
$log['journalId'] = $journalMap[$key]['id'] ?? null;
|
||||
$log['journalEntryNo'] = $journalMap[$key]['entry_no'] ?? null;
|
||||
$directMatch = isset($journaledKeysMap[$key]);
|
||||
$splitCount = $splitCounts[$key] ?? 0;
|
||||
$splitJournals = $splitJournalMap[$key] ?? [];
|
||||
$allSplitsJournaled = $splitCount > 0 && count($splitJournals) >= $splitCount;
|
||||
|
||||
$log['hasJournal'] = $directMatch || $allSplitsJournaled;
|
||||
$log['splitJournalIds'] = [];
|
||||
|
||||
if ($directMatch) {
|
||||
$log['journalId'] = $journalMap[$key]['id'] ?? null;
|
||||
$log['journalEntryNo'] = $journalMap[$key]['entry_no'] ?? null;
|
||||
} elseif (! empty($splitJournals)) {
|
||||
$log['journalId'] = $splitJournals[0]['id'];
|
||||
$log['journalEntryNo'] = $splitJournals[0]['entry_no'];
|
||||
$log['splitJournalIds'] = array_column($splitJournals, 'id');
|
||||
} else {
|
||||
$log['journalId'] = null;
|
||||
$log['journalEntryNo'] = null;
|
||||
}
|
||||
|
||||
if ($log['hasJournal']) {
|
||||
$journaledCount++;
|
||||
}
|
||||
}
|
||||
unset($log);
|
||||
|
||||
@@ -1045,7 +1097,6 @@ public function cardTransactions(Request $request): JsonResponse
|
||||
$deductibleSum += $log['approvalAmount'];
|
||||
}
|
||||
}
|
||||
$journaledCount = count($journaledKeys);
|
||||
|
||||
// 카드 목록 (드롭다운용)
|
||||
$cards = CardTransaction::where('tenant_id', $tenantId)
|
||||
|
||||
Reference in New Issue
Block a user