From 1c148c7a4aa342f009d913159d4a9dcf69b942f7 Mon Sep 17 00:00:00 2001 From: Michael Inthavongsay Date: Wed, 12 Feb 2025 17:52:29 +0000 Subject: [PATCH] intitial checkin of international SIT address change --- .../mto_service_item_updater.go | 18 +- .../mto_service_item_updater_test.go | 314 ++++++++++++++++++ .../mto_shipment/mto_shipment_updater.go | 7 +- .../shipment_address_update_requester.go | 18 +- .../shipment_address_update_requester_test.go | 84 +++++ 5 files changed, 432 insertions(+), 9 deletions(-) diff --git a/pkg/services/mto_service_item/mto_service_item_updater.go b/pkg/services/mto_service_item/mto_service_item_updater.go index 3c17ceff042..503f2efe440 100644 --- a/pkg/services/mto_service_item/mto_service_item_updater.go +++ b/pkg/services/mto_service_item/mto_service_item_updater.go @@ -239,7 +239,11 @@ func (p *mtoServiceItemUpdater) updateServiceItem(appCtx appcontext.AppContext, if (serviceItem.ReService.Code == models.ReServiceCodeDDDSIT || serviceItem.ReService.Code == models.ReServiceCodeDDSFSC || serviceItem.ReService.Code == models.ReServiceCodeDDASIT || - serviceItem.ReService.Code == models.ReServiceCodeDDFSIT) && + serviceItem.ReService.Code == models.ReServiceCodeDDFSIT || + serviceItem.ReService.Code == models.ReServiceCodeIDDSIT || + serviceItem.ReService.Code == models.ReServiceCodeIDSFSC || + serviceItem.ReService.Code == models.ReServiceCodeIDASIT || + serviceItem.ReService.Code == models.ReServiceCodeIDFSIT) && serviceItem.SITDestinationOriginalAddressID == nil { // Set the original address on a service item to the shipment's @@ -267,9 +271,11 @@ func (p *mtoServiceItemUpdater) updateServiceItem(appCtx appcontext.AppContext, serviceItem.SITDestinationFinalAddress = shipmentDestinationAddress } - // Calculate SITDeliveryMiles for DDDSIT and DDSFSC origin SIT service items + // Calculate SITDeliveryMiles for DDDSIT/DDSFSC, IDDSIT/IDSFSC origin SIT service items if serviceItem.ReService.Code == models.ReServiceCodeDDDSIT || - serviceItem.ReService.Code == models.ReServiceCodeDDSFSC { + serviceItem.ReService.Code == models.ReServiceCodeDDSFSC || + serviceItem.ReService.Code == models.ReServiceCodeIDDSIT || + serviceItem.ReService.Code == models.ReServiceCodeIDSFSC { // Destination SIT: distance between shipment destination address & service item ORIGINAL destination address milesCalculated, err := p.planner.ZipTransitDistance(appCtx, mtoShipment.DestinationAddress.PostalCode, serviceItem.SITDestinationOriginalAddress.PostalCode, false) if err != nil { @@ -279,9 +285,11 @@ func (p *mtoServiceItemUpdater) updateServiceItem(appCtx appcontext.AppContext, } } - // Calculate SITDeliveryMiles for DOPSIT and DOSFSC origin SIT service items + // Calculate SITDeliveryMiles for DOPSIT/DOSFSC, IOPSIT/IOSFSC origin SIT service items if serviceItem.ReService.Code == models.ReServiceCodeDOPSIT || - serviceItem.ReService.Code == models.ReServiceCodeDOSFSC { + serviceItem.ReService.Code == models.ReServiceCodeDOSFSC || + serviceItem.ReService.Code == models.ReServiceCodeIOPSIT || + serviceItem.ReService.Code == models.ReServiceCodeIOSFSC { // Origin SIT: distance between shipment pickup address & service item ORIGINAL pickup address milesCalculated, err := p.planner.ZipTransitDistance(appCtx, mtoShipment.PickupAddress.PostalCode, serviceItem.SITOriginHHGOriginalAddress.PostalCode, false) if err != nil { diff --git a/pkg/services/mto_service_item/mto_service_item_updater_test.go b/pkg/services/mto_service_item/mto_service_item_updater_test.go index 95f5191681a..58915d045d1 100644 --- a/pkg/services/mto_service_item/mto_service_item_updater_test.go +++ b/pkg/services/mto_service_item/mto_service_item_updater_test.go @@ -765,6 +765,14 @@ func (suite *MTOServiceItemServiceSuite) TestMTOServiceItemUpdater() { models.ReServiceCodeDOPSIT, models.ReServiceCodeDOFSIT, models.ReServiceCodeDOSFSC, + models.ReServiceCodeIDFSIT, + models.ReServiceCodeIDASIT, + models.ReServiceCodeIDDSIT, + models.ReServiceCodeIDSFSC, + models.ReServiceCodeIOASIT, + models.ReServiceCodeIOPSIT, + models.ReServiceCodeIOFSIT, + models.ReServiceCodeIOSFSC, } shipmentSITAllowance := 90 @@ -2389,6 +2397,68 @@ func (suite *MTOServiceItemServiceSuite) TestUpdateMTOServiceItemStatus() { suite.Equal(destinationAddress.PostalCode, updatedServiceItem.SITDestinationOriginalAddress.PostalCode) }) + suite.Run("When TOO approves a IDSFSC service item with an existing SITDestinationFinalAddress", func() { + move := factory.BuildApprovalsRequestedMove(suite.DB(), nil, nil) + destUSPRC, _ := models.FindByZipCode(suite.AppContextForTest().DB(), "99505") + sitDestinationFinalAddress := factory.BuildAddress(suite.DB(), []factory.Customization{ + { + Model: models.Address{ + StreetAddress1: "JBER", + City: "Anchorage", + State: "AK", + PostalCode: "99505", + IsOconus: models.BoolPointer(true), + UsPostRegionCityID: &destUSPRC.ID, + }, + }, + }, nil) + + serviceItem := factory.BuildMTOServiceItem(suite.DB(), []factory.Customization{ + { + Model: move, + LinkOnly: true, + }, + { + Model: models.ReService{ + Code: models.ReServiceCodeIDSFSC, + }, + }, + { + Model: models.MTOServiceItem{ + Status: models.MTOServiceItemStatusSubmitted, + }, + }, + { + Model: sitDestinationFinalAddress, + LinkOnly: true, + Type: &factory.Addresses.SITDestinationFinalAddress, + }, + }, nil) + + eTag := etag.GenerateEtag(serviceItem.UpdatedAt) + + updatedServiceItem, err := updater.ApproveOrRejectServiceItem( + suite.AppContextForTest(), serviceItem.ID, models.MTOServiceItemStatusApproved, rejectionReason, eTag) + suite.NoError(err) + + // ApproveOrRejectServiceItem doesn't return the service item with the updated move + // get move from the db to check the updated status + err = suite.DB().Find(&move, move.ID) + suite.NoError(err) + suite.Equal(models.MoveStatusAPPROVED, move.Status) + + suite.Equal(models.MTOServiceItemStatusApproved, updatedServiceItem.Status) + suite.NotNil(updatedServiceItem.ApprovedAt) + suite.Nil(updatedServiceItem.RejectionReason) + suite.Nil(updatedServiceItem.RejectedAt) + suite.NotNil(updatedServiceItem) + destinationAddress := serviceItem.MTOShipment.DestinationAddress + suite.Equal(destinationAddress.StreetAddress1, updatedServiceItem.SITDestinationOriginalAddress.StreetAddress1) + suite.Equal(destinationAddress.City, updatedServiceItem.SITDestinationOriginalAddress.City) + suite.Equal(destinationAddress.State, updatedServiceItem.SITDestinationOriginalAddress.State) + suite.Equal(destinationAddress.PostalCode, updatedServiceItem.SITDestinationOriginalAddress.PostalCode) + }) + suite.Run("When TOO approves a DDSFSC service item without a SITDestinationFinalAddress", func() { move := factory.BuildApprovalsRequestedMove(suite.DB(), nil, nil) shipment := factory.BuildMTOShipment(suite.DB(), []factory.Customization{ @@ -2488,6 +2558,55 @@ func (suite *MTOServiceItemServiceSuite) TestUpdateMTOServiceItemStatus() { suite.Equal(destinationAddress.PostalCode, updatedServiceItem.SITDestinationOriginalAddress.PostalCode) }) + suite.Run("When TOO approves a IDASIT service item with an existing SITDestinationFinalAddress", func() { + move := factory.BuildApprovalsRequestedMove(suite.DB(), nil, nil) + sitDestinationFinalAddress := factory.BuildAddress(suite.DB(), nil, nil) + serviceItem := factory.BuildMTOServiceItem(suite.DB(), []factory.Customization{ + { + Model: move, + LinkOnly: true, + }, + { + Model: models.ReService{ + Code: models.ReServiceCodeIDASIT, + }, + }, + { + Model: models.MTOServiceItem{ + Status: models.MTOServiceItemStatusSubmitted, + }, + }, + { + Model: sitDestinationFinalAddress, + LinkOnly: true, + Type: &factory.Addresses.SITDestinationFinalAddress, + }, + }, nil) + + eTag := etag.GenerateEtag(serviceItem.UpdatedAt) + + updatedServiceItem, err := updater.ApproveOrRejectServiceItem( + suite.AppContextForTest(), serviceItem.ID, models.MTOServiceItemStatusApproved, rejectionReason, eTag) + suite.NoError(err) + + // ApproveOrRejectServiceItem doesn't return the service item with the updated move + // get move from the db to check the updated status + err = suite.DB().Find(&move, move.ID) + suite.NoError(err) + suite.Equal(models.MoveStatusAPPROVED, move.Status) + + suite.Equal(models.MTOServiceItemStatusApproved, updatedServiceItem.Status) + suite.NotNil(updatedServiceItem.ApprovedAt) + suite.Nil(updatedServiceItem.RejectionReason) + suite.Nil(updatedServiceItem.RejectedAt) + suite.NotNil(updatedServiceItem) + destinationAddress := serviceItem.MTOShipment.DestinationAddress + suite.Equal(destinationAddress.StreetAddress1, updatedServiceItem.SITDestinationOriginalAddress.StreetAddress1) + suite.Equal(destinationAddress.City, updatedServiceItem.SITDestinationOriginalAddress.City) + suite.Equal(destinationAddress.State, updatedServiceItem.SITDestinationOriginalAddress.State) + suite.Equal(destinationAddress.PostalCode, updatedServiceItem.SITDestinationOriginalAddress.PostalCode) + }) + suite.Run("When TOO approves a DDASIT service item without a SITDestinationFinalAddress", func() { move := factory.BuildApprovalsRequestedMove(suite.DB(), nil, nil) shipment := factory.BuildMTOShipment(suite.DB(), []factory.Customization{ @@ -2538,6 +2657,56 @@ func (suite *MTOServiceItemServiceSuite) TestUpdateMTOServiceItemStatus() { suite.Equal(shipment.DestinationAddress.PostalCode, updatedServiceItem.SITDestinationOriginalAddress.PostalCode) }) + suite.Run("When TOO approves a IDASIT service item without a SITDestinationFinalAddress", func() { + move := factory.BuildApprovalsRequestedMove(suite.DB(), nil, nil) + shipment := factory.BuildMTOShipment(suite.DB(), []factory.Customization{ + { + Model: move, + LinkOnly: true, + }, + }, nil) + serviceItem := factory.BuildMTOServiceItem(suite.DB(), []factory.Customization{ + { + Model: shipment, + LinkOnly: true, + }, + { + Model: models.ReService{ + Code: models.ReServiceCodeIDASIT, + }, + }, + { + Model: models.MTOServiceItem{ + Status: models.MTOServiceItemStatusSubmitted, + }, + }, + }, nil) + + eTag := etag.GenerateEtag(serviceItem.UpdatedAt) + + updatedServiceItem, err := updater.ApproveOrRejectServiceItem( + suite.AppContextForTest(), serviceItem.ID, models.MTOServiceItemStatusApproved, rejectionReason, eTag) + suite.NoError(err) + + // ApproveOrRejectServiceItem doesn't return the service item with the updated move + // get move from the db to check the updated status + err = suite.DB().Find(&move, move.ID) + suite.NoError(err) + suite.Equal(models.MoveStatusAPPROVED, move.Status) + + suite.Equal(models.MTOServiceItemStatusApproved, updatedServiceItem.Status) + suite.NotNil(updatedServiceItem.ApprovedAt) + suite.Nil(updatedServiceItem.RejectionReason) + suite.Nil(updatedServiceItem.RejectedAt) + suite.NotNil(updatedServiceItem) + suite.NotEqual(shipment.DestinationAddressID, *updatedServiceItem.SITDestinationOriginalAddressID) + suite.NotEqual(shipment.DestinationAddress.ID, *updatedServiceItem.SITDestinationOriginalAddressID) + suite.Equal(shipment.DestinationAddress.StreetAddress1, updatedServiceItem.SITDestinationOriginalAddress.StreetAddress1) + suite.Equal(shipment.DestinationAddress.City, updatedServiceItem.SITDestinationOriginalAddress.City) + suite.Equal(shipment.DestinationAddress.State, updatedServiceItem.SITDestinationOriginalAddress.State) + suite.Equal(shipment.DestinationAddress.PostalCode, updatedServiceItem.SITDestinationOriginalAddress.PostalCode) + }) + suite.Run("When TOO approves a DDFSIT service item with an existing SITDestinationFinalAddress", func() { move := factory.BuildApprovalsRequestedMove(suite.DB(), nil, nil) sitDestinationFinalAddress := factory.BuildAddress(suite.DB(), nil, nil) @@ -2587,6 +2756,55 @@ func (suite *MTOServiceItemServiceSuite) TestUpdateMTOServiceItemStatus() { suite.Equal(destinationAddress.PostalCode, updatedServiceItem.SITDestinationOriginalAddress.PostalCode) }) + suite.Run("When TOO approves a IDFSIT service item with an existing SITDestinationFinalAddress", func() { + move := factory.BuildApprovalsRequestedMove(suite.DB(), nil, nil) + sitDestinationFinalAddress := factory.BuildAddress(suite.DB(), nil, nil) + serviceItem := factory.BuildMTOServiceItem(suite.DB(), []factory.Customization{ + { + Model: move, + LinkOnly: true, + }, + { + Model: models.ReService{ + Code: models.ReServiceCodeIDFSIT, + }, + }, + { + Model: models.MTOServiceItem{ + Status: models.MTOServiceItemStatusSubmitted, + }, + }, + { + Model: sitDestinationFinalAddress, + LinkOnly: true, + Type: &factory.Addresses.SITDestinationFinalAddress, + }, + }, nil) + + eTag := etag.GenerateEtag(serviceItem.UpdatedAt) + + updatedServiceItem, err := updater.ApproveOrRejectServiceItem( + suite.AppContextForTest(), serviceItem.ID, models.MTOServiceItemStatusApproved, rejectionReason, eTag) + suite.NoError(err) + + // ApproveOrRejectServiceItem doesn't return the service item with the updated move + // get move from the db to check the updated status + err = suite.DB().Find(&move, move.ID) + suite.NoError(err) + suite.Equal(models.MoveStatusAPPROVED, move.Status) + + suite.Equal(models.MTOServiceItemStatusApproved, updatedServiceItem.Status) + suite.NotNil(updatedServiceItem.ApprovedAt) + suite.Nil(updatedServiceItem.RejectionReason) + suite.Nil(updatedServiceItem.RejectedAt) + suite.NotNil(updatedServiceItem) + destinationAddress := serviceItem.MTOShipment.DestinationAddress + suite.Equal(destinationAddress.StreetAddress1, updatedServiceItem.SITDestinationOriginalAddress.StreetAddress1) + suite.Equal(destinationAddress.City, updatedServiceItem.SITDestinationOriginalAddress.City) + suite.Equal(destinationAddress.State, updatedServiceItem.SITDestinationOriginalAddress.State) + suite.Equal(destinationAddress.PostalCode, updatedServiceItem.SITDestinationOriginalAddress.PostalCode) + }) + suite.Run("When TOO approves a DDFSIT service item without a SITDestinationFinalAddress", func() { move := factory.BuildApprovalsRequestedMove(suite.DB(), nil, nil) shipment := factory.BuildMTOShipment(suite.DB(), []factory.Customization{ @@ -2637,6 +2855,56 @@ func (suite *MTOServiceItemServiceSuite) TestUpdateMTOServiceItemStatus() { suite.Equal(shipment.DestinationAddress.PostalCode, updatedServiceItem.SITDestinationOriginalAddress.PostalCode) }) + suite.Run("When TOO approves a IDFSIT service item without a SITDestinationFinalAddress", func() { + move := factory.BuildApprovalsRequestedMove(suite.DB(), nil, nil) + shipment := factory.BuildMTOShipment(suite.DB(), []factory.Customization{ + { + Model: move, + LinkOnly: true, + }, + }, nil) + serviceItem := factory.BuildMTOServiceItem(suite.DB(), []factory.Customization{ + { + Model: shipment, + LinkOnly: true, + }, + { + Model: models.ReService{ + Code: models.ReServiceCodeIDFSIT, + }, + }, + { + Model: models.MTOServiceItem{ + Status: models.MTOServiceItemStatusSubmitted, + }, + }, + }, nil) + + eTag := etag.GenerateEtag(serviceItem.UpdatedAt) + + updatedServiceItem, err := updater.ApproveOrRejectServiceItem( + suite.AppContextForTest(), serviceItem.ID, models.MTOServiceItemStatusApproved, rejectionReason, eTag) + suite.NoError(err) + + // ApproveOrRejectServiceItem doesn't return the service item with the updated move + // get move from the db to check the updated status + err = suite.DB().Find(&move, move.ID) + suite.NoError(err) + suite.Equal(models.MoveStatusAPPROVED, move.Status) + + suite.Equal(models.MTOServiceItemStatusApproved, updatedServiceItem.Status) + suite.NotNil(updatedServiceItem.ApprovedAt) + suite.Nil(updatedServiceItem.RejectionReason) + suite.Nil(updatedServiceItem.RejectedAt) + suite.NotNil(updatedServiceItem) + suite.NotEqual(shipment.DestinationAddressID, *updatedServiceItem.SITDestinationOriginalAddressID) + suite.NotEqual(shipment.DestinationAddress.ID, *updatedServiceItem.SITDestinationOriginalAddressID) + suite.Equal(shipment.DestinationAddress.StreetAddress1, updatedServiceItem.SITDestinationOriginalAddress.StreetAddress1) + suite.Equal(shipment.DestinationAddress.City, updatedServiceItem.SITDestinationOriginalAddress.City) + suite.Equal(shipment.DestinationAddress.State, updatedServiceItem.SITDestinationOriginalAddress.State) + suite.Equal(shipment.DestinationAddress.PostalCode, updatedServiceItem.SITDestinationOriginalAddress.PostalCode) + }) + // Test that the move's status changes to Approvals Requested if any of its service // items' status is SUBMITTED suite.Run("When move is approved and service item is submitted", func() { @@ -2784,6 +3052,52 @@ func (suite *MTOServiceItemServiceSuite) TestUpdateMTOServiceItemStatus() { suite.NotNil(updatedServiceItem) }) + suite.Run("When TOO rejects a IOFSIT service item and converts it to the customer expense", func() { + move := factory.BuildApprovalsRequestedMove(suite.DB(), nil, nil) + serviceItem := factory.BuildMTOServiceItem(suite.DB(), []factory.Customization{ + { + Model: move, + LinkOnly: true, + }, + { + Model: models.ReService{ + Code: models.ReServiceCodeIOFSIT, + }, + }, + { + Model: models.MTOServiceItem{ + Status: models.MTOServiceItemStatusApproved, + }, + }, + { + Model: models.Address{}, + Type: &factory.Addresses.SITOriginHHGActualAddress, + }, + { + Model: models.Address{}, + Type: &factory.Addresses.SITOriginHHGOriginalAddress, + }, + }, nil) + + eTag := etag.GenerateEtag(serviceItem.UpdatedAt) + + updatedServiceItem, err := updater.ApproveOrRejectServiceItem( + suite.AppContextForTest(), serviceItem.ID, models.MTOServiceItemStatusApproved, rejectionReason, eTag) + suite.NoError(err) + + // ApproveOrRejectServiceItem doesn't return the service item with the updated move + // get move from the db to check the updated status + err = suite.DB().Find(&move, move.ID) + suite.NoError(err) + suite.Equal(models.MoveStatusAPPROVED, move.Status) + + suite.Equal(models.MTOServiceItemStatusApproved, updatedServiceItem.Status) + suite.NotNil(updatedServiceItem.ApprovedAt) + suite.Nil(updatedServiceItem.RejectionReason) + suite.Nil(updatedServiceItem.RejectedAt) + suite.NotNil(updatedServiceItem) + }) + suite.Run("Returns a not found error if the updater can't find the ReService code for DOFSIT in the DB.", func() { _, err := updater.ConvertItemToCustomerExpense( suite.AppContextForTest(), &models.MTOShipment{}, models.StringPointer("test"), true) diff --git a/pkg/services/mto_shipment/mto_shipment_updater.go b/pkg/services/mto_shipment/mto_shipment_updater.go index fb75c795a77..fdc31739d46 100644 --- a/pkg/services/mto_shipment/mto_shipment_updater.go +++ b/pkg/services/mto_shipment/mto_shipment_updater.go @@ -1307,7 +1307,8 @@ func UpdateDestinationSITServiceItemsAddress(appCtx appcontext.AppContext, shipm mtoServiceItems := mtoShipment.MTOServiceItems // Only update these serviceItems address ID - serviceItemsToUpdate := []models.ReServiceCode{models.ReServiceCodeDDDSIT, models.ReServiceCodeDDFSIT, models.ReServiceCodeDDASIT, models.ReServiceCodeDDSFSC} + serviceItemsToUpdate := []models.ReServiceCode{models.ReServiceCodeDDDSIT, models.ReServiceCodeDDFSIT, models.ReServiceCodeDDASIT, models.ReServiceCodeDDSFSC, + models.ReServiceCodeIDDSIT, models.ReServiceCodeIDFSIT, models.ReServiceCodeIDASIT, models.ReServiceCodeIDSFSC} for _, serviceItem := range mtoServiceItems { @@ -1350,7 +1351,9 @@ func UpdateDestinationSITServiceItemsSITDeliveryMiles(planner route.Planner, app serviceItem := s reServiceCode := serviceItem.ReService.Code if reServiceCode == models.ReServiceCodeDDDSIT || - reServiceCode == models.ReServiceCodeDDSFSC { + reServiceCode == models.ReServiceCodeDDSFSC || + reServiceCode == models.ReServiceCodeIDDSIT || + reServiceCode == models.ReServiceCodeIDSFSC { var milesCalculated int diff --git a/pkg/services/shipment_address_update/shipment_address_update_requester.go b/pkg/services/shipment_address_update/shipment_address_update_requester.go index 1c2e93b198c..73273149ffc 100644 --- a/pkg/services/shipment_address_update/shipment_address_update_requester.go +++ b/pkg/services/shipment_address_update/shipment_address_update_requester.go @@ -178,7 +178,14 @@ func (f *shipmentAddressUpdateRequester) doesShipmentContainApprovedDestinationS for _, serviceItem := range serviceItems { serviceCode := serviceItem.ReService.Code status := serviceItem.Status - if (serviceCode == models.ReServiceCodeDDASIT || serviceCode == models.ReServiceCodeDDDSIT || serviceCode == models.ReServiceCodeDDFSIT || serviceCode == models.ReServiceCodeDDSFSC) && + if (serviceCode == models.ReServiceCodeDDASIT || + serviceCode == models.ReServiceCodeDDDSIT || + serviceCode == models.ReServiceCodeDDFSIT || + serviceCode == models.ReServiceCodeDDSFSC || + serviceCode == models.ReServiceCodeIDASIT || + serviceCode == models.ReServiceCodeIDDSIT || + serviceCode == models.ReServiceCodeIDFSIT || + serviceCode == models.ReServiceCodeIDSFSC) && status == models.MTOServiceItemStatusApproved { return true } @@ -316,7 +323,14 @@ func (f *shipmentAddressUpdateRequester) RequestShipmentDeliveryAddressUpdate(ap serviceItems := shipment.MTOServiceItems for _, serviceItem := range serviceItems { serviceCode := serviceItem.ReService.Code - if serviceCode == models.ReServiceCodeDDASIT || serviceCode == models.ReServiceCodeDDDSIT || serviceCode == models.ReServiceCodeDDFSIT || serviceCode == models.ReServiceCodeDDSFSC { + if serviceCode == models.ReServiceCodeDDASIT || + serviceCode == models.ReServiceCodeDDDSIT || + serviceCode == models.ReServiceCodeDDFSIT || + serviceCode == models.ReServiceCodeDDSFSC || + serviceCode == models.ReServiceCodeIDASIT || + serviceCode == models.ReServiceCodeIDDSIT || + serviceCode == models.ReServiceCodeIDFSIT || + serviceCode == models.ReServiceCodeIDSFSC { if serviceItem.SITDestinationOriginalAddressID != nil { addressUpdate.SitOriginalAddressID = serviceItem.SITDestinationOriginalAddressID } diff --git a/pkg/services/shipment_address_update/shipment_address_update_requester_test.go b/pkg/services/shipment_address_update/shipment_address_update_requester_test.go index 223cf820988..354ce36dd56 100644 --- a/pkg/services/shipment_address_update/shipment_address_update_requester_test.go +++ b/pkg/services/shipment_address_update/shipment_address_update_requester_test.go @@ -744,6 +744,90 @@ func (suite *ShipmentAddressUpdateServiceSuite) TestCreateApprovedShipmentAddres suite.Equal(*addressUpdate.OldSitDistanceBetween, 0) suite.Equal(*addressUpdate.SitOriginalAddressID, *serviceItemDDASIT.SITDestinationOriginalAddressID) }) + + suite.Run("destination address request succeeds when containing international destination SIT", func() { + move := setupTestData() + newAddress := models.Address{ + StreetAddress1: "123 Any St", + City: "Anchorage", + State: "AK", + PostalCode: "99695", + } + + setupInternationalSITCodes := []models.ReServiceCode{ + models.ReServiceCodeIDASIT, + models.ReServiceCodeIDDSIT, + models.ReServiceCodeIDFSIT, + models.ReServiceCodeIDSFSC, + } + + // loop through test codes to verify updates are applied for expected international SITs + for _, reServiceCode := range setupInternationalSITCodes { + shipment := factory.BuildMTOShipmentWithMove(&move, suite.DB(), []factory.Customization{ + { + Model: models.MTOShipment{ + MarketCode: models.MarketCodeInternational, + }, + }, + }, nil) + + // building service item to get dest SIT checks + serviceItemDDASIT := factory.BuildMTOServiceItem(suite.DB(), []factory.Customization{ + { + Model: models.MTOServiceItem{ + Status: models.MTOServiceItemStatusApproved, + SITDestinationOriginalAddressID: shipment.DestinationAddressID, + }, + }, + { + Model: move, + LinkOnly: true, + }, + { + Model: shipment, + LinkOnly: true, + }, + { + Model: models.ReService{ + Code: reServiceCode, + }, + }, + }, nil) + + // mock ZipTransitDistance function + mockPlanner.On("ZipTransitDistance", + mock.AnythingOfType("*appcontext.appContext"), + "94535", + "94535", + false, + ).Return(0, nil).Once() + mockPlanner.On("ZipTransitDistance", + mock.AnythingOfType("*appcontext.appContext"), + "94523", + "99695", + false, + ).Return(500, nil).Once() + mockPlanner.On("ZipTransitDistance", + mock.AnythingOfType("*appcontext.appContext"), + "94535", + "99695", + false, + ).Return(1000, nil).Once() + + // request the update + update, err := addressUpdateRequester.RequestShipmentDeliveryAddressUpdate(suite.AppContextForTest(), shipment.ID, newAddress, "we really need to change the address", etag.GenerateEtag(shipment.UpdatedAt)) + suite.NoError(err) + suite.NotNil(update) + + // querying the address update to make sure that SIT data was populated + var addressUpdate models.ShipmentAddressUpdate + err = suite.DB().Find(&addressUpdate, update.ID) + suite.NoError(err) + suite.Equal(*addressUpdate.NewSitDistanceBetween, 1000) + suite.Equal(*addressUpdate.OldSitDistanceBetween, 0) + suite.Equal(*addressUpdate.SitOriginalAddressID, *serviceItemDDASIT.SITDestinationOriginalAddressID) + } + }) } func (suite *ShipmentAddressUpdateServiceSuite) TestTOOApprovedShipmentAddressUpdateRequest() {