feat: CEO 대시보드 API 구현 및 DB 컬럼 오류 수정
- StatusBoardService: 현황판 8개 항목 집계 API - CalendarService: 캘린더 일정 조회 API (작업지시/계약/휴가) - TodayIssueService: 오늘의 이슈 리스트 API - VatService: 부가세 신고 현황 API - EntertainmentService: 접대비 현황 API - WelfareService: 복리후생 현황 API 버그 수정: - orders 테이블 status → status_code 컬럼명 수정 - users 테이블 department 관계 → tenantProfile.department로 수정 - Swagger 문서 및 라우트 추가
This commit is contained in:
57
app/Http/Controllers/Api/V1/CalendarController.php
Normal file
57
app/Http/Controllers/Api/V1/CalendarController.php
Normal file
@@ -0,0 +1,57 @@
|
||||
<?php
|
||||
|
||||
namespace App\Http\Controllers\Api\V1;
|
||||
|
||||
use App\Helpers\ApiResponse;
|
||||
use App\Http\Controllers\Controller;
|
||||
use App\Services\CalendarService;
|
||||
use Carbon\Carbon;
|
||||
use Illuminate\Http\Request;
|
||||
|
||||
/**
|
||||
* CEO 대시보드 캘린더 컨트롤러
|
||||
*/
|
||||
class CalendarController extends Controller
|
||||
{
|
||||
public function __construct(
|
||||
private readonly CalendarService $calendarService
|
||||
) {}
|
||||
|
||||
/**
|
||||
* 캘린더 일정 조회
|
||||
*
|
||||
* @param Request $request
|
||||
* - start_date: 조회 시작일 (Y-m-d, 기본: 이번 달 1일)
|
||||
* - end_date: 조회 종료일 (Y-m-d, 기본: 이번 달 말일)
|
||||
* - type: 일정 타입 필터 (schedule|order|construction|null=전체)
|
||||
* - department_filter: 부서 필터 (all|department|personal, 기본: all)
|
||||
*/
|
||||
public function summary(Request $request)
|
||||
{
|
||||
$validated = $request->validate([
|
||||
'start_date' => 'nullable|date_format:Y-m-d',
|
||||
'end_date' => 'nullable|date_format:Y-m-d|after_or_equal:start_date',
|
||||
'type' => 'nullable|in:schedule,order,construction,other',
|
||||
'department_filter' => 'nullable|in:all,department,personal',
|
||||
]);
|
||||
|
||||
// 기본값 설정: 이번 달 전체
|
||||
$today = Carbon::today();
|
||||
$startDate = $validated['start_date'] ?? $today->copy()->startOfMonth()->format('Y-m-d');
|
||||
$endDate = $validated['end_date'] ?? $today->copy()->endOfMonth()->format('Y-m-d');
|
||||
$type = $validated['type'] ?? null;
|
||||
$departmentFilter = $validated['department_filter'] ?? 'all';
|
||||
|
||||
$data = $this->calendarService->getSchedules(
|
||||
$startDate,
|
||||
$endDate,
|
||||
$type,
|
||||
$departmentFilter
|
||||
);
|
||||
|
||||
return ApiResponse::handle(
|
||||
data: $data,
|
||||
message: __('message.fetched')
|
||||
);
|
||||
}
|
||||
}
|
||||
39
app/Http/Controllers/Api/V1/EntertainmentController.php
Normal file
39
app/Http/Controllers/Api/V1/EntertainmentController.php
Normal file
@@ -0,0 +1,39 @@
|
||||
<?php
|
||||
|
||||
namespace App\Http\Controllers\Api\V1;
|
||||
|
||||
use App\Helpers\ApiResponse;
|
||||
use App\Http\Controllers\Controller;
|
||||
use App\Services\EntertainmentService;
|
||||
use Illuminate\Http\JsonResponse;
|
||||
use Illuminate\Http\Request;
|
||||
|
||||
/**
|
||||
* 접대비 현황 컨트롤러
|
||||
*
|
||||
* CEO 대시보드용 접대비 현황 데이터를 제공합니다.
|
||||
*/
|
||||
class EntertainmentController extends Controller
|
||||
{
|
||||
public function __construct(
|
||||
private readonly EntertainmentService $entertainmentService
|
||||
) {}
|
||||
|
||||
/**
|
||||
* 접대비 현황 요약 조회
|
||||
*
|
||||
* @param Request $request
|
||||
* @return JsonResponse
|
||||
*/
|
||||
public function summary(Request $request): JsonResponse
|
||||
{
|
||||
$limitType = $request->query('limit_type', 'quarterly');
|
||||
$companyType = $request->query('company_type', 'medium');
|
||||
$year = $request->query('year') ? (int) $request->query('year') : null;
|
||||
$quarter = $request->query('quarter') ? (int) $request->query('quarter') : null;
|
||||
|
||||
$data = $this->entertainmentService->getSummary($limitType, $companyType, $year, $quarter);
|
||||
|
||||
return ApiResponse::handle($data, __('message.fetched'));
|
||||
}
|
||||
}
|
||||
30
app/Http/Controllers/Api/V1/StatusBoardController.php
Normal file
30
app/Http/Controllers/Api/V1/StatusBoardController.php
Normal file
@@ -0,0 +1,30 @@
|
||||
<?php
|
||||
|
||||
namespace App\Http\Controllers\Api\V1;
|
||||
|
||||
use App\Helpers\ApiResponse;
|
||||
use App\Http\Controllers\Controller;
|
||||
use App\Services\StatusBoardService;
|
||||
|
||||
/**
|
||||
* CEO 대시보드 현황판 컨트롤러
|
||||
*/
|
||||
class StatusBoardController extends Controller
|
||||
{
|
||||
public function __construct(
|
||||
private readonly StatusBoardService $statusBoardService
|
||||
) {}
|
||||
|
||||
/**
|
||||
* 현황판 요약 데이터 조회
|
||||
*/
|
||||
public function summary()
|
||||
{
|
||||
$data = $this->statusBoardService->summary();
|
||||
|
||||
return ApiResponse::handle(
|
||||
data: $data,
|
||||
message: __('message.fetched')
|
||||
);
|
||||
}
|
||||
}
|
||||
27
app/Http/Controllers/Api/V1/TodayIssueController.php
Normal file
27
app/Http/Controllers/Api/V1/TodayIssueController.php
Normal file
@@ -0,0 +1,27 @@
|
||||
<?php
|
||||
|
||||
namespace App\Http\Controllers\Api\V1;
|
||||
|
||||
use App\Http\Controllers\Controller;
|
||||
use App\Http\Responses\ApiResponse;
|
||||
use App\Services\TodayIssueService;
|
||||
use Illuminate\Http\JsonResponse;
|
||||
use Illuminate\Http\Request;
|
||||
|
||||
class TodayIssueController extends Controller
|
||||
{
|
||||
public function __construct(
|
||||
private readonly TodayIssueService $todayIssueService
|
||||
) {}
|
||||
|
||||
/**
|
||||
* 오늘의 이슈 리스트 조회
|
||||
*/
|
||||
public function summary(Request $request): JsonResponse
|
||||
{
|
||||
$limit = $request->input('limit', 30);
|
||||
$data = $this->todayIssueService->summary((int) $limit);
|
||||
|
||||
return ApiResponse::handle(['data' => $data], __('message.fetched'));
|
||||
}
|
||||
}
|
||||
38
app/Http/Controllers/Api/V1/VatController.php
Normal file
38
app/Http/Controllers/Api/V1/VatController.php
Normal file
@@ -0,0 +1,38 @@
|
||||
<?php
|
||||
|
||||
namespace App\Http\Controllers\Api\V1;
|
||||
|
||||
use App\Helpers\ApiResponse;
|
||||
use App\Http\Controllers\Controller;
|
||||
use App\Services\VatService;
|
||||
use Illuminate\Http\JsonResponse;
|
||||
use Illuminate\Http\Request;
|
||||
|
||||
/**
|
||||
* 부가세 현황 컨트롤러
|
||||
*
|
||||
* CEO 대시보드용 부가세 현황 데이터를 제공합니다.
|
||||
*/
|
||||
class VatController extends Controller
|
||||
{
|
||||
public function __construct(
|
||||
private readonly VatService $vatService
|
||||
) {}
|
||||
|
||||
/**
|
||||
* 부가세 현황 요약 조회
|
||||
*
|
||||
* @param Request $request
|
||||
* @return JsonResponse
|
||||
*/
|
||||
public function summary(Request $request): JsonResponse
|
||||
{
|
||||
$periodType = $request->query('period_type', 'quarter');
|
||||
$year = $request->query('year') ? (int) $request->query('year') : null;
|
||||
$period = $request->query('period') ? (int) $request->query('period') : null;
|
||||
|
||||
$data = $this->vatService->getSummary($periodType, $year, $period);
|
||||
|
||||
return ApiResponse::handle($data, __('message.fetched'));
|
||||
}
|
||||
}
|
||||
52
app/Http/Controllers/Api/V1/WelfareController.php
Normal file
52
app/Http/Controllers/Api/V1/WelfareController.php
Normal file
@@ -0,0 +1,52 @@
|
||||
<?php
|
||||
|
||||
namespace App\Http\Controllers\Api\V1;
|
||||
|
||||
use App\Helpers\ApiResponse;
|
||||
use App\Http\Controllers\Controller;
|
||||
use App\Services\WelfareService;
|
||||
use Illuminate\Http\JsonResponse;
|
||||
use Illuminate\Http\Request;
|
||||
|
||||
/**
|
||||
* 복리후생비 현황 컨트롤러
|
||||
*
|
||||
* CEO 대시보드용 복리후생비 현황 데이터를 제공합니다.
|
||||
*/
|
||||
class WelfareController extends Controller
|
||||
{
|
||||
public function __construct(
|
||||
private readonly WelfareService $welfareService
|
||||
) {}
|
||||
|
||||
/**
|
||||
* 복리후생비 현황 요약 조회
|
||||
*
|
||||
* @param Request $request
|
||||
* @return JsonResponse
|
||||
*/
|
||||
public function summary(Request $request): JsonResponse
|
||||
{
|
||||
$limitType = $request->query('limit_type', 'quarterly');
|
||||
$calculationType = $request->query('calculation_type', 'fixed');
|
||||
$fixedAmountPerMonth = $request->query('fixed_amount_per_month')
|
||||
? (int) $request->query('fixed_amount_per_month')
|
||||
: 200000;
|
||||
$ratio = $request->query('ratio')
|
||||
? (float) $request->query('ratio')
|
||||
: 0.05;
|
||||
$year = $request->query('year') ? (int) $request->query('year') : null;
|
||||
$quarter = $request->query('quarter') ? (int) $request->query('quarter') : null;
|
||||
|
||||
$data = $this->welfareService->getSummary(
|
||||
$limitType,
|
||||
$calculationType,
|
||||
$fixedAmountPerMonth,
|
||||
$ratio,
|
||||
$year,
|
||||
$quarter
|
||||
);
|
||||
|
||||
return ApiResponse::handle($data, __('message.fetched'));
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user