ultimatepos/Modules/Maintenance/Traits/AppliesMaintenanceScope.php

81 lines
2.8 KiB
PHP

<?php
namespace Modules\Maintenance\Traits;
use Modules\Maintenance\Models\ProductionLine;
use Illuminate\Database\Eloquent\Builder;
use Illuminate\Http\Request;
trait AppliesMaintenanceScope
{
protected function applyMaintenanceScopeFilters(Builder $query, Request $request, ?string $equipmentRelation = 'equipment'): void
{
if ($projectId = $request->get('project_id')) {
$query->where(function ($q) use ($projectId, $equipmentRelation) {
$q->where('project_id', $projectId);
if ($equipmentRelation) {
$q->orWhereHas("{$equipmentRelation}.productionLine", fn ($lq) => $lq->where('project_id', $projectId));
}
});
}
if ($lineId = $request->get('production_line_id')) {
$query->where(function ($q) use ($lineId, $equipmentRelation) {
$q->where('production_line_id', $lineId);
if ($equipmentRelation) {
$q->orWhereHas($equipmentRelation, fn ($eq) => $eq->where('production_line_id', $lineId));
}
});
}
}
protected function syncScopeFromLine(array $data): array
{
if (! empty($data['production_line_id'])) {
$line = ProductionLine::find($data['production_line_id']);
if ($line?->project_id) {
if (empty($data['project_id'])) {
$data['project_id'] = $line->project_id;
} elseif ((int) $data['project_id'] !== (int) $line->project_id) {
throw new \InvalidArgumentException('خط تولید به پروژه انتخاب‌شده تعلق ندارد.');
}
}
}
return $data;
}
protected function scopeValidationRules(): array
{
return [
'project_id' => ['nullable', 'exists:pjt_projects,id'],
'production_line_id' => ['nullable', 'exists:maintenance_production_lines,id'],
];
}
protected function equipmentIdsValidationRules(bool $required = true): array
{
return [
'equipment_id' => array_filter([
$required ? 'required_without:equipment_ids' : 'nullable',
'exists:maintenance_equipment,id',
]),
'equipment_ids' => ['nullable', 'array', 'min:1'],
'equipment_ids.*' => ['integer', 'exists:maintenance_equipment,id'],
];
}
protected function resolveEquipmentIds(array $data): array
{
if (! empty($data['equipment_ids']) && is_array($data['equipment_ids'])) {
return array_values(array_unique(array_map('intval', $data['equipment_ids'])));
}
if (! empty($data['equipment_id'])) {
return [(int) $data['equipment_id']];
}
return [];
}
}