From df988bda1a587e8ec00a49ea9a05f2ab2c474dbe Mon Sep 17 00:00:00 2001 From: Steven Polley Date: Fri, 8 Mar 2019 15:37:26 -0700 Subject: [PATCH] add removeTicketFromMember --- 3.0/connectwise/service.go | 60 ++++++++++++++++++++++++++++++++++++-- 1 file changed, 58 insertions(+), 2 deletions(-) diff --git a/3.0/connectwise/service.go b/3.0/connectwise/service.go index 5d11e82..cd459b4 100644 --- a/3.0/connectwise/service.go +++ b/3.0/connectwise/service.go @@ -694,17 +694,35 @@ func (cw *Site) AssignTicketToTeam(ticketID, teamID int) (*Ticket, error) { //AssignTicketToMember will create a new schedule entry for the member and specify the ticket as the object func (cw *Site) AssignTicketToMember(ticketID, memberID int) (*ScheduleEntry, error) { + req := cw.NewRequest("/schedule/entries", "GET", nil) + req.URLValues.Add("conditions", fmt.Sprintf("member/id=%d and objectId=%d and doneFlag=false", memberID, ticketID)) + err := req.Do() + if err != nil { + return nil, fmt.Errorf("failed to get schedule entries on ticketID '%d' and memberID '%d': %v", ticketID, memberID, err) + } + + scheduleEntries := &[]ScheduleEntry{} + err = json.Unmarshal(req.Body, scheduleEntries) + if err != nil { + return nil, fmt.Errorf("failed to unmarshal body into struct: %s", err) + } + + // The member is already assined to the ticket, so return the first schedule entry + if len(*scheduleEntries) > 0 { + return &(*scheduleEntries)[0], nil + } + scheduleEntry := &ScheduleEntry{} scheduleEntry.ObjectID = ticketID scheduleEntry.Member.ID = memberID - scheduleEntry.Type.ID = 4 //TBD: This should not be here lol + scheduleEntry.Type.ID = 4 //TBD: This should not be here lol *UPDATE* Yes it should be here, this is a constant ID across all CW instances aparently (found in CW docs) jsonScheduleEntry, err := json.Marshal(scheduleEntry) if err != nil { return nil, fmt.Errorf("could not marshal json data: %s", err) } - req := cw.NewRequest("/schedule/entries", "POST", jsonScheduleEntry) + req = cw.NewRequest("/schedule/entries", "POST", jsonScheduleEntry) err = req.Do() if err != nil { return nil, fmt.Errorf("request failed for %s: %s", req.RestAction, err) @@ -719,6 +737,44 @@ func (cw *Site) AssignTicketToMember(ticketID, memberID int) (*ScheduleEntry, er return scheduleEntry, nil } +// RemoveTicketFromMember accepts a ticketID and a memberID and will mark the member as done, will return an error if it fails +func (cw *Site) RemoveTicketFromMember(ticketID, memberID int) error { + req := cw.NewRequest("/schedule/entries", "GET", nil) + req.URLValues.Add("conditions", fmt.Sprintf("member/id=%d and objectId=%d and doneFlag=false", memberID, ticketID)) + err := req.Do() + if err != nil { + return fmt.Errorf("failed to get schedule entries on ticketID '%d' and memberID '%d': %v", ticketID, memberID, err) + } + + scheduleEntries := &[]ScheduleEntry{} + err = json.Unmarshal(req.Body, scheduleEntries) + if err != nil { + return fmt.Errorf("failed to unmarshal body into struct: %s", err) + } + + for _, scheduleEntry := range *scheduleEntries { + patches := &[]PatchString{} + patch := &PatchString{ + Op: "replace", + Path: "doneFlag", + Value: "true"} + *patches = append(*patches, *patch) + + patchBody, err := json.Marshal(patches) + if err != nil { + return fmt.Errorf("could not marshal patch json to byte slice: %v", err) + } + + req = cw.NewRequest(fmt.Sprintf("/schedule/entries/%d", scheduleEntry.ID), "PATCH", patchBody) + err = req.Do() + if err != nil { + return fmt.Errorf("failed update done field for scheduleEntry ID '%d': %v", scheduleEntry.ID, err) + } + } + + return nil +} + //AssignTicketToCompany func (cw *Site) AssignTicketToCompany(ticketID, companyID int) (*Ticket, error) { patches := &[]PatchString{}