Skip to content

Commit

Permalink
Merge pull request #14342 from transcom/b-21682-store-total-dependent…
Browse files Browse the repository at this point in the history
…s-main

B 21682 store total dependents main
  • Loading branch information
cameroncaci authored Dec 11, 2024
2 parents 0280952 + d53c3a1 commit 86052a0
Show file tree
Hide file tree
Showing 6 changed files with 160 additions and 3 deletions.
1 change: 1 addition & 0 deletions migrations/app/migrations_manifest.txt
Original file line number Diff line number Diff line change
Expand Up @@ -1039,6 +1039,7 @@
20241111223224_change_international_sit_services_to_accessorials.up.sql
20241115214553_create_re_fsc_multipliers_table.up.sql
20241120221040_change_port_location_fk_to_correct_table.up.sql
20241122155416_total_dependents_calculation.up.sql
20241126222026_add_sort_column_to_re_service_items.up.sql
20241127133504_add_indexes_speed_up_counseling_offices.up.sql
20241202163059_create_test_sequence_dev_env.up.sql
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
-- Set temp timeout due to large file modification
-- Time is 5 minutes in milliseconds
SET statement_timeout = 300000;
SET lock_timeout = 300000;
SET idle_in_transaction_session_timeout = 300000;
-- Zero downtime not necessary, this is not used at this time
ALTER TABLE entitlements
DROP COLUMN IF EXISTS total_dependents; -- This column has never been used, this has been confirmed prior to the migration
-- The calculation should only ever work if dependents 12 and under or 12 and over are present
-- These fields are only present on OCONUS
-- Since we don't know the number of dependents under 12 or 12 and over on CONUS moves, we don't want to default to 0 total dependents. That'd be confusing
ALTER TABLE entitlements
ADD COLUMN total_dependents integer GENERATED ALWAYS AS (
CASE
WHEN dependents_under_twelve IS NULL AND dependents_twelve_and_over IS NULL THEN NULL
ELSE COALESCE(dependents_under_twelve, 0) + COALESCE(dependents_twelve_and_over, 0)
END
) STORED;
11 changes: 9 additions & 2 deletions pkg/handlers/internalapi/orders.go
Original file line number Diff line number Diff line change
Expand Up @@ -229,8 +229,15 @@ func (h CreateOrdersHandler) Handle(params ordersop.CreateOrdersParams) middlewa
in move_dats.go, move_weights, and move_submitted, etc
*/

if saveEntitlementErr := appCtx.DB().Save(&entitlement); saveEntitlementErr != nil {
return handlers.ResponseForError(appCtx.Logger(), saveEntitlementErr), saveEntitlementErr
verrs, err := appCtx.DB().ValidateAndSave(&entitlement)
if err != nil {
appCtx.Logger().Error("Error saving customer entitlement", zap.Error(err))
return handlers.ResponseForError(appCtx.Logger(), err), err
}

if verrs.HasAny() {
appCtx.Logger().Error("Validation error saving customer entitlement", zap.Any("errors", verrs.Errors))
return handlers.ResponseForVErrors(appCtx.Logger(), verrs, nil), nil
}

var deptIndicator *string
Expand Down
67 changes: 67 additions & 0 deletions pkg/handlers/internalapi/orders_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -145,6 +145,73 @@ func (suite *HandlerSuite) TestCreateOrder() {
}
})

suite.Run("properly handles entitlement validation", func() {
address := factory.BuildAddress(suite.DB(), []factory.Customization{
{
Model: models.Address{
IsOconus: models.BoolPointer(true),
},
},
}, nil)

originDutyLocation := factory.BuildDutyLocation(suite.DB(), []factory.Customization{
{
Model: models.DutyLocation{
Name: factory.MakeRandomString(8),
},
},
{
Model: address,
LinkOnly: true,
},
}, nil)

dutyLocation := factory.FetchOrBuildCurrentDutyLocation(suite.DB())
factory.FetchOrBuildPostalCodeToGBLOC(suite.DB(), dutyLocation.Address.PostalCode, "KKFA")
factory.FetchOrBuildDefaultContractor(suite.DB(), nil, nil)

req := httptest.NewRequest("POST", "/orders", nil)
req = suite.AuthenticateRequest(req, sm)

hasDependents := true
spouseHasProGear := true
issueDate := time.Date(2018, time.March, 10, 0, 0, 0, 0, time.UTC)
reportByDate := time.Date(2018, time.August, 1, 0, 0, 0, 0, time.UTC)
ordersType := internalmessages.OrdersTypePERMANENTCHANGEOFSTATION
deptIndicator := internalmessages.DeptIndicatorAIRANDSPACEFORCE
payload := &internalmessages.CreateUpdateOrders{
HasDependents: handlers.FmtBool(hasDependents),
SpouseHasProGear: handlers.FmtBool(spouseHasProGear),
IssueDate: handlers.FmtDate(issueDate),
ReportByDate: handlers.FmtDate(reportByDate),
OrdersType: internalmessages.NewOrdersType(ordersType),
OriginDutyLocationID: *handlers.FmtUUIDPtr(&originDutyLocation.ID),
NewDutyLocationID: handlers.FmtUUID(dutyLocation.ID),
ServiceMemberID: handlers.FmtUUID(sm.ID),
OrdersNumber: handlers.FmtString("123456"),
Tac: handlers.FmtString("E19A"),
Sac: handlers.FmtString("SacNumber"),
DepartmentIndicator: internalmessages.NewDeptIndicator(deptIndicator),
Grade: models.ServiceMemberGradeE1.Pointer(),
DependentsTwelveAndOver: models.Int64Pointer(-2),
}

params := ordersop.CreateOrdersParams{
HTTPRequest: req,
CreateOrders: payload,
}

fakeS3 := storageTest.NewFakeS3Storage(true)
handlerConfig := suite.HandlerConfig()
handlerConfig.SetFileStorer(fakeS3)
createHandler := CreateOrdersHandler{handlerConfig}

response := createHandler.Handle(params)
suite.IsType(&handlers.ValidationErrorsResponse{}, response)
verrsResponse, ok := response.(*handlers.ValidationErrorsResponse)
suite.True(ok)
suite.Contains(verrsResponse.Errors, "dependents_twelve_and_over")
})
}

