99 lines
3.4 KiB
PHP
99 lines
3.4 KiB
PHP
<?php
|
|
|
|
namespace Modules\Portal\Http\Controllers\Customer;
|
|
|
|
use Illuminate\Http\Request;
|
|
use Illuminate\Support\Facades\Schema;
|
|
use Modules\Maintenance\Models\FailureReport;
|
|
use Modules\Maintenance\Models\WorkOrder;
|
|
use Modules\Portal\Http\Controllers\BasePortalController;
|
|
use Modules\Portal\Services\CustomerMaintenanceScopeService;
|
|
|
|
class ServiceRequestController extends BasePortalController
|
|
{
|
|
public function index()
|
|
{
|
|
$this->ensureCrmSubscription();
|
|
$scope = CustomerMaintenanceScopeService::forCurrentUser();
|
|
|
|
if (! $scope->failureReportsAvailable()) {
|
|
return view('portal::customer.service_requests.index', ['requests' => collect()]);
|
|
}
|
|
|
|
$requests = FailureReport::where('business_id', $this->businessId())
|
|
->whereIn('equipment_id', $scope->equipmentIds())
|
|
->with(['equipment:id,name,code'])
|
|
->orderByDesc('reported_at')
|
|
->paginate(20);
|
|
|
|
return view('portal::customer.service_requests.index', compact('requests'));
|
|
}
|
|
|
|
public function create()
|
|
{
|
|
$this->ensureCrmSubscription();
|
|
$scope = CustomerMaintenanceScopeService::forCurrentUser();
|
|
|
|
$equipment = $scope->equipmentQuery()
|
|
->select('id', 'name', 'code', 'project_id', 'production_line_id')
|
|
->with(['project:id,name', 'productionLine:id,name'])
|
|
->orderBy('name')
|
|
->get();
|
|
|
|
$selectedEquipmentId = request()->get('equipment_id');
|
|
|
|
return view('portal::customer.service_requests.create', compact('equipment', 'selectedEquipmentId'));
|
|
}
|
|
|
|
public function store(Request $request)
|
|
{
|
|
$this->ensureCrmSubscription();
|
|
$scope = CustomerMaintenanceScopeService::forCurrentUser();
|
|
|
|
if (! $scope->failureReportsAvailable()) {
|
|
abort(404);
|
|
}
|
|
|
|
$data = $request->validate([
|
|
'equipment_id' => 'required|integer',
|
|
'failure_type' => 'nullable|string|max:255',
|
|
'root_cause' => 'required|string|max:2000',
|
|
]);
|
|
|
|
if (! $scope->ownsEquipment((int) $data['equipment_id'])) {
|
|
abort(403);
|
|
}
|
|
|
|
$equipment = $scope->equipmentQuery()->findOrFail($data['equipment_id']);
|
|
|
|
$report = FailureReport::create([
|
|
'business_id' => $this->businessId(),
|
|
'equipment_id' => $equipment->id,
|
|
'project_id' => $equipment->project_id,
|
|
'production_line_id' => $equipment->production_line_id,
|
|
'failure_type' => $data['failure_type'] ?? __('portal::lang.service_request'),
|
|
'root_cause' => $data['root_cause'],
|
|
'reported_by' => auth()->id(),
|
|
'reported_at' => now(),
|
|
]);
|
|
|
|
if ($scope->workOrdersAvailable()) {
|
|
WorkOrder::create([
|
|
'business_id' => $this->businessId(),
|
|
'equipment_id' => $equipment->id,
|
|
'project_id' => $equipment->project_id,
|
|
'production_line_id' => $equipment->production_line_id,
|
|
'work_order_number' => 'SR-'.now()->format('ymd').'-'.$report->id,
|
|
'requester_id' => auth()->id(),
|
|
'priority' => 'medium',
|
|
'description' => $data['root_cause'],
|
|
'status' => 'open',
|
|
]);
|
|
}
|
|
|
|
return redirect()
|
|
->action([self::class, 'index'])
|
|
->with('status', ['success' => 1, 'msg' => __('portal::lang.service_request_submitted')]);
|
|
}
|
|
}
|