orderByRaw('RAND()') ->limit(22) ->get(); if ($invoices->isEmpty()) { $this->command->warn('AvoirSeeder: aucune facture éligible trouvée — skip.'); return; } // Status pool: mostly emis / some applique $statusPool = array_merge( array_fill(0, 13, 'emis'), array_fill(0, 9, 'applique') ); shuffle($statusPool); foreach ($invoices as $idx => $invoice) { $reason = self::REASON_TYPES[array_rand(self::REASON_TYPES)]; $status = $statusPool[$idx % count($statusPool)]; $avoirDate = $invoice->invoice_date ->copy() ->addDays(rand(5, 60)) ->format('Y-m-d'); // Partial or total credit $fraction = ($reason === 'remboursement_total') ? 1.0 : round(rand(20, 80) / 100, 2); $totalHt = round((float) $invoice->total_ht * $fraction, 2); $totalTva = round($totalHt * 0.20, 2); $totalTtc = round($totalHt + $totalTva, 2); Avoir::create([ 'client_id' => $invoice->client_id, 'invoice_id' => $invoice->id, 'status' => $status, 'avoir_date' => $avoirDate, 'currency' => 'EUR', 'total_ht' => $totalHt, 'total_tva' => $totalTva, 'total_ttc' => $totalTtc, 'reason_type' => $reason, 'reason_description' => null, 'refund_status' => 'non_rembourse', ]); } $this->command->info('AvoirSeeder: ' . $invoices->count() . ' avoirs créés.'); } }