Officially documented release

This commit is contained in:
Frederick Holland 2025-11-10 10:10:46 +11:00
parent 1bb7661f94
commit 4c58351635
23 changed files with 282 additions and 214 deletions

View File

@ -2,6 +2,19 @@ package models
import "time"
// DBAmendment is used to store any changes made to interpreter or client processed calls in the database, although theoretically it could be tailored to any table, as long as the amendments queue handles the application logic..
//
// - Id is an auto-incrementing integer, with no practical application.
// - ConversationId references the conversation ID of either the client or interpreter processed call.
// - AmendmentColumn is the name of the column to be amended.
// - AmendmentValue is the value to overwrite the amendment column's existing value with.
// - Requestor is a string reference as to who created the amendment.
// - RequestedAt is the creation time of the amendment.
//
// Table Schema:
//
// Primary Key: Id
// Indexes: Id, ConversationId, RequestedAt
type DBAmendment struct {
Id int `gorm:"primaryKey;autoIncrement"`
ConversationId string `gorm:"index"`

View File

@ -1,30 +0,0 @@
package models
/*
import (
"time"
)
type BaseCall struct {
ClientConversationId string `gorm:"primaryKey;index"`
CallType string `gorm:"index"`
GenderPreference string
ClientId int `gorm:"index"`
LanguageId int
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

@ -2,6 +2,31 @@ package models
import "time"
// Booking is used to store data relating to any interpreter booking. It is the output of the bookings formatter, and contains re-maps of existing ticket data.
//
// - BookingReference is the reference number the client will use when they call in. It is also the numeric ticket ID from Zoho.
// - BookingTime is the nominated time for the booking in TODO: what timezone is BookingTime in?
// - Timezone is the customer specified timezone for the above booking time.
// - Language is the foreign language requirement from the customer.
// - CustomData contains any special customer data, typically from the cost code field in the ticket.
// - Method is the type of booking: audio, video, in-person, etc.
// - Duration is the currently specified length of the booking after any changes.
// - BookedDuration is the initially nominated length of the booking.
// - ConversationId is an optional field for a GenesysCloud conversation ID to be manually linked to the ticket.
// - CancellationTime is the optional timestamp at which the customer or agent cancelled the request for the booking.
// - InterpreterId is the 4-digit identifier of the interpreter selected for the prebooking.
// - ClientId is the 5-digit identifier of the client who placed the prebooking.
// - AgentName is the customer supplied name of the individual who requested the prebooking.
// - AgentEmail is the customer supplied email address of the individual who requested the prebooking.
// - AgentPhone is the customer supplied phone number of the individual who requested the prebooking.
// - Comments contains any additional information supplied by the individual who requested the prebooking.
// - BillingCode is an internal use field that indicates the current billing status and who should be paid/charged.
// - TicketId is the Zoho internal use ID (not to be confused with the BookingReference or ticket number).
//
// Table Schema:
//
// Primary Key: BookingReference
// Indexes: BookingReference, BookingTime, Method, ConversationId, InterpreterId, ClientId
type Booking struct {
BookingReference int `gorm:"primaryKey;index"`
BookingTime *time.Time `gorm:"index"`

View File

@ -4,6 +4,15 @@ import (
"time"
)
// DBCall is a model that stores raw 'call' payloads from GenesysCloud websockets.
//
// - The ExtractLive function handles the conversion from JSON data (map) into formatted JSON string.
//
// Table Schema:
//
// Primary Key: Id
// Indexes: ConnectedTime, DisconnectedTime, Id, ParticipantId
// JSON Fields: DisconnectReasons, Other, Self
type DBCall struct {
AfterCallWorkRequired bool
Confined bool

View File

@ -1,29 +0,0 @@
package models
/*
import (
"time"
)
type CallStat struct {
ClientConversationId string `gorm:"primaryKey;index"`
CallType string `gorm:"index"`
ClientId int `gorm:"index"`
CustomerDnis string
CustomerAni string
P1ConnectTime time.Time `gorm:"index"`
P1DisconnectTime time.Time `gorm:"index"`
BookingRequestNumber *int `gorm:"index"`
UtsQueue bool
InterpreterCount int
InterpreterConnected bool
ClientDisconnected bool
UtsDuration int
UtsEntries int
Status string
}
func (CallStat) TableName() string {
return "gc_call_stats"
}
*/

View File

@ -4,6 +4,16 @@ import (
"time"
)
// DBConversation is a model that stores raw 'conversation' payloads from GenesysCloud websockets and API requests.
//
// - The ExtractLive function handles the conversion from JSON data (map) into formatted JSON string for websocket payloads.
// - The ExtractWithoutAttributes function handles the conversion from JSON data (map) into formatted JSON string for gcq-details requests.
//
// Table Schema:
//
// Primary Key: Id
// Indexes: End, Id, Start
// JSON Fields: DivisionIds, RecentTransfers
type DBConversation struct {
Address *string
DivisionIds *string `gorm:"type:json"`

View File

@ -4,6 +4,16 @@ import (
"time"
)
// CrmClient is a model that stores Client/Account records from CRM.
//
// - The intention of the model is to map JSON -> struct -> JSON
// - To improve usability, GORM 'column' tags have been used to map CRM API names into more descriptive names.
//
// Table Schema:
//
// Primary Key: ID
// Indexes: ID
// JSON Fields: Attributes, MediaRoles, Wrapup
type CrmClient struct {
ID int `gorm:"primaryKey;column:id" json:"id"`
BillingGroupNumber *int `gorm:"column:billing_group_number" json:"billing_group_number"`

View File

@ -4,6 +4,15 @@ import (
"time"
)
// CrmInterpreter is a model that stores Interpreter records from CRM.
//
// - The intention of the model is to map JSON -> struct -> JSON
// - To improve usability, GORM 'column' tags have been used to map CRM API names into more descriptive names.
//
// Table Schema:
//
// Primary Key: ID
// Indexes: ID
type CrmInterpreter struct {
ID int `gorm:"primaryKey;column:id" json:"id"`
ABN *string `gorm:"column:abn" json:"abn"`

View File

@ -2,6 +2,15 @@ package models
import ()
// CrmInvoiceConfig is a model that stores Invoice Configuration records from CRM.
//
// - The intention of the model is to map JSON -> struct -> JSON
// - To improve usability, GORM 'column' tags have been used to map CRM API names into more descriptive names.
//
// Table Schema:
//
// Primary Key: ID
// Indexes: ID
type CrmInvoiceConfig struct {
ID string `gorm:"primaryKey;column:id" json:"id"`
Name string `gorm:"column:name;not null" json:"name"`

View File

@ -1,5 +1,14 @@
package models
// CrmLanguage is a model that stores Language records from CRM.
//
// - The intention of the model is to map JSON -> struct -> JSON
// - To improve usability, GORM 'column' tags have been used to map CRM API names into more descriptive names.
//
// Table Schema:
//
// Primary Key: ID
// Indexes: ID
type CrmLanguage struct {
ID int `gorm:"primaryKey;column:id" json:"id"`
Name *string `gorm:"column:name" json:"name"`

View File

@ -2,6 +2,15 @@ package models
import "time"
// CrmLanguageLookup is a model that stores Language Lookup records from CRM.
//
// - The intention of the model is to map JSON -> struct -> JSON
// - To improve usability, GORM 'column' tags have been used to map CRM API names into more descriptive names.
//
// Table Schema:
//
// Primary Key: ID
// Indexes: ID
type CrmLanguageLookup struct {
ID string `gorm:"primaryKey;column:id" json:"id"`
Language *string `gorm:"column:language" json:"language"`

View File

@ -1,5 +1,14 @@
package models
// CrmPaymentConfig is a model that stores Payment Configuration records from CRM.
//
// - The intention of the model is to map JSON -> struct -> JSON
// - To improve usability, GORM 'column' tags have been used to map CRM API names into more descriptive names.
//
// Table Schema:
//
// Primary Key: ID
// Indexes: ID
type CrmPaymentConfig struct {
ID string `gorm:"primaryKey;column:id" json:"id"`
Name string `gorm:"column:name;not null" json:"name"`

View File

@ -2,6 +2,25 @@ package models
import "time"
/*
All structs/models within this file are used by the gcq-formatter queue.
Specific definitions as to what each model is used for should be found in the gcq-formatter documentation.
The following file contains just a brief overview, and any documentation on gorm_models itself should reference that the specifics are also stored in gcq-formatter docs.
*/
// BaseCall is used to store data on a client's attempt to create a billable record.
//
// This struct is part of the three primary components used for creating billable records:
// - BaseCall
// - InterpreterAttempt
// - InterpreterConnection
//
// It is eventually merged with the other two to create a 'full' billing record that we can derive a $ amount from.
//
// Table Schema:
//
// Primary Key: ClientConversationId
// Indexes: ClientConversationId, CallType, ClientId, P1ConnectTime, P1DisconnectTime, BookingRequestNumber
type BaseCall struct {
ClientConversationId string `gorm:"primaryKey;index"`
CallType string `gorm:"index"`
@ -26,6 +45,21 @@ func (BaseCall) TableName() string {
return "gc_base_calls"
}
// InterpreterAttempt is used to store data on the system's attempt to find an interpreter for a client's base call.
// An interpreter attempt call involves the system dialling an interpreter, and providing them with the option to 'respond' in which they specify if they are available to take the call or not.
// ClientConversationId is a reference to the client BaseCall which the system is attempting to connect the interpreter to.
//
// This struct is part of the three primary components used for creating billable records:
// - BaseCall
// - InterpreterAttempt
// - InterpreterConnection
//
// It is eventually merged with the other two to create a 'full' billing record that we can derive a $ amount from.
//
// Table Schema:
//
// Primary Key: InterpreterConversationId
// Indexes: InterpreterConversationId, InterpreterId, ClientConversationId
type InterpreterAttempt struct {
InterpreterConversationId string `gorm:"primaryKey;index"`
InterpreterResponseTime time.Time
@ -44,6 +78,22 @@ func (InterpreterAttempt) TableName() string {
return "gc_interpreter_attempts"
}
// InterpreterConnection is used to store data on an interpreter's connection to a BaseCall.
// An interpreter connection is not its own call, it's a summation of data related to an interpreter's time spent on a base call.
// ClientConversationId is a reference to the client BaseCall, which is the call this data is derived from.
// InterpreterConversationId is a reference to the interpreter's acceptance call, which is a unique identifier for the interpreter's time on the call.
//
// This struct is part of the three primary components used for creating billable records:
// - BaseCall
// - InterpreterAttempt
// - InterpreterConnection
//
// It is eventually merged with the other two to create a 'full' billing record that we can derive a $ amount from.
//
// Table Schema:
//
// Primary Key: InterpreterConversationId
// Indexes: InterpreterConversationId, InterpreterId, ClientConversationId
type InterpreterConnection struct {
InterpreterConversationId string `gorm:"primaryKey;index"`
InterpreterAccepted bool
@ -61,6 +111,14 @@ func (InterpreterConnection) TableName() string {
return "gc_interpreter_connections"
}
// CallStat stored statistics & metrics on a client's attempt to create a billable record by finding an interpreter (BaseCall).
// The stats collected are important for billing data as the CallStat object indicates whether or not the call was successfully serviced.
// The stats are also used extensively for reporting purposes, and measure the company's defined SLAs, including UTS (unable to service) duration and the time taken to find & connect to an interpreter..
//
// Table Schema:
//
// Primary Key: ClientConversationId
// Indexes: ClientConversationId, CallType, ClientId, ConversationStart, ConversationEnd, P1ConnectTime, P1DisconnectTime, BookingRequestNumber
type CallStat struct {
ClientConversationId string `gorm:"primaryKey;index"`
CallType string `gorm:"index"`
@ -92,6 +150,16 @@ func (CallStat) TableName() string {
return "gc_call_stats"
}
// Breakdown is used to store data relating to the call in a segment-by-segment basis.
// The Breakdown is a translation of the technical data into domain specific language that non-technical members of the company can understand.
// Not every segment is translated into a breakdown, only key events.
// The breakdowns are also used extensively in terms of reporting, as they provide a very fine-grain overview of what happened on a given call.
//
// Table Schema:
//
// Primary Key: ClientConversationId, Timestamp, Task
// Indexes: ClientConversationId, InterpreterConversationId, Timestamp, Task
// JSON Fields: Metadata
type Breakdown struct {
ClientConversationId string `gorm:"primaryKey;index"`
InterpreterConversationId string `gorm:"index"`
@ -106,6 +174,15 @@ func (Breakdown) TableName() string {
return "gc_call_breakdown"
}
// CallMetrics store data relating to the call, specifically to do with duration/timing metadata.
// The CallMetrics give an overview as to how the duration of any given call was spent, in terms of non-technical domain specific language.
//
// Table Schema:
//
// Primary Key: ClientConversationId
// Indexes: ClientConversationId
// JSON Fields: Metadata
type CallMetrics struct {
ClientConversationId string `gorm:"primaryKey;index"`
//

View File

@ -1,10 +1,21 @@
package models
// AnalyticsConversationWithAttributesQuery is used to bind the results of a paginated GenesysCloud API request.
type AnalyticsConversationWithAttributesQuery struct {
Conversations []AnalyticsConversationWithAttributes `json:"conversations"`
Cursor *string `json:"cursor"`
}
// AnalyticsConversationWithAttributes is used to bind the results of a GenesysCloud API request.
//
// It is a hierarchical structure (Participants has many Sessions has many Segments) and needs to be flattened into multiple tables prior to being saved in the database.
//
// The following payload JSON fields have an expected structure:
// - Participants
// - Participants.Sessions
// - Participants.Sessions.MediaEndpointStats
// - Participants.Sessions.Metrics
// - Participants.Sessions.Segments
type AnalyticsConversationWithAttributes struct {
ConversationEnd string `json:"conversationEnd"`
ConversationId string `json:"conversationId"`
@ -58,10 +69,23 @@ type AnalyticsConversationWithAttributes struct {
} `json:"participants"`
}
// AnalyticsConversationWithoutAttributesQuery is used to bind the results of a paginated GenesysCloud API request.
type AnalyticsConversationWithoutAttributesQuery struct {
Conversations []AnalyticsConversationWithoutAttributes `json:"conversations"`
TotalHits int `json:"totalHits"`
}
// AnalyticsConversationWithoutAttributes is used to bind the results of a GenesysCloud API request.
//
// It is a hierarchical structure (Participants has many Sessions has many Segments) and needs to be flattened into multiple tables prior to being saved in the database.
//
// The following payload JSON fields have an expected structure:
// - Participants
// - Participants.Sessions
// - Participants.Sessions.Segments
// - Participants.Sessions.Flow
// - Participants.Sessions.Metrics
// - Participants.Sessions.MediaEndpointStats
type AnalyticsConversationWithoutAttributes struct {
ConversationId string `json:"conversationId"`
ConversationStart string `json:"conversationStart"`
@ -127,6 +151,16 @@ type AnalyticsConversationWithoutAttributes struct {
} `json:"participants"`
}
// NotificationConversationWithAttributes is used to bind the results of a GenesysCloud websocket notification.
//
// It is a hierarchical structure (Participants has many Sessions has many Segments) and needs to be flattened into multiple tables prior to being saved in the database.
//
// The following payload JSON fields have an expected structure:
// - Divisions
// - Divisions.Division
// - Divisions.Entities
// - Participants
// - Participants.Calls
type NotificationConversationWithAttributes struct {
Address string `json:"address"`
Divisions []struct {
@ -185,12 +219,16 @@ type NotificationConversationWithAttributes struct {
UtilizationLabelId string `json:"utilizationLabelId"`
}
// UsersQuery is used to bind the results of an GenesysCloud API request to get all users.
type UsersQuery struct {
Entities []GCUser `json:"entities"`
PageSize int `json:"pageSize"`
Total int `json:"total"`
}
// GCUser is a model used to store the results of GenesysCloud users.
//
// Given the similarity between the API requests returned value and the desired database schema, the DB model is used in UsersQuery, and also to upload directly to the database. No additional formatting work is required.
type GCUser struct {
Id string `json:"id" gorm:"primaryKey"`
Name string `json:"name"`

View File

@ -1,25 +0,0 @@
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

@ -1,24 +0,0 @@
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

@ -6,6 +6,22 @@ import (
"gorm.io/gorm"
)
// DBParticipant is a model that stores raw 'participant' payloads from GenesysCloud websockets and API requests.
//
// - The ExtractLive function handles the conversion from JSON data (map) into formatted JSON string for websocket payloads.
// - The ExtractWithoutAttributes function handles the conversion from JSON data (map) into formatted JSON string for gcq-details requests.
//
// Table Schema:
//
// Primary Key: Id
// Indexes: ConnectedTime, ConversationId, EndTime, Id, Name, Purpose
// JSON Fields: Attributes, MediaRoles, Wrapup
//
// GORM Specifics:
// - Can be preloaded with Sessions []DBSession
// - Can be preloaded with Calls []DBCall
// - Can be preloaded with User *GCUser
// - BeforeSave function, converts UserId into 'nil' if an empty string is returned, this prevents foreign key violations.
type DBParticipant struct {
Address *string
Attributes *string `gorm:"type:json"`

View File

@ -140,45 +140,3 @@ type DBInterpreterProcessed struct {
func (DBInterpreterProcessed) TableName() string {
return "gc_interpreter_processed"
}
/*
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

@ -2,6 +2,12 @@ package models
import "time"
// DBQueueLog is a model used to store metrics and information about a conversation's consumption within a queue.
// - Queue is the name of the queue that processed the conversation.
// - Start is the time that the queue consumer started processing the conversation.
// - End is the time that the queue consumer finished processing the conversation.
// - NextQueue is the name of the queue that the consumer attempted to forward the conversation ID into.
// - Result is a map of metadata about the conversation's time in the consumer, including any potential error messages.
type DBQueueLog struct {
Queue string `gorm:"primaryKey"`
ConversationId string `gorm:"primaryKey"`

View File

@ -2,6 +2,7 @@ package models
import "time"
// WARNING: This table is **deprecated** and is no longer used for anything.
type GCRaw struct {
ClientConversationId string
InterpreterConversationId string

View File

@ -4,6 +4,15 @@ import (
"time"
)
// DBSegment is a model that stores raw 'segment' payloads from GenesysCloud API requests.
//
// - The ExtractWithoutAttributes function handles the conversion from JSON data (map) into formatted JSON string for gcq-details requests.
//
// Table Schema:
//
// Primary Key: Id
// Indexes: Id, SegmentEnd, SegmentStart, SegmentType, SessionId
// JSON Fields: q950ResponseCodes
type DBSegment struct {
Id string `gorm:"primaryKey;index"`
Conference bool

View File

@ -1,5 +1,17 @@
package models
// DBSession is a model that stores raw 'session' payloads from GenesysCloud API requests.
//
// - The ExtractWithoutAttributes function handles the conversion from JSON data (map) into formatted JSON string for gcq-details requests.
//
// Table Schema:
//
// Primary Key: Id
// Indexes: Id, ParticipantId
// JSON Fields: MediaEndpointStats, Metrics, Flow
//
// GORM Specifics:
// - Can be preloaded with Segments []DBSegment
type DBSession struct {
Ani string
Direction string

View File

@ -2,6 +2,17 @@ package models
import "time"
// DBTicket is a model that stores Ticket records from Zoho Desk.
//
// - The intention of the model is to map JSON -> struct -> JSON
//
// Table Schema:
//
// Primary Key: Id
// Indexes: Id
// JSON Fields: Assignee, CF, Contact, DescAttachment, EntitySkills, FirstThread, LayoutDetails, SecondaryContacts, SharedDepartments, Source
//
// NOTE: CF stands for Custom Fields and stores all layout fields that are not in this struct (this struct contains only the defaults).
type DBTicket struct {
AccountId int
ApprovalCount int
@ -68,67 +79,3 @@ type DBTicket struct {
func (DBTicket) TableName() string {
return "zoho_live_tickets"
}
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"
}