46 خطوط
2.8 KiB
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(),
|
|
];
|
|
}
|
|
}
|