fix: [finance] 분리 재설정 시 이전 분개 잔존 방지

- AccountLedgerController: 유효한 split ID만 표시 (고아 분리 전표 필터)
- CardTransactionSplit::saveSplits: 재분리 시 이전 split의 분개 전표도 삭제
- 운영 DB 고아 전표 2건 soft delete 완료 (JE-20251127-002/003)
This commit is contained in:
김보곤
2026-03-19 22:57:03 +09:00
parent 3135054478
commit 2e2eddc6f8
2 changed files with 47 additions and 11 deletions

View File

@@ -76,21 +76,44 @@ public function list(Request $request): JsonResponse
->orderBy('je.entry_date')
->get();
// 분리 전표가 있는 원본 카드 전표 제외 (중복 방지)
$splitBaseKeys = $allLines
->filter(fn ($l) => $l->source_type === 'ecard_transaction' && $l->source_key && str_contains($l->source_key, '|split:'))
->map(fn ($l) => explode('|split:', $l->source_key)[0])
->unique()
->all();
// 유효하지 않은 분리 전표 + 원본 전표 중복 제거
$ecardSplitLines = $allLines->filter(
fn ($l) => $l->source_type === 'ecard_transaction' && $l->source_key && str_contains($l->source_key, '|split:')
);
if (! empty($splitBaseKeys)) {
$allLines = $allLines->filter(function ($l) use ($splitBaseKeys) {
if ($ecardSplitLines->isNotEmpty()) {
// 현재 유효한 split ID 조회
$splitBaseKeys = $ecardSplitLines
->map(fn ($l) => explode('|split:', $l->source_key)[0])
->unique()
->all();
$validSplitIds = DB::table('barobill_card_transaction_splits')
->where('tenant_id', $tenantId)
->whereIn('original_unique_key', $splitBaseKeys)
->pluck('id')
->all();
$validSplitSuffixes = array_map(fn ($id) => '|split:'.$id, $validSplitIds);
$allLines = $allLines->filter(function ($l) use ($splitBaseKeys, $validSplitSuffixes) {
if ($l->source_type !== 'ecard_transaction' || ! $l->source_key) {
return true;
}
// 분리 전표가 존재하면 원본(non-split) 전표는 제외
return str_contains($l->source_key, '|split:') || ! in_array($l->source_key, $splitBaseKeys);
if (str_contains($l->source_key, '|split:')) {
// 분리 전표: 현재 유효한 split ID만 유지
foreach ($validSplitSuffixes as $suffix) {
if (str_ends_with($l->source_key, $suffix)) {
return true;
}
}
return false;
}
// 원본(non-split) 전표: 분리 전표가 존재하면 제외
return ! in_array($l->source_key, $splitBaseKeys);
})->values();
}