'decimal:2', 'withdraw' => 'decimal:2', 'balance' => 'decimal:2', 'is_manual' => 'boolean', ]; // ========================================================================= // 관계 정의 // ========================================================================= public function tenant(): BelongsTo { return $this->belongsTo(\App\Models\Tenants\Tenant::class); } // ========================================================================= // 접근자 // ========================================================================= /** * 거래 고유 키 (계좌번호|거래일시|입금|출금|잔액) */ public function getUniqueKeyAttribute(): string { return static::generateUniqueKey([ 'bank_account_num' => $this->bank_account_num, 'trans_dt' => $this->trans_dt, 'deposit' => $this->deposit, 'withdraw' => $this->withdraw, 'balance' => $this->balance, ]); } // ========================================================================= // 헬퍼 메서드 // ========================================================================= public static function generateUniqueKey(array $data): string { return implode('|', [ $data['bank_account_num'] ?? '', $data['trans_dt'] ?? '', $data['deposit'] ?? '0', $data['withdraw'] ?? '0', $data['balance'] ?? '0', ]); } public static function getByDateRange(int $tenantId, string $startDate, string $endDate, ?string $accountNum = null) { $query = static::where('tenant_id', $tenantId) ->whereBetween('trans_date', [$startDate, $endDate]); if ($accountNum) { $query->where('bank_account_num', $accountNum); } return $query->orderBy('trans_date')->orderBy('trans_dt')->get(); } }