diff --git a/pkg/assets/notifications/templates/move_counseled_template.html b/pkg/assets/notifications/templates/move_counseled_template.html index d8c22a243b0..27bfa767bbe 100644 --- a/pkg/assets/notifications/templates/move_counseled_template.html +++ b/pkg/assets/notifications/templates/move_counseled_template.html @@ -2,6 +2,9 @@
This is a confirmation that your counselor has approved move details for the assigned move code{{if .Locator}} {{.Locator}}{{end}}{{if .OriginDutyLocation}} from {{.OriginDutyLocation}}{{end}}{{if .DestinationLocation}} to {{.DestinationLocation}}{{end}} in the MilMove system.
+{{if .WeightRestriction}} +Your move has been identified as going to an administratively restricted HHG weight location. Your weight restriction is {{.WeightRestriction}}lbs. Be advised, you may be required to pay excess cost if you choose to move more than your weight restriction.
+{{end}}What this means to you: If you are doing a Personally Procured Move (PPM), you can start moving your personal property.
diff --git a/pkg/assets/notifications/templates/move_counseled_template.txt b/pkg/assets/notifications/templates/move_counseled_template.txt index 39aead0ef8a..535c27f66e9 100644 --- a/pkg/assets/notifications/templates/move_counseled_template.txt +++ b/pkg/assets/notifications/templates/move_counseled_template.txt @@ -1,7 +1,9 @@ *** DO NOT REPLY directly to this email *** This is a confirmation that your counselor has approved move details for the assigned move code {{.Locator}}{{if .OriginDutyLocation}} from {{.OriginDutyLocation}}{{end}}{{if .DestinationLocation}} to {{.DestinationLocation}}{{end}} in the MilMove system. - +{{if .WeightRestriction}} +Your move has been identified as going to an administratively restricted HHG weight location. Your weight restriction is {{.WeightRestriction}}lbs. Be advised, you may be required to pay excess cost if you choose to move more than your weight restriction.
+{{end}} What this means to you: If you are doing a Personally Procured Move (PPM), you can start moving your personal property. diff --git a/pkg/assets/notifications/templates/move_submitted_template.html b/pkg/assets/notifications/templates/move_submitted_template.html index cce7d87e8b8..17e7c0732ff 100644 --- a/pkg/assets/notifications/templates/move_submitted_template.html +++ b/pkg/assets/notifications/templates/move_submitted_template.html @@ -20,9 +20,9 @@- Your weight allowance: {{.WeightAllowance}} pounds. + Your standard weight allowance: {{.WeightAllowance}} pounds. That is how much combined weight the government will pay for all movements between authorized locations under your - orders. + orders. Be advised, if you are moving to an administratively restricted HHG weight location this amount could be less.
diff --git a/pkg/assets/notifications/templates/move_submitted_template.txt b/pkg/assets/notifications/templates/move_submitted_template.txt index 72f1c68566d..85516ead51f 100644 --- a/pkg/assets/notifications/templates/move_submitted_template.txt +++ b/pkg/assets/notifications/templates/move_submitted_template.txt @@ -6,7 +6,7 @@ We have assigned you a move code: {{.Locator}}. You can use this code when talki {{ if .OriginDutyLocationPhoneLine -}} To change any information about your move, or to add or cancel shipments, you should contact {{.OriginDutyLocationPhoneLine}} or visit your local transportation office ({{.OneSourceTransportationOfficeLink}}) . {{- end }} {{- if not .OriginDutyLocationPhoneLine }} To change any information about your move, or to add or cancel shipments, you should contact your nearest transportation office. You can find the contact information using the directory of PCS-related contacts ({{.OneSourceTransportationOfficeLink}}) . {{- end }} -Your weight allowance: {{.WeightAllowance}} pounds. That is how much combined weight the government will pay for all movements between authorized locations under your orders. +Your standard weight allowance: {{.WeightAllowance}} pounds. That is how much combined weight the government will pay for all movements between authorized locations under your orders. Be advised, if you are moving to an administratively restricted HHG weight location this amount could be less. If you move more than {{.WeightAllowance}} pounds or ship to/from an other than authorized location, you may owe the government the difference in cost between what you are authorized and what you decide to move. diff --git a/pkg/factory/entitlement_factory.go b/pkg/factory/entitlement_factory.go index 17aff299990..0df88cd9ca4 100644 --- a/pkg/factory/entitlement_factory.go +++ b/pkg/factory/entitlement_factory.go @@ -98,4 +98,5 @@ func BuildEntitlement(db *pop.Connection, customs []Customization, traits []Trai } return entitlement + } diff --git a/pkg/gen/ghcapi/embedded_spec.go b/pkg/gen/ghcapi/embedded_spec.go index d6508b12024..16a0811f28f 100644 --- a/pkg/gen/ghcapi/embedded_spec.go +++ b/pkg/gen/ghcapi/embedded_spec.go @@ -5851,7 +5851,8 @@ func init() { "application/json" ], "tags": [ - "shipment" + "shipment", + "shipment_address_updates" ], "summary": "Allows TOO to review a shipment address update", "operationId": "reviewShipmentAddressUpdate", @@ -23052,7 +23053,8 @@ func init() { "application/json" ], "tags": [ - "shipment" + "shipment", + "shipment_address_updates" ], "summary": "Allows TOO to review a shipment address update", "operationId": "reviewShipmentAddressUpdate", diff --git a/pkg/gen/ghcapi/ghcoperations/shipment/review_shipment_address_update.go b/pkg/gen/ghcapi/ghcoperations/shipment/review_shipment_address_update.go index d4532a282ce..61dafe8bc53 100644 --- a/pkg/gen/ghcapi/ghcoperations/shipment/review_shipment_address_update.go +++ b/pkg/gen/ghcapi/ghcoperations/shipment/review_shipment_address_update.go @@ -36,7 +36,7 @@ func NewReviewShipmentAddressUpdate(ctx *middleware.Context, handler ReviewShipm } /* - ReviewShipmentAddressUpdate swagger:route PATCH /shipments/{shipmentID}/review-shipment-address-update shipment reviewShipmentAddressUpdate + ReviewShipmentAddressUpdate swagger:route PATCH /shipments/{shipmentID}/review-shipment-address-update shipment shipment_address_updates reviewShipmentAddressUpdate # Allows TOO to review a shipment address update diff --git a/pkg/gen/internalapi/embedded_spec.go b/pkg/gen/internalapi/embedded_spec.go index c872ff075a7..35d92886247 100644 --- a/pkg/gen/internalapi/embedded_spec.go +++ b/pkg/gen/internalapi/embedded_spec.go @@ -4486,6 +4486,12 @@ func init() { "type": "integer", "x-nullable": true, "example": 3 + }, + "weight_restriction": { + "description": "Indicates the weight restricted to a specific location.", + "type": "integer", + "x-nullable": true, + "example": 1500 } } }, @@ -6037,6 +6043,10 @@ func init() { }, "uploaded_orders": { "$ref": "#/definitions/Document" + }, + "weightRestriction": { + "type": "integer", + "x-nullable": true } } }, @@ -13615,6 +13625,12 @@ func init() { "type": "integer", "x-nullable": true, "example": 3 + }, + "weight_restriction": { + "description": "Indicates the weight restricted to a specific location.", + "type": "integer", + "x-nullable": true, + "example": 1500 } } }, @@ -15168,6 +15184,10 @@ func init() { }, "uploaded_orders": { "$ref": "#/definitions/Document" + }, + "weightRestriction": { + "type": "integer", + "x-nullable": true } } }, diff --git a/pkg/gen/internalmessages/entitlement.go b/pkg/gen/internalmessages/entitlement.go index 703b403758f..083ea350085 100644 --- a/pkg/gen/internalmessages/entitlement.go +++ b/pkg/gen/internalmessages/entitlement.go @@ -42,6 +42,10 @@ type Entitlement struct { // The amount of weight in pounds that the move is entitled for shipment types of Unaccompanied Baggage. // Example: 3 UbAllowance *int64 `json:"ub_allowance,omitempty"` + + // Indicates the weight restricted to a specific location. + // Example: 1500 + WeightRestriction *int64 `json:"weight_restriction,omitempty"` } // Validate validates this entitlement diff --git a/pkg/gen/internalmessages/orders.go b/pkg/gen/internalmessages/orders.go index 6a789163d32..f36800d8445 100644 --- a/pkg/gen/internalmessages/orders.go +++ b/pkg/gen/internalmessages/orders.go @@ -127,6 +127,9 @@ type Orders struct { // uploaded orders // Required: true UploadedOrders *Document `json:"uploaded_orders"` + + // weight restriction + WeightRestriction *int64 `json:"weightRestriction,omitempty"` } // Validate validates this orders diff --git a/pkg/handlers/ghcapi/internal/payloads/model_to_payload.go b/pkg/handlers/ghcapi/internal/payloads/model_to_payload.go index 8e53a65e394..5520d8216ac 100644 --- a/pkg/handlers/ghcapi/internal/payloads/model_to_payload.go +++ b/pkg/handlers/ghcapi/internal/payloads/model_to_payload.go @@ -773,6 +773,7 @@ func Entitlement(entitlement *models.Entitlement) *ghcmessages.Entitlements { WeightRestriction: weightRestriction, ETag: etag.GenerateEtag(entitlement.UpdatedAt), } + } // DutyLocation payload diff --git a/pkg/handlers/ghcapi/orders_test.go b/pkg/handlers/ghcapi/orders_test.go index 37ff1a66c3a..4496c7c1146 100644 --- a/pkg/handlers/ghcapi/orders_test.go +++ b/pkg/handlers/ghcapi/orders_test.go @@ -1532,6 +1532,7 @@ func (suite *HandlerSuite) TestCounselingUpdateAllowanceHandler() { ProGearWeightSpouse: proGearWeightSpouse, RequiredMedicalEquipmentWeight: rmeWeight, StorageInTransit: models.Int64Pointer(80), + WeightRestriction: models.Int64Pointer(0), } request := httptest.NewRequest("PATCH", "/counseling/orders/{orderID}/allowances", nil) diff --git a/pkg/handlers/internalapi/orders.go b/pkg/handlers/internalapi/orders.go index 564a76f4eaf..3471329d227 100644 --- a/pkg/handlers/internalapi/orders.go +++ b/pkg/handlers/internalapi/orders.go @@ -85,6 +85,9 @@ func payloadForOrdersModel(storer storage.FileStorer, order models.Order) (*inte if order.Entitlement.UBAllowance != nil { entitlement.UbAllowance = models.Int64Pointer(int64(*order.Entitlement.UBAllowance)) } + if order.Entitlement.WeightRestriction != nil { + entitlement.WeightRestriction = models.Int64Pointer(int64(*order.Entitlement.WeightRestriction)) + } } var originDutyLocation models.DutyLocation originDutyLocation = models.DutyLocation{} diff --git a/pkg/handlers/supportapi/internal/payloads/model_to_payload.go b/pkg/handlers/supportapi/internal/payloads/model_to_payload.go index 12ebfd4b8a1..a43c59663a7 100644 --- a/pkg/handlers/supportapi/internal/payloads/model_to_payload.go +++ b/pkg/handlers/supportapi/internal/payloads/model_to_payload.go @@ -148,6 +148,7 @@ func Entitlement(entitlement *models.Entitlement) *supportmessages.Entitlement { if entitlement.UBAllowance != nil { ubAllowance = int64(*entitlement.UBAllowance) } + return &supportmessages.Entitlement{ ID: strfmt.UUID(entitlement.ID.String()), AuthorizedWeight: authorizedWeight, diff --git a/pkg/notifications/move_counseled.go b/pkg/notifications/move_counseled.go index e519fdcc6a7..ea54b9df00b 100644 --- a/pkg/notifications/move_counseled.go +++ b/pkg/notifications/move_counseled.go @@ -6,6 +6,7 @@ import ( html "html/template" text "text/template" + "github.com/dustin/go-humanize" "github.com/gofrs/uuid" "go.uber.org/zap" @@ -91,12 +92,21 @@ func (m MoveCounseled) emails(appCtx appcontext.AppContext) ([]emailContent, err return emails, fmt.Errorf("no email found for service member") } + var weightRestriction *int64 + if orders.Entitlement != nil && orders.Entitlement.WeightRestriction != nil { + weightRestrictionInt64 := int64(*orders.Entitlement.WeightRestriction) + weightRestriction = &weightRestrictionInt64 + } + + weightRestrictionFormatted := humanize.Comma(int64(*weightRestriction)) + htmlBody, textBody, err := m.renderTemplates(appCtx, MoveCounseledEmailData{ OriginDutyLocation: originDutyLocationName, DestinationLocation: destinationAddress, Locator: move.Locator, MyMoveLink: MyMoveLink, ActualExpenseReimbursement: actualExpenseReimbursement, + WeightRestriction: weightRestrictionFormatted, }) if err != nil { @@ -115,8 +125,8 @@ func (m MoveCounseled) emails(appCtx appcontext.AppContext) ([]emailContent, err // TODO: Send email to trusted contacts when that's supported return append(emails, smEmail), nil -} +} func (m MoveCounseled) renderTemplates(appCtx appcontext.AppContext, data MoveCounseledEmailData) (string, string, error) { htmlBody, err := m.RenderHTML(appCtx, data) if err != nil { @@ -135,6 +145,7 @@ type MoveCounseledEmailData struct { Locator string MyMoveLink string ActualExpenseReimbursement bool + WeightRestriction string } // RenderHTML renders the html for the email diff --git a/pkg/notifications/move_counseled_test.go b/pkg/notifications/move_counseled_test.go index 90611f197e3..8f917aa8cf0 100644 --- a/pkg/notifications/move_counseled_test.go +++ b/pkg/notifications/move_counseled_test.go @@ -284,3 +284,56 @@ func (suite *NotificationSuite) TestMoveCounseledDestinationIsDutyStationForPpmP suite.Contains(email.htmlBody, "from "+move.Orders.OriginDutyLocation.Name+" to "+move.Orders.NewDutyLocation.Name+" in the ") suite.Contains(email.textBody, "from "+move.Orders.OriginDutyLocation.Name+" to "+move.Orders.NewDutyLocation.Name+" in the ") } + +func (suite *NotificationSuite) TestMoveCounseledHTMLTemplateRenderWithWeightRestriction() { + approver := factory.BuildUser(nil, nil, nil) + move := factory.BuildMove(suite.DB(), nil, nil) + notification := NewMoveCounseled(move.ID) + + originDutyLocation := "origDutyLocation" + + s := MoveCounseledEmailData{ + OriginDutyLocation: &originDutyLocation, + DestinationLocation: "destDutyLocation", + Locator: "abc123", + MyMoveLink: MyMoveLink, + ActualExpenseReimbursement: true, + WeightRestriction: "1500", + } + + expectedHTMLContent := `
*** DO NOT REPLY directly to this email ***
+This is a confirmation that your counselor has approved move details for the assigned move code abc123 from origDutyLocation to destDutyLocation in the MilMove system.
+Your move has been identified as going to an administratively restricted HHG weight location. Your weight restriction is 1,500lbs. Be advised, you may be required to pay excess cost if you choose to move more than your weight restriction.
+What this means to you: +If you are doing a Personally Procured Move (PPM), you can start moving your personal property.
+Next steps for a PPM: +
Note: To receive allowance for Pro-Gear, you must identify allowable items and provide weight tickets separately for Pro-Gear.
+Next steps for government arranged shipments: +
Thank you,
+USTRANSCOM MilMove Team
The information contained in this email may contain Privacy Act information and is therefore protected under the Privacy Act of 1974. Failure to protect Privacy Act information could result in a $5,000 fine.
` + + htmlContent, err := notification.RenderHTML(suite.AppContextWithSessionForTest(&auth.Session{ + UserID: approver.ID, + ApplicationName: auth.OfficeApp, + }), s) + + suite.NoError(err) + suite.Equal(trimExtraSpaces(expectedHTMLContent), trimExtraSpaces(htmlContent)) +} diff --git a/pkg/notifications/move_submitted_test.go b/pkg/notifications/move_submitted_test.go index b636d26a536..7717901dae0 100644 --- a/pkg/notifications/move_submitted_test.go +++ b/pkg/notifications/move_submitted_test.go @@ -273,9 +273,9 @@ func (suite *NotificationSuite) TestMoveSubmittedHTMLTemplateRenderWithGovCounse- Your weight allowance: 7,999 pounds. + Your standard weight allowance: 7,999 pounds. That is how much combined weight the government will pay for all movements between authorized locations under your - orders. + orders. Be advised, if you are moving to an administratively restricted HHG weight location this amount could be less.
@@ -385,9 +385,9 @@ func (suite *NotificationSuite) TestMoveSubmittedHTMLTemplateRenderWithoutGovCou
- Your weight allowance: 7,999 pounds. + Your standard weight allowance: 7,999 pounds. That is how much combined weight the government will pay for all movements between authorized locations under your - orders. + orders. Be advised, if you are moving to an administratively restricted HHG weight location this amount could be less.
@@ -483,9 +483,9 @@ func (suite *NotificationSuite) TestMoveSubmittedHTMLTemplateRenderNoDutyLocatio
- Your weight allowance: 7,999 pounds. + Your standard weight allowance: 7,999 pounds. That is how much combined weight the government will pay for all movements between authorized locations under your - orders. + orders. Be advised, if you are moving to an administratively restricted HHG weight location this amount could be less.
@@ -578,7 +578,7 @@ We have assigned you a move code: abc123. You can use this code when talking to
To change any information about your move, or to add or cancel shipments, you should contact 555-555-5555 or visit your local transportation office (` + OneSourceTransportationOfficeLink + `) .
-Your weight allowance: 7,999 pounds. That is how much combined weight the government will pay for all movements between authorized locations under your orders.
+Your standard weight allowance: 7,999 pounds. That is how much combined weight the government will pay for all movements between authorized locations under your orders. Be advised, if you are moving to an administratively restricted HHG weight location this amount could be less.
If you move more than 7,999 pounds or ship to/from an other than authorized location, you may owe the government the difference in cost between what you are authorized and what you decide to move.
diff --git a/pkg/services/order/order_updater.go b/pkg/services/order/order_updater.go
index f2efe7f2a57..77bdb4fa04a 100644
--- a/pkg/services/order/order_updater.go
+++ b/pkg/services/order/order_updater.go
@@ -536,6 +536,7 @@ func allowanceFromTOOPayload(appCtx appcontext.AppContext, existingOrder models.
return order, nil
}
+
func allowanceFromCounselingPayload(appCtx appcontext.AppContext, existingOrder models.Order, payload ghcmessages.CounselingUpdateAllowancePayload) (models.Order, error) {
order := existingOrder
waf := entitlements.NewWeightAllotmentFetcher()
@@ -640,7 +641,6 @@ func allowanceFromCounselingPayload(appCtx appcontext.AppContext, existingOrder
return order, nil
}
-
func (f *orderUpdater) saveDocumentForAmendedOrder(appCtx appcontext.AppContext, doc *models.Document) (*models.Document, error) {
var docID uuid.UUID
if doc != nil {
diff --git a/pkg/services/order/order_updater_test.go b/pkg/services/order/order_updater_test.go
index 0fa72e8d904..9e86e990f95 100644
--- a/pkg/services/order/order_updater_test.go
+++ b/pkg/services/order/order_updater_test.go
@@ -747,6 +747,7 @@ func (suite *OrderServiceSuite) TestUpdateAllowanceAsCounselor() {
AccompaniedTour: models.BoolPointer(true),
DependentsTwelveAndOver: models.Int64Pointer(1),
DependentsUnderTwelve: models.Int64Pointer(2),
+ WeightRestriction: models.Int64Pointer(0),
}
updatedOrder, _, err := orderUpdater.UpdateAllowanceAsCounselor(suite.AppContextForTest(), order.ID, payload, eTag)
@@ -832,6 +833,7 @@ func (suite *OrderServiceSuite) TestUpdateAllowanceAsCounselor() {
ProGearWeight: proGearWeight,
ProGearWeightSpouse: proGearWeightSpouse,
RequiredMedicalEquipmentWeight: rmeWeight,
+ WeightRestriction: models.Int64Pointer(0),
}
updatedOrder, _, err := orderUpdater.UpdateAllowanceAsCounselor(suite.AppContextForTest(), order.ID, payload, eTag)
@@ -881,6 +883,7 @@ func (suite *OrderServiceSuite) TestUpdateAllowanceAsCounselor() {
ProGearWeight: proGearWeight,
ProGearWeightSpouse: proGearWeightSpouse,
RequiredMedicalEquipmentWeight: rmeWeight,
+ WeightRestriction: models.Int64Pointer(0),
}
updatedOrder, _, err := orderUpdater.UpdateAllowanceAsCounselor(suite.AppContextForTest(), orderWithoutDefaults.ID, payload, eTag)
@@ -932,6 +935,7 @@ func (suite *OrderServiceSuite) TestUpdateAllowanceAsCounselor() {
ProGearWeight: proGearWeight,
ProGearWeightSpouse: proGearWeightSpouse,
RequiredMedicalEquipmentWeight: rmeWeight,
+ WeightRestriction: models.Int64Pointer(0),
}
updatedOrder, _, err := orderUpdater.UpdateAllowanceAsCounselor(suite.AppContextForTest(), order.ID, payload, eTag)
@@ -968,6 +972,7 @@ func (suite *OrderServiceSuite) TestUpdateAllowanceAsCounselor() {
ProGearWeight: proGearWeight,
ProGearWeightSpouse: proGearWeightSpouse,
RequiredMedicalEquipmentWeight: rmeWeight,
+ WeightRestriction: models.Int64Pointer(0),
}
updatedOrder, _, err := orderUpdater.UpdateAllowanceAsCounselor(suite.AppContextForTest(), order.ID, payload, eTag)
diff --git a/src/components/Customer/MtoShipmentForm/MtoShipmentForm.jsx b/src/components/Customer/MtoShipmentForm/MtoShipmentForm.jsx
index e1fb7f72263..d8e04da7494 100644
--- a/src/components/Customer/MtoShipmentForm/MtoShipmentForm.jsx
+++ b/src/components/Customer/MtoShipmentForm/MtoShipmentForm.jsx
@@ -314,12 +314,14 @@ class MtoShipmentForm extends Component {