Compare commits

...

21 Commits

Author SHA1 Message Date
1bb7661f94 Changed the segment indexing format. If things turn to shit, rollback to before this push. 2025-10-27 11:52:45 +11:00
79bea9002e Added index to requested_at amendments 2025-10-24 09:27:34 +11:00
0e72fa1355 Added Metrics model 2025-10-23 18:04:48 +11:00
db89056468 Added BeforeSave 2025-10-23 17:02:52 +11:00
567470372f askilhdfjasdgf 2025-10-23 16:59:06 +11:00
674f7dd5f5 asdnfujklsreghyiujlfhhsdrlgkif 2025-10-23 16:55:59 +11:00
f50333d223 Made user nullable in participant 2025-10-23 16:44:56 +11:00
a7f73eb96a Fixed typo 2025-10-23 16:32:18 +11:00
57b4791a4a Fixed typo 2025-10-23 16:30:35 +11:00
7737b8b4d2 Added tablename for GC users 2025-10-23 16:01:34 +11:00
2f2388caab Added Calls to Participant via FK. Added User to Participant via FK. 2025-10-23 15:54:46 +11:00
ff0f873dd8 Added GCUser 2025-10-23 15:41:44 +11:00
7bf15cce48 Added UserId to participant model 2025-10-19 19:16:41 +11:00
643c5cc695 Changed breakdown to use a composite PK 2025-10-19 15:16:45 +11:00
8b2b31ef3f Added call breakdown model 2025-10-19 15:02:27 +11:00
423383a2f8 Update invoice_config rounding_function from bool -> str 2025-10-10 09:51:00 +11:00
00b946fc8d Fixed issue setting startTime as endTime 2025-09-18 15:07:09 +10:00
4e5f789671 Made conversation start/end optional 2025-09-18 10:19:07 +10:00
ee521aa378 Added conv start/end to call stats 2025-09-18 10:05:14 +10:00
c106209130 Added sub-status to callstats 2025-09-11 14:05:25 +10:00
4c6eed2e47 Split out interpreter_count in CallStats model 2025-09-11 09:23:03 +10:00
7 changed files with 106 additions and 30 deletions

View File

@@ -8,7 +8,7 @@ type DBAmendment struct {
AmendmentColumn string AmendmentColumn string
AmendmentValue string AmendmentValue string
Requestor string Requestor string
RequestedAt time.Time RequestedAt time.Time `gorm:"index"`
Sequence string Sequence string
} }

View File

@@ -23,8 +23,8 @@ type CrmInvoiceConfig struct {
PartnerAudioBookingBH *string `gorm:"column:partner_audio_booking_bh" json:"partner_audio_booking_bh"` 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"` 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"` PartnerVideoBookingBH *string `gorm:"column:partner_video_booking_bh" json:"partner_video_booking_bh"`
RoundingFunction *string `gorm:"column:rounding_function" json:"rounding_function"`
RoundBookings *bool `gorm:"column:round_bookings" json:"round_bookings"` 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"` SplitBookings *bool `gorm:"column:split_bookings" json:"split_bookings"`
SplitOnDemand *bool `gorm:"column:split_on_demand" json:"split_on_demand"` SplitOnDemand *bool `gorm:"column:split_on_demand" json:"split_on_demand"`
} }

View File

@@ -62,27 +62,69 @@ func (InterpreterConnection) TableName() string {
} }
type CallStat struct { type CallStat struct {
ClientConversationId string `gorm:"primaryKey;index"` ClientConversationId string `gorm:"primaryKey;index"`
CallType string `gorm:"index"` CallType string `gorm:"index"`
ClientId int `gorm:"index"` ClientId int `gorm:"index"`
CustomerDnis string CustomerDnis string
CustomerAni string CustomerAni string
SearchStartTime *time.Time ConversationStart *time.Time `gorm:"index"`
P1ConnectTime time.Time `gorm:"index"` ConversationEnd *time.Time `gorm:"index"`
P1DisconnectTime time.Time `gorm:"index"` SearchStartTime *time.Time
BookingRequestNumber *int `gorm:"index"` P1ConnectTime time.Time `gorm:"index"`
UtsQueue bool P1DisconnectTime time.Time `gorm:"index"`
InterpreterCount int BookingRequestNumber *int `gorm:"index"`
InterpreterConnected bool UtsQueue bool
ClientDisconnected bool InterpreterAcceptedCount int
UtsDuration int InterpreterAccepted bool
UtsEntries int InterpreterConnectedCount int
Status string InterpreterConnected bool
FirstLanguageId int ClientDisconnected bool
LastLanguageId int UtsDuration int
FirstInterpreter string UtsEntries int
Status string
SubStatus string
FirstLanguageId int
LastLanguageId int
FirstInterpreter string
} }
func (CallStat) TableName() string { func (CallStat) TableName() string {
return "gc_call_stats" return "gc_call_stats"
} }
type Breakdown struct {
ClientConversationId string `gorm:"primaryKey;index"`
InterpreterConversationId string `gorm:"index"`
Timestamp time.Time `gorm:"primaryKey;index"`
Task string `gorm:"primaryKey"`
Duration int
Message string
Metadata *string `gorm:"type:json"`
}
func (Breakdown) TableName() string {
return "gc_call_breakdown"
}
type CallMetrics struct {
ClientConversationId string `gorm:"primaryKey;index"`
//
TotalDuration int
TotalClientResponseDuration int
TotalSystemDuration int
TotalTalkDuration int
//
AgentAlertDuration int
AgentHoldDuration int
AgentTalkDuration int
//
SearchingDuration int
ConfigurationDuration int
QueueDuration int
//
Metadata *string `gorm:"type:json"`
}
func (CallMetrics) TableName() string {
return "gc_call_metrics"
}

