330 lines
13 KiB
PHP
330 lines
13 KiB
PHP
<?php
|
|
|
|
namespace App\Http\Controllers\Reports;
|
|
|
|
use App\Http\Controllers\Controller;
|
|
use Illuminate\Http\Request;
|
|
use App\Models\Menu;
|
|
use App\Models\Role;
|
|
use App\Services\TechnicianReportService;
|
|
use App\Exports\TechnicianReportExport;
|
|
use Illuminate\Support\Facades\Gate;
|
|
use Illuminate\Support\Facades\Log;
|
|
use Maatwebsite\Excel\Facades\Excel;
|
|
use Illuminate\Support\Facades\DB; // Added DB facade
|
|
use App\Models\Dealer; // Added Dealer model
|
|
|
|
class ReportTechniciansController extends Controller
|
|
{
|
|
protected $technicianReportService;
|
|
|
|
public function __construct(TechnicianReportService $technicianReportService)
|
|
{
|
|
$this->technicianReportService = $technicianReportService;
|
|
}
|
|
|
|
public function index(Request $request)
|
|
{
|
|
$menu = Menu::where('link','reports.technician.index')->first();
|
|
abort_if(!Gate::allows('view', $menu), 403);
|
|
|
|
return view('reports.technician');
|
|
}
|
|
|
|
/**
|
|
* Get dealers for filter dropdown
|
|
*/
|
|
public function getDealers()
|
|
{
|
|
try {
|
|
// Get current authenticated user
|
|
$user = auth()->user();
|
|
|
|
if (!$user) {
|
|
Log::info('Controller: No authenticated user found');
|
|
return response()->json([
|
|
'status' => 'error',
|
|
'message' => 'User tidak terautentikasi'
|
|
], 401);
|
|
}
|
|
|
|
Log::info('Controller: Getting dealers for user:', [
|
|
'user_id' => $user->id,
|
|
'user_name' => $user->name,
|
|
'user_role_id' => $user->role_id,
|
|
'user_dealer_id' => $user->dealer_id
|
|
]);
|
|
|
|
$dealers = $this->technicianReportService->getDealers();
|
|
$defaultDealer = $this->technicianReportService->getDefaultDealer();
|
|
|
|
Log::info('Controller: Service returned dealers:', [
|
|
'dealers_count' => $dealers->count(),
|
|
'dealers' => $dealers->toArray(),
|
|
'default_dealer' => $defaultDealer ? $defaultDealer->toArray() : null,
|
|
'default_dealer_id' => $defaultDealer ? $defaultDealer->id : null
|
|
]);
|
|
|
|
// Check if default dealer exists in dealers list
|
|
if ($defaultDealer && $dealers->count() > 0) {
|
|
$defaultDealerExists = $dealers->contains('id', $defaultDealer->id);
|
|
Log::info('Controller: Default dealer validation:', [
|
|
'default_dealer_id' => $defaultDealer->id,
|
|
'default_dealer_exists_in_list' => $defaultDealerExists,
|
|
'available_dealer_ids' => $dealers->pluck('id')->toArray()
|
|
]);
|
|
|
|
// If default dealer doesn't exist in list, use first dealer from list
|
|
if (!$defaultDealerExists) {
|
|
Log::info('Controller: Default dealer not in list, using first dealer from list');
|
|
$defaultDealer = $dealers->first();
|
|
Log::info('Controller: New default dealer:', $defaultDealer ? $defaultDealer->toArray() : null);
|
|
}
|
|
} else if ($defaultDealer === null && $dealers->count() > 0) {
|
|
// Admin without default dealer - no need to set default
|
|
Log::info('Controller: Admin without default dealer, no default will be set');
|
|
}
|
|
|
|
return response()->json([
|
|
'status' => 'success',
|
|
'data' => $dealers,
|
|
'default_dealer' => $defaultDealer ? $defaultDealer->id : null
|
|
]);
|
|
} catch (\Exception $e) {
|
|
Log::error('Controller: Error getting dealers: ' . $e->getMessage(), [
|
|
'trace' => $e->getTraceAsString()
|
|
]);
|
|
return response()->json([
|
|
'status' => 'error',
|
|
'message' => 'Gagal mengambil data dealer: ' . $e->getMessage()
|
|
], 500);
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Get technician report data for DataTable
|
|
*/
|
|
public function getData(Request $request)
|
|
{
|
|
try {
|
|
$dealerId = $request->input('dealer_id');
|
|
$startDate = $request->input('start_date');
|
|
$endDate = $request->input('end_date');
|
|
|
|
// Get current authenticated user
|
|
$user = auth()->user();
|
|
|
|
if (!$user) {
|
|
return response()->json([
|
|
'status' => 'error',
|
|
'message' => 'User tidak terautentikasi'
|
|
], 401);
|
|
}
|
|
|
|
Log::info('Requesting technician report data:', [
|
|
'dealer_id' => $dealerId,
|
|
'start_date' => $startDate,
|
|
'end_date' => $endDate,
|
|
'user_id' => $user->id,
|
|
'user_role_id' => $user->role_id,
|
|
'user_dealer_id' => $user->dealer_id
|
|
]);
|
|
|
|
$reportData = $this->technicianReportService->getTechnicianReportData(
|
|
$dealerId,
|
|
$startDate,
|
|
$endDate
|
|
);
|
|
|
|
Log::info('Technician report data response:', [
|
|
'data_count' => count($reportData['data']),
|
|
'mechanics_count' => $reportData['mechanics']->count(),
|
|
'works_count' => $reportData['works']->count(),
|
|
'mechanics' => $reportData['mechanics']->map(function($mechanic) {
|
|
return [
|
|
'id' => $mechanic->id,
|
|
'name' => $mechanic->name,
|
|
'role_id' => $mechanic->role_id
|
|
];
|
|
})
|
|
]);
|
|
|
|
return response()->json([
|
|
'status' => 'success',
|
|
'data' => $reportData['data'],
|
|
'mechanics' => $reportData['mechanics'],
|
|
'works' => $reportData['works']
|
|
]);
|
|
} catch (\Exception $e) {
|
|
Log::error('Error getting technician report data: ' . $e->getMessage(), [
|
|
'dealer_id' => $request->input('dealer_id'),
|
|
'start_date' => $request->input('start_date'),
|
|
'end_date' => $request->input('end_date'),
|
|
'trace' => $e->getTraceAsString()
|
|
]);
|
|
|
|
return response()->json([
|
|
'status' => 'error',
|
|
'message' => 'Gagal mengambil data laporan teknisi: ' . $e->getMessage()
|
|
], 500);
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Get technician report data for Yajra DataTable
|
|
*/
|
|
public function getDataTable(Request $request)
|
|
{
|
|
try {
|
|
$dealerId = $request->input('dealer_id');
|
|
$startDate = $request->input('start_date');
|
|
$endDate = $request->input('end_date');
|
|
|
|
// Get current authenticated user
|
|
$user = auth()->user();
|
|
|
|
if (!$user) {
|
|
return response()->json([
|
|
'error' => 'User tidak terautentikasi'
|
|
], 401);
|
|
}
|
|
|
|
Log::info('Requesting technician report data for DataTable:', [
|
|
'dealer_id' => $dealerId,
|
|
'start_date' => $startDate,
|
|
'end_date' => $endDate,
|
|
'user_id' => $user->id,
|
|
'user_role_id' => $user->role_id,
|
|
'user_dealer_id' => $user->dealer_id
|
|
]);
|
|
|
|
$reportData = $this->technicianReportService->getTechnicianReportDataForDataTable(
|
|
$dealerId,
|
|
$startDate,
|
|
$endDate
|
|
);
|
|
|
|
return $reportData;
|
|
} catch (\Exception $e) {
|
|
Log::error('Error getting technician report data for DataTable: ' . $e->getMessage(), [
|
|
'dealer_id' => $request->input('dealer_id'),
|
|
'start_date' => $request->input('start_date'),
|
|
'end_date' => $request->input('end_date'),
|
|
'trace' => $e->getTraceAsString()
|
|
]);
|
|
|
|
return response()->json([
|
|
'error' => 'Gagal mengambil data laporan teknisi: ' . $e->getMessage()
|
|
], 500);
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Export technician report to Excel
|
|
*/
|
|
public function export(Request $request)
|
|
{
|
|
try {
|
|
$dealerId = $request->input('dealer_id');
|
|
$startDate = $request->input('start_date');
|
|
$endDate = $request->input('end_date');
|
|
|
|
// Get current authenticated user
|
|
$user = auth()->user();
|
|
|
|
if (!$user) {
|
|
return response()->json([
|
|
'status' => 'error',
|
|
'message' => 'User tidak terautentikasi'
|
|
], 401);
|
|
}
|
|
|
|
Log::info('Exporting technician report', [
|
|
'dealer_id' => $dealerId,
|
|
'start_date' => $startDate,
|
|
'end_date' => $endDate,
|
|
'user_id' => $user->id,
|
|
'user_role_id' => $user->role_id,
|
|
'user_dealer_id' => $user->dealer_id
|
|
]);
|
|
|
|
// Validate dealer access for export
|
|
if ($dealerId) {
|
|
// User is trying to export specific dealer
|
|
if ($user->dealer_id) {
|
|
// User has specific dealer_id, check if they can access the requested dealer
|
|
if ($user->dealer_id != $dealerId) {
|
|
if ($user->role_id) {
|
|
$role = \App\Models\Role::with('dealers')->find($user->role_id);
|
|
if (!$role || !$role->hasDealer($dealerId)) {
|
|
return response()->json([
|
|
'status' => 'error',
|
|
'message' => 'Anda tidak memiliki akses untuk export data dealer ini'
|
|
], 403);
|
|
}
|
|
} else {
|
|
return response()->json([
|
|
'status' => 'error',
|
|
'message' => 'Anda tidak memiliki akses untuk export data dealer ini'
|
|
], 403);
|
|
}
|
|
}
|
|
} else if ($user->role_id) {
|
|
// User has role, check if they can access the requested dealer
|
|
$role = \App\Models\Role::with('dealers')->find($user->role_id);
|
|
if (!$role || !$role->hasDealer($dealerId)) {
|
|
return response()->json([
|
|
'status' => 'error',
|
|
'message' => 'Anda tidak memiliki akses untuk export data dealer ini'
|
|
], 403);
|
|
}
|
|
}
|
|
} else {
|
|
// User is trying to export "Semua Dealer" - check if they have permission
|
|
if ($user->role_id) {
|
|
$role = \App\Models\Role::with('dealers')->find($user->role_id);
|
|
if ($role) {
|
|
// Check if role is admin type
|
|
$technicianReportService = new \App\Services\TechnicianReportService();
|
|
if ($technicianReportService->isAdminRole($role)) {
|
|
// Admin can export all dealers
|
|
Log::info('Admin user exporting all dealers');
|
|
} else {
|
|
// Non-admin with pivot dealers - can only export pivot dealers
|
|
if ($role->dealers->count() > 0) {
|
|
Log::info('User with pivot dealers exporting pivot dealers only');
|
|
} else {
|
|
return response()->json([
|
|
'status' => 'error',
|
|
'message' => 'Anda tidak memiliki akses untuk export data semua dealer'
|
|
], 403);
|
|
}
|
|
}
|
|
}
|
|
} else if ($user->dealer_id) {
|
|
// User with specific dealer_id cannot export all dealers
|
|
return response()->json([
|
|
'status' => 'error',
|
|
'message' => 'Anda hanya dapat export data dealer Anda sendiri'
|
|
], 403);
|
|
}
|
|
}
|
|
|
|
return Excel::download(new TechnicianReportExport($dealerId, $startDate, $endDate), 'laporan_teknisi_' . date('Y-m-d') . '.xlsx');
|
|
|
|
} catch (\Exception $e) {
|
|
Log::error('Error exporting technician report: ' . $e->getMessage(), [
|
|
'dealer_id' => $request->input('dealer_id'),
|
|
'start_date' => $request->input('start_date'),
|
|
'end_date' => $request->input('end_date')
|
|
]);
|
|
|
|
return response()->json([
|
|
'status' => 'error',
|
|
'message' => 'Gagal export laporan: ' . $e->getMessage()
|
|
], 500);
|
|
}
|
|
}
|
|
|
|
}
|