Skip to content

Commit

Permalink
Merge pull request #14183 from transcom/B-20535-special-moves-queue-a…
Browse files Browse the repository at this point in the history
…ssigned

B 20535 special moves queue assigned
  • Loading branch information
pambecker authored Dec 10, 2024
2 parents 73a7314 + c5d7bda commit 9f70ac7
Show file tree
Hide file tree
Showing 10 changed files with 180 additions and 61 deletions.
6 changes: 0 additions & 6 deletions pkg/gen/ghcapi/embedded_spec.go

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

3 changes: 0 additions & 3 deletions pkg/gen/ghcmessages/available_office_user.go

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

46 changes: 26 additions & 20 deletions pkg/handlers/ghcapi/internal/payloads/model_to_payload.go
Original file line number Diff line number Diff line change
Expand Up @@ -2142,25 +2142,22 @@ func QueueAvailableOfficeUsers(officeUsers []models.OfficeUser) *ghcmessages.Ava
availableOfficeUsers := make(ghcmessages.AvailableOfficeUsers, len(officeUsers))
for i, officeUser := range officeUsers {

hasSafety := officeUser.User.Privileges.HasPrivilege(models.PrivilegeTypeSafety)

availableOfficeUsers[i] = &ghcmessages.AvailableOfficeUser{
LastName: officeUser.LastName,
FirstName: officeUser.FirstName,
OfficeUserID: *handlers.FmtUUID(officeUser.ID),
HasSafetyPrivilege: swag.BoolValue(&hasSafety),
LastName: officeUser.LastName,
FirstName: officeUser.FirstName,
OfficeUserID: *handlers.FmtUUID(officeUser.ID),
}
}

return &availableOfficeUsers
}