View File

@@ -72,6 +72,7 @@ type AnalyticsConversationWithoutAttributes struct {
DivisionIds []string `json:"divisionIds"` DivisionIds []string `json:"divisionIds"`
Participants []struct { Participants []struct {
ParticipantId string `json:"participantId"` ParticipantId string `json:"participantId"`
UserId string `json:"userId"`
ParticipantName string `json:"participantName"` ParticipantName string `json:"participantName"`
Purpose string `json:"purpose"` Purpose string `json:"purpose"`
ExternalContactId string `json:"externalContactId"` ExternalContactId string `json:"externalContactId"`
@@ -183,3 +184,22 @@ type NotificationConversationWithAttributes struct {
SecurePause bool `json:"securePause"` SecurePause bool `json:"securePause"`
UtilizationLabelId string `json:"utilizationLabelId"` UtilizationLabelId string `json:"utilizationLabelId"`
} }
type UsersQuery struct {
Entities []GCUser `json:"entities"`
PageSize int `json:"pageSize"`
Total int `json:"total"`
}
type GCUser struct {
Id string `json:"id" gorm:"primaryKey"`
Name string `json:"name"`
Email string `json:"email"`
State string `json:"state"`
Username string `json:"username"`
AcdAutoAnswer bool `json:"acdAutoAnswer"`
}
func (GCUser) TableName() string {
return "gc_users"
}

View File

@@ -2,6 +2,8 @@ package models
import ( import (
"time" "time"
"gorm.io/gorm"
) )
type DBParticipant struct { type DBParticipant struct {
@@ -17,13 +19,24 @@ type DBParticipant struct {
Name *string `gorm:"index"` Name *string `gorm:"index"`
Purpose *string `gorm:"index"` Purpose *string `gorm:"index"`
QueueId *string QueueId *string
UserId *string
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"` Sessions []DBSession `gorm:"foreignKey:ParticipantId;references:Id"`
Calls []DBCall `gorm:"foreignKey:ParticipantId;references:Id"`
User *GCUser `gorm:"foreignKey:UserId;references:Id"`
} }
func (DBParticipant) TableName() string { func (DBParticipant) TableName() string {
return "gc_participants" return "gc_participants"
} }
func (p *DBParticipant) BeforeSave(tx *gorm.DB) error {
// Convert empty string to nil
if p.UserId != nil && *p.UserId == "" {
p.UserId = nil
}
return nil
}

View File

@@ -20,7 +20,7 @@ type DBClientProcessed struct {
// --- // ---
BuggedCall bool BuggedCall bool
Amended bool Amended bool
CreatedAt time.Time CreatedAt time.Time `gorm:"autoCreateTime"`
ModifiedAt time.Time ModifiedAt time.Time
CustomData *string `gorm:"type:json"` CustomData *string `gorm:"type:json"`
InternalUse *string `gorm:"type:json"` InternalUse *string `gorm:"type:json"`
@@ -85,7 +85,7 @@ type DBInterpreterProcessed struct {
// --- // ---
BuggedCall bool BuggedCall bool
Amended bool Amended bool
CreatedAt time.Time CreatedAt time.Time `gorm:"autoCreateTime"`
ModifiedAt time.Time ModifiedAt time.Time
CustomData *string `gorm:"type:json"` CustomData *string `gorm:"type:json"`
InternalUse *string `gorm:"type:json"` InternalUse *string `gorm:"type:json"`

View File

@@ -22,9 +22,9 @@ func ExtractWithoutAttributes(base models.AnalyticsConversationWithoutAttributes
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 {
startTime = nil endTime = nil
} else { } else {
startTime = &parsedEndTime endTime = &parsedEndTime
} }
divisionIdsBytes, err := json.Marshal(base.DivisionIds) divisionIdsBytes, err := json.Marshal(base.DivisionIds)
@@ -49,13 +49,14 @@ func ExtractWithoutAttributes(base models.AnalyticsConversationWithoutAttributes
for _, p := range base.Participants { for _, p := range base.Participants {
participant := models.DBParticipant{ participant := models.DBParticipant{
ConnectedTime: nil, // ConnectedTime: nil,
ConversationId: base.ConversationId, ConversationId: base.ConversationId,
EndTime: nil, // EndTime: nil,
ExternalContactId: &p.ExternalContactId, ExternalContactId: &p.ExternalContactId,
Id: p.ParticipantId, Id: p.ParticipantId,
Name: &p.ParticipantName, Name: &p.ParticipantName,
Purpose: &p.Purpose, Purpose: &p.Purpose,
UserId: &p.UserId,
} }
participants = append(participants, participant) participants = append(participants, participant)
@@ -94,7 +95,7 @@ func ExtractWithoutAttributes(base models.AnalyticsConversationWithoutAttributes
} }
sessions = append(sessions, session) sessions = append(sessions, session)
for _, seg := range sess.Segments { for idx, seg := range sess.Segments {
segmentStart, err := time.Parse(time.RFC3339, seg.SegmentStart) segmentStart, err := time.Parse(time.RFC3339, seg.SegmentStart)
if err != nil { if err != nil {
@@ -112,7 +113,7 @@ func ExtractWithoutAttributes(base models.AnalyticsConversationWithoutAttributes
} }
segment := models.DBSegment{ segment := models.DBSegment{
Id: fmt.Sprintf("%s_%s", session.Id, seg.SegmentType), Id: fmt.Sprintf("%s_%s_%d", session.Id, seg.SegmentType, idx),
Conference: seg.Conference, Conference: seg.Conference,
DisconnectType: seg.DisconnectType, DisconnectType: seg.DisconnectType,
Q850ResponseCodes: string(q850ResponseCodesBytes), Q850ResponseCodes: string(q850ResponseCodesBytes),