210 lines
8.0 KiB
PHP
210 lines
8.0 KiB
PHP
<?php
|
|
|
|
namespace Modules\Maintenance\Http\Controllers;
|
|
|
|
use Illuminate\Http\Request;
|
|
use Illuminate\Routing\Controller;
|
|
use Illuminate\Support\Facades\DB;
|
|
use Modules\Maintenance\Http\Controllers\Concerns\AuthorizesMaintenance;
|
|
use Modules\Maintenance\Models\ChecklistItem;
|
|
use Modules\Maintenance\Models\ChecklistTemplate;
|
|
use Modules\Maintenance\Utils\MaintenanceUtil;
|
|
use Yajra\DataTables\Facades\DataTables;
|
|
|
|
class ChecklistController extends Controller
|
|
{
|
|
use AuthorizesMaintenance;
|
|
|
|
public function __construct(
|
|
protected MaintenanceUtil $maintenanceUtil
|
|
) {}
|
|
|
|
public function index(Request $request)
|
|
{
|
|
$this->authorizeMaintenanceAccess('maintenance.checklists.view');
|
|
|
|
$business_id = $this->maintenanceUtil->getBusinessId();
|
|
|
|
if ($request->ajax()) {
|
|
$templates = ChecklistTemplate::where('business_id', $business_id)
|
|
->with(['category:id,name', 'equipment:id,name,code'])
|
|
->withCount('items')
|
|
->orderBy('name');
|
|
|
|
return DataTables::of($templates)
|
|
->addColumn('scope', function ($row) {
|
|
if ($row->equipment) {
|
|
return e($row->equipment->name);
|
|
}
|
|
if ($row->category) {
|
|
return e($row->category->name);
|
|
}
|
|
|
|
return '—';
|
|
})
|
|
->addColumn('action', function ($row) {
|
|
$html = '';
|
|
if (auth()->user()->can('maintenance.checklists.update')) {
|
|
$html .= '<a href="'.action([self::class, 'edit'], [$row->id]).'" class="btn btn-xs btn-primary"><i class="glyphicon glyphicon-edit"></i></a>';
|
|
}
|
|
if (auth()->user()->can('maintenance.checklists.delete')) {
|
|
$html .= ' <button type="button" data-href="'.action([self::class, 'destroy'], [$row->id]).'" class="btn btn-xs btn-danger delete_mm_checklist"><i class="glyphicon glyphicon-trash"></i></button>';
|
|
}
|
|
|
|
return $html ?: '—';
|
|
})
|
|
->editColumn('is_active', fn ($row) => $row->is_active ? __('maintenance::lang.active') : __('maintenance::lang.inactive'))
|
|
->editColumn('items_count', fn ($row) => (int) $row->items_count)
|
|
->rawColumns(['action'])
|
|
->make(true);
|
|
}
|
|
|
|
return view('maintenance::checklists.index');
|
|
}
|
|
|
|
public function create()
|
|
{
|
|
$this->authorizeMaintenanceAccess('maintenance.checklists.create');
|
|
|
|
$business_id = $this->maintenanceUtil->getBusinessId();
|
|
|
|
return view('maintenance::checklists.create', [
|
|
'categories' => $this->maintenanceUtil->getCategoriesDropdown($business_id),
|
|
'equipment' => $this->maintenanceUtil->getEquipmentDropdown($business_id),
|
|
'item_types' => $this->itemTypeLabels(),
|
|
]);
|
|
}
|
|
|
|
public function store(Request $request)
|
|
{
|
|
$this->authorizeMaintenanceAccess('maintenance.checklists.create');
|
|
|
|
$business_id = $this->maintenanceUtil->getBusinessId();
|
|
$data = $this->validateTemplate($request);
|
|
|
|
DB::transaction(function () use ($business_id, $data) {
|
|
$template = ChecklistTemplate::create([
|
|
'business_id' => $business_id,
|
|
'name' => $data['name'],
|
|
'description' => $data['description'] ?? null,
|
|
'equipment_category_id' => $data['equipment_category_id'] ?? null,
|
|
'equipment_id' => $data['equipment_id'] ?? null,
|
|
'is_active' => $data['is_active'] ?? true,
|
|
]);
|
|
|
|
$this->syncItems($template, $data['items'] ?? []);
|
|
});
|
|
|
|
return $this->maintenanceUtil->jsonOrRedirect(
|
|
$request,
|
|
true,
|
|
'چکلیست ایجاد شد.',
|
|
action([self::class, 'index'])
|
|
);
|
|
}
|
|
|
|
public function edit($id)
|
|
{
|
|
$this->authorizeMaintenanceAccess('maintenance.checklists.update');
|
|
|
|
$business_id = $this->maintenanceUtil->getBusinessId();
|
|
$template = ChecklistTemplate::where('business_id', $business_id)
|
|
->with('items')
|
|
->findOrFail($id);
|
|
|
|
return view('maintenance::checklists.edit', [
|
|
'template' => $template,
|
|
'categories' => $this->maintenanceUtil->getCategoriesDropdown($business_id),
|
|
'equipment' => $this->maintenanceUtil->getEquipmentDropdown($business_id),
|
|
'item_types' => $this->itemTypeLabels(),
|
|
]);
|
|
}
|
|
|
|
public function update(Request $request, $id)
|
|
{
|
|
$this->authorizeMaintenanceAccess('maintenance.checklists.update');
|
|
|
|
$business_id = $this->maintenanceUtil->getBusinessId();
|
|
$template = ChecklistTemplate::where('business_id', $business_id)->findOrFail($id);
|
|
$data = $this->validateTemplate($request, true);
|
|
|
|
DB::transaction(function () use ($template, $data, $request) {
|
|
$template->update([
|
|
'name' => $data['name'],
|
|
'description' => $data['description'] ?? null,
|
|
'equipment_category_id' => $data['equipment_category_id'] ?? null,
|
|
'equipment_id' => $data['equipment_id'] ?? null,
|
|
'is_active' => $request->boolean('is_active'),
|
|
]);
|
|
|
|
if (array_key_exists('items', $data)) {
|
|
$template->items()->delete();
|
|
$this->syncItems($template, $data['items']);
|
|
}
|
|
});
|
|
|
|
return $this->maintenanceUtil->jsonOrRedirect(
|
|
$request,
|
|
true,
|
|
'چکلیست بهروزرسانی شد.',
|
|
action([self::class, 'index'])
|
|
);
|
|
}
|
|
|
|
public function destroy(Request $request, $id)
|
|
{
|
|
$this->authorizeMaintenanceAccess('maintenance.checklists.delete');
|
|
|
|
$business_id = $this->maintenanceUtil->getBusinessId();
|
|
$template = ChecklistTemplate::where('business_id', $business_id)->findOrFail($id);
|
|
$template->items()->delete();
|
|
$template->delete();
|
|
|
|
return $this->maintenanceUtil->jsonOrRedirect($request, true, 'چکلیست حذف شد.', action([self::class, 'index']));
|
|
}
|
|
|
|
protected function validateTemplate(Request $request, bool $partial = false): array
|
|
{
|
|
$required = $partial ? 'sometimes' : 'required';
|
|
|
|
return $request->validate([
|
|
'name' => [$required, 'string', 'max:255'],
|
|
'description' => ['nullable', 'string'],
|
|
'equipment_category_id' => ['nullable', 'exists:maintenance_equipment_categories,id'],
|
|
'equipment_id' => ['nullable', 'exists:maintenance_equipment,id'],
|
|
'is_active' => ['sometimes', 'boolean'],
|
|
'items' => ['sometimes', 'array'],
|
|
'items.*.label' => ['required_with:items', 'string', 'max:255'],
|
|
'items.*.item_type' => ['sometimes', 'string', 'in:text,number,yes_no,photo,signature'],
|
|
'items.*.is_required' => ['sometimes', 'boolean'],
|
|
]);
|
|
}
|
|
|
|
protected function syncItems(ChecklistTemplate $template, array $items): void
|
|
{
|
|
foreach ($items as $i => $item) {
|
|
if (empty($item['label'])) {
|
|
continue;
|
|
}
|
|
ChecklistItem::create([
|
|
'template_id' => $template->id,
|
|
'label' => $item['label'],
|
|
'item_type' => $item['item_type'] ?? 'text',
|
|
'is_required' => ! empty($item['is_required']),
|
|
'sort_order' => $i,
|
|
]);
|
|
}
|
|
}
|
|
|
|
protected function itemTypeLabels(): array
|
|
{
|
|
return [
|
|
'text' => __('maintenance::lang.checklist_type_text'),
|
|
'number' => __('maintenance::lang.checklist_type_number'),
|
|
'yes_no' => __('maintenance::lang.checklist_type_yes_no'),
|
|
'photo' => __('maintenance::lang.checklist_type_photo'),
|
|
'signature' => __('maintenance::lang.checklist_type_signature'),
|
|
];
|
|
}
|
|
}
|