func queueMoveIsAssignable(move models.Move, assignedToUser *ghcmessages.AssignedOfficeUser, isCloseoutQueue bool, role roles.RoleType, officeUser models.OfficeUser, isSupervisor bool, isHQRole bool, ppmCloseoutGblocs bool) bool {
func queueMoveIsAssignable(move models.Move, assignedToUser *ghcmessages.AssignedOfficeUser, isCloseoutQueue bool, officeUser models.OfficeUser, ppmCloseoutGblocs bool) bool {
// default to false
isAssignable := false

// HQ role is read only
if isHQRole {
if officeUser.User.Roles.HasRole(roles.RoleTypeHQ) {
isAssignable = false
return isAssignable
}
Expand All @@ -2170,14 +2167,15 @@ func queueMoveIsAssignable(move models.Move, assignedToUser *ghcmessages.Assigne
isAssignable = true
}

isSupervisor := officeUser.User.Privileges.HasPrivilege(models.PrivilegeTypeSupervisor)
// in TOO queues, all moves are assignable for supervisor users
if role == roles.RoleTypeTOO && isSupervisor {
if officeUser.User.Roles.HasRole(roles.RoleTypeTOO) && isSupervisor {
isAssignable = true
}

// if it is assigned in the SCs queue
// it is only assignable if the user is a supervisor...
if role == roles.RoleTypeServicesCounselor && isSupervisor {
if officeUser.User.Roles.HasRole(roles.RoleTypeServicesCounselor) && isSupervisor {
// AND we are in the counseling queue AND the move's counseling office is the supervisor's transportation office
if !isCloseoutQueue && move.CounselingOfficeID != nil && *move.CounselingOfficeID == officeUser.TransportationOfficeID {
isAssignable = true
Expand All @@ -2196,8 +2194,8 @@ func queueMoveIsAssignable(move models.Move, assignedToUser *ghcmessages.Assigne
return isAssignable
}

func servicesCounselorAvailableOfficeUsers(move models.Move, officeUsers []models.OfficeUser, role roles.RoleType, officeUser models.OfficeUser, ppmCloseoutGblocs bool, isCloseoutQueue bool) []models.OfficeUser {
if role == roles.RoleTypeServicesCounselor {
func servicesCounselorAvailableOfficeUsers(move models.Move, officeUsers []models.OfficeUser, officeUser models.OfficeUser, ppmCloseoutGblocs bool, isCloseoutQueue bool) []models.OfficeUser {
if officeUser.User.Roles.HasRole(roles.RoleTypeServicesCounselor) {
// if the office user currently assigned to the move works outside of the logged in users counseling office
// add them to the set
if move.SCAssignedUser != nil && move.SCAssignedUser.TransportationOfficeID != officeUser.TransportationOfficeID {
Expand Down Expand Up @@ -2225,7 +2223,7 @@ func servicesCounselorAvailableOfficeUsers(move models.Move, officeUsers []model
}

// QueueMoves payload
func QueueMoves(moves []models.Move, officeUsers []models.OfficeUser, requestedPpmStatus *models.PPMShipmentStatus, role roles.RoleType, officeUser models.OfficeUser, isSupervisor bool, isHQRole bool) *ghcmessages.QueueMoves {
func QueueMoves(moves []models.Move, officeUsers []models.OfficeUser, requestedPpmStatus *models.PPMShipmentStatus, officeUser models.OfficeUser, officeUsersSafety []models.OfficeUser) *ghcmessages.QueueMoves {
queueMoves := make(ghcmessages.QueueMoves, len(moves))
for i, move := range moves {
customer := move.Orders.ServiceMember
Expand Down Expand Up @@ -2296,10 +2294,10 @@ func QueueMoves(moves []models.Move, officeUsers []models.OfficeUser, requestedP

// determine if there is an assigned user
var assignedToUser *ghcmessages.AssignedOfficeUser
if role == roles.RoleTypeServicesCounselor && move.SCAssignedUser != nil {
if officeUser.User.Roles.HasRole(roles.RoleTypeServicesCounselor) && move.SCAssignedUser != nil {
assignedToUser = AssignedOfficeUser(move.SCAssignedUser)
}
if role == roles.RoleTypeTOO && move.TOOAssignedUser != nil {
if officeUser.User.Roles.HasRole(roles.RoleTypeTOO) && move.TOOAssignedUser != nil {
assignedToUser = AssignedOfficeUser(move.TOOAssignedUser)
}

Expand All @@ -2308,16 +2306,20 @@ func QueueMoves(moves []models.Move, officeUsers []models.OfficeUser, requestedP
// requestedPpmStatus also represents if we are viewing the closeout queue
isCloseoutQueue := requestedPpmStatus != nil && *requestedPpmStatus == models.PPMShipmentStatusNeedsCloseout
// determine if the move is assignable
assignable := queueMoveIsAssignable(move, assignedToUser, isCloseoutQueue, role, officeUser, isSupervisor, isHQRole, ppmCloseoutGblocs)
assignable := queueMoveIsAssignable(move, assignedToUser, isCloseoutQueue, officeUser, ppmCloseoutGblocs)

isSupervisor := officeUser.User.Privileges.HasPrivilege(models.PrivilegeTypeSupervisor)
// only need to attach available office users if move is assignable
var apiAvailableOfficeUsers ghcmessages.AvailableOfficeUsers
if assignable {
// non SC roles don't need the extra logic, just make availableOfficeUsers = officeUsers
availableOfficeUsers := officeUsers

if role == roles.RoleTypeServicesCounselor {
availableOfficeUsers = servicesCounselorAvailableOfficeUsers(move, availableOfficeUsers, role, officeUser, ppmCloseoutGblocs, isCloseoutQueue)
if isSupervisor && move.Orders.OrdersType == "SAFETY" {
availableOfficeUsers = officeUsersSafety
}
if officeUser.User.Roles.HasRole(roles.RoleTypeServicesCounselor) {
availableOfficeUsers = servicesCounselorAvailableOfficeUsers(move, availableOfficeUsers, officeUser, ppmCloseoutGblocs, isCloseoutQueue)
}

apiAvailableOfficeUsers = *QueueAvailableOfficeUsers(availableOfficeUsers)
Expand Down Expand Up @@ -2417,7 +2419,7 @@ func queuePaymentRequestStatus(paymentRequest models.PaymentRequest) string {
}

// QueuePaymentRequests payload
func QueuePaymentRequests(paymentRequests *models.PaymentRequests, officeUsers []models.OfficeUser, officeUser models.OfficeUser, isSupervisor bool, isHQRole bool) *ghcmessages.QueuePaymentRequests {
func QueuePaymentRequests(paymentRequests *models.PaymentRequests, officeUsers []models.OfficeUser, officeUser models.OfficeUser, officeUsersSafety []models.OfficeUser) *ghcmessages.QueuePaymentRequests {

queuePaymentRequests := make(ghcmessages.QueuePaymentRequests, len(*paymentRequests))

Expand Down Expand Up @@ -2457,11 +2459,12 @@ func QueuePaymentRequests(paymentRequests *models.PaymentRequests, officeUsers [
isAssignable = true
}

isSupervisor := officeUser.User.Privileges.HasPrivilege(models.PrivilegeTypeSupervisor)
if isSupervisor {
isAssignable = true
}

if isHQRole {
if officeUser.User.Roles.HasRole(roles.RoleTypeHQ) {
isAssignable = false
}

Expand All @@ -2470,6 +2473,9 @@ func QueuePaymentRequests(paymentRequests *models.PaymentRequests, officeUsers [
// only need to attach available office users if move is assignable
if queuePaymentRequests[i].Assignable {
availableOfficeUsers := officeUsers
if isSupervisor && orders.OrdersType == "SAFETY" {
availableOfficeUsers = officeUsersSafety
}
if !isSupervisor {
availableOfficeUsers = models.OfficeUsers{officeUser}
}
Expand Down
32 changes: 27 additions & 5 deletions pkg/handlers/ghcapi/internal/payloads/model_to_payload_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -29,7 +29,27 @@ func TestMove(t *testing.T) {
}

func (suite *PayloadsSuite) TestPaymentRequestQueue() {
officeUser := factory.BuildOfficeUserWithRoles(suite.DB(), nil, []roles.RoleType{roles.RoleTypeTOO})
officeUser := factory.BuildOfficeUserWithPrivileges(suite.DB(), []factory.Customization{
{
Model: models.OfficeUser{
Email: "[email protected]",
},
},
{
Model: models.User{
Privileges: []models.Privilege{
{
PrivilegeType: models.PrivilegeTypeSupervisor,
},
},
Roles: []roles.Role{
{
RoleType: roles.RoleTypeTIO,
},
},
},
},
}, nil)
officeUserTIO := factory.BuildOfficeUserWithRoles(suite.DB(), nil, []roles.RoleType{roles.RoleTypeTIO})

gbloc := "LKNQ"
Expand Down Expand Up @@ -66,8 +86,9 @@ func (suite *PayloadsSuite) TestPaymentRequestQueue() {
},
}, nil)
var officeUsers models.OfficeUsers
var officeUsersSafety models.OfficeUsers
officeUsers = append(officeUsers, officeUser)
var paymentRequestsQueue = QueuePaymentRequests(&paymentRequests, officeUsers, officeUser, false, false)
var paymentRequestsQueue = QueuePaymentRequests(&paymentRequests, officeUsers, officeUser, officeUsersSafety)

suite.Run("Test Payment request is assignable due to not being assigend", func() {
paymentRequestCopy := *paymentRequestsQueue
Expand All @@ -86,7 +107,7 @@ func (suite *PayloadsSuite) TestPaymentRequestQueue() {
paymentRequests[0].MoveTaskOrder.TIOAssignedUser = &officeUserTIO
paymentRequests[0].MoveTaskOrder.CounselingOffice = &transportationOffice

paymentRequestsQueue = QueuePaymentRequests(&paymentRequests, officeUsers, officeUser, false, false)
paymentRequestsQueue = QueuePaymentRequests(&paymentRequests, officeUsers, officeUser, officeUsersSafety)

suite.Run("Test PaymentRequest has both Counseling Office and TIO AssignedUser ", func() {
PaymentRequestsCopy := *paymentRequestsQueue
Expand All @@ -100,13 +121,14 @@ func (suite *PayloadsSuite) TestPaymentRequestQueue() {
})

suite.Run("Test PaymentRequest is assignable due to user Supervisor role", func() {
paymentRequests := QueuePaymentRequests(&paymentRequests, officeUsers, officeUser, true, false)
paymentRequests := QueuePaymentRequests(&paymentRequests, officeUsers, officeUser, officeUsersSafety)
paymentRequestCopy := *paymentRequests
suite.Equal(paymentRequestCopy[0].Assignable, true)
})

officeUserHQ := factory.BuildOfficeUserWithRoles(suite.DB(), nil, []roles.RoleType{roles.RoleTypeHQ})
suite.Run("Test PaymentRequest is not assignable due to user HQ role", func() {
paymentRequests := QueuePaymentRequests(&paymentRequests, officeUsers, officeUser, false, true)
paymentRequests := QueuePaymentRequests(&paymentRequests, officeUsers, officeUserHQ, officeUsersSafety)
paymentRequestCopy := *paymentRequests
suite.Equal(paymentRequestCopy[0].Assignable, false)
})
Expand Down
88 changes: 65 additions & 23 deletions pkg/handlers/ghcapi/queues.go
Original file line number Diff line number Diff line change
Expand Up @@ -107,10 +107,24 @@ func (h GetMovesQueueHandler) Handle(params queues.GetMovesQueueParams) middlewa
if err != nil {
appCtx.Logger().Error("Error retreiving user privileges", zap.Error(err))
}
officeUser.User.Privileges = privileges
officeUser.User.Roles = appCtx.Session().Roles

isSupervisor := privileges.HasPrivilege(models.PrivilegeTypeSupervisor)
var officeUsers models.OfficeUsers
if isSupervisor {
var officeUsersSafety models.OfficeUsers
if privileges.HasPrivilege(models.PrivilegeTypeSupervisor) {
if privileges.HasPrivilege(models.PrivilegeTypeSafety) {
officeUsersSafety, err = h.OfficeUserFetcherPop.FetchSafetyMoveOfficeUsersByRoleAndOffice(
appCtx,
roles.RoleTypeTOO,
officeUser.TransportationOfficeID,
)
if err != nil {
appCtx.Logger().
Error("error fetching safety move office users", zap.Error(err))
return queues.NewGetMovesQueueInternalServerError(), err
}
}
officeUsers, err = h.OfficeUserFetcherPop.FetchOfficeUsersByRoleAndOffice(
appCtx,
roles.RoleTypeTOO,
Expand Down Expand Up @@ -146,9 +160,8 @@ func (h GetMovesQueueHandler) Handle(params queues.GetMovesQueueParams) middlewa
appCtx.Logger().Error(fmt.Sprintf("failed to unlock moves for office user ID: %s", officeUserID), zap.Error(err))
}
}
isHQrole := appCtx.Session().Roles.HasRole(roles.RoleTypeHQ)

queueMoves := payloads.QueueMoves(moves, officeUsers, nil, roles.RoleTypeTOO, officeUser, isSupervisor, isHQrole)
queueMoves := payloads.QueueMoves(moves, officeUsers, nil, officeUser, officeUsersSafety)

result := &ghcmessages.QueueMovesResult{
Page: *ListOrderParams.Page,
Expand Down Expand Up @@ -290,11 +303,35 @@ func (h GetPaymentRequestsQueueHandler) Handle(
}
}

officeUsers, err := h.OfficeUserFetcherPop.FetchOfficeUsersByRoleAndOffice(
appCtx,
roles.RoleTypeTIO,
officeUser.TransportationOfficeID,
)
privileges, err := models.FetchPrivilegesForUser(appCtx.DB(), appCtx.Session().UserID)
if err != nil {
appCtx.Logger().Error("Error retreiving user privileges", zap.Error(err))
}
officeUser.User.Privileges = privileges
officeUser.User.Roles = appCtx.Session().Roles

var officeUsers models.OfficeUsers
var officeUsersSafety models.OfficeUsers

if privileges.HasPrivilege(models.PrivilegeTypeSupervisor) {
if privileges.HasPrivilege(models.PrivilegeTypeSafety) {
officeUsersSafety, err = h.OfficeUserFetcherPop.FetchSafetyMoveOfficeUsersByRoleAndOffice(
appCtx,
roles.RoleTypeTIO,
officeUser.TransportationOfficeID,
)
if err != nil {
appCtx.Logger().
Error("error fetching safety move office users", zap.Error(err))
return queues.NewGetMovesQueueInternalServerError(), err
}
}
officeUsers, err = h.OfficeUserFetcherPop.FetchOfficeUsersByRoleAndOffice(
appCtx,
roles.RoleTypeTIO,
officeUser.TransportationOfficeID,
)
}

if err != nil {
appCtx.Logger().
Expand Down Expand Up @@ -323,15 +360,7 @@ func (h GetPaymentRequestsQueueHandler) Handle(
}
}

privileges, err := models.FetchPrivilegesForUser(appCtx.DB(), appCtx.Session().UserID)
if err != nil {
appCtx.Logger().Error("Error retreiving user privileges", zap.Error(err))
}

isHQrole := appCtx.Session().Roles.HasRole(roles.RoleTypeHQ)

isSupervisor := privileges.HasPrivilege(models.PrivilegeTypeSupervisor)
queuePaymentRequests := payloads.QueuePaymentRequests(paymentRequests, officeUsers, officeUser, isSupervisor, isHQrole)
queuePaymentRequests := payloads.QueuePaymentRequests(paymentRequests, officeUsers, officeUser, officeUsersSafety)

result := &ghcmessages.QueuePaymentRequestsResult{
TotalCount: int64(count),
Expand Down Expand Up @@ -441,11 +470,25 @@ func (h GetServicesCounselingQueueHandler) Handle(
if err != nil {
appCtx.Logger().Error("Error retreiving user privileges", zap.Error(err))
}
officeUser.User.Privileges = privileges
officeUser.User.Roles = appCtx.Session().Roles

isSupervisor := privileges.HasPrivilege(models.PrivilegeTypeSupervisor)
var officeUsers models.OfficeUsers

if isSupervisor {
var officeUsersSafety models.OfficeUsers

if privileges.HasPrivilege(models.PrivilegeTypeSupervisor) {
if privileges.HasPrivilege(models.PrivilegeTypeSafety) {
officeUsersSafety, err = h.OfficeUserFetcherPop.FetchSafetyMoveOfficeUsersByRoleAndOffice(
appCtx,
roles.RoleTypeServicesCounselor,
officeUser.TransportationOfficeID,
)
if err != nil {
appCtx.Logger().
Error("error fetching safety move office users", zap.Error(err))
return queues.NewGetMovesQueueInternalServerError(), err
}
}
officeUsers, err = h.OfficeUserFetcherPop.FetchOfficeUsersByRoleAndOffice(
appCtx,
roles.RoleTypeServicesCounselor,
Expand Down Expand Up @@ -481,9 +524,8 @@ func (h GetServicesCounselingQueueHandler) Handle(
appCtx.Logger().Error(fmt.Sprintf("failed to unlock moves for office user ID: %s", officeUserID), zap.Error(err))
}
}
isHQrole := appCtx.Session().Roles.HasRole(roles.RoleTypeHQ)

queueMoves := payloads.QueueMoves(moves, officeUsers, &requestedPpmStatus, roles.RoleTypeServicesCounselor, officeUser, isSupervisor, isHQrole)
queueMoves := payloads.QueueMoves(moves, officeUsers, &requestedPpmStatus, officeUser, officeUsersSafety)

result := &ghcmessages.QueueMovesResult{
Page: *ListOrderParams.Page,
Expand Down
Loading

0 comments on commit 9f70ac7

Please sign in to comment.