155 lines
5.1 KiB
PHP
155 lines
5.1 KiB
PHP
|
|
<?php
|
||
|
|
|
||
|
|
namespace App\Http\Controllers\System;
|
||
|
|
|
||
|
|
use App\Http\Controllers\Controller;
|
||
|
|
use App\Models\System\Holiday;
|
||
|
|
use Illuminate\Http\JsonResponse;
|
||
|
|
use Illuminate\Http\Request;
|
||
|
|
use Illuminate\Http\Response;
|
||
|
|
use Illuminate\View\View;
|
||
|
|
|
||
|
|
class HolidayController extends Controller
|
||
|
|
{
|
||
|
|
public function index(Request $request): View|Response
|
||
|
|
{
|
||
|
|
if ($request->header('HX-Request')) {
|
||
|
|
return response('', 200)->header('HX-Redirect', route('system.holidays.index'));
|
||
|
|
}
|
||
|
|
|
||
|
|
return view('system.holidays.index');
|
||
|
|
}
|
||
|
|
|
||
|
|
public function list(Request $request): JsonResponse
|
||
|
|
{
|
||
|
|
$tenantId = session('selected_tenant_id', 1);
|
||
|
|
$year = $request->input('year', now()->year);
|
||
|
|
|
||
|
|
$holidays = Holiday::forTenant($tenantId)
|
||
|
|
->forYear($year)
|
||
|
|
->orderBy('start_date')
|
||
|
|
->get()
|
||
|
|
->map(function ($h) {
|
||
|
|
return [
|
||
|
|
'id' => $h->id,
|
||
|
|
'startDate' => $h->start_date->format('Y-m-d'),
|
||
|
|
'endDate' => $h->end_date->format('Y-m-d'),
|
||
|
|
'name' => $h->name,
|
||
|
|
'type' => $h->type,
|
||
|
|
'isRecurring' => $h->is_recurring,
|
||
|
|
'memo' => $h->memo,
|
||
|
|
'days' => $h->start_date->diffInDays($h->end_date) + 1,
|
||
|
|
];
|
||
|
|
});
|
||
|
|
|
||
|
|
return response()->json([
|
||
|
|
'success' => true,
|
||
|
|
'data' => $holidays,
|
||
|
|
]);
|
||
|
|
}
|
||
|
|
|
||
|
|
public function store(Request $request): JsonResponse
|
||
|
|
{
|
||
|
|
$request->validate([
|
||
|
|
'name' => 'required|string|max:100',
|
||
|
|
'startDate' => 'required|date',
|
||
|
|
'endDate' => 'required|date|after_or_equal:startDate',
|
||
|
|
'type' => 'required|in:public,company,alternative,temporary',
|
||
|
|
'isRecurring' => 'boolean',
|
||
|
|
'memo' => 'nullable|string|max:500',
|
||
|
|
]);
|
||
|
|
|
||
|
|
$tenantId = session('selected_tenant_id', 1);
|
||
|
|
|
||
|
|
$holiday = Holiday::create([
|
||
|
|
'tenant_id' => $tenantId,
|
||
|
|
'start_date' => $request->input('startDate'),
|
||
|
|
'end_date' => $request->input('endDate'),
|
||
|
|
'name' => $request->input('name'),
|
||
|
|
'type' => $request->input('type', 'public'),
|
||
|
|
'is_recurring' => $request->input('isRecurring', false),
|
||
|
|
'memo' => $request->input('memo'),
|
||
|
|
]);
|
||
|
|
|
||
|
|
return response()->json([
|
||
|
|
'success' => true,
|
||
|
|
'message' => '휴일이 등록되었습니다.',
|
||
|
|
'data' => ['id' => $holiday->id],
|
||
|
|
]);
|
||
|
|
}
|
||
|
|
|
||
|
|
public function update(Request $request, int $id): JsonResponse
|
||
|
|
{
|
||
|
|
$tenantId = session('selected_tenant_id', 1);
|
||
|
|
$holiday = Holiday::forTenant($tenantId)->findOrFail($id);
|
||
|
|
|
||
|
|
$request->validate([
|
||
|
|
'name' => 'required|string|max:100',
|
||
|
|
'startDate' => 'required|date',
|
||
|
|
'endDate' => 'required|date|after_or_equal:startDate',
|
||
|
|
'type' => 'required|in:public,company,alternative,temporary',
|
||
|
|
'isRecurring' => 'boolean',
|
||
|
|
'memo' => 'nullable|string|max:500',
|
||
|
|
]);
|
||
|
|
|
||
|
|
$holiday->update([
|
||
|
|
'start_date' => $request->input('startDate'),
|
||
|
|
'end_date' => $request->input('endDate'),
|
||
|
|
'name' => $request->input('name'),
|
||
|
|
'type' => $request->input('type'),
|
||
|
|
'is_recurring' => $request->input('isRecurring', false),
|
||
|
|
'memo' => $request->input('memo'),
|
||
|
|
]);
|
||
|
|
|
||
|
|
return response()->json([
|
||
|
|
'success' => true,
|
||
|
|
'message' => '휴일이 수정되었습니다.',
|
||
|
|
]);
|
||
|
|
}
|
||
|
|
|
||
|
|
public function destroy(int $id): JsonResponse
|
||
|
|
{
|
||
|
|
$tenantId = session('selected_tenant_id', 1);
|
||
|
|
$holiday = Holiday::forTenant($tenantId)->findOrFail($id);
|
||
|
|
$holiday->delete();
|
||
|
|
|
||
|
|
return response()->json([
|
||
|
|
'success' => true,
|
||
|
|
'message' => '휴일이 삭제되었습니다.',
|
||
|
|
]);
|
||
|
|
}
|
||
|
|
|
||
|
|
public function bulkStore(Request $request): JsonResponse
|
||
|
|
{
|
||
|
|
$request->validate([
|
||
|
|
'holidays' => 'required|array|min:1',
|
||
|
|
'holidays.*.name' => 'required|string|max:100',
|
||
|
|
'holidays.*.startDate' => 'required|date',
|
||
|
|
'holidays.*.endDate' => 'required|date|after_or_equal:holidays.*.startDate',
|
||
|
|
'holidays.*.type' => 'required|in:public,company,alternative,temporary',
|
||
|
|
'holidays.*.isRecurring' => 'boolean',
|
||
|
|
]);
|
||
|
|
|
||
|
|
$tenantId = session('selected_tenant_id', 1);
|
||
|
|
$count = 0;
|
||
|
|
|
||
|
|
foreach ($request->input('holidays') as $item) {
|
||
|
|
Holiday::create([
|
||
|
|
'tenant_id' => $tenantId,
|
||
|
|
'start_date' => $item['startDate'],
|
||
|
|
'end_date' => $item['endDate'],
|
||
|
|
'name' => $item['name'],
|
||
|
|
'type' => $item['type'] ?? 'public',
|
||
|
|
'is_recurring' => $item['isRecurring'] ?? false,
|
||
|
|
'memo' => $item['memo'] ?? null,
|
||
|
|
]);
|
||
|
|
$count++;
|
||
|
|
}
|
||
|
|
|
||
|
|
return response()->json([
|
||
|
|
'success' => true,
|
||
|
|
'message' => "{$count}건의 휴일이 등록되었습니다.",
|
||
|
|
]);
|
||
|
|
}
|
||
|
|
}
|