Skip to content

Commit

Permalink
Merge pull request #14124 from transcom/B-21375-MAIN
Browse files Browse the repository at this point in the history
B-21375 UB Allowance Calculation - MAIN
  • Loading branch information
deandreJones authored Dec 10, 2024
2 parents 60c57cf + bbcbbbb commit 0f4999b
Show file tree
Hide file tree
Showing 34 changed files with 1,140 additions and 23 deletions.
1 change: 1 addition & 0 deletions migrations/app/migrations_manifest.txt
Original file line number Diff line number Diff line change
Expand Up @@ -1029,6 +1029,7 @@
20241024114748_create_gbloc_aors.up.sql
20241029125015_add_orders_type_enum.up.sql
20241029144404_hdt-614-adjust-accomack-county.up.sql
20241031163018_create_ub_allowances_table.up.sql
20241107180705_add_alternative_AK_HI_duty_location_names.up.sql
20241109002854_add_gsr_table_to_move_history.up.sql
20241111203514_add_external_crate_and_remove_icrtsa.up.sql
Expand Down
500 changes: 500 additions & 0 deletions migrations/app/schema/20241031163018_create_ub_allowances_table.up.sql

Large diffs are not rendered by default.

2 changes: 2 additions & 0 deletions pkg/factory/shared.go
Original file line number Diff line number Diff line change
Expand Up @@ -53,6 +53,7 @@ var CustomerSupportRemark CustomType = "CustomerSupportRemark"
var Document CustomType = "Document"
var DutyLocation CustomType = "DutyLocation"
var Entitlement CustomType = "Entitlement"
var UBAllowance CustomType = "UBAllowances"
var EvaluationReport CustomType = "EvaluationReport"
var LineOfAccounting CustomType = "LineOfAccounting"
var MobileHome CustomType = "MobileHome"
Expand Down Expand Up @@ -115,6 +116,7 @@ var defaultTypesMap = map[string]CustomType{
"models.Document": Document,
"models.DutyLocation": DutyLocation,
"models.Entitlement": Entitlement,
"models.UBAllowances": UBAllowance,
"models.EvaluationReport": EvaluationReport,
"models.LineOfAccounting": LineOfAccounting,
"models.MobileHome": MobileHome,
Expand Down
12 changes: 12 additions & 0 deletions pkg/gen/ghcapi/embedded_spec.go

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

4 changes: 4 additions & 0 deletions pkg/gen/ghcmessages/entitlements.go

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

12 changes: 12 additions & 0 deletions pkg/gen/internalapi/embedded_spec.go

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

4 changes: 4 additions & 0 deletions pkg/gen/internalmessages/entitlement.go

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

12 changes: 12 additions & 0 deletions pkg/gen/primeapi/embedded_spec.go

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

4 changes: 4 additions & 0 deletions pkg/gen/primemessages/entitlements.go

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

12 changes: 12 additions & 0 deletions pkg/gen/primev2api/embedded_spec.go

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

4 changes: 4 additions & 0 deletions pkg/gen/primev2messages/entitlements.go

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

12 changes: 12 additions & 0 deletions pkg/gen/primev3api/embedded_spec.go

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

4 changes: 4 additions & 0 deletions pkg/gen/primev3messages/entitlements.go

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

5 changes: 5 additions & 0 deletions pkg/handlers/ghcapi/internal/payloads/model_to_payload.go
Original file line number Diff line number Diff line change
Expand Up @@ -729,6 +729,10 @@ func Entitlement(entitlement *models.Entitlement) *ghcmessages.Entitlements {
if entitlement.DependentsTwelveAndOver != nil {
dependentsTwelveAndOver = models.Int64Pointer(int64(*entitlement.DependentsTwelveAndOver))
}
var ubAllowance *int64
if entitlement.UBAllowance != nil {
ubAllowance = models.Int64Pointer(int64(*entitlement.UBAllowance))
}
return &ghcmessages.Entitlements{
ID: strfmt.UUID(entitlement.ID.String()),
AuthorizedWeight: authorizedWeight,
Expand All @@ -744,6 +748,7 @@ func Entitlement(entitlement *models.Entitlement) *ghcmessages.Entitlements {
DependentsUnderTwelve: dependentsUnderTwelve,
DependentsTwelveAndOver: dependentsTwelveAndOver,
AccompaniedTour: accompaniedTour,
UbAllowance: ubAllowance,
OrganizationalClothingAndIndividualEquipment: entitlement.OrganizationalClothingAndIndividualEquipment,
GunSafe: gunSafe,
ETag: etag.GenerateEtag(entitlement.UpdatedAt),
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -424,6 +424,7 @@ func (suite *PayloadsSuite) TestEntitlement() {
dependentsUnderTwelve := 1
dependentsTwelveAndOver := 1
authorizedWeight := 8000
ubAllowance := 300

entitlement := &models.Entitlement{
ID: entitlementID,
Expand All @@ -440,9 +441,11 @@ func (suite *PayloadsSuite) TestEntitlement() {
DependentsUnderTwelve: &dependentsUnderTwelve,
DependentsTwelveAndOver: &dependentsTwelveAndOver,
UpdatedAt: time.Now(),
UBAllowance: &ubAllowance,
}

returnedEntitlement := Entitlement(entitlement)
returnedUBAllowance := entitlement.UBAllowance

suite.IsType(&ghcmessages.Entitlements{}, returnedEntitlement)

Expand All @@ -451,6 +454,7 @@ func (suite *PayloadsSuite) TestEntitlement() {
suite.Equal(entitlement.DependentsAuthorized, returnedEntitlement.DependentsAuthorized)
suite.Equal(entitlement.NonTemporaryStorage, returnedEntitlement.NonTemporaryStorage)
suite.Equal(entitlement.PrivatelyOwnedVehicle, returnedEntitlement.PrivatelyOwnedVehicle)
suite.Equal(int(*returnedUBAllowance), int(*returnedEntitlement.UbAllowance))
suite.Equal(int64(proGearWeight), returnedEntitlement.ProGearWeight)
suite.Equal(int64(proGearWeightSpouse), returnedEntitlement.ProGearWeightSpouse)
suite.Equal(storageInTransit, int(*returnedEntitlement.StorageInTransit))
Expand Down
7 changes: 6 additions & 1 deletion pkg/handlers/ghcapi/orders.go
Original file line number Diff line number Diff line change
Expand Up @@ -237,7 +237,6 @@ func (h CreateOrderHandler) Handle(params orderop.CreateOrderParams) middleware.

grade := (internalmessages.OrderPayGrade)(*payload.Grade)
weightAllotment := models.GetWeightAllotment(grade)

weight := weightAllotment.TotalWeightSelf
if *payload.HasDependents {
weight = weightAllotment.TotalWeightSelfPlusDependents
Expand All @@ -253,6 +252,11 @@ func (h CreateOrderHandler) Handle(params orderop.CreateOrderParams) middleware.
if payload.DependentsUnderTwelve != nil {
dependentsUnderTwelve = models.IntPointer(int(*payload.DependentsUnderTwelve))
}
// Calculate UB allowance for the order entitlement
unaccompaniedBaggageAllowance, err := models.GetUBWeightAllowance(appCtx, originDutyLocation.Address.IsOconus, newDutyLocation.Address.IsOconus, serviceMember.Affiliation, &grade, (*internalmessages.OrdersType)(payload.OrdersType), payload.HasDependents, payload.AccompaniedTour, dependentsUnderTwelve, dependentsTwelveAndOver)
if err == nil {
weightAllotment.UnaccompaniedBaggageAllowance = unaccompaniedBaggageAllowance
}

entitlement := models.Entitlement{
DependentsAuthorized: payload.HasDependents,
Expand All @@ -263,6 +267,7 @@ func (h CreateOrderHandler) Handle(params orderop.CreateOrderParams) middleware.
AccompaniedTour: payload.AccompaniedTour,
DependentsUnderTwelve: dependentsUnderTwelve,
DependentsTwelveAndOver: dependentsTwelveAndOver,
UBAllowance: &weightAllotment.UnaccompaniedBaggageAllowance,
}

if saveEntitlementErr := appCtx.DB().Save(&entitlement); saveEntitlementErr != nil {
Expand Down
45 changes: 41 additions & 4 deletions pkg/handlers/internalapi/orders.go
Original file line number Diff line number Diff line change
Expand Up @@ -81,6 +81,9 @@ func payloadForOrdersModel(storer storage.FileStorer, order models.Order) (*inte
if order.Entitlement.DependentsTwelveAndOver != nil {
entitlement.DependentsTwelveAndOver = models.Int64Pointer(int64(*order.Entitlement.DependentsTwelveAndOver))
}
if order.Entitlement.UBAllowance != nil {
entitlement.UbAllowance = models.Int64Pointer(int64(*order.Entitlement.UBAllowance))
}
}
var originDutyLocation models.DutyLocation
originDutyLocation = models.DutyLocation{}
Expand Down Expand Up @@ -191,12 +194,18 @@ func (h CreateOrdersHandler) Handle(params ordersop.CreateOrdersParams) middlewa
}

grade := payload.Grade
weightAllotment := models.GetWeightAllotment(*grade)

// Calculate the entitlement for the order
weightAllotment := models.GetWeightAllotment(*grade)
weight := weightAllotment.TotalWeightSelf
if *payload.HasDependents {
weight = weightAllotment.TotalWeightSelfPlusDependents
}
// Calculate UB allowance for the order entitlement
unaccompaniedBaggageAllowance, err := models.GetUBWeightAllowance(appCtx, originDutyLocation.Address.IsOconus, newDutyLocation.Address.IsOconus, serviceMember.Affiliation, grade, payload.OrdersType, payload.HasDependents, payload.AccompaniedTour, dependentsUnderTwelve, dependentsTwelveAndOver)
if err == nil {
weightAllotment.UnaccompaniedBaggageAllowance = unaccompaniedBaggageAllowance
}

// Assign default SIT allowance based on customer type.
// We only have service members right now, but once we introduce more, this logic will have to change.
Expand All @@ -211,6 +220,7 @@ func (h CreateOrdersHandler) Handle(params ordersop.CreateOrdersParams) middlewa
StorageInTransit: models.IntPointer(sitDaysAllowance),
ProGearWeight: weightAllotment.ProGearWeight,
ProGearWeightSpouse: weightAllotment.ProGearWeightSpouse,
UBAllowance: &weightAllotment.UnaccompaniedBaggageAllowance,
}

/*
Expand Down Expand Up @@ -408,8 +418,17 @@ func (h UpdateOrdersHandler) Handle(params ordersop.UpdateOrdersParams) middlewa
order.TAC = payload.Tac
order.SAC = payload.Sac

serviceMemberID, err := uuid.FromString(payload.ServiceMemberID.String())
if err != nil {
return handlers.ResponseForError(appCtx.Logger(), err), err
}
serviceMember, err := models.FetchServiceMemberForUser(appCtx.DB(), appCtx.Session(), serviceMemberID)
if err != nil {
return handlers.ResponseForError(appCtx.Logger(), err), err
}

// Check if the grade or dependents are receiving an update
if hasEntitlementChanged(order, payload.Grade, payload.DependentsUnderTwelve, payload.DependentsTwelveAndOver, payload.AccompaniedTour) {
if hasEntitlementChanged(order, payload.OrdersType, payload.Grade, payload.DependentsUnderTwelve, payload.DependentsTwelveAndOver, payload.AccompaniedTour) {
weightAllotment := models.GetWeightAllotment(*payload.Grade)
weight := weightAllotment.TotalWeightSelf
if *payload.HasDependents {
Expand All @@ -429,6 +448,20 @@ func (h UpdateOrdersHandler) Handle(params ordersop.UpdateOrdersParams) middlewa
// Convert from int64 to int
dependentsUnderTwelve = models.IntPointer(int(*payload.DependentsUnderTwelve))
}
var grade *internalmessages.OrderPayGrade
if payload.Grade != nil {
grade = payload.Grade
} else {
grade = order.Grade
}

// Calculate UB allowance for the order entitlement
if order.Entitlement != nil {
unaccompaniedBaggageAllowance, err := models.GetUBWeightAllowance(appCtx, order.OriginDutyLocation.Address.IsOconus, order.NewDutyLocation.Address.IsOconus, serviceMember.Affiliation, grade, payload.OrdersType, payload.HasDependents, payload.AccompaniedTour, dependentsUnderTwelve, dependentsTwelveAndOver)
if err == nil {
weightAllotment.UnaccompaniedBaggageAllowance = unaccompaniedBaggageAllowance
}
}

entitlement := models.Entitlement{
DependentsAuthorized: payload.HasDependents,
Expand All @@ -439,6 +472,7 @@ func (h UpdateOrdersHandler) Handle(params ordersop.UpdateOrdersParams) middlewa
DependentsUnderTwelve: dependentsUnderTwelve,
DependentsTwelveAndOver: dependentsTwelveAndOver,
AccompaniedTour: payload.AccompaniedTour,
UBAllowance: &weightAllotment.UnaccompaniedBaggageAllowance,
}

/*
Expand Down Expand Up @@ -503,12 +537,15 @@ func (h UpdateOrdersHandler) Handle(params ordersop.UpdateOrdersParams) middlewa

// Helper func for the UpdateOrdersHandler to check if the entitlement has changed from the new payload
// This handles the nil checks and value comparisons outside of the handler func for organization
func hasEntitlementChanged(order models.Order, payloadPayGrade *internalmessages.OrderPayGrade, payloadDependentsUnderTwelve *int64, payloadDependentsTwelveAndOver *int64, payloadAccompaniedTour *bool) bool {
func hasEntitlementChanged(order models.Order, payloadOrderType *internalmessages.OrdersType, payloadPayGrade *internalmessages.OrderPayGrade, payloadDependentsUnderTwelve *int64, payloadDependentsTwelveAndOver *int64, payloadAccompaniedTour *bool) bool {
// Check pay grade
if (order.Grade == nil && payloadPayGrade != nil) || (order.Grade != nil && payloadPayGrade == nil) || (order.Grade != nil && payloadPayGrade != nil && *order.Grade != *payloadPayGrade) {
return true
}

// check orders type
if (order.OrdersType == "" && payloadOrderType != nil) || (order.OrdersType != "" && payloadPayGrade == nil) || (order.OrdersType != "" && payloadPayGrade != nil && internalmessages.OrderPayGrade(order.OrdersType) != *payloadPayGrade) {
return true
}
// Check entitlement
if order.Entitlement != nil {
// Check dependents under twelve
Expand Down
Loading

0 comments on commit 0f4999b

Please sign in to comment.