Compare commits

...

14 Commits

Author SHA1 Message Date
d8e83b8e75 Temporarily added interpreter_attempt 2025-07-09 10:41:09 +10:00
4b75eccdcd Temporarily updated clone of BaseCall to match local model (in gcq_formatter) 2025-07-08 11:21:13 +10:00
74e9fd3f37 Added CRM modules and tickets 2025-07-08 09:59:46 +10:00
194cb5bbe6 Added base_call and interpreter_connection models 2025-07-07 15:54:02 +10:00
aa15b86efd Changed amendment and amendment log ID fields to auto incrementing integers 2025-07-04 11:26:56 +10:00
b52f1cd80d Changed the structure slightly of Amendments 2025-07-04 10:34:16 +10:00
abf0d6caf0 Changed old raw.go into gencloud.go Added GCRaw model 2025-07-01 14:01:09 +10:00
42f9ba2848 Added DBAmendment model 2025-06-27 15:05:06 +10:00
055ad59d12 Updated segment to use the correct session ID for FK. 2025-06-20 11:18:28 +10:00
d66df080fe Added flow to sessions and removed ExtractWithAttributes 2025-06-20 09:31:21 +10:00
804b9b2792 Added foreign key relations to all core components 2025-06-19 14:45:58 +10:00
3be1e46f69 Added details_update column to gc_conversations 2025-06-18 10:23:34 +10:00
0122b01037 Removed live, semi_live, and job update timestamps from Extract functions. 2025-06-18 09:38:54 +10:00
d8d857e82e Added duration field to queue_logs table. 2025-06-17 11:37:23 +10:00
19 changed files with 760 additions and 298 deletions

31
models/amendment.go Normal file
View File

@@ -0,0 +1,31 @@
package models
import "time"
type DBAmendment struct {
Id int `gorm:"primaryKey;autoIncrement"`
ConversationId string `gorm:"index"`
AmendmentColumn string
AmendmentValue string
Requestor string
RequestedAt time.Time
}
func (DBAmendment) TableName() string {
return "gc_amendments"
}
type DBAmendmentLog struct {
Id int `gorm:"primaryKey;autoIncrement"`
ConversationId string `gorm:"index"`
AmendmentColumn string
OldValue string
NewValue string
Requestor string
RequestedAt time.Time
AmendedAt time.Time
}
func (DBAmendmentLog) TableName() string {
return "gc_amendment_logs"
}

27
models/base_call.go Normal file
View File

@@ -0,0 +1,27 @@
package models
import (
"time"
)
type BaseCall struct {
ClientConversationId string `gorm:"primaryKey;index"`
CallType string `gorm:"index"`
GenderPreference string
ClientId int `gorm:"index"`
CustomerDnis string
CustomerAni string
SearchStartTime *time.Time
P1ConnectTime time.Time `gorm:"index"`
P1DisconnectTime time.Time `gorm:"index"`
P3ConnectTime *time.Time
P3DisconnectTime *time.Time
BookingRequestNumber *int `gorm:"index"`
IvrData *int
UtsEntries int
InterpreterCount int
}
func (BaseCall) TableName() string {
return "gc_base_calls"
}

View File

