From 1779e36cc0322e89bb24f252fea240ad0273508c Mon Sep 17 00:00:00 2001 From: Daniel Fuller Date: Tue, 18 Oct 2022 14:52:12 -0400 Subject: [PATCH 01/24] don't display warning modal for adding a schedule to a one-time gift --- .../__tests__/geFormRenderer.test.js | 70 ------------------- .../lwc/geFormRenderer/geFormRenderer.js | 7 +- 2 files changed, 1 insertion(+), 76 deletions(-) diff --git a/force-app/main/default/lwc/geFormRenderer/__tests__/geFormRenderer.test.js b/force-app/main/default/lwc/geFormRenderer/__tests__/geFormRenderer.test.js index 28874b1ef42..bcabe7cd549 100644 --- a/force-app/main/default/lwc/geFormRenderer/__tests__/geFormRenderer.test.js +++ b/force-app/main/default/lwc/geFormRenderer/__tests__/geFormRenderer.test.js @@ -187,39 +187,6 @@ describe('c-ge-form-renderer', () => { expect(componentName).toBe('geModalRecurringDonation'); }); - it('dispatches an event to display a warning modal when adding schedule for gift matched to existing opportunity', async () => { - retrieveDefaultSGERenderWrapper.mockResolvedValue(mockWrapperWithNoNames); - getAllocationsSettings.mockResolvedValue(allocationsSettingsNoDefaultGAU); - const element = createElement('c-ge-form-renderer', {is: GeFormRenderer }); - const DUMMY_BATCH_ID = 'a0T11000007F8WQEA0'; - - element.batchId = DUMMY_BATCH_ID; - - document.body.appendChild(element); - - await flushPromises(); - - // simulate getting back data for DUMMY_CONTACT_ID - getRecord.emit(dataImportBatchRecord, config => { - return config.recordId === DUMMY_BATCH_ID; - }); - element.giftInView = { - fields: { [donationImported.fieldApiName]: 'dummy_opportunity_id' } - }; - - await flushPromises(); - - const dispatchEventSpy = jest.spyOn(element, 'dispatchEvent'); - const button = element.shadowRoot.querySelector('[data-id="recurringButton"]'); - button.click(); - - await flushPromises(); - - expect(dispatchEventSpy).toHaveBeenCalledTimes(1); - const componentName = dispatchEventSpy.mock.calls[0][0].detail.modalProperties.componentName; - expect(componentName).toBe('geModalPrompt'); - }); - it('dispatches an event to display a warning modal when adding schedule for gift with net new soft credits', async () => { retrieveDefaultSGERenderWrapper.mockResolvedValue(mockWrapperWithNoNames); getAllocationsSettings.mockResolvedValue(allocationsSettingsNoDefaultGAU); @@ -256,43 +223,6 @@ describe('c-ge-form-renderer', () => { const componentName = dispatchEventSpy.mock.calls[0][0].detail.modalProperties.componentName; expect(componentName).toBe('geModalPrompt'); }); - - it('dispatches an event to display a warning modal when adding schedule for gift with elevate authorization', async () => { - retrieveDefaultSGERenderWrapper.mockResolvedValue(mockWrapperWithNoNames); - getAllocationsSettings.mockResolvedValue(allocationsSettingsNoDefaultGAU); - const element = createElement('c-ge-form-renderer', {is: GeFormRenderer }); - const DUMMY_BATCH_ID = 'a0T11000007F8WQEA0'; - - element.batchId = DUMMY_BATCH_ID; - - document.body.appendChild(element); - - await flushPromises(); - - // simulate getting back data for DUMMY_CONTACT_ID - getRecord.emit(dataImportBatchRecord, config => { - return config.recordId === DUMMY_BATCH_ID; - }); - element.giftInView = { - fields: { - 'Payment_Method__c': 'Credit Card', - 'Donation_Amount__c': '0.01', - 'Payment_Status__c': 'AUTHORIZED' - } - }; - - await flushPromises(); - - const dispatchEventSpy = jest.spyOn(element, 'dispatchEvent'); - const button = element.shadowRoot.querySelector('[data-id="recurringButton"]'); - button.click(); - - await flushPromises(); - - expect(dispatchEventSpy).toHaveBeenCalledTimes(1); - const componentName = dispatchEventSpy.mock.calls[0][0].detail.modalProperties.componentName; - expect(componentName).toBe('geModalPrompt'); - }); }); it('loads a template with four sections', async () => { diff --git a/force-app/main/default/lwc/geFormRenderer/geFormRenderer.js b/force-app/main/default/lwc/geFormRenderer/geFormRenderer.js index 75c94465a34..11c0e4ebdfd 100644 --- a/force-app/main/default/lwc/geFormRenderer/geFormRenderer.js +++ b/force-app/main/default/lwc/geFormRenderer/geFormRenderer.js @@ -445,12 +445,7 @@ export default class GeFormRenderer extends LightningElement{ } shouldDisplayWarningForRecurringGiftModal() { - const isReviewingOpportunity = !isEmptyObject(this.giftInView?.fields[DATA_IMPORT_DONATION_IMPORTED_FIELD.fieldApiName]); - const isReviewingPayment = !isEmptyObject(this.giftInView?.fields[DATA_IMPORT_PAYMENT_IMPORTED_FIELD.fieldApiName]); - const hasSoftCredits = this.hasSoftCredits(); - const isGiftAuthorized = this.isGiftAuthorized(); - - return isGiftAuthorized || isReviewingOpportunity || isReviewingPayment || hasSoftCredits; + return this.hasSoftCredits(); } displayWarningForRecurringGiftModal() { From 14a382ec935dc4ba596e4b32fddeccd11d2a94ce Mon Sep 17 00:00:00 2001 From: Daniel Fuller Date: Tue, 18 Oct 2022 15:26:40 -0400 Subject: [PATCH 02/24] disable Make Recurring button when imported gift is opened from the batch table --- force-app/main/default/lwc/geFormRenderer/geFormRenderer.html | 1 + force-app/main/default/lwc/geFormRenderer/geFormRenderer.js | 1 + .../default/lwc/geGiftEntryFormApp/geGiftEntryFormApp.html | 1 + .../main/default/lwc/geGiftEntryFormApp/geGiftEntryFormApp.js | 4 ++++ 4 files changed, 7 insertions(+) diff --git a/force-app/main/default/lwc/geFormRenderer/geFormRenderer.html b/force-app/main/default/lwc/geFormRenderer/geFormRenderer.html index 18991aabe30..1f20fafd9d5 100644 --- a/force-app/main/default/lwc/geFormRenderer/geFormRenderer.html +++ b/force-app/main/default/lwc/geFormRenderer/geFormRenderer.html @@ -178,6 +178,7 @@ label={CUSTOM_LABELS.geMakeRecurring} data-id='recurringButton' onclick={handleMakeGiftRecurring} + disabled={isMakeRecurringButtonDisabled} > diff --git a/force-app/main/default/lwc/geFormRenderer/geFormRenderer.js b/force-app/main/default/lwc/geFormRenderer/geFormRenderer.js index 11c0e4ebdfd..ebfb7056b53 100644 --- a/force-app/main/default/lwc/geFormRenderer/geFormRenderer.js +++ b/force-app/main/default/lwc/geFormRenderer/geFormRenderer.js @@ -190,6 +190,7 @@ export default class GeFormRenderer extends LightningElement{ @api batchCurrencyIsoCode; @api isElevateCustomer = false; @api saveDisabled = false; + @api isMakeRecurringButtonDisabled = false; @track isPermissionError = false; @track permissionErrorTitle; diff --git a/force-app/main/default/lwc/geGiftEntryFormApp/geGiftEntryFormApp.html b/force-app/main/default/lwc/geGiftEntryFormApp/geGiftEntryFormApp.html index 8dc37b7a95a..00919084bb6 100644 --- a/force-app/main/default/lwc/geGiftEntryFormApp/geGiftEntryFormApp.html +++ b/force-app/main/default/lwc/geGiftEntryFormApp/geGiftEntryFormApp.html @@ -68,6 +68,7 @@

