ultimatepos/Modules/ShopFloor/Http/Controllers/DowntimeController.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')]);
}
}