255 lines
9.1 KiB
Go
255 lines
9.1 KiB
Go
package connectwise
|
|
|
|
import (
|
|
"encoding/json"
|
|
"fmt"
|
|
"time"
|
|
)
|
|
|
|
//Company is a struct to hold the unmarshaled JSON data when making a call to the Service API
|
|
type Ticket struct {
|
|
ID int `json:"id"`
|
|
Summary string `json:"summary"`
|
|
RecordType string `json:"recordType"`
|
|
Board struct {
|
|
ID int `json:"id"`
|
|
Name string `json:"name"`
|
|
Info struct {
|
|
BoardHref string `json:"board_href"`
|
|
} `json:"_info"`
|
|
} `json:"board"`
|
|
Status struct {
|
|
ID int `json:"id"`
|
|
Name string `json:"name"`
|
|
Info struct {
|
|
StatusHref string `json:"status_href"`
|
|
} `json:"_info"`
|
|
} `json:"status"`
|
|
Company struct {
|
|
ID int `json:"id"`
|
|
Identifier string `json:"identifier"`
|
|
Name string `json:"name"`
|
|
Info struct {
|
|
CompanyHref string `json:"company_href"`
|
|
MobileGUID string `json:"mobileGuid"`
|
|
} `json:"_info"`
|
|
} `json:"company"`
|
|
Site struct {
|
|
ID int `json:"id"`
|
|
Name string `json:"name"`
|
|
Info struct {
|
|
SiteHref string `json:"site_href"`
|
|
MobileGUID string `json:"mobileGuid"`
|
|
} `json:"_info"`
|
|
} `json:"site,omitempty"`
|
|
AddressLine1 string `json:"addressLine1,omitempty"`
|
|
City string `json:"city,omitempty"`
|
|
StateIdentifier string `json:"stateIdentifier,omitempty"`
|
|
Zip string `json:"zip,omitempty"`
|
|
ContactName string `json:"contactName"`
|
|
ContactPhoneNumber string `json:"contactPhoneNumber"`
|
|
ContactEmailAddress string `json:"contactEmailAddress,omitempty"`
|
|
Team struct {
|
|
ID int `json:"id"`
|
|
Name string `json:"name"`
|
|
Info struct {
|
|
TeamHref string `json:"team_href"`
|
|
} `json:"_info"`
|
|
} `json:"team"`
|
|
Priority struct {
|
|
ID int `json:"id"`
|
|
Name string `json:"name"`
|
|
Sort int `json:"sort"`
|
|
Info struct {
|
|
PriorityHref string `json:"priority_href"`
|
|
ImageHref string `json:"image_href"`
|
|
} `json:"_info"`
|
|
} `json:"priority"`
|
|
ServiceLocation struct {
|
|
ID int `json:"id"`
|
|
Name string `json:"name"`
|
|
Info struct {
|
|
LocationHref string `json:"location_href"`
|
|
} `json:"_info"`
|
|
} `json:"serviceLocation"`
|
|
Source struct {
|
|
ID int `json:"id"`
|
|
Name string `json:"name"`
|
|
Info struct {
|
|
SourceHref string `json:"source_href"`
|
|
} `json:"_info"`
|
|
} `json:"source"`
|
|
Agreement struct {
|
|
ID int `json:"id"`
|
|
Name string `json:"name"`
|
|
Info struct {
|
|
AgreementHref string `json:"agreement_href"`
|
|
} `json:"_info"`
|
|
} `json:"agreement,omitempty"`
|
|
Severity string `json:"severity"`
|
|
Impact string `json:"impact"`
|
|
AllowAllClientsPortalView bool `json:"allowAllClientsPortalView"`
|
|
CustomerUpdatedFlag bool `json:"customerUpdatedFlag"`
|
|
AutomaticEmailContactFlag bool `json:"automaticEmailContactFlag"`
|
|
AutomaticEmailResourceFlag bool `json:"automaticEmailResourceFlag"`
|
|
AutomaticEmailCcFlag bool `json:"automaticEmailCcFlag"`
|
|
ClosedDate time.Time `json:"closedDate"`
|
|
ClosedBy string `json:"closedBy"`
|
|
ClosedFlag bool `json:"closedFlag"`
|
|
DateEntered time.Time `json:"dateEntered"`
|
|
EnteredBy string `json:"enteredBy"`
|
|
ActualHours float64 `json:"actualHours,omitempty"`
|
|
Approved bool `json:"approved"`
|
|
EstimatedExpenseCost float64 `json:"estimatedExpenseCost"`
|
|
EstimatedExpenseRevenue float64 `json:"estimatedExpenseRevenue"`
|
|
EstimatedProductCost float64 `json:"estimatedProductCost"`
|
|
EstimatedProductRevenue float64 `json:"estimatedProductRevenue"`
|
|
EstimatedTimeCost float64 `json:"estimatedTimeCost"`
|
|
EstimatedTimeRevenue float64 `json:"estimatedTimeRevenue"`
|
|
BillingMethod string `json:"billingMethod"`
|
|
SubBillingMethod string `json:"subBillingMethod"`
|
|
DateResolved time.Time `json:"dateResolved"`
|
|
DateResplan time.Time `json:"dateResplan"`
|
|
DateResponded time.Time `json:"dateResponded"`
|
|
ResolveMinutes int `json:"resolveMinutes"`
|
|
ResPlanMinutes int `json:"resPlanMinutes"`
|
|
RespondMinutes int `json:"respondMinutes"`
|
|
IsInSLA bool `json:"isInSla"`
|
|
HasChildTicket bool `json:"hasChildTicket"`
|
|
BillTime string `json:"billTime"`
|
|
BillExpenses string `json:"billExpenses"`
|
|
BillProducts string `json:"billProducts"`
|
|
LocationID int `json:"locationId"`
|
|
BusinessUnitID int `json:"businessUnitId"`
|
|
MobileGUID string `json:"mobileGuid"`
|
|
SLA struct {
|
|
ID int `json:"id"`
|
|
Name string `json:"name"`
|
|
Info struct {
|
|
SLAHref string `json:"sla_href"`
|
|
} `json:"_info"`
|
|
} `json:"sla"`
|
|
Currency struct {
|
|
ID int `json:"id"`
|
|
Symbol string `json:"symbol"`
|
|
IsoCode string `json:"isoCode"`
|
|
Name string `json:"name"`
|
|
Info struct {
|
|
CurrencyHref string `json:"currency_href"`
|
|
} `json:"_info"`
|
|
} `json:"currency"`
|
|
Info struct {
|
|
LastUpdated time.Time `json:"lastUpdated"`
|
|
UpdatedBy string `json:"updatedBy"`
|
|
ActivitiesHref string `json:"activities_href"`
|
|
ScheduleentriesHref string `json:"scheduleentries_href"`
|
|
DocumentsHref string `json:"documents_href"`
|
|
ConfigurationsHref string `json:"configurations_href"`
|
|
TasksHref string `json:"tasks_href"`
|
|
NotesHref string `json:"notes_href"`
|
|
ProductsHref string `json:"products_href"`
|
|
TimeentriesHref string `json:"timeentries_href"`
|
|
ExpenseEntriesHref string `json:"expenseEntries_href"`
|
|
} `json:"_info"`
|
|
CustomFields []struct {
|
|
ID int `json:"id"`
|
|
Caption string `json:"caption"`
|
|
Type string `json:"type"`
|
|
EntryMethod string `json:"entryMethod"`
|
|
NumberOfDecimals int `json:"numberOfDecimals"`
|
|
} `json:"customFields"`
|
|
RequiredDate time.Time `json:"requiredDate,omitempty"`
|
|
BudgetHours float64 `json:"budgetHours,omitempty"`
|
|
AddressLine2 string `json:"addressLine2,omitempty"`
|
|
Contact struct {
|
|
ID int `json:"id"`
|
|
Name string `json:"name"`
|
|
Info struct {
|
|
MobileGUID string `json:"mobileGuid"`
|
|
ContactHref string `json:"contact_href"`
|
|
} `json:"_info"`
|
|
} `json:"contact,omitempty"`
|
|
ContactPhoneExtension string `json:"contactPhoneExtension,omitempty"`
|
|
}
|
|
|
|
//TimeEntryReference is a struct to hold the unmarshaled JSON data when making a call to the Service API
|
|
//TBD: For some reason the Info struct contained in TimeEntryReference does get data when the JSON is unmarshaled into this struct. The ID works fine
|
|
type TimeEntryReference struct {
|
|
ID int
|
|
Info struct {
|
|
Notes string `json:"notes"`
|
|
TimeHref string `json:"time_href"`
|
|
} `json:"_info"`
|
|
}
|
|
|
|
type ConfigurationReference struct {
|
|
ID int `json:"id"`
|
|
DeviceIdentifier string `json:"deviceIdentifier"`
|
|
Info struct {
|
|
Name string `json:"name"`
|
|
ConfigurationHref string `json:"configuration_href"`
|
|
} `json:"_info"`
|
|
}
|
|
|
|
//GetTicketByID expects a ticket ID and returns a pointer to a Ticket struct
|
|
func (cw *ConnectwiseSite) GetTicketByID(ticketID int) (*Ticket, error) {
|
|
restAction := fmt.Sprintf("/service/tickets/%d", ticketID)
|
|
cwurl, err := cw.BuildURL(restAction)
|
|
if err != nil {
|
|
return nil, fmt.Errorf("could not build url %s: %s", restAction, err)
|
|
}
|
|
|
|
body, err := cw.GetRequest(cwurl)
|
|
if err != nil {
|
|
return nil, fmt.Errorf("could not get request %s: %s", cwurl, err)
|
|
}
|
|
ticket := Ticket{}
|
|
err = json.Unmarshal(body, &ticket)
|
|
if err != nil {
|
|
return nil, fmt.Errorf("failed to unmarshal body into struct: %s", err)
|
|
}
|
|
|
|
return &ticket, nil
|
|
}
|
|
|
|
//GetTicketTimeEntriesByID expects a ticket ID and returns a pointer a to a slice of TimeEntryReference's, all the time entries attached to that ticket
|
|
func (cw *ConnectwiseSite) GetTicketTimeEntriesByID(ticketID int) (*[]TimeEntryReference, error) {
|
|
restAction := fmt.Sprintf("/service/tickets/%d/timeentries", ticketID)
|
|
cwurl, err := cw.BuildURL(restAction)
|
|
if err != nil {
|
|
return nil, fmt.Errorf("could not build url %s: %s", restAction, err)
|
|
}
|
|
|
|
body, err := cw.GetRequest(cwurl)
|
|
if err != nil {
|
|
return nil, fmt.Errorf("could not get request %s: %s", cwurl, err)
|
|
}
|
|
timeEntryReference := []TimeEntryReference{}
|
|
err = json.Unmarshal(body, &timeEntryReference)
|
|
if err != nil {
|
|
return nil, fmt.Errorf("failed to unmarshal body into struct: %s", err)
|
|
}
|
|
|
|
return &timeEntryReference, nil
|
|
}
|
|
|
|
func (cw *ConnectwiseSite) GetTicketConfigurationsByID(ticketID int) (*[]ConfigurationReference, error) {
|
|
restAction := fmt.Sprintf("/service/tickets/%d/configurations", ticketID)
|
|
cwurl, err := cw.BuildURL(restAction)
|
|
if err != nil {
|
|
return nil, fmt.Errorf("could not build url %s: %s", restAction, err)
|
|
}
|
|
|
|
body, err := cw.GetRequest(cwurl)
|
|
if err != nil {
|
|
return nil, fmt.Errorf("could not get request %s: %s", cwurl, err)
|
|
}
|
|
configurationReference := []ConfigurationReference{}
|
|
err = json.Unmarshal(body, &configurationReference)
|
|
if err != nil {
|
|
return nil, fmt.Errorf("failed to unmarshal body into struct: %s", err)
|
|
}
|
|
|
|
return &configurationReference, nil
|
|
}
|