Files
sam-manage/app/Http/Controllers/Finance/CorporateVehicleController.php
2026-02-25 11:45:01 +09:00

182 lines
6.7 KiB
PHP

<?php
namespace App\Http\Controllers\Finance;
use App\Http\Controllers\Controller;
use App\Models\CorporateVehicle;
use App\Models\VehicleLog;
use Illuminate\Http\JsonResponse;
use Illuminate\Http\Request;
use Illuminate\Http\Response;
use Illuminate\Support\Facades\DB;
use Illuminate\View\View;
class CorporateVehicleController extends Controller
{
public function index(Request $request): View|Response
{
if ($request->header('HX-Request')) {
return response('', 200)->header('HX-Redirect', route('finance.corporate-vehicles'));
}
return view('finance.corporate-vehicles');
}
public function list(Request $request): JsonResponse
{
$tenantId = session('tenant_id', 1);
$query = CorporateVehicle::where('tenant_id', $tenantId);
// 필터링
if ($request->filled('ownership_type') && $request->ownership_type !== 'all') {
$query->where('ownership_type', $request->ownership_type);
}
if ($request->filled('vehicle_type') && $request->vehicle_type !== 'all') {
$query->where('vehicle_type', $request->vehicle_type);
}
if ($request->filled('status') && $request->status !== 'all') {
$query->where('status', $request->status);
}
if ($request->filled('search')) {
$search = $request->search;
$query->where(function ($q) use ($search) {
$q->where('plate_number', 'like', "%{$search}%")
->orWhere('model', 'like', "%{$search}%")
->orWhere('driver', 'like', "%{$search}%");
});
}
$vehicles = $query->orderBy('created_at', 'desc')->get();
// 각 차량의 운행기록 주행거리 합계 조회
$vehicleIds = $vehicles->pluck('id');
$logDistances = VehicleLog::whereIn('vehicle_id', $vehicleIds)
->select('vehicle_id', DB::raw('SUM(distance_km) as total_log_distance'))
->groupBy('vehicle_id')
->pluck('total_log_distance', 'vehicle_id');
// total_mileage = 초기 주행거리 + 운행기록 합계
$vehicles->each(function ($vehicle) use ($logDistances) {
$vehicle->log_distance = (int) ($logDistances[$vehicle->id] ?? 0);
$vehicle->total_mileage = ($vehicle->mileage ?? 0) + $vehicle->log_distance;
});
return response()->json([
'success' => true,
'data' => $vehicles,
]);
}
public function store(Request $request): JsonResponse
{
$request->validate([
'plate_number' => 'required|string|max:20',
'model' => 'required|string|max:100',
'vehicle_type' => 'required|string|max:20',
'ownership_type' => 'required|in:corporate,rent,lease',
]);
$tenantId = session('tenant_id', 1);
$vehicle = CorporateVehicle::create([
'tenant_id' => $tenantId,
'plate_number' => $request->plate_number,
'model' => $request->model,
'vehicle_type' => $request->vehicle_type,
'ownership_type' => $request->ownership_type,
'year' => $request->year,
'driver' => $request->driver,
'status' => $request->status ?? 'active',
'mileage' => $request->mileage ?? 0,
'memo' => $request->memo,
// 법인차량 전용
'purchase_date' => $request->purchase_date,
'purchase_price' => $request->purchase_price ?? 0,
// 렌트/리스 전용
'contract_date' => $request->contract_date,
'rent_company' => $request->rent_company,
'rent_company_tel' => $request->rent_company_tel,
'rent_period' => $request->rent_period,
'agreed_mileage' => $request->agreed_mileage,
'vehicle_price' => $request->vehicle_price ?? 0,
'residual_value' => $request->residual_value ?? 0,
'deposit' => $request->deposit ?? 0,
'monthly_rent' => $request->monthly_rent ?? 0,
'monthly_rent_tax' => $request->monthly_rent_tax ?? 0,
'insurance_company' => $request->insurance_company,
'insurance_company_tel' => $request->insurance_company_tel,
]);
return response()->json([
'success' => true,
'message' => '차량이 등록되었습니다.',
'data' => $vehicle,
]);
}
public function update(Request $request, int $id): JsonResponse
{
$tenantId = session('tenant_id', 1);
$vehicle = CorporateVehicle::where('tenant_id', $tenantId)->findOrFail($id);
$request->validate([
'plate_number' => 'required|string|max:20',
'model' => 'required|string|max:100',
'vehicle_type' => 'required|string|max:20',
'ownership_type' => 'required|in:corporate,rent,lease',
]);
$vehicle->update([
'plate_number' => $request->plate_number,
'model' => $request->model,
'vehicle_type' => $request->vehicle_type,
'ownership_type' => $request->ownership_type,
'year' => $request->year,
'driver' => $request->driver,
'status' => $request->status ?? 'active',
'mileage' => $request->mileage ?? 0,
'memo' => $request->memo,
// 법인차량 전용
'purchase_date' => $request->purchase_date,
'purchase_price' => $request->purchase_price ?? 0,
// 렌트/리스 전용
'contract_date' => $request->contract_date,
'rent_company' => $request->rent_company,
'rent_company_tel' => $request->rent_company_tel,
'rent_period' => $request->rent_period,
'agreed_mileage' => $request->agreed_mileage,
'vehicle_price' => $request->vehicle_price ?? 0,
'residual_value' => $request->residual_value ?? 0,
'deposit' => $request->deposit ?? 0,
'monthly_rent' => $request->monthly_rent ?? 0,
'monthly_rent_tax' => $request->monthly_rent_tax ?? 0,
'insurance_company' => $request->insurance_company,
'insurance_company_tel' => $request->insurance_company_tel,
]);
return response()->json([
'success' => true,
'message' => '차량 정보가 수정되었습니다.',
'data' => $vehicle,
]);
}
public function destroy(int $id): JsonResponse
{
$tenantId = session('tenant_id', 1);
$vehicle = CorporateVehicle::where('tenant_id', $tenantId)->findOrFail($id);
$vehicle->delete();
return response()->json([
'success' => true,
'message' => '차량이 삭제되었습니다.',
]);
}
}