81 lines
2.9 KiB
PHP
81 lines
2.9 KiB
PHP
<?php
|
|
|
|
namespace Modules\ShopFloor\Http\Controllers;
|
|
|
|
use App\Http\Controllers\Controller;
|
|
use Illuminate\Http\Request;
|
|
use Modules\ShopFloor\Models\DowntimeEvent;
|
|
use Modules\ShopFloor\Models\WorkCenter;
|
|
|
|
class DowntimeController extends Controller
|
|
{
|
|
public function index(Request $request)
|
|
{
|
|
if (! auth()->user()->can('shopfloor.view')) {
|
|
abort(403);
|
|
}
|
|
|
|
$business_id = $request->session()->get('user.business_id');
|
|
$events = DowntimeEvent::forBusiness($business_id)
|
|
->with('workCenter')
|
|
->latest('started_at')
|
|
->paginate(20);
|
|
|
|
$workCenters = WorkCenter::forBusiness($business_id)->where('status', 'active')->orderBy('name')->pluck('name', 'id');
|
|
|
|
return view('shopfloor::downtime.index', compact('events', 'workCenters'));
|
|
}
|
|
|
|
public function store(Request $request)
|
|
{
|
|
if (! auth()->user()->can('shopfloor.downtime.create')) {
|
|
abort(403);
|
|
}
|
|
|
|
$business_id = $request->session()->get('user.business_id');
|
|
$validated = $request->validate([
|
|
'work_center_id' => 'required|integer|exists:sf_work_centers,id',
|
|
'reason_code' => 'required|string|max:50',
|
|
'reason_category' => 'required|in:planned,unplanned',
|
|
'started_at' => 'required|date',
|
|
'ended_at' => 'nullable|date|after_or_equal:started_at',
|
|
'notes' => 'nullable|string',
|
|
]);
|
|
|
|
$startedAt = \Carbon\Carbon::parse($validated['started_at']);
|
|
$endedAt = ! empty($validated['ended_at']) ? \Carbon\Carbon::parse($validated['ended_at']) : null;
|
|
$durationMinutes = $endedAt ? $startedAt->diffInMinutes($endedAt) : null;
|
|
|
|
DowntimeEvent::create([
|
|
'business_id' => $business_id,
|
|
'work_center_id' => $validated['work_center_id'],
|
|
'reason_code' => $validated['reason_code'],
|
|
'reason_category' => $validated['reason_category'],
|
|
'started_at' => $startedAt,
|
|
'ended_at' => $endedAt,
|
|
'duration_minutes' => $durationMinutes,
|
|
'notes' => $validated['notes'] ?? null,
|
|
]);
|
|
|
|
return redirect()->action([self::class, 'index'])->with('status', ['success' => 1, 'msg' => __('shopfloor::lang.downtime_recorded')]);
|
|
}
|
|
|
|
public function end(Request $request, $id)
|
|
{
|
|
if (! auth()->user()->can('shopfloor.downtime.create')) {
|
|
abort(403);
|
|
}
|
|
|
|
$business_id = $request->session()->get('user.business_id');
|
|
$event = DowntimeEvent::forBusiness($business_id)->whereNull('ended_at')->findOrFail($id);
|
|
|
|
$endedAt = now();
|
|
$event->update([
|
|
'ended_at' => $endedAt,
|
|
'duration_minutes' => $event->started_at->diffInMinutes($endedAt),
|
|
]);
|
|
|
|
return redirect()->action([self::class, 'index'])->with('status', ['success' => 1, 'msg' => __('shopfloor::lang.downtime_ended')]);
|
|
}
|
|
}
|