'decimal:2', 'tax' => 'decimal:2', 'service_charge' => 'decimal:2', 'modified_supply_amount' => 'decimal:2', 'modified_tax' => 'decimal:2', 'is_manual' => 'boolean', ]; // ========================================================================= // 관계 정의 // ========================================================================= public function tenant(): BelongsTo { return $this->belongsTo(\App\Models\Tenants\Tenant::class); } // ========================================================================= // 접근자 // ========================================================================= /** * 거래 고유 키 (cardNum|useDt|approvalNum|approvalAmount) */ public function getUniqueKeyAttribute(): string { return static::generateUniqueKey([ 'card_num' => $this->card_num, 'use_dt' => $this->use_dt, 'approval_num' => $this->approval_num, 'approval_amount' => $this->approval_amount, ]); } // ========================================================================= // 헬퍼 메서드 // ========================================================================= public static function generateUniqueKey(array $data): string { return implode('|', [ $data['card_num'] ?? '', $data['use_dt'] ?? '', $data['approval_num'] ?? '', $data['approval_amount'] ?? '0', ]); } public static function getByDateRange(int $tenantId, string $startDate, string $endDate, ?string $cardNum = null) { $query = static::where('tenant_id', $tenantId) ->whereBetween('use_date', [$startDate, $endDate]); if ($cardNum) { $query->where('card_num', $cardNum); } return $query->orderBy('use_date')->orderBy('use_dt')->get(); } }