where('id', $periodId)->first(); if ($period === null || (string) $period->status !== 'closed') { return; } if ($this->hasOpenSettlementWork($periodId)) { return; } DB::table('settlement_periods') ->where('id', $periodId) ->update([ 'status' => 'completed', 'updated_at' => now(), ]); } public function isPeriodReadOnly(int $periodId): bool { if ($periodId <= 0) { return false; } $status = DB::table('settlement_periods')->where('id', $periodId)->value('status'); return $status !== null && (string) $status === 'completed'; } private function hasOpenSettlementWork(int $periodId): bool { return DB::table('settlement_bills') ->where('settlement_period_id', $periodId) ->whereNotIn('bill_type', ['bad_debt']) ->where(function ($query): void { $query->where('status', 'pending_confirm') ->orWhere(function ($inner): void { $inner->whereIn('status', ['confirmed', 'partial_paid', 'overdue']) ->where('unpaid_amount', '>', 0); }); }) ->exists(); } }