CRM/backend/app/Http/Resources/CampaignResource.php

46 خطوط
2.8 KiB
PHP

<?php
namespace App\Http\Resources;
use Illuminate\Http\Request;
use Illuminate\Http\Resources\Json\JsonResource;
class CampaignResource extends JsonResource
{
public static $wrap = null;
public function toArray(Request $request): array
{
return [
'id' => $this->id,
'name' => $this->name,
'description' => $this->description,
'product_service' => $this->product_service,
'product_id' => $this->product_id,
'product' => $this->whenLoaded('product', fn () => $this->product?->only(['id', 'name', 'base_price'])),
'channel' => $this->channel,
'start_date' => optional($this->start_date)->toDateString(),
'end_date' => optional($this->end_date)->toDateString(),
'target' => $this->target,
'budget' => $this->budget !== null ? (float) $this->budget : null,
'actual_cost' => $this->actual_cost !== null ? (float) $this->actual_cost : null,
'status' => $this->status,
'sales_script_id' => $this->sales_script_id,
'sales_script' => $this->whenLoaded('salesScript', fn () => $this->salesScript?->only(['id', 'title', 'version', 'is_active'])),
'assigned_agents' => $this->whenLoaded('assignedAgents', fn () => $this->assignedAgents->map->only(['id', 'name'])->values()),
'assigned_supervisors' => $this->whenLoaded('assignedSupervisors', fn () => $this->assignedSupervisors->map->only(['id', 'name'])->values()),
'leads' => $this->whenLoaded('leads'),
'leads_count' => $this->whenCounted('leads'),
'contacted_leads_count' => $this->when(isset($this->contacted_leads_count), (int) $this->contacted_leads_count),
'won_leads_count' => $this->when(isset($this->won_leads_count), (int) $this->won_leads_count),
'won_value' => $this->when(isset($this->won_value_sum), (float) ($this->won_value_sum ?? 0)),
'conversion_rate' => $this->when(isset($this->won_leads_count), $this->leads_count > 0 ? round(($this->won_leads_count / $this->leads_count) * 100, 1) : 0),
'target_progress' => $this->when(isset($this->won_leads_count), $this->target > 0 ? min(100, round(($this->won_leads_count / $this->target) * 100, 1)) : 0),
'cost_per_lead' => $this->when(isset($this->leads_count), $this->leads_count > 0 ? round(((float) ($this->actual_cost ?? 0)) / $this->leads_count, 2) : 0),
'roi' => $this->when(isset($this->won_value_sum), (float) ($this->actual_cost ?? 0) > 0 ? round((((float) ($this->won_value_sum ?? 0) - (float) $this->actual_cost) / (float) $this->actual_cost) * 100, 1) : null),
'created_at' => optional($this->created_at)->toISOString(),
'updated_at' => optional($this->updated_at)->toISOString(),
];
}
}