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); } }