Skip to main content

CallDetailRecord Model

The CallDetailRecord (CDR) model stores detailed call records received from Cloudonix at the end of each call. CDRs contain billing information, call metrics, and quality of service data.

Overview

PropertyValue
NamespaceApp\Models
Tablecall_detail_records
Primary Keyid

Database Schema

ColumnTypeNullableDescription
idbigint unsignedNoPrimary key
organization_idbigint unsignedNoOrganization ID
session_timestampdatetimeNoSession timestamp
session_tokenvarchar(255)YesSession token
fromvarchar(100)NoCaller number
tovarchar(100)NoCalled number
dispositionvarchar(50)NoCall disposition
durationintNoTotal duration in seconds
billsecintNoBillable duration in seconds
call_idvarchar(255)NoSIP Call-ID
domainvarchar(255)YesCloudonix domain
subscribervarchar(100)YesSubscriber identifier
cx_trunk_idintYesCloudonix trunk ID
applicationvarchar(255)YesApplication name
routevarchar(255)YesRoute name
rated_costdecimal(10,4)YesRated call cost
approx_costdecimal(10,4)YesApproximate cost
sell_costdecimal(10,4)YesSell cost
vapp_servervarchar(50)YesVApp server
session_idintYesSession ID
call_start_timedatetimeYesCall start time
call_end_timedatetimeYesCall end time
call_answer_timedatetimeYesCall answer time
statusvarchar(50)YesCall status
raw_cdrjsonNoComplete raw CDR JSON
created_attimestampNoCreation timestamp
updated_attimestampNoUpdate timestamp

Attributes

Fillable

protected $fillable = [
'organization_id',
'session_timestamp',
'session_token',
'from',
'to',
'disposition',
'duration',
'billsec',
'call_id',
'domain',
'subscriber',
'cx_trunk_id',
'application',
'route',
'rated_cost',
'approx_cost',
'sell_cost',
'vapp_server',
'session_id',
'call_start_time',
'call_end_time',
'call_answer_time',
'status',
'raw_cdr',
];

Casts

AttributeCastDescription
session_timestampdatetimeCarbon instance
call_start_timedatetimeCarbon instance
call_end_timedatetimeCarbon instance
call_answer_timedatetimeCarbon instance
durationintegerInteger cast
billsecintegerInteger cast
cx_trunk_idintegerInteger cast
session_idintegerInteger cast
rated_costdecimal:4Decimal with 4 places
approx_costdecimal:4Decimal with 4 places
sell_costdecimal:4Decimal with 4 places
raw_cdrarrayJSON data

Relationships

Belongs To

  • organization() → Organization

Methods

Factory Method

createFromWebhook(array $payload, int $organizationId): self

Create a CDR from Cloudonix webhook payload.

$cdr = CallDetailRecord::createFromWebhook($payload, $organizationId);

Accessors

getFormattedDurationAttribute(): string

Get formatted duration as MM:SS.

$cdr->formatted_duration; // "05:30"

getFormattedBillsecAttribute(): string

Get formatted billable duration as MM:SS.

$cdr->formatted_billsec; // "05:15"

Query Scopes

  • scopeForOrganization($query, int $organizationId)
  • scopeWithDisposition($query, string $disposition)
  • scopeConnected($query) - Connected calls only
  • scopeBetweenDates($query, Carbon $startDate, Carbon $endDate)

Dispositions

DispositionDescription
CONNECTEDCall was connected
NO_ANSWERNo answer
BUSYLine busy
FAILEDCall failed
CANCELLEDCall cancelled

Usage Examples

Creating from Webhook

$payload = [
'timestamp' => 1705312800,
'from' => '+1234567890',
'to' => '+1987654321',
'disposition' => 'CONNECTED',
'duration' => 300,
'billsec' => 295,
'call_id' => 'CA550e8400e29b41d4a716446655440000',
'session' => [
'id' => 12345,
'token' => 'sess_token',
'callStartTime' => 1705312800000,
'callEndTime' => 1705313100000,
'callAnswerTime' => 1705312815000,
],
];

$cdr = CallDetailRecord::createFromWebhook($payload, $orgId);

Querying CDRs

use Carbon\Carbon;

// Get connected calls for organization
$connected = CallDetailRecord::connected()
->forOrganization($orgId)
->get();

// Get calls in date range
$cdrs = CallDetailRecord::betweenDates(
Carbon::parse('2024-01-01'),
Carbon::parse('2024-01-31')
)->get();

// Get specific disposition
$failed = CallDetailRecord::withDisposition('FAILED')->get();