📄 Vendor.php
📁 Path: /home/skhata/new.chandrapharma.com/app/Modules/Vendor/Models/Vendor.php
📊 Size: 4.69 KB
🔒 Perm: 0600
📝 MIME: text/x-php
<?php
namespace App\Modules\Vendor\Models;
use App\Modules\Core\Models\BaseModel;
use Database\Factories\VendorFactory;
use Illuminate\Database\Eloquent\Builder;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Relations\BelongsTo;
use Illuminate\Database\Eloquent\Relations\HasMany;
use Spatie\MediaLibrary\HasMedia;
use Spatie\MediaLibrary\InteractsWithMedia;
use Spatie\MediaLibrary\MediaCollections\Models\Media;
use Spatie\Translatable\HasTranslations;
class Vendor extends BaseModel implements HasMedia
{
use HasFactory;
use HasTranslations;
use InteractsWithMedia;
protected static function newFactory(): VendorFactory
{
return VendorFactory::new();
}
public array $translatable = ['description'];
protected $fillable = [
'name', 'slug', 'legal_name', 'email', 'phone',
'description', 'description_translations',
'owner_id', 'logo_url', 'banner_url', 'accent_color',
'country', 'state', 'city', 'address', 'zip',
'latitude', 'longitude',
'pan_number', 'gst_number', 'vat_registered',
'commission_rate', 'status',
'approved_at', 'approved_by', 'rejection_reason',
'kyc_verified', 'kyc_verified_at',
'meta_title', 'meta_description',
'plan_id', 'plan_expires_at', 'is_active',
'balance',
// Pharmacy compliance fields (migration 2026_05_09_000003)
'drug_license_number', 'fssai_license', 'license_verified_at',
'is_cold_chain_capable',
];
protected function casts(): array
{
return [
'approved_at' => 'datetime',
'kyc_verified_at' => 'datetime',
'plan_expires_at' => 'datetime',
'license_verified_at' => 'datetime',
'is_active' => 'boolean',
'vat_registered' => 'boolean',
'kyc_verified' => 'boolean',
'is_cold_chain_capable' => 'boolean',
'balance' => 'float',
'commission_rate' => 'float',
'latitude' => 'float',
'longitude' => 'float',
];
}
// ── Media ─────────────────────────────────────────────────────────────────
public function registerMediaCollections(): void
{
$this->addMediaCollection('logo')->singleFile();
$this->addMediaCollection('banner')->singleFile();
$this->addMediaCollection('kyc_documents');
}
public function registerMediaConversions(?Media $media = null): void
{
$this->addMediaConversion('thumb')->width(200)->height(200)->format('webp');
$this->addMediaConversion('medium')->width(600)->height(400)->format('webp');
}
// ── Relationships ─────────────────────────────────────────────────────────
public function plan(): BelongsTo
{
return $this->belongsTo(\App\Modules\Payout\Models\VendorPlan::class, 'plan_id');
}
public function owner(): BelongsTo
{
return $this->belongsTo(\App\Modules\User\Models\User::class, 'owner_id');
}
public function approvedBy(): BelongsTo
{
return $this->belongsTo(\App\Modules\User\Models\User::class, 'approved_by');
}
public function users(): HasMany
{
return $this->hasMany(\App\Modules\User\Models\User::class);
}
public function products(): HasMany
{
return $this->hasMany(\App\Modules\Catalog\Models\Product::class);
}
public function orders(): HasMany
{
return $this->hasMany(\App\Modules\Order\Models\Order::class);
}
// ── Scopes ────────────────────────────────────────────────────────────────
public function scopeApproved(Builder $query): Builder
{
return $query->where('status', 'approved');
}
public function scopePending(Builder $query): Builder
{
return $query->where('status', 'pending');
}
// ── Helpers ───────────────────────────────────────────────────────────────
public function isApproved(): bool
{
return $this->status === 'approved';
}
public function getStorefrontUrlAttribute(): string
{
return route('vendor.store', $this->slug);
}
}