prepare(" SELECT * FROM user_transaction_defaults WHERE user_id = ? LIMIT 1 "); $stmt->execute([$userId]); $row = $stmt->fetch(); if (!$row) { return get_transaction_form_default_seed(); } $row['keep_last_values'] = (int)$row['keep_last_values']; $row['continue_after_save'] = (int)$row['continue_after_save']; $row['quick_amounts'] = parse_quick_amounts($row['quick_amounts'] ?? ''); return array_merge(get_transaction_form_default_seed(), $row); } function get_transaction_form_default_seed(): array { return [ 'default_account_id' => null, 'default_card_account_id' => null, 'default_income_category_id' => null, 'default_expense_category_id' => null, 'default_transfer_category_id' => null, 'default_card_payment_category_id' => null, 'keep_last_values' => 1, 'continue_after_save' => 1, 'quick_amounts' => [10000, 30000, 50000, 100000], ]; } function save_transaction_form_defaults(int $userId, array $data): void { $pdo = db(); $quickAmounts = normalize_quick_amounts( $data['quick_amounts'] ?? [] ); $stmt = $pdo->prepare(" INSERT INTO user_transaction_defaults ( user_id, default_account_id, default_card_account_id, default_income_category_id, default_expense_category_id, default_transfer_category_id, default_card_payment_category_id, keep_last_values, continue_after_save, quick_amounts ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?) ON DUPLICATE KEY UPDATE default_account_id = VALUES(default_account_id), default_card_account_id = VALUES(default_card_account_id), default_income_category_id = VALUES(default_income_category_id), default_expense_category_id = VALUES(default_expense_category_id), default_transfer_category_id = VALUES(default_transfer_category_id), default_card_payment_category_id = VALUES(default_card_payment_category_id), keep_last_values = VALUES(keep_last_values), continue_after_save = VALUES(continue_after_save), quick_amounts = VALUES(quick_amounts) "); $stmt->execute([ $userId, nullable_id($data['default_account_id'] ?? null), nullable_id($data['default_card_account_id'] ?? null), nullable_id($data['default_income_category_id'] ?? null), nullable_id($data['default_expense_category_id'] ?? null), nullable_id($data['default_transfer_category_id'] ?? null), nullable_id($data['default_card_payment_category_id'] ?? null), !empty($data['keep_last_values']) ? 1 : 0, !empty($data['continue_after_save']) ? 1 : 0, implode(',', $quickAmounts), ]); } function nullable_id($value): ?int { $v = (int)$value; return $v > 0 ? $v : null; } function parse_quick_amounts(string $csv): array { if (trim($csv) === '') { return [10000, 30000, 50000, 100000]; } $items = explode(',', $csv); $result = []; foreach ($items as $item) { $v = (int)trim($item); if ($v > 0) { $result[] = $v; } } if (!$result) { return [10000, 30000, 50000, 100000]; } return array_values(array_unique($result)); } function normalize_quick_amounts(array $items): array { $result = []; foreach ($items as $item) { $v = (int)$item; if ($v > 0) { $result[] = $v; } } if (!$result) { $result = [10000, 30000, 50000, 100000]; } $result = array_values(array_unique($result)); sort($result); return $result; } /** * 거래 등록 화면 초기값 */ function build_transaction_form_state( int $userId, array $defaults, ?array $lastState = null ): array { $state = [ 'transaction_date' => current_date_ymd(), 'transaction_type' => 'expense', 'account_id' => $defaults['default_account_id'] ?: 0, 'related_account_id' => 0, 'category_id' => $defaults['default_expense_category_id'] ?: 0, 'amount' => '', 'merchant_name' => '', 'description' => '', 'is_installment' => 0, 'installment_months' => '', 'installment_interest_rate' => '', 'continue_after_save' => $defaults['continue_after_save'], 'keep_last_values' => $defaults['keep_last_values'], 'save_as_defaults' => 0, ]; if (!empty($defaults['keep_last_values']) && is_array($lastState)) { $state = array_merge($state, $lastState); $state['transaction_date'] = current_date_ymd(); $state['amount'] = ''; } return $state; } /** * 유형 변경 시 기본 카테고리 자동 선택 */ function apply_default_category_by_type(array &$state, array $defaults): void { $type = $state['transaction_type'] ?? 'expense'; if ($type === 'income') { $state['category_id'] = $defaults['default_income_category_id'] ?: 0; return; } if ($type === 'expense') { $state['category_id'] = $defaults['default_expense_category_id'] ?: 0; return; } if ($type === 'transfer') { $state['category_id'] = $defaults['default_transfer_category_id'] ?: 0; return; } if ($type === 'card_payment') { $state['category_id'] = $defaults['default_card_payment_category_id'] ?: 0; return; } } /** * 카드 지출이면 카드 기본계좌 우선 적용 */ function apply_default_card_account(array &$state, array $defaults): void { if (($state['transaction_type'] ?? '') !== 'expense') { return; } if (!empty($defaults['default_card_account_id'])) { $state['account_id'] = (int)$defaults['default_card_account_id']; } } /** * 저장 후 마지막 상태 저장 */ function remember_transaction_form_state(array $state): void { $_SESSION['tx_create_last_form'] = [ 'transaction_type' => $state['transaction_type'], 'account_id' => $state['account_id'], 'related_account_id' => $state['related_account_id'], 'category_id' => $state['category_id'], 'merchant_name' => $state['merchant_name'], 'description' => '', 'is_installment' => $state['is_installment'], 'installment_months' => $state['installment_months'], 'installment_interest_rate' => $state['installment_interest_rate'], 'continue_after_save' => $state['continue_after_save'], 'keep_last_values' => $state['keep_last_values'], 'transaction_date' => current_date_ymd(), 'amount' => '', ]; } function get_remembered_transaction_form_state(): ?array { return $_SESSION['tx_create_last_form'] ?? null; } function clear_remembered_transaction_form_state(): void { unset($_SESSION['tx_create_last_form']); } /** * 기본값 자동 저장용 데이터 만들기 */ function make_default_payload_from_form(array $state): array { $payload = [ 'default_account_id' => 0, 'default_card_account_id' => 0, 'default_income_category_id' => 0, 'default_expense_category_id' => 0, 'default_transfer_category_id' => 0, 'default_card_payment_category_id' => 0, 'keep_last_values' => $state['keep_last_values'] ?? 1, 'continue_after_save' => $state['continue_after_save'] ?? 1, ]; $type = $state['transaction_type'] ?? 'expense'; if ($type === 'income') { $payload['default_account_id'] = $state['account_id']; $payload['default_income_category_id'] = $state['category_id']; } elseif ($type === 'expense') { $payload['default_account_id'] = $state['account_id']; $payload['default_expense_category_id'] = $state['category_id']; $payload['default_card_account_id'] = $state['account_id']; } elseif ($type === 'transfer') { $payload['default_account_id'] = $state['account_id']; $payload['default_transfer_category_id'] = $state['category_id']; } elseif ($type === 'card_payment') { $payload['default_account_id'] = $state['account_id']; $payload['default_card_payment_category_id'] = $state['category_id']; } return $payload; }