diff --git a/pkg/edi/invoice/generator.go b/pkg/edi/invoice/generator.go index ad1f39d42de..acc65ea864f 100644 --- a/pkg/edi/invoice/generator.go +++ b/pkg/edi/invoice/generator.go @@ -40,7 +40,7 @@ type InvoiceHeader struct { PaymentRequestNumber edisegment.N9 ContractCode edisegment.N9 ServiceMemberName edisegment.N9 - ServiceMemberRank edisegment.N9 + OrderPayGrade edisegment.N9 ServiceMemberBranch edisegment.N9 ServiceMemberDodID edisegment.N9 MoveCode edisegment.N9 @@ -92,7 +92,7 @@ func (ih *InvoiceHeader) NonEmptySegments() []edisegment.Segment { &ih.PaymentRequestNumber, &ih.ContractCode, &ih.ServiceMemberName, - &ih.ServiceMemberRank, + &ih.OrderPayGrade, &ih.ServiceMemberBranch, &ih.ServiceMemberDodID, &ih.MoveCode, diff --git a/pkg/edi/invoice/generator_test.go b/pkg/edi/invoice/generator_test.go index 3d63191f0c8..c68825dc211 100644 --- a/pkg/edi/invoice/generator_test.go +++ b/pkg/edi/invoice/generator_test.go @@ -124,7 +124,7 @@ func MakeValidEdi() Invoice858C { ReferenceIdentificationQualifier: "1W", ReferenceIdentification: "Leo, Spacemen", }, - ServiceMemberRank: edisegment.N9{ + OrderPayGrade: edisegment.N9{ ReferenceIdentificationQualifier: "ML", ReferenceIdentification: "E_1", }, diff --git a/pkg/factory/entitlement_factory.go b/pkg/factory/entitlement_factory.go index adda28ce3d0..2090eb20538 100644 --- a/pkg/factory/entitlement_factory.go +++ b/pkg/factory/entitlement_factory.go @@ -3,6 +3,7 @@ package factory import ( "github.com/gobuffalo/pop/v6" + "github.com/transcom/mymove/pkg/gen/internalmessages" "github.com/transcom/mymove/pkg/models" "github.com/transcom/mymove/pkg/testdatagen" ) @@ -27,7 +28,8 @@ func BuildEntitlement(db *pop.Connection, customs []Customization, traits []Trai // At this point, Entitlement may exist or be blank. Depending on if customization was provided. // Find an Orders customization if available - to extract the grade - var grade *string + var grade *internalmessages.OrderPayGrade + defaultGrade := models.ServiceMemberGradeE1 var order models.Order result := findValidCustomization(customs, Order) if result != nil { @@ -35,7 +37,7 @@ func BuildEntitlement(db *pop.Connection, customs []Customization, traits []Trai grade = order.Grade // extract grade } if grade == nil || *grade == "" { - grade = models.StringPointer("E_1") + grade = &defaultGrade } dependents := 0 @@ -58,7 +60,7 @@ func BuildEntitlement(db *pop.Connection, customs []Customization, traits []Trai OrganizationalClothingAndIndividualEquipment: ocie, } // Set default calculated values - entitlement.SetWeightAllotment(*grade) + entitlement.SetWeightAllotment(string(*grade)) entitlement.DBAuthorizedWeight = entitlement.AuthorizedWeight() // Overwrite default values with those from custom Entitlement diff --git a/pkg/factory/entitlement_factory_test.go b/pkg/factory/entitlement_factory_test.go index c2dab527b44..dffdd89ca39 100644 --- a/pkg/factory/entitlement_factory_test.go +++ b/pkg/factory/entitlement_factory_test.go @@ -3,6 +3,7 @@ package factory import ( "github.com/gofrs/uuid" + "github.com/transcom/mymove/pkg/gen/internalmessages" "github.com/transcom/mymove/pkg/models" ) @@ -133,9 +134,10 @@ func (suite *FactorySuite) TestBuildEntitlement() { // Now DBAuthorizedWeight should be appropriate for O_9 grade // FUNCTION UNDER TEST + grade := internalmessages.OrderPayGrade(models.ServiceMemberGradeO9) entitlement := BuildEntitlement(suite.DB(), []Customization{ {Model: models.Order{ - Grade: models.StringPointer("O_9"), + Grade: &grade, }}, }, nil) diff --git a/pkg/factory/order_factory.go b/pkg/factory/order_factory.go index f988ac91e20..903c0c58dc4 100644 --- a/pkg/factory/order_factory.go +++ b/pkg/factory/order_factory.go @@ -198,7 +198,7 @@ func buildOrderWithBuildType(db *pop.Connection, customs []Customization, traits defaultOrdersNumber := "ORDER3" defaultTACNumber := "F8E1" defaultDepartmentIndicator := "AIR_AND_SPACE_FORCE" - defaultGrade := "E_1" + defaultGrade := models.ServiceMemberGradeE1 defaultHasDependents := false defaultSpouseHasProGear := false defaultOrdersType := internalmessages.OrdersTypePERMANENTCHANGEOFSTATION diff --git a/pkg/factory/order_factory_test.go b/pkg/factory/order_factory_test.go index 184f28cf46e..ac9e65d99e0 100644 --- a/pkg/factory/order_factory_test.go +++ b/pkg/factory/order_factory_test.go @@ -39,7 +39,7 @@ func (suite *FactorySuite) TestBuildOrder() { suite.Equal(defaultOrdersNumber, *order.OrdersNumber) suite.Equal(defaultTACNumber, *order.TAC) suite.Equal(defaultDepartmentIndicator, *order.DepartmentIndicator) - suite.Equal(defaultGrade, *order.Grade) + suite.Equal(defaultGrade, string(*order.Grade)) suite.Equal(defaultHasDependents, order.HasDependents) suite.Equal(defaultSpouseHasProGear, order.SpouseHasProGear) suite.Equal(defaultOrdersType, order.OrdersType) @@ -52,16 +52,12 @@ func (suite *FactorySuite) TestBuildOrder() { // extended service members have backup contacts suite.False(order.ServiceMemberID.IsNil()) suite.False(order.ServiceMember.ID.IsNil()) - suite.False(order.ServiceMember.DutyLocationID.IsNil()) + suite.False(order.OriginDutyLocationID.IsNil()) suite.NotEmpty(order.ServiceMember.BackupContacts) serviceMemberCountInDB, err := suite.DB().Count(models.ServiceMember{}) suite.NoError(err) suite.Equal(1, serviceMemberCountInDB) - // uses the same duty location name for service member and - // orders OriginDutyLocation - suite.Equal(order.ServiceMember.DutyLocation.Name, order.OriginDutyLocation.Name) - // uses the default orders NewDutyLocation suite.Equal(order.NewDutyLocation.Name, "Fort Eisenhower, GA 30813") @@ -139,9 +135,9 @@ func (suite *FactorySuite) TestBuildOrder() { order := BuildOrder(suite.DB(), customs, nil) suite.Equal(originDutyLocation.Name, order.OriginDutyLocation.Name) - suite.Equal(originDutyLocation.Name, order.ServiceMember.DutyLocation.Name) + suite.Equal(originDutyLocation.Name, order.OriginDutyLocation.Name) + suite.Equal(originDutyLocationTOName, order.OriginDutyLocation.TransportationOffice.Name) suite.Equal(originDutyLocationTOName, order.OriginDutyLocation.TransportationOffice.Name) - suite.Equal(originDutyLocationTOName, order.ServiceMember.DutyLocation.TransportationOffice.Name) suite.Equal(*serviceMember.FirstName, *order.ServiceMember.FirstName) suite.Equal(*serviceMember.LastName, *order.ServiceMember.LastName) suite.Equal(uploadedOrders.ID, order.UploadedOrdersID) @@ -187,7 +183,7 @@ func (suite *FactorySuite) TestBuildOrder() { suite.Equal(defaultOrdersNumber, *order.OrdersNumber) suite.Equal(defaultTACNumber, *order.TAC) suite.Equal(defaultDepartmentIndicator, *order.DepartmentIndicator) - suite.Equal(defaultGrade, *order.Grade) + suite.Equal(defaultGrade, string(*order.Grade)) suite.Equal(defaultHasDependents, order.HasDependents) suite.Equal(defaultSpouseHasProGear, order.SpouseHasProGear) suite.Equal(defaultOrdersType, order.OrdersType) @@ -212,7 +208,7 @@ func (suite *FactorySuite) TestBuildOrder() { suite.Nil(order.TAC) suite.Nil(order.DepartmentIndicator) suite.Nil(order.OrdersTypeDetail) - suite.Equal(defaultGrade, *order.Grade) + suite.Equal(defaultGrade, string(*order.Grade)) suite.Equal(defaultHasDependents, order.HasDependents) suite.Equal(defaultSpouseHasProGear, order.SpouseHasProGear) suite.Equal(defaultOrdersType, order.OrdersType) @@ -233,7 +229,7 @@ func (suite *FactorySuite) TestBuildOrder() { suite.Nil(order.TAC) suite.Nil(order.DepartmentIndicator) suite.Nil(order.OrdersTypeDetail) - suite.Equal(defaultGrade, *order.Grade) + suite.Equal(defaultGrade, string(*order.Grade)) suite.Equal(defaultHasDependents, order.HasDependents) suite.Equal(defaultSpouseHasProGear, order.SpouseHasProGear) suite.Equal(defaultOrdersType, order.OrdersType) diff --git a/pkg/factory/service_member_factory.go b/pkg/factory/service_member_factory.go index a58229b73cf..cf5fa7a28a4 100644 --- a/pkg/factory/service_member_factory.go +++ b/pkg/factory/service_member_factory.go @@ -58,7 +58,6 @@ func buildServiceMemberWithBuildType(db *pop.Connection, customs []Customization email := "leo_spaceman_sm@example.com" agency := models.AffiliationARMY - rank := models.ServiceMemberRankE1 // Create random edipi randomEdipi := RandomEdipi() @@ -74,7 +73,6 @@ func buildServiceMemberWithBuildType(db *pop.Connection, customs []Customization PersonalEmail: &email, ResidentialAddressID: &resAddress.ID, ResidentialAddress: &resAddress, - Rank: &rank, } backupAddressResult := findValidCustomization(customs, Addresses.BackupMailingAddress) @@ -88,15 +86,6 @@ func buildServiceMemberWithBuildType(db *pop.Connection, customs []Customization serviceMember.BackupMailingAddress = &backupAddress } - dutyLocationResult := findValidCustomization(customs, DutyLocation) - // Find/create the DutyLocation if customization is - // provided - if dutyLocationResult != nil { - dutyLocation := BuildDutyLocation(db, customs, traits) - serviceMember.DutyLocationID = &dutyLocation.ID - serviceMember.DutyLocation = dutyLocation - } - if buildType == serviceMemberBuildExtended { serviceMember.EmailIsPreferred = models.BoolPointer(true) @@ -107,14 +96,6 @@ func buildServiceMemberWithBuildType(db *pop.Connection, customs []Customization serviceMember.BackupMailingAddressID = &backupAddress.ID serviceMember.BackupMailingAddress = &backupAddress } - - // ensure extended service member has duty location, - // even if customization is not provided - if serviceMember.DutyLocationID == nil { - dutyLocation := FetchOrBuildCurrentDutyLocation(db) - serviceMember.DutyLocationID = &dutyLocation.ID - serviceMember.DutyLocation = dutyLocation - } } // Overwrite values with those from customizations diff --git a/pkg/factory/service_member_factory_test.go b/pkg/factory/service_member_factory_test.go index 250948e6190..963045d6c9e 100644 --- a/pkg/factory/service_member_factory_test.go +++ b/pkg/factory/service_member_factory_test.go @@ -9,7 +9,6 @@ import ( func (suite *FactorySuite) TestBuildServiceMember() { defaultEmail := "leo_spaceman_sm@example.com" defaultAgency := models.AffiliationARMY - defaultRank := models.ServiceMemberRankE1 suite.Run("Successful creation of default ServiceMember", func() { // Under test: BuildServiceMember // Mocked: None @@ -21,7 +20,6 @@ func (suite *FactorySuite) TestBuildServiceMember() { FirstName: models.StringPointer("Leo"), LastName: models.StringPointer("Spacemen"), Telephone: models.StringPointer("212-123-4567"), - Rank: &defaultRank, PersonalEmail: &defaultEmail, Affiliation: &defaultAgency, } @@ -42,7 +40,6 @@ func (suite *FactorySuite) TestBuildServiceMember() { // VALIDATE RESULTS suite.Equal(defaultServiceMember.FirstName, serviceMember.FirstName) suite.Equal(defaultServiceMember.LastName, serviceMember.LastName) - suite.Equal(defaultServiceMember.Rank, serviceMember.Rank) suite.Equal(defaultServiceMember.PersonalEmail, serviceMember.PersonalEmail) suite.Equal(defaultServiceMember.Telephone, serviceMember.Telephone) suite.Equal(defaultServiceMember.Affiliation, serviceMember.Affiliation) @@ -60,7 +57,6 @@ func (suite *FactorySuite) TestBuildServiceMember() { // Set up: Create a Service Member and pass custom fields // Expected outcome:serviceMember should be created with custom fields // SETUP - customRank := models.ServiceMemberRankE3 customAffiliation := models.AffiliationAIRFORCE customServiceMember := models.ServiceMember{ @@ -69,7 +65,6 @@ func (suite *FactorySuite) TestBuildServiceMember() { Telephone: models.StringPointer("999-999-9999"), SecondaryTelephone: models.StringPointer("123-555-9999"), PersonalEmail: models.StringPointer("peyton@example.com"), - Rank: &customRank, Edipi: models.StringPointer("1000011111"), Affiliation: &customAffiliation, Suffix: models.StringPointer("Random suffix string"), @@ -98,7 +93,6 @@ func (suite *FactorySuite) TestBuildServiceMember() { suite.Equal(customServiceMember.Telephone, serviceMember.Telephone) suite.Equal(customServiceMember.SecondaryTelephone, serviceMember.SecondaryTelephone) suite.Equal(customServiceMember.PersonalEmail, serviceMember.PersonalEmail) - suite.Equal(customServiceMember.Rank, serviceMember.Rank) suite.Equal(customServiceMember.Edipi, serviceMember.Edipi) suite.Equal(customServiceMember.Affiliation, serviceMember.Affiliation) suite.Equal(customServiceMember.Suffix, serviceMember.Suffix) @@ -118,7 +112,6 @@ func (suite *FactorySuite) TestBuildServiceMember() { // Expected outcome:serviceMember should be created with custom residential address different from address attached backup mailing address // SETUP - customRank := models.ServiceMemberRankE3 customAffiliation := models.AffiliationAIRFORCE customResidentialAddress := models.Address{ @@ -135,7 +128,6 @@ func (suite *FactorySuite) TestBuildServiceMember() { Telephone: models.StringPointer("999-999-9999"), SecondaryTelephone: models.StringPointer("123-555-9999"), PersonalEmail: models.StringPointer("peyton@example.com"), - Rank: &customRank, Edipi: models.StringPointer("1000011111"), Affiliation: &customAffiliation, Suffix: models.StringPointer("Random suffix string"), @@ -156,7 +148,6 @@ func (suite *FactorySuite) TestBuildServiceMember() { suite.Equal(customServiceMember.Telephone, serviceMember.Telephone) suite.Equal(customServiceMember.SecondaryTelephone, serviceMember.SecondaryTelephone) suite.Equal(customServiceMember.PersonalEmail, serviceMember.PersonalEmail) - suite.Equal(customServiceMember.Rank, serviceMember.Rank) suite.Equal(customServiceMember.Edipi, serviceMember.Edipi) suite.Equal(customServiceMember.Affiliation, serviceMember.Affiliation) suite.Equal(customServiceMember.Suffix, serviceMember.Suffix) @@ -242,7 +233,6 @@ func (suite *FactorySuite) TestBuildServiceMember() { // members and a backupContact should be created // SETUP - customRank := models.ServiceMemberRankE3 customAffiliation := models.AffiliationAIRFORCE customServiceMember := models.ServiceMember{ @@ -251,7 +241,6 @@ func (suite *FactorySuite) TestBuildServiceMember() { Telephone: models.StringPointer("999-999-9999"), SecondaryTelephone: models.StringPointer("123-555-9999"), PersonalEmail: models.StringPointer("peyton@example.com"), - Rank: &customRank, Edipi: models.StringPointer("1000011111"), Affiliation: &customAffiliation, Suffix: models.StringPointer("Random suffix string"), @@ -288,7 +277,6 @@ func (suite *FactorySuite) TestBuildServiceMember() { suite.Equal(customServiceMember.Telephone, serviceMember.Telephone) suite.Equal(customServiceMember.SecondaryTelephone, serviceMember.SecondaryTelephone) suite.Equal(customServiceMember.PersonalEmail, serviceMember.PersonalEmail) - suite.Equal(customServiceMember.Rank, serviceMember.Rank) suite.Equal(customServiceMember.Edipi, serviceMember.Edipi) suite.Equal(customServiceMember.Affiliation, serviceMember.Affiliation) suite.Equal(customServiceMember.Suffix, serviceMember.Suffix) @@ -328,10 +316,6 @@ func (suite *FactorySuite) TestBuildServiceMember() { suite.Equal(customBackupAddress.PostalCode, serviceMember.BackupMailingAddress.PostalCode) - ordersDutyLocation := FetchOrBuildCurrentDutyLocation(suite.DB()) - suite.Equal(ordersDutyLocation.ID, serviceMember.DutyLocation.ID) - suite.Equal(ordersDutyLocation.Name, serviceMember.DutyLocation.Name) - // Check that backup contact was made and appended to service member suite.Equal(1, len(serviceMember.BackupContacts)) suite.Equal(models.BackupContactPermissionEDIT, serviceMember.BackupContacts[0].Permission) @@ -345,8 +329,7 @@ func (suite *FactorySuite) TestBuildServiceMember() { precount, err := suite.DB().Count(&models.ServiceMember{}) suite.NoError(err) - serviceMember := BuildExtendedServiceMember(nil, nil, nil) - suite.Equal("Yuma AFB", serviceMember.DutyLocation.Name) + BuildExtendedServiceMember(nil, nil, nil) count, err := suite.DB().Count(&models.ServiceMember{}) suite.Equal(precount, count) diff --git a/pkg/factory/shared_test.go b/pkg/factory/shared_test.go index 0609e5e4974..ac812f047b3 100644 --- a/pkg/factory/shared_test.go +++ b/pkg/factory/shared_test.go @@ -332,7 +332,6 @@ func (suite *FactorySuite) TestNestedModelsCheck() { testid := uuid.Must(uuid.NewV4()) edipi := RandomEdipi() timestamp := time.Now() - rank := models.ServiceMemberRankE4 name := "Riley Baker" phone := "555-777-9929" @@ -344,7 +343,6 @@ func (suite *FactorySuite) TestNestedModelsCheck() { UserID: testid, Edipi: &edipi, Affiliation: &navy, - Rank: &rank, FirstName: &name, MiddleName: &name, LastName: &name, @@ -356,7 +354,6 @@ func (suite *FactorySuite) TestNestedModelsCheck() { EmailIsPreferred: models.BoolPointer(false), ResidentialAddressID: &testid, BackupMailingAddressID: &testid, - DutyLocationID: &testid, }, Type: &ServiceMember, } diff --git a/pkg/gen/internalapi/embedded_spec.go b/pkg/gen/internalapi/embedded_spec.go index f13223db818..bca600edc1b 100644 --- a/pkg/gen/internalapi/embedded_spec.go +++ b/pkg/gen/internalapi/embedded_spec.go @@ -4004,6 +4004,9 @@ func init() { "x-nullable": true, "example": "John" }, + "grade": { + "$ref": "#/definitions/OrderPayGrade" + }, "last_name": { "type": "string", "title": "Last name", @@ -4029,9 +4032,6 @@ func init() { "title": "Phone", "x-nullable": true }, - "rank": { - "$ref": "#/definitions/ServiceMemberRank" - }, "residential_address": { "$ref": "#/definitions/Address" }, @@ -4403,13 +4403,13 @@ func init() { "type": "object", "properties": { "proGear": { - "description": "Pro-gear weight limit as set by an Office user, distinct from the service member's default weight allotment determined by rank\n", + "description": "Pro-gear weight limit as set by an Office user, distinct from the service member's default weight allotment determined by pay grade\n", "type": "integer", "x-nullable": true, "example": 2000 }, "proGearSpouse": { - "description": "Spouse's pro-gear weight limit as set by an Office user, distinct from the service member's default weight allotment determined by rank\n", + "description": "Spouse's pro-gear weight limit as set by an Office user, distinct from the service member's default weight allotment determined by pay grade\n", "type": "integer", "x-nullable": true, "example": 500 @@ -5096,7 +5096,7 @@ func init() { "locator", "customer_name", "edipi", - "rank", + "grade", "orders_type", "branch_of_service", "last_modified_date", @@ -5154,6 +5154,9 @@ func init() { "x-nullable": true, "example": "LNK12345" }, + "grade": { + "$ref": "#/definitions/OrderPayGrade" + }, "hhg_status": { "type": "string", "x-nullable": true, @@ -5224,9 +5227,6 @@ func init() { "x-nullable": true, "example": "PAYMENT_REQUESTED" }, - "rank": { - "$ref": "#/definitions/ServiceMemberRank" - }, "status": { "type": "string", "example": "APPROVED" @@ -5558,7 +5558,7 @@ func init() { }, "OrderPayGrade": { "type": "string", - "title": "Rank", + "title": "Grade", "enum": [ "E_1", "E_2", @@ -5655,9 +5655,7 @@ func init() { "$ref": "#/definitions/Entitlement" }, "grade": { - "type": "string", - "x-nullable": true, - "example": "O-6" + "$ref": "#/definitions/OrderPayGrade" }, "has_dependents": { "type": "boolean", @@ -6374,9 +6372,6 @@ func init() { "title": "Phone", "x-nullable": true }, - "rank": { - "$ref": "#/definitions/ServiceMemberRank" - }, "residential_address": { "$ref": "#/definitions/Address" }, @@ -6936,9 +6931,6 @@ func init() { "type": "string", "format": "date-time" }, - "current_location": { - "$ref": "#/definitions/DutyLocationPayload" - }, "edipi": { "type": "string", "format": "edipi", @@ -6960,6 +6952,10 @@ func init() { "x-nullable": true, "example": "John" }, + "grade": { + "title": "Grade", + "$ref": "#/definitions/OrderPayGrade" + }, "id": { "type": "string", "format": "uuid", @@ -6999,10 +6995,6 @@ func init() { "title": "Telephone", "x-nullable": true }, - "rank": { - "title": "Rank", - "$ref": "#/definitions/ServiceMemberRank" - }, "residential_address": { "title": "Residential Address", "$ref": "#/definitions/Address" @@ -7043,73 +7035,6 @@ func init() { } } }, - "ServiceMemberRank": { - "type": "string", - "title": "Rank", - "enum": [ - "E_1", - "E_2", - "E_3", - "E_4", - "E_5", - "E_6", - "E_7", - "E_8", - "E_9", - "E_9_SPECIAL_SENIOR_ENLISTED", - "O_1_ACADEMY_GRADUATE", - "O_2", - "O_3", - "O_4", - "O_5", - "O_6", - "O_7", - "O_8", - "O_9", - "O_10", - "W_1", - "W_2", - "W_3", - "W_4", - "W_5", - "AVIATION_CADET", - "CIVILIAN_EMPLOYEE", - "ACADEMY_CADET", - "MIDSHIPMAN" - ], - "x-display-value": { - "ACADEMY_CADET": "Service Academy Cadet", - "AVIATION_CADET": "Aviation Cadet", - "CIVILIAN_EMPLOYEE": "Civilian Employee", - "E_1": "E-1", - "E_2": "E-2", - "E_3": "E-3", - "E_4": "E-4", - "E_5": "E-5", - "E_6": "E-6", - "E_7": "E-7", - "E_8": "E-8", - "E_9": "E-9", - "E_9_SPECIAL_SENIOR_ENLISTED": "E-9 (Special Senior Enlisted)", - "MIDSHIPMAN": "Midshipman", - "O_10": "O-10", - "O_1_ACADEMY_GRADUATE": "O-1 or Service Academy Graduate", - "O_2": "O-2", - "O_3": "O-3", - "O_4": "O-4", - "O_5": "O-5", - "O_6": "O-6", - "O_7": "O-7", - "O_8": "O-8", - "O_9": "O-9", - "W_1": "W-1", - "W_2": "W-2", - "W_3": "W-3", - "W_4": "W-4", - "W_5": "W-5" - }, - "x-nullable": true - }, "SignedCertification": { "description": "Signed certification", "type": "object", @@ -12660,6 +12585,9 @@ func init() { "x-nullable": true, "example": "John" }, + "grade": { + "$ref": "#/definitions/OrderPayGrade" + }, "last_name": { "type": "string", "title": "Last name", @@ -12685,9 +12613,6 @@ func init() { "title": "Phone", "x-nullable": true }, - "rank": { - "$ref": "#/definitions/ServiceMemberRank" - }, "residential_address": { "$ref": "#/definitions/Address" }, @@ -13061,13 +12986,13 @@ func init() { "type": "object", "properties": { "proGear": { - "description": "Pro-gear weight limit as set by an Office user, distinct from the service member's default weight allotment determined by rank\n", + "description": "Pro-gear weight limit as set by an Office user, distinct from the service member's default weight allotment determined by pay grade\n", "type": "integer", "x-nullable": true, "example": 2000 }, "proGearSpouse": { - "description": "Spouse's pro-gear weight limit as set by an Office user, distinct from the service member's default weight allotment determined by rank\n", + "description": "Spouse's pro-gear weight limit as set by an Office user, distinct from the service member's default weight allotment determined by pay grade\n", "type": "integer", "x-nullable": true, "example": 500 @@ -13756,7 +13681,7 @@ func init() { "locator", "customer_name", "edipi", - "rank", + "grade", "orders_type", "branch_of_service", "last_modified_date", @@ -13814,6 +13739,9 @@ func init() { "x-nullable": true, "example": "LNK12345" }, + "grade": { + "$ref": "#/definitions/OrderPayGrade" + }, "hhg_status": { "type": "string", "x-nullable": true, @@ -13884,9 +13812,6 @@ func init() { "x-nullable": true, "example": "PAYMENT_REQUESTED" }, - "rank": { - "$ref": "#/definitions/ServiceMemberRank" - }, "status": { "type": "string", "example": "APPROVED" @@ -14218,7 +14143,7 @@ func init() { }, "OrderPayGrade": { "type": "string", - "title": "Rank", + "title": "Grade", "enum": [ "E_1", "E_2", @@ -14315,9 +14240,7 @@ func init() { "$ref": "#/definitions/Entitlement" }, "grade": { - "type": "string", - "x-nullable": true, - "example": "O-6" + "$ref": "#/definitions/OrderPayGrade" }, "has_dependents": { "type": "boolean", @@ -15036,9 +14959,6 @@ func init() { "title": "Phone", "x-nullable": true }, - "rank": { - "$ref": "#/definitions/ServiceMemberRank" - }, "residential_address": { "$ref": "#/definitions/Address" }, @@ -15601,9 +15521,6 @@ func init() { "type": "string", "format": "date-time" }, - "current_location": { - "$ref": "#/definitions/DutyLocationPayload" - }, "edipi": { "type": "string", "format": "edipi", @@ -15625,6 +15542,10 @@ func init() { "x-nullable": true, "example": "John" }, + "grade": { + "title": "Grade", + "$ref": "#/definitions/OrderPayGrade" + }, "id": { "type": "string", "format": "uuid", @@ -15664,10 +15585,6 @@ func init() { "title": "Telephone", "x-nullable": true }, - "rank": { - "title": "Rank", - "$ref": "#/definitions/ServiceMemberRank" - }, "residential_address": { "title": "Residential Address", "$ref": "#/definitions/Address" @@ -15708,73 +15625,6 @@ func init() { } } }, - "ServiceMemberRank": { - "type": "string", - "title": "Rank", - "enum": [ - "E_1", - "E_2", - "E_3", - "E_4", - "E_5", - "E_6", - "E_7", - "E_8", - "E_9", - "E_9_SPECIAL_SENIOR_ENLISTED", - "O_1_ACADEMY_GRADUATE", - "O_2", - "O_3", - "O_4", - "O_5", - "O_6", - "O_7", - "O_8", - "O_9", - "O_10", - "W_1", - "W_2", - "W_3", - "W_4", - "W_5", - "AVIATION_CADET", - "CIVILIAN_EMPLOYEE", - "ACADEMY_CADET", - "MIDSHIPMAN" - ], - "x-display-value": { - "ACADEMY_CADET": "Service Academy Cadet", - "AVIATION_CADET": "Aviation Cadet", - "CIVILIAN_EMPLOYEE": "Civilian Employee", - "E_1": "E-1", - "E_2": "E-2", - "E_3": "E-3", - "E_4": "E-4", - "E_5": "E-5", - "E_6": "E-6", - "E_7": "E-7", - "E_8": "E-8", - "E_9": "E-9", - "E_9_SPECIAL_SENIOR_ENLISTED": "E-9 (Special Senior Enlisted)", - "MIDSHIPMAN": "Midshipman", - "O_10": "O-10", - "O_1_ACADEMY_GRADUATE": "O-1 or Service Academy Graduate", - "O_2": "O-2", - "O_3": "O-3", - "O_4": "O-4", - "O_5": "O-5", - "O_6": "O-6", - "O_7": "O-7", - "O_8": "O-8", - "O_9": "O-9", - "W_1": "W-1", - "W_2": "W-2", - "W_3": "W-3", - "W_4": "W-4", - "W_5": "W-5" - }, - "x-nullable": true - }, "SignedCertification": { "description": "Signed certification", "type": "object", diff --git a/pkg/gen/internalmessages/create_service_member_payload.go b/pkg/gen/internalmessages/create_service_member_payload.go index 1dd2edf3c63..a2b48dce311 100644 --- a/pkg/gen/internalmessages/create_service_member_payload.go +++ b/pkg/gen/internalmessages/create_service_member_payload.go @@ -44,6 +44,9 @@ type CreateServiceMemberPayload struct { // Example: John FirstName *string `json:"first_name,omitempty"` + // grade + Grade *OrderPayGrade `json:"grade,omitempty"` + // Last name // Example: Donut LastName *string `json:"last_name,omitempty"` @@ -60,9 +63,6 @@ type CreateServiceMemberPayload struct { // Phone PhoneIsPreferred *bool `json:"phone_is_preferred,omitempty"` - // rank - Rank *ServiceMemberRank `json:"rank,omitempty"` - // residential address ResidentialAddress *Address `json:"residential_address,omitempty"` @@ -106,11 +106,11 @@ func (m *CreateServiceMemberPayload) Validate(formats strfmt.Registry) error { res = append(res, err) } - if err := m.validatePersonalEmail(formats); err != nil { + if err := m.validateGrade(formats); err != nil { res = append(res, err) } - if err := m.validateRank(formats); err != nil { + if err := m.validatePersonalEmail(formats); err != nil { res = append(res, err) } @@ -206,32 +206,32 @@ func (m *CreateServiceMemberPayload) validateEdipi(formats strfmt.Registry) erro return nil } -func (m *CreateServiceMemberPayload) validatePersonalEmail(formats strfmt.Registry) error { - if swag.IsZero(m.PersonalEmail) { // not required +func (m *CreateServiceMemberPayload) validateGrade(formats strfmt.Registry) error { + if swag.IsZero(m.Grade) { // not required return nil } - if err := validate.Pattern("personal_email", "body", *m.PersonalEmail, `^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$`); err != nil { - return err + if m.Grade != nil { + if err := m.Grade.Validate(formats); err != nil { + if ve, ok := err.(*errors.Validation); ok { + return ve.ValidateName("grade") + } else if ce, ok := err.(*errors.CompositeError); ok { + return ce.ValidateName("grade") + } + return err + } } return nil } -func (m *CreateServiceMemberPayload) validateRank(formats strfmt.Registry) error { - if swag.IsZero(m.Rank) { // not required +func (m *CreateServiceMemberPayload) validatePersonalEmail(formats strfmt.Registry) error { + if swag.IsZero(m.PersonalEmail) { // not required return nil } - if m.Rank != nil { - if err := m.Rank.Validate(formats); err != nil { - if ve, ok := err.(*errors.Validation); ok { - return ve.ValidateName("rank") - } else if ce, ok := err.(*errors.CompositeError); ok { - return ce.ValidateName("rank") - } - return err - } + if err := validate.Pattern("personal_email", "body", *m.PersonalEmail, `^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$`); err != nil { + return err } return nil @@ -304,7 +304,7 @@ func (m *CreateServiceMemberPayload) ContextValidate(ctx context.Context, format res = append(res, err) } - if err := m.contextValidateRank(ctx, formats); err != nil { + if err := m.contextValidateGrade(ctx, formats); err != nil { res = append(res, err) } @@ -360,19 +360,19 @@ func (m *CreateServiceMemberPayload) contextValidateBackupMailingAddress(ctx con return nil } -func (m *CreateServiceMemberPayload) contextValidateRank(ctx context.Context, formats strfmt.Registry) error { +func (m *CreateServiceMemberPayload) contextValidateGrade(ctx context.Context, formats strfmt.Registry) error { - if m.Rank != nil { + if m.Grade != nil { - if swag.IsZero(m.Rank) { // not required + if swag.IsZero(m.Grade) { // not required return nil } - if err := m.Rank.ContextValidate(ctx, formats); err != nil { + if err := m.Grade.ContextValidate(ctx, formats); err != nil { if ve, ok := err.(*errors.Validation); ok { - return ve.ValidateName("rank") + return ve.ValidateName("grade") } else if ce, ok := err.(*errors.CompositeError); ok { - return ce.ValidateName("rank") + return ce.ValidateName("grade") } return err } diff --git a/pkg/gen/internalmessages/entitlement.go b/pkg/gen/internalmessages/entitlement.go index 27d1b4a10de..6692685e22d 100644 --- a/pkg/gen/internalmessages/entitlement.go +++ b/pkg/gen/internalmessages/entitlement.go @@ -17,12 +17,12 @@ import ( // swagger:model Entitlement type Entitlement struct { - // Pro-gear weight limit as set by an Office user, distinct from the service member's default weight allotment determined by rank + // Pro-gear weight limit as set by an Office user, distinct from the service member's default weight allotment determined by pay grade // // Example: 2000 ProGear *int64 `json:"proGear,omitempty"` - // Spouse's pro-gear weight limit as set by an Office user, distinct from the service member's default weight allotment determined by rank + // Spouse's pro-gear weight limit as set by an Office user, distinct from the service member's default weight allotment determined by pay grade // // Example: 500 ProGearSpouse *int64 `json:"proGearSpouse,omitempty"` diff --git a/pkg/gen/internalmessages/move_queue_item.go b/pkg/gen/internalmessages/move_queue_item.go index 02fac584c4b..b0ab98a5fe0 100644 --- a/pkg/gen/internalmessages/move_queue_item.go +++ b/pkg/gen/internalmessages/move_queue_item.go @@ -64,6 +64,10 @@ type MoveQueueItem struct { // Example: LNK12345 GblNumber *string `json:"gbl_number,omitempty"` + // grade + // Required: true + Grade *OrderPayGrade `json:"grade"` + // hhg status // Example: ACCEPTED HhgStatus *string `json:"hhg_status,omitempty"` @@ -122,10 +126,6 @@ type MoveQueueItem struct { // Example: PAYMENT_REQUESTED PpmStatus *string `json:"ppm_status,omitempty"` - // rank - // Required: true - Rank *ServiceMemberRank `json:"rank"` - // status // Example: APPROVED // Required: true @@ -168,6 +168,10 @@ func (m *MoveQueueItem) Validate(formats strfmt.Registry) error { res = append(res, err) } + if err := m.validateGrade(formats); err != nil { + res = append(res, err) + } + if err := m.validateID(formats); err != nil { res = append(res, err) } @@ -200,10 +204,6 @@ func (m *MoveQueueItem) Validate(formats strfmt.Registry) error { res = append(res, err) } - if err := m.validateRank(formats); err != nil { - res = append(res, err) - } - if err := m.validateStatus(formats); err != nil { res = append(res, err) } @@ -298,6 +298,30 @@ func (m *MoveQueueItem) validateEdipi(formats strfmt.Registry) error { return nil } +func (m *MoveQueueItem) validateGrade(formats strfmt.Registry) error { + + if err := validate.Required("grade", "body", m.Grade); err != nil { + return err + } + + if err := validate.Required("grade", "body", m.Grade); err != nil { + return err + } + + if m.Grade != nil { + if err := m.Grade.Validate(formats); err != nil { + if ve, ok := err.(*errors.Validation); ok { + return ve.ValidateName("grade") + } else if ce, ok := err.(*errors.CompositeError); ok { + return ce.ValidateName("grade") + } + return err + } + } + + return nil +} + func (m *MoveQueueItem) validateID(formats strfmt.Registry) error { if err := validate.Required("id", "body", m.ID); err != nil { @@ -430,30 +454,6 @@ func (m *MoveQueueItem) validatePmSurveyConductedDate(formats strfmt.Registry) e return nil } -func (m *MoveQueueItem) validateRank(formats strfmt.Registry) error { - - if err := validate.Required("rank", "body", m.Rank); err != nil { - return err - } - - if err := validate.Required("rank", "body", m.Rank); err != nil { - return err - } - - if m.Rank != nil { - if err := m.Rank.Validate(formats); err != nil { - if ve, ok := err.(*errors.Validation); ok { - return ve.ValidateName("rank") - } else if ce, ok := err.(*errors.CompositeError); ok { - return ce.ValidateName("rank") - } - return err - } - } - - return nil -} - func (m *MoveQueueItem) validateStatus(formats strfmt.Registry) error { if err := validate.Required("status", "body", m.Status); err != nil { @@ -498,7 +498,7 @@ func (m *MoveQueueItem) validateWeightAllotment(formats strfmt.Registry) error { func (m *MoveQueueItem) ContextValidate(ctx context.Context, formats strfmt.Registry) error { var res []error - if err := m.contextValidateRank(ctx, formats); err != nil { + if err := m.contextValidateGrade(ctx, formats); err != nil { res = append(res, err) } @@ -512,15 +512,15 @@ func (m *MoveQueueItem) ContextValidate(ctx context.Context, formats strfmt.Regi return nil } -func (m *MoveQueueItem) contextValidateRank(ctx context.Context, formats strfmt.Registry) error { +func (m *MoveQueueItem) contextValidateGrade(ctx context.Context, formats strfmt.Registry) error { - if m.Rank != nil { + if m.Grade != nil { - if err := m.Rank.ContextValidate(ctx, formats); err != nil { + if err := m.Grade.ContextValidate(ctx, formats); err != nil { if ve, ok := err.(*errors.Validation); ok { - return ve.ValidateName("rank") + return ve.ValidateName("grade") } else if ce, ok := err.(*errors.CompositeError); ok { - return ce.ValidateName("rank") + return ce.ValidateName("grade") } return err } diff --git a/pkg/gen/internalmessages/order_pay_grade.go b/pkg/gen/internalmessages/order_pay_grade.go index 0b783c8fc4e..84059d29e25 100644 --- a/pkg/gen/internalmessages/order_pay_grade.go +++ b/pkg/gen/internalmessages/order_pay_grade.go @@ -14,7 +14,7 @@ import ( "github.com/go-openapi/validate" ) -// OrderPayGrade Rank +// OrderPayGrade Grade // // swagger:model OrderPayGrade type OrderPayGrade string diff --git a/pkg/gen/internalmessages/orders.go b/pkg/gen/internalmessages/orders.go index a44aa0827ca..c6bdeb0bc1f 100644 --- a/pkg/gen/internalmessages/orders.go +++ b/pkg/gen/internalmessages/orders.go @@ -35,8 +35,7 @@ type Orders struct { Entitlement *Entitlement `json:"entitlement,omitempty"` // grade - // Example: O-6 - Grade *string `json:"grade,omitempty"` + Grade *OrderPayGrade `json:"grade,omitempty"` // Are dependents included in your orders? // Required: true @@ -143,6 +142,10 @@ func (m *Orders) Validate(formats strfmt.Registry) error { res = append(res, err) } + if err := m.validateGrade(formats); err != nil { + res = append(res, err) + } + if err := m.validateHasDependents(formats); err != nil { res = append(res, err) } @@ -264,6 +267,25 @@ func (m *Orders) validateEntitlement(formats strfmt.Registry) error { return nil } +func (m *Orders) validateGrade(formats strfmt.Registry) error { + if swag.IsZero(m.Grade) { // not required + return nil + } + + if m.Grade != nil { + if err := m.Grade.Validate(formats); err != nil { + if ve, ok := err.(*errors.Validation); ok { + return ve.ValidateName("grade") + } else if ce, ok := err.(*errors.CompositeError); ok { + return ce.ValidateName("grade") + } + return err + } + } + + return nil +} + func (m *Orders) validateHasDependents(formats strfmt.Registry) error { if err := validate.Required("has_dependents", "body", m.HasDependents); err != nil { @@ -526,6 +548,10 @@ func (m *Orders) ContextValidate(ctx context.Context, formats strfmt.Registry) e res = append(res, err) } + if err := m.contextValidateGrade(ctx, formats); err != nil { + res = append(res, err) + } + if err := m.contextValidateMoves(ctx, formats); err != nil { res = append(res, err) } @@ -606,6 +632,27 @@ func (m *Orders) contextValidateEntitlement(ctx context.Context, formats strfmt. return nil } +func (m *Orders) contextValidateGrade(ctx context.Context, formats strfmt.Registry) error { + + if m.Grade != nil { + + if swag.IsZero(m.Grade) { // not required + return nil + } + + if err := m.Grade.ContextValidate(ctx, formats); err != nil { + if ve, ok := err.(*errors.Validation); ok { + return ve.ValidateName("grade") + } else if ce, ok := err.(*errors.CompositeError); ok { + return ce.ValidateName("grade") + } + return err + } + } + + return nil +} + func (m *Orders) contextValidateMoves(ctx context.Context, formats strfmt.Registry) error { if err := m.Moves.ContextValidate(ctx, formats); err != nil { diff --git a/pkg/gen/internalmessages/patch_service_member_payload.go b/pkg/gen/internalmessages/patch_service_member_payload.go index 0ec6c1dec07..f9a5d63b72b 100644 --- a/pkg/gen/internalmessages/patch_service_member_payload.go +++ b/pkg/gen/internalmessages/patch_service_member_payload.go @@ -60,9 +60,6 @@ type PatchServiceMemberPayload struct { // Phone PhoneIsPreferred *bool `json:"phone_is_preferred,omitempty"` - // rank - Rank *ServiceMemberRank `json:"rank,omitempty"` - // residential address ResidentialAddress *Address `json:"residential_address,omitempty"` @@ -110,10 +107,6 @@ func (m *PatchServiceMemberPayload) Validate(formats strfmt.Registry) error { res = append(res, err) } - if err := m.validateRank(formats); err != nil { - res = append(res, err) - } - if err := m.validateResidentialAddress(formats); err != nil { res = append(res, err) } @@ -218,25 +211,6 @@ func (m *PatchServiceMemberPayload) validatePersonalEmail(formats strfmt.Registr return nil } -func (m *PatchServiceMemberPayload) validateRank(formats strfmt.Registry) error { - if swag.IsZero(m.Rank) { // not required - return nil - } - - if m.Rank != nil { - if err := m.Rank.Validate(formats); err != nil { - if ve, ok := err.(*errors.Validation); ok { - return ve.ValidateName("rank") - } else if ce, ok := err.(*errors.CompositeError); ok { - return ce.ValidateName("rank") - } - return err - } - } - - return nil -} - func (m *PatchServiceMemberPayload) validateResidentialAddress(formats strfmt.Registry) error { if swag.IsZero(m.ResidentialAddress) { // not required return nil @@ -304,10 +278,6 @@ func (m *PatchServiceMemberPayload) ContextValidate(ctx context.Context, formats res = append(res, err) } - if err := m.contextValidateRank(ctx, formats); err != nil { - res = append(res, err) - } - if err := m.contextValidateResidentialAddress(ctx, formats); err != nil { res = append(res, err) } @@ -360,27 +330,6 @@ func (m *PatchServiceMemberPayload) contextValidateBackupMailingAddress(ctx cont return nil } -func (m *PatchServiceMemberPayload) contextValidateRank(ctx context.Context, formats strfmt.Registry) error { - - if m.Rank != nil { - - if swag.IsZero(m.Rank) { // not required - return nil - } - - if err := m.Rank.ContextValidate(ctx, formats); err != nil { - if ve, ok := err.(*errors.Validation); ok { - return ve.ValidateName("rank") - } else if ce, ok := err.(*errors.CompositeError); ok { - return ce.ValidateName("rank") - } - return err - } - } - - return nil -} - func (m *PatchServiceMemberPayload) contextValidateResidentialAddress(ctx context.Context, formats strfmt.Registry) error { if m.ResidentialAddress != nil { diff --git a/pkg/gen/internalmessages/service_member_payload.go b/pkg/gen/internalmessages/service_member_payload.go index 5b2b8b81605..f2403f4dd18 100644 --- a/pkg/gen/internalmessages/service_member_payload.go +++ b/pkg/gen/internalmessages/service_member_payload.go @@ -34,9 +34,6 @@ type ServiceMemberPayload struct { // Format: date-time CreatedAt *strfmt.DateTime `json:"created_at"` - // current location - CurrentLocation *DutyLocationPayload `json:"current_location,omitempty"` - // DoD ID number // Example: 5789345789 // Max Length: 10 @@ -51,6 +48,9 @@ type ServiceMemberPayload struct { // Example: John FirstName *string `json:"first_name,omitempty"` + // Grade + Grade *OrderPayGrade `json:"grade,omitempty"` + // id // Example: c56a4180-65aa-42ec-a945-5fd21dec0538 // Required: true @@ -80,9 +80,6 @@ type ServiceMemberPayload struct { // Telephone PhoneIsPreferred *bool `json:"phone_is_preferred,omitempty"` - // Rank - Rank *ServiceMemberRank `json:"rank,omitempty"` - // Residential Address ResidentialAddress *Address `json:"residential_address,omitempty"` @@ -135,11 +132,11 @@ func (m *ServiceMemberPayload) Validate(formats strfmt.Registry) error { res = append(res, err) } - if err := m.validateCurrentLocation(formats); err != nil { + if err := m.validateEdipi(formats); err != nil { res = append(res, err) } - if err := m.validateEdipi(formats); err != nil { + if err := m.validateGrade(formats); err != nil { res = append(res, err) } @@ -159,10 +156,6 @@ func (m *ServiceMemberPayload) Validate(formats strfmt.Registry) error { res = append(res, err) } - if err := m.validateRank(formats); err != nil { - res = append(res, err) - } - if err := m.validateResidentialAddress(formats); err != nil { res = append(res, err) } @@ -261,25 +254,6 @@ func (m *ServiceMemberPayload) validateCreatedAt(formats strfmt.Registry) error return nil } -func (m *ServiceMemberPayload) validateCurrentLocation(formats strfmt.Registry) error { - if swag.IsZero(m.CurrentLocation) { // not required - return nil - } - - if m.CurrentLocation != nil { - if err := m.CurrentLocation.Validate(formats); err != nil { - if ve, ok := err.(*errors.Validation); ok { - return ve.ValidateName("current_location") - } else if ce, ok := err.(*errors.CompositeError); ok { - return ce.ValidateName("current_location") - } - return err - } - } - - return nil -} - func (m *ServiceMemberPayload) validateEdipi(formats strfmt.Registry) error { if swag.IsZero(m.Edipi) { // not required return nil @@ -300,6 +274,25 @@ func (m *ServiceMemberPayload) validateEdipi(formats strfmt.Registry) error { return nil } +func (m *ServiceMemberPayload) validateGrade(formats strfmt.Registry) error { + if swag.IsZero(m.Grade) { // not required + return nil + } + + if m.Grade != nil { + if err := m.Grade.Validate(formats); err != nil { + if ve, ok := err.(*errors.Validation); ok { + return ve.ValidateName("grade") + } else if ce, ok := err.(*errors.CompositeError); ok { + return ce.ValidateName("grade") + } + return err + } + } + + return nil +} + func (m *ServiceMemberPayload) validateID(formats strfmt.Registry) error { if err := validate.Required("id", "body", m.ID); err != nil { @@ -360,25 +353,6 @@ func (m *ServiceMemberPayload) validatePersonalEmail(formats strfmt.Registry) er return nil } -func (m *ServiceMemberPayload) validateRank(formats strfmt.Registry) error { - if swag.IsZero(m.Rank) { // not required - return nil - } - - if m.Rank != nil { - if err := m.Rank.Validate(formats); err != nil { - if ve, ok := err.(*errors.Validation); ok { - return ve.ValidateName("rank") - } else if ce, ok := err.(*errors.CompositeError); ok { - return ce.ValidateName("rank") - } - return err - } - } - - return nil -} - func (m *ServiceMemberPayload) validateResidentialAddress(formats strfmt.Registry) error { if swag.IsZero(m.ResidentialAddress) { // not required return nil @@ -483,7 +457,7 @@ func (m *ServiceMemberPayload) ContextValidate(ctx context.Context, formats strf res = append(res, err) } - if err := m.contextValidateCurrentLocation(ctx, formats); err != nil { + if err := m.contextValidateGrade(ctx, formats); err != nil { res = append(res, err) } @@ -491,10 +465,6 @@ func (m *ServiceMemberPayload) ContextValidate(ctx context.Context, formats strf res = append(res, err) } - if err := m.contextValidateRank(ctx, formats); err != nil { - res = append(res, err) - } - if err := m.contextValidateResidentialAddress(ctx, formats); err != nil { res = append(res, err) } @@ -565,19 +535,19 @@ func (m *ServiceMemberPayload) contextValidateBackupMailingAddress(ctx context.C return nil } -func (m *ServiceMemberPayload) contextValidateCurrentLocation(ctx context.Context, formats strfmt.Registry) error { +func (m *ServiceMemberPayload) contextValidateGrade(ctx context.Context, formats strfmt.Registry) error { - if m.CurrentLocation != nil { + if m.Grade != nil { - if swag.IsZero(m.CurrentLocation) { // not required + if swag.IsZero(m.Grade) { // not required return nil } - if err := m.CurrentLocation.ContextValidate(ctx, formats); err != nil { + if err := m.Grade.ContextValidate(ctx, formats); err != nil { if ve, ok := err.(*errors.Validation); ok { - return ve.ValidateName("current_location") + return ve.ValidateName("grade") } else if ce, ok := err.(*errors.CompositeError); ok { - return ce.ValidateName("current_location") + return ce.ValidateName("grade") } return err } @@ -611,27 +581,6 @@ func (m *ServiceMemberPayload) contextValidateOrders(ctx context.Context, format return nil } -func (m *ServiceMemberPayload) contextValidateRank(ctx context.Context, formats strfmt.Registry) error { - - if m.Rank != nil { - - if swag.IsZero(m.Rank) { // not required - return nil - } - - if err := m.Rank.ContextValidate(ctx, formats); err != nil { - if ve, ok := err.(*errors.Validation); ok { - return ve.ValidateName("rank") - } else if ce, ok := err.(*errors.CompositeError); ok { - return ce.ValidateName("rank") - } - return err - } - } - - return nil -} - func (m *ServiceMemberPayload) contextValidateResidentialAddress(ctx context.Context, formats strfmt.Registry) error { if m.ResidentialAddress != nil { diff --git a/pkg/gen/internalmessages/service_member_rank.go b/pkg/gen/internalmessages/service_member_rank.go deleted file mode 100644 index 1b85ff3dc08..00000000000 --- a/pkg/gen/internalmessages/service_member_rank.go +++ /dev/null @@ -1,159 +0,0 @@ -// Code generated by go-swagger; DO NOT EDIT. - -package internalmessages - -// This file was generated by the swagger tool. -// Editing this file might prove futile when you re-run the swagger generate command - -import ( - "context" - "encoding/json" - - "github.com/go-openapi/errors" - "github.com/go-openapi/strfmt" - "github.com/go-openapi/validate" -) - -// ServiceMemberRank Rank -// -// swagger:model ServiceMemberRank -type ServiceMemberRank string - -func NewServiceMemberRank(value ServiceMemberRank) *ServiceMemberRank { - return &value -} - -// Pointer returns a pointer to a freshly-allocated ServiceMemberRank. -func (m ServiceMemberRank) Pointer() *ServiceMemberRank { - return &m -} - -const ( - - // ServiceMemberRankE1 captures enum value "E_1" - ServiceMemberRankE1 ServiceMemberRank = "E_1" - - // ServiceMemberRankE2 captures enum value "E_2" - ServiceMemberRankE2 ServiceMemberRank = "E_2" - - // ServiceMemberRankE3 captures enum value "E_3" - ServiceMemberRankE3 ServiceMemberRank = "E_3" - - // ServiceMemberRankE4 captures enum value "E_4" - ServiceMemberRankE4 ServiceMemberRank = "E_4" - - // ServiceMemberRankE5 captures enum value "E_5" - ServiceMemberRankE5 ServiceMemberRank = "E_5" - - // ServiceMemberRankE6 captures enum value "E_6" - ServiceMemberRankE6 ServiceMemberRank = "E_6" - - // ServiceMemberRankE7 captures enum value "E_7" - ServiceMemberRankE7 ServiceMemberRank = "E_7" - - // ServiceMemberRankE8 captures enum value "E_8" - ServiceMemberRankE8 ServiceMemberRank = "E_8" - - // ServiceMemberRankE9 captures enum value "E_9" - ServiceMemberRankE9 ServiceMemberRank = "E_9" - - // ServiceMemberRankE9SPECIALSENIORENLISTED captures enum value "E_9_SPECIAL_SENIOR_ENLISTED" - ServiceMemberRankE9SPECIALSENIORENLISTED ServiceMemberRank = "E_9_SPECIAL_SENIOR_ENLISTED" - - // ServiceMemberRankO1ACADEMYGRADUATE captures enum value "O_1_ACADEMY_GRADUATE" - ServiceMemberRankO1ACADEMYGRADUATE ServiceMemberRank = "O_1_ACADEMY_GRADUATE" - - // ServiceMemberRankO2 captures enum value "O_2" - ServiceMemberRankO2 ServiceMemberRank = "O_2" - - // ServiceMemberRankO3 captures enum value "O_3" - ServiceMemberRankO3 ServiceMemberRank = "O_3" - - // ServiceMemberRankO4 captures enum value "O_4" - ServiceMemberRankO4 ServiceMemberRank = "O_4" - - // ServiceMemberRankO5 captures enum value "O_5" - ServiceMemberRankO5 ServiceMemberRank = "O_5" - - // ServiceMemberRankO6 captures enum value "O_6" - ServiceMemberRankO6 ServiceMemberRank = "O_6" - - // ServiceMemberRankO7 captures enum value "O_7" - ServiceMemberRankO7 ServiceMemberRank = "O_7" - - // ServiceMemberRankO8 captures enum value "O_8" - ServiceMemberRankO8 ServiceMemberRank = "O_8" - - // ServiceMemberRankO9 captures enum value "O_9" - ServiceMemberRankO9 ServiceMemberRank = "O_9" - - // ServiceMemberRankO10 captures enum value "O_10" - ServiceMemberRankO10 ServiceMemberRank = "O_10" - - // ServiceMemberRankW1 captures enum value "W_1" - ServiceMemberRankW1 ServiceMemberRank = "W_1" - - // ServiceMemberRankW2 captures enum value "W_2" - ServiceMemberRankW2 ServiceMemberRank = "W_2" - - // ServiceMemberRankW3 captures enum value "W_3" - ServiceMemberRankW3 ServiceMemberRank = "W_3" - - // ServiceMemberRankW4 captures enum value "W_4" - ServiceMemberRankW4 ServiceMemberRank = "W_4" - - // ServiceMemberRankW5 captures enum value "W_5" - ServiceMemberRankW5 ServiceMemberRank = "W_5" - - // ServiceMemberRankAVIATIONCADET captures enum value "AVIATION_CADET" - ServiceMemberRankAVIATIONCADET ServiceMemberRank = "AVIATION_CADET" - - // ServiceMemberRankCIVILIANEMPLOYEE captures enum value "CIVILIAN_EMPLOYEE" - ServiceMemberRankCIVILIANEMPLOYEE ServiceMemberRank = "CIVILIAN_EMPLOYEE" - - // ServiceMemberRankACADEMYCADET captures enum value "ACADEMY_CADET" - ServiceMemberRankACADEMYCADET ServiceMemberRank = "ACADEMY_CADET" - - // ServiceMemberRankMIDSHIPMAN captures enum value "MIDSHIPMAN" - ServiceMemberRankMIDSHIPMAN ServiceMemberRank = "MIDSHIPMAN" -) - -// for schema -var serviceMemberRankEnum []interface{} - -func init() { - var res []ServiceMemberRank - if err := json.Unmarshal([]byte(`["E_1","E_2","E_3","E_4","E_5","E_6","E_7","E_8","E_9","E_9_SPECIAL_SENIOR_ENLISTED","O_1_ACADEMY_GRADUATE","O_2","O_3","O_4","O_5","O_6","O_7","O_8","O_9","O_10","W_1","W_2","W_3","W_4","W_5","AVIATION_CADET","CIVILIAN_EMPLOYEE","ACADEMY_CADET","MIDSHIPMAN"]`), &res); err != nil { - panic(err) - } - for _, v := range res { - serviceMemberRankEnum = append(serviceMemberRankEnum, v) - } -} - -func (m ServiceMemberRank) validateServiceMemberRankEnum(path, location string, value ServiceMemberRank) error { - if err := validate.EnumCase(path, location, value, serviceMemberRankEnum, true); err != nil { - return err - } - return nil -} - -// Validate validates this service member rank -func (m ServiceMemberRank) Validate(formats strfmt.Registry) error { - var res []error - - // value enum - if err := m.validateServiceMemberRankEnum("", "body", m); err != nil { - return err - } - - if len(res) > 0 { - return errors.CompositeValidationError(res...) - } - return nil -} - -// ContextValidate validates this service member rank based on context it is used -func (m ServiceMemberRank) ContextValidate(ctx context.Context, formats strfmt.Registry) error { - return nil -} diff --git a/pkg/handlers/ghcapi/internal/payloads/model_to_payload.go b/pkg/handlers/ghcapi/internal/payloads/model_to_payload.go index 0ac28e6e04e..7a633714e5f 100644 --- a/pkg/handlers/ghcapi/internal/payloads/model_to_payload.go +++ b/pkg/handlers/ghcapi/internal/payloads/model_to_payload.go @@ -472,7 +472,7 @@ func Order(order *models.Order) *ghcmessages.Order { destinationDutyLocation := DutyLocation(&order.NewDutyLocation) originDutyLocation := DutyLocation(order.OriginDutyLocation) if order.Grade != nil && order.Entitlement != nil { - order.Entitlement.SetWeightAllotment(*order.Grade) + order.Entitlement.SetWeightAllotment(string(*order.Grade)) } entitlements := Entitlement(order.Entitlement) diff --git a/pkg/handlers/internalapi/entitlements.go b/pkg/handlers/internalapi/entitlements.go index c564516547f..3ae75c18eb4 100644 --- a/pkg/handlers/internalapi/entitlements.go +++ b/pkg/handlers/internalapi/entitlements.go @@ -37,9 +37,9 @@ func (h IndexEntitlementsHandler) Handle(params entitlementop.IndexEntitlementsP entitlements := models.AllWeightAllotments() payload := make(map[string]internalmessages.WeightAllotment) for k, v := range entitlements { - rank := string(k) + grade := string(k) allotment := payloadForEntitlementModel(v) - payload[rank] = allotment + payload[grade] = allotment } return entitlementop.NewIndexEntitlementsOK().WithPayload(payload), nil }) diff --git a/pkg/handlers/internalapi/move_queue_items.go b/pkg/handlers/internalapi/move_queue_items.go index be8f2db1627..d42b1fa2026 100644 --- a/pkg/handlers/internalapi/move_queue_items.go +++ b/pkg/handlers/internalapi/move_queue_items.go @@ -22,7 +22,7 @@ func payloadForMoveQueueItem(MoveQueueItem models.MoveQueueItem) *internalmessag ID: handlers.FmtUUID(MoveQueueItem.ID), CreatedAt: handlers.FmtDateTime(MoveQueueItem.CreatedAt), Edipi: models.StringPointer(MoveQueueItem.Edipi), - Rank: (*internalmessages.ServiceMemberRank)(MoveQueueItem.Rank), + Grade: MoveQueueItem.Grade, CustomerName: models.StringPointer(MoveQueueItem.CustomerName), Locator: models.StringPointer(MoveQueueItem.Locator), Status: models.StringPointer(MoveQueueItem.Status), @@ -38,7 +38,7 @@ func payloadForMoveQueueItem(MoveQueueItem models.MoveQueueItem) *internalmessag DestinationGbloc: handlers.FmtStringPtr(MoveQueueItem.DestinationGBLOC), DeliveredDate: handlers.FmtDateTimePtr(MoveQueueItem.DeliveredDate), InvoiceApprovedDate: handlers.FmtDateTimePtr(MoveQueueItem.InvoiceApprovedDate), - WeightAllotment: payloadForWeightAllotmentModel(models.GetWeightAllotment(*MoveQueueItem.Rank)), + WeightAllotment: payloadForWeightAllotmentModel(models.GetWeightAllotment(*MoveQueueItem.Grade)), BranchOfService: handlers.FmtString(MoveQueueItem.BranchOfService), ActualMoveDate: handlers.FmtDatePtr(MoveQueueItem.ActualMoveDate), OriginalMoveDate: handlers.FmtDatePtr(MoveQueueItem.OriginalMoveDate), diff --git a/pkg/handlers/internalapi/orders.go b/pkg/handlers/internalapi/orders.go index fe15e223800..b2f60dd2154 100644 --- a/pkg/handlers/internalapi/orders.go +++ b/pkg/handlers/internalapi/orders.go @@ -79,6 +79,11 @@ func payloadForOrdersModel(storer storage.FileStorer, order models.Order) (*inte originDutyLocation = *order.OriginDutyLocation } + var grade internalmessages.OrderPayGrade + if order.Grade != nil { + grade = internalmessages.OrderPayGrade(*order.Grade) + } + ordersType := order.OrdersType payload := &internalmessages.Orders{ ID: handlers.FmtUUID(order.ID), @@ -91,7 +96,7 @@ func payloadForOrdersModel(storer storage.FileStorer, order models.Order) (*inte OrdersTypeDetail: order.OrdersTypeDetail, OriginDutyLocation: payloadForDutyLocationModel(originDutyLocation), OriginDutyLocationGbloc: handlers.FmtStringPtr(order.OriginDutyLocationGBLOC), - Grade: order.Grade, + Grade: &grade, NewDutyLocation: payloadForDutyLocationModel(order.NewDutyLocation), HasDependents: handlers.FmtBool(order.HasDependents), SpouseHasProGear: handlers.FmtBool(order.SpouseHasProGear), @@ -131,15 +136,23 @@ func (h CreateOrdersHandler) Handle(params ordersop.CreateOrdersParams) middlewa return handlers.ResponseForError(appCtx.Logger(), err), err } - dutyLocationID, err := uuid.FromString(payload.NewDutyLocationID.String()) + originDutyLocationID, err := uuid.FromString(payload.OriginDutyLocationID.String()) + if err != nil { + return handlers.ResponseForError(appCtx.Logger(), err), err + } + originDutyLocation, err := models.FetchDutyLocation(appCtx.DB(), originDutyLocationID) + if err != nil { + return handlers.ResponseForError(appCtx.Logger(), err), err + } + + newDutyLocationID, err := uuid.FromString(payload.NewDutyLocationID.String()) if err != nil { return handlers.ResponseForError(appCtx.Logger(), err), err } - newDutyLocation, err := models.FetchDutyLocation(appCtx.DB(), dutyLocationID) + newDutyLocation, err := models.FetchDutyLocation(appCtx.DB(), newDutyLocationID) if err != nil { return handlers.ResponseForError(appCtx.Logger(), err), err } - originDutyLocation := serviceMember.DutyLocation originDutyLocationGBLOC, err := models.FetchGBLOCForPostalCode(appCtx.DB(), originDutyLocation.Address.PostalCode) if err != nil { @@ -151,9 +164,8 @@ func (h CreateOrdersHandler) Handle(params ordersop.CreateOrdersParams) middlewa } } - grade := (*string)(serviceMember.Rank) - - weightAllotment := models.GetWeightAllotment(*serviceMember.Rank) + grade := payload.Grade + weightAllotment := models.GetWeightAllotment(*grade) weight := weightAllotment.TotalWeightSelf if *payload.HasDependents { @@ -323,12 +335,42 @@ func (h UpdateOrdersHandler) Handle(params ordersop.UpdateOrdersParams) middlewa order.NewDutyLocation = dutyLocation order.TAC = payload.Tac order.SAC = payload.Sac - order.Grade = (*string)(payload.Grade) + order.Grade = payload.Grade + + weightAllotment := models.GetWeightAllotment(*order.Grade) + weight := weightAllotment.TotalWeightSelf + if *payload.HasDependents { + weight = weightAllotment.TotalWeightSelfPlusDependents + } + + // 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. + sitDaysAllowance := models.DefaultServiceMemberSITDaysAllowance + + entitlement := models.Entitlement{ + DependentsAuthorized: payload.HasDependents, + DBAuthorizedWeight: models.IntPointer(weight), + StorageInTransit: models.IntPointer(sitDaysAllowance), + ProGearWeight: weightAllotment.ProGearWeight, + ProGearWeightSpouse: weightAllotment.ProGearWeightSpouse, + } + + /* + IF you get that to work you'll still have to add conditionals for all the places the entitlement is used because it + isn't inheritly clear if it's using the spouse weight or not. So you'll be creating new variables and conditionals + 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 + } if payload.DepartmentIndicator != nil { order.DepartmentIndicator = handlers.FmtString(string(*payload.DepartmentIndicator)) } + order.Entitlement = &entitlement + verrs, err := models.SaveOrder(appCtx.DB(), &order) if err != nil || verrs.HasAny() { return handlers.ResponseForVErrors(appCtx.Logger(), verrs, err), err diff --git a/pkg/handlers/internalapi/orders_test.go b/pkg/handlers/internalapi/orders_test.go index 44e39fdd260..be138272eb7 100644 --- a/pkg/handlers/internalapi/orders_test.go +++ b/pkg/handlers/internalapi/orders_test.go @@ -26,6 +26,14 @@ import ( func (suite *HandlerSuite) TestCreateOrder() { sm := factory.BuildExtendedServiceMember(suite.DB(), nil, nil) + + originDutyLocation := factory.BuildDutyLocation(suite.DB(), []factory.Customization{ + { + Model: models.DutyLocation{ + Name: "Not Yuma AFB", + }, + }, + }, nil) dutyLocation := factory.FetchOrBuildCurrentDutyLocation(suite.DB()) factory.FetchOrBuildPostalCodeToGBLOC(suite.DB(), dutyLocation.Address.PostalCode, "KKFA") factory.FetchOrBuildDefaultContractor(suite.DB(), nil, nil) @@ -40,17 +48,19 @@ func (suite *HandlerSuite) TestCreateOrder() { 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), - 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), + 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(), } params := ordersop.CreateOrdersParams{ @@ -77,8 +87,6 @@ func (suite *HandlerSuite) TestCreateOrder() { suite.Assertions.Equal(handlers.FmtString("E19A"), okResponse.Payload.Tac) suite.Assertions.Equal(handlers.FmtString("SacNumber"), okResponse.Payload.Sac) suite.Assertions.Equal(&deptIndicator, okResponse.Payload.DepartmentIndicator) - suite.Equal(sm.DutyLocationID, createdOrder.OriginDutyLocationID) - suite.Equal((*string)(sm.Rank), createdOrder.Grade) suite.Assertions.Equal(*models.Int64Pointer(8000), *okResponse.Payload.AuthorizedWeight) suite.NotNil(&createdOrder.Entitlement) suite.NotEmpty(createdOrder.SupplyAndServicesCostEstimate) @@ -436,36 +444,44 @@ func (suite *HandlerSuite) TestUploadAmendedOrdersHandlerIntegration() { }) } -// TODO: Fix now that we capture transaction error. May be a data setup problem -/* -func (suite *HandlerSuite) TestUpdateOrder() { - order := factory.BuildOrder(suite.DB(), nil, nil) +func (suite *HandlerSuite) TestUpdateOrdersHandler() { + dutyLocation := factory.BuildDutyLocation(suite.DB(), nil, nil) - path := fmt.Sprintf("/orders/%v", order.ID.String()) - req := httptest.NewRequest("PUT", path, nil) - req = suite.AuthenticateRequest(req, order.ServiceMember) + order := factory.BuildOrder(suite.DB(), []factory.Customization{ + { + Model: dutyLocation, + LinkOnly: true, + Type: &factory.DutyLocations.OriginDutyLocation, + }, + }, nil) + + newDutyLocation := factory.BuildDutyLocation(suite.DB(), nil, nil) + newTransportationOffice := factory.BuildTransportationOffice(suite.DB(), nil, nil) + newDutyLocation.TransportationOffice = newTransportationOffice newOrdersType := internalmessages.OrdersTypePERMANENTCHANGEOFSTATION - newOrdersTypeDetail := internalmessages.OrdersTypeDetailHHGPERMITTED - departmentIndicator := internalmessages.DeptIndicatorAIRANDSPACEFORCE - otherServiceMemberUUID := uuid.Must(uuid.NewV4()) + newOrdersNumber := "123456" + 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) + deptIndicator := internalmessages.DeptIndicatorAIRANDSPACEFORCE payload := &internalmessages.CreateUpdateOrders{ - OrdersNumber: handlers.FmtString("123456"), - HasDependents: handlers.FmtBool(order.HasDependents), - SpouseHasProGear: handlers.FmtBool(order.SpouseHasProGear), - IssueDate: handlers.FmtDate(order.IssueDate), - ReportByDate: handlers.FmtDate(order.ReportByDate), - OrdersType: newOrdersType, - OrdersTypeDetail: &newOrdersTypeDetail, - NewDutyLocationID: handlers.FmtUUID(order.NewDutyLocationID), - Tac: order.TAC, - Sac: handlers.FmtString("N3TEST"), - DepartmentIndicator: &departmentIndicator, - // Attempt to assign to another service member - ServiceMemberID: handlers.FmtUUID(otherServiceMemberUUID), + OrdersNumber: handlers.FmtString(newOrdersNumber), + OrdersType: &newOrdersType, + NewDutyLocationID: handlers.FmtUUID(newDutyLocation.ID), + OriginDutyLocationID: *handlers.FmtUUID(*order.OriginDutyLocationID), + IssueDate: handlers.FmtDate(issueDate), + ReportByDate: handlers.FmtDate(reportByDate), + DepartmentIndicator: &deptIndicator, + HasDependents: handlers.FmtBool(false), + SpouseHasProGear: handlers.FmtBool(false), + Grade: models.ServiceMemberGradeE4.Pointer(), } + path := fmt.Sprintf("/orders/%v", order.ID.String()) + req := httptest.NewRequest("PUT", path, nil) + req = suite.AuthenticateRequest(req, order.ServiceMember) + params := ordersop.UpdateOrdersParams{ HTTPRequest: req, OrdersID: *handlers.FmtUUID(order.ID), @@ -473,19 +489,22 @@ func (suite *HandlerSuite) TestUpdateOrder() { } fakeS3 := storageTest.NewFakeS3Storage(true) - handlerConfig := handlers.NewHandlerCOnfig(suite.DB(), suite.TestLogger()) + handlerConfig := suite.HandlerConfig() handlerConfig.SetFileStorer(fakeS3) - updateHandler := UpdateOrdersHandler{context} - response := updateHandler.Handle(params) + handler := UpdateOrdersHandler{handlerConfig} - suite.Assertions.IsType(&ordersop.UpdateOrdersOK{}, response) + response := handler.Handle(params) + + suite.IsType(&ordersop.UpdateOrdersOK{}, response) okResponse := response.(*ordersop.UpdateOrdersOK) - suite.Assertions.Equal(handlers.FmtString("123456"), okResponse.Payload.OrdersNumber) - suite.Assertions.Equal(order.ServiceMember.ID.String(), okResponse.Payload.ServiceMemberID.String(), "service member id should not change") - suite.Assertions.Equal(newOrdersType, okResponse.Payload.OrdersType) - suite.Assertions.Equal(newOrdersTypeDetail, *okResponse.Payload.OrdersTypeDetail) - suite.Assertions.Equal(handlers.FmtString("N3TEST"), okResponse.Payload.Sac) + suite.NoError(okResponse.Payload.Validate(strfmt.Default)) + suite.Equal(string(newOrdersType), string(*okResponse.Payload.OrdersType)) + suite.Equal(newOrdersNumber, *okResponse.Payload.OrdersNumber) + + updatedOrder, err := models.FetchOrder(suite.DB(), order.ID) + suite.NoError(err) + suite.Equal(payload.Grade, updatedOrder.Grade) + suite.Equal(string(newOrdersType), string(updatedOrder.OrdersType)) } -*/ diff --git a/pkg/handlers/internalapi/service_members.go b/pkg/handlers/internalapi/service_members.go index 21f5b7f5251..3be5c286665 100644 --- a/pkg/handlers/internalapi/service_members.go +++ b/pkg/handlers/internalapi/service_members.go @@ -1,15 +1,12 @@ package internalapi import ( - "database/sql" - "github.com/go-openapi/runtime/middleware" "github.com/gobuffalo/validate/v3" "github.com/gofrs/uuid" "github.com/pkg/errors" "github.com/transcom/mymove/pkg/appcontext" - "github.com/transcom/mymove/pkg/apperror" servicememberop "github.com/transcom/mymove/pkg/gen/internalapi/internaloperations/service_members" "github.com/transcom/mymove/pkg/gen/internalmessages" "github.com/transcom/mymove/pkg/handlers" @@ -32,9 +29,6 @@ func payloadForServiceMemberModel(storer storage.FileStorer, serviceMember model } var weightAllotment *internalmessages.WeightAllotment - if serviceMember.Rank != nil { - weightAllotment = payloadForWeightAllotmentModel(models.GetWeightAllotment(*serviceMember.Rank)) - } serviceMemberPayload := internalmessages.ServiceMemberPayload{ ID: handlers.FmtUUID(serviceMember.ID), @@ -44,7 +38,6 @@ func payloadForServiceMemberModel(storer storage.FileStorer, serviceMember model Edipi: serviceMember.Edipi, Orders: orders, Affiliation: (*internalmessages.Affiliation)(serviceMember.Affiliation), - Rank: (*internalmessages.ServiceMemberRank)(serviceMember.Rank), FirstName: serviceMember.FirstName, MiddleName: serviceMember.MiddleName, LastName: serviceMember.LastName, @@ -58,7 +51,6 @@ func payloadForServiceMemberModel(storer storage.FileStorer, serviceMember model BackupMailingAddress: payloads.Address(serviceMember.BackupMailingAddress), BackupContacts: contactPayloads, IsProfileComplete: handlers.FmtBool(serviceMember.IsProfileComplete()), - CurrentLocation: payloadForDutyLocationModel(serviceMember.DutyLocation), WeightAllotment: weightAllotment, } return &serviceMemberPayload @@ -78,27 +70,11 @@ func (h CreateServiceMemberHandler) Handle(params servicememberop.CreateServiceM residentialAddress := addressModelFromPayload(params.CreateServiceMemberPayload.ResidentialAddress) backupMailingAddress := addressModelFromPayload(params.CreateServiceMemberPayload.BackupMailingAddress) - var dutyLocationID *uuid.UUID - var dutyLocation models.DutyLocation - if params.CreateServiceMemberPayload.CurrentLocationID != nil { - id, err := uuid.FromString(params.CreateServiceMemberPayload.CurrentLocationID.String()) - if err != nil { - return handlers.ResponseForError(appCtx.Logger(), err), err - } - s, err := models.FetchDutyLocation(appCtx.DB(), id) - if err != nil { - return handlers.ResponseForError(appCtx.Logger(), err), err - } - dutyLocationID = &id - dutyLocation = s - } - // Create a new serviceMember for an authenticated user newServiceMember := models.ServiceMember{ UserID: appCtx.Session().UserID, Edipi: params.CreateServiceMemberPayload.Edipi, Affiliation: (*models.ServiceMemberAffiliation)(params.CreateServiceMemberPayload.Affiliation), - Rank: (*models.ServiceMemberRank)(params.CreateServiceMemberPayload.Rank), FirstName: params.CreateServiceMemberPayload.FirstName, MiddleName: params.CreateServiceMemberPayload.MiddleName, LastName: params.CreateServiceMemberPayload.LastName, @@ -110,8 +86,6 @@ func (h CreateServiceMemberHandler) Handle(params servicememberop.CreateServiceM EmailIsPreferred: params.CreateServiceMemberPayload.EmailIsPreferred, ResidentialAddress: residentialAddress, BackupMailingAddress: backupMailingAddress, - DutyLocation: dutyLocation, - DutyLocationID: dutyLocationID, } smVerrs, err := models.SaveServiceMember(appCtx, &newServiceMember) if smVerrs.HasAny() || err != nil { @@ -217,28 +191,6 @@ func (h PatchServiceMemberHandler) Handle(params servicememberop.PatchServiceMem return handlers.ResponseForError(appCtx.Logger(), err), err } - serviceMemberRank := (*string)(serviceMember.Rank) - if serviceMemberRank != order.Grade { - order.Grade = serviceMemberRank - } - - if serviceMember.DutyLocation.ID != order.OriginDutyLocation.ID { - dutyLocation := &serviceMember.DutyLocation - var originDutyLocationGBLOC models.PostalCodeToGBLOC - originDutyLocationGBLOC, err = models.FetchGBLOCForPostalCode(appCtx.DB(), dutyLocation.Address.PostalCode) - if err != nil { - switch err { - case sql.ErrNoRows: - return nil, apperror.NewNotFoundError(dutyLocation.ID, "while looking for Duty Location PostalCodeToGBLOC") - default: - return nil, apperror.NewQueryError("PostalCodeToGBLOC", err, "") - } - } - order.OriginDutyLocation = &serviceMember.DutyLocation - order.OriginDutyLocationID = &serviceMember.DutyLocation.ID - order.OriginDutyLocationGBLOC = &originDutyLocationGBLOC.GBLOC - } - verrs, err = appCtx.DB().ValidateAndSave(&order) if verrs.HasAny() || err != nil { return handlers.ResponseForVErrors(appCtx.Logger(), verrs, err), err @@ -253,27 +205,9 @@ func (h PatchServiceMemberHandler) Handle(params servicememberop.PatchServiceMem func (h PatchServiceMemberHandler) patchServiceMemberWithPayload(appCtx appcontext.AppContext, serviceMember *models.ServiceMember, payload *internalmessages.PatchServiceMemberPayload) (*validate.Errors, error) { if h.isDraftMove(serviceMember) { - if payload.CurrentLocationID != nil { - dutyLocationID, err := uuid.FromString(payload.CurrentLocationID.String()) - if err != nil { - return validate.NewErrors(), err - } - // Fetch the model partially as a validation on the ID - dutyLocation, err := models.FetchDutyLocation(appCtx.DB(), dutyLocationID) - if err != nil { - return validate.NewErrors(), err - } - serviceMember.DutyLocation = dutyLocation - serviceMember.DutyLocationID = &dutyLocationID - } - if payload.Affiliation != nil { serviceMember.Affiliation = (*models.ServiceMemberAffiliation)(payload.Affiliation) } - - if payload.Rank != nil { - serviceMember.Rank = (*models.ServiceMemberRank)(payload.Rank) - } } if payload.Edipi != nil { serviceMember.Edipi = payload.Edipi diff --git a/pkg/handlers/internalapi/service_members_test.go b/pkg/handlers/internalapi/service_members_test.go index 7636bafdf2a..43632e8556b 100644 --- a/pkg/handlers/internalapi/service_members_test.go +++ b/pkg/handlers/internalapi/service_members_test.go @@ -118,9 +118,8 @@ func (suite *HandlerSuite) TestSubmitServiceMemberHandlerNoValues() { // These shouldn't return any value or Swagger clients will complain during validation // because the payloads for these objects are defined to require non-null values for most fields // which can't be handled in OpenAPI Spec 2.0. Therefore we don't return them at all. - suite.Assertions.Equal((*serviceMemberPayload).Rank, (*internalmessages.ServiceMemberRank)(nil)) + suite.Assertions.Equal((*serviceMemberPayload).Grade, (*internalmessages.OrderPayGrade)(nil)) suite.Assertions.Equal((*serviceMemberPayload).Affiliation, (*internalmessages.Affiliation)(nil)) - suite.Assertions.Equal((*serviceMemberPayload).CurrentLocation, (*internalmessages.DutyLocationPayload)(nil)) suite.Assertions.Equal((*serviceMemberPayload).ResidentialAddress, (*internalmessages.Address)(nil)) suite.Assertions.Equal((*serviceMemberPayload).BackupMailingAddress, (*internalmessages.Address)(nil)) suite.Assertions.Equal((*serviceMemberPayload).BackupContacts, internalmessages.IndexServiceMemberBackupContactsPayload{}) @@ -175,8 +174,6 @@ func (suite *HandlerSuite) TestPatchServiceMemberHandler() { var origEdipi = "2342342344" var newEdipi = "9999999999" - origRank := models.ServiceMemberRankE1 - origAffiliation := models.AffiliationAIRFORCE newAffiliation := internalmessages.AffiliationARMY @@ -207,40 +204,10 @@ func (suite *HandlerSuite) TestPatchServiceMemberHandler() { origEmailIsPreferred := models.BoolPointer(true) newEmailIsPreferred := models.BoolPointer(false) - origDutyLocation := factory.BuildDutyLocation(suite.DB(), nil, nil) - // Test updating duty location to one with different GBLOC - newDutyLocationAddress := factory.BuildAddress(suite.DB(), []factory.Customization{ - { - Model: models.Address{ - StreetAddress1: "Fort Eisenhower", - City: "Fort Eisenhower", - State: "GA", - PostalCode: "77777", - Country: models.StringPointer("United States"), - }, - }, - }, nil) - - // Create a custom postal code to GBLOC - newGBLOC := factory.FetchOrBuildPostalCodeToGBLOC(suite.DB(), newDutyLocationAddress.PostalCode, "UUUU") - newDutyLocation := factory.BuildDutyLocation(suite.DB(), []factory.Customization{ - { - Model: models.DutyLocation{ - Name: "Fort Sam Houston", - }, - }, - { - Model: newDutyLocationAddress, - LinkOnly: true, - }, - }, nil) - newDutyLocationID := strfmt.UUID(newDutyLocation.ID.String()) - newServiceMember := factory.BuildServiceMember(suite.DB(), []factory.Customization{ { Model: models.ServiceMember{ Edipi: &origEdipi, - Rank: &origRank, Affiliation: &origAffiliation, FirstName: origFirstName, MiddleName: origMiddleName, @@ -253,32 +220,21 @@ func (suite *HandlerSuite) TestPatchServiceMemberHandler() { EmailIsPreferred: origEmailIsPreferred, }, }, - { - Model: origDutyLocation, - LinkOnly: true, - Type: &factory.DutyLocations.OriginDutyLocation, - }, }, nil) - orderGrade := (string)(models.ServiceMemberRankE5) + orderGrade := models.ServiceMemberGradeE5 factory.BuildMove(suite.DB(), []factory.Customization{ { Model: models.Order{ Grade: &orderGrade, }, }, - { - Model: origDutyLocation, - LinkOnly: true, - Type: &factory.DutyLocations.OriginDutyLocation, - }, { Model: newServiceMember, LinkOnly: true, }, }, nil) - rank := internalmessages.ServiceMemberRankE1 resAddress := fakeAddressPayload() backupAddress := fakeAddressPayload() patchPayload := internalmessages.PatchServiceMemberPayload{ @@ -286,7 +242,6 @@ func (suite *HandlerSuite) TestPatchServiceMemberHandler() { BackupMailingAddress: backupAddress, ResidentialAddress: resAddress, Affiliation: &newAffiliation, - Rank: &rank, EmailIsPreferred: newEmailIsPreferred, FirstName: newFirstName, LastName: newLastName, @@ -296,7 +251,6 @@ func (suite *HandlerSuite) TestPatchServiceMemberHandler() { SecondaryTelephone: newSecondaryTelephone, Suffix: newSuffix, Telephone: newTelephone, - CurrentLocationID: &newDutyLocationID, } req := httptest.NewRequest("PATCH", "/service_members/some_id", nil) @@ -332,11 +286,6 @@ func (suite *HandlerSuite) TestPatchServiceMemberHandler() { suite.Equal(*newEmailIsPreferred, *serviceMemberPayload.EmailIsPreferred) suite.Equal(*resAddress.StreetAddress1, *serviceMemberPayload.ResidentialAddress.StreetAddress1) suite.Equal(*backupAddress.StreetAddress1, *serviceMemberPayload.BackupMailingAddress.StreetAddress1) - // Editing SM info DutyLocation and Rank fields should edit Orders OriginDutyLocation and Grade fields - suite.Equal(*serviceMemberPayload.Orders[0].OriginDutyLocation.Name, newDutyLocation.Name) - suite.Equal(serviceMemberPayload.Orders[0].OriginDutyLocationGbloc, &newGBLOC.GBLOC) - suite.Equal(*serviceMemberPayload.Orders[0].Grade, (string)(rank)) - suite.NotEqual(*serviceMemberPayload.Orders[0].Grade, orderGrade) } func (suite *HandlerSuite) TestPatchServiceMemberHandlerSubmittedMove() { @@ -345,11 +294,6 @@ func (suite *HandlerSuite) TestPatchServiceMemberHandlerSubmittedMove() { edipi := "2342342344" - // If there are orders and the move has been submitted, then the - // affiliation rank, and duty location should not be editable. - origRank := models.ServiceMemberRankE1 - newRank := internalmessages.ServiceMemberRankE2 - origAffiliation := models.AffiliationAIRFORCE newAffiliation := internalmessages.AffiliationARMY @@ -389,7 +333,6 @@ func (suite *HandlerSuite) TestPatchServiceMemberHandlerSubmittedMove() { Model: models.ServiceMember{ UserID: user.ID, Edipi: &edipi, - Rank: &origRank, Affiliation: &origAffiliation, FirstName: origFirstName, MiddleName: origMiddleName, @@ -468,7 +411,6 @@ func (suite *HandlerSuite) TestPatchServiceMemberHandlerSubmittedMove() { MiddleName: newMiddleName, PersonalEmail: newPersonalEmail, PhoneIsPreferred: newPhoneIsPreferred, - Rank: &newRank, SecondaryTelephone: newSecondaryTelephone, Suffix: newSuffix, Telephone: newTelephone, @@ -498,8 +440,6 @@ func (suite *HandlerSuite) TestPatchServiceMemberHandlerSubmittedMove() { // These fields should not change (they should still be the original // values) after the move has been submitted. suite.Equal(origAffiliation, models.ServiceMemberAffiliation(*serviceMemberPayload.Affiliation)) - suite.Equal(origRank, models.ServiceMemberRank(*serviceMemberPayload.Rank)) - suite.Equal(origDutyLocation.ID.String(), string(*serviceMemberPayload.CurrentLocation.ID)) // These fields should change even if the move is submitted. suite.Equal(*newFirstName, *serviceMemberPayload.FirstName) diff --git a/pkg/handlers/internalapi/users.go b/pkg/handlers/internalapi/users.go index e2c531b7837..efe4f24b73d 100644 --- a/pkg/handlers/internalapi/users.go +++ b/pkg/handlers/internalapi/users.go @@ -77,30 +77,6 @@ func (h ShowLoggedInUserHandler) Handle(params userop.ShowLoggedInUserParams) mi return userop.NewShowLoggedInUserUnauthorized(), err } - // Load duty location and transportation office association - if serviceMember.DutyLocationID != nil { - // Fetch associations on duty location - dutyLocation, dutyLocationErr := models.FetchDutyLocation(appCtx.DB(), *serviceMember.DutyLocationID) - if dutyLocationErr != nil { - return handlers.ResponseForError(appCtx.Logger(), dutyLocationErr), dutyLocationErr - } - serviceMember.DutyLocation = dutyLocation - - // Fetch duty location transportation office - transportationOffice, tspErr := models.FetchDutyLocationTransportationOffice(appCtx.DB(), *serviceMember.DutyLocationID) - if tspErr != nil { - if errors.Cause(tspErr) != models.ErrFetchNotFound { - // The absence of an office shouldn't render the entire request a 404 - return handlers.ResponseForError(appCtx.Logger(), tspErr), tspErr - } - // We might not have Transportation Office data for a Duty Location, and that's ok - if errors.Cause(tspErr) != models.ErrFetchNotFound { - return handlers.ResponseForError(appCtx.Logger(), tspErr), tspErr - } - } - serviceMember.DutyLocation.TransportationOffice = transportationOffice - } - // Load the latest orders associations and new duty location transport office if len(serviceMember.Orders) > 0 { orders, orderErr := models.FetchOrderForUser(appCtx.DB(), appCtx.Session(), serviceMember.Orders[0].ID) diff --git a/pkg/handlers/internalapi/users_test.go b/pkg/handlers/internalapi/users_test.go index b6cf64993bc..cc927cc8def 100644 --- a/pkg/handlers/internalapi/users_test.go +++ b/pkg/handlers/internalapi/users_test.go @@ -35,11 +35,6 @@ func (suite *HandlerSuite) TestServiceMemberNoTransportationOfficeLoggedInUserHa suite.Run("current duty location missing", func() { sm := factory.BuildExtendedServiceMember(suite.DB(), nil, nil) - // Remove transportation office info from current duty location - dutyLocation := sm.DutyLocation - dutyLocation.TransportationOfficeID = nil - suite.MustSave(&dutyLocation) - req := httptest.NewRequest("GET", "/users/logged_in", nil) req = suite.AuthenticateRequest(req, sm) diff --git a/pkg/handlers/primeapi/move_task_order_test.go b/pkg/handlers/primeapi/move_task_order_test.go index fd5fba97d1f..57275ba1e96 100644 --- a/pkg/handlers/primeapi/move_task_order_test.go +++ b/pkg/handlers/primeapi/move_task_order_test.go @@ -650,7 +650,7 @@ func (suite *HandlerSuite) TestGetMoveTaskOrder() { suite.Equal(orders.ID.String(), ordersPayload.ID.String()) suite.Equal(orders.ServiceMemberID.String(), ordersPayload.CustomerID.String()) suite.Equal(*orders.OriginDutyLocationGBLOC, ordersPayload.OriginDutyLocationGBLOC) - suite.Equal(*orders.Grade, *ordersPayload.Rank) + suite.Equal(string(*orders.Grade), string(*ordersPayload.Rank)) suite.Equal(orders.ReportByDate.Format(time.RFC3339), time.Time(ordersPayload.ReportByDate).Format(time.RFC3339)) suite.Equal(string(orders.OrdersType), string(ordersPayload.OrdersType)) suite.Equal(*orders.OrdersNumber, *ordersPayload.OrderNumber) diff --git a/pkg/handlers/primeapi/payloads/model_to_payload.go b/pkg/handlers/primeapi/payloads/model_to_payload.go index 50db4b00eac..4915cd8a2d2 100644 --- a/pkg/handlers/primeapi/payloads/model_to_payload.go +++ b/pkg/handlers/primeapi/payloads/model_to_payload.go @@ -131,7 +131,12 @@ func Order(order *models.Order) *primemessages.Order { destinationDutyLocation := DutyLocation(&order.NewDutyLocation) originDutyLocation := DutyLocation(order.OriginDutyLocation) if order.Grade != nil && order.Entitlement != nil { - order.Entitlement.SetWeightAllotment(*order.Grade) + order.Entitlement.SetWeightAllotment(string(*order.Grade)) + } + + var grade string + if order.Grade != nil { + grade = string(*order.Grade) } payload := primemessages.Order{ @@ -144,7 +149,7 @@ func Order(order *models.Order) *primemessages.Order { OriginDutyLocationGBLOC: swag.StringValue(order.OriginDutyLocationGBLOC), OrderNumber: order.OrdersNumber, LinesOfAccounting: order.TAC, - Rank: order.Grade, + Rank: &grade, // Convert prime API "Rank" into our internal tracking of "Grade" ETag: etag.GenerateEtag(order.UpdatedAt), ReportByDate: strfmt.Date(order.ReportByDate), OrdersType: primemessages.OrdersType(order.OrdersType), diff --git a/pkg/handlers/primeapi/payloads/model_to_payload_test.go b/pkg/handlers/primeapi/payloads/model_to_payload_test.go index 4bdfce47b95..349cba21ba5 100644 --- a/pkg/handlers/primeapi/payloads/model_to_payload_test.go +++ b/pkg/handlers/primeapi/payloads/model_to_payload_test.go @@ -359,7 +359,7 @@ func (suite *PayloadsSuite) TestEntitlement() { // TotalWeight needs to read from the internal weightAllotment, in this case 7000 lbs w/o dependents and // 9000 lbs with dependents - entitlement.SetWeightAllotment(string(models.ServiceMemberRankE5)) + entitlement.SetWeightAllotment(string(models.ServiceMemberGradeE5)) payload := Entitlement(&entitlement) @@ -398,7 +398,7 @@ func (suite *PayloadsSuite) TestEntitlement() { // TotalWeight needs to read from the internal weightAllotment, in this case 7000 lbs w/o dependents and // 9000 lbs with dependents - entitlement.SetWeightAllotment(string(models.ServiceMemberRankE5)) + entitlement.SetWeightAllotment(string(models.ServiceMemberGradeE5)) payload := Entitlement(&entitlement) diff --git a/pkg/handlers/primeapiv2/move_task_order_test.go b/pkg/handlers/primeapiv2/move_task_order_test.go index 69df49410a9..804f90cc846 100644 --- a/pkg/handlers/primeapiv2/move_task_order_test.go +++ b/pkg/handlers/primeapiv2/move_task_order_test.go @@ -600,7 +600,7 @@ func (suite *HandlerSuite) TestGetMoveTaskOrder() { suite.Equal(orders.ID.String(), ordersPayload.ID.String()) suite.Equal(orders.ServiceMemberID.String(), ordersPayload.CustomerID.String()) suite.Equal(*orders.OriginDutyLocationGBLOC, ordersPayload.OriginDutyLocationGBLOC) - suite.Equal(*orders.Grade, *ordersPayload.Rank) + suite.Equal(string(*orders.Grade), string(*ordersPayload.Rank)) suite.Equal(orders.ReportByDate.Format(time.RFC3339), time.Time(ordersPayload.ReportByDate).Format(time.RFC3339)) suite.Equal(string(orders.OrdersType), string(ordersPayload.OrdersType)) suite.Equal(*orders.OrdersNumber, *ordersPayload.OrderNumber) diff --git a/pkg/handlers/primeapiv2/payloads/model_to_payload.go b/pkg/handlers/primeapiv2/payloads/model_to_payload.go index 537c27f2d16..cde75103cfe 100644 --- a/pkg/handlers/primeapiv2/payloads/model_to_payload.go +++ b/pkg/handlers/primeapiv2/payloads/model_to_payload.go @@ -90,7 +90,12 @@ func Order(order *models.Order) *primev2messages.Order { destinationDutyLocation := DutyLocation(&order.NewDutyLocation) originDutyLocation := DutyLocation(order.OriginDutyLocation) if order.Grade != nil && order.Entitlement != nil { - order.Entitlement.SetWeightAllotment(*order.Grade) + order.Entitlement.SetWeightAllotment(string(*order.Grade)) + } + + var grade string + if order.Grade != nil { + grade = string(*order.Grade) } payload := primev2messages.Order{ @@ -103,7 +108,7 @@ func Order(order *models.Order) *primev2messages.Order { OriginDutyLocationGBLOC: swag.StringValue(order.OriginDutyLocationGBLOC), OrderNumber: order.OrdersNumber, LinesOfAccounting: order.TAC, - Rank: order.Grade, + Rank: &grade, // Convert prime API "Rank" into our internal tracking of "Grade" ETag: etag.GenerateEtag(order.UpdatedAt), ReportByDate: strfmt.Date(order.ReportByDate), OrdersType: primev2messages.OrdersType(order.OrdersType), diff --git a/pkg/handlers/primeapiv2/payloads/model_to_payload_test.go b/pkg/handlers/primeapiv2/payloads/model_to_payload_test.go index 943162c69b8..1c3b2c5655d 100644 --- a/pkg/handlers/primeapiv2/payloads/model_to_payload_test.go +++ b/pkg/handlers/primeapiv2/payloads/model_to_payload_test.go @@ -270,7 +270,7 @@ func (suite *PayloadsSuite) TestEntitlement() { // TotalWeight needs to read from the internal weightAllotment, in this case 7000 lbs w/o dependents and // 9000 lbs with dependents - entitlement.SetWeightAllotment(string(models.ServiceMemberRankE5)) + entitlement.SetWeightAllotment(string(models.ServiceMemberGradeE5)) payload := Entitlement(&entitlement) @@ -309,7 +309,7 @@ func (suite *PayloadsSuite) TestEntitlement() { // TotalWeight needs to read from the internal weightAllotment, in this case 7000 lbs w/o dependents and // 9000 lbs with dependents - entitlement.SetWeightAllotment(string(models.ServiceMemberRankE5)) + entitlement.SetWeightAllotment(string(models.ServiceMemberGradeE5)) payload := Entitlement(&entitlement) diff --git a/pkg/handlers/supportapi/internal/payloads/model_to_payload.go b/pkg/handlers/supportapi/internal/payloads/model_to_payload.go index 70fce1df5c7..81a06602019 100644 --- a/pkg/handlers/supportapi/internal/payloads/model_to_payload.go +++ b/pkg/handlers/supportapi/internal/payloads/model_to_payload.go @@ -78,9 +78,6 @@ func Customer(customer *models.ServiceMember) *supportmessages.Customer { UserID: strfmt.UUID(customer.UserID.String()), ETag: etag.GenerateEtag(customer.UpdatedAt), } - if customer.Rank != nil { - payload.Rank = supportmessages.NewRank(supportmessages.Rank(*customer.Rank)) - } return &payload } @@ -93,7 +90,7 @@ func Order(order *models.Order) *supportmessages.Order { originDutyLocation := DutyLocation(order.OriginDutyLocation) uploadedOrders := Document(&order.UploadedOrders) if order.Grade != nil && order.Entitlement != nil { - order.Entitlement.SetWeightAllotment(*order.Grade) + order.Entitlement.SetWeightAllotment(string(*order.Grade)) } reportByDate := strfmt.Date(order.ReportByDate) @@ -117,8 +114,8 @@ func Order(order *models.Order) *supportmessages.Order { } if order.Grade != nil { - rank := (supportmessages.Rank)(*order.Grade) - payload.Rank = &rank + grade := (supportmessages.Rank)(*order.Grade) + payload.Rank = &grade // Convert support API "Rank" into our internal tracking of "Grade" } if order.OriginDutyLocationID != nil { payload.OriginDutyLocationID = handlers.FmtUUID(*order.OriginDutyLocationID) diff --git a/pkg/handlers/supportapi/internal/payloads/model_to_payload_test.go b/pkg/handlers/supportapi/internal/payloads/model_to_payload_test.go index 9169cb33f1f..21ab990bce2 100644 --- a/pkg/handlers/supportapi/internal/payloads/model_to_payload_test.go +++ b/pkg/handlers/supportapi/internal/payloads/model_to_payload_test.go @@ -77,7 +77,7 @@ func TestEntitlement(t *testing.T) { // TotalWeight needs to read from the internal weightAllotment, in this case 7000 lbs w/o dependents and // 9000 lbs with dependents - entitlement.SetWeightAllotment(string(models.ServiceMemberRankE5)) + entitlement.SetWeightAllotment(string(models.ServiceMemberGradeE5)) payload := Entitlement(&entitlement) @@ -116,7 +116,7 @@ func TestEntitlement(t *testing.T) { // TotalWeight needs to read from the internal weightAllotment, in this case 7000 lbs w/o dependents and // 9000 lbs with dependents - entitlement.SetWeightAllotment(string(models.ServiceMemberRankE5)) + entitlement.SetWeightAllotment(string(models.ServiceMemberGradeE5)) payload := Entitlement(&entitlement) diff --git a/pkg/handlers/supportapi/internal/payloads/payload_to_model.go b/pkg/handlers/supportapi/internal/payloads/payload_to_model.go index f54eb71b0a6..06157ec62e3 100644 --- a/pkg/handlers/supportapi/internal/payloads/payload_to_model.go +++ b/pkg/handlers/supportapi/internal/payloads/payload_to_model.go @@ -6,6 +6,7 @@ import ( "github.com/gobuffalo/validate/v3" "github.com/gofrs/uuid" + "github.com/transcom/mymove/pkg/gen/internalmessages" "github.com/transcom/mymove/pkg/gen/supportmessages" "github.com/transcom/mymove/pkg/handlers" "github.com/transcom/mymove/pkg/models" @@ -46,7 +47,8 @@ func OrderModel(orderPayload *supportmessages.Order) *models.Order { } if orderPayload.Rank != nil { - model.Grade = models.StringPointer((string)(*orderPayload.Rank)) + grade := internalmessages.OrderPayGrade(*orderPayload.Rank) // Convert support API "Rank" into our internal tracking of "Grade" + model.Grade = &grade } customerID := uuid.FromStringOrNil(orderPayload.CustomerID.String()) diff --git a/pkg/handlers/supportapi/move_task_order_test.go b/pkg/handlers/supportapi/move_task_order_test.go index 14fe114e209..f62ed75f073 100644 --- a/pkg/handlers/supportapi/move_task_order_test.go +++ b/pkg/handlers/supportapi/move_task_order_test.go @@ -236,12 +236,12 @@ func (suite *HandlerSuite) TestCreateMoveTaskOrderRequestHandler() { ordersTypedetail := supportmessages.OrdersTypeDetailHHGPERMITTED deptIndicator := supportmessages.DeptIndicatorAIRANDSPACEFORCE - rank := (supportmessages.Rank)("E_6") + grade := (supportmessages.Rank)("E_6") mtoPayload := &supportmessages.MoveTaskOrder{ PpmType: "FULL", ContractorID: handlers.FmtUUID(contractor.ID), Order: &supportmessages.Order{ - Rank: &rank, + Rank: &grade, // Convert support API "Rank" into our internal tracking of "Grade" OrderNumber: models.StringPointer("4554"), DestinationDutyLocationID: handlers.FmtUUID(destinationDutyLocation.ID), OriginDutyLocationID: handlers.FmtUUID(originDutyLocation.ID), diff --git a/pkg/models/entitlements.go b/pkg/models/entitlements.go index a63575b432b..3f5e6aef4cd 100644 --- a/pkg/models/entitlements.go +++ b/pkg/models/entitlements.go @@ -2,6 +2,8 @@ package models import ( "fmt" + + "github.com/transcom/mymove/pkg/gen/internalmessages" ) // WeightAllotment represents the weights allotted for a rank @@ -175,53 +177,53 @@ var civilianEmployee = WeightAllotment{ ProGearWeightSpouse: 500, } -var entitlements = map[ServiceMemberRank]WeightAllotment{ - ServiceMemberRankACADEMYCADET: midshipman, - ServiceMemberRankAVIATIONCADET: aviationCadet, - ServiceMemberRankE1: e1, - ServiceMemberRankE2: e2, - ServiceMemberRankE3: e3, - ServiceMemberRankE4: e4, - ServiceMemberRankE5: e5, - ServiceMemberRankE6: e6, - ServiceMemberRankE7: e7, - ServiceMemberRankE8: e8, - ServiceMemberRankE9: e9, - ServiceMemberRankE9SPECIALSENIORENLISTED: e9SpecialSeniorEnlisted, - ServiceMemberRankMIDSHIPMAN: midshipman, - ServiceMemberRankO1ACADEMYGRADUATE: o1W1AcademyGraduate, - ServiceMemberRankO2: o2W2, - ServiceMemberRankO3: o3W3, - ServiceMemberRankO4: o4W4, - ServiceMemberRankO5: o5W5, - ServiceMemberRankO6: o6, - ServiceMemberRankO7: o7, - ServiceMemberRankO8: o8, - ServiceMemberRankO9: o9, - ServiceMemberRankO10: o10, - ServiceMemberRankW1: o1W1AcademyGraduate, - ServiceMemberRankW2: o2W2, - ServiceMemberRankW3: o3W3, - ServiceMemberRankW4: o4W4, - ServiceMemberRankW5: o5W5, - ServiceMemberRankCIVILIANEMPLOYEE: civilianEmployee, -} - -func getEntitlement(rank ServiceMemberRank) (WeightAllotment, error) { - if entitlement, ok := entitlements[rank]; ok { +var entitlements = map[internalmessages.OrderPayGrade]WeightAllotment{ + ServiceMemberGradeACADEMYCADET: midshipman, + ServiceMemberGradeAVIATIONCADET: aviationCadet, + ServiceMemberGradeE1: e1, + ServiceMemberGradeE2: e2, + ServiceMemberGradeE3: e3, + ServiceMemberGradeE4: e4, + ServiceMemberGradeE5: e5, + ServiceMemberGradeE6: e6, + ServiceMemberGradeE7: e7, + ServiceMemberGradeE8: e8, + ServiceMemberGradeE9: e9, + ServiceMemberGradeE9SPECIALSENIORENLISTED: e9SpecialSeniorEnlisted, + ServiceMemberGradeMIDSHIPMAN: midshipman, + ServiceMemberGradeO1ACADEMYGRADUATE: o1W1AcademyGraduate, + ServiceMemberGradeO2: o2W2, + ServiceMemberGradeO3: o3W3, + ServiceMemberGradeO4: o4W4, + ServiceMemberGradeO5: o5W5, + ServiceMemberGradeO6: o6, + ServiceMemberGradeO7: o7, + ServiceMemberGradeO8: o8, + ServiceMemberGradeO9: o9, + ServiceMemberGradeO10: o10, + ServiceMemberGradeW1: o1W1AcademyGraduate, + ServiceMemberGradeW2: o2W2, + ServiceMemberGradeW3: o3W3, + ServiceMemberGradeW4: o4W4, + ServiceMemberGradeW5: o5W5, + ServiceMemberGradeCIVILIANEMPLOYEE: civilianEmployee, +} + +func getEntitlement(grade internalmessages.OrderPayGrade) (WeightAllotment, error) { + if entitlement, ok := entitlements[grade]; ok { return entitlement, nil } - return WeightAllotment{}, fmt.Errorf("no entitlement found for rank %s", rank) + return WeightAllotment{}, fmt.Errorf("no entitlement found for rank %s", grade) } // AllWeightAllotments returns all the weight allotments for each rank. -func AllWeightAllotments() map[ServiceMemberRank]WeightAllotment { +func AllWeightAllotments() map[internalmessages.OrderPayGrade]WeightAllotment { return entitlements } -// GetWeightAllotment returns the weight allotments for a given rank. -func GetWeightAllotment(rank ServiceMemberRank) WeightAllotment { - entitlement, err := getEntitlement(rank) +// GetWeightAllotment returns the weight allotments for a given pay grade. +func GetWeightAllotment(grade internalmessages.OrderPayGrade) WeightAllotment { + entitlement, err := getEntitlement(grade) if err != nil { return WeightAllotment{} } diff --git a/pkg/models/entitlements_test.go b/pkg/models/entitlements_test.go index 93d4f3c904c..ac4ee972114 100644 --- a/pkg/models/entitlements_test.go +++ b/pkg/models/entitlements_test.go @@ -5,7 +5,7 @@ import ( ) func (suite *ModelSuite) TestGetEntitlementWithValidValues() { - E1 := models.ServiceMemberRankE1 + E1 := models.ServiceMemberGradeE1 suite.Run("E1 with dependents", func() { E1FullLoad := models.GetWeightAllotment(E1) diff --git a/pkg/models/ghc_entitlements.go b/pkg/models/ghc_entitlements.go index 0ce03c5230e..337e94776af 100644 --- a/pkg/models/ghc_entitlements.go +++ b/pkg/models/ghc_entitlements.go @@ -7,6 +7,8 @@ import ( "github.com/gobuffalo/validate/v3" "github.com/gobuffalo/validate/v3/validators" "github.com/gofrs/uuid" + + "github.com/transcom/mymove/pkg/gen/internalmessages" ) // Entitlement is an object representing entitlements for orders @@ -48,7 +50,7 @@ func (e *Entitlement) Validate(*pop.Connection) (*validate.Errors, error) { // TODO and possibly consider creating ghc specific GetWeightAllotment should the two // TODO diverge in the future func (e *Entitlement) SetWeightAllotment(grade string) { - wa := GetWeightAllotment(ServiceMemberRank(grade)) + wa := GetWeightAllotment(internalmessages.OrderPayGrade(grade)) e.WeightAllotted = &wa } @@ -74,7 +76,7 @@ func (e *Entitlement) AuthorizedWeight() *int { } } -// WeightAllowance will return the service member's weight allotment based on their rank and if dependents are +// WeightAllowance will return the service member's weight allotment based on their grade and if dependents are // authorized func (e *Entitlement) WeightAllowance() *int { if weightAllotment := e.WeightAllotment(); weightAllotment != nil { diff --git a/pkg/models/order.go b/pkg/models/order.go index 32656d523df..3fa91afc448 100644 --- a/pkg/models/order.go +++ b/pkg/models/order.go @@ -64,7 +64,7 @@ type Order struct { NtsTAC *string `json:"nts_tac" db:"nts_tac"` NtsSAC *string `json:"nts_sac" db:"nts_sac"` DepartmentIndicator *string `json:"department_indicator" db:"department_indicator"` - Grade *string `json:"grade" db:"grade"` + Grade *internalmessages.OrderPayGrade `json:"grade" db:"grade"` Entitlement *Entitlement `belongs_to:"entitlements" fk_id:"entitlement_id"` EntitlementID *uuid.UUID `json:"entitlement_id" db:"entitlement_id"` UploadedAmendedOrders *Document `belongs_to:"documents" fk_id:"uploaded_amended_orders_id"` diff --git a/pkg/models/personally_procured_move.go b/pkg/models/personally_procured_move.go index 2aef6ffeeb6..8db5fc8f1be 100644 --- a/pkg/models/personally_procured_move.go +++ b/pkg/models/personally_procured_move.go @@ -134,7 +134,7 @@ func (p *PersonallyProcuredMove) Cancel() error { // FetchPersonallyProcuredMove Fetches and Validates a PPM model func FetchPersonallyProcuredMove(db *pop.Connection, _ *auth.Session, id uuid.UUID) (*PersonallyProcuredMove, error) { var ppm PersonallyProcuredMove - err := db.Q().Eager("Move.Orders.ServiceMember.DutyLocation.Address", "Move.Orders.NewDutyLocation.Address", "Advance").Find(&ppm, id) + err := db.Q().Eager("Move.Orders.OriginDutyLocation.Address", "Move.Orders.NewDutyLocation.Address", "Advance").Find(&ppm, id) if err != nil { // Otherwise, it's an unexpected err so we return that. return nil, err diff --git a/pkg/models/queue.go b/pkg/models/queue.go index c3904c24739..0a9143bda37 100644 --- a/pkg/models/queue.go +++ b/pkg/models/queue.go @@ -5,32 +5,34 @@ import ( "github.com/gobuffalo/pop/v6" "github.com/gofrs/uuid" + + "github.com/transcom/mymove/pkg/gen/internalmessages" ) // MoveQueueItem represents a single move queue item within a queue. type MoveQueueItem struct { - ID uuid.UUID `json:"id" db:"id"` - CreatedAt time.Time `json:"created_at" db:"created_at"` - Edipi string `json:"edipi" db:"edipi"` - Rank *ServiceMemberRank `json:"rank" db:"rank"` - CustomerName string `json:"customer_name" db:"customer_name"` - Locator string `json:"locator" db:"locator"` - Status string `json:"status" db:"status"` - PpmStatus *string `json:"ppm_status" db:"ppm_status"` - OrdersType string `json:"orders_type" db:"orders_type"` - MoveDate *time.Time `json:"move_date" db:"move_date"` - SubmittedDate *time.Time `json:"submitted_date" db:"submitted_date"` - LastModifiedDate time.Time `json:"last_modified_date" db:"last_modified_date"` - OriginDutyLocationName string `json:"origin_duty_location_name" db:"origin_duty_location_name"` - DestinationDutyLocationName string `json:"destination_duty_location_name" db:"destination_duty_location_name"` - PmSurveyConductedDate *time.Time `json:"pm_survey_conducted_date" db:"pm_survey_conducted_date"` - OriginGBLOC *string `json:"origin_gbloc" db:"origin_gbloc"` - DestinationGBLOC *string `json:"destination_gbloc" db:"destination_gbloc"` - DeliveredDate *time.Time `json:"delivered_date" db:"delivered_date"` - InvoiceApprovedDate *time.Time `json:"invoice_approved_date" db:"invoice_approved_date"` - BranchOfService string `json:"branch_of_service" db:"branch_of_service"` - ActualMoveDate *time.Time `json:"actual_move_date" db:"actual_move_date"` - OriginalMoveDate *time.Time `json:"original_move_date" db:"original_move_date"` + ID uuid.UUID `json:"id" db:"id"` + CreatedAt time.Time `json:"created_at" db:"created_at"` + Edipi string `json:"edipi" db:"edipi"` + Grade *internalmessages.OrderPayGrade `json:"grade" db:"grade"` + CustomerName string `json:"customer_name" db:"customer_name"` + Locator string `json:"locator" db:"locator"` + Status string `json:"status" db:"status"` + PpmStatus *string `json:"ppm_status" db:"ppm_status"` + OrdersType string `json:"orders_type" db:"orders_type"` + MoveDate *time.Time `json:"move_date" db:"move_date"` + SubmittedDate *time.Time `json:"submitted_date" db:"submitted_date"` + LastModifiedDate time.Time `json:"last_modified_date" db:"last_modified_date"` + OriginDutyLocationName string `json:"origin_duty_location_name" db:"origin_duty_location_name"` + DestinationDutyLocationName string `json:"destination_duty_location_name" db:"destination_duty_location_name"` + PmSurveyConductedDate *time.Time `json:"pm_survey_conducted_date" db:"pm_survey_conducted_date"` + OriginGBLOC *string `json:"origin_gbloc" db:"origin_gbloc"` + DestinationGBLOC *string `json:"destination_gbloc" db:"destination_gbloc"` + DeliveredDate *time.Time `json:"delivered_date" db:"delivered_date"` + InvoiceApprovedDate *time.Time `json:"invoice_approved_date" db:"invoice_approved_date"` + BranchOfService string `json:"branch_of_service" db:"branch_of_service"` + ActualMoveDate *time.Time `json:"actual_move_date" db:"actual_move_date"` + OriginalMoveDate *time.Time `json:"original_move_date" db:"original_move_date"` } // GetMoveQueueItems gets all moveQueueItems for a specific lifecycleState @@ -42,11 +44,11 @@ func GetMoveQueueItems(db *pop.Connection, lifecycleState string) ([]MoveQueueIt query = ` SELECT moves.ID, COALESCE(sm.edipi, '*missing*') as edipi, - COALESCE(sm.rank, '*missing*') as rank, CONCAT(COALESCE(sm.last_name, '*missing*'), ', ', COALESCE(sm.first_name, '*missing*')) AS customer_name, moves.locator as locator, sm.affiliation as branch_of_service, ord.orders_type as orders_type, + ord.grade as grade, COALESCE( ppm.actual_move_date, ppm.original_move_date @@ -64,23 +66,23 @@ func GetMoveQueueItems(db *pop.Connection, lifecycleState string) ([]MoveQueueIt FROM moves JOIN orders as ord ON moves.orders_id = ord.id JOIN service_members AS sm ON ord.service_member_id = sm.id - JOIN duty_locations as origin_duty_location ON sm.duty_location_id = origin_duty_location.id + JOIN duty_locations as origin_duty_location ON ord.origin_duty_location_id = origin_duty_location.id JOIN personally_procured_moves AS ppm ON moves.id = ppm.move_id WHERE (moves.status = 'SUBMITTED' OR (ppm.status = 'SUBMITTED' AND (NOT moves.status in ('CANCELED', 'DRAFT')))) AND moves.show is true - GROUP BY moves.ID, rank, customer_name, edipi, locator, orders_type, move_date, moves.created_at, last_modified_date, moves.status, ppm.submit_date, ppm_status, origin_duty_location.name, sm.affiliation, ppm.actual_move_date, ppm.original_move_date + GROUP BY moves.ID, grade, customer_name, edipi, locator, orders_type, move_date, moves.created_at, last_modified_date, moves.status, ppm.submit_date, ppm_status, origin_duty_location.name, sm.affiliation, ppm.actual_move_date, ppm.original_move_date ` } else if lifecycleState == "ppm_payment_requested" { query = ` SELECT moves.ID, COALESCE(sm.edipi, '*missing*') as edipi, - COALESCE(sm.rank, '*missing*') as rank, CONCAT(COALESCE(sm.last_name, '*missing*'), ', ', COALESCE(sm.first_name, '*missing*')) AS customer_name, moves.locator as locator, sm.affiliation as branch_of_service, ord.orders_type as orders_type, + ord.grade as grade, COALESCE(ppm.actual_move_date, ppm.original_move_date) as move_date, moves.created_at as created_at, ppm.updated_at as last_modified_date, @@ -94,7 +96,7 @@ func GetMoveQueueItems(db *pop.Connection, lifecycleState string) ([]MoveQueueIt JOIN orders as ord ON moves.orders_id = ord.id JOIN service_members AS sm ON ord.service_member_id = sm.id JOIN personally_procured_moves AS ppm ON moves.id = ppm.move_id - JOIN duty_locations as origin_duty_location ON sm.duty_location_id = origin_duty_location.id + JOIN duty_locations as origin_duty_location ON ord.origin_duty_location_id = origin_duty_location.id JOIN duty_locations as destination_duty_location ON ord.new_duty_location_id = destination_duty_location.id WHERE moves.show is true and ppm.status = 'PAYMENT_REQUESTED' @@ -103,11 +105,11 @@ func GetMoveQueueItems(db *pop.Connection, lifecycleState string) ([]MoveQueueIt query = ` SELECT moves.ID, COALESCE(sm.edipi, '*missing*') as edipi, - COALESCE(sm.rank, '*missing*') as rank, CONCAT(COALESCE(sm.last_name, '*missing*'), ', ', COALESCE(sm.first_name, '*missing*')) AS customer_name, moves.locator as locator, sm.affiliation as branch_of_service, ord.orders_type as orders_type, + ord.grade as grade, COALESCE(ppm.actual_move_date, ppm.original_move_date) as move_date, moves.created_at as created_at, ppm.updated_at as last_modified_date, @@ -121,7 +123,7 @@ func GetMoveQueueItems(db *pop.Connection, lifecycleState string) ([]MoveQueueIt JOIN orders as ord ON moves.orders_id = ord.id JOIN service_members AS sm ON ord.service_member_id = sm.id JOIN personally_procured_moves AS ppm ON moves.id = ppm.move_id - JOIN duty_locations as origin_duty_location ON sm.duty_location_id = origin_duty_location.id + JOIN duty_locations as origin_duty_location ON ord.origin_duty_location_id = origin_duty_location.id JOIN duty_locations as destination_duty_location ON ord.new_duty_location_id = destination_duty_location.id WHERE moves.show is true and ppm.status = 'COMPLETED' @@ -130,11 +132,11 @@ func GetMoveQueueItems(db *pop.Connection, lifecycleState string) ([]MoveQueueIt query = ` SELECT moves.ID, COALESCE(sm.edipi, '*missing*') as edipi, - COALESCE(sm.rank, '*missing*') as rank, CONCAT(COALESCE(sm.last_name, '*missing*'), ', ', COALESCE(sm.first_name, '*missing*')) AS customer_name, moves.locator as locator, sm.affiliation as branch_of_service, ord.orders_type as orders_type, + ord.grade as grade, COALESCE(ppm.actual_move_date, ppm.original_move_date) as move_date, moves.created_at as created_at, ppm.updated_at as last_modified_date, @@ -148,7 +150,7 @@ func GetMoveQueueItems(db *pop.Connection, lifecycleState string) ([]MoveQueueIt JOIN orders as ord ON moves.orders_id = ord.id JOIN service_members AS sm ON ord.service_member_id = sm.id JOIN personally_procured_moves AS ppm ON moves.id = ppm.move_id - JOIN duty_locations as origin_duty_location ON sm.duty_location_id = origin_duty_location.id + JOIN duty_locations as origin_duty_location ON ord.origin_duty_location_id = origin_duty_location.id JOIN duty_locations as destination_duty_location ON ord.new_duty_location_id = destination_duty_location.id WHERE moves.show is true and ppm.status = 'APPROVED' @@ -157,7 +159,6 @@ func GetMoveQueueItems(db *pop.Connection, lifecycleState string) ([]MoveQueueIt query = ` SELECT moves.ID, COALESCE(sm.edipi, '*missing*') as edipi, - COALESCE(sm.rank, '*missing*') as rank, CONCAT(COALESCE(sm.last_name, '*missing*'), ', ', COALESCE(sm.first_name, '*missing*')) AS customer_name, moves.locator as locator, sm.affiliation as branch_of_service, @@ -178,7 +179,7 @@ func GetMoveQueueItems(db *pop.Connection, lifecycleState string) ([]MoveQueueIt JOIN orders as ord ON moves.orders_id = ord.id JOIN service_members AS sm ON ord.service_member_id = sm.id JOIN personally_procured_moves AS ppm ON moves.id = ppm.move_id - JOIN duty_locations as origin_duty_location ON sm.duty_location_id = origin_duty_location.id + JOIN duty_locations as origin_duty_location ON ord.origin_duty_location_id = origin_duty_location.id JOIN duty_locations as destination_duty_location ON ord.new_duty_location_id = destination_duty_location.id WHERE moves.show is true ` diff --git a/pkg/models/service_member.go b/pkg/models/service_member.go index f0d00ba52f4..100451ee719 100644 --- a/pkg/models/service_member.go +++ b/pkg/models/service_member.go @@ -48,7 +48,6 @@ type ServiceMember struct { User User `belongs_to:"user" fk_id:"user_id"` Edipi *string `json:"edipi" db:"edipi"` Affiliation *ServiceMemberAffiliation `json:"affiliation" db:"affiliation"` - Rank *ServiceMemberRank `json:"rank" db:"rank"` FirstName *string `json:"first_name" db:"first_name"` MiddleName *string `json:"middle_name" db:"middle_name"` LastName *string `json:"last_name" db:"last_name"` @@ -64,8 +63,6 @@ type ServiceMember struct { BackupMailingAddress *Address `belongs_to:"address" fk_id:"backup_mailing_address_id"` Orders Orders `has_many:"orders" fk_id:"service_member_id" order_by:"created_at desc" ` BackupContacts BackupContacts `has_many:"backup_contacts" fk_id:"service_member_id"` - DutyLocationID *uuid.UUID `json:"duty_location_id" db:"duty_location_id"` - DutyLocation DutyLocation `belongs_to:"duty_locations" fk_id:"duty_location_id"` } // TableName overrides the table name used by Pop. @@ -90,9 +87,6 @@ func FetchServiceMemberForUser(db *pop.Connection, session *auth.Session, id uui err := db.Q().Eager("User", "BackupMailingAddress", "BackupContacts", - "DutyLocation.Address", - "DutyLocation.TransportationOffice", - "DutyLocation.TransportationOffice.PhoneLines", "Orders.NewDutyLocation.TransportationOffice", "Orders.OriginDutyLocation", "Orders.UploadedOrders.UserUploads.Upload", @@ -216,7 +210,7 @@ func (s ServiceMember) CreateOrder(appCtx appcontext.AppContext, sac *string, departmentIndicator *string, originDutyLocation *DutyLocation, - grade *string, + grade *internalmessages.OrderPayGrade, entitlement *Entitlement, originDutyLocationGBLOC *string, packingAndShippingInstructions string) (Order, *validate.Errors, error) { @@ -292,9 +286,6 @@ func (s *ServiceMember) IsProfileComplete() bool { if s.Affiliation == nil { return false } - if s.Rank == nil { - return false - } if s.FirstName == nil { return false } @@ -316,9 +307,6 @@ func (s *ServiceMember) IsProfileComplete() bool { if s.BackupMailingAddressID == nil { return false } - if s.DutyLocationID == nil { - return false - } if len(s.BackupContacts) == 0 { return false } diff --git a/pkg/models/service_member_grade.go b/pkg/models/service_member_grade.go new file mode 100644 index 00000000000..55e3a627b5f --- /dev/null +++ b/pkg/models/service_member_grade.go @@ -0,0 +1,64 @@ +package models + +import "github.com/transcom/mymove/pkg/gen/internalmessages" + +const ( + // ServiceMemberGradeE1 captures enum value "E_1" + ServiceMemberGradeE1 internalmessages.OrderPayGrade = "E_1" + // ServiceMemberGradeE2 captures enum value "E_2" + ServiceMemberGradeE2 internalmessages.OrderPayGrade = "E_2" + // ServiceMemberGradeE3 captures enum value "E_3" + ServiceMemberGradeE3 internalmessages.OrderPayGrade = "E_3" + // ServiceMemberGradeE4 captures enum value "E_4" + ServiceMemberGradeE4 internalmessages.OrderPayGrade = "E_4" + // ServiceMemberGradeE5 captures enum value "E_5" + ServiceMemberGradeE5 internalmessages.OrderPayGrade = "E_5" + // ServiceMemberGradeE6 captures enum value "E_6" + ServiceMemberGradeE6 internalmessages.OrderPayGrade = "E_6" + // ServiceMemberGradeE7 captures enum value "E_7" + ServiceMemberGradeE7 internalmessages.OrderPayGrade = "E_7" + // ServiceMemberGradeE8 captures enum value "E_8" + ServiceMemberGradeE8 internalmessages.OrderPayGrade = "E_8" + // ServiceMemberGradeE9 captures enum value "E_9" + ServiceMemberGradeE9 internalmessages.OrderPayGrade = "E_9" + // ServiceMemberGradeE9SPECIALSENIORENLISTED captures enum value "E_9_SPECIAL_SENIOR_ENLISTED" + ServiceMemberGradeE9SPECIALSENIORENLISTED internalmessages.OrderPayGrade = "E_9_SPECIAL_SENIOR_ENLISTED" + // ServiceMemberGradeO1ACADEMYGRADUATE captures enum value "O_1_ACADEMY_GRADUATE" + ServiceMemberGradeO1ACADEMYGRADUATE internalmessages.OrderPayGrade = "O_1_ACADEMY_GRADUATE" + // ServiceMemberGradeO2 captures enum value "O_2" + ServiceMemberGradeO2 internalmessages.OrderPayGrade = "O_2" + // ServiceMemberGradeO3 captures enum value "O_3" + ServiceMemberGradeO3 internalmessages.OrderPayGrade = "O_3" + // ServiceMemberGradeO4 captures enum value "O_4" + ServiceMemberGradeO4 internalmessages.OrderPayGrade = "O_4" + // ServiceMemberGradeO5 captures enum value "O_5" + ServiceMemberGradeO5 internalmessages.OrderPayGrade = "O_5" + // ServiceMemberGradeO6 captures enum value "O_6" + ServiceMemberGradeO6 internalmessages.OrderPayGrade = "O_6" + // ServiceMemberGradeO7 captures enum value "O_7" + ServiceMemberGradeO7 internalmessages.OrderPayGrade = "O_7" + // ServiceMemberGradeO8 captures enum value "O_8" + ServiceMemberGradeO8 internalmessages.OrderPayGrade = "O_8" + // ServiceMemberGradeO9 captures enum value "O_9" + ServiceMemberGradeO9 internalmessages.OrderPayGrade = "O_9" + // ServiceMemberGradeO10 captures enum value "O_10" + ServiceMemberGradeO10 internalmessages.OrderPayGrade = "O_10" + // ServiceMemberGradeW1 captures enum value "W_1" + ServiceMemberGradeW1 internalmessages.OrderPayGrade = "W_1" + // ServiceMemberGradeW2 captures enum value "W_2" + ServiceMemberGradeW2 internalmessages.OrderPayGrade = "W_2" + // ServiceMemberGradeW3 captures enum value "W_3" + ServiceMemberGradeW3 internalmessages.OrderPayGrade = "W_3" + // ServiceMemberGradeW4 captures enum value "W_4" + ServiceMemberGradeW4 internalmessages.OrderPayGrade = "W_4" + // ServiceMemberGradeW5 captures enum value "W_5" + ServiceMemberGradeW5 internalmessages.OrderPayGrade = "W_5" + // ServiceMemberGradeAVIATIONCADET captures enum value "AVIATION_CADET" + ServiceMemberGradeAVIATIONCADET internalmessages.OrderPayGrade = "AVIATION_CADET" + // ServiceMemberGradeCIVILIANEMPLOYEE captures enum value "CIVILIAN_EMPLOYEE" + ServiceMemberGradeCIVILIANEMPLOYEE internalmessages.OrderPayGrade = "CIVILIAN_EMPLOYEE" + // ServiceMemberGradeACADEMYCADET captures enum value "ACADEMY_CADET" + ServiceMemberGradeACADEMYCADET internalmessages.OrderPayGrade = "ACADEMY_CADET" + // ServiceMemberGradeMIDSHIPMAN captures enum value "MIDSHIPMAN" + ServiceMemberGradeMIDSHIPMAN internalmessages.OrderPayGrade = "MIDSHIPMAN" +) diff --git a/pkg/models/service_member_rank.go b/pkg/models/service_member_rank.go deleted file mode 100644 index 9efc8c9451a..00000000000 --- a/pkg/models/service_member_rank.go +++ /dev/null @@ -1,65 +0,0 @@ -package models - -// ServiceMemberRank represents a service member's rank -type ServiceMemberRank string - -const ( - // ServiceMemberRankE1 captures enum value "E_1" - ServiceMemberRankE1 ServiceMemberRank = "E_1" - // ServiceMemberRankE2 captures enum value "E_2" - ServiceMemberRankE2 ServiceMemberRank = "E_2" - // ServiceMemberRankE3 captures enum value "E_3" - ServiceMemberRankE3 ServiceMemberRank = "E_3" - // ServiceMemberRankE4 captures enum value "E_4" - ServiceMemberRankE4 ServiceMemberRank = "E_4" - // ServiceMemberRankE5 captures enum value "E_5" - ServiceMemberRankE5 ServiceMemberRank = "E_5" - // ServiceMemberRankE6 captures enum value "E_6" - ServiceMemberRankE6 ServiceMemberRank = "E_6" - // ServiceMemberRankE7 captures enum value "E_7" - ServiceMemberRankE7 ServiceMemberRank = "E_7" - // ServiceMemberRankE8 captures enum value "E_8" - ServiceMemberRankE8 ServiceMemberRank = "E_8" - // ServiceMemberRankE9 captures enum value "E_9" - ServiceMemberRankE9 ServiceMemberRank = "E_9" - // ServiceMemberRankE9SPECIALSENIORENLISTED captures enum value "E_9_SPECIAL_SENIOR_ENLISTED" - ServiceMemberRankE9SPECIALSENIORENLISTED ServiceMemberRank = "E_9_SPECIAL_SENIOR_ENLISTED" - // ServiceMemberRankO1ACADEMYGRADUATE captures enum value "O_1_ACADEMY_GRADUATE" - ServiceMemberRankO1ACADEMYGRADUATE ServiceMemberRank = "O_1_ACADEMY_GRADUATE" - // ServiceMemberRankO2 captures enum value "O_2" - ServiceMemberRankO2 ServiceMemberRank = "O_2" - // ServiceMemberRankO3 captures enum value "O_3" - ServiceMemberRankO3 ServiceMemberRank = "O_3" - // ServiceMemberRankO4 captures enum value "O_4" - ServiceMemberRankO4 ServiceMemberRank = "O_4" - // ServiceMemberRankO5 captures enum value "O_5" - ServiceMemberRankO5 ServiceMemberRank = "O_5" - // ServiceMemberRankO6 captures enum value "O_6" - ServiceMemberRankO6 ServiceMemberRank = "O_6" - // ServiceMemberRankO7 captures enum value "O_7" - ServiceMemberRankO7 ServiceMemberRank = "O_7" - // ServiceMemberRankO8 captures enum value "O_8" - ServiceMemberRankO8 ServiceMemberRank = "O_8" - // ServiceMemberRankO9 captures enum value "O_9" - ServiceMemberRankO9 ServiceMemberRank = "O_9" - // ServiceMemberRankO10 captures enum value "O_10" - ServiceMemberRankO10 ServiceMemberRank = "O_10" - // ServiceMemberRankW1 captures enum value "W_1" - ServiceMemberRankW1 ServiceMemberRank = "W_1" - // ServiceMemberRankW2 captures enum value "W_2" - ServiceMemberRankW2 ServiceMemberRank = "W_2" - // ServiceMemberRankW3 captures enum value "W_3" - ServiceMemberRankW3 ServiceMemberRank = "W_3" - // ServiceMemberRankW4 captures enum value "W_4" - ServiceMemberRankW4 ServiceMemberRank = "W_4" - // ServiceMemberRankW5 captures enum value "W_5" - ServiceMemberRankW5 ServiceMemberRank = "W_5" - // ServiceMemberRankAVIATIONCADET captures enum value "AVIATION_CADET" - ServiceMemberRankAVIATIONCADET ServiceMemberRank = "AVIATION_CADET" - // ServiceMemberRankCIVILIANEMPLOYEE captures enum value "CIVILIAN_EMPLOYEE" - ServiceMemberRankCIVILIANEMPLOYEE ServiceMemberRank = "CIVILIAN_EMPLOYEE" - // ServiceMemberRankACADEMYCADET captures enum value "ACADEMY_CADET" - ServiceMemberRankACADEMYCADET ServiceMemberRank = "ACADEMY_CADET" - // ServiceMemberRankMIDSHIPMAN captures enum value "MIDSHIPMAN" - ServiceMemberRankMIDSHIPMAN ServiceMemberRank = "MIDSHIPMAN" -) diff --git a/pkg/models/service_member_test.go b/pkg/models/service_member_test.go index 7a5e9bef6a7..3e3bb8cb941 100644 --- a/pkg/models/service_member_test.go +++ b/pkg/models/service_member_test.go @@ -8,6 +8,7 @@ import ( "github.com/transcom/mymove/pkg/auth" "github.com/transcom/mymove/pkg/factory" "github.com/transcom/mymove/pkg/gen/internalmessages" + "github.com/transcom/mymove/pkg/models" . "github.com/transcom/mymove/pkg/models" "github.com/transcom/mymove/pkg/testdatagen" ) @@ -36,7 +37,6 @@ func (suite *ModelSuite) TestIsProfileCompleteWithIncompleteSM() { // And: a service member is incompletely initialized with almost all required values edipi := "12345567890" affiliation := AffiliationARMY - rank := ServiceMemberRankE5 firstName := "bob" lastName := "sally" telephone := "510 555-5555" @@ -55,27 +55,18 @@ func (suite *ModelSuite) TestIsProfileCompleteWithIncompleteSM() { }, }, }, nil) - location := factory.BuildDutyLocation(nil, []factory.Customization{ - { - Model: DutyLocation{ - ID: uuid.Must(uuid.NewV4()), - }, - }, - }, nil) serviceMember := ServiceMember{ ID: uuid.Must(uuid.NewV4()), UserID: user1.ID, Edipi: &edipi, Affiliation: &affiliation, - Rank: &rank, FirstName: &firstName, LastName: &lastName, Telephone: &telephone, PersonalEmail: &email, ResidentialAddressID: &fakeAddress.ID, BackupMailingAddressID: &fakeBackupAddress.ID, - DutyLocationID: &location.ID, } suite.Equal(false, serviceMember.IsProfileComplete()) @@ -185,6 +176,7 @@ func (suite *ModelSuite) TestFetchLatestOrders() { contractor := factory.FetchOrBuildDefaultContractor(suite.DB(), nil, nil) packingAndShippingInstructions := InstructionsBeforeContractNumber + " " + contractor.ContractNumber + " " + InstructionsAfterContractNumber + grade := models.ServiceMemberGradeE1 order := Order{ ServiceMemberID: serviceMember.ID, ServiceMember: serviceMember, @@ -204,7 +196,7 @@ func (suite *ModelSuite) TestFetchLatestOrders() { TAC: &TAC, SAC: &SAC, DepartmentIndicator: &deptIndicator, - Grade: StringPointer("E-1"), + Grade: &grade, SupplyAndServicesCostEstimate: SupplyAndServicesCostEstimate, MethodOfPayment: MethodOfPayment, NAICS: NAICS, diff --git a/pkg/models/shipment_summary_worksheet.go b/pkg/models/shipment_summary_worksheet.go index eee314960d5..1d085cd1de3 100644 --- a/pkg/models/shipment_summary_worksheet.go +++ b/pkg/models/shipment_summary_worksheet.go @@ -234,11 +234,9 @@ func FetchDataShipmentSummaryWorksheetFormData(db *pop.Connection, session *auth } serviceMember := move.Orders.ServiceMember - var rank ServiceMemberRank var weightAllotment SSWMaxWeightEntitlement - if serviceMember.Rank != nil { - rank = ServiceMemberRank(*serviceMember.Rank) - weightAllotment = SSWGetEntitlement(rank, move.Orders.HasDependents, move.Orders.SpouseHasProGear) + if move.Orders.Grade != nil { + weightAllotment = SSWGetEntitlement(*move.Orders.Grade, move.Orders.HasDependents, move.Orders.SpouseHasProGear) } ppmRemainingEntitlement, err := CalculateRemainingPPMEntitlement(move, weightAllotment.TotalWeight) @@ -257,7 +255,7 @@ func FetchDataShipmentSummaryWorksheetFormData(db *pop.Connection, session *auth ssd := ShipmentSummaryFormData{ ServiceMember: serviceMember, Order: move.Orders, - CurrentDutyLocation: serviceMember.DutyLocation, + CurrentDutyLocation: *move.Orders.OriginDutyLocation, NewDutyLocation: move.Orders.NewDutyLocation, WeightAllotment: weightAllotment, PersonallyProcuredMoves: move.PersonallyProcuredMoves, @@ -287,9 +285,9 @@ func (wa *SSWMaxWeightEntitlement) addLineItem(field string, value int) { // SSWGetEntitlement calculates the entitlement for the shipment summary worksheet based on the parameters of // a move (hasDependents, spouseHasProGear) -func SSWGetEntitlement(rank ServiceMemberRank, hasDependents bool, spouseHasProGear bool) SSWMaxWeightEntitlement { +func SSWGetEntitlement(grade internalmessages.OrderPayGrade, hasDependents bool, spouseHasProGear bool) SSWMaxWeightEntitlement { sswEntitlements := SSWMaxWeightEntitlement{} - entitlements := GetWeightAllotment(rank) + entitlements := GetWeightAllotment(grade) sswEntitlements.addLineItem("ProGear", entitlements.ProGearWeight) if !hasDependents { sswEntitlements.addLineItem("Entitlement", entitlements.TotalWeightSelf) @@ -344,7 +342,7 @@ func FormatValuesShipmentSummaryWorksheetFormPage1(data ShipmentSummaryFormData) page1.ServiceBranch = FormatServiceMemberAffiliation(sm.Affiliation) page1.PreferredEmail = derefStringTypes(sm.PersonalEmail) page1.DODId = derefStringTypes(sm.Edipi) - page1.RankGrade = FormatRank(data.ServiceMember.Rank) + page1.RankGrade = FormatRank(data.Order.Grade) page1.IssuingBranchOrAgency = FormatServiceMemberAffiliation(sm.Affiliation) page1.OrdersIssueDate = FormatDate(data.Order.IssueDate) @@ -391,40 +389,40 @@ func formatActualObligationAdvance(data ShipmentSummaryFormData) string { } // FormatRank formats the service member's rank for Shipment Summary Worksheet -func FormatRank(rank *ServiceMemberRank) string { - var rankDisplayValue = map[ServiceMemberRank]string{ - ServiceMemberRankE1: "E-1", - ServiceMemberRankE2: "E-2", - ServiceMemberRankE3: "E-3", - ServiceMemberRankE4: "E-4", - ServiceMemberRankE5: "E-5", - ServiceMemberRankE6: "E-6", - ServiceMemberRankE7: "E-7", - ServiceMemberRankE8: "E-8", - ServiceMemberRankE9: "E-9", - ServiceMemberRankE9SPECIALSENIORENLISTED: "E-9 (Special Senior Enlisted)", - ServiceMemberRankO1ACADEMYGRADUATE: "O-1 or Service Academy Graduate", - ServiceMemberRankO2: "O-2", - ServiceMemberRankO3: "O-3", - ServiceMemberRankO4: "O-4", - ServiceMemberRankO5: "O-5", - ServiceMemberRankO6: "O-6", - ServiceMemberRankO7: "O-7", - ServiceMemberRankO8: "O-8", - ServiceMemberRankO9: "O-9", - ServiceMemberRankO10: "O-10", - ServiceMemberRankW1: "W-1", - ServiceMemberRankW2: "W-2", - ServiceMemberRankW3: "W-3", - ServiceMemberRankW4: "W-4", - ServiceMemberRankW5: "W-5", - ServiceMemberRankAVIATIONCADET: "Aviation Cadet", - ServiceMemberRankCIVILIANEMPLOYEE: "Civilian Employee", - ServiceMemberRankACADEMYCADET: "Service Academy Cadet", - ServiceMemberRankMIDSHIPMAN: "Midshipman", +func FormatRank(grade *internalmessages.OrderPayGrade) string { + var gradeDisplayValue = map[internalmessages.OrderPayGrade]string{ + ServiceMemberGradeE1: "E-1", + ServiceMemberGradeE2: "E-2", + ServiceMemberGradeE3: "E-3", + ServiceMemberGradeE4: "E-4", + ServiceMemberGradeE5: "E-5", + ServiceMemberGradeE6: "E-6", + ServiceMemberGradeE7: "E-7", + ServiceMemberGradeE8: "E-8", + ServiceMemberGradeE9: "E-9", + ServiceMemberGradeE9SPECIALSENIORENLISTED: "E-9 (Special Senior Enlisted)", + ServiceMemberGradeO1ACADEMYGRADUATE: "O-1 or Service Academy Graduate", + ServiceMemberGradeO2: "O-2", + ServiceMemberGradeO3: "O-3", + ServiceMemberGradeO4: "O-4", + ServiceMemberGradeO5: "O-5", + ServiceMemberGradeO6: "O-6", + ServiceMemberGradeO7: "O-7", + ServiceMemberGradeO8: "O-8", + ServiceMemberGradeO9: "O-9", + ServiceMemberGradeO10: "O-10", + ServiceMemberGradeW1: "W-1", + ServiceMemberGradeW2: "W-2", + ServiceMemberGradeW3: "W-3", + ServiceMemberGradeW4: "W-4", + ServiceMemberGradeW5: "W-5", + ServiceMemberGradeAVIATIONCADET: "Aviation Cadet", + ServiceMemberGradeCIVILIANEMPLOYEE: "Civilian Employee", + ServiceMemberGradeACADEMYCADET: "Service Academy Cadet", + ServiceMemberGradeMIDSHIPMAN: "Midshipman", } - if rank != nil { - return rankDisplayValue[*rank] + if grade != nil { + return gradeDisplayValue[*grade] } return "" } diff --git a/pkg/models/shipment_summary_worksheet_test.go b/pkg/models/shipment_summary_worksheet_test.go index d880532378a..906b9cc7302 100644 --- a/pkg/models/shipment_summary_worksheet_test.go +++ b/pkg/models/shipment_summary_worksheet_test.go @@ -28,12 +28,13 @@ func (suite *ModelSuite) TestFetchDataShipmentSummaryWorksheet() { ordersType := internalmessages.OrdersTypePERMANENTCHANGEOFSTATION yuma := factory.FetchOrBuildCurrentDutyLocation(suite.DB()) fortGordon := factory.FetchOrBuildOrdersDutyLocation(suite.DB()) - rank := models.ServiceMemberRankE9 + grade := models.ServiceMemberGradeE9 move := factory.BuildMove(suite.DB(), []factory.Customization{ { Model: models.Order{ OrdersType: ordersType, + Grade: &grade, }, }, { @@ -46,11 +47,6 @@ func (suite *ModelSuite) TestFetchDataShipmentSummaryWorksheet() { LinkOnly: true, Type: &factory.DutyLocations.OriginDutyLocation, }, - { - Model: models.ServiceMember{ - Rank: &rank, - }, - }, }, nil) moveID := move.ID @@ -118,12 +114,12 @@ func (suite *ModelSuite) TestFetchDataShipmentSummaryWorksheet() { suite.Equal(yuma.Address.ID, ssd.CurrentDutyLocation.Address.ID) suite.Equal(fortGordon.ID, ssd.NewDutyLocation.ID) suite.Equal(fortGordon.Address.ID, ssd.NewDutyLocation.Address.ID) - rankWtgAllotment := models.GetWeightAllotment(rank) - suite.Equal(unit.Pound(rankWtgAllotment.TotalWeightSelf), ssd.WeightAllotment.Entitlement) - suite.Equal(unit.Pound(rankWtgAllotment.ProGearWeight), ssd.WeightAllotment.ProGear) + gradeWtgAllotment := models.GetWeightAllotment(grade) + suite.Equal(unit.Pound(gradeWtgAllotment.TotalWeightSelf), ssd.WeightAllotment.Entitlement) + suite.Equal(unit.Pound(gradeWtgAllotment.ProGearWeight), ssd.WeightAllotment.ProGear) suite.Equal(unit.Pound(0), ssd.WeightAllotment.SpouseProGear) - suite.Require().NotNil(ssd.ServiceMember.Rank) - weightAllotment := models.GetWeightAllotment(*ssd.ServiceMember.Rank) + suite.Require().NotNil(ssd.Order.Grade) + weightAllotment := models.GetWeightAllotment(*ssd.Order.Grade) // E_9 rank, no dependents, no spouse pro-gear totalWeight := weightAllotment.TotalWeightSelf + weightAllotment.ProGearWeight suite.Require().Nil(err) @@ -140,12 +136,13 @@ func (suite *ModelSuite) TestFetchDataShipmentSummaryWorksheetWithErrorNoMove() ordersType := internalmessages.OrdersTypePERMANENTCHANGEOFSTATION yuma := factory.FetchOrBuildCurrentDutyLocation(suite.DB()) fortGordon := factory.FetchOrBuildOrdersDutyLocation(suite.DB()) - rank := models.ServiceMemberRankE9 + grade := models.ServiceMemberGradeE9 move := factory.BuildMove(suite.DB(), []factory.Customization{ { Model: models.Order{ OrdersType: ordersType, + Grade: &grade, }, }, { @@ -158,11 +155,6 @@ func (suite *ModelSuite) TestFetchDataShipmentSummaryWorksheetWithErrorNoMove() LinkOnly: true, Type: &factory.DutyLocations.OriginDutyLocation, }, - { - Model: models.ServiceMember{ - Rank: &rank, - }, - }, }, nil) moveID := uuid.Nil @@ -200,12 +192,13 @@ func (suite *ModelSuite) TestFetchDataShipmentSummaryWorksheetOnlyPPM() { ordersType := internalmessages.OrdersTypePERMANENTCHANGEOFSTATION yuma := factory.FetchOrBuildCurrentDutyLocation(suite.DB()) fortGordon := factory.FetchOrBuildOrdersDutyLocation(suite.DB()) - rank := models.ServiceMemberRankE9 + grade := models.ServiceMemberGradeE9 move := factory.BuildMove(suite.DB(), []factory.Customization{ { Model: models.Order{ OrdersType: ordersType, + Grade: &grade, }, }, { @@ -218,11 +211,6 @@ func (suite *ModelSuite) TestFetchDataShipmentSummaryWorksheetOnlyPPM() { LinkOnly: true, Type: &factory.DutyLocations.OriginDutyLocation, }, - { - Model: models.ServiceMember{ - Rank: &rank, - }, - }, }, nil) moveID := move.ID @@ -290,12 +278,12 @@ func (suite *ModelSuite) TestFetchDataShipmentSummaryWorksheetOnlyPPM() { suite.Equal(yuma.Address.ID, ssd.CurrentDutyLocation.Address.ID) suite.Equal(fortGordon.ID, ssd.NewDutyLocation.ID) suite.Equal(fortGordon.Address.ID, ssd.NewDutyLocation.Address.ID) - rankWtgAllotment := models.GetWeightAllotment(rank) - suite.Equal(unit.Pound(rankWtgAllotment.TotalWeightSelf), ssd.WeightAllotment.Entitlement) - suite.Equal(unit.Pound(rankWtgAllotment.ProGearWeight), ssd.WeightAllotment.ProGear) + gradeWtgAllotment := models.GetWeightAllotment(grade) + suite.Equal(unit.Pound(gradeWtgAllotment.TotalWeightSelf), ssd.WeightAllotment.Entitlement) + suite.Equal(unit.Pound(gradeWtgAllotment.ProGearWeight), ssd.WeightAllotment.ProGear) suite.Equal(unit.Pound(0), ssd.WeightAllotment.SpouseProGear) - suite.Require().NotNil(ssd.ServiceMember.Rank) - weightAllotment := models.GetWeightAllotment(*ssd.ServiceMember.Rank) + suite.Require().NotNil(ssd.Order.Grade) + weightAllotment := models.GetWeightAllotment(*ssd.Order.Grade) // E_9 rank, no dependents, no spouse pro-gear totalWeight := weightAllotment.TotalWeightSelf + weightAllotment.ProGearWeight suite.Equal(unit.Pound(totalWeight), ssd.WeightAllotment.TotalWeight) @@ -319,19 +307,17 @@ func (suite *ModelSuite) TestFormatValuesShipmentSummaryWorksheetFormPage1() { serviceMemberID, _ := uuid.NewV4() serviceBranch := models.AffiliationAIRFORCE - rank := models.ServiceMemberRankE9 + grade := models.ServiceMemberGradeE9 serviceMember := models.ServiceMember{ - ID: serviceMemberID, - FirstName: models.StringPointer("Marcus"), - MiddleName: models.StringPointer("Joseph"), - LastName: models.StringPointer("Jenkins"), - Suffix: models.StringPointer("Jr."), - Telephone: models.StringPointer("444-555-8888"), - PersonalEmail: models.StringPointer("michael+ppm-expansion_1@truss.works"), - Edipi: models.StringPointer("1234567890"), - Affiliation: &serviceBranch, - Rank: &rank, - DutyLocationID: &yuma.ID, + ID: serviceMemberID, + FirstName: models.StringPointer("Marcus"), + MiddleName: models.StringPointer("Joseph"), + LastName: models.StringPointer("Jenkins"), + Suffix: models.StringPointer("Jr."), + Telephone: models.StringPointer("444-555-8888"), + PersonalEmail: models.StringPointer("michael+ppm-expansion_1@truss.works"), + Edipi: models.StringPointer("1234567890"), + Affiliation: &serviceBranch, } orderIssueDate := time.Date(2018, time.December, 21, 0, 0, 0, 0, time.UTC) @@ -344,6 +330,7 @@ func (suite *ModelSuite) TestFormatValuesShipmentSummaryWorksheetFormPage1() { SAC: models.StringPointer("SAC"), HasDependents: true, SpouseHasProGear: true, + Grade: &grade, } pickupDate := time.Date(2019, time.January, 11, 0, 0, 0, 0, time.UTC) advance := models.BuildDraftReimbursement(1000, models.MethodOfReceiptMILPAY) @@ -664,9 +651,9 @@ func (suite *ModelSuite) TestCalculatePPMEntitlementPPMLessThanRemainingEntitlem func (suite *ModelSuite) TestFormatSSWGetEntitlement() { spouseHasProGear := true hasDependants := true - allotment := models.GetWeightAllotment(models.ServiceMemberRankE1) + allotment := models.GetWeightAllotment(models.ServiceMemberGradeE1) expectedTotalWeight := allotment.TotalWeightSelfPlusDependents + allotment.ProGearWeight + allotment.ProGearWeightSpouse - sswEntitlement := models.SSWGetEntitlement(models.ServiceMemberRankE1, hasDependants, spouseHasProGear) + sswEntitlement := models.SSWGetEntitlement(models.ServiceMemberGradeE1, hasDependants, spouseHasProGear) suite.Equal(unit.Pound(expectedTotalWeight), sswEntitlement.TotalWeight) suite.Equal(unit.Pound(allotment.TotalWeightSelfPlusDependents), sswEntitlement.Entitlement) @@ -677,9 +664,9 @@ func (suite *ModelSuite) TestFormatSSWGetEntitlement() { func (suite *ModelSuite) TestFormatSSWGetEntitlementNoDependants() { spouseHasProGear := false hasDependants := false - allotment := models.GetWeightAllotment(models.ServiceMemberRankE1) + allotment := models.GetWeightAllotment(models.ServiceMemberGradeE1) expectedTotalWeight := allotment.TotalWeightSelf + allotment.ProGearWeight - sswEntitlement := models.SSWGetEntitlement(models.ServiceMemberRankE1, hasDependants, spouseHasProGear) + sswEntitlement := models.SSWGetEntitlement(models.ServiceMemberGradeE1, hasDependants, spouseHasProGear) suite.Equal(unit.Pound(expectedTotalWeight), sswEntitlement.TotalWeight) suite.Equal(unit.Pound(allotment.TotalWeightSelf), sswEntitlement.Entitlement) @@ -720,8 +707,8 @@ func (suite *ModelSuite) TestFormatCurrentPPMStatus() { } func (suite *ModelSuite) TestFormatRank() { - e9 := models.ServiceMemberRankE9 - multipleRanks := models.ServiceMemberRankO1ACADEMYGRADUATE + e9 := models.ServiceMemberGradeE9 + multipleRanks := models.ServiceMemberGradeO1ACADEMYGRADUATE suite.Equal("E-9", models.FormatRank(&e9)) suite.Equal("O-1 or Service Academy Graduate", models.FormatRank(&multipleRanks)) diff --git a/pkg/notifications/move_approved.go b/pkg/notifications/move_approved.go index c334a8563a4..d91d35ec89c 100644 --- a/pkg/notifications/move_approved.go +++ b/pkg/notifications/move_approved.go @@ -62,7 +62,7 @@ func (m MoveApproved) emails(appCtx appcontext.AppContext) ([]emailContent, erro } var originDutyLocation, originDutyLocationPhoneLine *string - dsTransportInfo, err := models.FetchDLContactInfo(appCtx.DB(), serviceMember.DutyLocationID) + dsTransportInfo, err := models.FetchDLContactInfo(appCtx.DB(), orders.OriginDutyLocationID) if err != nil { return emails, err } diff --git a/pkg/notifications/move_canceled.go b/pkg/notifications/move_canceled.go index 424475c1155..009601a25f8 100644 --- a/pkg/notifications/move_canceled.go +++ b/pkg/notifications/move_canceled.go @@ -60,7 +60,7 @@ func (m MoveCanceled) emails(appCtx appcontext.AppContext) ([]emailContent, erro return emails, fmt.Errorf("no email found for service member") } - dsTransportInfo, err := models.FetchDLContactInfo(appCtx.DB(), serviceMember.DutyLocationID) + dsTransportInfo, err := models.FetchDLContactInfo(appCtx.DB(), orders.OriginDutyLocationID) if err != nil { return emails, err } diff --git a/pkg/notifications/move_issued_to_prime.go b/pkg/notifications/move_issued_to_prime.go index dcac0dc81b4..42048421834 100644 --- a/pkg/notifications/move_issued_to_prime.go +++ b/pkg/notifications/move_issued_to_prime.go @@ -56,7 +56,7 @@ func (m MoveIssuedToPrime) emails(appCtx appcontext.AppContext) ([]emailContent, return emails, err } - originDSTransportInfo, err := models.FetchDLContactInfo(appCtx.DB(), serviceMember.DutyLocationID) + originDSTransportInfo, err := models.FetchDLContactInfo(appCtx.DB(), orders.OriginDutyLocationID) if err != nil { return emails, err } diff --git a/pkg/notifications/move_payment_reminder_test.go b/pkg/notifications/move_payment_reminder_test.go index 54f3f0f6962..d11794071f0 100644 --- a/pkg/notifications/move_payment_reminder_test.go +++ b/pkg/notifications/move_payment_reminder_test.go @@ -99,8 +99,8 @@ func (suite *NotificationSuite) TestPaymentReminderFetchSomeFound() { suite.Equal(ppms[0].WeightEstimate, emailInfo[0].WeightEstimate) suite.Equal(ppms[0].IncentiveEstimateMin, emailInfo[0].IncentiveEstimateMin) suite.Equal(ppms[0].IncentiveEstimateMax, emailInfo[0].IncentiveEstimateMax) - suite.Equal(ppms[0].Move.Orders.ServiceMember.DutyLocation.TransportationOffice.Name, *emailInfo[0].TOName) - suite.Equal(ppms[0].Move.Orders.ServiceMember.DutyLocation.TransportationOffice.PhoneLines[0].Number, *emailInfo[0].TOPhone) + suite.Equal(ppms[0].Move.Orders.OriginDutyLocation.TransportationOffice.Name, *emailInfo[0].TOName) + suite.Equal(ppms[0].Move.Orders.OriginDutyLocation.TransportationOffice.PhoneLines[0].Number, *emailInfo[0].TOPhone) suite.Equal(ppms[0].Move.Locator, emailInfo[0].Locator) } diff --git a/pkg/notifications/move_submitted.go b/pkg/notifications/move_submitted.go index ee70e74321a..3fbf66618c5 100644 --- a/pkg/notifications/move_submitted.go +++ b/pkg/notifications/move_submitted.go @@ -63,7 +63,7 @@ func (m MoveSubmitted) emails(appCtx appcontext.AppContext) ([]emailContent, err return emails, err } - originDSTransportInfo, err := models.FetchDLContactInfo(appCtx.DB(), serviceMember.DutyLocationID) + originDSTransportInfo, err := models.FetchDLContactInfo(appCtx.DB(), orders.OriginDutyLocationID) if err != nil { return emails, err } @@ -75,7 +75,7 @@ func (m MoveSubmitted) emails(appCtx appcontext.AppContext) ([]emailContent, err } - totalEntitlement := models.GetWeightAllotment(*serviceMember.Rank) + totalEntitlement := models.GetWeightAllotment(*orders.Grade) weight := totalEntitlement.TotalWeightSelf if orders.HasDependents { diff --git a/pkg/paperwork/evaluation_report.go b/pkg/paperwork/evaluation_report.go index 2621787425a..5da62044319 100644 --- a/pkg/paperwork/evaluation_report.go +++ b/pkg/paperwork/evaluation_report.go @@ -420,9 +420,7 @@ func FormatContactInformationValues(customer models.ServiceMember, qae models.Of if customer.Telephone != nil { contactInfo.CustomerPhone = *customer.Telephone } - if customer.Rank != nil { - contactInfo.CustomerRank = rankDisplayValue[*customer.Rank] - } + if customer.Affiliation != nil { contactInfo.CustomerAffiliation = serviceMemberAffiliationDisplayValue[*customer.Affiliation] } diff --git a/pkg/paperwork/forms.go b/pkg/paperwork/forms.go index c5b050e770f..693511b711a 100644 --- a/pkg/paperwork/forms.go +++ b/pkg/paperwork/forms.go @@ -15,36 +15,36 @@ import ( "github.com/transcom/mymove/pkg/models" ) -var rankDisplayValue = map[models.ServiceMemberRank]string{ - models.ServiceMemberRankE1: "E-1", - models.ServiceMemberRankE2: "E-2", - models.ServiceMemberRankE3: "E-3", - models.ServiceMemberRankE4: "E-4", - models.ServiceMemberRankE5: "E-5", - models.ServiceMemberRankE6: "E-6", - models.ServiceMemberRankE7: "E-7", - models.ServiceMemberRankE8: "E-8", - models.ServiceMemberRankE9: "E-9", - models.ServiceMemberRankE9SPECIALSENIORENLISTED: "E-9 (Special Senior Enlisted)", - models.ServiceMemberRankO1ACADEMYGRADUATE: "O-1 or Service Academy Graduate", - models.ServiceMemberRankO2: "O-2", - models.ServiceMemberRankO3: "O-3", - models.ServiceMemberRankO4: "O-4", - models.ServiceMemberRankO5: "O-5", - models.ServiceMemberRankO6: "O-6", - models.ServiceMemberRankO7: "O-7", - models.ServiceMemberRankO8: "O-8", - models.ServiceMemberRankO9: "O-9", - models.ServiceMemberRankO10: "O-10", - models.ServiceMemberRankW1: "W-1", - models.ServiceMemberRankW2: "W-2", - models.ServiceMemberRankW3: "W-3", - models.ServiceMemberRankW4: "W-4", - models.ServiceMemberRankW5: "W-5", - models.ServiceMemberRankAVIATIONCADET: "Aviation Cadet", - models.ServiceMemberRankCIVILIANEMPLOYEE: "Civilian Employee", - models.ServiceMemberRankACADEMYCADET: "Service Academy Cadet", - models.ServiceMemberRankMIDSHIPMAN: "Midshipman", +var rankDisplayValue = map[internalmessages.OrderPayGrade]string{ + models.ServiceMemberGradeE1: "E-1", + models.ServiceMemberGradeE2: "E-2", + models.ServiceMemberGradeE3: "E-3", + models.ServiceMemberGradeE4: "E-4", + models.ServiceMemberGradeE5: "E-5", + models.ServiceMemberGradeE6: "E-6", + models.ServiceMemberGradeE7: "E-7", + models.ServiceMemberGradeE8: "E-8", + models.ServiceMemberGradeE9: "E-9", + models.ServiceMemberGradeE9SPECIALSENIORENLISTED: "E-9 (Special Senior Enlisted)", + models.ServiceMemberGradeO1ACADEMYGRADUATE: "O-1 or Service Academy Graduate", + models.ServiceMemberGradeO2: "O-2", + models.ServiceMemberGradeO3: "O-3", + models.ServiceMemberGradeO4: "O-4", + models.ServiceMemberGradeO5: "O-5", + models.ServiceMemberGradeO6: "O-6", + models.ServiceMemberGradeO7: "O-7", + models.ServiceMemberGradeO8: "O-8", + models.ServiceMemberGradeO9: "O-9", + models.ServiceMemberGradeO10: "O-10", + models.ServiceMemberGradeW1: "W-1", + models.ServiceMemberGradeW2: "W-2", + models.ServiceMemberGradeW3: "W-3", + models.ServiceMemberGradeW4: "W-4", + models.ServiceMemberGradeW5: "W-5", + models.ServiceMemberGradeAVIATIONCADET: "Aviation Cadet", + models.ServiceMemberGradeCIVILIANEMPLOYEE: "Civilian Employee", + models.ServiceMemberGradeACADEMYCADET: "Service Academy Cadet", + models.ServiceMemberGradeMIDSHIPMAN: "Midshipman", } var affiliationDisplayValue = map[internalmessages.Affiliation]string{ @@ -237,9 +237,9 @@ func (f *FormFiller) drawData(fields map[string]FieldPos, data interface{}) erro displayValue = strconv.FormatInt(v, 10) case time.Time: displayValue = v.Format("02-Jan-2006") - case models.ServiceMemberRank: + case internalmessages.OrderPayGrade: displayValue = rankDisplayValue[v] - case *models.ServiceMemberRank: + case *internalmessages.OrderPayGrade: if v != nil { displayValue = rankDisplayValue[*v] } diff --git a/pkg/services/invoice/ghc_payment_request_invoice_generator.go b/pkg/services/invoice/ghc_payment_request_invoice_generator.go index d2ccbb2e13e..ed3ca0c71ee 100644 --- a/pkg/services/invoice/ghc_payment_request_invoice_generator.go +++ b/pkg/services/invoice/ghc_payment_request_invoice_generator.go @@ -208,6 +208,17 @@ func (g ghcPaymentRequestInvoiceGenerator) Generate(appCtx appcontext.AppContext return ediinvoice.Invoice858C{}, err } + // Add order pay grade detail to header + if moveTaskOrder.Orders.Grade == nil { + // Nil check + return ediinvoice.Invoice858C{}, apperror.NewNotFoundError(moveTaskOrder.Orders.ID, "order pay grade not found") + } + + edi858.Header.OrderPayGrade = edisegment.N9{ + ReferenceIdentificationQualifier: "ML", + ReferenceIdentification: string(*moveTaskOrder.Orders.Grade), + } + var paymentServiceItems models.PaymentServiceItems err = appCtx.DB().Q(). Eager("MTOServiceItem.ReService", "MTOServiceItem.MTOShipment"). @@ -304,16 +315,6 @@ func (g ghcPaymentRequestInvoiceGenerator) createServiceMemberDetailSegments(pay ReferenceIdentification: serviceMember.ReverseNameLineFormat(), } - // rank - rank := serviceMember.Rank - if rank == nil { - return apperror.NewConflictError(serviceMember.ID, fmt.Sprintf("no rank found for ServiceMember ID: %s Payment Request ID: %s", serviceMember.ID, paymentRequestID)) - } - header.ServiceMemberRank = edisegment.N9{ - ReferenceIdentificationQualifier: "ML", - ReferenceIdentification: string(*rank), - } - // branch branch := serviceMember.Affiliation if branch == nil { @@ -718,17 +719,17 @@ func (g ghcPaymentRequestInvoiceGenerator) createLongLoaSegments(appCtx appconte //"HO" - O-1 Academy graduate through O-10, W1 - W5, Aviation Cadet, Academy Cadet, and Midshipman //"HC" - Civilian employee - if orders.ServiceMember.Rank == nil { - return nil, apperror.NewConflictError(orders.ServiceMember.ID, "this service member has no rank") + if orders.Grade == nil { + return nil, apperror.NewConflictError(orders.ServiceMember.ID, "this service member has no pay grade for the specified order") } - rank := *orders.ServiceMember.Rank + grade := *orders.Grade hhgCode := "" - if rank[:2] == "E_" { + if grade[:2] == "E_" { hhgCode = "HE" - } else if rank[:2] == "O_" || rank[:2] == "W_" || rank == models.ServiceMemberRankACADEMYCADET || rank == models.ServiceMemberRankAVIATIONCADET || rank == models.ServiceMemberRankMIDSHIPMAN { + } else if grade[:2] == "O_" || grade[:2] == "W_" || grade == models.ServiceMemberGradeACADEMYCADET || grade == models.ServiceMemberGradeAVIATIONCADET || grade == models.ServiceMemberGradeMIDSHIPMAN { hhgCode = "HO" - } else if rank == models.ServiceMemberRankCIVILIANEMPLOYEE { + } else if grade == models.ServiceMemberGradeCIVILIANEMPLOYEE { hhgCode = "HC" } else { return nil, apperror.NotImplementedError{} diff --git a/pkg/services/invoice/ghc_payment_request_invoice_generator_test.go b/pkg/services/invoice/ghc_payment_request_invoice_generator_test.go index e18a95d7152..3e7c62408dd 100644 --- a/pkg/services/invoice/ghc_payment_request_invoice_generator_test.go +++ b/pkg/services/invoice/ghc_payment_request_invoice_generator_test.go @@ -15,6 +15,7 @@ import ( ediinvoice "github.com/transcom/mymove/pkg/edi/invoice" edisegment "github.com/transcom/mymove/pkg/edi/segment" "github.com/transcom/mymove/pkg/factory" + "github.com/transcom/mymove/pkg/gen/internalmessages" "github.com/transcom/mymove/pkg/models" "github.com/transcom/mymove/pkg/testdatagen" "github.com/transcom/mymove/pkg/testingsuite" @@ -82,7 +83,7 @@ func (suite *GHCInvoiceSuite) TestAllGenerateEdi() { var paymentServiceItems models.PaymentServiceItems var result ediinvoice.Invoice858C - setupTestData := func() { + setupTestData := func(grade *internalmessages.OrderPayGrade) { customServiceMember := models.ServiceMember{ ID: uuid.FromStringOrNil("d66d2f35-218c-4b85-b9d1-631949b9d984"), Edipi: models.StringPointer("1000011111"), @@ -103,6 +104,11 @@ func (suite *GHCInvoiceSuite) TestAllGenerateEdi() { Model: serviceMember, LinkOnly: true, }, + { + Model: models.Order{ + Grade: grade, + }, + }, }, nil) paymentRequest = factory.BuildPaymentRequest(suite.DB(), []factory.Customization{ @@ -330,13 +336,13 @@ func (suite *GHCInvoiceSuite) TestAllGenerateEdi() { // Test that the Interchange Control Number (ICN) is being used as the Group Control Number (GCN) suite.Run("the GCN is equal to the ICN", func() { - setupTestData() + setupTestData(nil) suite.EqualValues(result.ISA.InterchangeControlNumber, result.IEA.InterchangeControlNumber, result.GS.GroupControlNumber, result.GE.GroupControlNumber) }) // Test that the Interchange Control Number (ICN) is being saved to the db suite.Run("the ICN is saved to the database", func() { - setupTestData() + setupTestData(nil) var pr2icn models.PaymentRequestToInterchangeControlNumber err := suite.DB().Where("payment_request_id = ?", paymentRequest.ID).First(&pr2icn) suite.NoError(err) @@ -345,7 +351,7 @@ func (suite *GHCInvoiceSuite) TestAllGenerateEdi() { // Test Invoice Start and End Segments suite.Run("adds isa start segment", func() { - setupTestData() + setupTestData(nil) suite.Equal("00", result.ISA.AuthorizationInformationQualifier) suite.Equal("0084182369", result.ISA.AuthorizationInformation) suite.Equal("00", result.ISA.SecurityInformationQualifier) @@ -365,7 +371,7 @@ func (suite *GHCInvoiceSuite) TestAllGenerateEdi() { }) suite.Run("adds gs start segment", func() { - setupTestData() + setupTestData(nil) suite.Equal("SI", result.GS.FunctionalIdentifierCode) suite.Equal("MILMOVE", result.GS.ApplicationSendersCode) suite.Equal("8004171844", result.GS.ApplicationReceiversCode) @@ -377,33 +383,33 @@ func (suite *GHCInvoiceSuite) TestAllGenerateEdi() { }) suite.Run("adds st start segment", func() { - setupTestData() + setupTestData(nil) suite.Equal("858", result.ST.TransactionSetIdentifierCode) suite.Equal("0001", result.ST.TransactionSetControlNumber) }) suite.Run("se segment has correct value", func() { - setupTestData() + setupTestData(nil) // Will need to be updated as more service items are supported suite.Equal(179, result.SE.NumberOfIncludedSegments) suite.Equal("0001", result.SE.TransactionSetControlNumber) }) suite.Run("adds ge end segment", func() { - setupTestData() + setupTestData(nil) suite.Equal(1, result.GE.NumberOfTransactionSetsIncluded) suite.Equal(int64(123), result.GE.GroupControlNumber) }) suite.Run("adds iea end segment", func() { - setupTestData() + setupTestData(nil) suite.Equal(1, result.IEA.NumberOfIncludedFunctionalGroups) suite.Equal(int64(123), result.IEA.InterchangeControlNumber) }) // Test Header Generation suite.Run("adds bx header segment", func() { - setupTestData() + setupTestData(nil) bx := result.Header.ShipmentInformation suite.IsType(edisegment.BX{}, bx) suite.Equal("00", bx.TransactionSetPurposeCode) @@ -416,13 +422,14 @@ func (suite *GHCInvoiceSuite) TestAllGenerateEdi() { }) suite.Run("does not error out creating EDI from Invoice858", func() { - setupTestData() + setupTestData(nil) _, err := result.EDIString(suite.Logger()) suite.NoError(err) }) suite.Run("adding to n9 header", func() { - setupTestData() + grade := models.ServiceMemberGradeE1 + setupTestData(&grade) testData := []struct { TestName string Qualifier string @@ -432,7 +439,7 @@ func (suite *GHCInvoiceSuite) TestAllGenerateEdi() { {TestName: "payment request number", Qualifier: "CN", ExpectedValue: paymentRequest.PaymentRequestNumber, ActualValue: &result.Header.PaymentRequestNumber}, {TestName: "contract code", Qualifier: "CT", ExpectedValue: "TRUSS_TEST", ActualValue: &result.Header.ContractCode}, {TestName: "service member name", Qualifier: "1W", ExpectedValue: serviceMember.ReverseNameLineFormat(), ActualValue: &result.Header.ServiceMemberName}, - {TestName: "service member rank", Qualifier: "ML", ExpectedValue: string(*serviceMember.Rank), ActualValue: &result.Header.ServiceMemberRank}, + {TestName: "order pay grade", Qualifier: "ML", ExpectedValue: string(grade), ActualValue: &result.Header.OrderPayGrade}, {TestName: "service member branch", Qualifier: "3L", ExpectedValue: string(*serviceMember.Affiliation), ActualValue: &result.Header.ServiceMemberBranch}, {TestName: "service member dod id", Qualifier: "4A", ExpectedValue: string(*serviceMember.Edipi), ActualValue: &result.Header.ServiceMemberDodID}, {TestName: "move code", Qualifier: "CMN", ExpectedValue: mto.Locator, ActualValue: &result.Header.MoveCode}, @@ -447,7 +454,7 @@ func (suite *GHCInvoiceSuite) TestAllGenerateEdi() { } }) suite.Run("adds currency to header", func() { - setupTestData() + setupTestData(nil) currency := result.Header.Currency suite.IsType(edisegment.C3{}, currency) suite.Equal("USD", currency.CurrencyCodeC301) @@ -774,7 +781,7 @@ func (suite *GHCInvoiceSuite) TestAllGenerateEdi() { }) suite.Run("adds actual pickup date to header", func() { - setupTestData() + setupTestData(nil) g62Requested := result.Header.RequestedPickupDate suite.IsType(&edisegment.G62{}, g62Requested) suite.NotNil(g62Requested) @@ -793,7 +800,7 @@ func (suite *GHCInvoiceSuite) TestAllGenerateEdi() { }) suite.Run("adds buyer and seller organization name", func() { - setupTestData() + setupTestData(nil) // buyer name originDutyLocation := paymentRequest.MoveTaskOrder.Orders.OriginDutyLocation buyerOrg := result.Header.BuyerOrganizationName @@ -813,7 +820,7 @@ func (suite *GHCInvoiceSuite) TestAllGenerateEdi() { }) suite.Run("adds orders destination address", func() { - setupTestData() + setupTestData(nil) expectedDutyLocation := paymentRequest.MoveTaskOrder.Orders.NewDutyLocation // This used to match a duty location by name in our database and ignore the default factory values. Now that // it doesn't match a named duty location ("Fort Eisenhower"), the EDI ends up using the postal code to determine @@ -867,7 +874,7 @@ func (suite *GHCInvoiceSuite) TestAllGenerateEdi() { }) suite.Run("adds orders origin address", func() { - setupTestData() + setupTestData(nil) // name expectedDutyLocation := paymentRequest.MoveTaskOrder.Orders.OriginDutyLocation n1 := result.Header.OriginName @@ -916,7 +923,7 @@ func (suite *GHCInvoiceSuite) TestAllGenerateEdi() { }) suite.Run("adds various service item segments", func() { - setupTestData() + setupTestData(nil) for idx, paymentServiceItem := range paymentServiceItems { var hierarchicalNumberInt = idx + 1 @@ -1991,13 +1998,14 @@ func (suite *GHCInvoiceSuite) TestUseTacToFindLoa() { } } - setupTestData := func() { + setupTestData := func(grade *internalmessages.OrderPayGrade) { move = factory.BuildMove(suite.DB(), []factory.Customization{ { Model: models.Order{ TAC: &hhgTAC, NtsTAC: &ntsTAC, IssueDate: currentTime, + Grade: grade, }, }, }, nil) @@ -2063,50 +2071,44 @@ func (suite *GHCInvoiceSuite) TestUseTacToFindLoa() { } suite.Run("when there are multiple LOAs for a given TAC, the one matching the customer's rank should be used", func() { - setupTestData() - setupLoaTestData() - - rankTestCases := []struct { - rank models.ServiceMemberRank + gradeTestCases := []struct { + grade internalmessages.OrderPayGrade expectedLoaCode string }{ - {models.ServiceMemberRankE1, models.LineOfAccountingHouseholdGoodsCodeEnlisted}, - {models.ServiceMemberRankE2, models.LineOfAccountingHouseholdGoodsCodeEnlisted}, - {models.ServiceMemberRankE3, models.LineOfAccountingHouseholdGoodsCodeEnlisted}, - {models.ServiceMemberRankE4, models.LineOfAccountingHouseholdGoodsCodeEnlisted}, - {models.ServiceMemberRankE5, models.LineOfAccountingHouseholdGoodsCodeEnlisted}, - {models.ServiceMemberRankE6, models.LineOfAccountingHouseholdGoodsCodeEnlisted}, - {models.ServiceMemberRankE7, models.LineOfAccountingHouseholdGoodsCodeEnlisted}, - {models.ServiceMemberRankE8, models.LineOfAccountingHouseholdGoodsCodeEnlisted}, - {models.ServiceMemberRankE9, models.LineOfAccountingHouseholdGoodsCodeEnlisted}, - {models.ServiceMemberRankE9SPECIALSENIORENLISTED, models.LineOfAccountingHouseholdGoodsCodeEnlisted}, - {models.ServiceMemberRankO1ACADEMYGRADUATE, models.LineOfAccountingHouseholdGoodsCodeOfficer}, - {models.ServiceMemberRankO2, models.LineOfAccountingHouseholdGoodsCodeOfficer}, - {models.ServiceMemberRankO3, models.LineOfAccountingHouseholdGoodsCodeOfficer}, - {models.ServiceMemberRankO4, models.LineOfAccountingHouseholdGoodsCodeOfficer}, - {models.ServiceMemberRankO5, models.LineOfAccountingHouseholdGoodsCodeOfficer}, - {models.ServiceMemberRankO6, models.LineOfAccountingHouseholdGoodsCodeOfficer}, - {models.ServiceMemberRankO7, models.LineOfAccountingHouseholdGoodsCodeOfficer}, - {models.ServiceMemberRankO8, models.LineOfAccountingHouseholdGoodsCodeOfficer}, - {models.ServiceMemberRankO9, models.LineOfAccountingHouseholdGoodsCodeOfficer}, - {models.ServiceMemberRankO10, models.LineOfAccountingHouseholdGoodsCodeOfficer}, - {models.ServiceMemberRankW1, models.LineOfAccountingHouseholdGoodsCodeOfficer}, - {models.ServiceMemberRankW2, models.LineOfAccountingHouseholdGoodsCodeOfficer}, - {models.ServiceMemberRankW3, models.LineOfAccountingHouseholdGoodsCodeOfficer}, - {models.ServiceMemberRankW4, models.LineOfAccountingHouseholdGoodsCodeOfficer}, - {models.ServiceMemberRankW5, models.LineOfAccountingHouseholdGoodsCodeOfficer}, - {models.ServiceMemberRankAVIATIONCADET, models.LineOfAccountingHouseholdGoodsCodeOfficer}, - {models.ServiceMemberRankCIVILIANEMPLOYEE, models.LineOfAccountingHouseholdGoodsCodeCivilian}, - {models.ServiceMemberRankACADEMYCADET, models.LineOfAccountingHouseholdGoodsCodeOfficer}, - {models.ServiceMemberRankMIDSHIPMAN, models.LineOfAccountingHouseholdGoodsCodeOfficer}, + {models.ServiceMemberGradeE1, models.LineOfAccountingHouseholdGoodsCodeEnlisted}, + {models.ServiceMemberGradeE2, models.LineOfAccountingHouseholdGoodsCodeEnlisted}, + {models.ServiceMemberGradeE3, models.LineOfAccountingHouseholdGoodsCodeEnlisted}, + {models.ServiceMemberGradeE4, models.LineOfAccountingHouseholdGoodsCodeEnlisted}, + {models.ServiceMemberGradeE5, models.LineOfAccountingHouseholdGoodsCodeEnlisted}, + {models.ServiceMemberGradeE6, models.LineOfAccountingHouseholdGoodsCodeEnlisted}, + {models.ServiceMemberGradeE7, models.LineOfAccountingHouseholdGoodsCodeEnlisted}, + {models.ServiceMemberGradeE8, models.LineOfAccountingHouseholdGoodsCodeEnlisted}, + {models.ServiceMemberGradeE9, models.LineOfAccountingHouseholdGoodsCodeEnlisted}, + {models.ServiceMemberGradeE9SPECIALSENIORENLISTED, models.LineOfAccountingHouseholdGoodsCodeEnlisted}, + {models.ServiceMemberGradeO1ACADEMYGRADUATE, models.LineOfAccountingHouseholdGoodsCodeOfficer}, + {models.ServiceMemberGradeO2, models.LineOfAccountingHouseholdGoodsCodeOfficer}, + {models.ServiceMemberGradeO3, models.LineOfAccountingHouseholdGoodsCodeOfficer}, + {models.ServiceMemberGradeO4, models.LineOfAccountingHouseholdGoodsCodeOfficer}, + {models.ServiceMemberGradeO5, models.LineOfAccountingHouseholdGoodsCodeOfficer}, + {models.ServiceMemberGradeO6, models.LineOfAccountingHouseholdGoodsCodeOfficer}, + {models.ServiceMemberGradeO7, models.LineOfAccountingHouseholdGoodsCodeOfficer}, + {models.ServiceMemberGradeO8, models.LineOfAccountingHouseholdGoodsCodeOfficer}, + {models.ServiceMemberGradeO9, models.LineOfAccountingHouseholdGoodsCodeOfficer}, + {models.ServiceMemberGradeO10, models.LineOfAccountingHouseholdGoodsCodeOfficer}, + {models.ServiceMemberGradeW1, models.LineOfAccountingHouseholdGoodsCodeOfficer}, + {models.ServiceMemberGradeW2, models.LineOfAccountingHouseholdGoodsCodeOfficer}, + {models.ServiceMemberGradeW3, models.LineOfAccountingHouseholdGoodsCodeOfficer}, + {models.ServiceMemberGradeW4, models.LineOfAccountingHouseholdGoodsCodeOfficer}, + {models.ServiceMemberGradeW5, models.LineOfAccountingHouseholdGoodsCodeOfficer}, + {models.ServiceMemberGradeAVIATIONCADET, models.LineOfAccountingHouseholdGoodsCodeOfficer}, + {models.ServiceMemberGradeCIVILIANEMPLOYEE, models.LineOfAccountingHouseholdGoodsCodeCivilian}, + {models.ServiceMemberGradeACADEMYCADET, models.LineOfAccountingHouseholdGoodsCodeOfficer}, + {models.ServiceMemberGradeMIDSHIPMAN, models.LineOfAccountingHouseholdGoodsCodeOfficer}, } - for _, testCase := range rankTestCases { - // Update service member rank - move.Orders.ServiceMember.Rank = &testCase.rank - paymentRequest.MoveTaskOrder.Orders.ServiceMember.Rank = &testCase.rank - err := suite.DB().Save(&move.Orders.ServiceMember) - suite.NoError(err) + for _, testCase := range gradeTestCases { + setupTestData(&testCase.grade) + setupLoaTestData() // Create invoice result, err := generator.Generate(suite.AppContextForTest(), paymentRequest, false) @@ -2128,7 +2130,7 @@ func (suite *GHCInvoiceSuite) TestUseTacToFindLoa() { }) suite.Run("test that we still get an LOA if none match the service member's rank", func() { - setupTestData() + setupTestData(nil) // Create only civilian LOAs loa := setupLOA(models.LineOfAccountingHouseholdGoodsCodeCivilian) @@ -2144,13 +2146,6 @@ func (suite *GHCInvoiceSuite) TestUseTacToFindLoa() { }, }, nil) - // Update service member rank to E1 knowing there is only Civilian LOAs - testCaseRank := models.ServiceMemberRankE1 - move.Orders.ServiceMember.Rank = &testCaseRank - paymentRequest.MoveTaskOrder.Orders.ServiceMember.Rank = &testCaseRank - err := suite.DB().Save(&move.Orders.ServiceMember) - suite.NoError(err) - // Create invoice result, err := generator.Generate(suite.AppContextForTest(), paymentRequest, false) suite.NoError(err) @@ -2172,7 +2167,7 @@ func (suite *GHCInvoiceSuite) TestUseTacToFindLoa() { }) suite.Run("test that the lowest tac_fn_bl_mod_cd is used as a tiebreaker", func() { - setupTestData() + setupTestData(nil) // Create lowest FBMC LOA (value=1) lowestLoa := setupLOA(models.LineOfAccountingHouseholdGoodsCodeCivilian) @@ -2223,7 +2218,7 @@ func (suite *GHCInvoiceSuite) TestUseTacToFindLoa() { }) suite.Run("test the most recent loa_bgn_dt is used as a tiebreaker", func() { - setupTestData() + setupTestData(nil) fiveYearsAgo := currentTime.AddDate(-5, 0, 0) // Create LOA with old datetime (loa_bgn_dt) and civilian code @@ -2279,7 +2274,7 @@ func (suite *GHCInvoiceSuite) TestUseTacToFindLoa() { }) suite.Run("test Coast Guard service members get 'HS' household goods code LOA", func() { - setupTestData() + setupTestData(nil) // Create LOA with 'HS' household goods code loa := setupLOA(models.LineOfAccountingHouseholdGoodsCodeNTS) @@ -2321,7 +2316,7 @@ func (suite *GHCInvoiceSuite) TestUseTacToFindLoa() { }) suite.Run("test non Coast Guard service members dont get 'HS' household goods code LOA", func() { - setupTestData() + setupTestData(nil) // Create LOA with 'HS' household goods code loa := setupLOA(models.LineOfAccountingHouseholdGoodsCodeNTS) diff --git a/pkg/services/move/move_weights.go b/pkg/services/move/move_weights.go index 7d7ac81425b..d29dc0c7df0 100644 --- a/pkg/services/move/move_weights.go +++ b/pkg/services/move/move_weights.go @@ -98,7 +98,7 @@ func (w moveWeights) CheckExcessWeight(appCtx appcontext.AppContext, moveID uuid return nil, nil, errors.New("could not determine excess weight entitlement without dependents authorization value") } - totalWeightAllowance := models.GetWeightAllotment(models.ServiceMemberRank(*move.Orders.Grade)) + totalWeightAllowance := models.GetWeightAllotment(*move.Orders.Grade) weight := totalWeightAllowance.TotalWeightSelf if *move.Orders.Entitlement.DependentsAuthorized { @@ -175,7 +175,7 @@ func (w moveWeights) CheckAutoReweigh(appCtx appcontext.AppContext, moveID uuid. return nil, errors.New("could not determine excess weight entitlement without dependents authorization value") } - totalWeightAllowance := models.GetWeightAllotment(models.ServiceMemberRank(*move.Orders.Grade)) + totalWeightAllowance := models.GetWeightAllotment(*move.Orders.Grade) weight := totalWeightAllowance.TotalWeightSelf if *move.Orders.Entitlement.DependentsAuthorized { diff --git a/pkg/services/move_history/move_history_fetcher_test.go b/pkg/services/move_history/move_history_fetcher_test.go index a958ad3e782..a1adb9f6340 100644 --- a/pkg/services/move_history/move_history_fetcher_test.go +++ b/pkg/services/move_history/move_history_fetcher_test.go @@ -668,23 +668,14 @@ func (suite *MoveHistoryServiceSuite) TestMoveHistoryFetcherScenarios() { suite.NoError(err) verifyServiceMemberHistoryFound := false - verifyServiceMemberContextFound := false for _, h := range moveHistoryData.AuditHistories { if h.AuditedTable == "service_members" && *h.ObjectID == serviceMember.ID { verifyServiceMemberHistoryFound = true - - if h.Context != nil { - context := removeEscapeJSONtoArray(h.Context) - if context[0]["current_duty_location_name"] != "" { - verifyServiceMemberContextFound = true - } - } break } } suite.True(verifyServiceMemberHistoryFound, "AuditHistories contains an AuditHistory when a service member is created") - suite.True(verifyServiceMemberContextFound, "Service member creation AuditHistory contains a context with current duty location name") }) suite.Run("has audit history records for mto_agents", func() { @@ -787,8 +778,8 @@ func (suite *MoveHistoryServiceSuite) TestMoveHistoryFetcherScenarios() { order.DepartmentIndicator = (*string)(internalmessages.NewDeptIndicator(internalmessages.DeptIndicatorARMY)) order.AmendedOrdersAcknowledgedAt = &now // this is gathered on the customer flow - rank := string(models.ServiceMemberRankE9SPECIALSENIORENLISTED) - order.Grade = &rank + grade := models.ServiceMemberGradeE9SPECIALSENIORENLISTED + order.Grade = &grade suite.MustSave(&order) diff --git a/pkg/services/order/order_updater.go b/pkg/services/order/order_updater.go index 282b015aaf9..d8d91a47fa4 100644 --- a/pkg/services/order/order_updater.go +++ b/pkg/services/order/order_updater.go @@ -154,11 +154,10 @@ func (f *orderUpdater) findOrderWithAmendedOrders(appCtx appcontext.AppContext, func orderFromTOOPayload(_ appcontext.AppContext, existingOrder models.Order, payload ghcmessages.UpdateOrderPayload) models.Order { order := existingOrder - // update both order origin duty location and service member duty location + // update order origin duty location if payload.OriginDutyLocationID != nil { originDutyLocationID := uuid.FromStringOrNil(payload.OriginDutyLocationID.String()) order.OriginDutyLocationID = &originDutyLocationID - order.ServiceMember.DutyLocationID = &originDutyLocationID } if payload.NewDutyLocationID != nil { @@ -282,11 +281,10 @@ func (f *orderUpdater) amendedOrder(appCtx appcontext.AppContext, userID uuid.UU func orderFromCounselingPayload(existingOrder models.Order, payload ghcmessages.CounselingUpdateOrderPayload) models.Order { order := existingOrder - // update both order origin duty location and service member duty location + // update order origin duty location if payload.OriginDutyLocationID != nil { originDutyLocationID := uuid.FromStringOrNil(payload.OriginDutyLocationID.String()) order.OriginDutyLocationID = &originDutyLocationID - order.ServiceMember.DutyLocationID = &originDutyLocationID } if payload.NewDutyLocationID != nil { @@ -373,10 +371,10 @@ func allowanceFromTOOPayload(existingOrder models.Order, payload ghcmessages.Upd order.ServiceMember.Affiliation = (*models.ServiceMemberAffiliation)(payload.Agency) } - // rank + // grade if payload.Grade != nil { - grade := (*string)(payload.Grade) - order.Grade = grade + grade := internalmessages.OrderPayGrade(*payload.Grade) + order.Grade = &grade } if payload.OrganizationalClothingAndIndividualEquipment != nil { @@ -415,10 +413,10 @@ func allowanceFromCounselingPayload(existingOrder models.Order, payload ghcmessa order.ServiceMember.Affiliation = (*models.ServiceMemberAffiliation)(payload.Agency) } - // rank + // grade if payload.Grade != nil { - grade := (*string)(payload.Grade) - order.Grade = grade + grade := internalmessages.OrderPayGrade(*payload.Grade) + order.Grade = &grade } if payload.OrganizationalClothingAndIndividualEquipment != nil { @@ -521,12 +519,6 @@ func updateOrderInTx(appCtx appcontext.AppContext, order models.Order, checks .. return nil, verr } - // update service member - if order.Grade != nil { - // keep grade and rank in sync - order.ServiceMember.Rank = (*models.ServiceMemberRank)(order.Grade) - } - if order.OriginDutyLocationID != nil { // TODO refactor to use service objects to fetch duty location var originDutyLocation models.DutyLocation @@ -552,9 +544,6 @@ func updateOrderInTx(appCtx appcontext.AppContext, order models.Order, checks .. } } order.OriginDutyLocationGBLOC = &dutyLocationGBLOC.GBLOC - - order.ServiceMember.DutyLocationID = &originDutyLocation.ID - order.ServiceMember.DutyLocation = originDutyLocation } if order.Grade != nil || order.OriginDutyLocationID != nil { diff --git a/pkg/services/order/order_updater_test.go b/pkg/services/order/order_updater_test.go index 5cb09cf6088..eff9a8302ca 100644 --- a/pkg/services/order/order_updater_test.go +++ b/pkg/services/order/order_updater_test.go @@ -145,9 +145,6 @@ func (suite *OrderServiceSuite) TestUpdateOrderAsTOO() { suite.EqualValues(payload.DepartmentIndicator, updatedOrder.DepartmentIndicator) suite.Equal(payload.Tac, updatedOrder.TAC) suite.Equal(payload.Sac.Value, updatedOrder.SAC) - suite.EqualValues(&updatedOriginDutyLocation.ID, fetchedSM.DutyLocationID) - suite.EqualValues(updatedOriginDutyLocation.ID, fetchedSM.DutyLocation.ID) - suite.EqualValues(updatedOriginDutyLocation.Name, fetchedSM.DutyLocation.Name) suite.EqualValues(updatedGbloc.GBLOC, *updatedOrder.OriginDutyLocationGBLOC) var moveInDB models.Move @@ -646,7 +643,6 @@ func (suite *OrderServiceSuite) TestUpdateAllowanceAsCounselor() { suite.Equal(*payload.ProGearWeightSpouse, int64(updatedOrder.Entitlement.ProGearWeightSpouse)) suite.Equal(*payload.RequiredMedicalEquipmentWeight, int64(updatedOrder.Entitlement.RequiredMedicalEquipmentWeight)) suite.Equal(*payload.OrganizationalClothingAndIndividualEquipment, updatedOrder.Entitlement.OrganizationalClothingAndIndividualEquipment) - suite.EqualValues(*payload.Grade, *fetchedSM.Rank) suite.EqualValues(payload.Agency, fetchedSM.Affiliation) }) @@ -695,7 +691,6 @@ func (suite *OrderServiceSuite) TestUpdateAllowanceAsCounselor() { suite.Equal(*payload.ProGearWeightSpouse, int64(updatedOrder.Entitlement.ProGearWeightSpouse)) suite.Equal(*payload.RequiredMedicalEquipmentWeight, int64(updatedOrder.Entitlement.RequiredMedicalEquipmentWeight)) suite.Equal(*payload.OrganizationalClothingAndIndividualEquipment, updatedOrder.Entitlement.OrganizationalClothingAndIndividualEquipment) - suite.EqualValues(*payload.Grade, *fetchedSM.Rank) suite.EqualValues(payload.Agency, fetchedSM.Affiliation) // make sure that there are missing submission fields and move is in correct status diff --git a/pkg/services/paperwork/form_creator_test.go b/pkg/services/paperwork/form_creator_test.go index 0972a527914..92b736d767a 100644 --- a/pkg/services/paperwork/form_creator_test.go +++ b/pkg/services/paperwork/form_creator_test.go @@ -32,17 +32,13 @@ func (suite *PaperworkServiceSuite) GenerateSSWFormPage1Values() models.Shipment ordersType := internalmessages.OrdersTypePERMANENTCHANGEOFSTATION yuma := factory.FetchOrBuildCurrentDutyLocation(suite.DB()) fortGordon := factory.FetchOrBuildOrdersDutyLocation(suite.DB()) - rank := models.ServiceMemberRankE9 + grade := models.ServiceMemberGradeE9 move := factory.BuildMove(suite.DB(), []factory.Customization{ { Model: models.Order{ OrdersType: ordersType, - }, - }, - { - Model: models.ServiceMember{ - Rank: &rank, + Grade: &grade, }, }, { diff --git a/pkg/services/payment_request/payment_request_creator.go b/pkg/services/payment_request/payment_request_creator.go index 6de47c89d7f..b759799d314 100644 --- a/pkg/services/payment_request/payment_request_creator.go +++ b/pkg/services/payment_request/payment_request_creator.go @@ -324,10 +324,6 @@ func (p *paymentRequestCreator) createPaymentRequestSaveToDB(appCtx appcontext.A if serviceMember.LastName == nil || *serviceMember.LastName == "" { return nil, apperror.NewConflictError(moveTaskOrder.Orders.ServiceMemberID, fmt.Sprintf("ServiceMember on MoveTaskOrder (ID: %s) missing Last Name", moveTaskOrder.ID)) } - // Verify Rank - if serviceMember.Rank == nil || *serviceMember.Rank == "" { - return nil, apperror.NewConflictError(moveTaskOrder.Orders.ServiceMemberID, fmt.Sprintf("ServiceMember on MoveTaskOrder (ID: %s) missing Rank", moveTaskOrder.ID)) - } // Verify Affiliation if serviceMember.Affiliation == nil || *serviceMember.Affiliation == "" { return nil, apperror.NewConflictError(moveTaskOrder.Orders.ServiceMemberID, fmt.Sprintf("ServiceMember on MoveTaskOrder (ID: %s) missing Affiliation", moveTaskOrder.ID)) diff --git a/pkg/services/payment_request/payment_request_creator_test.go b/pkg/services/payment_request/payment_request_creator_test.go index d2c6ea82566..af415b912c4 100644 --- a/pkg/services/payment_request/payment_request_creator_test.go +++ b/pkg/services/payment_request/payment_request_creator_test.go @@ -10,6 +10,7 @@ import ( "github.com/transcom/mymove/pkg/apperror" "github.com/transcom/mymove/pkg/factory" + "github.com/transcom/mymove/pkg/gen/internalmessages" "github.com/transcom/mymove/pkg/models" routemocks "github.com/transcom/mymove/pkg/route/mocks" "github.com/transcom/mymove/pkg/services/ghcrateengine" @@ -883,37 +884,36 @@ func (suite *PaymentRequestServiceSuite) TestCreatePaymentRequest() { return fmt.Sprintf("ID: %s is in a conflicting state ServiceMember on MoveTaskOrder (ID: %s) missing Last Name", serviceMemberID, mtoID) }, }, - // ServiceMember with no Rank + // Order with no Grade { - TestDescription: "Given move with service member that has no Rank, the create should fail", + TestDescription: "Given move with order that has no Rank, the create should fail", InvalidMove: func() models.Move { mtoInvalid := factory.BuildMove(suite.DB(), nil, nil) + mtoInvalid.Orders.Grade = nil sm := mtoInvalid.Orders.ServiceMember - sm.Rank = nil err := suite.DB().Update(&sm) suite.FatalNoError(err) return mtoInvalid }, ExpectedError: apperror.ConflictError{}, ExpectedErrorMessage: func(serviceMemberID uuid.UUID, mtoID uuid.UUID) string { - return fmt.Sprintf("ID: %s is in a conflicting state ServiceMember on MoveTaskOrder (ID: %s) missing Rank", serviceMemberID, mtoID) + return fmt.Sprintf("ID: %s is in a conflicting state unable to pick contract because move is not available to prime", mtoID) }, }, - // ServiceMember with blank Rank + // Order with empty Grade { - TestDescription: "Given move with service member that has blank Rank, the create should fail", + TestDescription: "Given move with order that has blank Rank, the create should fail", InvalidMove: func() models.Move { mtoInvalid := factory.BuildMove(suite.DB(), nil, nil) + mtoInvalid.Orders.Grade = internalmessages.NewOrderPayGrade("") sm := mtoInvalid.Orders.ServiceMember - blank := models.ServiceMemberRank("") - sm.Rank = &blank err := suite.DB().Update(&sm) suite.FatalNoError(err) return mtoInvalid }, ExpectedError: apperror.ConflictError{}, ExpectedErrorMessage: func(serviceMemberID uuid.UUID, mtoID uuid.UUID) string { - return fmt.Sprintf("ID: %s is in a conflicting state ServiceMember on MoveTaskOrder (ID: %s) missing Rank", serviceMemberID, mtoID) + return fmt.Sprintf("ID: %s is in a conflicting state unable to pick contract because move is not available to prime", mtoID) }, }, // ServiceMember with no Affiliation diff --git a/pkg/services/support/move_task_order/move_task_order_creator.go b/pkg/services/support/move_task_order/move_task_order_creator.go index 25f2d257af4..a31f553cc2d 100644 --- a/pkg/services/support/move_task_order/move_task_order_creator.go +++ b/pkg/services/support/move_task_order/move_task_order_creator.go @@ -276,7 +276,6 @@ func CustomerModel(customer *supportmessages.Customer) *models.ServiceMember { ID: uuid.FromStringOrNil(customer.ID.String()), Affiliation: (*models.ServiceMemberAffiliation)(customer.Agency), Edipi: customer.DodID, - Rank: (*models.ServiceMemberRank)(customer.Rank), FirstName: customer.FirstName, LastName: customer.LastName, PersonalEmail: customer.Email, @@ -302,7 +301,8 @@ func OrderModel(orderPayload *supportmessages.Order) *models.Order { } if orderPayload.Rank != nil { - model.Grade = models.StringPointer((string)(*orderPayload.Rank)) + grade := internalmessages.OrderPayGrade(*orderPayload.Rank) // Convert support API "Rank" into our internal tracking of "Grade" + model.Grade = &grade } if orderPayload.Status != nil { diff --git a/pkg/testdatagen/make_entitlement.go b/pkg/testdatagen/make_entitlement.go index 4e858487bab..c8e1a2d3146 100644 --- a/pkg/testdatagen/make_entitlement.go +++ b/pkg/testdatagen/make_entitlement.go @@ -18,7 +18,7 @@ func makeEntitlement(db *pop.Connection, assertions Assertions) models.Entitleme proGearWeightSpouse := 500 if grade == nil || *grade == "" { - grade = models.StringPointer("E_1") + grade = models.ServiceMemberGradeE1.Pointer() } entitlement := models.Entitlement{ @@ -32,7 +32,7 @@ func makeEntitlement(db *pop.Connection, assertions Assertions) models.Entitleme RequiredMedicalEquipmentWeight: rmeWeight, OrganizationalClothingAndIndividualEquipment: ocie, } - entitlement.SetWeightAllotment(*grade) + entitlement.SetWeightAllotment(string(*grade)) dBAuthorizedWeight := entitlement.AuthorizedWeight() entitlement.DBAuthorizedWeight = dBAuthorizedWeight diff --git a/pkg/testdatagen/make_order.go b/pkg/testdatagen/make_order.go index 93b64f4cfa2..af87100a4c0 100644 --- a/pkg/testdatagen/make_order.go +++ b/pkg/testdatagen/make_order.go @@ -75,7 +75,7 @@ func makeOrder(db *pop.Connection, assertions Assertions) models.Order { } hasDependents := assertions.Order.HasDependents || false spouseHasProGear := assertions.Order.SpouseHasProGear || false - grade := "E_1" + grade := models.ServiceMemberGradeE1 entitlement := assertions.Entitlement if isZeroUUID(entitlement.ID) { diff --git a/pkg/testdatagen/make_service_member.go b/pkg/testdatagen/make_service_member.go index 2bbd12c8dd0..8e7f23d7cc2 100644 --- a/pkg/testdatagen/make_service_member.go +++ b/pkg/testdatagen/make_service_member.go @@ -58,7 +58,6 @@ func makeServiceMember(db *pop.Connection, assertions Assertions) models.Service } randomEdipi := RandomEdipi() - rank := models.ServiceMemberRankE1 serviceMember := models.ServiceMember{ UserID: user.ID, @@ -71,7 +70,6 @@ func makeServiceMember(db *pop.Connection, assertions Assertions) models.Service PersonalEmail: &email, ResidentialAddressID: currentAddressID, ResidentialAddress: currentAddress, - Rank: &rank, } // Overwrite values with those from assertions @@ -99,7 +97,6 @@ func makeExtendedServiceMember(db *pop.Connection, assertions Assertions) models } residentialAddress := MakeDefaultAddress(db) backupMailingAddress := MakeAddress2(db, assertions) - e1 := models.ServiceMemberRankE1 dutyLocation := assertions.OriginDutyLocation if isZeroUUID(dutyLocation.ID) { @@ -117,12 +114,9 @@ func makeExtendedServiceMember(db *pop.Connection, assertions Assertions) models // Combine extended SM defaults with assertions smDefaults := models.ServiceMember{ Edipi: models.StringPointer(RandomEdipi()), - Rank: &e1, Affiliation: affiliation, ResidentialAddressID: &residentialAddress.ID, BackupMailingAddressID: &backupMailingAddress.ID, - DutyLocationID: &dutyLocation.ID, - DutyLocation: dutyLocation, EmailIsPreferred: models.BoolPointer(true), Telephone: models.StringPointer("555-555-5555"), } diff --git a/pkg/testdatagen/testharness/make_move.go b/pkg/testdatagen/testharness/make_move.go index 14a05eac322..8237fe96095 100644 --- a/pkg/testdatagen/testharness/make_move.go +++ b/pkg/testdatagen/testharness/make_move.go @@ -5079,10 +5079,10 @@ func MakeHHGMoveWithAddressChangeRequestAndUnknownDeliveryAddress(appCtx appcont destinationAddress := factory.BuildMinimalAddress(appCtx.DB(), []factory.Customization{ { Model: models.Address{ - City: customer.DutyLocation.Address.City, - State: customer.DutyLocation.Address.State, - PostalCode: customer.DutyLocation.Address.PostalCode, - Country: customer.DutyLocation.Address.Country, + City: orders.OriginDutyLocation.Address.City, + State: orders.OriginDutyLocation.Address.State, + PostalCode: orders.OriginDutyLocation.Address.PostalCode, + Country: orders.OriginDutyLocation.Address.Country, }, }, }, nil) diff --git a/swagger-def/internal.yaml b/swagger-def/internal.yaml index 63300848358..996d2259838 100644 --- a/swagger-def/internal.yaml +++ b/swagger-def/internal.yaml @@ -1108,9 +1108,9 @@ definitions: affiliation: $ref: 'definitions/Affiliation.yaml' title: Branch - rank: - $ref: '#/definitions/ServiceMemberRank' - title: Rank + grade: + $ref: '#/definitions/OrderPayGrade' + title: Grade first_name: type: string example: John @@ -1160,8 +1160,6 @@ definitions: type: boolean x-nullable: true title: Email - current_location: - $ref: 'definitions/DutyLocationPayload.yaml' residential_address: $ref: 'definitions/Address.yaml' title: Residential Address @@ -1203,8 +1201,8 @@ definitions: title: 'DoD ID number' affiliation: $ref: 'definitions/Affiliation.yaml' - rank: - $ref: '#/definitions/ServiceMemberRank' + grade: + $ref: '#/definitions/OrderPayGrade' first_name: type: string example: John @@ -1281,8 +1279,6 @@ definitions: title: DoD ID number affiliation: $ref: 'definitions/Affiliation.yaml' - rank: - $ref: '#/definitions/ServiceMemberRank' first_name: type: string example: John @@ -1571,74 +1567,10 @@ definitions: - S - M - L - ServiceMemberRank: - type: string - x-nullable: true - title: Rank - enum: - - E_1 - - E_2 - - E_3 - - E_4 - - E_5 - - E_6 - - E_7 - - E_8 - - E_9 - - E_9_SPECIAL_SENIOR_ENLISTED - - O_1_ACADEMY_GRADUATE - - O_2 - - O_3 - - O_4 - - O_5 - - O_6 - - O_7 - - O_8 - - O_9 - - O_10 - - W_1 - - W_2 - - W_3 - - W_4 - - W_5 - - AVIATION_CADET - - CIVILIAN_EMPLOYEE - - ACADEMY_CADET - - MIDSHIPMAN - x-display-value: - E_1: E-1 - E_2: E-2 - E_3: E-3 - E_4: E-4 - E_5: E-5 - E_6: E-6 - E_7: E-7 - E_8: E-8 - E_9: E-9 - E_9_SPECIAL_SENIOR_ENLISTED: E-9 (Special Senior Enlisted) - O_1_ACADEMY_GRADUATE: O-1 or Service Academy Graduate - O_2: O-2 - O_3: O-3 - O_4: O-4 - O_5: O-5 - O_6: O-6 - O_7: O-7 - O_8: O-8 - O_9: O-9 - O_10: O-10 - W_1: W-1 - W_2: W-2 - W_3: W-3 - W_4: W-4 - W_5: W-5 - AVIATION_CADET: Aviation Cadet - CIVILIAN_EMPLOYEE: Civilian Employee - ACADEMY_CADET: Service Academy Cadet - MIDSHIPMAN: Midshipman OrderPayGrade: type: string x-nullable: true - title: Rank + title: Grade enum: - E_1 - E_2 @@ -1858,9 +1790,7 @@ definitions: format: uuid example: c56a4180-65aa-42ec-a945-5fd21dec0538 grade: - type: string - example: 'O-6' - x-nullable: true + $ref: '#/definitions/OrderPayGrade' issue_date: type: string description: The date and time that these orders were cut. @@ -1953,13 +1883,13 @@ definitions: example: 2000 x-nullable: true description: > - Pro-gear weight limit as set by an Office user, distinct from the service member's default weight allotment determined by rank + Pro-gear weight limit as set by an Office user, distinct from the service member's default weight allotment determined by pay grade proGearSpouse: type: integer example: 500 x-nullable: true description: > - Spouse's pro-gear weight limit as set by an Office user, distinct from the service member's default weight allotment determined by rank + Spouse's pro-gear weight limit as set by an Office user, distinct from the service member's default weight allotment determined by pay grade CreateUpdateOrders: type: object properties: @@ -2069,8 +1999,8 @@ definitions: maxLength: 10 example: '5789345789' title: 'DoD ID #' - rank: - $ref: '#/definitions/ServiceMemberRank' + grade: + $ref: '#/definitions/OrderPayGrade' orders_type: type: string title: Move Type @@ -2151,7 +2081,7 @@ definitions: - locator - customer_name - edipi - - rank + - grade - orders_type - branch_of_service - last_modified_date diff --git a/swagger/internal.yaml b/swagger/internal.yaml index 496ed4142f4..c1c9a243bc3 100644 --- a/swagger/internal.yaml +++ b/swagger/internal.yaml @@ -1129,9 +1129,9 @@ definitions: affiliation: $ref: '#/definitions/Affiliation' title: Branch - rank: - $ref: '#/definitions/ServiceMemberRank' - title: Rank + grade: + $ref: '#/definitions/OrderPayGrade' + title: Grade first_name: type: string example: John @@ -1181,8 +1181,6 @@ definitions: type: boolean x-nullable: true title: Email - current_location: - $ref: '#/definitions/DutyLocationPayload' residential_address: $ref: '#/definitions/Address' title: Residential Address @@ -1224,8 +1222,8 @@ definitions: title: DoD ID number affiliation: $ref: '#/definitions/Affiliation' - rank: - $ref: '#/definitions/ServiceMemberRank' + grade: + $ref: '#/definitions/OrderPayGrade' first_name: type: string example: John @@ -1302,8 +1300,6 @@ definitions: title: DoD ID number affiliation: $ref: '#/definitions/Affiliation' - rank: - $ref: '#/definitions/ServiceMemberRank' first_name: type: string example: John @@ -1592,74 +1588,10 @@ definitions: - S - M - L - ServiceMemberRank: - type: string - x-nullable: true - title: Rank - enum: - - E_1 - - E_2 - - E_3 - - E_4 - - E_5 - - E_6 - - E_7 - - E_8 - - E_9 - - E_9_SPECIAL_SENIOR_ENLISTED - - O_1_ACADEMY_GRADUATE - - O_2 - - O_3 - - O_4 - - O_5 - - O_6 - - O_7 - - O_8 - - O_9 - - O_10 - - W_1 - - W_2 - - W_3 - - W_4 - - W_5 - - AVIATION_CADET - - CIVILIAN_EMPLOYEE - - ACADEMY_CADET - - MIDSHIPMAN - x-display-value: - E_1: E-1 - E_2: E-2 - E_3: E-3 - E_4: E-4 - E_5: E-5 - E_6: E-6 - E_7: E-7 - E_8: E-8 - E_9: E-9 - E_9_SPECIAL_SENIOR_ENLISTED: E-9 (Special Senior Enlisted) - O_1_ACADEMY_GRADUATE: O-1 or Service Academy Graduate - O_2: O-2 - O_3: O-3 - O_4: O-4 - O_5: O-5 - O_6: O-6 - O_7: O-7 - O_8: O-8 - O_9: O-9 - O_10: O-10 - W_1: W-1 - W_2: W-2 - W_3: W-3 - W_4: W-4 - W_5: W-5 - AVIATION_CADET: Aviation Cadet - CIVILIAN_EMPLOYEE: Civilian Employee - ACADEMY_CADET: Service Academy Cadet - MIDSHIPMAN: Midshipman OrderPayGrade: type: string x-nullable: true - title: Rank + title: Grade enum: - E_1 - E_2 @@ -1879,9 +1811,7 @@ definitions: format: uuid example: c56a4180-65aa-42ec-a945-5fd21dec0538 grade: - type: string - example: O-6 - x-nullable: true + $ref: '#/definitions/OrderPayGrade' issue_date: type: string description: The date and time that these orders were cut. @@ -1977,14 +1907,14 @@ definitions: x-nullable: true description: > Pro-gear weight limit as set by an Office user, distinct from the - service member's default weight allotment determined by rank + service member's default weight allotment determined by pay grade proGearSpouse: type: integer example: 500 x-nullable: true description: > Spouse's pro-gear weight limit as set by an Office user, distinct from - the service member's default weight allotment determined by rank + the service member's default weight allotment determined by pay grade CreateUpdateOrders: type: object properties: @@ -2096,8 +2026,8 @@ definitions: maxLength: 10 example: '5789345789' title: 'DoD ID #' - rank: - $ref: '#/definitions/ServiceMemberRank' + grade: + $ref: '#/definitions/OrderPayGrade' orders_type: type: string title: Move Type @@ -2178,7 +2108,7 @@ definitions: - locator - customer_name - edipi - - rank + - grade - orders_type - branch_of_service - last_modified_date