id(); $t->foreignId('company_id')->constrained()->cascadeOnDelete(); $t->string('type')->default('individual'); // individual / company $t->string('name'); $t->string('company_name')->nullable(); // for type=company $t->string('phone'); $t->string('phone_alt')->nullable(); $t->string('email')->nullable(); $t->string('telegram')->nullable(); $t->string('whatsapp')->nullable(); $t->string('viber')->nullable(); $t->string('source')->nullable(); // call / site / telegram / google / ... $t->string('marketing_channel')->nullable(); $t->string('status')->default('active'); // new / active / vip / debtor / blocked / lost $t->decimal('balance', 12, 2)->default(0); // negative = customer owes us $t->decimal('discount_pct', 5, 2)->default(0); $t->text('notes')->nullable(); $t->foreignId('assigned_to')->nullable()->constrained('users')->nullOnDelete(); $t->timestamp('last_contact_at')->nullable(); $t->timestamps(); $t->softDeletes(); $t->index(['company_id', 'status']); $t->index(['company_id', 'phone']); $t->index(['company_id', 'created_at']); }); } public function down(): void { Schema::dropIfExists('clients'); } };