74 lines
2.7 KiB
PHP
74 lines
2.7 KiB
PHP
<?php
|
|
|
|
namespace App\Modules\Maintenance\Services;
|
|
|
|
use App\Business;
|
|
use App\Modules\Maintenance\Models\Equipment;
|
|
use App\Modules\Maintenance\Models\PreventiveSchedule;
|
|
use Carbon\Carbon;
|
|
use Illuminate\Support\Str;
|
|
|
|
class PreventiveScheduleService
|
|
{
|
|
public function calculateNextDue(PreventiveSchedule $schedule): ?Carbon
|
|
{
|
|
$base = $schedule->last_performed_at ?? now();
|
|
|
|
return match ($schedule->frequency_type) {
|
|
'daily' => $base->copy()->addDays($schedule->frequency_value),
|
|
'weekly' => $base->copy()->addWeeks($schedule->frequency_value),
|
|
'monthly' => $base->copy()->addMonths($schedule->frequency_value),
|
|
'quarterly' => $base->copy()->addMonths(3 * $schedule->frequency_value),
|
|
'semi_annual' => $base->copy()->addMonths(6 * $schedule->frequency_value),
|
|
'annual' => $base->copy()->addYears($schedule->frequency_value),
|
|
default => null,
|
|
};
|
|
}
|
|
|
|
public function updateNextDue(PreventiveSchedule $schedule): void
|
|
{
|
|
$next = $this->calculateNextDue($schedule);
|
|
if ($next) {
|
|
$schedule->update(['next_due_at' => $next]);
|
|
}
|
|
}
|
|
|
|
public function generateEquipmentQrCode(Business $business, Equipment $equipment): string
|
|
{
|
|
$code = $equipment->qr_code ?: 'EQ-'.$business->id.'-'.$equipment->id.'-'.Str::upper(Str::random(6));
|
|
if (! $equipment->qr_code) {
|
|
$equipment->update(['qr_code' => $code]);
|
|
}
|
|
|
|
return $code;
|
|
}
|
|
|
|
public function checkDueReminders(Business $business): int
|
|
{
|
|
$count = 0;
|
|
$schedules = PreventiveSchedule::where('business_id', $business->id)
|
|
->where('is_active', true)
|
|
->whereNotNull('next_due_at')
|
|
->whereNotNull('assigned_user_id')
|
|
->with('assignedUser', 'equipment')
|
|
->get();
|
|
|
|
foreach ($schedules as $schedule) {
|
|
$daysUntil = now()->diffInDays($schedule->next_due_at, false);
|
|
if ($daysUntil <= $schedule->reminder_days_before && $schedule->assignedUser) {
|
|
MaintenanceNotificationService::notify(
|
|
$business,
|
|
$schedule->assignedUser,
|
|
'preventive_due',
|
|
'یادآوری نگهداری پیشگیرانه',
|
|
"نگهداری «{$schedule->title}» برای تجهیز «{$schedule->equipment?->name}» تا {$daysUntil} روز دیگر سررسید میشود.",
|
|
['schedule_id' => $schedule->id, 'equipment_id' => $schedule->equipment_id]
|
|
);
|
|
$count++;
|
|
}
|
|
}
|
|
|
|
return $count;
|
|
}
|
|
}
|