From 28742b3ed731c7b796aa7c2635386461d858dc62 Mon Sep 17 00:00:00 2001 From: loganwc Date: Mon, 20 May 2024 18:24:22 +0000 Subject: [PATCH 1/3] do not send emails to safety moves --- pkg/handlers/ghcapi/move_task_order.go | 8 ++++---- pkg/handlers/ghcapi/mto_shipment.go | 4 ++-- pkg/handlers/ghcapi/ppm_document.go | 2 +- pkg/handlers/internalapi/moves.go | 4 ++-- pkg/handlers/internalapi/office.go | 4 ++-- pkg/handlers/primeapi/move_task_order.go | 2 +- pkg/models/order.go | 8 ++++++++ pkg/services/mto_shipment/mto_shipment_updater.go | 2 +- 8 files changed, 21 insertions(+), 13 deletions(-) diff --git a/pkg/handlers/ghcapi/move_task_order.go b/pkg/handlers/ghcapi/move_task_order.go index e712977f9df..6a91e090487 100644 --- a/pkg/handlers/ghcapi/move_task_order.go +++ b/pkg/handlers/ghcapi/move_task_order.go @@ -112,8 +112,8 @@ func (h UpdateMoveTaskOrderStatusHandlerFunc) Handle(params movetaskorderops.Upd return movetaskorderops.NewUpdateMoveTaskOrderStatusInternalServerError(), err } - /* Do not send TOO approving and submitting service items email if BLUEBARK */ - if availableAfter && mto.Orders.OrdersType != "BLUEBARK" { + /* Do not send TOO approving and submitting service items email if BLUEBARK/SAFETY */ + if availableAfter && mto.Orders.CanSendEmailWithOrdersType() { emailErr := h.NotificationSender().SendNotification(appCtx, notifications.NewMoveIssuedToPrime(moveTaskOrderID), ) @@ -219,8 +219,8 @@ func (h UpdateMTOStatusServiceCounselingCompletedHandlerFunc) Handle(params move appCtx.Logger().Error("ghcapi.UpdateMTOStatusServiceCounselingCompletedHandlerFunc could not generate the event") } - /* Do not send SC Move Details Submitted email if orders type is BLUEBARK */ - if mto.Orders.OrdersType != "BLUEBARK" { + /* Do not send SC Move Details Submitted email if orders type is BLUEBARK/SAFETY */ + if mto.Orders.CanSendEmailWithOrdersType() { err = h.NotificationSender().SendNotification(appCtx, notifications.NewMoveCounseled(moveTaskOrderID)) if err != nil { appCtx.Logger().Error("problem sending email to user", zap.Error(err)) diff --git a/pkg/handlers/ghcapi/mto_shipment.go b/pkg/handlers/ghcapi/mto_shipment.go index fd19693d30f..8c89cd8e0c3 100644 --- a/pkg/handlers/ghcapi/mto_shipment.go +++ b/pkg/handlers/ghcapi/mto_shipment.go @@ -841,8 +841,8 @@ func (h RequestShipmentReweighHandler) Handle(params shipmentops.RequestShipment moveID := shipment.MoveTaskOrderID h.triggerRequestShipmentReweighEvent(appCtx, shipmentID, moveID, params) - /* Don't send emails for BLUEBARK moves */ - if shipment.MoveTaskOrder.Orders.OrdersType != "BLUEBARK" { + /* Don't send emails for BLUEBARK/SAFETY moves */ + if shipment.MoveTaskOrder.Orders.CanSendEmailWithOrdersType() { err = h.NotificationSender().SendNotification(appCtx, notifications.NewReweighRequested(moveID, *shipment), ) diff --git a/pkg/handlers/ghcapi/ppm_document.go b/pkg/handlers/ghcapi/ppm_document.go index ee9b3582bcf..960fa9e1a02 100644 --- a/pkg/handlers/ghcapi/ppm_document.go +++ b/pkg/handlers/ghcapi/ppm_document.go @@ -140,7 +140,7 @@ func (h FinishDocumentReviewHandler) Handle(params ppmdocumentops.FinishDocument return nil, err } - if move.Orders.OrdersType != "BLUEBARK" { + if move.Orders.CanSendEmailWithOrdersType() { err = h.NotificationSender().SendNotification(appCtx, notifications.NewPpmPacketEmail(ppmShipment.ID), ) diff --git a/pkg/handlers/internalapi/moves.go b/pkg/handlers/internalapi/moves.go index de0692b3cc7..f000b3bd07d 100644 --- a/pkg/handlers/internalapi/moves.go +++ b/pkg/handlers/internalapi/moves.go @@ -243,8 +243,8 @@ func (h SubmitMoveHandler) Handle(params moveop.SubmitMoveForApprovalParams) mid return handlers.ResponseForError(logger, err), err } - /* Don't send Move Creation email if orders type is BLUEBARK */ - if move.Orders.OrdersType != "BLUEBARK" { + /* Don't send Move Creation email if orders type is BLUEBARK/SAFETY */ + if move.Orders.CanSendEmailWithOrdersType() { err = h.NotificationSender().SendNotification(appCtx, notifications.NewMoveSubmitted(moveID), ) diff --git a/pkg/handlers/internalapi/office.go b/pkg/handlers/internalapi/office.go index 191adc199e5..7caf1b1c0df 100644 --- a/pkg/handlers/internalapi/office.go +++ b/pkg/handlers/internalapi/office.go @@ -112,8 +112,8 @@ func (h CancelMoveHandler) Handle(params officeop.CancelMoveParams) middleware.R return handlers.ResponseForVErrors(logger, verrs, err), err } - /* Don't send emails to BLUEBARK moves */ - if move.Orders.OrdersType != "BLUEBARK" { + /* Don't send emails to BLUEBARK/SAFETY moves */ + if move.Orders.CanSendEmailWithOrdersType() { err = h.NotificationSender().SendNotification(appCtx, notifications.NewMoveCanceled(moveID), ) diff --git a/pkg/handlers/primeapi/move_task_order.go b/pkg/handlers/primeapi/move_task_order.go index 447b0098383..df7f151c711 100644 --- a/pkg/handlers/primeapi/move_task_order.go +++ b/pkg/handlers/primeapi/move_task_order.go @@ -198,7 +198,7 @@ func (h UpdateMTOPostCounselingInformationHandler) Handle(params movetaskorderop mtoPayload := payloads.MoveTaskOrder(mto) /* Don't send prime related emails on BLUEBARK moves */ - if mto.Orders.OrdersType != "BLUEBARK" { + if mto.Orders.CanSendEmailWithOrdersType() { err = h.NotificationSender().SendNotification(appCtx, notifications.NewPrimeCounselingComplete(*mtoPayload), ) diff --git a/pkg/models/order.go b/pkg/models/order.go index 2d7b9ae241c..8071ee5db9f 100644 --- a/pkg/models/order.go +++ b/pkg/models/order.go @@ -315,3 +315,11 @@ func (o *Order) IsCompleteForGBL() bool { } return true } + +func (o *Order) CanSendEmailWithOrdersType() bool { + if o.OrdersType != "BLUEBARK" && o.OrdersType != "SAFETY" { + return true + } + + return false +} diff --git a/pkg/services/mto_shipment/mto_shipment_updater.go b/pkg/services/mto_shipment/mto_shipment_updater.go index 94dbb92a8dd..4e6695e88e7 100644 --- a/pkg/services/mto_shipment/mto_shipment_updater.go +++ b/pkg/services/mto_shipment/mto_shipment_updater.go @@ -746,7 +746,7 @@ func (f *mtoShipmentUpdater) updateShipmentRecord(appCtx appcontext.AppContext, if len(autoReweighShipments) > 0 { for _, shipment := range autoReweighShipments { /* Don't send emails to BLUEBARK moves */ - if shipment.MoveTaskOrder.Orders.OrdersType != "BLUEBARK" { + if shipment.MoveTaskOrder.Orders.CanSendEmailWithOrdersType() { err := f.sender.SendNotification(appCtx, notifications.NewReweighRequested(shipment.MoveTaskOrderID, shipment), ) From 3beb55ec28f958e009d4242d0bb23a1ec34e878b Mon Sep 17 00:00:00 2001 From: loganwc Date: Fri, 7 Jun 2024 18:08:50 +0000 Subject: [PATCH 2/3] apparently orders were never fetched here to begin with --- pkg/handlers/ghcapi/mto_shipment.go | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/pkg/handlers/ghcapi/mto_shipment.go b/pkg/handlers/ghcapi/mto_shipment.go index c25749341ab..3a3731fdb8b 100644 --- a/pkg/handlers/ghcapi/mto_shipment.go +++ b/pkg/handlers/ghcapi/mto_shipment.go @@ -843,8 +843,13 @@ func (h RequestShipmentReweighHandler) Handle(params shipmentops.RequestShipment moveID := shipment.MoveTaskOrderID h.triggerRequestShipmentReweighEvent(appCtx, shipmentID, moveID, params) + move, err := models.FetchMoveByMoveIDWithOrders(appCtx.DB(), shipment.MoveTaskOrderID) + if err != nil { + return nil, err + } + /* Don't send emails for BLUEBARK/SAFETY moves */ - if shipment.MoveTaskOrder.Orders.CanSendEmailWithOrdersType() { + if move.Orders.CanSendEmailWithOrdersType() { err = h.NotificationSender().SendNotification(appCtx, notifications.NewReweighRequested(moveID, *shipment), ) From 1398b696dc96c253640edd47b71751d4ee4ac751 Mon Sep 17 00:00:00 2001 From: Tevin Adams Date: Wed, 12 Jun 2024 18:09:06 +0000 Subject: [PATCH 3/3] removed unreferenced code --- src/scenes/Office/BackupInfoPanel.jsx | 124 ----------------- src/scenes/Office/CustomerInfoPanel.jsx | 173 ------------------------ src/shared/Address/index.jsx | 74 ---------- src/shared/Address/index.module.scss | 9 -- src/shared/Address/index.test.js | 101 -------------- 5 files changed, 481 deletions(-) delete mode 100644 src/scenes/Office/BackupInfoPanel.jsx delete mode 100644 src/scenes/Office/CustomerInfoPanel.jsx delete mode 100644 src/shared/Address/index.jsx delete mode 100644 src/shared/Address/index.module.scss delete mode 100644 src/shared/Address/index.test.js diff --git a/src/scenes/Office/BackupInfoPanel.jsx b/src/scenes/Office/BackupInfoPanel.jsx deleted file mode 100644 index 03b01cfd5c1..00000000000 --- a/src/scenes/Office/BackupInfoPanel.jsx +++ /dev/null @@ -1,124 +0,0 @@ -import { get } from 'lodash'; -import React from 'react'; -import { connect } from 'react-redux'; -import { reduxForm, getFormValues, FormSection } from 'redux-form'; - -import { - updateServiceMember, - updateBackupContact, - selectBackupContactForServiceMember, -} from 'shared/Entities/modules/serviceMembers'; -import { AddressElementDisplay, AddressElementEdit } from 'shared/Address'; -import { validateRequiredFields } from 'shared/JsonSchemaForm'; -import { SwaggerField } from 'shared/JsonSchemaForm/JsonSchemaField'; -import { PanelField, editablePanelify } from 'shared/EditablePanel'; - -const BackupInfoDisplay = (props) => { - const backupAddress = props.backupMailingAddress; - const { backupContact } = props; - - return ( - <> -
- -
-
- - {backupContact.name} -
- {backupContact.telephone && ( - - {backupContact.telephone} -
-
- )} - {backupContact.email && ( - - {backupContact.email} -
-
- )} -
-
- - ); -}; - -const BackupInfoEdit = (props) => { - const backupContactProps = { - swagger: props.backupContactSchema, - values: props.backupContact, - }; - return ( - <> -
-
Backup Contact 1
- - - - - - -
Authorization
- -
-
- -
- -
- - ); -}; - -const formName = 'office_move_info_backup_info'; - -let BackupInfoPanel = editablePanelify(BackupInfoDisplay, BackupInfoEdit); -BackupInfoPanel = reduxForm({ - form: formName, - validate: validateRequiredFields, - enableReinitialize: true, - keepDirtyOnReinitialize: true, -})(BackupInfoPanel); - -function mapStateToProps(state, ownProps) { - const { serviceMember } = ownProps; - const backupContact = selectBackupContactForServiceMember(state, serviceMember.id); - - return { - // reduxForm - initialValues: { - backupContact, - backupMailingAddress: get(serviceMember, 'backup_mailing_address', {}), - }, - - addressSchema: get(state, 'swaggerInternal.spec.definitions.Address', {}), - backupContactSchema: get(state, 'swaggerInternal.spec.definitions.ServiceMemberBackupContactPayload', {}), - backupMailingAddress: get(serviceMember, 'backup_mailing_address', {}), - backupContact, - - // editablePanelify - getUpdateArgs() { - const values = getFormValues(formName)(state); - return [ - serviceMember.id, - { backup_mailing_address: values.backupMailingAddress }, - backupContact.id, - values.backupContact, - ]; - }, - - hasError: false, - }; -} - -function mapDispatchToProps(dispatch) { - const update = (serviceMemberId, serviceMemberPayload, backupContactId, backupContact) => { - dispatch(updateServiceMember(serviceMemberId, serviceMemberPayload)); - dispatch(updateBackupContact(backupContactId, backupContact)); - }; - - return { update }; -} - -export default connect(mapStateToProps, mapDispatchToProps)(BackupInfoPanel); diff --git a/src/scenes/Office/CustomerInfoPanel.jsx b/src/scenes/Office/CustomerInfoPanel.jsx deleted file mode 100644 index b16e8380152..00000000000 --- a/src/scenes/Office/CustomerInfoPanel.jsx +++ /dev/null @@ -1,173 +0,0 @@ -import { get } from 'lodash'; -import React from 'react'; -import { connect } from 'react-redux'; -import { bindActionCreators } from 'redux'; -import { reduxForm, getFormValues, FormSection } from 'redux-form'; -import { FontAwesomeIcon } from '@fortawesome/react-fontawesome'; - -import { AddressElementDisplay, AddressElementEdit } from 'shared/Address'; -import { SwaggerField } from 'shared/JsonSchemaForm/JsonSchemaField'; -import { validateRequiredFields } from 'shared/JsonSchemaForm'; -import { - updateServiceMember, - loadServiceMemberLabel, - updateServiceMemberLabel, -} from 'shared/Entities/modules/serviceMembers'; -import { PanelSwaggerField, PanelField, SwaggerValue, editablePanelify } from 'shared/EditablePanel'; -import { stringifyName } from 'shared/utils/serviceMember'; -import { getRequestStatus } from 'shared/Swagger/selectors'; - -const CustomerInfoDisplay = (props) => { - const fieldProps = { - schema: props.serviceMemberSchema, - values: props.serviceMember, - }; - const values = props.serviceMember; - const name = stringifyName(values); - const address = get(values, 'residential_address', {}); - - return ( - <> -
- - - - - - -
-
- - - - - {values.phone_is_preferred && ( - - - phone - - )} - {values.email_is_preferred && ( - - - email - - )} - - -
- - ); -}; - -const CustomerInfoEdit = (props) => { - const schema = props.serviceMemberSchema; - - return ( - <> -
- -
- - - - - -
-
- - - -
-
-
- -
-
- -
Contact
- - - - -
- -

Preferred contact method

-
- - -
-
-
- -
- -
-
- - ); -}; - -const formName = 'office_move_info_customer_info'; - -let CustomerInfoPanel = editablePanelify(CustomerInfoDisplay, CustomerInfoEdit); -CustomerInfoPanel = reduxForm({ - form: formName, - validate: validateRequiredFields, - enableReinitialize: true, - keepDirtyOnReinitialize: true, -})(CustomerInfoPanel); - -function mapStateToProps(state, ownProps) { - const customerInfo = ownProps.serviceMember; - const loadServiceMemberStatus = getRequestStatus(state, loadServiceMemberLabel); - const updateServiceMemberStatus = getRequestStatus(state, updateServiceMemberLabel); - let hasError = false; - let errorMessage = ''; - - if (loadServiceMemberStatus.error) { - hasError = true; - errorMessage = get(loadServiceMemberStatus, 'error.response.message', ''); - } - - if (updateServiceMemberStatus.error) { - hasError = true; - errorMessage = get(updateServiceMemberStatus, 'error.response.message', ''); - } - - return { - // reduxForm - initialValues: { - serviceMember: customerInfo, - address: customerInfo.residential_address, - }, - - addressSchema: get(state, 'swaggerInternal.spec.definitions.Address', {}), - - // CustomerInfoEdit - serviceMemberSchema: get(state, 'swaggerInternal.spec.definitions.ServiceMemberPayload'), - serviceMember: ownProps.serviceMember, - - hasError, - errorMessage, - isUpdating: false, - - // editablePanelify - getUpdateArgs() { - const values = getFormValues(formName)(state); - const { serviceMember } = values; - serviceMember.residential_address = values.address; - return [ownProps.serviceMember.id, serviceMember]; - }, - }; -} - -function mapDispatchToProps(dispatch) { - return bindActionCreators( - { - update: updateServiceMember, - }, - dispatch, - ); -} - -export default connect(mapStateToProps, mapDispatchToProps)(CustomerInfoPanel); diff --git a/src/shared/Address/index.jsx b/src/shared/Address/index.jsx deleted file mode 100644 index 6b344ec26f3..00000000000 --- a/src/shared/Address/index.jsx +++ /dev/null @@ -1,74 +0,0 @@ -import React, { Component } from 'react'; -import { FormSection } from 'redux-form'; -import PropTypes from 'prop-types'; - -import style from './index.module.scss'; - -import { PanelField } from 'shared/EditablePanel'; -import { SwaggerField } from 'shared/JsonSchemaForm/JsonSchemaField'; - -export const AddressElementDisplay = ({ address, title }) => ( - - {address.streetAddress1 && ( - - {address.streetAddress1} -
-
- )} - {address.streetAddress2 && ( - - {address.streetAddress2} -
-
- )} - {address.city}, {address.state} {address.postalCode} -
-); - -AddressElementDisplay.defaultProps = { - address: {}, -}; - -AddressElementDisplay.propTypes = { - address: PropTypes.shape({ - streetAddress1: PropTypes.string, - streetAddress2: PropTypes.string, - city: PropTypes.string.isRequired, - state: PropTypes.string.isRequired, - postalCode: PropTypes.string.isRequired, - }).isRequired, - title: PropTypes.string.isRequired, -}; - -export class AddressElementEdit extends Component { - render() { - return ( - -
{this.props.title}
- - - -
-
- -
-
- -
-
-
- ); - } -} - -AddressElementEdit.propTypes = { - fieldName: PropTypes.string.isRequired, - schema: PropTypes.object.isRequired, - zipPattern: PropTypes.string, - title: PropTypes.string, -}; diff --git a/src/shared/Address/index.module.scss b/src/shared/Address/index.module.scss deleted file mode 100644 index ff41150d4e6..00000000000 --- a/src/shared/Address/index.module.scss +++ /dev/null @@ -1,9 +0,0 @@ -.state-zip-container { - max-width: 46rem; -} - -.state-zip-container:after { - content: " "; - display: block; - clear: both; -} \ No newline at end of file diff --git a/src/shared/Address/index.test.js b/src/shared/Address/index.test.js deleted file mode 100644 index 31bc7124567..00000000000 --- a/src/shared/Address/index.test.js +++ /dev/null @@ -1,101 +0,0 @@ -import React from 'react'; -import { shallow } from 'enzyme'; - -import { AddressElementDisplay } from '.'; - -import { PanelField } from 'shared/EditablePanel'; - -describe('Address component test', () => { - describe('when address has required data', () => { - const address = { - streetAddress1: '560 State Street', - city: 'New York City', - state: 'NY', - postalCode: '11217', - }; - const wrapper = shallow() - .find(PanelField) - .dive(); - const fields = wrapper.find('.field-value').props().children; - it("should render the address' label", () => { - const Label = wrapper.find('.field-title').text(); - expect(Label).toBe('Primary'); - }); - it('should render the address itself', () => { - const addressInfo = fields[0].props.children[0]; - expect(addressInfo).toBe(address.streetAddress1); - }); - it('should have a line break in between addresses', () => { - const lineBreak = fields[0].props.children[1]; - expect(lineBreak.type).toBe('br'); - }); - it('should not render addresses not present', () => { - const streetAddress2 = fields[1]; - expect(streetAddress2).toBeFalsy(); - }); - it('should render the city', () => { - const city = fields[2]; - expect(city).toBe(address.city); - }); - it('should have a comma in between the address', () => { - const comma = fields[3]; - expect(comma).toBe(', '); - }); - it('should render the state', () => { - const state = fields[4]; - expect(state).toBe(address.state); - }); - it('should render a space between state and postal code', () => { - const space = fields[5]; - expect(space).toBe(' '); - }); - it('should render the postal code', () => { - const postalCode = fields[6]; - expect(postalCode).toBe(address.postalCode); - }); - }); - describe('when address component is provided optional additional addresses', () => { - it('should render streetAddress2', () => { - const address = { - streetAddress1: '560 State Street', - streetAddress2: 'PO Box 123', - city: 'New York City', - state: 'NY', - postalCode: '11217', - }; - const wrapper = shallow() - .find(PanelField) - .dive(); - - const address_2 = wrapper.find('.field-value').children().at(1).props().children[0]; - - expect(address_2).toBe(address.streetAddress2); - }); - }); - describe('when address component is provided only city, state, postalCode', () => { - const address = { - city: 'New York City', - state: 'NY', - postalCode: '11217', - }; - const wrapper = shallow() - .find(PanelField) - .dive(); - const fields = wrapper.find('.field-value').props().children; - it('should not render street address if not provided', () => { - expect(fields[0]).toBeFalsy(); - }); - it('should not render line breaks', () => { - expect(fields[1]).toBeFalsy(); - }); - it('should render city', () => { - expect(fields[2]).toBe(address.city); - }); - it('should render state', () => { - expect(fields[4]).toBe(address.state); - }); - it('should render postalCode', () => { - expect(fields[6]).toBe(address.postalCode); - }); - }); -});