58 lines
2.4 KiB
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);
|
|
}
|
|
}
|