product?->project?->paymentTemplate; } if (! $template) { throw new \InvalidArgumentException('Không tìm thấy mẫu thanh toán cho hợp đồng này.'); } // Xóa lịch cũ nếu có if ($contract->paymentSchedule) { $contract->paymentSchedule->items()->delete(); $contract->paymentSchedule->delete(); } $schedule = PaymentSchedule::create([ 'contract_id' => $contract->id, 'template_id' => $template->id, ]); $items = $template->items()->orderBy('installment_no')->get(); $lastDueDate = Carbon::parse($contract->signing_date); foreach ($items as $item) { $dueDate = null; if ($item->days_after_signing !== null) { $dueDate = Carbon::parse($contract->signing_date)->addDays($item->days_after_signing); } elseif ($item->days_after_previous !== null) { $dueDate = $lastDueDate->copy()->addDays($item->days_after_previous); } elseif ($item->due_date !== null) { $dueDate = $item->due_date; } PaymentScheduleItem::create([ 'schedule_id' => $schedule->id, 'installment_no' => $item->installment_no, 'type' => $item->type, 'percentage' => $item->percentage, 'amount' => $contract->total_value * ($item->percentage / 100), 'due_date' => $dueDate, ]); if ($dueDate) { $lastDueDate = $dueDate; } } return $schedule; }); } }