From cf37e29659560bcc997e443275fd3a5ba3298fa7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EA=B9=80=EB=B3=B4=EA=B3=A4?= Date: Tue, 3 Feb 2026 12:33:14 +0900 Subject: [PATCH] =?UTF-8?q?fix:=EC=B0=A8=EB=9F=89=EC=9D=BC=EC=A7=80=20?= =?UTF-8?q?=EA=B8=B0=EA=B0=84=20=EC=84=A0=ED=83=9D=20UI=20=EA=B0=9C?= =?UTF-8?q?=EC=84=A0=20(=EC=8B=9C=EC=9E=91=EC=9D=BC~=EC=A2=85=EB=A3=8C?= =?UTF-8?q?=EC=9D=BC,=20=EC=9D=B4=EB=B2=88=EB=8B=AC/=EC=A7=80=EB=82=9C?= =?UTF-8?q?=EB=8B=AC=20=EB=B2=84=ED=8A=BC,=20=EC=A1=B0=ED=9A=8C=EA=B1=B4?= =?UTF-8?q?=EC=88=98)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Finance/VehicleLogController.php | 31 +++--- .../views/finance/vehicle-logs.blade.php | 99 ++++++++++++------- 2 files changed, 80 insertions(+), 50 deletions(-) diff --git a/app/Http/Controllers/Finance/VehicleLogController.php b/app/Http/Controllers/Finance/VehicleLogController.php index 8b240193..0963376f 100644 --- a/app/Http/Controllers/Finance/VehicleLogController.php +++ b/app/Http/Controllers/Finance/VehicleLogController.php @@ -40,21 +40,22 @@ public function list(Request $request): JsonResponse $request->validate([ 'vehicle_id' => 'required|integer', - 'year' => 'required|integer', - 'month' => 'required|integer|min:1|max:12', + 'start_date' => 'required|date', + 'end_date' => 'required|date|after_or_equal:start_date', ]); $vehicleId = $request->vehicle_id; - $year = $request->year; - $month = $request->month; + $startDate = $request->start_date; + $endDate = $request->end_date; // 차량 정보 $vehicle = CorporateVehicle::where('tenant_id', $tenantId) ->findOrFail($vehicleId); - // 해당 월의 운행 기록 - $startDate = sprintf('%04d-%02d-01', $year, $month); - $endDate = date('Y-m-t', strtotime($startDate)); + // 전체 운행기록 수 (해당 차량) + $totalCount = VehicleLog::where('tenant_id', $tenantId) + ->where('vehicle_id', $vehicleId) + ->count(); $logs = VehicleLog::where('tenant_id', $tenantId) ->where('vehicle_id', $vehicleId) @@ -76,6 +77,7 @@ public function list(Request $request): JsonResponse 'vehicle' => $vehicle, 'logs' => $logs, 'totals' => $totals, + 'totalCount' => $totalCount, ], ]); } @@ -174,20 +176,17 @@ public function export(Request $request): StreamedResponse $request->validate([ 'vehicle_id' => 'required|integer', - 'year' => 'required|integer', - 'month' => 'required|integer|min:1|max:12', + 'start_date' => 'required|date', + 'end_date' => 'required|date|after_or_equal:start_date', ]); $vehicleId = $request->vehicle_id; - $year = $request->year; - $month = $request->month; + $startDate = $request->start_date; + $endDate = $request->end_date; $vehicle = CorporateVehicle::where('tenant_id', $tenantId) ->findOrFail($vehicleId); - $startDate = sprintf('%04d-%02d-01', $year, $month); - $endDate = date('Y-m-t', strtotime($startDate)); - $logs = VehicleLog::where('tenant_id', $tenantId) ->where('vehicle_id', $vehicleId) ->whereBetween('log_date', [$startDate, $endDate]) @@ -208,7 +207,7 @@ public function export(Request $request): StreamedResponse $sheet->setCellValue('E3', '구분'); $sheet->setCellValue('F3', $this->getOwnershipTypeLabel($vehicle->ownership_type)); $sheet->setCellValue('A4', '조회기간'); - $sheet->setCellValue('B4', sprintf('%d년 %d월', $year, $month)); + $sheet->setCellValue('B4', sprintf('%s ~ %s', $startDate, $endDate)); // 헤더 $headers = ['일자', '부서', '성명', '구분', '출발지', '도착지', '주행km', '비고']; @@ -244,7 +243,7 @@ public function export(Request $request): StreamedResponse $sheet->setCellValue('G' . $row, number_format($totalKm)); $sheet->setCellValue('H' . $row, '비업무: ' . number_format($personalKm) . 'km'); - $filename = sprintf('운행기록부_%s_%d년%d월.xlsx', $vehicle->plate_number, $year, $month); + $filename = sprintf('운행기록부_%s_%s_%s.xlsx', $vehicle->plate_number, $startDate, $endDate); return response()->streamDownload(function () use ($spreadsheet) { $writer = new Xlsx($spreadsheet); diff --git a/resources/views/finance/vehicle-logs.blade.php b/resources/views/finance/vehicle-logs.blade.php index 4e06be87..5126a521 100644 --- a/resources/views/finance/vehicle-logs.blade.php +++ b/resources/views/finance/vehicle-logs.blade.php @@ -58,14 +58,29 @@ function VehicleLogsManagement() { const { vehicles, tripTypes, locationTypes } = window.INITIAL_DATA; + // 이번 달 시작일/종료일 계산 + const getMonthRange = (date) => { + const year = date.getFullYear(); + const month = date.getMonth(); + const firstDay = new Date(year, month, 1); + const lastDay = new Date(year, month + 1, 0); + return { + start: firstDay.toISOString().split('T')[0], + end: lastDay.toISOString().split('T')[0] + }; + }; + const currentDate = new Date(); + const thisMonthRange = getMonthRange(currentDate); + const [selectedVehicle, setSelectedVehicle] = useState(vehicles[0]?.id || null); - const [selectedYear, setSelectedYear] = useState(currentDate.getFullYear()); - const [selectedMonth, setSelectedMonth] = useState(currentDate.getMonth() + 1); + const [startDate, setStartDate] = useState(thisMonthRange.start); + const [endDate, setEndDate] = useState(thisMonthRange.end); const [vehicleInfo, setVehicleInfo] = useState(null); const [logs, setLogs] = useState([]); const [totals, setTotals] = useState({ business_km: 0, personal_km: 0, total_km: 0 }); + const [totalCount, setTotalCount] = useState(0); const [loading, setLoading] = useState(false); const [saving, setSaving] = useState(false); @@ -103,8 +118,8 @@ function VehicleLogsManagement() { setLoading(true); const params = new URLSearchParams({ vehicle_id: selectedVehicle, - year: selectedYear, - month: selectedMonth + start_date: startDate, + end_date: endDate }); const response = await fetch(`/finance/vehicle-logs/list?${params}`); const result = await response.json(); @@ -112,6 +127,7 @@ function VehicleLogsManagement() { setVehicleInfo(result.data.vehicle); setLogs(result.data.logs); setTotals(result.data.totals); + setTotalCount(result.data.totalCount || 0); } } catch (error) { console.error('Failed to load logs:', error); @@ -122,36 +138,31 @@ function VehicleLogsManagement() { useEffect(() => { loadLogs(); - }, [selectedVehicle, selectedYear, selectedMonth]); + }, [selectedVehicle, startDate, endDate]); - const handlePrevMonth = () => { - if (selectedMonth === 1) { - setSelectedMonth(12); - setSelectedYear(prev => prev - 1); - } else { - setSelectedMonth(prev => prev - 1); - } + const handleThisMonth = () => { + const range = getMonthRange(new Date()); + setStartDate(range.start); + setEndDate(range.end); }; - const handleNextMonth = () => { - if (selectedMonth === 12) { - setSelectedMonth(1); - setSelectedYear(prev => prev + 1); - } else { - setSelectedMonth(prev => prev + 1); - } + const handleLastMonth = () => { + const lastMonth = new Date(); + lastMonth.setMonth(lastMonth.getMonth() - 1); + const range = getMonthRange(lastMonth); + setStartDate(range.start); + setEndDate(range.end); }; const handleAdd = () => { - const today = new Date(); - const dateStr = `${selectedYear}-${String(selectedMonth).padStart(2, '0')}-${String(today.getDate()).padStart(2, '0')}`; + const today = new Date().toISOString().split('T')[0]; setModalMode('add'); setEditingItem(null); setFormData({ ...initialFormState, vehicle_id: selectedVehicle, - log_date: dateStr, + log_date: today, driver_name: vehicleInfo?.driver || '' }); setShowModal(true); @@ -248,8 +259,8 @@ function VehicleLogsManagement() { const handleExport = () => { const params = new URLSearchParams({ vehicle_id: selectedVehicle, - year: selectedYear, - month: selectedMonth + start_date: startDate, + end_date: endDate }); window.location.href = `/finance/vehicle-logs/export?${params}`; }; @@ -290,8 +301,7 @@ function VehicleLogsManagement() {
{/* 차량 선택 */} -
- +
setStartDate(e.target.value)} + className="px-3 py-2 border border-gray-300 rounded-lg text-sm" + /> + ~ + setEndDate(e.target.value)} + className="px-3 py-2 border border-gray-300 rounded-lg text-sm" + /> + -
- - {selectedYear}년 {selectedMonth}월 -
-
+ + {/* 조회 건수 */} +
+ 조회: {logs.length}건 / 전체 {totalCount}건 +