func (suite *HandlerSuite) TestShowOrder() {
Expand Down
2 changes: 1 addition & 1 deletion pkg/models/ghc_entitlements.go
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,7 @@ import (
type Entitlement struct {
ID uuid.UUID `db:"id"`
DependentsAuthorized *bool `db:"dependents_authorized"`
TotalDependents *int `db:"total_dependents"`
TotalDependents *int `db:"total_dependents" rw:"r"` // DB generated column
NonTemporaryStorage *bool `db:"non_temporary_storage"`
PrivatelyOwnedVehicle *bool `db:"privately_owned_vehicle"`
//DBAuthorizedWeight is AuthorizedWeight when not null
Expand Down
64 changes: 64 additions & 0 deletions pkg/models/ghc_entitlements_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -87,3 +87,67 @@ func (suite *ModelSuite) TestOconusFields() {
suite.NotNil(verrs.Get("dependents_twelve_and_over"))
})
}

func (suite *ModelSuite) TestTotalDependentsCalculation() {
suite.Run("calculates total dependents correctly when both fields are set", func() {
entitlement := models.Entitlement{
DependentsUnderTwelve: models.IntPointer(2),
DependentsTwelveAndOver: models.IntPointer(3),
}
verrs, err := suite.DB().ValidateAndCreate(&entitlement)
suite.NoError(err)
suite.False(verrs.HasAny())
var fetchedEntitlement models.Entitlement
err = suite.DB().Find(&fetchedEntitlement, entitlement.ID)
suite.NoError(err)
suite.Equal(2, *fetchedEntitlement.DependentsUnderTwelve)
suite.Equal(3, *fetchedEntitlement.DependentsTwelveAndOver)
suite.NotNil(fetchedEntitlement.TotalDependents)
suite.Equal(5, *fetchedEntitlement.TotalDependents) // sum of 2 + 3
})
suite.Run("calculates total dependents correctly when DependentsUnderTwelve is nil", func() {
entitlement := models.Entitlement{
DependentsTwelveAndOver: models.IntPointer(3),
}
verrs, err := suite.DB().ValidateAndCreate(&entitlement)
suite.NoError(err)
suite.False(verrs.HasAny())
var fetchedEntitlement models.Entitlement
err = suite.DB().Find(&fetchedEntitlement, entitlement.ID)
suite.NoError(err)
suite.Nil(fetchedEntitlement.DependentsUnderTwelve)
suite.Equal(3, *fetchedEntitlement.DependentsTwelveAndOver)
suite.NotNil(fetchedEntitlement.TotalDependents)
suite.Equal(3, *fetchedEntitlement.TotalDependents) // sum of 0 + 3
})
suite.Run("calculates total dependents correctly when DependentsTwelveAndOver is nil", func() {
entitlement := models.Entitlement{
DependentsUnderTwelve: models.IntPointer(2),
}
verrs, err := suite.DB().ValidateAndCreate(&entitlement)
suite.NoError(err)
suite.False(verrs.HasAny())
var fetchedEntitlement models.Entitlement
err = suite.DB().Find(&fetchedEntitlement, entitlement.ID)
suite.NoError(err)
suite.Equal(2, *fetchedEntitlement.DependentsUnderTwelve)
suite.Nil(fetchedEntitlement.DependentsTwelveAndOver)
suite.NotNil(fetchedEntitlement.TotalDependents)
suite.Equal(2, *fetchedEntitlement.TotalDependents) // sum of 2 + 0
})
suite.Run("sets total dependents to nil when both fields are nil", func() {
entitlement := models.Entitlement{
DependentsUnderTwelve: nil,
DependentsTwelveAndOver: nil,
}
verrs, err := suite.DB().ValidateAndCreate(&entitlement)
suite.NoError(err)
suite.False(verrs.HasAny())
var fetchedEntitlement models.Entitlement
err = suite.DB().Find(&fetchedEntitlement, entitlement.ID)
suite.NoError(err)
suite.Nil(fetchedEntitlement.DependentsUnderTwelve)
suite.Nil(fetchedEntitlement.DependentsTwelveAndOver)
suite.Nil(fetchedEntitlement.TotalDependents) // NOT 0, NOT A SUM, nil + nil is NULL
})
}

0 comments on commit 86052a0

Please sign in to comment.