@@ -19,8 +19,11 @@ type DBConversation struct {
Start *time.Time `gorm:"index"` Start *time.Time `gorm:"index"`
UtilizationLabelId *string UtilizationLabelId *string
LiveUpdate *time.Time LiveUpdate *time.Time
DetailsUpdate *time.Time
SemiLiveUpdate *time.Time SemiLiveUpdate *time.Time
JobUpdate *time.Time JobUpdate *time.Time
Participants []DBParticipant `gorm:"foreignKey:ConversationId;references:Id"`
} }
func (DBConversation) TableName() string { func (DBConversation) TableName() string {

47
models/crm_client.go Normal file
View File

@@ -0,0 +1,47 @@
package models
import (
"time"
)
type CrmClient struct {
ID int `gorm:"primaryKey;column:id" json:"id"`
BillingGroupNumber *int `gorm:"column:billing_group_number" json:"billing_group_number"`
DrawdownCurrentBalance *float64 `gorm:"column:drawdown_current_balance" json:"drawdown_current_balance"`
DrawdownInitialBalance *float64 `gorm:"column:drawdown_initial_balance" json:"drawdown_initial_balance"`
ContractExpiry *time.Time `gorm:"column:contract_expiry;type:date" json:"contract_expiry"`
CreatedDate *time.Time `gorm:"column:created_date;type:date" json:"created_date"`
MBIE *bool `gorm:"column:mbie" json:"mbie"`
FundingAvailable *bool `gorm:"column:funding_available" json:"funding_available"`
DrawdownClient *bool `gorm:"column:drawdown_client" json:"drawdown_client"`
CostCentreRequired *bool `gorm:"column:cost_centre_required" json:"cost_centre_required"`
CallsRecordings *bool `gorm:"column:calls_recordings" json:"calls_recordings"`
ABNNZBMNumber *string `gorm:"column:abn_nzbm_number" json:"abn_nzbm_number"`
AccountsPayableEmail *string `gorm:"column:accounts_payable_email" json:"accounts_payable_email"`
BillingGroup *string `gorm:"column:billing_group" json:"billing_group"`
BusinessAddress *string `gorm:"column:business_address" json:"business_address"`
Name *string `gorm:"column:name" json:"name"`
Notes *string `gorm:"column:notes" json:"notes"`
Owner *string `gorm:"column:owner" json:"owner"`
PhoneNumber *string `gorm:"column:phone_number" json:"phone_number"`
ServicePhone *string `gorm:"column:service_phone" json:"service_phone"`
Status *string `gorm:"column:status" json:"status"`
ContactName *string `gorm:"column:contact_name" json:"contact_name"`
ContractSigned *string `gorm:"column:contract_signed" json:"contract_signed"`
CreatedBy *string `gorm:"column:created_by" json:"created_by"`
DrawdownPONumber *string `gorm:"column:drawdown_po_number" json:"drawdown_po_number"`
GenderPreference *string `gorm:"column:gender_preference" json:"gender_preference"`
GSTNumber *string `gorm:"column:gst_number" json:"gst_number"`
InvoiceConfig *string `gorm:"column:invoice_config" json:"invoice_config"`
CustomerReference *string `gorm:"column:customer_reference" json:"customer_reference"`
PartnerName *string `gorm:"column:partner_name" json:"partner_name"`
POReference *string `gorm:"column:po_reference" json:"po_reference"`
PostalAddress *string `gorm:"column:postal_address" json:"postal_address"`
SearchPattern *string `gorm:"column:search_pattern" json:"search_pattern"`
State *string `gorm:"column:state" json:"state"`
ReportEmails *string `gorm:"column:report_emails" json:"report_emails"`
}
func (CrmClient) TableName() string {
return "live_clients"
}

66
models/crm_interpreter.go Normal file
View File

@@ -0,0 +1,66 @@
package models
import (
"time"
)
type CrmInterpreter struct {
ID int `gorm:"primaryKey;column:id" json:"id"`
ABN *string `gorm:"column:abn" json:"abn"`
AccountNumber *string `gorm:"column:account_number" json:"account_number"`
AccountStatus *string `gorm:"column:account_status" json:"account_status"`
Address *string `gorm:"column:address" json:"address"`
BankName *string `gorm:"column:bank_name" json:"bank_name"`
BSB *string `gorm:"column:bsb" json:"bsb"`
ContractStatus *string `gorm:"column:contract_status" json:"contract_status"`
BirthCountry *string `gorm:"column:birth_country" json:"birth_country"`
CreatedBy *string `gorm:"column:created_by" json:"created_by"`
CurrentPhone *string `gorm:"column:current_phone" json:"current_phone"`
DateOfBirth *string `gorm:"column:date_of_birth" json:"date_of_birth"`
Email *string `gorm:"column:email" json:"email"`
EmployedBy *string `gorm:"column:employed_by" json:"employed_by"`
EnrolmentDate *string `gorm:"column:enrolment_date" json:"enrolment_date"`
FinanceTasksCompleted *bool `gorm:"column:finance_tasks_completed" json:"finance_tasks_completed"`
GST *bool `gorm:"column:gst" json:"gst"`
NZGovApproved *bool `gorm:"column:nz_gov_approved" json:"nz_gov_approved"`
NaatiListed *bool `gorm:"column:naati_listed" json:"naati_listed"`
PersonalCV *bool `gorm:"column:personal_cv" json:"personal_cv"`
PinViaSMS *bool `gorm:"column:pin_via_sms" json:"pin_via_sms"`
VaxFluCheck *bool `gorm:"column:vax_flu_check" json:"vax_flu_check"`
WorkingWithChildren *bool `gorm:"column:working_with_children" json:"working_with_children"`
LastContactAttempt *time.Time `gorm:"column:last_contact_attempt" json:"last_contact_attempt"`
MigrationYear *time.Time `gorm:"column:migration_year" json:"migration_year"`
FirstName *string `gorm:"column:first_name" json:"first_name"`
Gender *string `gorm:"column:gender" json:"gender"`
FullName *string `gorm:"column:full_name" json:"full_name"`
Owner *string `gorm:"column:owner" json:"owner"`
TranslationType *string `gorm:"column:translation_type" json:"translation_type"`
Status *string `gorm:"column:status" json:"status"`
GSTNumber *string `gorm:"column:gst_number" json:"gst_number"`
LastName *string `gorm:"column:last_name" json:"last_name"`
Layout *string `gorm:"column:layout" json:"layout"`
ModifiedBy *string `gorm:"column:modified_by" json:"modified_by"`
NaatiCertification *string `gorm:"column:naati_certification" json:"naati_certification"`
NaatiCertificationID *string `gorm:"column:naati_certification_id" json:"naati_certification_id"`
Notes *string `gorm:"column:notes" json:"notes"`
NZBN *string `gorm:"column:nzbn" json:"nzbn"`
Password *string `gorm:"column:password" json:"password"`
PaymentState *string `gorm:"column:payment_state" json:"payment_state"`
PhotoID *string `gorm:"column:photo_id" json:"photo_id"`
PhotoIDExpiry *string `gorm:"column:photo_id_expiry" json:"photo_id_expiry"`
Pin *string `gorm:"column:pin" json:"pin"`
PoliceCheck *string `gorm:"column:police_check" json:"police_check"`
PoliceCheckExpiry *string `gorm:"column:police_check_expiry" json:"police_check_expiry"`
Postcode *string `gorm:"column:postcode" json:"postcode"`
Priority *string `gorm:"column:priority" json:"priority"`
State *string `gorm:"column:state" json:"state"`
Status2 *string `gorm:"column:status_2" json:"status_2"`
Suburb *string `gorm:"column:suburb" json:"suburb"`
Tag *string `gorm:"column:tag" json:"tag"`
VaxCovidCheck *string `gorm:"column:vax_covid_check" json:"vax_covid_check"`
CRMID *string `gorm:"column:crm_id" json:"crm_id"`
}
func (CrmInterpreter) TableName() string {
return "live_interpreters"
}

View File

@@ -0,0 +1,34 @@
package models
import ()
type CrmInvoiceConfig struct {
ID string `gorm:"primaryKey;column:id" json:"id"`
Name string `gorm:"column:name;not null" json:"name"`
BHEndHour *int `gorm:"column:bh_end_hour" json:"bh_end_hour"`
BHEndMinute *int `gorm:"column:bh_end_minute" json:"bh_end_minute"`
BHStartHour *int `gorm:"column:bh_start_hour" json:"bh_start_hour"`
BHStartMinute *int `gorm:"column:bh_start_minute" json:"bh_start_minute"`
MaximumDuration *int `gorm:"column:maximum_duration" json:"maximum_duration"`
MinimumDuration *int `gorm:"column:minimum_duration" json:"minimum_duration"`
OnDemandAH *string `gorm:"column:on_demand_ah" json:"on_demand_ah"`
OnDemandBH *string `gorm:"column:on_demand_bh" json:"on_demand_bh"`
AudioBookingAH *string `gorm:"column:audio_booking_ah" json:"audio_booking_ah"`
AudioBookingBH *string `gorm:"column:audio_booking_bh" json:"audio_booking_bh"`
VideoBookingAH *string `gorm:"column:video_booking_ah" json:"video_booking_ah"`
VideoBookingBH *string `gorm:"column:video_booking_bh" json:"video_booking_bh"`
PartnerOnDemandAH *string `gorm:"column:partner_on_demand_ah" json:"partner_on_demand_ah"`
PartnerOnDemandBH *string `gorm:"column:partner_on_demand_bh" json:"partner_on_demand_bh"`
PartnerAudioBookingAH *string `gorm:"column:partner_audio_booking_ah" json:"partner_audio_booking_ah"`
PartnerAudioBookingBH *string `gorm:"column:partner_audio_booking_bh" json:"partner_audio_booking_bh"`
PartnerVideoBookingAH *string `gorm:"column:partner_video_booking_ah" json:"partner_video_booking_ah"`
PartnerVideoBookingBH *string `gorm:"column:partner_video_booking_bh" json:"partner_video_booking_bh"`
RoundBookings *bool `gorm:"column:round_bookings" json:"round_bookings"`
RoundingFunction *bool `gorm:"column:rounding_function" json:"rounding_function"`
SplitBookings *bool `gorm:"column:split_bookings" json:"split_bookings"`
SplitOnDemand *bool `gorm:"column:split_on_demand" json:"split_on_demand"`
}
func (CrmInvoiceConfig) TableName() string {
return "live_invoice_configs"
}

12
models/crm_language.go Normal file
View File

@@ -0,0 +1,12 @@
package models
type CrmLanguage struct {
ID int `gorm:"primaryKey;column:id" json:"id"`
Name *string `gorm:"column:name" json:"name"`
Active *bool `gorm:"column:active" json:"active"`
CRMID *string `gorm:"column:crm_id" json:"crm_id"`
}
func (CrmLanguage) TableName() string {
return "live_languages"
}

View File

@@ -0,0 +1,22 @@
package models
import "time"
type CrmLanguageLookup struct {
ID string `gorm:"primaryKey;column:id" json:"id"`
Language *string `gorm:"column:language" json:"language"`
CustomRateFunction *string `gorm:"column:custom_rate_function" json:"custom_rate_function"`
Interpreter *string `gorm:"column:interpreter" json:"interpreter"`
NaatiDescription *string `gorm:"column:naati_description" json:"naati_description"`
NaatiNumber *string `gorm:"column:naati_number" json:"naati_number"`
NaatiExpiry *time.Time `gorm:"column:naati_expiry;type:date" json:"naati_expiry"`
NaatiLevel *int `gorm:"column:naati_level" json:"naati_level"`
Priority *int `gorm:"column:priority" json:"priority"`
Searchable *bool `gorm:"column:searchable" json:"searchable"`
WorkingTowardsNaati *bool `gorm:"column:working_towards_naati" json:"working_towards_naati"`
PaymentConfiguration *string `gorm:"column:payment_configuration" json:"payment_configuration"`
}
func (CrmLanguageLookup) TableName() string {
return "live_language_lookups"
}

View File

@@ -0,0 +1,18 @@
package models
type CrmPaymentConfig struct {
ID string `gorm:"primaryKey;column:id" json:"id"`
Name string `gorm:"column:name;not null" json:"name"`
BHEndHour *int `gorm:"column:bh_end_hour" json:"bh_end_hour"`
BHEndMinute *int `gorm:"column:bh_end_minute" json:"bh_end_minute"`
BHStartHour *int `gorm:"column:bh_start_hour" json:"bh_start_hour"`
BHStartMinute *int `gorm:"column:bh_start_minute" json:"bh_start_minute"`
OnDemand *string `gorm:"column:on_demand" json:"on_demand"`
AudioBooking *string `gorm:"column:audio_booking" json:"audio_booking"`
VideoBooking *string `gorm:"column:video_booking" json:"video_booking"`
TimeZone *string `gorm:"column:time_zone" json:"time_zone"`
}
func (CrmPaymentConfig) TableName() string {
return "live_payment_configs"
}

185
models/gencloud.go Normal file
View File

@@ -0,0 +1,185 @@
package models
type AnalyticsConversationWithAttributesQuery struct {
Conversations []AnalyticsConversationWithAttributes `json:"conversations"`
Cursor *string `json:"cursor"`
}
type AnalyticsConversationWithAttributes struct {
ConversationEnd string `json:"conversationEnd"`
ConversationId string `json:"conversationId"`
ConversationStart string `json:"conversationStart"`
DivisionIds []string `json:"divisionIds"`
ExternalTag string `json:"externalTag"`
MediaStatsMinConversationMos float32 `json:"mediaStatsMinConversationMos"`
MediaStatsMinConversationRFactor float32 `json:"mediaStatsMinConversationRFactor"`
OriginatingDirection string `json:"originatingDirection"`
Participants []struct {
ExternalContactId string `json:"externalContactId"`
ParticipantId string `json:"participantId"`
ParticipantName string `json:"participantName"`
Purpose string `json:"purpose"`
Sessions []struct {
ANI string `json:"ani"`
Direction string `json:"direction"`
DNIS string `json:"dnis"`
EdgeId string `json:"edgeId"`
MediaType string `json:"mediaType"`
ProtocolCallId string `json:"protocolCallId"`
Provider string `json:"provider"`
Recording bool `json:"recording"`
RemoteNameDisplayable string `json:"remoteNameDisplayable"`
SessionDnis string `json:"sessionDnis"`
SessionId string `json:"sessionId"`
MediaEndpointStats []struct {
Codecs []string `json:"codecs"`
EventTime string `json:"eventTime"`
MaxLatencyMs int `json:"maxLatencyMs"`
MinMos float32 `json:"minMos"`
MinRFactor float32 `json:"minRFactor"`
ReceivedPackets int `json:"receivedPackets"`
} `json:"mediaEndpointStats"`
Metrics []struct {
EmitDate string `json:"emitDate"`
Name string `json:"name"`
Value int `json:"value"`
} `json:"metrics"`
Segments []struct {
Conference bool `json:"conference"`
DisconnectType string `json:"disconnectType"`
Q850ResponseCodes []int `json:"q850ResponseCodes"`
SegmentEnd string `json:"segmentEnd"`
SegmentStart string `json:"segmentStart"`
SegmentType string `json:"segmentType"`
WrapUpCode string `json:"wrapUpCode"`
} `json:"segments"`
} `json:"sessions"`
Attributes map[string]any `json:"attributes"`
} `json:"participants"`
}
type AnalyticsConversationWithoutAttributesQuery struct {
Conversations []AnalyticsConversationWithoutAttributes `json:"conversations"`
TotalHits int `json:"totalHits"`
}
type AnalyticsConversationWithoutAttributes struct {
ConversationId string `json:"conversationId"`
ConversationStart string `json:"conversationStart"`
ConversationEnd string `json:"conversationEnd"`
MediaStatsMinConversationMos float32 `json:"mediaStatsMinConversationMos"`
MediaStatsMinConversationRFactor float32 `json:"mediaStatsMinConversationRFactor"`
OriginatingDirection string `json:"originatingDirection"`
DivisionIds []string `json:"divisionIds"`
Participants []struct {
ParticipantId string `json:"participantId"`
ParticipantName string `json:"participantName"`
Purpose string `json:"purpose"`
ExternalContactId string `json:"externalContactId"`
Sessions []struct {
MediaType string `json:"mediaType"`
SessionId string `json:"sessionId"`
ANI string `json:"ani"`
Direction string `json:"direction"`
DNIS string `json:"dnis"`
SessionDNIS string `json:"sessionDnis"`
EdgeId string `json:"edgeId"`
RemoteNameDisplayable string `json:"remoteNameDisplayable"`
Segments []struct {
SegmentStart string `json:"segmentStart"`
SegmentEnd string `json:"segmentEnd"`
WrapUpCode string `json:"wrapUpCode"`
DisconnectType string `json:"disconnectType"`
SegmentType string `json:"SegmentType"`
Q850ResponseCodes []int `json:"q850ResponseCodes"`
Conference bool `json:"conference"`
} `json:"segments"`
Flow struct {
EndingLanguage string `json:"endingLanguage"`
EntryReason string `json:"entryReason"`
EntryType string `json:"entryType"`
ExitReason string `json:"exitReason"`
FlowId string `json:"flowId"`
FlowName string `json:"flowName"`
FlowType string `json:"flowType"`
FlowVersion string `json:"flowVersion"`
StartingLanguage string `json:"startingLanguage"`
TransferTargetAddress string `json:"transferTargetAddress"`
TransferTargetName string `json:"transferTargetName"`
TransferType string `json:"transferType"`
} `json:"flow"`
Metrics []struct {
Name string `json:"name"`
Value int `json:"value"`
EmitDate string `json:"emitDate"`
} `json:"metrics"`
MediaEndpointStats []struct {
Codecs []string `json:"codecs"`
MinMos float32 `json:"minMos"`
MinRFactor float32 `json:"minRFactor"`
MaxLatencyMs int `json:"maxLatencyMs"`
ReceivedPackets int `json:"receivedPackets"`
} `json:"mediaEndpointStats"`
Recording bool `json:"recording"`
ProtocolCallId string `json:"protocolCallId"`
Provider string `json:"provider"`
} `json:"sessions"`
} `json:"participants"`
}
type NotificationConversationWithAttributes struct {
Address string `json:"address"`
Divisions []struct {
Division struct {
Id string `json:"id"`
SelfUri string `json:"selfUri"`
} `json:"division"`
Entities []struct {
DateDivisionUpdated string `json:"dateDivisionUpdated"`
Id string `json:"id"`
SelfUri string `json:"selfUri"`
} `json:"entities"`
} `json:"divisions"`
ExternalTag string `json:"externalTag"`
Id string `json:"id"`
Participants []struct {
Address string `json:"address"`
Attributes map[string]any `json:"attributes"`
Calls []struct {
AfterCallWorkRequired bool `json:"afterCallWorkRequired"`
Confined bool `json:"confined"`
ConnectedTime string `json:"connectedTime"`
Direction string `json:"direction"`
DisconnectReasons []struct{} `json:"disconnectReasons"`
DisconnectType string `json:"disconnectType"`
DisconnectedTime string `json:"disconnectedTime"`
Held bool `json:"held"`
Id string `json:"id"`
InitialState string `json:"initialState"`
Muted bool `json:"muted"`
Other map[string]any `json:"other"`
PeerId string `json:"peerId"`
Provider string `json:"provider"`
Recording bool `json:"recording"`
RecordingState string `json:"recordingState"`
SecurePause bool `json:"securePause"`
Self map[string]any `json:"self"`
State string `json:"state"`
} `json:"calls"`
ConnectedTime string `json:"connectedTime"`
EndTime string `json:"endTime"`
ExternalContactId string `json:"externalContactId"`
ExternalContactInitialDivisionId string `json:"externalContactInitialDivisionId"`
Id string `json:"id"`
MediaRoles []string `json:"mediaRoles"`
Name string `json:"name"`
Purpose string `json:"purpose"`
QueueId string `json:"queueId"`
Wrapup map[string]any `json:"wrapup"`
WrapupExpected bool `json:"wrapupExpected"`
WrapupRequired bool `json:"wrapupRequired"`
} `json:"participants"`
RecentTransfers []map[string]any `json:"recentTransfers"`
RecordingState string `json:"recordingState"`
SecurePause bool `json:"securePause"`
UtilizationLabelId string `json:"utilizationLabelId"`
}

View File

@@ -0,0 +1,23 @@
package models
import (
"time"
)
type InterpreterAttempt struct {
InterpreterConversationId string `gorm:"primaryKey;index"`
InterpreterResponseTime time.Time
InterpreterAccepted bool
InterpreterId int `gorm:"index"`
CallType string
CallConnected string
ClientConversationId string `gorm:"index"`
LanguageId int
InterpreterPhone string
ConversationStart time.Time
ConversationEnd time.Time
}
func (InterpreterAttempt) TableName() string {
return "gc_interpreter_attempts"
}

View File

@@ -0,0 +1,22 @@
package models
import (
"time"
)
type InterpreterConnection struct {
InterpreterConversationId string `gorm:"primaryKey;index"`
InterpreterAccepted bool
InterpreterId int `gorm:"index"`
CallType string
CallConnected string
ClientConversationId string `gorm:"index"`
LanguageId int
InterpreterPhone string
ConferenceStart time.Time
ConferenceEnd time.Time
}
func (InterpreterConnection) TableName() string {
return "gc_interpreter_connections"
}

View File

@@ -20,6 +20,8 @@ type DBParticipant struct {
Wrapup *string `gorm:"type:json"` Wrapup *string `gorm:"type:json"`
WrapupExpected *bool WrapupExpected *bool
WrapupRequired *bool WrapupRequired *bool
Sessions []DBSession `gorm:"foreignKey:ParticipantId;references:Id"`
} }
func (DBParticipant) TableName() string { func (DBParticipant) TableName() string {

45
models/processed.go Normal file
View File

@@ -0,0 +1,45 @@
package models
import (
"time"
)
type Processed struct {
ClientConversationId string `gorm:"index"`
InterpreterConversationId string `gorm:"primaryKey;index"`
CallType string `gorm:"index"`
GenderPreference string
LanguageId int
ClientId int `gorm:"index"`
CustomerDnis string
CustomerAni string
InterpreterId int
SearchStartTime time.Time `gorm:"index"`
ClientIndex int
NesIndex int
P2ConnectTimeUtc time.Time `gorm:"index"`
P2DisconnectTimeUtc time.Time `gorm:"index"`
P1ConnectTimeUtc time.Time `gorm:"index"`
P1DisconnectTimeUtc time.Time `gorm:"index"`
P3ConnectTimeUtc *time.Time
P3DisconnectTimeUtc *time.Time
BookingRequestNumber *int `gorm:"index"`
IvrData *int
UtsEntries int
InterpreterCount int
Flags *string `gorm:"type:json"`
Metadata *string `gorm:"type:json"`
// Client data
ClientCrmData string `gorm:"type:json"`
InvoiceConfigCrmData string `gorm:"type:json"`
LanguageCrmData string `gorm:"type:json"`
InterpreterCrmData string `gorm:"type:json"`
LanguageLookupCrmData string `gorm:"type:json"`
VicTimezoneData string `gorm:"type:json"`
NzTimezoneData string `gorm:"type:json"`
LocalTimezoneData string `gorm:"type:json"`
}
func (Processed) TableName() string {
return "gc_processed"
}

View File

@@ -7,6 +7,7 @@ type DBQueueLog struct {
ConversationId string `gorm:"primaryKey"` ConversationId string `gorm:"primaryKey"`
Start time.Time `gorm:"index"` Start time.Time `gorm:"index"`
End time.Time `gorm:"index"` End time.Time `gorm:"index"`
Duration float64
Result string `gorm:"type:json"` Result string `gorm:"type:json"`
} }

View File

@@ -1,171 +1,27 @@
package models package models
type AnalyticsConversationWithAttributesQuery struct { import "time"
Conversations []AnalyticsConversationWithAttributes `json:"conversations"`
Cursor *string `json:"cursor"` type GCRaw struct {
ClientConversationId string
InterpreterConversationId string
LanguageId int
CallType string
GenderPreference string
ClientId int
CustomerDnis string
CustomerAni string
ClientConnectTimeUtc *time.Time
ClientDisconnectTimeUtc *time.Time
NesConnectTimeUtc *time.Time
NesDisconnectTimeUtc *time.Time
BookingReference *int
IvrData *int
InterpreterId int
InterpreterConnectTimeUtc time.Time
InterpreterDisconnectTimeUtc time.Time
} }
type AnalyticsConversationWithAttributes struct { func (GCRaw) TableName() string {
ConversationEnd string `json:"conversationEnd"` return "gc_raw"
ConversationId string `json:"conversationId"`
ConversationStart string `json:"conversationStart"`
DivisionIds []string `json:"divisionIds"`
ExternalTag string `json:"externalTag"`
MediaStatsMinConversationMos float32 `json:"mediaStatsMinConversationMos"`
MediaStatsMinConversationRFactor float32 `json:"mediaStatsMinConversationRFactor"`
OriginatingDirection string `json:"originatingDirection"`
Participants []struct {
ExternalContactId string `json:"externalContactId"`
ParticipantId string `json:"participantId"`
ParticipantName string `json:"participantName"`
Purpose string `json:"purpose"`
Sessions []struct {
ANI string `json:"ani"`
Direction string `json:"direction"`
DNIS string `json:"dnis"`
EdgeId string `json:"edgeId"`
MediaType string `json:"mediaType"`
ProtocolCallId string `json:"protocolCallId"`
Provider string `json:"provider"`
Recording bool `json:"recording"`
RemoteNameDisplayable string `json:"remoteNameDisplayable"`
SessionDnis string `json:"sessionDnis"`
SessionId string `json:"sessionId"`
MediaEndpointStats []struct {
Codecs []string `json:"codecs"`
EventTime string `json:"eventTime"`
MaxLatencyMs int `json:"maxLatencyMs"`
MinMos float32 `json:"minMos"`
MinRFactor float32 `json:"minRFactor"`
ReceivedPackets int `json:"receivedPackets"`
} `json:"mediaEndpointStats"`
Metrics []struct {
EmitDate string `json:"emitDate"`
Name string `json:"name"`
Value int `json:"value"`
} `json:"metrics"`
Segments []struct {
Conference bool `json:"conference"`
DisconnectType string `json:"disconnectType"`
Q850ResponseCodes []int `json:"q850ResponseCodes"`
SegmentEnd string `json:"segmentEnd"`
SegmentStart string `json:"segmentStart"`
SegmentType string `json:"segmentType"`
WrapUpCode string `json:"wrapUpCode"`
} `json:"segments"`
} `json:"sessions"`
Attributes map[string]any `json:"attributes"`
} `json:"participants"`
}
type AnalyticsConversationWithoutAttributesQuery struct {
Conversations []AnalyticsConversationWithoutAttributes `json:"conversations"`
TotalHits int `json:"totalHits"`
}
type AnalyticsConversationWithoutAttributes struct {
ConversationId string `json:"conversationId"`
ConversationStart string `json:"conversationStart"`
ConversationEnd string `json:"conversationEnd"`
MediaStatsMinConversationMos float32 `json:"mediaStatsMinConversationMos"`
MediaStatsMinConversationRFactor float32 `json:"mediaStatsMinConversationRFactor"`
OriginatingDirection string `json:"originatingDirection"`
DivisionIds []string `json:"divisionIds"`
Participants []struct {
ParticipantId string `json:"participantId"`
ParticipantName string `json:"participantName"`
Purpose string `json:"purpose"`
ExternalContactId string `json:"externalContactId"`
Sessions []struct {
MediaType string `json:"mediaType"`
SessionId string `json:"sessionId"`
ANI string `json:"ani"`
Direction string `json:"direction"`
DNIS string `json:"dnis"`
SessionDNIS string `json:"sessionDnis"`
EdgeId string `json:"edgeId"`
RemoteNameDisplayable string `json:"remoteNameDisplayable"`
Segments []struct {
SegmentStart string `json:"segmentStart"`
SegmentEnd string `json:"segmentEnd"`
WrapUpCode string `json:"wrapUpCode"`
DisconnectType string `json:"disconnectType"`
SegmentType string `json:"SegmentType"`
Q850ResponseCodes []int `json:"q850ResponseCodes"`
Conference bool `json:"conference"`
} `json:"segments"`
Metrics []struct {
Name string `json:"name"`
Value int `json:"value"`
EmitDate string `json:"emitDate"`
} `json:"metrics"`
MediaEndpointStats []struct {
Codecs []string `json:"codecs"`
MinMos float32 `json:"minMos"`
MinRFactor float32 `json:"minRFactor"`
MaxLatencyMs int `json:"maxLatencyMs"`
ReceivedPackets int `json:"receivedPackets"`
} `json:"mediaEndpointStats"`
Recording bool `json:"recording"`
ProtocolCallId string `json:"protocolCallId"`
Provider string `json:"provider"`
} `json:"sessions"`
} `json:"participants"`
}
type NotificationConversationWithAttributes struct {
Address string `json:"address"`
Divisions []struct {
Division struct {
Id string `json:"id"`
SelfUri string `json:"selfUri"`
} `json:"division"`
Entities []struct {
DateDivisionUpdated string `json:"dateDivisionUpdated"`
Id string `json:"id"`
SelfUri string `json:"selfUri"`
} `json:"entities"`
} `json:"divisions"`
ExternalTag string `json:"externalTag"`
Id string `json:"id"`
Participants []struct {
Address string `json:"address"`
Attributes map[string]any `json:"attributes"`
Calls []struct {
AfterCallWorkRequired bool `json:"afterCallWorkRequired"`
Confined bool `json:"confined"`
ConnectedTime string `json:"connectedTime"`
Direction string `json:"direction"`
DisconnectReasons []struct{} `json:"disconnectReasons"`
DisconnectType string `json:"disconnectType"`
DisconnectedTime string `json:"disconnectedTime"`
Held bool `json:"held"`
Id string `json:"id"`
InitialState string `json:"initialState"`
Muted bool `json:"muted"`
Other map[string]any `json:"other"`
PeerId string `json:"peerId"`
Provider string `json:"provider"`
Recording bool `json:"recording"`
RecordingState string `json:"recordingState"`
SecurePause bool `json:"securePause"`
Self map[string]any `json:"self"`
State string `json:"state"`
} `json:"calls"`
ConnectedTime string `json:"connectedTime"`
EndTime string `json:"endTime"`
ExternalContactId string `json:"externalContactId"`
ExternalContactInitialDivisionId string `json:"externalContactInitialDivisionId"`
Id string `json:"id"`
MediaRoles []string `json:"mediaRoles"`
Name string `json:"name"`
Purpose string `json:"purpose"`
QueueId string `json:"queueId"`
Wrapup map[string]any `json:"wrapup"`
WrapupExpected bool `json:"wrapupExpected"`
WrapupRequired bool `json:"wrapupRequired"`
} `json:"participants"`
RecentTransfers []map[string]any `json:"recentTransfers"`
RecordingState string `json:"recordingState"`
SecurePause bool `json:"securePause"`
UtilizationLabelId string `json:"utilizationLabelId"`
} }

View File

@@ -15,6 +15,9 @@ type DBSession struct {
Recording bool Recording bool
RemoteNameDisplayable string RemoteNameDisplayable string
SessionDnis string SessionDnis string
Flow string `gorm:"type:json"`
Segments []DBSegment `gorm:"foreignKey:SessionId;references:Id"`
} }
func (DBSession) TableName() string { func (DBSession) TableName() string {

67
models/ticket.go Normal file
View File

@@ -0,0 +1,67 @@
package models
import "time"
type Ticket struct {
TicketID string `gorm:"primaryKey;column:ticket_id" json:"ticket_id"`
TicketReferenceID *string `gorm:"column:ticket_reference_id" json:"ticket_reference_id"`
DepartmentID *string `gorm:"column:department_id" json:"department_id"`
AccountID *string `gorm:"column:account_id" json:"account_id"`
ContactID *string `gorm:"column:contact_id" json:"contact_id"`
Email *string `gorm:"column:email" json:"email"`
Phone *string `gorm:"column:phone" json:"phone"`
Subject *string `gorm:"column:subject" json:"subject"`
Description *string `gorm:"column:description" json:"description"`
Status *string `gorm:"column:status" json:"status"`
ProductID *string `gorm:"column:product_id" json:"product_id"`
TicketOwnerID *string `gorm:"column:ticket_owner_id" json:"ticket_owner_id"`
CreatedBy *string `gorm:"column:created_by" json:"created_by"`
ModifiedBy *string `gorm:"column:modified_by" json:"modified_by"`
CreatedTime *time.Time `gorm:"column:created_time" json:"created_time"`
OnHoldTime *time.Time `gorm:"column:on_hold_time" json:"on_hold_time"`
ClosedTime *time.Time `gorm:"column:closed_time" json:"closed_time"`
ModifiedTime *time.Time `gorm:"column:modified_time" json:"modified_time"`
TeamID *string `gorm:"column:team_id" json:"team_id"`
DueDate *time.Time `gorm:"column:due_date" json:"due_date"`
Tags *string `gorm:"column:tags" json:"tags"`
Priority *string `gorm:"column:priority" json:"priority"`
IsOverdue *bool `gorm:"column:is_overdue" json:"is_overdue"`
IsEscalated *bool `gorm:"column:is_escalated" json:"is_escalated"`
Classification *string `gorm:"column:classification" json:"classification"`
Resolution *string `gorm:"column:resolution" json:"resolution"`
TimeToRespond *int `gorm:"column:time_to_respond" json:"time_to_respond"`
Category *string `gorm:"column:category" json:"category"`
Subcategory *string `gorm:"column:subcategory" json:"subcategory"`
Subclassification *string `gorm:"column:subclassification" json:"subclassification"`
BookingNumber *int `gorm:"column:booking_number" json:"booking_number"`
CostCode *string `gorm:"column:cost_code" json:"cost_code"`
LanguageRequired *string `gorm:"column:language_required" json:"language_required"`
TimeZone *string `gorm:"column:time_zone" json:"time_zone"`
DeliveryMethod *string `gorm:"column:delivery_method" json:"delivery_method"`
DurationInMinutes *int `gorm:"column:duration_in_minutes" json:"duration_in_minutes"`
InterpreterID *int `gorm:"column:interpreter_id" json:"interpreter_id"`
InterpreterEmail *string `gorm:"column:interpreter_email" json:"interpreter_email"`
InterpreterName *string `gorm:"column:interpreter_name" json:"interpreter_name"`
ClientID *int `gorm:"column:client_id" json:"client_id"`
ClientName *string `gorm:"column:client_name" json:"client_name"`
InterpreterNaati *int `gorm:"column:interpreter_naati" json:"interpreter_naati"`
SecondaryInterpreterID *int `gorm:"column:secondary_interpreter_id" json:"secondary_interpreter_id"`
PayCycle *int `gorm:"column:pay_cycle" json:"pay_cycle"`
BookingTime *time.Time `gorm:"column:booking_time" json:"booking_time"`
BillingGroup *string `gorm:"column:billing_group" json:"billing_group"`
VideoLink *string `gorm:"column:video_link" json:"video_link"`
ConversationID *string `gorm:"column:conversation_id" json:"conversation_id"`
DNIS *string `gorm:"column:dnis" json:"dnis"`
ClientAgentName *string `gorm:"column:client_agent_name" json:"client_agent_name"`
ClientAgentPhone *string `gorm:"column:client_agent_phone" json:"client_agent_phone"`
ClientAgentEmail *string `gorm:"column:client_agent_email" json:"client_agent_email"`
BillingCode *string `gorm:"column:billing_code" json:"billing_code"`
MBIEFeedback *string `gorm:"column:mbie_feedback" json:"mbie_feedback"`
BookingComments *string `gorm:"column:booking_comments" json:"booking_comments"`
AdditionalPrebookingInformation *string `gorm:"column:additional_prebooking_information" json:"additional_prebooking_information"`
ForceUpdate *bool `gorm:"column:force_update" json:"force_update"`
}
func (Ticket) TableName() string {
return "live_tickets"
}

View File

@@ -33,8 +33,6 @@ func ExtractWithoutAttributes(base models.AnalyticsConversationWithoutAttributes
} }
divisionIdsBytesStr := string(divisionIdsBytes) divisionIdsBytesStr := string(divisionIdsBytes)
currentTime := time.Now()
conversation := models.DBConversation{ conversation := models.DBConversation{
DivisionIds: &divisionIdsBytesStr, DivisionIds: &divisionIdsBytesStr,
End: endTime, End: endTime,
@@ -43,7 +41,6 @@ func ExtractWithoutAttributes(base models.AnalyticsConversationWithoutAttributes
MinRFactor: &base.MediaStatsMinConversationRFactor, MinRFactor: &base.MediaStatsMinConversationRFactor,
OriginatingDirection: &base.OriginatingDirection, OriginatingDirection: &base.OriginatingDirection,
Start: startTime, Start: startTime,
SemiLiveUpdate: &currentTime,
} }
var participants []models.DBParticipant var participants []models.DBParticipant
var sessions []models.DBSession var sessions []models.DBSession
@@ -73,6 +70,11 @@ func ExtractWithoutAttributes(base models.AnalyticsConversationWithoutAttributes
metricsBytes = nil metricsBytes = nil
} }
flowBytes, err := json.Marshal(sess.Flow)
if err != nil {
flowBytes = nil
}
session := models.DBSession{ session := models.DBSession{
Ani: sess.ANI, Ani: sess.ANI,
Direction: sess.Direction, Direction: sess.Direction,
@@ -88,6 +90,7 @@ func ExtractWithoutAttributes(base models.AnalyticsConversationWithoutAttributes
Recording: sess.Recording, Recording: sess.Recording,
RemoteNameDisplayable: sess.RemoteNameDisplayable, RemoteNameDisplayable: sess.RemoteNameDisplayable,
SessionDnis: sess.SessionDNIS, SessionDnis: sess.SessionDNIS,
Flow: string(flowBytes),
} }
sessions = append(sessions, session) sessions = append(sessions, session)
@@ -116,7 +119,7 @@ func ExtractWithoutAttributes(base models.AnalyticsConversationWithoutAttributes
SegmentEnd: segmentEnd, SegmentEnd: segmentEnd,
SegmentStart: segmentStart, SegmentStart: segmentStart,
SegmentType: seg.SegmentType, SegmentType: seg.SegmentType,
SessionId: sess.SessionId, SessionId: session.Id,
WrapUpCode: seg.WrapUpCode, WrapUpCode: seg.WrapUpCode,
} }
@@ -129,7 +132,6 @@ func ExtractWithoutAttributes(base models.AnalyticsConversationWithoutAttributes
} }
func ExtractLive(base models.NotificationConversationWithAttributes) (models.DBConversation, []models.DBParticipant, []models.DBCall) { func ExtractLive(base models.NotificationConversationWithAttributes) (models.DBConversation, []models.DBParticipant, []models.DBCall) {
currentTime := time.Now()
conversation := models.DBConversation{ conversation := models.DBConversation{
Id: base.Id, Id: base.Id,
@@ -138,7 +140,6 @@ func ExtractLive(base models.NotificationConversationWithAttributes) (models.DBC
RecordingState: &base.RecordingState, RecordingState: &base.RecordingState,
SecurePause: &base.SecurePause, SecurePause: &base.SecurePause,
UtilizationLabelId: &base.UtilizationLabelId, UtilizationLabelId: &base.UtilizationLabelId,
LiveUpdate: &currentTime,
} }
var participants []models.DBParticipant var participants []models.DBParticipant
@@ -260,128 +261,125 @@ func ExtractLive(base models.NotificationConversationWithAttributes) (models.DBC
} }
func ExtractWithAttributes(base models.AnalyticsConversationWithAttributes) (models.DBConversation, []models.DBParticipant, []models.DBSession, []models.DBSegment) { //func ExtractWithAttributes(base models.AnalyticsConversationWithAttributes) (models.DBConversation, []models.DBParticipant, []models.DBSession, []models.DBSegment) {
//
var startTime *time.Time // var startTime *time.Time
parsedStartTime, err := time.Parse(time.RFC3339, base.ConversationStart) // parsedStartTime, err := time.Parse(time.RFC3339, base.ConversationStart)
if err != nil { // if err != nil {
startTime = nil // startTime = nil
} else { // } else {
startTime = &parsedStartTime // startTime = &parsedStartTime
} // }
//
var endTime *time.Time // var endTime *time.Time
parsedEndTime, err := time.Parse(time.RFC3339, base.ConversationEnd) // parsedEndTime, err := time.Parse(time.RFC3339, base.ConversationEnd)
if err != nil { // if err != nil {
endTime = nil // endTime = nil
} else { // } else {
endTime = &parsedEndTime // endTime = &parsedEndTime
} // }
//
divisionIdsBytes, err := json.Marshal(base.DivisionIds) // divisionIdsBytes, err := json.Marshal(base.DivisionIds)
if err != nil { // if err != nil {
divisionIdsBytes = nil // divisionIdsBytes = nil
} // }
divisionIdsBytesStr := string(divisionIdsBytes) // divisionIdsBytesStr := string(divisionIdsBytes)
//
currentTime := time.Now() // conversation := models.DBConversation{
// DivisionIds: &divisionIdsBytesStr,
conversation := models.DBConversation{ // End: endTime,
DivisionIds: &divisionIdsBytesStr, // Id: base.ConversationId,
End: endTime, // MinMos: &base.MediaStatsMinConversationMos,
Id: base.ConversationId, // MinRFactor: &base.MediaStatsMinConversationRFactor,
MinMos: &base.MediaStatsMinConversationMos, // OriginatingDirection: &base.OriginatingDirection,
MinRFactor: &base.MediaStatsMinConversationRFactor, // Start: startTime,
OriginatingDirection: &base.OriginatingDirection, // }
Start: startTime, // var participants []models.DBParticipant
JobUpdate: &currentTime, // var sessions []models.DBSession
} // var segments []models.DBSegment
var participants []models.DBParticipant //
var sessions []models.DBSession // for _, p := range base.Participants {
var segments []models.DBSegment //
// attributesBytes, err := json.Marshal(p.Attributes)
for _, p := range base.Participants { // if err != nil {
// attributesBytes = nil
attributesBytes, err := json.Marshal(p.Attributes) // }
if err != nil { // attributesBytesStr := string(attributesBytes)
attributesBytes = nil //
} // participant := models.DBParticipant{
attributesBytesStr := string(attributesBytes) // ConnectedTime: nil,
// ConversationId: base.ConversationId,
participant := models.DBParticipant{ // EndTime: nil,
ConnectedTime: nil, // ExternalContactId: &p.ExternalContactId,
ConversationId: base.ConversationId, // Id: p.ParticipantId,
EndTime: nil, // Name: &p.ParticipantName,
ExternalContactId: &p.ExternalContactId, // Purpose: &p.Purpose,
Id: p.ParticipantId, // Attributes: &attributesBytesStr,
Name: &p.ParticipantName, // }
Purpose: &p.Purpose, // participants = append(participants, participant)
Attributes: &attributesBytesStr, //
} // for _, sess := range p.Sessions {
participants = append(participants, participant) // mediaEndpointStatsBytes, err := json.Marshal(sess.MediaEndpointStats)
// if err != nil {
for _, sess := range p.Sessions { // mediaEndpointStatsBytes = nil
mediaEndpointStatsBytes, err := json.Marshal(sess.MediaEndpointStats) // }
if err != nil { //
mediaEndpointStatsBytes = nil // metricsBytes, err := json.Marshal(sess.Metrics)
} // if err != nil {
// metricsBytes = nil
metricsBytes, err := json.Marshal(sess.Metrics) // }
if err != nil { //
metricsBytes = nil // session := models.DBSession{
} // Ani: sess.ANI,
// Direction: sess.Direction,
session := models.DBSession{ // Dnis: sess.DNIS,
Ani: sess.ANI, // EdgeId: sess.EdgeId,
Direction: sess.Direction, // Id: fmt.Sprintf("%s_%s", p.ParticipantId, sess.SessionId),
Dnis: sess.DNIS, // MediaEndpointStats: string(mediaEndpointStatsBytes),
EdgeId: sess.EdgeId, // MediaType: sess.MediaType,
Id: fmt.Sprintf("%s_%s", p.ParticipantId, sess.SessionId), // Metrics: string(metricsBytes),
MediaEndpointStats: string(mediaEndpointStatsBytes), // ParticipantId: p.ParticipantId,
MediaType: sess.MediaType, // ProtocolCallId: sess.ProtocolCallId,
Metrics: string(metricsBytes), // Provider: sess.Provider,
ParticipantId: p.ParticipantId, // Recording: sess.Recording,
ProtocolCallId: sess.ProtocolCallId, // RemoteNameDisplayable: sess.RemoteNameDisplayable,
Provider: sess.Provider, // SessionDnis: sess.SessionDnis,
Recording: sess.Recording, // }
RemoteNameDisplayable: sess.RemoteNameDisplayable, // sessions = append(sessions, session)
SessionDnis: sess.SessionDnis, //
} // for _, seg := range sess.Segments {
sessions = append(sessions, session) //
// segmentStart, err := time.Parse(time.RFC3339, seg.SegmentStart)
for _, seg := range sess.Segments { // if err != nil {
// segmentStart = time.Now()
segmentStart, err := time.Parse(time.RFC3339, seg.SegmentStart) // }
if err != nil { //
segmentStart = time.Now() // segmentEnd, err := time.Parse(time.RFC3339, seg.SegmentEnd)
} // if err != nil {
// segmentEnd = time.Now()
segmentEnd, err := time.Parse(time.RFC3339, seg.SegmentEnd) // }
if err != nil { //
segmentEnd = time.Now() // q850ResponseCodesBytes, err := json.Marshal(seg.Q850ResponseCodes)
} // if err != nil {
// q850ResponseCodesBytes = nil
q850ResponseCodesBytes, err := json.Marshal(seg.Q850ResponseCodes) // }
if err != nil { //
q850ResponseCodesBytes = nil // segment := models.DBSegment{
} // Id: fmt.Sprintf("%s_%s", session.Id, seg.SegmentType),
// Conference: seg.Conference,
segment := models.DBSegment{ // DisconnectType: seg.DisconnectType,
Id: fmt.Sprintf("%s_%s", session.Id, seg.SegmentType), // Q850ResponseCodes: string(q850ResponseCodesBytes),
Conference: seg.Conference, // SegmentEnd: segmentEnd,
DisconnectType: seg.DisconnectType, // SegmentStart: segmentStart,
Q850ResponseCodes: string(q850ResponseCodesBytes), // SegmentType: seg.SegmentType,
SegmentEnd: segmentEnd, // SessionId: sess.SessionId,
SegmentStart: segmentStart, // WrapUpCode: seg.WrapUpCode,
SegmentType: seg.SegmentType, // }
SessionId: sess.SessionId, //
WrapUpCode: seg.WrapUpCode, // segments = append(segments, segment)
} // }
// }
segments = append(segments, segment) // }
} //
} // return conversation, participants, sessions, segments
} //}
return conversation, participants, sessions, segments
}