feat:카드 사용내역 공급가액/부가세 수정 및 이력 추적 기능

- CardTransaction 모델에 modified_supply_amount, modified_tax 추가
- CardTransactionAmountLog 모델 신규 생성 (수정 이력)
- parseTransactionLogs: effectiveSupplyAmount, effectiveTax, isAmountModified 응답 추가
- save: 금액 변경 감지 시 amount_logs 이력 자동 기록
- 프론트엔드: 공급가액/부가세 input 수정 가능, 합계금액 자동계산
- 수정 시 주황색 배경 + 원본값 취소선 표시
- 분개된 거래는 금액 수정 비활성화 (읽기전용)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
This commit is contained in:
김보곤
2026-02-05 10:02:56 +09:00
parent b29e51a9a3
commit bacf0396d5
4 changed files with 181 additions and 7 deletions

View File

@@ -7,6 +7,7 @@
use App\Models\Barobill\BarobillConfig;
use App\Models\Barobill\BarobillMember;
use App\Models\Barobill\CardTransaction;
use App\Models\Barobill\CardTransactionAmountLog;
use App\Models\Barobill\CardTransactionSplit;
use App\Models\Tenants\Tenant;
use Illuminate\Http\JsonResponse;
@@ -654,6 +655,16 @@ private function parseTransactionLogs($resultData, $savedData = null): array
'evidenceName' => $savedItem?->evidence_name ?? ($log->UseStoreName ?? ''),
'description' => $savedItem?->description ?? ($log->UseStoreBizType ?? $log->Memo ?? ''),
'isSaved' => $savedItem !== null,
// 금액 수정 관련 필드
'modifiedSupplyAmount' => $savedItem?->modified_supply_amount !== null ? (float) $savedItem->modified_supply_amount : null,
'modifiedTax' => $savedItem?->modified_tax !== null ? (float) $savedItem->modified_tax : null,
'effectiveSupplyAmount' => $savedItem?->modified_supply_amount !== null
? (float) $savedItem->modified_supply_amount
: ($amount - floatval($log->Tax ?? 0)),
'effectiveTax' => $savedItem?->modified_tax !== null
? (float) $savedItem->modified_tax
: floatval($log->Tax ?? 0),
'isAmountModified' => $savedItem?->modified_supply_amount !== null || $savedItem?->modified_tax !== null,
];
// 공제/불공제 통계 집계
@@ -851,7 +862,54 @@ public function save(Request $request): JsonResponse
->where('approval_amount', $data['approval_amount'])
->first();
// 수정 금액 처리
$modifiedSupplyAmount = isset($trans['modifiedSupplyAmount']) && $trans['modifiedSupplyAmount'] !== null
? floatval($trans['modifiedSupplyAmount']) : null;
$modifiedTax = isset($trans['modifiedTax']) && $trans['modifiedTax'] !== null
? floatval($trans['modifiedTax']) : null;
$data['modified_supply_amount'] = $modifiedSupplyAmount;
$data['modified_tax'] = $modifiedTax;
if ($existing) {
// 금액 변경 감지 및 이력 기록
$oldSupply = $existing->modified_supply_amount !== null
? (float) $existing->modified_supply_amount
: ((float) $existing->approval_amount - (float) $existing->tax);
$oldTax = $existing->modified_tax !== null
? (float) $existing->modified_tax
: (float) $existing->tax;
$newSupply = $modifiedSupplyAmount !== null
? $modifiedSupplyAmount
: ((float) $existing->approval_amount - (float) $existing->tax);
$newTax = $modifiedTax !== null
? $modifiedTax
: (float) $existing->tax;
$amountChanged = abs($oldSupply - $newSupply) > 0.01 || abs($oldTax - $newTax) > 0.01;
if ($amountChanged) {
$uniqueKey = implode('|', [
$existing->card_num,
$existing->use_dt,
$existing->approval_num,
(int) $existing->approval_amount,
]);
CardTransactionAmountLog::create([
'card_transaction_id' => $existing->id,
'original_unique_key' => $uniqueKey,
'before_supply_amount' => $oldSupply,
'before_tax' => $oldTax,
'after_supply_amount' => $newSupply,
'after_tax' => $newTax,
'modified_by' => auth()->id(),
'modified_by_name' => auth()->user()?->name ?? '',
'ip_address' => $request->ip(),
]);
}
// 계정과목 및 수정 가능한 필드들 업데이트
$existing->update([
'account_code' => $data['account_code'],
@@ -859,6 +917,8 @@ public function save(Request $request): JsonResponse
'deduction_type' => $data['deduction_type'],
'evidence_name' => $data['evidence_name'],
'description' => $data['description'],
'modified_supply_amount' => $data['modified_supply_amount'],
'modified_tax' => $data['modified_tax'],
]);
$updated++;
} else {