onnavigate={handleNavigateEvent} loading-text={loadingText} save-disabled={isFormSaveDisabled} + is-make-recurring-button-disabled={shouldDisableMakeRecurringButton} batch-currency-iso-code={batchCurrencyIsoCode} > diff --git a/force-app/main/default/lwc/geGiftEntryFormApp/geGiftEntryFormApp.js b/force-app/main/default/lwc/geGiftEntryFormApp/geGiftEntryFormApp.js index 6787085a841..ca3ec1db8d2 100644 --- a/force-app/main/default/lwc/geGiftEntryFormApp/geGiftEntryFormApp.js +++ b/force-app/main/default/lwc/geGiftEntryFormApp/geGiftEntryFormApp.js @@ -83,6 +83,10 @@ export default class GeGiftEntryFormApp extends NavigationMixin(LightningElement } } + get shouldDisableMakeRecurringButton() { + return this.gift.isImported(); + } + handleLoadData(event) { try { this.isFormRendering = true; From 23599e977c88657b7e09f88d8896662cc40e8b89 Mon Sep 17 00:00:00 2001 From: daniel-fuller Date: Tue, 25 Oct 2022 12:25:56 -0400 Subject: [PATCH 03/24] Update gitingore with sfdx directories --- .gitignore | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/.gitignore b/.gitignore index 67cc6f63379..7902d1c555f 100644 --- a/.gitignore +++ b/.gitignore @@ -42,7 +42,8 @@ robot/Cumulus/results/ datasets/dev_org/test_data.db *.db .cci - +.sfdx +.sf # LWC force-app/main/default/lwc/.eslintrc.json /node_modules From 92cc2c5fa3feaa9d6438086d822e2ed4f833b51a Mon Sep 17 00:00:00 2001 From: daniel-fuller Date: Thu, 27 Oct 2022 13:06:55 -0400 Subject: [PATCH 04/24] Remove unnecessary promise and timeout --- .../geGiftEntryFormApp/geGiftEntryFormApp.js | 29 ++++++++----------- 1 file changed, 12 insertions(+), 17 deletions(-) diff --git a/force-app/main/default/lwc/geGiftEntryFormApp/geGiftEntryFormApp.js b/force-app/main/default/lwc/geGiftEntryFormApp/geGiftEntryFormApp.js index ca3ec1db8d2..b23fdcdf9eb 100644 --- a/force-app/main/default/lwc/geGiftEntryFormApp/geGiftEntryFormApp.js +++ b/force-app/main/default/lwc/geGiftEntryFormApp/geGiftEntryFormApp.js @@ -90,24 +90,19 @@ export default class GeGiftEntryFormApp extends NavigationMixin(LightningElement handleLoadData(event) { try { this.isFormRendering = true; + const giftId = event.detail.Id; + const foundGift = this.giftBatch.findGiftBy(giftId); + this.gift = new Gift(foundGift.state()); + this.giftInView = this.gift.state(); + this.openedGiftDonationId = this.gift.donationId(); - new Promise((resolve,reject) => { - setTimeout(()=> { - const giftId = event.detail.Id; - const foundGift = this.giftBatch.findGiftBy(giftId); - this.gift = new Gift(foundGift.state()); - this.giftInView = this.gift.state(); - this.openedGiftDonationId = this.gift.donationId(); - if (this.isFormCollapsed) { - this.isFormCollapsed = false; - } - fireEvent(this, 'resetElevateWidget', {}); - resolve(); - }, 100); - }) - .finally(() => { - this.isFormRendering = false; - }); + if (this.isFormCollapsed) { + this.isFormCollapsed = false; + } + + fireEvent(this, 'resetElevateWidget', {}); + + this.isFormRendering = false; } catch(error) { handleError(error); } From c822ecbebdf6f7d3cca93ffaf6a940d878825732 Mon Sep 17 00:00:00 2001 From: daniel-fuller Date: Thu, 27 Oct 2022 13:19:21 -0400 Subject: [PATCH 05/24] remove unnecessary test --- .../__tests__/geGiftEntryFormApp.test.js | 17 ----------------- 1 file changed, 17 deletions(-) diff --git a/force-app/main/default/lwc/geGiftEntryFormApp/__tests__/geGiftEntryFormApp.test.js b/force-app/main/default/lwc/geGiftEntryFormApp/__tests__/geGiftEntryFormApp.test.js index 0aeb30b3c09..e6b788797c9 100644 --- a/force-app/main/default/lwc/geGiftEntryFormApp/__tests__/geGiftEntryFormApp.test.js +++ b/force-app/main/default/lwc/geGiftEntryFormApp/__tests__/geGiftEntryFormApp.test.js @@ -233,23 +233,6 @@ describe('c-ge-gift-entry-form-app', () => { expect(spiedEventModalProperties.componentName).toEqual('geModalPrompt'); expect(spiedEventModalProperties.showCloseButton).toEqual(true); }); - - it('should render loading spinner when opening an existing gift from the batch table', async () => { - const formApp = setupForBatchMode({gifts: [{ fields: { id: 'dummyGiftId' }}], totals: { TOTAL: 1, }}); - document.body.appendChild(formApp); - - await flushPromises(); - - const batchTable = shadowQuerySelector(formApp, 'c-ge-batch-gift-entry-table'); - expect(batchTable).toBeTruthy(); - runWithFakeTimer(async () => { - batchTable.dispatchEvent(new CustomEvent('loaddata', { detail: { id: 'dummyGiftId' } })); - await flushPromises(); - expect(spinner(formApp)).toBeTruthy(); - }); - - expect(spinner(formApp)).toBeFalsy(); - }); }); describe('event dispatch and handling behavior', () => { From 6a47a98442999089f4e98ec62eb5c37c24640a64 Mon Sep 17 00:00:00 2001 From: daniel-fuller Date: Thu, 27 Oct 2022 13:56:08 -0400 Subject: [PATCH 06/24] add test for disabled make recurring button --- .../__tests__/geFormRenderer.test.js | 29 +++++++++++++++++++ 1 file changed, 29 insertions(+) diff --git a/force-app/main/default/lwc/geFormRenderer/__tests__/geFormRenderer.test.js b/force-app/main/default/lwc/geFormRenderer/__tests__/geFormRenderer.test.js index 7892a54e953..fe5ad32bb7f 100644 --- a/force-app/main/default/lwc/geFormRenderer/__tests__/geFormRenderer.test.js +++ b/force-app/main/default/lwc/geFormRenderer/__tests__/geFormRenderer.test.js @@ -16,6 +16,7 @@ import { mockCheckComboboxValidity } from 'lightning/combobox'; import { mockGetIframeReply } from 'c/psElevateTokenHandler'; import donationImported from '@salesforce/schema/DataImport__c.DonationImported__c'; +import { DEFAULT_FORM_FIELDS } from '../../utilTemplateBuilder/utilTemplateBuilder'; const mockWrapperWithNoNames = require('../../../../../../tests/__mocks__/apex/data/retrieveDefaultSGERenderWrapper.json'); const getRecordContact1Imported = require('./data/getRecordContact1Imported.json'); @@ -47,10 +48,38 @@ describe('c-ge-form-renderer', () => { return config.recordId === DUMMY_BATCH_ID; }); + await flushPromises(); + + const button = element.shadowRoot.querySelectorAll('[data-id="recurringButton"]'); + expect(button).toHaveLength(1); + }); + + it('make recurring button is disabled when imported gift is loaded into the form', async() => { + retrieveDefaultSGERenderWrapper.mockResolvedValue(mockWrapperWithNoNames); + getAllocationsSettings.mockResolvedValue(allocationsSettingsNoDefaultGAU); + const element = createElement('c-ge-form-renderer', {is: GeFormRenderer }); + + const DUMMY_BATCH_ID = 'a0T11000007F8WQEA0'; + + element.batchId = DUMMY_BATCH_ID; + document.body.appendChild(element); + await flushPromises(); + + // simulate getting back data for DUMMY_CONTACT_ID + getRecord.emit(dataImportBatchRecord, config => { + return config.recordId === DUMMY_BATCH_ID; + }); + await flushPromises(); const button = element.shadowRoot.querySelectorAll('[data-id="recurringButton"]'); expect(button).toHaveLength(1); + + element.isMakeRecurringButtonDisabled = true; + await flushPromises(); + + const disabledButton = element.shadowRoot.querySelectorAll('[data-id="recurringButton"]'); + expect(disabledButton[0].disabled).toBe(true); }); it('when a form is saved with a possible validation rule error then processing of the donation should be halted', From 6cbb747b2ffd6fa349541dc598dcd668e36ebf25 Mon Sep 17 00:00:00 2001 From: daniel-fuller Date: Thu, 27 Oct 2022 15:32:29 -0400 Subject: [PATCH 07/24] add JEST test for disabling make recurring button --- .../__tests__/geGiftEntryFormApp.test.js | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/force-app/main/default/lwc/geGiftEntryFormApp/__tests__/geGiftEntryFormApp.test.js b/force-app/main/default/lwc/geGiftEntryFormApp/__tests__/geGiftEntryFormApp.test.js index e6b788797c9..6712e25c916 100644 --- a/force-app/main/default/lwc/geGiftEntryFormApp/__tests__/geGiftEntryFormApp.test.js +++ b/force-app/main/default/lwc/geGiftEntryFormApp/__tests__/geGiftEntryFormApp.test.js @@ -236,6 +236,23 @@ describe('c-ge-gift-entry-form-app', () => { }); describe('event dispatch and handling behavior', () => { + it('should disable make recurring returns true when imported gift is loaded', async() => { + const formApp = setupForBatchMode({gifts: [{fields: {'Id': 'DUMMY_RECORD_ID', 'Status__c': 'Imported'}}], totals: { TOTAL: 1 }}); + await flushPromises(); + + const batchTable = shadowQuerySelector(formApp, 'c-ge-batch-gift-entry-table'); + const loadDataEvent = new CustomEvent('loaddata', { + detail : { + 'Id': 'DUMMY_RECORD_ID' + } + }); + batchTable.dispatchEvent(loadDataEvent); + await flushPromises(); + + const geFormRenderer = shadowQuerySelector(formApp, 'c-ge-form-renderer'); + expect(geFormRenderer.isMakeRecurringButtonDisabled).toBe(true); + }); + it('should dispatch edit batch event', async () => { const formApp = setupForBatchMode({gifts: [], totals: { TOTAL: 1 }}); From 3e965efe0827e647801e07be86848fcc2c3d184c Mon Sep 17 00:00:00 2001 From: daniel-fuller Date: Thu, 27 Oct 2022 17:14:46 -0400 Subject: [PATCH 08/24] remove custom label that is no longer needed for processed gifts warning --- .../main/default/labels/CustomLabels.labels-meta.xml | 8 -------- .../main/default/lwc/geFormRenderer/geFormRenderer.js | 10 ++++++++-- .../main/default/lwc/geLabelService/geLabelService.js | 2 -- .../main/default/translations/de.translation-meta.xml | 4 ---- .../default/translations/en_GB.translation-meta.xml | 4 ---- .../main/default/translations/es.translation-meta.xml | 4 ---- .../main/default/translations/fr.translation-meta.xml | 4 ---- .../main/default/translations/iw.translation-meta.xml | 4 ---- .../main/default/translations/ja.translation-meta.xml | 4 ---- .../default/translations/nl_NL.translation-meta.xml | 4 ---- .../default/translations/pt_BR.translation-meta.xml | 4 ---- 11 files changed, 8 insertions(+), 44 deletions(-) diff --git a/force-app/main/default/labels/CustomLabels.labels-meta.xml b/force-app/main/default/labels/CustomLabels.labels-meta.xml index 4f21b5d6986..c2aade3edf8 100644 --- a/force-app/main/default/labels/CustomLabels.labels-meta.xml +++ b/force-app/main/default/labels/CustomLabels.labels-meta.xml @@ -9802,14 +9802,6 @@ If preferred, you can disable Gift Entry and instead use older Batch Gift Entry Warning about processing batch when authorizations have expired One or more card authorizations expired. To ensure these payments are charged when processing the batch, reenter the payment information for donations with an Elevate Payment Status of Expired Authorization. - - gePaymentProcessedWarning - Gift Entry - en_US - true - Warning about editing fields when transaction already processed - {0} successfully processed the payment. Changing the donor, date, amount, or payment method will result in inconsistent records for the same transaction in {0} and NPSP. - gePaymentProcessError Gift Entry diff --git a/force-app/main/default/lwc/geFormRenderer/geFormRenderer.js b/force-app/main/default/lwc/geFormRenderer/geFormRenderer.js index 013d714b69b..4739e921022 100644 --- a/force-app/main/default/lwc/geFormRenderer/geFormRenderer.js +++ b/force-app/main/default/lwc/geFormRenderer/geFormRenderer.js @@ -2856,15 +2856,21 @@ export default class GeFormRenderer extends LightningElement{ } get elevateTransactionWarning() { - return format(this.CUSTOM_LABELS.gePaymentProcessedWarning, [this.CUSTOM_LABELS.commonPaymentServices]); + return format('You need to re-enter your payment information before editing the'); } get showElevateTransactionWarning() { const paymentStatus = this.getFieldValueFromFormState(PAYMENT_STATUS); + return this.hasReadOnlyPaymentStatus(paymentStatus) || + this.getFieldValueFromFormState(DATA_IMPORT_RECURRING_DONATION_ELEVATE_ID); + } + + hasReadOnlyPaymentStatus(paymentStatus) { return paymentStatus && (paymentStatus === this.PAYMENT_TRANSACTION_STATUS_ENUM.CAPTURED || paymentStatus === this.PAYMENT_TRANSACTION_STATUS_ENUM.SUBMITTED - || paymentStatus === this.PAYMENT_TRANSACTION_STATUS_ENUM.SETTLED + || paymentStatus === this.PAYMENT_TRANSACTION_STATUS_ENUM.AUTHORIZED + || paymentStatus === this.PAYMENT_TRANSACTION_STATUS_ENUM.DECLINED ); } diff --git a/force-app/main/default/lwc/geLabelService/geLabelService.js b/force-app/main/default/lwc/geLabelService/geLabelService.js index 01378ebaee5..2e6d3838bb1 100755 --- a/force-app/main/default/lwc/geLabelService/geLabelService.js +++ b/force-app/main/default/lwc/geLabelService/geLabelService.js @@ -209,7 +209,6 @@ import geLabelTemplateInfoDescriptionField from '@salesforce/label/c.geLabelTemp import geLabelTemplateInfoNameField from '@salesforce/label/c.geLabelTemplateInfoNameField'; import gePaymentAuthExpiredHeader from '@salesforce/label/c.gePaymentAuthExpiredHeader'; import gePaymentAuthExpiredWarningText from '@salesforce/label/c.gePaymentAuthExpiredWarningText'; -import gePaymentProcessedWarning from '@salesforce/label/c.gePaymentProcessedWarning'; import gePaymentProcessError from '@salesforce/label/c.gePaymentProcessError'; import gePaymentProcessingErrorBanner from '@salesforce/label/c.gePaymentProcessingErrorBanner'; import gePaymentRequestTimedOut from '@salesforce/label/c.gePaymentRequestTimedOut'; @@ -465,7 +464,6 @@ class GeLabelService { geLabelTemplateInfoNameField, gePaymentAuthExpiredHeader, gePaymentAuthExpiredWarningText, - gePaymentProcessedWarning, gePaymentProcessError, gePaymentProcessingErrorBanner, gePaymentRequestTimedOut, diff --git a/force-app/main/default/translations/de.translation-meta.xml b/force-app/main/default/translations/de.translation-meta.xml index c03ac11b2fa..e6bb3deb807 100644 --- a/force-app/main/default/translations/de.translation-meta.xml +++ b/force-app/main/default/translations/de.translation-meta.xml @@ -4988,10 +4988,6 @@ Wenn Sie es vorziehen, können Sie "Spendeneintrag" deaktivieren und s gePaymentAuthExpiredWarningText - - gePaymentProcessedWarning - - gePaymentProcessError - - gePaymentProcessedWarning - - gePaymentProcessError - - gePaymentProcessedWarning - - gePaymentProcessError - - gePaymentProcessedWarning - - gePaymentProcessError - - - gePaymentProcessedWarning - gePaymentProcessingErrorBanner diff --git a/force-app/main/default/translations/ja.translation-meta.xml b/force-app/main/default/translations/ja.translation-meta.xml index f15ba883a2a..4d0dea4c868 100644 --- a/force-app/main/default/translations/ja.translation-meta.xml +++ b/force-app/main/default/translations/ja.translation-meta.xml @@ -4985,10 +4985,6 @@ gePaymentAuthExpiredWarningText - - gePaymentProcessedWarning - - gePaymentProcessError - - gePaymentProcessedWarning - - gePaymentProcessError - - gePaymentProcessedWarning - - gePaymentProcessError