feat: sam_stat P2 도메인 + 통계 API + 대시보드 전환 (Phase 4)

- 4.1: stat_project_monthly + ProjectStatService (건설/프로젝트 월간)
- 4.2: stat_system_daily + SystemStatService (API/감사/FCM/파일/결재)
- 4.3: stat_events, stat_snapshots + StatEventService + StatEventObserver
- 4.4: StatController (summary/daily/monthly/alerts) + StatQueryService + FormRequest 3개 + routes/stats.php
- 4.5: DashboardService sam_stat 우선 조회 + 원본 DB 폴백 패턴

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
This commit is contained in:
2026-01-29 21:56:53 +09:00
parent 595e3d59b4
commit 4d8dac1091
22 changed files with 1011 additions and 7 deletions

View File

@@ -2,6 +2,8 @@
namespace App\Services;
use App\Models\Stats\Monthly\StatFinanceMonthly;
use App\Models\Stats\Monthly\StatSalesMonthly;
use App\Models\Tenants\Approval;
use App\Models\Tenants\ApprovalStep;
use App\Models\Tenants\Attendance;
@@ -114,23 +116,36 @@ private function getTodaySummary(int $tenantId, Carbon $today): array
}
/**
* 재무 요약 데이터
* 재무 요약 데이터 (sam_stat 우선, 폴백: 원본 DB)
*/
private function getFinanceSummary(int $tenantId, Carbon $startOfMonth, Carbon $endOfMonth): array
{
// 월간 입금 합계
// sam_stat 월간 데이터 시도
$monthly = StatFinanceMonthly::where('tenant_id', $tenantId)
->where('stat_year', $startOfMonth->year)
->where('stat_month', $startOfMonth->month)
->first();
if ($monthly) {
return [
'monthly_deposit' => (float) $monthly->deposit_amount,
'monthly_withdrawal' => (float) $monthly->withdrawal_amount,
'balance' => (float) ($monthly->deposit_amount - $monthly->withdrawal_amount),
'source' => 'sam_stat',
];
}
// 폴백: 원본 DB 실시간 집계
$monthlyDeposit = Deposit::query()
->where('tenant_id', $tenantId)
->whereBetween('deposit_date', [$startOfMonth, $endOfMonth])
->sum('amount');
// 월간 출금 합계
$monthlyWithdrawal = Withdrawal::query()
->where('tenant_id', $tenantId)
->whereBetween('withdrawal_date', [$startOfMonth, $endOfMonth])
->sum('amount');
// 현재 잔액 (전체 입금 - 전체 출금)
$totalDeposits = Deposit::query()
->where('tenant_id', $tenantId)
->sum('amount');
@@ -145,21 +160,35 @@ private function getFinanceSummary(int $tenantId, Carbon $startOfMonth, Carbon $
'monthly_deposit' => (float) $monthlyDeposit,
'monthly_withdrawal' => (float) $monthlyWithdrawal,
'balance' => (float) $balance,
'source' => 'samdb',
];
}
/**
* 매출/매입 요약 데이터
* 매출/매입 요약 데이터 (sam_stat 우선, 폴백: 원본 DB)
*/
private function getSalesSummary(int $tenantId, Carbon $startOfMonth, Carbon $endOfMonth): array
{
// 월간 매출 합계
// sam_stat 월간 데이터 시도
$monthly = StatSalesMonthly::where('tenant_id', $tenantId)
->where('stat_year', $startOfMonth->year)
->where('stat_month', $startOfMonth->month)
->first();
if ($monthly) {
return [
'monthly_sales' => (float) $monthly->sales_amount,
'monthly_purchases' => 0,
'source' => 'sam_stat',
];
}
// 폴백: 원본 DB 실시간 집계
$monthlySales = Sale::query()
->where('tenant_id', $tenantId)
->whereBetween('sale_date', [$startOfMonth, $endOfMonth])
->sum('total_amount');
// 월간 매입 합계
$monthlyPurchases = Purchase::query()
->where('tenant_id', $tenantId)
->whereBetween('purchase_date', [$startOfMonth, $endOfMonth])
@@ -168,6 +197,7 @@ private function getSalesSummary(int $tenantId, Carbon $startOfMonth, Carbon $en
return [
'monthly_sales' => (float) $monthlySales,
'monthly_purchases' => (float) $monthlyPurchases,
'source' => 'samdb',
];
}