ultimatepos/Modules/QualityManagement/Services/QmsIntegrationService.php

58 lines
2.4 KiB
PHP

<?php
namespace Modules\QualityManagement\Services;
use Modules\QualityManagement\Models\CalibrationAsset;
use Modules\QualityManagement\Models\CapaAction;
use Modules\QualityManagement\Models\NcrReport;
use Modules\QualityManagement\Models\QualityAudit;
use Modules\QualityManagement\Models\SpcMeasurement;
class QmsIntegrationService
{
public function dashboardStats(int $businessId): array
{
return [
'open_ncrs' => NcrReport::forBusiness($businessId)->whereIn('status', ['open', 'investigating', 'containment'])->count(),
'open_capas' => CapaAction::forBusiness($businessId)->whereIn('status', ['planned', 'in_progress', 'verification'])->count(),
'overdue_calibrations' => CalibrationAsset::forBusiness($businessId)->where('status', 'overdue')->count(),
'due_calibrations' => CalibrationAsset::forBusiness($businessId)->where('status', 'due')->count(),
'spc_out_of_control' => SpcMeasurement::forBusiness($businessId)
->where('in_control', false)
->where('measured_at', '>=', now()->subDays(30))
->count(),
'pending_audits' => QualityAudit::forBusiness($businessId)->whereIn('status', ['planned', 'in_progress', 'follow_up'])->count(),
'critical_ncrs' => NcrReport::forBusiness($businessId)->where('severity', 'critical')->where('status', '!=', 'closed')->count(),
];
}
public function linkFromInspection(int $businessId, array $data): NcrReport
{
return NcrReport::create(array_merge($data, [
'business_id' => $businessId,
'source' => 'inspection',
'ref_no' => $this->nextRef($businessId, 'NCR'),
]));
}
public function linkFromEco(int $businessId, int $ecoId, string $title): NcrReport
{
return NcrReport::create([
'business_id' => $businessId,
'ref_no' => $this->nextRef($businessId, 'NCR'),
'title' => $title,
'source' => 'internal',
'ie_eco_id' => $ecoId,
'status' => 'open',
'detected_at' => now()->toDateString(),
]);
}
public function nextRef(int $businessId, string $prefix): string
{
$count = NcrReport::forBusiness($businessId)->withTrashed()->count() + 1;
return $prefix.'-'.str_pad((string) $count, 5, '0', STR_PAD_LEFT);
}
}